From abe8732031756af92f512ccff55ffa8b25baba43 Mon Sep 17 00:00:00 2001 From: Alexey Storozhev Date: Thu, 4 Jul 2013 15:47:28 +0400 Subject: [PATCH 1/9] added idevicebackup project to solution, fixed idevicebackup to be compilable --- libcompat/libcompat.c | 12 ------------ libcompat/libcompat.h | 5 ++++- .../idevicebackup/idevicebackup.cpp | 15 ++++++++++++--- .../idevicebackup/idevicebackup.vcxproj | 4 ++-- libimobiledevice-win32.sln | 18 ++++++++++++++++++ 5 files changed, 36 insertions(+), 18 deletions(-) diff --git a/libcompat/libcompat.c b/libcompat/libcompat.c index 7bfb086..4465930 100644 --- a/libcompat/libcompat.c +++ b/libcompat/libcompat.c @@ -1,19 +1,7 @@ #include "libcompat.h" -#include #include #include -int snprintf ( char * s, size_t n, const char * format, ... ) -{ - va_list args; - int result = 0; - _crt_va_start(args, format); - result = _snprintf(s, n, format, args); - _crt_va_end(args); - - return result; -} - /* int __chkstk() { diff --git a/libcompat/libcompat.h b/libcompat/libcompat.h index e993b71..45e0657 100644 --- a/libcompat/libcompat.h +++ b/libcompat/libcompat.h @@ -15,7 +15,10 @@ struct timezone int tz_dsttime; /* type of dst correction */ }; -int snprintf ( char * s, size_t n, const char * format, ... ); +#ifndef snprintf +# define snprintf _snprintf +#endif + int gettimeofday(struct timeval *tv, struct timezone *tz); #endif LIBCOMPAT_H diff --git a/libimobiledevice-tools/idevicebackup/idevicebackup.cpp b/libimobiledevice-tools/idevicebackup/idevicebackup.cpp index 7173c1a..f273416 100644 --- a/libimobiledevice-tools/idevicebackup/idevicebackup.cpp +++ b/libimobiledevice-tools/idevicebackup/idevicebackup.cpp @@ -57,6 +57,10 @@ #define sleep(x) Sleep(x*1000) #endif +#ifndef __func__ +# define __func__ __FUNCTION__ +#endif + static mobilebackup_client_t mobilebackup = NULL; static lockdownd_client_t client = NULL; static idevice_t device = NULL; @@ -1040,7 +1044,7 @@ int main(int argc, char *argv[]) do_post_notification(NP_SYNC_DID_START); break; } else if (aerr == AFC_E_OP_WOULD_BLOCK) { - usleep(LOCK_WAIT); + sleep(LOCK_WAIT); continue; } else { fprintf(stderr, "ERROR: could not lock file! error code: %d\n", aerr); @@ -1064,6 +1068,8 @@ int main(int argc, char *argv[]) switch(cmd) { case CMD_BACKUP: + { + printf("Starting backup...\n"); /* TODO: check domain com.apple.mobile.backup key RequiresEncrypt and WillEncrypt with lockdown */ /* TODO: verify battery on AC enough battery remaining */ @@ -1175,7 +1181,7 @@ int main(int argc, char *argv[]) /* check DLFileStatusKey (codes: 1 = Hunk, 2 = Last Hunk) */ node = plist_dict_get_item(node_tmp, "DLFileStatusKey"); plist_get_uint_val(node, &c); - file_status = c; + file_status = (device_link_file_status_t)c; /* get source filename */ node = plist_dict_get_item(node_tmp, "BackupManifestKey"); @@ -1354,8 +1360,10 @@ int main(int argc, char *argv[]) } else { printf("Backup Failed.\n"); } + } break; case CMD_RESTORE: + { /* close down the lockdown connection as it is no longer needed */ if (client) { lockdownd_client_free(client); @@ -1461,7 +1469,7 @@ int main(int argc, char *argv[]) /* request restore from device with manifest (BackupMessageRestoreMigrate) */ int restore_flags = MB_RESTORE_NOTIFY_SPRINGBOARD | MB_RESTORE_PRESERVE_SETTINGS | MB_RESTORE_PRESERVE_CAMERA_ROLL; - err = mobilebackup_request_restore(mobilebackup, manifest_plist, restore_flags, "1.6"); + err = mobilebackup_request_restore(mobilebackup, manifest_plist, (mobilebackup_flags_t)restore_flags, "1.6"); if (err != MOBILEBACKUP_E_SUCCESS) { if (err == MOBILEBACKUP_E_BAD_VERSION) { printf("ERROR: Could not start restore process: backup protocol version mismatch!\n"); @@ -1685,6 +1693,7 @@ int main(int argc, char *argv[]) printf("Restore Failed.\n"); } break; + } case CMD_LEAVE: default: break; diff --git a/libimobiledevice-tools/idevicebackup/idevicebackup.vcxproj b/libimobiledevice-tools/idevicebackup/idevicebackup.vcxproj index d86710a..ab96e0d 100644 --- a/libimobiledevice-tools/idevicebackup/idevicebackup.vcxproj +++ b/libimobiledevice-tools/idevicebackup/idevicebackup.vcxproj @@ -56,8 +56,8 @@ Level3 Disabled - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - $(SolutionDir)\vendors\gnutls\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;HAVE_OPENSSL;%(PreprocessorDefinitions) + $(SolutionDir)\vendors\gnutls\include;$(SolutionDir)\libcompat\;$(SolutionDir)\vendors\openssl\include;%(AdditionalIncludeDirectories) Console diff --git a/libimobiledevice-win32.sln b/libimobiledevice-win32.sln index 9e2b51b..a97813b 100644 --- a/libimobiledevice-win32.sln +++ b/libimobiledevice-win32.sln @@ -87,6 +87,13 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "imobiledeviceapp", "libimob {3EBC40B2-C7DE-4C9B-9E38-97F79DD3A1D7} = {3EBC40B2-C7DE-4C9B-9E38-97F79DD3A1D7} EndProjectSection EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "idevicebackup", "libimobiledevice-tools\idevicebackup\idevicebackup.vcxproj", "{F3837EA2-E283-4D52-8955-0BD75A8F6CFB}" + ProjectSection(ProjectDependencies) = postProject + {69CDCB06-C62E-45F6-9E2B-4313C228F957} = {69CDCB06-C62E-45F6-9E2B-4313C228F957} + {6F26C69D-46EE-40AE-92E3-CD205B2C18E0} = {6F26C69D-46EE-40AE-92E3-CD205B2C18E0} + {AA5715E5-75AA-4CCC-A3D7-819FC833603C} = {AA5715E5-75AA-4CCC-A3D7-819FC833603C} + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -297,6 +304,16 @@ Global {B2F015FE-07F5-43AC-B6E6-DF8D0D4ADC66}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {B2F015FE-07F5-43AC-B6E6-DF8D0D4ADC66}.Release|Mixed Platforms.Build.0 = Release|Any CPU {B2F015FE-07F5-43AC-B6E6-DF8D0D4ADC66}.Release|Win32.ActiveCfg = Release|Any CPU + {F3837EA2-E283-4D52-8955-0BD75A8F6CFB}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {F3837EA2-E283-4D52-8955-0BD75A8F6CFB}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {F3837EA2-E283-4D52-8955-0BD75A8F6CFB}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {F3837EA2-E283-4D52-8955-0BD75A8F6CFB}.Debug|Win32.ActiveCfg = Debug|Win32 + {F3837EA2-E283-4D52-8955-0BD75A8F6CFB}.Debug|Win32.Build.0 = Debug|Win32 + {F3837EA2-E283-4D52-8955-0BD75A8F6CFB}.Release|Any CPU.ActiveCfg = Release|Win32 + {F3837EA2-E283-4D52-8955-0BD75A8F6CFB}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {F3837EA2-E283-4D52-8955-0BD75A8F6CFB}.Release|Mixed Platforms.Build.0 = Release|Win32 + {F3837EA2-E283-4D52-8955-0BD75A8F6CFB}.Release|Win32.ActiveCfg = Release|Win32 + {F3837EA2-E283-4D52-8955-0BD75A8F6CFB}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -312,5 +329,6 @@ Global {4AF01887-F20F-4E90-B5DE-48168D60E6BC} = {054378B1-3FE2-4586-A94C-11424D95C913} {80E14F4A-9707-4B30-9D63-306756A2E05C} = {054378B1-3FE2-4586-A94C-11424D95C913} {B2F015FE-07F5-43AC-B6E6-DF8D0D4ADC66} = {054378B1-3FE2-4586-A94C-11424D95C913} + {F3837EA2-E283-4D52-8955-0BD75A8F6CFB} = {054378B1-3FE2-4586-A94C-11424D95C913} EndGlobalSection EndGlobal From 5996bd11516a63701f764110917c13baa820ef46 Mon Sep 17 00:00:00 2001 From: Alexey Storozhev Date: Wed, 10 Jul 2013 13:43:36 +0400 Subject: [PATCH 2/9] idevicebackup2 ported --- .../idevicebackup2/idevicebackup2.cpp | 2303 +++++++++++++++++ .../idevicebackup2/idevicebackup2.vcxproj | 85 + .../idevicebackup2.vcxproj.filters | 18 + libimobiledevice-win32.sln | 13 + 4 files changed, 2419 insertions(+) create mode 100644 libimobiledevice-tools/idevicebackup2/idevicebackup2.cpp create mode 100644 libimobiledevice-tools/idevicebackup2/idevicebackup2.vcxproj create mode 100644 libimobiledevice-tools/idevicebackup2/idevicebackup2.vcxproj.filters diff --git a/libimobiledevice-tools/idevicebackup2/idevicebackup2.cpp b/libimobiledevice-tools/idevicebackup2/idevicebackup2.cpp new file mode 100644 index 0000000..822f1cc --- /dev/null +++ b/libimobiledevice-tools/idevicebackup2/idevicebackup2.cpp @@ -0,0 +1,2303 @@ +/* + * idevicebackup2.c + * Command line interface to use the device's backup and restore service + * + * Copyright (c) 2009-2010 Martin Szulecki All Rights Reserved. + * Copyright (c) 2010 Nikias Bassen All Rights Reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +#define MOBILEBACKUP2_SERVICE_NAME "com.apple.mobilebackup2" +#define NP_SERVICE_NAME "com.apple.mobile.notification_proxy" + +#define LOCK_ATTEMPTS 50 +#define LOCK_WAIT 200000 + +#ifdef WIN32 +#include +#include +#include +#define sleep(x) Sleep(x*1000) +#else +#include +#include +#endif + +#ifndef __func__ +# define __func__ __FUNCTION__ +#endif + +#define CODE_SUCCESS 0x00 +#define CODE_ERROR_LOCAL 0x06 +#define CODE_ERROR_REMOTE 0x0b +#define CODE_FILE_DATA 0x0c + +static int verbose = 1; +static int quit_flag = 0; + +#define PRINT_VERBOSE(min_level, ...) if (verbose >= min_level) { printf(__VA_ARGS__); }; + +enum cmd_mode { + CMD_BACKUP, + CMD_RESTORE, + CMD_INFO, + CMD_LIST, + CMD_UNBACK, + CMD_CHANGEPW, + CMD_LEAVE +}; + +enum plist_format_t { + PLIST_FORMAT_XML, + PLIST_FORMAT_BINARY +}; + +enum cmd_flags { + CMD_FLAG_RESTORE_SYSTEM_FILES = (1 << 1), + CMD_FLAG_RESTORE_REBOOT = (1 << 2), + CMD_FLAG_RESTORE_COPY_BACKUP = (1 << 3), + CMD_FLAG_RESTORE_SETTINGS = (1 << 4), + CMD_FLAG_RESTORE_REMOVE_ITEMS = (1 << 5), + CMD_FLAG_ENCRYPTION_ENABLE = (1 << 6), + CMD_FLAG_ENCRYPTION_DISABLE = (1 << 7), + CMD_FLAG_ENCRYPTION_CHANGEPW = (1 << 8) +}; + +static int backup_domain_changed = 0; + +static void notify_cb(const char *notification, void *userdata) +{ + if (!strcmp(notification, NP_SYNC_CANCEL_REQUEST)) { + PRINT_VERBOSE(1, "User has cancelled the backup process on the device.\n"); + quit_flag++; + } else if (!strcmp(notification, NP_BACKUP_DOMAIN_CHANGED)) { + backup_domain_changed = 1; + } else { + PRINT_VERBOSE(1, "Unhandled notification '%s' (TODO: implement)\n", notification); + } +} + +static void free_dictionary(char **dictionary) +{ + int i = 0; + + if (!dictionary) + return; + + for (i = 0; dictionary[i]; i++) { + free(dictionary[i]); + } + free(dictionary); +} + +static void mobilebackup_afc_get_file_contents(afc_client_t afc, const char *filename, char **data, uint64_t *size) +{ + if (!afc || !data || !size) { + return; + } + + char **fileinfo = NULL; + uint32_t fsize = 0; + + afc_get_file_info(afc, filename, &fileinfo); + if (!fileinfo) { + return; + } + int i; + for (i = 0; fileinfo[i]; i+=2) { + if (!strcmp(fileinfo[i], "st_size")) { + fsize = atol(fileinfo[i+1]); + break; + } + } + free_dictionary(fileinfo); + + if (fsize == 0) { + return; + } + + uint64_t f = 0; + afc_file_open(afc, filename, AFC_FOPEN_RDONLY, &f); + if (!f) { + return; + } + char *buf = (char*)malloc((uint32_t)fsize); + uint32_t done = 0; + while (done < fsize) { + uint32_t bread = 0; + afc_file_read(afc, f, buf+done, 65536, &bread); + if (bread > 0) { + + } else { + break; + } + done += bread; + } + if (done == fsize) { + *size = fsize; + *data = buf; + } else { + free(buf); + } + afc_file_close(afc, f); +} + +static char *str_toupper(char* str) +{ + char *res = strdup(str); + unsigned int i; + for (i = 0; i < strlen(res); i++) { + res[i] = toupper(res[i]); + } + return res; +} + +static int __mkdir(const char* path, int mode) +{ +#ifdef WIN32 + return _mkdir(path); +#else + return mkdir(path, mode); +#endif +} + +static int mkdir_with_parents(const char *dir, int mode) +{ + if (!dir) return -1; + if (__mkdir(dir, mode) == 0) { + return 0; + } else { + if (errno == EEXIST) return 0; + } + int res; + char *parent = strdup(dir); + char *parentdir = dirname(parent); + if (parentdir) { + res = mkdir_with_parents(parentdir, mode); + } else { + res = -1; + } + free(parent); + if (res == 0) { + mkdir_with_parents(dir, mode); + } + return res; +} + +static char* build_path(const char* elem, ...) +{ + if (!elem) return NULL; + va_list args; + int len = strlen(elem)+1; + va_start(args, elem); + char *arg = va_arg(args, char*); + while (arg) { + len += strlen(arg)+1; + arg = va_arg(args, char*); + } + va_end(args); + + char* out = (char*)malloc(len); + strcpy(out, elem); + + va_start(args, elem); + arg = va_arg(args, char*); + while (arg) { + strcat(out, "/"); + strcat(out, arg); + arg = va_arg(args, char*); + } + va_end(args); + return out; +} + +static char* format_size_for_display(uint64_t size) +{ + char buf[32]; + double sz; + if (size >= 1000000000LL) { + sz = ((double)size / 1000000000.0f); + sprintf(buf, "%0.1f GB", sz); + } else if (size >= 1000000LL) { + sz = ((double)size / 1000000.0f); + sprintf(buf, "%0.1f MB", sz); + } else if (size >= 1000LL) { + sz = ((double)size / 1000.0f); + sprintf(buf, "%0.1f kB", sz); + } else { + sprintf(buf, "%d Bytes", (int)size); + } + return strdup(buf); +} + +static plist_t mobilebackup_factory_info_plist_new(const char* udid, lockdownd_client_t lockdown, afc_client_t afc) +{ + /* gather data from lockdown */ + plist_t value_node = NULL; + plist_t root_node = NULL; + char *udid_uppercase = NULL; + + plist_t ret = plist_new_dict(); + + /* get basic device information in one go */ + lockdownd_get_value(lockdown, NULL, NULL, &root_node); + + /* set fields we understand */ + value_node = plist_dict_get_item(root_node, "BuildVersion"); + plist_dict_insert_item(ret, "Build Version", plist_copy(value_node)); + + value_node = plist_dict_get_item(root_node, "DeviceName"); + plist_dict_insert_item(ret, "Device Name", plist_copy(value_node)); + plist_dict_insert_item(ret, "Display Name", plist_copy(value_node)); + + /* FIXME: How is the GUID generated? */ + plist_dict_insert_item(ret, "GUID", plist_new_string("---")); + + value_node = plist_dict_get_item(root_node, "IntegratedCircuitCardIdentity"); + if (value_node) + plist_dict_insert_item(ret, "ICCID", plist_copy(value_node)); + + value_node = plist_dict_get_item(root_node, "InternationalMobileEquipmentIdentity"); + if (value_node) + plist_dict_insert_item(ret, "IMEI", plist_copy(value_node)); + + plist_dict_insert_item(ret, "Last Backup Date", plist_new_date(time(NULL), 0)); + + value_node = plist_dict_get_item(root_node, "PhoneNumber"); + if (value_node && (plist_get_node_type(value_node) == PLIST_STRING)) { + plist_dict_insert_item(ret, "Phone Number", plist_copy(value_node)); + } + + value_node = plist_dict_get_item(root_node, "ProductType"); + plist_dict_insert_item(ret, "Product Type", plist_copy(value_node)); + + value_node = plist_dict_get_item(root_node, "ProductVersion"); + plist_dict_insert_item(ret, "Product Version", plist_copy(value_node)); + + value_node = plist_dict_get_item(root_node, "SerialNumber"); + plist_dict_insert_item(ret, "Serial Number", plist_copy(value_node)); + + /* FIXME Sync Settings? */ + + value_node = plist_dict_get_item(root_node, "UniqueDeviceID"); + plist_dict_insert_item(ret, "Target Identifier", plist_new_string(udid)); + + plist_dict_insert_item(ret, "Target Type", plist_new_string("Device")); + + /* uppercase */ + udid_uppercase = str_toupper((char*)udid); + plist_dict_insert_item(ret, "Unique Identifier", plist_new_string(udid_uppercase)); + free(udid_uppercase); + + char *data_buf = NULL; + uint64_t data_size = 0; + mobilebackup_afc_get_file_contents(afc, "/Books/iBooksData2.plist", &data_buf, &data_size); + if (data_buf) { + plist_dict_insert_item(ret, "iBooks Data 2", plist_new_data(data_buf, data_size)); + free(data_buf); + } + + plist_t files = plist_new_dict(); + const char *itunesfiles[] = { + "ApertureAlbumPrefs", + "IC-Info.sidb", + "IC-Info.sidv", + "PhotosFolderAlbums", + "PhotosFolderName", + "PhotosFolderPrefs", + "iPhotoAlbumPrefs", + "iTunesApplicationIDs", + "iTunesPrefs", + "iTunesPrefs.plist", + NULL + }; + int i = 0; + for (i = 0; itunesfiles[i]; i++) { + data_buf = NULL; + data_size = 0; + char *fname = (char*)malloc(strlen("/iTunes_Control/iTunes/") + strlen(itunesfiles[i]) + 1); + strcpy(fname, "/iTunes_Control/iTunes/"); + strcat(fname, itunesfiles[i]); + mobilebackup_afc_get_file_contents(afc, fname, &data_buf, &data_size); + free(fname); + if (data_buf) { + plist_dict_insert_item(files, itunesfiles[i], plist_new_data(data_buf, data_size)); + free(data_buf); + } + } + plist_dict_insert_item(ret, "iTunes Files", files); + + plist_t itunes_settings = NULL; + lockdownd_get_value(lockdown, "com.apple.iTunes", NULL, &itunes_settings); + plist_dict_insert_item(ret, "iTunes Settings", itunes_settings ? itunes_settings : plist_new_dict()); + + plist_dict_insert_item(ret, "iTunes Version", plist_new_string("10.0.1")); + + plist_free(root_node); + + return ret; +} + +static void buffer_read_from_filename(const char *filename, char **buffer, uint64_t *length) +{ + FILE *f; + uint64_t size; + + *length = 0; + + f = fopen(filename, "rb"); + if (!f) { + return; + } + + fseek(f, 0, SEEK_END); + size = ftell(f); + rewind(f); + + if (size == 0) { + return; + } + + *buffer = (char*)malloc(sizeof(char)*size); + fread(*buffer, sizeof(char), size, f); + fclose(f); + + *length = size; +} + +static void buffer_write_to_filename(const char *filename, const char *buffer, uint64_t length) +{ + FILE *f; + + f = fopen(filename, "ab"); + if (!f) + f = fopen(filename, "wb"); + if (f) { + fwrite(buffer, sizeof(char), length, f); + fclose(f); + } +} + +static int plist_read_from_filename(plist_t *plist, const char *filename) +{ + char *buffer = NULL; + uint64_t length; + + if (!filename) + return 0; + + buffer_read_from_filename(filename, &buffer, &length); + + if (!buffer) { + return 0; + } + + if ((length > 8) && (memcmp(buffer, "bplist00", 8) == 0)) { + plist_from_bin(buffer, length, plist); + } else { + plist_from_xml(buffer, length, plist); + } + + free(buffer); + + return 1; +} + +static int plist_write_to_filename(plist_t plist, const char *filename, enum plist_format_t format) +{ + char *buffer = NULL; + uint32_t length; + + if (!plist || !filename) + return 0; + + if (format == PLIST_FORMAT_XML) + plist_to_xml(plist, &buffer, &length); + else if (format == PLIST_FORMAT_BINARY) + plist_to_bin(plist, &buffer, &length); + else + return 0; + + buffer_write_to_filename(filename, buffer, length); + + free(buffer); + + return 1; +} + +static int mb2_status_check_snapshot_state(const char *path, const char *udid, const char *matches) +{ + int ret = -1; + plist_t status_plist = NULL; + char *file_path = build_path(path, udid, "Status.plist", NULL); + + plist_read_from_filename(&status_plist, file_path); + free(file_path); + if (!status_plist) { + printf("Could not read Status.plist!\n"); + return ret; + } + plist_t node = plist_dict_get_item(status_plist, "SnapshotState"); + if (node && (plist_get_node_type(node) == PLIST_STRING)) { + char* sval = NULL; + plist_get_string_val(node, &sval); + if (sval) { + ret = (strcmp(sval, matches) == 0) ? 1 : 0; + free(sval); + } + } else { + printf("%s: ERROR could not get SnapshotState key from Status.plist!\n", __func__); + } + plist_free(status_plist); + return ret; +} + +static void do_post_notification(idevice_t device, const char *notification) +{ + lockdownd_service_descriptor_t service = NULL; + np_client_t np; + + lockdownd_client_t lockdown = NULL; + + if (lockdownd_client_new_with_handshake(device, &lockdown, "idevicebackup") != LOCKDOWN_E_SUCCESS) { + return; + } + + lockdownd_start_service(lockdown, NP_SERVICE_NAME, &service); + if (service && service->port) { + np_client_new(device, service, &np); + if (np) { + np_post_notification(np, notification); + np_client_free(np); + } + } else { + printf("Could not start %s\n", NP_SERVICE_NAME); + } + + if (service) { + lockdownd_service_descriptor_free(service); + service = NULL; + } + lockdownd_client_free(lockdown); +} + +static void print_progress_real(double progress, int flush) +{ + int i = 0; + PRINT_VERBOSE(1, "\r["); + for(i = 0; i < 50; i++) { + if(i < progress / 2) { + PRINT_VERBOSE(1, "="); + } else { + PRINT_VERBOSE(1, " "); + } + } + PRINT_VERBOSE(1, "] %3.0f%%", progress); + + if (flush > 0) { + fflush(stdout); + if (progress == 100) + PRINT_VERBOSE(1, "\n"); + } +} + +static void print_progress(uint64_t current, uint64_t total) +{ + char *format_size = NULL; + double progress = ((double)current/(double)total)*100; + if (progress < 0) + return; + + if (progress > 100) + progress = 100; + + print_progress_real((double)progress, 0); + + format_size = format_size_for_display(current); + PRINT_VERBOSE(1, " (%s", format_size); + free(format_size); + format_size = format_size_for_display(total); + PRINT_VERBOSE(1, "/%s) ", format_size); + free(format_size); + + fflush(stdout); + if (progress == 100) + PRINT_VERBOSE(1, "\n"); +} + +static double overall_progress = 0; + +static void mb2_set_overall_progress(double progress) +{ + if (progress > 0.0) + overall_progress = progress; +} + +static void mb2_set_overall_progress_from_message(plist_t message, char* identifier) +{ + plist_t node = NULL; + double progress = 0.0; + + if (!strcmp(identifier, "DLMessageDownloadFiles")) { + node = plist_array_get_item(message, 3); + } else if (!strcmp(identifier, "DLMessageUploadFiles")) { + node = plist_array_get_item(message, 2); + } else if (!strcmp(identifier, "DLMessageMoveFiles") || !strcmp(identifier, "DLMessageMoveItems")) { + node = plist_array_get_item(message, 3); + } else if (!strcmp(identifier, "DLMessageRemoveFiles") || !strcmp(identifier, "DLMessageRemoveItems")) { + node = plist_array_get_item(message, 3); + } + + if (node != NULL) { + plist_get_real_val(node, &progress); + mb2_set_overall_progress(progress); + } +} + +static void mb2_multi_status_add_file_error(plist_t status_dict, const char *path, int error_code, const char *error_message) +{ + if (!status_dict) return; + plist_t filedict = plist_new_dict(); + plist_dict_insert_item(filedict, "DLFileErrorString", plist_new_string(error_message)); + plist_dict_insert_item(filedict, "DLFileErrorCode", plist_new_uint(error_code)); + plist_dict_insert_item(status_dict, path, filedict); +} + +static int errno_to_device_error(int errno_value) +{ + switch (errno_value) { + case ENOENT: + return -6; + case EEXIST: + return -7; + default: + return -errno_value; + } +} + +#ifdef WIN32 +static int win32err_to_errno(int err_value) +{ + switch (err_value) { + case ERROR_FILE_NOT_FOUND: + return ENOENT; + case ERROR_ALREADY_EXISTS: + return EEXIST; + default: + return EFAULT; + } +} +#endif + +static int mb2_handle_send_file(mobilebackup2_client_t mobilebackup2, const char *backup_dir, const char *path, plist_t *errplist) +{ + uint32_t nlen = 0; + uint32_t pathlen = strlen(path); + uint32_t bytes = 0; + char *localfile = build_path(backup_dir, path, NULL); + char buf[32768]; + struct stat fst; + + FILE *f = NULL; + uint32_t slen = 0; + int errcode = -1; + int result = -1; + uint32_t length; + off_t total; + off_t sent; + + mobilebackup2_error_t err; + + /* send path length */ + nlen = htobe32(pathlen); + err = mobilebackup2_send_raw(mobilebackup2, (const char*)&nlen, sizeof(nlen), &bytes); + if (err != MOBILEBACKUP2_E_SUCCESS) { + goto leave_proto_err; + } + if (bytes != (uint32_t)sizeof(nlen)) { + err = MOBILEBACKUP2_E_MUX_ERROR; + goto leave_proto_err; + } + + /* send path */ + err = mobilebackup2_send_raw(mobilebackup2, path, pathlen, &bytes); + if (err != MOBILEBACKUP2_E_SUCCESS) { + goto leave_proto_err; + } + if (bytes != pathlen) { + err = MOBILEBACKUP2_E_MUX_ERROR; + goto leave_proto_err; + } + + if (stat(localfile, &fst) < 0) { + if (errno != ENOENT) + printf("%s: stat failed on '%s': %d\n", __func__, localfile, errno); + errcode = errno; + goto leave; + } + + total = fst.st_size; + + char *format_size = format_size_for_display(total); + PRINT_VERBOSE(1, "Sending '%s' (%s)\n", path, format_size); + free(format_size); + + if (total == 0) { + errcode = 0; + goto leave; + } + + f = fopen(localfile, "rb"); + if (!f) { + printf("%s: Error opening local file '%s': %d\n", __func__, localfile, errno); + errcode = errno; + goto leave; + } + + sent = 0; + do { + length = ((total-sent) < (off_t)sizeof(buf)) ? (uint32_t)total-sent : (uint32_t)sizeof(buf); + /* send data size (file size + 1) */ + nlen = htobe32(length+1); + memcpy(buf, &nlen, sizeof(nlen)); + buf[4] = CODE_FILE_DATA; + err = mobilebackup2_send_raw(mobilebackup2, (const char*)buf, 5, &bytes); + if (err != MOBILEBACKUP2_E_SUCCESS) { + goto leave_proto_err; + } + if (bytes != 5) { + goto leave_proto_err; + } + + /* send file contents */ + size_t r = fread(buf, 1, sizeof(buf), f); + if (r <= 0) { + printf("%s: read error\n", __func__); + errcode = errno; + goto leave; + } + err = mobilebackup2_send_raw(mobilebackup2, buf, r, &bytes); + if (err != MOBILEBACKUP2_E_SUCCESS) { + goto leave_proto_err; + } + if (bytes != (uint32_t)r) { + printf("Error: sent only %d of %d bytes\n", bytes, (int)r); + goto leave_proto_err; + } + sent += r; + } while (sent < total); + fclose(f); + f = NULL; + errcode = 0; + +leave: + if (errcode == 0) { + result = 0; + nlen = 1; + nlen = htobe32(nlen); + memcpy(buf, &nlen, 4); + buf[4] = CODE_SUCCESS; + mobilebackup2_send_raw(mobilebackup2, buf, 5, &bytes); + } else { + if (!*errplist) { + *errplist = plist_new_dict(); + } + char *errdesc = strerror(errcode); + mb2_multi_status_add_file_error(*errplist, path, errno_to_device_error(errcode), errdesc); + + length = strlen(errdesc); + nlen = htobe32(length+1); + memcpy(buf, &nlen, 4); + buf[4] = CODE_ERROR_LOCAL; + slen = 5; + memcpy(buf+slen, errdesc, length); + slen += length; + err = mobilebackup2_send_raw(mobilebackup2, (const char*)buf, slen, &bytes); + if (err != MOBILEBACKUP2_E_SUCCESS) { + printf("could not send message\n"); + } + if (bytes != slen) { + printf("could only send %d from %d\n", bytes, slen); + } + } + +leave_proto_err: + if (f) + fclose(f); + free(localfile); + return result; +} + +static void mb2_handle_send_files(mobilebackup2_client_t mobilebackup2, plist_t message, const char *backup_dir) +{ + uint32_t cnt; + uint32_t i = 0; + uint32_t sent; + plist_t errplist = NULL; + + if (!message || (plist_get_node_type(message) != PLIST_ARRAY) || (plist_array_get_size(message) < 2) || !backup_dir) return; + + plist_t files = plist_array_get_item(message, 1); + cnt = plist_array_get_size(files); + if (cnt == 0) return; + + for (i = 0; i < cnt; i++) { + plist_t val = plist_array_get_item(files, i); + if (plist_get_node_type(val) != PLIST_STRING) { + continue; + } + char *str = NULL; + plist_get_string_val(val, &str); + if (!str) + continue; + + if (mb2_handle_send_file(mobilebackup2, backup_dir, str, &errplist) < 0) { + free(str); + //printf("Error when sending file '%s' to device\n", str); + // TODO: perhaps we can continue, we've got a multi status response?! + break; + } + free(str); + } + + /* send terminating 0 dword */ + uint32_t zero = 0; + mobilebackup2_send_raw(mobilebackup2, (char*)&zero, 4, &sent); + + if (!errplist) { + plist_t emptydict = plist_new_dict(); + mobilebackup2_send_status_response(mobilebackup2, 0, NULL, emptydict); + plist_free(emptydict); + } else { + mobilebackup2_send_status_response(mobilebackup2, -13, "Multi status", errplist); + plist_free(errplist); + } +} + +static int mb2_receive_filename(mobilebackup2_client_t mobilebackup2, char** filename) +{ + uint32_t nlen = 0; + uint32_t rlen = 0; + + do { + nlen = 0; + rlen = 0; + mobilebackup2_receive_raw(mobilebackup2, (char*)&nlen, 4, &rlen); + nlen = be32toh(nlen); + + if ((nlen == 0) && (rlen == 4)) { + // a zero length means no more files to receive + return 0; + } else if(rlen == 0) { + // device needs more time, waiting... + continue; + } else if (nlen > 4096) { + // filename length is too large + printf("ERROR: %s: too large filename length (%d)!\n", __func__, nlen); + return 0; + } + + if (*filename != NULL) { + free(*filename); + *filename = NULL; + } + + *filename = (char*)malloc(nlen+1); + + rlen = 0; + mobilebackup2_receive_raw(mobilebackup2, *filename, nlen, &rlen); + if (rlen != nlen) { + printf("ERROR: %s: could not read filename\n", __func__); + return 0; + } + + char* p = *filename; + p[rlen] = 0; + + break; + } while(1 && !quit_flag); + + return nlen; +} + +static int mb2_handle_receive_files(mobilebackup2_client_t mobilebackup2, plist_t message, const char *backup_dir) +{ + uint64_t backup_real_size = 0; + uint64_t backup_total_size = 0; + uint32_t blocksize; + uint32_t bdone; + uint32_t rlen; + uint32_t nlen = 0; + uint32_t r; + char buf[32768]; + char *fname = NULL; + char *dname = NULL; + char *bname = NULL; + char code = 0; + char last_code = 0; + plist_t node = NULL; + FILE *f = NULL; + unsigned int file_count = 0; + + if (!message || (plist_get_node_type(message) != PLIST_ARRAY) || plist_array_get_size(message) < 4 || !backup_dir) return 0; + + node = plist_array_get_item(message, 3); + if (plist_get_node_type(node) == PLIST_UINT) { + plist_get_uint_val(node, &backup_total_size); + } + if (backup_total_size > 0) { + PRINT_VERBOSE(1, "Receiving files\n"); + } + + do { + if (quit_flag) + break; + + nlen = mb2_receive_filename(mobilebackup2, &dname); + if (nlen == 0) { + break; + } + + nlen = mb2_receive_filename(mobilebackup2, &fname); + if (!nlen) { + break; + } + + if (bname != NULL) { + free(bname); + bname = NULL; + } + + bname = build_path(backup_dir, fname, NULL); + + if (fname != NULL) { + free(fname); + fname = NULL; + } + + r = 0; + nlen = 0; + mobilebackup2_receive_raw(mobilebackup2, (char*)&nlen, 4, &r); + if (r != 4) { + printf("ERROR: %s: could not receive code length!\n", __func__); + break; + } + nlen = be32toh(nlen); + + last_code = code; + code = 0; + + mobilebackup2_receive_raw(mobilebackup2, &code, 1, &r); + if (r != 1) { + printf("ERROR: %s: could not receive code!\n", __func__); + break; + } + + /* TODO remove this */ + if ((code != CODE_SUCCESS) && (code != CODE_FILE_DATA) && (code != CODE_ERROR_REMOTE)) { + PRINT_VERBOSE(1, "Found new flag %02x\n", code); + } + + remove(bname); + f = fopen(bname, "wb"); + while (f && (code == CODE_FILE_DATA)) { + blocksize = nlen-1; + bdone = 0; + rlen = 0; + while (bdone < blocksize) { + if ((blocksize - bdone) < sizeof(buf)) { + rlen = blocksize - bdone; + } else { + rlen = sizeof(buf); + } + mobilebackup2_receive_raw(mobilebackup2, buf, rlen, &r); + if ((int)r <= 0) { + break; + } + fwrite(buf, 1, r, f); + bdone += r; + } + if (bdone == blocksize) { + backup_real_size += blocksize; + } + if (backup_total_size > 0) { + print_progress(backup_real_size, backup_total_size); + } + if (quit_flag) + break; + nlen = 0; + mobilebackup2_receive_raw(mobilebackup2, (char*)&nlen, 4, &r); + nlen = be32toh(nlen); + if (nlen > 0) { + last_code = code; + mobilebackup2_receive_raw(mobilebackup2, &code, 1, &r); + } else { + break; + } + } + if (f) { + fclose(f); + file_count++; + } else { + printf("Error opening '%s' for writing: %s\n", bname, strerror(errno)); + } + if (nlen == 0) { + break; + } + + /* check if an error message was received */ + if (code == CODE_ERROR_REMOTE) { + /* error message */ + char *msg = (char*)malloc(nlen); + mobilebackup2_receive_raw(mobilebackup2, msg, nlen-1, &r); + msg[r] = 0; + /* If sent using CODE_FILE_DATA, end marker will be CODE_ERROR_REMOTE which is not an error! */ + if (last_code != CODE_FILE_DATA) { + fprintf(stdout, "\nReceived an error message from device: %s\n", msg); + } + free(msg); + } + } while (1); + + if (fname != NULL) + free(fname); + + /* if there are leftovers to read, finish up cleanly */ + if ((int)nlen-1 > 0) { + PRINT_VERBOSE(1, "\nDiscarding current data hunk.\n"); + fname = (char*)malloc(nlen-1); + mobilebackup2_receive_raw(mobilebackup2, fname, nlen-1, &r); + free(fname); + remove(bname); + } + + /* clean up */ + if (bname != NULL) + free(bname); + + if (dname != NULL) + free(dname); + + // TODO error handling?! + plist_t empty_plist = plist_new_dict(); + mobilebackup2_send_status_response(mobilebackup2, 0, NULL, empty_plist); + plist_free(empty_plist); + + return file_count; +} + +static void mb2_handle_list_directory(mobilebackup2_client_t mobilebackup2, plist_t message, const char *backup_dir) +{ + if (!message || (plist_get_node_type(message) != PLIST_ARRAY) || plist_array_get_size(message) < 2 || !backup_dir) return; + + plist_t node = plist_array_get_item(message, 1); + char *str = NULL; + if (plist_get_node_type(node) == PLIST_STRING) { + plist_get_string_val(node, &str); + } + if (!str) { + printf("ERROR: Malformed DLContentsOfDirectory message\n"); + // TODO error handling + return; + } + + char *path = build_path(backup_dir, str, NULL); + free(str); + + plist_t dirlist = plist_new_dict(); + + DIR* cur_dir = opendir(path); + if (cur_dir) { + struct dirent* ep; + while ((ep = readdir(cur_dir))) { + if ((strcmp(ep->d_name, ".") == 0) || (strcmp(ep->d_name, "..") == 0)) { + continue; + } + char *fpath = build_path(path, ep->d_name, NULL); + if (fpath) { + plist_t fdict = plist_new_dict(); + struct stat st; + stat(fpath, &st); + const char *ftype = "DLFileTypeUnknown"; + if (S_ISDIR(st.st_mode)) { + ftype = "DLFileTypeDirectory"; + } else if (S_ISREG(st.st_mode)) { + ftype = "DLFileTypeRegular"; + } + plist_dict_insert_item(fdict, "DLFileType", plist_new_string(ftype)); + plist_dict_insert_item(fdict, "DLFileSize", plist_new_uint(st.st_size)); + plist_dict_insert_item(fdict, "DLFileModificationDate", plist_new_date(st.st_mtime, 0)); + + plist_dict_insert_item(dirlist, ep->d_name, fdict); + free(fpath); + } + } + closedir(cur_dir); + } + free(path); + + /* TODO error handling */ + mobilebackup2_error_t err = mobilebackup2_send_status_response(mobilebackup2, 0, NULL, dirlist); + plist_free(dirlist); + if (err != MOBILEBACKUP2_E_SUCCESS) { + printf("Could not send status response, error %d\n", err); + } +} + +static void mb2_handle_make_directory(mobilebackup2_client_t mobilebackup2, plist_t message, const char *backup_dir) +{ + if (!message || (plist_get_node_type(message) != PLIST_ARRAY) || plist_array_get_size(message) < 2 || !backup_dir) return; + + plist_t dir = plist_array_get_item(message, 1); + char *str = NULL; + int errcode = 0; + char *errdesc = NULL; + plist_get_string_val(dir, &str); + + char *newpath = build_path(backup_dir, str, NULL); + free(str); + + if (mkdir_with_parents(newpath, 0755) < 0) { + errdesc = strerror(errno); + if (errno != EEXIST) { + printf("mkdir: %s (%d)\n", errdesc, errno); + } + errcode = errno_to_device_error(errno); + } + free(newpath); + mobilebackup2_error_t err = mobilebackup2_send_status_response(mobilebackup2, errcode, errdesc, NULL); + if (err != MOBILEBACKUP2_E_SUCCESS) { + printf("Could not send status response, error %d\n", err); + } +} + +static void mb2_copy_file_by_path(const char *src, const char *dst) +{ + FILE *from, *to; + char buf[BUFSIZ]; + size_t length; + + /* open source file */ + if ((from = fopen(src, "rb")) == NULL) { + printf("Cannot open source path '%s'.\n", src); + return; + } + + /* open destination file */ + if ((to = fopen(dst, "wb")) == NULL) { + printf("Cannot open destination file '%s'.\n", dst); + return; + } + + /* copy the file */ + while ((length = fread(buf, 1, BUFSIZ, from)) != 0) { + fwrite(buf, 1, length, to); + } + + if(fclose(from) == EOF) { + printf("Error closing source file.\n"); + } + + if(fclose(to) == EOF) { + printf("Error closing destination file.\n"); + } +} + +static void mb2_copy_directory_by_path(const char *src, const char *dst) +{ + if (!src || !dst) { + return; + } + + struct stat st; + + /* if src does not exist */ + if ((stat(src, &st) < 0) || !S_ISDIR(st.st_mode)) { + printf("ERROR: Source directory does not exist '%s': %s (%d)\n", src, strerror(errno), errno); + return; + } + + /* if dst directory does not exist */ + if ((stat(dst, &st) < 0) || !S_ISDIR(st.st_mode)) { + /* create it */ + if (mkdir_with_parents(dst, 0755) < 0) { + printf("ERROR: Unable to create destination directory '%s': %s (%d)\n", dst, strerror(errno), errno); + return; + } + } + + /* loop over src directory contents */ + DIR *cur_dir = opendir(src); + if (cur_dir) { + struct dirent* ep; + while ((ep = readdir(cur_dir))) { + if ((strcmp(ep->d_name, ".") == 0) || (strcmp(ep->d_name, "..") == 0)) { + continue; + } + char *srcpath = build_path(src, ep->d_name, NULL); + char *dstpath = build_path(dst, ep->d_name, NULL); + if (srcpath && dstpath) { + /* copy file */ + mb2_copy_file_by_path(srcpath, dstpath); + + free(srcpath); + free(dstpath); + } + } + closedir(cur_dir); + } +} + +#ifdef WIN32 +#define BS_CC '\b' +#define my_getch getch +#else +#define BS_CC 0x7f +static int my_getch() +{ + struct termios oldt, newt; + int ch; + tcgetattr(STDIN_FILENO, &oldt); + newt = oldt; + newt.c_lflag &= ~(ICANON | ECHO); + tcsetattr(STDIN_FILENO, TCSANOW, &newt); + ch = getchar(); + tcsetattr(STDIN_FILENO, TCSANOW, &oldt); + return ch; +} +#endif + +static void get_hidden_input(char *buf, int maxlen) +{ + int pwlen = 0; + int c; + + while ((c = my_getch())) { + if ((c == '\r') || (c == '\n')) { + break; + } else if (isprint(c)) { + if (pwlen < maxlen-1) + buf[pwlen++] = c; + fputc('*', stderr); + } else if (c == BS_CC) { + if (pwlen > 0) { + fputs("\b \b", stderr); + pwlen--; + } + } + } + buf[pwlen] = 0; +} + +static char* ask_for_password(const char* msg, int type_again) +{ + char pwbuf[256]; + + fprintf(stderr, "%s: ", msg); + fflush(stderr); + get_hidden_input(pwbuf, 256); + fputc('\n', stderr); + + if (type_again) { + char pwrep[256]; + + fprintf(stderr, "%s (repeat): ", msg); + fflush(stderr); + get_hidden_input(pwrep, 256); + fputc('\n', stderr); + + if (strcmp(pwbuf, pwrep) != 0) { + printf("ERROR: passwords don't match\n"); + return NULL; + } + } + return strdup(pwbuf); +} + +/** + * signal handler function for cleaning up properly + */ +static void clean_exit(int sig) +{ + fprintf(stderr, "Exiting...\n"); + quit_flag++; +} + +static void print_usage(int argc, char **argv) +{ + char *name = NULL; + name = strrchr(argv[0], '/'); + printf("Usage: %s [OPTIONS] CMD [CMDOPTIONS] DIRECTORY\n", (name ? name + 1: argv[0])); + printf("Create or restore backup from the current or specified directory.\n\n"); + printf("commands:\n"); + printf(" backup\tcreate backup for the device\n"); + printf(" restore\trestore last backup to the device\n"); + printf(" --system\t\trestore system files, too.\n"); + printf(" --reboot\t\treboot the system when done.\n"); + printf(" --copy\t\tcreate a copy of backup folder before restoring.\n"); + printf(" --settings\t\trestore device settings from the backup.\n"); + printf(" --remove\t\tremove items which are not being restored\n"); + printf(" --password PWD\tsupply the password of the source backup\n"); + printf(" info\t\tshow details about last completed backup of device\n"); + printf(" list\t\tlist files of last completed backup in CSV format\n"); + printf(" unback\tunpack a completed backup in DIRECTORY/_unback_/\n"); + printf(" encryption on|off [PWD]\tenable or disable backup encryption\n"); + printf(" NOTE: password will be requested in interactive mode if omitted\n"); + printf(" changepw [OLD NEW] change backup password on target device\n"); + printf(" NOTE: passwords will be requested in interactive mode if omitted\n"); + printf("\n"); + printf("options:\n"); + printf(" -d, --debug\t\tenable communication debugging\n"); + printf(" -u, --udid UDID\ttarget specific device by its 40-digit device UDID\n"); + printf(" -s, --source UDID\tuse backup data from device specified by UDID\n"); + printf(" -i, --interactive\trequest passwords interactively\n"); + printf(" -h, --help\t\tprints usage information\n"); + printf("\n"); +} + +int main(int argc, char *argv[]) +{ + idevice_error_t ret = IDEVICE_E_UNKNOWN_ERROR; + int i; + char* udid = NULL; + char* source_udid = NULL; + lockdownd_service_descriptor_t service = NULL; + int cmd = -1; + int cmd_flags = 0; + int is_full_backup = 0; + int result_code = -1; + char* backup_directory = NULL; + int interactive_mode = 0; + char* backup_password = NULL; + char* newpw = NULL; + struct stat st; + plist_t node_tmp = NULL; + plist_t info_plist = NULL; + plist_t opts = NULL; + mobilebackup2_error_t err; + + /* we need to exit cleanly on running backups and restores or we cause havok */ + signal(SIGINT, clean_exit); + signal(SIGTERM, clean_exit); +#ifndef WIN32 + signal(SIGQUIT, clean_exit); + signal(SIGPIPE, SIG_IGN); +#endif + + /* parse cmdline args */ + for (i = 1; i < argc; i++) { + if (!strcmp(argv[i], "-d") || !strcmp(argv[i], "--debug")) { + idevice_set_debug_level(1); + continue; + } + else if (!strcmp(argv[i], "-u") || !strcmp(argv[i], "--udid")) { + i++; + if (!argv[i] || (strlen(argv[i]) != 40)) { + print_usage(argc, argv); + return -1; + } + udid = strdup(argv[i]); + continue; + } + else if (!strcmp(argv[i], "-s") || !strcmp(argv[i], "--source")) { + i++; + if (!argv[i] || (strlen(argv[i]) != 40)) { + print_usage(argc, argv); + return -1; + } + source_udid = strdup(argv[i]); + continue; + } + else if (!strcmp(argv[i], "-i") || !strcmp(argv[i], "--interactive")) { + interactive_mode = 1; + continue; + } + else if (!strcmp(argv[i], "-h") || !strcmp(argv[i], "--help")) { + print_usage(argc, argv); + return 0; + } + else if (!strcmp(argv[i], "backup")) { + cmd = CMD_BACKUP; + } + else if (!strcmp(argv[i], "restore")) { + cmd = CMD_RESTORE; + } + else if (!strcmp(argv[i], "--system")) { + cmd_flags |= CMD_FLAG_RESTORE_SYSTEM_FILES; + } + else if (!strcmp(argv[i], "--reboot")) { + cmd_flags |= CMD_FLAG_RESTORE_REBOOT; + } + else if (!strcmp(argv[i], "--copy")) { + cmd_flags |= CMD_FLAG_RESTORE_COPY_BACKUP; + } + else if (!strcmp(argv[i], "--settings")) { + cmd_flags |= CMD_FLAG_RESTORE_SETTINGS; + } + else if (!strcmp(argv[i], "--remove")) { + cmd_flags |= CMD_FLAG_RESTORE_REMOVE_ITEMS; + } + else if (!strcmp(argv[i], "--password")) { + i++; + if (!argv[i]) { + print_usage(argc, argv); + return -1; + } + if (backup_password) + free(backup_password); + backup_password = strdup(argv[i]); + continue; + } + else if (!strcmp(argv[i], "info")) { + cmd = CMD_INFO; + verbose = 0; + } + else if (!strcmp(argv[i], "list")) { + cmd = CMD_LIST; + verbose = 0; + } + else if (!strcmp(argv[i], "unback")) { + cmd = CMD_UNBACK; + } + else if (!strcmp(argv[i], "encryption")) { + cmd = CMD_CHANGEPW; + i++; + if (!argv[i]) { + printf("No argument given for encryption command; requires either 'on' or 'off'.\n"); + print_usage(argc, argv); + return -1; + } + if (!strcmp(argv[i], "on")) { + cmd_flags |= CMD_FLAG_ENCRYPTION_ENABLE; + } else if (!strcmp(argv[i], "off")) { + cmd_flags |= CMD_FLAG_ENCRYPTION_DISABLE; + } else { + printf("Invalid argument '%s' for encryption command; must be either 'on' or 'off'.\n", argv[i]); + } + // check if a password was given on the command line + if (newpw) { + free(newpw); + newpw = NULL; + } + if (backup_password) { + free(backup_password); + backup_password = NULL; + } + i++; + if (argv[i]) { + if (cmd_flags & CMD_FLAG_ENCRYPTION_ENABLE) { + newpw = strdup(argv[i]); + } else if (cmd_flags & CMD_FLAG_ENCRYPTION_DISABLE) { + backup_password = strdup(argv[i]); + } + } + continue; + } + else if (!strcmp(argv[i], "changepw")) { + cmd = CMD_CHANGEPW; + cmd_flags |= CMD_FLAG_ENCRYPTION_CHANGEPW; + // check if passwords were given on command line + if (newpw) { + free(newpw); + newpw = NULL; + } + if (backup_password) { + free(backup_password); + backup_password = NULL; + } + i++; + if (argv[i]) { + backup_password = strdup(argv[i]); + i++; + if (!argv[i]) { + printf("Old and new passwords have to be passed as arguments for the changepw command\n"); + print_usage(argc, argv); + return -1; + } + newpw = strdup(argv[i]); + } + continue; + } + else if (backup_directory == NULL) { + backup_directory = argv[i]; + } + else { + print_usage(argc, argv); + return -1; + } + } + + /* verify options */ + if (cmd == -1) { + printf("No command specified.\n"); + print_usage(argc, argv); + return -1; + } + + if (cmd == CMD_CHANGEPW) { + backup_directory = strdup(".this_folder_is_not_present_on_purpose"); + } else { + if (backup_directory == NULL) { + printf("No target backup directory specified.\n"); + print_usage(argc, argv); + return -1; + } + + /* verify if passed backup directory exists */ + if (stat(backup_directory, &st) != 0) { + printf("ERROR: Backup directory \"%s\" does not exist!\n", backup_directory); + return -1; + } + } + + idevice_t device = NULL; + if (udid) { + ret = idevice_new(&device, udid); + if (ret != IDEVICE_E_SUCCESS) { + printf("No device found with udid %s, is it plugged in?\n", udid); + return -1; + } + } + else + { + ret = idevice_new(&device, NULL); + if (ret != IDEVICE_E_SUCCESS) { + printf("No device found, is it plugged in?\n"); + return -1; + } + idevice_get_udid(device, &udid); + } + + if (!source_udid) { + source_udid = strdup(udid); + } + + uint8_t is_encrypted = 0; + char *info_path = NULL; + if (cmd == CMD_CHANGEPW) { + if (!interactive_mode && (!backup_password || !newpw)) { + printf("ERROR: Can't get password input in non-interactive mode. Either pass password(s) on the command line, or enable interactive mode with -i or --interactive.\n"); + return -1; + } + } else { + /* backup directory must contain an Info.plist */ + info_path = build_path(backup_directory, source_udid, "Info.plist", NULL); + if (cmd == CMD_RESTORE) { + if (stat(info_path, &st) != 0) { + free(info_path); + printf("ERROR: Backup directory \"%s\" is invalid. No Info.plist found for UDID %s.\n", backup_directory, source_udid); + return -1; + } + char* manifest_path = build_path(backup_directory, source_udid, "Manifest.plist", NULL); + if (stat(manifest_path, &st) != 0) { + free(info_path); + } + plist_t manifest_plist = NULL; + plist_read_from_filename(&manifest_plist, manifest_path); + if (!manifest_plist) { + free(info_path); + free(manifest_path); + printf("ERROR: Backup directory \"%s\" is invalid. No Manifest.plist found for UDID %s.\n", backup_directory, source_udid); + return -1; + } + node_tmp = plist_dict_get_item(manifest_plist, "IsEncrypted"); + if (node_tmp && (plist_get_node_type(node_tmp) == PLIST_BOOLEAN)) { + plist_get_bool_val(node_tmp, &is_encrypted); + } + plist_free(manifest_plist); + free(manifest_path); + } + PRINT_VERBOSE(1, "Backup directory is \"%s\"\n", backup_directory); + } + + if (is_encrypted) { + PRINT_VERBOSE(1, "This is an encrypted backup.\n"); + if (backup_password == NULL) { + if (interactive_mode) { + backup_password = ask_for_password("Enter backup password", 0); + } + if (!backup_password || (strlen(backup_password) == 0)) { + if (backup_password) { + free(backup_password); + } + idevice_free(device); + printf("ERROR: a backup password is required to restore an encrypted backup. Cannot continue.\n"); + return -1; + } + } + } + + lockdownd_client_t lockdown = NULL; + if (LOCKDOWN_E_SUCCESS != lockdownd_client_new_with_handshake(device, &lockdown, "idevicebackup")) { + idevice_free(device); + return -1; + } + + /* start notification_proxy */ + np_client_t np = NULL; + ret = lockdownd_start_service(lockdown, NP_SERVICE_NAME, &service); + if ((ret == LOCKDOWN_E_SUCCESS) && service && service->port) { + np_client_new(device, service, &np); + np_set_notify_callback(np, notify_cb, NULL); + const char *noties[5] = { + NP_SYNC_CANCEL_REQUEST, + NP_SYNC_SUSPEND_REQUEST, + NP_SYNC_RESUME_REQUEST, + NP_BACKUP_DOMAIN_CHANGED, + NULL + }; + np_observe_notifications(np, noties); + } else { + printf("ERROR: Could not start service %s.\n", NP_SERVICE_NAME); + } + + afc_client_t afc = NULL; + if (cmd == CMD_BACKUP) { + /* start AFC, we need this for the lock file */ + service->port = 0; + service->ssl_enabled = 0; + ret = lockdownd_start_service(lockdown, "com.apple.afc", &service); + if ((ret == LOCKDOWN_E_SUCCESS) && service->port) { + afc_client_new(device, service, &afc); + } + } + + if (service) { + lockdownd_service_descriptor_free(service); + service = NULL; + } + + /* start mobilebackup service and retrieve port */ + mobilebackup2_client_t mobilebackup2 = NULL; + ret = lockdownd_start_service(lockdown, MOBILEBACKUP2_SERVICE_NAME, &service); + if ((ret == LOCKDOWN_E_SUCCESS) && service && service->port) { + PRINT_VERBOSE(1, "Started \"%s\" service on port %d.\n", MOBILEBACKUP2_SERVICE_NAME, service->port); + mobilebackup2_client_new(device, service, &mobilebackup2); + + if (service) { + lockdownd_service_descriptor_free(service); + service = NULL; + } + + /* send Hello message */ + double local_versions[2] = {2.0, 2.1}; + double remote_version = 0.0; + err = mobilebackup2_version_exchange(mobilebackup2, local_versions, 2, &remote_version); + if (err != MOBILEBACKUP2_E_SUCCESS) { + printf("Could not perform backup protocol version exchange, error code %d\n", err); + cmd = CMD_LEAVE; + goto checkpoint; + } + + PRINT_VERBOSE(1, "Negotiated Protocol Version %.1f\n", remote_version); + + /* check abort conditions */ + if (quit_flag > 0) { + PRINT_VERBOSE(1, "Aborting as requested by user...\n"); + cmd = CMD_LEAVE; + goto checkpoint; + } + + /* verify existing Info.plist */ + if (info_path && (stat(info_path, &st) == 0)) { + PRINT_VERBOSE(1, "Reading Info.plist from backup.\n"); + plist_read_from_filename(&info_plist, info_path); + + if (!info_plist) { + printf("Could not read Info.plist\n"); + is_full_backup = 1; + } + } else { + if (cmd == CMD_RESTORE) { + printf("Aborting restore. Info.plist is missing.\n"); + cmd = CMD_LEAVE; + } else { + is_full_backup = 1; + } + } + + uint64_t lockfile = 0; + if (cmd == CMD_BACKUP) { + do_post_notification(device, NP_SYNC_WILL_START); + afc_file_open(afc, "/com.apple.itunes.lock_sync", AFC_FOPEN_RW, &lockfile); + } + if (lockfile) { + afc_error_t aerr; + do_post_notification(device, NP_SYNC_LOCK_REQUEST); + for (i = 0; i < LOCK_ATTEMPTS; i++) { + aerr = afc_file_lock(afc, lockfile, AFC_LOCK_EX); + if (aerr == AFC_E_SUCCESS) { + do_post_notification(device, NP_SYNC_DID_START); + break; + } else if (aerr == AFC_E_OP_WOULD_BLOCK) { + sleep(LOCK_WAIT); + continue; + } else { + fprintf(stderr, "ERROR: could not lock file! error code: %d\n", aerr); + afc_file_close(afc, lockfile); + lockfile = 0; + cmd = CMD_LEAVE; + } + } + if (i == LOCK_ATTEMPTS) { + fprintf(stderr, "ERROR: timeout while locking for sync\n"); + afc_file_close(afc, lockfile); + lockfile = 0; + cmd = CMD_LEAVE; + } + } + uint8_t willEncrypt = 0; + node_tmp = NULL; + lockdownd_get_value(lockdown, "com.apple.mobile.backup", "WillEncrypt", &node_tmp); + if (node_tmp) { + if (plist_get_node_type(node_tmp) == PLIST_BOOLEAN) { + plist_get_bool_val(node_tmp, &willEncrypt); + } + plist_free(node_tmp); + node_tmp = NULL; + } + +checkpoint: + + switch(cmd) { + case CMD_BACKUP: + { + PRINT_VERBOSE(1, "Starting backup...\n"); + + /* make sure backup device sub-directory exists */ + char* devbackupdir = build_path(backup_directory, source_udid, NULL); + __mkdir(devbackupdir, 0755); + free(devbackupdir); + + if (strcmp(source_udid, udid) != 0) { + /* handle different source backup directory */ + // make sure target backup device sub-directory exists + devbackupdir = build_path(backup_directory, udid, NULL); + __mkdir(devbackupdir, 0755); + free(devbackupdir); + + // use Info.plist path in target backup folder */ + free(info_path); + info_path = build_path(backup_directory, udid, "Info.plist", NULL); + } + + /* TODO: check domain com.apple.mobile.backup key RequiresEncrypt and WillEncrypt with lockdown */ + /* TODO: verify battery on AC enough battery remaining */ + + /* re-create Info.plist (Device infos, IC-Info.sidb, photos, app_ids, iTunesPrefs) */ + if (info_plist) { + plist_free(info_plist); + info_plist = NULL; + } + info_plist = mobilebackup_factory_info_plist_new(udid, lockdown, afc); + remove(info_path); + plist_write_to_filename(info_plist, info_path, PLIST_FORMAT_XML); + free(info_path); + + plist_free(info_plist); + info_plist = NULL; + + /* request backup from device with manifest from last backup */ + if (willEncrypt) { + PRINT_VERBOSE(1, "Backup will be encrypted.\n"); + } else { + PRINT_VERBOSE(1, "Backup will be unencrypted.\n"); + } + PRINT_VERBOSE(1, "Requesting backup from device...\n"); + err = mobilebackup2_send_request(mobilebackup2, "Backup", udid, source_udid, NULL); + if (err == MOBILEBACKUP2_E_SUCCESS) { + if (is_full_backup) { + PRINT_VERBOSE(1, "Full backup mode.\n"); + } else { + PRINT_VERBOSE(1, "Incremental backup mode.\n"); + } + } else { + if (err == MOBILEBACKUP2_E_BAD_VERSION) { + printf("ERROR: Could not start backup process: backup protocol version mismatch!\n"); + } else if (err == MOBILEBACKUP2_E_REPLY_NOT_OK) { + printf("ERROR: Could not start backup process: device refused to start the backup process.\n"); + } else { + printf("ERROR: Could not start backup process: unspecified error occured\n"); + } + cmd = CMD_LEAVE; + } + } + break; + case CMD_RESTORE: + { + /* TODO: verify battery on AC enough battery remaining */ + + /* verify if Status.plist says we read from an successful backup */ + if (!mb2_status_check_snapshot_state(backup_directory, source_udid, "finished")) { + printf("ERROR: Cannot ensure we restore from a successful backup. Aborting.\n"); + cmd = CMD_LEAVE; + break; + } + + PRINT_VERBOSE(1, "Starting Restore...\n"); + + opts = plist_new_dict(); + plist_dict_insert_item(opts, "RestoreSystemFiles", plist_new_bool(cmd_flags & CMD_FLAG_RESTORE_SYSTEM_FILES)); + PRINT_VERBOSE(1, "Restoring system files: %s\n", (cmd_flags & CMD_FLAG_RESTORE_SYSTEM_FILES ? "Yes":"No")); + if ((cmd_flags & CMD_FLAG_RESTORE_REBOOT) == 0) + plist_dict_insert_item(opts, "RestoreShouldReboot", plist_new_bool(0)); + PRINT_VERBOSE(1, "Rebooting after restore: %s\n", (cmd_flags & CMD_FLAG_RESTORE_REBOOT ? "Yes":"No")); + if ((cmd_flags & CMD_FLAG_RESTORE_COPY_BACKUP) == 0) + plist_dict_insert_item(opts, "RestoreDontCopyBackup", plist_new_bool(1)); + PRINT_VERBOSE(1, "Don't copy backup: %s\n", ((cmd_flags & CMD_FLAG_RESTORE_COPY_BACKUP) == 0 ? "Yes":"No")); + plist_dict_insert_item(opts, "RestorePreserveSettings", plist_new_bool((cmd_flags & CMD_FLAG_RESTORE_SETTINGS) == 0)); + PRINT_VERBOSE(1, "Preserve settings of device: %s\n", ((cmd_flags & CMD_FLAG_RESTORE_SETTINGS) == 0 ? "Yes":"No")); + if (cmd_flags & CMD_FLAG_RESTORE_REMOVE_ITEMS) + plist_dict_insert_item(opts, "RemoveItemsNotRestored", plist_new_bool(1)); + PRINT_VERBOSE(1, "Remove items that are not restored: %s\n", ((cmd_flags & CMD_FLAG_RESTORE_REMOVE_ITEMS) ? "Yes":"No")); + if (backup_password != NULL) { + plist_dict_insert_item(opts, "Password", plist_new_string(backup_password)); + } + PRINT_VERBOSE(1, "Backup password: %s\n", (backup_password == NULL ? "No":"Yes")); + + err = mobilebackup2_send_request(mobilebackup2, "Restore", udid, source_udid, opts); + plist_free(opts); + if (err != MOBILEBACKUP2_E_SUCCESS) { + if (err == MOBILEBACKUP2_E_BAD_VERSION) { + printf("ERROR: Could not start restore process: backup protocol version mismatch!\n"); + } else if (err == MOBILEBACKUP2_E_REPLY_NOT_OK) { + printf("ERROR: Could not start restore process: device refused to start the restore process.\n"); + } else { + printf("ERROR: Could not start restore process: unspecified error occured\n"); + } + cmd = CMD_LEAVE; + } + } + break; + case CMD_INFO: + { + PRINT_VERBOSE(1, "Requesting backup info from device...\n"); + err = mobilebackup2_send_request(mobilebackup2, "Info", udid, source_udid, NULL); + if (err != MOBILEBACKUP2_E_SUCCESS) { + printf("Error requesting backup info from device, error code %d\n", err); + cmd = CMD_LEAVE; + } + } + break; + case CMD_LIST: + { + + PRINT_VERBOSE(1, "Requesting backup list from device...\n"); + err = mobilebackup2_send_request(mobilebackup2, "List", udid, source_udid, NULL); + if (err != MOBILEBACKUP2_E_SUCCESS) { + printf("Error requesting backup list from device, error code %d\n", err); + cmd = CMD_LEAVE; + } + } + break; + case CMD_UNBACK: + { + PRINT_VERBOSE(1, "Starting to unpack backup...\n"); + err = mobilebackup2_send_request(mobilebackup2, "Unback", udid, source_udid, NULL); + if (err != MOBILEBACKUP2_E_SUCCESS) { + printf("Error requesting unback operation from device, error code %d\n", err); + cmd = CMD_LEAVE; + } + } + break; + case CMD_CHANGEPW: + { + opts = plist_new_dict(); + plist_dict_insert_item(opts, "TargetIdentifier", plist_new_string(udid)); + if (cmd_flags & CMD_FLAG_ENCRYPTION_ENABLE) { + if (!willEncrypt) { + if (!newpw) { + newpw = ask_for_password("Enter new backup password", 1); + } + if (!newpw) { + printf("No backup password given. Aborting.\n"); + } + } else { + printf("ERROR: Backup encryption is already enabled. Aborting.\n"); + cmd = CMD_LEAVE; + if (newpw) { + free(newpw); + newpw = NULL; + } + } + } else if (cmd_flags & CMD_FLAG_ENCRYPTION_DISABLE) { + if (willEncrypt) { + if (!backup_password) { + backup_password = ask_for_password("Enter current backup password", 0); + } + } else { + printf("ERROR: Backup encryption is not enabled. Aborting.\n"); + cmd = CMD_LEAVE; + if (backup_password) { + free(backup_password); + backup_password = NULL; + } + } + } else if (cmd_flags & CMD_FLAG_ENCRYPTION_CHANGEPW) { + if (willEncrypt) { + if (!backup_password) { + backup_password = ask_for_password("Enter old backup password", 0); + newpw = ask_for_password("Enter new backup password", 1); + } + } else { + printf("ERROR: Backup encryption is not enabled so can't change password. Aborting.\n"); + cmd = CMD_LEAVE; + if (newpw) { + free(newpw); + newpw = NULL; + } + if (backup_password) { + free(backup_password); + backup_password = NULL; + } + } + } + if (newpw) { + plist_dict_insert_item(opts, "NewPassword", plist_new_string(newpw)); + } + if (backup_password) { + plist_dict_insert_item(opts, "OldPassword", plist_new_string(backup_password)); + } + if (newpw || backup_password) { + mobilebackup2_send_message(mobilebackup2, "ChangePassword", opts); + /*if (cmd_flags & CMD_FLAG_ENCRYPTION_ENABLE) { + int retr = 10; + while ((retr-- >= 0) && !backup_domain_changed) { + sleep(1); + } + }*/ + } else { + cmd = CMD_LEAVE; + } + plist_free(opts); + } + break; + default: + break; + } + + /* close down the lockdown connection as it is no longer needed */ + if (lockdown) { + lockdownd_client_free(lockdown); + lockdown = NULL; + } + + if (cmd != CMD_LEAVE) { + /* reset operation success status */ + int operation_ok = 0; + plist_t message = NULL; + + char *dlmsg = NULL; + int file_count = 0; + int errcode = 0; + const char *errdesc = NULL; + + /* process series of DLMessage* operations */ + do { + if (dlmsg) { + free(dlmsg); + dlmsg = NULL; + } + mobilebackup2_receive_message(mobilebackup2, &message, &dlmsg); + if (!message || !dlmsg) { + PRINT_VERBOSE(1, "Device is not ready yet. Going to try again in 2 seconds...\n"); + sleep(2); + goto files_out; + } + + if (!strcmp(dlmsg, "DLMessageDownloadFiles")) { + /* device wants to download files from the computer */ + mb2_set_overall_progress_from_message(message, dlmsg); + mb2_handle_send_files(mobilebackup2, message, backup_directory); + } else if (!strcmp(dlmsg, "DLMessageUploadFiles")) { + /* device wants to send files to the computer */ + mb2_set_overall_progress_from_message(message, dlmsg); + file_count += mb2_handle_receive_files(mobilebackup2, message, backup_directory); + } else if (!strcmp(dlmsg, "DLMessageGetFreeDiskSpace")) { + /* device wants to know how much disk space is available on the computer */ + uint64_t freespace = 0; + int res = -1; +#ifdef WIN32 + if (GetDiskFreeSpaceEx(backup_directory, (PULARGE_INTEGER)&freespace, NULL, NULL)) { + res = 0; + } +#else + struct statvfs fs; + memset(&fs, '\0', sizeof(fs)); + res = statvfs(backup_directory, &fs); + if (res == 0) { + freespace = (uint64_t)fs.f_bavail * (uint64_t)fs.f_bsize; + } +#endif + plist_t freespace_item = plist_new_uint(freespace); + mobilebackup2_send_status_response(mobilebackup2, res, NULL, freespace_item); + plist_free(freespace_item); + } else if (!strcmp(dlmsg, "DLContentsOfDirectory")) { + /* list directory contents */ + mb2_handle_list_directory(mobilebackup2, message, backup_directory); + } else if (!strcmp(dlmsg, "DLMessageCreateDirectory")) { + /* make a directory */ + mb2_handle_make_directory(mobilebackup2, message, backup_directory); + } else if (!strcmp(dlmsg, "DLMessageMoveFiles") || !strcmp(dlmsg, "DLMessageMoveItems")) { + /* perform a series of rename operations */ + mb2_set_overall_progress_from_message(message, dlmsg); + plist_t moves = plist_array_get_item(message, 1); + uint32_t cnt = plist_dict_get_size(moves); + PRINT_VERBOSE(1, "Moving %d file%s\n", cnt, (cnt == 1) ? "" : "s"); + plist_dict_iter iter = NULL; + plist_dict_new_iter(moves, &iter); + errcode = 0; + errdesc = NULL; + if (iter) { + char *key = NULL; + plist_t val = NULL; + do { + plist_dict_next_item(moves, iter, &key, &val); + if (key && (plist_get_node_type(val) == PLIST_STRING)) { + char *str = NULL; + plist_get_string_val(val, &str); + if (str) { + char *newpath = build_path(backup_directory, str, NULL); + free(str); + char *oldpath = build_path(backup_directory, key, NULL); + +#ifdef WIN32 + if ((stat(newpath, &st) == 0) && S_ISDIR(st.st_mode)) + RemoveDirectory(newpath); + else + DeleteFile(newpath); +#else + remove(newpath); +#endif + if (rename(oldpath, newpath) < 0) { + printf("Renameing '%s' to '%s' failed: %s (%d)\n", oldpath, newpath, strerror(errno), errno); + errcode = errno_to_device_error(errno); + errdesc = strerror(errno); + break; + } + free(oldpath); + free(newpath); + } + free(key); + key = NULL; + } + } while (val); + free(iter); + } else { + errcode = -1; + errdesc = "Could not create dict iterator"; + printf("Could not create dict iterator\n"); + } + plist_t empty_dict = plist_new_dict(); + err = mobilebackup2_send_status_response(mobilebackup2, errcode, errdesc, empty_dict); + plist_free(empty_dict); + if (err != MOBILEBACKUP2_E_SUCCESS) { + printf("Could not send status response, error %d\n", err); + } + } else if (!strcmp(dlmsg, "DLMessageRemoveFiles") || !strcmp(dlmsg, "DLMessageRemoveItems")) { + mb2_set_overall_progress_from_message(message, dlmsg); + plist_t removes = plist_array_get_item(message, 1); + uint32_t cnt = plist_array_get_size(removes); + PRINT_VERBOSE(1, "Removing %d file%s\n", cnt, (cnt == 1) ? "" : "s"); + uint32_t ii = 0; + errcode = 0; + errdesc = NULL; + for (ii = 0; ii < cnt; ii++) { + plist_t val = plist_array_get_item(removes, ii); + if (plist_get_node_type(val) == PLIST_STRING) { + char *str = NULL; + plist_get_string_val(val, &str); + if (str) { + const char *checkfile = strchr(str, '/'); + int suppress_warning = 0; + if (checkfile) { + if (strcmp(checkfile+1, "Manifest.mbdx") == 0) { + suppress_warning = 1; + } + } + char *newpath = build_path(backup_directory, str, NULL); + free(str); +#ifdef WIN32 + int res = 0; + if ((stat(newpath, &st) == 0) && S_ISDIR(st.st_mode)) + res = RemoveDirectory(newpath); + else + res = DeleteFile(newpath); + if (!res) { + int e = win32err_to_errno(GetLastError()); + if (!suppress_warning) + printf("Could not remove '%s': %s (%d)\n", newpath, strerror(e), e); + errcode = errno_to_device_error(e); + errdesc = strerror(e); + } +#else + if (remove(newpath) < 0) { + if (!suppress_warning) + printf("Could not remove '%s': %s (%d)\n", newpath, strerror(errno), errno); + errcode = errno_to_device_error(errno); + errdesc = strerror(errno); + } +#endif + free(newpath); + } + } + } + plist_t empty_dict = plist_new_dict(); + err = mobilebackup2_send_status_response(mobilebackup2, errcode, errdesc, empty_dict); + plist_free(empty_dict); + if (err != MOBILEBACKUP2_E_SUCCESS) { + printf("Could not send status response, error %d\n", err); + } + } else if (!strcmp(dlmsg, "DLMessageCopyItem")) { + plist_t srcpath = plist_array_get_item(message, 1); + plist_t dstpath = plist_array_get_item(message, 2); + errcode = 0; + errdesc = NULL; + if ((plist_get_node_type(srcpath) == PLIST_STRING) && (plist_get_node_type(dstpath) == PLIST_STRING)) { + char *src = NULL; + char *dst = NULL; + plist_get_string_val(srcpath, &src); + plist_get_string_val(dstpath, &dst); + if (src && dst) { + char *oldpath = build_path(backup_directory, src, NULL); + char *newpath = build_path(backup_directory, dst, NULL); + + PRINT_VERBOSE(1, "Copying '%s' to '%s'\n", src, dst); + + /* check that src exists */ + if ((stat(oldpath, &st) == 0) && S_ISDIR(st.st_mode)) { + mb2_copy_directory_by_path(oldpath, newpath); + } else if ((stat(oldpath, &st) == 0) && S_ISREG(st.st_mode)) { + mb2_copy_file_by_path(oldpath, newpath); + } + + free(newpath); + free(oldpath); + } + free(src); + free(dst); + } + plist_t empty_dict = plist_new_dict(); + err = mobilebackup2_send_status_response(mobilebackup2, errcode, errdesc, empty_dict); + plist_free(empty_dict); + if (err != MOBILEBACKUP2_E_SUCCESS) { + printf("Could not send status response, error %d\n", err); + } + } else if (!strcmp(dlmsg, "DLMessageDisconnect")) { + break; + } else if (!strcmp(dlmsg, "DLMessageProcessMessage")) { + node_tmp = plist_array_get_item(message, 1); + if (plist_get_node_type(node_tmp) != PLIST_DICT) { + printf("Unknown message received!\n"); + } + plist_t nn; + int error_code = -1; + nn = plist_dict_get_item(node_tmp, "ErrorCode"); + if (nn && (plist_get_node_type(nn) == PLIST_UINT)) { + uint64_t ec = 0; + plist_get_uint_val(nn, &ec); + error_code = (uint32_t)ec; + if (error_code == 0) { + operation_ok = 1; + result_code = 0; + } else { + result_code = -error_code; + } + } + nn = plist_dict_get_item(node_tmp, "ErrorDescription"); + char *str = NULL; + if (nn && (plist_get_node_type(nn) == PLIST_STRING)) { + plist_get_string_val(nn, &str); + } + if (error_code != 0) { + if (str) { + printf("ErrorCode %d: %s\n", error_code, str); + } else { + printf("ErrorCode %d: (Unknown)\n", error_code); + } + } + if (str) { + free(str); + } + nn = plist_dict_get_item(node_tmp, "Content"); + if (nn && (plist_get_node_type(nn) == PLIST_STRING)) { + str = NULL; + plist_get_string_val(nn, &str); + PRINT_VERBOSE(1, "Content:\n"); + printf("%s", str); + free(str); + } + + break; + } + + /* print status */ + if (overall_progress > 0) { + print_progress_real(overall_progress, 0); + PRINT_VERBOSE(1, " Finished\n"); + } + + if (message) + plist_free(message); + message = NULL; + +files_out: + if (quit_flag > 0) { + /* need to cancel the backup here */ + //mobilebackup_send_error(mobilebackup, "Cancelling DLSendFile"); + + /* remove any atomic Manifest.plist.tmp */ + + /*manifest_path = mobilebackup_build_path(backup_directory, "Manifest", ".plist.tmp"); + if (stat(manifest_path, &st) == 0) + remove(manifest_path);*/ + break; + } + } while (1); + + /* report operation status to user */ + switch (cmd) { + case CMD_BACKUP: + PRINT_VERBOSE(1, "Received %d files from device.\n", file_count); + if (operation_ok && mb2_status_check_snapshot_state(backup_directory, udid, "finished")) { + PRINT_VERBOSE(1, "Backup Successful.\n"); + } else { + if (quit_flag) { + PRINT_VERBOSE(1, "Backup Aborted.\n"); + } else { + PRINT_VERBOSE(1, "Backup Failed (Error Code %d).\n", -result_code); + } + } + break; + case CMD_UNBACK: + if (quit_flag) { + PRINT_VERBOSE(1, "Unback Aborted.\n"); + } else { + PRINT_VERBOSE(1, "The files can now be found in the \"_unback_\" directory.\n"); + PRINT_VERBOSE(1, "Unback Successful.\n"); + } + break; + case CMD_CHANGEPW: + if (cmd_flags & CMD_FLAG_ENCRYPTION_ENABLE) { + if (operation_ok) { + PRINT_VERBOSE(1, "Backup encryption has been enabled successfully.\n"); + } else { + PRINT_VERBOSE(1, "Could not enable backup encryption.\n"); + } + } else if (cmd_flags & CMD_FLAG_ENCRYPTION_DISABLE) { + if (operation_ok) { + PRINT_VERBOSE(1, "Backup encryption has been disabled successfully.\n"); + } else { + PRINT_VERBOSE(1, "Could not disable backup encryption.\n"); + } + } else if (cmd_flags & CMD_FLAG_ENCRYPTION_CHANGEPW) { + if (operation_ok) { + PRINT_VERBOSE(1, "Backup encryption password has been changed successfully.\n"); + } else { + PRINT_VERBOSE(1, "Could not change backup encryption password.\n"); + } + } + break; + case CMD_RESTORE: + if (cmd_flags & CMD_FLAG_RESTORE_REBOOT) + PRINT_VERBOSE(1, "The device should reboot now.\n"); + if (operation_ok) { + PRINT_VERBOSE(1, "Restore Successful.\n"); + } else { + PRINT_VERBOSE(1, "Restore Failed (Error Code %d).\n", -result_code); + } + + break; + case CMD_INFO: + case CMD_LIST: + case CMD_LEAVE: + default: + if (quit_flag) { + PRINT_VERBOSE(1, "Operation Aborted.\n"); + } else if (cmd == CMD_LEAVE) { + PRINT_VERBOSE(1, "Operation Failed.\n"); + } else { + PRINT_VERBOSE(1, "Operation Successful.\n"); + } + break; + } + } + if (lockfile) { + afc_file_lock(afc, lockfile, AFC_LOCK_UN); + afc_file_close(afc, lockfile); + lockfile = 0; + if (cmd == CMD_BACKUP) + do_post_notification(device, NP_SYNC_DID_FINISH); + } + } else { + printf("ERROR: Could not start service %s.\n", MOBILEBACKUP2_SERVICE_NAME); + lockdownd_client_free(lockdown); + lockdown = NULL; + } + + if (lockdown) { + lockdownd_client_free(lockdown); + lockdown = NULL; + } + + if (mobilebackup2) { + mobilebackup2_client_free(mobilebackup2); + mobilebackup2 = NULL; + } + + if (afc) { + afc_client_free(afc); + afc = NULL; + } + + if (np) { + np_client_free(np); + np = NULL; + } + + idevice_free(device); + device = NULL; + + if (udid) { + free(udid); + udid = NULL; + } + if (source_udid) { + free(source_udid); + source_udid = NULL; + } + + return result_code; +} diff --git a/libimobiledevice-tools/idevicebackup2/idevicebackup2.vcxproj b/libimobiledevice-tools/idevicebackup2/idevicebackup2.vcxproj new file mode 100644 index 0000000..735aace --- /dev/null +++ b/libimobiledevice-tools/idevicebackup2/idevicebackup2.vcxproj @@ -0,0 +1,85 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {98E67352-7104-464C-8774-149B704660A1} + Win32Proj + idevicebackup2 + + + + Application + true + v110 + MultiByte + + + Application + false + v110 + true + Unicode + + + + + + + + + + + + + + true + + + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + + + Console + true + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + + + Console + true + true + true + + + + + + + + + \ No newline at end of file diff --git a/libimobiledevice-tools/idevicebackup2/idevicebackup2.vcxproj.filters b/libimobiledevice-tools/idevicebackup2/idevicebackup2.vcxproj.filters new file mode 100644 index 0000000..dbf5079 --- /dev/null +++ b/libimobiledevice-tools/idevicebackup2/idevicebackup2.vcxproj.filters @@ -0,0 +1,18 @@ + + + + + {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 + + + + + Source Files + + + \ No newline at end of file diff --git a/libimobiledevice-win32.sln b/libimobiledevice-win32.sln index a97813b..97aeced 100644 --- a/libimobiledevice-win32.sln +++ b/libimobiledevice-win32.sln @@ -94,6 +94,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "idevicebackup", "libimobile {AA5715E5-75AA-4CCC-A3D7-819FC833603C} = {AA5715E5-75AA-4CCC-A3D7-819FC833603C} EndProjectSection EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "idevicebackup2", "libimobiledevice-tools\idevicebackup2\idevicebackup2.vcxproj", "{98E67352-7104-464C-8774-149B704660A1}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -314,6 +316,16 @@ Global {F3837EA2-E283-4D52-8955-0BD75A8F6CFB}.Release|Mixed Platforms.Build.0 = Release|Win32 {F3837EA2-E283-4D52-8955-0BD75A8F6CFB}.Release|Win32.ActiveCfg = Release|Win32 {F3837EA2-E283-4D52-8955-0BD75A8F6CFB}.Release|Win32.Build.0 = Release|Win32 + {98E67352-7104-464C-8774-149B704660A1}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {98E67352-7104-464C-8774-149B704660A1}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {98E67352-7104-464C-8774-149B704660A1}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {98E67352-7104-464C-8774-149B704660A1}.Debug|Win32.ActiveCfg = Debug|Win32 + {98E67352-7104-464C-8774-149B704660A1}.Debug|Win32.Build.0 = Debug|Win32 + {98E67352-7104-464C-8774-149B704660A1}.Release|Any CPU.ActiveCfg = Release|Win32 + {98E67352-7104-464C-8774-149B704660A1}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {98E67352-7104-464C-8774-149B704660A1}.Release|Mixed Platforms.Build.0 = Release|Win32 + {98E67352-7104-464C-8774-149B704660A1}.Release|Win32.ActiveCfg = Release|Win32 + {98E67352-7104-464C-8774-149B704660A1}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -330,5 +342,6 @@ Global {80E14F4A-9707-4B30-9D63-306756A2E05C} = {054378B1-3FE2-4586-A94C-11424D95C913} {B2F015FE-07F5-43AC-B6E6-DF8D0D4ADC66} = {054378B1-3FE2-4586-A94C-11424D95C913} {F3837EA2-E283-4D52-8955-0BD75A8F6CFB} = {054378B1-3FE2-4586-A94C-11424D95C913} + {98E67352-7104-464C-8774-149B704660A1} = {054378B1-3FE2-4586-A94C-11424D95C913} EndGlobalSection EndGlobal From d3c29da1c1f10c7f6ebee36de7b3faa04a3631bf Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 27 May 2014 18:37:37 +0400 Subject: [PATCH 3/9] build fixed --- libimobiledevice-win32.sln | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libimobiledevice-win32.sln b/libimobiledevice-win32.sln index 97aeced..4ca0f1c 100644 --- a/libimobiledevice-win32.sln +++ b/libimobiledevice-win32.sln @@ -8,6 +8,9 @@ EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgen", "libgen\libgen.vcxproj", "{3E2B717A-7A6F-4FF5-9025-738968045272}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libplist", "libplist\libplist.vcxproj", "{C2FC6AFF-553B-4B8F-8158-93D8D50A8C02}" + ProjectSection(ProjectDependencies) = postProject + {69CDCB06-C62E-45F6-9E2B-4313C228F957} = {69CDCB06-C62E-45F6-9E2B-4313C228F957} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libusbmuxd", "libusbmuxd\libusbmuxd.vcxproj", "{53034340-F651-4ACB-8FEF-FFE0FF7AA013}" ProjectSection(ProjectDependencies) = postProject @@ -19,6 +22,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libimobiledevice", "libimob {53034340-F651-4ACB-8FEF-FFE0FF7AA013} = {53034340-F651-4ACB-8FEF-FFE0FF7AA013} {3E2B717A-7A6F-4FF5-9025-738968045272} = {3E2B717A-7A6F-4FF5-9025-738968045272} {1C06E1E0-3FF7-4DAF-A9BA-7C8E2FA11B03} = {1C06E1E0-3FF7-4DAF-A9BA-7C8E2FA11B03} + {AA5715E5-75AA-4CCC-A3D7-819FC833603C} = {AA5715E5-75AA-4CCC-A3D7-819FC833603C} {C2FC6AFF-553B-4B8F-8158-93D8D50A8C02} = {C2FC6AFF-553B-4B8F-8158-93D8D50A8C02} EndProjectSection EndProject From c9ebfa759d6cb6c4863b5c765f8d8ffb81e80672 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 27 May 2014 18:55:01 +0400 Subject: [PATCH 4/9] libiconv and libxml updated to compilable static versions --- getopt/getopt.vcxproj | 1 + libcnary/libcnary.vcxproj | 1 + libcompat/libcompat.vcxproj | 1 + libgen/libgen.vcxproj | 1 + .../idevice-app-runner.vcxproj | 1 + .../idevice-debug-client.vcxproj | 1 + .../idevicebackup/idevicebackup.vcxproj | 1 + .../idevicebackup2/idevicebackup2.vcxproj | 1 + .../idevicedebugserverproxy.vcxproj | 1 + .../ideviceimagemounter.vcxproj | 1 + .../ideviceinfo/ideviceinfo.vcxproj | 1 + .../ideviceinstaller/ideviceinstaller.vcxproj | 1 + .../ideviceprovision/ideviceprovision.vcxproj | 1 + .../idevicescreenshot.vcxproj | 1 + .../libimobiledevice-tools-common.props | 2 +- libimobiledevice-win32.sln | 25 + libimobiledevice/libimobiledevice.vcxproj | 1 + libplist/libplist.vcxproj | 3 +- libusbmuxd/libusbmuxd.vcxproj | 1 + libzip/libzip.vcxproj | 1 + vendors/iconv/include/iconv.h | 134 - vendors/iconv/lib/iconv.lib | Bin 3090 -> 0 bytes vendors/iconv/lib/iconv_a.lib | Bin 959910 -> 0 bytes vendors/libiconv/iconv.c | 610 + vendors/libiconv/include/aliases.h | 1719 + vendors/libiconv/include/aliases2.h | 40 + vendors/libiconv/include/aliases_aix.h | 18 + vendors/libiconv/include/aliases_aix_sysaix.h | 24 + vendors/libiconv/include/aliases_dos.h | 48 + vendors/libiconv/include/aliases_extra.h | 12 + vendors/libiconv/include/aliases_osf1.h | 2 + .../libiconv/include/aliases_osf1_sysosf1.h | 4 + vendors/libiconv/include/aliases_sysaix.h | 1769 + vendors/libiconv/include/aliases_syshpux.h | 1773 + vendors/libiconv/include/aliases_sysosf1.h | 1745 + vendors/libiconv/include/aliases_syssolaris.h | 1756 + vendors/libiconv/include/armscii_8.h | 116 + vendors/libiconv/include/ascii.h | 44 + vendors/libiconv/include/atarist.h | 158 + vendors/libiconv/include/big5.h | 4160 +++ vendors/libiconv/include/big5_2003.h | 476 + vendors/libiconv/include/big5hkscs1999.h | 197 + vendors/libiconv/include/big5hkscs2001.h | 215 + vendors/libiconv/include/big5hkscs2004.h | 231 + vendors/libiconv/include/big5hkscs2008.h | 247 + vendors/libiconv/include/c99.h | 125 + vendors/libiconv/include/canonical.h | 110 + vendors/libiconv/include/canonical_aix.h | 9 + .../libiconv/include/canonical_aix_sysaix.h | 9 + vendors/libiconv/include/canonical_dos.h | 15 + vendors/libiconv/include/canonical_extra.h | 7 + vendors/libiconv/include/canonical_local.h | 2 + .../libiconv/include/canonical_local_sysaix.h | 2 + .../include/canonical_local_syshpux.h | 2 + .../include/canonical_local_sysosf1.h | 2 + .../include/canonical_local_syssolaris.h | 2 + vendors/libiconv/include/canonical_osf1.h | 2 + .../libiconv/include/canonical_osf1_sysosf1.h | 2 + vendors/libiconv/include/canonical_sysaix.h | 110 + vendors/libiconv/include/canonical_syshpux.h | 110 + vendors/libiconv/include/canonical_sysosf1.h | 110 + .../libiconv/include/canonical_syssolaris.h | 110 + vendors/libiconv/include/ces_big5.h | 70 + vendors/libiconv/include/ces_gbk.h | 65 + vendors/libiconv/include/cjk_variants.h | 4241 +++ vendors/libiconv/include/cns11643.h | 41 + vendors/libiconv/include/cns11643_1.h | 893 + vendors/libiconv/include/cns11643_15.h | 1083 + vendors/libiconv/include/cns11643_2.h | 1112 + vendors/libiconv/include/cns11643_3.h | 974 + vendors/libiconv/include/cns11643_4.h | 61 + vendors/libiconv/include/cns11643_4a.h | 460 + vendors/libiconv/include/cns11643_4b.h | 668 + vendors/libiconv/include/cns11643_5.h | 1278 + vendors/libiconv/include/cns11643_6.h | 968 + vendors/libiconv/include/cns11643_7.h | 988 + vendors/libiconv/include/cns11643_inv.h | 15412 ++++++++ vendors/libiconv/include/config.h | 923 + vendors/libiconv/include/converters.h | 298 + vendors/libiconv/include/cp1046.h | 157 + vendors/libiconv/include/cp1124.h | 102 + vendors/libiconv/include/cp1125.h | 129 + vendors/libiconv/include/cp1129.h | 121 + vendors/libiconv/include/cp1131.h | 132 + vendors/libiconv/include/cp1133.h | 110 + vendors/libiconv/include/cp1161.h | 89 + vendors/libiconv/include/cp1162.h | 70 + vendors/libiconv/include/cp1163.h | 63 + vendors/libiconv/include/cp1250.h | 139 + vendors/libiconv/include/cp1251.h | 131 + vendors/libiconv/include/cp1252.h | 103 + vendors/libiconv/include/cp1253.h | 122 + vendors/libiconv/include/cp1254.h | 146 + vendors/libiconv/include/cp1255.h | 380 + vendors/libiconv/include/cp1256.h | 153 + vendors/libiconv/include/cp1257.h | 139 + vendors/libiconv/include/cp1258.h | 288 + vendors/libiconv/include/cp437.h | 156 + vendors/libiconv/include/cp737.h | 141 + vendors/libiconv/include/cp775.h | 142 + vendors/libiconv/include/cp850.h | 124 + vendors/libiconv/include/cp852.h | 143 + vendors/libiconv/include/cp853.h | 151 + vendors/libiconv/include/cp855.h | 128 + vendors/libiconv/include/cp856.h | 134 + vendors/libiconv/include/cp857.h | 138 + vendors/libiconv/include/cp858.h | 61 + vendors/libiconv/include/cp860.h | 149 + vendors/libiconv/include/cp861.h | 156 + vendors/libiconv/include/cp862.h | 155 + vendors/libiconv/include/cp863.h | 156 + vendors/libiconv/include/cp864.h | 188 + vendors/libiconv/include/cp865.h | 156 + vendors/libiconv/include/cp866.h | 125 + vendors/libiconv/include/cp869.h | 137 + vendors/libiconv/include/cp874.h | 111 + vendors/libiconv/include/cp922.h | 99 + vendors/libiconv/include/cp932.h | 240 + vendors/libiconv/include/cp932ext.h | 709 + vendors/libiconv/include/cp936.h | 126 + vendors/libiconv/include/cp936ext.h | 99 + vendors/libiconv/include/cp943.h | 29 + vendors/libiconv/include/cp949.h | 128 + vendors/libiconv/include/cp950.h | 284 + vendors/libiconv/include/cp950ext.h | 161 + vendors/libiconv/include/dec_hanyu.h | 115 + vendors/libiconv/include/dec_kanji.h | 71 + vendors/libiconv/include/encodings.def | 1030 + vendors/libiconv/include/encodings_aix.def | 97 + vendors/libiconv/include/encodings_dos.def | 127 + vendors/libiconv/include/encodings_extra.def | 57 + vendors/libiconv/include/encodings_local.def | 29 + vendors/libiconv/include/encodings_osf1.def | 37 + vendors/libiconv/include/euc_cn.h | 72 + vendors/libiconv/include/euc_jisx0213.h | 268 + vendors/libiconv/include/euc_jp.h | 191 + vendors/libiconv/include/euc_kr.h | 74 + vendors/libiconv/include/euc_tw.h | 116 + vendors/libiconv/include/flags.h | 157 + vendors/libiconv/include/flushwc.h | 37 + vendors/libiconv/include/gb12345.h | 67 + vendors/libiconv/include/gb12345ext.h | 1796 + vendors/libiconv/include/gb18030.h | 382 + vendors/libiconv/include/gb18030ext.h | 328 + vendors/libiconv/include/gb18030uni.h | 249 + vendors/libiconv/include/gb2312.h | 2571 ++ vendors/libiconv/include/gbk.h | 169 + vendors/libiconv/include/gbkext1.h | 853 + vendors/libiconv/include/gbkext2.h | 1174 + vendors/libiconv/include/gbkext_inv.h | 2343 ++ vendors/libiconv/include/georgian_academy.h | 106 + vendors/libiconv/include/georgian_ps.h | 123 + vendors/libiconv/include/hkscs1999.h | 3005 ++ vendors/libiconv/include/hkscs2001.h | 683 + vendors/libiconv/include/hkscs2004.h | 679 + vendors/libiconv/include/hkscs2008.h | 467 + vendors/libiconv/include/hp_roman8.h | 119 + vendors/libiconv/include/hz.h | 163 + vendors/libiconv/include/iconv.h | 250 + vendors/libiconv/include/iconv_open1.h | 229 + vendors/libiconv/include/iconv_open2.h | 89 + vendors/libiconv/include/iso2022_cn.h | 324 + vendors/libiconv/include/iso2022_cnext.h | 590 + vendors/libiconv/include/iso2022_jp.h | 216 + vendors/libiconv/include/iso2022_jp1.h | 264 + vendors/libiconv/include/iso2022_jp2.h | 693 + vendors/libiconv/include/iso2022_jp3.h | 538 + vendors/libiconv/include/iso2022_kr.h | 222 + vendors/libiconv/include/iso646_cn.h | 58 + vendors/libiconv/include/iso646_jp.h | 60 + vendors/libiconv/include/iso8859_1.h | 41 + vendors/libiconv/include/iso8859_10.h | 106 + vendors/libiconv/include/iso8859_11.h | 52 + vendors/libiconv/include/iso8859_13.h | 109 + vendors/libiconv/include/iso8859_14.h | 127 + vendors/libiconv/include/iso8859_15.h | 81 + vendors/libiconv/include/iso8859_16.h | 116 + vendors/libiconv/include/iso8859_2.h | 112 + vendors/libiconv/include/iso8859_3.h | 118 + vendors/libiconv/include/iso8859_4.h | 112 + vendors/libiconv/include/iso8859_5.h | 95 + vendors/libiconv/include/iso8859_6.h | 98 + vendors/libiconv/include/iso8859_7.h | 111 + vendors/libiconv/include/iso8859_8.h | 107 + vendors/libiconv/include/iso8859_9.h | 85 + vendors/libiconv/include/isoir165.h | 159 + vendors/libiconv/include/isoir165ext.h | 800 + vendors/libiconv/include/java.h | 137 + vendors/libiconv/include/jisx0201.h | 66 + vendors/libiconv/include/jisx0208.h | 2415 ++ vendors/libiconv/include/jisx0212.h | 2189 ++ vendors/libiconv/include/jisx0213.h | 5924 ++++ vendors/libiconv/include/johab.h | 139 + vendors/libiconv/include/johab_hangul.h | 262 + vendors/libiconv/include/koi8_r.h | 153 + vendors/libiconv/include/koi8_ru.h | 159 + vendors/libiconv/include/koi8_t.h | 143 + vendors/libiconv/include/koi8_u.h | 161 + vendors/libiconv/include/ksc5601.h | 3022 ++ vendors/libiconv/include/loop_unicode.h | 527 + vendors/libiconv/include/loop_wchar.h | 474 + vendors/libiconv/include/loops.h | 25 + vendors/libiconv/include/mac_arabic.h | 132 + vendors/libiconv/include/mac_centraleurope.h | 139 + vendors/libiconv/include/mac_croatian.h | 165 + vendors/libiconv/include/mac_cyrillic.h | 136 + vendors/libiconv/include/mac_greek.h | 135 + vendors/libiconv/include/mac_hebrew.h | 132 + vendors/libiconv/include/mac_iceland.h | 162 + vendors/libiconv/include/mac_roman.h | 167 + vendors/libiconv/include/mac_romania.h | 165 + vendors/libiconv/include/mac_thai.h | 128 + vendors/libiconv/include/mac_turkish.h | 163 + vendors/libiconv/include/mac_ukraine.h | 143 + vendors/libiconv/include/mulelao.h | 96 + vendors/libiconv/include/nextstep.h | 141 + vendors/libiconv/include/pt154.h | 118 + vendors/libiconv/include/relocatable.h | 83 + vendors/libiconv/include/riscos1.h | 96 + vendors/libiconv/include/rk1048.h | 145 + vendors/libiconv/include/shift_jisx0213.h | 310 + vendors/libiconv/include/sjis.h | 132 + vendors/libiconv/include/tcvn.h | 291 + vendors/libiconv/include/tds565.h | 107 + vendors/libiconv/include/tis620.h | 52 + vendors/libiconv/include/translit.def | 3918 +++ vendors/libiconv/include/translit.h | 4411 +++ vendors/libiconv/include/ucs2.h | 68 + vendors/libiconv/include/ucs2be.h | 51 + vendors/libiconv/include/ucs2internal.h | 51 + vendors/libiconv/include/ucs2le.h | 51 + vendors/libiconv/include/ucs2swapped.h | 60 + vendors/libiconv/include/ucs4.h | 69 + vendors/libiconv/include/ucs4be.h | 46 + vendors/libiconv/include/ucs4internal.h | 43 + vendors/libiconv/include/ucs4le.h | 46 + vendors/libiconv/include/ucs4swapped.h | 53 + vendors/libiconv/include/uhc_1.h | 1725 + vendors/libiconv/include/uhc_2.h | 1022 + vendors/libiconv/include/utf16.h | 113 + vendors/libiconv/include/utf16be.h | 80 + vendors/libiconv/include/utf16le.h | 80 + vendors/libiconv/include/utf32.h | 93 + vendors/libiconv/include/utf32be.h | 55 + vendors/libiconv/include/utf32le.h | 55 + vendors/libiconv/include/utf7.h | 355 + vendors/libiconv/include/utf8.h | 128 + vendors/libiconv/include/vietcomb.h | 466 + vendors/libiconv/include/viscii.h | 141 + vendors/libiconv/libiconv.rc | 42 + vendors/libiconv/libiconv.vcxproj | 326 + vendors/libiconv/libiconv.vcxproj.filters | 718 + vendors/libiconv/localcharset.c | 543 + vendors/libiconv/localcharset.h | 50 + vendors/libiconv/relocatable.c | 483 + vendors/libiconv/relocatable.h | 83 + vendors/libxml/config.h | 125 + vendors/libxml/include/libxml.h | 112 + vendors/libxml/libxml2-focus.vcxproj | 184 + vendors/libxml/libxml2.sln | 20 + vendors/libxml/libxml2.vcxproj | 145 + vendors/libxml/libxml2.vcxproj.filters | 174 + vendors/libxml/src/DOCBparser.c | 305 + vendors/libxml/src/HTMLparser.c | 7077 ++++ vendors/libxml/src/HTMLtree.c | 1253 + vendors/libxml/src/SAX.c | 180 + vendors/libxml/src/SAX2.c | 3033 ++ vendors/libxml/src/buf.c | 1304 + vendors/libxml/src/buf.h | 72 + vendors/libxml/src/c14n.c | 2237 ++ vendors/libxml/src/catalog.c | 3820 ++ vendors/libxml/src/chvalid.c | 336 + vendors/libxml/src/debugXML.c | 3421 ++ vendors/libxml/src/dict.c | 1259 + vendors/libxml/src/elfgcchack.h | 17784 ++++++++++ vendors/libxml/src/enc.h | 32 + vendors/libxml/src/encoding.c | 4071 +++ vendors/libxml/src/entities.c | 1105 + vendors/libxml/src/error.c | 996 + vendors/libxml/src/globals.c | 1114 + vendors/libxml/src/hash.c | 1121 + vendors/libxml/src/legacy.c | 1343 + vendors/libxml/src/libxml.h | 112 + .../src}/libxml/DOCBparser.h | 18 +- .../src}/libxml/HTMLparser.h | 47 +- .../include => libxml/src}/libxml/HTMLtree.h | 38 +- .../include => libxml/src}/libxml/SAX.h | 74 +- .../include => libxml/src}/libxml/SAX2.h | 68 +- .../include => libxml/src}/libxml/c14n.h | 2 +- .../include => libxml/src}/libxml/catalog.h | 70 +- .../include => libxml/src}/libxml/chvalid.h | 0 .../include => libxml/src}/libxml/debugXML.h | 52 +- .../include => libxml/src}/libxml/dict.h | 21 +- .../include => libxml/src}/libxml/encoding.h | 28 +- .../include => libxml/src}/libxml/entities.h | 3 +- .../include => libxml/src}/libxml/globals.h | 0 .../include => libxml/src}/libxml/hash.h | 48 +- .../include => libxml/src}/libxml/list.h | 52 +- .../include => libxml/src}/libxml/nanoftp.h | 1 + .../include => libxml/src}/libxml/nanohttp.h | 26 +- .../include => libxml/src}/libxml/parser.h | 150 +- .../src}/libxml/parserInternals.h | 179 +- .../include => libxml/src}/libxml/pattern.h | 0 .../include => libxml/src}/libxml/relaxng.h | 0 .../src}/libxml/schemasInternals.h | 4 +- .../src}/libxml/schematron.h | 22 +- .../include => libxml/src}/libxml/threads.h | 0 .../include => libxml/src}/libxml/tree.h | 355 +- .../include => libxml/src}/libxml/uri.h | 0 .../include => libxml/src}/libxml/valid.h | 144 +- .../include => libxml/src}/libxml/xinclude.h | 0 .../include => libxml/src}/libxml/xlink.h | 14 +- .../include => libxml/src}/libxml/xmlIO.h | 136 +- .../src}/libxml/xmlautomata.h | 44 +- .../include => libxml/src}/libxml/xmlerror.h | 13 +- .../src}/libxml/xmlexports.h | 4 +- .../include => libxml/src}/libxml/xmlmemory.h | 0 .../include => libxml/src}/libxml/xmlmodule.h | 2 +- .../include => libxml/src}/libxml/xmlreader.h | 44 +- .../include => libxml/src}/libxml/xmlregexp.h | 0 .../include => libxml/src}/libxml/xmlsave.h | 0 .../src}/libxml/xmlschemas.h | 32 +- .../src}/libxml/xmlschemastypes.h | 40 +- .../include => libxml/src}/libxml/xmlstring.h | 6 +- .../src}/libxml/xmlunicode.h | 0 .../src}/libxml/xmlversion.h | 38 +- vendors/libxml/src/libxml/xmlversion.h.in | 489 + .../include => libxml/src}/libxml/xmlwriter.h | 5 +- .../include => libxml/src}/libxml/xpath.h | 97 +- .../src}/libxml/xpathInternals.h | 160 +- .../include => libxml/src}/libxml/xpointer.h | 46 +- vendors/libxml/src/list.c | 779 + vendors/libxml/src/nanoftp.c | 2113 ++ vendors/libxml/src/nanohttp.c | 1889 + vendors/libxml/src/parser.c | 15556 +++++++++ vendors/libxml/src/parserInternals.c | 2127 ++ vendors/libxml/src/pattern.c | 2617 ++ vendors/libxml/src/relaxng.c | 11033 ++++++ vendors/libxml/src/save.h | 35 + vendors/libxml/src/schematron.c | 1785 + vendors/libxml/src/threads.c | 1037 + vendors/libxml/src/timsort.h | 514 + vendors/libxml/src/tree.c | 10083 ++++++ vendors/libxml/src/trio.c | 6869 ++++ vendors/libxml/src/trio.h | 216 + vendors/libxml/src/triodef.h | 222 + vendors/libxml/src/trionan.c | 914 + vendors/libxml/src/trionan.h | 84 + vendors/libxml/src/triop.h | 150 + vendors/libxml/src/triostr.c | 2106 ++ vendors/libxml/src/triostr.h | 144 + vendors/libxml/src/uri.c | 2564 ++ vendors/libxml/src/valid.c | 7050 ++++ vendors/libxml/src/win32config.h | 124 + vendors/libxml/src/wsockcompat.h | 86 + vendors/libxml/src/xinclude.c | 2623 ++ vendors/libxml/src/xlink.c | 183 + vendors/libxml/src/xmlIO.c | 4155 +++ vendors/libxml/src/xmlcatalog.c | 614 + vendors/libxml/src/xmllint.c | 3776 ++ vendors/libxml/src/xmlmemory.c | 1123 + vendors/libxml/src/xmlmodule.c | 460 + vendors/libxml/src/xmlreader.c | 5918 ++++ vendors/libxml/src/xmlregexp.c | 8167 +++++ vendors/libxml/src/xmlsave.c | 2788 ++ vendors/libxml/src/xmlschemas.c | 28905 ++++++++++++++++ vendors/libxml/src/xmlschemastypes.c | 6134 ++++ vendors/libxml/src/xmlstring.c | 984 + vendors/libxml/src/xmlunicode.c | 3179 ++ vendors/libxml/src/xmlwriter.c | 4737 +++ vendors/libxml/src/xpath.c | 15356 ++++++++ vendors/libxml/src/xpointer.c | 3005 ++ vendors/libxml2/lib/libxml2.lib | Bin 377216 -> 0 bytes vendors/libxml2/lib/libxml2_a.lib | Bin 3098346 -> 0 bytes vendors/libxml2/lib/libxml2_a_dll.lib | Bin 3099094 -> 0 bytes vendors/libxml2/readme.txt | 22 - vendors/socket/socket.vcxproj | 1 + vendors/thread/thread.vcxproj | 1 + 378 files changed, 327611 insertions(+), 1109 deletions(-) delete mode 100644 vendors/iconv/include/iconv.h delete mode 100644 vendors/iconv/lib/iconv.lib delete mode 100644 vendors/iconv/lib/iconv_a.lib create mode 100644 vendors/libiconv/iconv.c create mode 100644 vendors/libiconv/include/aliases.h create mode 100644 vendors/libiconv/include/aliases2.h create mode 100644 vendors/libiconv/include/aliases_aix.h create mode 100644 vendors/libiconv/include/aliases_aix_sysaix.h create mode 100644 vendors/libiconv/include/aliases_dos.h create mode 100644 vendors/libiconv/include/aliases_extra.h create mode 100644 vendors/libiconv/include/aliases_osf1.h create mode 100644 vendors/libiconv/include/aliases_osf1_sysosf1.h create mode 100644 vendors/libiconv/include/aliases_sysaix.h create mode 100644 vendors/libiconv/include/aliases_syshpux.h create mode 100644 vendors/libiconv/include/aliases_sysosf1.h create mode 100644 vendors/libiconv/include/aliases_syssolaris.h create mode 100644 vendors/libiconv/include/armscii_8.h create mode 100644 vendors/libiconv/include/ascii.h create mode 100644 vendors/libiconv/include/atarist.h create mode 100644 vendors/libiconv/include/big5.h create mode 100644 vendors/libiconv/include/big5_2003.h create mode 100644 vendors/libiconv/include/big5hkscs1999.h create mode 100644 vendors/libiconv/include/big5hkscs2001.h create mode 100644 vendors/libiconv/include/big5hkscs2004.h create mode 100644 vendors/libiconv/include/big5hkscs2008.h create mode 100644 vendors/libiconv/include/c99.h create mode 100644 vendors/libiconv/include/canonical.h create mode 100644 vendors/libiconv/include/canonical_aix.h create mode 100644 vendors/libiconv/include/canonical_aix_sysaix.h create mode 100644 vendors/libiconv/include/canonical_dos.h create mode 100644 vendors/libiconv/include/canonical_extra.h create mode 100644 vendors/libiconv/include/canonical_local.h create mode 100644 vendors/libiconv/include/canonical_local_sysaix.h create mode 100644 vendors/libiconv/include/canonical_local_syshpux.h create mode 100644 vendors/libiconv/include/canonical_local_sysosf1.h create mode 100644 vendors/libiconv/include/canonical_local_syssolaris.h create mode 100644 vendors/libiconv/include/canonical_osf1.h create mode 100644 vendors/libiconv/include/canonical_osf1_sysosf1.h create mode 100644 vendors/libiconv/include/canonical_sysaix.h create mode 100644 vendors/libiconv/include/canonical_syshpux.h create mode 100644 vendors/libiconv/include/canonical_sysosf1.h create mode 100644 vendors/libiconv/include/canonical_syssolaris.h create mode 100644 vendors/libiconv/include/ces_big5.h create mode 100644 vendors/libiconv/include/ces_gbk.h create mode 100644 vendors/libiconv/include/cjk_variants.h create mode 100644 vendors/libiconv/include/cns11643.h create mode 100644 vendors/libiconv/include/cns11643_1.h create mode 100644 vendors/libiconv/include/cns11643_15.h create mode 100644 vendors/libiconv/include/cns11643_2.h create mode 100644 vendors/libiconv/include/cns11643_3.h create mode 100644 vendors/libiconv/include/cns11643_4.h create mode 100644 vendors/libiconv/include/cns11643_4a.h create mode 100644 vendors/libiconv/include/cns11643_4b.h create mode 100644 vendors/libiconv/include/cns11643_5.h create mode 100644 vendors/libiconv/include/cns11643_6.h create mode 100644 vendors/libiconv/include/cns11643_7.h create mode 100644 vendors/libiconv/include/cns11643_inv.h create mode 100644 vendors/libiconv/include/config.h create mode 100644 vendors/libiconv/include/converters.h create mode 100644 vendors/libiconv/include/cp1046.h create mode 100644 vendors/libiconv/include/cp1124.h create mode 100644 vendors/libiconv/include/cp1125.h create mode 100644 vendors/libiconv/include/cp1129.h create mode 100644 vendors/libiconv/include/cp1131.h create mode 100644 vendors/libiconv/include/cp1133.h create mode 100644 vendors/libiconv/include/cp1161.h create mode 100644 vendors/libiconv/include/cp1162.h create mode 100644 vendors/libiconv/include/cp1163.h create mode 100644 vendors/libiconv/include/cp1250.h create mode 100644 vendors/libiconv/include/cp1251.h create mode 100644 vendors/libiconv/include/cp1252.h create mode 100644 vendors/libiconv/include/cp1253.h create mode 100644 vendors/libiconv/include/cp1254.h create mode 100644 vendors/libiconv/include/cp1255.h create mode 100644 vendors/libiconv/include/cp1256.h create mode 100644 vendors/libiconv/include/cp1257.h create mode 100644 vendors/libiconv/include/cp1258.h create mode 100644 vendors/libiconv/include/cp437.h create mode 100644 vendors/libiconv/include/cp737.h create mode 100644 vendors/libiconv/include/cp775.h create mode 100644 vendors/libiconv/include/cp850.h create mode 100644 vendors/libiconv/include/cp852.h create mode 100644 vendors/libiconv/include/cp853.h create mode 100644 vendors/libiconv/include/cp855.h create mode 100644 vendors/libiconv/include/cp856.h create mode 100644 vendors/libiconv/include/cp857.h create mode 100644 vendors/libiconv/include/cp858.h create mode 100644 vendors/libiconv/include/cp860.h create mode 100644 vendors/libiconv/include/cp861.h create mode 100644 vendors/libiconv/include/cp862.h create mode 100644 vendors/libiconv/include/cp863.h create mode 100644 vendors/libiconv/include/cp864.h create mode 100644 vendors/libiconv/include/cp865.h create mode 100644 vendors/libiconv/include/cp866.h create mode 100644 vendors/libiconv/include/cp869.h create mode 100644 vendors/libiconv/include/cp874.h create mode 100644 vendors/libiconv/include/cp922.h create mode 100644 vendors/libiconv/include/cp932.h create mode 100644 vendors/libiconv/include/cp932ext.h create mode 100644 vendors/libiconv/include/cp936.h create mode 100644 vendors/libiconv/include/cp936ext.h create mode 100644 vendors/libiconv/include/cp943.h create mode 100644 vendors/libiconv/include/cp949.h create mode 100644 vendors/libiconv/include/cp950.h create mode 100644 vendors/libiconv/include/cp950ext.h create mode 100644 vendors/libiconv/include/dec_hanyu.h create mode 100644 vendors/libiconv/include/dec_kanji.h create mode 100644 vendors/libiconv/include/encodings.def create mode 100644 vendors/libiconv/include/encodings_aix.def create mode 100644 vendors/libiconv/include/encodings_dos.def create mode 100644 vendors/libiconv/include/encodings_extra.def create mode 100644 vendors/libiconv/include/encodings_local.def create mode 100644 vendors/libiconv/include/encodings_osf1.def create mode 100644 vendors/libiconv/include/euc_cn.h create mode 100644 vendors/libiconv/include/euc_jisx0213.h create mode 100644 vendors/libiconv/include/euc_jp.h create mode 100644 vendors/libiconv/include/euc_kr.h create mode 100644 vendors/libiconv/include/euc_tw.h create mode 100644 vendors/libiconv/include/flags.h create mode 100644 vendors/libiconv/include/flushwc.h create mode 100644 vendors/libiconv/include/gb12345.h create mode 100644 vendors/libiconv/include/gb12345ext.h create mode 100644 vendors/libiconv/include/gb18030.h create mode 100644 vendors/libiconv/include/gb18030ext.h create mode 100644 vendors/libiconv/include/gb18030uni.h create mode 100644 vendors/libiconv/include/gb2312.h create mode 100644 vendors/libiconv/include/gbk.h create mode 100644 vendors/libiconv/include/gbkext1.h create mode 100644 vendors/libiconv/include/gbkext2.h create mode 100644 vendors/libiconv/include/gbkext_inv.h create mode 100644 vendors/libiconv/include/georgian_academy.h create mode 100644 vendors/libiconv/include/georgian_ps.h create mode 100644 vendors/libiconv/include/hkscs1999.h create mode 100644 vendors/libiconv/include/hkscs2001.h create mode 100644 vendors/libiconv/include/hkscs2004.h create mode 100644 vendors/libiconv/include/hkscs2008.h create mode 100644 vendors/libiconv/include/hp_roman8.h create mode 100644 vendors/libiconv/include/hz.h create mode 100644 vendors/libiconv/include/iconv.h create mode 100644 vendors/libiconv/include/iconv_open1.h create mode 100644 vendors/libiconv/include/iconv_open2.h create mode 100644 vendors/libiconv/include/iso2022_cn.h create mode 100644 vendors/libiconv/include/iso2022_cnext.h create mode 100644 vendors/libiconv/include/iso2022_jp.h create mode 100644 vendors/libiconv/include/iso2022_jp1.h create mode 100644 vendors/libiconv/include/iso2022_jp2.h create mode 100644 vendors/libiconv/include/iso2022_jp3.h create mode 100644 vendors/libiconv/include/iso2022_kr.h create mode 100644 vendors/libiconv/include/iso646_cn.h create mode 100644 vendors/libiconv/include/iso646_jp.h create mode 100644 vendors/libiconv/include/iso8859_1.h create mode 100644 vendors/libiconv/include/iso8859_10.h create mode 100644 vendors/libiconv/include/iso8859_11.h create mode 100644 vendors/libiconv/include/iso8859_13.h create mode 100644 vendors/libiconv/include/iso8859_14.h create mode 100644 vendors/libiconv/include/iso8859_15.h create mode 100644 vendors/libiconv/include/iso8859_16.h create mode 100644 vendors/libiconv/include/iso8859_2.h create mode 100644 vendors/libiconv/include/iso8859_3.h create mode 100644 vendors/libiconv/include/iso8859_4.h create mode 100644 vendors/libiconv/include/iso8859_5.h create mode 100644 vendors/libiconv/include/iso8859_6.h create mode 100644 vendors/libiconv/include/iso8859_7.h create mode 100644 vendors/libiconv/include/iso8859_8.h create mode 100644 vendors/libiconv/include/iso8859_9.h create mode 100644 vendors/libiconv/include/isoir165.h create mode 100644 vendors/libiconv/include/isoir165ext.h create mode 100644 vendors/libiconv/include/java.h create mode 100644 vendors/libiconv/include/jisx0201.h create mode 100644 vendors/libiconv/include/jisx0208.h create mode 100644 vendors/libiconv/include/jisx0212.h create mode 100644 vendors/libiconv/include/jisx0213.h create mode 100644 vendors/libiconv/include/johab.h create mode 100644 vendors/libiconv/include/johab_hangul.h create mode 100644 vendors/libiconv/include/koi8_r.h create mode 100644 vendors/libiconv/include/koi8_ru.h create mode 100644 vendors/libiconv/include/koi8_t.h create mode 100644 vendors/libiconv/include/koi8_u.h create mode 100644 vendors/libiconv/include/ksc5601.h create mode 100644 vendors/libiconv/include/loop_unicode.h create mode 100644 vendors/libiconv/include/loop_wchar.h create mode 100644 vendors/libiconv/include/loops.h create mode 100644 vendors/libiconv/include/mac_arabic.h create mode 100644 vendors/libiconv/include/mac_centraleurope.h create mode 100644 vendors/libiconv/include/mac_croatian.h create mode 100644 vendors/libiconv/include/mac_cyrillic.h create mode 100644 vendors/libiconv/include/mac_greek.h create mode 100644 vendors/libiconv/include/mac_hebrew.h create mode 100644 vendors/libiconv/include/mac_iceland.h create mode 100644 vendors/libiconv/include/mac_roman.h create mode 100644 vendors/libiconv/include/mac_romania.h create mode 100644 vendors/libiconv/include/mac_thai.h create mode 100644 vendors/libiconv/include/mac_turkish.h create mode 100644 vendors/libiconv/include/mac_ukraine.h create mode 100644 vendors/libiconv/include/mulelao.h create mode 100644 vendors/libiconv/include/nextstep.h create mode 100644 vendors/libiconv/include/pt154.h create mode 100644 vendors/libiconv/include/relocatable.h create mode 100644 vendors/libiconv/include/riscos1.h create mode 100644 vendors/libiconv/include/rk1048.h create mode 100644 vendors/libiconv/include/shift_jisx0213.h create mode 100644 vendors/libiconv/include/sjis.h create mode 100644 vendors/libiconv/include/tcvn.h create mode 100644 vendors/libiconv/include/tds565.h create mode 100644 vendors/libiconv/include/tis620.h create mode 100644 vendors/libiconv/include/translit.def create mode 100644 vendors/libiconv/include/translit.h create mode 100644 vendors/libiconv/include/ucs2.h create mode 100644 vendors/libiconv/include/ucs2be.h create mode 100644 vendors/libiconv/include/ucs2internal.h create mode 100644 vendors/libiconv/include/ucs2le.h create mode 100644 vendors/libiconv/include/ucs2swapped.h create mode 100644 vendors/libiconv/include/ucs4.h create mode 100644 vendors/libiconv/include/ucs4be.h create mode 100644 vendors/libiconv/include/ucs4internal.h create mode 100644 vendors/libiconv/include/ucs4le.h create mode 100644 vendors/libiconv/include/ucs4swapped.h create mode 100644 vendors/libiconv/include/uhc_1.h create mode 100644 vendors/libiconv/include/uhc_2.h create mode 100644 vendors/libiconv/include/utf16.h create mode 100644 vendors/libiconv/include/utf16be.h create mode 100644 vendors/libiconv/include/utf16le.h create mode 100644 vendors/libiconv/include/utf32.h create mode 100644 vendors/libiconv/include/utf32be.h create mode 100644 vendors/libiconv/include/utf32le.h create mode 100644 vendors/libiconv/include/utf7.h create mode 100644 vendors/libiconv/include/utf8.h create mode 100644 vendors/libiconv/include/vietcomb.h create mode 100644 vendors/libiconv/include/viscii.h create mode 100644 vendors/libiconv/libiconv.rc create mode 100644 vendors/libiconv/libiconv.vcxproj create mode 100644 vendors/libiconv/libiconv.vcxproj.filters create mode 100644 vendors/libiconv/localcharset.c create mode 100644 vendors/libiconv/localcharset.h create mode 100644 vendors/libiconv/relocatable.c create mode 100644 vendors/libiconv/relocatable.h create mode 100644 vendors/libxml/config.h create mode 100644 vendors/libxml/include/libxml.h create mode 100644 vendors/libxml/libxml2-focus.vcxproj create mode 100644 vendors/libxml/libxml2.sln create mode 100644 vendors/libxml/libxml2.vcxproj create mode 100644 vendors/libxml/libxml2.vcxproj.filters create mode 100644 vendors/libxml/src/DOCBparser.c create mode 100644 vendors/libxml/src/HTMLparser.c create mode 100644 vendors/libxml/src/HTMLtree.c create mode 100644 vendors/libxml/src/SAX.c create mode 100644 vendors/libxml/src/SAX2.c create mode 100644 vendors/libxml/src/buf.c create mode 100644 vendors/libxml/src/buf.h create mode 100644 vendors/libxml/src/c14n.c create mode 100644 vendors/libxml/src/catalog.c create mode 100644 vendors/libxml/src/chvalid.c create mode 100644 vendors/libxml/src/debugXML.c create mode 100644 vendors/libxml/src/dict.c create mode 100644 vendors/libxml/src/elfgcchack.h create mode 100644 vendors/libxml/src/enc.h create mode 100644 vendors/libxml/src/encoding.c create mode 100644 vendors/libxml/src/entities.c create mode 100644 vendors/libxml/src/error.c create mode 100644 vendors/libxml/src/globals.c create mode 100644 vendors/libxml/src/hash.c create mode 100644 vendors/libxml/src/legacy.c create mode 100644 vendors/libxml/src/libxml.h rename vendors/{libxml2/include => libxml/src}/libxml/DOCBparser.h (88%) rename vendors/{libxml2/include => libxml/src}/libxml/HTMLparser.h (91%) rename vendors/{libxml2/include => libxml/src}/libxml/HTMLtree.h (86%) rename vendors/{libxml2/include => libxml/src}/libxml/SAX.h (78%) rename vendors/{libxml2/include => libxml/src}/libxml/SAX2.h (82%) rename vendors/{libxml2/include => libxml/src}/libxml/c14n.h (99%) rename vendors/{libxml2/include => libxml/src}/libxml/catalog.h (80%) rename vendors/{libxml2/include => libxml/src}/libxml/chvalid.h (100%) rename vendors/{libxml2/include => libxml/src}/libxml/debugXML.h (88%) rename vendors/{libxml2/include => libxml/src}/libxml/dict.h (77%) rename vendors/{libxml2/include => libxml/src}/libxml/encoding.h (94%) rename vendors/{libxml2/include => libxml/src}/libxml/entities.h (98%) rename vendors/{libxml2/include => libxml/src}/libxml/globals.h (100%) rename vendors/{libxml2/include => libxml/src}/libxml/hash.h (90%) rename vendors/{libxml2/include => libxml/src}/libxml/list.h (79%) rename vendors/{libxml2/include => libxml/src}/libxml/nanoftp.h (99%) rename vendors/{libxml2/include => libxml/src}/libxml/nanohttp.h (85%) rename vendors/{libxml2/include => libxml/src}/libxml/parser.h (94%) rename vendors/{libxml2/include => libxml/src}/libxml/parserInternals.h (82%) rename vendors/{libxml2/include => libxml/src}/libxml/pattern.h (100%) rename vendors/{libxml2/include => libxml/src}/libxml/relaxng.h (100%) rename vendors/{libxml2/include => libxml/src}/libxml/schemasInternals.h (99%) rename vendors/{libxml2/include => libxml/src}/libxml/schematron.h (92%) rename vendors/{libxml2/include => libxml/src}/libxml/threads.h (100%) rename vendors/{libxml2/include => libxml/src}/libxml/tree.h (85%) rename vendors/{libxml2/include => libxml/src}/libxml/uri.h (100%) rename vendors/{libxml2/include => libxml/src}/libxml/valid.h (84%) rename vendors/{libxml2/include => libxml/src}/libxml/xinclude.h (100%) rename vendors/{libxml2/include => libxml/src}/libxml/xlink.h (96%) rename vendors/{libxml2/include => libxml/src}/libxml/xmlIO.h (80%) rename vendors/{libxml2/include => libxml/src}/libxml/xmlautomata.h (81%) rename vendors/{libxml2/include => libxml/src}/libxml/xmlerror.h (99%) rename vendors/{libxml2/include => libxml/src}/libxml/xmlexports.h (98%) rename vendors/{libxml2/include => libxml/src}/libxml/xmlmemory.h (100%) rename vendors/{libxml2/include => libxml/src}/libxml/xmlmodule.h (99%) rename vendors/{libxml2/include => libxml/src}/libxml/xmlreader.h (91%) rename vendors/{libxml2/include => libxml/src}/libxml/xmlregexp.h (100%) rename vendors/{libxml2/include => libxml/src}/libxml/xmlsave.h (100%) rename vendors/{libxml2/include => libxml/src}/libxml/xmlschemas.h (84%) rename vendors/{libxml2/include => libxml/src}/libxml/xmlschemastypes.h (85%) rename vendors/{libxml2/include => libxml/src}/libxml/xmlstring.h (98%) rename vendors/{libxml2/include => libxml/src}/libxml/xmlunicode.h (100%) rename vendors/{libxml2/include => libxml/src}/libxml/xmlversion.h (91%) create mode 100644 vendors/libxml/src/libxml/xmlversion.h.in rename vendors/{libxml2/include => libxml/src}/libxml/xmlwriter.h (99%) rename vendors/{libxml2/include => libxml/src}/libxml/xpath.h (90%) rename vendors/{libxml2/include => libxml/src}/libxml/xpathInternals.h (86%) rename vendors/{libxml2/include => libxml/src}/libxml/xpointer.h (76%) create mode 100644 vendors/libxml/src/list.c create mode 100644 vendors/libxml/src/nanoftp.c create mode 100644 vendors/libxml/src/nanohttp.c create mode 100644 vendors/libxml/src/parser.c create mode 100644 vendors/libxml/src/parserInternals.c create mode 100644 vendors/libxml/src/pattern.c create mode 100644 vendors/libxml/src/relaxng.c create mode 100644 vendors/libxml/src/save.h create mode 100644 vendors/libxml/src/schematron.c create mode 100644 vendors/libxml/src/threads.c create mode 100644 vendors/libxml/src/timsort.h create mode 100644 vendors/libxml/src/tree.c create mode 100644 vendors/libxml/src/trio.c create mode 100644 vendors/libxml/src/trio.h create mode 100644 vendors/libxml/src/triodef.h create mode 100644 vendors/libxml/src/trionan.c create mode 100644 vendors/libxml/src/trionan.h create mode 100644 vendors/libxml/src/triop.h create mode 100644 vendors/libxml/src/triostr.c create mode 100644 vendors/libxml/src/triostr.h create mode 100644 vendors/libxml/src/uri.c create mode 100644 vendors/libxml/src/valid.c create mode 100644 vendors/libxml/src/win32config.h create mode 100644 vendors/libxml/src/wsockcompat.h create mode 100644 vendors/libxml/src/xinclude.c create mode 100644 vendors/libxml/src/xlink.c create mode 100644 vendors/libxml/src/xmlIO.c create mode 100644 vendors/libxml/src/xmlcatalog.c create mode 100644 vendors/libxml/src/xmllint.c create mode 100644 vendors/libxml/src/xmlmemory.c create mode 100644 vendors/libxml/src/xmlmodule.c create mode 100644 vendors/libxml/src/xmlreader.c create mode 100644 vendors/libxml/src/xmlregexp.c create mode 100644 vendors/libxml/src/xmlsave.c create mode 100644 vendors/libxml/src/xmlschemas.c create mode 100644 vendors/libxml/src/xmlschemastypes.c create mode 100644 vendors/libxml/src/xmlstring.c create mode 100644 vendors/libxml/src/xmlunicode.c create mode 100644 vendors/libxml/src/xmlwriter.c create mode 100644 vendors/libxml/src/xpath.c create mode 100644 vendors/libxml/src/xpointer.c delete mode 100644 vendors/libxml2/lib/libxml2.lib delete mode 100644 vendors/libxml2/lib/libxml2_a.lib delete mode 100644 vendors/libxml2/lib/libxml2_a_dll.lib delete mode 100644 vendors/libxml2/readme.txt diff --git a/getopt/getopt.vcxproj b/getopt/getopt.vcxproj index fe8b98f..b8ef5b0 100644 --- a/getopt/getopt.vcxproj +++ b/getopt/getopt.vcxproj @@ -55,6 +55,7 @@ Disabled WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) Default + MultiThreadedDebugDLL Windows diff --git a/libcnary/libcnary.vcxproj b/libcnary/libcnary.vcxproj index 399a99c..0842604 100644 --- a/libcnary/libcnary.vcxproj +++ b/libcnary/libcnary.vcxproj @@ -65,6 +65,7 @@ WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) $(ProjectDir)\include;%(AdditionalIncludeDirectories) CompileAsCpp + MultiThreadedDebugDLL Windows diff --git a/libcompat/libcompat.vcxproj b/libcompat/libcompat.vcxproj index c0891aa..a8856a3 100644 --- a/libcompat/libcompat.vcxproj +++ b/libcompat/libcompat.vcxproj @@ -54,6 +54,7 @@ Disabled WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) CompileAsC + MultiThreadedDebugDLL Windows diff --git a/libgen/libgen.vcxproj b/libgen/libgen.vcxproj index ef1f902..c6fd617 100644 --- a/libgen/libgen.vcxproj +++ b/libgen/libgen.vcxproj @@ -53,6 +53,7 @@ Level3 Disabled WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + MultiThreadedDebugDLL Windows diff --git a/libimobiledevice-tools/idevice-app-runner/idevice-app-runner.vcxproj b/libimobiledevice-tools/idevice-app-runner/idevice-app-runner.vcxproj index 2cacd24..3f1754f 100644 --- a/libimobiledevice-tools/idevice-app-runner/idevice-app-runner.vcxproj +++ b/libimobiledevice-tools/idevice-app-runner/idevice-app-runner.vcxproj @@ -54,6 +54,7 @@ Level3 Disabled WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDebugDLL Console diff --git a/libimobiledevice-tools/idevice-debug-client/idevice-debug-client.vcxproj b/libimobiledevice-tools/idevice-debug-client/idevice-debug-client.vcxproj index d564767..0ffb4e2 100644 --- a/libimobiledevice-tools/idevice-debug-client/idevice-debug-client.vcxproj +++ b/libimobiledevice-tools/idevice-debug-client/idevice-debug-client.vcxproj @@ -53,6 +53,7 @@ Level3 Disabled WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDebugDLL Console diff --git a/libimobiledevice-tools/idevicebackup/idevicebackup.vcxproj b/libimobiledevice-tools/idevicebackup/idevicebackup.vcxproj index ab96e0d..c6912a6 100644 --- a/libimobiledevice-tools/idevicebackup/idevicebackup.vcxproj +++ b/libimobiledevice-tools/idevicebackup/idevicebackup.vcxproj @@ -58,6 +58,7 @@ Disabled WIN32;_DEBUG;_CONSOLE;HAVE_OPENSSL;%(PreprocessorDefinitions) $(SolutionDir)\vendors\gnutls\include;$(SolutionDir)\libcompat\;$(SolutionDir)\vendors\openssl\include;%(AdditionalIncludeDirectories) + MultiThreadedDebugDLL Console diff --git a/libimobiledevice-tools/idevicebackup2/idevicebackup2.vcxproj b/libimobiledevice-tools/idevicebackup2/idevicebackup2.vcxproj index 735aace..beeda63 100644 --- a/libimobiledevice-tools/idevicebackup2/idevicebackup2.vcxproj +++ b/libimobiledevice-tools/idevicebackup2/idevicebackup2.vcxproj @@ -53,6 +53,7 @@ Level3 Disabled WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDebugDLL Console diff --git a/libimobiledevice-tools/idevicedebugserverproxy/idevicedebugserverproxy.vcxproj b/libimobiledevice-tools/idevicedebugserverproxy/idevicedebugserverproxy.vcxproj index 1a2c90b..404042d 100644 --- a/libimobiledevice-tools/idevicedebugserverproxy/idevicedebugserverproxy.vcxproj +++ b/libimobiledevice-tools/idevicedebugserverproxy/idevicedebugserverproxy.vcxproj @@ -55,6 +55,7 @@ WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) $(SolutionDir)\vendors\thread;$(SolutionDir)\vendors\socket;%(AdditionalIncludeDirectories) CompileAsCpp + MultiThreadedDebugDLL Console diff --git a/libimobiledevice-tools/ideviceimagemounter/ideviceimagemounter.vcxproj b/libimobiledevice-tools/ideviceimagemounter/ideviceimagemounter.vcxproj index 6c912c8..fe99575 100644 --- a/libimobiledevice-tools/ideviceimagemounter/ideviceimagemounter.vcxproj +++ b/libimobiledevice-tools/ideviceimagemounter/ideviceimagemounter.vcxproj @@ -54,6 +54,7 @@ Level3 Disabled WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDebugDLL Console diff --git a/libimobiledevice-tools/ideviceinfo/ideviceinfo.vcxproj b/libimobiledevice-tools/ideviceinfo/ideviceinfo.vcxproj index f5e87ae..0b10139 100644 --- a/libimobiledevice-tools/ideviceinfo/ideviceinfo.vcxproj +++ b/libimobiledevice-tools/ideviceinfo/ideviceinfo.vcxproj @@ -54,6 +54,7 @@ TurnOffAllWarnings Disabled WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDebugDLL Console diff --git a/libimobiledevice-tools/ideviceinstaller/ideviceinstaller.vcxproj b/libimobiledevice-tools/ideviceinstaller/ideviceinstaller.vcxproj index 6ac48d1..b50701c 100644 --- a/libimobiledevice-tools/ideviceinstaller/ideviceinstaller.vcxproj +++ b/libimobiledevice-tools/ideviceinstaller/ideviceinstaller.vcxproj @@ -56,6 +56,7 @@ WIN32;_DEBUG;_CONSOLE;HAVE_LIBIMOBILEDEVICE_1_1;ZIP_STATIC;%(PreprocessorDefinitions) $(SolutionDir)\libzip;%(AdditionalIncludeDirectories) Default + MultiThreadedDebugDLL Console diff --git a/libimobiledevice-tools/ideviceprovision/ideviceprovision.vcxproj b/libimobiledevice-tools/ideviceprovision/ideviceprovision.vcxproj index b8bdc7b..8c6541a 100644 --- a/libimobiledevice-tools/ideviceprovision/ideviceprovision.vcxproj +++ b/libimobiledevice-tools/ideviceprovision/ideviceprovision.vcxproj @@ -54,6 +54,7 @@ Disabled WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) CompileAsCpp + MultiThreadedDebugDLL Console diff --git a/libimobiledevice-tools/idevicescreenshot/idevicescreenshot.vcxproj b/libimobiledevice-tools/idevicescreenshot/idevicescreenshot.vcxproj index f61cea0..63e00d7 100644 --- a/libimobiledevice-tools/idevicescreenshot/idevicescreenshot.vcxproj +++ b/libimobiledevice-tools/idevicescreenshot/idevicescreenshot.vcxproj @@ -53,6 +53,7 @@ Level3 Disabled WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDebugDLL Console diff --git a/libimobiledevice-tools/libimobiledevice-tools-common.props b/libimobiledevice-tools/libimobiledevice-tools-common.props index be76ada..b3612dc 100644 --- a/libimobiledevice-tools/libimobiledevice-tools-common.props +++ b/libimobiledevice-tools/libimobiledevice-tools-common.props @@ -9,7 +9,7 @@ %(PreprocessorDefinitions) - libimobiledevice.lib;libplist.lib;libusbmuxd.lib;libgcc.a;ws2_32.lib;zlib.lib;libcompat.lib;getopt.lib;libgen.lib;libcnary.lib;iconv.lib;libxml2.lib;libssl.a;libcrypto.a;%(AdditionalDependencies) + libimobiledevice.lib;libplist.lib;libusbmuxd.lib;libgcc.a;ws2_32.lib;zlib.lib;libcompat.lib;getopt.lib;libgen.lib;libcnary.lib;libiconv.lib;libxml2.lib;libssl.a;libcrypto.a;%(AdditionalDependencies) $(SolutionDir)\$(Configuration);$(SolutionDir)\vendors\libgcc\lib;$(SolutionDir)\vendors\zlib\lib;$(SolutionDir)\vendors\openssl\lib;$(SolutionDir)\vendors\libxml2\lib;$(SolutionDir)\vendors\iconv\lib;%(AdditionalLibraryDirectories) diff --git a/libimobiledevice-win32.sln b/libimobiledevice-win32.sln index 4ca0f1c..d703b82 100644 --- a/libimobiledevice-win32.sln +++ b/libimobiledevice-win32.sln @@ -10,6 +10,7 @@ EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libplist", "libplist\libplist.vcxproj", "{C2FC6AFF-553B-4B8F-8158-93D8D50A8C02}" ProjectSection(ProjectDependencies) = postProject {69CDCB06-C62E-45F6-9E2B-4313C228F957} = {69CDCB06-C62E-45F6-9E2B-4313C228F957} + {1D6039F6-5078-416F-A3AF-A36EFC7E6A1C} = {1D6039F6-5078-416F-A3AF-A36EFC7E6A1C} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libusbmuxd", "libusbmuxd\libusbmuxd.vcxproj", "{53034340-F651-4ACB-8FEF-FFE0FF7AA013}" @@ -100,6 +101,10 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "idevicebackup", "libimobile EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "idevicebackup2", "libimobiledevice-tools\idevicebackup2\idevicebackup2.vcxproj", "{98E67352-7104-464C-8774-149B704660A1}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libxml2", "vendors\libxml\libxml2.vcxproj", "{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libiconv", "vendors\libiconv\libiconv.vcxproj", "{0788DB65-CD86-4A0D-A245-F29C0114373B}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -330,6 +335,26 @@ Global {98E67352-7104-464C-8774-149B704660A1}.Release|Mixed Platforms.Build.0 = Release|Win32 {98E67352-7104-464C-8774-149B704660A1}.Release|Win32.ActiveCfg = Release|Win32 {98E67352-7104-464C-8774-149B704660A1}.Release|Win32.Build.0 = Release|Win32 + {1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Debug|Win32.ActiveCfg = Debug|Win32 + {1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Debug|Win32.Build.0 = Debug|Win32 + {1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Release|Any CPU.ActiveCfg = Release|Win32 + {1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Release|Mixed Platforms.Build.0 = Release|Win32 + {1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Release|Win32.ActiveCfg = Release|Win32 + {1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Release|Win32.Build.0 = Release|Win32 + {0788DB65-CD86-4A0D-A245-F29C0114373B}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {0788DB65-CD86-4A0D-A245-F29C0114373B}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {0788DB65-CD86-4A0D-A245-F29C0114373B}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {0788DB65-CD86-4A0D-A245-F29C0114373B}.Debug|Win32.ActiveCfg = Debug|Win32 + {0788DB65-CD86-4A0D-A245-F29C0114373B}.Debug|Win32.Build.0 = Debug|Win32 + {0788DB65-CD86-4A0D-A245-F29C0114373B}.Release|Any CPU.ActiveCfg = Release|Win32 + {0788DB65-CD86-4A0D-A245-F29C0114373B}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {0788DB65-CD86-4A0D-A245-F29C0114373B}.Release|Mixed Platforms.Build.0 = Release|Win32 + {0788DB65-CD86-4A0D-A245-F29C0114373B}.Release|Win32.ActiveCfg = Release|Win32 + {0788DB65-CD86-4A0D-A245-F29C0114373B}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/libimobiledevice/libimobiledevice.vcxproj b/libimobiledevice/libimobiledevice.vcxproj index 4c245fd..5f90ebc 100644 --- a/libimobiledevice/libimobiledevice.vcxproj +++ b/libimobiledevice/libimobiledevice.vcxproj @@ -120,6 +120,7 @@ WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions);ASN1_STATIC;plist_STATIC;HAVE_OPENSSL;__LITTLE_ENDIAN__ $(ProjectDir)\include;$(SolutionDir)\libplist\include;$(SolutionDir)\vendors\include;$(SolutionDir)\getopt;$(SolutionDir)\libgen;$(SolutionDir)\libusbmuxd;$(SolutionDir)\libcompat;$(SolutionDir)\vendors\openssl\include;%(AdditionalIncludeDirectories) CompileAsCpp + MultiThreadedDebugDLL Windows diff --git a/libplist/libplist.vcxproj b/libplist/libplist.vcxproj index 0b0d36b..693d31e 100644 --- a/libplist/libplist.vcxproj +++ b/libplist/libplist.vcxproj @@ -88,8 +88,9 @@ Level3 Disabled WIN32;_DEBUG;_LIB;__STDC_FORMAT_MACROS;%(PreprocessorDefinitions);plist_STATIC - $(SolutionDir)\vendors\iconv\include;$(SolutionDir)\vendors\libxml2\include;$(SolutionDir)\libcnary\include;$(ProjectDir)\include;$(SolutionDir)\vendors\include;%(AdditionalIncludeDirectories) + $(SolutionDir)\vendors\libiconv\include;$(SolutionDir)\vendors\libxml\src;$(SolutionDir)\libcnary\include;$(ProjectDir)\include;$(SolutionDir)\vendors\include;%(AdditionalIncludeDirectories) CompileAsCpp + MultiThreadedDebugDLL Windows diff --git a/libusbmuxd/libusbmuxd.vcxproj b/libusbmuxd/libusbmuxd.vcxproj index d5fd6c0..1de18b6 100644 --- a/libusbmuxd/libusbmuxd.vcxproj +++ b/libusbmuxd/libusbmuxd.vcxproj @@ -61,6 +61,7 @@ WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions);HAVE_PLIST; $(SolutionDir)\vendors\include;$(SolutionDir)\getopt;$(SolutionDir)\libplist\include;%(AdditionalIncludeDirectories) CompileAsCpp + MultiThreadedDebugDLL Windows diff --git a/libzip/libzip.vcxproj b/libzip/libzip.vcxproj index 72392e2..33bac24 100644 --- a/libzip/libzip.vcxproj +++ b/libzip/libzip.vcxproj @@ -133,6 +133,7 @@ WIN32;_DEBUG;_LIB;ZIP_STATIC;__STDC_LIMIT_MACROS;HAVE__SNPRINTF;HAVE__STRICMP;HAVE__STRDUP;%(PreprocessorDefinitions) $(SolutionDir)\vendors\zlib\include;$(SolutionDir)\getopt;$(SolutionDir)\vendors\include;%(AdditionalIncludeDirectories) Default + MultiThreadedDebugDLL Windows diff --git a/vendors/iconv/include/iconv.h b/vendors/iconv/include/iconv.h deleted file mode 100644 index d484fc8..0000000 --- a/vendors/iconv/include/iconv.h +++ /dev/null @@ -1,134 +0,0 @@ -/* 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., 59 Temple Place - - Suite 330, Boston, MA 02111-1307, USA. */ - -/* When installed, this file is called "iconv.h". */ - -#ifndef _LIBICONV_H -#define _LIBICONV_H - -#define _LIBICONV_VERSION 0x0109 /* version number: (major<<8) + minor */ -extern 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. */ -#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 -/* Igor: called upon EILSEQ from glibc, since autogeneration of this header - on Windows didn't do the job. */ -/* #define EILSEQ @EILSEQ@ */ -#define EILSEQ 84 -#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 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 -extern 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 int iconv_close (iconv_t cd); - - -#ifndef LIBICONV_PLUG - -/* Nonstandard extensions. */ - -/* Control of attributes. */ -#define iconvctl libiconvctl -extern int iconvctl (iconv_t cd, int request, void* argument); - -/* 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 */ - -/* Listing of locale independent encodings. */ -#define iconvlist libiconvlist -extern void iconvlist (int (*do_one) (unsigned int namescount, - const char * const * names, - void* data), - void* data); - -/* 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 void libiconv_set_relocation_prefix (const char *orig_prefix, - const char *curr_prefix); - -#endif - - -#ifdef __cplusplus -} -#endif - - -#endif /* _LIBICONV_H */ diff --git a/vendors/iconv/lib/iconv.lib b/vendors/iconv/lib/iconv.lib deleted file mode 100644 index 4a49795e2d4e3e985b18804d6b7bb689f2a97182..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3090 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%0DigVew#13%P*|Q=4GeEtbOySXoTQXyB}b zPJv)Pol+0L47m!{kkqgg24Mu|(Pgk+Rwct=6P#;K%FVC=MqwRngh^tGKtQ*^de{o5 z>2+i;%%Heo4_v`?!4B9C7lS)+08W$J;UHYji@+h+31{eGI1b0)1RRAsiUu(Sd&C(y z4L7lCxDIlLoQ0c6Qf>}z_2CdRy#xtzOA$Q6q?REBgotQcWDK*kQQ~2jBkf#vz#{ZC z%9s^MTMJPfYN;+J#kL_;NDWdarjraJtFX2x6sa5*m4wg{8mA87wHajf2&JeNJ$x!s z-(cVh5Q;F|ViRuDrNkj#Ou|BNWKSy(p|o-kKEg%XkXEDx3AQyNSuzs|Q6nuhqyeEc zpjqHpeK#1IBYgP@42 zO^x8_`g%Q5C6_a)tvUqbQX6bdj=IKX7~xaf=n9?zF*chKD?)E^BR0f=G>alUCsHjF z${Hv&BzsY4c2JykE<_~rA*_}N;zvA42vH#cB#g8Oy?iecM1=GZQ_oEx1b!4TNn%JG zkxNUs7J3$;vQkJAA-7Qlb^J7vL4qQFTPZ8VRZ2wlWx5<9mJxNOI(!lQmFSuff)1yv z(pBq-{2CpeRiSI7*6PZ2^*XYyPDd%4&k%>IYtYek3|%|I(lK=%#S|<_hp^Z>PEm$7 z>6&#pGOZyauI0)ZtvZ1Y6d9>}9Zv_fwdtrdkxr;%QfMq#AfiW`#5xkUoNp9KbW)v6 z#}Mn)0R24Ew34YM z$+-?)9k;Dc&2~t_%tj88Yu8zIHl4SXfO>Q}7NfzXbL$vQPF*d_r}OICbs?Q!S5hC) z1$AnnStO>1b!0A^1Gcu&BD#c5LXPUSN!3F{gfD$y!5#I`iUAg7t#47ao~!^!}Cn=B{J ziK@{Evx&D2tyOR&RlFKBL#ahcs7{KP#wD1fj73JhjevxL(u?LcNik9DQ7XznlTB%v zh-6|mw&)up92P3)H=tE5Of<~VOB+!(>XNmf#UoT(6YAp|imq2dZEI^rIUJs_4NVC- zD6gn@6Gh7=W}GO`erqYx@=X%=hH5|J8hZ)=jUCV?l091*Br~=iZGE{=9P!Z~D?T`u@qf90kY{U_Vr`fhlgT_11%_Z|Oour!J7&U+n3892)?+AU!CY8O7{J_^4|8DA zR)z?}Y#5iLkal2Rtb|cYHrA`KW==bnz>-{KEPtcd@J;fm-USFvvD7NX-vWB+VD);6o?1uKJL$MaH4RTT${2dOo~dV3H8c)|t#8zG^l~!2wMpMZY1VV~E&5hH zPj6&Vxj1IK$Rg$`V#RS@SkBiA^d?rDUZ@xAMS56bVEY<*EQwyGFKv<*J-0%y)B{D? z4e3>SwZ4ojZq?`sENQ(~-@=zdrBqmt=zU_Bq)njHJA`SWN{Z_BMICO`8}vnd%&L=G z^j1BdYSTOPMKIgcAQIQ{g)v?;+e{S*YZ_g8E~TR`EO6>M4XReRKBV{Pn_Dc@u--*4 zqqge2RXGK=Zg2lZM>v?U?Q=(BnSxm=u;;tZvYEu0R0PVcIt z(_;FRKFSTXIfV&5PLeE+mrD$3eThWaW~G+#{jFt&QUlTw*GuZ;GLoUz5a(7KeE%P9 z_W>PM-7k87?&wf>!Fu-*sRpcgSNL?k zMYyKx_4@bY!FZIj7YJY`auh#oD zpe3a9TNMWXlr$}A7a9F#AONO(7JpP>^&6R!@^)5;(MnAz08S{BxoRQ0OT}+#gVa z5Q<+VFsV|06K`IW^+)}k!)d=!m-BZ_8u)pC!9Sp!^iTO&$|?Dbf6i~yPy1*6X-3iS zvCR9U;*qgM|AN0w=rS*X3ve0#vcDCXSJIF+q#cL@pR5b%1PY-C@$*o1O52O{A$D;a zuOAse1`+ePQbk7`%6=IGi89k1g?32GX0i=tP0#qSh>1uQv=J6!9pxZwWC$5XMi2pq z3k*Zsh)TsnrUYZi$Pgb9A_7E&m`21%d`Ki-;z|)2@C<35O2HjcAbnCf!Z8GuYD9ym z5UX|^(IPUv5iuas(tc(8h#nXShK{K-AsNOrH#lZSEQk$}@*RjBaUwdF8>k2`;z4*L zU3%?M2Qx7gV8`@6;41=%i8+CA$HX!}5EL0+5D^TkRVcEI#1Z~Tm=i&kK)`WY5(D1C zu6GPAs>YQ`(2B|dYmr3~BRWPN$q6%vS3ilgO%{+TB#IOf-sm*Y8Oyp^WDWs60z}4c z=Yb`M$PzNfXbFs|TLW!uTA(e^4s=CVpd(;W_XN6uu;>l+2L=N4z+hmG%M36Aa<)at zld}RNqS3KA20LKVq2ru@OwQ6txqP8U$~F(kV$7kyFz^|p0d7Fz?qH1s-1HvRxQe0Y z2gU+kX@{s+)vp!?`t-VC5fB}Al^7@v4}Dso1ePPMkOn$9;{ka<5l{zIfp)b-EEWqn znt(Q-3m5|WfSut8#8f7rJ8S`g&>pY`L_A}_9FVBh0vB)~?m!1`aCAoQ320;!ffl_t z5ElmnA)rF6QZ#@Be87eT0BXa#@pa4WkkiD!OAD;$- zWF{~hSPaYs<^v0XrNDBa1zgmm1qW3|d0VicWUJeQ9l;)XCrifd40Z*(gWY4jz=`w) z`-5@SKyWY^FVceyU`7VUSV6neuhBCc40doR$O-1;ToHF-I4IVR1Ql$DiW?jajs?A1 zn^qu8i21=Fe_S963WI{+l1j<$9#I6PL7|YTl>}u$IS?qypei^hL)l>|_^}q$1*1Zl zLLanfG(m096f_16K}*mav3D57}T>Cg7d*n-ePbjxD=cXI#tua z(zl{5Xh5?ZOw!v>8mbkvqf&7v+JSbVv0x(DgLb1`ytv-X>qUo$MVw9!I>y#9P;l8y z+>Z{T8oo$4fcBw1N}YhGc8t!-nJ5cYqs}3|fg@(4X6B5nWt@Y~bB53nl#6yNN6|5q zhq{I=Ou3?q9~$GM-TZN;R4qW0D!EvUO3=7cEEJ*vsR-2zy!3946rGjHP^G9}OH<2H z1!|Kj^(s_}W_jaij;=#BsFkT7)}jh-fg2guqgIU(HHi$2QDz_AfSOP429^y? z3`aP2bZW?fE{b#tL^L((M1#_#*o}Ho7wSPnlz(CPyRuB!KVbq64 z&~AMcjiHm)1h7C!G=*~XX*8QN2r_6Eb?`?NIkZcfM|si$+CC&SO-NZh6}t#7yHBGr z&J?(?Jc$|wv*;Y!E1ySwEVnSEUPNP(8FT?%LKj9mLIdg!)tuZt)E=URII3mTCtZ-w z%cn<2fGg?=^@j#Ry`jEPcc?Se5;Bb2n4AzZGz{cXQQ4^-8>5G~KqIk2gCRyp&E`v& zM6D`8s7)0RjfD&k&cFVA$~{{lJOJ@c?dl53=J8^fmPCklp$3}7m|c*W_3s! z(uT~Take3344FdKkR>#&vV|7)>2Y_+5weHOB9L7RIYa)CH#8AagnS_+6bLECgQ1{S zKh!;phS=jVaFQVuV(BN93Nc%$8428#*LWbc4r-#!LE^1ZWWpJrJqU9-B zYLrh4TX<@2WGv1Z8gC6N#S+cTXmo5s)*1HeU87xLiLfVZ7SKn#!##Y#h)UcJY*k0t zI6M$$hLgknKv<1)(>flV6;5*KVMcgKJ{ax`cd z!lLjzZvtFKmxh&L4cD%<%lKh=cr+}K3d4N*xK@PcxjXA7Hw^D>2H{C16&Zw(`1Z`co> z#0J8iusCcHX;i+jE8HSB5BKuhg+t;{I1-MA(Qr8I4hO@Da6CM(=^c)RQ{iMd8_tJ$ zV`(79ilD$WA0CrWho{0bz>m#^7s88SEqf`v43>zrMre_?NPDCs(iQ29bVqt3y^(=P zAE;slMlHj3DNB{(>y&BLU?lCNN0^bYjsZLwD`L@cBFn0w2sbhk8IFubn8U4NF-H&? zi|~LL6GixuZm@tx0*ZLDNKn_uS48BIxKJ5U0fiQ3>)7KFO=LoY>a4n9gO00@fQuc# zsCDy95@STmb!bfybHoy{Mr@HDURvvj2&MLjE8>i}BV!^@#0xG3PDHX|A5d(|`d}mw zK_YY+8tD**BH_r0Ap(S392mED)to|L=vE~o7D10X6-h+&Z0ksDETifHPlU6PbVScJ zaO3pYs7vXmPew#ir_v*tjuawOz{V9L9U9xn56)O2rL6pgq zM@7KgNun(hSyT$#9eBYJl?vlbb=0Bn<@NIuV-D$fR1;+|v{7ADA2mdcQT|Ym+Y}9p z%ux-`5~UlhQQx?i-6nSO^XdVWr!-Q%d28Bib%@MdxLns5?3l_5Nl1 z{80lt5Dfz1#~4-X!_iJ*juDAQqp@g#9tYMhs#fw+(QX!#o{VOqdZkQgXLf2PhP^}S zXo5*&=NW})LO&sqsh6V;=3;a{nvZ6I6hwKcp&6-3VPZ^1i_y90RCG3K)Xqem%q7-B zbSY{brp5YV{jpv;JC>*S#(HAyv9{Qmg-)n+LDCuP0BSHNwhfCJUEuO$UOXBbi@BHs z%#qkYY$(Q$4aYdK=_o5U7&EdNF&@x`f*3uvsEq5lF+)rlTM#NZ6GM`ihiMhaWA0It zd_0yJ7suRynRlx-F=0#4q~i;*mbgo`9J345JX%~Z)E1vpFU9P!#hAg+swk>^r?~rB3L>giBF2f@z%IBt`-a8qPQ^508U#Tm&K=byr3ekjH}{~5i4gr zK4F^TjOvR+nz%Nek?P{}icvbsG{-G*u;60M5SJ*8aZ}tAx5b@6X4>P9xRd9Ki>3Bq z3CkN7vI4+nBJoj`FYb@4z^Te$d`Xgu$Kpw5B;KQm#zXNikeg}XI^%IP?vzf(d$fgk z5eUy*JRi@-BOx)Xf~K2V%&&63|6!YN23z&CuO^pR1Rk}Rm`qG1<`VP3 zrA{aEiJ8PgVmQ~uTu%6hmO#S4CE1pwCEJq>en+x1*_9NC9J=mg+qgp6lk83Qj`VT* zlF2c#vOj5L4J7Hw8Qow~A!H<(NmkOtW+yqxA>dR^tdS%)IhrgmyM$v&9w_9BMiyj( zq+{4F6ershq9kKjn4FRHb0omBx&-NAS+Y;#7fo}fwBurVQYp+y-2z2Yog7aJMkU~s zIym*IRwh$p7KT3Q9L|iT$8-i=Qk(1)>o`)wD9bC*01<0S8o&hlf5=kz~{K<)Ai!L`7NcxiD9W-T@g>lk`YBZ8BC^=S4d7Ji%E_;mqdmplheuhN&!P|Zz=Q==(fYAnT1DKvtVFeOS!QvKkEOk5otb#M)8KU1%grz~unNS0Ek=A@`r znNp<&z>_gl>6heHe7Pc})TEf&RF^>_lN<75niNCgO?8Q96-KooB^)b^`2=BQ|A;=N zOC{7|o>^{6nNv=#F=a_vQ}z^1VoOEX&XgnNN_kQfKo;9Y2A)4xV2%^1cq)~e;p9>dQ9k7w$)vKWZo{ywTU(ZvQAD06N)^w}Rp0)x1 zEY>;GX_h1HO?!ZdX38hhzO+A`;v}VN@>#Ki*OwX0g!%oMUU82&L(h3p1jOIMXVZW+WMlLY4t1k9ZzsURvO# zgz}6cGa*!FR2g+9s~hHPGUFLHx5yQZ=`#_&E~CxFCD{?Fh_2%D4H>_{oH1rh8EeLp znHShH_KYKAR9Qv?JZHw0Y17O38Ld|D&IE@%8JgUenPq8&-poV>k=ZnhLr5k7L^_)B zE2OMwCIoVC!Hgjr&Ls8jk!*%7Ph`@-s^>EKOdNRiNk%NwuS#VQfrqQogoYG+o}yno z32b{YBh`+`rhsqn6VGL4Gc%b%%>sWu;~%#&6zYO>ma~|d;P#CzWYWTnuq8{&E(lt) zZCT5ZTpi@m49l6>QK6wD+n(*rE@k2ho7^Gm%SxqP+3sxraBr4A(vuAc=2-NsaCA;Q zE*oPFWCycSS$~$19nOwsx!Ha>Gt0^jWk<52p|LC{%gze3qO3S8$nvv6L63q5n)7EC zCrGlh5=B;-RcCE%Rd!x$&5mbvSxr`()n|=aQ`VfdWi44dQ1gx~R~FT}vIAmwRyOX* z_Of^k2iwl}W+$?~tUrrnoopM+#~o4yvw*_o_bqY<~!HImtETD_2+%lf(VS;>fed@0+KTh6xTS{P2@ zBHzWP2V?X0d`cdj!R0v9$= z0gd6(_vQvNJ-LBgU#>ql2o!%x&j5~JEgDlT38U;$U79(<_l$6I>|AkdD96fmjg98| z6L#~Aa3t5R&ntQvsAz~cJT79S^-0}WPA*^I@pAl}Rw&42^xT{%C&`I(;740dmYWv` zneyC-R*_TYdJGJYDyPnk=kz&EPMg!^3^|!-Mk^N?b43-{h@z;~nsb(%HRoX2b1tDH z*Ea0Td2{ZZCs$;-auYdUPDS_UkX%R*$SFA?P#y^8@=5P_I2Xx9bFo}Jm&m!<$y_Q& zQ)Y5w%zQ4FYh#Fql;fka)=`8T<$Hz2Tp=gX#n@(*SFtG6>pjEMxv88+)2A>pW^$7` zlRBZB&CTT&atVotz1;%w$ff-RIIdhf_$ZYj5%Ysu5{t@#;sTfQAMl{@p@`L29V zep024bPJiB-h5xa&pb9^Q7zEN=#yh~&9b0B@7E6Gy*dd)JT{omFzIhrmwEK`@)fWpFf-kCS#jd@evoVVsJc^BW7cjQ?ddwxO88gb=y5_i5| z;mIR;Uw$I*&wD|aA&?K{r9&tvHAM0;P>GJ`lleq`k(Y)v_e~0|m~+ zU|}}I=CrVwql^N*(5___*r4jb0jKtc3JaWe!*GFH0H-zzz2hT)wI28dK|xr^X!^(I zM+e2Cg0vtm$O`!pNkI-85K2&i=ot%1v;}oRRTwY$hm8e8L0@3e-35EWQLq$T1zRD= z(i)rvYr$MF6}$z1!B?0lsMVfAk&YCCg)B=~7-obDXdzJOm*zBXeYg-QL<_M(yf7w9 z6oysVLb8x5Ff=l)QIRX;3j#%^kS_Ev=L)lhDaLeRs!%K}unGkxubYW-7Yhr8`NB+L z3A8ENi*3b@Vm|}Wm*OOstECm0n%-h(u@Ceox{BW6{^9^=QS=li!RAK+8N0|SvWm>& zNRd%I(=!|`a*MnoA9O0zhOuH&k{%TnMMZH@Qj`|iBeJ5rILK2Jl|@xiUDOuGi#&s- znAPiw9=*P}tTYr&MRULL1rlP57<1`ITOViQx zGy@GR{HKA%%QPzuEQh2yXil1o=BDXeL@kCEdJD57Ia;1ppcQG8v?|hD~Z_J;ko1ovYH0aOMOmG|nxA~93Ks@O5X)PEpm=u^r2m>vFk6D5O ztaT6yZG=dK3&Gp}--ZBP1a1R{a4|Uk*HZ~y2Hy7{Lxs+4(f4n2QQ6fHE_6M#=A4@$ zdh?mh`1XL^J8y-aCZ5@u{ch+GbY{!q`=Ms&Z{YY}4-R?&s@(Djw4M7j#NGY^w0-+4 z5RULF`1t>IuwdUfBK>V>|G^XB{a{v3g5yaDfj$7o{}?=UW+O{5H-Q86DfIQ}e?UUY znH^;RZT>t>f={1b4W=IqAB+yJoVCG!o(_S(Pl8zoW-FMR;B#m1hBs#)hQF6S1xwnV zg%#HvhWkE!6+ZF7aTo`^3zv&d!eRdx@X*^o!ZULaMvcQ^UO!cd`R0QL%m}g?^9-RC zgZa1%gJt()pp^lPiNnDhJTZp3eOZBl)~Yb^Z3c|$RvSjr?Z#j~MKH(;iaARb!(4u6 z9y7Xs1{0GnVUXL-!`L@$!psY=z=$wcVK$z3Eha$Sg=wbTh?#7;71Ppu2L@Am4+f&& zhj~=A7t^-;aZFJ5G-eNS5Yt@#0;V2w1T(q*bqoggCT88W?_qvhIEAUDev4^4_gBpO zRS-7(U>WvnOci$OoK@J<&28A+XfIYYGKhV;V+e~zh1fTBD(q#=TI@XvGxoVkH+I{j zL99^~!H#T5VTC&2xa&yQdQ;o*%%87C1P$l83{r2yhTyg!^JdjWfMr#Ni<`j=kN5Bj)|M ztFRFq1V?cZG>gNv6>vvZrg0`{4hQXDz?Dl^aQQ78a0ls|aRlf>9OS$Nx1D??4*JJ+ zxE23RI5D&vcMo(cjPK0>?ccg3|4qE#t&JI6`!x<0YV8XLF%IX(z z6#QY_lj~l=QJ`bEcF`L+Bjs&erT8RnlkQVondl1~Y4>-y#@m0zX)lHF`&)4MHDv_+ z`U7M<7NX$ICAD~Hr4Em)Xu=bqRruAoW_%gcidU;T@!l={;O~R@Ep=>sm^g}WZsp^v z*NO40HYFZQ)ZnjFTJX4XJHB1w!FNFu_>Efvct{<>6ATIb4b&|DwpV8H^f#9A=L^oq z<2G!@2hO=1f79}{_zmJ+_$^Q0g1;Ys7yf3)L->Z4NAPF2J&9NKJd5wDdLEA(Ka3ZZ zzl>j1_XZvz9mk6{p1_x5KEPwH_!Qr=_7onWe2tf4zQ;qjAMi5j&*1U@f(Kj3;&H^^ z!4XXEG`^$>SMnrOS~8BQD1nHi5~zt%B7&+)a8zoET+~p~4XrA<|FMpe+48=UUOcnp z)<<|HJD-r3EQ&NGbLUw~ey{eFto{@&`AL&5i9a({^3&IAOU7{PX3V zm%LSi!@N@hL13KkmEbAwmq3?&RHA}DDcRa^sswKSssv~Jwq%9k-Ez5!3*KT$>41yKo2qpJwVE^H+{SJFjTWY7sGAQqwg3NB$YEFip1RuVKH7zxc6 zS_x~boCL}@6NIfx5kl83X~G@PO%Z+*EfLnq)(|WpBC^GO5kV%qlyFdZH35dMA*i71 z2*-ZBg#gdoMR1(jOOPCRjIjEG1BCOEhX`HjmkDL!R|%4%ZxdFRoFx3|Iz@mQz9O`a z{y_Nfp+5;b#>&dD-&B@;zQ3+)L(N%bn6>AWtz1AWgFfsmgYN4s+eH~HThXw~4iLFz zWv__JWEaTG?mov@##Y(NTx&gLaw1YzE(w(xanUl-&P3TkN~TQ2D3lpx(`7i(Y#9X4 zm94B@EED0+EhE5d%KBs*%IJv;%kWK?mhEo7vW$wqy6mMbHo`>AYQ`LAW4 zuyExVVrluIW0mC%TWZR8?P@H~Z8^LA>`m?ExD(yw$DU@Cn{b@+tEIg1r&`42GL^iX zVi_;L45Kd>4Oz;?7<>6+-v`UfZjYCL^J%_(|I%Ff(VN$lOP<n;x0fr|-dp|#_Mvj~fyc^Mg`X+kdh}5F=)qUY&w^enKPY;uyoCH-IhFNM zxgqdn`KtSVEZ+$Iqx{JJ-^+V;!WG;0lvX^mi(HYctE(^$oK^9+^|Xr3`@1V}C4CjF zUxq4hXOC56@RADC4XO$Vr>+>8HdU0Ka#idt1}jQrkqTx*vSN)WQ&D$tvSQQXVnrFc zwqm7wLj~@(%@u8DZK=5S`E3CcAmU3EbllMj+0NH0HbZY!tc#wk*l7N^qH)uy3g3nw zDjGKbTHzYN5D{?+k#b=<@$qY^#6YZxc-95YL}(k0NPyai(3%e7)r4MR1JqC4B4!Xv zMI7R;4|zm9UPL5?6htyZOVp7q#1fT*SbjP{WY$HAdwSBuf%TKb3TTE1HOvv$J%28- znS35G72ix`LKhREx=V>p`!?bh?6t&Z(@tVn)6GO^WjC>{>NeuZhI@z|(g%s=iN}ez zk)I*%tbBpkb=Ohi!msZVA^AxnA@mVZbirrDm4jarW&6J+;yr&6#oE=RQK*GPYUm)9JlRWXh5AX9?M#yK#4xFXHE(!HNcrjs!E7 zNRVQMgu|>QLEmg35lT0apbIV{K{sq6LC_WwruA|XgxN}>)NLb4psPtD%C#iOyn}>b zZXo?&zKsMm-%g^ezner~dp`-PdVqwH>?IMTkCGl(d5Uy0_Z+GD>cb>a^AQqEI7)&z zuaUyPpCCQi_%R80`zg`}%r_)z@JG`5&@Utz^c!jY7KkjvV98z)fxNz)L@s64kXKj@ zWC+(t-oN)8a`WMK@{#>LWcvOA@(MIaCg7RmcG3uWOF54$g7{A73D^gC@yv^E4S+ zH%q2a=E*Ng){y@WpHCjiT}1AA^$K#V@fz|at8XG3AHRcKEx4cjA2@u7 zT-|nr+(meWJWzaxd`H{+WVYrrG7)o%y!zM=WK7S`Wbkv2d=>O3xrzW+9;hm*lvR~i zZm6%SlrJ?^zNv1lRF`yCLZYt9OV1yy)V6af54^#v+$WP(Qq`);%T^gGp@ZhiJjPME zQtPQ)15H#yM1N(XEL;ga6|00)iAszpRoOz%RjT*RR<1P9SFW73TzSX)8!8Eujg>gc zrb;$+QRPYK(n{*OD=M3zD=VSqt16*wS65Og*Hu21yRq^%+@8vf8}6)Zw%%JABtBSK zgWFfRa_Qrhl;-`FYei32mSCQ(6rJ^aC1icE@;vO(%FjN0yRyCIMCHo54=Pz7egW?9 zRONmd_=f%QKPs{1zg2dufhccPmr`It83m4$DO;|prNE+k%7&lMq3GW4q^yCuDdh42 zifK28(gbrUr`Cul(6cg%c%6!}_f8X~??D$OdsC1iK0ijWUX-O^G?SD-)f^>;S)w41 ztfx4dH&b>RFQKq-TPgeZY^VI~p&KdSi7TZVzLoOI)%Q`L=KCr6)`uwvp+_lenxCLt zzw!*oHa$;SIr$Q$?4Dy3)0#Ia49amzm*@nA-19Nz<_o^0JQ)9pLJs~;X_vuOvX@J% z)~{4lS#{M_Q+-WU_nt$mDt)7;s(%BcYVnQHDzQpXr5DSpGOd~_Xsxb_aJ{99__Moe z_{(tB%7yW&j;VZA&E>OIRKh|Plf0%1cW`}`UbVSucV=tVc;D4kxyY`n{T;ij;C**g z5ns8#YNBCZ6$Jh35#b-JYR)}b#ai?Csx^kgRX1agRh_aOucCxbRy92RNtKLtswznR zwu%k?P$ez@rK+sy&#HxnlIojlNYxm)vRbu=S}nrWRm+|^tGZ-ObM^7}d#b-_VpOa8 zhpRgt6js;aq}5KNs#=uMS2I`4)zu6~^@pXtYKVwb6V{^D<&tQ%NR_A_Tgg=;s>$k_ z^B1Z~>(^9wu{TsVVmDWJe{^}ZoVLBX{QMo&x3=%DZt&hwy?f@t>Sx}3q8joYsQwiD zeDxaWP&IVR%hlEw->iOC{9ZNGb+Q_F!$;M~-Y=@ld%vx2hQ6!5{;l7uKPO;nn#hEj zMM-7N{;HZ9!Ugp;)7Z0XS~k#X@Nh>B1a;KxY3Qxlsi4=W4sdGlq|utzW`0epRZ^q6 zR9ORW($rklWv#89@?izfZzowNDsu4+|H7kU8jsDkS%?%~9HQ@iKrs}el8cg%r z8r(G-Ys>?e)JRLV){VUf~1uHjE z>G$7G#lUw`&niAZ-Adg@B_U5xn~6_RMP<)Wo9NF|Mf+c*nr?c9x^@2>)aNfcK|P57 zi2Br(r>Ml6zNNy@cT^nvC+b1y7b*q*jY_g%YM;Bcytb>2ThG;> zo8DVX2|QYR{^^6Y#~*&Bc1QSlZMpY@+KIN$Ya!lOwfEflQ>_d772Nm#dyaISuDu4r z)wSYE>mUrFjsTa}5oDw~+_tJZ(H(Vl&oV5?`W$W({$oprd4o;o7IR|n0ZbzOC_I^Mo~ooK^U z9pQzAy2-+Mbt_vo)SV4&s)PQ0-nh7Kn`oQuP*uN zBXz%h{P(&`L@(AwEU(t>{_4HDb1k3O^?vYu-G>kSUbkZdz8(XW)T`E4)VIRqdW@{9 z9wJoN*R|Bw?`&?W$3d&=ahTQhQ1jXKc&ND^TJET~!aenUb@ci>U{3wIp3(aC6hS@p zLTNo6udILiH*>x8VR!xWkgp!u60C=iP(4!=tB0x+^;=fb_4JBD{Tl5|y%n0T$A}i| zyP6U}_O!!be1Rbj12pz6(EIn3_ zA-qOHQ+X$(@?v&qXGW8uVInOYWT99*MNK}Yq)2Xrr`p- zvElVq?uPH@!wtcvWCM|uYj~!7y5Z%I&TSYsuW#6b+t`3dFK)16FK>{Uw>3C=cQsVk z?QSUSxw8STx~D~BbIe6}HT>EVV;@UJ#h)8A~^!hNqn z^z%mzboJ*AD;vLTSOt9x9^*e}{SOTi=%)rJ^h*P@?e_-U=a@!nuC%eMj@Y<5P}5jr zYHWm%RgG;;&5gG}?TyfXn*G@B#^(G$V*`cJSb&EbJ8u;<;t+9T$pwnW*8Ss+M2xNx zDl;^$5t$qNn;nfiFZ4FD$w6=*|7lu6jc`@8v1%pJ*z{zsQG05(@iM|L$vjx+W@VRg-w}=5w2x>1&%{=)9)+_bzEVeR>C& zyTLpG=B1|7!sFm`|M$}c{darhyn*>UW-s(6<~ZhV=xxkf7~ko2*!9@|`4+pN-Ov;N z?fv}ExA<3Y?}Kgw=Y#KpT3c>{>i&5y{a@YY|L^y2z;48X3@G+C@bzB^=3?ya;Ll6` z$G^rM*gLUzVeiI1kKKYjgnbJ8BK8IBJ=nwlx;&3=Tt^`+#BjCz#<+utQ z5l6;V;{NaM_up@A##wMyoDB!Ig26d)E}R?Z!Fh3Dn+q4yyyd>DpdJp2*3Qc((*!6f(-r~Adf4crL-2(O0E0r$}Y zx5HmTr=YK)ub?B~?Ou2g?uI$=FgywiU>+=kRj>m77Wy9g4*CiD0XhnsU>*D;WP@F> z1NOiZZ~*qhVHkyfg?@p4hkk?7@G&?KC*dNTh2!uW@H_BZ@N4iC{0DRznt|uxWq1*W zAdDWT$LopuYW+ESn!ZinrSH`b=m+(5Jx4Fni}fCe?) zq`y*smHs;Y-TH_1PwS89-_pOWKcPRVe_#Kp{%ifW`tS8W>i^LHsXwiU3>X8}KrmDo zh=yuIt)b3PZ)h|O7#Ie`z%pT7%hOHP{VKgWrG}5{8r^ zW5^q346}wg!@Ob1uxwakSZi2kSZ}z%u*q^D4Vc*gLo;h^C;!wZH(h8GPl8IBs>F`O{GZ}`UWo#A)GABNN5 zL=0@i8B2}jMxv2yq!??A;E9WImGLa&YUA0)R%54ez(_YTjV#c96B)&z-X=FHjG(~= zI%+1+Q?r0ln#*{mjRrPj0X?)RsGX&aInX#8Gp;e7XIy98VBBQ9*m#L?i}5n!<;JbX zD~;C}uQgt8++o~l+-1DMc$@KV<2}ZQjr)v`8TT8XHXbnk-FV1&*m%VFit(874dXk; zePsH|^quK@(+{S9 zm|!!;j5k-CYs|IgI&*`$)!YSoUQ9Cwbh_kbwb^ENn4O@8 zOO>U@(qLI-Im>dk%lVd#mWwTyTee!ZTduS0vfO03&2qctZp(d^zgZrzJY?Bx*=KpovfuKI zwEpJ(lTi&&tuzYO!#PXvBW390^SzD}~pc&Nz%1{g|8Z}IP zR|@{Kp%k|!t!Zn+{wZt%t2Ate;y?S--aaWc}Uxr}eZIeABSuZ3J7Hjc6m; z$hKP0LF%u7SUa;$bVgGLVRuWHVjPR^M| z&LAk*upMWrHbRHop#X&%9jMU+&opElF;Im`J2IdQlLNh&BB;hpfg;QtD8Vc^79Gou zHIDNf7do~&u5xU5TCO#}3CX#}$rS9D5wMI__}nbv)+yyW^nakmDuCtB&K2 zcO4%(K6ZTK_{{O8;~U41j-MPqJN|I|={W7cI&n^dv&?zYL3EOwtDI*$&v7<8JDi=) zekaq(1tl0YXt(J8YP;A#rzHS7EKz3+^i~#~=Q>xMYn8PZ;C$5il=GnTMdxAX5$93oG3RT}x17hFC!Oy*KXZQX z#Jfsd6)vKy+EwGCy2Kk+yINdlS}k3!K^NV{a&cTkF0cgCrEr-+UBm_IB@-^tCUKo< zlO#cPBnx^YXUZaTt}`8x&8`bw7rQQVUE#XQwZnCj>lW9YuDe`!yY6w_?|R6!&-JM5 zN!Qb^1FnOv=Up$lj=GM!-gUj_`oQ&}>l4>kuCHC+y1sM$;QEIPa^u`YH_1(QSG#N6 zXaChA=>*M@9(O+|i^$w^w-QuCv~Hu@=JtU$N7x+&1&$d|(Ku7n*zDfozTADKd%OEu z_x0`_?w#%%+_$*zaNp~`&wao90ry__KKCQ;C)@|z&$n{gL}~_gC&8 z-9Neia6=y0L-5pl*q%nuD$i<9i>KYw51JWbP^!>^YK0wCC}N(BC+k`CEP0ka=X%z7 z)_FE~HhC`gZ1G&`x!kkWbERjG=T^@ho;y8vd+znz=XuDp&-18fzvoHMi=LM}uX$eg zyy1D%^Oom?=WEZmo*z7ac!=J5@7dmSKx3iw+MDxEg4)8ocfq>|>I&z3H+naDFY#XHz0SMCyVHAv_eSq-?`_`uynpjP;N9na z&ijJ*sQ0+{b?;Z+Z@u4nfAGQ+B@?8HYEWLFff7T8`f7a* zzH@xdz5!4pVEQ;dflmW8zZ!UdyUz()0A3*dV?gdFf!#l2^mD!y-)7&%z8icu`EK^@ z@!jUT!*{Rme&1uh$9+%up7kB_z2H0Sd)ar?cg**y?;YQ}zK?ug_%Qwwf2p6~C;J=y zXZctATl}qln!gRG{9YjS2Y|_E`-gzJ=L35$0=ixfl)cVx^jm?4_xKS%>JI_oo&~D? zjA@_s&-<5vSiiu3k^d6^mHun}*ZFVo-{QaBf0O?X|K0w3{P+6z`VaX3?my^%&i{h{ zi2r5(QU5FcWBzyjC;jjHKlOj+|J;Ad|E2#c|JVNS{NMY3^8f1p-Cv57BP65-p(6E2 z1JZ`--kr$A|$Vi zTj0*X-oV3wM+5r->SQ|Vm*!-8#?gSdUH^>e0gAyR8WkCgS(MBMn|II|Zfq)JL&)DT6aLG%-i-H#i zF9~i5?hft=-XDB0_)u_P@bTai!2`j=!B>N?1>XvO9{eu&L-6^b@M>nBc(5>hd=yvpK^m_CrbT@h@dKY>(`WX5o`V4vyJ&eALzJeY@Uq#r!Za=={(np)H|HL)${zL)V0^3+)K)3f&mm z9oiGRBXoc0vC!k8Cqf58&xM{3y%0JSIvhF@dO7rJ==IQtp^rkJg+32`8TuylW9T2D z-$G!SRu~s1gv-L^;mUALm>RANH-=Y*&kmmxZUqLmJ3Iiq>nISd{J$)#8YonA*b1~M z0z_#Nc+sWsn(+GYrtoFqE5h5t*M)b6Zw&7a-xayi)O_4hz_eSoEJP>&#@W2Gvewjs7Lc4cf^?CRLHv0bqnV>icc zjolWzD|TP(k=Qe_gRw)gmtsd^FUMYqy%u{j_D<}0?4#JHvCm^)#7@P&jC~XPHuhue zr`T_?-(!EoO5$bl@;D`46|afc#p{6)WC8a#5+4J;PaanTq2~ZH5B3-NQ~EAflsm&LD)Z;S7W-yGi^-xI$*erNpd_(So%@qO_}{}}%>4kh3OHc^?VO4KHr5~~x^LB@wdcdiN_O9B%Vz?mpGU>lsJ+&mUuPsTH>9=@x+ITPZFmR-z2_Ge3$q=@kaua z#3oCUrOC2nWs;JtO4cV=CC>&Dt_zsAzU1Ivs%xoyi-LHzxNaZ%y8jyfb-M@}A`0HH3?MIEKpGksr9K1sq<48q_(E6NL`iMmbx~z zBXv*ezSQ4RPoS*d%>b2BcsdrK*QlF$gOMQ_#mHI06UFwGvE?t@~ zPm|M?>8f;1x(R5i&U9BgnmVJX7(h(%fRu9l<(LA%Ek)DW^#8-uT|YKk9)7%MxZ7}f zpqe(R#NFN9UF&hzYLX^x(@5L2P16D!I$Vc7ForW2F2nX6He|?f2Ar!MXXpF_{h>c3 zcdq;TyxswC#yjUNdTZXgcg?%uZF)Do*Lkn^-tN82d$;#~?_uwsy^njJ^giQ#*88&e zZ{9b(Z+qYI{-5_f??1htc|Z4l<^9I{AMX*qqkV_K&IkhbLRhd1+Ft^(eVl`RkH{wj z+Z`p??x?|TXMdMt1q&RPZwxGI(!Q*3#nEBezwU4N*Zdp) zZU3JCGXItStNd5{ukqjLzsY~I{|^71{`>ro_#g8>?tjw%y8kWzhyH*1Klgv_|K9%} z|4;rS0>=c74ICFZC2(%w(m)s3p`ZZ*PY93?RwMsiiHN`wM02qEkOtfV4_I~hz)~Xy z_7}5(e4r3m3#9Kp z8;LQnZI}t>gT>%-upZnFwt|-huL#~0yg7Jl@V4MR!Nb7^gAWD&9DFMHbnu1X%fZ)z zuLs`|l*B237~YkRR*~;$UZx4rM~qp@mQ>v=XX>8lhI`n$QiQ8$-8*ZVx>W zdMNZ*=!wwNp_f80hh7c69eOYH@6cDFA3{HdehwWOK016%__**%;ZwqAhJPDAFMNLZ z5ZEJhgB?O2SRx?6;s67-1|+aFV1*@MF`xwd0R8{g0Q(z&@$mlLe_z-i4uTv0$#5n- z6P^vvhx6e=xDu|08{zeEGrSqz3GasY!k2}w2wxe#Dtuk|58)facZBZ>-yOa$e1G_G z_>u6V;U~gRg`W;T8-70gLipwIYvDJ;e-Hm7{C@a@@IS*}g})Ae8~#50L-@z=PvKv} zM?`)TIXZG&I9{oRN{pXk;uh8SzGZkzgbgnTgCs@{vNM7%4?oBh^SPQjcs#wj$e+oycC~ zvdHC;-$ky9TobuAa$V#PksBj7MQ(}Q8o48KcjVs4;mG5WCn8Tr{u+59@@nMu$loGw zMc$6Q8~HHuQRL&uXOXWWKSX|v{3r5DWKQI!Dup?il(EPXf~RQ&PMamYP240MAxHR(VgfO z(cedJkKPkK9DOkQQ1s8yN25J!DXVEXB-$### z9T__+c698x*zvIwV<*Q>i=7$!ZS3sWIkEF&7sf7%T^u_U>x%WndSm^u!5A`zieX~- z7$HWCkz>LbJ;sQ!V(b_vCWwh*nwTMGi@9T-m^bE&`D4LYBsLq%$ChI&vGrIhwi9c| z_F|XCu893E_WRhCv8!TN$F7N87rP;Lf9#>yBe5r9PsN^&JrjE|_FC+n*!!^$W1qx6 zk9`sQCiZ>oKd~d?$Hq^LpBg_iepdYK__^`(;}^s)ig(8Q;)C&__;4H@$HcL5LYxw( z#+h+WoEsO$C2?t77FWi#ab4UTx5jO8d)yg!$4BE6@u_$q9*T$Kk$5VejnBjv;>+=s z_*#5Dz7gM!@5Qf(Umd?Leq;Qm_$~1};t#|hjz1B9F8+M{rTA;{x8iTd--*8)e?R_F z{FC_S@h{?E#lMUH7(XU)Y~qB(DTz}PXCy98bR;?xU5UZOPy(L7Byb5&Z8hZzbPJ{$KLFWkD@sUK56rG8Ewmp&_fNxCZyN%yCr zX;^wNJ(M0!!_$Z~I!#H_()2VV%}YzunzTLbPLHI=(-UcL+Mf=k!|8Z>AzeyW($#b= zy^(IEchi@puS{Q`zA1fk`quOv={wW+r0-4Nm%cy!r}QJ~$J0-yUrfK8ekJ`{`t|hR z(jTTjN`IODD*bi(yY%?#bMnxi51#^XJTCna49vWd4$QHuFN}#mq~Y zS2C|2Q%O0OSA$wZ(jO>}&-)7IrUYtFY?aKCMq1nMKB1_Iv zveYa+%gFMw{H!Fa$f~lstRZX6nzNRyCp(&*$Of{BY$}`1PG@JcbJ_W9K3m8xW|y+d z*_CW9yOC{X+u7ahRoSbv*JW?Z-kH5Cdw2Fv*@v@#&OVZTH2ZY+FWG0ZuVi1#9+CUM z?0ebwvma$Y&VHKxBKvjro9y@5AF{{iPS2f@J3Du7?xNhqxl419TwiV=H<%mFp>o(9 zEyvDra=e^0C(kK!`kXE2$T@SK++@y|^XJ03L@t+`%@uORTsgOrtL4^no4M^=JGYx7 zPm`u8)6{9&G;5kY&6}1@E2mY{rfKuEW!f?Ans!fnrbni|)4}QNbZ&ZjdS-fQdS!Zb zx;kB(-k5Gq?@V7leZ}-u)7MSkFn#;>EW zGcYqW1D`?9U}kVLgc;%td4@VepJC6~XWTO*Gv1ltOmt>;W^tx6voo_hbJfh%Gk=)* z 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 Y_L% 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

Um4oWAbi_%T$rSwtyDFc*2$`ECk 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

  • g@fvY8iTrn z4uc;rJ!HIOJZIpC;o+wY_V6;}*U$^b0^=Fu`w)Fta`@j6c^EVNn(=q&--y1oJJXx# z&y*SSVCFFoF&mi;Oy!B1$>Wn1lmD1ilZ}&IlO2;9EK`;l>&MjBsr{_EtCv`VEa&OX z)0?JUryZv+viR)hGZO3vGvaJ6o5yz9^knAMj1fDE9mbBE-98)6PMD2gx3SN#mu|M) zzQZPR4&6Dv`QROhL*i)NGvMfR_Bm%bC*RxVT=k&lLEOW3P79}%6Z;NSDI@EZ8Xyge*}qu{B9k%jSvNch6j!KbD0z*Fqv!s7Cx zxyO^mH;dQc7mM?Yh;P^74~x$hY1}u@s9Z9a&ZTf6?x$z(pDjQ8_1v0k%hmC;THp{=cw#(OE-+0~ZZO?1+-po4(ma{v& z_pdaq)U8x_cdxXqu-+N^O8Dyg-sDa5W_jFq((kl;9s ze63G+KG}ZG;+y!7e=g=%BWe(Gf%4#$z=puMAO&P$I2lz6)*g$a3c&8;(Wv85l~FZO zhf&AkR^sE(2NG6fwf3CAR%0u%_fmhQ;?l~ov#Gb`JH7_uLUEC}5L`Ge7`K{<$@-g# zQv8?sEt8jh8pqC_&R(~F{(wAQ1}}%V0-IOg@&7GendN=M|HA*o`-26n`1~9B9fWp* zTcJ`(YDp?FsbnuPofrp}1Jj86iP>OXkg1kfl0nous&G{Os4U5w^_Bf4#g`u{ z=a9uJY{=H+;}y>8EU$uw!Wc5{YllCd?ALQPX7fv>uT&zumlA&GD z{o3770(83eaqVm99rPBetbYU1bQq23#(k7*N*3i^(*R|Va*I;mdaw0y>wK#R^<}Fw z)q!eDz18YQooV%=x>Gk(?Wr!*kF7Ub?WmimA=IhX<<=%@Bek9?cE;>X#OibX7y3pW zrX3=~&4yf>MF&hX=`idFp-FYF>&!G7@7zO6q0M$qb>^QdI@du{HGXzJr^lQg*JDWs zKN9s8^&amn>&>AT(A^k*j7x()j5C902d@ocE>4-l7pDi^83X1EgI5P{4PF`icd3l= z=aSd3>#*~%)v)96M~2(*dq(E4^=5Kua&GeHIggX|(CM)ptO&1rBIPbvSX|fzZ-?J4 zY=d7eEHCVa&A8Gx^e?v1ilD=v6YMc_GPJ*TgLskbb|YHsf2rs`+e!h67l7qrEg1*xIVA`a08bk zmj7}QJQNSfL-V4R*{_XXKYy*jljq6u9C!oX&O8sE8?VRPl{dHI#k=V3&AY?%e&_t| z7SI3P1Kxce|9Y_RZQgSp_1h!xYM{VRhcDo7;$QU({Zl;7}mPK@mlCFQtx-X+3{vqMZ!8vSwdW5Y+@zGY|k6{_wuMT zWLg7OJY6PBE=x8`K5IjkdR9TUXAX++7mp;|Q9%>_;mh(cgtuSq3HS345PM4Y5xYyW zi9`+eqh3dokNS|3H1o^HwF<%hABJp4wk5x>+)AD!-y|ZI5JzxEjOoB!> z66!E@q&jjPs_p~SQa@C`R_AWh{U(v_eA9!biql+eSOW-0)3U!>rX44Ry!R) zRXDA9+K(zct#MlR^oo8fRsYOss@@sXGwB`sI@Z!8X}dahcSz7uI@Zws2XXHelxEwo z?V4C(?200o-h1z{SM0q57Ob%s?6F`+MU5iZdskF!sHiAv6cw@8*iDRyiAGIt>wdnO zXXc%6-hbxbSZmhCIdgFjTWkT>c^-#Lpq^RyFo;Tz#A@nxHj3B_Jj&CL|^(CL*RL#?aLf z(-LE!W6c_gwoZEW9eX8UW^BJ+jKa8VIg4%m8PCAFS1YYr!1r z8{k#&68H^x8GLbl6TAjq0iRrd4K_Ct*no(i*f_ayYQtDO_O*&J?)8h;VXxi94c{2O z0mca8+2R*AB{mDh3&r!qm&KRFdraPm$8K>!0=GCIf~H|xC*S{ie_`7aa$x$y6anGg zwt#SLb8Ih~nnAw5XWO=gAR#Eo;cYv}k?jwraLA5n)5k?f%*SO&>PNw^Ymm;5_Pdv$ z{kyDP0{kgd3M&2S2~_G6?2|N9650UQg!X)Lgs#Dl?T105pp5-A=;A&BntG6gkhUsj z6FEdadExLIH~BM<*uQ$$`PKOSMmlmhaO862J~D`KT|~__+73@p5m+_r?oy2XKE&{gV1M^+PJ|XwuPx)ScACqkKG}fbBhm zP|DMnQN&ZsQ^FH_&yDv}-d^4h-dhFF`9k=D_=5S)6S9Y(W zi{GZ&P9UY)u9_rpK`_700{~eu1S=`(LKPGTIjm52r@gR;a7w4E@H1ft;pk2;VF5)q z;fT&`;a|ePfgiVjh3Q}Z2(yWd(CtN@iKO;bid2b+gKjb|F)lO2Ko+VZAOUsAFnAcp z90VmY8K5ChGBb&ZVOm3VBtpPM14ekMeE06MdzlPwN1nh>G985ih<@%=$VSa z#g5J0(yLx*5NlZ25wlpn4Ypc#T((($w(PJh57q!*UJVA{T)n;e9DH&0&Z_+CisAg~ zg5i%Zyld7*_t)>OzXiVoZ-JkzORmeU-`+STes|;1hLO0sv6;B3IOcWU>$2Cy;zi<0 zo3KsQP3g^hCS~Gkn=9gBZ}YcuwzwfYkfV_7E!evw?>!-cW-bu5ZDBK|ZFaLmW^Rz> zZLpc<_HU%l_6p=9r2FH0NbAR;kF1ZqA5+cWL3SXUkim~VA4hlfKB+?0pyi+XKfU~< z1s(i!c+Uum+%w;Eg1SJ>_MD-^d&l>O_tT*nP$Km0{`UU6ebPbQfu)tHm5CMnM5+V$ zu%t8XL$MMJU z%T`ENxCqz_I0?j8I|#T6I11=Lb*zr7HmxzK8L4Zp>#FOnqt#W_S(5DpOB*r;uQZYc zHH5T;G=;Q`!)PT2gU}+6ed@u zHmBcCznKP!iHhCVgU=byA;rw+ti)vWP+~3feGBzsyJD(K!OPE=G0Wl0sAWyC@@hD^ z-4FxL0|`h#F66NueCSbHp${u;??3LanH>f z@r1Y7w`=0B-!^PDZ#8ady?bH`dhfq|)hq~d(aay>1G!}8wY>*9fb2uM%o*lByYss< zyRuLjs2o%qY63NbnnJ-}pY1v9xk2ss-1j{9w&AS3bNd)*G_+(t3HoRM=l<_~M?@Bs z3~hkAIzMISM4$G##4+H<@N?p*=DZXQ;Xax05U0s4jVBzP$x!DdWwYgC_?{L;@O|g| z#&@wakw1yQo1aqMT-{aeA&^z=DKJ}iRq%#ju;5*pJ2G7q9U&Tp)|xDInl{=gKnoB) zK|4tkqlwZ^_FV7b6lv{i>1*!GeVP4ItN*u(8^elm24u@XF<#f*1r;%wAQotRY-%h~ z3oIrk)+ELaHd?w1PF=nSz7LiH8?Vw0w^p;k%4-MUJ@E4ll=#GJYjIogCUFguM)AZ= z;@frcthX6&kDCfWSX;+T&E8#yT!Wl`fA0O&_fZfGBm@!x34_#aE12EdnKb_i`3kwa zqqrlx^JM260dxfBB~0eh|cte+IO6K@r# zh_{Guh!?#rdHZT>am)N&0t5?*gDh;n+Kz`*?L_YQ?i_;tfoz(yL%E<4JMYXtnTPJ4 zfGR@0KaoDwebRvn?(yxxp&rnH{aC2qe&9Y9s)V?EaOvRc!Sw@I#N~r42agYK*#3L}(@eTD_xXJQ}$fK)4pQ0%Qee7U@UlVRdo%s9X@#Y7n?Dcuz1)*uAIfB}wE3LkVOAA~VN9JFHI&dkd81rsX(r z^t$0Ct{jD3Omp%|7eDJBA*&ROU_D;<1-mVH10YyW-prpOJz2AGM z5Hb7e2gT4LsP=){f!=}EK_k@5>fs?U+BHEQSI_N7vYEhTkJ3JKrlxtTsVdnAskQh z6v<_Th$e!Q)~$@6i9dNWx%uhs;djpO0>t+4Z$&v-~&z}9CZk8etB_RLyv;I%rEN$RD|Ms)= zf%8B8EF&QQ_OncZ^M7`<{@KSPf&6Dz%Nlt7f793cr>o@(#0`i$5Dy^#cDKBNGa85w zkpJD`3Iv}0w;op*@Eil=pFURvkpI@{!UE6ZfW!m&r{9GGk_hB~cf3-8XaCvrA_A|| zfn)&rr}LEsBpb*--LG6Ac|h`k6aXm%QUs(JNC}WqAm4y|2lC@E+nD5#Btw!cm>Q#ki!fREXq+vcB#glL{*Z^ihC6wZP{~k{(Yj%J%QVBH!L1p6%y%brD?(HfFS#noC8sW@BzH$XP@W`TBTtrptoTSV zSSdv520#Nkr*cu{=~})@xt^?HyJ4@fq$v~*fj1y3Ejlf$tuENv+d11QqMOj$KE8hK z+@hFQy2ry$gpcNl6zrEg>uwbjW{5F_7$8QmWQpXcRGZY0RFGV>JXO98uoJb)cgZiY zJyDcYlvf;6WGRj--c)i^N&u+i50n)TJyn)eeysdN`6j?99#CmgApxY*DwPJ!3QekB ztDZSv*1cxJXiy-ecJSun5|$ zhEDw9=(lRJO0@O1bFo9)HLiKtdD?{o{cBm5Hn$cx3i@35nec1j7sJnnUx?j^7fag6 zyH{|v;BLW{f}bVuMnvOfihH+fw{y2!H<)o&5-g=EH7ms?EzcGvyCK`iwkgX8kk~15 zZx z4Nc*u2-8M(Gr)*qZfay|Y#MI5YknN=1b+tiggd}p;BN2$cs!y7v59z#*g(8NyhiLI zA}lBtREt)NJ_`fOUVsrcWI14!x5ltqu)^D>*~Qx7?6#kMeD>+tO&2v6OSdt%A-5>+ z6Wr=(7+M2OMfakgb078%_j}=&9R581LdJuF`vpfzPLNjXtD3E7e%-;{ z?P4bx5{wfJXUQ801yRN2@HgERy;Z%=!%KR9^j_&5(*Lc;raxmiZ8&FWXFP8F%6Qdy z$ymWe!=#5j(e#CBylFDPf5)0enpT?P;7Raccqlvw9tIDAN5C=gXm}jF1JQ}_<2XR< zBMu|KAU-4Z5FAKpi=%W=yeR$SJ6);!jN*0<~?IVpDk@SfM~xSYN|JL2@^ z*#loo7dsbQ7i$-D7o^L~+Kk(j+mhR=+lt$qo92;uw`I34K%M3^cdB>1_Y3b7?>KL) zcapa;+6+C29!A5tN6}35GJK6WLVgL(nK#nQ5AU7l@tZ-2QrD&mOtthV~tK_3(hgMU0uOy*tqU;Q-fEmJ2 zuu7OI%nN1%^M=L45?~0J9t;e#f?2~XU`UuP;5e~_!C`JNBbYwmGZ@#L)|>!1npCa# zT5q+QwccrMYHew~&=t}X&=b_-)o0hgrhgQmqg~g(pnnNq$!!^K8yc`*GWIrJGk#<2 zyJl^oXCh)M0C zWVvp+X1T-xvp&lyZT;9<$?hrO@V;vQ5AkvjpsxO~`(U?i_t);H9oH#s`yIQlc0x|V zPJB+hPK(aBT^6_kUHn`wyIpd#a}#jqb(ePsxeL0BxZifq2ijP<-bC*L?;P(eZyWSF zdIS9iy@_5#N1fRQ{N$g|lDBZQYdme>V4Gp=o``V(KlnR$6SrM7o!maiB*V|1T5h4 zv5K)$v6^w}acXhKajZC4ylT8k{ILY#1kr>O3E~MS6L=GjCx|3~6ZjLv56_ZVm_Jjxd>a4QHZSQ2z82rck02rO_fcrEy+NVQa>RK8TLRI>C2X}wN@%ufc9 zg~`XsULs8mwIWw21(fqG)V6|-2pWzSLyMxt(TZqTS|qKIMh2G6wcX9#jPAkif$qj` zvwlXuJVTSwE2hjaXS7PSTn30poyPR{R*SQ zI$;c02W$k^3hRdr!iHfNRW~$OGL*-)PH8^YIqlE%FbhS+US%KztLOcZDT(Z4--$5 zZvcmX&UDFi%5>Fqf_=?&(R9UBz>M4Ml_`%IpIIZE3~z?F!%ra3BcaG+$g@ZZ4LQB6sn)kRy{*Ho zn>pKTTWmG#RPCDSFl(8M}1^3W&gVEX2 z=m*gW7R%9^G1@V9v`-}+hdCGuuHZ-ad!skx^4@$GAr ztCZ_4H(FkR2%x0a)Yg}6eQjbLAmGlhqGRMvIjxG;Nvoz+&`N3DwBhct?uqV=?xF70 z?(y#RZdUhb_v>x}`f&eX|4=`IVa-4?%ou({kz?|bza=H4Y^0i{>!r7(H>IbgZ_8{0 zoV>Tvb<$1JtJ3MR8M5tcsdBI7X4$M1EEEpdf)qa~?kk2WKVCCYF;#h@TBiCy)e2y4 zq5vkIl&Yd?6+p#nR1HvdQk7J#RK2JANcECxxvGciE!BsrO{%w5pQ=7qC977e-cY%+BnpnWNc7Gh4G` zW+<~~W`E3;;0kaGd>lRrpMk%EkHM$lOuz=6iBLd3K$;@&1ItHAqzqCTX^xafK1M1d z?;$T*v~hg3*s<8P_-K)1$z>%BFjEg(@mL+PdSRVt9cBI2S{yZL{fx8MddgavbJjY{ zddXS=)o)9)#o1%+lkGF@2kcYq3+yB9O`Kp(eojxFbe$BO6rGBk{G97u)?7MV&~D-G zE$%Ky+T2^+sqQiE8*35n6n90*5$`r{Z}d?g9v@zxBR-ry0zO0^Ki?qVKwq?PfN!+_ zXa5ra9RE&#g8!<2v44U87k`eUIRAKmfB$rUo&aR!OHy5`OC$kRVkrONu91||_#U?lbtP-LUuF5z9?c%n? z&O~>Boq$fl0JMbcB=4l~q|l_Yq<|#vp_-wbp^%}Lp`HQD2o=!G zU}jEb_GS)d_GGFEUdd_9am}^Qb;=dXo53`nl6|v&?{UiU@zn-oG*A+aJX=y zV58u5fn>3L@%553B^OI3OQuTZN~TKRm-dxT2wf`MEo}v~Bp*vhg(#)e(w)+l(&f_m z()ChC>2_&xb)s-lwFSwVgd*9H5=qZU&ZH<3j$})6C25k?$S|@hS%IufhLe$G6*8zn zqCucRu;EyPNJCFUXG2FrK;!eq9+75|utuN8tj1fn(2ZRpEh6%8yyb058Ks0$OnKS@ zZ_R5hZ*6ETXf124Z_Q~fYAtNt0TxtqpebNKHQ)BJZKh441KI)UXy~AIP&>LhT02@g zraFXaLbM(lowh||0^PeoT0iYA?GrG<-0A+K}1OBu0PwB4!4IZd! z%YK&ImphQ#lS`L(R0vauQb<%tQaF%~Rw!18R>UgCC`Kv1l89COt8A|_e5gmY@K7&+ z>fBWQrutL0`A{d|^yoYE^3X5UF4cQ#4AnmX`F&WGs`^`X`G1Tb1FCn`Zm5l`-cg%S zy{X1h{i}IY>zAgNcBOWecA0h%K$|YtuGWq?eCAlCF1vCyVB4wE)zvfATh#w{xJJKF zze;~yzgB-me?$Mv;WGV7{WZX_x2#Xnf2}{JUk&*7iU99!fT6FUqLH)_%t*;d)(CDC zYMg13ZIZ=)(lpl0$;{Wx%gn5VFUA zz>gpf;GY3brz`Rq(jJLIsvvP3c1S>wg|tK_S{%0Ivg82l1t`l)R%fhE109?zR(Gt< zS)H|dWvzvJZ9QTA(fWetC5e(p zF|6;S3{VeHFw|qznC-Z&o}H1MzMX+xlKp`_%z@wGxWi9-sKZzL?|{8v%bv&Kqdl*~ zZ+k9)CJ%OiIPBU_KC^dna`JKVbqaHGbs}&*b8>KUbV526JO6S1?Y!-><#NXLz00P{ zp37<1K(`wnH$4X3Z+Q&3ha4Gl?{SZGA9sK0jyb||pK_mcUv$6bQRK1Ue%%A)@ql~G zd)Rx*o8is!9`_Cc7!T)sPWT-6Iq7rO=e*BpABfKxpIF~GU%YRUZ=!FqZx(l%udN^3 zQAmJjz=;6PfWQ970we;U0qg++0k8m$0P}z&0jC3;g6)F?gYANAgPCEhu(7a_FiVUd z291fu_+YRYFU-sEci}7HMf`p=k zmkI8Pu8B^GE{UFrZi&l@)k&2}WWJ^(Qc`_VLsC^zb5eiO%OsZ<9xobFH24$n7<>di z7$1dC#uwso_#}J?J`Nv>_r=HH{qbRG;c1w(h%|G;eZqCZRe~Jh2H_sz8bN~~ds&KL zp5d2amGL9&L7l-B0f0#HY53&3Uh+P2?z(Dt+KciZQ-P0)`vQR+5mukBYG8+93Ut>a3^ z&5nDbGaU;Za~-oCZ#t$s#yU1TMmt`0e4t5mLA$_R+q50pN7@1HR@ZGhln$W_1ARpi zx)5EI&ey}=Bh-7P_j0dYzkUBw|8oCI|6Kn<|7`zy|4e@=ql`gglr!=e1&l%liBZJJ zXG9D|4TTRy4t*R(GE+v3SO%v}AGmM$x2G-ixAmNk|$_H06U>Z5qz%w33*>q|*F znVT|>GB;%I%iNWD2Hbf%$;imK%lOEAkv%PUSuH3t5yK!A_~9Q zXbPPQWeSxFc*Ru348^O5ekd9P^x+rEDaza`Tq@J5kJL2OM$|^to&bJQmYRy1y_&I_ zqMEvzshXXdxf)!}NKIEw6EK_Usln7H4jHJS)P~h&4ut~tQXVZnEkP}+cB}S#?HcWF z?RVOp+BEGpZHjh-_LjDrZY|(1tJihZd#2~4x1|4GU)bP-{+9k%{R91X`XUBz^+5)S zhS7#L09ii6m<}vZ>r6-{jb>wJB(r_?4l{~bm07J>w^@^!AmAxJjsPKe5GN6$2noax zA_kd?e8CZkj6$X$!vL1CjRlWo7l*y&eV~u1WranVpu|tAqii^zpkz_Ws3gFrk%vk{ z6`-;2zK%%pO7uJ`_?P+#9?Q_9|>P%xkO(Q;tc(QIn@K2`9q)es! zOkt+{NSRJ4<~U%r2SaQoWfG z<+AOvnX>EU%(C?|w(|F7zsm&6Zt)a%sa)GO3$)brFG&}HhA zj=hfEjt_S}bnJAz>p0ZePD6CTyUe>Tb}7>D(Vx;E(I3*K==bUBbV>RHx-?ymE<+cm zU+g*GBh>S-=R(g}G5g+7fH3v5|9Ahd{vZ9*jB&;QgU;w@Fd5y9myBUX!C=}Deuy|k z7)k{;TSuAPOb4bN6UDS<5=RcPpezUr!E#`^u$sWX*X>!>EH@UCWzH%btr#sCEgh{N zEgG#Js~oEZns(%|mt&-{)-jI>A921J%uK{g$c)}>#yoyLZT`<9WSLXSOD3ExLxv>F zB~MovQkYU0R~QD2@_h<}3fmHeibaYAif<+UaS8oZWK()@h)el`a-MRi$~(39YD;Pm z^%b?ZYRhV$)V9?m)ZeJBsv*_=Bu}dE9tu+z*E*r|ReMMKqxJ{w&)O$-I&}Z0bn3e5 z`RZvJKn+w4P8z5is2N-|NHdHw3Na!Y1sf?C=Nj{w@R|siuuNvnR?Oa-ZJDi^t(wi7 zt((o6?V4?xZJ3=y+(Fz!@F7-;FCxw(?jkNB&H!HILc}nFfJ|CTM`k0lkj@q&mZFyC zfP+EL$^z&{?Q)n|Wuo=~OVDYXPpDngKI#Cqh5CcKY4aAfiTaEBjCyUm3HaH!Y)$Q4 z9OfKkxP}~_aCJH~IgB~b9hw~`9O!HF&kDI}oC>(AohqE#oXVUUoH_tAjDU-?)y!4$NQ+042hF3~gX%#!(&It$DEFxGsPq{1AbYfXP(129 zet7)!X!SUP{^kAGd(Zou_kp(ww+DBPkD#xRZ}(Kc?@Qki-!kr3zEc4c0jC4k0zL&S z1iTA)AFvwmH()wo1>nKH4lq1=EJP?oFhn5a39z;o4dDwp7iJ!|7M6;s!&G59Fk}o4 zL&8*Isxj>t1_l;^ija#?ija*^1gL#h5tb28BNQSmB9Ia7kt>lOBi{ps?4!|q(a)mM z(GJmfcrTqN#r%y0W4Wa49R{;(e zNAi_qp5%m!^cOEKmc9_>f9Z6@geUcP3RfzB>d{o*RJK&kRO!?yJPqH5@5iU7Wv1~9 z6ce%uIY5JvKu9B$5Gn~ILMEYzKqMp+Y6&>PA%SwjM?z6XMn*wKc1Cf=P=;}qYL;1+ zdKMzBV_iDrqfkVc6^S$TPAIj%gu{A+nd`9XPRc|v(wc}TfmIgc>AuxI)2^4Ri>a@X?7 z@)za7I$<=@K_%hBa?<@V)2%0HJ|UF)u9RI}Gyueo0%UURgDqlT+SqDG+RQVnO# zks4@?XboS@iJG%D=W3`x>#nV?g4{%|CRdVc$rSPfk%uDE4ayCw4N?s<4ciSL8nzmE zns}SOHF7k4Y5d-3K+&gIQEVt96eeYqGE9kS!L{VHc!O+O4_ZI9{%!r-`m1%X^-C)m z^rN*Fbd#z~Rix@sHL2cI7*&I+Lp=Z~QGu^ARCTI6RiBziHKdwR3#l3%svZ2Dr#iVi z1v*c3a&$sy$7uFlsIG`Ehb|OdhptU`pc??ac}=<_U61}s)RYbfn)FWeCq0jQ!h0io zqkF^pqx&xm2oGe42@Hr02o697_y<4(-~s3W_uyB?PsT4sBft*n9xNRy87dqq9ui>+ zFaw$X%wT2+6T^&PhB3pLStA)E*&~@F1tSuyg|N`9*3p(x%4pN*@Yu-M*ciuyp|Pw7ArpZUeiI23s}rZEPEOIM1gF`i55$G0 z`DX-X5@&ETaWnBV2{TDECbJJ9MziqQ>iIHY*OEJ53BfI%f~GFvmr|B6QqwX$G8-~$ zGDl@;G6ORGGEK7evV8Kq@;vgK@)HVg6t)z072YXqDv%W$6dM)m6cI{DB@4jXS*xsj zC|V^#B~k^U?xCKb9t2pq0@Q8P`_!G)UDdtRpQ-x*MxB@HCF+|pPU=K;a~*_^na+8g z3p%%TOm*()`094+M(G9X*%`zb=o=Us#2M%sL>uTBI2z;_<{Pycbr`i6l^O@JFPY4m zjG2JUk8%i@9|JZmM>vj~iAn_VT2ySw(keucfKD3%mcjx?EjRKtmZ3E$fnt|?tk%1n8$Pkkd`w)YW z^blgm<*@f*@50`OZHMiIjbR2cd1qM|CT0ZV5#a#v3SA?7BLX6vBI1D-t!IQ=L|_Cs z>PeJjlu$GwIw<;ibZ~TM33&qF8!*K>UOFjfn z7H5W2$0^}7adH50*aD}GGsG$4VsPP!QHghwVaYd>ZzZcH-%p0{=gHkoeVBSL^-ii> zs(k7qejGoCC-E=i7x1(A3H%a%1wVUv zFh+m~Y!iME<_P?9;k29Yu z|8PEgK1Y6Gep!BLesO+ventLf;i01C!nwlrLct=5V&!7h;-KQF;^^W(#ea)!OFT=w zN~}vzB`zgaCCCz+5{HsQ6;~^6S8!DXSDdYAt>CE;sz@pis{mEptbkOAS4dQdR=_H3 zDjrvy7Y?mBQ}L+cPQ|f`k_wl~iR#!Iw;DtZy2h|3qQ>L8U5!i4WAoeP0CF& zO)5=Sn(jBrHYqhdXfkiQ+H|k!QIlfRlcw8E$fmnZmzp}7+nU>(KQ-?*TT>7eQwowY zPnn}EQeIJ(D8ZoomckanHc*>Ln{bQw2x-l^Pquk%Ld{m!$UwxXwK4P6OcNnN#Fq^`uS z>aMyja#u}PM%VjpG~EYSZMf1s=m~V49=#sZ9?c%@9j9=JVlWk6-%fFU|4G$=SIGRQl~H^?&x8Wb3u8yp>Ezu!GX8|oNp zA8H$-4vh_U4vh}A4oNVNGmkM}FbT{&W;QdEnZqQFl#JAju(K|*PP5Lj&a=+2F0(GM zPO|WKvPTiWiIdyO9`1HwX;px-Ur>3FP;OXj_)|rNx(wV}UikY$*ms!`@XR~3m z_Oo`gp0m!g9rNAu6Z6gU)sWWt$$85B!hFko*L?f@)I4pzXPz-{x|qC}wn$t&y2QQ2 zwZyq3v_xD=Tl%fee@I2bnCkEg3f17Fkz04#h)??23mKzerp> zgi>l#2B|Em&!}&xkEpM!FRDM)SWurD1`0DuU#OP%M z?#ph2OoJ4IT7J3#!Jy0Fg+Utdmr##Uml544PNmKmY@%YWZZ2c4Y_4D~#sN21GUtGw z4KhNQAoLL02y?_sWDhc%qYpWZ^t8BWS#KF=6=@Y@g|A>l;({Ertkn7s(n&+D3mgkn~ zR_U4Jnc`XKS?l@UGvBko6Av&5l00KPBRwlTpL;^kmOdySYo9J3G2dUl-+c!H8G%cI zgMn*-wnyELas&+rE(UG{P6YM`z6`WH`Y32Np|G(urPT~ggrNvWUk2ly}e&-icnpZIP34*mna z_0m`Tcl>WWIqf0w81XJqfv811MLa`1PP{|BNrVw4iSk4U@d@z+@e=VIapv;JjJFxD zGj=jIGPW~zGiI`8vnI0!v&OTAvL>?LWUXbX<*4TT%{iJ|ms^|rJkLKbFwZM5ATK13 zFP}G`nctb;o=?l~%J0a3T*O_(StMB`RK!=r5A4UD7J-T$6+J0BRjg6`vDl}?zvOud zy2Q8SUCH~BpXJbsvWkR?R~6|MofWwif|Yp{ivZ!BTG3pQTv1TbQL$9xPw zQ;`T*5Hc!A6MEu3!Y%uy42bP4D$SY=2sRYQNTi`hd=W z?tsR?)xm3nw+3$xJ|Fx5uvS)vUJcC;O%ELm%?(Wron@Y3o@ZWQUSytQRx)dub<8Se zEkHYH8mS*?7`eupWzku+taerltCK}xHL_@|1{Rq`Wp%KoS&OXM(TUNi(e=@_(Yev3 z(dE(k(aF*Mv9&S&@k8UB;}YZSE1{Xr_E-V5W1Xd!}P1d^UF$GaEUJ zdq|i~oQ<80nO&LZUs#^sm|vS;oZp^bn%|s%H@`lQSoC{>T+CiPv6QovyOg!mwA8xP zytKcxw{);{arx5ng=MZ4-j$~-QY$>Nys|Xe-?9+-<>BPST=`!LLW+Wl{EDrL6vZ}0 z9wm8=cnuW|1C2EeS&irF8XDRfaT+jiNy{x954U zpPo;=o_d`{SDbP3arHs_2>2}rUJF_eycl#f=v>f)AoZZ%0HXI~=--fBfNlK=xL7EU zD2;H7iimQJN{V*kU5=TGS&5m5nT<)nYFxl$3D_uX61D=Hh)u?}V0*AsY)M>UT;YYH zxTg5(`0{uXt_9bKtHCwnqJ+9}G+as|ThgHh~>m2;tOISF`I}bh7t+H0Ae1ojHn_IL(C$U5aWpq;@=GR zOrU+7$&tyK`37+Nh-M22@?{HVL$i6aLD^GTLW0M$b#t_HL~>hmqw-?&lJh|Mqxoa` zgs^pDiX9zbI}>OE1nY#+F11#h1jD;7Srp zVoS6ul`0=q`cxWL`c~erbgsNxX;P_Qsa&ZhOa_cmu*!Rta+Ok*ij_K*MwRlF^_5+f z_iMk`Kx_GHf7G0;Jyk1ED_6^1yDSW<)vVnW9_m{oQ(( zdb9dCk-&z4hGUI48_zYKZamf4+|=4s&{Wh^-c;L^*_6>#*p$Ne^>fLJCrq|X5GH6q4(`-|3(`hqqV{4zH z&QSkS=cwz{396XrEOnB)MD^@IcgA*xb~<;)bOv<#cVaukI(<8@&@R(%(O!3PbhCHw zcD?O-*Y&CEQ1{{P3VIctLT{$8iRSkt_C)u@^hEW<_r&%j_ek{K?|syFtM7K-lfL_X z_xhsxBKw~9<@G-sa2aqKa2RkNkR6m8+&IH(9q?o2-wlx2!j;HDK}cll6=Bj`d;m%jo{-!RV*a zucMzw-;KT>WgEXfE;24Xes5e${Pwuq_?>Z+adq(r<9Ekzj6WQIJdPT-9FH5Ho|v6j zoY%Ab%wC4XG;gyLyMfkR!2nHs4YiyAzKi!>@UvNf_a z_zx2`$U1{M4LVGncYyPH$6(n=*O+P?YmPNfFpn~~FvpvxnL8t#5YG_n$WO>emiH`Q zSS48zttJ7-*o4iBjiN2D?Oz)X+atE$9e+6fbo}Nh;wB8p_B-Y$ z;dk8cjNjcL`=H<;@1W2iyP&Wj>mZ*Xw;+cg&mfl|n;=wBL{NPYCdfU=IVe0RF6c_= z?a(`+#4t9@->~M0rih*hTofcaJ32EuBbtKk#lFP$W81M^*gh;1+l}qSmc_Nior_2F zy~Qoz)^R(ySGWz_D(*EdEfJrXnwXfFo}8VWk({5Lo6M0ik=h8@aww@SsU4}!sjaC^ zsb|y9r1hk=r~M_qCVnN36WP)ih`Yo!B9mw=uu9w`z9J42r-}Q-AH*-jZQ?uPI&qX} zE|5l?A|4Qji1Wk&;xh3wkwxq$&JfRM76}~BJd=4c6Owr>vs^$WTO(UF8mZI~^V zdln$&U&-yy#pNB#Kb^mpznT9we>L9=py8v7JON^+Pf>D_AHdDjDb_76DlRNOD8`p$ zmSmNbl@LqPN>WO)O9&;+l`WNZm5{2w%BD(sC07-+sujSMOjlM{N(sNLY^dz19IRwj zc2tg3idMB%N>p`MQY*8BGldV4epQ>-8rE9ZB5I9l)oV3s^=hBhI@f->ZeMF!i>!61 zHLi`VwXM~zHK{kR*Q-~r*QmD;fdQ5rr+Vjlm3r5D!+N)R&3gZa=!WoyGLhA$*G&se zOHDIP?3Cw}5DI6@k(M_AE%Rr~>z2)y<(9uKzO6QG_J9+|qRqC=xy`c8q0O<4yZvap zc)M8pv3B0}%k2W~kamN1<#zsdo_0{XdV4@eK_{-Wurs;SP4o`!Htke5w41N{WcP{g zBi;7&K6)FygHEUS&}npjv4Wn$p7Nfep30uup4Og6y-9tFVu^h*eQ|v$eZ;=JKF*gF z{bhhBBOKs9#SdTyFau!&F$2*9T7$=jP7R$IJ~4cD_|MR>;itoohQ)^;4__RH4Buxy zVBTeVgIAfqnd{8A%_gV5Rwo$H8?orNB z_EFx^!=pT-yQ82no-x5O;W6$p-Z7Ce{xSHt&A9crPNk;%^!Cnt9& z_9ylx4o&V%e4GGJewp|=aeQ(?964n*Wj|#(WjzI-LQR=WJ)3r(wx0Hzww$(^MorsI z?*N5)w%NBcdo!CeS0Jxvre;TH=VvEo^&oSztl8<=+1bytBeOHJ2eZuCLvw8p^%sm5 z%ons43>OR*EEXIV>=v{a79ctc)(dV6dJFIcn?=fE^J32;b+Kvj=F;t@drNngikG^V zs7swoY|DR_6lB|rZl&q}muIOyo>VPb4N15;GF3ldFRmJq}@%EO}~|XG5u-!lXOb~$@B;5SJTg=KTdy?em@-{a5nv6x>CAwrex;B zOohzA?C9+H?9gmX_SM{}+`PP;yo>n<`JeN}iV};GiY^wH71tJ%N~%k$N-9fkRh_9i zS5;J{R`s+>wdzLIg{mu6cdPDKov*rHrBNkWbsAv2rPqEICf0J?$f+%_ovQPz_pkS= z_pU$OAldk*iMRQ0(~)Lj5FhAvGqai1EJWds;9f>Wlv8Jy{D_EucyC<*3;WF*^}Hi-lr`#*;m_N(_i0D>dzj? zA7~zs9yA^dAG|ztZAfZZW>|JuVOV-tepqr?ZCG*m3G*@Y>5-X{hpb1ebE9WRPmfBBo)|qoc6!WjEOb16Ja{}~JaQa69yJ~@9zC8rZZIJ} zi5G`Xo}N54d2SLid1ms;8R<@>BwoNna?xdX4q%H z%v_$cfjpV}IV&*t8<0>~L)hnL9}3NxL-^+|&B@PsE%+~lEv!SL7J?R@KMr1au@JjZ zxqw^1E~G7FEhH@DE<9g|UWi<9TW5HR}5DSRx($zR$i@ath`vQg|@Bg$--q>vYc)pO)*VT&2yTd!@`;(nqh}` zb+YtC48exthE0YCCS>yf#9!nu@_ufK65|RJ{ z(n1mf3895vLJ1IrfF$(ZA(SKnBE5qkLAnT*L_|bHN@(_FZ_DoT-0MH{&b+hdoY`m3 zoPExR^WmBShgs{3YfX5b`}$plj;CCSu7_Q1T(`R^u#U3!v#eP*EHf5^wcC5I_hIip zz76c#92sYrGsGF>jB{>qMmTplw>ayAn>G%F>D>7%>|@xku$N)4!hVN^L~tVlBZ?wI zBT8W8aZ&W*=%JY2xGzaxlTN0bNRg)8OxcotAbnH%w)D;E+tYh9J2Sg7uV!w_ekXV> z_)G9!@Q*+v*Grfy^bvA|9zsW|5ET^7rNM%ByNqYIACfYBOpRYr|`! zKrcLB8(o`O8&?}qTMg!tO8pPDyN$OS#~Y^`?>7!NK4=_k9BayM&TYOum)3l~xv)8- zxd;r^yq4^ib&^ApgOVc>^|sY*YHe%U65CS1mq~y!`?@Qeu54^y-=5Wx(~;7Z*_F{1 z-xbr9-j&c*)fESeP0?MIUF|(>J(qhVJuN*qdT@O@edxZdYZccfuTA!k_fPas^*`)i zcVqR9?KiB|*WTE4L-j_>&4ycjV3Rf8x^%1lR`acaTe#cWx19#v2XS|_?i?8kUw3GT zFm!zA)X@H+gF`w)vqLjOxVu_+33qo6pBcstqlVGL$l;UsQ1_1BL)<%l@7O)$y}FU= zk&2P3^~6!VQQcAU=;=}O(dzX&qm)sDQIk>A(U=F(527B-JrIsv7&|{E9utk_jWvuF zjV&El87EDcOqfmROb{lFCQeT{PZ&&?Pu!Rqp1L~KHg#>PYwG%xd}?ZHWa{RWWJ)?U zICXF8&eY^o$JG6)p{XxZ-BZ(3x29C&NO{0Cd)jY$Y??Sjp0S*V++ zBqE3y;wj=EvI6BBd9&q4%U*hyO^;2t4d3pJgP}v2<4!kcw|Evu>A3ev@3qR`IDd1# zb3Sr@a6WO?2L9%(3S1ee5U6<;c~;}>$+PEz!h$rphj~B4*74Tx1WVO;t9YAvXkJ;w z(%cJkd+>05H*&1IRKOC=Kzc6`mvO@BLVGtTYy1rR!7G~$Hgw-e^la$S(2Bb{ca4WlhAoGQ!?a=gu+}~Ny|R(2k^Yh1ky|6z zMr0#{Bhrzckvk(dN3M_9-)~y)GwMC+Kk7T`H<~mWJDT<&`9b=FtOu=Qm*79W_OZ6H zrm+o zZ{nc*uzaO_fqc3ApQ#^H>*ar@R>)V$|K6}rt|0$4Wh_^cua>WohfLefIL|oD*w56? zJOCN<{>+kDpIQG|HfTA%v)oy)*`e9jv#dGKxr({!xth5J^D6V-=6=mBoBukeFfW-pe+)kNk;vjs~?vTjJV#TroSxKxo z7Q%ZCdu!nKz%7A00yhP24#b>oJo_{V$JOLvd7Tj}m#IdpL^sB(C5$guNnVk>Jb5$) zpH4{EO4m!*Nk5aWmNA_w5RD%)BYwz(}5<9 zrjBO+V}&im%XYA%VJ~r$xJa0ijcxgD+U+wj;y`eHPCgV>w4E{ zm#oX8??eC20k(SEjqDqvxAbMg!SjPzgSms^!R$ecA*-SIb#_DcL#{(Fhu#dGzN>fF zb=YaxahQK^bmYOv#7M%ZXf$;+c{F3RWqrzM^yvA~SL<($4U7$r-5l#5yD@fqOg1JR zyEA6-aOe2J@vY-~#t)3^Xx}M3kC};?<+I_lDYN_Lj?5jL^MfS}-#PZ& zmU*>#)%iX1tLN3{*U#5&^wX}@Ii@Go%R3WCEH*!Eslr5g|Hd9)a%{;Zwn?C7ATAIc zhz%qJ8V8ywhbcz}MFc$#(&kcOztx0i%6kwo4h~^U{H6G&`1Q#XDaPq*GTvmq%6yx- zEN6L+N$vyTL*a~2E_^HW7dNk*D0o{-EV)@;UX?(FdF*V*8?#<>d{_s#E}KRRDL-#`CQ zd(a@1c#fz}nX-wq^LGt%EoWU|t!Fp0F@ZXPq(H*i7eUX1+<8vC$%wVlvoRZzF)7%T z6WOP-SLP6NUkE=4UkP6e&x!-Z9|}$v5sGw+juelSc9t>ftm^1>Hg$Y8rzX!Pw=dT`@zJ&w-^v~S5cJtXS zds+Qp&=6;cJM?9p`Mnn-Z${pZw2xjKm5eq#crmtm!?uSf$4`xCZCE+EdUEOH;>pYn zij&(XRVG(VE}C36c}?Ccm&%*veey>6WqFfaB5#v-$}h>^PlwE$n+ctHGV^Ta!ffHJ za8@+?efGp$^jy?j%Ur}9cAhYAG#^hyS+1e)vYNK3bmY5+Ds5rA1v&MIU81BAdka)5%)85OU_c!GLf=~FOCp<6rQUKtGm~H`*ES9uP+fRax}lf z^20m%XZai0fA}E(F26kcYqo2SId41fFmFG9cYbIdYdLSD&Rok3;f3;^MO=yBmHbcU zRH;(=t@5P0_@??6kz`!5yKVQC){gHzO9r;x{CSHb3zQ`c8Q-1ESN)19+_W>Iq~bMEu3d5`&P^CR<*Yz{0+bhTv%2l9Cpkv8e; zMe@>&x}2umCP~Ml?zh*HhrSOjdAR-Ip@#Y8U$IPsoT|3)5dv!K& z{_6aCN|Nigob5T5xf?`_3v=s)U=~_mR_<2l9UA;G)bqe_+-s6G={e~!xp(@&^uVm< zT-sdfT-L@Nk9Ucp#S_iwn?Hx!9T#(gIJCr?hFm=2xaE&5h^_F>?p#&p6=^USq5 z{`^y$)FJL<&?I^qI~_A0H6O_n)g`FGtJ-ng^sV_tS&c18^FOAY?rBd8>ZG$X%~?a~ z^J(+Ky6a`-^I*?tK#&j=L=%FBU?5nC76b>uLkJLUhz>*-avGus(T5m7&Oi(yMi66& z3B(lgUoH+6zP5%iAr25HhzsOj`{v($F%BdU5(Ei`ghI|i!XP|I4CLRPums5e*;ZH% z{Q1B8VEGUcSKvW`wEKFI%Q)f|RD`=5C=8t^m!GqVN{ zKSO~0cemy=e6I)5hZsQ4Knx-Ocl;W2___ZwY%JmH|6PvFf9;O_|Io7e&)-z3Gh*?A zM8q)SE@GR;c8whxD{)6~PKZT_#Rx^jq6G?4J|YcKs!^sfrMUpTOACr#MQYSF)Ya5RxB$tN z9;JoR3Ta|m zoxlqb$MGlellTeze!>C5PQqS71)+p+kx)j!NNWh?@Cwcqp{=j4zZp!5Si^Y32ZoMP zf~k(F%uH&wkF)@;261pbh#;RLqsban3#ujcvPHASaauX8l2%5mqE*vMXr;6YS`&dtsf-gDqwv|Q}n^u3}3KAiOq+RS|w(h+t)Yz==`(&zkDwW_sC(98Rl^=(9K zLTo^|Bcc&ih^L6>h$jejjoli1H1st3HM%r9HP8#%G}<-pYN$xhX@+UeYtCsdMVq15 zNlnqA=u2o628q$cpfM4cNK6#QA}<_s2h)q`!Cb>!!SrEH>^O-#j`PDs33T`he z^~|MIeG`2;SRD?acO)9xOQ#JV8O|Hd8qOIuLQ}fK$iP(3wA=KSsgJbBwAb{k)Y|MI z=?GW`M@h#>i^vPf3S=F!30a#=ChL+(sT*@M$j|%Rr`kqV8TOj-eZ(Fiezvh3-&y)?w_E)IYHXtbVWaz^OG(M7X z8aK4+<98xF5RHf?#6cLo+oho>-HSM&@ke7qV@hL240WKFO$DPLO;45OD;WPA45j3SI34asr5M~Gu2$O`jgx7?-gdqZ6 zI!O3L=!0kBH{f=*U+;=uC)^cu>Gi@hksduqxTFo%_W`lRRzE;LP~S=4M&DVVqwk>4 z(BB4PONwE#;b+h*Mxg0BWYlFeY;*>04+x58isp(#rgu#TO>diWq>g3|X7*;IW>^xM zgd?Fy%H(h|lguVtkp0P4WP7p;`5ZZvEFecow^BW+fz-3mjrXGlQO{BRslHS38We`c3+E`Yrk}T}tn?l2~hrqcb=~Wx*Hy26uQ%R`KD&H&`dskM^eyterCjWrJAl59HpCcXOfaUH zPKz{53T6pb3A;o34)Y%K2J;=W5c?eS8S@qM0b`*>)7qpksWqW>L;;Nx;Yx4?I5F-# z?kVmuZXP#>dxU#}`+e#K?znUfo{l%go8ZmxM7*)WOYj_C;a}si1RMcF&?2nWUa5`L zUIy=U(Aqo&lJQ1WvLbg^@>b#Zq&>*C_# z;o|7x>=NL@abddbcH8IX>NY0*=%(O4?Iw4da{J`=+il$K8>mJxtW;Jy%h=1(i|R%4 zVtAQ*(Y!3YtiXRDdzpESz!kdGYt-wV_c!S!#A2UCKF55H`WX1y`r1H?r_eXux660h zx5M|hbR6!5CVVI1j`E6cukVy^pYJc}b>EG$OK?ZILH70R7tmTLaC06IIw2WIC8-wj6!I97fYd^yYNo*$<2v+e zv@JRr{SZBbreMr5WK23H1M?BHQ+fcq3A-1&6}uL@1G^o&8M_{)oV>P_j5 z>pjpL)$7o2)9=x5*VkM)r$4PfqrV|^T)!J^zpaLQ4R;!^Fg^(S!e--@#@me-8E-LO zY^-Fw!&t@mknwI~HDfzdcT-zavMJNl-t>d%OViJ$uT0;Y{xJP%dcf?6nYY;?GcPkg zvnjJVvwIPb&7OiYW=5isEJ+q5Dv3mLBwe*wMOGuPA>V*&mYd`e@)dF&xq*C_e4QL7 z9VFMn^<6vpr};PYujb#)cTlyc7-|t!42DB3hz@zwYH9^Fi>kM%0R)FSYB4n%E}VN| z4q}<*3QH5(8JY&ofTjncgFu=D>iCTZie%ZoOkH8jTHj?a>AO}C+2(dQOT)BmE+ z(HApTGuAMcFxD}4GZr!~N=+Cjh7M?idW>SJDdP--z%XW1g5p$RTV-2kTWwowi-v9r z#!lCcV0YE7)2`R9+wLE`ZT4^Ne%ZB2zuPIoUKLC_r+?Of`v?7qTX#a-2X zpYjEkkX6DGvmSUo@_O&}((4smR=@C?^NRD1_kQnvhGO7@_96J3_R;Y%^tJP4`d;?E z=DU{t)K{IY#{MIH>-*gIZ{N?pFMJi)?|eV_E|5(H^ae}@+zglw*d%)uFdxtt&>gTO z==WI#FlH2kIB;(m6x1AaDd=(#G5B<_POvc;YG%PE!CK%xo#pP6MR3n?6S+LD-!gyh zs?YUL&{F@uzU<(lW)qm2EEjJ%A}jNFX;49iSv=HHnMvVLZM z&is=3BI{)q0h)hWf=I!WRf&QqL9}2<5F_9ULIr^WUx7bdK?cDMq?aH|kOX&;a{WKK z)_FJcR_CwHUjr9Ir-k*Zc;TNzI&eAQEYuTf3k`%gVZQ8)&`{VSD=H`~I8u19@Oa^| z!V`t_7am<$S-i1$b@Anr$?|=b)>Ssp%ez|LQC(a+Ei0*wuYY~Kus#tihV=UL^?i-~ zu=keNc(d_FV{c>s+EvZ8*3-}zF@=7JMXOP(ajQuysdXkS3uD?D*&Wp#)18cr?mkW1 zh4V)QAi5A6$UTS-#5aVd22$e}o~~i7!PM|YW+AhYo=A6OAkt$&9umkcWS-_*%`NCn z=#A*jXnQmhy+JBRKSEP6*_abpD)uy17i)mk#Oh$Rv3M*Ri^Upay|qHLLbdiueYF14 zdZzVM>!sFntruF`ai%yEoCPizSBfjceZhUgeaC&p{laa<`{Dz@iDTpa@qXaOdE$TI zzvD@SnT=)yGQosEB;+ZamcE6?+Ewj7?ay!_cU}92cD?o^y_b5A_2%`y>MIzmHu$3d zL4Ui!TYakZlfJsaI)n8F-}E;ceANF8e%u-ZC4+s2dkk$1Z#m{0<{F9(w;TP$A2ixw zS?-#xRSVyXsx)Es7zc#R3NT`_xMW0CB)_} zfzn{bP%snUfSLH#%#-9w@*r_Y&ZM)XP|`;7da^os9r+o#EaNSCL~)k9F-S&)~p`C%<2p7t2~b}1g5D>M5O z_9pfOdmVeCy&-5AXu3^g$}22~zALcBysgajAAW>c)1{cgMS9-9165^Kze)qTSux zG48(ZDEG%wf_pfqbs|-u{q)jQ{^Iq^>$A7A z&oZB-KE6KAKDs_kA3L8?3SX_DS|}_E9#LjbbaxcCvBo9c))Nf&D`HYrtyGhk(BWc5yxi%m%1))^W}S1qby6 z?O4_wv@}>b*ebY`+snPeZR8ek%efrbsw?D*xb0k0C?-@Z6d8&OrG>sf_vzf{b6R1z zFl-nqYzgm`HjPK&k$F@eo!5;x1^;XJ2EoRPZ_kfk?#p-Lv-t2robSv(6mc+u5n&VY zFk&h~9x)v;9$^W+6}w1_NOB}Sk^&uS??@B~de|r&2$aTAI#Fk2hBDU}H@K6O#5Bhk z#hS!&Vp*{^vBcOT@h9R<O!$O57ASuZ=nVtLt zyojI42r%?CQwgcaR5A2ZD$<(LL}|roMQK%O7ojs9J~AmSWb*tSeb&+1lBL*{0bh+4yYq0o`n3cGLl90ZZT{ zxVNfCP$8&;3(QVInV>@;7Q9+@QP3xt%UzbIn5UG7$;0NM@@&D5VCH#%Dd7x$ge-3` zZzyjAbXT_L@5o=Dub#hMxF7DaR4FOK24S*LB+C{i!P|R@YKAaY81tWZ`DsF-kS`1u zjtC=#B4HiegVPF67it&c3QN_9g~o+eg^WUSpg6itV3-uRXTzG!rMDae5 zTn`ilnlyzOaHwbXTc@8Q>nass{Clh zk&2Rv!Vpnzgj;~-&=nh z%$&;lvifc?bDBZYdEPkJIMg@;moBrg+4-?)ce76OW_3byg8JPSOM-1Hqt&_9q16ML zDa=;K);LMLBth~5ZZ8A6MA0sa#8<0K7 zE66Hj4YC^9f_#9iN46t7k(ZFykjm0m$PVNPauoSNb1Qna)ES+MeujRIw!ttk)|fm@ zKE?^_fepaAVfol_EMF^Di>DQ?6`>WW^-k-v);8ES`-%I3`;9v(JtYmr^YDCpEIte$ zg11s&5^M-|1Zx6~;6k7i90-mCTY`y>n@)?)5go1$UWcmVq;p7zprfI4P^Vd^UPlL{ zX?>}-j;;V4PSZ(wOaGdN~oDYcLu`H!A`(tvCbXmG;duz|V35pZnn zz_9f(^fqJ}UNA(1F^C0muy7#;JV7lZM`I^r7Z7oBj0MI_V^3o*&~V(PnZ^#r9Ah^r zj<}z=hq#Zpm*}8)fQTZVG&^CY0ZKI=oa#ukP{sSmk7n+qR8YlYNJ7PQ(m7H#DT@?M z+DzU;-cQ*{kt-hFsz;es+&~GVY@(P_Oekg)GG!wLNm)aoQr1$oQI1e{fG4_|vYoPk zx|^y))dP2I3f!D&>L7K3`hxleG_w2DN$ME&ITdTEZK(qqwzZ|ErM_jVG(}3Y#8_I= z;FnsO6^%i&rlrw7(!SCDrhTFPqWwerK>JN&((~x~^aA>MdM;fo-DI`YY7s~kTdX!% zsaUC6t*}zG3S(3-xF9>9WlS=H86k{hMh1fq*7FP&VHb3O+?&jsh7&R?CcxU{=;y0p1`R_bthr!?u(>eB1d<#N^K zzH~wwE7ku!0Kdmvra09c%AiH z;jQMa?5zaX=^5Uc-f71v)Iqs zf3Zv0IqU>>DSMh7#*Se}fi=xzKVd&&3)p;iFZ(<@9U6#Bm!`5Kpm!6?KFxl{Hs_dd zTseC=$2rG1hdBp0r#MGBCpj3-5sni_El4$Jb&y364K9+Rg7`tapld7V8?1PiRcQsxV}Q38I8c2`7gDiZU)_RA&@t2s18%j@FpL&UDDM$@E?2mgxyiqV-wpvNmLG%-WQ-D{FJsmaLwv zw^=sXlx#+}Wwuo|JzHIH9{NPt0**i^5W!vUw^a`WjDw?sPlC^a=Yn~`Gr=pkQJg|j zR8{g; zSijh$*tGcNMb#3uk~<~6B?BeHB|{}wORkmNEs>UVmgJXam->~4mx@dKR>zkHmhL&q zh1+5O(x}qtQW10mBA_jhP}*F6yh5YmSjDLd!!c1bA)8O8v_6 zs*0+js>ju{)%UAER6nVns~)TFKlZG89Qu`0(7xPUyS;X6?UveYaA~}=mb6w<+XYLq zH)}g;dtgJhwf1uDD$pxm)lbwvsef2M{vQEpy8e0nNd5JCY5i1vc4Km5N@G%^a+6|{ zQq$t5zZ;h~{cQZzq;P5Br5~W2e{EWD=}(i=r7ulCo0eVL+pO2D-|Px~OJ<90%UBBs zaSg$3jc(<&@>}CuqgrEIgQ05~(Hh>GC`pr~NU|gu5?)(q+qt%vSBRaWu6xLo?zHaY z?(}Z89=fIa?X!q}!~kNmhJ%Ke21~L26>H7+x*GOjRwX3RI`nw~S&B^nd0i3UU?q7E_LEY~d4?5o)~voB^p&5B5cBoT=# zEhSZxgrs6p9w~>EOS(Y1NZLu>O5RTPrSPO;kgm^B_>_y3LW+puO<_~`QUhwN^e0$v zAF1D|@zQV9H&g|SuT&+A^A<7-??wIFye)k!&sus|+FCk-mFZ&XWO)FbOeW2dW>2%D zeWop-E7O(Nim}f67GtyEFUAwb9_xDy z-Nn<4YmD2Bn~diS%Ho#{Q|of6qcz`}U|lAqT9d4C)~BpbSnsx$+1|F5+TOCgV=J^T zw!Z+jQmK8ueUJ2m{ZghP^QFB3^Nsyt<|d{(Q-S%~ekF4~^E7icQ{Wi-{Z4S$9B{jEt}{5 z&VmKf))%FXBbS+lZGDzLCL^{*eKZK9R4YTBGu!GQpNI zmX&}sl^s*Cf%4m#W#oZWxjhtAgy;ox|$M(fGujr0#jOE6M z#Cym4#G2@3mClFlW?CM70iC51w3HZmzX ziI-HS5)1C$M-{D|tsPWzhnC2dLi zo3xi{@6*1eeM*zBdeVbHAQXU1fP$j)RP&Dxu_FY8E_ zX4c6pMAoUS{aJ@VFh8DkH7g+7Dcd>QJ$r-Tx}aY$Ah;%I5UA!T!~GH#HUUsMD{_=_ z4uNb=$=Q(;Cp(g}6Yd;0<{)!6C~Je=w;?E1 zHkS7w?_u6Tg0Jey{1f@u{5ZJyHxikOG(}+|A5omh4K(z4k%q`qWFumTI3h36eIZVS z5NV0bL}XC@nnboDn#fh;EwT_jQ?(K?MZO}Wh$XTXxr-UzqUQ_d>`q>%{X!0DYMM8&Xw006U zp+{T-|D~CuW$HK|Gj=e!{7BE>J`Dt+R{+hC~mB8ENR9cxl=QopqJ()vpqF0FzshUJ%bT{>s5uX+0k^JcSV(tjFy#AZsfb2GV_ z+U(iFYI)l79>l>%Egxm&t<|k%&>604ZD_4&&6S8G0!g7nC@GNSOH|e+K_}wjl{Z&D zTzL;YA;tDZ?GEi$odsPNyTn}?-Gc6-?$T~yx2QX}o89Bp^SSqHZ)jgee^&qUfrYnX z5sNe;HIAdSQCcWxls*c9azGtMEtO(WD3lQjiSj`)P*_xz=4Z`=Xfb*LrW4zZZNoNW zzb&Z3)?zELUD$lBJgsk9Yc`tW5DKlh%Qy)Rr_hF5jNgsV#S8Idg&e#9zl0D-2q16> zAp{3qFI^8^Z(Wvdx~{Qqq^?{+UpGV7K$j>b>$>Qobd7ZFbOpLjx{kUeU8b(KZkg`f zCQsev`fBEZ-HBdA2cj?0ljuss znrWF~%odUskrYXn!Ab1|b6P^WL~10pl6pwZq&;K_rJYhoX`(!&bW;AI+@?fG|5j|F z^ib|lx+oo#o0N4Hn=RH`s9RjHNS8)i##p9XdRZn}=76M{Y3WSMq^+Q@qW3Q&SU1Dtx2DPvCacfI!wl&RK)0%8evBqpKvaXW0SXWvHEdFkt zWnC$iSWjDvtY<;8|C@V&slyCl3Yob~H)aSkg6YWQG4q&S%ur?^lfw*S`ZFImK6K1* zN^&Z4N^mN6N^?qdih$h-fs?g!Q`aTu&ryxwuPVDNb3uWpbyupe1m$|r)x>q5>jBq2 zu7_NWT=m^z-BR5K+~w{G9u^)E9w$A_Jxo2Qps<#EM0x0WXn3GJPI(x47<=G6%sfmy zo=KBE&Ug?!Vmv6IalL0fVLfI&Wj$j(XU((Tv0kvIS&CkXUi-Y)d24we_r`c@cz>26 zp(%p)jv~}}mwK0Z7kgjyuJ$hXZuGh2Q|r^<)8y0QQ|D9d)9h2_bJ^#b582nMkU$~#6-=JT!pR-?@U%DUHkLQ=+XYc3h=i=Asm+8m%JLjk5w_N7wciAt*?~>oc zT`Od|OJ8vQ;#}oCT>26^haH?&&Q{rFP8T$-u5h|J*EnW@?>RR)eVl&I2hMBGqorFw zv}Odk1-S;L2Bif}1kDAhf^3}~oEMxM+#6gRY_RMz_X}6f#qU`cq8_p(WL3zKkhQRs zu|8yV$hMHk(5lczFccq!UJh*uZ3=A;y%_2U&1t7FQkXq7rJsep3ws?V==rFbm`5>_F+;Ir+1=R5*n6>~v2S8;$3BSt5L*ED zjc&ql!qWh z;+o=-;*!Em@l0_`@k$9vaZgDEbM|cNxzte5v?Eg2K-X+NG|qNGlVT%u&i1FTPT!Nh zH=T(>W@u#G%NPKW_D05SP-!1!BxR;##%CsGre$hn;j-{qe`kee2W3ZRM`Xuk2WRtO z%Ofm1GW%S%k=5;0TmQ2w{axUaXG9I%bdYExj6x_9T1Y^4HkE7&f2`- zJV{be-r2lIdD{8<`FJpLjPj?T@jadYRQODIO>|7WRs0QXoG+s5q8p-LFfnmltSbHl zD%nesT(nvIQ`8T0-%G?&(YWY@c#Zg^_=o7D=&|^LNJ0ETv;_)U%HrkX_2M03ndlTq z6;DJ%A_S-v8=)b7U-T9Ho$cb!qH%FAG>p0n0?a^cE_FBd*t_#5`Hvx*Cg&lhKd{a93-T6}W#O<8X74cWgUWI^$}i$_8G zMwT2XIacztvX3gH3?KRtKcGhgJSzoiO=1|S1nxi$lYxdQkYW`GXYjtW**P@}-imTOwz7&1! z_u5yrAD}Jux>mj35Oz)s>i0Cz8+L*oY1VMEVH>ED+RN|*6Xd$S_fLMwvM*GXbqN>z+gD(Hp|`uEyQ&-4!|4g=3F-;#Sr2Q*>p-CV z(fhskNMBrEbYBGQ#3lB9;*da{6!ho!3;WOa7xd@#r(FMi{nz#Nw^O{7HI`@uqDoMW zsAyCe>MW`W6^v>}6`?MnE~1)IY}9gT!h#UgIaCZvjQXZ|63s$;q6^TAFe1!N>j$&uA_prm*G3;Gzy;h@EC2YIc;%snB@P+vE_*#4!z5rhY`%E>k&$N;dPT&#V z!qVSgx~Fv?>Fz!~0gHc+b=6P5(|r#sfYY#2x8?M>?iB0+zR^`XqprU}f0O=p{dM}V zj;(JheQ&Vz%;q!C%fA?WHfS|aJ@e5({mdtWZw44cEkl&y$}=3pv#`O`20Kk0BX6Uv zCYmO@O!Q35OwcB_U`lQ_`DC1B8b-_^`bqPM5yT8)ERjb{CuS0b#28{EQ9z6){yv2_ z(>1$jcEM~JNriNaBqiM>-68EIU!uq&y-%u6y+u5BjtzU2g)1DGs;40v~;h< z28-<$J1p*kIVrNNvh<|6(>!Qdv^8{f`d0cn`bN4p-IET-jC2;ghHhm=wW3%#Sb12H ztv)WYwX(Cax7uz~Xno1L3HBcPtsAYYtmW21>jCRBP|j|lf!c6GwXBT=Yh|Z&vl<$K2q4D zk@?*78S$C+@$n1v+v)$_Z@a&i|1SUC{x4wlL3`{ES3BH<+s&;((jqy znn3lybR|?-AUblQz_`>jw;Tyttg{y}z30Dc<12XZp z@T7?3h-Hz>BbP)jid-5Q8yOS1A$lz|q}N5Sj8=hu8Izi369~$ zypH)5s~qh9s@mJ&f<16E<;%npk;%nk>#p@+3OkA0$koZr6Vxp(Y zuEd>*OA?h6S0u{7FX>6@PO_7ACbcKks$5SJC3~j`QgTwNQ;Jh6Qk-P9DMcygQ?fvi zlcZir6{lvc6sDd}ZAmRjt+6aly^v~~?w@W6>l1G2=IMp$PU$x3XVZ!4rs>RdM!H2h z6&_$=z;u5Os{44xM8;&sRE9ibF5^kYbjIHqA2NiQg&?9(vW&By?03$3n5B^YHH$Ax z%`V7JJg{A`O@N0jIkgl&xt+7dE(`2fw09jEuIuNikrk!VrTI;@wEbg2nwzj^cUPHm?^xardFh0bf9Qw z(a|FFqQgb&iuM#Ci?$c7E>bOuEYbpvBc~SDAvji@rY@^#fau$Pxsf2;abwV--yb={iZ zRYo;-HMAOLjd6`jjbn{PjWhUD#>FGf92#63LK>VJSPgCsla0?BryAvrm?kUeGrBc7HCZ+pT+)Sw4$Vueo7XfS zY0hi@OIFZa*c{jVLUy6Kv^lyZrsb_{>*ckeQ|-8H*c#a?ZT;S=BzfQZt@T~&@752k z|Fm9_T$S`oT0yy&N54Coc_I2$^ z?Y#Ds_OSNE_Sp8q4q-=PXMAULXG-TESwJTTJknHfNs~G|yZX9%x)g4AclC8&?r!V8 z)vdMuK5Tk4b<4W%bgTDl>{;KV-J{c^-@^mNDilmBrQ1n8{GQ#tdwTcv?&{s&yS-Nm z`$x;JF2B0y>bv!dR~4=dWlQ=_~9L_MPu5=o9x@UMuXs0Ln~R ze|i7H8|!awzPS;0kTebdxA(8ip-o}|p+RgQwh(*BzdfvfJ6LWIPY4_GUmdIv`1;@O zRRkmw5(SBd{P*5f8hoDt$%g#fx%z*iU-f^r`~ClQw+anCCkzA&(SqP0|GihG3*Z00 z)v02_zsmvQ2yuqEKwKei5O;_N#1q1TctQTh9@T%}0{>s#0gr}%UJN7_5(kNgBtQ}& z|89W)uWWz+yZbGM{P)f83-En0qy$n5DT9D+I4i` zXy4ImM;{*bKiYBh@zKtsmySt}H68Ogu5x0@i4Q0LKKbV4yOXa@zCQW($e()s94HbooK)Ip<;d8JDd^YBzLQrw28dM^x z0!8XiM#Z9NoAzLKVRmCqVQsNwtjEHASOVOt8De)~&z~@Xt6O92VJrg6=s$!#fW>R! zw0gBdp})k#ox_FTqT!O(2JYs0_y~9t^zVBhD||RyIauH?Xm@FsYsbSrd6~9EyF~l4 zwvo;mol2dxx~p~7bmw)4b@!bWi!Nvi`T;qr>uT8d?{xo@O^2qeJ$u?6hQxnsM{_MqkQ@W|Xsj2A?;tS$8;veEy z;uqpS#3lc>Mo9hrw@BAXSNo+TGx82Hii{*Dg3!K`ypL?4q)pZWuU!vXLS(W&w1#xa z81iBAG-ZZz$NaYWl=-;%g!zcM%>17DC|uwUn=@epHJQ5BBE~Y-^1NlVCEt<R|3*;h;L;2pS2~A`Y+i}qK2t57T@9N>|=_+u|brrk5b^YM_26j7cyUoJQKhA^X z;o}kJ!Gq^q-X89-LsaY$=i%v5;_=$^#j@v~s;mtxENc@B&C+FUX02syVQpot_EPa$ z;uQ{WecCl5z0QG{-0t1!-QnF0pUZo_cluy`@xCZuW9V8*mTUW(`4W7)m!I$@`)aa< z@b*Uy-uxu`CHrmhr}@+Uo&Bv~(@53d%-_b}-T#b#xGCBHd*r{a@@Ken`xx*wz#xz^ zU>t}9apgpyUf`L)u@#8G8)xYQqi4s{=FV24^n-*)ErSWcNZ3sdP|<+>;{)W%wzd{$D`v8j|BcbD=_d~yjx(vJt{R*GdABHYH z_jl+u-gVwxo^WL!?*?y_H^e(1E(*^GZwrqO7ldC9?+eci7l-GB7lgNl`wg%ME`+Ct z7lq>@4I_0y!haq4Ch~3MY~;sCm8g|b@kgrRtxkEA1FU+xM|(zlMY~43MfXLIM~4ke zL@$l00nfQT<`K6X?u2*5CdH-1O~pNldl&a8?ytD_ai8L*_bO*jLW!jTD4a2uD9 zkeHC1kecv3;Z?%R1kXh8L{_4Eq8BXBK23a*_$+Zl(w=0aW4FuB9$Dx*ylsXXebFb7ueBf6h2BC@_l!OKQwIyXGT(F+tmor4CI~R>DI2S)dT;hvUdN979hAa*Iuuc z)gD}NvsO~uRC}$qwYCHNpqv%Pf?WcD9|j@~-9ImisL$TdiA(t;OKqBegPGOIyoZ>8+gB z%2s}Beye5sk#?i@1MMd5hV66uue9rQtmxPRRIODVn>&`sHp%wOYGpODc3Gn=tTVJT zx-+RWs580KWL08kRHtOsaJRI3u={qm1i05@-50yNx<|Ti00q0Rd#Jk`nAkoFZ-tkl zL{X?HQWPkdihM<}Vu5m=a*PPLb-2azI=YZ~k$OAJCejL;uoMkY@;P=5_2ipy19-4jVPk)zsgnZ-& z`?=vW!$*cUt0oMu80r`;F}i0sY)Ca+X0*iVj-hj}*6^v}kl|6IONQfy7?U6ql8L`b zhzZ&x2{Iu?CgzY_$D2})oj*o9_V7$9^mq%+*k&DOZDulm?Rfmuamn!&mb#WpELT}Rw0vN>^MsX^9nf4|tWZ|AR!A#1 ztK(MgR=P91tzztatevbqAl*pr^|Ge)BCXx5U96=xQMNTRqHPOociU~Z+hrGRCquG( zrFJRy1p74mEPG+^6oCb)}hd$6iBfp z4qV_`>p0DGnhVCi`A&SdXO<_^v(B^Bli``;neO?fx6HHF^MhxRC&lwN zbV*5`JWsagI`7rq72aI$a&L~epO3#!oKK*S0#b=RK1xWe%YBxCKk%FHcj(mo@^$r_ zkNJoephwa7(1YktXf)<7`Zjt3J%YZD9!Eb!-$H*z&%|6q|Bcq^yMtbYnS~icUq#Qx zOrqyt6p&Y+ICJOB*v3le-c+1Xo@s)#N5h%F!7bPZ=WKV+sLpgi=HoBOf7G67g&asD z_y)OWB#{2l4>}N367((TOVHoJuY)Ipp9Cj_Vna*km4sG=7KRptGDBBmb+PtXTdW-x zfjy25#M)rd*hP@#AmavcL(uOV41aF9DFPjd0aI6EWL#t{Osh2W!y{87QzMT>RX`ST zUGxUXZWKjVMYl&+Mi)l2qcdViF{+r{7>B-`7*>pZOlC}WOtJ$5{9V6df5f`PdBl0g zImX>v;2Ad=KM{X7{_l9}1lxr8#6P)2EMzo%`pzY0BnBkLBt}DK!!PlBl62wcqZFaq~)YtU`Es-%_r%SmO9y!&yyMCd~y+)MJ^z}C4V5_Ka)dAqTngnV5k1$ zrhZF#L-}&P3=9oRseQSZb06d?bEUamxl5?CsFd7NXaNo7w&hOd_T*m7oloWEvT|#3 zALU-neVp5vJD8iF+t??_-9~+qt3!R78%k}+t;~IvtImC%yO2uCZO*0UzQ`TOT}@R% zKJsPmtK7H1A$~%CLBBzNL=V|^9cEd*`2+c{@>}5)PM-fP|8o8tFvSY;Z|1A=U*?bI zPb}@v|7+=B{&4;cIHP+36R&p2g51ituT;Z{-L?Dy<`t&)!o-E&7iJWE2LsuPf~5ts z!9n)3KwA(AM(pLRWvm6P`9NFW!b&fSE=nj$EjkBhb45jwkc1=^#X*KXsVD<7k(pp4 z%P#tk=+Z-F24x$|Ci?c49Vjy_J5gp?Hr`juX@oqa6jG6uoEw~aPCG}) z5p$k#f-7vn&Ev#HgUbxVwdcBVAM}~*@C3UVf{WyCs@zhkt{STvt?H{9uIjFOR5e&7 zt5SlMTUFIn)mqh4b*t)am8NQ|&DNTt8hT9yM_i#J^J6nBL;gYg-~?YJ{nauaQs&%OKYHM%n<<|bzuGZmJP3yH* zx~^6GiT2~|2Z0fLt^Gj9;SPfitBzwGOJzr7hh;{xgEFP8N2ZYt$g<%4t+JEeN$V`_ z%i*XKy8FtiXWehRUv|&wnbPyL`)7B6!e4<_ zY+qfbSP3(&P0HoUHA-D2M|o=XN2S~956WGtZK^%0y{b{*$j^jRwhQVy&D?!k^w;Pw z(qF4TM_(GfuDASvj==_lZUd!3kHMTna}Na`x_oFCD(?vWh?S9(QKZocBZQHw5!T4X z$ipbY=%kUgQMl2}X<;0 z04qFXG()Vztj}2Aw7F$7Vsp&} z%Wv0Tu8R;f#1&|Ot#KPeUPlfi2arR^n@Ao|O)@-ppgw!b=>!${Xtw;S=T)?lT0r$R&OY{pR_t^ji+Ctz8&>%sz1G z+JjsC0Ok-z4`YZi$Lz=K#2m&rVt$>`3EUW{8~D$e6@g#ROq-W(_5IAhXB+}KLFGYP z=Y0tN68t{6JhU{FAKDb!5E_IfVH2=1z-R~ua$*El7hJjpxEtYP;kUx;BKeUVpnlLJ ziz7QD%b=rP5?LR~j3h^vM%G1bjOIh8q9wW`dN@W32FkveUhqw}#B{}U$7o`%#wfr& znIAj-?2NOqaY=FUanv|`oNFH~E-vnO{Ev8T{0HDW{EYt;e<86VQ4D#C<&cYZhQrvfN#S0;EVB7)90qoN)PRuojxc1I$;rH2UjfCA+99q z64w$}0A+p^aSd?^aUO9l(fM3l-(qN$CiLyfSemgiLl=7M-5Fhw9_-1;&CJduWj@T* z&03YUA!|j}O-M>iWIfCIJ7+QnOFB+Mks?S=q|K0-|40r)lPEq^U&uY|ql)@akb(%H z+ELk5FY0dU8LB>{AsE2TGo$)bZKzmCMwnCWsUFlx$Va3=LgEzl2o+DgK*dlEsjk!$ zRKKMb)Ksb;OonjOw!TmF?))g%LB`Mg#f(*qX^bfsHUi7STgMn$_4);y3l0?Q27B8;-&E+>Zz=d)kW?57 zM)LH+RB)4TV66it{tnho)^655)_T@nma>Rf)KDZY;uZ}TNx*7ZR@71?D3TVn7IlH= zvZF{?G+1=K=puV+@o%=4om8A$oLKy|c&H?2*{zbXlF^deB{xg_%G}Eya_q|A0Sogv zurQx;COLm`9&utSLMoywqAD`DSZ)+Ik{iLz=H_r?xp7<^HyTWCxT>_O^s0=i?^QFa zUswI8dRg_p>SxvSs>!~0RoW^8APcwENNPH3>T9Gm&-!w~;6dk=@aC^5<(2U+@bZB* zd^h~)iiEm@b;fl@D~{A*>r5fz7g3i22|x2Xc71Jqb$xk#RehKsS`aBXD@YI|2~q@Y z4X+v+8>|{FA-OPDI0t4bQ(=-aML0t^Pq+x^owH%4vK;0sD})Px;yF{O75)~^5KR%y z73~#&?K>#GEAAKH6kijEuN(ju(V$o*9v0sctD8C@yU^P-&@{VQulZZ^Wb^mt_s!bo zt1DkOe{6o+{Hyt!WO~ax$qUKUmNzY1q|2p;rTe8vrIylTQhO;%Y9c)$wUBNBJIJZl zd#w|#cUvE|&hCEze&MlJ=XRTRw{~|R%${m@Y!7UA?QjG8n^T8(hdnspbY#cC3-UmA zTQ)9xD4UQ;I)$ALo$os3oldKIJL@~eosFIAdv^91_vrN4_3Z6g*|WOGtY>S_o}M6u z2)N+O`z4Ad#Xgv$YzHgIzmN&kDt{@Dst&2fRO6~Asw$I3YE$6Vo`CsDfqGQU*BsQ} zs=rHrr~XC#n*Ey(tTk9NRc+8~um^Z3I}f)T@r`&!bw&)M3Zp`!dZSvSY9ppm>a-q6 z3$~gxn>;bGHg))~VU}*%Yx>jdD^LvH0>|K+*-MMpmg{FQtmsxGE2dSh)tr+qCtuk- zvw39m+~%##q|ITwM7spLIJ-7GhW!QmNrwjxqYj@OemN|2)OTF%G{@zi^)rDAJIiId zi`Mz4^E8(eE^81=5i1ZYp^J4LF^t#(_TSBJPmw!kBi-L4-P~Q>Med=fFcc5^Q|F;m zONG{~5A^>%QKwL8KmbSu8bCc9gq`)d?KAE(;zFq&rE%Q2vN(2JRovo)nF)3YnG1UoyAqYj zQ&V3+PyY%28Gc&oYy3m}Tl@q*sBd}dJ3M01vebX^-|*Yhv3;x4H>F#pTcleP9f|ft zXQCyLoScXV;wk9t#}Q8uU5W0{;Ey0`_uzNWkbf+jExzSV67a? z7|OT|DYUZ8!psYqMVSSetjzq(^;ui8HfO!edY|<$>si*5tlgx2q(o8{B(jf@tOD^Q z*Cn4w734B=3dI}psuGqqK;7?Q=d?Ks5hx_fK0tX)uT4`^-+hZ zPpLC$vuV$$YiZA^<5UGzm)1(1puV7rs7=(%)R)v()L--;^eK5~!DVE_@PZbr9az|6 z85rm%MKR(Ssy=0(EhCZ<&B$Oxfbl4cVGoU^ct#)t$H*ZCGtMwBGlrSBm?O;T7fuue z0-408z#TXxdcY^K19nMfL9ou5f}BEnp&@HO>mbXB#V?vD`cU+#NL%!x=r!1Y9~QkV zdRuh6=o{EC9~3<=8ZUYbmdwTMD{LFnnZ*l=7Zwwty_!)xwPZRZ%N~_HF1cUw5^`e? zAz}6pnA@gqPb!Tsi!M7;7El&h7FUKV!y~n#cb4NTINTC0i%aDebBnkJmAtBksN(YGs+U1O$*%@o<6nb; zgme$2qg9X>yH>;JweZ?`wY)A~8&AaJ@ow^(c@p0GT6&%33MOQwJL=?hJ#|HOg>{v6 z_0U1e78D66f>OZ$OT^mm~o&(DJTA{9RlW?_g4a})G2v-T$3wN*76Kxai6zPk$ zi`I!&i}tMCD%vPoBibw4AbKb|Bz`9TDSj&cCjKIRCH^FSD}F8hApR)6*mN1Xvi(g( zD+imFK~{RUWPxN&i;k{t%dD1_Ewfvew9IW;-Lj%3N@@zG;RtE4G)U?tO_RoeWoch4 zqSdw4v2{w@lD1`SzgvH`z6C-zs@=E!PJ42Pe@AFXP{%UaR+**DLUtU|(vM}YATRw) z_7ZZ_?_{?+M>_9yzUjpFM1n&hq~~AomterF;ML;@Hia`_S%~RD_bluW>hbFd>*4lv zDP)QsMJEvEO_h2|WAG{&C@ock;CuT^bw_niwFGG2_AqxYQnS^U)SP{H)Z^-U&Aff( z`v&!m_aEI~w|}d_7K6{*$rLLpp2y-sXdisoha%)Ee7qaVB=jb}4pAcE$D_`x5(7 z`=yTa9JLOM9alR}2dlvX$GKoMIPAE`agL*&<1R-@?>^|&9&+T*T;sICX*Tp=4P17) z9CX?3a=>Me%Sjh~ml4D^x39>*k)M&@kZq_UR56N$Vxn456(}!M4XPAXhT60^i+IQ9 zfzL|cjedH5`hI);WSDM@64Qkl#XJTQfdV7Pv|==vDhwHt%U3XMm^+vWj1)7D2?YYv z8K5$Sf&bSdaIWzQ{mP&zA-{ru2M>ns>bnvu2)!KIiWOoTfHbfu{AKvt@K52d!{3F! z0D{sOSdX4YzKa}T{JhF%^pol5Wl!dfF zXs5W+khDFtlhD~Lp&g}JK-=G$<^+xZo7c!-FbWtw3;`IGl#B)jlfh$@GWd)t@GMm`${1WmAtRshA@2f% z#i(V}fpv)kY!rL}p&+#&7I-Pdg0zBkV5B4#2emqNZMxs+0Nu8dmdRUQBx&8^Gb%YDkx<%se#<#+N(9AHMeR;fc!kjyT+6AhIupiqjke|H|u`XjYG;uTQ>n2 zpJ#Rd)>R40!F@Tg>vsdX(X$cL=+(GSxLvqYctE&KxI?HX)EDj+9u!(bHWnc|C31m; zth4B}$W64lX>QY+rnOBgVwW`i+qWFNaym`(o31zA05ird@MDZLtvd3fZ*KEC$ir@z ztd;DRY?K_3Y?JJgtd{JTY-`yJ*0~+voJ(v8ktRT6gdoj_lo-rmbUe6 zdx3VP2fVAb;1b@`wyVvwjnE$3p3l;J$J35(j&3e4E}kxE z7k5aU?m!%9-GkVL*oV+V+(OL$ueslkx(dz47bu502HtGVeIEnA%ZFF=eZ+jgyur*3 z_!sjJaOL6yGXm2B69Uf%W`aML1O%vpKu%y{;JHBSpsEAYLk2>xh7N~{u>II-+?((( z;h)1lM}Cj|_dkx)x5)OW)+mGMtI?OEuSH*p-V?hyc73coP7$Yx`?z2rZezknaE^aU ze37V?vcU}j5BO-T((jY@S*cTV4u-b8F5))32y z9AXu*ohT$$6ZynuqJY>-JeXmSaVX<(h7qtxCZI)dKjT5h!;IR@hRo{Bn#>v5)3bkN z?aFQWyifa!mSF~XR^yux_I7-Q0)H(p&(R8UyJEeO@gE0|tbSXfYalC__GguNF` zxq56v_VQ&1**fe)z!y2pKF+oPSME*r`QlY2OG?(1Zil@71u%~nlx3HfmY*-Dms84_ z&`9Hy+ez{&E>!e$)sW3saND?-xW_8bFMm^IQGK-9sJg1A5V~gfA$R|v=3dQh-aX!5 zyobEUyh+|F{%XD(|4rXX{v!Tj=xyur*YlV1TkG5FJHU&p5wr>pHm+#QYBUuZ3Qq`K zz&vnRXe=}nnhTEzO~6861V#dDVUoyCgcBu-!bK6HU{R1LR)iLv75x(Z7MY9pHW@bQ zH63lTXfka&)O4cB1c)NzKonWnJg@m^vq`g=#9CqkIX`pB2?<$B1FKuOv{G6sWk~a+ zRZ_XMMcO9qkTyuGrL|JAv{Bk4HE8v24Qlgka{~Lgc^d*qB%Z(^ace`id9(#LX1D)g zk+3_eI;uP7ubS6i(^1!5P6^m96Aby{`Vc3E`Ubh&gz zu5###S%v5t>rsL`;bG779$C+5&wFqIJOP`s#gwjRnt~{-DQVuGIlvkA_N|Y*4<*!1jd{i%0&%s%_ULC6TR{N@b)B)-$HGMTt z{Zjp2{Z##r`nCG4x=6#)NHuL5iH1MLNq^gcy$0704IDN!K4^?IHZe9fJ_>B#zfC@y zd@=cH@{h?!6V9|@ME%4*;&os-@`!TcO(N!;DcG@}XVhm3 zGXob@Nu{ePaA%tYUs){9=4&d}T~!{>zxf{D-lG`G7HuT3(aZOWAbB(O#QO)C; zXEkqmuXrZ4Ui@r6nx6&@PZZys@5d+b0SwFc#hMCV0Uuq0ry*@{ny?ZtNDb1Sn~5?7uC&!SC}ZPSyc#myGY4iZlZ zLh^B?s{|$Sm$*s%Bu#v`>0bIw%cj#ka+^ zoo$PUv~5P4?QRy(5g6?k+6#e{@T|S1L)IbhP;^}D=;~N0+acR7bCkKrPRm?n2-$M5 zz^(1f>?#4bPsBWz5*6c$2}OX?SLv_BC>xZwmE+2}syV7~Rj?{f6|Z`$+NR#F#;N)0 zdi8wGclE#O-|88fFY1|^67a;zH8M^8lpuX?{j>Y=hge6@#sNT#^EUPca$JG|WoH;*R4M3(& zvWikm+eP0(-%Vdd-$-9a*P-vB{o`Mc&bju4`3L)<=4xLD{gUba>uz7+`qUZ+}m99N>sIH zwR?46&6ApUy!X7%yidFjyheU0zlqQ0<5onhQ1T1;1$+hcoO|jg1QCsHLZr|~hyss` zr;sZu6cvfsqEliAv3rwulYbMs$*ai+ETYJ!7fr95-ZU+14v~aQ&PcG5KnYrMT4D!X z<;T*y(s3YvklGk+%r;6}A@Dw0bUAJGww$)&_EKmjKX32v815M9SS{NrTfYh^)9c*Q zskdrlr@Twt)!ilP>gnq2YV8{A>gbYob#=9OUF}kI4Rp=#N6Ss+0dilUgLuoG`#YGu@tC`HtoJjd8mv7h2T#_dVim#{zKV8YTQog|0kyQ#N< zxcMmc3DATd08c0?JvRL%uo41+k?<-*PUkj)G7soc5NFU?AhG5 zy0!|iX$zp&*U;Vw-M%Vl{k>>^+5W2iNymeZhaJ0Qelj1Khs;xkmYtDJc0KO8-!;+o zqU%%Fm#$}Be|P=U^|b3z7kyQcyg|;E$H=SX<Wu0xUV|y0ba0JIXmr9okmuiv27`g>FGh%hrnyB8W@#uTe&aq$P{*L<= zw=Bse`9tbU=oG&NN94EEnQ5O=&!!(-{4en{@eA=2@hiZ$g3le#Na`CQ-6YMRc+oL* zAG#mipN^&b(gWx?I+}i(>C4101DSULhdxknxuCYNrZA6925)-~o5aos!#jgrTwGRc zTWViwSNgR4Rr%ZU58U_AV12_qUWutjSHG@#Q!}M@YV9Nb1O7w)B>yqLxBj)@l^~!o zwlQ27Cd3Luh0P)fu<=~Q@l8ZYw!{rw#2=v1`B7@rs%-1g?bemIDcU-q%h}Z?YwKz2 zZhPJS9Nc>AWPvgVJL68n&cmHXowK^vbx-SF-@T#xVb{{`Ro$DrH+3)RmdnNRHn~jR zDObq*R%mVw=8wEj`s(h;Ct148bs{QJN>MV7e+D2okvC^1nPH0RuwwiFTeB>D~ zJs#V8zSq%iubZ=%zgM7FxR-_ZOP|Pq@Bm!Ep6-W%e+5p0Vf$X7Q_#wg$DvQ5-@ZP| zAwjJ&<0GbtA-{gilm9Q`aknI6Z)GuK5W zG833d%~8c|C9e&5FzXmr8E(m zlEFi`ve~ocGBjVWwMpCGw!drt*zv7n`KlmUuvwPOz9WAqza^iP z|0RE})KQ65O)3&JQ%BS&jfDoGanQIyGu1=msky2d)EqQ8U@&rM-LwnF4C8#`0%NA} z+3Cw{iFQJln1H8&TXEZPb0TI(Yy_s}=BUYNWUObbd+hf(;{+1jD8Vh6ke-?z+ovV| zB-&&ckS|eU=~?t>I)R=}&!DH#bD0F@Ic7SO$joHkDi|)fQQ*!hW0$f|mwqh&#?^BD zt3#@1*3PS+U%#k+Vg1tjx%Erx7u4(2_tk$Dd=uar!y8p1jVPz-TvK*aMpK`NDxpjA zB!8Mm@7sTL{O$;qg~_loi_T-+j@@S6=G_+Errp2gi&lS;zmxxzf0IvDe3w%c=afrT zzf@DegnKMnuI^U*YP`XRJFJ<1IL_;+`I_U8t;p6%w#l{<7o1nT*K42DfZCuZq4Oga z0g3Kt!jiP5X)Dt*($A&;B2GOw<(zHC`wR-5%A_;N%p7JuGn+|a<}qo^F|Z7C*%a&P z6~DOeYv$I@sohk+t$t&DjL<{;6)cipnivxQmao#=&|dCt|Ij{F79q3jJkjag?beOz z)=|t*EK|%>EL3DFGn8$rE|o$ZtO?XaX>ghdO`j&>P%T^MxRc#R_av`muakah0k45l z^d^uWv^r#KRQ#r?@$1s2pR>!jLt+B|xQNMSGMNR;@q*C;PZo+*&7N8Dox7lRUafxp z?)v@p{q<*smqp%UFY$SBh2L$PXuH$a)BZ+xmTaahS{5mbfumXf?!a#EZglr*#d^hB z#TLan#RkP!MYeKx&8lZ_FRm!ItTd=UR6i&J1)Qir@~|yd7T&#Av0Jf5u|u&_u}ASuVHTaJ zS!Ig%A_k-^`jAmdFQQj4%bE9>cM9fLOshOm8Cp$kdej!%yatB_8gCSw_rp>Z%XVw zs>s%4YHl2U7q~PcJ3Ss?c6m*via`U4hNSUz=fx%nshZWM+~TKg#}zseKNK`gZETV( zS$13Vpx}mRjj4crQ*=euN0t-@wLt&s|CGne13niD)}QX!A9q(MtXNoooLzrBU4J@b zfBIs7TwVWnN2~z;{>RN#3hV#b6Ppg*o*A%a!kPtZHmv{E!S%m-x0b`ltbnx=*8i7p zYa_gG6RiI?*VayW`z~0!VeNtSzjJK;@BCW-t6R$o{+lOZS;Mk{Wedv=mOZRfupD4H z!g7Lj8kRFG7g+x%oLc`sbZJdTu8ByYLF-nU#5@Q%+6qEJcsa=a`i`PxeOll|D>z&Q_ zEv_%_uznmiYl;@}%k9G~G97ictp(MJ%JjPAb=gac zIOb#KWA0<&v+es$A6w+O?}~l5Ne&3F%?m6VolTPGoBla?*)i$9KJ2 zwE@^EC& z_R4J!(jIvV>41EIe2APxK0>NdkC9K1PmwCrGvrsK7V#YU0{Ig83i%qj2z3sXf$Bna zqk2$sl!e!EFN)X3?>0VKgsqRAkD>2baHZJ#J@-58f5hL=-w4`QPyC@9IIxR~&mGrP2i zvvJ2}bjGhsG)(LPhJZ3rl}Jvym;4uaf9@wgNUr$)FnKchQS!cYy>#AoK{_YB9Jq4a z^h)5%Ri|qaHR-%`e)@^5f-G0~{vxtZX1ir?foDpWNCTw5zF#4Q?7B?)L#Wx2r$y|{ z+XXLC`9Hq%^C|h~^K0|#A<^3ad{ZGXv1{~F^0kOUAkGvO*3Q);*oDLc#f7Jfoq;o| zMOc>Z`SG=E26r`AmwO!Uf7kNY@xK@@5+EAJMLQ(%ZCXS^+r^&wiUshSeUW0ZVu|9i zwbz*USQfaHb0)Nie@<8ynOEY{N)qpTkc!s zTj9&~t%O#cE2Ia_{I{SvYqz4ep|_)Vpm(Bop?9PAp!cG+h~wyeXg#z(dO!LAdN`;) zxGE)M1dm%-1sD!4MZB)Bw~A57U06sAQ?!A`~g`Fu~YFM&Pr6Z;DL8v6$O z7W)oJPv5a0uphCXu%EGiV-XQ<5y%Ml2vmdz{KWr?xF7KtC=?GPwnS|OYWssI;gpln zg^+wNiebkT$CSjRd@qeDiz$z(h~dUm#(V~Q_{KO&Tz)(w9zI+AulV2bQxc{otVz)# z9w$FZewzF&`FZkdphvt+ewDmFg_l;7b}Rj2`la;C=>zFk(g)Lr(yyl9pLs34ce^a3 z6B2+?S$DJUWrYD%9hV)R9g!WG9hJR$=QhZq!`DQ9O8S@dob-b9lJtx8iu9WFhGakc zEvahPJ5t@Q_wW(A&6nm!+n>jra{yfA26>0_h9KvC4XA%j`OWz^=Uj*M z_Xy;_Z^Gl|R=!|vT_L})zOWg13k`*hz+Mm){$T%PYY}=S`oPcIUvdDxwa>~HaHesl zb7pX6a%OR~2vx;4XhN;5G^pIf-^|~_-^%}GxShXRuuZT=uvV}R=mCfy8wB1BKEMy~ z1Af3kp%$@QqD4?z0Oi!?Y39*B(($arKz2xm=ydBGU4-m(@BH%<+YR?wdlgXMRb2R? zuh_3Rpg5>7P#jY9n;%w`^=<9n)~`iu@88+Ka-i~h^wS1> z4HM-P6%!>38Yj3DM<$IY>0gex8M?g_wYm-bYk+h|o&+n4jk~S;6J0xZdv`73l)Hnw zBbW|OyF0tPKnAO%Z3Lx7+(6w#-9n9`HhXV@#A}!j)&~bf6>Hx&zHk3)gK80H`~v;{ z_KS8q>2K|yf?m50k4{CWLDQ3fCZf-wDO0rws0pI8(Am)QB%#UZd^81p9^D^&F}PvF zrQplK1Ho5<2ZM)#8#jQaIrwq#b+D3+1m6h08Qd3qD|j^ccJQXK&0%Y>I?&NvfnACH z)9zS>9hesIU5n7cEyFFxt-!6s>Ec%5R^tL9&O`)8{1YMA{3YUR#J7muQMxnzqCKNg z(O%Ks(LT}LF(Z(FmB&2j9)|3z5*i(9$ienPE;d3@6;~Zs6IT$wFkx}RA|OpK1=cj{ z`_rWT@EGTvNz=*kfW==8>D!_+q_c_{YR7bOWBYj2I`4v`Y}iw%qGks%q7et z%m>EFLc$`#V!{&Oo-8Hk5S9^^6IKvb5_Acx2r~G8x5={2vdfyx%E->jPJk;rC!3VL zhcxniFYqu|kyn$~khO@lm;XvV)!ok9!!mEYX3a=Lq7mgI(D0Dr1v+!2oXyNU`vBF1%Q+kXbLxfa>Dclvl3J-;+ z0tMYTZ-tNIa6jSr5xBOF_8aya^&9s;z3erhMVJhj4(u8}KcYqCj!;KvBlMA;8#SXR zm+?jm#tO$+V?|@^vCawSNta32$;8K6#1FSDH)Et9G8V3^B==YnC) z);%2zpage_>Vf$$(>=?*!adtP$DQO(cBi-(courHJl{h%ON*cbGoAtIoC~P?z>0VC z3R!*1+rit>+tu62+s-@QC&6cv?`Gdx-#Xtozj!|ve<+6gyZPURM%Jcvf1&TAf5YQS zi+BKStj+5t(T~uN(NEA%(a+G&(J#<1(XY_6!D}=(WM0Vp|LjI%8`gv@f|JiBA?reR zhJ}O`hn0jK!fwNE$L@gNA(PY0aY5fLz?F6!X9?!C6F4i}Nt`v#2KQ*1EiODFB4SD8 z(n!VTgsAsXxae@WUx)z8UsUw_m=7@@V?M=vj`=(0pP1hd^bcp0kb|oXo>EIqjlHJK3WKS}R>_zq_`;dLfp1b|X{$w;cnv5X_kk5e0=qz}Q zw1_Bj8#OpDBrh~CEDxK9%L~to$Xmp)VrUVI87CRmkY==nETcVR3F8#Qf#Jw-Vmz30 z8nTTp3|FujxiOFocZLV!kGaDONbKvu+~Erbk6Ayoh+l=jf%!9)HH|f$HG?&iHH$SH zdPQ?sb6KAY=RwD4Ei{c5vKFxxvzD+H7Y7ul6sv*JBPzAxoa9(@Y&fIq%Ey2Z7nc7Ymv1aGplY3 zXg|}w9InjQ9VcK`4f_jB&`v_4rM0sSuF*e#+TrzN_skwGBF?;2p+%G_IEr!w0D}~z zKPnYfifTohqDH}k_tYxt6fiu2ytF{kplF2jv`8U^w^#Og^dBDBx%Ak;fd3G{xQsI#N z*yMF6^83ypWH55JN1uDY`$cdb{&62Zb-&_12v_)!`&IXA?$_Oi-PzEvEc1MYdIO$^ zuc&u0efIJ4_44zI^p5h@BBH%Bd@_BUeMP?W?hyR2{z!~F#slMtX`G6}cwxLTJ{Vt& zALh?j?vFuZOu@}_44ggYAr@e2unaj7;xNrB1PU_X>iP3AHX*hlb|Lm5dSSI;W>^bs zRK#;!0xl7kgiFSy0KFg;mxjv&el-Dib`ueI4mj4C|BeBlkt>Me0ZHk30~0FfuDDJ31%20Ip~1En)h7Kkh-?!??+~Qwa_UjtNc)rxTnLToQIB{+swc@ke4Y7<)>S zw1^GK6+k860*CrT$~T}CQ~{H^CWV($oAN#72QUn@DZf%S;(w=1!PD?l@tU;WG%ez0 z+UfKrLNh@^Xdy_U)z}KxI)tQvULYfM61oW8gdT#N07uBcF;EdS(0O#tL}a>UA~W4H zy|Y}hT(gq1zGeNJbrJZQL)lleuVr7)9tPs(jqIC1-5iBy9!4Z%QXGjvW|EcU3(#mR zgkED2nN2Q+hKYQ4DdeCzIwV!&C znn1IH=_8lUq<{H-fnGo_q!aRpdFS#n@-p)rfg7M=s2LiD39FaU$LMEVWUSD?1iQ#( zNIwrSt}q56U2~PO2%f>fvr@)&#xSI6ZZK{_#%7dZ$~wj}W0|wGi2p0WcYVO|)6OMZ8tKO?=d3yLgA#6=wAwuwOVFn{4^>_1|t8YZ-5u zXlZMUXpe?8To26M-*))Od|_tfFC%r5JKw?{@ebCap2e_F=)rVdUp^%NSMgo(L-AA5 zX`xlDRsK@^R!mV&RZde*S8i6$P|j4&QqES+QO`qTRf{nw8Z`_J`<^k?*E_Gk6CT-G9p17`=k2VP%U0sG0y!7D#>;dTGu#lcI1 zl%exOaDOmF9ik1NZW{LL_G57 z#yAv0G!KW26Z!f;^#}n0eR!9{Rz}2cr*iC#jRPN%~~oWd0;$k~w){ zvS2d(G2!uRhdoyG;iHt%(#kEI?u9?LwIdvHA~ zJ*zxxJU64ZpwdVz$o&R*g?fSV!@B^OFS$NcpRYdKe4BkGzIlE#fKD9lAK@SA{{pih z;3ei2W?=yA(vX;Yi+KlD;SZRPm`|9M;AEWv*_po~L-z&q71O+KTJZGX8NsC?X(9a~ z>0lK5|kcknE705K;&^L>%UXZN}Zhwc|R#H{1yh>u%g#Tn|o;Q{c1+ zC3uI`I1RXmui>UnpTPBji}(&0i7(+ULv#BIju4R=aTqkcx! zLDQ{1dTR_7_99v=JvJ{kKb99;g4zaL727zwIBndoIQR{okd_dg5Cc}$vkAKs_aved ztCJ2uemDR>4L=<}13wc#3qKpLMa;p^#h<~?!_UVrz%Rrv!Uy7a;upi)*W!clOYlqa z8F(FhFn$^STH0=6A7Kwsi`YxtN7N(g110|eG~5h`hlq#atw)H4#K#09qA~F((S&FU zy^UkUKPGN1VmM*;fvyEERd&yx{!Xj7@V5fPa6OnW=vSG7?72G1#fb8OF?`kfJdCj|*(hv|t`* zPB1K)CzzY(S}{*D@%m}3bQXa{WSwJWurgs!%3@`+a#$o*EsM;eu+Fn`SyUE{MQ7!~ z``{!6UNTrr)&*7ptB}Qlf9*b4#PTTi1dhofNE+jTe@`v>RQkEJfK$j}af&!>j)+qX zz2{U;38xguB{>{G*mLg8gEL4@3a5g@<7mrYSG)oV4uebLlDQPFuu@d{2A<-@*Ju$9 z&`=ZdM(W1uI{97vZhj9xPmnKQ2+{;h!39BqpiqGPQ7T|TkAf|bH(Y8^z#WegR)Nqz zk_5>k3M7v#A#-FUJ}I^q+lWtzZ6SSRFAkT4z}^)qX*3O!2u$ zUuS<;e|JB#zo-A*<@cA12G|2}15ipIczfmDmHUIuLz1DEA?Z--P}@-Z(6t{OLyxa@ z!VM5%*kjmp7&YuQ>^-bS^o{h7TpYPHa(QH6Kx1S}682)Pn67@~bU6mk_zBiBQQLqu9LD2~vGfix7>}YIXtSYuY_F`;q z0^DdM1SQhMmfIF4)hC%IA4@h%Hcz%lKAs$cAH;XyW%y2f7d{l)xnaPTz(G4#i@2MX z0lkMTVm7oONJKL9AI=k%-*bsn*p+C|kH~{=1Osx%OycbfZYC-#Cu@H8f^4H45UGn7C|5VXdE zf#noR2?M4R4#-X{N(3d65=Duo(DuYoVku`Sag=yU0wodH5y?P~IJXB+A?`_~2q&?#vxxITu}JU1MEmoh}+?jj(ROTW_*%u|`?9 zS!1km)&zLx@38K&*8R8#?}77B)_v9k)k;cQ>j~>A>+alVtmmw};^LB$5-nn0 znHI65Y-gFA^MLbco`Q3qqvWVKYL14(1uAMEuu(4pBlYpT%bWquW6l-MAZLhkm2-`A zoiofC0cOKZ&i)^_I5R4OE8bO9a;vz1Ro<`6s{US0gpR`t-b+YI)=?(w;Ah9b$N!6e z|9_@79zky73I8eo8J}bHoZl=c7Dxmof);@klFSgd5p;lOyHoI};c>&0hNlhB8lE@2 zXn5Hm5?&XA07KX;ln5_~3LsgQB2G2Ii&MpE;&d@VOcb9JXNWV!S>kLl8>5aCN9aCgkvTPaY2Oe^cX^?s(!2U(-B17iU zN`6>nuX99Ys4`L+tB$HnRHmw9Dl?V2%0hKqWvM!$vQnK?S*vVRwkkW7z3P+-?)_Ab z&^9=&dfxw{|7HKH{@49)`rr1y>;HPWbl~d1 z$4`t~jh`I19=92{9k&~|A3rtjFn+_PYvSacJ@+E-#oPW5;@&*0&9dnm_Ug`?IG*GA=lkCGkMC24CKn-GInSBj%sJ;dzd3t%`e@x~{b<8z z<(Zo2yVt@*eAzBM_ELtK5YI%hjybN<^ohdNDkI=h^6 zov%CRIps;*d^l+@eSfcIY0LX9%UV8YS>Ezt%ZiqdTK>^m zOf1vXjJvI@?W?I@PkpHUKU236YCYUOZ|WoMkG2=K2e&`gzJ2QB?e`pmQ^$F5&dm6U z`tkiT^oea0U% z{+e-T#$7rKCVnMH|N(m=jU7?uA7UUm*!lab7jtbomc1J z>-QY&>o@LfocG6_!}E{KKRW-|{7>Gzubb(f&<)+#&31FBS8GuB{oN0AKiK{Gn-6tA z+&zvokI?r=yMwzQ>wdiZiSDTGC%Y$huOw{S-u+bf)7{T>zu5Dyo|k&KJ@*{E9)8bT z3PF#MnBYQsLVLtLVZ;{~L~L-dx&G(-|4G+h=zo#U-n`Vm z`;$*w_I&ak^=;itYsP(_JhtlbRZpyXa@E9D!Bmy;G;zAAbpKejgU-UfPn}zrt={DsMpSFinS z?Y8JOYX{b@UAsMc!`gLgE7tqgS5ie*HC18Mtf#WW_4Vs1M?{qtanzr{LACtZn{qb2 zxw(7u!p(~|zqPq%bMNNGl&5-o^E;cDY~J+cW;z{v&+#Rll>LhS-TLL6yZ^p>VavrW zPj5}wdWJS_v%bov(_L$~t=qPK+j+vZ4Rp43cNBae?fF|ykHbJjfp891J>`|GoSBj6<1+Y=@pb z{M_N^58reAljPYW&mDQ~$*xg4%6POaso`kj(Wax#M<*R^IXd~M{&@6p!}0v%#^a{r zb4TAFeSLJ^=={-DqYFk`liwI6I>gbHqid2EjxHK~Z?vBxH`>2D&77Wa8cySB_Vn=S zZ%*HHe0F9X<;?Fne*5XkpWpjs_Su;q?K&HOVb+D0FT8T$)eFOyzPYsH(py)E>hMbL z)x4|s9G_fYd41LO`M2Qq`r9uTX8jir>g??AoFmS?&VA1PPTI3}9(4ZbT<_XIS@b9K z9;Gva;3@IYfilm=g1GF(rEizMQ@W(|-O@f{A6r^_nYyMfD}Ak0SRUz%qV73TUujRa z&*7_`p!R8eTA$9R_eB$TsKHk^p|!GS_VlV5RaO3Kzu#Zuul3jY>-`1(2LEh-qrb`D z?4RUs@lW=@>TmVG;(w>+W8!1^q;_TPs@hL$H`T7L{jBz$BeCxL`XA`z`{DW{^`fQ_ z>T^mfo~E!Swz-VIf6}IwdydU5U$pRA`K`@uliC)vKhgeV`^5IA+MjNJru`pOH&)T^ zYk!t__n)IWGMvWJE;?u0y$;(<`%DLQtOa?Yi91uJnCQVCS3H)ESOn1 zvuNg#mnjGQO35qFysCS3!R%eL-7CCr0&=BOZv6_IzlFW|Cvute{$=Slw&tGW@inD)pI9?-%~NZhre{yCd1lSA zwLcQK)IG=O+K<+MyuN?^Csf$$D_zdHNXxvzfx zDue3SZQGlu9@DY?9`YDvmbZsKR;Yj*O-blts=E%*x<@-L`|MC9*{k((xgLA)s{rh>}&;LG`BCEVZ(T5F(jfZ0n zryN;y^sS>kM|+PhK058kzm84+amJ7L9PZ&f4Zj*Lc~RG&;fsX6)l>3^Pn;q;5A|8@GM)9t6Hp8o6fjx#&Y z>^k%9ncajO@1I?E_PcW<=dS&FJ%&and_8&xZRL9JFC}u+xeUGcjq1FUFVmsEv~JuuUwJ2QMn)F zPRx6px_#B>-A_Eo4-|Y=@HH)R{wkgN!r#=1lJQRPf)~B4m*c(X2=d-4Z z`-t~ZZ!ldO|6fw>_tBn;@87;!Ut8test>7m)<^!2{a^e0sgKr5>ZnY|u8CooUJ0xH zpZPzmSy8jIb{FxCY~8=Rc2DhhwIj8AYoDdQ9@eJxri>;|^F7B%%iflKE&E$Mf>~`Z zx2bZg+x_k9+H2Zt+rMl7tbKj^n-n3{QN3Ax`?oVcp4mV1lbI`LuA2Gj%+)hLo4ID@ zz|7*AYiFLCb>`*UFCP=FnLRLj?d&gSubaJow)Hg{&)1f{Hqg124k)be+|YU9&c@Eq zJ2!Q1?);+j%g(0oE!0WlE9#~3pUxAV+d8**4t5T84tKVNQy#Q)N9WGYU7g={?(Q^n z?dklkbEI=`=e|zbIPJ`ryzu&qub0g$pZCqY9rJe1`+MHs^Y2^0ESRw1R<~#2?e5>Y z2fBan{-e8qxIFH3-|haO`_Jxs-G34P-jjFlTllZLR5;i()HB@kP0x;=ojsJ0p#JoG zdaj%~LS5=ds82nwcONk&5%TvOBz}+YiQD5)k9KjiciNKr++|Cs?M&a@2Xm+oy_5E& zEBgL?aJ&M!mu@Avgr_E!;7RQE6F_xIQI*Z$XO=s&3U@10N9u4-8|dDY*a z-nW`rJz+Jh{%rN?)%Gqg7Q=Re;|-5q9ZnsT?}?sJ=mH-EEv z$L5`zcM+o;`D!|I|J)Yq*7>v{a$);Ls<^yN)t6VdUn6#lW7~hEO6}|0Z*0H0J!p_} zWrTURwm(IWZg2l>`|ngoc4zzD?SF2+xBV|-6Z(7meS^&4gh3d@L3Z%h;q${6hR1fC zAdEP<5sf0ryZYu{O?g=;JyG8h)$UhfB*(U?QDP(2nswM zxIger;DNw{fw+{10uKko0e#9N0g9&sj|CnNybyRI@FYE(7-}5HZvFH2(%a6gCtUv`ZuX~L&$u4G^AFdcYsfY1T9*5K-aqpi z^PY4+Q@Eh8$XiTxsN?TYLYx|2Z<)88o)L+&Z;9_+UmvlZE+t0uAN|MuqyB(@%zwgv zsP-_iXdJCQS-XMOTXob$wxP*OtE@vUhg*)c9Bq-eZfyU&eS7$ z{i$ic%se~u+{|BRo+qB~-FF^(<>6P#Uio46q1lILADzA8HFs8U*JEAe-MXIWda`RG zF>XKI^-R}4x}NQNju^S0C$8;SV%C0<__Y7kC7`O)6|dVj{x$FM1y3w^azXZjLgGD( zT^P48exYfhnHYLrB8DE?saQC$FnOVCAww0X`NZ0Ty=?C-MP{$9m(v^6dp|KxJlOkC z@58;15Hm$E@l!nBt6ChnIBM~qi|;KSSh9A>x+UwEFb}o&b@WZ^o8C90Z)V@DzL)#{ zc<;xh%a)Cg*y`n{CL&kRd27N^1W5>uCnR+Ry{|RFXQ}?6QkFyS-)n(nvKLHxoyp+HJgb` z?8`MT3_QH5%q=-vY+LMG98^^>VN3RwYg+_c4}8@zIBjq`orIrB z6>hWW)cY%guMWA=-;Vx%^bg9;E;|0! z@t)()kG>YL2GRqskS)C&$OurIf`C0REAa0WM<6SZ9mt{U&VVa0J0&;Z4tN3ufxsznNZzygkZ>Vn2O7}+84fT!W49$&ox8Ardy8Xdz?QfKYp|wB+^+O1Ag}c6WX>wnp zUY`GQmwR@5wiRqI7%bT2-R%8>Dpj}qm(^|kuZq>{-i^cww%K>W`-Sh2?@M9_ORKz2 z3=lW{cl@{f6KYNqYt8(oxlKQ{T%bN$QLPKx&bMD6%eqMQUC(q}raG^y?T^kH=Qwbn}cZU!}WHFY(2z1}sctEFplmtaBIg85XfyRz~zI2PU_riI>xi-~jL zorOylzPnJ@8%_O#4b)#ThIkbkh+QGRciWQfOFr!D?OV~exbJP^RG@rm-$%r!(AW1~ z-_pLlfn9y?_dWaGBTN6Y{MQxdSA5XFy#GUD>iekwDe5oypHU^=cSE>O#*M2pYJ5-~nPdcxd3^ftLmz8F+Lcc!2Vu#Ca0Bu3$sqhN2C{8%j2m zZt!j>+fcs2wQ=9)`#*ns(>v5>{=(*qo2PG?L4AhCt#%f5AG)zcNX$*|Z@sbgzOOC} zUL3qMczN&&>AUB#tAp1DuMgfByg7Jl@Q=YegLeo29K1L9*WllS_YHk^ml>Kc1mC>2 za|-GI)Sc}+J9fUhbK1`7J7?^CZTG)--?xX^GiOido~}K&$R7#!-X6KI|Kk2j`!DbR z_Y+t4U)^7GkoyDg2mTL&AA~=MerP|`ap=v%-G>(*e)L%IvB!?BKdv6#5m*-ZAn--X z^1ye24+AR#9|iUVJ|<1?4}20>N&l`2d>U9C_)p4bfi;1F!0RXHot%I2+THGx3r;#t zXPwSIopV}Ddl5H&zWMVb=N>&5eD1Mx6MtGzXZ_`>|3=M?jNY=0uWo&P>p!<5Z~rIriQnT~ z@vaGFP=;k}8K>-s?>pb(Dh^eGt)afG=WDOme$ceM>BFYUlWw)#ZuyPYmeC!;4tyxgP#M1mJF*>iN?g?wUWUt>hp9=pM?pgR9)ynN%xQ{e*Db?`>OBrzD?A1y1!3(_pkT5R_8b}+k3|I%!2Quht(mKn!H#WRUxZAy9;f6&U+#9cN z{+-xx7H#=(OYfG&Tg22Ca?MwHL-|9r<{0t}6$}*)6%7>+l?<&MEFJO=l?{~-RSfxt zDu=3us)zhTHAA&Sbwl;^>UBHU@7%ESkHK-R?b zfeWM~7Xz09mjg7lfop+>$F2u%1a1ay1#Sm^3;Z5fe)7YUD^7lN^5c`F>!&FP{?nqzxJH(Jx?fhQGQWD8gt^(+{>?%uFSjq=aqX`{<`w_m1nL= zul?iN4ePVl=w$4*=dL|}?Vs1Go~Co~H-3J4@r}0$7l&_Wx<*_(3;tR5LfMODXMMl= z&igL-o~pT4f4%wS!VRqf%XAvS+j2KhIJd((~NE)p5+fW-S-9a z#e^?DC3IN7_4A=kLz{=b82WN(%h1-LuZF%J`p?j|q3uJ1LqkKuL*EST7}_~>X6H{k zf8P1a&a;F98+R|;{nno7y@tKUy)kBpkS3}eQzn6b?#zc^WX+Iu?wOfA{G;}^{@$A5`E7x}CE zLejKEB+4`IF1RSHrJ5ueq+}UMswocP;;#`!N;-SOS?-Sz#m=7pNSYwxT3 zt^Tj2baJjWyQ6j1lvz_}wa==0Wx`yTi*s4xT@RXj|J(=WJ~;Ow;=HB1UhpDyt$%3| zcM;{27x5Pf7D*PZ@7>t@dGDs)&At2k?ko-Z;HwXgEI+vXc>m%40+)I9zSYaA=fw)@ zbn)>(|G*~$1?vjeeY;`zhCRfC&G{mTcBsGEa%;;5;*;69_1;kHV}A|(J#^nNGdy7! zh94NlVRo1^95np+t|xXqxohICr*^fP7Vmj`kKusyfQ)Qu%MV+BXnWFlB>7m%vD9N} z$4>ot_QwmyUmDepmX7(xD#xnEs>l3ewPST-^O&)6<`}XAS zlfR_xIr-hmk&||cDk#tPbKbf9bMA9-zwSF%rgl{$Am#r0%2NyS!ys`CgT%Cak8WqpV}WtT$#w zzVhg6!nvZkAvAuWb03ya=5B7-+;CzZj#*$@WL~6Nw7qw*cc}Mp-;usk{iplGR~}gX z-N4Ae-hq7sV;jbKV^3|ky+ty7&yhVW9hMEp?=tP$x%>S+%l0(vZQR?mm!g*gQ3uoq zK05f_4;1eox_Nxb*n4A3$KD@XHuk~T^05!cR*Zc#_VHN%*zuF2Cj%#soE$rO;$+^L zq_gGcQh%kr%JXks?77%`@rTQYFN>}wr_XtM*R^l1?YOq{n*FBZX4cK@n>jbfZcz@( zb;#9J_SvN1$^MSoj=GMvj>WUyp7qYG1maOnoXgD5U6i*dpY-Bb@8RAbsXOxVK6w91 zzgnwWd2scqf%I(F*h>62$pe)3bs&#mXiXYA99t1o_j z>F3M8Ups$o-t`OD-nv;w-6>uvTV5rv39g&cF}364S^cvcPyF7Mf z?CRKGV`opEJGuU+pMHAf+{H_TwAaV~{xjEyZhm_65{(aG(C>7TplohgWX;676HQxM zXLQW!SUu~rS*3I9XzuH1Y@T`Nm%hiAKKtoC$75ey|7!AZ>+oB9d-mRUf;pi$ap~?q zPt=~ddHL35<5lH#)%Bb7p3N>z%{@os+~BpeDqZ{d7qf>ao_OlS(VS%buS6TF1XT2t7{7PlTQ*B8`~7=-IUo9#Wt9^JMMyy6Zds z*!W!gT+YU&yOg&cIW)H;n%>8F%W%SYf@)63|NFnKk2TZpCXghOB#|VOq>!YNq>)%j zGD*h!EILTWdo5;@jQ3j{ua$L?jMvNl@7{|ZdOY5Hv52IUq@1LJWW0`cybog)Ni~U| zq=sa?FJnDP1Ic)uZ8OOvk`|Kjn%h>AHj*hM<2@VONyh7Nr;&`;;=WAs3dwjq?!QSo zNxDeplZ^Loe1l}XhvRsS?jn-$I^7^!oAMkZ+Ux&;F3_ z(Y62GBXSu%{(xjT$%iB>NIoL@Z@nVNHI?BuFuXQ~7s+rH3{T1MRE)5m5!N!oI!4&Q z2x}NY3nQ4!2wE9I8zY#)2&OWEc1F;_2&OTD>5P!e2ziW<&jk@uAkx7 zGdw=St7dpShUaGl;fz4S2&9Za#t0%9ft(R27=e-zs2D*cBZ^`~YDT1CL|R6qV?=sJ z6wQbXjL67{Vi;a7!^>fKE{5l1czFyjpW%5Jo}1y7FuW*+XJB}#3@?S@B{IAuhL_Ip zG8mqX;bk(s1cqm1c+m`x-bBan^b9YV;iWMqE@R>`CO%^lFeV{m5;3L_#uUn!#EdD7 zF@-ZG31gBnCK+RjU`%qxq+m=+#-w6Qk&G#dF{v4ohB0Xwla4Xz8B;W4GB741V~Sx+ zv5YB>F~u_?E+gVGB0eJ$Fd`u%5;39>Mik13#EdA65rs1%2_up+A{ir!U_^38q+mo! zMxKZfDQGJFlgS2O%5hEG3LG5iFEpUCi&8GaJOk7M}p4ByP~ zO$^`4@Y5N72E!LHd?CXZG5ipQAIk8>3_pzFhckR7!&fkTIm3@&_%ensW%v??uVwhr z47Y>fwlmxohC7MjPG`8&817VtJB8skG2F=vx0&ImF#J@8Z(;ap47ZKpwlchIhG%DZ zSq#s?aJdYZ&u|3{w~^t}(=3LY!EiGfu9M-q7;Zkpbu(Q0MGM0tZ6WlF?%kWwl-eiVH_Sneqni$?BhDV>Ync-O(9^HIBhbKXvfWwt@ zxcp#l4RT$`S7T@tL`H+I7DD17v!-=aO;5E2;AmiZUTp&0lY@! zDS%f6yy{?X6U&bTK^h2>L6FW7HbO`eD-@zohe88{B(lPA6h@;^3n8{(VH$)hII?^U z)j_zN4dr5}9>T*gRD+=gHoOKRQz62E;pLntEy@!iG6o`3P@aZrE$Et2twgnkla#|r zZ3o>Xh>Lwn$0ePxmQ9g!Ofh!xhlYut{1UW2U!x6S~gwsIagm7(8x)H*xD7Uf-5vq-7P-3+S z!u6nQ!&Dw{ZNTS(AeR-&AjAbBP6)}xP&0%ZAff;wJSa~G9evmiG(WeA)Nk1 z9)@}#+!-wPphO4}(=dEGM9_$JpoELz(>PJnKrUb1=yn}zavRy`T?WFtP%M}b~~>Oxf0MC(8w19~Z{i$QNhbrI+_oMauV zp2Di9f?kg5TvV5%+6(%4R$T}BSkUX)7#$kY(2xXinQRQ{Z893H5SI>dHjZ71CI=)b zAt?fqq-e@SQyQ9bASoOydNgIB$%!UAo5;gdIi^a$V!~7@Skyt>49xUnW)0ZlG1G^c z)tFfiHUrr7K^hI_G(mO}=8&n@vL$ht-vBNrTat)HR@Rrt`kTQM1%)A4p@d=?6iczD zCa5$5cuL@Lfp27mSr9TE!plG|LQ^h!>ADJpGUOM5PzORi@(V#|1Ys-)qk+IJGz5jU z5E>4l5(uBni71EgNkB>)-VEXOAQz(~0woHNOF=FHxeVkAh$Mijg~(=ztPWPWP{BpD zAM{B$K4^AMat7#AK%b6=JT$n8au(up(BMQvE}9C_RDdQoBt@gC2$FO`+-k5mz>AlD0om!0orXE>L9udh6$B+Eu>Q$V z+=MlCti}N8Wc6(rTEYrxHVNX2At@R2rvgt8{3PI~Aio^OQKFF*=Ap0^h0Q2zgYapn z5OQKn5J{Rqck2OL3~(m_-wOORri3 zfTUDNBI~fD$&aR5NJ@vK3^Y|?ssU5=V95iE3sd93k^?pe*mBUu4bBcjCl8$ha20{8 z7>lx5Um@hnAzuj|4SJ)%qs0mhR+d9aDU^7DpTQ9kV3PKxVrTj2Yg`y|~LnmQq3rf;iMGGoatfCneO4Nj+MvR6=G))0s9PqPH6b7LV z2+hLKDHz%Y5*dGXc*G$7xN%A zpB2(r=`pk&C2o{tp@h`07$rq0$pLa+l6;gDqQnLA0*<1<3b z8o3+?#bE7dXhk!R<4HiX6wP61=0Z{qngx(Vc#?}|86=TL*)WyJ?Q6hN%33Qi)q<&6 zU@61YOiWD&O9`fCqfLai5Ojv3O~_`e!Il>!wL*42WII{60i7X`of{OJfJOPN&&&GC zutE=o60EFb+l|0?b0`Rm)?#W7@Dfo$1D=Gua^zJ2zW@b16bL|Ag#s=JtAhnXB(E*f zpje3XSjk)74&YY5amHlG-}kSF``Bf(FP<;i`Jn= zhsIDe^3fQAMiCmtXjY+FiDm_wBfwGzmU^^_(J4h|IC`VetB0Zltn_nI5+JD%ZQ;N# z266%8;9tWDNk)n>L`D=vvmz0S3_u}-h=8jiID*tH6(ngW4r9e46pK+DiV{CcYEe=H z@>+;0L`4QFXj(HNs({tf^u?hj9-`yfST35?kW_?b9h&u+>c&(LSQ^1rfHn!*WNfwx ziweroVkqIi&GpjgV0Peri|B$+5_ zWR*#%u%m=jB?+RQn-lrKwgvLz}RR+;15S@zV zXiO~uTM_UqoNz+sNhnsLI1(fdRvf{KRUpaYD1@vuIXHr#fHb)RqI{@Hh3GWYq@Yp7 zCRU-@$np5VR*betbVhKv(}COyzY+xsmghqr{atbg(?B={1!PSfD3GIoyl^uLB2b_N zkpRf9#Zf5MpeP+Ac_0>`CL>VZuq9`diECwXGD5eo8MX>=zsVLTgd>TiSjbbB9 zzbg$zaSDp{D2_&P97u9FntYIV0NJC$%}NQuno-Jws49@Rpp@J}14;!TZ{=tTK_NhC zI4bf{;Xy?yM3J7Nj5ok_9b26G!!7>faG}q-|Jy2)zP z=oW&@hi*Y|z8G8;Xw$R4HuRdYsEqYB2PI3OP>x;`dgGud87pg`qz(AhFm5~9oNxz9 zBTy=5r8H<$A-Wumblcf%x(2M_kX_0NsY6i?ikv8>xu&4K9k~>cWFl`8@|uy?f&x7X z)F6_8ND3l3h{92n3t}ltCMlMHSc~Eul&VlfdJ-NSB1175MK(w(KpX-RA4sZDY5++i zik(1sBBuLMqLjQ_HAu=q5ebSgh-wFg0u*|bMuS2M3Yz^6RB}<#4r&P}PKin(s3Slv zN5vF~nvRM_PzzB(59ky5K^=ygI@FYcnv2Fnh*zM745}J6e$-T=rW~S4TdGjgfSMAB zu0x{@jhPUyL8BFoX%HU;@zH1`^T~jCnq0bKhWJ>BPlot7h);s}c!(#^AQ&&<6i`Gx z1(IcuOgQg^qz*_9fn-tu4uh#-rHJZ!VBt9gEL$UB@9AJqD}>Oyh%X5;}EgO9Wdp*y_MW5oQzE8X>zJva2Dx60*IJU4d>X zxT?^tM7JE>GH}&{s}bD_a8;r^0$feOh0Ty}g!~xvCW9vqy-93?01A~@5eLNztWL%1 z6n07&irgrTLuo833AeLR5CQA(XB_X6)Vgj zison~5T6O-C{Y56c+iDIbQ`A0&>4f(78IAFG?k;3b5d#8?QFUQ_>G+K297oo)X|`h zL1Q_l$uUiVyf)+!n$de2Kokq27!bvQI2Od@M7*px6UF4$+EHAF;&PC*fmFm%_)uy^ zWi(1Hph)IuHK0ffj;KRvIw#JKN;N9=sMLVk%!$hc0}nORA)1t}9koI*grJtkNo@uL zmy=~=V@o040r4(~&xiONh|hv}55(u9u@a3wh|h*(Et=~fSqaH%Ha!c|lwdW1H4$wN zwAsPVWz(s7VmsJ6(3TY>BVXSP*>&iQLpOcJqdPVzb~5D0L4G`V5}?QmMd@ry9ote1 z6uH@)kUa^+382VeWn?C)Ksgq@nN3P$({sTt1d5$0sEh)CH)G0D}x^W(~1mkfSz?)u~V`1%rgu=};R5hA5=bHmJd1217VdQpnf_ z@r@8qK-z#tKN`tG>mj}d;;SIO42`uAUx>yQh^KM(Li|*SFM;?XOrUsUGQ<~yiH6-5 zoRWhH0yMW^0y%oJ%2+fL*fv9QJens#GJ!B5^K>*%#RMKCXHwT8Oc0{EkxjBdaw-~| zAlVk2;s9#~n_i1)dazpA^b)Yrd}%OE4b}p%<_7WWF-?nUG=2GC^?)@6tT|vegPnXj zIoy1(Yrrl?TOOwAz#a?sFt8iZnF@9l*mYnf@Gk_r6m4Z-j{vDd( zk`<(IXbmW;WyvFm8ct4a(qQWh2|t%1(*kP_9NA1L5spNI`8Zn^Xk30_1go*u{!UQPcv`SdhkpG!7J1 zp!T9N4Yi4=O+alDYE58B0}~%(=t}@50VXKfq+(1^VFE#i4bw8w=0{sKI%%MCz>~qY zw6Ow;bJ|c^1`0naGf|t0T6#|ln1q->vz83@6tt0rWdg!U{6DCCh(j<%YOln9}HPwZ~-mkPfWHC~pd})jpOp#zRV2lAw5nzgE<7oUNFh&U``Z7Z@VMr<@7jp`uAvuqeZG+@o zOi03nbWBL&6vlzI4%3P-jbNc3tR0wEiD?821Q&T=ZDNz!f&}!V2DD8Ay9KP1(bkH# zX>5)fZIi*C3HA)MO=WYWV9x@(3vKP_bb_5+fECHt+Z~uz%I3%*M+rGvbQYqs7;-3v z&xIWFi7s?{ASW7~dFXUQjtbpQbZ4VGAKfl=Q%0g4i>9I5jYU%+-wqxddh^jsD;hU= z99WUcHpE~>8dg}bvKb0>P^g6>J62~vu@?Qc=&ys43J`>$zyYF?V9Jz=>o6n)#BISL z^tc(MK9J^tl$4|dq{Tpsqp%QA5)?FpQVE)H(1d{|5|uRjlTq1#%GO|Y3eaL%OOsdv zh8EP8A_0Q77^3-Lm=1;pFtmXw8%*gy*~l2OFEZ5}j7hy_QeVE|HgnUf!KyqVnYA&RUAe|5C;gHUS^bky|Msj@i0*u$Q1+ z0Cqy%a>yY-E`^*}$Vmv&iNIxtTnReMz>^R8R7Xf4=|*o6R%EcvF08geu^vjMVhF{$ zQ$dpp$&)}@jnc_L3t_Dv#O)X+L2V6)r-67nE6d{OD5fGWQxv3=qMKIelo+oDr3(2X z5S61KheN?|h>8`pVu%t$B7lrYT908ekk)}R5|p%hnubyefTyymbR2iG(?O%a+1+a z(PKFl3xcxzSZ&9UNEGCOs1|7-L{!6(v|xyi4Us{Z7{UY)Cd3duhAA;D62qcE+Qd=% zK&fG69+YuWIvr&^l!-X;wI~Z=Rd!T`a^hQ1B}SDHRpF=#K@~*;Q&8IqMjE1aj>U`# zqD;>{gm6MG_n{3au6s$)Ci(_5H-N~s7~fcxezADkZ1@~fOHyA zXcwlzFm13ziK+;oct)836bh>3piB%_kXD;O6AK#p9*-&&XktKP24f^@r?GlM5-%7P zV3dQYCRm*pOe@5gJTR4msfvxG>1YZzrv}r~AVm-))S!ij7Sc%#q*MA=1?gHykA!q3 z*eltb0vwMPsvsu~o%O*vQ-hs6$jLxAU9kpJke{o-;;`V-w&2osDsROw9fs*ySt(Lf zriwxp-OqGPXuyOC2ejyv8gs@1E@iEK@$}~_~P$mUsD#|3Nibfq5 zReDruQKdtb26cSYiBM%god9D>F{T7#3NVHutH~JSWs_4df%I)MCQQPFHcTMj-Ga0$ zX9+=z2*-n*dZhTr9*@o@bT&hd9i1(ZV?!scO6t*Fhs6>s4#&zC^fzF27AVR0l|yfykr$n2GTSYV@OY?KzbZn z!q6f{djji;Kz9?mo3U7i-YTrlMoP^IN>EVBhG-znfMH1>lVVsZ$Rr?>fzpXG4a%ZX z7KJi3keimNP!@|a9Y^N}a@jI1%Ji(N7FDDJR#e5I%z&y`R3(DOf+{oWlt>=Xm;^=( z$C3}mRMe^2xMI{rpiT}(y5}@jPvabgI`To2*fM@24whm)xRGTqoDkcgrF_cpz zg_JNzkzgVp6S+aOHDDnnF`p!Vf!zlr2aOg<=4^ z4P7F1@zC9l?$)3j3 zP|DrRgA^&7>}E6a(C)-y4OY0ZrWr$$Ff0RP3X~WCE?P&3u+}@+oA_`Ix9i7byn0AuZO? z@`P4!;b);7o)Fq)V9d*e_ zA!{rTbyn1wFjkJSQZNfJR*118j19rqaEz63a!T0b5=_)#Vmu}qFi`_38cZ}}ViG3C zVqyZM=rNI|FA**DMU$9-mSiN{v!p|MGMiD17P6OCu(zSzgZ5&ucYu8=+6fBE(4|C| z3|$IzMLCjGi#`2q9O49uayQ&|8PzM)cNWMFAAXV`Upw zyRdR9*0f+9jUmlK5z;PLVj2+IxU}eM=GNV@;Tt0VyOw44-BUniP$u68|$w5nDkVt?QH#qoUpN94tuul(?=dn%|+8fYbi>_#N#Y2h- zT{_4qgq$LD#X@d8dI(XC=usfSg-3?Pu|XLg@KAN{Wc0RR1$q2ptSG_C4y7z-&$ zY>EIM|bW+T^SgwQAfVakGc|!%>*;eQ979Evsi(0o3R!!(_FYP zHkFN6KnhJt8Ya3SB@0qAFfkueteBX~De_|?;ZiwTN+3NOEv1m|2ofnFo#v|&Efr`f zgLHxvnyC(Ogrj{5jw}CEa7fXW2svJKB|~mXP`nIjAI%em9yJsup?3;aln3QfrihMc zPsb`Ql=SfRv;Z9aiycng04)+ z@u5eD9z7PPU@@ID>A)%;2qGbjuyHcT(trXUSuLn|Y$SPvdel_|C4^(MF*XNd3FzoE zI?xjh`IT%q7iDCC4WJ4|Su0SmBx^<)-7sO-G|)_9=`4+^6;YS ztui(<8q&+qDo3jjtx~j1VKZr>i`dLWv`WxQ@jxr2S3r6tT0_}PH98{Ep$CTo9U7#m zcWA*8g$^A$qR~M=jX;MH9b#}0?zveHS#BY^2=_`^&op$Eqbmz?YS86GS1!8pSkH8H z<*)^Eq+K>oCVDJLYaEXma?_CV82L5mF`>sA6d#L}_wb~mCyw<-BBefZ(;?TwdgHO! z$x^N(zZ#3P*vbmXuZ8?7$oHd%*8bD6q6#Z&u%ZqMX_ZtBh3QyPi50a_j2|4pd5&9 z8kqBeB15wa%z0oYQ}QC6cSTI`P-G~Z1}ZgBlo%<)ND*lHp#5JI zUFT9VTM(=X=ue-4oD@(N1E>T^OO_-cL6V?g_A~3V-@a9pg$fJ1d(O;sPoF+MHQZ{1 z+XA2sG=1up(~z7xH%d=(x~p+ahq;`sG=8t~7mYv2 z8Aj7>qFOr9Qe4VkT1s20O{ut~VwZYU>!#F?wVspuiPTT^0$1M zAlQIZBZ{d#(f*ZQJWJ<7I&JBC_3B!$rh2v1tI1{#qYG5qljY7P{TrP*q<<^@l?lM9SZCP{TD@&j+flCQ=6qS*W5{qgyEN71j71r64#^2@a zK}@S=eVX-Z7L&cDbqvm-bgrZ`lK#D3|H|o+oJQ3T;h9H+5R&1VAp3tQngtLkWrLdC z(=5UZP6`p=OE12)|ELSAIuKp6g7W(i12U=6BTMp8&R#XUuUSL05zQWm>5xiTOLeXH zq@L3HrFN_es<30%j!imPKYl25ZgF?S*ArjE;t#7osE|SWfgn&9jW)u+7XOg|_6Cz0%xW;F!T3gO*Al!F5RXPl zjl6(_G>U4})i_t9phjcktRsgBIgHEUnMO^GM&&fF(TpWl)@VVaIJJaEQyM)Ha3E3q zE3MJuhWWQqZf>;SG~pJ|+6kW~?3!>1*zEYPCOiVtJFzWih%lcP<5m++&1N)vs@Y@B zo@h2M^}J?NnoVdnCZ<YDW_oJXM9HCtDM9dt>adK-E@3+(0s#YkjTtJMDzD zV`wKVZKt$dmchaTR=l&P{U4p}Xt1GB?$sZ(ey<(WA-{SP-hh(IaUhN(al6&=rjB0$ z5#*bSZy_j>QJcA+#Wzu?WZf^~n~U$p;>Lf+61Y?Uz97*Do+PlAz>5U_Z5UAvwj?~( z;8+lZ!JYxGj1Z8>ddbSS4yIX%~CU!!9= zZEaK#t4mv_D@}wHo!01F(g&Ko(L_!YrY542_Dk9;X+slvNuOwsR1!M0?DhTg) zT6&R6PAVCxw6*jr^>c+zrh>t6FO|GhT2e7BP}x;#Tj%qw^OvpjH!WKgG;9U0eAhZ2 z2!@~9*w%(s>!`FF+Hgw!LhFA5^+m(3^)IdeX#LqT+mU)n8>shQ1cA5V)&@>tp`EmL zj#DLD z1L%I2{)?b}fAt}kR=IR+nhl)=b!G?#)eI8l*G)8Y`=2`7)7hc)zjPLo{y&}V>jHh5 zt}Z-V%Oe>L^yXl*^DI|Mxk_0+oVxneyP>XsWqhl5pL+MbwO;G}f!^<1eoh7G*ng_f z5{L1)mhjRNLByU|Vwfyfl1^GuO-rgF>6E0;wCvKxz7F;*vzTQT)mc=)`yuHg`v+|b zHF9vZ5xbGYr5rBQ_z|$U#{X+W3Sr*qOir&g(bmL; zq>GZq5W>K_*Tg{51%NwfdNMErTw?AylpMoa`KB=??F`kN3dRxYH{ z(Q-&Cmzw?5^1haXV&XoYO1;0i_o9sxMO|0F+5{A;k1gnKcP_M3m-c~nI@+l!@^~A! zvLbE#tEtFA?TECGrM;_zm}MBz!I5;H6@lU=DVIJSTXpQ*n%-OPiaLww>{w?Bot^3| zDFc@bhq?&q>_l%)Wi*u0m0YDayUxx2P;Wmr`%@X`_5MhL&W+fM9NtK}q&d5m4>b6o z(GRH%wNVf>>wWhU^r$~;37u&0*#g;Q#HZ0OjqGS7pposZJc{)6PuVr<<{^v@sp#(oR}tZ5ntt9k=}l9cA@(P`QVZ(3{K=n}m`p<);A4M8X=0 zXv}Uw7dU2<(-%qCBz>;AeMOhNT+nh}8$E4YS`d~SeajHvXQ`NUgNhDnI^NN7Kp=Y< zZ|gWD!z-B_YXmW>p^1g0>zc!9o@=?JfZJ%bm#f;CX=AL7iFQ`nxwXuuI^NZ>p|h;c za*B#B=(qT>q5<(AW$>>?k^)J?;fE!1p^>yDGL$2S9C-wkX#`pOSB~5oIkQ9t8|gba za#6@H>%jvtu42}5|8p4=g;;xO#O5#pQUu<-ek{&9$r3u`@ zwWNEJ9tk-7+==EAnk#7TSj=0^Wi^))bF8^DF)=|F0tp$Qbh)kNzLtklS!#K#0NUkC zsoZIKq-9K>m6oqIq2MYbWi1&Mn!@v6Csq8)FpwTv?3 zQ5%TK588N^`jd9vwDT_QiZ0T6=g^Q-BgG9!)+41YaM3`f<+%cEHvVbjT?aG892{qL zk&zKpxFx;A>uVbs+`gd3PQ^qj`IO3s)SsnYlkT>3F`NpU1x)_~9V|6+u92n%{n=Pt zV@ZhzG?v<^;`W_s(kkg|NiQu0@5ba-OynH|s~;`jYk9rtMRdBepub;5-SVo9Uu_^0 zeQN_O$J^#{SUX=^m=}#d89*LC)0Nc{Dq7AA1*3}&<05YfVfl$$LmrK^6!O#~Lyq<( zj){|zIG*fTj_VS~l*wx>r%9J4-4;+x>03>DEN6$B>upT_Y3@?YH%q|~^W6fGN!6|8 z7cD9nN&p`BmF?e6?ohIcx+lWtH4YaQI`;9k0zUu7BW>#U_S zWUjU@3VKtK(Y4-Gb!FGJNAFO>W9>#zLp}-rDTJ4it|js;M=_0DDwLv;fgBxMj;9*K z^{h$!L{Z|#%#G^)MiqbWD1?cv`qr``qos@%a)qj6toNYcPP7t`!I9=xTcw3m z4|O)(ga8SBOs8$jgG%_p;=WOTL;W=|>>Aq9P)H2S+<+XJ3bp4^SwO+Xuz07kQN?-H zH5n9ypxj!Zf2&5dva6MdR8OSglZHncUhN)g_h|F%UAjj)M)9*PwvpQR#Jw+Q?zj)d z_og1N1oze7mJH(giTa!B??@2oIJ#kA^$pgk8De-e6xJLP>sllC3IS?lB}X-d^fWe< zct?|lCif*{)$Xw-F{kb{cP|C66g-v!a_gg1Pql(8aBS)PSw_clRo0bDf^jkYVr**! z+3i)18kYTig;X_mCGnobFC~tlKHKP)B!g*tqDdS)u1SpT7tOsY>S2_@z$ul4HZenw zwHcL0K%4kAwrMn_5z_97c2k?jkJ?RI<{2H2b&ObtL^jd!To)LPmwMCGn})6fy57F zeQzTy4MUrGZDu!*zomV%35k0*quun@pd{V6bdx#^>Tr8AeWXLTWnR^xU%Gke=HwC; z!nIr$+_IX481lZbiFQ?KY)-FYUE<%i68$0;l$5 zdBWXkS**WeyAsE##qqrXfwX5=u^z|wW%19{-xF{M{;q}+id8nCdO}!Jd7zPVYiX;h_wD|RL57q{QFiG#mscc9&o4kOYn3$EvIe>2_Lgs@@!s$<}(3%TsbWmjka zWKhm2)Ny6*wD};7wpIqxxRS<&G=`gzbGdM8_hs`0%W`eneU}Tn zTwrOHTQ0mhtVp-1Lrm424vW&gkZw!C#t#v8dOC6I#H*7Xow#(eEfCmDoH_~W#G@0x z&VxGN)p5KP&zii~ zJkF@C=!xWUmz#p@kEU$}clk}57^pAWeAVVZ?fz=dradGJ-0Lsx;?ACLrt!0;!@6__ z(j5v0^JGsh7XsDId|w7FUHs`Pr0b|$AXHun=%D>=Nq7Z>-myaxSRCz?%s>*`n#6p3 zl|o-KLrwmZ4CZD_GCfUxYVu189Vy@&UT*pirO?xSe`A&qEY+;cwKCJnLMzt_bx`F- zn?DLoY4b~aZiUbkBf00ZTtO?oBi)$=O$W5#haDYW=pUid z3mJ5E>CmNJhQGSB>CHlK<}!NMo29OHW!%=gklroy-YHl&+E^&SAaGfJAQwSxL17h; z@slKWEa`$|t~5WC!d&wsDd4e?!cqz=Dcoq~L8>TLAGLBX)dvNlsXR&pgXdlvcb49^ zG;XxDW9bDpF|~Wpz3<6IM0*g!@9J=2xxLrnL@@7$OX=R|aH_+(bk{mb>Lf0gw~DYZ zN$4c4lZ?)jI#0-8AmA|PIm`XE<^E0veO-EW>C+{|DmyZ=Tb_4x>Dla^T3#`1K#bqW z=u1~&T^YLCld*sEDzJHlX?US`OToyzkIMvX%!M4?NFt#5i4^Xn`cEr(yePWBSTqV~ z(|FNVNCBE!xIQ?MBkk>K59fkKqlelHTdvO)`R?*jCwZOZbZ*LEq|1=r-0Lc$>r=f8 z3;4Pe=4Qe2`n8FWnAo+P)Hh~B&EIPNM$t?uyjqHwh6uc0+KMPth`mF(IME)$&ZA%6W_z3*5c(#YRguqLkR(W)Ue>!u$IkdL&ARsVjiLJN&yoYq!KTX_MVYI?Ml zl%`9X4r$s1mXMo2RDsQqqMk+HSdqK-#S%r*uDbttZT^_(np za-oy4PP#g2%H^A7wX2hfWrY`9>0~CC;PDWgf3{}N0thf~ZK9_+zm&mxvmVxYLk24u z-0AW}Am$l`ba^bJfZ+H`taS6rD5y8T0&(W8Rd0S|g!b{DTsiaxG6U<@ZCqE!x;oKS zLRYcPphQt}B*zR5CriI}*?r_uG1pG7n*VE(Jt`Zz=pp;m=aU zJo>dX4z(JW8ms`)T8(Y`@3fkbnn!A0sksDXdo`)8iU19@uv!`8uqsWzwwjy!Sh-w~ zW%hTJ{&FTwr-=T`npLWirlj6w%SP^sIuA zINH}$78ww&Sg=fZxOJ70tCi(_TUTkzJ0@mMu5RV(MpqbA zHC@+reJWOMBZ7IEuSxzA}*Jy)q>P^q)C!IfUVvYakM5k7rzv&X_5?{WzxgFNl zaC3iQd8q6B)AG>NB}BXxU6%EBS63~)gBJvr@Z*lxwc1c9UV0>5T7a$Y&h!q;3KG)a)?1uuR9j#UE+Kv+MDVqqf@sodvfK|RYzBs(t~0;i~Vk1~FfiC-prdSBH0lHT_$ z|HhWpjb)8Bq!V3E^$sQIHl?kEB_VKhNjt>q604K{e||ve2&E4xz0X!Rr6+6+GE9Wh zV?tpGi=oVfGGjtkvbHEQrOb$OHpHWAxcY*V#I#1SWmSgcmHx&`h-=_5){*$PXI zD5Ym?J)``JoxAEEiq%GG{Bceh{5>u1gjn&FY-+VL>}%3aN*{|g#8wZbPsAFa^fhJh z;ss@{)#j$0gK}7~lc6Gv4s6u;r8M5_;QtScbBR+L3;(lX&4_JApm}W`aU=*D8+^Jm zBz`+}o;X~QqqQ8})6~bwHe+29Jaf|c<~Zx6*ydDRP};**FQxJIb}4;B=@tL~WKAHH ztTC~!#db|OHx-xSNQpZ|#T%+F$c?X^B+#DL9OXQe^HI)A`85@9skox*lB)0xaEae3 zez*7?)cDi=04F<=2=iT<&_%NDi8V~=2TI?wb&t}IlztPdN$Dp_KeN@~|Nr|+X}H;x zDE%VVqFAxU;g~YFlvz<`O_@8&+)(C`|Nr|XTeFO}XPyX4?W}if%`1$6GWV2uAShd` z&tks>| zE6VK%R#VynVtZjL9`K@h-m*TibdfE0XjR@KOGSOdFXV%0IE)Nv56cezyIPX=S@rX82-unVD4l zWM`aVmxKk>?i|B3sfc0lrp{AwSE=~Gu=y&!v-6Oh$Lu^~XOc=*Dt@su%y0uM{!sCe zo%`%eF`So*|JWI07=;yI87^VP4|bv(m8Rm0xX-D0FYY`Qe;LkT#XolD#f<}I8GcR0 zZ+4!t6YLWXg^BRYunsHUu`?%F!j*8RiCN)#U8kq>@n88`tf%=Ro~c)UUry0 zzf{HJk*c2rzZAcRy;k;OE_m6yL)CYxzOvUt)gSiy+3Tk26IK7H`j4vjgu2}m7k^~S zi|=O0te~C~_U=+MN~mgrd1@LGEK~D{cb<6Xk$3*_&Kot|5=;}A%pjO9FtKfFo=7lD zNZJ001d9?xQzOSax776U4q8Z6YR1(+qvk#}t<<#f&L4Gg{023H)C};>nwonY9#YfG zJMYvyq~-xNcX;Q4cRnPT;hh_5Zu8D3H6y%pM@_o~E7WvR)5$wu)C^P8L(OAqp7PEs zHDeMy=bazkxo1f3gJ-<+to||Yd`qy#SThoAO0Y#uzs!mpzUFXGjAQD&i4o`Uh{JR0 z{Nr$kI-eZwbGSvFcMf-{^Fv*`7-oA^ zQRkb`A2CW|6bKDj1GZOL>b%ep#O6ParWj)HeS?O6-4AmVT<((`J?s8HM~^sqOhX?- z(Q)*k`@1yUVaPo8k2!k4(R~^Q<>--yAsTMeaF?SIjwU#I%2Dt$M~WrS`%xNt8A6d6 zjD3zIaZJ-)n)*4}r>Vio2`A??-JvNW?TDt^oLtg$kFj<#5#{8Jra%e@ob1vx#L1o> zdpS8}te{MsaB@J?ASW+r8sX#>Cl{O?GM1Sn_9byjiyvBi3Zm}fOH(_H2#|lL#Ro0^ zasERx_kw7=cxObO%pJp_EAytQ2qRu)9wqaSO(!E3EnXQhXYtJWPg?wP{zo!Tj0m&9 zA79vXuxY2oHzU4fUTJM-@N7jdSI=qfP`qVrlcJxi9j>;xTA{U7iaWG+a z^8=ovmA^+{6Z)F+s>-VheRt^lg71Ij3MtP==@elBh4qBe@059=43fwx+!Osmz`C0Ce#TlwwU-&#DB^GCkGIbvJxC}01j=XRfaU$K#c@W^^2n!-H*%BA17}ao?}JWl?0?1qP3SE54fF{CT{8sYY06O7OT+L+c1}yHWRUvp1R}_KMVU{^;6{H?$tUg}rBUw% z)rw(oCf0rV|4LdZW1|d;!xCk_#EQ#Rq+Cwys9k?4m!TZWn;)?|1V)RwJmuh=<7U_@ zR;z3eien^>G27uUmk>vv%sn!9#W57efXoP)VKQO*cSWU;xG$*`WM`9|=M0l5_mJUj zSlXr14wZ24MpVKW@QZt(&Wg;cRNAAOo4tGDN0x6;4f!s?-Z0fXRP$5KM>Q`2OZv|^ z;FsW%ngtF7sF|1GT>VfuOgP}9W|5jEHA@`WW-LAmUU9(7fuIDh1@fohbnE{=&cvwE z@PN8L4zD?U&*3``KTy{%Q9BI{iCSqGAuLrk&S{D`1~;c9Cs&-j<0ML4SPLd-y3eME zO)o9&w6t*vMmkO@?$X*vYd@{GX&qq9_v$6BVR5!6wS9U7MxN2*k<{R6cE|H0UY+x* z#`gf`m?I&v!nO#8fep(1PzIC5R2znRod5UqO9~t>%>yzI$=oONi0!*<-&1>5?K!pQ z#W5AfMBK3Xidvip7AI^KuPm@UEg9@=>Hk+gEba+=4XUB!h)^vk{=E3J>M^Odqn;ww z0^-j}@PV;BC%Bg2tw2>6yr=Fqho8i#Q#Z)rN4oS=H$dGT8b&Sqw=_JW;UP_tBQlam z(-fKFgr=}w#FMBbvX=CM;a!%svgx;^r;_=TVwkG~S_c_ae|ei8quejjOWM+y@H|SN zV{#*aq$vXof)NXd5DxZD5zWc!W5L zRGZzvs@NKU*e+$o{+jXt&RGKQ1QLs@(fa8sFbsM|3^5#bkP z!hv&6r6`p!Lh$^WYGL*sh`*?zIW;Si$g$O_R@{Xhv0kcmq1J1$p~A-(4zeBL_kf*U zaWB}}WA71r57`@IZI?VZ0e3bkLd^p2xQC0%FDG>g)et>QDfAAoR86#SY+!kG>K2Ep;(TTM`AX z#C6V62EiQf8d3(c3HTaLq`0J528-|ln6RSK2|>AyPO-mAwTSpD;xBJRKB##vi6XbN z^cJIZjSEF2m zau<{vh&?Ju%65b83AUdI+>%X`VV`TBkQpcQg3P)&;4k_oj(=>=Fl=?rB$;OnH(e96 zBT8nQ%nq4&3k>=k3}0MWbvfS2%!=ci%o>^J{67+`kckCZk7Sm~Y%tt+p`U~Uv)N?W z@S1rtGvat*`1hJ=hC{EJ69+IF0N{r>Uc~{pmtuQLpjLGPC&Ee*B?Nppr{cb6C&-Fh zDj^X7C;_R>*ol#IPbK7qS8)S;joCRD_dj)x*m=X=0+q__MZ!(6^O{P4a(JGj(wVrQ z*g2t6mP$n`A-PN$cDSVsI|u9>sS~LOU~NsM0y{6+c_r>gaeq>&L8U6g6c^SR?iVTn zq7JD9u=XJCcPgc+1XPH3!HV`t{BYnLu-9ZSFi}bT7vk@-H%_%jY}Mny88w0CU{!~7 z2^fWv3|Q%l19=V{b09%Y)J`)FoKO?xO^O318^Ccd96+6OP0a=e;*4djL4ZWq;=v&; zz=4QB-WEc26y5SRw*slH08%y}+f)`-F%VIKi2!zRC?9om)J?NtrEY=^Cv^ePfWrPb z{7cOib+c@sj=E;U&sen-dM7mOj0GFp)P;)anYyRcjj>@TC^tf{j71{GC3WL$?1<6f z@H-oB>ZUjhnD)((z8DiR#?(EdZj#XXH7+EINHWvViXbO2kS2}^lJXF0-4hN202Zj5 zVZ%k;s2E-99?9%NW^Gy6WY*#^a32sEJR||TPG|@))umyRqkS3zRkdiCreT4`XA<3& z=phaB9Iew3e^1iT^pb{gjus`FqG6VXZ5q}&S|+qIqp_`{CmJ?rSS55h zqd|@~H*#KCpzJy4rn! zA}3}!`At(4Nbj8dzurJGFvzyry8 z8M!;VPs?pV^j?N(2?yE>$@~G++`F|OFyH+U+&VMd8-w2p9f$<+x%kbq+rF*d4Pol6l%9&&ZY)u|L?T)mRw8Lf|` zn2{pVVnm9^v_6y~>|ybOIIW{xy{1RJa>4DYAcnxqrv|*4<93N2?dy z#r+2N&$(Zt7yP|SFQ&F$rD;kN(Dj4+W$st#B||R&tvQ(uWOm801G>1Rw_~~J@i@=p zERTykMiZyQ;~b9*a?zCw^nLpDvCZ>Sp2z6}jD4Bs37#MGJjwGDdV{Ojj-bgn-R0$q zmv{6zz@r}R0Ig-ak`pY>(vqR%<68oX-iwLxEV`kK+#HLvQj@bF!h?;z1k(07-< zFX_9-cRBho_|eeYwBDZ4&p@u87~uW!hpj%bzAHG}Y@D#3<$uEVigF`H#g!Yf%_aZm z-%GZ`{C1n|`7JxlZ(U?|3GR+gzc_tt&j~gufE*gkq0=o+k9chCL?!~G_(WJc>HZOq zRoveMgEIe|{|}5nE(?N|BjjcyNZkr`Yiyv>u5uK$Uq^toqi4Dg6WTgWYc$0?^+=*l zOAP)4T4L-ya=Xs$a~UQ13D7Uk)+4cw*;-|5O>FRNe^l!e<))Ndu+6J*xzEihH)B+Z zIdJb2u>)nKC^u%CPwa8AC&;`O=dNJK1am6bVZj`+y&z5$2K(Yf9at1>sbG%9xx=vN zHwSD-ky#@1ip&X_b24XS4%v>vV^5q(ai+ux*T+L~9>{F8WruYz3SFe>Kk+yTZdV>V z!Qsl|VwaUlJt}qCiIU)kov-5YuoGPCJ3HUl`NGa0cH&}!-38R`h{vl=v?P}7{HD^7 zT{cBI;qkHaQ#_yu%2WbCxZiSxWp+ii3VT}udv^bly_e!&i+>^hTdFnLi$o7E?kD!P z*^A1y&tBy5j`$zhd%@m1dx1==;$Kk>aHGavyk#K%JMlk@|6V;;Ti)9(FG>hh)bOgs zd(Rnb9z#A3G&#`a033`%96-9PODM>JwuBBj(4!`JPPmC05{hsDZ-IYoSVA5NA*Zi6 zP?C_JYIQbFIM9*MJ_q3ZiA;LSfyx%v?uGUk>-&s*F`lSXp*)R#}EaQ!hDs_Pkn{1r2fl}m-x(zmviwkU27^LNF%-~386PZof*j0Ep{h#1q zDxTr!nxiWkUh)5K%sCp4X$TW?)Ngi559}zjgGxb@Zpl7rK9^`%f~ParA~$ z0h)r19MZJQpd3@XjJ9Utf~F0c4j6l9OfNVUk_2AUqG^+{U&ge}@Onz%=N?V#k{C*& zFNqFK`jX13<$79PRvLa|H?3Mfmvk}ug?om z$uh=fMY2iB!tgf1WQ^oS>IL2>(NGAyKO$V$jZ zC2sfV5%8+PZMa(_WdQG2xZjaxiC&O6y7W@w{sp}hx!Ws}zmbe-?*)N%0OAR#R5nH2T14aX`0Wka$|EJ(DX!p46>_shoNzHr7W@UcGkiw4Y z^o4F_fpAqp&Dr)ThaTUJV!MzM00>O@KdIZd9N_MxBr&4p87-4iY*4zW|Mv~|C}U72 z%+?rXfGCq}t&0sPG9|VHMfcE#K43%aXm_H!w_*TTw5wp*YM-$ET%G@@G-a4kIG?FB zrV^kKI4;CY*y;vlwxC*vY8O=N5;W5OANJw}GpeEM@jy*jf}_I%G6&NiV(A|-VDs*x zAtu5bK|dC4NVKW@sKl;l3aj%mEi<%Cvw1GrJgrePKzs1b;}YNH`2mz;i7=9FK+0(b z1kNE*K8hVgN|66=Wj?Si#I`-Qp=$}+8L0=|$u*-L3BCe5o0u_AcAu z$bCcREt${aEUFz(9@ySudxNl&0(&|*8v+{E#B0_9UeOM4ibM<)4EXs(<}2IlZ10h| z5)Za42~+8Yu-wmc$gU8(yi|H-m%%P4!&=sp5pde2CA+{vU$bk6T_7isHBQ*I$1eE) zAFvBo6&dQ4N-K6n80o_UR{W7l_w4df>5g31Ae9~kF|rBiAG(+wnqE*qfStAtKD07mE^!4NV86Mk^o zUlPhw^G8B;-G&1{AmO(_HXMPqGIAN<;gy8S8~aFMMGgS6T~K$(F&7)iL^l$F8^43P zGl}f7v5*K7&6K($HXhlyV(erQLCphXcgMz@x>p3bb;QTUEgN_eln63QmyLTiCX6jG zB2hMwZXOtL(x^-1h`RX185>V*Anza#B8#0%1n6%r5oEU^{|^lDFBn-PsjaCCw`V^a zeKtB0!Nvgw8}O6g+X}x(1a9r%fsuf)7Xa|x7sqxuX5| zg*b+G9`N9&L|+8hF#0V~;8T3MjiY}wL|SY!d=LJA0S;p4n3JRLoJunGX_}%Fcg-ne zy#%KUoXT?Qlv5>6op35mQ?%`7G@WuP#VJ5AO!I{#7MzMn0`CIQi*gDWZOo}WWBaEm zP*_nC$j;c;;8tc!nccA2qGf@WCM}C>j@i6m6n~YOa>oTqLQUuu!ID@P-km87IUT(wK96qdd zg!^N9fs73hsV~hcJ>vPfG#m5=*IbBQ$8s^`F|bUQ=Q*C|>2sk|tj67^Pprc|;^l+% zqr7VKswG1R_ELOj@?C)+9E>j5)eEJ|l&Hrl zDAXTup^$=cI#cNx^m!xw7=8D}8e?liu;W-3jiDyx-o*}n@*m|OT*2-M5Pp1-i9Hn1 zChL<4S5hb22kbf&Pl;XF-2+q}O7t%({ZI)++%J`21z!A>G;vKwW^y zfCBZEy0B*lw}S}|N(arITZzOucEmBXzwbE~VYo>gIB59DF%U8+ARjn(AW<+FV835E zRpnGo641DU62Z<3_q43g5<_=R%Ni}4Y+ln66XBeefM8Wxq9a`6m_cjwk+HWzn${Rj z3wp#TnsI+FklKz~^s!5yuz5j04u}kWSX?)3KmgbX>;wLA&4CrQ{1QTu50(kM7V3G_ zx*%>aR+0L#Qm9eV}wtYc27AWbHY7bOHQoE;CfLhxUf(id62kxi^u5v9i zoS==3H{Fd$1pFKB6wLEo5(DXnkc*NSVPQe*I;|UwuHQ?O#}&p(x85OrE%_0eIzMHi zY8z3y$<_{AFBH0_*;?$N(7)Msz&4!bzS^$Xb|m)RmJMJW5cQhv3$=go|8>-i?f7*{ z1$0lY#EHL*sbHsqgY9#+FR6ere6wZ$*|L8K7-p9#9t`O-#P+(V? zU3qpTsqAJ~j>@P9QtZmG>zG{$c9p2?RacP8*uDg?G|sLfl^q1{P;B$$8HwjYU50o% z?AvCalYM^nIoRi7?;m@AWIN8j9rpPcE}+{nsy(yM!|=(R-LVg?(qHz1KzL%Goqbl> zK9=ni`)usP#t_&mAt~Eug6!M^kem|yUD3k|;HCg|K1ygtErSD3x{YK#rq+RkCe#A< z#7E!-$ooTT?do=)AR6CBZScT>7iyua^-kS4i4-N0mq?C{4>o?-z`Xn5h+QJUopE1v%09WaFJ9AUeJ!lBMo9M_kmiaRd)5_3Ui?QukLP z*xLo4Rp9??h9*ZG94m6H&M`p6H;$cgtiiDpj$z(a`2Wo;_BnRWv4Z@cc~cx~axB5I zGGiTX%+0Zu#13ePEgO)mF}qtF1N-_au>fPmD`xKSAIH)h!^Re2J;02}>H#)n*=6kY zfV`i==1rfHwCeFUrvUVtlKA0NTM}QKy5v-kU;=rJBg8octcMc%m!{Y#2ayCY@IsHV zQ`?8k?iqD#w$CQSDr?Cij6jhB82}>i8=J_jcWf>t+a~B;&$iiI(Xz)T6 zyAplF*5Hi32YgqgA7s4{KfrNfskcy^9_#q(PKpiY9St!)-Sp}V;{CR%E&f&_zz0=*a|7^R3U-L76~N^ zda}7+%m48cp?Jymm0;UMY?t7$vwcl)gz!wnGiFzn$^j|^DO9NJXIG8Tzb*#}U1lVy z+8g@}_U*E7k9}eGp~?P_18*GoCn036sDzNtuw@A-zFP^Q^u45>hhd@;=~B;4JumgJ zYZa={9u2=Z;IHKFN>Q>fNP3`^b4PmH?guJp=WPLhGH)4=LW!@{(&&##SK3M_ONS?TFSLT4S*Fw<<%K;f}v^`yaR8 zxOTw(CB1aHzu@sXkHIT`@Vp?`@07lzY?<;_2JXv&xSLWL+OV}iVw6E|v_dt&?O(B; zvb85R^pP*cmS^ldb^SpFP@}+l_f+t+{f_MbcTei@5LUc8f$#399HH_)!L-%`Ahw_~ zuH+HHz1FiNxK(fG*>}jkDEkiBhj{o&Ef8YBFUXsC9^=3lwa~6YduzqMeMVs)32-FH zk!|YjP!B(S)WaXKHP~1pFolj27WKpu5<8`ll}5IWe1=ALPN71cb811;dzzv)KvjV9 zcqX$~Hh%@4Gg;KS-;9*8ykcYxq{SsF;U6}?7+G?Sq7=*w)M9+45RFRoL61GE7LDFf&>jart$$5fLL$DgE9%Z zpd{Nx3Efk=Pni?_U&&Bq8}_h!paPiKXYn9GpyBvU%L%0iVx5W26#Ino5D`@*mZB-N zVd#>dQU(8r6>PoM$5VnrHxXyl?1@)sCLwBBxM`pnoi4%X0Taju~~G?gsQV!{Ovt;bS)rsZ5_ zAADis3oE?<4@hB)C@T{U(=`%xKK$Rhzl?NVTYT_=nMR^!$H`<0-T$}#tx@Azo?9s!9OaW zu>%=*qX1h`IYZ?FmH(sYI+v1Zm}O1RzTf%j zHK+)ZB&c8jRI(&plpq;oQBV*R5#zO=eyS`A5f_x*neLwH8A38{i3-6^*fx~n73?o! z5}R2DW4P&*Vjgx1H4V5*V!B{&NwFX%KklLwFQr(5or+Ks_K6hJy8EFX-Y0$|6zoYc zqq|>log2;+To=lwYgZmVVlWl3b=m|pderw~Um6V=qy zhARzMTsS7(|7Wm~z;!K^ID9-HH;%Dh@CR2CoX+Q=jMEp>FO`ItA*t{|6F#1AWOi9G z55+tXb6+YMxXMzw6wY9G=HcSPL~1n*hTrO8jbJ5>2z+*M7La!bK2oQgRIYIthHnqP z9cjeC*-e2hsa#2=2%q2ZdcpmPUJrZ@4eUsz1fN?fd}+o{X0fGI3h?o#K5)`tfGIdH z4Q{eqz-N<2R1aT`z>@~JreRlTkqdAeOe zS_Q?T!-&uuNbGkwlLnC_1O64rI~rMVq2b}DG>X#oN|%_htEY7w5-TztC-jiWbFHTh zJuT|tQo0NpgqQbn{~_H2oIXgGc;gADW4Zs7u3x(QIGrfp#wj0MNcTkUzln|oxjQb zTDnB4FUtSG{Yp;p z{WW~sa~V1`J^LSr>|N}F7hRf*Z}w!kC6CmCK9F;3nj3Ija?ix~g7}*}j^zFw@n^(| zA}BHa%8*ri0^oNYGUfS@^Mmo>`2jhWzxjL?%KzkX3SQ=Uc3F>*V^N-ncYz#f>_i?} zL;peU2&|($52Z`o@(Kou=O-}mUb1d(X?h~h6ELGOAm{eL0QJbn@8xl zD9_xI_9oo=%4n9`*YuM-KjJ$6A30ZHThmKr4>OG+*Oae`c`i^RV7`{;x#qv*c_wor z=OWnB^Gti)3bh@*=Asi?7fC{2!4d|WerwxW*ugbdW}JfB5r@L%*(m;IT=TDcm***J zHknh8V!Jrs;R39HJimiw5%vYKpJz@4UPjG<)|1Td^tumPp|9^jNA~puE$+Rg{L(

    rSN1ou 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ǧ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

  • MKNw6E$75n#TUec#bvoH9<&Tu&Wq289hOUC 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%0D5m~q)celQqEeUqE^4&+k5Pw1|A=a*YN8lM5_P*@ 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�+O4 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 I`Sx@D4^8qsJ^%m! diff --git a/vendors/libiconv/iconv.c b/vendors/libiconv/iconv.c new file mode 100644 index 0000000..f4d99c0 --- /dev/null +++ b/vendors/libiconv/iconv.c @@ -0,0 +1,610 @@ +/* + * 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); +} + +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 diff --git a/vendors/libiconv/include/aliases.h b/vendors/libiconv/include/aliases.h new file mode 100644 index 0000000..b68ea2d --- /dev/null +++ b/vendors/libiconv/include/aliases.h @@ -0,0 +1,1719 @@ +/* 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; +} diff --git a/vendors/libiconv/include/aliases2.h b/vendors/libiconv/include/aliases2.h new file mode 100644 index 0000000..7f2dc44 --- /dev/null +++ b/vendors/libiconv/include/aliases2.h @@ -0,0 +1,40 @@ +/* + * 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 diff --git a/vendors/libiconv/include/aliases_aix.h b/vendors/libiconv/include/aliases_aix.h new file mode 100644 index 0000000..5cbc77f --- /dev/null +++ b/vendors/libiconv/include/aliases_aix.h @@ -0,0 +1,18 @@ + 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 ) diff --git a/vendors/libiconv/include/aliases_aix_sysaix.h b/vendors/libiconv/include/aliases_aix_sysaix.h new file mode 100644 index 0000000..b7dc584 --- /dev/null +++ b/vendors/libiconv/include/aliases_aix_sysaix.h @@ -0,0 +1,24 @@ + 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 ) diff --git a/vendors/libiconv/include/aliases_dos.h b/vendors/libiconv/include/aliases_dos.h new file mode 100644 index 0000000..1dd4fcb --- /dev/null +++ b/vendors/libiconv/include/aliases_dos.h @@ -0,0 +1,48 @@ + 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 ) diff --git a/vendors/libiconv/include/aliases_extra.h b/vendors/libiconv/include/aliases_extra.h new file mode 100644 index 0000000..9a54e16 --- /dev/null +++ b/vendors/libiconv/include/aliases_extra.h @@ -0,0 +1,12 @@ + 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 ) diff --git a/vendors/libiconv/include/aliases_osf1.h b/vendors/libiconv/include/aliases_osf1.h new file mode 100644 index 0000000..9e4f685 --- /dev/null +++ b/vendors/libiconv/include/aliases_osf1.h @@ -0,0 +1,2 @@ + S(osf1_0, "DEC-KANJI", ei_dec_kanji ) + S(osf1_1, "DEC-HANYU", ei_dec_hanyu ) diff --git a/vendors/libiconv/include/aliases_osf1_sysosf1.h b/vendors/libiconv/include/aliases_osf1_sysosf1.h new file mode 100644 index 0000000..b1f802d --- /dev/null +++ b/vendors/libiconv/include/aliases_osf1_sysosf1.h @@ -0,0 +1,4 @@ + 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 ) diff --git a/vendors/libiconv/include/aliases_sysaix.h b/vendors/libiconv/include/aliases_sysaix.h new file mode 100644 index 0000000..a5bfa89 --- /dev/null +++ b/vendors/libiconv/include/aliases_sysaix.h @@ -0,0 +1,1769 @@ +/* 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; +} diff --git a/vendors/libiconv/include/aliases_syshpux.h b/vendors/libiconv/include/aliases_syshpux.h new file mode 100644 index 0000000..57545ef --- /dev/null +++ b/vendors/libiconv/include/aliases_syshpux.h @@ -0,0 +1,1773 @@ +/* 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; +} diff --git a/vendors/libiconv/include/aliases_sysosf1.h b/vendors/libiconv/include/aliases_sysosf1.h new file mode 100644 index 0000000..18bbb03 --- /dev/null +++ b/vendors/libiconv/include/aliases_sysosf1.h @@ -0,0 +1,1745 @@ +/* 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; +} diff --git a/vendors/libiconv/include/aliases_syssolaris.h b/vendors/libiconv/include/aliases_syssolaris.h new file mode 100644 index 0000000..c35d4f9 --- /dev/null +++ b/vendors/libiconv/include/aliases_syssolaris.h @@ -0,0 +1,1756 @@ +/* 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; +} diff --git a/vendors/libiconv/include/armscii_8.h b/vendors/libiconv/include/armscii_8.h new file mode 100644 index 0000000..8d1613f --- /dev/null +++ b/vendors/libiconv/include/armscii_8.h @@ -0,0 +1,116 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/ascii.h b/vendors/libiconv/include/ascii.h new file mode 100644 index 0000000..fa49e3b --- /dev/null +++ b/vendors/libiconv/include/ascii.h @@ -0,0 +1,44 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/atarist.h b/vendors/libiconv/include/atarist.h new file mode 100644 index 0000000..90f18cc --- /dev/null +++ b/vendors/libiconv/include/atarist.h @@ -0,0 +1,158 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/big5.h b/vendors/libiconv/include/big5.h new file mode 100644 index 0000000..de10a99 --- /dev/null +++ b/vendors/libiconv/include/big5.h @@ -0,0 +1,4160 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/big5_2003.h b/vendors/libiconv/include/big5_2003.h new file mode 100644 index 0000000..b532ce6 --- /dev/null +++ b/vendors/libiconv/include/big5_2003.h @@ -0,0 +1,476 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/big5hkscs1999.h b/vendors/libiconv/include/big5hkscs1999.h new file mode 100644 index 0000000..9e0d1b0 --- /dev/null +++ b/vendors/libiconv/include/big5hkscs1999.h @@ -0,0 +1,197 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/big5hkscs2001.h b/vendors/libiconv/include/big5hkscs2001.h new file mode 100644 index 0000000..2d378c4 --- /dev/null +++ b/vendors/libiconv/include/big5hkscs2001.h @@ -0,0 +1,215 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/big5hkscs2004.h b/vendors/libiconv/include/big5hkscs2004.h new file mode 100644 index 0000000..3c57f66 --- /dev/null +++ b/vendors/libiconv/include/big5hkscs2004.h @@ -0,0 +1,231 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/big5hkscs2008.h b/vendors/libiconv/include/big5hkscs2008.h new file mode 100644 index 0000000..8759f4d --- /dev/null +++ b/vendors/libiconv/include/big5hkscs2008.h @@ -0,0 +1,247 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/c99.h b/vendors/libiconv/include/c99.h new file mode 100644 index 0000000..52a73c3 --- /dev/null +++ b/vendors/libiconv/include/c99.h @@ -0,0 +1,125 @@ +/* + * 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; + } +} diff --git a/vendors/libiconv/include/canonical.h b/vendors/libiconv/include/canonical.h new file mode 100644 index 0000000..550cc64 --- /dev/null +++ b/vendors/libiconv/include/canonical.h @@ -0,0 +1,110 @@ + (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, diff --git a/vendors/libiconv/include/canonical_aix.h b/vendors/libiconv/include/canonical_aix.h new file mode 100644 index 0000000..6149bc1 --- /dev/null +++ b/vendors/libiconv/include/canonical_aix.h @@ -0,0 +1,9 @@ + (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, diff --git a/vendors/libiconv/include/canonical_aix_sysaix.h b/vendors/libiconv/include/canonical_aix_sysaix.h new file mode 100644 index 0000000..8b58d1f --- /dev/null +++ b/vendors/libiconv/include/canonical_aix_sysaix.h @@ -0,0 +1,9 @@ + (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, diff --git a/vendors/libiconv/include/canonical_dos.h b/vendors/libiconv/include/canonical_dos.h new file mode 100644 index 0000000..aa82651 --- /dev/null +++ b/vendors/libiconv/include/canonical_dos.h @@ -0,0 +1,15 @@ + (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, diff --git a/vendors/libiconv/include/canonical_extra.h b/vendors/libiconv/include/canonical_extra.h new file mode 100644 index 0000000..29678a0 --- /dev/null +++ b/vendors/libiconv/include/canonical_extra.h @@ -0,0 +1,7 @@ + (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, diff --git a/vendors/libiconv/include/canonical_local.h b/vendors/libiconv/include/canonical_local.h new file mode 100644 index 0000000..a2209a8 --- /dev/null +++ b/vendors/libiconv/include/canonical_local.h @@ -0,0 +1,2 @@ + (int)(long)&((struct stringpool_t *)0)->stringpool_str271, + (int)(long)&((struct stringpool_t *)0)->stringpool_str664, diff --git a/vendors/libiconv/include/canonical_local_sysaix.h b/vendors/libiconv/include/canonical_local_sysaix.h new file mode 100644 index 0000000..0d4b27b --- /dev/null +++ b/vendors/libiconv/include/canonical_local_sysaix.h @@ -0,0 +1,2 @@ + (int)(long)&((struct stringpool_t *)0)->stringpool_str307, + (int)(long)&((struct stringpool_t *)0)->stringpool_str543, diff --git a/vendors/libiconv/include/canonical_local_syshpux.h b/vendors/libiconv/include/canonical_local_syshpux.h new file mode 100644 index 0000000..8e96923 --- /dev/null +++ b/vendors/libiconv/include/canonical_local_syshpux.h @@ -0,0 +1,2 @@ + (int)(long)&((struct stringpool_t *)0)->stringpool_str258, + (int)(long)&((struct stringpool_t *)0)->stringpool_str390, diff --git a/vendors/libiconv/include/canonical_local_sysosf1.h b/vendors/libiconv/include/canonical_local_sysosf1.h new file mode 100644 index 0000000..e1f886c --- /dev/null +++ b/vendors/libiconv/include/canonical_local_sysosf1.h @@ -0,0 +1,2 @@ + (int)(long)&((struct stringpool_t *)0)->stringpool_str275, + (int)(long)&((struct stringpool_t *)0)->stringpool_str465, diff --git a/vendors/libiconv/include/canonical_local_syssolaris.h b/vendors/libiconv/include/canonical_local_syssolaris.h new file mode 100644 index 0000000..ce73d70 --- /dev/null +++ b/vendors/libiconv/include/canonical_local_syssolaris.h @@ -0,0 +1,2 @@ + (int)(long)&((struct stringpool_t *)0)->stringpool_str38, + (int)(long)&((struct stringpool_t *)0)->stringpool_str515, diff --git a/vendors/libiconv/include/canonical_osf1.h b/vendors/libiconv/include/canonical_osf1.h new file mode 100644 index 0000000..0e134ac --- /dev/null +++ b/vendors/libiconv/include/canonical_osf1.h @@ -0,0 +1,2 @@ + (int)(long)&((struct stringpool2_t *)0)->stringpool_osf1_0, + (int)(long)&((struct stringpool2_t *)0)->stringpool_osf1_1, diff --git a/vendors/libiconv/include/canonical_osf1_sysosf1.h b/vendors/libiconv/include/canonical_osf1_sysosf1.h new file mode 100644 index 0000000..15c2769 --- /dev/null +++ b/vendors/libiconv/include/canonical_osf1_sysosf1.h @@ -0,0 +1,2 @@ + (int)(long)&((struct stringpool2_t *)0)->stringpool_osf1_0, + (int)(long)&((struct stringpool2_t *)0)->stringpool_osf1_2, diff --git a/vendors/libiconv/include/canonical_sysaix.h b/vendors/libiconv/include/canonical_sysaix.h new file mode 100644 index 0000000..00a71f6 --- /dev/null +++ b/vendors/libiconv/include/canonical_sysaix.h @@ -0,0 +1,110 @@ + (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, diff --git a/vendors/libiconv/include/canonical_syshpux.h b/vendors/libiconv/include/canonical_syshpux.h new file mode 100644 index 0000000..390355b --- /dev/null +++ b/vendors/libiconv/include/canonical_syshpux.h @@ -0,0 +1,110 @@ + (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, diff --git a/vendors/libiconv/include/canonical_sysosf1.h b/vendors/libiconv/include/canonical_sysosf1.h new file mode 100644 index 0000000..659a516 --- /dev/null +++ b/vendors/libiconv/include/canonical_sysosf1.h @@ -0,0 +1,110 @@ + (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, diff --git a/vendors/libiconv/include/canonical_syssolaris.h b/vendors/libiconv/include/canonical_syssolaris.h new file mode 100644 index 0000000..72ad33a --- /dev/null +++ b/vendors/libiconv/include/canonical_syssolaris.h @@ -0,0 +1,110 @@ + (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, diff --git a/vendors/libiconv/include/ces_big5.h b/vendors/libiconv/include/ces_big5.h new file mode 100644 index 0000000..2f87735 --- /dev/null +++ b/vendors/libiconv/include/ces_big5.h @@ -0,0 +1,70 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/ces_gbk.h b/vendors/libiconv/include/ces_gbk.h new file mode 100644 index 0000000..69e61f7 --- /dev/null +++ b/vendors/libiconv/include/ces_gbk.h @@ -0,0 +1,65 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cjk_variants.h b/vendors/libiconv/include/cjk_variants.h new file mode 100644 index 0000000..23cb4b3 --- /dev/null +++ b/vendors/libiconv/include/cjk_variants.h @@ -0,0 +1,4241 @@ +/* + * 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, +}; + diff --git a/vendors/libiconv/include/cns11643.h b/vendors/libiconv/include/cns11643.h new file mode 100644 index 0000000..5b16641 --- /dev/null +++ b/vendors/libiconv/include/cns11643.h @@ -0,0 +1,41 @@ +/* + * 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 diff --git a/vendors/libiconv/include/cns11643_1.h b/vendors/libiconv/include/cns11643_1.h new file mode 100644 index 0000000..24abb5c --- /dev/null +++ b/vendors/libiconv/include/cns11643_1.h @@ -0,0 +1,893 @@ +/* + * 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; +} + diff --git a/vendors/libiconv/include/cns11643_15.h b/vendors/libiconv/include/cns11643_15.h new file mode 100644 index 0000000..cfe0ba6 --- /dev/null +++ b/vendors/libiconv/include/cns11643_15.h @@ -0,0 +1,1083 @@ +/* + * 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; +} + diff --git a/vendors/libiconv/include/cns11643_2.h b/vendors/libiconv/include/cns11643_2.h new file mode 100644 index 0000000..7a73c60 --- /dev/null +++ b/vendors/libiconv/include/cns11643_2.h @@ -0,0 +1,1112 @@ +/* + * 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; +} + diff --git a/vendors/libiconv/include/cns11643_3.h b/vendors/libiconv/include/cns11643_3.h new file mode 100644 index 0000000..e263013 --- /dev/null +++ b/vendors/libiconv/include/cns11643_3.h @@ -0,0 +1,974 @@ +/* + * 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; +} + diff --git a/vendors/libiconv/include/cns11643_4.h b/vendors/libiconv/include/cns11643_4.h new file mode 100644 index 0000000..e725992 --- /dev/null +++ b/vendors/libiconv/include/cns11643_4.h @@ -0,0 +1,61 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cns11643_4a.h b/vendors/libiconv/include/cns11643_4a.h new file mode 100644 index 0000000..ee81576 --- /dev/null +++ b/vendors/libiconv/include/cns11643_4a.h @@ -0,0 +1,460 @@ +/* + * 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, +}; + diff --git a/vendors/libiconv/include/cns11643_4b.h b/vendors/libiconv/include/cns11643_4b.h new file mode 100644 index 0000000..6a9823e --- /dev/null +++ b/vendors/libiconv/include/cns11643_4b.h @@ -0,0 +1,668 @@ +/* + * 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, +}; + diff --git a/vendors/libiconv/include/cns11643_5.h b/vendors/libiconv/include/cns11643_5.h new file mode 100644 index 0000000..f0e5ebe --- /dev/null +++ b/vendors/libiconv/include/cns11643_5.h @@ -0,0 +1,1278 @@ +/* + * 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; +} + diff --git a/vendors/libiconv/include/cns11643_6.h b/vendors/libiconv/include/cns11643_6.h new file mode 100644 index 0000000..8493984 --- /dev/null +++ b/vendors/libiconv/include/cns11643_6.h @@ -0,0 +1,968 @@ +/* + * 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; +} + diff --git a/vendors/libiconv/include/cns11643_7.h b/vendors/libiconv/include/cns11643_7.h new file mode 100644 index 0000000..44532bc --- /dev/null +++ b/vendors/libiconv/include/cns11643_7.h @@ -0,0 +1,988 @@ +/* + * 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; +} + diff --git a/vendors/libiconv/include/cns11643_inv.h b/vendors/libiconv/include/cns11643_inv.h new file mode 100644 index 0000000..3a7c379 --- /dev/null +++ b/vendors/libiconv/include/cns11643_inv.h @@ -0,0 +1,15412 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/config.h b/vendors/libiconv/include/config.h new file mode 100644 index 0000000..3a3c7d6 --- /dev/null +++ b/vendors/libiconv/include/config.h @@ -0,0 +1,923 @@ +/* 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 + +/* 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 + diff --git a/vendors/libiconv/include/converters.h b/vendors/libiconv/include/converters.h new file mode 100644 index 0000000..18c5f99 --- /dev/null +++ b/vendors/libiconv/include/converters.h @@ -0,0 +1,298 @@ +/* + * 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 + diff --git a/vendors/libiconv/include/cp1046.h b/vendors/libiconv/include/cp1046.h new file mode 100644 index 0000000..b6716b7 --- /dev/null +++ b/vendors/libiconv/include/cp1046.h @@ -0,0 +1,157 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp1124.h b/vendors/libiconv/include/cp1124.h new file mode 100644 index 0000000..8b97a7e --- /dev/null +++ b/vendors/libiconv/include/cp1124.h @@ -0,0 +1,102 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp1125.h b/vendors/libiconv/include/cp1125.h new file mode 100644 index 0000000..802f074 --- /dev/null +++ b/vendors/libiconv/include/cp1125.h @@ -0,0 +1,129 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp1129.h b/vendors/libiconv/include/cp1129.h new file mode 100644 index 0000000..1b7cff8 --- /dev/null +++ b/vendors/libiconv/include/cp1129.h @@ -0,0 +1,121 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp1131.h b/vendors/libiconv/include/cp1131.h new file mode 100644 index 0000000..15f4ed2 --- /dev/null +++ b/vendors/libiconv/include/cp1131.h @@ -0,0 +1,132 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp1133.h b/vendors/libiconv/include/cp1133.h new file mode 100644 index 0000000..a16d93f --- /dev/null +++ b/vendors/libiconv/include/cp1133.h @@ -0,0 +1,110 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp1161.h b/vendors/libiconv/include/cp1161.h new file mode 100644 index 0000000..b6349c6 --- /dev/null +++ b/vendors/libiconv/include/cp1161.h @@ -0,0 +1,89 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp1162.h b/vendors/libiconv/include/cp1162.h new file mode 100644 index 0000000..6c7fa82 --- /dev/null +++ b/vendors/libiconv/include/cp1162.h @@ -0,0 +1,70 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp1163.h b/vendors/libiconv/include/cp1163.h new file mode 100644 index 0000000..ca5d0b0 --- /dev/null +++ b/vendors/libiconv/include/cp1163.h @@ -0,0 +1,63 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp1250.h b/vendors/libiconv/include/cp1250.h new file mode 100644 index 0000000..b89300f --- /dev/null +++ b/vendors/libiconv/include/cp1250.h @@ -0,0 +1,139 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp1251.h b/vendors/libiconv/include/cp1251.h new file mode 100644 index 0000000..0fa540d --- /dev/null +++ b/vendors/libiconv/include/cp1251.h @@ -0,0 +1,131 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp1252.h b/vendors/libiconv/include/cp1252.h new file mode 100644 index 0000000..1564442 --- /dev/null +++ b/vendors/libiconv/include/cp1252.h @@ -0,0 +1,103 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp1253.h b/vendors/libiconv/include/cp1253.h new file mode 100644 index 0000000..020f0d6 --- /dev/null +++ b/vendors/libiconv/include/cp1253.h @@ -0,0 +1,122 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp1254.h b/vendors/libiconv/include/cp1254.h new file mode 100644 index 0000000..845a01b --- /dev/null +++ b/vendors/libiconv/include/cp1254.h @@ -0,0 +1,146 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp1255.h b/vendors/libiconv/include/cp1255.h new file mode 100644 index 0000000..e7761ae --- /dev/null +++ b/vendors/libiconv/include/cp1255.h @@ -0,0 +1,380 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp1256.h b/vendors/libiconv/include/cp1256.h new file mode 100644 index 0000000..3804e8f --- /dev/null +++ b/vendors/libiconv/include/cp1256.h @@ -0,0 +1,153 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp1257.h b/vendors/libiconv/include/cp1257.h new file mode 100644 index 0000000..0d8518e --- /dev/null +++ b/vendors/libiconv/include/cp1257.h @@ -0,0 +1,139 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp1258.h b/vendors/libiconv/include/cp1258.h new file mode 100644 index 0000000..5783404 --- /dev/null +++ b/vendors/libiconv/include/cp1258.h @@ -0,0 +1,288 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp437.h b/vendors/libiconv/include/cp437.h new file mode 100644 index 0000000..a3c8e68 --- /dev/null +++ b/vendors/libiconv/include/cp437.h @@ -0,0 +1,156 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp737.h b/vendors/libiconv/include/cp737.h new file mode 100644 index 0000000..955e458 --- /dev/null +++ b/vendors/libiconv/include/cp737.h @@ -0,0 +1,141 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp775.h b/vendors/libiconv/include/cp775.h new file mode 100644 index 0000000..b9a5a5c --- /dev/null +++ b/vendors/libiconv/include/cp775.h @@ -0,0 +1,142 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp850.h b/vendors/libiconv/include/cp850.h new file mode 100644 index 0000000..25acfee --- /dev/null +++ b/vendors/libiconv/include/cp850.h @@ -0,0 +1,124 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp852.h b/vendors/libiconv/include/cp852.h new file mode 100644 index 0000000..fac7a63 --- /dev/null +++ b/vendors/libiconv/include/cp852.h @@ -0,0 +1,143 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp853.h b/vendors/libiconv/include/cp853.h new file mode 100644 index 0000000..fe82ae9 --- /dev/null +++ b/vendors/libiconv/include/cp853.h @@ -0,0 +1,151 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp855.h b/vendors/libiconv/include/cp855.h new file mode 100644 index 0000000..ddb8bf1 --- /dev/null +++ b/vendors/libiconv/include/cp855.h @@ -0,0 +1,128 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp856.h b/vendors/libiconv/include/cp856.h new file mode 100644 index 0000000..30ba80b --- /dev/null +++ b/vendors/libiconv/include/cp856.h @@ -0,0 +1,134 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp857.h b/vendors/libiconv/include/cp857.h new file mode 100644 index 0000000..09de722 --- /dev/null +++ b/vendors/libiconv/include/cp857.h @@ -0,0 +1,138 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp858.h b/vendors/libiconv/include/cp858.h new file mode 100644 index 0000000..dd26d0a --- /dev/null +++ b/vendors/libiconv/include/cp858.h @@ -0,0 +1,61 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp860.h b/vendors/libiconv/include/cp860.h new file mode 100644 index 0000000..2cca2f1 --- /dev/null +++ b/vendors/libiconv/include/cp860.h @@ -0,0 +1,149 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp861.h b/vendors/libiconv/include/cp861.h new file mode 100644 index 0000000..07bcf5f --- /dev/null +++ b/vendors/libiconv/include/cp861.h @@ -0,0 +1,156 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp862.h b/vendors/libiconv/include/cp862.h new file mode 100644 index 0000000..623fc4d --- /dev/null +++ b/vendors/libiconv/include/cp862.h @@ -0,0 +1,155 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp863.h b/vendors/libiconv/include/cp863.h new file mode 100644 index 0000000..5890ad4 --- /dev/null +++ b/vendors/libiconv/include/cp863.h @@ -0,0 +1,156 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp864.h b/vendors/libiconv/include/cp864.h new file mode 100644 index 0000000..a1d8c4a --- /dev/null +++ b/vendors/libiconv/include/cp864.h @@ -0,0 +1,188 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp865.h b/vendors/libiconv/include/cp865.h new file mode 100644 index 0000000..3944916 --- /dev/null +++ b/vendors/libiconv/include/cp865.h @@ -0,0 +1,156 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp866.h b/vendors/libiconv/include/cp866.h new file mode 100644 index 0000000..0aaa216 --- /dev/null +++ b/vendors/libiconv/include/cp866.h @@ -0,0 +1,125 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp869.h b/vendors/libiconv/include/cp869.h new file mode 100644 index 0000000..8e839d2 --- /dev/null +++ b/vendors/libiconv/include/cp869.h @@ -0,0 +1,137 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp874.h b/vendors/libiconv/include/cp874.h new file mode 100644 index 0000000..6374dd7 --- /dev/null +++ b/vendors/libiconv/include/cp874.h @@ -0,0 +1,111 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp922.h b/vendors/libiconv/include/cp922.h new file mode 100644 index 0000000..ca661b3 --- /dev/null +++ b/vendors/libiconv/include/cp922.h @@ -0,0 +1,99 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp932.h b/vendors/libiconv/include/cp932.h new file mode 100644 index 0000000..6534cd0 --- /dev/null +++ b/vendors/libiconv/include/cp932.h @@ -0,0 +1,240 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp932ext.h b/vendors/libiconv/include/cp932ext.h new file mode 100644 index 0000000..6f94c9a --- /dev/null +++ b/vendors/libiconv/include/cp932ext.h @@ -0,0 +1,709 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp936.h b/vendors/libiconv/include/cp936.h new file mode 100644 index 0000000..06e510c --- /dev/null +++ b/vendors/libiconv/include/cp936.h @@ -0,0 +1,126 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp936ext.h b/vendors/libiconv/include/cp936ext.h new file mode 100644 index 0000000..db1817b --- /dev/null +++ b/vendors/libiconv/include/cp936ext.h @@ -0,0 +1,99 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp943.h b/vendors/libiconv/include/cp943.h new file mode 100644 index 0000000..dbaebe9 --- /dev/null +++ b/vendors/libiconv/include/cp943.h @@ -0,0 +1,29 @@ +/* + * 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 diff --git a/vendors/libiconv/include/cp949.h b/vendors/libiconv/include/cp949.h new file mode 100644 index 0000000..665e724 --- /dev/null +++ b/vendors/libiconv/include/cp949.h @@ -0,0 +1,128 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp950.h b/vendors/libiconv/include/cp950.h new file mode 100644 index 0000000..28ca199 --- /dev/null +++ b/vendors/libiconv/include/cp950.h @@ -0,0 +1,284 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/cp950ext.h b/vendors/libiconv/include/cp950ext.h new file mode 100644 index 0000000..2a18d80 --- /dev/null +++ b/vendors/libiconv/include/cp950ext.h @@ -0,0 +1,161 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/dec_hanyu.h b/vendors/libiconv/include/dec_hanyu.h new file mode 100644 index 0000000..065fd5d --- /dev/null +++ b/vendors/libiconv/include/dec_hanyu.h @@ -0,0 +1,115 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/dec_kanji.h b/vendors/libiconv/include/dec_kanji.h new file mode 100644 index 0000000..0a056fb --- /dev/null +++ b/vendors/libiconv/include/dec_kanji.h @@ -0,0 +1,71 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/encodings.def b/vendors/libiconv/include/encodings.def new file mode 100644 index 0000000..0174343 --- /dev/null +++ b/vendors/libiconv/include/encodings.def @@ -0,0 +1,1030 @@ +/* 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 }) + diff --git a/vendors/libiconv/include/encodings_aix.def b/vendors/libiconv/include/encodings_aix.def new file mode 100644 index 0000000..259452e --- /dev/null +++ b/vendors/libiconv/include/encodings_aix.def @@ -0,0 +1,97 @@ +/* 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 }) diff --git a/vendors/libiconv/include/encodings_dos.def b/vendors/libiconv/include/encodings_dos.def new file mode 100644 index 0000000..c9d30c8 --- /dev/null +++ b/vendors/libiconv/include/encodings_dos.def @@ -0,0 +1,127 @@ +/* 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 }) diff --git a/vendors/libiconv/include/encodings_extra.def b/vendors/libiconv/include/encodings_extra.def new file mode 100644 index 0000000..614422b --- /dev/null +++ b/vendors/libiconv/include/encodings_extra.def @@ -0,0 +1,57 @@ +/* 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 }) diff --git a/vendors/libiconv/include/encodings_local.def b/vendors/libiconv/include/encodings_local.def new file mode 100644 index 0000000..4e793e5 --- /dev/null +++ b/vendors/libiconv/include/encodings_local.def @@ -0,0 +1,29 @@ +/* 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 }) diff --git a/vendors/libiconv/include/encodings_osf1.def b/vendors/libiconv/include/encodings_osf1.def new file mode 100644 index 0000000..7912854 --- /dev/null +++ b/vendors/libiconv/include/encodings_osf1.def @@ -0,0 +1,37 @@ +/* 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 diff --git a/vendors/libiconv/include/euc_cn.h b/vendors/libiconv/include/euc_cn.h new file mode 100644 index 0000000..a25417a --- /dev/null +++ b/vendors/libiconv/include/euc_cn.h @@ -0,0 +1,72 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/euc_jisx0213.h b/vendors/libiconv/include/euc_jisx0213.h new file mode 100644 index 0000000..4d417ca --- /dev/null +++ b/vendors/libiconv/include/euc_jisx0213.h @@ -0,0 +1,268 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/euc_jp.h b/vendors/libiconv/include/euc_jp.h new file mode 100644 index 0000000..84fa2e7 --- /dev/null +++ b/vendors/libiconv/include/euc_jp.h @@ -0,0 +1,191 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/euc_kr.h b/vendors/libiconv/include/euc_kr.h new file mode 100644 index 0000000..8b3dd05 --- /dev/null +++ b/vendors/libiconv/include/euc_kr.h @@ -0,0 +1,74 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/euc_tw.h b/vendors/libiconv/include/euc_tw.h new file mode 100644 index 0000000..f7bdc8b --- /dev/null +++ b/vendors/libiconv/include/euc_tw.h @@ -0,0 +1,116 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/flags.h b/vendors/libiconv/include/flags.h new file mode 100644 index 0000000..e91934a --- /dev/null +++ b/vendors/libiconv/include/flags.h @@ -0,0 +1,157 @@ +/* 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) diff --git a/vendors/libiconv/include/flushwc.h b/vendors/libiconv/include/flushwc.h new file mode 100644 index 0000000..da25212 --- /dev/null +++ b/vendors/libiconv/include/flushwc.h @@ -0,0 +1,37 @@ +/* + * 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 */ diff --git a/vendors/libiconv/include/gb12345.h b/vendors/libiconv/include/gb12345.h new file mode 100644 index 0000000..b7e062e --- /dev/null +++ b/vendors/libiconv/include/gb12345.h @@ -0,0 +1,67 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/gb12345ext.h b/vendors/libiconv/include/gb12345ext.h new file mode 100644 index 0000000..b461ec8 --- /dev/null +++ b/vendors/libiconv/include/gb12345ext.h @@ -0,0 +1,1796 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/gb18030.h b/vendors/libiconv/include/gb18030.h new file mode 100644 index 0000000..e9502e1 --- /dev/null +++ b/vendors/libiconv/include/gb18030.h @@ -0,0 +1,382 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/gb18030ext.h b/vendors/libiconv/include/gb18030ext.h new file mode 100644 index 0000000..5e59419 --- /dev/null +++ b/vendors/libiconv/include/gb18030ext.h @@ -0,0 +1,328 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/gb18030uni.h b/vendors/libiconv/include/gb18030uni.h new file mode 100644 index 0000000..bea31e5 --- /dev/null +++ b/vendors/libiconv/include/gb18030uni.h @@ -0,0 +1,249 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/gb2312.h b/vendors/libiconv/include/gb2312.h new file mode 100644 index 0000000..831a569 --- /dev/null +++ b/vendors/libiconv/include/gb2312.h @@ -0,0 +1,2571 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/gbk.h b/vendors/libiconv/include/gbk.h new file mode 100644 index 0000000..b6ff526 --- /dev/null +++ b/vendors/libiconv/include/gbk.h @@ -0,0 +1,169 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/gbkext1.h b/vendors/libiconv/include/gbkext1.h new file mode 100644 index 0000000..d244c76 --- /dev/null +++ b/vendors/libiconv/include/gbkext1.h @@ -0,0 +1,853 @@ +/* + * 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; +} + diff --git a/vendors/libiconv/include/gbkext2.h b/vendors/libiconv/include/gbkext2.h new file mode 100644 index 0000000..5a0dbde --- /dev/null +++ b/vendors/libiconv/include/gbkext2.h @@ -0,0 +1,1174 @@ +/* + * 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; +} + diff --git a/vendors/libiconv/include/gbkext_inv.h b/vendors/libiconv/include/gbkext_inv.h new file mode 100644 index 0000000..45f57d9 --- /dev/null +++ b/vendors/libiconv/include/gbkext_inv.h @@ -0,0 +1,2343 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/georgian_academy.h b/vendors/libiconv/include/georgian_academy.h new file mode 100644 index 0000000..ddbe578 --- /dev/null +++ b/vendors/libiconv/include/georgian_academy.h @@ -0,0 +1,106 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/georgian_ps.h b/vendors/libiconv/include/georgian_ps.h new file mode 100644 index 0000000..e23dbae --- /dev/null +++ b/vendors/libiconv/include/georgian_ps.h @@ -0,0 +1,123 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/hkscs1999.h b/vendors/libiconv/include/hkscs1999.h new file mode 100644 index 0000000..3732763 --- /dev/null +++ b/vendors/libiconv/include/hkscs1999.h @@ -0,0 +1,3005 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/hkscs2001.h b/vendors/libiconv/include/hkscs2001.h new file mode 100644 index 0000000..66642cf --- /dev/null +++ b/vendors/libiconv/include/hkscs2001.h @@ -0,0 +1,683 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/hkscs2004.h b/vendors/libiconv/include/hkscs2004.h new file mode 100644 index 0000000..d5ab997 --- /dev/null +++ b/vendors/libiconv/include/hkscs2004.h @@ -0,0 +1,679 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/hkscs2008.h b/vendors/libiconv/include/hkscs2008.h new file mode 100644 index 0000000..ee6235c --- /dev/null +++ b/vendors/libiconv/include/hkscs2008.h @@ -0,0 +1,467 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/hp_roman8.h b/vendors/libiconv/include/hp_roman8.h new file mode 100644 index 0000000..da776ed --- /dev/null +++ b/vendors/libiconv/include/hp_roman8.h @@ -0,0 +1,119 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/hz.h b/vendors/libiconv/include/hz.h new file mode 100644 index 0000000..db0b4b1 --- /dev/null +++ b/vendors/libiconv/include/hz.h @@ -0,0 +1,163 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/iconv.h b/vendors/libiconv/include/iconv.h new file mode 100644 index 0000000..1ac05ef --- /dev/null +++ b/vendors/libiconv/include/iconv.h @@ -0,0 +1,250 @@ +/* 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 */ + +#if BUILDING_LIBICONV +#define LIBICONV_DLL_EXPORTED __declspec(dllexport) +#elif 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 +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. */ + +#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]; +#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); +#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 */ diff --git a/vendors/libiconv/include/iconv_open1.h b/vendors/libiconv/include/iconv_open1.h new file mode 100644 index 0000000..acee5a4 --- /dev/null +++ b/vendors/libiconv/include/iconv_open1.h @@ -0,0 +1,229 @@ +/* + * 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; + } +} diff --git a/vendors/libiconv/include/iconv_open2.h b/vendors/libiconv/include/iconv_open2.h new file mode 100644 index 0000000..6d6296f --- /dev/null +++ b/vendors/libiconv/include/iconv_open2.h @@ -0,0 +1,89 @@ +/* + * 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. */ diff --git a/vendors/libiconv/include/iso2022_cn.h b/vendors/libiconv/include/iso2022_cn.h new file mode 100644 index 0000000..d7e3e39 --- /dev/null +++ b/vendors/libiconv/include/iso2022_cn.h @@ -0,0 +1,324 @@ +/* + * 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 diff --git a/vendors/libiconv/include/iso2022_cnext.h b/vendors/libiconv/include/iso2022_cnext.h new file mode 100644 index 0000000..f848870 --- /dev/null +++ b/vendors/libiconv/include/iso2022_cnext.h @@ -0,0 +1,590 @@ +/* + * 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 diff --git a/vendors/libiconv/include/iso2022_jp.h b/vendors/libiconv/include/iso2022_jp.h new file mode 100644 index 0000000..1c8abec --- /dev/null +++ b/vendors/libiconv/include/iso2022_jp.h @@ -0,0 +1,216 @@ +/* + * 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 diff --git a/vendors/libiconv/include/iso2022_jp1.h b/vendors/libiconv/include/iso2022_jp1.h new file mode 100644 index 0000000..c309474 --- /dev/null +++ b/vendors/libiconv/include/iso2022_jp1.h @@ -0,0 +1,264 @@ +/* + * 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 diff --git a/vendors/libiconv/include/iso2022_jp2.h b/vendors/libiconv/include/iso2022_jp2.h new file mode 100644 index 0000000..5e3ca41 --- /dev/null +++ b/vendors/libiconv/include/iso2022_jp2.h @@ -0,0 +1,693 @@ +/* + * 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 diff --git a/vendors/libiconv/include/iso2022_jp3.h b/vendors/libiconv/include/iso2022_jp3.h new file mode 100644 index 0000000..58cea1b --- /dev/null +++ b/vendors/libiconv/include/iso2022_jp3.h @@ -0,0 +1,538 @@ +/* + * 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 diff --git a/vendors/libiconv/include/iso2022_kr.h b/vendors/libiconv/include/iso2022_kr.h new file mode 100644 index 0000000..8045d4e --- /dev/null +++ b/vendors/libiconv/include/iso2022_kr.h @@ -0,0 +1,222 @@ +/* + * 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 diff --git a/vendors/libiconv/include/iso646_cn.h b/vendors/libiconv/include/iso646_cn.h new file mode 100644 index 0000000..a571ce7 --- /dev/null +++ b/vendors/libiconv/include/iso646_cn.h @@ -0,0 +1,58 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/iso646_jp.h b/vendors/libiconv/include/iso646_jp.h new file mode 100644 index 0000000..7cc3abd --- /dev/null +++ b/vendors/libiconv/include/iso646_jp.h @@ -0,0 +1,60 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/iso8859_1.h b/vendors/libiconv/include/iso8859_1.h new file mode 100644 index 0000000..5346916 --- /dev/null +++ b/vendors/libiconv/include/iso8859_1.h @@ -0,0 +1,41 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/iso8859_10.h b/vendors/libiconv/include/iso8859_10.h new file mode 100644 index 0000000..49b3f6a --- /dev/null +++ b/vendors/libiconv/include/iso8859_10.h @@ -0,0 +1,106 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/iso8859_11.h b/vendors/libiconv/include/iso8859_11.h new file mode 100644 index 0000000..ef8b1a6 --- /dev/null +++ b/vendors/libiconv/include/iso8859_11.h @@ -0,0 +1,52 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/iso8859_13.h b/vendors/libiconv/include/iso8859_13.h new file mode 100644 index 0000000..2fadc7b --- /dev/null +++ b/vendors/libiconv/include/iso8859_13.h @@ -0,0 +1,109 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/iso8859_14.h b/vendors/libiconv/include/iso8859_14.h new file mode 100644 index 0000000..01c9cdd --- /dev/null +++ b/vendors/libiconv/include/iso8859_14.h @@ -0,0 +1,127 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/iso8859_15.h b/vendors/libiconv/include/iso8859_15.h new file mode 100644 index 0000000..24de90d --- /dev/null +++ b/vendors/libiconv/include/iso8859_15.h @@ -0,0 +1,81 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/iso8859_16.h b/vendors/libiconv/include/iso8859_16.h new file mode 100644 index 0000000..2004718 --- /dev/null +++ b/vendors/libiconv/include/iso8859_16.h @@ -0,0 +1,116 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/iso8859_2.h b/vendors/libiconv/include/iso8859_2.h new file mode 100644 index 0000000..9ad4d4a --- /dev/null +++ b/vendors/libiconv/include/iso8859_2.h @@ -0,0 +1,112 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/iso8859_3.h b/vendors/libiconv/include/iso8859_3.h new file mode 100644 index 0000000..308e0b0 --- /dev/null +++ b/vendors/libiconv/include/iso8859_3.h @@ -0,0 +1,118 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/iso8859_4.h b/vendors/libiconv/include/iso8859_4.h new file mode 100644 index 0000000..51e1778 --- /dev/null +++ b/vendors/libiconv/include/iso8859_4.h @@ -0,0 +1,112 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/iso8859_5.h b/vendors/libiconv/include/iso8859_5.h new file mode 100644 index 0000000..6b83605 --- /dev/null +++ b/vendors/libiconv/include/iso8859_5.h @@ -0,0 +1,95 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/iso8859_6.h b/vendors/libiconv/include/iso8859_6.h new file mode 100644 index 0000000..8d31199 --- /dev/null +++ b/vendors/libiconv/include/iso8859_6.h @@ -0,0 +1,98 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/iso8859_7.h b/vendors/libiconv/include/iso8859_7.h new file mode 100644 index 0000000..0825ef5 --- /dev/null +++ b/vendors/libiconv/include/iso8859_7.h @@ -0,0 +1,111 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/iso8859_8.h b/vendors/libiconv/include/iso8859_8.h new file mode 100644 index 0000000..6184846 --- /dev/null +++ b/vendors/libiconv/include/iso8859_8.h @@ -0,0 +1,107 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/iso8859_9.h b/vendors/libiconv/include/iso8859_9.h new file mode 100644 index 0000000..7dbd37d --- /dev/null +++ b/vendors/libiconv/include/iso8859_9.h @@ -0,0 +1,85 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/isoir165.h b/vendors/libiconv/include/isoir165.h new file mode 100644 index 0000000..4d6e9ff --- /dev/null +++ b/vendors/libiconv/include/isoir165.h @@ -0,0 +1,159 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/isoir165ext.h b/vendors/libiconv/include/isoir165ext.h new file mode 100644 index 0000000..0bc811a --- /dev/null +++ b/vendors/libiconv/include/isoir165ext.h @@ -0,0 +1,800 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/java.h b/vendors/libiconv/include/java.h new file mode 100644 index 0000000..4d4485f --- /dev/null +++ b/vendors/libiconv/include/java.h @@ -0,0 +1,137 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/jisx0201.h b/vendors/libiconv/include/jisx0201.h new file mode 100644 index 0000000..d58c1d5 --- /dev/null +++ b/vendors/libiconv/include/jisx0201.h @@ -0,0 +1,66 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/jisx0208.h b/vendors/libiconv/include/jisx0208.h new file mode 100644 index 0000000..755b8ba --- /dev/null +++ b/vendors/libiconv/include/jisx0208.h @@ -0,0 +1,2415 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/jisx0212.h b/vendors/libiconv/include/jisx0212.h new file mode 100644 index 0000000..371dbb1 --- /dev/null +++ b/vendors/libiconv/include/jisx0212.h @@ -0,0 +1,2189 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/jisx0213.h b/vendors/libiconv/include/jisx0213.h new file mode 100644 index 0000000..98468c4 --- /dev/null +++ b/vendors/libiconv/include/jisx0213.h @@ -0,0 +1,5924 @@ +/* + * 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 */ diff --git a/vendors/libiconv/include/johab.h b/vendors/libiconv/include/johab.h new file mode 100644 index 0000000..fb2c17f --- /dev/null +++ b/vendors/libiconv/include/johab.h @@ -0,0 +1,139 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/johab_hangul.h b/vendors/libiconv/include/johab_hangul.h new file mode 100644 index 0000000..68368df --- /dev/null +++ b/vendors/libiconv/include/johab_hangul.h @@ -0,0 +1,262 @@ +/* + * 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 diff --git a/vendors/libiconv/include/koi8_r.h b/vendors/libiconv/include/koi8_r.h new file mode 100644 index 0000000..3e43536 --- /dev/null +++ b/vendors/libiconv/include/koi8_r.h @@ -0,0 +1,153 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/koi8_ru.h b/vendors/libiconv/include/koi8_ru.h new file mode 100644 index 0000000..e43ae72 --- /dev/null +++ b/vendors/libiconv/include/koi8_ru.h @@ -0,0 +1,159 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/koi8_t.h b/vendors/libiconv/include/koi8_t.h new file mode 100644 index 0000000..0f7a568 --- /dev/null +++ b/vendors/libiconv/include/koi8_t.h @@ -0,0 +1,143 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/koi8_u.h b/vendors/libiconv/include/koi8_u.h new file mode 100644 index 0000000..0637d58 --- /dev/null +++ b/vendors/libiconv/include/koi8_u.h @@ -0,0 +1,161 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/ksc5601.h b/vendors/libiconv/include/ksc5601.h new file mode 100644 index 0000000..fd16623 --- /dev/null +++ b/vendors/libiconv/include/ksc5601.h @@ -0,0 +1,3022 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/loop_unicode.h b/vendors/libiconv/include/loop_unicode.h new file mode 100644 index 0000000..1c787b5 --- /dev/null +++ b/vendors/libiconv/include/loop_unicode.h @@ -0,0 +1,527 @@ +/* + * 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; + } +} diff --git a/vendors/libiconv/include/loop_wchar.h b/vendors/libiconv/include/loop_wchar.h new file mode 100644 index 0000000..6dc011b --- /dev/null +++ b/vendors/libiconv/include/loop_wchar.h @@ -0,0 +1,474 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/loops.h b/vendors/libiconv/include/loops.h new file mode 100644 index 0000000..782cc09 --- /dev/null +++ b/vendors/libiconv/include/loops.h @@ -0,0 +1,25 @@ +/* + * 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" + diff --git a/vendors/libiconv/include/mac_arabic.h b/vendors/libiconv/include/mac_arabic.h new file mode 100644 index 0000000..9d05a1a --- /dev/null +++ b/vendors/libiconv/include/mac_arabic.h @@ -0,0 +1,132 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/mac_centraleurope.h b/vendors/libiconv/include/mac_centraleurope.h new file mode 100644 index 0000000..be030cf --- /dev/null +++ b/vendors/libiconv/include/mac_centraleurope.h @@ -0,0 +1,139 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/mac_croatian.h b/vendors/libiconv/include/mac_croatian.h new file mode 100644 index 0000000..582f3e0 --- /dev/null +++ b/vendors/libiconv/include/mac_croatian.h @@ -0,0 +1,165 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/mac_cyrillic.h b/vendors/libiconv/include/mac_cyrillic.h new file mode 100644 index 0000000..a5b5972 --- /dev/null +++ b/vendors/libiconv/include/mac_cyrillic.h @@ -0,0 +1,136 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/mac_greek.h b/vendors/libiconv/include/mac_greek.h new file mode 100644 index 0000000..3cc4ac2 --- /dev/null +++ b/vendors/libiconv/include/mac_greek.h @@ -0,0 +1,135 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/mac_hebrew.h b/vendors/libiconv/include/mac_hebrew.h new file mode 100644 index 0000000..c7f97bb --- /dev/null +++ b/vendors/libiconv/include/mac_hebrew.h @@ -0,0 +1,132 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/mac_iceland.h b/vendors/libiconv/include/mac_iceland.h new file mode 100644 index 0000000..b49f164 --- /dev/null +++ b/vendors/libiconv/include/mac_iceland.h @@ -0,0 +1,162 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/mac_roman.h b/vendors/libiconv/include/mac_roman.h new file mode 100644 index 0000000..7a6d51a --- /dev/null +++ b/vendors/libiconv/include/mac_roman.h @@ -0,0 +1,167 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/mac_romania.h b/vendors/libiconv/include/mac_romania.h new file mode 100644 index 0000000..2d35562 --- /dev/null +++ b/vendors/libiconv/include/mac_romania.h @@ -0,0 +1,165 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/mac_thai.h b/vendors/libiconv/include/mac_thai.h new file mode 100644 index 0000000..74d15aa --- /dev/null +++ b/vendors/libiconv/include/mac_thai.h @@ -0,0 +1,128 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/mac_turkish.h b/vendors/libiconv/include/mac_turkish.h new file mode 100644 index 0000000..94f7d37 --- /dev/null +++ b/vendors/libiconv/include/mac_turkish.h @@ -0,0 +1,163 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/mac_ukraine.h b/vendors/libiconv/include/mac_ukraine.h new file mode 100644 index 0000000..8ea17b0 --- /dev/null +++ b/vendors/libiconv/include/mac_ukraine.h @@ -0,0 +1,143 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/mulelao.h b/vendors/libiconv/include/mulelao.h new file mode 100644 index 0000000..abfb5cf --- /dev/null +++ b/vendors/libiconv/include/mulelao.h @@ -0,0 +1,96 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/nextstep.h b/vendors/libiconv/include/nextstep.h new file mode 100644 index 0000000..ffe41b9 --- /dev/null +++ b/vendors/libiconv/include/nextstep.h @@ -0,0 +1,141 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/pt154.h b/vendors/libiconv/include/pt154.h new file mode 100644 index 0000000..36a5d84 --- /dev/null +++ b/vendors/libiconv/include/pt154.h @@ -0,0 +1,118 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/relocatable.h b/vendors/libiconv/include/relocatable.h new file mode 100644 index 0000000..68fe83e --- /dev/null +++ b/vendors/libiconv/include/relocatable.h @@ -0,0 +1,83 @@ +/* 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 */ diff --git a/vendors/libiconv/include/riscos1.h b/vendors/libiconv/include/riscos1.h new file mode 100644 index 0000000..2ebc751 --- /dev/null +++ b/vendors/libiconv/include/riscos1.h @@ -0,0 +1,96 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/rk1048.h b/vendors/libiconv/include/rk1048.h new file mode 100644 index 0000000..0e1fde8 --- /dev/null +++ b/vendors/libiconv/include/rk1048.h @@ -0,0 +1,145 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/shift_jisx0213.h b/vendors/libiconv/include/shift_jisx0213.h new file mode 100644 index 0000000..05f00b0 --- /dev/null +++ b/vendors/libiconv/include/shift_jisx0213.h @@ -0,0 +1,310 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/sjis.h b/vendors/libiconv/include/sjis.h new file mode 100644 index 0000000..8244e3a --- /dev/null +++ b/vendors/libiconv/include/sjis.h @@ -0,0 +1,132 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/tcvn.h b/vendors/libiconv/include/tcvn.h new file mode 100644 index 0000000..abd5def --- /dev/null +++ b/vendors/libiconv/include/tcvn.h @@ -0,0 +1,291 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/tds565.h b/vendors/libiconv/include/tds565.h new file mode 100644 index 0000000..479513f --- /dev/null +++ b/vendors/libiconv/include/tds565.h @@ -0,0 +1,107 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/tis620.h b/vendors/libiconv/include/tis620.h new file mode 100644 index 0000000..125e6dc --- /dev/null +++ b/vendors/libiconv/include/tis620.h @@ -0,0 +1,52 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/translit.def b/vendors/libiconv/include/translit.def new file mode 100644 index 0000000..cbd329e --- /dev/null +++ b/vendors/libiconv/include/translit.def @@ -0,0 +1,3918 @@ +# 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 diff --git a/vendors/libiconv/include/translit.h b/vendors/libiconv/include/translit.h new file mode 100644 index 0000000..15aa447 --- /dev/null +++ b/vendors/libiconv/include/translit.h @@ -0,0 +1,4411 @@ +/* + * 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) diff --git a/vendors/libiconv/include/ucs2.h b/vendors/libiconv/include/ucs2.h new file mode 100644 index 0000000..206b8cc --- /dev/null +++ b/vendors/libiconv/include/ucs2.h @@ -0,0 +1,68 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/ucs2be.h b/vendors/libiconv/include/ucs2be.h new file mode 100644 index 0000000..150c0a3 --- /dev/null +++ b/vendors/libiconv/include/ucs2be.h @@ -0,0 +1,51 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/ucs2internal.h b/vendors/libiconv/include/ucs2internal.h new file mode 100644 index 0000000..d482aea --- /dev/null +++ b/vendors/libiconv/include/ucs2internal.h @@ -0,0 +1,51 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/ucs2le.h b/vendors/libiconv/include/ucs2le.h new file mode 100644 index 0000000..4901861 --- /dev/null +++ b/vendors/libiconv/include/ucs2le.h @@ -0,0 +1,51 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/ucs2swapped.h b/vendors/libiconv/include/ucs2swapped.h new file mode 100644 index 0000000..f426f40 --- /dev/null +++ b/vendors/libiconv/include/ucs2swapped.h @@ -0,0 +1,60 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/ucs4.h b/vendors/libiconv/include/ucs4.h new file mode 100644 index 0000000..00d08d2 --- /dev/null +++ b/vendors/libiconv/include/ucs4.h @@ -0,0 +1,69 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/ucs4be.h b/vendors/libiconv/include/ucs4be.h new file mode 100644 index 0000000..241bc15 --- /dev/null +++ b/vendors/libiconv/include/ucs4be.h @@ -0,0 +1,46 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/ucs4internal.h b/vendors/libiconv/include/ucs4internal.h new file mode 100644 index 0000000..bd793a3 --- /dev/null +++ b/vendors/libiconv/include/ucs4internal.h @@ -0,0 +1,43 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/ucs4le.h b/vendors/libiconv/include/ucs4le.h new file mode 100644 index 0000000..0c762fe --- /dev/null +++ b/vendors/libiconv/include/ucs4le.h @@ -0,0 +1,46 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/ucs4swapped.h b/vendors/libiconv/include/ucs4swapped.h new file mode 100644 index 0000000..6a292ec --- /dev/null +++ b/vendors/libiconv/include/ucs4swapped.h @@ -0,0 +1,53 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/uhc_1.h b/vendors/libiconv/include/uhc_1.h new file mode 100644 index 0000000..7b0c725 --- /dev/null +++ b/vendors/libiconv/include/uhc_1.h @@ -0,0 +1,1725 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/uhc_2.h b/vendors/libiconv/include/uhc_2.h new file mode 100644 index 0000000..4aa290a --- /dev/null +++ b/vendors/libiconv/include/uhc_2.h @@ -0,0 +1,1022 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/utf16.h b/vendors/libiconv/include/utf16.h new file mode 100644 index 0000000..99b5e2c --- /dev/null +++ b/vendors/libiconv/include/utf16.h @@ -0,0 +1,113 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/utf16be.h b/vendors/libiconv/include/utf16be.h new file mode 100644 index 0000000..a6d90ff --- /dev/null +++ b/vendors/libiconv/include/utf16be.h @@ -0,0 +1,80 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/utf16le.h b/vendors/libiconv/include/utf16le.h new file mode 100644 index 0000000..5bb2b02 --- /dev/null +++ b/vendors/libiconv/include/utf16le.h @@ -0,0 +1,80 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/utf32.h b/vendors/libiconv/include/utf32.h new file mode 100644 index 0000000..bc579ae --- /dev/null +++ b/vendors/libiconv/include/utf32.h @@ -0,0 +1,93 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/utf32be.h b/vendors/libiconv/include/utf32be.h new file mode 100644 index 0000000..5081129 --- /dev/null +++ b/vendors/libiconv/include/utf32be.h @@ -0,0 +1,55 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/utf32le.h b/vendors/libiconv/include/utf32le.h new file mode 100644 index 0000000..9d3699b --- /dev/null +++ b/vendors/libiconv/include/utf32le.h @@ -0,0 +1,55 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/utf7.h b/vendors/libiconv/include/utf7.h new file mode 100644 index 0000000..888bfb4 --- /dev/null +++ b/vendors/libiconv/include/utf7.h @@ -0,0 +1,355 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/utf8.h b/vendors/libiconv/include/utf8.h new file mode 100644 index 0000000..9d07219 --- /dev/null +++ b/vendors/libiconv/include/utf8.h @@ -0,0 +1,128 @@ +/* + * 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; +} diff --git a/vendors/libiconv/include/vietcomb.h b/vendors/libiconv/include/vietcomb.h new file mode 100644 index 0000000..023b5e3 --- /dev/null +++ b/vendors/libiconv/include/vietcomb.h @@ -0,0 +1,466 @@ +/* + * 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 */ diff --git a/vendors/libiconv/include/viscii.h b/vendors/libiconv/include/viscii.h new file mode 100644 index 0000000..04e68fa --- /dev/null +++ b/vendors/libiconv/include/viscii.h @@ -0,0 +1,141 @@ +/* + * 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; +} diff --git a/vendors/libiconv/libiconv.rc b/vendors/libiconv/libiconv.rc new file mode 100644 index 0000000..e7ec0ad --- /dev/null +++ b/vendors/libiconv/libiconv.rc @@ -0,0 +1,42 @@ +/* Resources for iconv.dll */ + +#include +#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 diff --git a/vendors/libiconv/libiconv.vcxproj b/vendors/libiconv/libiconv.vcxproj new file mode 100644 index 0000000..0d626e6 --- /dev/null +++ b/vendors/libiconv/libiconv.vcxproj @@ -0,0 +1,326 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {0788DB65-CD86-4A0D-A245-F29C0114373B} + Win32Proj + libiconv + + + + StaticLibrary + true + v110 + Unicode + + + StaticLibrary + false + v110 + true + Unicode + + + + + + + + + + + + + .lib + $(SolutionDir)$(Configuration)\ + + + $(TC10Install)\Bin\Extensions\iOS\ + + + + NotUsing + Level3 + Disabled + true + $(ProjectDir);$(ProjectDir)include;%(AdditionalIncludeDirectories) + BUILDING_LIBICONV;BUILDING_LIBCHARSET;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + + + Windows + true + + + + + Level3 + + + MaxSpeed + true + true + BUILDING_LIBICONV;BUILDING_LIBCHARSET;_CRT_SECURE_NO_WARNINGS;NDEBUG;%(PreprocessorDefinitions) + true + $(ProjectDir);$(ProjectDir)include;%(AdditionalIncludeDirectories) + MultiThreaded + + + Windows + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vendors/libiconv/libiconv.vcxproj.filters b/vendors/libiconv/libiconv.vcxproj.filters new file mode 100644 index 0000000..be4f395 --- /dev/null +++ b/vendors/libiconv/libiconv.vcxproj.filters @@ -0,0 +1,718 @@ + + + + + {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 + + + 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 + + + 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 + + + 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 + + + + + Source Files + + + Source Files + + + Source Files + + + + + Resource Files + + + \ No newline at end of file diff --git a/vendors/libiconv/localcharset.c b/vendors/libiconv/localcharset.c new file mode 100644 index 0000000..e0d7667 --- /dev/null +++ b/vendors/libiconv/localcharset.c @@ -0,0 +1,543 @@ +/* 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 + +/* 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; +} diff --git a/vendors/libiconv/localcharset.h b/vendors/libiconv/localcharset.h new file mode 100644 index 0000000..29f8f05 --- /dev/null +++ b/vendors/libiconv/localcharset.h @@ -0,0 +1,50 @@ +/* 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 + +#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 */ diff --git a/vendors/libiconv/relocatable.c b/vendors/libiconv/relocatable.c new file mode 100644 index 0000000..a7bbd99 --- /dev/null +++ b/vendors/libiconv/relocatable.c @@ -0,0 +1,483 @@ +/* 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 diff --git a/vendors/libiconv/relocatable.h b/vendors/libiconv/relocatable.h new file mode 100644 index 0000000..68fe83e --- /dev/null +++ b/vendors/libiconv/relocatable.h @@ -0,0 +1,83 @@ +/* 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 */ diff --git a/vendors/libxml/config.h b/vendors/libxml/config.h new file mode 100644 index 0000000..8629944 --- /dev/null +++ b/vendors/libxml/config.h @@ -0,0 +1,125 @@ +#ifndef __LIBXML_WIN32_CONFIG__ +#define __LIBXML_WIN32_CONFIG__ + +#define HAVE_CTYPE_H +#define HAVE_STDARG_H +#define HAVE_MALLOC_H +#define HAVE_ERRNO_H +#define HAVE_STDINT_H + +#if defined(_WIN32_WCE) +#undef HAVE_ERRNO_H +#include +#include "wincecompat.h" +#else +#define HAVE_SYS_STAT_H +#define HAVE__STAT +#define HAVE_STAT +#define HAVE_STDLIB_H +#define HAVE_TIME_H +#define HAVE_FCNTL_H +#include +#include +#endif + +#include + +#ifndef ICONV_CONST +#define ICONV_CONST const +#endif + +#ifdef NEED_SOCKETS +#include +#endif + +/* + * Windows platforms may define except + */ +#undef except + +#define HAVE_ISINF +#define HAVE_ISNAN +#include +#if defined(_MSC_VER) || defined(__BORLANDC__) +/* MS C-runtime has functions which can be used in order to determine if + a given floating-point variable contains NaN, (+-)INF. These are + preferred, because floating-point technology is considered propriatary + by MS and we can assume that their functions know more about their + oddities than we do. */ +#include +/* Bjorn Reese figured a quite nice construct for isinf() using the _fpclass + function. */ +#ifndef isinf +#define isinf(d) ((_fpclass(d) == _FPCLASS_PINF) ? 1 \ + : ((_fpclass(d) == _FPCLASS_NINF) ? -1 : 0)) +#endif +/* _isnan(x) returns nonzero if (x == NaN) and zero otherwise. */ +#ifndef isnan +#define isnan(d) (_isnan(d)) +#endif +#else /* _MSC_VER */ +#ifndef isinf +static int isinf (double d) { + int expon = 0; + double val = frexp (d, &expon); + if (expon == 1025) { + if (val == 0.5) { + return 1; + } else if (val == -0.5) { + return -1; + } else { + return 0; + } + } else { + return 0; + } +} +#endif +#ifndef isnan +static int isnan (double d) { + int expon = 0; + double val = frexp (d, &expon); + if (expon == 1025) { + if (val == 0.5) { + return 0; + } else if (val == -0.5) { + return 0; + } else { + return 1; + } + } else { + return 0; + } +} +#endif +#endif /* _MSC_VER */ + +#if defined(_MSC_VER) +#define mkdir(p,m) _mkdir(p) +#define snprintf _snprintf +#if _MSC_VER < 1500 +#define vsnprintf(b,c,f,a) _vsnprintf(b,c,f,a) +#endif +#elif defined(__MINGW32__) +#define mkdir(p,m) _mkdir(p) +#endif + +/* Threading API to use should be specified here for compatibility reasons. + This is however best specified on the compiler's command-line. */ +#if defined(LIBXML_THREAD_ENABLED) +#if !defined(HAVE_PTHREAD_H) && !defined(HAVE_WIN32_THREADS) && !defined(_WIN32_WCE) +#define HAVE_WIN32_THREADS +#endif +#endif + +/* Some third-party libraries far from our control assume the following + is defined, which it is not if we don't include windows.h. */ +#if !defined(FALSE) +#define FALSE 0 +#endif +#if !defined(TRUE) +#define TRUE (!(FALSE)) +#endif + +#endif /* __LIBXML_WIN32_CONFIG__ */ + diff --git a/vendors/libxml/include/libxml.h b/vendors/libxml/include/libxml.h new file mode 100644 index 0000000..2da9044 --- /dev/null +++ b/vendors/libxml/include/libxml.h @@ -0,0 +1,112 @@ +/* + * libxml.h: internal header only used during the compilation of libxml + * + * See COPYRIGHT for the status of this software + * + * Author: breese@users.sourceforge.net + */ + +#ifndef __XML_LIBXML_H__ +#define __XML_LIBXML_H__ + +#ifndef NO_LARGEFILE_SOURCE +#ifndef _LARGEFILE_SOURCE +#define _LARGEFILE_SOURCE +#endif +#ifndef _FILE_OFFSET_BITS +#define _FILE_OFFSET_BITS 64 +#endif +#endif + +#if defined(macintosh) +#include "config-mac.h" +#elif defined(_WIN32_WCE) +/* + * Windows CE compatibility definitions and functions + * This is needed to compile libxml2 for Windows CE. + * At least I tested it with WinCE 5.0 for Emulator and WinCE 4.2/SH4 target + */ +#include +#include +#else +/* + * Currently supported platforms use either autoconf or + * copy to config.h own "preset" configuration file. + * As result ifdef HAVE_CONFIG_H is omited here. + */ +#include "config.h" +#include +#endif + +#if defined(__Lynx__) +#include /* pull definition of size_t */ +#include +int snprintf(char *, size_t, const char *, ...); +int vfprintf(FILE *, const char *, va_list); +#endif + +#ifndef WITH_TRIO +#include +#else +/** + * TRIO_REPLACE_STDIO: + * + * This macro is defined if teh trio string formatting functions are to + * be used instead of the default stdio ones. + */ +#define TRIO_REPLACE_STDIO +#include "trio.h" +#endif + +/* + * Internal variable indicating if a callback has been registered for + * node creation/destruction. It avoids spending a lot of time in locking + * function while checking if the callback exists. + */ +extern int __xmlRegisterCallbacks; +/* + * internal error reporting routines, shared but not partof the API. + */ +void __xmlIOErr(int domain, int code, const char *extra); +void __xmlLoaderErr(void *ctx, const char *msg, const char *filename); +#ifdef LIBXML_HTML_ENABLED +/* + * internal function of HTML parser needed for xmlParseInNodeContext + * but not part of the API + */ +void __htmlParseContent(void *ctx); +#endif + +/* + * internal global initialization critical section routines. + */ +void __xmlGlobalInitMutexLock(void); +void __xmlGlobalInitMutexUnlock(void); +void __xmlGlobalInitMutexDestroy(void); + +int __xmlInitializeDict(void); + +#if defined(HAVE_RAND) && defined(HAVE_SRAND) && defined(HAVE_TIME) +/* + * internal thread safe random function + */ +int __xmlRandom(void); +#endif + +int xmlNop(void); + +#ifdef IN_LIBXML +#ifdef __GNUC__ +#ifdef PIC +#ifdef linux +#if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || (__GNUC__ > 3) +#include "elfgcchack.h" +#endif +#endif +#endif +#endif +#endif +#if !defined(PIC) && !defined(NOLIBTOOL) +# define LIBXML_STATIC +#endif +#endif /* ! __XML_LIBXML_H__ */ diff --git a/vendors/libxml/libxml2-focus.vcxproj b/vendors/libxml/libxml2-focus.vcxproj new file mode 100644 index 0000000..deaaadb --- /dev/null +++ b/vendors/libxml/libxml2-focus.vcxproj @@ -0,0 +1,184 @@ + + + + + Debug DLL + Win32 + + + Debug + Win32 + + + Release DLL + Win32 + + + Release + Win32 + + + + {7EA50C94-26BD-4893-B773-625CD3D3DEA6} + libxml2 + + + + StaticLibrary + true + Unicode + + + StaticLibrary + true + Unicode + + + StaticLibrary + false + true + Unicode + + + StaticLibrary + Unicode + true + + + + + + + + + + + + + + + + + + + + + + $(ProjectDir)..\..\lib\ + + + $(ProjectDir)..\..\lib\ + + + + + $(ProjectDir)..\..\lib\ + + + $(ProjectDir)..\..\lib\ + + + + Level3 + Disabled + $(ProjectDir);$(ProjectDir)..\..\include;$(ProjectDir)..\..\..\libiconv-1.14\include + 4018; 4996 + /MP %(AdditionalOptions) + false + + + true + + + + + Level3 + Disabled + $(ProjectDir);$(ProjectDir)..\..\include;$(ProjectDir)..\..\..\libiconv-1.14\include + 4018; 4996 + /MP %(AdditionalOptions) + false + + + true + + + + + Level3 + MaxSpeed + true + true + /MP %(AdditionalOptions) + $(ProjectDir);$(ProjectDir)..\..\include;$(ProjectDir)..\..\..\libiconv-1.14\include + 4018; 4996 + + + true + true + true + + + + + /MP %(AdditionalOptions) + $(ProjectDir);$(ProjectDir)..\..\include;$(ProjectDir)..\..\..\libiconv-1.14\include + 4018; 4996 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vendors/libxml/libxml2.sln b/vendors/libxml/libxml2.sln new file mode 100644 index 0000000..9721ed1 --- /dev/null +++ b/vendors/libxml/libxml2.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libxml2", "libxml2.vcxproj", "{1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Debug|Win32.ActiveCfg = Debug|Win32 + {1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Debug|Win32.Build.0 = Debug|Win32 + {1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Release|Win32.ActiveCfg = Release|Win32 + {1D6039F6-5078-416F-A3AF-A36EFC7E6A1C}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/vendors/libxml/libxml2.vcxproj b/vendors/libxml/libxml2.vcxproj new file mode 100644 index 0000000..362d168 --- /dev/null +++ b/vendors/libxml/libxml2.vcxproj @@ -0,0 +1,145 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {1D6039F6-5078-416F-A3AF-A36EFC7E6A1C} + libxml2 + + + + StaticLibrary + true + Unicode + v110 + + + StaticLibrary + false + true + MultiByte + v110 + + + + + + + + + + + + + $(SolutionDir)$(Configuration)\ + + + build\$(ProjectName)$(Configuration)\ + + + $(TC10Install)\Bin\Extensions\iOS\ + + + + Level3 + Disabled + $(ProjectDir);$(ProjectDir)src;$(ProjectDir)include;$(SolutionDir)vendors\libiconv\include;%(AdditionalIncludeDirectories) + 4996 + false + true + USING_STATIC_LIBICONV;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + + + true + + + + + Level3 + MaxSpeed + true + true + USING_STATIC_LIBICONV;%(PreprocessorDefinitions) + $(ProjectDir);$(ProjectDir)src;$(ProjectDir)include;$(SolutionDir)vendors\libiconv\include;%(AdditionalIncludeDirectories) + 4996 + MultiThreaded + + + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + {0788db65-cd86-4a0d-a245-f29c0114373b} + + + + + + \ No newline at end of file diff --git a/vendors/libxml/libxml2.vcxproj.filters b/vendors/libxml/libxml2.vcxproj.filters new file mode 100644 index 0000000..8f138b3 --- /dev/null +++ b/vendors/libxml/libxml2.vcxproj.filters @@ -0,0 +1,174 @@ + + + + + {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 + + + {22791c14-7c07-4222-ad58-8c18d3fb10ba} + + + {bfddc99f-05d4-4f06-98d1-346b1be73d6f} + + + + + 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\windows\VC10 + + + Header Files + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/vendors/libxml/src/DOCBparser.c b/vendors/libxml/src/DOCBparser.c new file mode 100644 index 0000000..f12511b --- /dev/null +++ b/vendors/libxml/src/DOCBparser.c @@ -0,0 +1,305 @@ +/* + * DOCBparser.c : an attempt to parse SGML Docbook documents + * + * This is deprecated !!! + * Code removed with release 2.6.0 it was broken. + * The doc are expect to be migrated to XML DocBook + * + * See Copyright for the status of this software. + * + * daniel@veillard.com + */ + +#define IN_LIBXML +#include "libxml.h" +#ifdef LIBXML_DOCB_ENABLED + +#include +#include + +/** + * docbEncodeEntities: + * @out: a pointer to an array of bytes to store the result + * @outlen: the length of @out + * @in: a pointer to an array of UTF-8 chars + * @inlen: the length of @in + * @quoteChar: the quote character to escape (' or ") or zero. + * + * Take a block of UTF-8 chars in and try to convert it to an ASCII + * plus SGML entities block of chars out. + * + * Returns 0 if success, -2 if the transcoding fails, or -1 otherwise + * The value of @inlen after return is the number of octets consumed + * as the return value is positive, else unpredictable. + * The value of @outlen after return is the number of octets consumed. + */ +int +docbEncodeEntities(unsigned char *out ATTRIBUTE_UNUSED, + int *outlen ATTRIBUTE_UNUSED, + const unsigned char *in ATTRIBUTE_UNUSED, + int *inlen ATTRIBUTE_UNUSED, + int quoteChar ATTRIBUTE_UNUSED) +{ + static int deprecated = 0; + + if (!deprecated) { + xmlGenericError(xmlGenericErrorContext, + "docbEncodeEntities() deprecated function reached\n"); + deprecated = 1; + } + return(-1); +} + +/** + * docbParseDocument: + * @ctxt: an SGML parser context + * + * parse an SGML document (and build a tree if using the standard SAX + * interface). + * + * Returns 0, -1 in case of error. the parser context is augmented + * as a result of the parsing. + */ + +int +docbParseDocument(docbParserCtxtPtr ctxt ATTRIBUTE_UNUSED) +{ + static int deprecated = 0; + + if (!deprecated) { + xmlGenericError(xmlGenericErrorContext, + "docbParseDocument() deprecated function reached\n"); + deprecated = 1; + } + return (xmlParseDocument(ctxt)); +} + +/** + * docbFreeParserCtxt: + * @ctxt: an SGML parser context + * + * Free all the memory used by a parser context. However the parsed + * document in ctxt->myDoc is not freed. + */ + +void +docbFreeParserCtxt(docbParserCtxtPtr ctxt ATTRIBUTE_UNUSED) +{ + static int deprecated = 0; + + if (!deprecated) { + xmlGenericError(xmlGenericErrorContext, + "docbFreeParserCtxt() deprecated function reached\n"); + deprecated = 1; + } + xmlFreeParserCtxt(ctxt); +} + +/** + * docbParseChunk: + * @ctxt: an XML parser context + * @chunk: an char array + * @size: the size in byte of the chunk + * @terminate: last chunk indicator + * + * Parse a Chunk of memory + * + * Returns zero if no error, the xmlParserErrors otherwise. + */ +int +docbParseChunk(docbParserCtxtPtr ctxt ATTRIBUTE_UNUSED, + const char *chunk ATTRIBUTE_UNUSED, + int size ATTRIBUTE_UNUSED, + int terminate ATTRIBUTE_UNUSED) +{ + static int deprecated = 0; + + if (!deprecated) { + xmlGenericError(xmlGenericErrorContext, + "docbParseChunk() deprecated function reached\n"); + deprecated = 1; + } + + return (xmlParseChunk(ctxt, chunk, size, terminate)); +} + +/** + * docbCreatePushParserCtxt: + * @sax: a SAX handler + * @user_data: The user data returned on SAX callbacks + * @chunk: a pointer to an array of chars + * @size: number of chars in the array + * @filename: an optional file name or URI + * @enc: an optional encoding + * + * Create a parser context for using the DocBook SGML parser in push mode + * To allow content encoding detection, @size should be >= 4 + * The value of @filename is used for fetching external entities + * and error/warning reports. + * + * Returns the new parser context or NULL + */ +docbParserCtxtPtr +docbCreatePushParserCtxt(docbSAXHandlerPtr sax ATTRIBUTE_UNUSED, + void *user_data ATTRIBUTE_UNUSED, + const char *chunk ATTRIBUTE_UNUSED, + int size ATTRIBUTE_UNUSED, + const char *filename ATTRIBUTE_UNUSED, + xmlCharEncoding enc ATTRIBUTE_UNUSED) +{ + static int deprecated = 0; + + if (!deprecated) { + xmlGenericError(xmlGenericErrorContext, + "docbParseChunk() deprecated function reached\n"); + deprecated = 1; + } + + return(xmlCreatePushParserCtxt(sax, user_data, chunk, size, filename)); +} + +/** + * docbSAXParseDoc: + * @cur: a pointer to an array of xmlChar + * @encoding: a free form C string describing the SGML document encoding, or NULL + * @sax: the SAX handler block + * @userData: if using SAX, this pointer will be provided on callbacks. + * + * parse an SGML in-memory document and build a tree. + * It use the given SAX function block to handle the parsing callback. + * If sax is NULL, fallback to the default DOM tree building routines. + * + * Returns the resulting document tree + */ + +docbDocPtr +docbSAXParseDoc(xmlChar * cur ATTRIBUTE_UNUSED, + const char *encoding ATTRIBUTE_UNUSED, + docbSAXHandlerPtr sax ATTRIBUTE_UNUSED, + void *userData ATTRIBUTE_UNUSED) +{ + static int deprecated = 0; + + if (!deprecated) { + xmlGenericError(xmlGenericErrorContext, + "docbParseChunk() deprecated function reached\n"); + deprecated = 1; + } + + return (xmlSAXParseMemoryWithData(sax, (const char *)cur, + xmlStrlen((const xmlChar *) cur), 0, userData)); +} + +/** + * docbParseDoc: + * @cur: a pointer to an array of xmlChar + * @encoding: a free form C string describing the SGML document encoding, or NULL + * + * parse an SGML in-memory document and build a tree. + * + * Returns the resulting document tree + */ + +docbDocPtr +docbParseDoc(xmlChar * cur ATTRIBUTE_UNUSED, + const char *encoding ATTRIBUTE_UNUSED) +{ + static int deprecated = 0; + + if (!deprecated) { + xmlGenericError(xmlGenericErrorContext, + "docbParseChunk() deprecated function reached\n"); + deprecated = 1; + } + + return (xmlParseDoc(cur)); +} + + +/** + * docbCreateFileParserCtxt: + * @filename: the filename + * @encoding: the SGML document encoding, or NULL + * + * Create a parser context for a file content. + * Automatic support for ZLIB/Compress compressed document is provided + * by default if found at compile-time. + * + * Returns the new parser context or NULL + */ +docbParserCtxtPtr +docbCreateFileParserCtxt(const char *filename ATTRIBUTE_UNUSED, + const char *encoding ATTRIBUTE_UNUSED) +{ + static int deprecated = 0; + + if (!deprecated) { + xmlGenericError(xmlGenericErrorContext, + "docbCreateFileParserCtxt() deprecated function reached\n"); + deprecated = 1; + } + + return (xmlCreateFileParserCtxt(filename)); +} + +/** + * docbSAXParseFile: + * @filename: the filename + * @encoding: a free form C string describing the SGML document encoding, or NULL + * @sax: the SAX handler block + * @userData: if using SAX, this pointer will be provided on callbacks. + * + * parse an SGML file and build a tree. Automatic support for ZLIB/Compress + * compressed document is provided by default if found at compile-time. + * It use the given SAX function block to handle the parsing callback. + * If sax is NULL, fallback to the default DOM tree building routines. + * + * Returns the resulting document tree + */ + +docbDocPtr +docbSAXParseFile(const char *filename ATTRIBUTE_UNUSED, + const char *encoding ATTRIBUTE_UNUSED, + docbSAXHandlerPtr sax ATTRIBUTE_UNUSED, + void *userData ATTRIBUTE_UNUSED) +{ + static int deprecated = 0; + + if (!deprecated) { + xmlGenericError(xmlGenericErrorContext, + "docbSAXParseFile() deprecated function reached\n"); + deprecated = 1; + } + + return (xmlSAXParseFileWithData(sax, filename, 0, userData)); +} + +/** + * docbParseFile: + * @filename: the filename + * @encoding: a free form C string describing document encoding, or NULL + * + * parse a Docbook SGML file and build a tree. Automatic support for + * ZLIB/Compress compressed document is provided by default if found + * at compile-time. + * + * Returns the resulting document tree + */ + +docbDocPtr +docbParseFile(const char *filename ATTRIBUTE_UNUSED, + const char *encoding ATTRIBUTE_UNUSED) +{ + static int deprecated = 0; + + if (!deprecated) { + xmlGenericError(xmlGenericErrorContext, + "docbParseFile() deprecated function reached\n"); + deprecated = 1; + } + + return (xmlParseFile(filename)); +} +#define bottom_DOCBparser +#include "elfgcchack.h" +#endif /* LIBXML_DOCB_ENABLED */ diff --git a/vendors/libxml/src/HTMLparser.c b/vendors/libxml/src/HTMLparser.c new file mode 100644 index 0000000..dd0c1ea --- /dev/null +++ b/vendors/libxml/src/HTMLparser.c @@ -0,0 +1,7077 @@ +/* + * HTMLparser.c : an HTML 4.0 non-verifying parser + * + * See Copyright for the status of this software. + * + * daniel@veillard.com + */ + +#define IN_LIBXML +#include "libxml.h" +#ifdef LIBXML_HTML_ENABLED + +#include +#ifdef HAVE_CTYPE_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_FCNTL_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_ZLIB_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "buf.h" +#include "enc.h" + +#define HTML_MAX_NAMELEN 1000 +#define HTML_PARSER_BIG_BUFFER_SIZE 1000 +#define HTML_PARSER_BUFFER_SIZE 100 + +/* #define DEBUG */ +/* #define DEBUG_PUSH */ + +static int htmlOmittedDefaultValue = 1; + +xmlChar * htmlDecodeEntities(htmlParserCtxtPtr ctxt, int len, + xmlChar end, xmlChar end2, xmlChar end3); +static void htmlParseComment(htmlParserCtxtPtr ctxt); + +/************************************************************************ + * * + * Some factorized error routines * + * * + ************************************************************************/ + +/** + * htmlErrMemory: + * @ctxt: an HTML parser context + * @extra: extra informations + * + * Handle a redefinition of attribute error + */ +static void +htmlErrMemory(xmlParserCtxtPtr ctxt, const char *extra) +{ + if ((ctxt != NULL) && (ctxt->disableSAX != 0) && + (ctxt->instate == XML_PARSER_EOF)) + return; + if (ctxt != NULL) { + ctxt->errNo = XML_ERR_NO_MEMORY; + ctxt->instate = XML_PARSER_EOF; + ctxt->disableSAX = 1; + } + if (extra) + __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, + XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, extra, + NULL, NULL, 0, 0, + "Memory allocation failed : %s\n", extra); + else + __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, + XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, NULL, + NULL, NULL, 0, 0, "Memory allocation failed\n"); +} + +/** + * htmlParseErr: + * @ctxt: an HTML parser context + * @error: the error number + * @msg: the error message + * @str1: string infor + * @str2: string infor + * + * Handle a fatal parser error, i.e. violating Well-Formedness constraints + */ +static void +htmlParseErr(xmlParserCtxtPtr ctxt, xmlParserErrors error, + const char *msg, const xmlChar *str1, const xmlChar *str2) +{ + if ((ctxt != NULL) && (ctxt->disableSAX != 0) && + (ctxt->instate == XML_PARSER_EOF)) + return; + if (ctxt != NULL) + ctxt->errNo = error; + __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_HTML, error, + XML_ERR_ERROR, NULL, 0, + (const char *) str1, (const char *) str2, + NULL, 0, 0, + msg, str1, str2); + if (ctxt != NULL) + ctxt->wellFormed = 0; +} + +/** + * htmlParseErrInt: + * @ctxt: an HTML parser context + * @error: the error number + * @msg: the error message + * @val: integer info + * + * Handle a fatal parser error, i.e. violating Well-Formedness constraints + */ +static void +htmlParseErrInt(xmlParserCtxtPtr ctxt, xmlParserErrors error, + const char *msg, int val) +{ + if ((ctxt != NULL) && (ctxt->disableSAX != 0) && + (ctxt->instate == XML_PARSER_EOF)) + return; + if (ctxt != NULL) + ctxt->errNo = error; + __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_HTML, error, + XML_ERR_ERROR, NULL, 0, NULL, NULL, + NULL, val, 0, msg, val); + if (ctxt != NULL) + ctxt->wellFormed = 0; +} + +/************************************************************************ + * * + * Parser stacks related functions and macros * + * * + ************************************************************************/ + +/** + * htmlnamePush: + * @ctxt: an HTML parser context + * @value: the element name + * + * Pushes a new element name on top of the name stack + * + * Returns 0 in case of error, the index in the stack otherwise + */ +static int +htmlnamePush(htmlParserCtxtPtr ctxt, const xmlChar * value) +{ + if ((ctxt->html < 3) && (xmlStrEqual(value, BAD_CAST "head"))) + ctxt->html = 3; + if ((ctxt->html < 10) && (xmlStrEqual(value, BAD_CAST "body"))) + ctxt->html = 10; + if (ctxt->nameNr >= ctxt->nameMax) { + ctxt->nameMax *= 2; + ctxt->nameTab = (const xmlChar * *) + xmlRealloc((xmlChar * *)ctxt->nameTab, + ctxt->nameMax * + sizeof(ctxt->nameTab[0])); + if (ctxt->nameTab == NULL) { + htmlErrMemory(ctxt, NULL); + return (0); + } + } + ctxt->nameTab[ctxt->nameNr] = value; + ctxt->name = value; + return (ctxt->nameNr++); +} +/** + * htmlnamePop: + * @ctxt: an HTML parser context + * + * Pops the top element name from the name stack + * + * Returns the name just removed + */ +static const xmlChar * +htmlnamePop(htmlParserCtxtPtr ctxt) +{ + const xmlChar *ret; + + if (ctxt->nameNr <= 0) + return (NULL); + ctxt->nameNr--; + if (ctxt->nameNr < 0) + return (NULL); + if (ctxt->nameNr > 0) + ctxt->name = ctxt->nameTab[ctxt->nameNr - 1]; + else + ctxt->name = NULL; + ret = ctxt->nameTab[ctxt->nameNr]; + ctxt->nameTab[ctxt->nameNr] = NULL; + return (ret); +} + +/** + * htmlNodeInfoPush: + * @ctxt: an HTML parser context + * @value: the node info + * + * Pushes a new element name on top of the node info stack + * + * Returns 0 in case of error, the index in the stack otherwise + */ +static int +htmlNodeInfoPush(htmlParserCtxtPtr ctxt, htmlParserNodeInfo *value) +{ + if (ctxt->nodeInfoNr >= ctxt->nodeInfoMax) { + if (ctxt->nodeInfoMax == 0) + ctxt->nodeInfoMax = 5; + ctxt->nodeInfoMax *= 2; + ctxt->nodeInfoTab = (htmlParserNodeInfo *) + xmlRealloc((htmlParserNodeInfo *)ctxt->nodeInfoTab, + ctxt->nodeInfoMax * + sizeof(ctxt->nodeInfoTab[0])); + if (ctxt->nodeInfoTab == NULL) { + htmlErrMemory(ctxt, NULL); + return (0); + } + } + ctxt->nodeInfoTab[ctxt->nodeInfoNr] = *value; + ctxt->nodeInfo = &ctxt->nodeInfoTab[ctxt->nodeInfoNr]; + return (ctxt->nodeInfoNr++); +} + +/** + * htmlNodeInfoPop: + * @ctxt: an HTML parser context + * + * Pops the top element name from the node info stack + * + * Returns 0 in case of error, the pointer to NodeInfo otherwise + */ +static htmlParserNodeInfo * +htmlNodeInfoPop(htmlParserCtxtPtr ctxt) +{ + if (ctxt->nodeInfoNr <= 0) + return (NULL); + ctxt->nodeInfoNr--; + if (ctxt->nodeInfoNr < 0) + return (NULL); + if (ctxt->nodeInfoNr > 0) + ctxt->nodeInfo = &ctxt->nodeInfoTab[ctxt->nodeInfoNr - 1]; + else + ctxt->nodeInfo = NULL; + return &ctxt->nodeInfoTab[ctxt->nodeInfoNr]; +} + +/* + * Macros for accessing the content. Those should be used only by the parser, + * and not exported. + * + * Dirty macros, i.e. one need to make assumption on the context to use them + * + * CUR_PTR return the current pointer to the xmlChar to be parsed. + * CUR returns the current xmlChar value, i.e. a 8 bit value if compiled + * in ISO-Latin or UTF-8, and the current 16 bit value if compiled + * in UNICODE mode. This should be used internally by the parser + * only to compare to ASCII values otherwise it would break when + * running with UTF-8 encoding. + * NXT(n) returns the n'th next xmlChar. Same as CUR is should be used only + * to compare on ASCII based substring. + * UPP(n) returns the n'th next xmlChar converted to uppercase. Same as CUR + * it should be used only to compare on ASCII based substring. + * SKIP(n) Skip n xmlChar, and must also be used only to skip ASCII defined + * strings without newlines within the parser. + * + * Clean macros, not dependent of an ASCII context, expect UTF-8 encoding + * + * CURRENT Returns the current char value, with the full decoding of + * UTF-8 if we are using this mode. It returns an int. + * NEXT Skip to the next character, this does the proper decoding + * in UTF-8 mode. It also pop-up unfinished entities on the fly. + * NEXTL(l) Skip the current unicode character of l xmlChars long. + * COPY(to) copy one char to *to, increment CUR_PTR and to accordingly + */ + +#define UPPER (toupper(*ctxt->input->cur)) + +#define SKIP(val) ctxt->nbChars += (val),ctxt->input->cur += (val),ctxt->input->col+=(val) + +#define NXT(val) ctxt->input->cur[(val)] + +#define UPP(val) (toupper(ctxt->input->cur[(val)])) + +#define CUR_PTR ctxt->input->cur + +#define SHRINK if ((ctxt->input->cur - ctxt->input->base > 2 * INPUT_CHUNK) && \ + (ctxt->input->end - ctxt->input->cur < 2 * INPUT_CHUNK)) \ + xmlParserInputShrink(ctxt->input) + +#define GROW if ((ctxt->progressive == 0) && \ + (ctxt->input->end - ctxt->input->cur < INPUT_CHUNK)) \ + xmlParserInputGrow(ctxt->input, INPUT_CHUNK) + +#define CURRENT ((int) (*ctxt->input->cur)) + +#define SKIP_BLANKS htmlSkipBlankChars(ctxt) + +/* Inported from XML */ + +/* #define CUR (ctxt->token ? ctxt->token : (int) (*ctxt->input->cur)) */ +#define CUR ((int) (*ctxt->input->cur)) +#define NEXT xmlNextChar(ctxt) + +#define RAW (ctxt->token ? -1 : (*ctxt->input->cur)) + + +#define NEXTL(l) do { \ + if (*(ctxt->input->cur) == '\n') { \ + ctxt->input->line++; ctxt->input->col = 1; \ + } else ctxt->input->col++; \ + ctxt->token = 0; ctxt->input->cur += l; ctxt->nbChars++; \ + } while (0) + +/************ + \ + if (*ctxt->input->cur == '%') xmlParserHandlePEReference(ctxt); \ + if (*ctxt->input->cur == '&') xmlParserHandleReference(ctxt); + ************/ + +#define CUR_CHAR(l) htmlCurrentChar(ctxt, &l) +#define CUR_SCHAR(s, l) xmlStringCurrentChar(ctxt, s, &l) + +#define COPY_BUF(l,b,i,v) \ + if (l == 1) b[i++] = (xmlChar) v; \ + else i += xmlCopyChar(l,&b[i],v) + +/** + * htmlFindEncoding: + * @the HTML parser context + * + * Ty to find and encoding in the current data available in the input + * buffer this is needed to try to switch to the proper encoding when + * one face a character error. + * That's an heuristic, since it's operating outside of parsing it could + * try to use a meta which had been commented out, that's the reason it + * should only be used in case of error, not as a default. + * + * Returns an encoding string or NULL if not found, the string need to + * be freed + */ +static xmlChar * +htmlFindEncoding(xmlParserCtxtPtr ctxt) { + const xmlChar *start, *cur, *end; + + if ((ctxt == NULL) || (ctxt->input == NULL) || + (ctxt->input->encoding != NULL) || (ctxt->input->buf == NULL) || + (ctxt->input->buf->encoder != NULL)) + return(NULL); + if ((ctxt->input->cur == NULL) || (ctxt->input->end == NULL)) + return(NULL); + + start = ctxt->input->cur; + end = ctxt->input->end; + /* we also expect the input buffer to be zero terminated */ + if (*end != 0) + return(NULL); + + cur = xmlStrcasestr(start, BAD_CAST "HTTP-EQUIV"); + if (cur == NULL) + return(NULL); + cur = xmlStrcasestr(cur, BAD_CAST "CONTENT"); + if (cur == NULL) + return(NULL); + cur = xmlStrcasestr(cur, BAD_CAST "CHARSET="); + if (cur == NULL) + return(NULL); + cur += 8; + start = cur; + while (((*cur >= 'A') && (*cur <= 'Z')) || + ((*cur >= 'a') && (*cur <= 'z')) || + ((*cur >= '0') && (*cur <= '9')) || + (*cur == '-') || (*cur == '_') || (*cur == ':') || (*cur == '/')) + cur++; + if (cur == start) + return(NULL); + return(xmlStrndup(start, cur - start)); +} + +/** + * htmlCurrentChar: + * @ctxt: the HTML parser context + * @len: pointer to the length of the char read + * + * The current char value, if using UTF-8 this may actually span multiple + * bytes in the input buffer. Implement the end of line normalization: + * 2.11 End-of-Line Handling + * If the encoding is unspecified, in the case we find an ISO-Latin-1 + * char, then the encoding converter is plugged in automatically. + * + * Returns the current char value and its length + */ + +static int +htmlCurrentChar(xmlParserCtxtPtr ctxt, int *len) { + if (ctxt->instate == XML_PARSER_EOF) + return(0); + + if (ctxt->token != 0) { + *len = 0; + return(ctxt->token); + } + if (ctxt->charset == XML_CHAR_ENCODING_UTF8) { + /* + * We are supposed to handle UTF8, check it's valid + * From rfc2044: encoding of the Unicode values on UTF-8: + * + * UCS-4 range (hex.) UTF-8 octet sequence (binary) + * 0000 0000-0000 007F 0xxxxxxx + * 0000 0080-0000 07FF 110xxxxx 10xxxxxx + * 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx + * + * Check for the 0x110000 limit too + */ + const unsigned char *cur = ctxt->input->cur; + unsigned char c; + unsigned int val; + + c = *cur; + if (c & 0x80) { + if (cur[1] == 0) { + xmlParserInputGrow(ctxt->input, INPUT_CHUNK); + cur = ctxt->input->cur; + } + if ((cur[1] & 0xc0) != 0x80) + goto encoding_error; + if ((c & 0xe0) == 0xe0) { + + if (cur[2] == 0) { + xmlParserInputGrow(ctxt->input, INPUT_CHUNK); + cur = ctxt->input->cur; + } + if ((cur[2] & 0xc0) != 0x80) + goto encoding_error; + if ((c & 0xf0) == 0xf0) { + if (cur[3] == 0) { + xmlParserInputGrow(ctxt->input, INPUT_CHUNK); + cur = ctxt->input->cur; + } + if (((c & 0xf8) != 0xf0) || + ((cur[3] & 0xc0) != 0x80)) + goto encoding_error; + /* 4-byte code */ + *len = 4; + val = (cur[0] & 0x7) << 18; + val |= (cur[1] & 0x3f) << 12; + val |= (cur[2] & 0x3f) << 6; + val |= cur[3] & 0x3f; + } else { + /* 3-byte code */ + *len = 3; + val = (cur[0] & 0xf) << 12; + val |= (cur[1] & 0x3f) << 6; + val |= cur[2] & 0x3f; + } + } else { + /* 2-byte code */ + *len = 2; + val = (cur[0] & 0x1f) << 6; + val |= cur[1] & 0x3f; + } + if (!IS_CHAR(val)) { + htmlParseErrInt(ctxt, XML_ERR_INVALID_CHAR, + "Char 0x%X out of allowed range\n", val); + } + return(val); + } else { + if ((*ctxt->input->cur == 0) && + (ctxt->input->cur < ctxt->input->end)) { + htmlParseErrInt(ctxt, XML_ERR_INVALID_CHAR, + "Char 0x%X out of allowed range\n", 0); + *len = 1; + return(' '); + } + /* 1-byte code */ + *len = 1; + return((int) *ctxt->input->cur); + } + } + /* + * Assume it's a fixed length encoding (1) with + * a compatible encoding for the ASCII set, since + * XML constructs only use < 128 chars + */ + *len = 1; + if ((int) *ctxt->input->cur < 0x80) + return((int) *ctxt->input->cur); + + /* + * Humm this is bad, do an automatic flow conversion + */ + { + xmlChar * guess; + xmlCharEncodingHandlerPtr handler; + + guess = htmlFindEncoding(ctxt); + if (guess == NULL) { + xmlSwitchEncoding(ctxt, XML_CHAR_ENCODING_8859_1); + } else { + if (ctxt->input->encoding != NULL) + xmlFree((xmlChar *) ctxt->input->encoding); + ctxt->input->encoding = guess; + handler = xmlFindCharEncodingHandler((const char *) guess); + if (handler != NULL) { + xmlSwitchToEncoding(ctxt, handler); + } else { + htmlParseErr(ctxt, XML_ERR_INVALID_ENCODING, + "Unsupported encoding %s", guess, NULL); + } + } + ctxt->charset = XML_CHAR_ENCODING_UTF8; + } + + return(xmlCurrentChar(ctxt, len)); + +encoding_error: + /* + * If we detect an UTF8 error that probably mean that the + * input encoding didn't get properly advertized in the + * declaration header. Report the error and switch the encoding + * to ISO-Latin-1 (if you don't like this policy, just declare the + * encoding !) + */ + { + char buffer[150]; + + if (ctxt->input->end - ctxt->input->cur >= 4) { + snprintf(buffer, 149, "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n", + ctxt->input->cur[0], ctxt->input->cur[1], + ctxt->input->cur[2], ctxt->input->cur[3]); + } else { + snprintf(buffer, 149, "Bytes: 0x%02X\n", ctxt->input->cur[0]); + } + htmlParseErr(ctxt, XML_ERR_INVALID_ENCODING, + "Input is not proper UTF-8, indicate encoding !\n", + BAD_CAST buffer, NULL); + } + + ctxt->charset = XML_CHAR_ENCODING_8859_1; + *len = 1; + return((int) *ctxt->input->cur); +} + +/** + * htmlSkipBlankChars: + * @ctxt: the HTML parser context + * + * skip all blanks character found at that point in the input streams. + * + * Returns the number of space chars skipped + */ + +static int +htmlSkipBlankChars(xmlParserCtxtPtr ctxt) { + int res = 0; + + while (IS_BLANK_CH(*(ctxt->input->cur))) { + if ((*ctxt->input->cur == 0) && + (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) { + xmlPopInput(ctxt); + } else { + if (*(ctxt->input->cur) == '\n') { + ctxt->input->line++; ctxt->input->col = 1; + } else ctxt->input->col++; + ctxt->input->cur++; + ctxt->nbChars++; + if (*ctxt->input->cur == 0) + xmlParserInputGrow(ctxt->input, INPUT_CHUNK); + } + res++; + } + return(res); +} + + + +/************************************************************************ + * * + * The list of HTML elements and their properties * + * * + ************************************************************************/ + +/* + * Start Tag: 1 means the start tag can be ommited + * End Tag: 1 means the end tag can be ommited + * 2 means it's forbidden (empty elements) + * 3 means the tag is stylistic and should be closed easily + * Depr: this element is deprecated + * DTD: 1 means that this element is valid only in the Loose DTD + * 2 means that this element is valid only in the Frameset DTD + * + * Name,Start Tag,End Tag,Save End,Empty,Deprecated,DTD,inline,Description + , subElements , impliedsubelt , Attributes, userdata + */ + +/* Definitions and a couple of vars for HTML Elements */ + +#define FONTSTYLE "tt", "i", "b", "u", "s", "strike", "big", "small" +#define NB_FONTSTYLE 8 +#define PHRASE "em", "strong", "dfn", "code", "samp", "kbd", "var", "cite", "abbr", "acronym" +#define NB_PHRASE 10 +#define SPECIAL "a", "img", "applet", "embed", "object", "font", "basefont", "br", "script", "map", "q", "sub", "sup", "span", "bdo", "iframe" +#define NB_SPECIAL 16 +#define INLINE FONTSTYLE, PHRASE, SPECIAL, FORMCTRL +#define NB_INLINE NB_PCDATA + NB_FONTSTYLE + NB_PHRASE + NB_SPECIAL + NB_FORMCTRL +#define BLOCK HEADING, LIST, "pre", "p", "dl", "div", "center", "noscript", "noframes", "blockquote", "form", "isindex", "hr", "table", "fieldset", "address" +#define NB_BLOCK NB_HEADING + NB_LIST + 14 +#define FORMCTRL "input", "select", "textarea", "label", "button" +#define NB_FORMCTRL 5 +#define PCDATA +#define NB_PCDATA 0 +#define HEADING "h1", "h2", "h3", "h4", "h5", "h6" +#define NB_HEADING 6 +#define LIST "ul", "ol", "dir", "menu" +#define NB_LIST 4 +#define MODIFIER +#define NB_MODIFIER 0 +#define FLOW BLOCK,INLINE +#define NB_FLOW NB_BLOCK + NB_INLINE +#define EMPTY NULL + + +static const char* const html_flow[] = { FLOW, NULL } ; +static const char* const html_inline[] = { INLINE, NULL } ; + +/* placeholders: elts with content but no subelements */ +static const char* const html_pcdata[] = { NULL } ; +#define html_cdata html_pcdata + + +/* ... and for HTML Attributes */ + +#define COREATTRS "id", "class", "style", "title" +#define NB_COREATTRS 4 +#define I18N "lang", "dir" +#define NB_I18N 2 +#define EVENTS "onclick", "ondblclick", "onmousedown", "onmouseup", "onmouseover", "onmouseout", "onkeypress", "onkeydown", "onkeyup" +#define NB_EVENTS 9 +#define ATTRS COREATTRS,I18N,EVENTS +#define NB_ATTRS NB_NB_COREATTRS + NB_I18N + NB_EVENTS +#define CELLHALIGN "align", "char", "charoff" +#define NB_CELLHALIGN 3 +#define CELLVALIGN "valign" +#define NB_CELLVALIGN 1 + +static const char* const html_attrs[] = { ATTRS, NULL } ; +static const char* const core_i18n_attrs[] = { COREATTRS, I18N, NULL } ; +static const char* const core_attrs[] = { COREATTRS, NULL } ; +static const char* const i18n_attrs[] = { I18N, NULL } ; + + +/* Other declarations that should go inline ... */ +static const char* const a_attrs[] = { ATTRS, "charset", "type", "name", + "href", "hreflang", "rel", "rev", "accesskey", "shape", "coords", + "tabindex", "onfocus", "onblur", NULL } ; +static const char* const target_attr[] = { "target", NULL } ; +static const char* const rows_cols_attr[] = { "rows", "cols", NULL } ; +static const char* const alt_attr[] = { "alt", NULL } ; +static const char* const src_alt_attrs[] = { "src", "alt", NULL } ; +static const char* const href_attrs[] = { "href", NULL } ; +static const char* const clear_attrs[] = { "clear", NULL } ; +static const char* const inline_p[] = { INLINE, "p", NULL } ; + +static const char* const flow_param[] = { FLOW, "param", NULL } ; +static const char* const applet_attrs[] = { COREATTRS , "codebase", + "archive", "alt", "name", "height", "width", "align", + "hspace", "vspace", NULL } ; +static const char* const area_attrs[] = { "shape", "coords", "href", "nohref", + "tabindex", "accesskey", "onfocus", "onblur", NULL } ; +static const char* const basefont_attrs[] = + { "id", "size", "color", "face", NULL } ; +static const char* const quote_attrs[] = { ATTRS, "cite", NULL } ; +static const char* const body_contents[] = { FLOW, "ins", "del", NULL } ; +static const char* const body_attrs[] = { ATTRS, "onload", "onunload", NULL } ; +static const char* const body_depr[] = { "background", "bgcolor", "text", + "link", "vlink", "alink", NULL } ; +static const char* const button_attrs[] = { ATTRS, "name", "value", "type", + "disabled", "tabindex", "accesskey", "onfocus", "onblur", NULL } ; + + +static const char* const col_attrs[] = { ATTRS, "span", "width", CELLHALIGN, CELLVALIGN, NULL } ; +static const char* const col_elt[] = { "col", NULL } ; +static const char* const edit_attrs[] = { ATTRS, "datetime", "cite", NULL } ; +static const char* const compact_attrs[] = { ATTRS, "compact", NULL } ; +static const char* const dl_contents[] = { "dt", "dd", NULL } ; +static const char* const compact_attr[] = { "compact", NULL } ; +static const char* const label_attr[] = { "label", NULL } ; +static const char* const fieldset_contents[] = { FLOW, "legend" } ; +static const char* const font_attrs[] = { COREATTRS, I18N, "size", "color", "face" , NULL } ; +static const char* const form_contents[] = { HEADING, LIST, INLINE, "pre", "p", "div", "center", "noscript", "noframes", "blockquote", "isindex", "hr", "table", "fieldset", "address", NULL } ; +static const char* const form_attrs[] = { ATTRS, "method", "enctype", "accept", "name", "onsubmit", "onreset", "accept-charset", NULL } ; +static const char* const frame_attrs[] = { COREATTRS, "longdesc", "name", "src", "frameborder", "marginwidth", "marginheight", "noresize", "scrolling" , NULL } ; +static const char* const frameset_attrs[] = { COREATTRS, "rows", "cols", "onload", "onunload", NULL } ; +static const char* const frameset_contents[] = { "frameset", "frame", "noframes", NULL } ; +static const char* const head_attrs[] = { I18N, "profile", NULL } ; +static const char* const head_contents[] = { "title", "isindex", "base", "script", "style", "meta", "link", "object", NULL } ; +static const char* const hr_depr[] = { "align", "noshade", "size", "width", NULL } ; +static const char* const version_attr[] = { "version", NULL } ; +static const char* const html_content[] = { "head", "body", "frameset", NULL } ; +static const char* const iframe_attrs[] = { COREATTRS, "longdesc", "name", "src", "frameborder", "marginwidth", "marginheight", "scrolling", "align", "height", "width", NULL } ; +static const char* const img_attrs[] = { ATTRS, "longdesc", "name", "height", "width", "usemap", "ismap", NULL } ; +static const char* const embed_attrs[] = { COREATTRS, "align", "alt", "border", "code", "codebase", "frameborder", "height", "hidden", "hspace", "name", "palette", "pluginspace", "pluginurl", "src", "type", "units", "vspace", "width", NULL } ; +static const char* const input_attrs[] = { ATTRS, "type", "name", "value", "checked", "disabled", "readonly", "size", "maxlength", "src", "alt", "usemap", "ismap", "tabindex", "accesskey", "onfocus", "onblur", "onselect", "onchange", "accept", NULL } ; +static const char* const prompt_attrs[] = { COREATTRS, I18N, "prompt", NULL } ; +static const char* const label_attrs[] = { ATTRS, "for", "accesskey", "onfocus", "onblur", NULL } ; +static const char* const legend_attrs[] = { ATTRS, "accesskey", NULL } ; +static const char* const align_attr[] = { "align", NULL } ; +static const char* const link_attrs[] = { ATTRS, "charset", "href", "hreflang", "type", "rel", "rev", "media", NULL } ; +static const char* const map_contents[] = { BLOCK, "area", NULL } ; +static const char* const name_attr[] = { "name", NULL } ; +static const char* const action_attr[] = { "action", NULL } ; +static const char* const blockli_elt[] = { BLOCK, "li", NULL } ; +static const char* const meta_attrs[] = { I18N, "http-equiv", "name", "scheme", "charset", NULL } ; +static const char* const content_attr[] = { "content", NULL } ; +static const char* const type_attr[] = { "type", NULL } ; +static const char* const noframes_content[] = { "body", FLOW MODIFIER, NULL } ; +static const char* const object_contents[] = { FLOW, "param", NULL } ; +static const char* const object_attrs[] = { ATTRS, "declare", "classid", "codebase", "data", "type", "codetype", "archive", "standby", "height", "width", "usemap", "name", "tabindex", NULL } ; +static const char* const object_depr[] = { "align", "border", "hspace", "vspace", NULL } ; +static const char* const ol_attrs[] = { "type", "compact", "start", NULL} ; +static const char* const option_elt[] = { "option", NULL } ; +static const char* const optgroup_attrs[] = { ATTRS, "disabled", NULL } ; +static const char* const option_attrs[] = { ATTRS, "disabled", "label", "selected", "value", NULL } ; +static const char* const param_attrs[] = { "id", "value", "valuetype", "type", NULL } ; +static const char* const width_attr[] = { "width", NULL } ; +static const char* const pre_content[] = { PHRASE, "tt", "i", "b", "u", "s", "strike", "a", "br", "script", "map", "q", "span", "bdo", "iframe", NULL } ; +static const char* const script_attrs[] = { "charset", "src", "defer", "event", "for", NULL } ; +static const char* const language_attr[] = { "language", NULL } ; +static const char* const select_content[] = { "optgroup", "option", NULL } ; +static const char* const select_attrs[] = { ATTRS, "name", "size", "multiple", "disabled", "tabindex", "onfocus", "onblur", "onchange", NULL } ; +static const char* const style_attrs[] = { I18N, "media", "title", NULL } ; +static const char* const table_attrs[] = { ATTRS, "summary", "width", "border", "frame", "rules", "cellspacing", "cellpadding", "datapagesize", NULL } ; +static const char* const table_depr[] = { "align", "bgcolor", NULL } ; +static const char* const table_contents[] = { "caption", "col", "colgroup", "thead", "tfoot", "tbody", "tr", NULL} ; +static const char* const tr_elt[] = { "tr", NULL } ; +static const char* const talign_attrs[] = { ATTRS, CELLHALIGN, CELLVALIGN, NULL} ; +static const char* const th_td_depr[] = { "nowrap", "bgcolor", "width", "height", NULL } ; +static const char* const th_td_attr[] = { ATTRS, "abbr", "axis", "headers", "scope", "rowspan", "colspan", CELLHALIGN, CELLVALIGN, NULL } ; +static const char* const textarea_attrs[] = { ATTRS, "name", "disabled", "readonly", "tabindex", "accesskey", "onfocus", "onblur", "onselect", "onchange", NULL } ; +static const char* const tr_contents[] = { "th", "td", NULL } ; +static const char* const bgcolor_attr[] = { "bgcolor", NULL } ; +static const char* const li_elt[] = { "li", NULL } ; +static const char* const ul_depr[] = { "type", "compact", NULL} ; +static const char* const dir_attr[] = { "dir", NULL} ; + +#define DECL (const char**) + +static const htmlElemDesc +html40ElementTable[] = { +{ "a", 0, 0, 0, 0, 0, 0, 1, "anchor ", + DECL html_inline , NULL , DECL a_attrs , DECL target_attr, NULL +}, +{ "abbr", 0, 0, 0, 0, 0, 0, 1, "abbreviated form", + DECL html_inline , NULL , DECL html_attrs, NULL, NULL +}, +{ "acronym", 0, 0, 0, 0, 0, 0, 1, "", + DECL html_inline , NULL , DECL html_attrs, NULL, NULL +}, +{ "address", 0, 0, 0, 0, 0, 0, 0, "information on author ", + DECL inline_p , NULL , DECL html_attrs, NULL, NULL +}, +{ "applet", 0, 0, 0, 0, 1, 1, 2, "java applet ", + DECL flow_param , NULL , NULL , DECL applet_attrs, NULL +}, +{ "area", 0, 2, 2, 1, 0, 0, 0, "client-side image map area ", + EMPTY , NULL , DECL area_attrs , DECL target_attr, DECL alt_attr +}, +{ "b", 0, 3, 0, 0, 0, 0, 1, "bold text style", + DECL html_inline , NULL , DECL html_attrs, NULL, NULL +}, +{ "base", 0, 2, 2, 1, 0, 0, 0, "document base uri ", + EMPTY , NULL , NULL , DECL target_attr, DECL href_attrs +}, +{ "basefont", 0, 2, 2, 1, 1, 1, 1, "base font size " , + EMPTY , NULL , NULL, DECL basefont_attrs, NULL +}, +{ "bdo", 0, 0, 0, 0, 0, 0, 1, "i18n bidi over-ride ", + DECL html_inline , NULL , DECL core_i18n_attrs, NULL, DECL dir_attr +}, +{ "big", 0, 3, 0, 0, 0, 0, 1, "large text style", + DECL html_inline , NULL , DECL html_attrs, NULL, NULL +}, +{ "blockquote", 0, 0, 0, 0, 0, 0, 0, "long quotation ", + DECL html_flow , NULL , DECL quote_attrs , NULL, NULL +}, +{ "body", 1, 1, 0, 0, 0, 0, 0, "document body ", + DECL body_contents , "div" , DECL body_attrs, DECL body_depr, NULL +}, +{ "br", 0, 2, 2, 1, 0, 0, 1, "forced line break ", + EMPTY , NULL , DECL core_attrs, DECL clear_attrs , NULL +}, +{ "button", 0, 0, 0, 0, 0, 0, 2, "push button ", + DECL html_flow MODIFIER , NULL , DECL button_attrs, NULL, NULL +}, +{ "caption", 0, 0, 0, 0, 0, 0, 0, "table caption ", + DECL html_inline , NULL , DECL html_attrs, NULL, NULL +}, +{ "center", 0, 3, 0, 0, 1, 1, 0, "shorthand for div align=center ", + DECL html_flow , NULL , NULL, DECL html_attrs, NULL +}, +{ "cite", 0, 0, 0, 0, 0, 0, 1, "citation", + DECL html_inline , NULL , DECL html_attrs, NULL, NULL +}, +{ "code", 0, 0, 0, 0, 0, 0, 1, "computer code fragment", + DECL html_inline , NULL , DECL html_attrs, NULL, NULL +}, +{ "col", 0, 2, 2, 1, 0, 0, 0, "table column ", + EMPTY , NULL , DECL col_attrs , NULL, NULL +}, +{ "colgroup", 0, 1, 0, 0, 0, 0, 0, "table column group ", + DECL col_elt , "col" , DECL col_attrs , NULL, NULL +}, +{ "dd", 0, 1, 0, 0, 0, 0, 0, "definition description ", + DECL html_flow , NULL , DECL html_attrs, NULL, NULL +}, +{ "del", 0, 0, 0, 0, 0, 0, 2, "deleted text ", + DECL html_flow , NULL , DECL edit_attrs , NULL, NULL +}, +{ "dfn", 0, 0, 0, 0, 0, 0, 1, "instance definition", + DECL html_inline , NULL , DECL html_attrs, NULL, NULL +}, +{ "dir", 0, 0, 0, 0, 1, 1, 0, "directory list", + DECL blockli_elt, "li" , NULL, DECL compact_attrs, NULL +}, +{ "div", 0, 0, 0, 0, 0, 0, 0, "generic language/style container", + DECL html_flow, NULL, DECL html_attrs, DECL align_attr, NULL +}, +{ "dl", 0, 0, 0, 0, 0, 0, 0, "definition list ", + DECL dl_contents , "dd" , DECL html_attrs, DECL compact_attr, NULL +}, +{ "dt", 0, 1, 0, 0, 0, 0, 0, "definition term ", + DECL html_inline, NULL, DECL html_attrs, NULL, NULL +}, +{ "em", 0, 3, 0, 0, 0, 0, 1, "emphasis", + DECL html_inline, NULL, DECL html_attrs, NULL, NULL +}, +{ "embed", 0, 1, 0, 0, 1, 1, 1, "generic embedded object ", + EMPTY, NULL, DECL embed_attrs, NULL, NULL +}, +{ "fieldset", 0, 0, 0, 0, 0, 0, 0, "form control group ", + DECL fieldset_contents , NULL, DECL html_attrs, NULL, NULL +}, +{ "font", 0, 3, 0, 0, 1, 1, 1, "local change to font ", + DECL html_inline, NULL, NULL, DECL font_attrs, NULL +}, +{ "form", 0, 0, 0, 0, 0, 0, 0, "interactive form ", + DECL form_contents, "fieldset", DECL form_attrs , DECL target_attr, DECL action_attr +}, +{ "frame", 0, 2, 2, 1, 0, 2, 0, "subwindow " , + EMPTY, NULL, NULL, DECL frame_attrs, NULL +}, +{ "frameset", 0, 0, 0, 0, 0, 2, 0, "window subdivision" , + DECL frameset_contents, "noframes" , NULL , DECL frameset_attrs, NULL +}, +{ "h1", 0, 0, 0, 0, 0, 0, 0, "heading ", + DECL html_inline, NULL, DECL html_attrs, DECL align_attr, NULL +}, +{ "h2", 0, 0, 0, 0, 0, 0, 0, "heading ", + DECL html_inline, NULL, DECL html_attrs, DECL align_attr, NULL +}, +{ "h3", 0, 0, 0, 0, 0, 0, 0, "heading ", + DECL html_inline, NULL, DECL html_attrs, DECL align_attr, NULL +}, +{ "h4", 0, 0, 0, 0, 0, 0, 0, "heading ", + DECL html_inline, NULL, DECL html_attrs, DECL align_attr, NULL +}, +{ "h5", 0, 0, 0, 0, 0, 0, 0, "heading ", + DECL html_inline, NULL, DECL html_attrs, DECL align_attr, NULL +}, +{ "h6", 0, 0, 0, 0, 0, 0, 0, "heading ", + DECL html_inline, NULL, DECL html_attrs, DECL align_attr, NULL +}, +{ "head", 1, 1, 0, 0, 0, 0, 0, "document head ", + DECL head_contents, NULL, DECL head_attrs, NULL, NULL +}, +{ "hr", 0, 2, 2, 1, 0, 0, 0, "horizontal rule " , + EMPTY, NULL, DECL html_attrs, DECL hr_depr, NULL +}, +{ "html", 1, 1, 0, 0, 0, 0, 0, "document root element ", + DECL html_content , NULL , DECL i18n_attrs, DECL version_attr, NULL +}, +{ "i", 0, 3, 0, 0, 0, 0, 1, "italic text style", + DECL html_inline, NULL, DECL html_attrs, NULL, NULL +}, +{ "iframe", 0, 0, 0, 0, 0, 1, 2, "inline subwindow ", + DECL html_flow, NULL, NULL, DECL iframe_attrs, NULL +}, +{ "img", 0, 2, 2, 1, 0, 0, 1, "embedded image ", + EMPTY, NULL, DECL img_attrs, DECL align_attr, DECL src_alt_attrs +}, +{ "input", 0, 2, 2, 1, 0, 0, 1, "form control ", + EMPTY, NULL, DECL input_attrs , DECL align_attr, NULL +}, +{ "ins", 0, 0, 0, 0, 0, 0, 2, "inserted text", + DECL html_flow, NULL, DECL edit_attrs, NULL, NULL +}, +{ "isindex", 0, 2, 2, 1, 1, 1, 0, "single line prompt ", + EMPTY, NULL, NULL, DECL prompt_attrs, NULL +}, +{ "kbd", 0, 0, 0, 0, 0, 0, 1, "text to be entered by the user", + DECL html_inline, NULL, DECL html_attrs, NULL, NULL +}, +{ "label", 0, 0, 0, 0, 0, 0, 1, "form field label text ", + DECL html_inline MODIFIER, NULL, DECL label_attrs , NULL, NULL +}, +{ "legend", 0, 0, 0, 0, 0, 0, 0, "fieldset legend ", + DECL html_inline, NULL, DECL legend_attrs , DECL align_attr, NULL +}, +{ "li", 0, 1, 1, 0, 0, 0, 0, "list item ", + DECL html_flow, NULL, DECL html_attrs, NULL, NULL +}, +{ "link", 0, 2, 2, 1, 0, 0, 0, "a media-independent link ", + EMPTY, NULL, DECL link_attrs, DECL target_attr, NULL +}, +{ "map", 0, 0, 0, 0, 0, 0, 2, "client-side image map ", + DECL map_contents , NULL, DECL html_attrs , NULL, DECL name_attr +}, +{ "menu", 0, 0, 0, 0, 1, 1, 0, "menu list ", + DECL blockli_elt , NULL, NULL, DECL compact_attrs, NULL +}, +{ "meta", 0, 2, 2, 1, 0, 0, 0, "generic metainformation ", + EMPTY, NULL, DECL meta_attrs , NULL , DECL content_attr +}, +{ "noframes", 0, 0, 0, 0, 0, 2, 0, "alternate content container for non frame-based rendering ", + DECL noframes_content, "body" , DECL html_attrs, NULL, NULL +}, +{ "noscript", 0, 0, 0, 0, 0, 0, 0, "alternate content container for non script-based rendering ", + DECL html_flow, "div", DECL html_attrs, NULL, NULL +}, +{ "object", 0, 0, 0, 0, 0, 0, 2, "generic embedded object ", + DECL object_contents , "div" , DECL object_attrs, DECL object_depr, NULL +}, +{ "ol", 0, 0, 0, 0, 0, 0, 0, "ordered list ", + DECL li_elt , "li" , DECL html_attrs, DECL ol_attrs, NULL +}, +{ "optgroup", 0, 0, 0, 0, 0, 0, 0, "option group ", + DECL option_elt , "option", DECL optgroup_attrs, NULL, DECL label_attr +}, +{ "option", 0, 1, 0, 0, 0, 0, 0, "selectable choice " , + DECL html_pcdata, NULL, DECL option_attrs, NULL, NULL +}, +{ "p", 0, 1, 0, 0, 0, 0, 0, "paragraph ", + DECL html_inline, NULL, DECL html_attrs, DECL align_attr, NULL +}, +{ "param", 0, 2, 2, 1, 0, 0, 0, "named property value ", + EMPTY, NULL, DECL param_attrs, NULL, DECL name_attr +}, +{ "pre", 0, 0, 0, 0, 0, 0, 0, "preformatted text ", + DECL pre_content, NULL, DECL html_attrs, DECL width_attr, NULL +}, +{ "q", 0, 0, 0, 0, 0, 0, 1, "short inline quotation ", + DECL html_inline, NULL, DECL quote_attrs, NULL, NULL +}, +{ "s", 0, 3, 0, 0, 1, 1, 1, "strike-through text style", + DECL html_inline, NULL, NULL, DECL html_attrs, NULL +}, +{ "samp", 0, 0, 0, 0, 0, 0, 1, "sample program output, scripts, etc.", + DECL html_inline, NULL, DECL html_attrs, NULL, NULL +}, +{ "script", 0, 0, 0, 0, 0, 0, 2, "script statements ", + DECL html_cdata, NULL, DECL script_attrs, DECL language_attr, DECL type_attr +}, +{ "select", 0, 0, 0, 0, 0, 0, 1, "option selector ", + DECL select_content, NULL, DECL select_attrs, NULL, NULL +}, +{ "small", 0, 3, 0, 0, 0, 0, 1, "small text style", + DECL html_inline, NULL, DECL html_attrs, NULL, NULL +}, +{ "span", 0, 0, 0, 0, 0, 0, 1, "generic language/style container ", + DECL html_inline, NULL, DECL html_attrs, NULL, NULL +}, +{ "strike", 0, 3, 0, 0, 1, 1, 1, "strike-through text", + DECL html_inline, NULL, NULL, DECL html_attrs, NULL +}, +{ "strong", 0, 3, 0, 0, 0, 0, 1, "strong emphasis", + DECL html_inline, NULL, DECL html_attrs, NULL, NULL +}, +{ "style", 0, 0, 0, 0, 0, 0, 0, "style info ", + DECL html_cdata, NULL, DECL style_attrs, NULL, DECL type_attr +}, +{ "sub", 0, 3, 0, 0, 0, 0, 1, "subscript", + DECL html_inline, NULL, DECL html_attrs, NULL, NULL +}, +{ "sup", 0, 3, 0, 0, 0, 0, 1, "superscript ", + DECL html_inline, NULL, DECL html_attrs, NULL, NULL +}, +{ "table", 0, 0, 0, 0, 0, 0, 0, "", + DECL table_contents , "tr" , DECL table_attrs , DECL table_depr, NULL +}, +{ "tbody", 1, 0, 0, 0, 0, 0, 0, "table body ", + DECL tr_elt , "tr" , DECL talign_attrs, NULL, NULL +}, +{ "td", 0, 0, 0, 0, 0, 0, 0, "table data cell", + DECL html_flow, NULL, DECL th_td_attr, DECL th_td_depr, NULL +}, +{ "textarea", 0, 0, 0, 0, 0, 0, 1, "multi-line text field ", + DECL html_pcdata, NULL, DECL textarea_attrs, NULL, DECL rows_cols_attr +}, +{ "tfoot", 0, 1, 0, 0, 0, 0, 0, "table footer ", + DECL tr_elt , "tr" , DECL talign_attrs, NULL, NULL +}, +{ "th", 0, 1, 0, 0, 0, 0, 0, "table header cell", + DECL html_flow, NULL, DECL th_td_attr, DECL th_td_depr, NULL +}, +{ "thead", 0, 1, 0, 0, 0, 0, 0, "table header ", + DECL tr_elt , "tr" , DECL talign_attrs, NULL, NULL +}, +{ "title", 0, 0, 0, 0, 0, 0, 0, "document title ", + DECL html_pcdata, NULL, DECL i18n_attrs, NULL, NULL +}, +{ "tr", 0, 0, 0, 0, 0, 0, 0, "table row ", + DECL tr_contents , "td" , DECL talign_attrs, DECL bgcolor_attr, NULL +}, +{ "tt", 0, 3, 0, 0, 0, 0, 1, "teletype or monospaced text style", + DECL html_inline, NULL, DECL html_attrs, NULL, NULL +}, +{ "u", 0, 3, 0, 0, 1, 1, 1, "underlined text style", + DECL html_inline, NULL, NULL, DECL html_attrs, NULL +}, +{ "ul", 0, 0, 0, 0, 0, 0, 0, "unordered list ", + DECL li_elt , "li" , DECL html_attrs, DECL ul_depr, NULL +}, +{ "var", 0, 0, 0, 0, 0, 0, 1, "instance of a variable or program argument", + DECL html_inline, NULL, DECL html_attrs, NULL, NULL +} +}; + +/* + * start tags that imply the end of current element + */ +static const char * const htmlStartClose[] = { +"form", "form", "p", "hr", "h1", "h2", "h3", "h4", "h5", "h6", + "dl", "ul", "ol", "menu", "dir", "address", "pre", + "listing", "xmp", "head", NULL, +"head", "p", NULL, +"title", "p", NULL, +"body", "head", "style", "link", "title", "p", NULL, +"frameset", "head", "style", "link", "title", "p", NULL, +"li", "p", "h1", "h2", "h3", "h4", "h5", "h6", "dl", "address", + "pre", "listing", "xmp", "head", "li", NULL, +"hr", "p", "head", NULL, +"h1", "p", "head", NULL, +"h2", "p", "head", NULL, +"h3", "p", "head", NULL, +"h4", "p", "head", NULL, +"h5", "p", "head", NULL, +"h6", "p", "head", NULL, +"dir", "p", "head", NULL, +"address", "p", "head", "ul", NULL, +"pre", "p", "head", "ul", NULL, +"listing", "p", "head", NULL, +"xmp", "p", "head", NULL, +"blockquote", "p", "head", NULL, +"dl", "p", "dt", "menu", "dir", "address", "pre", "listing", + "xmp", "head", NULL, +"dt", "p", "menu", "dir", "address", "pre", "listing", "xmp", + "head", "dd", NULL, +"dd", "p", "menu", "dir", "address", "pre", "listing", "xmp", + "head", "dt", NULL, +"ul", "p", "head", "ol", "menu", "dir", "address", "pre", + "listing", "xmp", NULL, +"ol", "p", "head", "ul", NULL, +"menu", "p", "head", "ul", NULL, +"p", "p", "head", "h1", "h2", "h3", "h4", "h5", "h6", FONTSTYLE, NULL, +"div", "p", "head", NULL, +"noscript", "p", NULL, +"center", "font", "b", "i", "p", "head", NULL, +"a", "a", "head", NULL, +"caption", "p", NULL, +"colgroup", "caption", "colgroup", "col", "p", NULL, +"col", "caption", "col", "p", NULL, +"table", "p", "head", "h1", "h2", "h3", "h4", "h5", "h6", "pre", + "listing", "xmp", "a", NULL, +"th", "th", "td", "p", "span", "font", "a", "b", "i", "u", NULL, +"td", "th", "td", "p", "span", "font", "a", "b", "i", "u", NULL, +"tr", "th", "td", "tr", "caption", "col", "colgroup", "p", NULL, +"thead", "caption", "col", "colgroup", NULL, +"tfoot", "th", "td", "tr", "caption", "col", "colgroup", "thead", + "tbody", "p", NULL, +"tbody", "th", "td", "tr", "caption", "col", "colgroup", "thead", + "tfoot", "tbody", "p", NULL, +"optgroup", "option", NULL, +"option", "option", NULL, +"fieldset", "legend", "p", "head", "h1", "h2", "h3", "h4", "h5", "h6", + "pre", "listing", "xmp", "a", NULL, +/* most tags in in FONTSTYLE, PHRASE and SPECIAL should close */ +"tt", "head", NULL, +"i", "head", NULL, +"b", "head", NULL, +"u", "head", NULL, +"s", "head", NULL, +"strike", "head", NULL, +"big", "head", NULL, +"small", "head", NULL, + +"em", "head", NULL, +"strong", "head", NULL, +"dfn", "head", NULL, +"code", "head", NULL, +"samp", "head", NULL, +"kbd", "head", NULL, +"var", "head", NULL, +"cite", "head", NULL, +"abbr", "head", NULL, +"acronym", "head", NULL, + +/* "a" */ +"img", "head", NULL, +/* "applet" */ +/* "embed" */ +/* "object" */ +"font", "head", NULL, +/* "basefont" */ +"br", "head", NULL, +/* "script" */ +"map", "head", NULL, +"q", "head", NULL, +"sub", "head", NULL, +"sup", "head", NULL, +"span", "head", NULL, +"bdo", "head", NULL, +"iframe", "head", NULL, +NULL +}; + +/* + * The list of HTML elements which are supposed not to have + * CDATA content and where a p element will be implied + * + * TODO: extend that list by reading the HTML SGML DTD on + * implied paragraph + */ +static const char *const htmlNoContentElements[] = { + "html", + "head", + NULL +}; + +/* + * The list of HTML attributes which are of content %Script; + * NOTE: when adding ones, check htmlIsScriptAttribute() since + * it assumes the name starts with 'on' + */ +static const char *const htmlScriptAttributes[] = { + "onclick", + "ondblclick", + "onmousedown", + "onmouseup", + "onmouseover", + "onmousemove", + "onmouseout", + "onkeypress", + "onkeydown", + "onkeyup", + "onload", + "onunload", + "onfocus", + "onblur", + "onsubmit", + "onrest", + "onchange", + "onselect" +}; + +/* + * This table is used by the htmlparser to know what to do with + * broken html pages. By assigning different priorities to different + * elements the parser can decide how to handle extra endtags. + * Endtags are only allowed to close elements with lower or equal + * priority. + */ + +typedef struct { + const char *name; + int priority; +} elementPriority; + +static const elementPriority htmlEndPriority[] = { + {"div", 150}, + {"td", 160}, + {"th", 160}, + {"tr", 170}, + {"thead", 180}, + {"tbody", 180}, + {"tfoot", 180}, + {"table", 190}, + {"head", 200}, + {"body", 200}, + {"html", 220}, + {NULL, 100} /* Default priority */ +}; + +static const char** htmlStartCloseIndex[100]; +static int htmlStartCloseIndexinitialized = 0; + +/************************************************************************ + * * + * functions to handle HTML specific data * + * * + ************************************************************************/ + +/** + * htmlInitAutoClose: + * + * Initialize the htmlStartCloseIndex for fast lookup of closing tags names. + * This is not reentrant. Call xmlInitParser() once before processing in + * case of use in multithreaded programs. + */ +void +htmlInitAutoClose(void) { + int indx, i = 0; + + if (htmlStartCloseIndexinitialized) return; + + for (indx = 0;indx < 100;indx ++) htmlStartCloseIndex[indx] = NULL; + indx = 0; + while ((htmlStartClose[i] != NULL) && (indx < 100 - 1)) { + htmlStartCloseIndex[indx++] = (const char**) &htmlStartClose[i]; + while (htmlStartClose[i] != NULL) i++; + i++; + } + htmlStartCloseIndexinitialized = 1; +} + +/** + * htmlTagLookup: + * @tag: The tag name in lowercase + * + * Lookup the HTML tag in the ElementTable + * + * Returns the related htmlElemDescPtr or NULL if not found. + */ +const htmlElemDesc * +htmlTagLookup(const xmlChar *tag) { + unsigned int i; + + for (i = 0; i < (sizeof(html40ElementTable) / + sizeof(html40ElementTable[0]));i++) { + if (!xmlStrcasecmp(tag, BAD_CAST html40ElementTable[i].name)) + return((htmlElemDescPtr) &html40ElementTable[i]); + } + return(NULL); +} + +/** + * htmlGetEndPriority: + * @name: The name of the element to look up the priority for. + * + * Return value: The "endtag" priority. + **/ +static int +htmlGetEndPriority (const xmlChar *name) { + int i = 0; + + while ((htmlEndPriority[i].name != NULL) && + (!xmlStrEqual((const xmlChar *)htmlEndPriority[i].name, name))) + i++; + + return(htmlEndPriority[i].priority); +} + + +/** + * htmlCheckAutoClose: + * @newtag: The new tag name + * @oldtag: The old tag name + * + * Checks whether the new tag is one of the registered valid tags for + * closing old. + * Initialize the htmlStartCloseIndex for fast lookup of closing tags names. + * + * Returns 0 if no, 1 if yes. + */ +static int +htmlCheckAutoClose(const xmlChar * newtag, const xmlChar * oldtag) +{ + int i, indx; + const char **closed = NULL; + + if (htmlStartCloseIndexinitialized == 0) + htmlInitAutoClose(); + + /* inefficient, but not a big deal */ + for (indx = 0; indx < 100; indx++) { + closed = htmlStartCloseIndex[indx]; + if (closed == NULL) + return (0); + if (xmlStrEqual(BAD_CAST * closed, newtag)) + break; + } + + i = closed - htmlStartClose; + i++; + while (htmlStartClose[i] != NULL) { + if (xmlStrEqual(BAD_CAST htmlStartClose[i], oldtag)) { + return (1); + } + i++; + } + return (0); +} + +/** + * htmlAutoCloseOnClose: + * @ctxt: an HTML parser context + * @newtag: The new tag name + * @force: force the tag closure + * + * The HTML DTD allows an ending tag to implicitly close other tags. + */ +static void +htmlAutoCloseOnClose(htmlParserCtxtPtr ctxt, const xmlChar * newtag) +{ + const htmlElemDesc *info; + int i, priority; + + priority = htmlGetEndPriority(newtag); + + for (i = (ctxt->nameNr - 1); i >= 0; i--) { + + if (xmlStrEqual(newtag, ctxt->nameTab[i])) + break; + /* + * A missplaced endtag can only close elements with lower + * or equal priority, so if we find an element with higher + * priority before we find an element with + * matching name, we just ignore this endtag + */ + if (htmlGetEndPriority(ctxt->nameTab[i]) > priority) + return; + } + if (i < 0) + return; + + while (!xmlStrEqual(newtag, ctxt->name)) { + info = htmlTagLookup(ctxt->name); + if ((info != NULL) && (info->endTag == 3)) { + htmlParseErr(ctxt, XML_ERR_TAG_NAME_MISMATCH, + "Opening and ending tag mismatch: %s and %s\n", + newtag, ctxt->name); + } + if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) + ctxt->sax->endElement(ctxt->userData, ctxt->name); + htmlnamePop(ctxt); + } +} + +/** + * htmlAutoCloseOnEnd: + * @ctxt: an HTML parser context + * + * Close all remaining tags at the end of the stream + */ +static void +htmlAutoCloseOnEnd(htmlParserCtxtPtr ctxt) +{ + int i; + + if (ctxt->nameNr == 0) + return; + for (i = (ctxt->nameNr - 1); i >= 0; i--) { + if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) + ctxt->sax->endElement(ctxt->userData, ctxt->name); + htmlnamePop(ctxt); + } +} + +/** + * htmlAutoClose: + * @ctxt: an HTML parser context + * @newtag: The new tag name or NULL + * + * The HTML DTD allows a tag to implicitly close other tags. + * The list is kept in htmlStartClose array. This function is + * called when a new tag has been detected and generates the + * appropriates closes if possible/needed. + * If newtag is NULL this mean we are at the end of the resource + * and we should check + */ +static void +htmlAutoClose(htmlParserCtxtPtr ctxt, const xmlChar * newtag) +{ + while ((newtag != NULL) && (ctxt->name != NULL) && + (htmlCheckAutoClose(newtag, ctxt->name))) { + if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) + ctxt->sax->endElement(ctxt->userData, ctxt->name); + htmlnamePop(ctxt); + } + if (newtag == NULL) { + htmlAutoCloseOnEnd(ctxt); + return; + } + while ((newtag == NULL) && (ctxt->name != NULL) && + ((xmlStrEqual(ctxt->name, BAD_CAST "head")) || + (xmlStrEqual(ctxt->name, BAD_CAST "body")) || + (xmlStrEqual(ctxt->name, BAD_CAST "html")))) { + if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) + ctxt->sax->endElement(ctxt->userData, ctxt->name); + htmlnamePop(ctxt); + } +} + +/** + * htmlAutoCloseTag: + * @doc: the HTML document + * @name: The tag name + * @elem: the HTML element + * + * The HTML DTD allows a tag to implicitly close other tags. + * The list is kept in htmlStartClose array. This function checks + * if the element or one of it's children would autoclose the + * given tag. + * + * Returns 1 if autoclose, 0 otherwise + */ +int +htmlAutoCloseTag(htmlDocPtr doc, const xmlChar *name, htmlNodePtr elem) { + htmlNodePtr child; + + if (elem == NULL) return(1); + if (xmlStrEqual(name, elem->name)) return(0); + if (htmlCheckAutoClose(elem->name, name)) return(1); + child = elem->children; + while (child != NULL) { + if (htmlAutoCloseTag(doc, name, child)) return(1); + child = child->next; + } + return(0); +} + +/** + * htmlIsAutoClosed: + * @doc: the HTML document + * @elem: the HTML element + * + * The HTML DTD allows a tag to implicitly close other tags. + * The list is kept in htmlStartClose array. This function checks + * if a tag is autoclosed by one of it's child + * + * Returns 1 if autoclosed, 0 otherwise + */ +int +htmlIsAutoClosed(htmlDocPtr doc, htmlNodePtr elem) { + htmlNodePtr child; + + if (elem == NULL) return(1); + child = elem->children; + while (child != NULL) { + if (htmlAutoCloseTag(doc, elem->name, child)) return(1); + child = child->next; + } + return(0); +} + +/** + * htmlCheckImplied: + * @ctxt: an HTML parser context + * @newtag: The new tag name + * + * The HTML DTD allows a tag to exists only implicitly + * called when a new tag has been detected and generates the + * appropriates implicit tags if missing + */ +static void +htmlCheckImplied(htmlParserCtxtPtr ctxt, const xmlChar *newtag) { + int i; + + if (ctxt->options & HTML_PARSE_NOIMPLIED) + return; + if (!htmlOmittedDefaultValue) + return; + if (xmlStrEqual(newtag, BAD_CAST"html")) + return; + if (ctxt->nameNr <= 0) { + htmlnamePush(ctxt, BAD_CAST"html"); + if ((ctxt->sax != NULL) && (ctxt->sax->startElement != NULL)) + ctxt->sax->startElement(ctxt->userData, BAD_CAST"html", NULL); + } + if ((xmlStrEqual(newtag, BAD_CAST"body")) || (xmlStrEqual(newtag, BAD_CAST"head"))) + return; + if ((ctxt->nameNr <= 1) && + ((xmlStrEqual(newtag, BAD_CAST"script")) || + (xmlStrEqual(newtag, BAD_CAST"style")) || + (xmlStrEqual(newtag, BAD_CAST"meta")) || + (xmlStrEqual(newtag, BAD_CAST"link")) || + (xmlStrEqual(newtag, BAD_CAST"title")) || + (xmlStrEqual(newtag, BAD_CAST"base")))) { + if (ctxt->html >= 3) { + /* we already saw or generated an before */ + return; + } + /* + * dropped OBJECT ... i you put it first BODY will be + * assumed ! + */ + htmlnamePush(ctxt, BAD_CAST"head"); + if ((ctxt->sax != NULL) && (ctxt->sax->startElement != NULL)) + ctxt->sax->startElement(ctxt->userData, BAD_CAST"head", NULL); + } else if ((!xmlStrEqual(newtag, BAD_CAST"noframes")) && + (!xmlStrEqual(newtag, BAD_CAST"frame")) && + (!xmlStrEqual(newtag, BAD_CAST"frameset"))) { + if (ctxt->html >= 10) { + /* we already saw or generated a before */ + return; + } + for (i = 0;i < ctxt->nameNr;i++) { + if (xmlStrEqual(ctxt->nameTab[i], BAD_CAST"body")) { + return; + } + if (xmlStrEqual(ctxt->nameTab[i], BAD_CAST"head")) { + return; + } + } + + htmlnamePush(ctxt, BAD_CAST"body"); + if ((ctxt->sax != NULL) && (ctxt->sax->startElement != NULL)) + ctxt->sax->startElement(ctxt->userData, BAD_CAST"body", NULL); + } +} + +/** + * htmlCheckParagraph + * @ctxt: an HTML parser context + * + * Check whether a p element need to be implied before inserting + * characters in the current element. + * + * Returns 1 if a paragraph has been inserted, 0 if not and -1 + * in case of error. + */ + +static int +htmlCheckParagraph(htmlParserCtxtPtr ctxt) { + const xmlChar *tag; + int i; + + if (ctxt == NULL) + return(-1); + tag = ctxt->name; + if (tag == NULL) { + htmlAutoClose(ctxt, BAD_CAST"p"); + htmlCheckImplied(ctxt, BAD_CAST"p"); + htmlnamePush(ctxt, BAD_CAST"p"); + if ((ctxt->sax != NULL) && (ctxt->sax->startElement != NULL)) + ctxt->sax->startElement(ctxt->userData, BAD_CAST"p", NULL); + return(1); + } + if (!htmlOmittedDefaultValue) + return(0); + for (i = 0; htmlNoContentElements[i] != NULL; i++) { + if (xmlStrEqual(tag, BAD_CAST htmlNoContentElements[i])) { + htmlAutoClose(ctxt, BAD_CAST"p"); + htmlCheckImplied(ctxt, BAD_CAST"p"); + htmlnamePush(ctxt, BAD_CAST"p"); + if ((ctxt->sax != NULL) && (ctxt->sax->startElement != NULL)) + ctxt->sax->startElement(ctxt->userData, BAD_CAST"p", NULL); + return(1); + } + } + return(0); +} + +/** + * htmlIsScriptAttribute: + * @name: an attribute name + * + * Check if an attribute is of content type Script + * + * Returns 1 is the attribute is a script 0 otherwise + */ +int +htmlIsScriptAttribute(const xmlChar *name) { + unsigned int i; + + if (name == NULL) + return(0); + /* + * all script attributes start with 'on' + */ + if ((name[0] != 'o') || (name[1] != 'n')) + return(0); + for (i = 0; + i < sizeof(htmlScriptAttributes)/sizeof(htmlScriptAttributes[0]); + i++) { + if (xmlStrEqual(name, (const xmlChar *) htmlScriptAttributes[i])) + return(1); + } + return(0); +} + +/************************************************************************ + * * + * The list of HTML predefined entities * + * * + ************************************************************************/ + + +static const htmlEntityDesc html40EntitiesTable[] = { +/* + * the 4 absolute ones, plus apostrophe. + */ +{ 34, "quot", "quotation mark = APL quote, U+0022 ISOnum" }, +{ 38, "amp", "ampersand, U+0026 ISOnum" }, +{ 39, "apos", "single quote" }, +{ 60, "lt", "less-than sign, U+003C ISOnum" }, +{ 62, "gt", "greater-than sign, U+003E ISOnum" }, + +/* + * A bunch still in the 128-255 range + * Replacing them depend really on the charset used. + */ +{ 160, "nbsp", "no-break space = non-breaking space, U+00A0 ISOnum" }, +{ 161, "iexcl","inverted exclamation mark, U+00A1 ISOnum" }, +{ 162, "cent", "cent sign, U+00A2 ISOnum" }, +{ 163, "pound","pound sign, U+00A3 ISOnum" }, +{ 164, "curren","currency sign, U+00A4 ISOnum" }, +{ 165, "yen", "yen sign = yuan sign, U+00A5 ISOnum" }, +{ 166, "brvbar","broken bar = broken vertical bar, U+00A6 ISOnum" }, +{ 167, "sect", "section sign, U+00A7 ISOnum" }, +{ 168, "uml", "diaeresis = spacing diaeresis, U+00A8 ISOdia" }, +{ 169, "copy", "copyright sign, U+00A9 ISOnum" }, +{ 170, "ordf", "feminine ordinal indicator, U+00AA ISOnum" }, +{ 171, "laquo","left-pointing double angle quotation mark = left pointing guillemet, U+00AB ISOnum" }, +{ 172, "not", "not sign, U+00AC ISOnum" }, +{ 173, "shy", "soft hyphen = discretionary hyphen, U+00AD ISOnum" }, +{ 174, "reg", "registered sign = registered trade mark sign, U+00AE ISOnum" }, +{ 175, "macr", "macron = spacing macron = overline = APL overbar, U+00AF ISOdia" }, +{ 176, "deg", "degree sign, U+00B0 ISOnum" }, +{ 177, "plusmn","plus-minus sign = plus-or-minus sign, U+00B1 ISOnum" }, +{ 178, "sup2", "superscript two = superscript digit two = squared, U+00B2 ISOnum" }, +{ 179, "sup3", "superscript three = superscript digit three = cubed, U+00B3 ISOnum" }, +{ 180, "acute","acute accent = spacing acute, U+00B4 ISOdia" }, +{ 181, "micro","micro sign, U+00B5 ISOnum" }, +{ 182, "para", "pilcrow sign = paragraph sign, U+00B6 ISOnum" }, +{ 183, "middot","middle dot = Georgian comma Greek middle dot, U+00B7 ISOnum" }, +{ 184, "cedil","cedilla = spacing cedilla, U+00B8 ISOdia" }, +{ 185, "sup1", "superscript one = superscript digit one, U+00B9 ISOnum" }, +{ 186, "ordm", "masculine ordinal indicator, U+00BA ISOnum" }, +{ 187, "raquo","right-pointing double angle quotation mark right pointing guillemet, U+00BB ISOnum" }, +{ 188, "frac14","vulgar fraction one quarter = fraction one quarter, U+00BC ISOnum" }, +{ 189, "frac12","vulgar fraction one half = fraction one half, U+00BD ISOnum" }, +{ 190, "frac34","vulgar fraction three quarters = fraction three quarters, U+00BE ISOnum" }, +{ 191, "iquest","inverted question mark = turned question mark, U+00BF ISOnum" }, +{ 192, "Agrave","latin capital letter A with grave = latin capital letter A grave, U+00C0 ISOlat1" }, +{ 193, "Aacute","latin capital letter A with acute, U+00C1 ISOlat1" }, +{ 194, "Acirc","latin capital letter A with circumflex, U+00C2 ISOlat1" }, +{ 195, "Atilde","latin capital letter A with tilde, U+00C3 ISOlat1" }, +{ 196, "Auml", "latin capital letter A with diaeresis, U+00C4 ISOlat1" }, +{ 197, "Aring","latin capital letter A with ring above = latin capital letter A ring, U+00C5 ISOlat1" }, +{ 198, "AElig","latin capital letter AE = latin capital ligature AE, U+00C6 ISOlat1" }, +{ 199, "Ccedil","latin capital letter C with cedilla, U+00C7 ISOlat1" }, +{ 200, "Egrave","latin capital letter E with grave, U+00C8 ISOlat1" }, +{ 201, "Eacute","latin capital letter E with acute, U+00C9 ISOlat1" }, +{ 202, "Ecirc","latin capital letter E with circumflex, U+00CA ISOlat1" }, +{ 203, "Euml", "latin capital letter E with diaeresis, U+00CB ISOlat1" }, +{ 204, "Igrave","latin capital letter I with grave, U+00CC ISOlat1" }, +{ 205, "Iacute","latin capital letter I with acute, U+00CD ISOlat1" }, +{ 206, "Icirc","latin capital letter I with circumflex, U+00CE ISOlat1" }, +{ 207, "Iuml", "latin capital letter I with diaeresis, U+00CF ISOlat1" }, +{ 208, "ETH", "latin capital letter ETH, U+00D0 ISOlat1" }, +{ 209, "Ntilde","latin capital letter N with tilde, U+00D1 ISOlat1" }, +{ 210, "Ograve","latin capital letter O with grave, U+00D2 ISOlat1" }, +{ 211, "Oacute","latin capital letter O with acute, U+00D3 ISOlat1" }, +{ 212, "Ocirc","latin capital letter O with circumflex, U+00D4 ISOlat1" }, +{ 213, "Otilde","latin capital letter O with tilde, U+00D5 ISOlat1" }, +{ 214, "Ouml", "latin capital letter O with diaeresis, U+00D6 ISOlat1" }, +{ 215, "times","multiplication sign, U+00D7 ISOnum" }, +{ 216, "Oslash","latin capital letter O with stroke latin capital letter O slash, U+00D8 ISOlat1" }, +{ 217, "Ugrave","latin capital letter U with grave, U+00D9 ISOlat1" }, +{ 218, "Uacute","latin capital letter U with acute, U+00DA ISOlat1" }, +{ 219, "Ucirc","latin capital letter U with circumflex, U+00DB ISOlat1" }, +{ 220, "Uuml", "latin capital letter U with diaeresis, U+00DC ISOlat1" }, +{ 221, "Yacute","latin capital letter Y with acute, U+00DD ISOlat1" }, +{ 222, "THORN","latin capital letter THORN, U+00DE ISOlat1" }, +{ 223, "szlig","latin small letter sharp s = ess-zed, U+00DF ISOlat1" }, +{ 224, "agrave","latin small letter a with grave = latin small letter a grave, U+00E0 ISOlat1" }, +{ 225, "aacute","latin small letter a with acute, U+00E1 ISOlat1" }, +{ 226, "acirc","latin small letter a with circumflex, U+00E2 ISOlat1" }, +{ 227, "atilde","latin small letter a with tilde, U+00E3 ISOlat1" }, +{ 228, "auml", "latin small letter a with diaeresis, U+00E4 ISOlat1" }, +{ 229, "aring","latin small letter a with ring above = latin small letter a ring, U+00E5 ISOlat1" }, +{ 230, "aelig","latin small letter ae = latin small ligature ae, U+00E6 ISOlat1" }, +{ 231, "ccedil","latin small letter c with cedilla, U+00E7 ISOlat1" }, +{ 232, "egrave","latin small letter e with grave, U+00E8 ISOlat1" }, +{ 233, "eacute","latin small letter e with acute, U+00E9 ISOlat1" }, +{ 234, "ecirc","latin small letter e with circumflex, U+00EA ISOlat1" }, +{ 235, "euml", "latin small letter e with diaeresis, U+00EB ISOlat1" }, +{ 236, "igrave","latin small letter i with grave, U+00EC ISOlat1" }, +{ 237, "iacute","latin small letter i with acute, U+00ED ISOlat1" }, +{ 238, "icirc","latin small letter i with circumflex, U+00EE ISOlat1" }, +{ 239, "iuml", "latin small letter i with diaeresis, U+00EF ISOlat1" }, +{ 240, "eth", "latin small letter eth, U+00F0 ISOlat1" }, +{ 241, "ntilde","latin small letter n with tilde, U+00F1 ISOlat1" }, +{ 242, "ograve","latin small letter o with grave, U+00F2 ISOlat1" }, +{ 243, "oacute","latin small letter o with acute, U+00F3 ISOlat1" }, +{ 244, "ocirc","latin small letter o with circumflex, U+00F4 ISOlat1" }, +{ 245, "otilde","latin small letter o with tilde, U+00F5 ISOlat1" }, +{ 246, "ouml", "latin small letter o with diaeresis, U+00F6 ISOlat1" }, +{ 247, "divide","division sign, U+00F7 ISOnum" }, +{ 248, "oslash","latin small letter o with stroke, = latin small letter o slash, U+00F8 ISOlat1" }, +{ 249, "ugrave","latin small letter u with grave, U+00F9 ISOlat1" }, +{ 250, "uacute","latin small letter u with acute, U+00FA ISOlat1" }, +{ 251, "ucirc","latin small letter u with circumflex, U+00FB ISOlat1" }, +{ 252, "uuml", "latin small letter u with diaeresis, U+00FC ISOlat1" }, +{ 253, "yacute","latin small letter y with acute, U+00FD ISOlat1" }, +{ 254, "thorn","latin small letter thorn with, U+00FE ISOlat1" }, +{ 255, "yuml", "latin small letter y with diaeresis, U+00FF ISOlat1" }, + +{ 338, "OElig","latin capital ligature OE, U+0152 ISOlat2" }, +{ 339, "oelig","latin small ligature oe, U+0153 ISOlat2" }, +{ 352, "Scaron","latin capital letter S with caron, U+0160 ISOlat2" }, +{ 353, "scaron","latin small letter s with caron, U+0161 ISOlat2" }, +{ 376, "Yuml", "latin capital letter Y with diaeresis, U+0178 ISOlat2" }, + +/* + * Anything below should really be kept as entities references + */ +{ 402, "fnof", "latin small f with hook = function = florin, U+0192 ISOtech" }, + +{ 710, "circ", "modifier letter circumflex accent, U+02C6 ISOpub" }, +{ 732, "tilde","small tilde, U+02DC ISOdia" }, + +{ 913, "Alpha","greek capital letter alpha, U+0391" }, +{ 914, "Beta", "greek capital letter beta, U+0392" }, +{ 915, "Gamma","greek capital letter gamma, U+0393 ISOgrk3" }, +{ 916, "Delta","greek capital letter delta, U+0394 ISOgrk3" }, +{ 917, "Epsilon","greek capital letter epsilon, U+0395" }, +{ 918, "Zeta", "greek capital letter zeta, U+0396" }, +{ 919, "Eta", "greek capital letter eta, U+0397" }, +{ 920, "Theta","greek capital letter theta, U+0398 ISOgrk3" }, +{ 921, "Iota", "greek capital letter iota, U+0399" }, +{ 922, "Kappa","greek capital letter kappa, U+039A" }, +{ 923, "Lambda", "greek capital letter lambda, U+039B ISOgrk3" }, +{ 924, "Mu", "greek capital letter mu, U+039C" }, +{ 925, "Nu", "greek capital letter nu, U+039D" }, +{ 926, "Xi", "greek capital letter xi, U+039E ISOgrk3" }, +{ 927, "Omicron","greek capital letter omicron, U+039F" }, +{ 928, "Pi", "greek capital letter pi, U+03A0 ISOgrk3" }, +{ 929, "Rho", "greek capital letter rho, U+03A1" }, +{ 931, "Sigma","greek capital letter sigma, U+03A3 ISOgrk3" }, +{ 932, "Tau", "greek capital letter tau, U+03A4" }, +{ 933, "Upsilon","greek capital letter upsilon, U+03A5 ISOgrk3" }, +{ 934, "Phi", "greek capital letter phi, U+03A6 ISOgrk3" }, +{ 935, "Chi", "greek capital letter chi, U+03A7" }, +{ 936, "Psi", "greek capital letter psi, U+03A8 ISOgrk3" }, +{ 937, "Omega","greek capital letter omega, U+03A9 ISOgrk3" }, + +{ 945, "alpha","greek small letter alpha, U+03B1 ISOgrk3" }, +{ 946, "beta", "greek small letter beta, U+03B2 ISOgrk3" }, +{ 947, "gamma","greek small letter gamma, U+03B3 ISOgrk3" }, +{ 948, "delta","greek small letter delta, U+03B4 ISOgrk3" }, +{ 949, "epsilon","greek small letter epsilon, U+03B5 ISOgrk3" }, +{ 950, "zeta", "greek small letter zeta, U+03B6 ISOgrk3" }, +{ 951, "eta", "greek small letter eta, U+03B7 ISOgrk3" }, +{ 952, "theta","greek small letter theta, U+03B8 ISOgrk3" }, +{ 953, "iota", "greek small letter iota, U+03B9 ISOgrk3" }, +{ 954, "kappa","greek small letter kappa, U+03BA ISOgrk3" }, +{ 955, "lambda","greek small letter lambda, U+03BB ISOgrk3" }, +{ 956, "mu", "greek small letter mu, U+03BC ISOgrk3" }, +{ 957, "nu", "greek small letter nu, U+03BD ISOgrk3" }, +{ 958, "xi", "greek small letter xi, U+03BE ISOgrk3" }, +{ 959, "omicron","greek small letter omicron, U+03BF NEW" }, +{ 960, "pi", "greek small letter pi, U+03C0 ISOgrk3" }, +{ 961, "rho", "greek small letter rho, U+03C1 ISOgrk3" }, +{ 962, "sigmaf","greek small letter final sigma, U+03C2 ISOgrk3" }, +{ 963, "sigma","greek small letter sigma, U+03C3 ISOgrk3" }, +{ 964, "tau", "greek small letter tau, U+03C4 ISOgrk3" }, +{ 965, "upsilon","greek small letter upsilon, U+03C5 ISOgrk3" }, +{ 966, "phi", "greek small letter phi, U+03C6 ISOgrk3" }, +{ 967, "chi", "greek small letter chi, U+03C7 ISOgrk3" }, +{ 968, "psi", "greek small letter psi, U+03C8 ISOgrk3" }, +{ 969, "omega","greek small letter omega, U+03C9 ISOgrk3" }, +{ 977, "thetasym","greek small letter theta symbol, U+03D1 NEW" }, +{ 978, "upsih","greek upsilon with hook symbol, U+03D2 NEW" }, +{ 982, "piv", "greek pi symbol, U+03D6 ISOgrk3" }, + +{ 8194, "ensp", "en space, U+2002 ISOpub" }, +{ 8195, "emsp", "em space, U+2003 ISOpub" }, +{ 8201, "thinsp","thin space, U+2009 ISOpub" }, +{ 8204, "zwnj", "zero width non-joiner, U+200C NEW RFC 2070" }, +{ 8205, "zwj", "zero width joiner, U+200D NEW RFC 2070" }, +{ 8206, "lrm", "left-to-right mark, U+200E NEW RFC 2070" }, +{ 8207, "rlm", "right-to-left mark, U+200F NEW RFC 2070" }, +{ 8211, "ndash","en dash, U+2013 ISOpub" }, +{ 8212, "mdash","em dash, U+2014 ISOpub" }, +{ 8216, "lsquo","left single quotation mark, U+2018 ISOnum" }, +{ 8217, "rsquo","right single quotation mark, U+2019 ISOnum" }, +{ 8218, "sbquo","single low-9 quotation mark, U+201A NEW" }, +{ 8220, "ldquo","left double quotation mark, U+201C ISOnum" }, +{ 8221, "rdquo","right double quotation mark, U+201D ISOnum" }, +{ 8222, "bdquo","double low-9 quotation mark, U+201E NEW" }, +{ 8224, "dagger","dagger, U+2020 ISOpub" }, +{ 8225, "Dagger","double dagger, U+2021 ISOpub" }, + +{ 8226, "bull", "bullet = black small circle, U+2022 ISOpub" }, +{ 8230, "hellip","horizontal ellipsis = three dot leader, U+2026 ISOpub" }, + +{ 8240, "permil","per mille sign, U+2030 ISOtech" }, + +{ 8242, "prime","prime = minutes = feet, U+2032 ISOtech" }, +{ 8243, "Prime","double prime = seconds = inches, U+2033 ISOtech" }, + +{ 8249, "lsaquo","single left-pointing angle quotation mark, U+2039 ISO proposed" }, +{ 8250, "rsaquo","single right-pointing angle quotation mark, U+203A ISO proposed" }, + +{ 8254, "oline","overline = spacing overscore, U+203E NEW" }, +{ 8260, "frasl","fraction slash, U+2044 NEW" }, + +{ 8364, "euro", "euro sign, U+20AC NEW" }, + +{ 8465, "image","blackletter capital I = imaginary part, U+2111 ISOamso" }, +{ 8472, "weierp","script capital P = power set = Weierstrass p, U+2118 ISOamso" }, +{ 8476, "real", "blackletter capital R = real part symbol, U+211C ISOamso" }, +{ 8482, "trade","trade mark sign, U+2122 ISOnum" }, +{ 8501, "alefsym","alef symbol = first transfinite cardinal, U+2135 NEW" }, +{ 8592, "larr", "leftwards arrow, U+2190 ISOnum" }, +{ 8593, "uarr", "upwards arrow, U+2191 ISOnum" }, +{ 8594, "rarr", "rightwards arrow, U+2192 ISOnum" }, +{ 8595, "darr", "downwards arrow, U+2193 ISOnum" }, +{ 8596, "harr", "left right arrow, U+2194 ISOamsa" }, +{ 8629, "crarr","downwards arrow with corner leftwards = carriage return, U+21B5 NEW" }, +{ 8656, "lArr", "leftwards double arrow, U+21D0 ISOtech" }, +{ 8657, "uArr", "upwards double arrow, U+21D1 ISOamsa" }, +{ 8658, "rArr", "rightwards double arrow, U+21D2 ISOtech" }, +{ 8659, "dArr", "downwards double arrow, U+21D3 ISOamsa" }, +{ 8660, "hArr", "left right double arrow, U+21D4 ISOamsa" }, + +{ 8704, "forall","for all, U+2200 ISOtech" }, +{ 8706, "part", "partial differential, U+2202 ISOtech" }, +{ 8707, "exist","there exists, U+2203 ISOtech" }, +{ 8709, "empty","empty set = null set = diameter, U+2205 ISOamso" }, +{ 8711, "nabla","nabla = backward difference, U+2207 ISOtech" }, +{ 8712, "isin", "element of, U+2208 ISOtech" }, +{ 8713, "notin","not an element of, U+2209 ISOtech" }, +{ 8715, "ni", "contains as member, U+220B ISOtech" }, +{ 8719, "prod", "n-ary product = product sign, U+220F ISOamsb" }, +{ 8721, "sum", "n-ary summation, U+2211 ISOamsb" }, +{ 8722, "minus","minus sign, U+2212 ISOtech" }, +{ 8727, "lowast","asterisk operator, U+2217 ISOtech" }, +{ 8730, "radic","square root = radical sign, U+221A ISOtech" }, +{ 8733, "prop", "proportional to, U+221D ISOtech" }, +{ 8734, "infin","infinity, U+221E ISOtech" }, +{ 8736, "ang", "angle, U+2220 ISOamso" }, +{ 8743, "and", "logical and = wedge, U+2227 ISOtech" }, +{ 8744, "or", "logical or = vee, U+2228 ISOtech" }, +{ 8745, "cap", "intersection = cap, U+2229 ISOtech" }, +{ 8746, "cup", "union = cup, U+222A ISOtech" }, +{ 8747, "int", "integral, U+222B ISOtech" }, +{ 8756, "there4","therefore, U+2234 ISOtech" }, +{ 8764, "sim", "tilde operator = varies with = similar to, U+223C ISOtech" }, +{ 8773, "cong", "approximately equal to, U+2245 ISOtech" }, +{ 8776, "asymp","almost equal to = asymptotic to, U+2248 ISOamsr" }, +{ 8800, "ne", "not equal to, U+2260 ISOtech" }, +{ 8801, "equiv","identical to, U+2261 ISOtech" }, +{ 8804, "le", "less-than or equal to, U+2264 ISOtech" }, +{ 8805, "ge", "greater-than or equal to, U+2265 ISOtech" }, +{ 8834, "sub", "subset of, U+2282 ISOtech" }, +{ 8835, "sup", "superset of, U+2283 ISOtech" }, +{ 8836, "nsub", "not a subset of, U+2284 ISOamsn" }, +{ 8838, "sube", "subset of or equal to, U+2286 ISOtech" }, +{ 8839, "supe", "superset of or equal to, U+2287 ISOtech" }, +{ 8853, "oplus","circled plus = direct sum, U+2295 ISOamsb" }, +{ 8855, "otimes","circled times = vector product, U+2297 ISOamsb" }, +{ 8869, "perp", "up tack = orthogonal to = perpendicular, U+22A5 ISOtech" }, +{ 8901, "sdot", "dot operator, U+22C5 ISOamsb" }, +{ 8968, "lceil","left ceiling = apl upstile, U+2308 ISOamsc" }, +{ 8969, "rceil","right ceiling, U+2309 ISOamsc" }, +{ 8970, "lfloor","left floor = apl downstile, U+230A ISOamsc" }, +{ 8971, "rfloor","right floor, U+230B ISOamsc" }, +{ 9001, "lang", "left-pointing angle bracket = bra, U+2329 ISOtech" }, +{ 9002, "rang", "right-pointing angle bracket = ket, U+232A ISOtech" }, +{ 9674, "loz", "lozenge, U+25CA ISOpub" }, + +{ 9824, "spades","black spade suit, U+2660 ISOpub" }, +{ 9827, "clubs","black club suit = shamrock, U+2663 ISOpub" }, +{ 9829, "hearts","black heart suit = valentine, U+2665 ISOpub" }, +{ 9830, "diams","black diamond suit, U+2666 ISOpub" }, + +}; + +/************************************************************************ + * * + * Commodity functions to handle entities * + * * + ************************************************************************/ + +/* + * Macro used to grow the current buffer. + */ +#define growBuffer(buffer) { \ + xmlChar *tmp; \ + buffer##_size *= 2; \ + tmp = (xmlChar *) xmlRealloc(buffer, buffer##_size * sizeof(xmlChar)); \ + if (tmp == NULL) { \ + htmlErrMemory(ctxt, "growing buffer\n"); \ + xmlFree(buffer); \ + return(NULL); \ + } \ + buffer = tmp; \ +} + +/** + * htmlEntityLookup: + * @name: the entity name + * + * Lookup the given entity in EntitiesTable + * + * TODO: the linear scan is really ugly, an hash table is really needed. + * + * Returns the associated htmlEntityDescPtr if found, NULL otherwise. + */ +const htmlEntityDesc * +htmlEntityLookup(const xmlChar *name) { + unsigned int i; + + for (i = 0;i < (sizeof(html40EntitiesTable)/ + sizeof(html40EntitiesTable[0]));i++) { + if (xmlStrEqual(name, BAD_CAST html40EntitiesTable[i].name)) { + return((htmlEntityDescPtr) &html40EntitiesTable[i]); + } + } + return(NULL); +} + +/** + * htmlEntityValueLookup: + * @value: the entity's unicode value + * + * Lookup the given entity in EntitiesTable + * + * TODO: the linear scan is really ugly, an hash table is really needed. + * + * Returns the associated htmlEntityDescPtr if found, NULL otherwise. + */ +const htmlEntityDesc * +htmlEntityValueLookup(unsigned int value) { + unsigned int i; + + for (i = 0;i < (sizeof(html40EntitiesTable)/ + sizeof(html40EntitiesTable[0]));i++) { + if (html40EntitiesTable[i].value >= value) { + if (html40EntitiesTable[i].value > value) + break; + return((htmlEntityDescPtr) &html40EntitiesTable[i]); + } + } + return(NULL); +} + +/** + * UTF8ToHtml: + * @out: a pointer to an array of bytes to store the result + * @outlen: the length of @out + * @in: a pointer to an array of UTF-8 chars + * @inlen: the length of @in + * + * Take a block of UTF-8 chars in and try to convert it to an ASCII + * plus HTML entities block of chars out. + * + * Returns 0 if success, -2 if the transcoding fails, or -1 otherwise + * The value of @inlen after return is the number of octets consumed + * as the return value is positive, else unpredictable. + * The value of @outlen after return is the number of octets consumed. + */ +int +UTF8ToHtml(unsigned char* out, int *outlen, + const unsigned char* in, int *inlen) { + const unsigned char* processed = in; + const unsigned char* outend; + const unsigned char* outstart = out; + const unsigned char* instart = in; + const unsigned char* inend; + unsigned int c, d; + int trailing; + + if ((out == NULL) || (outlen == NULL) || (inlen == NULL)) return(-1); + if (in == NULL) { + /* + * initialization nothing to do + */ + *outlen = 0; + *inlen = 0; + return(0); + } + inend = in + (*inlen); + outend = out + (*outlen); + while (in < inend) { + d = *in++; + if (d < 0x80) { c= d; trailing= 0; } + else if (d < 0xC0) { + /* trailing byte in leading position */ + *outlen = out - outstart; + *inlen = processed - instart; + return(-2); + } else if (d < 0xE0) { c= d & 0x1F; trailing= 1; } + else if (d < 0xF0) { c= d & 0x0F; trailing= 2; } + else if (d < 0xF8) { c= d & 0x07; trailing= 3; } + else { + /* no chance for this in Ascii */ + *outlen = out - outstart; + *inlen = processed - instart; + return(-2); + } + + if (inend - in < trailing) { + break; + } + + for ( ; trailing; trailing--) { + if ((in >= inend) || (((d= *in++) & 0xC0) != 0x80)) + break; + c <<= 6; + c |= d & 0x3F; + } + + /* assertion: c is a single UTF-4 value */ + if (c < 0x80) { + if (out + 1 >= outend) + break; + *out++ = c; + } else { + int len; + const htmlEntityDesc * ent; + const char *cp; + char nbuf[16]; + + /* + * Try to lookup a predefined HTML entity for it + */ + + ent = htmlEntityValueLookup(c); + if (ent == NULL) { + snprintf(nbuf, sizeof(nbuf), "#%u", c); + cp = nbuf; + } + else + cp = ent->name; + len = strlen(cp); + if (out + 2 + len >= outend) + break; + *out++ = '&'; + memcpy(out, cp, len); + out += len; + *out++ = ';'; + } + processed = in; + } + *outlen = out - outstart; + *inlen = processed - instart; + return(0); +} + +/** + * htmlEncodeEntities: + * @out: a pointer to an array of bytes to store the result + * @outlen: the length of @out + * @in: a pointer to an array of UTF-8 chars + * @inlen: the length of @in + * @quoteChar: the quote character to escape (' or ") or zero. + * + * Take a block of UTF-8 chars in and try to convert it to an ASCII + * plus HTML entities block of chars out. + * + * Returns 0 if success, -2 if the transcoding fails, or -1 otherwise + * The value of @inlen after return is the number of octets consumed + * as the return value is positive, else unpredictable. + * The value of @outlen after return is the number of octets consumed. + */ +int +htmlEncodeEntities(unsigned char* out, int *outlen, + const unsigned char* in, int *inlen, int quoteChar) { + const unsigned char* processed = in; + const unsigned char* outend; + const unsigned char* outstart = out; + const unsigned char* instart = in; + const unsigned char* inend; + unsigned int c, d; + int trailing; + + if ((out == NULL) || (outlen == NULL) || (inlen == NULL) || (in == NULL)) + return(-1); + outend = out + (*outlen); + inend = in + (*inlen); + while (in < inend) { + d = *in++; + if (d < 0x80) { c= d; trailing= 0; } + else if (d < 0xC0) { + /* trailing byte in leading position */ + *outlen = out - outstart; + *inlen = processed - instart; + return(-2); + } else if (d < 0xE0) { c= d & 0x1F; trailing= 1; } + else if (d < 0xF0) { c= d & 0x0F; trailing= 2; } + else if (d < 0xF8) { c= d & 0x07; trailing= 3; } + else { + /* no chance for this in Ascii */ + *outlen = out - outstart; + *inlen = processed - instart; + return(-2); + } + + if (inend - in < trailing) + break; + + while (trailing--) { + if (((d= *in++) & 0xC0) != 0x80) { + *outlen = out - outstart; + *inlen = processed - instart; + return(-2); + } + c <<= 6; + c |= d & 0x3F; + } + + /* assertion: c is a single UTF-4 value */ + if ((c < 0x80) && (c != (unsigned int) quoteChar) && + (c != '&') && (c != '<') && (c != '>')) { + if (out >= outend) + break; + *out++ = c; + } else { + const htmlEntityDesc * ent; + const char *cp; + char nbuf[16]; + int len; + + /* + * Try to lookup a predefined HTML entity for it + */ + ent = htmlEntityValueLookup(c); + if (ent == NULL) { + snprintf(nbuf, sizeof(nbuf), "#%u", c); + cp = nbuf; + } + else + cp = ent->name; + len = strlen(cp); + if (out + 2 + len > outend) + break; + *out++ = '&'; + memcpy(out, cp, len); + out += len; + *out++ = ';'; + } + processed = in; + } + *outlen = out - outstart; + *inlen = processed - instart; + return(0); +} + +/************************************************************************ + * * + * Commodity functions to handle streams * + * * + ************************************************************************/ + +/** + * htmlNewInputStream: + * @ctxt: an HTML parser context + * + * Create a new input stream structure + * Returns the new input stream or NULL + */ +static htmlParserInputPtr +htmlNewInputStream(htmlParserCtxtPtr ctxt) { + htmlParserInputPtr input; + + input = (xmlParserInputPtr) xmlMalloc(sizeof(htmlParserInput)); + if (input == NULL) { + htmlErrMemory(ctxt, "couldn't allocate a new input stream\n"); + return(NULL); + } + memset(input, 0, sizeof(htmlParserInput)); + input->filename = NULL; + input->directory = NULL; + input->base = NULL; + input->cur = NULL; + input->buf = NULL; + input->line = 1; + input->col = 1; + input->buf = NULL; + input->free = NULL; + input->version = NULL; + input->consumed = 0; + input->length = 0; + return(input); +} + + +/************************************************************************ + * * + * Commodity functions, cleanup needed ? * + * * + ************************************************************************/ +/* + * all tags allowing pc data from the html 4.01 loose dtd + * NOTE: it might be more apropriate to integrate this information + * into the html40ElementTable array but I don't want to risk any + * binary incomptibility + */ +static const char *allowPCData[] = { + "a", "abbr", "acronym", "address", "applet", "b", "bdo", "big", + "blockquote", "body", "button", "caption", "center", "cite", "code", + "dd", "del", "dfn", "div", "dt", "em", "font", "form", "h1", "h2", + "h3", "h4", "h5", "h6", "i", "iframe", "ins", "kbd", "label", "legend", + "li", "noframes", "noscript", "object", "p", "pre", "q", "s", "samp", + "small", "span", "strike", "strong", "td", "th", "tt", "u", "var" +}; + +/** + * areBlanks: + * @ctxt: an HTML parser context + * @str: a xmlChar * + * @len: the size of @str + * + * Is this a sequence of blank chars that one can ignore ? + * + * Returns 1 if ignorable 0 otherwise. + */ + +static int areBlanks(htmlParserCtxtPtr ctxt, const xmlChar *str, int len) { + unsigned int i; + int j; + xmlNodePtr lastChild; + xmlDtdPtr dtd; + + for (j = 0;j < len;j++) + if (!(IS_BLANK_CH(str[j]))) return(0); + + if (CUR == 0) return(1); + if (CUR != '<') return(0); + if (ctxt->name == NULL) + return(1); + if (xmlStrEqual(ctxt->name, BAD_CAST"html")) + return(1); + if (xmlStrEqual(ctxt->name, BAD_CAST"head")) + return(1); + + /* Only strip CDATA children of the body tag for strict HTML DTDs */ + if (xmlStrEqual(ctxt->name, BAD_CAST "body") && ctxt->myDoc != NULL) { + dtd = xmlGetIntSubset(ctxt->myDoc); + if (dtd != NULL && dtd->ExternalID != NULL) { + if (!xmlStrcasecmp(dtd->ExternalID, BAD_CAST "-//W3C//DTD HTML 4.01//EN") || + !xmlStrcasecmp(dtd->ExternalID, BAD_CAST "-//W3C//DTD HTML 4//EN")) + return(1); + } + } + + if (ctxt->node == NULL) return(0); + lastChild = xmlGetLastChild(ctxt->node); + while ((lastChild) && (lastChild->type == XML_COMMENT_NODE)) + lastChild = lastChild->prev; + if (lastChild == NULL) { + if ((ctxt->node->type != XML_ELEMENT_NODE) && + (ctxt->node->content != NULL)) return(0); + /* keep ws in constructs like ... ... + for all tags "b" allowing PCDATA */ + for ( i = 0; i < sizeof(allowPCData)/sizeof(allowPCData[0]); i++ ) { + if ( xmlStrEqual(ctxt->name, BAD_CAST allowPCData[i]) ) { + return(0); + } + } + } else if (xmlNodeIsText(lastChild)) { + return(0); + } else { + /* keep ws in constructs like

    xy z

    + for all tags "p" allowing PCDATA */ + for ( i = 0; i < sizeof(allowPCData)/sizeof(allowPCData[0]); i++ ) { + if ( xmlStrEqual(lastChild->name, BAD_CAST allowPCData[i]) ) { + return(0); + } + } + } + return(1); +} + +/** + * htmlNewDocNoDtD: + * @URI: URI for the dtd, or NULL + * @ExternalID: the external ID of the DTD, or NULL + * + * Creates a new HTML document without a DTD node if @URI and @ExternalID + * are NULL + * + * Returns a new document, do not initialize the DTD if not provided + */ +htmlDocPtr +htmlNewDocNoDtD(const xmlChar *URI, const xmlChar *ExternalID) { + xmlDocPtr cur; + + /* + * Allocate a new document and fill the fields. + */ + cur = (xmlDocPtr) xmlMalloc(sizeof(xmlDoc)); + if (cur == NULL) { + htmlErrMemory(NULL, "HTML document creation failed\n"); + return(NULL); + } + memset(cur, 0, sizeof(xmlDoc)); + + cur->type = XML_HTML_DOCUMENT_NODE; + cur->version = NULL; + cur->intSubset = NULL; + cur->doc = cur; + cur->name = NULL; + cur->children = NULL; + cur->extSubset = NULL; + cur->oldNs = NULL; + cur->encoding = NULL; + cur->standalone = 1; + cur->compression = 0; + cur->ids = NULL; + cur->refs = NULL; + cur->_private = NULL; + cur->charset = XML_CHAR_ENCODING_UTF8; + cur->properties = XML_DOC_HTML | XML_DOC_USERBUILT; + if ((ExternalID != NULL) || + (URI != NULL)) + xmlCreateIntSubset(cur, BAD_CAST "html", ExternalID, URI); + return(cur); +} + +/** + * htmlNewDoc: + * @URI: URI for the dtd, or NULL + * @ExternalID: the external ID of the DTD, or NULL + * + * Creates a new HTML document + * + * Returns a new document + */ +htmlDocPtr +htmlNewDoc(const xmlChar *URI, const xmlChar *ExternalID) { + if ((URI == NULL) && (ExternalID == NULL)) + return(htmlNewDocNoDtD( + BAD_CAST "http://www.w3.org/TR/REC-html40/loose.dtd", + BAD_CAST "-//W3C//DTD HTML 4.0 Transitional//EN")); + + return(htmlNewDocNoDtD(URI, ExternalID)); +} + + +/************************************************************************ + * * + * The parser itself * + * Relates to http://www.w3.org/TR/html40 * + * * + ************************************************************************/ + +/************************************************************************ + * * + * The parser itself * + * * + ************************************************************************/ + +static const xmlChar * htmlParseNameComplex(xmlParserCtxtPtr ctxt); + +/** + * htmlParseHTMLName: + * @ctxt: an HTML parser context + * + * parse an HTML tag or attribute name, note that we convert it to lowercase + * since HTML names are not case-sensitive. + * + * Returns the Tag Name parsed or NULL + */ + +static const xmlChar * +htmlParseHTMLName(htmlParserCtxtPtr ctxt) { + int i = 0; + xmlChar loc[HTML_PARSER_BUFFER_SIZE]; + + if (!IS_ASCII_LETTER(CUR) && (CUR != '_') && + (CUR != ':') && (CUR != '.')) return(NULL); + + while ((i < HTML_PARSER_BUFFER_SIZE) && + ((IS_ASCII_LETTER(CUR)) || (IS_ASCII_DIGIT(CUR)) || + (CUR == ':') || (CUR == '-') || (CUR == '_') || + (CUR == '.'))) { + if ((CUR >= 'A') && (CUR <= 'Z')) loc[i] = CUR + 0x20; + else loc[i] = CUR; + i++; + + NEXT; + } + + return(xmlDictLookup(ctxt->dict, loc, i)); +} + + +/** + * htmlParseHTMLName_nonInvasive: + * @ctxt: an HTML parser context + * + * parse an HTML tag or attribute name, note that we convert it to lowercase + * since HTML names are not case-sensitive, this doesn't consume the data + * from the stream, it's a look-ahead + * + * Returns the Tag Name parsed or NULL + */ + +static const xmlChar * +htmlParseHTMLName_nonInvasive(htmlParserCtxtPtr ctxt) { + int i = 0; + xmlChar loc[HTML_PARSER_BUFFER_SIZE]; + + if (!IS_ASCII_LETTER(NXT(1)) && (NXT(1) != '_') && + (NXT(1) != ':')) return(NULL); + + while ((i < HTML_PARSER_BUFFER_SIZE) && + ((IS_ASCII_LETTER(NXT(1+i))) || (IS_ASCII_DIGIT(NXT(1+i))) || + (NXT(1+i) == ':') || (NXT(1+i) == '-') || (NXT(1+i) == '_'))) { + if ((NXT(1+i) >= 'A') && (NXT(1+i) <= 'Z')) loc[i] = NXT(1+i) + 0x20; + else loc[i] = NXT(1+i); + i++; + } + + return(xmlDictLookup(ctxt->dict, loc, i)); +} + + +/** + * htmlParseName: + * @ctxt: an HTML parser context + * + * parse an HTML name, this routine is case sensitive. + * + * Returns the Name parsed or NULL + */ + +static const xmlChar * +htmlParseName(htmlParserCtxtPtr ctxt) { + const xmlChar *in; + const xmlChar *ret; + int count = 0; + + GROW; + + /* + * Accelerator for simple ASCII names + */ + in = ctxt->input->cur; + if (((*in >= 0x61) && (*in <= 0x7A)) || + ((*in >= 0x41) && (*in <= 0x5A)) || + (*in == '_') || (*in == ':')) { + in++; + while (((*in >= 0x61) && (*in <= 0x7A)) || + ((*in >= 0x41) && (*in <= 0x5A)) || + ((*in >= 0x30) && (*in <= 0x39)) || + (*in == '_') || (*in == '-') || + (*in == ':') || (*in == '.')) + in++; + if ((*in > 0) && (*in < 0x80)) { + count = in - ctxt->input->cur; + ret = xmlDictLookup(ctxt->dict, ctxt->input->cur, count); + ctxt->input->cur = in; + ctxt->nbChars += count; + ctxt->input->col += count; + return(ret); + } + } + return(htmlParseNameComplex(ctxt)); +} + +static const xmlChar * +htmlParseNameComplex(xmlParserCtxtPtr ctxt) { + int len = 0, l; + int c; + int count = 0; + + /* + * Handler for more complex cases + */ + GROW; + c = CUR_CHAR(l); + if ((c == ' ') || (c == '>') || (c == '/') || /* accelerators */ + (!IS_LETTER(c) && (c != '_') && + (c != ':'))) { + return(NULL); + } + + while ((c != ' ') && (c != '>') && (c != '/') && /* test bigname.xml */ + ((IS_LETTER(c)) || (IS_DIGIT(c)) || + (c == '.') || (c == '-') || + (c == '_') || (c == ':') || + (IS_COMBINING(c)) || + (IS_EXTENDER(c)))) { + if (count++ > 100) { + count = 0; + GROW; + } + len += l; + NEXTL(l); + c = CUR_CHAR(l); + } + return(xmlDictLookup(ctxt->dict, ctxt->input->cur - len, len)); +} + + +/** + * htmlParseHTMLAttribute: + * @ctxt: an HTML parser context + * @stop: a char stop value + * + * parse an HTML attribute value till the stop (quote), if + * stop is 0 then it stops at the first space + * + * Returns the attribute parsed or NULL + */ + +static xmlChar * +htmlParseHTMLAttribute(htmlParserCtxtPtr ctxt, const xmlChar stop) { + xmlChar *buffer = NULL; + int buffer_size = 0; + xmlChar *out = NULL; + const xmlChar *name = NULL; + const xmlChar *cur = NULL; + const htmlEntityDesc * ent; + + /* + * allocate a translation buffer. + */ + buffer_size = HTML_PARSER_BUFFER_SIZE; + buffer = (xmlChar *) xmlMallocAtomic(buffer_size * sizeof(xmlChar)); + if (buffer == NULL) { + htmlErrMemory(ctxt, "buffer allocation failed\n"); + return(NULL); + } + out = buffer; + + /* + * Ok loop until we reach one of the ending chars + */ + while ((CUR != 0) && (CUR != stop)) { + if ((stop == 0) && (CUR == '>')) break; + if ((stop == 0) && (IS_BLANK_CH(CUR))) break; + if (CUR == '&') { + if (NXT(1) == '#') { + unsigned int c; + int bits; + + c = htmlParseCharRef(ctxt); + if (c < 0x80) + { *out++ = c; bits= -6; } + else if (c < 0x800) + { *out++ =((c >> 6) & 0x1F) | 0xC0; bits= 0; } + else if (c < 0x10000) + { *out++ =((c >> 12) & 0x0F) | 0xE0; bits= 6; } + else + { *out++ =((c >> 18) & 0x07) | 0xF0; bits= 12; } + + for ( ; bits >= 0; bits-= 6) { + *out++ = ((c >> bits) & 0x3F) | 0x80; + } + + if (out - buffer > buffer_size - 100) { + int indx = out - buffer; + + growBuffer(buffer); + out = &buffer[indx]; + } + } else { + ent = htmlParseEntityRef(ctxt, &name); + if (name == NULL) { + *out++ = '&'; + if (out - buffer > buffer_size - 100) { + int indx = out - buffer; + + growBuffer(buffer); + out = &buffer[indx]; + } + } else if (ent == NULL) { + *out++ = '&'; + cur = name; + while (*cur != 0) { + if (out - buffer > buffer_size - 100) { + int indx = out - buffer; + + growBuffer(buffer); + out = &buffer[indx]; + } + *out++ = *cur++; + } + } else { + unsigned int c; + int bits; + + if (out - buffer > buffer_size - 100) { + int indx = out - buffer; + + growBuffer(buffer); + out = &buffer[indx]; + } + c = ent->value; + if (c < 0x80) + { *out++ = c; bits= -6; } + else if (c < 0x800) + { *out++ =((c >> 6) & 0x1F) | 0xC0; bits= 0; } + else if (c < 0x10000) + { *out++ =((c >> 12) & 0x0F) | 0xE0; bits= 6; } + else + { *out++ =((c >> 18) & 0x07) | 0xF0; bits= 12; } + + for ( ; bits >= 0; bits-= 6) { + *out++ = ((c >> bits) & 0x3F) | 0x80; + } + } + } + } else { + unsigned int c; + int bits, l; + + if (out - buffer > buffer_size - 100) { + int indx = out - buffer; + + growBuffer(buffer); + out = &buffer[indx]; + } + c = CUR_CHAR(l); + if (c < 0x80) + { *out++ = c; bits= -6; } + else if (c < 0x800) + { *out++ =((c >> 6) & 0x1F) | 0xC0; bits= 0; } + else if (c < 0x10000) + { *out++ =((c >> 12) & 0x0F) | 0xE0; bits= 6; } + else + { *out++ =((c >> 18) & 0x07) | 0xF0; bits= 12; } + + for ( ; bits >= 0; bits-= 6) { + *out++ = ((c >> bits) & 0x3F) | 0x80; + } + NEXT; + } + } + *out = 0; + return(buffer); +} + +/** + * htmlParseEntityRef: + * @ctxt: an HTML parser context + * @str: location to store the entity name + * + * parse an HTML ENTITY references + * + * [68] EntityRef ::= '&' Name ';' + * + * Returns the associated htmlEntityDescPtr if found, or NULL otherwise, + * if non-NULL *str will have to be freed by the caller. + */ +const htmlEntityDesc * +htmlParseEntityRef(htmlParserCtxtPtr ctxt, const xmlChar **str) { + const xmlChar *name; + const htmlEntityDesc * ent = NULL; + + if (str != NULL) *str = NULL; + if ((ctxt == NULL) || (ctxt->input == NULL)) return(NULL); + + if (CUR == '&') { + NEXT; + name = htmlParseName(ctxt); + if (name == NULL) { + htmlParseErr(ctxt, XML_ERR_NAME_REQUIRED, + "htmlParseEntityRef: no name\n", NULL, NULL); + } else { + GROW; + if (CUR == ';') { + if (str != NULL) + *str = name; + + /* + * Lookup the entity in the table. + */ + ent = htmlEntityLookup(name); + if (ent != NULL) /* OK that's ugly !!! */ + NEXT; + } else { + htmlParseErr(ctxt, XML_ERR_ENTITYREF_SEMICOL_MISSING, + "htmlParseEntityRef: expecting ';'\n", + NULL, NULL); + if (str != NULL) + *str = name; + } + } + } + return(ent); +} + +/** + * htmlParseAttValue: + * @ctxt: an HTML parser context + * + * parse a value for an attribute + * Note: the parser won't do substitution of entities here, this + * will be handled later in xmlStringGetNodeList, unless it was + * asked for ctxt->replaceEntities != 0 + * + * Returns the AttValue parsed or NULL. + */ + +static xmlChar * +htmlParseAttValue(htmlParserCtxtPtr ctxt) { + xmlChar *ret = NULL; + + if (CUR == '"') { + NEXT; + ret = htmlParseHTMLAttribute(ctxt, '"'); + if (CUR != '"') { + htmlParseErr(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED, + "AttValue: \" expected\n", NULL, NULL); + } else + NEXT; + } else if (CUR == '\'') { + NEXT; + ret = htmlParseHTMLAttribute(ctxt, '\''); + if (CUR != '\'') { + htmlParseErr(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED, + "AttValue: ' expected\n", NULL, NULL); + } else + NEXT; + } else { + /* + * That's an HTMLism, the attribute value may not be quoted + */ + ret = htmlParseHTMLAttribute(ctxt, 0); + if (ret == NULL) { + htmlParseErr(ctxt, XML_ERR_ATTRIBUTE_WITHOUT_VALUE, + "AttValue: no value found\n", NULL, NULL); + } + } + return(ret); +} + +/** + * htmlParseSystemLiteral: + * @ctxt: an HTML parser context + * + * parse an HTML Literal + * + * [11] SystemLiteral ::= ('"' [^"]* '"') | ("'" [^']* "'") + * + * Returns the SystemLiteral parsed or NULL + */ + +static xmlChar * +htmlParseSystemLiteral(htmlParserCtxtPtr ctxt) { + const xmlChar *q; + xmlChar *ret = NULL; + + if (CUR == '"') { + NEXT; + q = CUR_PTR; + while ((IS_CHAR_CH(CUR)) && (CUR != '"')) + NEXT; + if (!IS_CHAR_CH(CUR)) { + htmlParseErr(ctxt, XML_ERR_LITERAL_NOT_FINISHED, + "Unfinished SystemLiteral\n", NULL, NULL); + } else { + ret = xmlStrndup(q, CUR_PTR - q); + NEXT; + } + } else if (CUR == '\'') { + NEXT; + q = CUR_PTR; + while ((IS_CHAR_CH(CUR)) && (CUR != '\'')) + NEXT; + if (!IS_CHAR_CH(CUR)) { + htmlParseErr(ctxt, XML_ERR_LITERAL_NOT_FINISHED, + "Unfinished SystemLiteral\n", NULL, NULL); + } else { + ret = xmlStrndup(q, CUR_PTR - q); + NEXT; + } + } else { + htmlParseErr(ctxt, XML_ERR_LITERAL_NOT_STARTED, + " or ' expected\n", NULL, NULL); + } + + return(ret); +} + +/** + * htmlParsePubidLiteral: + * @ctxt: an HTML parser context + * + * parse an HTML public literal + * + * [12] PubidLiteral ::= '"' PubidChar* '"' | "'" (PubidChar - "'")* "'" + * + * Returns the PubidLiteral parsed or NULL. + */ + +static xmlChar * +htmlParsePubidLiteral(htmlParserCtxtPtr ctxt) { + const xmlChar *q; + xmlChar *ret = NULL; + /* + * Name ::= (Letter | '_') (NameChar)* + */ + if (CUR == '"') { + NEXT; + q = CUR_PTR; + while (IS_PUBIDCHAR_CH(CUR)) NEXT; + if (CUR != '"') { + htmlParseErr(ctxt, XML_ERR_LITERAL_NOT_FINISHED, + "Unfinished PubidLiteral\n", NULL, NULL); + } else { + ret = xmlStrndup(q, CUR_PTR - q); + NEXT; + } + } else if (CUR == '\'') { + NEXT; + q = CUR_PTR; + while ((IS_PUBIDCHAR_CH(CUR)) && (CUR != '\'')) + NEXT; + if (CUR != '\'') { + htmlParseErr(ctxt, XML_ERR_LITERAL_NOT_FINISHED, + "Unfinished PubidLiteral\n", NULL, NULL); + } else { + ret = xmlStrndup(q, CUR_PTR - q); + NEXT; + } + } else { + htmlParseErr(ctxt, XML_ERR_LITERAL_NOT_STARTED, + "PubidLiteral \" or ' expected\n", NULL, NULL); + } + + return(ret); +} + +/** + * htmlParseScript: + * @ctxt: an HTML parser context + * + * parse the content of an HTML SCRIPT or STYLE element + * http://www.w3.org/TR/html4/sgml/dtd.html#Script + * http://www.w3.org/TR/html4/sgml/dtd.html#StyleSheet + * http://www.w3.org/TR/html4/types.html#type-script + * http://www.w3.org/TR/html4/types.html#h-6.15 + * http://www.w3.org/TR/html4/appendix/notes.html#h-B.3.2.1 + * + * Script data ( %Script; in the DTD) can be the content of the SCRIPT + * element and the value of intrinsic event attributes. User agents must + * not evaluate script data as HTML markup but instead must pass it on as + * data to a script engine. + * NOTES: + * - The content is passed like CDATA + * - the attributes for style and scripting "onXXX" are also described + * as CDATA but SGML allows entities references in attributes so their + * processing is identical as other attributes + */ +static void +htmlParseScript(htmlParserCtxtPtr ctxt) { + xmlChar buf[HTML_PARSER_BIG_BUFFER_SIZE + 5]; + int nbchar = 0; + int cur,l; + + SHRINK; + cur = CUR_CHAR(l); + while (IS_CHAR_CH(cur)) { + if ((cur == '<') && (NXT(1) == '/')) { + /* + * One should break here, the specification is clear: + * Authors should therefore escape "recovery) { + if (xmlStrncasecmp(ctxt->name, ctxt->input->cur+2, + xmlStrlen(ctxt->name)) == 0) + { + break; /* while */ + } else { + htmlParseErr(ctxt, XML_ERR_TAG_NAME_MISMATCH, + "Element %s embeds close tag\n", + ctxt->name, NULL); + } + } else { + if (((NXT(2) >= 'A') && (NXT(2) <= 'Z')) || + ((NXT(2) >= 'a') && (NXT(2) <= 'z'))) + { + break; /* while */ + } + } + } + COPY_BUF(l,buf,nbchar,cur); + if (nbchar >= HTML_PARSER_BIG_BUFFER_SIZE) { + if (ctxt->sax->cdataBlock!= NULL) { + /* + * Insert as CDATA, which is the same as HTML_PRESERVE_NODE + */ + ctxt->sax->cdataBlock(ctxt->userData, buf, nbchar); + } else if (ctxt->sax->characters != NULL) { + ctxt->sax->characters(ctxt->userData, buf, nbchar); + } + nbchar = 0; + } + GROW; + NEXTL(l); + cur = CUR_CHAR(l); + } + + if ((!(IS_CHAR_CH(cur))) && (!((cur == 0) && (ctxt->progressive)))) { + htmlParseErrInt(ctxt, XML_ERR_INVALID_CHAR, + "Invalid char in CDATA 0x%X\n", cur); + if (ctxt->input->cur < ctxt->input->end) { + NEXT; + } + } + + if ((nbchar != 0) && (ctxt->sax != NULL) && (!ctxt->disableSAX)) { + if (ctxt->sax->cdataBlock!= NULL) { + /* + * Insert as CDATA, which is the same as HTML_PRESERVE_NODE + */ + ctxt->sax->cdataBlock(ctxt->userData, buf, nbchar); + } else if (ctxt->sax->characters != NULL) { + ctxt->sax->characters(ctxt->userData, buf, nbchar); + } + } +} + + +/** + * htmlParseCharData: + * @ctxt: an HTML parser context + * + * parse a CharData section. + * if we are within a CDATA section ']]>' marks an end of section. + * + * [14] CharData ::= [^<&]* - ([^<&]* ']]>' [^<&]*) + */ + +static void +htmlParseCharData(htmlParserCtxtPtr ctxt) { + xmlChar buf[HTML_PARSER_BIG_BUFFER_SIZE + 5]; + int nbchar = 0; + int cur, l; + int chunk = 0; + + SHRINK; + cur = CUR_CHAR(l); + while (((cur != '<') || (ctxt->token == '<')) && + ((cur != '&') || (ctxt->token == '&')) && + (cur != 0)) { + if (!(IS_CHAR(cur))) { + htmlParseErrInt(ctxt, XML_ERR_INVALID_CHAR, + "Invalid char in CDATA 0x%X\n", cur); + } else { + COPY_BUF(l,buf,nbchar,cur); + } + if (nbchar >= HTML_PARSER_BIG_BUFFER_SIZE) { + /* + * Ok the segment is to be consumed as chars. + */ + if ((ctxt->sax != NULL) && (!ctxt->disableSAX)) { + if (areBlanks(ctxt, buf, nbchar)) { + if (ctxt->keepBlanks) { + if (ctxt->sax->characters != NULL) + ctxt->sax->characters(ctxt->userData, buf, nbchar); + } else { + if (ctxt->sax->ignorableWhitespace != NULL) + ctxt->sax->ignorableWhitespace(ctxt->userData, + buf, nbchar); + } + } else { + htmlCheckParagraph(ctxt); + if (ctxt->sax->characters != NULL) + ctxt->sax->characters(ctxt->userData, buf, nbchar); + } + } + nbchar = 0; + } + NEXTL(l); + chunk++; + if (chunk > HTML_PARSER_BUFFER_SIZE) { + chunk = 0; + SHRINK; + GROW; + } + cur = CUR_CHAR(l); + if (cur == 0) { + SHRINK; + GROW; + cur = CUR_CHAR(l); + } + } + if (nbchar != 0) { + buf[nbchar] = 0; + + /* + * Ok the segment is to be consumed as chars. + */ + if ((ctxt->sax != NULL) && (!ctxt->disableSAX)) { + if (areBlanks(ctxt, buf, nbchar)) { + if (ctxt->keepBlanks) { + if (ctxt->sax->characters != NULL) + ctxt->sax->characters(ctxt->userData, buf, nbchar); + } else { + if (ctxt->sax->ignorableWhitespace != NULL) + ctxt->sax->ignorableWhitespace(ctxt->userData, + buf, nbchar); + } + } else { + htmlCheckParagraph(ctxt); + if (ctxt->sax->characters != NULL) + ctxt->sax->characters(ctxt->userData, buf, nbchar); + } + } + } else { + /* + * Loop detection + */ + if (cur == 0) + ctxt->instate = XML_PARSER_EOF; + } +} + +/** + * htmlParseExternalID: + * @ctxt: an HTML parser context + * @publicID: a xmlChar** receiving PubidLiteral + * + * Parse an External ID or a Public ID + * + * [75] ExternalID ::= 'SYSTEM' S SystemLiteral + * | 'PUBLIC' S PubidLiteral S SystemLiteral + * + * [83] PublicID ::= 'PUBLIC' S PubidLiteral + * + * Returns the function returns SystemLiteral and in the second + * case publicID receives PubidLiteral, is strict is off + * it is possible to return NULL and have publicID set. + */ + +static xmlChar * +htmlParseExternalID(htmlParserCtxtPtr ctxt, xmlChar **publicID) { + xmlChar *URI = NULL; + + if ((UPPER == 'S') && (UPP(1) == 'Y') && + (UPP(2) == 'S') && (UPP(3) == 'T') && + (UPP(4) == 'E') && (UPP(5) == 'M')) { + SKIP(6); + if (!IS_BLANK_CH(CUR)) { + htmlParseErr(ctxt, XML_ERR_SPACE_REQUIRED, + "Space required after 'SYSTEM'\n", NULL, NULL); + } + SKIP_BLANKS; + URI = htmlParseSystemLiteral(ctxt); + if (URI == NULL) { + htmlParseErr(ctxt, XML_ERR_URI_REQUIRED, + "htmlParseExternalID: SYSTEM, no URI\n", NULL, NULL); + } + } else if ((UPPER == 'P') && (UPP(1) == 'U') && + (UPP(2) == 'B') && (UPP(3) == 'L') && + (UPP(4) == 'I') && (UPP(5) == 'C')) { + SKIP(6); + if (!IS_BLANK_CH(CUR)) { + htmlParseErr(ctxt, XML_ERR_SPACE_REQUIRED, + "Space required after 'PUBLIC'\n", NULL, NULL); + } + SKIP_BLANKS; + *publicID = htmlParsePubidLiteral(ctxt); + if (*publicID == NULL) { + htmlParseErr(ctxt, XML_ERR_PUBID_REQUIRED, + "htmlParseExternalID: PUBLIC, no Public Identifier\n", + NULL, NULL); + } + SKIP_BLANKS; + if ((CUR == '"') || (CUR == '\'')) { + URI = htmlParseSystemLiteral(ctxt); + } + } + return(URI); +} + +/** + * xmlParsePI: + * @ctxt: an XML parser context + * + * parse an XML Processing Instruction. + * + * [16] PI ::= '' Char*)))? '?>' + */ +static void +htmlParsePI(htmlParserCtxtPtr ctxt) { + xmlChar *buf = NULL; + int len = 0; + int size = HTML_PARSER_BUFFER_SIZE; + int cur, l; + const xmlChar *target; + xmlParserInputState state; + int count = 0; + + if ((RAW == '<') && (NXT(1) == '?')) { + state = ctxt->instate; + ctxt->instate = XML_PARSER_PI; + /* + * this is a Processing Instruction. + */ + SKIP(2); + SHRINK; + + /* + * Parse the target name and check for special support like + * namespace. + */ + target = htmlParseName(ctxt); + if (target != NULL) { + if (RAW == '>') { + SKIP(1); + + /* + * SAX: PI detected. + */ + if ((ctxt->sax) && (!ctxt->disableSAX) && + (ctxt->sax->processingInstruction != NULL)) + ctxt->sax->processingInstruction(ctxt->userData, + target, NULL); + ctxt->instate = state; + return; + } + buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar)); + if (buf == NULL) { + htmlErrMemory(ctxt, NULL); + ctxt->instate = state; + return; + } + cur = CUR; + if (!IS_BLANK(cur)) { + htmlParseErr(ctxt, XML_ERR_SPACE_REQUIRED, + "ParsePI: PI %s space expected\n", target, NULL); + } + SKIP_BLANKS; + cur = CUR_CHAR(l); + while (IS_CHAR(cur) && (cur != '>')) { + if (len + 5 >= size) { + xmlChar *tmp; + + size *= 2; + tmp = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar)); + if (tmp == NULL) { + htmlErrMemory(ctxt, NULL); + xmlFree(buf); + ctxt->instate = state; + return; + } + buf = tmp; + } + count++; + if (count > 50) { + GROW; + count = 0; + } + COPY_BUF(l,buf,len,cur); + NEXTL(l); + cur = CUR_CHAR(l); + if (cur == 0) { + SHRINK; + GROW; + cur = CUR_CHAR(l); + } + } + buf[len] = 0; + if (cur != '>') { + htmlParseErr(ctxt, XML_ERR_PI_NOT_FINISHED, + "ParsePI: PI %s never end ...\n", target, NULL); + } else { + SKIP(1); + + /* + * SAX: PI detected. + */ + if ((ctxt->sax) && (!ctxt->disableSAX) && + (ctxt->sax->processingInstruction != NULL)) + ctxt->sax->processingInstruction(ctxt->userData, + target, buf); + } + xmlFree(buf); + } else { + htmlParseErr(ctxt, XML_ERR_PI_NOT_STARTED, + "PI is not started correctly", NULL, NULL); + } + ctxt->instate = state; + } +} + +/** + * htmlParseComment: + * @ctxt: an HTML parser context + * + * Parse an XML (SGML) comment + * + * [15] Comment ::= '' + */ +static void +htmlParseComment(htmlParserCtxtPtr ctxt) { + xmlChar *buf = NULL; + int len; + int size = HTML_PARSER_BUFFER_SIZE; + int q, ql; + int r, rl; + int cur, l; + xmlParserInputState state; + + /* + * Check that there is a comment right here. + */ + if ((RAW != '<') || (NXT(1) != '!') || + (NXT(2) != '-') || (NXT(3) != '-')) return; + + state = ctxt->instate; + ctxt->instate = XML_PARSER_COMMENT; + SHRINK; + SKIP(4); + buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar)); + if (buf == NULL) { + htmlErrMemory(ctxt, "buffer allocation failed\n"); + ctxt->instate = state; + return; + } + q = CUR_CHAR(ql); + NEXTL(ql); + r = CUR_CHAR(rl); + NEXTL(rl); + cur = CUR_CHAR(l); + len = 0; + while (IS_CHAR(cur) && + ((cur != '>') || + (r != '-') || (q != '-'))) { + if (len + 5 >= size) { + xmlChar *tmp; + + size *= 2; + tmp = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar)); + if (tmp == NULL) { + xmlFree(buf); + htmlErrMemory(ctxt, "growing buffer failed\n"); + ctxt->instate = state; + return; + } + buf = tmp; + } + COPY_BUF(ql,buf,len,q); + q = r; + ql = rl; + r = cur; + rl = l; + NEXTL(l); + cur = CUR_CHAR(l); + if (cur == 0) { + SHRINK; + GROW; + cur = CUR_CHAR(l); + } + } + buf[len] = 0; + if (!IS_CHAR(cur)) { + htmlParseErr(ctxt, XML_ERR_COMMENT_NOT_FINISHED, + "Comment not terminated \n */ + base += 2; + } + } + if (ignoreattrval) { + if (buf[base] == '"' || buf[base] == '\'') { + if (invalue) { + if (buf[base] == valdellim) { + invalue = 0; + continue; + } + } else { + valdellim = buf[base]; + invalue = 1; + continue; + } + } else if (invalue) { + continue; + } + } + if (incomment) { + if (base + 3 > len) + return (-1); + if ((buf[base] == '-') && (buf[base + 1] == '-') && + (buf[base + 2] == '>')) { + incomment = 0; + base += 2; + } + continue; + } + if (buf[base] == first) { + if (third != 0) { + if ((buf[base + 1] != next) || (buf[base + 2] != third)) + continue; + } else if (next != 0) { + if (buf[base + 1] != next) + continue; + } + ctxt->checkIndex = 0; +#ifdef DEBUG_PUSH + if (next == 0) + xmlGenericError(xmlGenericErrorContext, + "HPP: lookup '%c' found at %d\n", + first, base); + else if (third == 0) + xmlGenericError(xmlGenericErrorContext, + "HPP: lookup '%c%c' found at %d\n", + first, next, base); + else + xmlGenericError(xmlGenericErrorContext, + "HPP: lookup '%c%c%c' found at %d\n", + first, next, third, base); +#endif + return (base - (in->cur - in->base)); + } + } + if ((!incomment) && (!invalue)) + ctxt->checkIndex = base; +#ifdef DEBUG_PUSH + if (next == 0) + xmlGenericError(xmlGenericErrorContext, + "HPP: lookup '%c' failed\n", first); + else if (third == 0) + xmlGenericError(xmlGenericErrorContext, + "HPP: lookup '%c%c' failed\n", first, next); + else + xmlGenericError(xmlGenericErrorContext, + "HPP: lookup '%c%c%c' failed\n", first, next, + third); +#endif + return (-1); +} + +/** + * htmlParseLookupChars: + * @ctxt: an HTML parser context + * @stop: Array of chars, which stop the lookup. + * @stopLen: Length of stop-Array + * + * Try to find if any char of the stop-Array is available in the input + * stream. + * This function has a side effect of (possibly) incrementing ctxt->checkIndex + * to avoid rescanning sequences of bytes, it DOES change the state of the + * parser, do not use liberally. + * + * Returns the index to the current parsing point if a stopChar + * is available, -1 otherwise. + */ +static int +htmlParseLookupChars(htmlParserCtxtPtr ctxt, const xmlChar * stop, + int stopLen) +{ + int base, len; + htmlParserInputPtr in; + const xmlChar *buf; + int incomment = 0; + int i; + + in = ctxt->input; + if (in == NULL) + return (-1); + + base = in->cur - in->base; + if (base < 0) + return (-1); + + if (ctxt->checkIndex > base) + base = ctxt->checkIndex; + + if (in->buf == NULL) { + buf = in->base; + len = in->length; + } else { + buf = xmlBufContent(in->buf->buffer); + len = xmlBufUse(in->buf->buffer); + } + + for (; base < len; base++) { + if (!incomment && (base + 4 < len)) { + if ((buf[base] == '<') && (buf[base + 1] == '!') && + (buf[base + 2] == '-') && (buf[base + 3] == '-')) { + incomment = 1; + /* do not increment past */ + base += 2; + } + } + if (incomment) { + if (base + 3 > len) + return (-1); + if ((buf[base] == '-') && (buf[base + 1] == '-') && + (buf[base + 2] == '>')) { + incomment = 0; + base += 2; + } + continue; + } + for (i = 0; i < stopLen; ++i) { + if (buf[base] == stop[i]) { + ctxt->checkIndex = 0; + return (base - (in->cur - in->base)); + } + } + } + ctxt->checkIndex = base; + return (-1); +} + +/** + * htmlParseTryOrFinish: + * @ctxt: an HTML parser context + * @terminate: last chunk indicator + * + * Try to progress on parsing + * + * Returns zero if no parsing was possible + */ +static int +htmlParseTryOrFinish(htmlParserCtxtPtr ctxt, int terminate) { + int ret = 0; + htmlParserInputPtr in; + int avail = 0; + xmlChar cur, next; + + htmlParserNodeInfo node_info; + +#ifdef DEBUG_PUSH + switch (ctxt->instate) { + case XML_PARSER_EOF: + xmlGenericError(xmlGenericErrorContext, + "HPP: try EOF\n"); break; + case XML_PARSER_START: + xmlGenericError(xmlGenericErrorContext, + "HPP: try START\n"); break; + case XML_PARSER_MISC: + xmlGenericError(xmlGenericErrorContext, + "HPP: try MISC\n");break; + case XML_PARSER_COMMENT: + xmlGenericError(xmlGenericErrorContext, + "HPP: try COMMENT\n");break; + case XML_PARSER_PROLOG: + xmlGenericError(xmlGenericErrorContext, + "HPP: try PROLOG\n");break; + case XML_PARSER_START_TAG: + xmlGenericError(xmlGenericErrorContext, + "HPP: try START_TAG\n");break; + case XML_PARSER_CONTENT: + xmlGenericError(xmlGenericErrorContext, + "HPP: try CONTENT\n");break; + case XML_PARSER_CDATA_SECTION: + xmlGenericError(xmlGenericErrorContext, + "HPP: try CDATA_SECTION\n");break; + case XML_PARSER_END_TAG: + xmlGenericError(xmlGenericErrorContext, + "HPP: try END_TAG\n");break; + case XML_PARSER_ENTITY_DECL: + xmlGenericError(xmlGenericErrorContext, + "HPP: try ENTITY_DECL\n");break; + case XML_PARSER_ENTITY_VALUE: + xmlGenericError(xmlGenericErrorContext, + "HPP: try ENTITY_VALUE\n");break; + case XML_PARSER_ATTRIBUTE_VALUE: + xmlGenericError(xmlGenericErrorContext, + "HPP: try ATTRIBUTE_VALUE\n");break; + case XML_PARSER_DTD: + xmlGenericError(xmlGenericErrorContext, + "HPP: try DTD\n");break; + case XML_PARSER_EPILOG: + xmlGenericError(xmlGenericErrorContext, + "HPP: try EPILOG\n");break; + case XML_PARSER_PI: + xmlGenericError(xmlGenericErrorContext, + "HPP: try PI\n");break; + case XML_PARSER_SYSTEM_LITERAL: + xmlGenericError(xmlGenericErrorContext, + "HPP: try SYSTEM_LITERAL\n");break; + } +#endif + + while (1) { + + in = ctxt->input; + if (in == NULL) break; + if (in->buf == NULL) + avail = in->length - (in->cur - in->base); + else + avail = xmlBufUse(in->buf->buffer) - (in->cur - in->base); + if ((avail == 0) && (terminate)) { + htmlAutoCloseOnEnd(ctxt); + if ((ctxt->nameNr == 0) && (ctxt->instate != XML_PARSER_EOF)) { + /* + * SAX: end of the document processing. + */ + ctxt->instate = XML_PARSER_EOF; + if ((ctxt->sax) && (ctxt->sax->endDocument != NULL)) + ctxt->sax->endDocument(ctxt->userData); + } + } + if (avail < 1) + goto done; + cur = in->cur[0]; + if (cur == 0) { + SKIP(1); + continue; + } + + switch (ctxt->instate) { + case XML_PARSER_EOF: + /* + * Document parsing is done ! + */ + goto done; + case XML_PARSER_START: + /* + * Very first chars read from the document flow. + */ + cur = in->cur[0]; + if (IS_BLANK_CH(cur)) { + SKIP_BLANKS; + if (in->buf == NULL) + avail = in->length - (in->cur - in->base); + else + avail = xmlBufUse(in->buf->buffer) - (in->cur - in->base); + } + if ((ctxt->sax) && (ctxt->sax->setDocumentLocator)) + ctxt->sax->setDocumentLocator(ctxt->userData, + &xmlDefaultSAXLocator); + if ((ctxt->sax) && (ctxt->sax->startDocument) && + (!ctxt->disableSAX)) + ctxt->sax->startDocument(ctxt->userData); + + cur = in->cur[0]; + next = in->cur[1]; + if ((cur == '<') && (next == '!') && + (UPP(2) == 'D') && (UPP(3) == 'O') && + (UPP(4) == 'C') && (UPP(5) == 'T') && + (UPP(6) == 'Y') && (UPP(7) == 'P') && + (UPP(8) == 'E')) { + if ((!terminate) && + (htmlParseLookupSequence(ctxt, '>', 0, 0, 0, 1) < 0)) + goto done; +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, + "HPP: Parsing internal subset\n"); +#endif + htmlParseDocTypeDecl(ctxt); + ctxt->instate = XML_PARSER_PROLOG; +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, + "HPP: entering PROLOG\n"); +#endif + } else { + ctxt->instate = XML_PARSER_MISC; +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, + "HPP: entering MISC\n"); +#endif + } + break; + case XML_PARSER_MISC: + SKIP_BLANKS; + if (in->buf == NULL) + avail = in->length - (in->cur - in->base); + else + avail = xmlBufUse(in->buf->buffer) - (in->cur - in->base); + /* + * no chars in buffer + */ + if (avail < 1) + goto done; + /* + * not enouth chars in buffer + */ + if (avail < 2) { + if (!terminate) + goto done; + else + next = ' '; + } else { + next = in->cur[1]; + } + cur = in->cur[0]; + if ((cur == '<') && (next == '!') && + (in->cur[2] == '-') && (in->cur[3] == '-')) { + if ((!terminate) && + (htmlParseLookupSequence(ctxt, '-', '-', '>', 1, 1) < 0)) + goto done; +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, + "HPP: Parsing Comment\n"); +#endif + htmlParseComment(ctxt); + ctxt->instate = XML_PARSER_MISC; + } else if ((cur == '<') && (next == '?')) { + if ((!terminate) && + (htmlParseLookupSequence(ctxt, '>', 0, 0, 0, 1) < 0)) + goto done; +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, + "HPP: Parsing PI\n"); +#endif + htmlParsePI(ctxt); + ctxt->instate = XML_PARSER_MISC; + } else if ((cur == '<') && (next == '!') && + (UPP(2) == 'D') && (UPP(3) == 'O') && + (UPP(4) == 'C') && (UPP(5) == 'T') && + (UPP(6) == 'Y') && (UPP(7) == 'P') && + (UPP(8) == 'E')) { + if ((!terminate) && + (htmlParseLookupSequence(ctxt, '>', 0, 0, 0, 1) < 0)) + goto done; +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, + "HPP: Parsing internal subset\n"); +#endif + htmlParseDocTypeDecl(ctxt); + ctxt->instate = XML_PARSER_PROLOG; +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, + "HPP: entering PROLOG\n"); +#endif + } else if ((cur == '<') && (next == '!') && + (avail < 9)) { + goto done; + } else { + ctxt->instate = XML_PARSER_START_TAG; +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, + "HPP: entering START_TAG\n"); +#endif + } + break; + case XML_PARSER_PROLOG: + SKIP_BLANKS; + if (in->buf == NULL) + avail = in->length - (in->cur - in->base); + else + avail = xmlBufUse(in->buf->buffer) - (in->cur - in->base); + if (avail < 2) + goto done; + cur = in->cur[0]; + next = in->cur[1]; + if ((cur == '<') && (next == '!') && + (in->cur[2] == '-') && (in->cur[3] == '-')) { + if ((!terminate) && + (htmlParseLookupSequence(ctxt, '-', '-', '>', 1, 1) < 0)) + goto done; +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, + "HPP: Parsing Comment\n"); +#endif + htmlParseComment(ctxt); + ctxt->instate = XML_PARSER_PROLOG; + } else if ((cur == '<') && (next == '?')) { + if ((!terminate) && + (htmlParseLookupSequence(ctxt, '>', 0, 0, 0, 1) < 0)) + goto done; +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, + "HPP: Parsing PI\n"); +#endif + htmlParsePI(ctxt); + ctxt->instate = XML_PARSER_PROLOG; + } else if ((cur == '<') && (next == '!') && + (avail < 4)) { + goto done; + } else { + ctxt->instate = XML_PARSER_START_TAG; +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, + "HPP: entering START_TAG\n"); +#endif + } + break; + case XML_PARSER_EPILOG: + if (in->buf == NULL) + avail = in->length - (in->cur - in->base); + else + avail = xmlBufUse(in->buf->buffer) - (in->cur - in->base); + if (avail < 1) + goto done; + cur = in->cur[0]; + if (IS_BLANK_CH(cur)) { + htmlParseCharData(ctxt); + goto done; + } + if (avail < 2) + goto done; + next = in->cur[1]; + if ((cur == '<') && (next == '!') && + (in->cur[2] == '-') && (in->cur[3] == '-')) { + if ((!terminate) && + (htmlParseLookupSequence(ctxt, '-', '-', '>', 1, 1) < 0)) + goto done; +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, + "HPP: Parsing Comment\n"); +#endif + htmlParseComment(ctxt); + ctxt->instate = XML_PARSER_EPILOG; + } else if ((cur == '<') && (next == '?')) { + if ((!terminate) && + (htmlParseLookupSequence(ctxt, '>', 0, 0, 0, 1) < 0)) + goto done; +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, + "HPP: Parsing PI\n"); +#endif + htmlParsePI(ctxt); + ctxt->instate = XML_PARSER_EPILOG; + } else if ((cur == '<') && (next == '!') && + (avail < 4)) { + goto done; + } else { + ctxt->errNo = XML_ERR_DOCUMENT_END; + ctxt->wellFormed = 0; + ctxt->instate = XML_PARSER_EOF; +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, + "HPP: entering EOF\n"); +#endif + if ((ctxt->sax) && (ctxt->sax->endDocument != NULL)) + ctxt->sax->endDocument(ctxt->userData); + goto done; + } + break; + case XML_PARSER_START_TAG: { + const xmlChar *name; + int failed; + const htmlElemDesc * info; + + /* + * no chars in buffer + */ + if (avail < 1) + goto done; + /* + * not enouth chars in buffer + */ + if (avail < 2) { + if (!terminate) + goto done; + else + next = ' '; + } else { + next = in->cur[1]; + } + cur = in->cur[0]; + if (cur != '<') { + ctxt->instate = XML_PARSER_CONTENT; +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, + "HPP: entering CONTENT\n"); +#endif + break; + } + if (next == '/') { + ctxt->instate = XML_PARSER_END_TAG; + ctxt->checkIndex = 0; +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, + "HPP: entering END_TAG\n"); +#endif + break; + } + if ((!terminate) && + (htmlParseLookupSequence(ctxt, '>', 0, 0, 0, 1) < 0)) + goto done; + + /* Capture start position */ + if (ctxt->record_info) { + node_info.begin_pos = ctxt->input->consumed + + (CUR_PTR - ctxt->input->base); + node_info.begin_line = ctxt->input->line; + } + + + failed = htmlParseStartTag(ctxt); + name = ctxt->name; + if ((failed == -1) || + (name == NULL)) { + if (CUR == '>') + NEXT; + break; + } + + /* + * Lookup the info for that element. + */ + info = htmlTagLookup(name); + if (info == NULL) { + htmlParseErr(ctxt, XML_HTML_UNKNOWN_TAG, + "Tag %s invalid\n", name, NULL); + } + + /* + * Check for an Empty Element labeled the XML/SGML way + */ + if ((CUR == '/') && (NXT(1) == '>')) { + SKIP(2); + if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) + ctxt->sax->endElement(ctxt->userData, name); + htmlnamePop(ctxt); + ctxt->instate = XML_PARSER_CONTENT; +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, + "HPP: entering CONTENT\n"); +#endif + break; + } + + if (CUR == '>') { + NEXT; + } else { + htmlParseErr(ctxt, XML_ERR_GT_REQUIRED, + "Couldn't find end of Start Tag %s\n", + name, NULL); + + /* + * end of parsing of this node. + */ + if (xmlStrEqual(name, ctxt->name)) { + nodePop(ctxt); + htmlnamePop(ctxt); + } + + if (ctxt->record_info) + htmlNodeInfoPush(ctxt, &node_info); + + ctxt->instate = XML_PARSER_CONTENT; +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, + "HPP: entering CONTENT\n"); +#endif + break; + } + + /* + * Check for an Empty Element from DTD definition + */ + if ((info != NULL) && (info->empty)) { + if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL)) + ctxt->sax->endElement(ctxt->userData, name); + htmlnamePop(ctxt); + } + + if (ctxt->record_info) + htmlNodeInfoPush(ctxt, &node_info); + + ctxt->instate = XML_PARSER_CONTENT; +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, + "HPP: entering CONTENT\n"); +#endif + break; + } + case XML_PARSER_CONTENT: { + long cons; + /* + * Handle preparsed entities and charRef + */ + if (ctxt->token != 0) { + xmlChar chr[2] = { 0 , 0 } ; + + chr[0] = (xmlChar) ctxt->token; + htmlCheckParagraph(ctxt); + if ((ctxt->sax != NULL) && (ctxt->sax->characters != NULL)) + ctxt->sax->characters(ctxt->userData, chr, 1); + ctxt->token = 0; + ctxt->checkIndex = 0; + } + if ((avail == 1) && (terminate)) { + cur = in->cur[0]; + if ((cur != '<') && (cur != '&')) { + if (ctxt->sax != NULL) { + if (IS_BLANK_CH(cur)) { + if (ctxt->keepBlanks) { + if (ctxt->sax->characters != NULL) + ctxt->sax->characters( + ctxt->userData, &cur, 1); + } else { + if (ctxt->sax->ignorableWhitespace != NULL) + ctxt->sax->ignorableWhitespace( + ctxt->userData, &cur, 1); + } + } else { + htmlCheckParagraph(ctxt); + if (ctxt->sax->characters != NULL) + ctxt->sax->characters( + ctxt->userData, &cur, 1); + } + } + ctxt->token = 0; + ctxt->checkIndex = 0; + in->cur++; + break; + } + } + if (avail < 2) + goto done; + cur = in->cur[0]; + next = in->cur[1]; + cons = ctxt->nbChars; + if ((xmlStrEqual(ctxt->name, BAD_CAST"script")) || + (xmlStrEqual(ctxt->name, BAD_CAST"style"))) { + /* + * Handle SCRIPT/STYLE separately + */ + if (!terminate) { + int idx; + xmlChar val; + + idx = htmlParseLookupSequence(ctxt, '<', '/', 0, 0, 0); + if (idx < 0) + goto done; + val = in->cur[idx + 2]; + if (val == 0) /* bad cut of input */ + goto done; + } + htmlParseScript(ctxt); + if ((cur == '<') && (next == '/')) { + ctxt->instate = XML_PARSER_END_TAG; + ctxt->checkIndex = 0; +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, + "HPP: entering END_TAG\n"); +#endif + break; + } + } else { + /* + * Sometimes DOCTYPE arrives in the middle of the document + */ + if ((cur == '<') && (next == '!') && + (UPP(2) == 'D') && (UPP(3) == 'O') && + (UPP(4) == 'C') && (UPP(5) == 'T') && + (UPP(6) == 'Y') && (UPP(7) == 'P') && + (UPP(8) == 'E')) { + if ((!terminate) && + (htmlParseLookupSequence(ctxt, '>', 0, 0, 0, 1) < 0)) + goto done; + htmlParseErr(ctxt, XML_HTML_STRUCURE_ERROR, + "Misplaced DOCTYPE declaration\n", + BAD_CAST "DOCTYPE" , NULL); + htmlParseDocTypeDecl(ctxt); + } else if ((cur == '<') && (next == '!') && + (in->cur[2] == '-') && (in->cur[3] == '-')) { + if ((!terminate) && + (htmlParseLookupSequence( + ctxt, '-', '-', '>', 1, 1) < 0)) + goto done; +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, + "HPP: Parsing Comment\n"); +#endif + htmlParseComment(ctxt); + ctxt->instate = XML_PARSER_CONTENT; + } else if ((cur == '<') && (next == '?')) { + if ((!terminate) && + (htmlParseLookupSequence(ctxt, '>', 0, 0, 0, 1) < 0)) + goto done; +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, + "HPP: Parsing PI\n"); +#endif + htmlParsePI(ctxt); + ctxt->instate = XML_PARSER_CONTENT; + } else if ((cur == '<') && (next == '!') && (avail < 4)) { + goto done; + } else if ((cur == '<') && (next == '/')) { + ctxt->instate = XML_PARSER_END_TAG; + ctxt->checkIndex = 0; +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, + "HPP: entering END_TAG\n"); +#endif + break; + } else if (cur == '<') { + ctxt->instate = XML_PARSER_START_TAG; + ctxt->checkIndex = 0; +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, + "HPP: entering START_TAG\n"); +#endif + break; + } else if (cur == '&') { + if ((!terminate) && + (htmlParseLookupChars(ctxt, + BAD_CAST "; >/", 4) < 0)) + goto done; +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, + "HPP: Parsing Reference\n"); +#endif + /* TODO: check generation of subtrees if noent !!! */ + htmlParseReference(ctxt); + } else { + /* + * check that the text sequence is complete + * before handing out the data to the parser + * to avoid problems with erroneous end of + * data detection. + */ + if ((!terminate) && + (htmlParseLookupChars(ctxt, BAD_CAST "<&", 2) < 0)) + goto done; + ctxt->checkIndex = 0; +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, + "HPP: Parsing char data\n"); +#endif + htmlParseCharData(ctxt); + } + } + if (cons == ctxt->nbChars) { + if (ctxt->node != NULL) { + htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, + "detected an error in element content\n", + NULL, NULL); + } + NEXT; + break; + } + + break; + } + case XML_PARSER_END_TAG: + if (avail < 2) + goto done; + if ((!terminate) && + (htmlParseLookupSequence(ctxt, '>', 0, 0, 0, 1) < 0)) + goto done; + htmlParseEndTag(ctxt); + if (ctxt->nameNr == 0) { + ctxt->instate = XML_PARSER_EPILOG; + } else { + ctxt->instate = XML_PARSER_CONTENT; + } + ctxt->checkIndex = 0; +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, + "HPP: entering CONTENT\n"); +#endif + break; + case XML_PARSER_CDATA_SECTION: + htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, + "HPP: internal error, state == CDATA\n", + NULL, NULL); + ctxt->instate = XML_PARSER_CONTENT; + ctxt->checkIndex = 0; +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, + "HPP: entering CONTENT\n"); +#endif + break; + case XML_PARSER_DTD: + htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, + "HPP: internal error, state == DTD\n", + NULL, NULL); + ctxt->instate = XML_PARSER_CONTENT; + ctxt->checkIndex = 0; +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, + "HPP: entering CONTENT\n"); +#endif + break; + case XML_PARSER_COMMENT: + htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, + "HPP: internal error, state == COMMENT\n", + NULL, NULL); + ctxt->instate = XML_PARSER_CONTENT; + ctxt->checkIndex = 0; +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, + "HPP: entering CONTENT\n"); +#endif + break; + case XML_PARSER_PI: + htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, + "HPP: internal error, state == PI\n", + NULL, NULL); + ctxt->instate = XML_PARSER_CONTENT; + ctxt->checkIndex = 0; +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, + "HPP: entering CONTENT\n"); +#endif + break; + case XML_PARSER_ENTITY_DECL: + htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, + "HPP: internal error, state == ENTITY_DECL\n", + NULL, NULL); + ctxt->instate = XML_PARSER_CONTENT; + ctxt->checkIndex = 0; +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, + "HPP: entering CONTENT\n"); +#endif + break; + case XML_PARSER_ENTITY_VALUE: + htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, + "HPP: internal error, state == ENTITY_VALUE\n", + NULL, NULL); + ctxt->instate = XML_PARSER_CONTENT; + ctxt->checkIndex = 0; +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, + "HPP: entering DTD\n"); +#endif + break; + case XML_PARSER_ATTRIBUTE_VALUE: + htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, + "HPP: internal error, state == ATTRIBUTE_VALUE\n", + NULL, NULL); + ctxt->instate = XML_PARSER_START_TAG; + ctxt->checkIndex = 0; +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, + "HPP: entering START_TAG\n"); +#endif + break; + case XML_PARSER_SYSTEM_LITERAL: + htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, + "HPP: internal error, state == XML_PARSER_SYSTEM_LITERAL\n", + NULL, NULL); + ctxt->instate = XML_PARSER_CONTENT; + ctxt->checkIndex = 0; +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, + "HPP: entering CONTENT\n"); +#endif + break; + case XML_PARSER_IGNORE: + htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, + "HPP: internal error, state == XML_PARSER_IGNORE\n", + NULL, NULL); + ctxt->instate = XML_PARSER_CONTENT; + ctxt->checkIndex = 0; +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, + "HPP: entering CONTENT\n"); +#endif + break; + case XML_PARSER_PUBLIC_LITERAL: + htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, + "HPP: internal error, state == XML_PARSER_LITERAL\n", + NULL, NULL); + ctxt->instate = XML_PARSER_CONTENT; + ctxt->checkIndex = 0; +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, + "HPP: entering CONTENT\n"); +#endif + break; + + } + } +done: + if ((avail == 0) && (terminate)) { + htmlAutoCloseOnEnd(ctxt); + if ((ctxt->nameNr == 0) && (ctxt->instate != XML_PARSER_EOF)) { + /* + * SAX: end of the document processing. + */ + ctxt->instate = XML_PARSER_EOF; + if ((ctxt->sax) && (ctxt->sax->endDocument != NULL)) + ctxt->sax->endDocument(ctxt->userData); + } + } + if ((ctxt->myDoc != NULL) && + ((terminate) || (ctxt->instate == XML_PARSER_EOF) || + (ctxt->instate == XML_PARSER_EPILOG))) { + xmlDtdPtr dtd; + dtd = xmlGetIntSubset(ctxt->myDoc); + if (dtd == NULL) + ctxt->myDoc->intSubset = + xmlCreateIntSubset(ctxt->myDoc, BAD_CAST "html", + BAD_CAST "-//W3C//DTD HTML 4.0 Transitional//EN", + BAD_CAST "http://www.w3.org/TR/REC-html40/loose.dtd"); + } +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, "HPP: done %d\n", ret); +#endif + return(ret); +} + +/** + * htmlParseChunk: + * @ctxt: an HTML parser context + * @chunk: an char array + * @size: the size in byte of the chunk + * @terminate: last chunk indicator + * + * Parse a Chunk of memory + * + * Returns zero if no error, the xmlParserErrors otherwise. + */ +int +htmlParseChunk(htmlParserCtxtPtr ctxt, const char *chunk, int size, + int terminate) { + if ((ctxt == NULL) || (ctxt->input == NULL)) { + htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, + "htmlParseChunk: context error\n", NULL, NULL); + return(XML_ERR_INTERNAL_ERROR); + } + if ((size > 0) && (chunk != NULL) && (ctxt->input != NULL) && + (ctxt->input->buf != NULL) && (ctxt->instate != XML_PARSER_EOF)) { + size_t base = xmlBufGetInputBase(ctxt->input->buf->buffer, ctxt->input); + size_t cur = ctxt->input->cur - ctxt->input->base; + int res; + + res = xmlParserInputBufferPush(ctxt->input->buf, size, chunk); + if (res < 0) { + ctxt->errNo = XML_PARSER_EOF; + ctxt->disableSAX = 1; + return (XML_PARSER_EOF); + } + xmlBufSetInputBaseCur(ctxt->input->buf->buffer, ctxt->input, base, cur); +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, "HPP: pushed %d\n", size); +#endif + +#if 0 + if ((terminate) || (ctxt->input->buf->buffer->use > 80)) + htmlParseTryOrFinish(ctxt, terminate); +#endif + } else if (ctxt->instate != XML_PARSER_EOF) { + if ((ctxt->input != NULL) && ctxt->input->buf != NULL) { + xmlParserInputBufferPtr in = ctxt->input->buf; + if ((in->encoder != NULL) && (in->buffer != NULL) && + (in->raw != NULL)) { + int nbchars; + size_t base = xmlBufGetInputBase(in->buffer, ctxt->input); + size_t current = ctxt->input->cur - ctxt->input->base; + + nbchars = xmlCharEncInput(in, terminate); + if (nbchars < 0) { + htmlParseErr(ctxt, XML_ERR_INVALID_ENCODING, + "encoder error\n", NULL, NULL); + return(XML_ERR_INVALID_ENCODING); + } + xmlBufSetInputBaseCur(in->buffer, ctxt->input, base, current); + } + } + } + htmlParseTryOrFinish(ctxt, terminate); + if (terminate) { + if ((ctxt->instate != XML_PARSER_EOF) && + (ctxt->instate != XML_PARSER_EPILOG) && + (ctxt->instate != XML_PARSER_MISC)) { + ctxt->errNo = XML_ERR_DOCUMENT_END; + ctxt->wellFormed = 0; + } + if (ctxt->instate != XML_PARSER_EOF) { + if ((ctxt->sax) && (ctxt->sax->endDocument != NULL)) + ctxt->sax->endDocument(ctxt->userData); + } + ctxt->instate = XML_PARSER_EOF; + } + return((xmlParserErrors) ctxt->errNo); +} + +/************************************************************************ + * * + * User entry points * + * * + ************************************************************************/ + +/** + * htmlCreatePushParserCtxt: + * @sax: a SAX handler + * @user_data: The user data returned on SAX callbacks + * @chunk: a pointer to an array of chars + * @size: number of chars in the array + * @filename: an optional file name or URI + * @enc: an optional encoding + * + * Create a parser context for using the HTML parser in push mode + * The value of @filename is used for fetching external entities + * and error/warning reports. + * + * Returns the new parser context or NULL + */ +htmlParserCtxtPtr +htmlCreatePushParserCtxt(htmlSAXHandlerPtr sax, void *user_data, + const char *chunk, int size, const char *filename, + xmlCharEncoding enc) { + htmlParserCtxtPtr ctxt; + htmlParserInputPtr inputStream; + xmlParserInputBufferPtr buf; + + xmlInitParser(); + + buf = xmlAllocParserInputBuffer(enc); + if (buf == NULL) return(NULL); + + ctxt = htmlNewParserCtxt(); + if (ctxt == NULL) { + xmlFreeParserInputBuffer(buf); + return(NULL); + } + if(enc==XML_CHAR_ENCODING_UTF8 || buf->encoder) + ctxt->charset=XML_CHAR_ENCODING_UTF8; + if (sax != NULL) { + if (ctxt->sax != (xmlSAXHandlerPtr) &htmlDefaultSAXHandler) + xmlFree(ctxt->sax); + ctxt->sax = (htmlSAXHandlerPtr) xmlMalloc(sizeof(htmlSAXHandler)); + if (ctxt->sax == NULL) { + xmlFree(buf); + xmlFree(ctxt); + return(NULL); + } + memcpy(ctxt->sax, sax, sizeof(htmlSAXHandler)); + if (user_data != NULL) + ctxt->userData = user_data; + } + if (filename == NULL) { + ctxt->directory = NULL; + } else { + ctxt->directory = xmlParserGetDirectory(filename); + } + + inputStream = htmlNewInputStream(ctxt); + if (inputStream == NULL) { + xmlFreeParserCtxt(ctxt); + xmlFree(buf); + return(NULL); + } + + if (filename == NULL) + inputStream->filename = NULL; + else + inputStream->filename = (char *) + xmlCanonicPath((const xmlChar *) filename); + inputStream->buf = buf; + xmlBufResetInput(buf->buffer, inputStream); + + inputPush(ctxt, inputStream); + + if ((size > 0) && (chunk != NULL) && (ctxt->input != NULL) && + (ctxt->input->buf != NULL)) { + size_t base = xmlBufGetInputBase(ctxt->input->buf->buffer, ctxt->input); + size_t cur = ctxt->input->cur - ctxt->input->base; + + xmlParserInputBufferPush(ctxt->input->buf, size, chunk); + + xmlBufSetInputBaseCur(ctxt->input->buf->buffer, ctxt->input, base, cur); +#ifdef DEBUG_PUSH + xmlGenericError(xmlGenericErrorContext, "HPP: pushed %d\n", size); +#endif + } + ctxt->progressive = 1; + + return(ctxt); +} +#endif /* LIBXML_PUSH_ENABLED */ + +/** + * htmlSAXParseDoc: + * @cur: a pointer to an array of xmlChar + * @encoding: a free form C string describing the HTML document encoding, or NULL + * @sax: the SAX handler block + * @userData: if using SAX, this pointer will be provided on callbacks. + * + * Parse an HTML in-memory document. If sax is not NULL, use the SAX callbacks + * to handle parse events. If sax is NULL, fallback to the default DOM + * behavior and return a tree. + * + * Returns the resulting document tree unless SAX is NULL or the document is + * not well formed. + */ + +htmlDocPtr +htmlSAXParseDoc(xmlChar *cur, const char *encoding, htmlSAXHandlerPtr sax, void *userData) { + htmlDocPtr ret; + htmlParserCtxtPtr ctxt; + + xmlInitParser(); + + if (cur == NULL) return(NULL); + + + ctxt = htmlCreateDocParserCtxt(cur, encoding); + if (ctxt == NULL) return(NULL); + if (sax != NULL) { + if (ctxt->sax != NULL) xmlFree (ctxt->sax); + ctxt->sax = sax; + ctxt->userData = userData; + } + + htmlParseDocument(ctxt); + ret = ctxt->myDoc; + if (sax != NULL) { + ctxt->sax = NULL; + ctxt->userData = NULL; + } + htmlFreeParserCtxt(ctxt); + + return(ret); +} + +/** + * htmlParseDoc: + * @cur: a pointer to an array of xmlChar + * @encoding: a free form C string describing the HTML document encoding, or NULL + * + * parse an HTML in-memory document and build a tree. + * + * Returns the resulting document tree + */ + +htmlDocPtr +htmlParseDoc(xmlChar *cur, const char *encoding) { + return(htmlSAXParseDoc(cur, encoding, NULL, NULL)); +} + + +/** + * htmlCreateFileParserCtxt: + * @filename: the filename + * @encoding: a free form C string describing the HTML document encoding, or NULL + * + * Create a parser context for a file content. + * Automatic support for ZLIB/Compress compressed document is provided + * by default if found at compile-time. + * + * Returns the new parser context or NULL + */ +htmlParserCtxtPtr +htmlCreateFileParserCtxt(const char *filename, const char *encoding) +{ + htmlParserCtxtPtr ctxt; + htmlParserInputPtr inputStream; + char *canonicFilename; + /* htmlCharEncoding enc; */ + xmlChar *content, *content_line = (xmlChar *) "charset="; + + if (filename == NULL) + return(NULL); + + ctxt = htmlNewParserCtxt(); + if (ctxt == NULL) { + return(NULL); + } + canonicFilename = (char *) xmlCanonicPath((const xmlChar *) filename); + if (canonicFilename == NULL) { +#ifdef LIBXML_SAX1_ENABLED + if (xmlDefaultSAXHandler.error != NULL) { + xmlDefaultSAXHandler.error(NULL, "out of memory\n"); + } +#endif + xmlFreeParserCtxt(ctxt); + return(NULL); + } + + inputStream = xmlLoadExternalEntity(canonicFilename, NULL, ctxt); + xmlFree(canonicFilename); + if (inputStream == NULL) { + xmlFreeParserCtxt(ctxt); + return(NULL); + } + + inputPush(ctxt, inputStream); + + /* set encoding */ + if (encoding) { + content = xmlMallocAtomic (xmlStrlen(content_line) + strlen(encoding) + 1); + if (content) { + strcpy ((char *)content, (char *)content_line); + strcat ((char *)content, (char *)encoding); + htmlCheckEncoding (ctxt, content); + xmlFree (content); + } + } + + return(ctxt); +} + +/** + * htmlSAXParseFile: + * @filename: the filename + * @encoding: a free form C string describing the HTML document encoding, or NULL + * @sax: the SAX handler block + * @userData: if using SAX, this pointer will be provided on callbacks. + * + * parse an HTML file and build a tree. Automatic support for ZLIB/Compress + * compressed document is provided by default if found at compile-time. + * It use the given SAX function block to handle the parsing callback. + * If sax is NULL, fallback to the default DOM tree building routines. + * + * Returns the resulting document tree unless SAX is NULL or the document is + * not well formed. + */ + +htmlDocPtr +htmlSAXParseFile(const char *filename, const char *encoding, htmlSAXHandlerPtr sax, + void *userData) { + htmlDocPtr ret; + htmlParserCtxtPtr ctxt; + htmlSAXHandlerPtr oldsax = NULL; + + xmlInitParser(); + + ctxt = htmlCreateFileParserCtxt(filename, encoding); + if (ctxt == NULL) return(NULL); + if (sax != NULL) { + oldsax = ctxt->sax; + ctxt->sax = sax; + ctxt->userData = userData; + } + + htmlParseDocument(ctxt); + + ret = ctxt->myDoc; + if (sax != NULL) { + ctxt->sax = oldsax; + ctxt->userData = NULL; + } + htmlFreeParserCtxt(ctxt); + + return(ret); +} + +/** + * htmlParseFile: + * @filename: the filename + * @encoding: a free form C string describing the HTML document encoding, or NULL + * + * parse an HTML file and build a tree. Automatic support for ZLIB/Compress + * compressed document is provided by default if found at compile-time. + * + * Returns the resulting document tree + */ + +htmlDocPtr +htmlParseFile(const char *filename, const char *encoding) { + return(htmlSAXParseFile(filename, encoding, NULL, NULL)); +} + +/** + * htmlHandleOmittedElem: + * @val: int 0 or 1 + * + * Set and return the previous value for handling HTML omitted tags. + * + * Returns the last value for 0 for no handling, 1 for auto insertion. + */ + +int +htmlHandleOmittedElem(int val) { + int old = htmlOmittedDefaultValue; + + htmlOmittedDefaultValue = val; + return(old); +} + +/** + * htmlElementAllowedHere: + * @parent: HTML parent element + * @elt: HTML element + * + * Checks whether an HTML element may be a direct child of a parent element. + * Note - doesn't check for deprecated elements + * + * Returns 1 if allowed; 0 otherwise. + */ +int +htmlElementAllowedHere(const htmlElemDesc* parent, const xmlChar* elt) { + const char** p ; + + if ( ! elt || ! parent || ! parent->subelts ) + return 0 ; + + for ( p = parent->subelts; *p; ++p ) + if ( !xmlStrcmp((const xmlChar *)*p, elt) ) + return 1 ; + + return 0 ; +} +/** + * htmlElementStatusHere: + * @parent: HTML parent element + * @elt: HTML element + * + * Checks whether an HTML element may be a direct child of a parent element. + * and if so whether it is valid or deprecated. + * + * Returns one of HTML_VALID, HTML_DEPRECATED, HTML_INVALID + */ +htmlStatus +htmlElementStatusHere(const htmlElemDesc* parent, const htmlElemDesc* elt) { + if ( ! parent || ! elt ) + return HTML_INVALID ; + if ( ! htmlElementAllowedHere(parent, (const xmlChar*) elt->name ) ) + return HTML_INVALID ; + + return ( elt->dtd == 0 ) ? HTML_VALID : HTML_DEPRECATED ; +} +/** + * htmlAttrAllowed: + * @elt: HTML element + * @attr: HTML attribute + * @legacy: whether to allow deprecated attributes + * + * Checks whether an attribute is valid for an element + * Has full knowledge of Required and Deprecated attributes + * + * Returns one of HTML_REQUIRED, HTML_VALID, HTML_DEPRECATED, HTML_INVALID + */ +htmlStatus +htmlAttrAllowed(const htmlElemDesc* elt, const xmlChar* attr, int legacy) { + const char** p ; + + if ( !elt || ! attr ) + return HTML_INVALID ; + + if ( elt->attrs_req ) + for ( p = elt->attrs_req; *p; ++p) + if ( !xmlStrcmp((const xmlChar*)*p, attr) ) + return HTML_REQUIRED ; + + if ( elt->attrs_opt ) + for ( p = elt->attrs_opt; *p; ++p) + if ( !xmlStrcmp((const xmlChar*)*p, attr) ) + return HTML_VALID ; + + if ( legacy && elt->attrs_depr ) + for ( p = elt->attrs_depr; *p; ++p) + if ( !xmlStrcmp((const xmlChar*)*p, attr) ) + return HTML_DEPRECATED ; + + return HTML_INVALID ; +} +/** + * htmlNodeStatus: + * @node: an htmlNodePtr in a tree + * @legacy: whether to allow deprecated elements (YES is faster here + * for Element nodes) + * + * Checks whether the tree node is valid. Experimental (the author + * only uses the HTML enhancements in a SAX parser) + * + * Return: for Element nodes, a return from htmlElementAllowedHere (if + * legacy allowed) or htmlElementStatusHere (otherwise). + * for Attribute nodes, a return from htmlAttrAllowed + * for other nodes, HTML_NA (no checks performed) + */ +htmlStatus +htmlNodeStatus(const htmlNodePtr node, int legacy) { + if ( ! node ) + return HTML_INVALID ; + + switch ( node->type ) { + case XML_ELEMENT_NODE: + return legacy + ? ( htmlElementAllowedHere ( + htmlTagLookup(node->parent->name) , node->name + ) ? HTML_VALID : HTML_INVALID ) + : htmlElementStatusHere( + htmlTagLookup(node->parent->name) , + htmlTagLookup(node->name) ) + ; + case XML_ATTRIBUTE_NODE: + return htmlAttrAllowed( + htmlTagLookup(node->parent->name) , node->name, legacy) ; + default: return HTML_NA ; + } +} +/************************************************************************ + * * + * New set (2.6.0) of simpler and more flexible APIs * + * * + ************************************************************************/ +/** + * DICT_FREE: + * @str: a string + * + * Free a string if it is not owned by the "dict" dictionnary in the + * current scope + */ +#define DICT_FREE(str) \ + if ((str) && ((!dict) || \ + (xmlDictOwns(dict, (const xmlChar *)(str)) == 0))) \ + xmlFree((char *)(str)); + +/** + * htmlCtxtReset: + * @ctxt: an HTML parser context + * + * Reset a parser context + */ +void +htmlCtxtReset(htmlParserCtxtPtr ctxt) +{ + xmlParserInputPtr input; + xmlDictPtr dict; + + if (ctxt == NULL) + return; + + xmlInitParser(); + dict = ctxt->dict; + + while ((input = inputPop(ctxt)) != NULL) { /* Non consuming */ + xmlFreeInputStream(input); + } + ctxt->inputNr = 0; + ctxt->input = NULL; + + ctxt->spaceNr = 0; + if (ctxt->spaceTab != NULL) { + ctxt->spaceTab[0] = -1; + ctxt->space = &ctxt->spaceTab[0]; + } else { + ctxt->space = NULL; + } + + + ctxt->nodeNr = 0; + ctxt->node = NULL; + + ctxt->nameNr = 0; + ctxt->name = NULL; + + DICT_FREE(ctxt->version); + ctxt->version = NULL; + DICT_FREE(ctxt->encoding); + ctxt->encoding = NULL; + DICT_FREE(ctxt->directory); + ctxt->directory = NULL; + DICT_FREE(ctxt->extSubURI); + ctxt->extSubURI = NULL; + DICT_FREE(ctxt->extSubSystem); + ctxt->extSubSystem = NULL; + if (ctxt->myDoc != NULL) + xmlFreeDoc(ctxt->myDoc); + ctxt->myDoc = NULL; + + ctxt->standalone = -1; + ctxt->hasExternalSubset = 0; + ctxt->hasPErefs = 0; + ctxt->html = 1; + ctxt->external = 0; + ctxt->instate = XML_PARSER_START; + ctxt->token = 0; + + ctxt->wellFormed = 1; + ctxt->nsWellFormed = 1; + ctxt->disableSAX = 0; + ctxt->valid = 1; + ctxt->vctxt.userData = ctxt; + ctxt->vctxt.error = xmlParserValidityError; + ctxt->vctxt.warning = xmlParserValidityWarning; + ctxt->record_info = 0; + ctxt->nbChars = 0; + ctxt->checkIndex = 0; + ctxt->inSubset = 0; + ctxt->errNo = XML_ERR_OK; + ctxt->depth = 0; + ctxt->charset = XML_CHAR_ENCODING_NONE; + ctxt->catalogs = NULL; + xmlInitNodeInfoSeq(&ctxt->node_seq); + + if (ctxt->attsDefault != NULL) { + xmlHashFree(ctxt->attsDefault, (xmlHashDeallocator) xmlFree); + ctxt->attsDefault = NULL; + } + if (ctxt->attsSpecial != NULL) { + xmlHashFree(ctxt->attsSpecial, NULL); + ctxt->attsSpecial = NULL; + } +} + +/** + * htmlCtxtUseOptions: + * @ctxt: an HTML parser context + * @options: a combination of htmlParserOption(s) + * + * Applies the options to the parser context + * + * Returns 0 in case of success, the set of unknown or unimplemented options + * in case of error. + */ +int +htmlCtxtUseOptions(htmlParserCtxtPtr ctxt, int options) +{ + if (ctxt == NULL) + return(-1); + + if (options & HTML_PARSE_NOWARNING) { + ctxt->sax->warning = NULL; + ctxt->vctxt.warning = NULL; + options -= XML_PARSE_NOWARNING; + ctxt->options |= XML_PARSE_NOWARNING; + } + if (options & HTML_PARSE_NOERROR) { + ctxt->sax->error = NULL; + ctxt->vctxt.error = NULL; + ctxt->sax->fatalError = NULL; + options -= XML_PARSE_NOERROR; + ctxt->options |= XML_PARSE_NOERROR; + } + if (options & HTML_PARSE_PEDANTIC) { + ctxt->pedantic = 1; + options -= XML_PARSE_PEDANTIC; + ctxt->options |= XML_PARSE_PEDANTIC; + } else + ctxt->pedantic = 0; + if (options & XML_PARSE_NOBLANKS) { + ctxt->keepBlanks = 0; + ctxt->sax->ignorableWhitespace = xmlSAX2IgnorableWhitespace; + options -= XML_PARSE_NOBLANKS; + ctxt->options |= XML_PARSE_NOBLANKS; + } else + ctxt->keepBlanks = 1; + if (options & HTML_PARSE_RECOVER) { + ctxt->recovery = 1; + options -= HTML_PARSE_RECOVER; + } else + ctxt->recovery = 0; + if (options & HTML_PARSE_COMPACT) { + ctxt->options |= HTML_PARSE_COMPACT; + options -= HTML_PARSE_COMPACT; + } + if (options & XML_PARSE_HUGE) { + ctxt->options |= XML_PARSE_HUGE; + options -= XML_PARSE_HUGE; + } + if (options & HTML_PARSE_NODEFDTD) { + ctxt->options |= HTML_PARSE_NODEFDTD; + options -= HTML_PARSE_NODEFDTD; + } + if (options & HTML_PARSE_IGNORE_ENC) { + ctxt->options |= HTML_PARSE_IGNORE_ENC; + options -= HTML_PARSE_IGNORE_ENC; + } + if (options & HTML_PARSE_NOIMPLIED) { + ctxt->options |= HTML_PARSE_NOIMPLIED; + options -= HTML_PARSE_NOIMPLIED; + } + ctxt->dictNames = 0; + return (options); +} + +/** + * htmlDoRead: + * @ctxt: an HTML parser context + * @URL: the base URL to use for the document + * @encoding: the document encoding, or NULL + * @options: a combination of htmlParserOption(s) + * @reuse: keep the context for reuse + * + * Common front-end for the htmlRead functions + * + * Returns the resulting document tree or NULL + */ +static htmlDocPtr +htmlDoRead(htmlParserCtxtPtr ctxt, const char *URL, const char *encoding, + int options, int reuse) +{ + htmlDocPtr ret; + + htmlCtxtUseOptions(ctxt, options); + ctxt->html = 1; + if (encoding != NULL) { + xmlCharEncodingHandlerPtr hdlr; + + hdlr = xmlFindCharEncodingHandler(encoding); + if (hdlr != NULL) { + xmlSwitchToEncoding(ctxt, hdlr); + if (ctxt->input->encoding != NULL) + xmlFree((xmlChar *) ctxt->input->encoding); + ctxt->input->encoding = xmlStrdup((xmlChar *)encoding); + } + } + if ((URL != NULL) && (ctxt->input != NULL) && + (ctxt->input->filename == NULL)) + ctxt->input->filename = (char *) xmlStrdup((const xmlChar *) URL); + htmlParseDocument(ctxt); + ret = ctxt->myDoc; + ctxt->myDoc = NULL; + if (!reuse) { + if ((ctxt->dictNames) && + (ret != NULL) && + (ret->dict == ctxt->dict)) + ctxt->dict = NULL; + xmlFreeParserCtxt(ctxt); + } + return (ret); +} + +/** + * htmlReadDoc: + * @cur: a pointer to a zero terminated string + * @URL: the base URL to use for the document + * @encoding: the document encoding, or NULL + * @options: a combination of htmlParserOption(s) + * + * parse an XML in-memory document and build a tree. + * + * Returns the resulting document tree + */ +htmlDocPtr +htmlReadDoc(const xmlChar * cur, const char *URL, const char *encoding, int options) +{ + htmlParserCtxtPtr ctxt; + + if (cur == NULL) + return (NULL); + + xmlInitParser(); + ctxt = htmlCreateDocParserCtxt(cur, NULL); + if (ctxt == NULL) + return (NULL); + return (htmlDoRead(ctxt, URL, encoding, options, 0)); +} + +/** + * htmlReadFile: + * @filename: a file or URL + * @encoding: the document encoding, or NULL + * @options: a combination of htmlParserOption(s) + * + * parse an XML file from the filesystem or the network. + * + * Returns the resulting document tree + */ +htmlDocPtr +htmlReadFile(const char *filename, const char *encoding, int options) +{ + htmlParserCtxtPtr ctxt; + + xmlInitParser(); + ctxt = htmlCreateFileParserCtxt(filename, encoding); + if (ctxt == NULL) + return (NULL); + return (htmlDoRead(ctxt, NULL, NULL, options, 0)); +} + +/** + * htmlReadMemory: + * @buffer: a pointer to a char array + * @size: the size of the array + * @URL: the base URL to use for the document + * @encoding: the document encoding, or NULL + * @options: a combination of htmlParserOption(s) + * + * parse an XML in-memory document and build a tree. + * + * Returns the resulting document tree + */ +htmlDocPtr +htmlReadMemory(const char *buffer, int size, const char *URL, const char *encoding, int options) +{ + htmlParserCtxtPtr ctxt; + + xmlInitParser(); + ctxt = xmlCreateMemoryParserCtxt(buffer, size); + if (ctxt == NULL) + return (NULL); + htmlDefaultSAXHandlerInit(); + if (ctxt->sax != NULL) + memcpy(ctxt->sax, &htmlDefaultSAXHandler, sizeof(xmlSAXHandlerV1)); + return (htmlDoRead(ctxt, URL, encoding, options, 0)); +} + +/** + * htmlReadFd: + * @fd: an open file descriptor + * @URL: the base URL to use for the document + * @encoding: the document encoding, or NULL + * @options: a combination of htmlParserOption(s) + * + * parse an XML from a file descriptor and build a tree. + * + * Returns the resulting document tree + */ +htmlDocPtr +htmlReadFd(int fd, const char *URL, const char *encoding, int options) +{ + htmlParserCtxtPtr ctxt; + xmlParserInputBufferPtr input; + xmlParserInputPtr stream; + + if (fd < 0) + return (NULL); + + xmlInitParser(); + input = xmlParserInputBufferCreateFd(fd, XML_CHAR_ENCODING_NONE); + if (input == NULL) + return (NULL); + ctxt = xmlNewParserCtxt(); + if (ctxt == NULL) { + xmlFreeParserInputBuffer(input); + return (NULL); + } + stream = xmlNewIOInputStream(ctxt, input, XML_CHAR_ENCODING_NONE); + if (stream == NULL) { + xmlFreeParserInputBuffer(input); + xmlFreeParserCtxt(ctxt); + return (NULL); + } + inputPush(ctxt, stream); + return (htmlDoRead(ctxt, URL, encoding, options, 0)); +} + +/** + * htmlReadIO: + * @ioread: an I/O read function + * @ioclose: an I/O close function + * @ioctx: an I/O handler + * @URL: the base URL to use for the document + * @encoding: the document encoding, or NULL + * @options: a combination of htmlParserOption(s) + * + * parse an HTML document from I/O functions and source and build a tree. + * + * Returns the resulting document tree + */ +htmlDocPtr +htmlReadIO(xmlInputReadCallback ioread, xmlInputCloseCallback ioclose, + void *ioctx, const char *URL, const char *encoding, int options) +{ + htmlParserCtxtPtr ctxt; + xmlParserInputBufferPtr input; + xmlParserInputPtr stream; + + if (ioread == NULL) + return (NULL); + xmlInitParser(); + + input = xmlParserInputBufferCreateIO(ioread, ioclose, ioctx, + XML_CHAR_ENCODING_NONE); + if (input == NULL) { + if (ioclose != NULL) + ioclose(ioctx); + return (NULL); + } + ctxt = htmlNewParserCtxt(); + if (ctxt == NULL) { + xmlFreeParserInputBuffer(input); + return (NULL); + } + stream = xmlNewIOInputStream(ctxt, input, XML_CHAR_ENCODING_NONE); + if (stream == NULL) { + xmlFreeParserInputBuffer(input); + xmlFreeParserCtxt(ctxt); + return (NULL); + } + inputPush(ctxt, stream); + return (htmlDoRead(ctxt, URL, encoding, options, 0)); +} + +/** + * htmlCtxtReadDoc: + * @ctxt: an HTML parser context + * @cur: a pointer to a zero terminated string + * @URL: the base URL to use for the document + * @encoding: the document encoding, or NULL + * @options: a combination of htmlParserOption(s) + * + * parse an XML in-memory document and build a tree. + * This reuses the existing @ctxt parser context + * + * Returns the resulting document tree + */ +htmlDocPtr +htmlCtxtReadDoc(htmlParserCtxtPtr ctxt, const xmlChar * cur, + const char *URL, const char *encoding, int options) +{ + xmlParserInputPtr stream; + + if (cur == NULL) + return (NULL); + if (ctxt == NULL) + return (NULL); + + htmlCtxtReset(ctxt); + + stream = xmlNewStringInputStream(ctxt, cur); + if (stream == NULL) { + return (NULL); + } + inputPush(ctxt, stream); + return (htmlDoRead(ctxt, URL, encoding, options, 1)); +} + +/** + * htmlCtxtReadFile: + * @ctxt: an HTML parser context + * @filename: a file or URL + * @encoding: the document encoding, or NULL + * @options: a combination of htmlParserOption(s) + * + * parse an XML file from the filesystem or the network. + * This reuses the existing @ctxt parser context + * + * Returns the resulting document tree + */ +htmlDocPtr +htmlCtxtReadFile(htmlParserCtxtPtr ctxt, const char *filename, + const char *encoding, int options) +{ + xmlParserInputPtr stream; + + if (filename == NULL) + return (NULL); + if (ctxt == NULL) + return (NULL); + + htmlCtxtReset(ctxt); + + stream = xmlLoadExternalEntity(filename, NULL, ctxt); + if (stream == NULL) { + return (NULL); + } + inputPush(ctxt, stream); + return (htmlDoRead(ctxt, NULL, encoding, options, 1)); +} + +/** + * htmlCtxtReadMemory: + * @ctxt: an HTML parser context + * @buffer: a pointer to a char array + * @size: the size of the array + * @URL: the base URL to use for the document + * @encoding: the document encoding, or NULL + * @options: a combination of htmlParserOption(s) + * + * parse an XML in-memory document and build a tree. + * This reuses the existing @ctxt parser context + * + * Returns the resulting document tree + */ +htmlDocPtr +htmlCtxtReadMemory(htmlParserCtxtPtr ctxt, const char *buffer, int size, + const char *URL, const char *encoding, int options) +{ + xmlParserInputBufferPtr input; + xmlParserInputPtr stream; + + if (ctxt == NULL) + return (NULL); + if (buffer == NULL) + return (NULL); + + htmlCtxtReset(ctxt); + + input = xmlParserInputBufferCreateMem(buffer, size, XML_CHAR_ENCODING_NONE); + if (input == NULL) { + return(NULL); + } + + stream = xmlNewIOInputStream(ctxt, input, XML_CHAR_ENCODING_NONE); + if (stream == NULL) { + xmlFreeParserInputBuffer(input); + return(NULL); + } + + inputPush(ctxt, stream); + return (htmlDoRead(ctxt, URL, encoding, options, 1)); +} + +/** + * htmlCtxtReadFd: + * @ctxt: an HTML parser context + * @fd: an open file descriptor + * @URL: the base URL to use for the document + * @encoding: the document encoding, or NULL + * @options: a combination of htmlParserOption(s) + * + * parse an XML from a file descriptor and build a tree. + * This reuses the existing @ctxt parser context + * + * Returns the resulting document tree + */ +htmlDocPtr +htmlCtxtReadFd(htmlParserCtxtPtr ctxt, int fd, + const char *URL, const char *encoding, int options) +{ + xmlParserInputBufferPtr input; + xmlParserInputPtr stream; + + if (fd < 0) + return (NULL); + if (ctxt == NULL) + return (NULL); + + htmlCtxtReset(ctxt); + + + input = xmlParserInputBufferCreateFd(fd, XML_CHAR_ENCODING_NONE); + if (input == NULL) + return (NULL); + stream = xmlNewIOInputStream(ctxt, input, XML_CHAR_ENCODING_NONE); + if (stream == NULL) { + xmlFreeParserInputBuffer(input); + return (NULL); + } + inputPush(ctxt, stream); + return (htmlDoRead(ctxt, URL, encoding, options, 1)); +} + +/** + * htmlCtxtReadIO: + * @ctxt: an HTML parser context + * @ioread: an I/O read function + * @ioclose: an I/O close function + * @ioctx: an I/O handler + * @URL: the base URL to use for the document + * @encoding: the document encoding, or NULL + * @options: a combination of htmlParserOption(s) + * + * parse an HTML document from I/O functions and source and build a tree. + * This reuses the existing @ctxt parser context + * + * Returns the resulting document tree + */ +htmlDocPtr +htmlCtxtReadIO(htmlParserCtxtPtr ctxt, xmlInputReadCallback ioread, + xmlInputCloseCallback ioclose, void *ioctx, + const char *URL, + const char *encoding, int options) +{ + xmlParserInputBufferPtr input; + xmlParserInputPtr stream; + + if (ioread == NULL) + return (NULL); + if (ctxt == NULL) + return (NULL); + + htmlCtxtReset(ctxt); + + input = xmlParserInputBufferCreateIO(ioread, ioclose, ioctx, + XML_CHAR_ENCODING_NONE); + if (input == NULL) { + if (ioclose != NULL) + ioclose(ioctx); + return (NULL); + } + stream = xmlNewIOInputStream(ctxt, input, XML_CHAR_ENCODING_NONE); + if (stream == NULL) { + xmlFreeParserInputBuffer(input); + return (NULL); + } + inputPush(ctxt, stream); + return (htmlDoRead(ctxt, URL, encoding, options, 1)); +} + +#define bottom_HTMLparser +#include "elfgcchack.h" +#endif /* LIBXML_HTML_ENABLED */ diff --git a/vendors/libxml/src/HTMLtree.c b/vendors/libxml/src/HTMLtree.c new file mode 100644 index 0000000..4d8e354 --- /dev/null +++ b/vendors/libxml/src/HTMLtree.c @@ -0,0 +1,1253 @@ +/* + * HTMLtree.c : implementation of access function for an HTML tree. + * + * See Copyright for the status of this software. + * + * daniel@veillard.com + */ + + +#define IN_LIBXML +#include "libxml.h" +#ifdef LIBXML_HTML_ENABLED + +#include /* for memset() only ! */ + +#ifdef HAVE_CTYPE_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "buf.h" + +/************************************************************************ + * * + * Getting/Setting encoding meta tags * + * * + ************************************************************************/ + +/** + * htmlGetMetaEncoding: + * @doc: the document + * + * Encoding definition lookup in the Meta tags + * + * Returns the current encoding as flagged in the HTML source + */ +const xmlChar * +htmlGetMetaEncoding(htmlDocPtr doc) { + htmlNodePtr cur; + const xmlChar *content; + const xmlChar *encoding; + + if (doc == NULL) + return(NULL); + cur = doc->children; + + /* + * Search the html + */ + while (cur != NULL) { + if ((cur->type == XML_ELEMENT_NODE) && (cur->name != NULL)) { + if (xmlStrEqual(cur->name, BAD_CAST"html")) + break; + if (xmlStrEqual(cur->name, BAD_CAST"head")) + goto found_head; + if (xmlStrEqual(cur->name, BAD_CAST"meta")) + goto found_meta; + } + cur = cur->next; + } + if (cur == NULL) + return(NULL); + cur = cur->children; + + /* + * Search the head + */ + while (cur != NULL) { + if ((cur->type == XML_ELEMENT_NODE) && (cur->name != NULL)) { + if (xmlStrEqual(cur->name, BAD_CAST"head")) + break; + if (xmlStrEqual(cur->name, BAD_CAST"meta")) + goto found_meta; + } + cur = cur->next; + } + if (cur == NULL) + return(NULL); +found_head: + cur = cur->children; + + /* + * Search the meta elements + */ +found_meta: + while (cur != NULL) { + if ((cur->type == XML_ELEMENT_NODE) && (cur->name != NULL)) { + if (xmlStrEqual(cur->name, BAD_CAST"meta")) { + xmlAttrPtr attr = cur->properties; + int http; + const xmlChar *value; + + content = NULL; + http = 0; + while (attr != NULL) { + if ((attr->children != NULL) && + (attr->children->type == XML_TEXT_NODE) && + (attr->children->next == NULL)) { + value = attr->children->content; + if ((!xmlStrcasecmp(attr->name, BAD_CAST"http-equiv")) + && (!xmlStrcasecmp(value, BAD_CAST"Content-Type"))) + http = 1; + else if ((value != NULL) + && (!xmlStrcasecmp(attr->name, BAD_CAST"content"))) + content = value; + if ((http != 0) && (content != NULL)) + goto found_content; + } + attr = attr->next; + } + } + } + cur = cur->next; + } + return(NULL); + +found_content: + encoding = xmlStrstr(content, BAD_CAST"charset="); + if (encoding == NULL) + encoding = xmlStrstr(content, BAD_CAST"Charset="); + if (encoding == NULL) + encoding = xmlStrstr(content, BAD_CAST"CHARSET="); + if (encoding != NULL) { + encoding += 8; + } else { + encoding = xmlStrstr(content, BAD_CAST"charset ="); + if (encoding == NULL) + encoding = xmlStrstr(content, BAD_CAST"Charset ="); + if (encoding == NULL) + encoding = xmlStrstr(content, BAD_CAST"CHARSET ="); + if (encoding != NULL) + encoding += 9; + } + if (encoding != NULL) { + while ((*encoding == ' ') || (*encoding == '\t')) encoding++; + } + return(encoding); +} + +/** + * htmlSetMetaEncoding: + * @doc: the document + * @encoding: the encoding string + * + * Sets the current encoding in the Meta tags + * NOTE: this will not change the document content encoding, just + * the META flag associated. + * + * Returns 0 in case of success and -1 in case of error + */ +int +htmlSetMetaEncoding(htmlDocPtr doc, const xmlChar *encoding) { + htmlNodePtr cur, meta = NULL, head = NULL; + const xmlChar *content = NULL; + char newcontent[100]; + + newcontent[0] = 0; + + if (doc == NULL) + return(-1); + + /* html isn't a real encoding it's just libxml2 way to get entities */ + if (!xmlStrcasecmp(encoding, BAD_CAST "html")) + return(-1); + + if (encoding != NULL) { + snprintf(newcontent, sizeof(newcontent), "text/html; charset=%s", + (char *)encoding); + newcontent[sizeof(newcontent) - 1] = 0; + } + + cur = doc->children; + + /* + * Search the html + */ + while (cur != NULL) { + if ((cur->type == XML_ELEMENT_NODE) && (cur->name != NULL)) { + if (xmlStrcasecmp(cur->name, BAD_CAST"html") == 0) + break; + if (xmlStrcasecmp(cur->name, BAD_CAST"head") == 0) + goto found_head; + if (xmlStrcasecmp(cur->name, BAD_CAST"meta") == 0) + goto found_meta; + } + cur = cur->next; + } + if (cur == NULL) + return(-1); + cur = cur->children; + + /* + * Search the head + */ + while (cur != NULL) { + if ((cur->type == XML_ELEMENT_NODE) && (cur->name != NULL)) { + if (xmlStrcasecmp(cur->name, BAD_CAST"head") == 0) + break; + if (xmlStrcasecmp(cur->name, BAD_CAST"meta") == 0) { + head = cur->parent; + goto found_meta; + } + } + cur = cur->next; + } + if (cur == NULL) + return(-1); +found_head: + head = cur; + if (cur->children == NULL) + goto create; + cur = cur->children; + +found_meta: + /* + * Search and update all the remaining the meta elements carrying + * encoding informations + */ + while (cur != NULL) { + if ((cur->type == XML_ELEMENT_NODE) && (cur->name != NULL)) { + if (xmlStrcasecmp(cur->name, BAD_CAST"meta") == 0) { + xmlAttrPtr attr = cur->properties; + int http; + const xmlChar *value; + + content = NULL; + http = 0; + while (attr != NULL) { + if ((attr->children != NULL) && + (attr->children->type == XML_TEXT_NODE) && + (attr->children->next == NULL)) { + value = attr->children->content; + if ((!xmlStrcasecmp(attr->name, BAD_CAST"http-equiv")) + && (!xmlStrcasecmp(value, BAD_CAST"Content-Type"))) + http = 1; + else + { + if ((value != NULL) && + (!xmlStrcasecmp(attr->name, BAD_CAST"content"))) + content = value; + } + if ((http != 0) && (content != NULL)) + break; + } + attr = attr->next; + } + if ((http != 0) && (content != NULL)) { + meta = cur; + break; + } + + } + } + cur = cur->next; + } +create: + if (meta == NULL) { + if ((encoding != NULL) && (head != NULL)) { + /* + * Create a new Meta element with the right attributes + */ + + meta = xmlNewDocNode(doc, NULL, BAD_CAST"meta", NULL); + if (head->children == NULL) + xmlAddChild(head, meta); + else + xmlAddPrevSibling(head->children, meta); + xmlNewProp(meta, BAD_CAST"http-equiv", BAD_CAST"Content-Type"); + xmlNewProp(meta, BAD_CAST"content", BAD_CAST newcontent); + } + } else { + /* remove the meta tag if NULL is passed */ + if (encoding == NULL) { + xmlUnlinkNode(meta); + xmlFreeNode(meta); + } + /* change the document only if there is a real encoding change */ + else if (xmlStrcasestr(content, encoding) == NULL) { + xmlSetProp(meta, BAD_CAST"content", BAD_CAST newcontent); + } + } + + + return(0); +} + +/** + * booleanHTMLAttrs: + * + * These are the HTML attributes which will be output + * in minimized form, i.e. */ + ret = xmlNewNsPropEatName(ctxt->node, namespace, name, NULL); + + if (ret != NULL) { + if ((ctxt->replaceEntities == 0) && (!ctxt->html)) { + xmlNodePtr tmp; + + ret->children = xmlStringGetNodeList(ctxt->myDoc, value); + tmp = ret->children; + while (tmp != NULL) { + tmp->parent = (xmlNodePtr) ret; + if (tmp->next == NULL) + ret->last = tmp; + tmp = tmp->next; + } + } else if (value != NULL) { + ret->children = xmlNewDocText(ctxt->myDoc, value); + ret->last = ret->children; + if (ret->children != NULL) + ret->children->parent = (xmlNodePtr) ret; + } + } + +#ifdef LIBXML_VALID_ENABLED + if ((!ctxt->html) && ctxt->validate && ctxt->wellFormed && + ctxt->myDoc && ctxt->myDoc->intSubset) { + + /* + * If we don't substitute entities, the validation should be + * done on a value with replaced entities anyway. + */ + if (!ctxt->replaceEntities) { + xmlChar *val; + + ctxt->depth++; + val = xmlStringDecodeEntities(ctxt, value, XML_SUBSTITUTE_REF, + 0,0,0); + ctxt->depth--; + + if (val == NULL) + ctxt->valid &= xmlValidateOneAttribute(&ctxt->vctxt, + ctxt->myDoc, ctxt->node, ret, value); + else { + xmlChar *nvalnorm; + + /* + * Do the last stage of the attribute normalization + * It need to be done twice ... it's an extra burden related + * to the ability to keep xmlSAX2References in attributes + */ + nvalnorm = xmlValidNormalizeAttributeValue(ctxt->myDoc, + ctxt->node, fullname, val); + if (nvalnorm != NULL) { + xmlFree(val); + val = nvalnorm; + } + + ctxt->valid &= xmlValidateOneAttribute(&ctxt->vctxt, + ctxt->myDoc, ctxt->node, ret, val); + xmlFree(val); + } + } else { + ctxt->valid &= xmlValidateOneAttribute(&ctxt->vctxt, ctxt->myDoc, + ctxt->node, ret, value); + } + } else +#endif /* LIBXML_VALID_ENABLED */ + if (((ctxt->loadsubset & XML_SKIP_IDS) == 0) && + (((ctxt->replaceEntities == 0) && (ctxt->external != 2)) || + ((ctxt->replaceEntities != 0) && (ctxt->inSubset == 0)))) { + /* + * when validating, the ID registration is done at the attribute + * validation level. Otherwise we have to do specific handling here. + */ + if (xmlStrEqual(fullname, BAD_CAST "xml:id")) { + /* + * Add the xml:id value + * + * Open issue: normalization of the value. + */ + if (xmlValidateNCName(value, 1) != 0) { + xmlErrValid(ctxt, XML_DTD_XMLID_VALUE, + "xml:id : attribute value %s is not an NCName\n", + (const char *) value, NULL); + } + xmlAddID(&ctxt->vctxt, ctxt->myDoc, value, ret); + } else if (xmlIsID(ctxt->myDoc, ctxt->node, ret)) + xmlAddID(&ctxt->vctxt, ctxt->myDoc, value, ret); + else if (xmlIsRef(ctxt->myDoc, ctxt->node, ret)) + xmlAddRef(&ctxt->vctxt, ctxt->myDoc, value, ret); + } + +error: + if (nval != NULL) + xmlFree(nval); + if (ns != NULL) + xmlFree(ns); +} + +/* + * xmlCheckDefaultedAttributes: + * + * Check defaulted attributes from the DTD + */ +static void +xmlCheckDefaultedAttributes(xmlParserCtxtPtr ctxt, const xmlChar *name, + const xmlChar *prefix, const xmlChar **atts) { + xmlElementPtr elemDecl; + const xmlChar *att; + int internal = 1; + int i; + + elemDecl = xmlGetDtdQElementDesc(ctxt->myDoc->intSubset, name, prefix); + if (elemDecl == NULL) { + elemDecl = xmlGetDtdQElementDesc(ctxt->myDoc->extSubset, name, prefix); + internal = 0; + } + +process_external_subset: + + if (elemDecl != NULL) { + xmlAttributePtr attr = elemDecl->attributes; + /* + * Check against defaulted attributes from the external subset + * if the document is stamped as standalone + */ + if ((ctxt->myDoc->standalone == 1) && + (ctxt->myDoc->extSubset != NULL) && + (ctxt->validate)) { + while (attr != NULL) { + if ((attr->defaultValue != NULL) && + (xmlGetDtdQAttrDesc(ctxt->myDoc->extSubset, + attr->elem, attr->name, + attr->prefix) == attr) && + (xmlGetDtdQAttrDesc(ctxt->myDoc->intSubset, + attr->elem, attr->name, + attr->prefix) == NULL)) { + xmlChar *fulln; + + if (attr->prefix != NULL) { + fulln = xmlStrdup(attr->prefix); + fulln = xmlStrcat(fulln, BAD_CAST ":"); + fulln = xmlStrcat(fulln, attr->name); + } else { + fulln = xmlStrdup(attr->name); + } + if (fulln == NULL) { + xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElement"); + break; + } + + /* + * Check that the attribute is not declared in the + * serialization + */ + att = NULL; + if (atts != NULL) { + i = 0; + att = atts[i]; + while (att != NULL) { + if (xmlStrEqual(att, fulln)) + break; + i += 2; + att = atts[i]; + } + } + if (att == NULL) { + xmlErrValid(ctxt, XML_DTD_STANDALONE_DEFAULTED, + "standalone: attribute %s on %s defaulted from external subset\n", + (const char *)fulln, + (const char *)attr->elem); + } + xmlFree(fulln); + } + attr = attr->nexth; + } + } + + /* + * Actually insert defaulted values when needed + */ + attr = elemDecl->attributes; + while (attr != NULL) { + /* + * Make sure that attributes redefinition occuring in the + * internal subset are not overriden by definitions in the + * external subset. + */ + if (attr->defaultValue != NULL) { + /* + * the element should be instantiated in the tree if: + * - this is a namespace prefix + * - the user required for completion in the tree + * like XSLT + * - there isn't already an attribute definition + * in the internal subset overriding it. + */ + if (((attr->prefix != NULL) && + (xmlStrEqual(attr->prefix, BAD_CAST "xmlns"))) || + ((attr->prefix == NULL) && + (xmlStrEqual(attr->name, BAD_CAST "xmlns"))) || + (ctxt->loadsubset & XML_COMPLETE_ATTRS)) { + xmlAttributePtr tst; + + tst = xmlGetDtdQAttrDesc(ctxt->myDoc->intSubset, + attr->elem, attr->name, + attr->prefix); + if ((tst == attr) || (tst == NULL)) { + xmlChar fn[50]; + xmlChar *fulln; + + fulln = xmlBuildQName(attr->name, attr->prefix, fn, 50); + if (fulln == NULL) { + xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElement"); + return; + } + + /* + * Check that the attribute is not declared in the + * serialization + */ + att = NULL; + if (atts != NULL) { + i = 0; + att = atts[i]; + while (att != NULL) { + if (xmlStrEqual(att, fulln)) + break; + i += 2; + att = atts[i]; + } + } + if (att == NULL) { + xmlSAX2AttributeInternal(ctxt, fulln, + attr->defaultValue, prefix); + } + if ((fulln != fn) && (fulln != attr->name)) + xmlFree(fulln); + } + } + } + attr = attr->nexth; + } + if (internal == 1) { + elemDecl = xmlGetDtdQElementDesc(ctxt->myDoc->extSubset, + name, prefix); + internal = 0; + goto process_external_subset; + } + } +} + +/** + * xmlSAX2StartElement: + * @ctx: the user data (XML parser context) + * @fullname: The element name, including namespace prefix + * @atts: An array of name/value attributes pairs, NULL terminated + * + * called when an opening tag has been processed. + */ +void +xmlSAX2StartElement(void *ctx, const xmlChar *fullname, const xmlChar **atts) +{ + xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; + xmlNodePtr ret; + xmlNodePtr parent; + xmlNsPtr ns; + xmlChar *name; + xmlChar *prefix; + const xmlChar *att; + const xmlChar *value; + int i; + + if ((ctx == NULL) || (fullname == NULL) || (ctxt->myDoc == NULL)) return; + parent = ctxt->node; +#ifdef DEBUG_SAX + xmlGenericError(xmlGenericErrorContext, + "SAX.xmlSAX2StartElement(%s)\n", fullname); +#endif + + /* + * First check on validity: + */ + if (ctxt->validate && (ctxt->myDoc->extSubset == NULL) && + ((ctxt->myDoc->intSubset == NULL) || + ((ctxt->myDoc->intSubset->notations == NULL) && + (ctxt->myDoc->intSubset->elements == NULL) && + (ctxt->myDoc->intSubset->attributes == NULL) && + (ctxt->myDoc->intSubset->entities == NULL)))) { + xmlErrValid(ctxt, XML_ERR_NO_DTD, + "Validation failed: no DTD found !", NULL, NULL); + ctxt->validate = 0; + } + + + /* + * Split the full name into a namespace prefix and the tag name + */ + name = xmlSplitQName(ctxt, fullname, &prefix); + + + /* + * Note : the namespace resolution is deferred until the end of the + * attributes parsing, since local namespace can be defined as + * an attribute at this level. + */ + ret = xmlNewDocNodeEatName(ctxt->myDoc, NULL, name, NULL); + if (ret == NULL) { + if (prefix != NULL) + xmlFree(prefix); + xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElement"); + return; + } + if (ctxt->myDoc->children == NULL) { +#ifdef DEBUG_SAX_TREE + xmlGenericError(xmlGenericErrorContext, "Setting %s as root\n", name); +#endif + xmlAddChild((xmlNodePtr) ctxt->myDoc, (xmlNodePtr) ret); + } else if (parent == NULL) { + parent = ctxt->myDoc->children; + } + ctxt->nodemem = -1; + if (ctxt->linenumbers) { + if (ctxt->input != NULL) { + if (ctxt->input->line < 65535) + ret->line = (short) ctxt->input->line; + else + ret->line = 65535; + } + } + + /* + * We are parsing a new node. + */ +#ifdef DEBUG_SAX_TREE + xmlGenericError(xmlGenericErrorContext, "pushing(%s)\n", name); +#endif + nodePush(ctxt, ret); + + /* + * Link the child element + */ + if (parent != NULL) { + if (parent->type == XML_ELEMENT_NODE) { +#ifdef DEBUG_SAX_TREE + xmlGenericError(xmlGenericErrorContext, + "adding child %s to %s\n", name, parent->name); +#endif + xmlAddChild(parent, ret); + } else { +#ifdef DEBUG_SAX_TREE + xmlGenericError(xmlGenericErrorContext, + "adding sibling %s to ", name); + xmlDebugDumpOneNode(stderr, parent, 0); +#endif + xmlAddSibling(parent, ret); + } + } + + /* + * Insert all the defaulted attributes from the DTD especially namespaces + */ + if ((!ctxt->html) && + ((ctxt->myDoc->intSubset != NULL) || + (ctxt->myDoc->extSubset != NULL))) { + xmlCheckDefaultedAttributes(ctxt, name, prefix, atts); + } + + /* + * process all the attributes whose name start with "xmlns" + */ + if (atts != NULL) { + i = 0; + att = atts[i++]; + value = atts[i++]; + if (!ctxt->html) { + while ((att != NULL) && (value != NULL)) { + if ((att[0] == 'x') && (att[1] == 'm') && (att[2] == 'l') && + (att[3] == 'n') && (att[4] == 's')) + xmlSAX2AttributeInternal(ctxt, att, value, prefix); + + att = atts[i++]; + value = atts[i++]; + } + } + } + + /* + * Search the namespace, note that since the attributes have been + * processed, the local namespaces are available. + */ + ns = xmlSearchNs(ctxt->myDoc, ret, prefix); + if ((ns == NULL) && (parent != NULL)) + ns = xmlSearchNs(ctxt->myDoc, parent, prefix); + if ((prefix != NULL) && (ns == NULL)) { + ns = xmlNewNs(ret, NULL, prefix); + xmlNsWarnMsg(ctxt, XML_NS_ERR_UNDEFINED_NAMESPACE, + "Namespace prefix %s is not defined\n", + prefix, NULL); + } + + /* + * set the namespace node, making sure that if the default namspace + * is unbound on a parent we simply kee it NULL + */ + if ((ns != NULL) && (ns->href != NULL) && + ((ns->href[0] != 0) || (ns->prefix != NULL))) + xmlSetNs(ret, ns); + + /* + * process all the other attributes + */ + if (atts != NULL) { + i = 0; + att = atts[i++]; + value = atts[i++]; + if (ctxt->html) { + while (att != NULL) { + xmlSAX2AttributeInternal(ctxt, att, value, NULL); + att = atts[i++]; + value = atts[i++]; + } + } else { + while ((att != NULL) && (value != NULL)) { + if ((att[0] != 'x') || (att[1] != 'm') || (att[2] != 'l') || + (att[3] != 'n') || (att[4] != 's')) + xmlSAX2AttributeInternal(ctxt, att, value, NULL); + + /* + * Next ones + */ + att = atts[i++]; + value = atts[i++]; + } + } + } + +#ifdef LIBXML_VALID_ENABLED + /* + * If it's the Document root, finish the DTD validation and + * check the document root element for validity + */ + if ((ctxt->validate) && (ctxt->vctxt.finishDtd == XML_CTXT_FINISH_DTD_0)) { + int chk; + + chk = xmlValidateDtdFinal(&ctxt->vctxt, ctxt->myDoc); + if (chk <= 0) + ctxt->valid = 0; + if (chk < 0) + ctxt->wellFormed = 0; + ctxt->valid &= xmlValidateRoot(&ctxt->vctxt, ctxt->myDoc); + ctxt->vctxt.finishDtd = XML_CTXT_FINISH_DTD_1; + } +#endif /* LIBXML_VALID_ENABLED */ + + if (prefix != NULL) + xmlFree(prefix); + +} + +/** + * xmlSAX2EndElement: + * @ctx: the user data (XML parser context) + * @name: The element name + * + * called when the end of an element has been detected. + */ +void +xmlSAX2EndElement(void *ctx, const xmlChar *name ATTRIBUTE_UNUSED) +{ + xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; + xmlNodePtr cur; + + if (ctx == NULL) return; + cur = ctxt->node; +#ifdef DEBUG_SAX + if (name == NULL) + xmlGenericError(xmlGenericErrorContext, "SAX.xmlSAX2EndElement(NULL)\n"); + else + xmlGenericError(xmlGenericErrorContext, "SAX.xmlSAX2EndElement(%s)\n", name); +#endif + + /* Capture end position and add node */ + if (cur != NULL && ctxt->record_info) { + ctxt->nodeInfo->end_pos = ctxt->input->cur - ctxt->input->base; + ctxt->nodeInfo->end_line = ctxt->input->line; + ctxt->nodeInfo->node = cur; + xmlParserAddNodeInfo(ctxt, ctxt->nodeInfo); + } + ctxt->nodemem = -1; + +#ifdef LIBXML_VALID_ENABLED + if (ctxt->validate && ctxt->wellFormed && + ctxt->myDoc && ctxt->myDoc->intSubset) + ctxt->valid &= xmlValidateOneElement(&ctxt->vctxt, ctxt->myDoc, + cur); +#endif /* LIBXML_VALID_ENABLED */ + + + /* + * end of parsing of this node. + */ +#ifdef DEBUG_SAX_TREE + xmlGenericError(xmlGenericErrorContext, "popping(%s)\n", cur->name); +#endif + nodePop(ctxt); +} +#endif /* LIBXML_SAX1_ENABLED || LIBXML_HTML_ENABLE */ + +/* + * xmlSAX2TextNode: + * @ctxt: the parser context + * @str: the input string + * @len: the string length + * + * Callback for a text node + * + * Returns the newly allocated string or NULL if not needed or error + */ +static xmlNodePtr +xmlSAX2TextNode(xmlParserCtxtPtr ctxt, const xmlChar *str, int len) { + xmlNodePtr ret; + const xmlChar *intern = NULL; + + /* + * Allocate + */ + if (ctxt->freeElems != NULL) { + ret = ctxt->freeElems; + ctxt->freeElems = ret->next; + ctxt->freeElemsNr--; + } else { + ret = (xmlNodePtr) xmlMalloc(sizeof(xmlNode)); + } + if (ret == NULL) { + xmlErrMemory(ctxt, "xmlSAX2Characters"); + return(NULL); + } + memset(ret, 0, sizeof(xmlNode)); + /* + * intern the formatting blanks found between tags, or the + * very short strings + */ + if (ctxt->dictNames) { + xmlChar cur = str[len]; + + if ((len < (int) (2 * sizeof(void *))) && + (ctxt->options & XML_PARSE_COMPACT)) { + /* store the string in the node overriding properties and nsDef */ + xmlChar *tmp = (xmlChar *) &(ret->properties); + memcpy(tmp, str, len); + tmp[len] = 0; + intern = tmp; + } else if ((len <= 3) && ((cur == '"') || (cur == '\'') || + ((cur == '<') && (str[len + 1] != '!')))) { + intern = xmlDictLookup(ctxt->dict, str, len); + } else if (IS_BLANK_CH(*str) && (len < 60) && (cur == '<') && + (str[len + 1] != '!')) { + int i; + + for (i = 1;i < len;i++) { + if (!IS_BLANK_CH(str[i])) goto skip; + } + intern = xmlDictLookup(ctxt->dict, str, len); + } + } +skip: + ret->type = XML_TEXT_NODE; + + ret->name = xmlStringText; + if (intern == NULL) { + ret->content = xmlStrndup(str, len); + if (ret->content == NULL) { + xmlSAX2ErrMemory(ctxt, "xmlSAX2TextNode"); + xmlFree(ret); + return(NULL); + } + } else + ret->content = (xmlChar *) intern; + + if (ctxt->linenumbers) { + if (ctxt->input != NULL) { + if (ctxt->input->line < 65535) + ret->line = (short) ctxt->input->line; + else { + ret->line = 65535; + if (ctxt->options & XML_PARSE_BIG_LINES) + ret->psvi = (void *) (long) ctxt->input->line; + } + } + } + + if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) + xmlRegisterNodeDefaultValue(ret); + return(ret); +} + +#ifdef LIBXML_VALID_ENABLED +/* + * xmlSAX2DecodeAttrEntities: + * @ctxt: the parser context + * @str: the input string + * @len: the string length + * + * Remove the entities from an attribute value + * + * Returns the newly allocated string or NULL if not needed or error + */ +static xmlChar * +xmlSAX2DecodeAttrEntities(xmlParserCtxtPtr ctxt, const xmlChar *str, + const xmlChar *end) { + const xmlChar *in; + xmlChar *ret; + + in = str; + while (in < end) + if (*in++ == '&') + goto decode; + return(NULL); +decode: + ctxt->depth++; + ret = xmlStringLenDecodeEntities(ctxt, str, end - str, + XML_SUBSTITUTE_REF, 0,0,0); + ctxt->depth--; + return(ret); +} +#endif /* LIBXML_VALID_ENABLED */ + +/** + * xmlSAX2AttributeNs: + * @ctx: the user data (XML parser context) + * @localname: the local name of the attribute + * @prefix: the attribute namespace prefix if available + * @URI: the attribute namespace name if available + * @value: Start of the attribute value + * @valueend: end of the attribute value + * + * Handle an attribute that has been read by the parser. + * The default handling is to convert the attribute into an + * DOM subtree and past it in a new xmlAttr element added to + * the element. + */ +static void +xmlSAX2AttributeNs(xmlParserCtxtPtr ctxt, + const xmlChar * localname, + const xmlChar * prefix, + const xmlChar * value, + const xmlChar * valueend) +{ + xmlAttrPtr ret; + xmlNsPtr namespace = NULL; + xmlChar *dup = NULL; + + /* + * Note: if prefix == NULL, the attribute is not in the default namespace + */ + if (prefix != NULL) + namespace = xmlSearchNs(ctxt->myDoc, ctxt->node, prefix); + + /* + * allocate the node + */ + if (ctxt->freeAttrs != NULL) { + ret = ctxt->freeAttrs; + ctxt->freeAttrs = ret->next; + ctxt->freeAttrsNr--; + memset(ret, 0, sizeof(xmlAttr)); + ret->type = XML_ATTRIBUTE_NODE; + + ret->parent = ctxt->node; + ret->doc = ctxt->myDoc; + ret->ns = namespace; + + if (ctxt->dictNames) + ret->name = localname; + else + ret->name = xmlStrdup(localname); + + /* link at the end to preserv order, TODO speed up with a last */ + if (ctxt->node->properties == NULL) { + ctxt->node->properties = ret; + } else { + xmlAttrPtr prev = ctxt->node->properties; + + while (prev->next != NULL) prev = prev->next; + prev->next = ret; + ret->prev = prev; + } + + if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) + xmlRegisterNodeDefaultValue((xmlNodePtr)ret); + } else { + if (ctxt->dictNames) + ret = xmlNewNsPropEatName(ctxt->node, namespace, + (xmlChar *) localname, NULL); + else + ret = xmlNewNsProp(ctxt->node, namespace, localname, NULL); + if (ret == NULL) { + xmlErrMemory(ctxt, "xmlSAX2AttributeNs"); + return; + } + } + + if ((ctxt->replaceEntities == 0) && (!ctxt->html)) { + xmlNodePtr tmp; + + /* + * We know that if there is an entity reference, then + * the string has been dup'ed and terminates with 0 + * otherwise with ' or " + */ + if (*valueend != 0) { + tmp = xmlSAX2TextNode(ctxt, value, valueend - value); + ret->children = tmp; + ret->last = tmp; + if (tmp != NULL) { + tmp->doc = ret->doc; + tmp->parent = (xmlNodePtr) ret; + } + } else { + ret->children = xmlStringLenGetNodeList(ctxt->myDoc, value, + valueend - value); + tmp = ret->children; + while (tmp != NULL) { + tmp->doc = ret->doc; + tmp->parent = (xmlNodePtr) ret; + if (tmp->next == NULL) + ret->last = tmp; + tmp = tmp->next; + } + } + } else if (value != NULL) { + xmlNodePtr tmp; + + tmp = xmlSAX2TextNode(ctxt, value, valueend - value); + ret->children = tmp; + ret->last = tmp; + if (tmp != NULL) { + tmp->doc = ret->doc; + tmp->parent = (xmlNodePtr) ret; + } + } + +#ifdef LIBXML_VALID_ENABLED + if ((!ctxt->html) && ctxt->validate && ctxt->wellFormed && + ctxt->myDoc && ctxt->myDoc->intSubset) { + /* + * If we don't substitute entities, the validation should be + * done on a value with replaced entities anyway. + */ + if (!ctxt->replaceEntities) { + dup = xmlSAX2DecodeAttrEntities(ctxt, value, valueend); + if (dup == NULL) { + if (*valueend == 0) { + ctxt->valid &= xmlValidateOneAttribute(&ctxt->vctxt, + ctxt->myDoc, ctxt->node, ret, value); + } else { + /* + * That should already be normalized. + * cheaper to finally allocate here than duplicate + * entry points in the full validation code + */ + dup = xmlStrndup(value, valueend - value); + + ctxt->valid &= xmlValidateOneAttribute(&ctxt->vctxt, + ctxt->myDoc, ctxt->node, ret, dup); + } + } else { + /* + * dup now contains a string of the flattened attribute + * content with entities substitued. Check if we need to + * apply an extra layer of normalization. + * It need to be done twice ... it's an extra burden related + * to the ability to keep references in attributes + */ + if (ctxt->attsSpecial != NULL) { + xmlChar *nvalnorm; + xmlChar fn[50]; + xmlChar *fullname; + + fullname = xmlBuildQName(localname, prefix, fn, 50); + if (fullname != NULL) { + ctxt->vctxt.valid = 1; + nvalnorm = xmlValidCtxtNormalizeAttributeValue( + &ctxt->vctxt, ctxt->myDoc, + ctxt->node, fullname, dup); + if (ctxt->vctxt.valid != 1) + ctxt->valid = 0; + + if ((fullname != fn) && (fullname != localname)) + xmlFree(fullname); + if (nvalnorm != NULL) { + xmlFree(dup); + dup = nvalnorm; + } + } + } + + ctxt->valid &= xmlValidateOneAttribute(&ctxt->vctxt, + ctxt->myDoc, ctxt->node, ret, dup); + } + } else { + /* + * if entities already have been substitued, then + * the attribute as passed is already normalized + */ + dup = xmlStrndup(value, valueend - value); + + ctxt->valid &= xmlValidateOneAttribute(&ctxt->vctxt, + ctxt->myDoc, ctxt->node, ret, dup); + } + } else +#endif /* LIBXML_VALID_ENABLED */ + if (((ctxt->loadsubset & XML_SKIP_IDS) == 0) && + (((ctxt->replaceEntities == 0) && (ctxt->external != 2)) || + ((ctxt->replaceEntities != 0) && (ctxt->inSubset == 0)))) { + /* + * when validating, the ID registration is done at the attribute + * validation level. Otherwise we have to do specific handling here. + */ + if ((prefix == ctxt->str_xml) && + (localname[0] == 'i') && (localname[1] == 'd') && + (localname[2] == 0)) { + /* + * Add the xml:id value + * + * Open issue: normalization of the value. + */ + if (dup == NULL) + dup = xmlStrndup(value, valueend - value); +#ifdef LIBXML_VALID_ENABLED + if (xmlValidateNCName(dup, 1) != 0) { + xmlErrValid(ctxt, XML_DTD_XMLID_VALUE, + "xml:id : attribute value %s is not an NCName\n", + (const char *) dup, NULL); + } +#endif + xmlAddID(&ctxt->vctxt, ctxt->myDoc, dup, ret); + } else if (xmlIsID(ctxt->myDoc, ctxt->node, ret)) { + /* might be worth duplicate entry points and not copy */ + if (dup == NULL) + dup = xmlStrndup(value, valueend - value); + xmlAddID(&ctxt->vctxt, ctxt->myDoc, dup, ret); + } else if (xmlIsRef(ctxt->myDoc, ctxt->node, ret)) { + if (dup == NULL) + dup = xmlStrndup(value, valueend - value); + xmlAddRef(&ctxt->vctxt, ctxt->myDoc, dup, ret); + } + } + if (dup != NULL) + xmlFree(dup); +} + +/** + * xmlSAX2StartElementNs: + * @ctx: the user data (XML parser context) + * @localname: the local name of the element + * @prefix: the element namespace prefix if available + * @URI: the element namespace name if available + * @nb_namespaces: number of namespace definitions on that node + * @namespaces: pointer to the array of prefix/URI pairs namespace definitions + * @nb_attributes: the number of attributes on that node + * @nb_defaulted: the number of defaulted attributes. + * @attributes: pointer to the array of (localname/prefix/URI/value/end) + * attribute values. + * + * SAX2 callback when an element start has been detected by the parser. + * It provides the namespace informations for the element, as well as + * the new namespace declarations on the element. + */ +void +xmlSAX2StartElementNs(void *ctx, + const xmlChar *localname, + const xmlChar *prefix, + const xmlChar *URI, + int nb_namespaces, + const xmlChar **namespaces, + int nb_attributes, + int nb_defaulted, + const xmlChar **attributes) +{ + xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; + xmlNodePtr ret; + xmlNodePtr parent; + xmlNsPtr last = NULL, ns; + const xmlChar *uri, *pref; + xmlChar *lname = NULL; + int i, j; + + if (ctx == NULL) return; + parent = ctxt->node; + /* + * First check on validity: + */ + if (ctxt->validate && (ctxt->myDoc->extSubset == NULL) && + ((ctxt->myDoc->intSubset == NULL) || + ((ctxt->myDoc->intSubset->notations == NULL) && + (ctxt->myDoc->intSubset->elements == NULL) && + (ctxt->myDoc->intSubset->attributes == NULL) && + (ctxt->myDoc->intSubset->entities == NULL)))) { + xmlErrValid(ctxt, XML_DTD_NO_DTD, + "Validation failed: no DTD found !", NULL, NULL); + ctxt->validate = 0; + } + + /* + * Take care of the rare case of an undefined namespace prefix + */ + if ((prefix != NULL) && (URI == NULL)) { + if (ctxt->dictNames) { + const xmlChar *fullname; + + fullname = xmlDictQLookup(ctxt->dict, prefix, localname); + if (fullname != NULL) + localname = fullname; + } else { + lname = xmlBuildQName(localname, prefix, NULL, 0); + } + } + /* + * allocate the node + */ + if (ctxt->freeElems != NULL) { + ret = ctxt->freeElems; + ctxt->freeElems = ret->next; + ctxt->freeElemsNr--; + memset(ret, 0, sizeof(xmlNode)); + ret->type = XML_ELEMENT_NODE; + + if (ctxt->dictNames) + ret->name = localname; + else { + if (lname == NULL) + ret->name = xmlStrdup(localname); + else + ret->name = lname; + if (ret->name == NULL) { + xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElementNs"); + return; + } + } + if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) + xmlRegisterNodeDefaultValue(ret); + } else { + if (ctxt->dictNames) + ret = xmlNewDocNodeEatName(ctxt->myDoc, NULL, + (xmlChar *) localname, NULL); + else if (lname == NULL) + ret = xmlNewDocNode(ctxt->myDoc, NULL, localname, NULL); + else + ret = xmlNewDocNodeEatName(ctxt->myDoc, NULL, + (xmlChar *) lname, NULL); + if (ret == NULL) { + xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElementNs"); + return; + } + } + if (ctxt->linenumbers) { + if (ctxt->input != NULL) { + if (ctxt->input->line < 65535) + ret->line = (short) ctxt->input->line; + else + ret->line = 65535; + } + } + + if (parent == NULL) { + xmlAddChild((xmlNodePtr) ctxt->myDoc, (xmlNodePtr) ret); + } + /* + * Build the namespace list + */ + for (i = 0,j = 0;j < nb_namespaces;j++) { + pref = namespaces[i++]; + uri = namespaces[i++]; + ns = xmlNewNs(NULL, uri, pref); + if (ns != NULL) { + if (last == NULL) { + ret->nsDef = last = ns; + } else { + last->next = ns; + last = ns; + } + if ((URI != NULL) && (prefix == pref)) + ret->ns = ns; + } else { + /* + * any out of memory error would already have been raised + * but we can't be garanteed it's the actual error due to the + * API, best is to skip in this case + */ + continue; + } +#ifdef LIBXML_VALID_ENABLED + if ((!ctxt->html) && ctxt->validate && ctxt->wellFormed && + ctxt->myDoc && ctxt->myDoc->intSubset) { + ctxt->valid &= xmlValidateOneNamespace(&ctxt->vctxt, ctxt->myDoc, + ret, prefix, ns, uri); + } +#endif /* LIBXML_VALID_ENABLED */ + } + ctxt->nodemem = -1; + + /* + * We are parsing a new node. + */ + nodePush(ctxt, ret); + + /* + * Link the child element + */ + if (parent != NULL) { + if (parent->type == XML_ELEMENT_NODE) { + xmlAddChild(parent, ret); + } else { + xmlAddSibling(parent, ret); + } + } + + /* + * Insert the defaulted attributes from the DTD only if requested: + */ + if ((nb_defaulted != 0) && + ((ctxt->loadsubset & XML_COMPLETE_ATTRS) == 0)) + nb_attributes -= nb_defaulted; + + /* + * Search the namespace if it wasn't already found + * Note that, if prefix is NULL, this searches for the default Ns + */ + if ((URI != NULL) && (ret->ns == NULL)) { + ret->ns = xmlSearchNs(ctxt->myDoc, parent, prefix); + if ((ret->ns == NULL) && (xmlStrEqual(prefix, BAD_CAST "xml"))) { + ret->ns = xmlSearchNs(ctxt->myDoc, ret, prefix); + } + if (ret->ns == NULL) { + ns = xmlNewNs(ret, NULL, prefix); + if (ns == NULL) { + + xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElementNs"); + return; + } + if (prefix != NULL) + xmlNsWarnMsg(ctxt, XML_NS_ERR_UNDEFINED_NAMESPACE, + "Namespace prefix %s was not found\n", + prefix, NULL); + else + xmlNsWarnMsg(ctxt, XML_NS_ERR_UNDEFINED_NAMESPACE, + "Namespace default prefix was not found\n", + NULL, NULL); + } + } + + /* + * process all the other attributes + */ + if (nb_attributes > 0) { + for (j = 0,i = 0;i < nb_attributes;i++,j+=5) { + /* + * Handle the rare case of an undefined atribute prefix + */ + if ((attributes[j+1] != NULL) && (attributes[j+2] == NULL)) { + if (ctxt->dictNames) { + const xmlChar *fullname; + + fullname = xmlDictQLookup(ctxt->dict, attributes[j+1], + attributes[j]); + if (fullname != NULL) { + xmlSAX2AttributeNs(ctxt, fullname, NULL, + attributes[j+3], attributes[j+4]); + continue; + } + } else { + lname = xmlBuildQName(attributes[j], attributes[j+1], + NULL, 0); + if (lname != NULL) { + xmlSAX2AttributeNs(ctxt, lname, NULL, + attributes[j+3], attributes[j+4]); + xmlFree(lname); + continue; + } + } + } + xmlSAX2AttributeNs(ctxt, attributes[j], attributes[j+1], + attributes[j+3], attributes[j+4]); + } + } + +#ifdef LIBXML_VALID_ENABLED + /* + * If it's the Document root, finish the DTD validation and + * check the document root element for validity + */ + if ((ctxt->validate) && (ctxt->vctxt.finishDtd == XML_CTXT_FINISH_DTD_0)) { + int chk; + + chk = xmlValidateDtdFinal(&ctxt->vctxt, ctxt->myDoc); + if (chk <= 0) + ctxt->valid = 0; + if (chk < 0) + ctxt->wellFormed = 0; + ctxt->valid &= xmlValidateRoot(&ctxt->vctxt, ctxt->myDoc); + ctxt->vctxt.finishDtd = XML_CTXT_FINISH_DTD_1; + } +#endif /* LIBXML_VALID_ENABLED */ +} + +/** + * xmlSAX2EndElementNs: + * @ctx: the user data (XML parser context) + * @localname: the local name of the element + * @prefix: the element namespace prefix if available + * @URI: the element namespace name if available + * + * SAX2 callback when an element end has been detected by the parser. + * It provides the namespace informations for the element. + */ +void +xmlSAX2EndElementNs(void *ctx, + const xmlChar * localname ATTRIBUTE_UNUSED, + const xmlChar * prefix ATTRIBUTE_UNUSED, + const xmlChar * URI ATTRIBUTE_UNUSED) +{ + xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; + xmlParserNodeInfo node_info; + xmlNodePtr cur; + + if (ctx == NULL) return; + cur = ctxt->node; + /* Capture end position and add node */ + if ((ctxt->record_info) && (cur != NULL)) { + node_info.end_pos = ctxt->input->cur - ctxt->input->base; + node_info.end_line = ctxt->input->line; + node_info.node = cur; + xmlParserAddNodeInfo(ctxt, &node_info); + } + ctxt->nodemem = -1; + +#ifdef LIBXML_VALID_ENABLED + if (ctxt->validate && ctxt->wellFormed && + ctxt->myDoc && ctxt->myDoc->intSubset) + ctxt->valid &= xmlValidateOneElement(&ctxt->vctxt, ctxt->myDoc, cur); +#endif /* LIBXML_VALID_ENABLED */ + + /* + * end of parsing of this node. + */ + nodePop(ctxt); +} + +/** + * xmlSAX2Reference: + * @ctx: the user data (XML parser context) + * @name: The entity name + * + * called when an entity xmlSAX2Reference is detected. + */ +void +xmlSAX2Reference(void *ctx, const xmlChar *name) +{ + xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; + xmlNodePtr ret; + + if (ctx == NULL) return; +#ifdef DEBUG_SAX + xmlGenericError(xmlGenericErrorContext, + "SAX.xmlSAX2Reference(%s)\n", name); +#endif + if (name[0] == '#') + ret = xmlNewCharRef(ctxt->myDoc, name); + else + ret = xmlNewReference(ctxt->myDoc, name); +#ifdef DEBUG_SAX_TREE + xmlGenericError(xmlGenericErrorContext, + "add xmlSAX2Reference %s to %s \n", name, ctxt->node->name); +#endif + if (xmlAddChild(ctxt->node, ret) == NULL) { + xmlFreeNode(ret); + } +} + +/** + * xmlSAX2Characters: + * @ctx: the user data (XML parser context) + * @ch: a xmlChar string + * @len: the number of xmlChar + * + * receiving some chars from the parser. + */ +void +xmlSAX2Characters(void *ctx, const xmlChar *ch, int len) +{ + xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; + xmlNodePtr lastChild; + + if (ctx == NULL) return; +#ifdef DEBUG_SAX + xmlGenericError(xmlGenericErrorContext, + "SAX.xmlSAX2Characters(%.30s, %d)\n", ch, len); +#endif + /* + * Handle the data if any. If there is no child + * add it as content, otherwise if the last child is text, + * concatenate it, else create a new node of type text. + */ + + if (ctxt->node == NULL) { +#ifdef DEBUG_SAX_TREE + xmlGenericError(xmlGenericErrorContext, + "add chars: ctxt->node == NULL !\n"); +#endif + return; + } + lastChild = ctxt->node->last; +#ifdef DEBUG_SAX_TREE + xmlGenericError(xmlGenericErrorContext, + "add chars to %s \n", ctxt->node->name); +#endif + + /* + * Here we needed an accelerator mechanism in case of very large + * elements. Use an attribute in the structure !!! + */ + if (lastChild == NULL) { + lastChild = xmlSAX2TextNode(ctxt, ch, len); + if (lastChild != NULL) { + ctxt->node->children = lastChild; + ctxt->node->last = lastChild; + lastChild->parent = ctxt->node; + lastChild->doc = ctxt->node->doc; + ctxt->nodelen = len; + ctxt->nodemem = len + 1; + } else { + xmlSAX2ErrMemory(ctxt, "xmlSAX2Characters"); + return; + } + } else { + int coalesceText = (lastChild != NULL) && + (lastChild->type == XML_TEXT_NODE) && + (lastChild->name == xmlStringText); + if ((coalesceText) && (ctxt->nodemem != 0)) { + /* + * The whole point of maintaining nodelen and nodemem, + * xmlTextConcat is too costly, i.e. compute length, + * reallocate a new buffer, move data, append ch. Here + * We try to minimaze realloc() uses and avoid copying + * and recomputing length over and over. + */ + if (lastChild->content == (xmlChar *)&(lastChild->properties)) { + lastChild->content = xmlStrdup(lastChild->content); + lastChild->properties = NULL; + } else if ((ctxt->nodemem == ctxt->nodelen + 1) && + (xmlDictOwns(ctxt->dict, lastChild->content))) { + lastChild->content = xmlStrdup(lastChild->content); + } + if (((size_t)ctxt->nodelen + (size_t)len > XML_MAX_TEXT_LENGTH) && + ((ctxt->options & XML_PARSE_HUGE) == 0)) { + xmlSAX2ErrMemory(ctxt, "xmlSAX2Characters: huge text node"); + return; + } + if ((size_t)ctxt->nodelen > SIZE_T_MAX - (size_t)len || + (size_t)ctxt->nodemem + (size_t)len > SIZE_T_MAX / 2) { + xmlSAX2ErrMemory(ctxt, "xmlSAX2Characters overflow prevented"); + return; + } + if (ctxt->nodelen + len >= ctxt->nodemem) { + xmlChar *newbuf; + size_t size; + + size = ctxt->nodemem + len; + size *= 2; + newbuf = (xmlChar *) xmlRealloc(lastChild->content,size); + if (newbuf == NULL) { + xmlSAX2ErrMemory(ctxt, "xmlSAX2Characters"); + return; + } + ctxt->nodemem = size; + lastChild->content = newbuf; + } + memcpy(&lastChild->content[ctxt->nodelen], ch, len); + ctxt->nodelen += len; + lastChild->content[ctxt->nodelen] = 0; + } else if (coalesceText) { + if (xmlTextConcat(lastChild, ch, len)) { + xmlSAX2ErrMemory(ctxt, "xmlSAX2Characters"); + } + if (ctxt->node->children != NULL) { + ctxt->nodelen = xmlStrlen(lastChild->content); + ctxt->nodemem = ctxt->nodelen + 1; + } + } else { + /* Mixed content, first time */ + lastChild = xmlSAX2TextNode(ctxt, ch, len); + if (lastChild != NULL) { + xmlAddChild(ctxt->node, lastChild); + if (ctxt->node->children != NULL) { + ctxt->nodelen = len; + ctxt->nodemem = len + 1; + } + } + } + } +} + +/** + * xmlSAX2IgnorableWhitespace: + * @ctx: the user data (XML parser context) + * @ch: a xmlChar string + * @len: the number of xmlChar + * + * receiving some ignorable whitespaces from the parser. + * UNUSED: by default the DOM building will use xmlSAX2Characters + */ +void +xmlSAX2IgnorableWhitespace(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch ATTRIBUTE_UNUSED, int len ATTRIBUTE_UNUSED) +{ + /* xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; */ +#ifdef DEBUG_SAX + xmlGenericError(xmlGenericErrorContext, + "SAX.xmlSAX2IgnorableWhitespace(%.30s, %d)\n", ch, len); +#endif +} + +/** + * xmlSAX2ProcessingInstruction: + * @ctx: the user data (XML parser context) + * @target: the target name + * @data: the PI data's + * + * A processing instruction has been parsed. + */ +void +xmlSAX2ProcessingInstruction(void *ctx, const xmlChar *target, + const xmlChar *data) +{ + xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; + xmlNodePtr ret; + xmlNodePtr parent; + + if (ctx == NULL) return; + parent = ctxt->node; +#ifdef DEBUG_SAX + xmlGenericError(xmlGenericErrorContext, + "SAX.xmlSAX2ProcessingInstruction(%s, %s)\n", target, data); +#endif + + ret = xmlNewDocPI(ctxt->myDoc, target, data); + if (ret == NULL) return; + + if (ctxt->linenumbers) { + if (ctxt->input != NULL) { + if (ctxt->input->line < 65535) + ret->line = (short) ctxt->input->line; + else + ret->line = 65535; + } + } + if (ctxt->inSubset == 1) { + xmlAddChild((xmlNodePtr) ctxt->myDoc->intSubset, ret); + return; + } else if (ctxt->inSubset == 2) { + xmlAddChild((xmlNodePtr) ctxt->myDoc->extSubset, ret); + return; + } + if (parent == NULL) { +#ifdef DEBUG_SAX_TREE + xmlGenericError(xmlGenericErrorContext, + "Setting PI %s as root\n", target); +#endif + xmlAddChild((xmlNodePtr) ctxt->myDoc, (xmlNodePtr) ret); + return; + } + if (parent->type == XML_ELEMENT_NODE) { +#ifdef DEBUG_SAX_TREE + xmlGenericError(xmlGenericErrorContext, + "adding PI %s child to %s\n", target, parent->name); +#endif + xmlAddChild(parent, ret); + } else { +#ifdef DEBUG_SAX_TREE + xmlGenericError(xmlGenericErrorContext, + "adding PI %s sibling to ", target); + xmlDebugDumpOneNode(stderr, parent, 0); +#endif + xmlAddSibling(parent, ret); + } +} + +/** + * xmlSAX2Comment: + * @ctx: the user data (XML parser context) + * @value: the xmlSAX2Comment content + * + * A xmlSAX2Comment has been parsed. + */ +void +xmlSAX2Comment(void *ctx, const xmlChar *value) +{ + xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; + xmlNodePtr ret; + xmlNodePtr parent; + + if (ctx == NULL) return; + parent = ctxt->node; +#ifdef DEBUG_SAX + xmlGenericError(xmlGenericErrorContext, "SAX.xmlSAX2Comment(%s)\n", value); +#endif + ret = xmlNewDocComment(ctxt->myDoc, value); + if (ret == NULL) return; + if (ctxt->linenumbers) { + if (ctxt->input != NULL) { + if (ctxt->input->line < 65535) + ret->line = (short) ctxt->input->line; + else + ret->line = 65535; + } + } + + if (ctxt->inSubset == 1) { + xmlAddChild((xmlNodePtr) ctxt->myDoc->intSubset, ret); + return; + } else if (ctxt->inSubset == 2) { + xmlAddChild((xmlNodePtr) ctxt->myDoc->extSubset, ret); + return; + } + if (parent == NULL) { +#ifdef DEBUG_SAX_TREE + xmlGenericError(xmlGenericErrorContext, + "Setting xmlSAX2Comment as root\n"); +#endif + xmlAddChild((xmlNodePtr) ctxt->myDoc, (xmlNodePtr) ret); + return; + } + if (parent->type == XML_ELEMENT_NODE) { +#ifdef DEBUG_SAX_TREE + xmlGenericError(xmlGenericErrorContext, + "adding xmlSAX2Comment child to %s\n", parent->name); +#endif + xmlAddChild(parent, ret); + } else { +#ifdef DEBUG_SAX_TREE + xmlGenericError(xmlGenericErrorContext, + "adding xmlSAX2Comment sibling to "); + xmlDebugDumpOneNode(stderr, parent, 0); +#endif + xmlAddSibling(parent, ret); + } +} + +/** + * xmlSAX2CDataBlock: + * @ctx: the user data (XML parser context) + * @value: The pcdata content + * @len: the block length + * + * called when a pcdata block has been parsed + */ +void +xmlSAX2CDataBlock(void *ctx, const xmlChar *value, int len) +{ + xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; + xmlNodePtr ret, lastChild; + + if (ctx == NULL) return; +#ifdef DEBUG_SAX + xmlGenericError(xmlGenericErrorContext, + "SAX.pcdata(%.10s, %d)\n", value, len); +#endif + lastChild = xmlGetLastChild(ctxt->node); +#ifdef DEBUG_SAX_TREE + xmlGenericError(xmlGenericErrorContext, + "add chars to %s \n", ctxt->node->name); +#endif + if ((lastChild != NULL) && + (lastChild->type == XML_CDATA_SECTION_NODE)) { + xmlTextConcat(lastChild, value, len); + } else { + ret = xmlNewCDataBlock(ctxt->myDoc, value, len); + xmlAddChild(ctxt->node, ret); + } +} + +static int xmlSAX2DefaultVersionValue = 2; + +#ifdef LIBXML_SAX1_ENABLED +/** + * xmlSAXDefaultVersion: + * @version: the version, 1 or 2 + * + * Set the default version of SAX used globally by the library. + * By default, during initialization the default is set to 2. + * Note that it is generally a better coding style to use + * xmlSAXVersion() to set up the version explicitly for a given + * parsing context. + * + * Returns the previous value in case of success and -1 in case of error. + */ +int +xmlSAXDefaultVersion(int version) +{ + int ret = xmlSAX2DefaultVersionValue; + + if ((version != 1) && (version != 2)) + return(-1); + xmlSAX2DefaultVersionValue = version; + return(ret); +} +#endif /* LIBXML_SAX1_ENABLED */ + +/** + * xmlSAXVersion: + * @hdlr: the SAX handler + * @version: the version, 1 or 2 + * + * Initialize the default XML SAX handler according to the version + * + * Returns 0 in case of success and -1 in case of error. + */ +int +xmlSAXVersion(xmlSAXHandler *hdlr, int version) +{ + if (hdlr == NULL) return(-1); + if (version == 2) { + hdlr->startElement = NULL; + hdlr->endElement = NULL; + hdlr->startElementNs = xmlSAX2StartElementNs; + hdlr->endElementNs = xmlSAX2EndElementNs; + hdlr->serror = NULL; + hdlr->initialized = XML_SAX2_MAGIC; +#ifdef LIBXML_SAX1_ENABLED + } else if (version == 1) { + hdlr->startElement = xmlSAX2StartElement; + hdlr->endElement = xmlSAX2EndElement; + hdlr->initialized = 1; +#endif /* LIBXML_SAX1_ENABLED */ + } else + return(-1); + hdlr->internalSubset = xmlSAX2InternalSubset; + hdlr->externalSubset = xmlSAX2ExternalSubset; + hdlr->isStandalone = xmlSAX2IsStandalone; + hdlr->hasInternalSubset = xmlSAX2HasInternalSubset; + hdlr->hasExternalSubset = xmlSAX2HasExternalSubset; + hdlr->resolveEntity = xmlSAX2ResolveEntity; + hdlr->getEntity = xmlSAX2GetEntity; + hdlr->getParameterEntity = xmlSAX2GetParameterEntity; + hdlr->entityDecl = xmlSAX2EntityDecl; + hdlr->attributeDecl = xmlSAX2AttributeDecl; + hdlr->elementDecl = xmlSAX2ElementDecl; + hdlr->notationDecl = xmlSAX2NotationDecl; + hdlr->unparsedEntityDecl = xmlSAX2UnparsedEntityDecl; + hdlr->setDocumentLocator = xmlSAX2SetDocumentLocator; + hdlr->startDocument = xmlSAX2StartDocument; + hdlr->endDocument = xmlSAX2EndDocument; + hdlr->reference = xmlSAX2Reference; + hdlr->characters = xmlSAX2Characters; + hdlr->cdataBlock = xmlSAX2CDataBlock; + hdlr->ignorableWhitespace = xmlSAX2Characters; + hdlr->processingInstruction = xmlSAX2ProcessingInstruction; + hdlr->comment = xmlSAX2Comment; + hdlr->warning = xmlParserWarning; + hdlr->error = xmlParserError; + hdlr->fatalError = xmlParserError; + + return(0); +} + +/** + * xmlSAX2InitDefaultSAXHandler: + * @hdlr: the SAX handler + * @warning: flag if non-zero sets the handler warning procedure + * + * Initialize the default XML SAX2 handler + */ +void +xmlSAX2InitDefaultSAXHandler(xmlSAXHandler *hdlr, int warning) +{ + if ((hdlr == NULL) || (hdlr->initialized != 0)) + return; + + xmlSAXVersion(hdlr, xmlSAX2DefaultVersionValue); + if (warning == 0) + hdlr->warning = NULL; + else + hdlr->warning = xmlParserWarning; +} + +/** + * xmlDefaultSAXHandlerInit: + * + * Initialize the default SAX2 handler + */ +void +xmlDefaultSAXHandlerInit(void) +{ +#ifdef LIBXML_SAX1_ENABLED + xmlSAXVersion((xmlSAXHandlerPtr) &xmlDefaultSAXHandler, 1); +#endif /* LIBXML_SAX1_ENABLED */ +} + +#ifdef LIBXML_HTML_ENABLED + +/** + * xmlSAX2InitHtmlDefaultSAXHandler: + * @hdlr: the SAX handler + * + * Initialize the default HTML SAX2 handler + */ +void +xmlSAX2InitHtmlDefaultSAXHandler(xmlSAXHandler *hdlr) +{ + if ((hdlr == NULL) || (hdlr->initialized != 0)) + return; + + hdlr->internalSubset = xmlSAX2InternalSubset; + hdlr->externalSubset = NULL; + hdlr->isStandalone = NULL; + hdlr->hasInternalSubset = NULL; + hdlr->hasExternalSubset = NULL; + hdlr->resolveEntity = NULL; + hdlr->getEntity = xmlSAX2GetEntity; + hdlr->getParameterEntity = NULL; + hdlr->entityDecl = NULL; + hdlr->attributeDecl = NULL; + hdlr->elementDecl = NULL; + hdlr->notationDecl = NULL; + hdlr->unparsedEntityDecl = NULL; + hdlr->setDocumentLocator = xmlSAX2SetDocumentLocator; + hdlr->startDocument = xmlSAX2StartDocument; + hdlr->endDocument = xmlSAX2EndDocument; + hdlr->startElement = xmlSAX2StartElement; + hdlr->endElement = xmlSAX2EndElement; + hdlr->reference = NULL; + hdlr->characters = xmlSAX2Characters; + hdlr->cdataBlock = xmlSAX2CDataBlock; + hdlr->ignorableWhitespace = xmlSAX2IgnorableWhitespace; + hdlr->processingInstruction = xmlSAX2ProcessingInstruction; + hdlr->comment = xmlSAX2Comment; + hdlr->warning = xmlParserWarning; + hdlr->error = xmlParserError; + hdlr->fatalError = xmlParserError; + + hdlr->initialized = 1; +} + +/** + * htmlDefaultSAXHandlerInit: + * + * Initialize the default SAX handler + */ +void +htmlDefaultSAXHandlerInit(void) +{ + xmlSAX2InitHtmlDefaultSAXHandler((xmlSAXHandlerPtr) &htmlDefaultSAXHandler); +} + +#endif /* LIBXML_HTML_ENABLED */ + +#ifdef LIBXML_DOCB_ENABLED + +/** + * xmlSAX2InitDocbDefaultSAXHandler: + * @hdlr: the SAX handler + * + * Initialize the default DocBook SAX2 handler + */ +void +xmlSAX2InitDocbDefaultSAXHandler(xmlSAXHandler *hdlr) +{ + if ((hdlr == NULL) || (hdlr->initialized != 0)) + return; + + hdlr->internalSubset = xmlSAX2InternalSubset; + hdlr->externalSubset = NULL; + hdlr->isStandalone = xmlSAX2IsStandalone; + hdlr->hasInternalSubset = xmlSAX2HasInternalSubset; + hdlr->hasExternalSubset = xmlSAX2HasExternalSubset; + hdlr->resolveEntity = xmlSAX2ResolveEntity; + hdlr->getEntity = xmlSAX2GetEntity; + hdlr->getParameterEntity = NULL; + hdlr->entityDecl = xmlSAX2EntityDecl; + hdlr->attributeDecl = NULL; + hdlr->elementDecl = NULL; + hdlr->notationDecl = NULL; + hdlr->unparsedEntityDecl = NULL; + hdlr->setDocumentLocator = xmlSAX2SetDocumentLocator; + hdlr->startDocument = xmlSAX2StartDocument; + hdlr->endDocument = xmlSAX2EndDocument; + hdlr->startElement = xmlSAX2StartElement; + hdlr->endElement = xmlSAX2EndElement; + hdlr->reference = xmlSAX2Reference; + hdlr->characters = xmlSAX2Characters; + hdlr->cdataBlock = NULL; + hdlr->ignorableWhitespace = xmlSAX2IgnorableWhitespace; + hdlr->processingInstruction = NULL; + hdlr->comment = xmlSAX2Comment; + hdlr->warning = xmlParserWarning; + hdlr->error = xmlParserError; + hdlr->fatalError = xmlParserError; + + hdlr->initialized = 1; +} + +/** + * docbDefaultSAXHandlerInit: + * + * Initialize the default SAX handler + */ +void +docbDefaultSAXHandlerInit(void) +{ + xmlSAX2InitDocbDefaultSAXHandler((xmlSAXHandlerPtr) &docbDefaultSAXHandler); +} + +#endif /* LIBXML_DOCB_ENABLED */ +#define bottom_SAX2 +#include "elfgcchack.h" diff --git a/vendors/libxml/src/buf.c b/vendors/libxml/src/buf.c new file mode 100644 index 0000000..d1756c4 --- /dev/null +++ b/vendors/libxml/src/buf.c @@ -0,0 +1,1304 @@ +/* + * buf.c: memory buffers for libxml2 + * + * new buffer structures and entry points to simplify the maintainance + * of libxml2 and ensure we keep good control over memory allocations + * and stay 64 bits clean. + * The new entry point use the xmlBufPtr opaque structure and + * xmlBuf...() counterparts to the old xmlBuf...() functions + * + * See Copyright for the status of this software. + * + * daniel@veillard.com + */ + +#define IN_LIBXML +#include "libxml.h" + +#include /* for memset() only ! */ +#include +#ifdef HAVE_CTYPE_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif + +#include +#include +#include +#include "buf.h" + +#define WITH_BUFFER_COMPAT + +/** + * xmlBuf: + * + * A buffer structure. The base of the structure is somehow compatible + * with struct _xmlBuffer to limit risks on application which accessed + * directly the input->buf->buffer structures. + */ + +struct _xmlBuf { + xmlChar *content; /* The buffer content UTF8 */ + unsigned int compat_use; /* for binary compatibility */ + unsigned int compat_size; /* for binary compatibility */ + xmlBufferAllocationScheme alloc; /* The realloc method */ + xmlChar *contentIO; /* in IO mode we may have a different base */ + size_t use; /* The buffer size used */ + size_t size; /* The buffer size */ + xmlBufferPtr buffer; /* wrapper for an old buffer */ + int error; /* an error code if a failure occured */ +}; + +#ifdef WITH_BUFFER_COMPAT +/* + * Macro for compatibility with xmlBuffer to be used after an xmlBuf + * is updated. This makes sure the compat fields are updated too. + */ +#define UPDATE_COMPAT(buf) \ + if (buf->size < INT_MAX) buf->compat_size = buf->size; \ + else buf->compat_size = INT_MAX; \ + if (buf->use < INT_MAX) buf->compat_use = buf->use; \ + else buf->compat_use = INT_MAX; + +/* + * Macro for compatibility with xmlBuffer to be used in all the xmlBuf + * entry points, it checks that the compat fields have not been modified + * by direct call to xmlBuffer function from code compiled before 2.9.0 . + */ +#define CHECK_COMPAT(buf) \ + if (buf->size != (size_t) buf->compat_size) \ + if (buf->compat_size < INT_MAX) \ + buf->size = buf->compat_size; \ + if (buf->use != (size_t) buf->compat_use) \ + if (buf->compat_use < INT_MAX) \ + buf->use = buf->compat_use; + +#else /* ! WITH_BUFFER_COMPAT */ +#define UPDATE_COMPAT(buf) +#define CHECK_COMPAT(buf) +#endif /* WITH_BUFFER_COMPAT */ + +/** + * xmlBufMemoryError: + * @extra: extra informations + * + * Handle an out of memory condition + * To be improved... + */ +static void +xmlBufMemoryError(xmlBufPtr buf, const char *extra) +{ + __xmlSimpleError(XML_FROM_BUFFER, XML_ERR_NO_MEMORY, NULL, NULL, extra); + if ((buf) && (buf->error == 0)) + buf->error = XML_ERR_NO_MEMORY; +} + +/** + * xmlBufOverflowError: + * @extra: extra informations + * + * Handle a buffer overflow error + * To be improved... + */ +static void +xmlBufOverflowError(xmlBufPtr buf, const char *extra) +{ + __xmlSimpleError(XML_FROM_BUFFER, XML_BUF_OVERFLOW, NULL, NULL, extra); + if ((buf) && (buf->error == 0)) + buf->error = XML_BUF_OVERFLOW; +} + + +/** + * xmlBufCreate: + * + * routine to create an XML buffer. + * returns the new structure. + */ +xmlBufPtr +xmlBufCreate(void) { + xmlBufPtr ret; + + ret = (xmlBufPtr) xmlMalloc(sizeof(xmlBuf)); + if (ret == NULL) { + xmlBufMemoryError(NULL, "creating buffer"); + return(NULL); + } + ret->compat_use = 0; + ret->use = 0; + ret->error = 0; + ret->buffer = NULL; + ret->size = xmlDefaultBufferSize; + ret->compat_size = xmlDefaultBufferSize; + ret->alloc = xmlBufferAllocScheme; + ret->content = (xmlChar *) xmlMallocAtomic(ret->size * sizeof(xmlChar)); + if (ret->content == NULL) { + xmlBufMemoryError(ret, "creating buffer"); + xmlFree(ret); + return(NULL); + } + ret->content[0] = 0; + ret->contentIO = NULL; + return(ret); +} + +/** + * xmlBufCreateSize: + * @size: initial size of buffer + * + * routine to create an XML buffer. + * returns the new structure. + */ +xmlBufPtr +xmlBufCreateSize(size_t size) { + xmlBufPtr ret; + + ret = (xmlBufPtr) xmlMalloc(sizeof(xmlBuf)); + if (ret == NULL) { + xmlBufMemoryError(NULL, "creating buffer"); + return(NULL); + } + ret->compat_use = 0; + ret->use = 0; + ret->error = 0; + ret->buffer = NULL; + ret->alloc = xmlBufferAllocScheme; + ret->size = (size ? size+2 : 0); /* +1 for ending null */ + ret->compat_size = (int) ret->size; + if (ret->size){ + ret->content = (xmlChar *) xmlMallocAtomic(ret->size * sizeof(xmlChar)); + if (ret->content == NULL) { + xmlBufMemoryError(ret, "creating buffer"); + xmlFree(ret); + return(NULL); + } + ret->content[0] = 0; + } else + ret->content = NULL; + ret->contentIO = NULL; + return(ret); +} + +/** + * xmlBufDetach: + * @buf: the buffer + * + * Remove the string contained in a buffer and give it back to the + * caller. The buffer is reset to an empty content. + * This doesn't work with immutable buffers as they can't be reset. + * + * Returns the previous string contained by the buffer. + */ +xmlChar * +xmlBufDetach(xmlBufPtr buf) { + xmlChar *ret; + + if (buf == NULL) + return(NULL); + if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) + return(NULL); + if (buf->buffer != NULL) + return(NULL); + if (buf->error) + return(NULL); + + ret = buf->content; + buf->content = NULL; + buf->size = 0; + buf->use = 0; + buf->compat_use = 0; + buf->compat_size = 0; + + return ret; +} + + +/** + * xmlBufCreateStatic: + * @mem: the memory area + * @size: the size in byte + * + * routine to create an XML buffer from an immutable memory area. + * The area won't be modified nor copied, and is expected to be + * present until the end of the buffer lifetime. + * + * returns the new structure. + */ +xmlBufPtr +xmlBufCreateStatic(void *mem, size_t size) { + xmlBufPtr ret; + + if ((mem == NULL) || (size == 0)) + return(NULL); + + ret = (xmlBufPtr) xmlMalloc(sizeof(xmlBuf)); + if (ret == NULL) { + xmlBufMemoryError(NULL, "creating buffer"); + return(NULL); + } + if (size < INT_MAX) { + ret->compat_use = size; + ret->compat_size = size; + } else { + ret->compat_use = INT_MAX; + ret->compat_size = INT_MAX; + } + ret->use = size; + ret->size = size; + ret->alloc = XML_BUFFER_ALLOC_IMMUTABLE; + ret->content = (xmlChar *) mem; + ret->error = 0; + ret->buffer = NULL; + return(ret); +} + +/** + * xmlBufGetAllocationScheme: + * @buf: the buffer + * + * Get the buffer allocation scheme + * + * Returns the scheme or -1 in case of error + */ +int +xmlBufGetAllocationScheme(xmlBufPtr buf) { + if (buf == NULL) { +#ifdef DEBUG_BUFFER + xmlGenericError(xmlGenericErrorContext, + "xmlBufGetAllocationScheme: buf == NULL\n"); +#endif + return(-1); + } + return(buf->alloc); +} + +/** + * xmlBufSetAllocationScheme: + * @buf: the buffer to tune + * @scheme: allocation scheme to use + * + * Sets the allocation scheme for this buffer + * + * returns 0 in case of success and -1 in case of failure + */ +int +xmlBufSetAllocationScheme(xmlBufPtr buf, + xmlBufferAllocationScheme scheme) { + if ((buf == NULL) || (buf->error != 0)) { +#ifdef DEBUG_BUFFER + xmlGenericError(xmlGenericErrorContext, + "xmlBufSetAllocationScheme: buf == NULL or in error\n"); +#endif + return(-1); + } + if ((buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) || + (buf->alloc == XML_BUFFER_ALLOC_IO)) + return(-1); + if ((scheme == XML_BUFFER_ALLOC_DOUBLEIT) || + (scheme == XML_BUFFER_ALLOC_EXACT) || + (scheme == XML_BUFFER_ALLOC_HYBRID) || + (scheme == XML_BUFFER_ALLOC_IMMUTABLE)) { + buf->alloc = scheme; + if (buf->buffer) + buf->buffer->alloc = scheme; + return(0); + } + /* + * Switching a buffer ALLOC_IO has the side effect of initializing + * the contentIO field with the current content + */ + if (scheme == XML_BUFFER_ALLOC_IO) { + buf->alloc = XML_BUFFER_ALLOC_IO; + buf->contentIO = buf->content; + } + return(-1); +} + +/** + * xmlBufFree: + * @buf: the buffer to free + * + * Frees an XML buffer. It frees both the content and the structure which + * encapsulate it. + */ +void +xmlBufFree(xmlBufPtr buf) { + if (buf == NULL) { +#ifdef DEBUG_BUFFER + xmlGenericError(xmlGenericErrorContext, + "xmlBufFree: buf == NULL\n"); +#endif + return; + } + + if ((buf->alloc == XML_BUFFER_ALLOC_IO) && + (buf->contentIO != NULL)) { + xmlFree(buf->contentIO); + } else if ((buf->content != NULL) && + (buf->alloc != XML_BUFFER_ALLOC_IMMUTABLE)) { + xmlFree(buf->content); + } + xmlFree(buf); +} + +/** + * xmlBufEmpty: + * @buf: the buffer + * + * empty a buffer. + */ +void +xmlBufEmpty(xmlBufPtr buf) { + if ((buf == NULL) || (buf->error != 0)) return; + if (buf->content == NULL) return; + CHECK_COMPAT(buf) + buf->use = 0; + if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) { + buf->content = BAD_CAST ""; + } else if ((buf->alloc == XML_BUFFER_ALLOC_IO) && + (buf->contentIO != NULL)) { + size_t start_buf = buf->content - buf->contentIO; + + buf->size += start_buf; + buf->content = buf->contentIO; + buf->content[0] = 0; + } else { + buf->content[0] = 0; + } + UPDATE_COMPAT(buf) +} + +/** + * xmlBufShrink: + * @buf: the buffer to dump + * @len: the number of xmlChar to remove + * + * Remove the beginning of an XML buffer. + * NOTE that this routine behaviour differs from xmlBufferShrink() + * as it will return 0 on error instead of -1 due to size_t being + * used as the return type. + * + * Returns the number of byte removed or 0 in case of failure + */ +size_t +xmlBufShrink(xmlBufPtr buf, size_t len) { + if ((buf == NULL) || (buf->error != 0)) return(0); + CHECK_COMPAT(buf) + if (len == 0) return(0); + if (len > buf->use) return(0); + + buf->use -= len; + if ((buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) || + ((buf->alloc == XML_BUFFER_ALLOC_IO) && (buf->contentIO != NULL))) { + /* + * we just move the content pointer, but also make sure + * the perceived buffer size has shrinked accordingly + */ + buf->content += len; + buf->size -= len; + + /* + * sometimes though it maybe be better to really shrink + * on IO buffers + */ + if ((buf->alloc == XML_BUFFER_ALLOC_IO) && (buf->contentIO != NULL)) { + size_t start_buf = buf->content - buf->contentIO; + if (start_buf >= buf->size) { + memmove(buf->contentIO, &buf->content[0], buf->use); + buf->content = buf->contentIO; + buf->content[buf->use] = 0; + buf->size += start_buf; + } + } + } else { + memmove(buf->content, &buf->content[len], buf->use); + buf->content[buf->use] = 0; + } + UPDATE_COMPAT(buf) + return(len); +} + +/** + * xmlBufGrowInternal: + * @buf: the buffer + * @len: the minimum free size to allocate + * + * Grow the available space of an XML buffer, @len is the target value + * Error checking should be done on buf->error since using the return + * value doesn't work that well + * + * Returns 0 in case of error or the length made available otherwise + */ +static size_t +xmlBufGrowInternal(xmlBufPtr buf, size_t len) { + size_t size; + xmlChar *newbuf; + + if ((buf == NULL) || (buf->error != 0)) return(0); + CHECK_COMPAT(buf) + + if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return(0); + if (buf->use + len < buf->size) + return(buf->size - buf->use); + + /* + * Windows has a BIG problem on realloc timing, so we try to double + * the buffer size (if that's enough) (bug 146697) + * Apparently BSD too, and it's probably best for linux too + * On an embedded system this may be something to change + */ +#if 1 + if (buf->size > (size_t) len) + size = buf->size * 2; + else + size = buf->use + len + 100; +#else + size = buf->use + len + 100; +#endif + + if ((buf->alloc == XML_BUFFER_ALLOC_IO) && (buf->contentIO != NULL)) { + size_t start_buf = buf->content - buf->contentIO; + + newbuf = (xmlChar *) xmlRealloc(buf->contentIO, start_buf + size); + if (newbuf == NULL) { + xmlBufMemoryError(buf, "growing buffer"); + return(0); + } + buf->contentIO = newbuf; + buf->content = newbuf + start_buf; + } else { + newbuf = (xmlChar *) xmlRealloc(buf->content, size); + if (newbuf == NULL) { + xmlBufMemoryError(buf, "growing buffer"); + return(0); + } + buf->content = newbuf; + } + buf->size = size; + UPDATE_COMPAT(buf) + return(buf->size - buf->use); +} + +/** + * xmlBufGrow: + * @buf: the buffer + * @len: the minimum free size to allocate + * + * Grow the available space of an XML buffer, @len is the target value + * This is been kept compatible with xmlBufferGrow() as much as possible + * + * Returns -1 in case of error or the length made available otherwise + */ +int +xmlBufGrow(xmlBufPtr buf, int len) { + size_t ret; + + if ((buf == NULL) || (len < 0)) return(-1); + if (len == 0) + return(0); + ret = xmlBufGrowInternal(buf, len); + if (buf->error != 0) + return(-1); + return((int) ret); +} + +/** + * xmlBufInflate: + * @buf: the buffer + * @len: the minimum extra free size to allocate + * + * Grow the available space of an XML buffer, adding at least @len bytes + * + * Returns 0 if successful or -1 in case of error + */ +int +xmlBufInflate(xmlBufPtr buf, size_t len) { + if (buf == NULL) return(-1); + xmlBufGrowInternal(buf, len + buf->size); + if (buf->error) + return(-1); + return(0); +} + +/** + * xmlBufDump: + * @file: the file output + * @buf: the buffer to dump + * + * Dumps an XML buffer to a FILE *. + * Returns the number of #xmlChar written + */ +size_t +xmlBufDump(FILE *file, xmlBufPtr buf) { + size_t ret; + + if ((buf == NULL) || (buf->error != 0)) { +#ifdef DEBUG_BUFFER + xmlGenericError(xmlGenericErrorContext, + "xmlBufDump: buf == NULL or in error\n"); +#endif + return(0); + } + if (buf->content == NULL) { +#ifdef DEBUG_BUFFER + xmlGenericError(xmlGenericErrorContext, + "xmlBufDump: buf->content == NULL\n"); +#endif + return(0); + } + CHECK_COMPAT(buf) + if (file == NULL) + file = stdout; + ret = fwrite(buf->content, sizeof(xmlChar), buf->use, file); + return(ret); +} + +/** + * xmlBufContent: + * @buf: the buffer + * + * Function to extract the content of a buffer + * + * Returns the internal content + */ + +xmlChar * +xmlBufContent(const xmlBufPtr buf) +{ + if ((!buf) || (buf->error)) + return NULL; + + return(buf->content); +} + +/** + * xmlBufEnd: + * @buf: the buffer + * + * Function to extract the end of the content of a buffer + * + * Returns the end of the internal content or NULL in case of error + */ + +xmlChar * +xmlBufEnd(const xmlBufPtr buf) +{ + if ((!buf) || (buf->error)) + return NULL; + CHECK_COMPAT(buf) + + return(&buf->content[buf->use]); +} + +/** + * xmlBufAddLen: + * @buf: the buffer + * @len: the size which were added at the end + * + * Sometime data may be added at the end of the buffer without + * using the xmlBuf APIs that is used to expand the used space + * and set the zero terminating at the end of the buffer + * + * Returns -1 in case of error and 0 otherwise + */ +int +xmlBufAddLen(xmlBufPtr buf, size_t len) { + if ((buf == NULL) || (buf->error)) + return(-1); + CHECK_COMPAT(buf) + if (len > (buf->size - buf->use)) + return(-1); + buf->use += len; + UPDATE_COMPAT(buf) + if (buf->size > buf->use) + buf->content[buf->use] = 0; + else + return(-1); + return(0); +} + +/** + * xmlBufErase: + * @buf: the buffer + * @len: the size to erase at the end + * + * Sometime data need to be erased at the end of the buffer + * + * Returns -1 in case of error and 0 otherwise + */ +int +xmlBufErase(xmlBufPtr buf, size_t len) { + if ((buf == NULL) || (buf->error)) + return(-1); + CHECK_COMPAT(buf) + if (len > buf->use) + return(-1); + buf->use -= len; + buf->content[buf->use] = 0; + UPDATE_COMPAT(buf) + return(0); +} + +/** + * xmlBufLength: + * @buf: the buffer + * + * Function to get the length of a buffer + * + * Returns the length of data in the internal content + */ + +size_t +xmlBufLength(const xmlBufPtr buf) +{ + if ((!buf) || (buf->error)) + return 0; + CHECK_COMPAT(buf) + + return(buf->use); +} + +/** + * xmlBufUse: + * @buf: the buffer + * + * Function to get the length of a buffer + * + * Returns the length of data in the internal content + */ + +size_t +xmlBufUse(const xmlBufPtr buf) +{ + if ((!buf) || (buf->error)) + return 0; + CHECK_COMPAT(buf) + + return(buf->use); +} + +/** + * xmlBufAvail: + * @buf: the buffer + * + * Function to find how much free space is allocated but not + * used in the buffer. It does not account for the terminating zero + * usually needed + * + * Returns the amount or 0 if none or an error occured + */ + +size_t +xmlBufAvail(const xmlBufPtr buf) +{ + if ((!buf) || (buf->error)) + return 0; + CHECK_COMPAT(buf) + + return(buf->size - buf->use); +} + +/** + * xmlBufIsEmpty: + * @buf: the buffer + * + * Tell if a buffer is empty + * + * Returns 0 if no, 1 if yes and -1 in case of error + */ +int +xmlBufIsEmpty(const xmlBufPtr buf) +{ + if ((!buf) || (buf->error)) + return(-1); + CHECK_COMPAT(buf) + + return(buf->use == 0); +} + +/** + * xmlBufResize: + * @buf: the buffer to resize + * @size: the desired size + * + * Resize a buffer to accommodate minimum size of @size. + * + * Returns 0 in case of problems, 1 otherwise + */ +int +xmlBufResize(xmlBufPtr buf, size_t size) +{ + unsigned int newSize; + xmlChar* rebuf = NULL; + size_t start_buf; + + if ((buf == NULL) || (buf->error)) + return(0); + CHECK_COMPAT(buf) + + if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return(0); + + /* Don't resize if we don't have to */ + if (size < buf->size) + return 1; + + /* figure out new size */ + switch (buf->alloc){ + case XML_BUFFER_ALLOC_IO: + case XML_BUFFER_ALLOC_DOUBLEIT: + /*take care of empty case*/ + newSize = (buf->size ? buf->size*2 : size + 10); + while (size > newSize) { + if (newSize > UINT_MAX / 2) { + xmlBufMemoryError(buf, "growing buffer"); + return 0; + } + newSize *= 2; + } + break; + case XML_BUFFER_ALLOC_EXACT: + newSize = size+10; + break; + case XML_BUFFER_ALLOC_HYBRID: + if (buf->use < BASE_BUFFER_SIZE) + newSize = size; + else { + newSize = buf->size * 2; + while (size > newSize) { + if (newSize > UINT_MAX / 2) { + xmlBufMemoryError(buf, "growing buffer"); + return 0; + } + newSize *= 2; + } + } + break; + + default: + newSize = size+10; + break; + } + + if ((buf->alloc == XML_BUFFER_ALLOC_IO) && (buf->contentIO != NULL)) { + start_buf = buf->content - buf->contentIO; + + if (start_buf > newSize) { + /* move data back to start */ + memmove(buf->contentIO, buf->content, buf->use); + buf->content = buf->contentIO; + buf->content[buf->use] = 0; + buf->size += start_buf; + } else { + rebuf = (xmlChar *) xmlRealloc(buf->contentIO, start_buf + newSize); + if (rebuf == NULL) { + xmlBufMemoryError(buf, "growing buffer"); + return 0; + } + buf->contentIO = rebuf; + buf->content = rebuf + start_buf; + } + } else { + if (buf->content == NULL) { + rebuf = (xmlChar *) xmlMallocAtomic(newSize); + } else if (buf->size - buf->use < 100) { + rebuf = (xmlChar *) xmlRealloc(buf->content, newSize); + } else { + /* + * if we are reallocating a buffer far from being full, it's + * better to make a new allocation and copy only the used range + * and free the old one. + */ + rebuf = (xmlChar *) xmlMallocAtomic(newSize); + if (rebuf != NULL) { + memcpy(rebuf, buf->content, buf->use); + xmlFree(buf->content); + rebuf[buf->use] = 0; + } + } + if (rebuf == NULL) { + xmlBufMemoryError(buf, "growing buffer"); + return 0; + } + buf->content = rebuf; + } + buf->size = newSize; + UPDATE_COMPAT(buf) + + return 1; +} + +/** + * xmlBufAdd: + * @buf: the buffer to dump + * @str: the #xmlChar string + * @len: the number of #xmlChar to add + * + * Add a string range to an XML buffer. if len == -1, the length of + * str is recomputed. + * + * Returns 0 successful, a positive error code number otherwise + * and -1 in case of internal or API error. + */ +int +xmlBufAdd(xmlBufPtr buf, const xmlChar *str, int len) { + unsigned int needSize; + + if ((str == NULL) || (buf == NULL) || (buf->error)) + return -1; + CHECK_COMPAT(buf) + + if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return -1; + if (len < -1) { +#ifdef DEBUG_BUFFER + xmlGenericError(xmlGenericErrorContext, + "xmlBufAdd: len < 0\n"); +#endif + return -1; + } + if (len == 0) return 0; + + if (len < 0) + len = xmlStrlen(str); + + if (len < 0) return -1; + if (len == 0) return 0; + + needSize = buf->use + len + 2; + if (needSize > buf->size){ + if (!xmlBufResize(buf, needSize)){ + xmlBufMemoryError(buf, "growing buffer"); + return XML_ERR_NO_MEMORY; + } + } + + memmove(&buf->content[buf->use], str, len*sizeof(xmlChar)); + buf->use += len; + buf->content[buf->use] = 0; + UPDATE_COMPAT(buf) + return 0; +} + +/** + * xmlBufAddHead: + * @buf: the buffer + * @str: the #xmlChar string + * @len: the number of #xmlChar to add + * + * Add a string range to the beginning of an XML buffer. + * if len == -1, the length of @str is recomputed. + * + * Returns 0 successful, a positive error code number otherwise + * and -1 in case of internal or API error. + */ +int +xmlBufAddHead(xmlBufPtr buf, const xmlChar *str, int len) { + unsigned int needSize; + + if ((buf == NULL) || (buf->error)) + return(-1); + CHECK_COMPAT(buf) + if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return -1; + if (str == NULL) { +#ifdef DEBUG_BUFFER + xmlGenericError(xmlGenericErrorContext, + "xmlBufAddHead: str == NULL\n"); +#endif + return -1; + } + if (len < -1) { +#ifdef DEBUG_BUFFER + xmlGenericError(xmlGenericErrorContext, + "xmlBufAddHead: len < 0\n"); +#endif + return -1; + } + if (len == 0) return 0; + + if (len < 0) + len = xmlStrlen(str); + + if (len <= 0) return -1; + + if ((buf->alloc == XML_BUFFER_ALLOC_IO) && (buf->contentIO != NULL)) { + size_t start_buf = buf->content - buf->contentIO; + + if (start_buf > (unsigned int) len) { + /* + * We can add it in the space previously shrinked + */ + buf->content -= len; + memmove(&buf->content[0], str, len); + buf->use += len; + buf->size += len; + UPDATE_COMPAT(buf) + return(0); + } + } + needSize = buf->use + len + 2; + if (needSize > buf->size){ + if (!xmlBufResize(buf, needSize)){ + xmlBufMemoryError(buf, "growing buffer"); + return XML_ERR_NO_MEMORY; + } + } + + memmove(&buf->content[len], &buf->content[0], buf->use); + memmove(&buf->content[0], str, len); + buf->use += len; + buf->content[buf->use] = 0; + UPDATE_COMPAT(buf) + return 0; +} + +/** + * xmlBufCat: + * @buf: the buffer to add to + * @str: the #xmlChar string + * + * Append a zero terminated string to an XML buffer. + * + * Returns 0 successful, a positive error code number otherwise + * and -1 in case of internal or API error. + */ +int +xmlBufCat(xmlBufPtr buf, const xmlChar *str) { + if ((buf == NULL) || (buf->error)) + return(-1); + CHECK_COMPAT(buf) + if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return -1; + if (str == NULL) return -1; + return xmlBufAdd(buf, str, -1); +} + +/** + * xmlBufCCat: + * @buf: the buffer to dump + * @str: the C char string + * + * Append a zero terminated C string to an XML buffer. + * + * Returns 0 successful, a positive error code number otherwise + * and -1 in case of internal or API error. + */ +int +xmlBufCCat(xmlBufPtr buf, const char *str) { + const char *cur; + + if ((buf == NULL) || (buf->error)) + return(-1); + CHECK_COMPAT(buf) + if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return -1; + if (str == NULL) { +#ifdef DEBUG_BUFFER + xmlGenericError(xmlGenericErrorContext, + "xmlBufCCat: str == NULL\n"); +#endif + return -1; + } + for (cur = str;*cur != 0;cur++) { + if (buf->use + 10 >= buf->size) { + if (!xmlBufResize(buf, buf->use+10)){ + xmlBufMemoryError(buf, "growing buffer"); + return XML_ERR_NO_MEMORY; + } + } + buf->content[buf->use++] = *cur; + } + buf->content[buf->use] = 0; + UPDATE_COMPAT(buf) + return 0; +} + +/** + * xmlBufWriteCHAR: + * @buf: the XML buffer + * @string: the string to add + * + * routine which manages and grows an output buffer. This one adds + * xmlChars at the end of the buffer. + * + * Returns 0 if successful, a positive error code number otherwise + * and -1 in case of internal or API error. + */ +int +xmlBufWriteCHAR(xmlBufPtr buf, const xmlChar *string) { + if ((buf == NULL) || (buf->error)) + return(-1); + CHECK_COMPAT(buf) + if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) + return(-1); + return(xmlBufCat(buf, string)); +} + +/** + * xmlBufWriteChar: + * @buf: the XML buffer output + * @string: the string to add + * + * routine which manage and grows an output buffer. This one add + * C chars at the end of the array. + * + * Returns 0 if successful, a positive error code number otherwise + * and -1 in case of internal or API error. + */ +int +xmlBufWriteChar(xmlBufPtr buf, const char *string) { + if ((buf == NULL) || (buf->error)) + return(-1); + CHECK_COMPAT(buf) + if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) + return(-1); + return(xmlBufCCat(buf, string)); +} + + +/** + * xmlBufWriteQuotedString: + * @buf: the XML buffer output + * @string: the string to add + * + * routine which manage and grows an output buffer. This one writes + * a quoted or double quoted #xmlChar string, checking first if it holds + * quote or double-quotes internally + * + * Returns 0 if successful, a positive error code number otherwise + * and -1 in case of internal or API error. + */ +int +xmlBufWriteQuotedString(xmlBufPtr buf, const xmlChar *string) { + const xmlChar *cur, *base; + if ((buf == NULL) || (buf->error)) + return(-1); + CHECK_COMPAT(buf) + if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) + return(-1); + if (xmlStrchr(string, '\"')) { + if (xmlStrchr(string, '\'')) { +#ifdef DEBUG_BUFFER + xmlGenericError(xmlGenericErrorContext, + "xmlBufWriteQuotedString: string contains quote and double-quotes !\n"); +#endif + xmlBufCCat(buf, "\""); + base = cur = string; + while(*cur != 0){ + if(*cur == '"'){ + if (base != cur) + xmlBufAdd(buf, base, cur - base); + xmlBufAdd(buf, BAD_CAST """, 6); + cur++; + base = cur; + } + else { + cur++; + } + } + if (base != cur) + xmlBufAdd(buf, base, cur - base); + xmlBufCCat(buf, "\""); + } + else{ + xmlBufCCat(buf, "\'"); + xmlBufCat(buf, string); + xmlBufCCat(buf, "\'"); + } + } else { + xmlBufCCat(buf, "\""); + xmlBufCat(buf, string); + xmlBufCCat(buf, "\""); + } + return(0); +} + +/** + * xmlBufFromBuffer: + * @buffer: incoming old buffer to convert to a new one + * + * Helper routine to switch from the old buffer structures in use + * in various APIs. It creates a wrapper xmlBufPtr which will be + * used for internal processing until the xmlBufBackToBuffer() is + * issued. + * + * Returns a new xmlBufPtr unless the call failed and NULL is returned + */ +xmlBufPtr +xmlBufFromBuffer(xmlBufferPtr buffer) { + xmlBufPtr ret; + + if (buffer == NULL) + return(NULL); + + ret = (xmlBufPtr) xmlMalloc(sizeof(xmlBuf)); + if (ret == NULL) { + xmlBufMemoryError(NULL, "creating buffer"); + return(NULL); + } + ret->use = buffer->use; + ret->size = buffer->size; + ret->compat_use = buffer->use; + ret->compat_size = buffer->size; + ret->error = 0; + ret->buffer = buffer; + ret->alloc = buffer->alloc; + ret->content = buffer->content; + ret->contentIO = buffer->contentIO; + + return(ret); +} + +/** + * xmlBufBackToBuffer: + * @buf: new buffer wrapping the old one + * + * Function to be called once internal processing had been done to + * update back the buffer provided by the user. This can lead to + * a failure in case the size accumulated in the xmlBuf is larger + * than what an xmlBuffer can support on 64 bits (INT_MAX) + * The xmlBufPtr @buf wrapper is deallocated by this call in any case. + * + * Returns the old xmlBufferPtr unless the call failed and NULL is returned + */ +xmlBufferPtr +xmlBufBackToBuffer(xmlBufPtr buf) { + xmlBufferPtr ret; + + if ((buf == NULL) || (buf->error)) + return(NULL); + CHECK_COMPAT(buf) + if (buf->buffer == NULL) { + xmlBufFree(buf); + return(NULL); + } + + ret = buf->buffer; + /* + * What to do in case of error in the buffer ??? + */ + if (buf->use > INT_MAX) { + /* + * Worse case, we really allocated and used more than the + * maximum allowed memory for an xmlBuffer on this architecture. + * Keep the buffer but provide a truncated size value. + */ + xmlBufOverflowError(buf, "Used size too big for xmlBuffer"); + ret->use = INT_MAX; + ret->size = INT_MAX; + } else if (buf->size > INT_MAX) { + /* + * milder case, we allocated more than the maximum allowed memory + * for an xmlBuffer on this architecture, but used less than the + * limit. + * Keep the buffer but provide a truncated size value. + */ + xmlBufOverflowError(buf, "Allocated size too big for xmlBuffer"); + ret->size = INT_MAX; + } + ret->use = (int) buf->use; + ret->size = (int) buf->size; + ret->alloc = buf->alloc; + ret->content = buf->content; + ret->contentIO = buf->contentIO; + xmlFree(buf); + return(ret); +} + +/** + * xmlBufMergeBuffer: + * @buf: an xmlBufPtr + * @buffer: the buffer to consume into @buf + * + * The content of @buffer is appended to @buf and @buffer is freed + * + * Returns -1 in case of error, 0 otherwise, in any case @buffer is freed + */ +int +xmlBufMergeBuffer(xmlBufPtr buf, xmlBufferPtr buffer) { + int ret = 0; + + if ((buf == NULL) || (buf->error)) { + xmlBufferFree(buffer); + return(-1); + } + CHECK_COMPAT(buf) + if ((buffer != NULL) && (buffer->content != NULL) && + (buffer->use > 0)) { + ret = xmlBufAdd(buf, buffer->content, buffer->use); + } + xmlBufferFree(buffer); + return(ret); +} + +/** + * xmlBufResetInput: + * @buf: an xmlBufPtr + * @input: an xmlParserInputPtr + * + * Update the input to use the current set of pointers from the buffer. + * + * Returns -1 in case of error, 0 otherwise + */ +int +xmlBufResetInput(xmlBufPtr buf, xmlParserInputPtr input) { + if ((input == NULL) || (buf == NULL) || (buf->error)) + return(-1); + CHECK_COMPAT(buf) + input->base = input->cur = buf->content; + input->end = &buf->content[buf->use]; + return(0); +} + +/** + * xmlBufGetInputBase: + * @buf: an xmlBufPtr + * @input: an xmlParserInputPtr + * + * Get the base of the @input relative to the beginning of the buffer + * + * Returns the size_t corresponding to the displacement + */ +size_t +xmlBufGetInputBase(xmlBufPtr buf, xmlParserInputPtr input) { + size_t base; + + if ((input == NULL) || (buf == NULL) || (buf->error)) + return(-1); + CHECK_COMPAT(buf) + base = input->base - buf->content; + /* + * We could do some pointer arythmetic checks but that's probably + * sufficient. + */ + if (base > buf->size) { + xmlBufOverflowError(buf, "Input reference outside of the buffer"); + base = 0; + } + return(base); +} + +/** + * xmlBufSetInputBaseCur: + * @buf: an xmlBufPtr + * @input: an xmlParserInputPtr + * @base: the base value relative to the beginning of the buffer + * @cur: the cur value relative to the beginning of the buffer + * + * Update the input to use the base and cur relative to the buffer + * after a possible reallocation of its content + * + * Returns -1 in case of error, 0 otherwise + */ +int +xmlBufSetInputBaseCur(xmlBufPtr buf, xmlParserInputPtr input, + size_t base, size_t cur) { + if ((input == NULL) || (buf == NULL) || (buf->error)) + return(-1); + CHECK_COMPAT(buf) + input->base = &buf->content[base]; + input->cur = input->base + cur; + input->end = &buf->content[buf->use]; + return(0); +} + +#define bottom_buf +#include "elfgcchack.h" diff --git a/vendors/libxml/src/buf.h b/vendors/libxml/src/buf.h new file mode 100644 index 0000000..e8c7715 --- /dev/null +++ b/vendors/libxml/src/buf.h @@ -0,0 +1,72 @@ +/* + * Summary: Internal Interfaces for memory buffers in libxml2 + * Description: this module describes most of the new xmlBuf buffer + * entry points, those are private routines, with a + * few exceptions exported in tree.h. This was added + * in 2.9.0. + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_BUF_H__ +#define __XML_BUF_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +xmlBufPtr xmlBufCreate(void); +xmlBufPtr xmlBufCreateSize(size_t size); +xmlBufPtr xmlBufCreateStatic(void *mem, size_t size); + +int xmlBufSetAllocationScheme(xmlBufPtr buf, + xmlBufferAllocationScheme scheme); +int xmlBufGetAllocationScheme(xmlBufPtr buf); + +void xmlBufFree(xmlBufPtr buf); +void xmlBufEmpty(xmlBufPtr buf); + +/* size_t xmlBufShrink(xmlBufPtr buf, size_t len); */ +int xmlBufGrow(xmlBufPtr buf, int len); +int xmlBufInflate(xmlBufPtr buf, size_t len); +int xmlBufResize(xmlBufPtr buf, size_t len); + +int xmlBufAdd(xmlBufPtr buf, const xmlChar *str, int len); +int xmlBufAddHead(xmlBufPtr buf, const xmlChar *str, int len); +int xmlBufCat(xmlBufPtr buf, const xmlChar *str); +int xmlBufCCat(xmlBufPtr buf, const char *str); +int xmlBufWriteCHAR(xmlBufPtr buf, const xmlChar *string); +int xmlBufWriteChar(xmlBufPtr buf, const char *string); +int xmlBufWriteQuotedString(xmlBufPtr buf, const xmlChar *string); + +size_t xmlBufAvail(const xmlBufPtr buf); +size_t xmlBufLength(const xmlBufPtr buf); +/* size_t xmlBufUse(const xmlBufPtr buf); */ +int xmlBufIsEmpty(const xmlBufPtr buf); +int xmlBufAddLen(xmlBufPtr buf, size_t len); +int xmlBufErase(xmlBufPtr buf, size_t len); + +/* const xmlChar * xmlBufContent(const xmlBufPtr buf); */ +/* const xmlChar * xmlBufEnd(const xmlBufPtr buf); */ + +xmlChar * xmlBufDetach(xmlBufPtr buf); + +size_t xmlBufDump(FILE *file, xmlBufPtr buf); + +xmlBufPtr xmlBufFromBuffer(xmlBufferPtr buffer); +xmlBufferPtr xmlBufBackToBuffer(xmlBufPtr buf); +int xmlBufMergeBuffer(xmlBufPtr buf, xmlBufferPtr buffer); + +int xmlBufResetInput(xmlBufPtr buf, xmlParserInputPtr input); +size_t xmlBufGetInputBase(xmlBufPtr buf, xmlParserInputPtr input); +int xmlBufSetInputBaseCur(xmlBufPtr buf, xmlParserInputPtr input, + size_t base, size_t cur); +#ifdef __cplusplus +} +#endif +#endif /* __XML_BUF_H__ */ + diff --git a/vendors/libxml/src/c14n.c b/vendors/libxml/src/c14n.c new file mode 100644 index 0000000..afd95b3 --- /dev/null +++ b/vendors/libxml/src/c14n.c @@ -0,0 +1,2237 @@ +/* + * "Canonical XML" implementation + * http://www.w3.org/TR/xml-c14n + * + * "Exclusive XML Canonicalization" implementation + * http://www.w3.org/TR/xml-exc-c14n + * + * See Copyright for the status of this software. + * + * Author: Aleksey Sanin + */ +#define IN_LIBXML +#include "libxml.h" +#ifdef LIBXML_C14N_ENABLED +#ifdef LIBXML_OUTPUT_ENABLED + +#ifdef HAVE_STDLIB_H +#include +#endif +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "buf.h" + +/************************************************************************ + * * + * Some declaration better left private ATM * + * * + ************************************************************************/ + +typedef enum { + XMLC14N_BEFORE_DOCUMENT_ELEMENT = 0, + XMLC14N_INSIDE_DOCUMENT_ELEMENT = 1, + XMLC14N_AFTER_DOCUMENT_ELEMENT = 2 +} xmlC14NPosition; + +typedef struct _xmlC14NVisibleNsStack { + int nsCurEnd; /* number of nodes in the set */ + int nsPrevStart; /* the begginning of the stack for previous visible node */ + int nsPrevEnd; /* the end of the stack for previous visible node */ + int nsMax; /* size of the array as allocated */ + xmlNsPtr *nsTab; /* array of ns in no particular order */ + xmlNodePtr *nodeTab; /* array of nodes in no particular order */ +} xmlC14NVisibleNsStack, *xmlC14NVisibleNsStackPtr; + +typedef struct _xmlC14NCtx { + /* input parameters */ + xmlDocPtr doc; + xmlC14NIsVisibleCallback is_visible_callback; + void* user_data; + int with_comments; + xmlOutputBufferPtr buf; + + /* position in the XML document */ + xmlC14NPosition pos; + int parent_is_doc; + xmlC14NVisibleNsStackPtr ns_rendered; + + /* C14N mode */ + xmlC14NMode mode; + + /* exclusive canonicalization */ + xmlChar **inclusive_ns_prefixes; + + /* error number */ + int error; +} xmlC14NCtx, *xmlC14NCtxPtr; + +static xmlC14NVisibleNsStackPtr xmlC14NVisibleNsStackCreate (void); +static void xmlC14NVisibleNsStackDestroy (xmlC14NVisibleNsStackPtr cur); +static void xmlC14NVisibleNsStackAdd (xmlC14NVisibleNsStackPtr cur, + xmlNsPtr ns, + xmlNodePtr node); +static void xmlC14NVisibleNsStackSave (xmlC14NVisibleNsStackPtr cur, + xmlC14NVisibleNsStackPtr state); +static void xmlC14NVisibleNsStackRestore (xmlC14NVisibleNsStackPtr cur, + xmlC14NVisibleNsStackPtr state); +static void xmlC14NVisibleNsStackShift (xmlC14NVisibleNsStackPtr cur); +static int xmlC14NVisibleNsStackFind (xmlC14NVisibleNsStackPtr cur, + xmlNsPtr ns); +static int xmlExcC14NVisibleNsStackFind (xmlC14NVisibleNsStackPtr cur, + xmlNsPtr ns, + xmlC14NCtxPtr ctx); + +static int xmlC14NIsNodeInNodeset (xmlNodeSetPtr nodes, + xmlNodePtr node, + xmlNodePtr parent); + + + +static int xmlC14NProcessNode(xmlC14NCtxPtr ctx, xmlNodePtr cur); +static int xmlC14NProcessNodeList(xmlC14NCtxPtr ctx, xmlNodePtr cur); +typedef enum { + XMLC14N_NORMALIZE_ATTR = 0, + XMLC14N_NORMALIZE_COMMENT = 1, + XMLC14N_NORMALIZE_PI = 2, + XMLC14N_NORMALIZE_TEXT = 3 +} xmlC14NNormalizationMode; + +static xmlChar *xmlC11NNormalizeString(const xmlChar * input, + xmlC14NNormalizationMode mode); + +#define xmlC11NNormalizeAttr( a ) \ + xmlC11NNormalizeString((a), XMLC14N_NORMALIZE_ATTR) +#define xmlC11NNormalizeComment( a ) \ + xmlC11NNormalizeString((a), XMLC14N_NORMALIZE_COMMENT) +#define xmlC11NNormalizePI( a ) \ + xmlC11NNormalizeString((a), XMLC14N_NORMALIZE_PI) +#define xmlC11NNormalizeText( a ) \ + xmlC11NNormalizeString((a), XMLC14N_NORMALIZE_TEXT) + +#define xmlC14NIsVisible( ctx, node, parent ) \ + (((ctx)->is_visible_callback != NULL) ? \ + (ctx)->is_visible_callback((ctx)->user_data, \ + (xmlNodePtr)(node), (xmlNodePtr)(parent)) : 1) + +#define xmlC14NIsExclusive( ctx ) \ + ( (ctx)->mode == XML_C14N_EXCLUSIVE_1_0 ) + +/************************************************************************ + * * + * Some factorized error routines * + * * + ************************************************************************/ + +/** + * xmlC14NErrMemory: + * @extra: extra informations + * + * Handle a redefinition of memory error + */ +static void +xmlC14NErrMemory(const char *extra) +{ + __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_C14N, + XML_ERR_NO_MEMORY, XML_ERR_ERROR, NULL, 0, extra, + NULL, NULL, 0, 0, + "Memory allocation failed : %s\n", extra); +} + +/** + * xmlC14NErrParam: + * @extra: extra informations + * + * Handle a redefinition of param error + */ +static void +xmlC14NErrParam(const char *extra) +{ + __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_C14N, + XML_ERR_INTERNAL_ERROR, XML_ERR_ERROR, NULL, 0, extra, + NULL, NULL, 0, 0, + "Invalid parameter : %s\n", extra); +} + +/** + * xmlC14NErrInternal: + * @extra: extra informations + * + * Handle a redefinition of internal error + */ +static void +xmlC14NErrInternal(const char *extra) +{ + __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_C14N, + XML_ERR_INTERNAL_ERROR, XML_ERR_ERROR, NULL, 0, extra, + NULL, NULL, 0, 0, + "Internal error : %s\n", extra); +} + +/** + * xmlC14NErrInvalidNode: + * @extra: extra informations + * + * Handle a redefinition of invalid node error + */ +static void +xmlC14NErrInvalidNode(const char *node_type, const char *extra) +{ + __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_C14N, + XML_C14N_INVALID_NODE, XML_ERR_ERROR, NULL, 0, extra, + NULL, NULL, 0, 0, + "Node %s is invalid here : %s\n", node_type, extra); +} + +/** + * xmlC14NErrUnknownNode: + * @extra: extra informations + * + * Handle a redefinition of unknown node error + */ +static void +xmlC14NErrUnknownNode(int node_type, const char *extra) +{ + __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_C14N, + XML_C14N_UNKNOW_NODE, XML_ERR_ERROR, NULL, 0, extra, + NULL, NULL, 0, 0, + "Unknown node type %d found : %s\n", node_type, extra); +} + +/** + * xmlC14NErrRelativeNamespace: + * @extra: extra informations + * + * Handle a redefinition of relative namespace error + */ +static void +xmlC14NErrRelativeNamespace(const char *ns_uri) +{ + __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_C14N, + XML_C14N_RELATIVE_NAMESPACE, XML_ERR_ERROR, NULL, 0, NULL, + NULL, NULL, 0, 0, + "Relative namespace UR is invalid here : %s\n", ns_uri); +} + + + +/** + * xmlC14NErr: + * @ctxt: a C14N evaluation context + * @node: the context node + * @error: the erorr code + * @msg: the message + * @extra: extra informations + * + * Handle a redefinition of attribute error + */ +static void +xmlC14NErr(xmlC14NCtxPtr ctxt, xmlNodePtr node, int error, + const char * msg) +{ + if (ctxt != NULL) + ctxt->error = error; + __xmlRaiseError(NULL, NULL, NULL, + ctxt, node, XML_FROM_C14N, error, + XML_ERR_ERROR, NULL, 0, + NULL, NULL, NULL, 0, 0, "%s", msg); +} + +/************************************************************************ + * * + * The implementation internals * + * * + ************************************************************************/ +#define XML_NAMESPACES_DEFAULT 16 + +static int +xmlC14NIsNodeInNodeset(xmlNodeSetPtr nodes, xmlNodePtr node, xmlNodePtr parent) { + if((nodes != NULL) && (node != NULL)) { + if(node->type != XML_NAMESPACE_DECL) { + return(xmlXPathNodeSetContains(nodes, node)); + } else { + xmlNs ns; + + memcpy(&ns, node, sizeof(ns)); + + /* this is a libxml hack! check xpath.c for details */ + if((parent != NULL) && (parent->type == XML_ATTRIBUTE_NODE)) { + ns.next = (xmlNsPtr)parent->parent; + } else { + ns.next = (xmlNsPtr)parent; + } + + /* + * If the input is an XPath node-set, then the node-set must explicitly + * contain every node to be rendered to the canonical form. + */ + return(xmlXPathNodeSetContains(nodes, (xmlNodePtr)&ns)); + } + } + return(1); +} + +static xmlC14NVisibleNsStackPtr +xmlC14NVisibleNsStackCreate(void) { + xmlC14NVisibleNsStackPtr ret; + + ret = (xmlC14NVisibleNsStackPtr) xmlMalloc(sizeof(xmlC14NVisibleNsStack)); + if (ret == NULL) { + xmlC14NErrMemory("creating namespaces stack"); + return(NULL); + } + memset(ret, 0 , (size_t) sizeof(xmlC14NVisibleNsStack)); + return(ret); +} + +static void +xmlC14NVisibleNsStackDestroy(xmlC14NVisibleNsStackPtr cur) { + if(cur == NULL) { + xmlC14NErrParam("destroying namespaces stack"); + return; + } + if(cur->nsTab != NULL) { + memset(cur->nsTab, 0, cur->nsMax * sizeof(xmlNsPtr)); + xmlFree(cur->nsTab); + } + if(cur->nodeTab != NULL) { + memset(cur->nodeTab, 0, cur->nsMax * sizeof(xmlNodePtr)); + xmlFree(cur->nodeTab); + } + memset(cur, 0, sizeof(xmlC14NVisibleNsStack)); + xmlFree(cur); + +} + +static void +xmlC14NVisibleNsStackAdd(xmlC14NVisibleNsStackPtr cur, xmlNsPtr ns, xmlNodePtr node) { + if((cur == NULL) || + ((cur->nsTab == NULL) && (cur->nodeTab != NULL)) || + ((cur->nsTab != NULL) && (cur->nodeTab == NULL))) { + xmlC14NErrParam("adding namespace to stack"); + return; + } + + if ((cur->nsTab == NULL) && (cur->nodeTab == NULL)) { + cur->nsTab = (xmlNsPtr*) xmlMalloc(XML_NAMESPACES_DEFAULT * sizeof(xmlNsPtr)); + cur->nodeTab = (xmlNodePtr*) xmlMalloc(XML_NAMESPACES_DEFAULT * sizeof(xmlNodePtr)); + if ((cur->nsTab == NULL) || (cur->nodeTab == NULL)) { + xmlC14NErrMemory("adding node to stack"); + return; + } + memset(cur->nsTab, 0 , XML_NAMESPACES_DEFAULT * sizeof(xmlNsPtr)); + memset(cur->nodeTab, 0 , XML_NAMESPACES_DEFAULT * sizeof(xmlNodePtr)); + cur->nsMax = XML_NAMESPACES_DEFAULT; + } else if(cur->nsMax == cur->nsCurEnd) { + void *tmp; + int tmpSize; + + tmpSize = 2 * cur->nsMax; + tmp = xmlRealloc(cur->nsTab, tmpSize * sizeof(xmlNsPtr)); + if (tmp == NULL) { + xmlC14NErrMemory("adding node to stack"); + return; + } + cur->nsTab = (xmlNsPtr*)tmp; + + tmp = xmlRealloc(cur->nodeTab, tmpSize * sizeof(xmlNodePtr)); + if (tmp == NULL) { + xmlC14NErrMemory("adding node to stack"); + return; + } + cur->nodeTab = (xmlNodePtr*)tmp; + + cur->nsMax = tmpSize; + } + cur->nsTab[cur->nsCurEnd] = ns; + cur->nodeTab[cur->nsCurEnd] = node; + + ++cur->nsCurEnd; +} + +static void +xmlC14NVisibleNsStackSave(xmlC14NVisibleNsStackPtr cur, xmlC14NVisibleNsStackPtr state) { + if((cur == NULL) || (state == NULL)) { + xmlC14NErrParam("saving namespaces stack"); + return; + } + + state->nsCurEnd = cur->nsCurEnd; + state->nsPrevStart = cur->nsPrevStart; + state->nsPrevEnd = cur->nsPrevEnd; +} + +static void +xmlC14NVisibleNsStackRestore(xmlC14NVisibleNsStackPtr cur, xmlC14NVisibleNsStackPtr state) { + if((cur == NULL) || (state == NULL)) { + xmlC14NErrParam("restoring namespaces stack"); + return; + } + cur->nsCurEnd = state->nsCurEnd; + cur->nsPrevStart = state->nsPrevStart; + cur->nsPrevEnd = state->nsPrevEnd; +} + +static void +xmlC14NVisibleNsStackShift(xmlC14NVisibleNsStackPtr cur) { + if(cur == NULL) { + xmlC14NErrParam("shifting namespaces stack"); + return; + } + cur->nsPrevStart = cur->nsPrevEnd; + cur->nsPrevEnd = cur->nsCurEnd; +} + +static int +xmlC14NStrEqual(const xmlChar *str1, const xmlChar *str2) { + if (str1 == str2) return(1); + if (str1 == NULL) return((*str2) == '\0'); + if (str2 == NULL) return((*str1) == '\0'); + do { + if (*str1++ != *str2) return(0); + } while (*str2++); + return(1); +} + +/** + * xmlC14NVisibleNsStackFind: + * @ctx: the C14N context + * @ns: the namespace to check + * + * Checks whether the given namespace was already rendered or not + * + * Returns 1 if we already wrote this namespace or 0 otherwise + */ +static int +xmlC14NVisibleNsStackFind(xmlC14NVisibleNsStackPtr cur, xmlNsPtr ns) +{ + int i; + const xmlChar *prefix; + const xmlChar *href; + int has_empty_ns; + + if(cur == NULL) { + xmlC14NErrParam("searching namespaces stack (c14n)"); + return (0); + } + + /* + * if the default namespace xmlns="" is not defined yet then + * we do not want to print it out + */ + prefix = ((ns == NULL) || (ns->prefix == NULL)) ? BAD_CAST "" : ns->prefix; + href = ((ns == NULL) || (ns->href == NULL)) ? BAD_CAST "" : ns->href; + has_empty_ns = (xmlC14NStrEqual(prefix, NULL) && xmlC14NStrEqual(href, NULL)); + + if (cur->nsTab != NULL) { + int start = (has_empty_ns) ? 0 : cur->nsPrevStart; + for (i = cur->nsCurEnd - 1; i >= start; --i) { + xmlNsPtr ns1 = cur->nsTab[i]; + + if(xmlC14NStrEqual(prefix, (ns1 != NULL) ? ns1->prefix : NULL)) { + return(xmlC14NStrEqual(href, (ns1 != NULL) ? ns1->href : NULL)); + } + } + } + return(has_empty_ns); +} + +static int +xmlExcC14NVisibleNsStackFind(xmlC14NVisibleNsStackPtr cur, xmlNsPtr ns, xmlC14NCtxPtr ctx) { + int i; + const xmlChar *prefix; + const xmlChar *href; + int has_empty_ns; + + if(cur == NULL) { + xmlC14NErrParam("searching namespaces stack (exc c14n)"); + return (0); + } + + /* + * if the default namespace xmlns="" is not defined yet then + * we do not want to print it out + */ + prefix = ((ns == NULL) || (ns->prefix == NULL)) ? BAD_CAST "" : ns->prefix; + href = ((ns == NULL) || (ns->href == NULL)) ? BAD_CAST "" : ns->href; + has_empty_ns = (xmlC14NStrEqual(prefix, NULL) && xmlC14NStrEqual(href, NULL)); + + if (cur->nsTab != NULL) { + int start = 0; + for (i = cur->nsCurEnd - 1; i >= start; --i) { + xmlNsPtr ns1 = cur->nsTab[i]; + + if(xmlC14NStrEqual(prefix, (ns1 != NULL) ? ns1->prefix : NULL)) { + if(xmlC14NStrEqual(href, (ns1 != NULL) ? ns1->href : NULL)) { + return(xmlC14NIsVisible(ctx, ns1, cur->nodeTab[i])); + } else { + return(0); + } + } + } + } + return(has_empty_ns); +} + + + + +/** + * xmlC14NIsXmlNs: + * @ns: the namespace to check + * + * Checks whether the given namespace is a default "xml:" namespace + * with href="http://www.w3.org/XML/1998/namespace" + * + * Returns 1 if the node is default or 0 otherwise + */ + +/* todo: make it a define? */ +static int +xmlC14NIsXmlNs(xmlNsPtr ns) +{ + return ((ns != NULL) && + (xmlStrEqual(ns->prefix, BAD_CAST "xml")) && + (xmlStrEqual(ns->href, XML_XML_NAMESPACE))); +} + + +/** + * xmlC14NNsCompare: + * @ns1: the pointer to first namespace + * @ns2: the pointer to second namespace + * + * Compares the namespaces by names (prefixes). + * + * Returns -1 if ns1 < ns2, 0 if ns1 == ns2 or 1 if ns1 > ns2. + */ +static int +xmlC14NNsCompare(xmlNsPtr ns1, xmlNsPtr ns2) +{ + if (ns1 == ns2) + return (0); + if (ns1 == NULL) + return (-1); + if (ns2 == NULL) + return (1); + + return (xmlStrcmp(ns1->prefix, ns2->prefix)); +} + + +/** + * xmlC14NPrintNamespaces: + * @ns: the pointer to namespace + * @ctx: the C14N context + * + * Prints the given namespace to the output buffer from C14N context. + * + * Returns 1 on success or 0 on fail. + */ +static int +xmlC14NPrintNamespaces(const xmlNsPtr ns, xmlC14NCtxPtr ctx) +{ + + if ((ns == NULL) || (ctx == NULL)) { + xmlC14NErrParam("writing namespaces"); + return 0; + } + + if (ns->prefix != NULL) { + xmlOutputBufferWriteString(ctx->buf, " xmlns:"); + xmlOutputBufferWriteString(ctx->buf, (const char *) ns->prefix); + xmlOutputBufferWriteString(ctx->buf, "=\""); + } else { + xmlOutputBufferWriteString(ctx->buf, " xmlns=\""); + } + if(ns->href != NULL) { + xmlOutputBufferWriteString(ctx->buf, (const char *) ns->href); + } + xmlOutputBufferWriteString(ctx->buf, "\""); + return (1); +} + +/** + * xmlC14NProcessNamespacesAxis: + * @ctx: the C14N context + * @node: the current node + * + * Prints out canonical namespace axis of the current node to the + * buffer from C14N context as follows + * + * Canonical XML v 1.0 (http://www.w3.org/TR/xml-c14n) + * + * Namespace Axis + * Consider a list L containing only namespace nodes in the + * axis and in the node-set in lexicographic order (ascending). To begin + * processing L, if the first node is not the default namespace node (a node + * with no namespace URI and no local name), then generate a space followed + * by xmlns="" if and only if the following conditions are met: + * - the element E that owns the axis is in the node-set + * - The nearest ancestor element of E in the node-set has a default + * namespace node in the node-set (default namespace nodes always + * have non-empty values in XPath) + * The latter condition eliminates unnecessary occurrences of xmlns="" in + * the canonical form since an element only receives an xmlns="" if its + * default namespace is empty and if it has an immediate parent in the + * canonical form that has a non-empty default namespace. To finish + * processing L, simply process every namespace node in L, except omit + * namespace node with local name xml, which defines the xml prefix, + * if its string value is http://www.w3.org/XML/1998/namespace. + * + * Exclusive XML Canonicalization v 1.0 (http://www.w3.org/TR/xml-exc-c14n) + * Canonical XML applied to a document subset requires the search of the + * ancestor nodes of each orphan element node for attributes in the xml + * namespace, such as xml:lang and xml:space. These are copied into the + * element node except if a declaration of the same attribute is already + * in the attribute axis of the element (whether or not it is included in + * the document subset). This search and copying are omitted from the + * Exclusive XML Canonicalization method. + * + * Returns 0 on success or -1 on fail. + */ +static int +xmlC14NProcessNamespacesAxis(xmlC14NCtxPtr ctx, xmlNodePtr cur, int visible) +{ + xmlNodePtr n; + xmlNsPtr ns, tmp; + xmlListPtr list; + int already_rendered; + int has_empty_ns = 0; + + if ((ctx == NULL) || (cur == NULL) || (cur->type != XML_ELEMENT_NODE)) { + xmlC14NErrParam("processing namespaces axis (c14n)"); + return (-1); + } + + /* + * Create a sorted list to store element namespaces + */ + list = xmlListCreate(NULL, (xmlListDataCompare) xmlC14NNsCompare); + if (list == NULL) { + xmlC14NErrInternal("creating namespaces list (c14n)"); + return (-1); + } + + /* check all namespaces */ + for(n = cur; n != NULL; n = n->parent) { + for(ns = n->nsDef; ns != NULL; ns = ns->next) { + tmp = xmlSearchNs(cur->doc, cur, ns->prefix); + + if((tmp == ns) && !xmlC14NIsXmlNs(ns) && xmlC14NIsVisible(ctx, ns, cur)) { + already_rendered = xmlC14NVisibleNsStackFind(ctx->ns_rendered, ns); + if(visible) { + xmlC14NVisibleNsStackAdd(ctx->ns_rendered, ns, cur); + } + if(!already_rendered) { + xmlListInsert(list, ns); + } + if(xmlStrlen(ns->prefix) == 0) { + has_empty_ns = 1; + } + } + } + } + + /** + * if the first node is not the default namespace node (a node with no + * namespace URI and no local name), then generate a space followed by + * xmlns="" if and only if the following conditions are met: + * - the element E that owns the axis is in the node-set + * - the nearest ancestor element of E in the node-set has a default + * namespace node in the node-set (default namespace nodes always + * have non-empty values in XPath) + */ + if(visible && !has_empty_ns) { + static xmlNs ns_default; + + memset(&ns_default, 0, sizeof(ns_default)); + if(!xmlC14NVisibleNsStackFind(ctx->ns_rendered, &ns_default)) { + xmlC14NPrintNamespaces(&ns_default, ctx); + } + } + + + /* + * print out all elements from list + */ + xmlListWalk(list, (xmlListWalker) xmlC14NPrintNamespaces, (const void *) ctx); + + /* + * Cleanup + */ + xmlListDelete(list); + return (0); +} + + +/** + * xmlExcC14NProcessNamespacesAxis: + * @ctx: the C14N context + * @node: the current node + * + * Prints out exclusive canonical namespace axis of the current node to the + * buffer from C14N context as follows + * + * Exclusive XML Canonicalization + * http://www.w3.org/TR/xml-exc-c14n + * + * If the element node is in the XPath subset then output the node in + * accordance with Canonical XML except for namespace nodes which are + * rendered as follows: + * + * 1. Render each namespace node iff: + * * it is visibly utilized by the immediate parent element or one of + * its attributes, or is present in InclusiveNamespaces PrefixList, and + * * its prefix and value do not appear in ns_rendered. ns_rendered is + * obtained by popping the state stack in order to obtain a list of + * prefixes and their values which have already been rendered by + * an output ancestor of the namespace node's parent element. + * 2. Append the rendered namespace node to the list ns_rendered of namespace + * nodes rendered by output ancestors. Push ns_rendered on state stack and + * recurse. + * 3. After the recursion returns, pop thestate stack. + * + * + * Returns 0 on success or -1 on fail. + */ +static int +xmlExcC14NProcessNamespacesAxis(xmlC14NCtxPtr ctx, xmlNodePtr cur, int visible) +{ + xmlNsPtr ns; + xmlListPtr list; + xmlAttrPtr attr; + int already_rendered; + int has_empty_ns = 0; + int has_visibly_utilized_empty_ns = 0; + int has_empty_ns_in_inclusive_list = 0; + + if ((ctx == NULL) || (cur == NULL) || (cur->type != XML_ELEMENT_NODE)) { + xmlC14NErrParam("processing namespaces axis (exc c14n)"); + return (-1); + } + + if(!xmlC14NIsExclusive(ctx)) { + xmlC14NErrParam("processing namespaces axis (exc c14n)"); + return (-1); + + } + + /* + * Create a sorted list to store element namespaces + */ + list = xmlListCreate(NULL, (xmlListDataCompare) xmlC14NNsCompare); + if (list == NULL) { + xmlC14NErrInternal("creating namespaces list (exc c14n)"); + return (-1); + } + + /* + * process inclusive namespaces: + * All namespace nodes appearing on inclusive ns list are + * handled as provided in Canonical XML + */ + if(ctx->inclusive_ns_prefixes != NULL) { + xmlChar *prefix; + int i; + + for (i = 0; ctx->inclusive_ns_prefixes[i] != NULL; ++i) { + prefix = ctx->inclusive_ns_prefixes[i]; + /* + * Special values for namespace with empty prefix + */ + if (xmlStrEqual(prefix, BAD_CAST "#default") + || xmlStrEqual(prefix, BAD_CAST "")) { + prefix = NULL; + has_empty_ns_in_inclusive_list = 1; + } + + ns = xmlSearchNs(cur->doc, cur, prefix); + if((ns != NULL) && !xmlC14NIsXmlNs(ns) && xmlC14NIsVisible(ctx, ns, cur)) { + already_rendered = xmlC14NVisibleNsStackFind(ctx->ns_rendered, ns); + if(visible) { + xmlC14NVisibleNsStackAdd(ctx->ns_rendered, ns, cur); + } + if(!already_rendered) { + xmlListInsert(list, ns); + } + if(xmlStrlen(ns->prefix) == 0) { + has_empty_ns = 1; + } + } + } + } + + /* add node namespace */ + if(cur->ns != NULL) { + ns = cur->ns; + } else { + ns = xmlSearchNs(cur->doc, cur, NULL); + has_visibly_utilized_empty_ns = 1; + } + if((ns != NULL) && !xmlC14NIsXmlNs(ns)) { + if(visible && xmlC14NIsVisible(ctx, ns, cur)) { + if(!xmlExcC14NVisibleNsStackFind(ctx->ns_rendered, ns, ctx)) { + xmlListInsert(list, ns); + } + } + if(visible) { + xmlC14NVisibleNsStackAdd(ctx->ns_rendered, ns, cur); + } + if(xmlStrlen(ns->prefix) == 0) { + has_empty_ns = 1; + } + } + + + /* add attributes */ + for(attr = cur->properties; attr != NULL; attr = attr->next) { + /* + * we need to check that attribute is visible and has non + * default namespace (XML Namespaces: "default namespaces + * do not apply directly to attributes") + */ + if((attr->ns != NULL) && !xmlC14NIsXmlNs(attr->ns) && xmlC14NIsVisible(ctx, attr, cur)) { + already_rendered = xmlExcC14NVisibleNsStackFind(ctx->ns_rendered, attr->ns, ctx); + xmlC14NVisibleNsStackAdd(ctx->ns_rendered, attr->ns, cur); + if(!already_rendered && visible) { + xmlListInsert(list, attr->ns); + } + if(xmlStrlen(attr->ns->prefix) == 0) { + has_empty_ns = 1; + } + } else if((attr->ns != NULL) && (xmlStrlen(attr->ns->prefix) == 0) && (xmlStrlen(attr->ns->href) == 0)) { + has_visibly_utilized_empty_ns = 1; + } + } + + /* + * Process xmlns="" + */ + if(visible && has_visibly_utilized_empty_ns && + !has_empty_ns && !has_empty_ns_in_inclusive_list) { + static xmlNs ns_default; + + memset(&ns_default, 0, sizeof(ns_default)); + + already_rendered = xmlExcC14NVisibleNsStackFind(ctx->ns_rendered, &ns_default, ctx); + if(!already_rendered) { + xmlC14NPrintNamespaces(&ns_default, ctx); + } + } else if(visible && !has_empty_ns && has_empty_ns_in_inclusive_list) { + static xmlNs ns_default; + + memset(&ns_default, 0, sizeof(ns_default)); + if(!xmlC14NVisibleNsStackFind(ctx->ns_rendered, &ns_default)) { + xmlC14NPrintNamespaces(&ns_default, ctx); + } + } + + + + /* + * print out all elements from list + */ + xmlListWalk(list, (xmlListWalker) xmlC14NPrintNamespaces, (const void *) ctx); + + /* + * Cleanup + */ + xmlListDelete(list); + return (0); +} + + +/** + * xmlC14NIsXmlAttr: + * @attr: the attr to check + * + * Checks whether the given attribute is a default "xml:" namespace + * with href="http://www.w3.org/XML/1998/namespace" + * + * Returns 1 if the node is default or 0 otherwise + */ + +/* todo: make it a define? */ +static int +xmlC14NIsXmlAttr(xmlAttrPtr attr) +{ + return ((attr->ns != NULL) && + (xmlC14NIsXmlNs(attr->ns) != 0)); +} + + +/** + * xmlC14NAttrsCompare: + * @attr1: the pointer tls o first attr + * @attr2: the pointer to second attr + * + * Prints the given attribute to the output buffer from C14N context. + * + * Returns -1 if attr1 < attr2, 0 if attr1 == attr2 or 1 if attr1 > attr2. + */ +static int +xmlC14NAttrsCompare(xmlAttrPtr attr1, xmlAttrPtr attr2) +{ + int ret = 0; + + /* + * Simple cases + */ + if (attr1 == attr2) + return (0); + if (attr1 == NULL) + return (-1); + if (attr2 == NULL) + return (1); + if (attr1->ns == attr2->ns) { + return (xmlStrcmp(attr1->name, attr2->name)); + } + + /* + * Attributes in the default namespace are first + * because the default namespace is not applied to + * unqualified attributes + */ + if (attr1->ns == NULL) + return (-1); + if (attr2->ns == NULL) + return (1); + if (attr1->ns->prefix == NULL) + return (-1); + if (attr2->ns->prefix == NULL) + return (1); + + ret = xmlStrcmp(attr1->ns->href, attr2->ns->href); + if (ret == 0) { + ret = xmlStrcmp(attr1->name, attr2->name); + } + return (ret); +} + + +/** + * xmlC14NPrintAttrs: + * @attr: the pointer to attr + * @ctx: the C14N context + * + * Prints out canonical attribute urrent node to the + * buffer from C14N context as follows + * + * Canonical XML v 1.0 (http://www.w3.org/TR/xml-c14n) + * + * Returns 1 on success or 0 on fail. + */ +static int +xmlC14NPrintAttrs(const xmlAttrPtr attr, xmlC14NCtxPtr ctx) +{ + xmlChar *value; + xmlChar *buffer; + + if ((attr == NULL) || (ctx == NULL)) { + xmlC14NErrParam("writing attributes"); + return (0); + } + + xmlOutputBufferWriteString(ctx->buf, " "); + if (attr->ns != NULL && xmlStrlen(attr->ns->prefix) > 0) { + xmlOutputBufferWriteString(ctx->buf, + (const char *) attr->ns->prefix); + xmlOutputBufferWriteString(ctx->buf, ":"); + } + xmlOutputBufferWriteString(ctx->buf, (const char *) attr->name); + xmlOutputBufferWriteString(ctx->buf, "=\""); + + value = xmlNodeListGetString(ctx->doc, attr->children, 1); + /* todo: should we log an error if value==NULL ? */ + if (value != NULL) { + buffer = xmlC11NNormalizeAttr(value); + xmlFree(value); + if (buffer != NULL) { + xmlOutputBufferWriteString(ctx->buf, (const char *) buffer); + xmlFree(buffer); + } else { + xmlC14NErrInternal("normalizing attributes axis"); + return (0); + } + } + xmlOutputBufferWriteString(ctx->buf, "\""); + return (1); +} + +/** + * xmlC14NFindHiddenParentAttr: + * + * Finds an attribute in a hidden parent node. + * + * Returns a pointer to the attribute node (if found) or NULL otherwise. + */ +static xmlAttrPtr +xmlC14NFindHiddenParentAttr(xmlC14NCtxPtr ctx, xmlNodePtr cur, const xmlChar * name, const xmlChar * ns) +{ + xmlAttrPtr res; + while((cur != NULL) && (!xmlC14NIsVisible(ctx, cur, cur->parent))) { + res = xmlHasNsProp(cur, name, ns); + if(res != NULL) { + return res; + } + + cur = cur->parent; + } + + return NULL; +} + +/** + * xmlC14NFixupBaseAttr: + * + * Fixes up the xml:base attribute + * + * Returns the newly created attribute or NULL + */ +static xmlAttrPtr +xmlC14NFixupBaseAttr(xmlC14NCtxPtr ctx, xmlAttrPtr xml_base_attr) +{ + xmlChar * res = NULL; + xmlNodePtr cur; + xmlAttrPtr attr; + xmlChar * tmp_str; + xmlChar * tmp_str2; + int tmp_str_len; + + if ((ctx == NULL) || (xml_base_attr == NULL) || (xml_base_attr->parent == NULL)) { + xmlC14NErrParam("processing xml:base attribute"); + return (NULL); + } + + /* start from current value */ + res = xmlNodeListGetString(ctx->doc, xml_base_attr->children, 1); + if(res == NULL) { + xmlC14NErrInternal("processing xml:base attribute - can't get attr value"); + return (NULL); + } + + /* go up the stack until we find a node that we rendered already */ + cur = xml_base_attr->parent->parent; + while((cur != NULL) && (!xmlC14NIsVisible(ctx, cur, cur->parent))) { + attr = xmlHasNsProp(cur, BAD_CAST "base", XML_XML_NAMESPACE); + if(attr != NULL) { + /* get attr value */ + tmp_str = xmlNodeListGetString(ctx->doc, attr->children, 1); + if(tmp_str == NULL) { + xmlFree(res); + + xmlC14NErrInternal("processing xml:base attribute - can't get attr value"); + return (NULL); + } + + /* we need to add '/' if our current base uri ends with '..' or '.' + to ensure that we are forced to go "up" all the time */ + tmp_str_len = xmlStrlen(tmp_str); + if(tmp_str_len > 1 && tmp_str[tmp_str_len - 2] == '.') { + tmp_str2 = xmlStrcat(tmp_str, BAD_CAST "/"); + if(tmp_str2 == NULL) { + xmlFree(tmp_str); + xmlFree(res); + + xmlC14NErrInternal("processing xml:base attribute - can't modify uri"); + return (NULL); + } + + tmp_str = tmp_str2; + } + + /* build uri */ + tmp_str2 = xmlBuildURI(res, tmp_str); + if(tmp_str2 == NULL) { + xmlFree(tmp_str); + xmlFree(res); + + xmlC14NErrInternal("processing xml:base attribute - can't construct uri"); + return (NULL); + } + + /* cleanup and set the new res */ + xmlFree(tmp_str); + xmlFree(res); + res = tmp_str2; + } + + /* next */ + cur = cur->parent; + } + + /* check if result uri is empty or not */ + if((res == NULL) || xmlStrEqual(res, BAD_CAST "")) { + xmlFree(res); + return (NULL); + } + + /* create and return the new attribute node */ + attr = xmlNewNsProp(NULL, xml_base_attr->ns, BAD_CAST "base", res); + if(attr == NULL) { + xmlFree(res); + + xmlC14NErrInternal("processing xml:base attribute - can't construct attribute"); + return (NULL); + } + + /* done */ + xmlFree(res); + return (attr); +} + +/** + * xmlC14NProcessAttrsAxis: + * @ctx: the C14N context + * @cur: the current node + * @parent_visible: the visibility of parent node + * @all_parents_visible: the visibility of all parent nodes + * + * Prints out canonical attribute axis of the current node to the + * buffer from C14N context as follows + * + * Canonical XML v 1.0 (http://www.w3.org/TR/xml-c14n) + * + * Attribute Axis + * In lexicographic order (ascending), process each node that + * is in the element's attribute axis and in the node-set. + * + * The processing of an element node E MUST be modified slightly + * when an XPath node-set is given as input and the element's + * parent is omitted from the node-set. + * + * + * Exclusive XML Canonicalization v 1.0 (http://www.w3.org/TR/xml-exc-c14n) + * + * Canonical XML applied to a document subset requires the search of the + * ancestor nodes of each orphan element node for attributes in the xml + * namespace, such as xml:lang and xml:space. These are copied into the + * element node except if a declaration of the same attribute is already + * in the attribute axis of the element (whether or not it is included in + * the document subset). This search and copying are omitted from the + * Exclusive XML Canonicalization method. + * + * Returns 0 on success or -1 on fail. + */ +static int +xmlC14NProcessAttrsAxis(xmlC14NCtxPtr ctx, xmlNodePtr cur, int parent_visible) +{ + xmlAttrPtr attr; + xmlListPtr list; + xmlAttrPtr attrs_to_delete = NULL; + + /* special processing for 1.1 spec */ + xmlAttrPtr xml_base_attr = NULL; + xmlAttrPtr xml_lang_attr = NULL; + xmlAttrPtr xml_space_attr = NULL; + + if ((ctx == NULL) || (cur == NULL) || (cur->type != XML_ELEMENT_NODE)) { + xmlC14NErrParam("processing attributes axis"); + return (-1); + } + + /* + * Create a sorted list to store element attributes + */ + list = xmlListCreate(NULL, (xmlListDataCompare) xmlC14NAttrsCompare); + if (list == NULL) { + xmlC14NErrInternal("creating attributes list"); + return (-1); + } + + switch(ctx->mode) { + case XML_C14N_1_0: + /* The processing of an element node E MUST be modified slightly when an XPath node-set is + * given as input and the element's parent is omitted from the node-set. The method for processing + * the attribute axis of an element E in the node-set is enhanced. All element nodes along E's + * ancestor axis are examined for nearest occurrences of attributes in the xml namespace, such + * as xml:lang and xml:space (whether or not they are in the node-set). From this list of attributes, + * remove any that are in E's attribute axis (whether or not they are in the node-set). Then, + * lexicographically merge this attribute list with the nodes of E's attribute axis that are in + * the node-set. The result of visiting the attribute axis is computed by processing the attribute + * nodes in this merged attribute list. + */ + + /* + * Add all visible attributes from current node. + */ + attr = cur->properties; + while (attr != NULL) { + /* check that attribute is visible */ + if (xmlC14NIsVisible(ctx, attr, cur)) { + xmlListInsert(list, attr); + } + attr = attr->next; + } + + /* + * Handle xml attributes + */ + if (parent_visible && (cur->parent != NULL) && + (!xmlC14NIsVisible(ctx, cur->parent, cur->parent->parent))) + { + xmlNodePtr tmp; + + /* + * If XPath node-set is not specified then the parent is always + * visible! + */ + tmp = cur->parent; + while (tmp != NULL) { + attr = tmp->properties; + while (attr != NULL) { + if (xmlC14NIsXmlAttr(attr) != 0) { + if (xmlListSearch(list, attr) == NULL) { + xmlListInsert(list, attr); + } + } + attr = attr->next; + } + tmp = tmp->parent; + } + } + + /* done */ + break; + case XML_C14N_EXCLUSIVE_1_0: + /* attributes in the XML namespace, such as xml:lang and xml:space + * are not imported into orphan nodes of the document subset + */ + + /* + * Add all visible attributes from current node. + */ + attr = cur->properties; + while (attr != NULL) { + /* check that attribute is visible */ + if (xmlC14NIsVisible(ctx, attr, cur)) { + xmlListInsert(list, attr); + } + attr = attr->next; + } + + /* do nothing special for xml attributes */ + break; + case XML_C14N_1_1: + /* The processing of an element node E MUST be modified slightly when an XPath node-set is + * given as input and some of the element's ancestors are omitted from the node-set. + * + * Simple inheritable attributes are attributes that have a value that requires at most a simple + * redeclaration. This redeclaration is done by supplying a new value in the child axis. The + * redeclaration of a simple inheritable attribute A contained in one of E's ancestors is done + * by supplying a value to an attribute Ae inside E with the same name. Simple inheritable attributes + * are xml:lang and xml:space. + * + * The method for processing the attribute axis of an element E in the node-set is hence enhanced. + * All element nodes along E's ancestor axis are examined for the nearest occurrences of simple + * inheritable attributes in the xml namespace, such as xml:lang and xml:space (whether or not they + * are in the node-set). From this list of attributes, any simple inheritable attributes that are + * already in E's attribute axis (whether or not they are in the node-set) are removed. Then, + * lexicographically merge this attribute list with the nodes of E's attribute axis that are in + * the node-set. The result of visiting the attribute axis is computed by processing the attribute + * nodes in this merged attribute list. + * + * The xml:id attribute is not a simple inheritable attribute and no processing of these attributes is + * performed. + * + * The xml:base attribute is not a simple inheritable attribute and requires special processing beyond + * a simple redeclaration. + * + * Attributes in the XML namespace other than xml:base, xml:id, xml:lang, and xml:space MUST be processed + * as ordinary attributes. + */ + + /* + * Add all visible attributes from current node. + */ + attr = cur->properties; + while (attr != NULL) { + /* special processing for XML attribute kiks in only when we have invisible parents */ + if ((!parent_visible) || (xmlC14NIsXmlAttr(attr) == 0)) { + /* check that attribute is visible */ + if (xmlC14NIsVisible(ctx, attr, cur)) { + xmlListInsert(list, attr); + } + } else { + int matched = 0; + + /* check for simple inheritance attributes */ + if((!matched) && (xml_lang_attr == NULL) && xmlStrEqual(attr->name, BAD_CAST "lang")) { + xml_lang_attr = attr; + matched = 1; + } + if((!matched) && (xml_space_attr == NULL) && xmlStrEqual(attr->name, BAD_CAST "space")) { + xml_space_attr = attr; + matched = 1; + } + + /* check for base attr */ + if((!matched) && (xml_base_attr == NULL) && xmlStrEqual(attr->name, BAD_CAST "base")) { + xml_base_attr = attr; + matched = 1; + } + + /* otherwise, it is a normal attribute, so just check if it is visible */ + if((!matched) && xmlC14NIsVisible(ctx, attr, cur)) { + xmlListInsert(list, attr); + } + } + + /* move to the next one */ + attr = attr->next; + } + + /* special processing for XML attribute kiks in only when we have invisible parents */ + if ((parent_visible)) { + + /* simple inheritance attributes - copy */ + if(xml_lang_attr == NULL) { + xml_lang_attr = xmlC14NFindHiddenParentAttr(ctx, cur->parent, BAD_CAST "lang", XML_XML_NAMESPACE); + } + if(xml_lang_attr != NULL) { + xmlListInsert(list, xml_lang_attr); + } + if(xml_space_attr == NULL) { + xml_space_attr = xmlC14NFindHiddenParentAttr(ctx, cur->parent, BAD_CAST "space", XML_XML_NAMESPACE); + } + if(xml_space_attr != NULL) { + xmlListInsert(list, xml_space_attr); + } + + /* base uri attribute - fix up */ + if(xml_base_attr == NULL) { + /* if we don't have base uri attribute, check if we have a "hidden" one above */ + xml_base_attr = xmlC14NFindHiddenParentAttr(ctx, cur->parent, BAD_CAST "base", XML_XML_NAMESPACE); + } + if(xml_base_attr != NULL) { + xml_base_attr = xmlC14NFixupBaseAttr(ctx, xml_base_attr); + if(xml_base_attr != NULL) { + xmlListInsert(list, xml_base_attr); + + /* note that we MUST delete returned attr node ourselves! */ + xml_base_attr->next = attrs_to_delete; + attrs_to_delete = xml_base_attr; + } + } + } + + /* done */ + break; + } + + /* + * print out all elements from list + */ + xmlListWalk(list, (xmlListWalker) xmlC14NPrintAttrs, (const void *) ctx); + + /* + * Cleanup + */ + xmlFreePropList(attrs_to_delete); + xmlListDelete(list); + return (0); +} + +/** + * xmlC14NCheckForRelativeNamespaces: + * @ctx: the C14N context + * @cur: the current element node + * + * Checks that current element node has no relative namespaces defined + * + * Returns 0 if the node has no relative namespaces or -1 otherwise. + */ +static int +xmlC14NCheckForRelativeNamespaces(xmlC14NCtxPtr ctx, xmlNodePtr cur) +{ + xmlNsPtr ns; + + if ((ctx == NULL) || (cur == NULL) || (cur->type != XML_ELEMENT_NODE)) { + xmlC14NErrParam("checking for relative namespaces"); + return (-1); + } + + ns = cur->nsDef; + while (ns != NULL) { + if (xmlStrlen(ns->href) > 0) { + xmlURIPtr uri; + + uri = xmlParseURI((const char *) ns->href); + if (uri == NULL) { + xmlC14NErrInternal("parsing namespace uri"); + return (-1); + } + if (xmlStrlen((const xmlChar *) uri->scheme) == 0) { + xmlC14NErrRelativeNamespace(uri->scheme); + xmlFreeURI(uri); + return (-1); + } + if ((xmlStrcasecmp((const xmlChar *) uri->scheme, BAD_CAST "urn") != 0) + && (xmlStrcasecmp((const xmlChar *) uri->scheme, BAD_CAST "dav") !=0) + && (xmlStrlen((const xmlChar *) uri->server) == 0)) { + xmlC14NErrRelativeNamespace(uri->scheme); + xmlFreeURI(uri); + return (-1); + } + xmlFreeURI(uri); + } + ns = ns->next; + } + return (0); +} + +/** + * xmlC14NProcessElementNode: + * @ctx: the pointer to C14N context object + * @cur: the node to process + * @visible: this node is visible + * @all_parents_visible: whether all the parents of this node are visible + * + * Canonical XML v 1.0 (http://www.w3.org/TR/xml-c14n) + * + * Element Nodes + * If the element is not in the node-set, then the result is obtained + * by processing the namespace axis, then the attribute axis, then + * processing the child nodes of the element that are in the node-set + * (in document order). If the element is in the node-set, then the result + * is an open angle bracket (<), the element QName, the result of + * processing the namespace axis, the result of processing the attribute + * axis, a close angle bracket (>), the result of processing the child + * nodes of the element that are in the node-set (in document order), an + * open angle bracket, a forward slash (/), the element QName, and a close + * angle bracket. + * + * Returns non-negative value on success or negative value on fail + */ +static int +xmlC14NProcessElementNode(xmlC14NCtxPtr ctx, xmlNodePtr cur, int visible) +{ + int ret; + xmlC14NVisibleNsStack state; + int parent_is_doc = 0; + + if ((ctx == NULL) || (cur == NULL) || (cur->type != XML_ELEMENT_NODE)) { + xmlC14NErrParam("processing element node"); + return (-1); + } + + /* + * Check relative relative namespaces: + * implementations of XML canonicalization MUST report an operation + * failure on documents containing relative namespace URIs. + */ + if (xmlC14NCheckForRelativeNamespaces(ctx, cur) < 0) { + xmlC14NErrInternal("checking for relative namespaces"); + return (-1); + } + + + /* + * Save ns_rendered stack position + */ + memset(&state, 0, sizeof(state)); + xmlC14NVisibleNsStackSave(ctx->ns_rendered, &state); + + if (visible) { + if (ctx->parent_is_doc) { + /* save this flag into the stack */ + parent_is_doc = ctx->parent_is_doc; + ctx->parent_is_doc = 0; + ctx->pos = XMLC14N_INSIDE_DOCUMENT_ELEMENT; + } + xmlOutputBufferWriteString(ctx->buf, "<"); + + if ((cur->ns != NULL) && (xmlStrlen(cur->ns->prefix) > 0)) { + xmlOutputBufferWriteString(ctx->buf, + (const char *) cur->ns->prefix); + xmlOutputBufferWriteString(ctx->buf, ":"); + } + xmlOutputBufferWriteString(ctx->buf, (const char *) cur->name); + } + + if (!xmlC14NIsExclusive(ctx)) { + ret = xmlC14NProcessNamespacesAxis(ctx, cur, visible); + } else { + ret = xmlExcC14NProcessNamespacesAxis(ctx, cur, visible); + } + if (ret < 0) { + xmlC14NErrInternal("processing namespaces axis"); + return (-1); + } + /* todo: shouldn't this go to "visible only"? */ + if(visible) { + xmlC14NVisibleNsStackShift(ctx->ns_rendered); + } + + ret = xmlC14NProcessAttrsAxis(ctx, cur, visible); + if (ret < 0) { + xmlC14NErrInternal("processing attributes axis"); + return (-1); + } + + if (visible) { + xmlOutputBufferWriteString(ctx->buf, ">"); + } + if (cur->children != NULL) { + ret = xmlC14NProcessNodeList(ctx, cur->children); + if (ret < 0) { + xmlC14NErrInternal("processing childrens list"); + return (-1); + } + } + if (visible) { + xmlOutputBufferWriteString(ctx->buf, "ns != NULL) && (xmlStrlen(cur->ns->prefix) > 0)) { + xmlOutputBufferWriteString(ctx->buf, + (const char *) cur->ns->prefix); + xmlOutputBufferWriteString(ctx->buf, ":"); + } + xmlOutputBufferWriteString(ctx->buf, (const char *) cur->name); + xmlOutputBufferWriteString(ctx->buf, ">"); + if (parent_is_doc) { + /* restore this flag from the stack for next node */ + ctx->parent_is_doc = parent_is_doc; + ctx->pos = XMLC14N_AFTER_DOCUMENT_ELEMENT; + } + } + + /* + * Restore ns_rendered stack position + */ + xmlC14NVisibleNsStackRestore(ctx->ns_rendered, &state); + return (0); +} + +/** + * xmlC14NProcessNode: + * @ctx: the pointer to C14N context object + * @cur: the node to process + * + * Processes the given node + * + * Returns non-negative value on success or negative value on fail + */ +static int +xmlC14NProcessNode(xmlC14NCtxPtr ctx, xmlNodePtr cur) +{ + int ret = 0; + int visible; + + if ((ctx == NULL) || (cur == NULL)) { + xmlC14NErrParam("processing node"); + return (-1); + } + + visible = xmlC14NIsVisible(ctx, cur, cur->parent); + switch (cur->type) { + case XML_ELEMENT_NODE: + ret = xmlC14NProcessElementNode(ctx, cur, visible); + break; + case XML_CDATA_SECTION_NODE: + case XML_TEXT_NODE: + /* + * Text Nodes + * the string value, except all ampersands are replaced + * by &, all open angle brackets (<) are replaced by <, all closing + * angle brackets (>) are replaced by >, and all #xD characters are + * replaced by . + */ + /* cdata sections are processed as text nodes */ + /* todo: verify that cdata sections are included in XPath nodes set */ + if ((visible) && (cur->content != NULL)) { + xmlChar *buffer; + + buffer = xmlC11NNormalizeText(cur->content); + if (buffer != NULL) { + xmlOutputBufferWriteString(ctx->buf, + (const char *) buffer); + xmlFree(buffer); + } else { + xmlC14NErrInternal("normalizing text node"); + return (-1); + } + } + break; + case XML_PI_NODE: + /* + * Processing Instruction (PI) Nodes- + * The opening PI symbol (). If the string value is empty, + * then the leading space is not added. Also, a trailing #xA is + * rendered after the closing PI symbol for PI children of the + * root node with a lesser document order than the document + * element, and a leading #xA is rendered before the opening PI + * symbol of PI children of the root node with a greater document + * order than the document element. + */ + if (visible) { + if (ctx->pos == XMLC14N_AFTER_DOCUMENT_ELEMENT) { + xmlOutputBufferWriteString(ctx->buf, "\x0Abuf, "buf, + (const char *) cur->name); + if ((cur->content != NULL) && (*(cur->content) != '\0')) { + xmlChar *buffer; + + xmlOutputBufferWriteString(ctx->buf, " "); + + /* todo: do we need to normalize pi? */ + buffer = xmlC11NNormalizePI(cur->content); + if (buffer != NULL) { + xmlOutputBufferWriteString(ctx->buf, + (const char *) buffer); + xmlFree(buffer); + } else { + xmlC14NErrInternal("normalizing pi node"); + return (-1); + } + } + + if (ctx->pos == XMLC14N_BEFORE_DOCUMENT_ELEMENT) { + xmlOutputBufferWriteString(ctx->buf, "?>\x0A"); + } else { + xmlOutputBufferWriteString(ctx->buf, "?>"); + } + } + break; + case XML_COMMENT_NODE: + /* + * Comment Nodes + * Nothing if generating canonical XML without comments. For + * canonical XML with comments, generate the opening comment + * symbol (). Also, a trailing #xA is rendered + * after the closing comment symbol for comment children of the + * root node with a lesser document order than the document + * element, and a leading #xA is rendered before the opening + * comment symbol of comment children of the root node with a + * greater document order than the document element. (Comment + * children of the root node represent comments outside of the + * top-level document element and outside of the document type + * declaration). + */ + if (visible && ctx->with_comments) { + if (ctx->pos == XMLC14N_AFTER_DOCUMENT_ELEMENT) { + xmlOutputBufferWriteString(ctx->buf, "\x0A\x0A"); + } else { + xmlOutputBufferWriteString(ctx->buf, "-->"); + } + } + break; + case XML_DOCUMENT_NODE: + case XML_DOCUMENT_FRAG_NODE: /* should be processed as document? */ +#ifdef LIBXML_DOCB_ENABLED + case XML_DOCB_DOCUMENT_NODE: /* should be processed as document? */ +#endif +#ifdef LIBXML_HTML_ENABLED + case XML_HTML_DOCUMENT_NODE: /* should be processed as document? */ +#endif + if (cur->children != NULL) { + ctx->pos = XMLC14N_BEFORE_DOCUMENT_ELEMENT; + ctx->parent_is_doc = 1; + ret = xmlC14NProcessNodeList(ctx, cur->children); + } + break; + + case XML_ATTRIBUTE_NODE: + xmlC14NErrInvalidNode("XML_ATTRIBUTE_NODE", "processing node"); + return (-1); + case XML_NAMESPACE_DECL: + xmlC14NErrInvalidNode("XML_NAMESPACE_DECL", "processing node"); + return (-1); + case XML_ENTITY_REF_NODE: + xmlC14NErrInvalidNode("XML_ENTITY_REF_NODE", "processing node"); + return (-1); + case XML_ENTITY_NODE: + xmlC14NErrInvalidNode("XML_ENTITY_NODE", "processing node"); + return (-1); + + case XML_DOCUMENT_TYPE_NODE: + case XML_NOTATION_NODE: + case XML_DTD_NODE: + case XML_ELEMENT_DECL: + case XML_ATTRIBUTE_DECL: + case XML_ENTITY_DECL: +#ifdef LIBXML_XINCLUDE_ENABLED + case XML_XINCLUDE_START: + case XML_XINCLUDE_END: +#endif + /* + * should be ignored according to "W3C Canonical XML" + */ + break; + default: + xmlC14NErrUnknownNode(cur->type, "processing node"); + return (-1); + } + + return (ret); +} + +/** + * xmlC14NProcessNodeList: + * @ctx: the pointer to C14N context object + * @cur: the node to start from + * + * Processes all nodes in the row starting from cur. + * + * Returns non-negative value on success or negative value on fail + */ +static int +xmlC14NProcessNodeList(xmlC14NCtxPtr ctx, xmlNodePtr cur) +{ + int ret; + + if (ctx == NULL) { + xmlC14NErrParam("processing node list"); + return (-1); + } + + for (ret = 0; cur != NULL && ret >= 0; cur = cur->next) { + ret = xmlC14NProcessNode(ctx, cur); + } + return (ret); +} + + +/** + * xmlC14NFreeCtx: + * @ctx: the pointer to C14N context object + * + * Cleanups the C14N context object. + */ + +static void +xmlC14NFreeCtx(xmlC14NCtxPtr ctx) +{ + if (ctx == NULL) { + xmlC14NErrParam("freeing context"); + return; + } + + if (ctx->ns_rendered != NULL) { + xmlC14NVisibleNsStackDestroy(ctx->ns_rendered); + } + xmlFree(ctx); +} + +/** + * xmlC14NNewCtx: + * @doc: the XML document for canonization + * @is_visible_callback:the function to use to determine is node visible + * or not + * @user_data: the first parameter for @is_visible_callback function + * (in most cases, it is nodes set) + * @mode: the c14n mode (see @xmlC14NMode) + * @inclusive_ns_prefixe the list of inclusive namespace prefixes + * ended with a NULL or NULL if there is no + * inclusive namespaces (only for ` + * canonicalization) + * @with_comments: include comments in the result (!=0) or not (==0) + * @buf: the output buffer to store canonical XML; this + * buffer MUST have encoder==NULL because C14N requires + * UTF-8 output + * + * Creates new C14N context object to store C14N parameters. + * + * Returns pointer to newly created object (success) or NULL (fail) + */ +static xmlC14NCtxPtr +xmlC14NNewCtx(xmlDocPtr doc, + xmlC14NIsVisibleCallback is_visible_callback, void* user_data, + xmlC14NMode mode, xmlChar ** inclusive_ns_prefixes, + int with_comments, xmlOutputBufferPtr buf) +{ + xmlC14NCtxPtr ctx = NULL; + + if ((doc == NULL) || (buf == NULL)) { + xmlC14NErrParam("creating new context"); + return (NULL); + } + + /* + * Validate the encoding output buffer encoding + */ + if (buf->encoder != NULL) { + xmlC14NErr(ctx, (xmlNodePtr) doc, XML_C14N_REQUIRES_UTF8, +"xmlC14NNewCtx: output buffer encoder != NULL but C14N requires UTF8 output\n"); + return (NULL); + } + + /* + * Validate the XML document encoding value, if provided. + */ + if (doc->charset != XML_CHAR_ENCODING_UTF8) { + xmlC14NErr(ctx, (xmlNodePtr) doc, XML_C14N_REQUIRES_UTF8, + "xmlC14NNewCtx: source document not in UTF8\n"); + return (NULL); + } + + /* + * Allocate a new xmlC14NCtxPtr and fill the fields. + */ + ctx = (xmlC14NCtxPtr) xmlMalloc(sizeof(xmlC14NCtx)); + if (ctx == NULL) { + xmlC14NErrMemory("creating context"); + return (NULL); + } + memset(ctx, 0, sizeof(xmlC14NCtx)); + + /* + * initialize C14N context + */ + ctx->doc = doc; + ctx->with_comments = with_comments; + ctx->is_visible_callback = is_visible_callback; + ctx->user_data = user_data; + ctx->buf = buf; + ctx->parent_is_doc = 1; + ctx->pos = XMLC14N_BEFORE_DOCUMENT_ELEMENT; + ctx->ns_rendered = xmlC14NVisibleNsStackCreate(); + + if(ctx->ns_rendered == NULL) { + xmlC14NErr(ctx, (xmlNodePtr) doc, XML_C14N_CREATE_STACK, + "xmlC14NNewCtx: xmlC14NVisibleNsStackCreate failed\n"); + xmlC14NFreeCtx(ctx); + return (NULL); + } + + /* + * Set "mode" flag and remember list of incluseve prefixes + * for exclusive c14n + */ + ctx->mode = mode; + if(xmlC14NIsExclusive(ctx)) { + ctx->inclusive_ns_prefixes = inclusive_ns_prefixes; + } + return (ctx); +} + +/** + * xmlC14NExecute: + * @doc: the XML document for canonization + * @is_visible_callback:the function to use to determine is node visible + * or not + * @user_data: the first parameter for @is_visible_callback function + * (in most cases, it is nodes set) + * @mode: the c14n mode (see @xmlC14NMode) + * @inclusive_ns_prefixes: the list of inclusive namespace prefixes + * ended with a NULL or NULL if there is no + * inclusive namespaces (only for exclusive + * canonicalization, ignored otherwise) + * @with_comments: include comments in the result (!=0) or not (==0) + * @buf: the output buffer to store canonical XML; this + * buffer MUST have encoder==NULL because C14N requires + * UTF-8 output + * + * Dumps the canonized image of given XML document into the provided buffer. + * For details see "Canonical XML" (http://www.w3.org/TR/xml-c14n) or + * "Exclusive XML Canonicalization" (http://www.w3.org/TR/xml-exc-c14n) + * + * Returns non-negative value on success or a negative value on fail + */ +int +xmlC14NExecute(xmlDocPtr doc, xmlC14NIsVisibleCallback is_visible_callback, + void* user_data, int mode, xmlChar **inclusive_ns_prefixes, + int with_comments, xmlOutputBufferPtr buf) { + + xmlC14NCtxPtr ctx; + xmlC14NMode c14n_mode = XML_C14N_1_0; + int ret; + + if ((buf == NULL) || (doc == NULL)) { + xmlC14NErrParam("executing c14n"); + return (-1); + } + + /* for backward compatibility, we have to have "mode" as "int" + and here we check that user gives valid value */ + switch(mode) { + case XML_C14N_1_0: + case XML_C14N_EXCLUSIVE_1_0: + case XML_C14N_1_1: + c14n_mode = (xmlC14NMode)mode; + break; + default: + xmlC14NErrParam("invalid mode for executing c14n"); + return (-1); + } + + /* + * Validate the encoding output buffer encoding + */ + if (buf->encoder != NULL) { + xmlC14NErr(NULL, (xmlNodePtr) doc, XML_C14N_REQUIRES_UTF8, +"xmlC14NExecute: output buffer encoder != NULL but C14N requires UTF8 output\n"); + return (-1); + } + + ctx = xmlC14NNewCtx(doc, is_visible_callback, user_data, + c14n_mode, inclusive_ns_prefixes, + with_comments, buf); + if (ctx == NULL) { + xmlC14NErr(NULL, (xmlNodePtr) doc, XML_C14N_CREATE_CTXT, + "xmlC14NExecute: unable to create C14N context\n"); + return (-1); + } + + + + /* + * Root Node + * The root node is the parent of the top-level document element. The + * result of processing each of its child nodes that is in the node-set + * in document order. The root node does not generate a byte order mark, + * XML declaration, nor anything from within the document type + * declaration. + */ + if (doc->children != NULL) { + ret = xmlC14NProcessNodeList(ctx, doc->children); + if (ret < 0) { + xmlC14NErrInternal("processing docs children list"); + xmlC14NFreeCtx(ctx); + return (-1); + } + } + + /* + * Flush buffer to get number of bytes written + */ + ret = xmlOutputBufferFlush(buf); + if (ret < 0) { + xmlC14NErrInternal("flushing output buffer"); + xmlC14NFreeCtx(ctx); + return (-1); + } + + /* + * Cleanup + */ + xmlC14NFreeCtx(ctx); + return (ret); +} + +/** + * xmlC14NDocSaveTo: + * @doc: the XML document for canonization + * @nodes: the nodes set to be included in the canonized image + * or NULL if all document nodes should be included + * @mode: the c14n mode (see @xmlC14NMode) + * @inclusive_ns_prefixes: the list of inclusive namespace prefixes + * ended with a NULL or NULL if there is no + * inclusive namespaces (only for exclusive + * canonicalization, ignored otherwise) + * @with_comments: include comments in the result (!=0) or not (==0) + * @buf: the output buffer to store canonical XML; this + * buffer MUST have encoder==NULL because C14N requires + * UTF-8 output + * + * Dumps the canonized image of given XML document into the provided buffer. + * For details see "Canonical XML" (http://www.w3.org/TR/xml-c14n) or + * "Exclusive XML Canonicalization" (http://www.w3.org/TR/xml-exc-c14n) + * + * Returns non-negative value on success or a negative value on fail + */ +int +xmlC14NDocSaveTo(xmlDocPtr doc, xmlNodeSetPtr nodes, + int mode, xmlChar ** inclusive_ns_prefixes, + int with_comments, xmlOutputBufferPtr buf) { + return(xmlC14NExecute(doc, + (xmlC14NIsVisibleCallback)xmlC14NIsNodeInNodeset, + nodes, + mode, + inclusive_ns_prefixes, + with_comments, + buf)); +} + + +/** + * xmlC14NDocDumpMemory: + * @doc: the XML document for canonization + * @nodes: the nodes set to be included in the canonized image + * or NULL if all document nodes should be included + * @mode: the c14n mode (see @xmlC14NMode) + * @inclusive_ns_prefixes: the list of inclusive namespace prefixes + * ended with a NULL or NULL if there is no + * inclusive namespaces (only for exclusive + * canonicalization, ignored otherwise) + * @with_comments: include comments in the result (!=0) or not (==0) + * @doc_txt_ptr: the memory pointer for allocated canonical XML text; + * the caller of this functions is responsible for calling + * xmlFree() to free allocated memory + * + * Dumps the canonized image of given XML document into memory. + * For details see "Canonical XML" (http://www.w3.org/TR/xml-c14n) or + * "Exclusive XML Canonicalization" (http://www.w3.org/TR/xml-exc-c14n) + * + * Returns the number of bytes written on success or a negative value on fail + */ +int +xmlC14NDocDumpMemory(xmlDocPtr doc, xmlNodeSetPtr nodes, + int mode, xmlChar ** inclusive_ns_prefixes, + int with_comments, xmlChar ** doc_txt_ptr) +{ + int ret; + xmlOutputBufferPtr buf; + + if (doc_txt_ptr == NULL) { + xmlC14NErrParam("dumping doc to memory"); + return (-1); + } + + *doc_txt_ptr = NULL; + + /* + * create memory buffer with UTF8 (default) encoding + */ + buf = xmlAllocOutputBuffer(NULL); + if (buf == NULL) { + xmlC14NErrMemory("creating output buffer"); + return (-1); + } + + /* + * canonize document and write to buffer + */ + ret = xmlC14NDocSaveTo(doc, nodes, mode, inclusive_ns_prefixes, + with_comments, buf); + if (ret < 0) { + xmlC14NErrInternal("saving doc to output buffer"); + (void) xmlOutputBufferClose(buf); + return (-1); + } + + ret = xmlBufUse(buf->buffer); + if (ret > 0) { + *doc_txt_ptr = xmlStrndup(xmlBufContent(buf->buffer), ret); + } + (void) xmlOutputBufferClose(buf); + + if ((*doc_txt_ptr == NULL) && (ret > 0)) { + xmlC14NErrMemory("coping canonicanized document"); + return (-1); + } + return (ret); +} + +/** + * xmlC14NDocSave: + * @doc: the XML document for canonization + * @nodes: the nodes set to be included in the canonized image + * or NULL if all document nodes should be included + * @mode: the c14n mode (see @xmlC14NMode) + * @inclusive_ns_prefixes: the list of inclusive namespace prefixes + * ended with a NULL or NULL if there is no + * inclusive namespaces (only for exclusive + * canonicalization, ignored otherwise) + * @with_comments: include comments in the result (!=0) or not (==0) + * @filename: the filename to store canonical XML image + * @compression: the compression level (zlib requred): + * -1 - libxml default, + * 0 - uncompressed, + * >0 - compression level + * + * Dumps the canonized image of given XML document into the file. + * For details see "Canonical XML" (http://www.w3.org/TR/xml-c14n) or + * "Exclusive XML Canonicalization" (http://www.w3.org/TR/xml-exc-c14n) + * + * Returns the number of bytes written success or a negative value on fail + */ +int +xmlC14NDocSave(xmlDocPtr doc, xmlNodeSetPtr nodes, + int mode, xmlChar ** inclusive_ns_prefixes, + int with_comments, const char *filename, int compression) +{ + xmlOutputBufferPtr buf; + int ret; + + if (filename == NULL) { + xmlC14NErrParam("saving doc"); + return (-1); + } +#ifdef HAVE_ZLIB_H + if (compression < 0) + compression = xmlGetCompressMode(); +#endif + + /* + * save the content to a temp buffer, use default UTF8 encoding. + */ + buf = xmlOutputBufferCreateFilename(filename, NULL, compression); + if (buf == NULL) { + xmlC14NErrInternal("creating temporary filename"); + return (-1); + } + + /* + * canonize document and write to buffer + */ + ret = xmlC14NDocSaveTo(doc, nodes, mode, inclusive_ns_prefixes, + with_comments, buf); + if (ret < 0) { + xmlC14NErrInternal("cannicanize document to buffer"); + (void) xmlOutputBufferClose(buf); + return (-1); + } + + /* + * get the numbers of bytes written + */ + ret = xmlOutputBufferClose(buf); + return (ret); +} + + + +/* + * Macro used to grow the current buffer. + */ +#define growBufferReentrant() { \ + buffer_size *= 2; \ + buffer = (xmlChar *) \ + xmlRealloc(buffer, buffer_size * sizeof(xmlChar)); \ + if (buffer == NULL) { \ + xmlC14NErrMemory("growing buffer"); \ + return(NULL); \ + } \ +} + +/** + * xmlC11NNormalizeString: + * @input: the input string + * @mode: the normalization mode (attribute, comment, PI or text) + * + * Converts a string to a canonical (normalized) format. The code is stolen + * from xmlEncodeEntitiesReentrant(). Added normalization of \x09, \x0a, \x0A + * and the @mode parameter + * + * Returns a normalized string (caller is responsible for calling xmlFree()) + * or NULL if an error occurs + */ +static xmlChar * +xmlC11NNormalizeString(const xmlChar * input, + xmlC14NNormalizationMode mode) +{ + const xmlChar *cur = input; + xmlChar *buffer = NULL; + xmlChar *out = NULL; + int buffer_size = 0; + + if (input == NULL) + return (NULL); + + /* + * allocate an translation buffer. + */ + buffer_size = 1000; + buffer = (xmlChar *) xmlMallocAtomic(buffer_size * sizeof(xmlChar)); + if (buffer == NULL) { + xmlC14NErrMemory("allocating buffer"); + return (NULL); + } + out = buffer; + + while (*cur != '\0') { + if ((out - buffer) > (buffer_size - 10)) { + int indx = out - buffer; + + growBufferReentrant(); + out = &buffer[indx]; + } + + if ((*cur == '<') && ((mode == XMLC14N_NORMALIZE_ATTR) || + (mode == XMLC14N_NORMALIZE_TEXT))) { + *out++ = '&'; + *out++ = 'l'; + *out++ = 't'; + *out++ = ';'; + } else if ((*cur == '>') && (mode == XMLC14N_NORMALIZE_TEXT)) { + *out++ = '&'; + *out++ = 'g'; + *out++ = 't'; + *out++ = ';'; + } else if ((*cur == '&') && ((mode == XMLC14N_NORMALIZE_ATTR) || + (mode == XMLC14N_NORMALIZE_TEXT))) { + *out++ = '&'; + *out++ = 'a'; + *out++ = 'm'; + *out++ = 'p'; + *out++ = ';'; + } else if ((*cur == '"') && (mode == XMLC14N_NORMALIZE_ATTR)) { + *out++ = '&'; + *out++ = 'q'; + *out++ = 'u'; + *out++ = 'o'; + *out++ = 't'; + *out++ = ';'; + } else if ((*cur == '\x09') && (mode == XMLC14N_NORMALIZE_ATTR)) { + *out++ = '&'; + *out++ = '#'; + *out++ = 'x'; + *out++ = '9'; + *out++ = ';'; + } else if ((*cur == '\x0A') && (mode == XMLC14N_NORMALIZE_ATTR)) { + *out++ = '&'; + *out++ = '#'; + *out++ = 'x'; + *out++ = 'A'; + *out++ = ';'; + } else if ((*cur == '\x0D') && ((mode == XMLC14N_NORMALIZE_ATTR) || + (mode == XMLC14N_NORMALIZE_TEXT) || + (mode == XMLC14N_NORMALIZE_COMMENT) || + (mode == XMLC14N_NORMALIZE_PI))) { + *out++ = '&'; + *out++ = '#'; + *out++ = 'x'; + *out++ = 'D'; + *out++ = ';'; + } else { + /* + * Works because on UTF-8, all extended sequences cannot + * result in bytes in the ASCII range. + */ + *out++ = *cur; + } + cur++; + } + *out = 0; + return (buffer); +} +#endif /* LIBXML_OUTPUT_ENABLED */ +#define bottom_c14n +#include "elfgcchack.h" +#endif /* LIBXML_C14N_ENABLED */ diff --git a/vendors/libxml/src/catalog.c b/vendors/libxml/src/catalog.c new file mode 100644 index 0000000..8e34cd2 --- /dev/null +++ b/vendors/libxml/src/catalog.c @@ -0,0 +1,3820 @@ +/** + * catalog.c: set of generic Catalog related routines + * + * Reference: SGML Open Technical Resolution TR9401:1997. + * http://www.jclark.com/sp/catalog.htm + * + * XML Catalogs Working Draft 06 August 2001 + * http://www.oasis-open.org/committees/entity/spec-2001-08-06.html + * + * See Copyright for the status of this software. + * + * Daniel.Veillard@imag.fr + */ + +#define IN_LIBXML +#include "libxml.h" + +#ifdef LIBXML_CATALOG_ENABLED +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_FCNTL_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "buf.h" + +#define MAX_DELEGATE 50 +#define MAX_CATAL_DEPTH 50 + +#ifdef _WIN32 +# define PATH_SEAPARATOR ';' +#else +# define PATH_SEAPARATOR ':' +#endif + +/** + * TODO: + * + * macro to flag unimplemented blocks + * XML_CATALOG_PREFER user env to select between system/public prefered + * option. C.f. Richard Tobin + *> Just FYI, I am using an environment variable XML_CATALOG_PREFER with + *> values "system" and "public". I have made the default be "system" to + *> match yours. + */ +#define TODO \ + xmlGenericError(xmlGenericErrorContext, \ + "Unimplemented block at %s:%d\n", \ + __FILE__, __LINE__); + +#define XML_URN_PUBID "urn:publicid:" +#define XML_CATAL_BREAK ((xmlChar *) -1) +#ifndef XML_XML_DEFAULT_CATALOG +#define XML_XML_DEFAULT_CATALOG "file:///etc/xml/catalog" +#endif +#ifndef XML_SGML_DEFAULT_CATALOG +#define XML_SGML_DEFAULT_CATALOG "file:///etc/sgml/catalog" +#endif + +#if defined(_WIN32) && defined(_MSC_VER) +#undef XML_XML_DEFAULT_CATALOG +static char XML_XML_DEFAULT_CATALOG[256] = "file:///etc/xml/catalog"; +#if defined(_WIN32_WCE) +/* Windows CE don't have a A variant */ +#define GetModuleHandleA GetModuleHandle +#define GetModuleFileNameA GetModuleFileName +#else +#if !defined(_WINDOWS_) +void* __stdcall GetModuleHandleA(const char*); +unsigned long __stdcall GetModuleFileNameA(void*, char*, unsigned long); +#endif +#endif +#endif + +static xmlChar *xmlCatalogNormalizePublic(const xmlChar *pubID); +static int xmlExpandCatalog(xmlCatalogPtr catal, const char *filename); + +/************************************************************************ + * * + * Types, all private * + * * + ************************************************************************/ + +typedef enum { + XML_CATA_REMOVED = -1, + XML_CATA_NONE = 0, + XML_CATA_CATALOG, + XML_CATA_BROKEN_CATALOG, + XML_CATA_NEXT_CATALOG, + XML_CATA_GROUP, + XML_CATA_PUBLIC, + XML_CATA_SYSTEM, + XML_CATA_REWRITE_SYSTEM, + XML_CATA_DELEGATE_PUBLIC, + XML_CATA_DELEGATE_SYSTEM, + XML_CATA_URI, + XML_CATA_REWRITE_URI, + XML_CATA_DELEGATE_URI, + SGML_CATA_SYSTEM, + SGML_CATA_PUBLIC, + SGML_CATA_ENTITY, + SGML_CATA_PENTITY, + SGML_CATA_DOCTYPE, + SGML_CATA_LINKTYPE, + SGML_CATA_NOTATION, + SGML_CATA_DELEGATE, + SGML_CATA_BASE, + SGML_CATA_CATALOG, + SGML_CATA_DOCUMENT, + SGML_CATA_SGMLDECL +} xmlCatalogEntryType; + +typedef struct _xmlCatalogEntry xmlCatalogEntry; +typedef xmlCatalogEntry *xmlCatalogEntryPtr; +struct _xmlCatalogEntry { + struct _xmlCatalogEntry *next; + struct _xmlCatalogEntry *parent; + struct _xmlCatalogEntry *children; + xmlCatalogEntryType type; + xmlChar *name; + xmlChar *value; + xmlChar *URL; /* The expanded URL using the base */ + xmlCatalogPrefer prefer; + int dealloc; + int depth; + struct _xmlCatalogEntry *group; +}; + +typedef enum { + XML_XML_CATALOG_TYPE = 1, + XML_SGML_CATALOG_TYPE +} xmlCatalogType; + +#define XML_MAX_SGML_CATA_DEPTH 10 +struct _xmlCatalog { + xmlCatalogType type; /* either XML or SGML */ + + /* + * SGML Catalogs are stored as a simple hash table of catalog entries + * Catalog stack to check against overflows when building the + * SGML catalog + */ + char *catalTab[XML_MAX_SGML_CATA_DEPTH]; /* stack of catals */ + int catalNr; /* Number of current catal streams */ + int catalMax; /* Max number of catal streams */ + xmlHashTablePtr sgml; + + /* + * XML Catalogs are stored as a tree of Catalog entries + */ + xmlCatalogPrefer prefer; + xmlCatalogEntryPtr xml; +}; + +/************************************************************************ + * * + * Global variables * + * * + ************************************************************************/ + +/* + * Those are preferences + */ +static int xmlDebugCatalogs = 0; /* used for debugging */ +static xmlCatalogAllow xmlCatalogDefaultAllow = XML_CATA_ALLOW_ALL; +static xmlCatalogPrefer xmlCatalogDefaultPrefer = XML_CATA_PREFER_PUBLIC; + +/* + * Hash table containing all the trees of XML catalogs parsed by + * the application. + */ +static xmlHashTablePtr xmlCatalogXMLFiles = NULL; + +/* + * The default catalog in use by the application + */ +static xmlCatalogPtr xmlDefaultCatalog = NULL; + +/* + * A mutex for modifying the shared global catalog(s) + * xmlDefaultCatalog tree. + * It also protects xmlCatalogXMLFiles + * The core of this readers/writer scheme is in xmlFetchXMLCatalogFile() + */ +static xmlRMutexPtr xmlCatalogMutex = NULL; + +/* + * Whether the catalog support was initialized. + */ +static int xmlCatalogInitialized = 0; + +/************************************************************************ + * * + * Catalog error handlers * + * * + ************************************************************************/ + +/** + * xmlCatalogErrMemory: + * @extra: extra informations + * + * Handle an out of memory condition + */ +static void +xmlCatalogErrMemory(const char *extra) +{ + __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_CATALOG, + XML_ERR_NO_MEMORY, XML_ERR_ERROR, NULL, 0, + extra, NULL, NULL, 0, 0, + "Memory allocation failed : %s\n", extra); +} + +/** + * xmlCatalogErr: + * @catal: the Catalog entry + * @node: the context node + * @msg: the error message + * @extra: extra informations + * + * Handle a catalog error + */ +static void +xmlCatalogErr(xmlCatalogEntryPtr catal, xmlNodePtr node, int error, + const char *msg, const xmlChar *str1, const xmlChar *str2, + const xmlChar *str3) +{ + __xmlRaiseError(NULL, NULL, NULL, catal, node, XML_FROM_CATALOG, + error, XML_ERR_ERROR, NULL, 0, + (const char *) str1, (const char *) str2, + (const char *) str3, 0, 0, + msg, str1, str2, str3); +} + + +/************************************************************************ + * * + * Allocation and Freeing * + * * + ************************************************************************/ + +/** + * xmlNewCatalogEntry: + * @type: type of entry + * @name: name of the entry + * @value: value of the entry + * @prefer: the PUBLIC vs. SYSTEM current preference value + * @group: for members of a group, the group entry + * + * create a new Catalog entry, this type is shared both by XML and + * SGML catalogs, but the acceptable types values differs. + * + * Returns the xmlCatalogEntryPtr or NULL in case of error + */ +static xmlCatalogEntryPtr +xmlNewCatalogEntry(xmlCatalogEntryType type, const xmlChar *name, + const xmlChar *value, const xmlChar *URL, xmlCatalogPrefer prefer, + xmlCatalogEntryPtr group) { + xmlCatalogEntryPtr ret; + xmlChar *normid = NULL; + + ret = (xmlCatalogEntryPtr) xmlMalloc(sizeof(xmlCatalogEntry)); + if (ret == NULL) { + xmlCatalogErrMemory("allocating catalog entry"); + return(NULL); + } + ret->next = NULL; + ret->parent = NULL; + ret->children = NULL; + ret->type = type; + if (type == XML_CATA_PUBLIC || type == XML_CATA_DELEGATE_PUBLIC) { + normid = xmlCatalogNormalizePublic(name); + if (normid != NULL) + name = (*normid != 0 ? normid : NULL); + } + if (name != NULL) + ret->name = xmlStrdup(name); + else + ret->name = NULL; + if (normid != NULL) + xmlFree(normid); + if (value != NULL) + ret->value = xmlStrdup(value); + else + ret->value = NULL; + if (URL == NULL) + URL = value; + if (URL != NULL) + ret->URL = xmlStrdup(URL); + else + ret->URL = NULL; + ret->prefer = prefer; + ret->dealloc = 0; + ret->depth = 0; + ret->group = group; + return(ret); +} + +static void +xmlFreeCatalogEntryList(xmlCatalogEntryPtr ret); + +/** + * xmlFreeCatalogEntry: + * @ret: a Catalog entry + * + * Free the memory allocated to a Catalog entry + */ +static void +xmlFreeCatalogEntry(xmlCatalogEntryPtr ret) { + if (ret == NULL) + return; + /* + * Entries stored in the file hash must be deallocated + * only by the file hash cleaner ! + */ + if (ret->dealloc == 1) + return; + + if (xmlDebugCatalogs) { + if (ret->name != NULL) + xmlGenericError(xmlGenericErrorContext, + "Free catalog entry %s\n", ret->name); + else if (ret->value != NULL) + xmlGenericError(xmlGenericErrorContext, + "Free catalog entry %s\n", ret->value); + else + xmlGenericError(xmlGenericErrorContext, + "Free catalog entry\n"); + } + + if (ret->name != NULL) + xmlFree(ret->name); + if (ret->value != NULL) + xmlFree(ret->value); + if (ret->URL != NULL) + xmlFree(ret->URL); + xmlFree(ret); +} + +/** + * xmlFreeCatalogEntryList: + * @ret: a Catalog entry list + * + * Free the memory allocated to a full chained list of Catalog entries + */ +static void +xmlFreeCatalogEntryList(xmlCatalogEntryPtr ret) { + xmlCatalogEntryPtr next; + + while (ret != NULL) { + next = ret->next; + xmlFreeCatalogEntry(ret); + ret = next; + } +} + +/** + * xmlFreeCatalogHashEntryList: + * @ret: a Catalog entry list + * + * Free the memory allocated to list of Catalog entries from the + * catalog file hash. + */ +static void +xmlFreeCatalogHashEntryList(xmlCatalogEntryPtr catal) { + xmlCatalogEntryPtr children, next; + + if (catal == NULL) + return; + + children = catal->children; + while (children != NULL) { + next = children->next; + children->dealloc = 0; + children->children = NULL; + xmlFreeCatalogEntry(children); + children = next; + } + catal->dealloc = 0; + xmlFreeCatalogEntry(catal); +} + +/** + * xmlCreateNewCatalog: + * @type: type of catalog + * @prefer: the PUBLIC vs. SYSTEM current preference value + * + * create a new Catalog, this type is shared both by XML and + * SGML catalogs, but the acceptable types values differs. + * + * Returns the xmlCatalogPtr or NULL in case of error + */ +static xmlCatalogPtr +xmlCreateNewCatalog(xmlCatalogType type, xmlCatalogPrefer prefer) { + xmlCatalogPtr ret; + + ret = (xmlCatalogPtr) xmlMalloc(sizeof(xmlCatalog)); + if (ret == NULL) { + xmlCatalogErrMemory("allocating catalog"); + return(NULL); + } + memset(ret, 0, sizeof(xmlCatalog)); + ret->type = type; + ret->catalNr = 0; + ret->catalMax = XML_MAX_SGML_CATA_DEPTH; + ret->prefer = prefer; + if (ret->type == XML_SGML_CATALOG_TYPE) + ret->sgml = xmlHashCreate(10); + return(ret); +} + +/** + * xmlFreeCatalog: + * @catal: a Catalog + * + * Free the memory allocated to a Catalog + */ +void +xmlFreeCatalog(xmlCatalogPtr catal) { + if (catal == NULL) + return; + if (catal->xml != NULL) + xmlFreeCatalogEntryList(catal->xml); + if (catal->sgml != NULL) + xmlHashFree(catal->sgml, + (xmlHashDeallocator) xmlFreeCatalogEntry); + xmlFree(catal); +} + +/************************************************************************ + * * + * Serializing Catalogs * + * * + ************************************************************************/ + +#ifdef LIBXML_OUTPUT_ENABLED +/** + * xmlCatalogDumpEntry: + * @entry: the catalog entry + * @out: the file. + * + * Serialize an SGML Catalog entry + */ +static void +xmlCatalogDumpEntry(xmlCatalogEntryPtr entry, FILE *out) { + if ((entry == NULL) || (out == NULL)) + return; + switch (entry->type) { + case SGML_CATA_ENTITY: + fprintf(out, "ENTITY "); break; + case SGML_CATA_PENTITY: + fprintf(out, "ENTITY %%"); break; + case SGML_CATA_DOCTYPE: + fprintf(out, "DOCTYPE "); break; + case SGML_CATA_LINKTYPE: + fprintf(out, "LINKTYPE "); break; + case SGML_CATA_NOTATION: + fprintf(out, "NOTATION "); break; + case SGML_CATA_PUBLIC: + fprintf(out, "PUBLIC "); break; + case SGML_CATA_SYSTEM: + fprintf(out, "SYSTEM "); break; + case SGML_CATA_DELEGATE: + fprintf(out, "DELEGATE "); break; + case SGML_CATA_BASE: + fprintf(out, "BASE "); break; + case SGML_CATA_CATALOG: + fprintf(out, "CATALOG "); break; + case SGML_CATA_DOCUMENT: + fprintf(out, "DOCUMENT "); break; + case SGML_CATA_SGMLDECL: + fprintf(out, "SGMLDECL "); break; + default: + return; + } + switch (entry->type) { + case SGML_CATA_ENTITY: + case SGML_CATA_PENTITY: + case SGML_CATA_DOCTYPE: + case SGML_CATA_LINKTYPE: + case SGML_CATA_NOTATION: + fprintf(out, "%s", (const char *) entry->name); break; + case SGML_CATA_PUBLIC: + case SGML_CATA_SYSTEM: + case SGML_CATA_SGMLDECL: + case SGML_CATA_DOCUMENT: + case SGML_CATA_CATALOG: + case SGML_CATA_BASE: + case SGML_CATA_DELEGATE: + fprintf(out, "\"%s\"", entry->name); break; + default: + break; + } + switch (entry->type) { + case SGML_CATA_ENTITY: + case SGML_CATA_PENTITY: + case SGML_CATA_DOCTYPE: + case SGML_CATA_LINKTYPE: + case SGML_CATA_NOTATION: + case SGML_CATA_PUBLIC: + case SGML_CATA_SYSTEM: + case SGML_CATA_DELEGATE: + fprintf(out, " \"%s\"", entry->value); break; + default: + break; + } + fprintf(out, "\n"); +} + +/** + * xmlDumpXMLCatalogNode: + * @catal: top catalog entry + * @catalog: pointer to the xml tree + * @doc: the containing document + * @ns: the current namespace + * @cgroup: group node for group members + * + * Serializes a Catalog entry, called by xmlDumpXMLCatalog and recursively + * for group entries + */ +static void xmlDumpXMLCatalogNode(xmlCatalogEntryPtr catal, xmlNodePtr catalog, + xmlDocPtr doc, xmlNsPtr ns, xmlCatalogEntryPtr cgroup) { + xmlNodePtr node; + xmlCatalogEntryPtr cur; + /* + * add all the catalog entries + */ + cur = catal; + while (cur != NULL) { + if (cur->group == cgroup) { + switch (cur->type) { + case XML_CATA_REMOVED: + break; + case XML_CATA_BROKEN_CATALOG: + case XML_CATA_CATALOG: + if (cur == catal) { + cur = cur->children; + continue; + } + break; + case XML_CATA_NEXT_CATALOG: + node = xmlNewDocNode(doc, ns, BAD_CAST "nextCatalog", NULL); + xmlSetProp(node, BAD_CAST "catalog", cur->value); + xmlAddChild(catalog, node); + break; + case XML_CATA_NONE: + break; + case XML_CATA_GROUP: + node = xmlNewDocNode(doc, ns, BAD_CAST "group", NULL); + xmlSetProp(node, BAD_CAST "id", cur->name); + if (cur->value != NULL) { + xmlNsPtr xns; + xns = xmlSearchNsByHref(doc, node, XML_XML_NAMESPACE); + if (xns != NULL) + xmlSetNsProp(node, xns, BAD_CAST "base", + cur->value); + } + switch (cur->prefer) { + case XML_CATA_PREFER_NONE: + break; + case XML_CATA_PREFER_PUBLIC: + xmlSetProp(node, BAD_CAST "prefer", BAD_CAST "public"); + break; + case XML_CATA_PREFER_SYSTEM: + xmlSetProp(node, BAD_CAST "prefer", BAD_CAST "system"); + break; + } + xmlDumpXMLCatalogNode(cur->next, node, doc, ns, cur); + xmlAddChild(catalog, node); + break; + case XML_CATA_PUBLIC: + node = xmlNewDocNode(doc, ns, BAD_CAST "public", NULL); + xmlSetProp(node, BAD_CAST "publicId", cur->name); + xmlSetProp(node, BAD_CAST "uri", cur->value); + xmlAddChild(catalog, node); + break; + case XML_CATA_SYSTEM: + node = xmlNewDocNode(doc, ns, BAD_CAST "system", NULL); + xmlSetProp(node, BAD_CAST "systemId", cur->name); + xmlSetProp(node, BAD_CAST "uri", cur->value); + xmlAddChild(catalog, node); + break; + case XML_CATA_REWRITE_SYSTEM: + node = xmlNewDocNode(doc, ns, BAD_CAST "rewriteSystem", NULL); + xmlSetProp(node, BAD_CAST "systemIdStartString", cur->name); + xmlSetProp(node, BAD_CAST "rewritePrefix", cur->value); + xmlAddChild(catalog, node); + break; + case XML_CATA_DELEGATE_PUBLIC: + node = xmlNewDocNode(doc, ns, BAD_CAST "delegatePublic", NULL); + xmlSetProp(node, BAD_CAST "publicIdStartString", cur->name); + xmlSetProp(node, BAD_CAST "catalog", cur->value); + xmlAddChild(catalog, node); + break; + case XML_CATA_DELEGATE_SYSTEM: + node = xmlNewDocNode(doc, ns, BAD_CAST "delegateSystem", NULL); + xmlSetProp(node, BAD_CAST "systemIdStartString", cur->name); + xmlSetProp(node, BAD_CAST "catalog", cur->value); + xmlAddChild(catalog, node); + break; + case XML_CATA_URI: + node = xmlNewDocNode(doc, ns, BAD_CAST "uri", NULL); + xmlSetProp(node, BAD_CAST "name", cur->name); + xmlSetProp(node, BAD_CAST "uri", cur->value); + xmlAddChild(catalog, node); + break; + case XML_CATA_REWRITE_URI: + node = xmlNewDocNode(doc, ns, BAD_CAST "rewriteURI", NULL); + xmlSetProp(node, BAD_CAST "uriStartString", cur->name); + xmlSetProp(node, BAD_CAST "rewritePrefix", cur->value); + xmlAddChild(catalog, node); + break; + case XML_CATA_DELEGATE_URI: + node = xmlNewDocNode(doc, ns, BAD_CAST "delegateURI", NULL); + xmlSetProp(node, BAD_CAST "uriStartString", cur->name); + xmlSetProp(node, BAD_CAST "catalog", cur->value); + xmlAddChild(catalog, node); + break; + case SGML_CATA_SYSTEM: + case SGML_CATA_PUBLIC: + case SGML_CATA_ENTITY: + case SGML_CATA_PENTITY: + case SGML_CATA_DOCTYPE: + case SGML_CATA_LINKTYPE: + case SGML_CATA_NOTATION: + case SGML_CATA_DELEGATE: + case SGML_CATA_BASE: + case SGML_CATA_CATALOG: + case SGML_CATA_DOCUMENT: + case SGML_CATA_SGMLDECL: + break; + } + } + cur = cur->next; + } +} + +static int +xmlDumpXMLCatalog(FILE *out, xmlCatalogEntryPtr catal) { + int ret; + xmlDocPtr doc; + xmlNsPtr ns; + xmlDtdPtr dtd; + xmlNodePtr catalog; + xmlOutputBufferPtr buf; + + /* + * Rebuild a catalog + */ + doc = xmlNewDoc(NULL); + if (doc == NULL) + return(-1); + dtd = xmlNewDtd(doc, BAD_CAST "catalog", + BAD_CAST "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN", +BAD_CAST "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd"); + + xmlAddChild((xmlNodePtr) doc, (xmlNodePtr) dtd); + + ns = xmlNewNs(NULL, XML_CATALOGS_NAMESPACE, NULL); + if (ns == NULL) { + xmlFreeDoc(doc); + return(-1); + } + catalog = xmlNewDocNode(doc, ns, BAD_CAST "catalog", NULL); + if (catalog == NULL) { + xmlFreeNs(ns); + xmlFreeDoc(doc); + return(-1); + } + catalog->nsDef = ns; + xmlAddChild((xmlNodePtr) doc, catalog); + + xmlDumpXMLCatalogNode(catal, catalog, doc, ns, NULL); + + /* + * reserialize it + */ + buf = xmlOutputBufferCreateFile(out, NULL); + if (buf == NULL) { + xmlFreeDoc(doc); + return(-1); + } + ret = xmlSaveFormatFileTo(buf, doc, NULL, 1); + + /* + * Free it + */ + xmlFreeDoc(doc); + + return(ret); +} +#endif /* LIBXML_OUTPUT_ENABLED */ + +/************************************************************************ + * * + * Converting SGML Catalogs to XML * + * * + ************************************************************************/ + +/** + * xmlCatalogConvertEntry: + * @entry: the entry + * @catal: pointer to the catalog being converted + * + * Convert one entry from the catalog + */ +static void +xmlCatalogConvertEntry(xmlCatalogEntryPtr entry, xmlCatalogPtr catal) { + if ((entry == NULL) || (catal == NULL) || (catal->sgml == NULL) || + (catal->xml == NULL)) + return; + switch (entry->type) { + case SGML_CATA_ENTITY: + entry->type = XML_CATA_PUBLIC; + break; + case SGML_CATA_PENTITY: + entry->type = XML_CATA_PUBLIC; + break; + case SGML_CATA_DOCTYPE: + entry->type = XML_CATA_PUBLIC; + break; + case SGML_CATA_LINKTYPE: + entry->type = XML_CATA_PUBLIC; + break; + case SGML_CATA_NOTATION: + entry->type = XML_CATA_PUBLIC; + break; + case SGML_CATA_PUBLIC: + entry->type = XML_CATA_PUBLIC; + break; + case SGML_CATA_SYSTEM: + entry->type = XML_CATA_SYSTEM; + break; + case SGML_CATA_DELEGATE: + entry->type = XML_CATA_DELEGATE_PUBLIC; + break; + case SGML_CATA_CATALOG: + entry->type = XML_CATA_CATALOG; + break; + default: + xmlHashRemoveEntry(catal->sgml, entry->name, + (xmlHashDeallocator) xmlFreeCatalogEntry); + return; + } + /* + * Conversion successful, remove from the SGML catalog + * and add it to the default XML one + */ + xmlHashRemoveEntry(catal->sgml, entry->name, NULL); + entry->parent = catal->xml; + entry->next = NULL; + if (catal->xml->children == NULL) + catal->xml->children = entry; + else { + xmlCatalogEntryPtr prev; + + prev = catal->xml->children; + while (prev->next != NULL) + prev = prev->next; + prev->next = entry; + } +} + +/** + * xmlConvertSGMLCatalog: + * @catal: the catalog + * + * Convert all the SGML catalog entries as XML ones + * + * Returns the number of entries converted if successful, -1 otherwise + */ +int +xmlConvertSGMLCatalog(xmlCatalogPtr catal) { + + if ((catal == NULL) || (catal->type != XML_SGML_CATALOG_TYPE)) + return(-1); + + if (xmlDebugCatalogs) { + xmlGenericError(xmlGenericErrorContext, + "Converting SGML catalog to XML\n"); + } + xmlHashScan(catal->sgml, + (xmlHashScanner) xmlCatalogConvertEntry, + &catal); + return(0); +} + +/************************************************************************ + * * + * Helper function * + * * + ************************************************************************/ + +/** + * xmlCatalogUnWrapURN: + * @urn: an "urn:publicid:" to unwrap + * + * Expand the URN into the equivalent Public Identifier + * + * Returns the new identifier or NULL, the string must be deallocated + * by the caller. + */ +static xmlChar * +xmlCatalogUnWrapURN(const xmlChar *urn) { + xmlChar result[2000]; + unsigned int i = 0; + + if (xmlStrncmp(urn, BAD_CAST XML_URN_PUBID, sizeof(XML_URN_PUBID) - 1)) + return(NULL); + urn += sizeof(XML_URN_PUBID) - 1; + + while (*urn != 0) { + if (i > sizeof(result) - 4) + break; + if (*urn == '+') { + result[i++] = ' '; + urn++; + } else if (*urn == ':') { + result[i++] = '/'; + result[i++] = '/'; + urn++; + } else if (*urn == ';') { + result[i++] = ':'; + result[i++] = ':'; + urn++; + } else if (*urn == '%') { + if ((urn[1] == '2') && (urn[2] == 'B')) + result[i++] = '+'; + else if ((urn[1] == '3') && (urn[2] == 'A')) + result[i++] = ':'; + else if ((urn[1] == '2') && (urn[2] == 'F')) + result[i++] = '/'; + else if ((urn[1] == '3') && (urn[2] == 'B')) + result[i++] = ';'; + else if ((urn[1] == '2') && (urn[2] == '7')) + result[i++] = '\''; + else if ((urn[1] == '3') && (urn[2] == 'F')) + result[i++] = '?'; + else if ((urn[1] == '2') && (urn[2] == '3')) + result[i++] = '#'; + else if ((urn[1] == '2') && (urn[2] == '5')) + result[i++] = '%'; + else { + result[i++] = *urn; + urn++; + continue; + } + urn += 3; + } else { + result[i++] = *urn; + urn++; + } + } + result[i] = 0; + + return(xmlStrdup(result)); +} + +/** + * xmlParseCatalogFile: + * @filename: the filename + * + * parse an XML file and build a tree. It's like xmlParseFile() + * except it bypass all catalog lookups. + * + * Returns the resulting document tree or NULL in case of error + */ + +xmlDocPtr +xmlParseCatalogFile(const char *filename) { + xmlDocPtr ret; + xmlParserCtxtPtr ctxt; + char *directory = NULL; + xmlParserInputPtr inputStream; + xmlParserInputBufferPtr buf; + + ctxt = xmlNewParserCtxt(); + if (ctxt == NULL) { +#ifdef LIBXML_SAX1_ENABLED + if (xmlDefaultSAXHandler.error != NULL) { + xmlDefaultSAXHandler.error(NULL, "out of memory\n"); + } +#endif + return(NULL); + } + + buf = xmlParserInputBufferCreateFilename(filename, XML_CHAR_ENCODING_NONE); + if (buf == NULL) { + xmlFreeParserCtxt(ctxt); + return(NULL); + } + + inputStream = xmlNewInputStream(ctxt); + if (inputStream == NULL) { + xmlFreeParserCtxt(ctxt); + return(NULL); + } + + inputStream->filename = (char *) xmlCanonicPath((const xmlChar *)filename); + inputStream->buf = buf; + xmlBufResetInput(buf->buffer, inputStream); + + inputPush(ctxt, inputStream); + if ((ctxt->directory == NULL) && (directory == NULL)) + directory = xmlParserGetDirectory(filename); + if ((ctxt->directory == NULL) && (directory != NULL)) + ctxt->directory = directory; + ctxt->valid = 0; + ctxt->validate = 0; + ctxt->loadsubset = 0; + ctxt->pedantic = 0; + ctxt->dictNames = 1; + + xmlParseDocument(ctxt); + + if (ctxt->wellFormed) + ret = ctxt->myDoc; + else { + ret = NULL; + xmlFreeDoc(ctxt->myDoc); + ctxt->myDoc = NULL; + } + xmlFreeParserCtxt(ctxt); + + return(ret); +} + +/** + * xmlLoadFileContent: + * @filename: a file path + * + * Load a file content into memory. + * + * Returns a pointer to the 0 terminated string or NULL in case of error + */ +static xmlChar * +xmlLoadFileContent(const char *filename) +{ +#ifdef HAVE_STAT + int fd; +#else + FILE *fd; +#endif + int len; + long size; + +#ifdef HAVE_STAT + struct stat info; +#endif + xmlChar *content; + + if (filename == NULL) + return (NULL); + +#ifdef HAVE_STAT + if (stat(filename, &info) < 0) + return (NULL); +#endif + +#ifdef HAVE_STAT + if ((fd = open(filename, O_RDONLY)) < 0) +#else + if ((fd = fopen(filename, "rb")) == NULL) +#endif + { + return (NULL); + } +#ifdef HAVE_STAT + size = info.st_size; +#else + if (fseek(fd, 0, SEEK_END) || (size = ftell(fd)) == EOF || fseek(fd, 0, SEEK_SET)) { /* File operations denied? ok, just close and return failure */ + fclose(fd); + return (NULL); + } +#endif + content = (xmlChar*)xmlMallocAtomic(size + 10); + if (content == NULL) { + xmlCatalogErrMemory("allocating catalog data"); + return (NULL); + } +#ifdef HAVE_STAT + len = read(fd, content, size); + close(fd); +#else + len = fread(content, 1, size, fd); + fclose(fd); +#endif + if (len < 0) { + xmlFree(content); + return (NULL); + } + content[len] = 0; + + return(content); +} + +/** + * xmlCatalogNormalizePublic: + * @pubID: the public ID string + * + * Normalizes the Public Identifier + * + * Implements 6.2. Public Identifier Normalization + * from http://www.oasis-open.org/committees/entity/spec-2001-08-06.html + * + * Returns the new string or NULL, the string must be deallocated + * by the caller. + */ +static xmlChar * +xmlCatalogNormalizePublic(const xmlChar *pubID) +{ + int ok = 1; + int white; + const xmlChar *p; + xmlChar *ret; + xmlChar *q; + + if (pubID == NULL) + return(NULL); + + white = 1; + for (p = pubID;*p != 0 && ok;p++) { + if (!xmlIsBlank_ch(*p)) + white = 0; + else if (*p == 0x20 && !white) + white = 1; + else + ok = 0; + } + if (ok && !white) /* is normalized */ + return(NULL); + + ret = xmlStrdup(pubID); + q = ret; + white = 0; + for (p = pubID;*p != 0;p++) { + if (xmlIsBlank_ch(*p)) { + if (q != ret) + white = 1; + } else { + if (white) { + *(q++) = 0x20; + white = 0; + } + *(q++) = *p; + } + } + *q = 0; + return(ret); +} + +/************************************************************************ + * * + * The XML Catalog parser * + * * + ************************************************************************/ + +static xmlCatalogEntryPtr +xmlParseXMLCatalogFile(xmlCatalogPrefer prefer, const xmlChar *filename); +static void +xmlParseXMLCatalogNodeList(xmlNodePtr cur, xmlCatalogPrefer prefer, + xmlCatalogEntryPtr parent, xmlCatalogEntryPtr cgroup); +static xmlChar * +xmlCatalogListXMLResolve(xmlCatalogEntryPtr catal, const xmlChar *pubID, + const xmlChar *sysID); +static xmlChar * +xmlCatalogListXMLResolveURI(xmlCatalogEntryPtr catal, const xmlChar *URI); + + +/** + * xmlGetXMLCatalogEntryType: + * @name: the name + * + * lookup the internal type associated to an XML catalog entry name + * + * Returns the type associated with that name + */ +static xmlCatalogEntryType +xmlGetXMLCatalogEntryType(const xmlChar *name) { + xmlCatalogEntryType type = XML_CATA_NONE; + if (xmlStrEqual(name, (const xmlChar *) "system")) + type = XML_CATA_SYSTEM; + else if (xmlStrEqual(name, (const xmlChar *) "public")) + type = XML_CATA_PUBLIC; + else if (xmlStrEqual(name, (const xmlChar *) "rewriteSystem")) + type = XML_CATA_REWRITE_SYSTEM; + else if (xmlStrEqual(name, (const xmlChar *) "delegatePublic")) + type = XML_CATA_DELEGATE_PUBLIC; + else if (xmlStrEqual(name, (const xmlChar *) "delegateSystem")) + type = XML_CATA_DELEGATE_SYSTEM; + else if (xmlStrEqual(name, (const xmlChar *) "uri")) + type = XML_CATA_URI; + else if (xmlStrEqual(name, (const xmlChar *) "rewriteURI")) + type = XML_CATA_REWRITE_URI; + else if (xmlStrEqual(name, (const xmlChar *) "delegateURI")) + type = XML_CATA_DELEGATE_URI; + else if (xmlStrEqual(name, (const xmlChar *) "nextCatalog")) + type = XML_CATA_NEXT_CATALOG; + else if (xmlStrEqual(name, (const xmlChar *) "catalog")) + type = XML_CATA_CATALOG; + return(type); +} + +/** + * xmlParseXMLCatalogOneNode: + * @cur: the XML node + * @type: the type of Catalog entry + * @name: the name of the node + * @attrName: the attribute holding the value + * @uriAttrName: the attribute holding the URI-Reference + * @prefer: the PUBLIC vs. SYSTEM current preference value + * @cgroup: the group which includes this node + * + * Finishes the examination of an XML tree node of a catalog and build + * a Catalog entry from it. + * + * Returns the new Catalog entry node or NULL in case of error. + */ +static xmlCatalogEntryPtr +xmlParseXMLCatalogOneNode(xmlNodePtr cur, xmlCatalogEntryType type, + const xmlChar *name, const xmlChar *attrName, + const xmlChar *uriAttrName, xmlCatalogPrefer prefer, + xmlCatalogEntryPtr cgroup) { + int ok = 1; + xmlChar *uriValue; + xmlChar *nameValue = NULL; + xmlChar *base = NULL; + xmlChar *URL = NULL; + xmlCatalogEntryPtr ret = NULL; + + if (attrName != NULL) { + nameValue = xmlGetProp(cur, attrName); + if (nameValue == NULL) { + xmlCatalogErr(ret, cur, XML_CATALOG_MISSING_ATTR, + "%s entry lacks '%s'\n", name, attrName, NULL); + ok = 0; + } + } + uriValue = xmlGetProp(cur, uriAttrName); + if (uriValue == NULL) { + xmlCatalogErr(ret, cur, XML_CATALOG_MISSING_ATTR, + "%s entry lacks '%s'\n", name, uriAttrName, NULL); + ok = 0; + } + if (!ok) { + if (nameValue != NULL) + xmlFree(nameValue); + if (uriValue != NULL) + xmlFree(uriValue); + return(NULL); + } + + base = xmlNodeGetBase(cur->doc, cur); + URL = xmlBuildURI(uriValue, base); + if (URL != NULL) { + if (xmlDebugCatalogs > 1) { + if (nameValue != NULL) + xmlGenericError(xmlGenericErrorContext, + "Found %s: '%s' '%s'\n", name, nameValue, URL); + else + xmlGenericError(xmlGenericErrorContext, + "Found %s: '%s'\n", name, URL); + } + ret = xmlNewCatalogEntry(type, nameValue, uriValue, URL, prefer, cgroup); + } else { + xmlCatalogErr(ret, cur, XML_CATALOG_ENTRY_BROKEN, + "%s entry '%s' broken ?: %s\n", name, uriAttrName, uriValue); + } + if (nameValue != NULL) + xmlFree(nameValue); + if (uriValue != NULL) + xmlFree(uriValue); + if (base != NULL) + xmlFree(base); + if (URL != NULL) + xmlFree(URL); + return(ret); +} + +/** + * xmlParseXMLCatalogNode: + * @cur: the XML node + * @prefer: the PUBLIC vs. SYSTEM current preference value + * @parent: the parent Catalog entry + * @cgroup: the group which includes this node + * + * Examines an XML tree node of a catalog and build + * a Catalog entry from it adding it to its parent. The examination can + * be recursive. + */ +static void +xmlParseXMLCatalogNode(xmlNodePtr cur, xmlCatalogPrefer prefer, + xmlCatalogEntryPtr parent, xmlCatalogEntryPtr cgroup) +{ + xmlChar *base = NULL; + xmlCatalogEntryPtr entry = NULL; + + if (cur == NULL) + return; + if (xmlStrEqual(cur->name, BAD_CAST "group")) { + xmlChar *prop; + xmlCatalogPrefer pref = XML_CATA_PREFER_NONE; + + prop = xmlGetProp(cur, BAD_CAST "prefer"); + if (prop != NULL) { + if (xmlStrEqual(prop, BAD_CAST "system")) { + prefer = XML_CATA_PREFER_SYSTEM; + } else if (xmlStrEqual(prop, BAD_CAST "public")) { + prefer = XML_CATA_PREFER_PUBLIC; + } else { + xmlCatalogErr(parent, cur, XML_CATALOG_PREFER_VALUE, + "Invalid value for prefer: '%s'\n", + prop, NULL, NULL); + } + xmlFree(prop); + pref = prefer; + } + prop = xmlGetProp(cur, BAD_CAST "id"); + base = xmlGetNsProp(cur, BAD_CAST "base", XML_XML_NAMESPACE); + entry = xmlNewCatalogEntry(XML_CATA_GROUP, prop, base, NULL, pref, cgroup); + xmlFree(prop); + } else if (xmlStrEqual(cur->name, BAD_CAST "public")) { + entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_PUBLIC, + BAD_CAST "public", BAD_CAST "publicId", BAD_CAST "uri", prefer, cgroup); + } else if (xmlStrEqual(cur->name, BAD_CAST "system")) { + entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_SYSTEM, + BAD_CAST "system", BAD_CAST "systemId", BAD_CAST "uri", prefer, cgroup); + } else if (xmlStrEqual(cur->name, BAD_CAST "rewriteSystem")) { + entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_REWRITE_SYSTEM, + BAD_CAST "rewriteSystem", BAD_CAST "systemIdStartString", + BAD_CAST "rewritePrefix", prefer, cgroup); + } else if (xmlStrEqual(cur->name, BAD_CAST "delegatePublic")) { + entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_DELEGATE_PUBLIC, + BAD_CAST "delegatePublic", BAD_CAST "publicIdStartString", + BAD_CAST "catalog", prefer, cgroup); + } else if (xmlStrEqual(cur->name, BAD_CAST "delegateSystem")) { + entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_DELEGATE_SYSTEM, + BAD_CAST "delegateSystem", BAD_CAST "systemIdStartString", + BAD_CAST "catalog", prefer, cgroup); + } else if (xmlStrEqual(cur->name, BAD_CAST "uri")) { + entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_URI, + BAD_CAST "uri", BAD_CAST "name", + BAD_CAST "uri", prefer, cgroup); + } else if (xmlStrEqual(cur->name, BAD_CAST "rewriteURI")) { + entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_REWRITE_URI, + BAD_CAST "rewriteURI", BAD_CAST "uriStartString", + BAD_CAST "rewritePrefix", prefer, cgroup); + } else if (xmlStrEqual(cur->name, BAD_CAST "delegateURI")) { + entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_DELEGATE_URI, + BAD_CAST "delegateURI", BAD_CAST "uriStartString", + BAD_CAST "catalog", prefer, cgroup); + } else if (xmlStrEqual(cur->name, BAD_CAST "nextCatalog")) { + entry = xmlParseXMLCatalogOneNode(cur, XML_CATA_NEXT_CATALOG, + BAD_CAST "nextCatalog", NULL, + BAD_CAST "catalog", prefer, cgroup); + } + if (entry != NULL) { + if (parent != NULL) { + entry->parent = parent; + if (parent->children == NULL) + parent->children = entry; + else { + xmlCatalogEntryPtr prev; + + prev = parent->children; + while (prev->next != NULL) + prev = prev->next; + prev->next = entry; + } + } + if (entry->type == XML_CATA_GROUP) { + /* + * Recurse to propagate prefer to the subtree + * (xml:base handling is automated) + */ + xmlParseXMLCatalogNodeList(cur->children, prefer, parent, entry); + } + } + if (base != NULL) + xmlFree(base); +} + +/** + * xmlParseXMLCatalogNodeList: + * @cur: the XML node list of siblings + * @prefer: the PUBLIC vs. SYSTEM current preference value + * @parent: the parent Catalog entry + * @cgroup: the group which includes this list + * + * Examines a list of XML sibling nodes of a catalog and build + * a list of Catalog entry from it adding it to the parent. + * The examination will recurse to examine node subtrees. + */ +static void +xmlParseXMLCatalogNodeList(xmlNodePtr cur, xmlCatalogPrefer prefer, + xmlCatalogEntryPtr parent, xmlCatalogEntryPtr cgroup) { + while (cur != NULL) { + if ((cur->ns != NULL) && (cur->ns->href != NULL) && + (xmlStrEqual(cur->ns->href, XML_CATALOGS_NAMESPACE))) { + xmlParseXMLCatalogNode(cur, prefer, parent, cgroup); + } + cur = cur->next; + } + /* TODO: sort the list according to REWRITE lengths and prefer value */ +} + +/** + * xmlParseXMLCatalogFile: + * @prefer: the PUBLIC vs. SYSTEM current preference value + * @filename: the filename for the catalog + * + * Parses the catalog file to extract the XML tree and then analyze the + * tree to build a list of Catalog entries corresponding to this catalog + * + * Returns the resulting Catalog entries list + */ +static xmlCatalogEntryPtr +xmlParseXMLCatalogFile(xmlCatalogPrefer prefer, const xmlChar *filename) { + xmlDocPtr doc; + xmlNodePtr cur; + xmlChar *prop; + xmlCatalogEntryPtr parent = NULL; + + if (filename == NULL) + return(NULL); + + doc = xmlParseCatalogFile((const char *) filename); + if (doc == NULL) { + if (xmlDebugCatalogs) + xmlGenericError(xmlGenericErrorContext, + "Failed to parse catalog %s\n", filename); + return(NULL); + } + + if (xmlDebugCatalogs) + xmlGenericError(xmlGenericErrorContext, + "%d Parsing catalog %s\n", xmlGetThreadId(), filename); + + cur = xmlDocGetRootElement(doc); + if ((cur != NULL) && (xmlStrEqual(cur->name, BAD_CAST "catalog")) && + (cur->ns != NULL) && (cur->ns->href != NULL) && + (xmlStrEqual(cur->ns->href, XML_CATALOGS_NAMESPACE))) { + + parent = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL, + (const xmlChar *)filename, NULL, prefer, NULL); + if (parent == NULL) { + xmlFreeDoc(doc); + return(NULL); + } + + prop = xmlGetProp(cur, BAD_CAST "prefer"); + if (prop != NULL) { + if (xmlStrEqual(prop, BAD_CAST "system")) { + prefer = XML_CATA_PREFER_SYSTEM; + } else if (xmlStrEqual(prop, BAD_CAST "public")) { + prefer = XML_CATA_PREFER_PUBLIC; + } else { + xmlCatalogErr(NULL, cur, XML_CATALOG_PREFER_VALUE, + "Invalid value for prefer: '%s'\n", + prop, NULL, NULL); + } + xmlFree(prop); + } + cur = cur->children; + xmlParseXMLCatalogNodeList(cur, prefer, parent, NULL); + } else { + xmlCatalogErr(NULL, (xmlNodePtr) doc, XML_CATALOG_NOT_CATALOG, + "File %s is not an XML Catalog\n", + filename, NULL, NULL); + xmlFreeDoc(doc); + return(NULL); + } + xmlFreeDoc(doc); + return(parent); +} + +/** + * xmlFetchXMLCatalogFile: + * @catal: an existing but incomplete catalog entry + * + * Fetch and parse the subcatalog referenced by an entry + * + * Returns 0 in case of success, -1 otherwise + */ +static int +xmlFetchXMLCatalogFile(xmlCatalogEntryPtr catal) { + xmlCatalogEntryPtr doc; + + if (catal == NULL) + return(-1); + if (catal->URL == NULL) + return(-1); + + /* + * lock the whole catalog for modification + */ + xmlRMutexLock(xmlCatalogMutex); + if (catal->children != NULL) { + /* Okay someone else did it in the meantime */ + xmlRMutexUnlock(xmlCatalogMutex); + return(0); + } + + if (xmlCatalogXMLFiles != NULL) { + doc = (xmlCatalogEntryPtr) + xmlHashLookup(xmlCatalogXMLFiles, catal->URL); + if (doc != NULL) { + if (xmlDebugCatalogs) + xmlGenericError(xmlGenericErrorContext, + "Found %s in file hash\n", catal->URL); + + if (catal->type == XML_CATA_CATALOG) + catal->children = doc->children; + else + catal->children = doc; + catal->dealloc = 0; + xmlRMutexUnlock(xmlCatalogMutex); + return(0); + } + if (xmlDebugCatalogs) + xmlGenericError(xmlGenericErrorContext, + "%s not found in file hash\n", catal->URL); + } + + /* + * Fetch and parse. Note that xmlParseXMLCatalogFile does not + * use the existing catalog, there is no recursion allowed at + * that level. + */ + doc = xmlParseXMLCatalogFile(catal->prefer, catal->URL); + if (doc == NULL) { + catal->type = XML_CATA_BROKEN_CATALOG; + xmlRMutexUnlock(xmlCatalogMutex); + return(-1); + } + + if (catal->type == XML_CATA_CATALOG) + catal->children = doc->children; + else + catal->children = doc; + + doc->dealloc = 1; + + if (xmlCatalogXMLFiles == NULL) + xmlCatalogXMLFiles = xmlHashCreate(10); + if (xmlCatalogXMLFiles != NULL) { + if (xmlDebugCatalogs) + xmlGenericError(xmlGenericErrorContext, + "%s added to file hash\n", catal->URL); + xmlHashAddEntry(xmlCatalogXMLFiles, catal->URL, doc); + } + xmlRMutexUnlock(xmlCatalogMutex); + return(0); +} + +/************************************************************************ + * * + * XML Catalog handling * + * * + ************************************************************************/ + +/** + * xmlAddXMLCatalog: + * @catal: top of an XML catalog + * @type: the type of record to add to the catalog + * @orig: the system, public or prefix to match (or NULL) + * @replace: the replacement value for the match + * + * Add an entry in the XML catalog, it may overwrite existing but + * different entries. + * + * Returns 0 if successful, -1 otherwise + */ +static int +xmlAddXMLCatalog(xmlCatalogEntryPtr catal, const xmlChar *type, + const xmlChar *orig, const xmlChar *replace) { + xmlCatalogEntryPtr cur; + xmlCatalogEntryType typ; + int doregister = 0; + + if ((catal == NULL) || + ((catal->type != XML_CATA_CATALOG) && + (catal->type != XML_CATA_BROKEN_CATALOG))) + return(-1); + if (catal->children == NULL) { + xmlFetchXMLCatalogFile(catal); + } + if (catal->children == NULL) + doregister = 1; + + typ = xmlGetXMLCatalogEntryType(type); + if (typ == XML_CATA_NONE) { + if (xmlDebugCatalogs) + xmlGenericError(xmlGenericErrorContext, + "Failed to add unknown element %s to catalog\n", type); + return(-1); + } + + cur = catal->children; + /* + * Might be a simple "update in place" + */ + if (cur != NULL) { + while (cur != NULL) { + if ((orig != NULL) && (cur->type == typ) && + (xmlStrEqual(orig, cur->name))) { + if (xmlDebugCatalogs) + xmlGenericError(xmlGenericErrorContext, + "Updating element %s to catalog\n", type); + if (cur->value != NULL) + xmlFree(cur->value); + if (cur->URL != NULL) + xmlFree(cur->URL); + cur->value = xmlStrdup(replace); + cur->URL = xmlStrdup(replace); + return(0); + } + if (cur->next == NULL) + break; + cur = cur->next; + } + } + if (xmlDebugCatalogs) + xmlGenericError(xmlGenericErrorContext, + "Adding element %s to catalog\n", type); + if (cur == NULL) + catal->children = xmlNewCatalogEntry(typ, orig, replace, + NULL, catal->prefer, NULL); + else + cur->next = xmlNewCatalogEntry(typ, orig, replace, + NULL, catal->prefer, NULL); + if (doregister) { + catal->type = XML_CATA_CATALOG; + cur = (xmlCatalogEntryPtr)xmlHashLookup(xmlCatalogXMLFiles, catal->URL); + if (cur != NULL) + cur->children = catal->children; + } + + return(0); +} + +/** + * xmlDelXMLCatalog: + * @catal: top of an XML catalog + * @value: the value to remove from the catalog + * + * Remove entries in the XML catalog where the value or the URI + * is equal to @value + * + * Returns the number of entries removed if successful, -1 otherwise + */ +static int +xmlDelXMLCatalog(xmlCatalogEntryPtr catal, const xmlChar *value) { + xmlCatalogEntryPtr cur; + int ret = 0; + + if ((catal == NULL) || + ((catal->type != XML_CATA_CATALOG) && + (catal->type != XML_CATA_BROKEN_CATALOG))) + return(-1); + if (value == NULL) + return(-1); + if (catal->children == NULL) { + xmlFetchXMLCatalogFile(catal); + } + + /* + * Scan the children + */ + cur = catal->children; + while (cur != NULL) { + if (((cur->name != NULL) && (xmlStrEqual(value, cur->name))) || + (xmlStrEqual(value, cur->value))) { + if (xmlDebugCatalogs) { + if (cur->name != NULL) + xmlGenericError(xmlGenericErrorContext, + "Removing element %s from catalog\n", cur->name); + else + xmlGenericError(xmlGenericErrorContext, + "Removing element %s from catalog\n", cur->value); + } + cur->type = XML_CATA_REMOVED; + } + cur = cur->next; + } + return(ret); +} + +/** + * xmlCatalogXMLResolve: + * @catal: a catalog list + * @pubID: the public ID string + * @sysID: the system ID string + * + * Do a complete resolution lookup of an External Identifier for a + * list of catalog entries. + * + * Implements (or tries to) 7.1. External Identifier Resolution + * from http://www.oasis-open.org/committees/entity/spec-2001-08-06.html + * + * Returns the URI of the resource or NULL if not found + */ +static xmlChar * +xmlCatalogXMLResolve(xmlCatalogEntryPtr catal, const xmlChar *pubID, + const xmlChar *sysID) { + xmlChar *ret = NULL; + xmlCatalogEntryPtr cur; + int haveDelegate = 0; + int haveNext = 0; + + /* + * protection against loops + */ + if (catal->depth > MAX_CATAL_DEPTH) { + xmlCatalogErr(catal, NULL, XML_CATALOG_RECURSION, + "Detected recursion in catalog %s\n", + catal->name, NULL, NULL); + return(NULL); + } + catal->depth++; + + /* + * First tries steps 2/ 3/ 4/ if a system ID is provided. + */ + if (sysID != NULL) { + xmlCatalogEntryPtr rewrite = NULL; + int lenrewrite = 0, len; + cur = catal; + haveDelegate = 0; + while (cur != NULL) { + switch (cur->type) { + case XML_CATA_SYSTEM: + if (xmlStrEqual(sysID, cur->name)) { + if (xmlDebugCatalogs) + xmlGenericError(xmlGenericErrorContext, + "Found system match %s, using %s\n", + cur->name, cur->URL); + catal->depth--; + return(xmlStrdup(cur->URL)); + } + break; + case XML_CATA_REWRITE_SYSTEM: + len = xmlStrlen(cur->name); + if ((len > lenrewrite) && + (!xmlStrncmp(sysID, cur->name, len))) { + lenrewrite = len; + rewrite = cur; + } + break; + case XML_CATA_DELEGATE_SYSTEM: + if (!xmlStrncmp(sysID, cur->name, xmlStrlen(cur->name))) + haveDelegate++; + break; + case XML_CATA_NEXT_CATALOG: + haveNext++; + break; + default: + break; + } + cur = cur->next; + } + if (rewrite != NULL) { + if (xmlDebugCatalogs) + xmlGenericError(xmlGenericErrorContext, + "Using rewriting rule %s\n", rewrite->name); + ret = xmlStrdup(rewrite->URL); + if (ret != NULL) + ret = xmlStrcat(ret, &sysID[lenrewrite]); + catal->depth--; + return(ret); + } + if (haveDelegate) { + const xmlChar *delegates[MAX_DELEGATE]; + int nbList = 0, i; + + /* + * Assume the entries have been sorted by decreasing substring + * matches when the list was produced. + */ + cur = catal; + while (cur != NULL) { + if ((cur->type == XML_CATA_DELEGATE_SYSTEM) && + (!xmlStrncmp(sysID, cur->name, xmlStrlen(cur->name)))) { + for (i = 0;i < nbList;i++) + if (xmlStrEqual(cur->URL, delegates[i])) + break; + if (i < nbList) { + cur = cur->next; + continue; + } + if (nbList < MAX_DELEGATE) + delegates[nbList++] = cur->URL; + + if (cur->children == NULL) { + xmlFetchXMLCatalogFile(cur); + } + if (cur->children != NULL) { + if (xmlDebugCatalogs) + xmlGenericError(xmlGenericErrorContext, + "Trying system delegate %s\n", cur->URL); + ret = xmlCatalogListXMLResolve( + cur->children, NULL, sysID); + if (ret != NULL) { + catal->depth--; + return(ret); + } + } + } + cur = cur->next; + } + /* + * Apply the cut algorithm explained in 4/ + */ + catal->depth--; + return(XML_CATAL_BREAK); + } + } + /* + * Then tries 5/ 6/ if a public ID is provided + */ + if (pubID != NULL) { + cur = catal; + haveDelegate = 0; + while (cur != NULL) { + switch (cur->type) { + case XML_CATA_PUBLIC: + if (xmlStrEqual(pubID, cur->name)) { + if (xmlDebugCatalogs) + xmlGenericError(xmlGenericErrorContext, + "Found public match %s\n", cur->name); + catal->depth--; + return(xmlStrdup(cur->URL)); + } + break; + case XML_CATA_DELEGATE_PUBLIC: + if (!xmlStrncmp(pubID, cur->name, xmlStrlen(cur->name)) && + (cur->prefer == XML_CATA_PREFER_PUBLIC)) + haveDelegate++; + break; + case XML_CATA_NEXT_CATALOG: + if (sysID == NULL) + haveNext++; + break; + default: + break; + } + cur = cur->next; + } + if (haveDelegate) { + const xmlChar *delegates[MAX_DELEGATE]; + int nbList = 0, i; + + /* + * Assume the entries have been sorted by decreasing substring + * matches when the list was produced. + */ + cur = catal; + while (cur != NULL) { + if ((cur->type == XML_CATA_DELEGATE_PUBLIC) && + (cur->prefer == XML_CATA_PREFER_PUBLIC) && + (!xmlStrncmp(pubID, cur->name, xmlStrlen(cur->name)))) { + + for (i = 0;i < nbList;i++) + if (xmlStrEqual(cur->URL, delegates[i])) + break; + if (i < nbList) { + cur = cur->next; + continue; + } + if (nbList < MAX_DELEGATE) + delegates[nbList++] = cur->URL; + + if (cur->children == NULL) { + xmlFetchXMLCatalogFile(cur); + } + if (cur->children != NULL) { + if (xmlDebugCatalogs) + xmlGenericError(xmlGenericErrorContext, + "Trying public delegate %s\n", cur->URL); + ret = xmlCatalogListXMLResolve( + cur->children, pubID, NULL); + if (ret != NULL) { + catal->depth--; + return(ret); + } + } + } + cur = cur->next; + } + /* + * Apply the cut algorithm explained in 4/ + */ + catal->depth--; + return(XML_CATAL_BREAK); + } + } + if (haveNext) { + cur = catal; + while (cur != NULL) { + if (cur->type == XML_CATA_NEXT_CATALOG) { + if (cur->children == NULL) { + xmlFetchXMLCatalogFile(cur); + } + if (cur->children != NULL) { + ret = xmlCatalogListXMLResolve(cur->children, pubID, sysID); + if (ret != NULL) { + catal->depth--; + return(ret); + } else if (catal->depth > MAX_CATAL_DEPTH) { + return(NULL); + } + } + } + cur = cur->next; + } + } + + catal->depth--; + return(NULL); +} + +/** + * xmlCatalogXMLResolveURI: + * @catal: a catalog list + * @URI: the URI + * @sysID: the system ID string + * + * Do a complete resolution lookup of an External Identifier for a + * list of catalog entries. + * + * Implements (or tries to) 7.2.2. URI Resolution + * from http://www.oasis-open.org/committees/entity/spec-2001-08-06.html + * + * Returns the URI of the resource or NULL if not found + */ +static xmlChar * +xmlCatalogXMLResolveURI(xmlCatalogEntryPtr catal, const xmlChar *URI) { + xmlChar *ret = NULL; + xmlCatalogEntryPtr cur; + int haveDelegate = 0; + int haveNext = 0; + xmlCatalogEntryPtr rewrite = NULL; + int lenrewrite = 0, len; + + if (catal == NULL) + return(NULL); + + if (URI == NULL) + return(NULL); + + if (catal->depth > MAX_CATAL_DEPTH) { + xmlCatalogErr(catal, NULL, XML_CATALOG_RECURSION, + "Detected recursion in catalog %s\n", + catal->name, NULL, NULL); + return(NULL); + } + + /* + * First tries steps 2/ 3/ 4/ if a system ID is provided. + */ + cur = catal; + haveDelegate = 0; + while (cur != NULL) { + switch (cur->type) { + case XML_CATA_URI: + if (xmlStrEqual(URI, cur->name)) { + if (xmlDebugCatalogs) + xmlGenericError(xmlGenericErrorContext, + "Found URI match %s\n", cur->name); + return(xmlStrdup(cur->URL)); + } + break; + case XML_CATA_REWRITE_URI: + len = xmlStrlen(cur->name); + if ((len > lenrewrite) && + (!xmlStrncmp(URI, cur->name, len))) { + lenrewrite = len; + rewrite = cur; + } + break; + case XML_CATA_DELEGATE_URI: + if (!xmlStrncmp(URI, cur->name, xmlStrlen(cur->name))) + haveDelegate++; + break; + case XML_CATA_NEXT_CATALOG: + haveNext++; + break; + default: + break; + } + cur = cur->next; + } + if (rewrite != NULL) { + if (xmlDebugCatalogs) + xmlGenericError(xmlGenericErrorContext, + "Using rewriting rule %s\n", rewrite->name); + ret = xmlStrdup(rewrite->URL); + if (ret != NULL) + ret = xmlStrcat(ret, &URI[lenrewrite]); + return(ret); + } + if (haveDelegate) { + const xmlChar *delegates[MAX_DELEGATE]; + int nbList = 0, i; + + /* + * Assume the entries have been sorted by decreasing substring + * matches when the list was produced. + */ + cur = catal; + while (cur != NULL) { + if (((cur->type == XML_CATA_DELEGATE_SYSTEM) || + (cur->type == XML_CATA_DELEGATE_URI)) && + (!xmlStrncmp(URI, cur->name, xmlStrlen(cur->name)))) { + for (i = 0;i < nbList;i++) + if (xmlStrEqual(cur->URL, delegates[i])) + break; + if (i < nbList) { + cur = cur->next; + continue; + } + if (nbList < MAX_DELEGATE) + delegates[nbList++] = cur->URL; + + if (cur->children == NULL) { + xmlFetchXMLCatalogFile(cur); + } + if (cur->children != NULL) { + if (xmlDebugCatalogs) + xmlGenericError(xmlGenericErrorContext, + "Trying URI delegate %s\n", cur->URL); + ret = xmlCatalogListXMLResolveURI( + cur->children, URI); + if (ret != NULL) + return(ret); + } + } + cur = cur->next; + } + /* + * Apply the cut algorithm explained in 4/ + */ + return(XML_CATAL_BREAK); + } + if (haveNext) { + cur = catal; + while (cur != NULL) { + if (cur->type == XML_CATA_NEXT_CATALOG) { + if (cur->children == NULL) { + xmlFetchXMLCatalogFile(cur); + } + if (cur->children != NULL) { + ret = xmlCatalogListXMLResolveURI(cur->children, URI); + if (ret != NULL) + return(ret); + } + } + cur = cur->next; + } + } + + return(NULL); +} + +/** + * xmlCatalogListXMLResolve: + * @catal: a catalog list + * @pubID: the public ID string + * @sysID: the system ID string + * + * Do a complete resolution lookup of an External Identifier for a + * list of catalogs + * + * Implements (or tries to) 7.1. External Identifier Resolution + * from http://www.oasis-open.org/committees/entity/spec-2001-08-06.html + * + * Returns the URI of the resource or NULL if not found + */ +static xmlChar * +xmlCatalogListXMLResolve(xmlCatalogEntryPtr catal, const xmlChar *pubID, + const xmlChar *sysID) { + xmlChar *ret = NULL; + xmlChar *urnID = NULL; + xmlChar *normid; + + if (catal == NULL) + return(NULL); + if ((pubID == NULL) && (sysID == NULL)) + return(NULL); + + normid = xmlCatalogNormalizePublic(pubID); + if (normid != NULL) + pubID = (*normid != 0 ? normid : NULL); + + if (!xmlStrncmp(pubID, BAD_CAST XML_URN_PUBID, sizeof(XML_URN_PUBID) - 1)) { + urnID = xmlCatalogUnWrapURN(pubID); + if (xmlDebugCatalogs) { + if (urnID == NULL) + xmlGenericError(xmlGenericErrorContext, + "Public URN ID %s expanded to NULL\n", pubID); + else + xmlGenericError(xmlGenericErrorContext, + "Public URN ID expanded to %s\n", urnID); + } + ret = xmlCatalogListXMLResolve(catal, urnID, sysID); + if (urnID != NULL) + xmlFree(urnID); + if (normid != NULL) + xmlFree(normid); + return(ret); + } + if (!xmlStrncmp(sysID, BAD_CAST XML_URN_PUBID, sizeof(XML_URN_PUBID) - 1)) { + urnID = xmlCatalogUnWrapURN(sysID); + if (xmlDebugCatalogs) { + if (urnID == NULL) + xmlGenericError(xmlGenericErrorContext, + "System URN ID %s expanded to NULL\n", sysID); + else + xmlGenericError(xmlGenericErrorContext, + "System URN ID expanded to %s\n", urnID); + } + if (pubID == NULL) + ret = xmlCatalogListXMLResolve(catal, urnID, NULL); + else if (xmlStrEqual(pubID, urnID)) + ret = xmlCatalogListXMLResolve(catal, pubID, NULL); + else { + ret = xmlCatalogListXMLResolve(catal, pubID, urnID); + } + if (urnID != NULL) + xmlFree(urnID); + if (normid != NULL) + xmlFree(normid); + return(ret); + } + while (catal != NULL) { + if (catal->type == XML_CATA_CATALOG) { + if (catal->children == NULL) { + xmlFetchXMLCatalogFile(catal); + } + if (catal->children != NULL) { + ret = xmlCatalogXMLResolve(catal->children, pubID, sysID); + if (ret != NULL) { + break; + } else if ((catal->children != NULL) && + (catal->children->depth > MAX_CATAL_DEPTH)) { + ret = NULL; + break; + } + } + } + catal = catal->next; + } + if (normid != NULL) + xmlFree(normid); + return(ret); +} + +/** + * xmlCatalogListXMLResolveURI: + * @catal: a catalog list + * @URI: the URI + * + * Do a complete resolution lookup of an URI for a list of catalogs + * + * Implements (or tries to) 7.2. URI Resolution + * from http://www.oasis-open.org/committees/entity/spec-2001-08-06.html + * + * Returns the URI of the resource or NULL if not found + */ +static xmlChar * +xmlCatalogListXMLResolveURI(xmlCatalogEntryPtr catal, const xmlChar *URI) { + xmlChar *ret = NULL; + xmlChar *urnID = NULL; + + if (catal == NULL) + return(NULL); + if (URI == NULL) + return(NULL); + + if (!xmlStrncmp(URI, BAD_CAST XML_URN_PUBID, sizeof(XML_URN_PUBID) - 1)) { + urnID = xmlCatalogUnWrapURN(URI); + if (xmlDebugCatalogs) { + if (urnID == NULL) + xmlGenericError(xmlGenericErrorContext, + "URN ID %s expanded to NULL\n", URI); + else + xmlGenericError(xmlGenericErrorContext, + "URN ID expanded to %s\n", urnID); + } + ret = xmlCatalogListXMLResolve(catal, urnID, NULL); + if (urnID != NULL) + xmlFree(urnID); + return(ret); + } + while (catal != NULL) { + if (catal->type == XML_CATA_CATALOG) { + if (catal->children == NULL) { + xmlFetchXMLCatalogFile(catal); + } + if (catal->children != NULL) { + ret = xmlCatalogXMLResolveURI(catal->children, URI); + if (ret != NULL) + return(ret); + } + } + catal = catal->next; + } + return(ret); +} + +/************************************************************************ + * * + * The SGML Catalog parser * + * * + ************************************************************************/ + + +#define RAW *cur +#define NEXT cur++; +#define SKIP(x) cur += x; + +#define SKIP_BLANKS while (IS_BLANK_CH(*cur)) NEXT; + +/** + * xmlParseSGMLCatalogComment: + * @cur: the current character + * + * Skip a comment in an SGML catalog + * + * Returns new current character + */ +static const xmlChar * +xmlParseSGMLCatalogComment(const xmlChar *cur) { + if ((cur[0] != '-') || (cur[1] != '-')) + return(cur); + SKIP(2); + while ((cur[0] != 0) && ((cur[0] != '-') || ((cur[1] != '-')))) + NEXT; + if (cur[0] == 0) { + return(NULL); + } + return(cur + 2); +} + +/** + * xmlParseSGMLCatalogPubid: + * @cur: the current character + * @id: the return location + * + * Parse an SGML catalog ID + * + * Returns new current character and store the value in @id + */ +static const xmlChar * +xmlParseSGMLCatalogPubid(const xmlChar *cur, xmlChar **id) { + xmlChar *buf = NULL, *tmp; + int len = 0; + int size = 50; + xmlChar stop; + int count = 0; + + *id = NULL; + + if (RAW == '"') { + NEXT; + stop = '"'; + } else if (RAW == '\'') { + NEXT; + stop = '\''; + } else { + stop = ' '; + } + buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar)); + if (buf == NULL) { + xmlCatalogErrMemory("allocating public ID"); + return(NULL); + } + while (IS_PUBIDCHAR_CH(*cur) || (*cur == '?')) { + if ((*cur == stop) && (stop != ' ')) + break; + if ((stop == ' ') && (IS_BLANK_CH(*cur))) + break; + if (len + 1 >= size) { + size *= 2; + tmp = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar)); + if (tmp == NULL) { + xmlCatalogErrMemory("allocating public ID"); + xmlFree(buf); + return(NULL); + } + buf = tmp; + } + buf[len++] = *cur; + count++; + NEXT; + } + buf[len] = 0; + if (stop == ' ') { + if (!IS_BLANK_CH(*cur)) { + xmlFree(buf); + return(NULL); + } + } else { + if (*cur != stop) { + xmlFree(buf); + return(NULL); + } + NEXT; + } + *id = buf; + return(cur); +} + +/** + * xmlParseSGMLCatalogName: + * @cur: the current character + * @name: the return location + * + * Parse an SGML catalog name + * + * Returns new current character and store the value in @name + */ +static const xmlChar * +xmlParseSGMLCatalogName(const xmlChar *cur, xmlChar **name) { + xmlChar buf[XML_MAX_NAMELEN + 5]; + int len = 0; + int c; + + *name = NULL; + + /* + * Handler for more complex cases + */ + c = *cur; + if ((!IS_LETTER(c) && (c != '_') && (c != ':'))) { + return(NULL); + } + + while (((IS_LETTER(c)) || (IS_DIGIT(c)) || + (c == '.') || (c == '-') || + (c == '_') || (c == ':'))) { + buf[len++] = c; + cur++; + c = *cur; + if (len >= XML_MAX_NAMELEN) + return(NULL); + } + *name = xmlStrndup(buf, len); + return(cur); +} + +/** + * xmlGetSGMLCatalogEntryType: + * @name: the entry name + * + * Get the Catalog entry type for a given SGML Catalog name + * + * Returns Catalog entry type + */ +static xmlCatalogEntryType +xmlGetSGMLCatalogEntryType(const xmlChar *name) { + xmlCatalogEntryType type = XML_CATA_NONE; + if (xmlStrEqual(name, (const xmlChar *) "SYSTEM")) + type = SGML_CATA_SYSTEM; + else if (xmlStrEqual(name, (const xmlChar *) "PUBLIC")) + type = SGML_CATA_PUBLIC; + else if (xmlStrEqual(name, (const xmlChar *) "DELEGATE")) + type = SGML_CATA_DELEGATE; + else if (xmlStrEqual(name, (const xmlChar *) "ENTITY")) + type = SGML_CATA_ENTITY; + else if (xmlStrEqual(name, (const xmlChar *) "DOCTYPE")) + type = SGML_CATA_DOCTYPE; + else if (xmlStrEqual(name, (const xmlChar *) "LINKTYPE")) + type = SGML_CATA_LINKTYPE; + else if (xmlStrEqual(name, (const xmlChar *) "NOTATION")) + type = SGML_CATA_NOTATION; + else if (xmlStrEqual(name, (const xmlChar *) "SGMLDECL")) + type = SGML_CATA_SGMLDECL; + else if (xmlStrEqual(name, (const xmlChar *) "DOCUMENT")) + type = SGML_CATA_DOCUMENT; + else if (xmlStrEqual(name, (const xmlChar *) "CATALOG")) + type = SGML_CATA_CATALOG; + else if (xmlStrEqual(name, (const xmlChar *) "BASE")) + type = SGML_CATA_BASE; + return(type); +} + +/** + * xmlParseSGMLCatalog: + * @catal: the SGML Catalog + * @value: the content of the SGML Catalog serialization + * @file: the filepath for the catalog + * @super: should this be handled as a Super Catalog in which case + * parsing is not recursive + * + * Parse an SGML catalog content and fill up the @catal hash table with + * the new entries found. + * + * Returns 0 in case of success, -1 in case of error. + */ +static int +xmlParseSGMLCatalog(xmlCatalogPtr catal, const xmlChar *value, + const char *file, int super) { + const xmlChar *cur = value; + xmlChar *base = NULL; + int res; + + if ((cur == NULL) || (file == NULL)) + return(-1); + base = xmlStrdup((const xmlChar *) file); + + while ((cur != NULL) && (cur[0] != 0)) { + SKIP_BLANKS; + if (cur[0] == 0) + break; + if ((cur[0] == '-') && (cur[1] == '-')) { + cur = xmlParseSGMLCatalogComment(cur); + if (cur == NULL) { + /* error */ + break; + } + } else { + xmlChar *sysid = NULL; + xmlChar *name = NULL; + xmlCatalogEntryType type = XML_CATA_NONE; + + cur = xmlParseSGMLCatalogName(cur, &name); + if (name == NULL) { + /* error */ + break; + } + if (!IS_BLANK_CH(*cur)) { + /* error */ + break; + } + SKIP_BLANKS; + if (xmlStrEqual(name, (const xmlChar *) "SYSTEM")) + type = SGML_CATA_SYSTEM; + else if (xmlStrEqual(name, (const xmlChar *) "PUBLIC")) + type = SGML_CATA_PUBLIC; + else if (xmlStrEqual(name, (const xmlChar *) "DELEGATE")) + type = SGML_CATA_DELEGATE; + else if (xmlStrEqual(name, (const xmlChar *) "ENTITY")) + type = SGML_CATA_ENTITY; + else if (xmlStrEqual(name, (const xmlChar *) "DOCTYPE")) + type = SGML_CATA_DOCTYPE; + else if (xmlStrEqual(name, (const xmlChar *) "LINKTYPE")) + type = SGML_CATA_LINKTYPE; + else if (xmlStrEqual(name, (const xmlChar *) "NOTATION")) + type = SGML_CATA_NOTATION; + else if (xmlStrEqual(name, (const xmlChar *) "SGMLDECL")) + type = SGML_CATA_SGMLDECL; + else if (xmlStrEqual(name, (const xmlChar *) "DOCUMENT")) + type = SGML_CATA_DOCUMENT; + else if (xmlStrEqual(name, (const xmlChar *) "CATALOG")) + type = SGML_CATA_CATALOG; + else if (xmlStrEqual(name, (const xmlChar *) "BASE")) + type = SGML_CATA_BASE; + else if (xmlStrEqual(name, (const xmlChar *) "OVERRIDE")) { + xmlFree(name); + cur = xmlParseSGMLCatalogName(cur, &name); + if (name == NULL) { + /* error */ + break; + } + xmlFree(name); + continue; + } + xmlFree(name); + name = NULL; + + switch(type) { + case SGML_CATA_ENTITY: + if (*cur == '%') + type = SGML_CATA_PENTITY; + case SGML_CATA_PENTITY: + case SGML_CATA_DOCTYPE: + case SGML_CATA_LINKTYPE: + case SGML_CATA_NOTATION: + cur = xmlParseSGMLCatalogName(cur, &name); + if (cur == NULL) { + /* error */ + break; + } + if (!IS_BLANK_CH(*cur)) { + /* error */ + break; + } + SKIP_BLANKS; + cur = xmlParseSGMLCatalogPubid(cur, &sysid); + if (cur == NULL) { + /* error */ + break; + } + break; + case SGML_CATA_PUBLIC: + case SGML_CATA_SYSTEM: + case SGML_CATA_DELEGATE: + cur = xmlParseSGMLCatalogPubid(cur, &name); + if (cur == NULL) { + /* error */ + break; + } + if (type != SGML_CATA_SYSTEM) { + xmlChar *normid; + + normid = xmlCatalogNormalizePublic(name); + if (normid != NULL) { + if (name != NULL) + xmlFree(name); + if (*normid != 0) + name = normid; + else { + xmlFree(normid); + name = NULL; + } + } + } + if (!IS_BLANK_CH(*cur)) { + /* error */ + break; + } + SKIP_BLANKS; + cur = xmlParseSGMLCatalogPubid(cur, &sysid); + if (cur == NULL) { + /* error */ + break; + } + break; + case SGML_CATA_BASE: + case SGML_CATA_CATALOG: + case SGML_CATA_DOCUMENT: + case SGML_CATA_SGMLDECL: + cur = xmlParseSGMLCatalogPubid(cur, &sysid); + if (cur == NULL) { + /* error */ + break; + } + break; + default: + break; + } + if (cur == NULL) { + if (name != NULL) + xmlFree(name); + if (sysid != NULL) + xmlFree(sysid); + break; + } else if (type == SGML_CATA_BASE) { + if (base != NULL) + xmlFree(base); + base = xmlStrdup(sysid); + } else if ((type == SGML_CATA_PUBLIC) || + (type == SGML_CATA_SYSTEM)) { + xmlChar *filename; + + filename = xmlBuildURI(sysid, base); + if (filename != NULL) { + xmlCatalogEntryPtr entry; + + entry = xmlNewCatalogEntry(type, name, filename, + NULL, XML_CATA_PREFER_NONE, NULL); + res = xmlHashAddEntry(catal->sgml, name, entry); + if (res < 0) { + xmlFreeCatalogEntry(entry); + } + xmlFree(filename); + } + + } else if (type == SGML_CATA_CATALOG) { + if (super) { + xmlCatalogEntryPtr entry; + + entry = xmlNewCatalogEntry(type, sysid, NULL, NULL, + XML_CATA_PREFER_NONE, NULL); + res = xmlHashAddEntry(catal->sgml, sysid, entry); + if (res < 0) { + xmlFreeCatalogEntry(entry); + } + } else { + xmlChar *filename; + + filename = xmlBuildURI(sysid, base); + if (filename != NULL) { + xmlExpandCatalog(catal, (const char *)filename); + xmlFree(filename); + } + } + } + /* + * drop anything else we won't handle it + */ + if (name != NULL) + xmlFree(name); + if (sysid != NULL) + xmlFree(sysid); + } + } + if (base != NULL) + xmlFree(base); + if (cur == NULL) + return(-1); + return(0); +} + +/************************************************************************ + * * + * SGML Catalog handling * + * * + ************************************************************************/ + +/** + * xmlCatalogGetSGMLPublic: + * @catal: an SGML catalog hash + * @pubID: the public ID string + * + * Try to lookup the catalog local reference associated to a public ID + * + * Returns the local resource if found or NULL otherwise. + */ +static const xmlChar * +xmlCatalogGetSGMLPublic(xmlHashTablePtr catal, const xmlChar *pubID) { + xmlCatalogEntryPtr entry; + xmlChar *normid; + + if (catal == NULL) + return(NULL); + + normid = xmlCatalogNormalizePublic(pubID); + if (normid != NULL) + pubID = (*normid != 0 ? normid : NULL); + + entry = (xmlCatalogEntryPtr) xmlHashLookup(catal, pubID); + if (entry == NULL) { + if (normid != NULL) + xmlFree(normid); + return(NULL); + } + if (entry->type == SGML_CATA_PUBLIC) { + if (normid != NULL) + xmlFree(normid); + return(entry->URL); + } + if (normid != NULL) + xmlFree(normid); + return(NULL); +} + +/** + * xmlCatalogGetSGMLSystem: + * @catal: an SGML catalog hash + * @sysID: the system ID string + * + * Try to lookup the catalog local reference for a system ID + * + * Returns the local resource if found or NULL otherwise. + */ +static const xmlChar * +xmlCatalogGetSGMLSystem(xmlHashTablePtr catal, const xmlChar *sysID) { + xmlCatalogEntryPtr entry; + + if (catal == NULL) + return(NULL); + + entry = (xmlCatalogEntryPtr) xmlHashLookup(catal, sysID); + if (entry == NULL) + return(NULL); + if (entry->type == SGML_CATA_SYSTEM) + return(entry->URL); + return(NULL); +} + +/** + * xmlCatalogSGMLResolve: + * @catal: the SGML catalog + * @pubID: the public ID string + * @sysID: the system ID string + * + * Do a complete resolution lookup of an External Identifier + * + * Returns the URI of the resource or NULL if not found + */ +static const xmlChar * +xmlCatalogSGMLResolve(xmlCatalogPtr catal, const xmlChar *pubID, + const xmlChar *sysID) { + const xmlChar *ret = NULL; + + if (catal->sgml == NULL) + return(NULL); + + if (pubID != NULL) + ret = xmlCatalogGetSGMLPublic(catal->sgml, pubID); + if (ret != NULL) + return(ret); + if (sysID != NULL) + ret = xmlCatalogGetSGMLSystem(catal->sgml, sysID); + if (ret != NULL) + return(ret); + return(NULL); +} + +/************************************************************************ + * * + * Specific Public interfaces * + * * + ************************************************************************/ + +/** + * xmlLoadSGMLSuperCatalog: + * @filename: a file path + * + * Load an SGML super catalog. It won't expand CATALOG or DELEGATE + * references. This is only needed for manipulating SGML Super Catalogs + * like adding and removing CATALOG or DELEGATE entries. + * + * Returns the catalog parsed or NULL in case of error + */ +xmlCatalogPtr +xmlLoadSGMLSuperCatalog(const char *filename) +{ + xmlChar *content; + xmlCatalogPtr catal; + int ret; + + content = xmlLoadFileContent(filename); + if (content == NULL) + return(NULL); + + catal = xmlCreateNewCatalog(XML_SGML_CATALOG_TYPE, xmlCatalogDefaultPrefer); + if (catal == NULL) { + xmlFree(content); + return(NULL); + } + + ret = xmlParseSGMLCatalog(catal, content, filename, 1); + xmlFree(content); + if (ret < 0) { + xmlFreeCatalog(catal); + return(NULL); + } + return (catal); +} + +/** + * xmlLoadACatalog: + * @filename: a file path + * + * Load the catalog and build the associated data structures. + * This can be either an XML Catalog or an SGML Catalog + * It will recurse in SGML CATALOG entries. On the other hand XML + * Catalogs are not handled recursively. + * + * Returns the catalog parsed or NULL in case of error + */ +xmlCatalogPtr +xmlLoadACatalog(const char *filename) +{ + xmlChar *content; + xmlChar *first; + xmlCatalogPtr catal; + int ret; + + content = xmlLoadFileContent(filename); + if (content == NULL) + return(NULL); + + + first = content; + + while ((*first != 0) && (*first != '-') && (*first != '<') && + (!(((*first >= 'A') && (*first <= 'Z')) || + ((*first >= 'a') && (*first <= 'z'))))) + first++; + + if (*first != '<') { + catal = xmlCreateNewCatalog(XML_SGML_CATALOG_TYPE, xmlCatalogDefaultPrefer); + if (catal == NULL) { + xmlFree(content); + return(NULL); + } + ret = xmlParseSGMLCatalog(catal, content, filename, 0); + if (ret < 0) { + xmlFreeCatalog(catal); + xmlFree(content); + return(NULL); + } + } else { + catal = xmlCreateNewCatalog(XML_XML_CATALOG_TYPE, xmlCatalogDefaultPrefer); + if (catal == NULL) { + xmlFree(content); + return(NULL); + } + catal->xml = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL, + NULL, BAD_CAST filename, xmlCatalogDefaultPrefer, NULL); + } + xmlFree(content); + return (catal); +} + +/** + * xmlExpandCatalog: + * @catal: a catalog + * @filename: a file path + * + * Load the catalog and expand the existing catal structure. + * This can be either an XML Catalog or an SGML Catalog + * + * Returns 0 in case of success, -1 in case of error + */ +static int +xmlExpandCatalog(xmlCatalogPtr catal, const char *filename) +{ + int ret; + + if ((catal == NULL) || (filename == NULL)) + return(-1); + + + if (catal->type == XML_SGML_CATALOG_TYPE) { + xmlChar *content; + + content = xmlLoadFileContent(filename); + if (content == NULL) + return(-1); + + ret = xmlParseSGMLCatalog(catal, content, filename, 0); + if (ret < 0) { + xmlFree(content); + return(-1); + } + xmlFree(content); + } else { + xmlCatalogEntryPtr tmp, cur; + tmp = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL, + NULL, BAD_CAST filename, xmlCatalogDefaultPrefer, NULL); + + cur = catal->xml; + if (cur == NULL) { + catal->xml = tmp; + } else { + while (cur->next != NULL) cur = cur->next; + cur->next = tmp; + } + } + return (0); +} + +/** + * xmlACatalogResolveSystem: + * @catal: a Catalog + * @sysID: the system ID string + * + * Try to lookup the catalog resource for a system ID + * + * Returns the resource if found or NULL otherwise, the value returned + * must be freed by the caller. + */ +xmlChar * +xmlACatalogResolveSystem(xmlCatalogPtr catal, const xmlChar *sysID) { + xmlChar *ret = NULL; + + if ((sysID == NULL) || (catal == NULL)) + return(NULL); + + if (xmlDebugCatalogs) + xmlGenericError(xmlGenericErrorContext, + "Resolve sysID %s\n", sysID); + + if (catal->type == XML_XML_CATALOG_TYPE) { + ret = xmlCatalogListXMLResolve(catal->xml, NULL, sysID); + if (ret == XML_CATAL_BREAK) + ret = NULL; + } else { + const xmlChar *sgml; + + sgml = xmlCatalogGetSGMLSystem(catal->sgml, sysID); + if (sgml != NULL) + ret = xmlStrdup(sgml); + } + return(ret); +} + +/** + * xmlACatalogResolvePublic: + * @catal: a Catalog + * @pubID: the public ID string + * + * Try to lookup the catalog local reference associated to a public ID in that catalog + * + * Returns the local resource if found or NULL otherwise, the value returned + * must be freed by the caller. + */ +xmlChar * +xmlACatalogResolvePublic(xmlCatalogPtr catal, const xmlChar *pubID) { + xmlChar *ret = NULL; + + if ((pubID == NULL) || (catal == NULL)) + return(NULL); + + if (xmlDebugCatalogs) + xmlGenericError(xmlGenericErrorContext, + "Resolve pubID %s\n", pubID); + + if (catal->type == XML_XML_CATALOG_TYPE) { + ret = xmlCatalogListXMLResolve(catal->xml, pubID, NULL); + if (ret == XML_CATAL_BREAK) + ret = NULL; + } else { + const xmlChar *sgml; + + sgml = xmlCatalogGetSGMLPublic(catal->sgml, pubID); + if (sgml != NULL) + ret = xmlStrdup(sgml); + } + return(ret); +} + +/** + * xmlACatalogResolve: + * @catal: a Catalog + * @pubID: the public ID string + * @sysID: the system ID string + * + * Do a complete resolution lookup of an External Identifier + * + * Returns the URI of the resource or NULL if not found, it must be freed + * by the caller. + */ +xmlChar * +xmlACatalogResolve(xmlCatalogPtr catal, const xmlChar * pubID, + const xmlChar * sysID) +{ + xmlChar *ret = NULL; + + if (((pubID == NULL) && (sysID == NULL)) || (catal == NULL)) + return (NULL); + + if (xmlDebugCatalogs) { + if ((pubID != NULL) && (sysID != NULL)) { + xmlGenericError(xmlGenericErrorContext, + "Resolve: pubID %s sysID %s\n", pubID, sysID); + } else if (pubID != NULL) { + xmlGenericError(xmlGenericErrorContext, + "Resolve: pubID %s\n", pubID); + } else { + xmlGenericError(xmlGenericErrorContext, + "Resolve: sysID %s\n", sysID); + } + } + + if (catal->type == XML_XML_CATALOG_TYPE) { + ret = xmlCatalogListXMLResolve(catal->xml, pubID, sysID); + if (ret == XML_CATAL_BREAK) + ret = NULL; + } else { + const xmlChar *sgml; + + sgml = xmlCatalogSGMLResolve(catal, pubID, sysID); + if (sgml != NULL) + ret = xmlStrdup(sgml); + } + return (ret); +} + +/** + * xmlACatalogResolveURI: + * @catal: a Catalog + * @URI: the URI + * + * Do a complete resolution lookup of an URI + * + * Returns the URI of the resource or NULL if not found, it must be freed + * by the caller. + */ +xmlChar * +xmlACatalogResolveURI(xmlCatalogPtr catal, const xmlChar *URI) { + xmlChar *ret = NULL; + + if ((URI == NULL) || (catal == NULL)) + return(NULL); + + if (xmlDebugCatalogs) + xmlGenericError(xmlGenericErrorContext, + "Resolve URI %s\n", URI); + + if (catal->type == XML_XML_CATALOG_TYPE) { + ret = xmlCatalogListXMLResolveURI(catal->xml, URI); + if (ret == XML_CATAL_BREAK) + ret = NULL; + } else { + const xmlChar *sgml; + + sgml = xmlCatalogSGMLResolve(catal, NULL, URI); + if (sgml != NULL) + ret = xmlStrdup(sgml); + } + return(ret); +} + +#ifdef LIBXML_OUTPUT_ENABLED +/** + * xmlACatalogDump: + * @catal: a Catalog + * @out: the file. + * + * Dump the given catalog to the given file. + */ +void +xmlACatalogDump(xmlCatalogPtr catal, FILE *out) { + if ((out == NULL) || (catal == NULL)) + return; + + if (catal->type == XML_XML_CATALOG_TYPE) { + xmlDumpXMLCatalog(out, catal->xml); + } else { + xmlHashScan(catal->sgml, + (xmlHashScanner) xmlCatalogDumpEntry, out); + } +} +#endif /* LIBXML_OUTPUT_ENABLED */ + +/** + * xmlACatalogAdd: + * @catal: a Catalog + * @type: the type of record to add to the catalog + * @orig: the system, public or prefix to match + * @replace: the replacement value for the match + * + * Add an entry in the catalog, it may overwrite existing but + * different entries. + * + * Returns 0 if successful, -1 otherwise + */ +int +xmlACatalogAdd(xmlCatalogPtr catal, const xmlChar * type, + const xmlChar * orig, const xmlChar * replace) +{ + int res = -1; + + if (catal == NULL) + return(-1); + + if (catal->type == XML_XML_CATALOG_TYPE) { + res = xmlAddXMLCatalog(catal->xml, type, orig, replace); + } else { + xmlCatalogEntryType cattype; + + cattype = xmlGetSGMLCatalogEntryType(type); + if (cattype != XML_CATA_NONE) { + xmlCatalogEntryPtr entry; + + entry = xmlNewCatalogEntry(cattype, orig, replace, NULL, + XML_CATA_PREFER_NONE, NULL); + if (catal->sgml == NULL) + catal->sgml = xmlHashCreate(10); + res = xmlHashAddEntry(catal->sgml, orig, entry); + } + } + return (res); +} + +/** + * xmlACatalogRemove: + * @catal: a Catalog + * @value: the value to remove + * + * Remove an entry from the catalog + * + * Returns the number of entries removed if successful, -1 otherwise + */ +int +xmlACatalogRemove(xmlCatalogPtr catal, const xmlChar *value) { + int res = -1; + + if ((catal == NULL) || (value == NULL)) + return(-1); + + if (catal->type == XML_XML_CATALOG_TYPE) { + res = xmlDelXMLCatalog(catal->xml, value); + } else { + res = xmlHashRemoveEntry(catal->sgml, value, + (xmlHashDeallocator) xmlFreeCatalogEntry); + if (res == 0) + res = 1; + } + return(res); +} + +/** + * xmlNewCatalog: + * @sgml: should this create an SGML catalog + * + * create a new Catalog. + * + * Returns the xmlCatalogPtr or NULL in case of error + */ +xmlCatalogPtr +xmlNewCatalog(int sgml) { + xmlCatalogPtr catal = NULL; + + if (sgml) { + catal = xmlCreateNewCatalog(XML_SGML_CATALOG_TYPE, + xmlCatalogDefaultPrefer); + if ((catal != NULL) && (catal->sgml == NULL)) + catal->sgml = xmlHashCreate(10); + } else + catal = xmlCreateNewCatalog(XML_XML_CATALOG_TYPE, + xmlCatalogDefaultPrefer); + return(catal); +} + +/** + * xmlCatalogIsEmpty: + * @catal: should this create an SGML catalog + * + * Check is a catalog is empty + * + * Returns 1 if the catalog is empty, 0 if not, amd -1 in case of error. + */ +int +xmlCatalogIsEmpty(xmlCatalogPtr catal) { + if (catal == NULL) + return(-1); + + if (catal->type == XML_XML_CATALOG_TYPE) { + if (catal->xml == NULL) + return(1); + if ((catal->xml->type != XML_CATA_CATALOG) && + (catal->xml->type != XML_CATA_BROKEN_CATALOG)) + return(-1); + if (catal->xml->children == NULL) + return(1); + return(0); + } else { + int res; + + if (catal->sgml == NULL) + return(1); + res = xmlHashSize(catal->sgml); + if (res == 0) + return(1); + if (res < 0) + return(-1); + } + return(0); +} + +/************************************************************************ + * * + * Public interfaces manipulating the global shared default catalog * + * * + ************************************************************************/ + +/** + * xmlInitializeCatalogData: + * + * Do the catalog initialization only of global data, doesn't try to load + * any catalog actually. + * this function is not thread safe, catalog initialization should + * preferably be done once at startup + */ +static void +xmlInitializeCatalogData(void) { + if (xmlCatalogInitialized != 0) + return; + + if (getenv("XML_DEBUG_CATALOG")) + xmlDebugCatalogs = 1; + xmlCatalogMutex = xmlNewRMutex(); + + xmlCatalogInitialized = 1; +} +/** + * xmlInitializeCatalog: + * + * Do the catalog initialization. + * this function is not thread safe, catalog initialization should + * preferably be done once at startup + */ +void +xmlInitializeCatalog(void) { + if (xmlCatalogInitialized != 0) + return; + + xmlInitializeCatalogData(); + xmlRMutexLock(xmlCatalogMutex); + + if (getenv("XML_DEBUG_CATALOG")) + xmlDebugCatalogs = 1; + + if (xmlDefaultCatalog == NULL) { + const char *catalogs; + char *path; + const char *cur, *paths; + xmlCatalogPtr catal; + xmlCatalogEntryPtr *nextent; + + catalogs = (const char *) getenv("XML_CATALOG_FILES"); + if (catalogs == NULL) +#if defined(_WIN32) && defined(_MSC_VER) + { + void* hmodule; + hmodule = GetModuleHandleA("libxml2.dll"); + if (hmodule == NULL) + hmodule = GetModuleHandleA(NULL); + if (hmodule != NULL) { + char buf[256]; + unsigned long len = GetModuleFileNameA(hmodule, buf, 255); + if (len != 0) { + char* p = &(buf[len]); + while (*p != '\\' && p > buf) + p--; + if (p != buf) { + xmlChar* uri; + strncpy(p, "\\..\\etc\\catalog", 255 - (p - buf)); + uri = xmlCanonicPath((const xmlChar*)buf); + if (uri != NULL) { + strncpy(XML_XML_DEFAULT_CATALOG, uri, 255); + xmlFree(uri); + } + } + } + } + catalogs = XML_XML_DEFAULT_CATALOG; + } +#else + catalogs = XML_XML_DEFAULT_CATALOG; +#endif + + catal = xmlCreateNewCatalog(XML_XML_CATALOG_TYPE, + xmlCatalogDefaultPrefer); + if (catal != NULL) { + /* the XML_CATALOG_FILES envvar is allowed to contain a + space-separated list of entries. */ + cur = catalogs; + nextent = &catal->xml; + while (*cur != '\0') { + while (xmlIsBlank_ch(*cur)) + cur++; + if (*cur != 0) { + paths = cur; + while ((*cur != 0) && (!xmlIsBlank_ch(*cur))) + cur++; + path = (char *) xmlStrndup((const xmlChar *)paths, cur - paths); + if (path != NULL) { + *nextent = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL, + NULL, BAD_CAST path, xmlCatalogDefaultPrefer, NULL); + if (*nextent != NULL) + nextent = &((*nextent)->next); + xmlFree(path); + } + } + } + xmlDefaultCatalog = catal; + } + } + + xmlRMutexUnlock(xmlCatalogMutex); +} + + +/** + * xmlLoadCatalog: + * @filename: a file path + * + * Load the catalog and makes its definitions effective for the default + * external entity loader. It will recurse in SGML CATALOG entries. + * this function is not thread safe, catalog initialization should + * preferably be done once at startup + * + * Returns 0 in case of success -1 in case of error + */ +int +xmlLoadCatalog(const char *filename) +{ + int ret; + xmlCatalogPtr catal; + + if (!xmlCatalogInitialized) + xmlInitializeCatalogData(); + + xmlRMutexLock(xmlCatalogMutex); + + if (xmlDefaultCatalog == NULL) { + catal = xmlLoadACatalog(filename); + if (catal == NULL) { + xmlRMutexUnlock(xmlCatalogMutex); + return(-1); + } + + xmlDefaultCatalog = catal; + xmlRMutexUnlock(xmlCatalogMutex); + return(0); + } + + ret = xmlExpandCatalog(xmlDefaultCatalog, filename); + xmlRMutexUnlock(xmlCatalogMutex); + return(ret); +} + +/** + * xmlLoadCatalogs: + * @pathss: a list of directories separated by a colon or a space. + * + * Load the catalogs and makes their definitions effective for the default + * external entity loader. + * this function is not thread safe, catalog initialization should + * preferably be done once at startup + */ +void +xmlLoadCatalogs(const char *pathss) { + const char *cur; + const char *paths; + xmlChar *path; +#ifdef _WIN32 + int i, iLen; +#endif + + if (pathss == NULL) + return; + + cur = pathss; + while (*cur != 0) { + while (xmlIsBlank_ch(*cur)) cur++; + if (*cur != 0) { + paths = cur; + while ((*cur != 0) && (*cur != PATH_SEAPARATOR) && (!xmlIsBlank_ch(*cur))) + cur++; + path = xmlStrndup((const xmlChar *)paths, cur - paths); +#ifdef _WIN32 + iLen = strlen((const char*)path); + for(i = 0; i < iLen; i++) { + if(path[i] == '\\') { + path[i] = '/'; + } + } +#endif + if (path != NULL) { + xmlLoadCatalog((const char *) path); + xmlFree(path); + } + } + while (*cur == PATH_SEAPARATOR) + cur++; + } +} + +/** + * xmlCatalogCleanup: + * + * Free up all the memory associated with catalogs + */ +void +xmlCatalogCleanup(void) { + if (xmlCatalogInitialized == 0) + return; + + xmlRMutexLock(xmlCatalogMutex); + if (xmlDebugCatalogs) + xmlGenericError(xmlGenericErrorContext, + "Catalogs cleanup\n"); + if (xmlCatalogXMLFiles != NULL) + xmlHashFree(xmlCatalogXMLFiles, + (xmlHashDeallocator)xmlFreeCatalogHashEntryList); + xmlCatalogXMLFiles = NULL; + if (xmlDefaultCatalog != NULL) + xmlFreeCatalog(xmlDefaultCatalog); + xmlDefaultCatalog = NULL; + xmlDebugCatalogs = 0; + xmlCatalogInitialized = 0; + xmlRMutexUnlock(xmlCatalogMutex); + xmlFreeRMutex(xmlCatalogMutex); +} + +/** + * xmlCatalogResolveSystem: + * @sysID: the system ID string + * + * Try to lookup the catalog resource for a system ID + * + * Returns the resource if found or NULL otherwise, the value returned + * must be freed by the caller. + */ +xmlChar * +xmlCatalogResolveSystem(const xmlChar *sysID) { + xmlChar *ret; + + if (!xmlCatalogInitialized) + xmlInitializeCatalog(); + + ret = xmlACatalogResolveSystem(xmlDefaultCatalog, sysID); + return(ret); +} + +/** + * xmlCatalogResolvePublic: + * @pubID: the public ID string + * + * Try to lookup the catalog reference associated to a public ID + * + * Returns the resource if found or NULL otherwise, the value returned + * must be freed by the caller. + */ +xmlChar * +xmlCatalogResolvePublic(const xmlChar *pubID) { + xmlChar *ret; + + if (!xmlCatalogInitialized) + xmlInitializeCatalog(); + + ret = xmlACatalogResolvePublic(xmlDefaultCatalog, pubID); + return(ret); +} + +/** + * xmlCatalogResolve: + * @pubID: the public ID string + * @sysID: the system ID string + * + * Do a complete resolution lookup of an External Identifier + * + * Returns the URI of the resource or NULL if not found, it must be freed + * by the caller. + */ +xmlChar * +xmlCatalogResolve(const xmlChar *pubID, const xmlChar *sysID) { + xmlChar *ret; + + if (!xmlCatalogInitialized) + xmlInitializeCatalog(); + + ret = xmlACatalogResolve(xmlDefaultCatalog, pubID, sysID); + return(ret); +} + +/** + * xmlCatalogResolveURI: + * @URI: the URI + * + * Do a complete resolution lookup of an URI + * + * Returns the URI of the resource or NULL if not found, it must be freed + * by the caller. + */ +xmlChar * +xmlCatalogResolveURI(const xmlChar *URI) { + xmlChar *ret; + + if (!xmlCatalogInitialized) + xmlInitializeCatalog(); + + ret = xmlACatalogResolveURI(xmlDefaultCatalog, URI); + return(ret); +} + +#ifdef LIBXML_OUTPUT_ENABLED +/** + * xmlCatalogDump: + * @out: the file. + * + * Dump all the global catalog content to the given file. + */ +void +xmlCatalogDump(FILE *out) { + if (out == NULL) + return; + + if (!xmlCatalogInitialized) + xmlInitializeCatalog(); + + xmlACatalogDump(xmlDefaultCatalog, out); +} +#endif /* LIBXML_OUTPUT_ENABLED */ + +/** + * xmlCatalogAdd: + * @type: the type of record to add to the catalog + * @orig: the system, public or prefix to match + * @replace: the replacement value for the match + * + * Add an entry in the catalog, it may overwrite existing but + * different entries. + * If called before any other catalog routine, allows to override the + * default shared catalog put in place by xmlInitializeCatalog(); + * + * Returns 0 if successful, -1 otherwise + */ +int +xmlCatalogAdd(const xmlChar *type, const xmlChar *orig, const xmlChar *replace) { + int res = -1; + + if (!xmlCatalogInitialized) + xmlInitializeCatalogData(); + + xmlRMutexLock(xmlCatalogMutex); + /* + * Specific case where one want to override the default catalog + * put in place by xmlInitializeCatalog(); + */ + if ((xmlDefaultCatalog == NULL) && + (xmlStrEqual(type, BAD_CAST "catalog"))) { + xmlDefaultCatalog = xmlCreateNewCatalog(XML_XML_CATALOG_TYPE, + xmlCatalogDefaultPrefer); + xmlDefaultCatalog->xml = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL, + orig, NULL, xmlCatalogDefaultPrefer, NULL); + + xmlRMutexUnlock(xmlCatalogMutex); + return(0); + } + + res = xmlACatalogAdd(xmlDefaultCatalog, type, orig, replace); + xmlRMutexUnlock(xmlCatalogMutex); + return(res); +} + +/** + * xmlCatalogRemove: + * @value: the value to remove + * + * Remove an entry from the catalog + * + * Returns the number of entries removed if successful, -1 otherwise + */ +int +xmlCatalogRemove(const xmlChar *value) { + int res; + + if (!xmlCatalogInitialized) + xmlInitializeCatalog(); + + xmlRMutexLock(xmlCatalogMutex); + res = xmlACatalogRemove(xmlDefaultCatalog, value); + xmlRMutexUnlock(xmlCatalogMutex); + return(res); +} + +/** + * xmlCatalogConvert: + * + * Convert all the SGML catalog entries as XML ones + * + * Returns the number of entries converted if successful, -1 otherwise + */ +int +xmlCatalogConvert(void) { + int res = -1; + + if (!xmlCatalogInitialized) + xmlInitializeCatalog(); + + xmlRMutexLock(xmlCatalogMutex); + res = xmlConvertSGMLCatalog(xmlDefaultCatalog); + xmlRMutexUnlock(xmlCatalogMutex); + return(res); +} + +/************************************************************************ + * * + * Public interface manipulating the common preferences * + * * + ************************************************************************/ + +/** + * xmlCatalogGetDefaults: + * + * Used to get the user preference w.r.t. to what catalogs should + * be accepted + * + * Returns the current xmlCatalogAllow value + */ +xmlCatalogAllow +xmlCatalogGetDefaults(void) { + return(xmlCatalogDefaultAllow); +} + +/** + * xmlCatalogSetDefaults: + * @allow: what catalogs should be accepted + * + * Used to set the user preference w.r.t. to what catalogs should + * be accepted + */ +void +xmlCatalogSetDefaults(xmlCatalogAllow allow) { + if (xmlDebugCatalogs) { + switch (allow) { + case XML_CATA_ALLOW_NONE: + xmlGenericError(xmlGenericErrorContext, + "Disabling catalog usage\n"); + break; + case XML_CATA_ALLOW_GLOBAL: + xmlGenericError(xmlGenericErrorContext, + "Allowing only global catalogs\n"); + break; + case XML_CATA_ALLOW_DOCUMENT: + xmlGenericError(xmlGenericErrorContext, + "Allowing only catalogs from the document\n"); + break; + case XML_CATA_ALLOW_ALL: + xmlGenericError(xmlGenericErrorContext, + "Allowing all catalogs\n"); + break; + } + } + xmlCatalogDefaultAllow = allow; +} + +/** + * xmlCatalogSetDefaultPrefer: + * @prefer: the default preference for delegation + * + * Allows to set the preference between public and system for deletion + * in XML Catalog resolution. C.f. section 4.1.1 of the spec + * Values accepted are XML_CATA_PREFER_PUBLIC or XML_CATA_PREFER_SYSTEM + * + * Returns the previous value of the default preference for delegation + */ +xmlCatalogPrefer +xmlCatalogSetDefaultPrefer(xmlCatalogPrefer prefer) { + xmlCatalogPrefer ret = xmlCatalogDefaultPrefer; + + if (prefer == XML_CATA_PREFER_NONE) + return(ret); + + if (xmlDebugCatalogs) { + switch (prefer) { + case XML_CATA_PREFER_PUBLIC: + xmlGenericError(xmlGenericErrorContext, + "Setting catalog preference to PUBLIC\n"); + break; + case XML_CATA_PREFER_SYSTEM: + xmlGenericError(xmlGenericErrorContext, + "Setting catalog preference to SYSTEM\n"); + break; + case XML_CATA_PREFER_NONE: + break; + } + } + xmlCatalogDefaultPrefer = prefer; + return(ret); +} + +/** + * xmlCatalogSetDebug: + * @level: the debug level of catalogs required + * + * Used to set the debug level for catalog operation, 0 disable + * debugging, 1 enable it + * + * Returns the previous value of the catalog debugging level + */ +int +xmlCatalogSetDebug(int level) { + int ret = xmlDebugCatalogs; + + if (level <= 0) + xmlDebugCatalogs = 0; + else + xmlDebugCatalogs = level; + return(ret); +} + +/************************************************************************ + * * + * Minimal interfaces used for per-document catalogs by the parser * + * * + ************************************************************************/ + +/** + * xmlCatalogFreeLocal: + * @catalogs: a document's list of catalogs + * + * Free up the memory associated to the catalog list + */ +void +xmlCatalogFreeLocal(void *catalogs) { + xmlCatalogEntryPtr catal; + + if (!xmlCatalogInitialized) + xmlInitializeCatalog(); + + catal = (xmlCatalogEntryPtr) catalogs; + if (catal != NULL) + xmlFreeCatalogEntryList(catal); +} + + +/** + * xmlCatalogAddLocal: + * @catalogs: a document's list of catalogs + * @URL: the URL to a new local catalog + * + * Add the new entry to the catalog list + * + * Returns the updated list + */ +void * +xmlCatalogAddLocal(void *catalogs, const xmlChar *URL) { + xmlCatalogEntryPtr catal, add; + + if (!xmlCatalogInitialized) + xmlInitializeCatalog(); + + if (URL == NULL) + return(catalogs); + + if (xmlDebugCatalogs) + xmlGenericError(xmlGenericErrorContext, + "Adding document catalog %s\n", URL); + + add = xmlNewCatalogEntry(XML_CATA_CATALOG, NULL, URL, NULL, + xmlCatalogDefaultPrefer, NULL); + if (add == NULL) + return(catalogs); + + catal = (xmlCatalogEntryPtr) catalogs; + if (catal == NULL) + return((void *) add); + + while (catal->next != NULL) + catal = catal->next; + catal->next = add; + return(catalogs); +} + +/** + * xmlCatalogLocalResolve: + * @catalogs: a document's list of catalogs + * @pubID: the public ID string + * @sysID: the system ID string + * + * Do a complete resolution lookup of an External Identifier using a + * document's private catalog list + * + * Returns the URI of the resource or NULL if not found, it must be freed + * by the caller. + */ +xmlChar * +xmlCatalogLocalResolve(void *catalogs, const xmlChar *pubID, + const xmlChar *sysID) { + xmlCatalogEntryPtr catal; + xmlChar *ret; + + if (!xmlCatalogInitialized) + xmlInitializeCatalog(); + + if ((pubID == NULL) && (sysID == NULL)) + return(NULL); + + if (xmlDebugCatalogs) { + if ((pubID != NULL) && (sysID != NULL)) { + xmlGenericError(xmlGenericErrorContext, + "Local Resolve: pubID %s sysID %s\n", pubID, sysID); + } else if (pubID != NULL) { + xmlGenericError(xmlGenericErrorContext, + "Local Resolve: pubID %s\n", pubID); + } else { + xmlGenericError(xmlGenericErrorContext, + "Local Resolve: sysID %s\n", sysID); + } + } + + catal = (xmlCatalogEntryPtr) catalogs; + if (catal == NULL) + return(NULL); + ret = xmlCatalogListXMLResolve(catal, pubID, sysID); + if ((ret != NULL) && (ret != XML_CATAL_BREAK)) + return(ret); + return(NULL); +} + +/** + * xmlCatalogLocalResolveURI: + * @catalogs: a document's list of catalogs + * @URI: the URI + * + * Do a complete resolution lookup of an URI using a + * document's private catalog list + * + * Returns the URI of the resource or NULL if not found, it must be freed + * by the caller. + */ +xmlChar * +xmlCatalogLocalResolveURI(void *catalogs, const xmlChar *URI) { + xmlCatalogEntryPtr catal; + xmlChar *ret; + + if (!xmlCatalogInitialized) + xmlInitializeCatalog(); + + if (URI == NULL) + return(NULL); + + if (xmlDebugCatalogs) + xmlGenericError(xmlGenericErrorContext, + "Resolve URI %s\n", URI); + + catal = (xmlCatalogEntryPtr) catalogs; + if (catal == NULL) + return(NULL); + ret = xmlCatalogListXMLResolveURI(catal, URI); + if ((ret != NULL) && (ret != XML_CATAL_BREAK)) + return(ret); + return(NULL); +} + +/************************************************************************ + * * + * Deprecated interfaces * + * * + ************************************************************************/ +/** + * xmlCatalogGetSystem: + * @sysID: the system ID string + * + * Try to lookup the catalog reference associated to a system ID + * DEPRECATED, use xmlCatalogResolveSystem() + * + * Returns the resource if found or NULL otherwise. + */ +const xmlChar * +xmlCatalogGetSystem(const xmlChar *sysID) { + xmlChar *ret; + static xmlChar result[1000]; + static int msg = 0; + + if (!xmlCatalogInitialized) + xmlInitializeCatalog(); + + if (msg == 0) { + xmlGenericError(xmlGenericErrorContext, + "Use of deprecated xmlCatalogGetSystem() call\n"); + msg++; + } + + if (sysID == NULL) + return(NULL); + + /* + * Check first the XML catalogs + */ + if (xmlDefaultCatalog != NULL) { + ret = xmlCatalogListXMLResolve(xmlDefaultCatalog->xml, NULL, sysID); + if ((ret != NULL) && (ret != XML_CATAL_BREAK)) { + snprintf((char *) result, sizeof(result) - 1, "%s", (char *) ret); + result[sizeof(result) - 1] = 0; + return(result); + } + } + + if (xmlDefaultCatalog != NULL) + return(xmlCatalogGetSGMLSystem(xmlDefaultCatalog->sgml, sysID)); + return(NULL); +} + +/** + * xmlCatalogGetPublic: + * @pubID: the public ID string + * + * Try to lookup the catalog reference associated to a public ID + * DEPRECATED, use xmlCatalogResolvePublic() + * + * Returns the resource if found or NULL otherwise. + */ +const xmlChar * +xmlCatalogGetPublic(const xmlChar *pubID) { + xmlChar *ret; + static xmlChar result[1000]; + static int msg = 0; + + if (!xmlCatalogInitialized) + xmlInitializeCatalog(); + + if (msg == 0) { + xmlGenericError(xmlGenericErrorContext, + "Use of deprecated xmlCatalogGetPublic() call\n"); + msg++; + } + + if (pubID == NULL) + return(NULL); + + /* + * Check first the XML catalogs + */ + if (xmlDefaultCatalog != NULL) { + ret = xmlCatalogListXMLResolve(xmlDefaultCatalog->xml, pubID, NULL); + if ((ret != NULL) && (ret != XML_CATAL_BREAK)) { + snprintf((char *) result, sizeof(result) - 1, "%s", (char *) ret); + result[sizeof(result) - 1] = 0; + return(result); + } + } + + if (xmlDefaultCatalog != NULL) + return(xmlCatalogGetSGMLPublic(xmlDefaultCatalog->sgml, pubID)); + return(NULL); +} + +#define bottom_catalog +#include "elfgcchack.h" +#endif /* LIBXML_CATALOG_ENABLED */ diff --git a/vendors/libxml/src/chvalid.c b/vendors/libxml/src/chvalid.c new file mode 100644 index 0000000..06e8db0 --- /dev/null +++ b/vendors/libxml/src/chvalid.c @@ -0,0 +1,336 @@ +/* + * chvalid.c: this module implements the character range + * validation APIs + * + * This file is automatically generated from the cvs source + * definition files using the genChRanges.py Python script + * + * Generation date: Mon Mar 27 11:09:48 2006 + * Sources: chvalid.def + * William Brack + */ + +#define IN_LIBXML +#include "libxml.h" +#include + +/* + * The initial tables ({func_name}_tab) are used to validate whether a + * single-byte character is within the specified group. Each table + * contains 256 bytes, with each byte representing one of the 256 + * possible characters. If the table byte is set, the character is + * allowed. + * + */ +const unsigned char xmlIsPubidChar_tab[256] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 }; + +static const xmlChSRange xmlIsBaseChar_srng[] = { {0x100, 0x131}, + {0x134, 0x13e}, {0x141, 0x148}, {0x14a, 0x17e}, {0x180, 0x1c3}, + {0x1cd, 0x1f0}, {0x1f4, 0x1f5}, {0x1fa, 0x217}, {0x250, 0x2a8}, + {0x2bb, 0x2c1}, {0x386, 0x386}, {0x388, 0x38a}, {0x38c, 0x38c}, + {0x38e, 0x3a1}, {0x3a3, 0x3ce}, {0x3d0, 0x3d6}, {0x3da, 0x3da}, + {0x3dc, 0x3dc}, {0x3de, 0x3de}, {0x3e0, 0x3e0}, {0x3e2, 0x3f3}, + {0x401, 0x40c}, {0x40e, 0x44f}, {0x451, 0x45c}, {0x45e, 0x481}, + {0x490, 0x4c4}, {0x4c7, 0x4c8}, {0x4cb, 0x4cc}, {0x4d0, 0x4eb}, + {0x4ee, 0x4f5}, {0x4f8, 0x4f9}, {0x531, 0x556}, {0x559, 0x559}, + {0x561, 0x586}, {0x5d0, 0x5ea}, {0x5f0, 0x5f2}, {0x621, 0x63a}, + {0x641, 0x64a}, {0x671, 0x6b7}, {0x6ba, 0x6be}, {0x6c0, 0x6ce}, + {0x6d0, 0x6d3}, {0x6d5, 0x6d5}, {0x6e5, 0x6e6}, {0x905, 0x939}, + {0x93d, 0x93d}, {0x958, 0x961}, {0x985, 0x98c}, {0x98f, 0x990}, + {0x993, 0x9a8}, {0x9aa, 0x9b0}, {0x9b2, 0x9b2}, {0x9b6, 0x9b9}, + {0x9dc, 0x9dd}, {0x9df, 0x9e1}, {0x9f0, 0x9f1}, {0xa05, 0xa0a}, + {0xa0f, 0xa10}, {0xa13, 0xa28}, {0xa2a, 0xa30}, {0xa32, 0xa33}, + {0xa35, 0xa36}, {0xa38, 0xa39}, {0xa59, 0xa5c}, {0xa5e, 0xa5e}, + {0xa72, 0xa74}, {0xa85, 0xa8b}, {0xa8d, 0xa8d}, {0xa8f, 0xa91}, + {0xa93, 0xaa8}, {0xaaa, 0xab0}, {0xab2, 0xab3}, {0xab5, 0xab9}, + {0xabd, 0xabd}, {0xae0, 0xae0}, {0xb05, 0xb0c}, {0xb0f, 0xb10}, + {0xb13, 0xb28}, {0xb2a, 0xb30}, {0xb32, 0xb33}, {0xb36, 0xb39}, + {0xb3d, 0xb3d}, {0xb5c, 0xb5d}, {0xb5f, 0xb61}, {0xb85, 0xb8a}, + {0xb8e, 0xb90}, {0xb92, 0xb95}, {0xb99, 0xb9a}, {0xb9c, 0xb9c}, + {0xb9e, 0xb9f}, {0xba3, 0xba4}, {0xba8, 0xbaa}, {0xbae, 0xbb5}, + {0xbb7, 0xbb9}, {0xc05, 0xc0c}, {0xc0e, 0xc10}, {0xc12, 0xc28}, + {0xc2a, 0xc33}, {0xc35, 0xc39}, {0xc60, 0xc61}, {0xc85, 0xc8c}, + {0xc8e, 0xc90}, {0xc92, 0xca8}, {0xcaa, 0xcb3}, {0xcb5, 0xcb9}, + {0xcde, 0xcde}, {0xce0, 0xce1}, {0xd05, 0xd0c}, {0xd0e, 0xd10}, + {0xd12, 0xd28}, {0xd2a, 0xd39}, {0xd60, 0xd61}, {0xe01, 0xe2e}, + {0xe30, 0xe30}, {0xe32, 0xe33}, {0xe40, 0xe45}, {0xe81, 0xe82}, + {0xe84, 0xe84}, {0xe87, 0xe88}, {0xe8a, 0xe8a}, {0xe8d, 0xe8d}, + {0xe94, 0xe97}, {0xe99, 0xe9f}, {0xea1, 0xea3}, {0xea5, 0xea5}, + {0xea7, 0xea7}, {0xeaa, 0xeab}, {0xead, 0xeae}, {0xeb0, 0xeb0}, + {0xeb2, 0xeb3}, {0xebd, 0xebd}, {0xec0, 0xec4}, {0xf40, 0xf47}, + {0xf49, 0xf69}, {0x10a0, 0x10c5}, {0x10d0, 0x10f6}, {0x1100, 0x1100}, + {0x1102, 0x1103}, {0x1105, 0x1107}, {0x1109, 0x1109}, {0x110b, 0x110c}, + {0x110e, 0x1112}, {0x113c, 0x113c}, {0x113e, 0x113e}, {0x1140, 0x1140}, + {0x114c, 0x114c}, {0x114e, 0x114e}, {0x1150, 0x1150}, {0x1154, 0x1155}, + {0x1159, 0x1159}, {0x115f, 0x1161}, {0x1163, 0x1163}, {0x1165, 0x1165}, + {0x1167, 0x1167}, {0x1169, 0x1169}, {0x116d, 0x116e}, {0x1172, 0x1173}, + {0x1175, 0x1175}, {0x119e, 0x119e}, {0x11a8, 0x11a8}, {0x11ab, 0x11ab}, + {0x11ae, 0x11af}, {0x11b7, 0x11b8}, {0x11ba, 0x11ba}, {0x11bc, 0x11c2}, + {0x11eb, 0x11eb}, {0x11f0, 0x11f0}, {0x11f9, 0x11f9}, {0x1e00, 0x1e9b}, + {0x1ea0, 0x1ef9}, {0x1f00, 0x1f15}, {0x1f18, 0x1f1d}, {0x1f20, 0x1f45}, + {0x1f48, 0x1f4d}, {0x1f50, 0x1f57}, {0x1f59, 0x1f59}, {0x1f5b, 0x1f5b}, + {0x1f5d, 0x1f5d}, {0x1f5f, 0x1f7d}, {0x1f80, 0x1fb4}, {0x1fb6, 0x1fbc}, + {0x1fbe, 0x1fbe}, {0x1fc2, 0x1fc4}, {0x1fc6, 0x1fcc}, {0x1fd0, 0x1fd3}, + {0x1fd6, 0x1fdb}, {0x1fe0, 0x1fec}, {0x1ff2, 0x1ff4}, {0x1ff6, 0x1ffc}, + {0x2126, 0x2126}, {0x212a, 0x212b}, {0x212e, 0x212e}, {0x2180, 0x2182}, + {0x3041, 0x3094}, {0x30a1, 0x30fa}, {0x3105, 0x312c}, {0xac00, 0xd7a3}}; +const xmlChRangeGroup xmlIsBaseCharGroup = + {197, 0, xmlIsBaseChar_srng, (xmlChLRangePtr)0}; + +static const xmlChSRange xmlIsChar_srng[] = { {0x100, 0xd7ff}, + {0xe000, 0xfffd}}; +static const xmlChLRange xmlIsChar_lrng[] = { {0x10000, 0x10ffff}}; +const xmlChRangeGroup xmlIsCharGroup = + {2, 1, xmlIsChar_srng, xmlIsChar_lrng}; + +static const xmlChSRange xmlIsCombining_srng[] = { {0x300, 0x345}, + {0x360, 0x361}, {0x483, 0x486}, {0x591, 0x5a1}, {0x5a3, 0x5b9}, + {0x5bb, 0x5bd}, {0x5bf, 0x5bf}, {0x5c1, 0x5c2}, {0x5c4, 0x5c4}, + {0x64b, 0x652}, {0x670, 0x670}, {0x6d6, 0x6dc}, {0x6dd, 0x6df}, + {0x6e0, 0x6e4}, {0x6e7, 0x6e8}, {0x6ea, 0x6ed}, {0x901, 0x903}, + {0x93c, 0x93c}, {0x93e, 0x94c}, {0x94d, 0x94d}, {0x951, 0x954}, + {0x962, 0x963}, {0x981, 0x983}, {0x9bc, 0x9bc}, {0x9be, 0x9be}, + {0x9bf, 0x9bf}, {0x9c0, 0x9c4}, {0x9c7, 0x9c8}, {0x9cb, 0x9cd}, + {0x9d7, 0x9d7}, {0x9e2, 0x9e3}, {0xa02, 0xa02}, {0xa3c, 0xa3c}, + {0xa3e, 0xa3e}, {0xa3f, 0xa3f}, {0xa40, 0xa42}, {0xa47, 0xa48}, + {0xa4b, 0xa4d}, {0xa70, 0xa71}, {0xa81, 0xa83}, {0xabc, 0xabc}, + {0xabe, 0xac5}, {0xac7, 0xac9}, {0xacb, 0xacd}, {0xb01, 0xb03}, + {0xb3c, 0xb3c}, {0xb3e, 0xb43}, {0xb47, 0xb48}, {0xb4b, 0xb4d}, + {0xb56, 0xb57}, {0xb82, 0xb83}, {0xbbe, 0xbc2}, {0xbc6, 0xbc8}, + {0xbca, 0xbcd}, {0xbd7, 0xbd7}, {0xc01, 0xc03}, {0xc3e, 0xc44}, + {0xc46, 0xc48}, {0xc4a, 0xc4d}, {0xc55, 0xc56}, {0xc82, 0xc83}, + {0xcbe, 0xcc4}, {0xcc6, 0xcc8}, {0xcca, 0xccd}, {0xcd5, 0xcd6}, + {0xd02, 0xd03}, {0xd3e, 0xd43}, {0xd46, 0xd48}, {0xd4a, 0xd4d}, + {0xd57, 0xd57}, {0xe31, 0xe31}, {0xe34, 0xe3a}, {0xe47, 0xe4e}, + {0xeb1, 0xeb1}, {0xeb4, 0xeb9}, {0xebb, 0xebc}, {0xec8, 0xecd}, + {0xf18, 0xf19}, {0xf35, 0xf35}, {0xf37, 0xf37}, {0xf39, 0xf39}, + {0xf3e, 0xf3e}, {0xf3f, 0xf3f}, {0xf71, 0xf84}, {0xf86, 0xf8b}, + {0xf90, 0xf95}, {0xf97, 0xf97}, {0xf99, 0xfad}, {0xfb1, 0xfb7}, + {0xfb9, 0xfb9}, {0x20d0, 0x20dc}, {0x20e1, 0x20e1}, {0x302a, 0x302f}, + {0x3099, 0x3099}, {0x309a, 0x309a}}; +const xmlChRangeGroup xmlIsCombiningGroup = + {95, 0, xmlIsCombining_srng, (xmlChLRangePtr)0}; + +static const xmlChSRange xmlIsDigit_srng[] = { {0x660, 0x669}, + {0x6f0, 0x6f9}, {0x966, 0x96f}, {0x9e6, 0x9ef}, {0xa66, 0xa6f}, + {0xae6, 0xaef}, {0xb66, 0xb6f}, {0xbe7, 0xbef}, {0xc66, 0xc6f}, + {0xce6, 0xcef}, {0xd66, 0xd6f}, {0xe50, 0xe59}, {0xed0, 0xed9}, + {0xf20, 0xf29}}; +const xmlChRangeGroup xmlIsDigitGroup = + {14, 0, xmlIsDigit_srng, (xmlChLRangePtr)0}; + +static const xmlChSRange xmlIsExtender_srng[] = { {0x2d0, 0x2d0}, + {0x2d1, 0x2d1}, {0x387, 0x387}, {0x640, 0x640}, {0xe46, 0xe46}, + {0xec6, 0xec6}, {0x3005, 0x3005}, {0x3031, 0x3035}, {0x309d, 0x309e}, + {0x30fc, 0x30fe}}; +const xmlChRangeGroup xmlIsExtenderGroup = + {10, 0, xmlIsExtender_srng, (xmlChLRangePtr)0}; + +static const xmlChSRange xmlIsIdeographic_srng[] = { {0x3007, 0x3007}, + {0x3021, 0x3029}, {0x4e00, 0x9fa5}}; +const xmlChRangeGroup xmlIsIdeographicGroup = + {3, 0, xmlIsIdeographic_srng, (xmlChLRangePtr)0}; + + +/** + * xmlCharInRange: + * @val: character to be validated + * @rptr: pointer to range to be used to validate + * + * Does a binary search of the range table to determine if char + * is valid + * + * Returns: true if character valid, false otherwise + */ +int +xmlCharInRange (unsigned int val, const xmlChRangeGroup *rptr) { + int low, high, mid; + const xmlChSRange *sptr; + const xmlChLRange *lptr; + + if (rptr == NULL) return(0); + if (val < 0x10000) { /* is val in 'short' or 'long' array? */ + if (rptr->nbShortRange == 0) + return 0; + low = 0; + high = rptr->nbShortRange - 1; + sptr = rptr->shortRange; + while (low <= high) { + mid = (low + high) / 2; + if ((unsigned short) val < sptr[mid].low) { + high = mid - 1; + } else { + if ((unsigned short) val > sptr[mid].high) { + low = mid + 1; + } else { + return 1; + } + } + } + } else { + if (rptr->nbLongRange == 0) { + return 0; + } + low = 0; + high = rptr->nbLongRange - 1; + lptr = rptr->longRange; + while (low <= high) { + mid = (low + high) / 2; + if (val < lptr[mid].low) { + high = mid - 1; + } else { + if (val > lptr[mid].high) { + low = mid + 1; + } else { + return 1; + } + } + } + } + return 0; +} + + +/** + * xmlIsBaseChar: + * @ch: character to validate + * + * This function is DEPRECATED. + * Use xmlIsBaseChar_ch or xmlIsBaseCharQ instead + * + * Returns true if argument valid, false otherwise + */ +int +xmlIsBaseChar(unsigned int ch) { + return(xmlIsBaseCharQ(ch)); +} + + +/** + * xmlIsBlank: + * @ch: character to validate + * + * This function is DEPRECATED. + * Use xmlIsBlank_ch or xmlIsBlankQ instead + * + * Returns true if argument valid, false otherwise + */ +int +xmlIsBlank(unsigned int ch) { + return(xmlIsBlankQ(ch)); +} + + +/** + * xmlIsChar: + * @ch: character to validate + * + * This function is DEPRECATED. + * Use xmlIsChar_ch or xmlIsCharQ instead + * + * Returns true if argument valid, false otherwise + */ +int +xmlIsChar(unsigned int ch) { + return(xmlIsCharQ(ch)); +} + + +/** + * xmlIsCombining: + * @ch: character to validate + * + * This function is DEPRECATED. + * Use xmlIsCombiningQ instead + * + * Returns true if argument valid, false otherwise + */ +int +xmlIsCombining(unsigned int ch) { + return(xmlIsCombiningQ(ch)); +} + + +/** + * xmlIsDigit: + * @ch: character to validate + * + * This function is DEPRECATED. + * Use xmlIsDigit_ch or xmlIsDigitQ instead + * + * Returns true if argument valid, false otherwise + */ +int +xmlIsDigit(unsigned int ch) { + return(xmlIsDigitQ(ch)); +} + + +/** + * xmlIsExtender: + * @ch: character to validate + * + * This function is DEPRECATED. + * Use xmlIsExtender_ch or xmlIsExtenderQ instead + * + * Returns true if argument valid, false otherwise + */ +int +xmlIsExtender(unsigned int ch) { + return(xmlIsExtenderQ(ch)); +} + + +/** + * xmlIsIdeographic: + * @ch: character to validate + * + * This function is DEPRECATED. + * Use xmlIsIdeographicQ instead + * + * Returns true if argument valid, false otherwise + */ +int +xmlIsIdeographic(unsigned int ch) { + return(xmlIsIdeographicQ(ch)); +} + + +/** + * xmlIsPubidChar: + * @ch: character to validate + * + * This function is DEPRECATED. + * Use xmlIsPubidChar_ch or xmlIsPubidCharQ instead + * + * Returns true if argument valid, false otherwise + */ +int +xmlIsPubidChar(unsigned int ch) { + return(xmlIsPubidCharQ(ch)); +} + +#define bottom_chvalid +#include "elfgcchack.h" diff --git a/vendors/libxml/src/debugXML.c b/vendors/libxml/src/debugXML.c new file mode 100644 index 0000000..c8efe6a --- /dev/null +++ b/vendors/libxml/src/debugXML.c @@ -0,0 +1,3421 @@ +/* + * debugXML.c : This is a set of routines used for debugging the tree + * produced by the XML parser. + * + * See Copyright for the status of this software. + * + * Daniel Veillard + */ + +#define IN_LIBXML +#include "libxml.h" +#ifdef LIBXML_DEBUG_ENABLED + +#include +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef LIBXML_SCHEMAS_ENABLED +#include +#endif + +#define DUMP_TEXT_TYPE 1 + +typedef struct _xmlDebugCtxt xmlDebugCtxt; +typedef xmlDebugCtxt *xmlDebugCtxtPtr; +struct _xmlDebugCtxt { + FILE *output; /* the output file */ + char shift[101]; /* used for indenting */ + int depth; /* current depth */ + xmlDocPtr doc; /* current document */ + xmlNodePtr node; /* current node */ + xmlDictPtr dict; /* the doc dictionnary */ + int check; /* do just checkings */ + int errors; /* number of errors found */ + int nodict; /* if the document has no dictionnary */ + int options; /* options */ +}; + +static void xmlCtxtDumpNodeList(xmlDebugCtxtPtr ctxt, xmlNodePtr node); + +static void +xmlCtxtDumpInitCtxt(xmlDebugCtxtPtr ctxt) +{ + int i; + + ctxt->depth = 0; + ctxt->check = 0; + ctxt->errors = 0; + ctxt->output = stdout; + ctxt->doc = NULL; + ctxt->node = NULL; + ctxt->dict = NULL; + ctxt->nodict = 0; + ctxt->options = 0; + for (i = 0; i < 100; i++) + ctxt->shift[i] = ' '; + ctxt->shift[100] = 0; +} + +static void +xmlCtxtDumpCleanCtxt(xmlDebugCtxtPtr ctxt ATTRIBUTE_UNUSED) +{ + /* remove the ATTRIBUTE_UNUSED when this is added */ +} + +/** + * xmlNsCheckScope: + * @node: the node + * @ns: the namespace node + * + * Check that a given namespace is in scope on a node. + * + * Returns 1 if in scope, -1 in case of argument error, + * -2 if the namespace is not in scope, and -3 if not on + * an ancestor node. + */ +static int +xmlNsCheckScope(xmlNodePtr node, xmlNsPtr ns) +{ + xmlNsPtr cur; + + if ((node == NULL) || (ns == NULL)) + return(-1); + + if ((node->type != XML_ELEMENT_NODE) && + (node->type != XML_ATTRIBUTE_NODE) && + (node->type != XML_DOCUMENT_NODE) && + (node->type != XML_TEXT_NODE) && + (node->type != XML_HTML_DOCUMENT_NODE) && + (node->type != XML_XINCLUDE_START)) + return(-2); + + while ((node != NULL) && + ((node->type == XML_ELEMENT_NODE) || + (node->type == XML_ATTRIBUTE_NODE) || + (node->type == XML_TEXT_NODE) || + (node->type == XML_XINCLUDE_START))) { + if ((node->type == XML_ELEMENT_NODE) || + (node->type == XML_XINCLUDE_START)) { + cur = node->nsDef; + while (cur != NULL) { + if (cur == ns) + return(1); + if (xmlStrEqual(cur->prefix, ns->prefix)) + return(-2); + cur = cur->next; + } + } + node = node->parent; + } + /* the xml namespace may be declared on the document node */ + if ((node != NULL) && + ((node->type == XML_DOCUMENT_NODE) || + (node->type == XML_HTML_DOCUMENT_NODE))) { + xmlNsPtr oldNs = ((xmlDocPtr) node)->oldNs; + if (oldNs == ns) + return(1); + } + return(-3); +} + +static void +xmlCtxtDumpSpaces(xmlDebugCtxtPtr ctxt) +{ + if (ctxt->check) + return; + if ((ctxt->output != NULL) && (ctxt->depth > 0)) { + if (ctxt->depth < 50) + fprintf(ctxt->output, "%s", &ctxt->shift[100 - 2 * ctxt->depth]); + else + fprintf(ctxt->output, "%s", ctxt->shift); + } +} + +/** + * xmlDebugErr: + * @ctxt: a debug context + * @error: the error code + * + * Handle a debug error. + */ +static void +xmlDebugErr(xmlDebugCtxtPtr ctxt, int error, const char *msg) +{ + ctxt->errors++; + __xmlRaiseError(NULL, NULL, NULL, + NULL, ctxt->node, XML_FROM_CHECK, + error, XML_ERR_ERROR, NULL, 0, + NULL, NULL, NULL, 0, 0, + "%s", msg); +} +static void +xmlDebugErr2(xmlDebugCtxtPtr ctxt, int error, const char *msg, int extra) +{ + ctxt->errors++; + __xmlRaiseError(NULL, NULL, NULL, + NULL, ctxt->node, XML_FROM_CHECK, + error, XML_ERR_ERROR, NULL, 0, + NULL, NULL, NULL, 0, 0, + msg, extra); +} +static void +xmlDebugErr3(xmlDebugCtxtPtr ctxt, int error, const char *msg, const char *extra) +{ + ctxt->errors++; + __xmlRaiseError(NULL, NULL, NULL, + NULL, ctxt->node, XML_FROM_CHECK, + error, XML_ERR_ERROR, NULL, 0, + NULL, NULL, NULL, 0, 0, + msg, extra); +} + +/** + * xmlCtxtNsCheckScope: + * @ctxt: the debugging context + * @node: the node + * @ns: the namespace node + * + * Report if a given namespace is is not in scope. + */ +static void +xmlCtxtNsCheckScope(xmlDebugCtxtPtr ctxt, xmlNodePtr node, xmlNsPtr ns) +{ + int ret; + + ret = xmlNsCheckScope(node, ns); + if (ret == -2) { + if (ns->prefix == NULL) + xmlDebugErr(ctxt, XML_CHECK_NS_SCOPE, + "Reference to default namespace not in scope\n"); + else + xmlDebugErr3(ctxt, XML_CHECK_NS_SCOPE, + "Reference to namespace '%s' not in scope\n", + (char *) ns->prefix); + } + if (ret == -3) { + if (ns->prefix == NULL) + xmlDebugErr(ctxt, XML_CHECK_NS_ANCESTOR, + "Reference to default namespace not on ancestor\n"); + else + xmlDebugErr3(ctxt, XML_CHECK_NS_ANCESTOR, + "Reference to namespace '%s' not on ancestor\n", + (char *) ns->prefix); + } +} + +/** + * xmlCtxtCheckString: + * @ctxt: the debug context + * @str: the string + * + * Do debugging on the string, currently it just checks the UTF-8 content + */ +static void +xmlCtxtCheckString(xmlDebugCtxtPtr ctxt, const xmlChar * str) +{ + if (str == NULL) return; + if (ctxt->check) { + if (!xmlCheckUTF8(str)) { + xmlDebugErr3(ctxt, XML_CHECK_NOT_UTF8, + "String is not UTF-8 %s", (const char *) str); + } + } +} + +/** + * xmlCtxtCheckName: + * @ctxt: the debug context + * @name: the name + * + * Do debugging on the name, for example the dictionnary status and + * conformance to the Name production. + */ +static void +xmlCtxtCheckName(xmlDebugCtxtPtr ctxt, const xmlChar * name) +{ + if (ctxt->check) { + if (name == NULL) { + xmlDebugErr(ctxt, XML_CHECK_NO_NAME, "Name is NULL"); + return; + } + if (xmlValidateName(name, 0)) { + xmlDebugErr3(ctxt, XML_CHECK_NOT_NCNAME, + "Name is not an NCName '%s'", (const char *) name); + } + if ((ctxt->dict != NULL) && + (!xmlDictOwns(ctxt->dict, name)) && + ((ctxt->doc == NULL) || + ((ctxt->doc->parseFlags & (XML_PARSE_SAX1 | XML_PARSE_NODICT)) == 0))) { + xmlDebugErr3(ctxt, XML_CHECK_OUTSIDE_DICT, + "Name is not from the document dictionnary '%s'", + (const char *) name); + } + } +} + +static void +xmlCtxtGenericNodeCheck(xmlDebugCtxtPtr ctxt, xmlNodePtr node) { + xmlDocPtr doc; + xmlDictPtr dict; + + doc = node->doc; + + if (node->parent == NULL) + xmlDebugErr(ctxt, XML_CHECK_NO_PARENT, + "Node has no parent\n"); + if (node->doc == NULL) { + xmlDebugErr(ctxt, XML_CHECK_NO_DOC, + "Node has no doc\n"); + dict = NULL; + } else { + dict = doc->dict; + if ((dict == NULL) && (ctxt->nodict == 0)) { +#if 0 + /* desactivated right now as it raises too many errors */ + if (doc->type == XML_DOCUMENT_NODE) + xmlDebugErr(ctxt, XML_CHECK_NO_DICT, + "Document has no dictionnary\n"); +#endif + ctxt->nodict = 1; + } + if (ctxt->doc == NULL) + ctxt->doc = doc; + + if (ctxt->dict == NULL) { + ctxt->dict = dict; + } + } + if ((node->parent != NULL) && (node->doc != node->parent->doc) && + (!xmlStrEqual(node->name, BAD_CAST "pseudoroot"))) + xmlDebugErr(ctxt, XML_CHECK_WRONG_DOC, + "Node doc differs from parent's one\n"); + if (node->prev == NULL) { + if (node->type == XML_ATTRIBUTE_NODE) { + if ((node->parent != NULL) && + (node != (xmlNodePtr) node->parent->properties)) + xmlDebugErr(ctxt, XML_CHECK_NO_PREV, + "Attr has no prev and not first of attr list\n"); + + } else if ((node->parent != NULL) && (node->parent->children != node)) + xmlDebugErr(ctxt, XML_CHECK_NO_PREV, + "Node has no prev and not first of parent list\n"); + } else { + if (node->prev->next != node) + xmlDebugErr(ctxt, XML_CHECK_WRONG_PREV, + "Node prev->next : back link wrong\n"); + } + if (node->next == NULL) { + if ((node->parent != NULL) && (node->type != XML_ATTRIBUTE_NODE) && + (node->parent->last != node) && + (node->parent->type == XML_ELEMENT_NODE)) + xmlDebugErr(ctxt, XML_CHECK_NO_NEXT, + "Node has no next and not last of parent list\n"); + } else { + if (node->next->prev != node) + xmlDebugErr(ctxt, XML_CHECK_WRONG_NEXT, + "Node next->prev : forward link wrong\n"); + if (node->next->parent != node->parent) + xmlDebugErr(ctxt, XML_CHECK_WRONG_PARENT, + "Node next->prev : forward link wrong\n"); + } + if (node->type == XML_ELEMENT_NODE) { + xmlNsPtr ns; + + ns = node->nsDef; + while (ns != NULL) { + xmlCtxtNsCheckScope(ctxt, node, ns); + ns = ns->next; + } + if (node->ns != NULL) + xmlCtxtNsCheckScope(ctxt, node, node->ns); + } else if (node->type == XML_ATTRIBUTE_NODE) { + if (node->ns != NULL) + xmlCtxtNsCheckScope(ctxt, node, node->ns); + } + + if ((node->type != XML_ELEMENT_NODE) && + (node->type != XML_ATTRIBUTE_NODE) && + (node->type != XML_ELEMENT_DECL) && + (node->type != XML_ATTRIBUTE_DECL) && + (node->type != XML_DTD_NODE) && + (node->type != XML_HTML_DOCUMENT_NODE) && + (node->type != XML_DOCUMENT_NODE)) { + if (node->content != NULL) + xmlCtxtCheckString(ctxt, (const xmlChar *) node->content); + } + switch (node->type) { + case XML_ELEMENT_NODE: + case XML_ATTRIBUTE_NODE: + xmlCtxtCheckName(ctxt, node->name); + break; + case XML_TEXT_NODE: + if ((node->name == xmlStringText) || + (node->name == xmlStringTextNoenc)) + break; + /* some case of entity substitution can lead to this */ + if ((ctxt->dict != NULL) && + (node->name == xmlDictLookup(ctxt->dict, BAD_CAST "nbktext", + 7))) + break; + + xmlDebugErr3(ctxt, XML_CHECK_WRONG_NAME, + "Text node has wrong name '%s'", + (const char *) node->name); + break; + case XML_COMMENT_NODE: + if (node->name == xmlStringComment) + break; + xmlDebugErr3(ctxt, XML_CHECK_WRONG_NAME, + "Comment node has wrong name '%s'", + (const char *) node->name); + break; + case XML_PI_NODE: + xmlCtxtCheckName(ctxt, node->name); + break; + case XML_CDATA_SECTION_NODE: + if (node->name == NULL) + break; + xmlDebugErr3(ctxt, XML_CHECK_NAME_NOT_NULL, + "CData section has non NULL name '%s'", + (const char *) node->name); + break; + case XML_ENTITY_REF_NODE: + case XML_ENTITY_NODE: + case XML_DOCUMENT_TYPE_NODE: + case XML_DOCUMENT_FRAG_NODE: + case XML_NOTATION_NODE: + case XML_DTD_NODE: + case XML_ELEMENT_DECL: + case XML_ATTRIBUTE_DECL: + case XML_ENTITY_DECL: + case XML_NAMESPACE_DECL: + case XML_XINCLUDE_START: + case XML_XINCLUDE_END: +#ifdef LIBXML_DOCB_ENABLED + case XML_DOCB_DOCUMENT_NODE: +#endif + case XML_DOCUMENT_NODE: + case XML_HTML_DOCUMENT_NODE: + break; + } +} + +static void +xmlCtxtDumpString(xmlDebugCtxtPtr ctxt, const xmlChar * str) +{ + int i; + + if (ctxt->check) { + return; + } + /* TODO: check UTF8 content of the string */ + if (str == NULL) { + fprintf(ctxt->output, "(NULL)"); + return; + } + for (i = 0; i < 40; i++) + if (str[i] == 0) + return; + else if (IS_BLANK_CH(str[i])) + fputc(' ', ctxt->output); + else if (str[i] >= 0x80) + fprintf(ctxt->output, "#%X", str[i]); + else + fputc(str[i], ctxt->output); + fprintf(ctxt->output, "..."); +} + +static void +xmlCtxtDumpDtdNode(xmlDebugCtxtPtr ctxt, xmlDtdPtr dtd) +{ + xmlCtxtDumpSpaces(ctxt); + + if (dtd == NULL) { + if (!ctxt->check) + fprintf(ctxt->output, "DTD node is NULL\n"); + return; + } + + if (dtd->type != XML_DTD_NODE) { + xmlDebugErr(ctxt, XML_CHECK_NOT_DTD, + "Node is not a DTD"); + return; + } + if (!ctxt->check) { + if (dtd->name != NULL) + fprintf(ctxt->output, "DTD(%s)", (char *) dtd->name); + else + fprintf(ctxt->output, "DTD"); + if (dtd->ExternalID != NULL) + fprintf(ctxt->output, ", PUBLIC %s", (char *) dtd->ExternalID); + if (dtd->SystemID != NULL) + fprintf(ctxt->output, ", SYSTEM %s", (char *) dtd->SystemID); + fprintf(ctxt->output, "\n"); + } + /* + * Do a bit of checking + */ + xmlCtxtGenericNodeCheck(ctxt, (xmlNodePtr) dtd); +} + +static void +xmlCtxtDumpAttrDecl(xmlDebugCtxtPtr ctxt, xmlAttributePtr attr) +{ + xmlCtxtDumpSpaces(ctxt); + + if (attr == NULL) { + if (!ctxt->check) + fprintf(ctxt->output, "Attribute declaration is NULL\n"); + return; + } + if (attr->type != XML_ATTRIBUTE_DECL) { + xmlDebugErr(ctxt, XML_CHECK_NOT_ATTR_DECL, + "Node is not an attribute declaration"); + return; + } + if (attr->name != NULL) { + if (!ctxt->check) + fprintf(ctxt->output, "ATTRDECL(%s)", (char *) attr->name); + } else + xmlDebugErr(ctxt, XML_CHECK_NO_NAME, + "Node attribute declaration has no name"); + if (attr->elem != NULL) { + if (!ctxt->check) + fprintf(ctxt->output, " for %s", (char *) attr->elem); + } else + xmlDebugErr(ctxt, XML_CHECK_NO_ELEM, + "Node attribute declaration has no element name"); + if (!ctxt->check) { + switch (attr->atype) { + case XML_ATTRIBUTE_CDATA: + fprintf(ctxt->output, " CDATA"); + break; + case XML_ATTRIBUTE_ID: + fprintf(ctxt->output, " ID"); + break; + case XML_ATTRIBUTE_IDREF: + fprintf(ctxt->output, " IDREF"); + break; + case XML_ATTRIBUTE_IDREFS: + fprintf(ctxt->output, " IDREFS"); + break; + case XML_ATTRIBUTE_ENTITY: + fprintf(ctxt->output, " ENTITY"); + break; + case XML_ATTRIBUTE_ENTITIES: + fprintf(ctxt->output, " ENTITIES"); + break; + case XML_ATTRIBUTE_NMTOKEN: + fprintf(ctxt->output, " NMTOKEN"); + break; + case XML_ATTRIBUTE_NMTOKENS: + fprintf(ctxt->output, " NMTOKENS"); + break; + case XML_ATTRIBUTE_ENUMERATION: + fprintf(ctxt->output, " ENUMERATION"); + break; + case XML_ATTRIBUTE_NOTATION: + fprintf(ctxt->output, " NOTATION "); + break; + } + if (attr->tree != NULL) { + int indx; + xmlEnumerationPtr cur = attr->tree; + + for (indx = 0; indx < 5; indx++) { + if (indx != 0) + fprintf(ctxt->output, "|%s", (char *) cur->name); + else + fprintf(ctxt->output, " (%s", (char *) cur->name); + cur = cur->next; + if (cur == NULL) + break; + } + if (cur == NULL) + fprintf(ctxt->output, ")"); + else + fprintf(ctxt->output, "...)"); + } + switch (attr->def) { + case XML_ATTRIBUTE_NONE: + break; + case XML_ATTRIBUTE_REQUIRED: + fprintf(ctxt->output, " REQUIRED"); + break; + case XML_ATTRIBUTE_IMPLIED: + fprintf(ctxt->output, " IMPLIED"); + break; + case XML_ATTRIBUTE_FIXED: + fprintf(ctxt->output, " FIXED"); + break; + } + if (attr->defaultValue != NULL) { + fprintf(ctxt->output, "\""); + xmlCtxtDumpString(ctxt, attr->defaultValue); + fprintf(ctxt->output, "\""); + } + fprintf(ctxt->output, "\n"); + } + + /* + * Do a bit of checking + */ + xmlCtxtGenericNodeCheck(ctxt, (xmlNodePtr) attr); +} + +static void +xmlCtxtDumpElemDecl(xmlDebugCtxtPtr ctxt, xmlElementPtr elem) +{ + xmlCtxtDumpSpaces(ctxt); + + if (elem == NULL) { + if (!ctxt->check) + fprintf(ctxt->output, "Element declaration is NULL\n"); + return; + } + if (elem->type != XML_ELEMENT_DECL) { + xmlDebugErr(ctxt, XML_CHECK_NOT_ELEM_DECL, + "Node is not an element declaration"); + return; + } + if (elem->name != NULL) { + if (!ctxt->check) { + fprintf(ctxt->output, "ELEMDECL("); + xmlCtxtDumpString(ctxt, elem->name); + fprintf(ctxt->output, ")"); + } + } else + xmlDebugErr(ctxt, XML_CHECK_NO_NAME, + "Element declaration has no name"); + if (!ctxt->check) { + switch (elem->etype) { + case XML_ELEMENT_TYPE_UNDEFINED: + fprintf(ctxt->output, ", UNDEFINED"); + break; + case XML_ELEMENT_TYPE_EMPTY: + fprintf(ctxt->output, ", EMPTY"); + break; + case XML_ELEMENT_TYPE_ANY: + fprintf(ctxt->output, ", ANY"); + break; + case XML_ELEMENT_TYPE_MIXED: + fprintf(ctxt->output, ", MIXED "); + break; + case XML_ELEMENT_TYPE_ELEMENT: + fprintf(ctxt->output, ", MIXED "); + break; + } + if ((elem->type != XML_ELEMENT_NODE) && (elem->content != NULL)) { + char buf[5001]; + + buf[0] = 0; + xmlSnprintfElementContent(buf, 5000, elem->content, 1); + buf[5000] = 0; + fprintf(ctxt->output, "%s", buf); + } + fprintf(ctxt->output, "\n"); + } + + /* + * Do a bit of checking + */ + xmlCtxtGenericNodeCheck(ctxt, (xmlNodePtr) elem); +} + +static void +xmlCtxtDumpEntityDecl(xmlDebugCtxtPtr ctxt, xmlEntityPtr ent) +{ + xmlCtxtDumpSpaces(ctxt); + + if (ent == NULL) { + if (!ctxt->check) + fprintf(ctxt->output, "Entity declaration is NULL\n"); + return; + } + if (ent->type != XML_ENTITY_DECL) { + xmlDebugErr(ctxt, XML_CHECK_NOT_ENTITY_DECL, + "Node is not an entity declaration"); + return; + } + if (ent->name != NULL) { + if (!ctxt->check) { + fprintf(ctxt->output, "ENTITYDECL("); + xmlCtxtDumpString(ctxt, ent->name); + fprintf(ctxt->output, ")"); + } + } else + xmlDebugErr(ctxt, XML_CHECK_NO_NAME, + "Entity declaration has no name"); + if (!ctxt->check) { + switch (ent->etype) { + case XML_INTERNAL_GENERAL_ENTITY: + fprintf(ctxt->output, ", internal\n"); + break; + case XML_EXTERNAL_GENERAL_PARSED_ENTITY: + fprintf(ctxt->output, ", external parsed\n"); + break; + case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: + fprintf(ctxt->output, ", unparsed\n"); + break; + case XML_INTERNAL_PARAMETER_ENTITY: + fprintf(ctxt->output, ", parameter\n"); + break; + case XML_EXTERNAL_PARAMETER_ENTITY: + fprintf(ctxt->output, ", external parameter\n"); + break; + case XML_INTERNAL_PREDEFINED_ENTITY: + fprintf(ctxt->output, ", predefined\n"); + break; + } + if (ent->ExternalID) { + xmlCtxtDumpSpaces(ctxt); + fprintf(ctxt->output, " ExternalID=%s\n", + (char *) ent->ExternalID); + } + if (ent->SystemID) { + xmlCtxtDumpSpaces(ctxt); + fprintf(ctxt->output, " SystemID=%s\n", + (char *) ent->SystemID); + } + if (ent->URI != NULL) { + xmlCtxtDumpSpaces(ctxt); + fprintf(ctxt->output, " URI=%s\n", (char *) ent->URI); + } + if (ent->content) { + xmlCtxtDumpSpaces(ctxt); + fprintf(ctxt->output, " content="); + xmlCtxtDumpString(ctxt, ent->content); + fprintf(ctxt->output, "\n"); + } + } + + /* + * Do a bit of checking + */ + xmlCtxtGenericNodeCheck(ctxt, (xmlNodePtr) ent); +} + +static void +xmlCtxtDumpNamespace(xmlDebugCtxtPtr ctxt, xmlNsPtr ns) +{ + xmlCtxtDumpSpaces(ctxt); + + if (ns == NULL) { + if (!ctxt->check) + fprintf(ctxt->output, "namespace node is NULL\n"); + return; + } + if (ns->type != XML_NAMESPACE_DECL) { + xmlDebugErr(ctxt, XML_CHECK_NOT_NS_DECL, + "Node is not a namespace declaration"); + return; + } + if (ns->href == NULL) { + if (ns->prefix != NULL) + xmlDebugErr3(ctxt, XML_CHECK_NO_HREF, + "Incomplete namespace %s href=NULL\n", + (char *) ns->prefix); + else + xmlDebugErr(ctxt, XML_CHECK_NO_HREF, + "Incomplete default namespace href=NULL\n"); + } else { + if (!ctxt->check) { + if (ns->prefix != NULL) + fprintf(ctxt->output, "namespace %s href=", + (char *) ns->prefix); + else + fprintf(ctxt->output, "default namespace href="); + + xmlCtxtDumpString(ctxt, ns->href); + fprintf(ctxt->output, "\n"); + } + } +} + +static void +xmlCtxtDumpNamespaceList(xmlDebugCtxtPtr ctxt, xmlNsPtr ns) +{ + while (ns != NULL) { + xmlCtxtDumpNamespace(ctxt, ns); + ns = ns->next; + } +} + +static void +xmlCtxtDumpEntity(xmlDebugCtxtPtr ctxt, xmlEntityPtr ent) +{ + xmlCtxtDumpSpaces(ctxt); + + if (ent == NULL) { + if (!ctxt->check) + fprintf(ctxt->output, "Entity is NULL\n"); + return; + } + if (!ctxt->check) { + switch (ent->etype) { + case XML_INTERNAL_GENERAL_ENTITY: + fprintf(ctxt->output, "INTERNAL_GENERAL_ENTITY "); + break; + case XML_EXTERNAL_GENERAL_PARSED_ENTITY: + fprintf(ctxt->output, "EXTERNAL_GENERAL_PARSED_ENTITY "); + break; + case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: + fprintf(ctxt->output, "EXTERNAL_GENERAL_UNPARSED_ENTITY "); + break; + case XML_INTERNAL_PARAMETER_ENTITY: + fprintf(ctxt->output, "INTERNAL_PARAMETER_ENTITY "); + break; + case XML_EXTERNAL_PARAMETER_ENTITY: + fprintf(ctxt->output, "EXTERNAL_PARAMETER_ENTITY "); + break; + default: + fprintf(ctxt->output, "ENTITY_%d ! ", (int) ent->etype); + } + fprintf(ctxt->output, "%s\n", ent->name); + if (ent->ExternalID) { + xmlCtxtDumpSpaces(ctxt); + fprintf(ctxt->output, "ExternalID=%s\n", + (char *) ent->ExternalID); + } + if (ent->SystemID) { + xmlCtxtDumpSpaces(ctxt); + fprintf(ctxt->output, "SystemID=%s\n", (char *) ent->SystemID); + } + if (ent->URI) { + xmlCtxtDumpSpaces(ctxt); + fprintf(ctxt->output, "URI=%s\n", (char *) ent->URI); + } + if (ent->content) { + xmlCtxtDumpSpaces(ctxt); + fprintf(ctxt->output, "content="); + xmlCtxtDumpString(ctxt, ent->content); + fprintf(ctxt->output, "\n"); + } + } +} + +/** + * xmlCtxtDumpAttr: + * @output: the FILE * for the output + * @attr: the attribute + * @depth: the indentation level. + * + * Dumps debug information for the attribute + */ +static void +xmlCtxtDumpAttr(xmlDebugCtxtPtr ctxt, xmlAttrPtr attr) +{ + xmlCtxtDumpSpaces(ctxt); + + if (attr == NULL) { + if (!ctxt->check) + fprintf(ctxt->output, "Attr is NULL"); + return; + } + if (!ctxt->check) { + fprintf(ctxt->output, "ATTRIBUTE "); + xmlCtxtDumpString(ctxt, attr->name); + fprintf(ctxt->output, "\n"); + if (attr->children != NULL) { + ctxt->depth++; + xmlCtxtDumpNodeList(ctxt, attr->children); + ctxt->depth--; + } + } + if (attr->name == NULL) + xmlDebugErr(ctxt, XML_CHECK_NO_NAME, + "Attribute has no name"); + + /* + * Do a bit of checking + */ + xmlCtxtGenericNodeCheck(ctxt, (xmlNodePtr) attr); +} + +/** + * xmlCtxtDumpAttrList: + * @output: the FILE * for the output + * @attr: the attribute list + * @depth: the indentation level. + * + * Dumps debug information for the attribute list + */ +static void +xmlCtxtDumpAttrList(xmlDebugCtxtPtr ctxt, xmlAttrPtr attr) +{ + while (attr != NULL) { + xmlCtxtDumpAttr(ctxt, attr); + attr = attr->next; + } +} + +/** + * xmlCtxtDumpOneNode: + * @output: the FILE * for the output + * @node: the node + * @depth: the indentation level. + * + * Dumps debug information for the element node, it is not recursive + */ +static void +xmlCtxtDumpOneNode(xmlDebugCtxtPtr ctxt, xmlNodePtr node) +{ + if (node == NULL) { + if (!ctxt->check) { + xmlCtxtDumpSpaces(ctxt); + fprintf(ctxt->output, "node is NULL\n"); + } + return; + } + ctxt->node = node; + + switch (node->type) { + case XML_ELEMENT_NODE: + if (!ctxt->check) { + xmlCtxtDumpSpaces(ctxt); + fprintf(ctxt->output, "ELEMENT "); + if ((node->ns != NULL) && (node->ns->prefix != NULL)) { + xmlCtxtDumpString(ctxt, node->ns->prefix); + fprintf(ctxt->output, ":"); + } + xmlCtxtDumpString(ctxt, node->name); + fprintf(ctxt->output, "\n"); + } + break; + case XML_ATTRIBUTE_NODE: + if (!ctxt->check) + xmlCtxtDumpSpaces(ctxt); + fprintf(ctxt->output, "Error, ATTRIBUTE found here\n"); + xmlCtxtGenericNodeCheck(ctxt, node); + return; + case XML_TEXT_NODE: + if (!ctxt->check) { + xmlCtxtDumpSpaces(ctxt); + if (node->name == (const xmlChar *) xmlStringTextNoenc) + fprintf(ctxt->output, "TEXT no enc"); + else + fprintf(ctxt->output, "TEXT"); + if (ctxt->options & DUMP_TEXT_TYPE) { + if (node->content == (xmlChar *) &(node->properties)) + fprintf(ctxt->output, " compact\n"); + else if (xmlDictOwns(ctxt->dict, node->content) == 1) + fprintf(ctxt->output, " interned\n"); + else + fprintf(ctxt->output, "\n"); + } else + fprintf(ctxt->output, "\n"); + } + break; + case XML_CDATA_SECTION_NODE: + if (!ctxt->check) { + xmlCtxtDumpSpaces(ctxt); + fprintf(ctxt->output, "CDATA_SECTION\n"); + } + break; + case XML_ENTITY_REF_NODE: + if (!ctxt->check) { + xmlCtxtDumpSpaces(ctxt); + fprintf(ctxt->output, "ENTITY_REF(%s)\n", + (char *) node->name); + } + break; + case XML_ENTITY_NODE: + if (!ctxt->check) { + xmlCtxtDumpSpaces(ctxt); + fprintf(ctxt->output, "ENTITY\n"); + } + break; + case XML_PI_NODE: + if (!ctxt->check) { + xmlCtxtDumpSpaces(ctxt); + fprintf(ctxt->output, "PI %s\n", (char *) node->name); + } + break; + case XML_COMMENT_NODE: + if (!ctxt->check) { + xmlCtxtDumpSpaces(ctxt); + fprintf(ctxt->output, "COMMENT\n"); + } + break; + case XML_DOCUMENT_NODE: + case XML_HTML_DOCUMENT_NODE: + if (!ctxt->check) { + xmlCtxtDumpSpaces(ctxt); + } + fprintf(ctxt->output, "Error, DOCUMENT found here\n"); + xmlCtxtGenericNodeCheck(ctxt, node); + return; + case XML_DOCUMENT_TYPE_NODE: + if (!ctxt->check) { + xmlCtxtDumpSpaces(ctxt); + fprintf(ctxt->output, "DOCUMENT_TYPE\n"); + } + break; + case XML_DOCUMENT_FRAG_NODE: + if (!ctxt->check) { + xmlCtxtDumpSpaces(ctxt); + fprintf(ctxt->output, "DOCUMENT_FRAG\n"); + } + break; + case XML_NOTATION_NODE: + if (!ctxt->check) { + xmlCtxtDumpSpaces(ctxt); + fprintf(ctxt->output, "NOTATION\n"); + } + break; + case XML_DTD_NODE: + xmlCtxtDumpDtdNode(ctxt, (xmlDtdPtr) node); + return; + case XML_ELEMENT_DECL: + xmlCtxtDumpElemDecl(ctxt, (xmlElementPtr) node); + return; + case XML_ATTRIBUTE_DECL: + xmlCtxtDumpAttrDecl(ctxt, (xmlAttributePtr) node); + return; + case XML_ENTITY_DECL: + xmlCtxtDumpEntityDecl(ctxt, (xmlEntityPtr) node); + return; + case XML_NAMESPACE_DECL: + xmlCtxtDumpNamespace(ctxt, (xmlNsPtr) node); + return; + case XML_XINCLUDE_START: + if (!ctxt->check) { + xmlCtxtDumpSpaces(ctxt); + fprintf(ctxt->output, "INCLUDE START\n"); + } + return; + case XML_XINCLUDE_END: + if (!ctxt->check) { + xmlCtxtDumpSpaces(ctxt); + fprintf(ctxt->output, "INCLUDE END\n"); + } + return; + default: + if (!ctxt->check) + xmlCtxtDumpSpaces(ctxt); + xmlDebugErr2(ctxt, XML_CHECK_UNKNOWN_NODE, + "Unknown node type %d\n", node->type); + return; + } + if (node->doc == NULL) { + if (!ctxt->check) { + xmlCtxtDumpSpaces(ctxt); + } + fprintf(ctxt->output, "PBM: doc == NULL !!!\n"); + } + ctxt->depth++; + if ((node->type == XML_ELEMENT_NODE) && (node->nsDef != NULL)) + xmlCtxtDumpNamespaceList(ctxt, node->nsDef); + if ((node->type == XML_ELEMENT_NODE) && (node->properties != NULL)) + xmlCtxtDumpAttrList(ctxt, node->properties); + if (node->type != XML_ENTITY_REF_NODE) { + if ((node->type != XML_ELEMENT_NODE) && (node->content != NULL)) { + if (!ctxt->check) { + xmlCtxtDumpSpaces(ctxt); + fprintf(ctxt->output, "content="); + xmlCtxtDumpString(ctxt, node->content); + fprintf(ctxt->output, "\n"); + } + } + } else { + xmlEntityPtr ent; + + ent = xmlGetDocEntity(node->doc, node->name); + if (ent != NULL) + xmlCtxtDumpEntity(ctxt, ent); + } + ctxt->depth--; + + /* + * Do a bit of checking + */ + xmlCtxtGenericNodeCheck(ctxt, node); +} + +/** + * xmlCtxtDumpNode: + * @output: the FILE * for the output + * @node: the node + * @depth: the indentation level. + * + * Dumps debug information for the element node, it is recursive + */ +static void +xmlCtxtDumpNode(xmlDebugCtxtPtr ctxt, xmlNodePtr node) +{ + if (node == NULL) { + if (!ctxt->check) { + xmlCtxtDumpSpaces(ctxt); + fprintf(ctxt->output, "node is NULL\n"); + } + return; + } + xmlCtxtDumpOneNode(ctxt, node); + if ((node->type != XML_NAMESPACE_DECL) && + (node->children != NULL) && (node->type != XML_ENTITY_REF_NODE)) { + ctxt->depth++; + xmlCtxtDumpNodeList(ctxt, node->children); + ctxt->depth--; + } +} + +/** + * xmlCtxtDumpNodeList: + * @output: the FILE * for the output + * @node: the node list + * @depth: the indentation level. + * + * Dumps debug information for the list of element node, it is recursive + */ +static void +xmlCtxtDumpNodeList(xmlDebugCtxtPtr ctxt, xmlNodePtr node) +{ + while (node != NULL) { + xmlCtxtDumpNode(ctxt, node); + node = node->next; + } +} + +static void +xmlCtxtDumpDocHead(xmlDebugCtxtPtr ctxt, xmlDocPtr doc) +{ + if (doc == NULL) { + if (!ctxt->check) + fprintf(ctxt->output, "DOCUMENT == NULL !\n"); + return; + } + ctxt->node = (xmlNodePtr) doc; + + switch (doc->type) { + case XML_ELEMENT_NODE: + xmlDebugErr(ctxt, XML_CHECK_FOUND_ELEMENT, + "Misplaced ELEMENT node\n"); + break; + case XML_ATTRIBUTE_NODE: + xmlDebugErr(ctxt, XML_CHECK_FOUND_ATTRIBUTE, + "Misplaced ATTRIBUTE node\n"); + break; + case XML_TEXT_NODE: + xmlDebugErr(ctxt, XML_CHECK_FOUND_TEXT, + "Misplaced TEXT node\n"); + break; + case XML_CDATA_SECTION_NODE: + xmlDebugErr(ctxt, XML_CHECK_FOUND_CDATA, + "Misplaced CDATA node\n"); + break; + case XML_ENTITY_REF_NODE: + xmlDebugErr(ctxt, XML_CHECK_FOUND_ENTITYREF, + "Misplaced ENTITYREF node\n"); + break; + case XML_ENTITY_NODE: + xmlDebugErr(ctxt, XML_CHECK_FOUND_ENTITY, + "Misplaced ENTITY node\n"); + break; + case XML_PI_NODE: + xmlDebugErr(ctxt, XML_CHECK_FOUND_PI, + "Misplaced PI node\n"); + break; + case XML_COMMENT_NODE: + xmlDebugErr(ctxt, XML_CHECK_FOUND_COMMENT, + "Misplaced COMMENT node\n"); + break; + case XML_DOCUMENT_NODE: + if (!ctxt->check) + fprintf(ctxt->output, "DOCUMENT\n"); + break; + case XML_HTML_DOCUMENT_NODE: + if (!ctxt->check) + fprintf(ctxt->output, "HTML DOCUMENT\n"); + break; + case XML_DOCUMENT_TYPE_NODE: + xmlDebugErr(ctxt, XML_CHECK_FOUND_DOCTYPE, + "Misplaced DOCTYPE node\n"); + break; + case XML_DOCUMENT_FRAG_NODE: + xmlDebugErr(ctxt, XML_CHECK_FOUND_FRAGMENT, + "Misplaced FRAGMENT node\n"); + break; + case XML_NOTATION_NODE: + xmlDebugErr(ctxt, XML_CHECK_FOUND_NOTATION, + "Misplaced NOTATION node\n"); + break; + default: + xmlDebugErr2(ctxt, XML_CHECK_UNKNOWN_NODE, + "Unknown node type %d\n", doc->type); + } +} + +/** + * xmlCtxtDumpDocumentHead: + * @output: the FILE * for the output + * @doc: the document + * + * Dumps debug information cncerning the document, not recursive + */ +static void +xmlCtxtDumpDocumentHead(xmlDebugCtxtPtr ctxt, xmlDocPtr doc) +{ + if (doc == NULL) return; + xmlCtxtDumpDocHead(ctxt, doc); + if (!ctxt->check) { + if (doc->name != NULL) { + fprintf(ctxt->output, "name="); + xmlCtxtDumpString(ctxt, BAD_CAST doc->name); + fprintf(ctxt->output, "\n"); + } + if (doc->version != NULL) { + fprintf(ctxt->output, "version="); + xmlCtxtDumpString(ctxt, doc->version); + fprintf(ctxt->output, "\n"); + } + if (doc->encoding != NULL) { + fprintf(ctxt->output, "encoding="); + xmlCtxtDumpString(ctxt, doc->encoding); + fprintf(ctxt->output, "\n"); + } + if (doc->URL != NULL) { + fprintf(ctxt->output, "URL="); + xmlCtxtDumpString(ctxt, doc->URL); + fprintf(ctxt->output, "\n"); + } + if (doc->standalone) + fprintf(ctxt->output, "standalone=true\n"); + } + if (doc->oldNs != NULL) + xmlCtxtDumpNamespaceList(ctxt, doc->oldNs); +} + +/** + * xmlCtxtDumpDocument: + * @output: the FILE * for the output + * @doc: the document + * + * Dumps debug information for the document, it's recursive + */ +static void +xmlCtxtDumpDocument(xmlDebugCtxtPtr ctxt, xmlDocPtr doc) +{ + if (doc == NULL) { + if (!ctxt->check) + fprintf(ctxt->output, "DOCUMENT == NULL !\n"); + return; + } + xmlCtxtDumpDocumentHead(ctxt, doc); + if (((doc->type == XML_DOCUMENT_NODE) || + (doc->type == XML_HTML_DOCUMENT_NODE)) + && (doc->children != NULL)) { + ctxt->depth++; + xmlCtxtDumpNodeList(ctxt, doc->children); + ctxt->depth--; + } +} + +static void +xmlCtxtDumpEntityCallback(xmlEntityPtr cur, xmlDebugCtxtPtr ctxt) +{ + if (cur == NULL) { + if (!ctxt->check) + fprintf(ctxt->output, "Entity is NULL"); + return; + } + if (!ctxt->check) { + fprintf(ctxt->output, "%s : ", (char *) cur->name); + switch (cur->etype) { + case XML_INTERNAL_GENERAL_ENTITY: + fprintf(ctxt->output, "INTERNAL GENERAL, "); + break; + case XML_EXTERNAL_GENERAL_PARSED_ENTITY: + fprintf(ctxt->output, "EXTERNAL PARSED, "); + break; + case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: + fprintf(ctxt->output, "EXTERNAL UNPARSED, "); + break; + case XML_INTERNAL_PARAMETER_ENTITY: + fprintf(ctxt->output, "INTERNAL PARAMETER, "); + break; + case XML_EXTERNAL_PARAMETER_ENTITY: + fprintf(ctxt->output, "EXTERNAL PARAMETER, "); + break; + default: + xmlDebugErr2(ctxt, XML_CHECK_ENTITY_TYPE, + "Unknown entity type %d\n", cur->etype); + } + if (cur->ExternalID != NULL) + fprintf(ctxt->output, "ID \"%s\"", (char *) cur->ExternalID); + if (cur->SystemID != NULL) + fprintf(ctxt->output, "SYSTEM \"%s\"", (char *) cur->SystemID); + if (cur->orig != NULL) + fprintf(ctxt->output, "\n orig \"%s\"", (char *) cur->orig); + if ((cur->type != XML_ELEMENT_NODE) && (cur->content != NULL)) + fprintf(ctxt->output, "\n content \"%s\"", + (char *) cur->content); + fprintf(ctxt->output, "\n"); + } +} + +/** + * xmlCtxtDumpEntities: + * @output: the FILE * for the output + * @doc: the document + * + * Dumps debug information for all the entities in use by the document + */ +static void +xmlCtxtDumpEntities(xmlDebugCtxtPtr ctxt, xmlDocPtr doc) +{ + if (doc == NULL) return; + xmlCtxtDumpDocHead(ctxt, doc); + if ((doc->intSubset != NULL) && (doc->intSubset->entities != NULL)) { + xmlEntitiesTablePtr table = (xmlEntitiesTablePtr) + doc->intSubset->entities; + + if (!ctxt->check) + fprintf(ctxt->output, "Entities in internal subset\n"); + xmlHashScan(table, (xmlHashScanner) xmlCtxtDumpEntityCallback, + ctxt); + } else + fprintf(ctxt->output, "No entities in internal subset\n"); + if ((doc->extSubset != NULL) && (doc->extSubset->entities != NULL)) { + xmlEntitiesTablePtr table = (xmlEntitiesTablePtr) + doc->extSubset->entities; + + if (!ctxt->check) + fprintf(ctxt->output, "Entities in external subset\n"); + xmlHashScan(table, (xmlHashScanner) xmlCtxtDumpEntityCallback, + ctxt); + } else if (!ctxt->check) + fprintf(ctxt->output, "No entities in external subset\n"); +} + +/** + * xmlCtxtDumpDTD: + * @output: the FILE * for the output + * @dtd: the DTD + * + * Dumps debug information for the DTD + */ +static void +xmlCtxtDumpDTD(xmlDebugCtxtPtr ctxt, xmlDtdPtr dtd) +{ + if (dtd == NULL) { + if (!ctxt->check) + fprintf(ctxt->output, "DTD is NULL\n"); + return; + } + xmlCtxtDumpDtdNode(ctxt, dtd); + if (dtd->children == NULL) + fprintf(ctxt->output, " DTD is empty\n"); + else { + ctxt->depth++; + xmlCtxtDumpNodeList(ctxt, dtd->children); + ctxt->depth--; + } +} + +/************************************************************************ + * * + * Public entry points for dump * + * * + ************************************************************************/ + +/** + * xmlDebugDumpString: + * @output: the FILE * for the output + * @str: the string + * + * Dumps informations about the string, shorten it if necessary + */ +void +xmlDebugDumpString(FILE * output, const xmlChar * str) +{ + int i; + + if (output == NULL) + output = stdout; + if (str == NULL) { + fprintf(output, "(NULL)"); + return; + } + for (i = 0; i < 40; i++) + if (str[i] == 0) + return; + else if (IS_BLANK_CH(str[i])) + fputc(' ', output); + else if (str[i] >= 0x80) + fprintf(output, "#%X", str[i]); + else + fputc(str[i], output); + fprintf(output, "..."); +} + +/** + * xmlDebugDumpAttr: + * @output: the FILE * for the output + * @attr: the attribute + * @depth: the indentation level. + * + * Dumps debug information for the attribute + */ +void +xmlDebugDumpAttr(FILE *output, xmlAttrPtr attr, int depth) { + xmlDebugCtxt ctxt; + + if (output == NULL) return; + xmlCtxtDumpInitCtxt(&ctxt); + ctxt.output = output; + ctxt.depth = depth; + xmlCtxtDumpAttr(&ctxt, attr); + xmlCtxtDumpCleanCtxt(&ctxt); +} + + +/** + * xmlDebugDumpEntities: + * @output: the FILE * for the output + * @doc: the document + * + * Dumps debug information for all the entities in use by the document + */ +void +xmlDebugDumpEntities(FILE * output, xmlDocPtr doc) +{ + xmlDebugCtxt ctxt; + + if (output == NULL) return; + xmlCtxtDumpInitCtxt(&ctxt); + ctxt.output = output; + xmlCtxtDumpEntities(&ctxt, doc); + xmlCtxtDumpCleanCtxt(&ctxt); +} + +/** + * xmlDebugDumpAttrList: + * @output: the FILE * for the output + * @attr: the attribute list + * @depth: the indentation level. + * + * Dumps debug information for the attribute list + */ +void +xmlDebugDumpAttrList(FILE * output, xmlAttrPtr attr, int depth) +{ + xmlDebugCtxt ctxt; + + if (output == NULL) return; + xmlCtxtDumpInitCtxt(&ctxt); + ctxt.output = output; + ctxt.depth = depth; + xmlCtxtDumpAttrList(&ctxt, attr); + xmlCtxtDumpCleanCtxt(&ctxt); +} + +/** + * xmlDebugDumpOneNode: + * @output: the FILE * for the output + * @node: the node + * @depth: the indentation level. + * + * Dumps debug information for the element node, it is not recursive + */ +void +xmlDebugDumpOneNode(FILE * output, xmlNodePtr node, int depth) +{ + xmlDebugCtxt ctxt; + + if (output == NULL) return; + xmlCtxtDumpInitCtxt(&ctxt); + ctxt.output = output; + ctxt.depth = depth; + xmlCtxtDumpOneNode(&ctxt, node); + xmlCtxtDumpCleanCtxt(&ctxt); +} + +/** + * xmlDebugDumpNode: + * @output: the FILE * for the output + * @node: the node + * @depth: the indentation level. + * + * Dumps debug information for the element node, it is recursive + */ +void +xmlDebugDumpNode(FILE * output, xmlNodePtr node, int depth) +{ + xmlDebugCtxt ctxt; + + if (output == NULL) + output = stdout; + xmlCtxtDumpInitCtxt(&ctxt); + ctxt.output = output; + ctxt.depth = depth; + xmlCtxtDumpNode(&ctxt, node); + xmlCtxtDumpCleanCtxt(&ctxt); +} + +/** + * xmlDebugDumpNodeList: + * @output: the FILE * for the output + * @node: the node list + * @depth: the indentation level. + * + * Dumps debug information for the list of element node, it is recursive + */ +void +xmlDebugDumpNodeList(FILE * output, xmlNodePtr node, int depth) +{ + xmlDebugCtxt ctxt; + + if (output == NULL) + output = stdout; + xmlCtxtDumpInitCtxt(&ctxt); + ctxt.output = output; + ctxt.depth = depth; + xmlCtxtDumpNodeList(&ctxt, node); + xmlCtxtDumpCleanCtxt(&ctxt); +} + +/** + * xmlDebugDumpDocumentHead: + * @output: the FILE * for the output + * @doc: the document + * + * Dumps debug information cncerning the document, not recursive + */ +void +xmlDebugDumpDocumentHead(FILE * output, xmlDocPtr doc) +{ + xmlDebugCtxt ctxt; + + if (output == NULL) + output = stdout; + xmlCtxtDumpInitCtxt(&ctxt); + ctxt.options |= DUMP_TEXT_TYPE; + ctxt.output = output; + xmlCtxtDumpDocumentHead(&ctxt, doc); + xmlCtxtDumpCleanCtxt(&ctxt); +} + +/** + * xmlDebugDumpDocument: + * @output: the FILE * for the output + * @doc: the document + * + * Dumps debug information for the document, it's recursive + */ +void +xmlDebugDumpDocument(FILE * output, xmlDocPtr doc) +{ + xmlDebugCtxt ctxt; + + if (output == NULL) + output = stdout; + xmlCtxtDumpInitCtxt(&ctxt); + ctxt.options |= DUMP_TEXT_TYPE; + ctxt.output = output; + xmlCtxtDumpDocument(&ctxt, doc); + xmlCtxtDumpCleanCtxt(&ctxt); +} + +/** + * xmlDebugDumpDTD: + * @output: the FILE * for the output + * @dtd: the DTD + * + * Dumps debug information for the DTD + */ +void +xmlDebugDumpDTD(FILE * output, xmlDtdPtr dtd) +{ + xmlDebugCtxt ctxt; + + if (output == NULL) + output = stdout; + xmlCtxtDumpInitCtxt(&ctxt); + ctxt.options |= DUMP_TEXT_TYPE; + ctxt.output = output; + xmlCtxtDumpDTD(&ctxt, dtd); + xmlCtxtDumpCleanCtxt(&ctxt); +} + +/************************************************************************ + * * + * Public entry points for checkings * + * * + ************************************************************************/ + +/** + * xmlDebugCheckDocument: + * @output: the FILE * for the output + * @doc: the document + * + * Check the document for potential content problems, and output + * the errors to @output + * + * Returns the number of errors found + */ +int +xmlDebugCheckDocument(FILE * output, xmlDocPtr doc) +{ + xmlDebugCtxt ctxt; + + if (output == NULL) + output = stdout; + xmlCtxtDumpInitCtxt(&ctxt); + ctxt.output = output; + ctxt.check = 1; + xmlCtxtDumpDocument(&ctxt, doc); + xmlCtxtDumpCleanCtxt(&ctxt); + return(ctxt.errors); +} + +/************************************************************************ + * * + * Helpers for Shell * + * * + ************************************************************************/ + +/** + * xmlLsCountNode: + * @node: the node to count + * + * Count the children of @node. + * + * Returns the number of children of @node. + */ +int +xmlLsCountNode(xmlNodePtr node) { + int ret = 0; + xmlNodePtr list = NULL; + + if (node == NULL) + return(0); + + switch (node->type) { + case XML_ELEMENT_NODE: + list = node->children; + break; + case XML_DOCUMENT_NODE: + case XML_HTML_DOCUMENT_NODE: +#ifdef LIBXML_DOCB_ENABLED + case XML_DOCB_DOCUMENT_NODE: +#endif + list = ((xmlDocPtr) node)->children; + break; + case XML_ATTRIBUTE_NODE: + list = ((xmlAttrPtr) node)->children; + break; + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + case XML_PI_NODE: + case XML_COMMENT_NODE: + if (node->content != NULL) { + ret = xmlStrlen(node->content); + } + break; + case XML_ENTITY_REF_NODE: + case XML_DOCUMENT_TYPE_NODE: + case XML_ENTITY_NODE: + case XML_DOCUMENT_FRAG_NODE: + case XML_NOTATION_NODE: + case XML_DTD_NODE: + case XML_ELEMENT_DECL: + case XML_ATTRIBUTE_DECL: + case XML_ENTITY_DECL: + case XML_NAMESPACE_DECL: + case XML_XINCLUDE_START: + case XML_XINCLUDE_END: + ret = 1; + break; + } + for (;list != NULL;ret++) + list = list->next; + return(ret); +} + +/** + * xmlLsOneNode: + * @output: the FILE * for the output + * @node: the node to dump + * + * Dump to @output the type and name of @node. + */ +void +xmlLsOneNode(FILE *output, xmlNodePtr node) { + if (output == NULL) return; + if (node == NULL) { + fprintf(output, "NULL\n"); + return; + } + switch (node->type) { + case XML_ELEMENT_NODE: + fprintf(output, "-"); + break; + case XML_ATTRIBUTE_NODE: + fprintf(output, "a"); + break; + case XML_TEXT_NODE: + fprintf(output, "t"); + break; + case XML_CDATA_SECTION_NODE: + fprintf(output, "C"); + break; + case XML_ENTITY_REF_NODE: + fprintf(output, "e"); + break; + case XML_ENTITY_NODE: + fprintf(output, "E"); + break; + case XML_PI_NODE: + fprintf(output, "p"); + break; + case XML_COMMENT_NODE: + fprintf(output, "c"); + break; + case XML_DOCUMENT_NODE: + fprintf(output, "d"); + break; + case XML_HTML_DOCUMENT_NODE: + fprintf(output, "h"); + break; + case XML_DOCUMENT_TYPE_NODE: + fprintf(output, "T"); + break; + case XML_DOCUMENT_FRAG_NODE: + fprintf(output, "F"); + break; + case XML_NOTATION_NODE: + fprintf(output, "N"); + break; + case XML_NAMESPACE_DECL: + fprintf(output, "n"); + break; + default: + fprintf(output, "?"); + } + if (node->type != XML_NAMESPACE_DECL) { + if (node->properties != NULL) + fprintf(output, "a"); + else + fprintf(output, "-"); + if (node->nsDef != NULL) + fprintf(output, "n"); + else + fprintf(output, "-"); + } + + fprintf(output, " %8d ", xmlLsCountNode(node)); + + switch (node->type) { + case XML_ELEMENT_NODE: + if (node->name != NULL) { + if ((node->ns != NULL) && (node->ns->prefix != NULL)) + fprintf(output, "%s:", node->ns->prefix); + fprintf(output, "%s", (const char *) node->name); + } + break; + case XML_ATTRIBUTE_NODE: + if (node->name != NULL) + fprintf(output, "%s", (const char *) node->name); + break; + case XML_TEXT_NODE: + if (node->content != NULL) { + xmlDebugDumpString(output, node->content); + } + break; + case XML_CDATA_SECTION_NODE: + break; + case XML_ENTITY_REF_NODE: + if (node->name != NULL) + fprintf(output, "%s", (const char *) node->name); + break; + case XML_ENTITY_NODE: + if (node->name != NULL) + fprintf(output, "%s", (const char *) node->name); + break; + case XML_PI_NODE: + if (node->name != NULL) + fprintf(output, "%s", (const char *) node->name); + break; + case XML_COMMENT_NODE: + break; + case XML_DOCUMENT_NODE: + break; + case XML_HTML_DOCUMENT_NODE: + break; + case XML_DOCUMENT_TYPE_NODE: + break; + case XML_DOCUMENT_FRAG_NODE: + break; + case XML_NOTATION_NODE: + break; + case XML_NAMESPACE_DECL: { + xmlNsPtr ns = (xmlNsPtr) node; + + if (ns->prefix == NULL) + fprintf(output, "default -> %s", (char *)ns->href); + else + fprintf(output, "%s -> %s", (char *)ns->prefix, + (char *)ns->href); + break; + } + default: + if (node->name != NULL) + fprintf(output, "%s", (const char *) node->name); + } + fprintf(output, "\n"); +} + +/** + * xmlBoolToText: + * @boolval: a bool to turn into text + * + * Convenient way to turn bool into text + * + * Returns a pointer to either "True" or "False" + */ +const char * +xmlBoolToText(int boolval) +{ + if (boolval) + return("True"); + else + return("False"); +} + +#ifdef LIBXML_XPATH_ENABLED +/**************************************************************** + * * + * The XML shell related functions * + * * + ****************************************************************/ + + + +/* + * TODO: Improvement/cleanups for the XML shell + * - allow to shell out an editor on a subpart + * - cleanup function registrations (with help) and calling + * - provide registration routines + */ + +/** + * xmlShellPrintXPathError: + * @errorType: valid xpath error id + * @arg: the argument that cause xpath to fail + * + * Print the xpath error to libxml default error channel + */ +void +xmlShellPrintXPathError(int errorType, const char *arg) +{ + const char *default_arg = "Result"; + + if (!arg) + arg = default_arg; + + switch (errorType) { + case XPATH_UNDEFINED: + xmlGenericError(xmlGenericErrorContext, + "%s: no such node\n", arg); + break; + + case XPATH_BOOLEAN: + xmlGenericError(xmlGenericErrorContext, + "%s is a Boolean\n", arg); + break; + case XPATH_NUMBER: + xmlGenericError(xmlGenericErrorContext, + "%s is a number\n", arg); + break; + case XPATH_STRING: + xmlGenericError(xmlGenericErrorContext, + "%s is a string\n", arg); + break; + case XPATH_POINT: + xmlGenericError(xmlGenericErrorContext, + "%s is a point\n", arg); + break; + case XPATH_RANGE: + xmlGenericError(xmlGenericErrorContext, + "%s is a range\n", arg); + break; + case XPATH_LOCATIONSET: + xmlGenericError(xmlGenericErrorContext, + "%s is a range\n", arg); + break; + case XPATH_USERS: + xmlGenericError(xmlGenericErrorContext, + "%s is user-defined\n", arg); + break; + case XPATH_XSLT_TREE: + xmlGenericError(xmlGenericErrorContext, + "%s is an XSLT value tree\n", arg); + break; + } +#if 0 + xmlGenericError(xmlGenericErrorContext, + "Try casting the result string function (xpath builtin)\n", + arg); +#endif +} + + +#ifdef LIBXML_OUTPUT_ENABLED +/** + * xmlShellPrintNodeCtxt: + * @ctxt : a non-null shell context + * @node : a non-null node to print to the output FILE + * + * Print node to the output FILE + */ +static void +xmlShellPrintNodeCtxt(xmlShellCtxtPtr ctxt,xmlNodePtr node) +{ + FILE *fp; + + if (!node) + return; + if (ctxt == NULL) + fp = stdout; + else + fp = ctxt->output; + + if (node->type == XML_DOCUMENT_NODE) + xmlDocDump(fp, (xmlDocPtr) node); + else if (node->type == XML_ATTRIBUTE_NODE) + xmlDebugDumpAttrList(fp, (xmlAttrPtr) node, 0); + else + xmlElemDump(fp, node->doc, node); + + fprintf(fp, "\n"); +} + +/** + * xmlShellPrintNode: + * @node : a non-null node to print to the output FILE + * + * Print node to the output FILE + */ +void +xmlShellPrintNode(xmlNodePtr node) +{ + xmlShellPrintNodeCtxt(NULL, node); +} +#endif /* LIBXML_OUTPUT_ENABLED */ + +/** + * xmlShellPrintXPathResultCtxt: + * @ctxt: a valid shell context + * @list: a valid result generated by an xpath evaluation + * + * Prints result to the output FILE + */ +static void +xmlShellPrintXPathResultCtxt(xmlShellCtxtPtr ctxt,xmlXPathObjectPtr list) +{ + if (!ctxt) + return; + + if (list != NULL) { + switch (list->type) { + case XPATH_NODESET:{ +#ifdef LIBXML_OUTPUT_ENABLED + int indx; + + if (list->nodesetval) { + for (indx = 0; indx < list->nodesetval->nodeNr; + indx++) { + xmlShellPrintNodeCtxt(ctxt, + list->nodesetval->nodeTab[indx]); + } + } else { + xmlGenericError(xmlGenericErrorContext, + "Empty node set\n"); + } + break; +#else + xmlGenericError(xmlGenericErrorContext, + "Node set\n"); +#endif /* LIBXML_OUTPUT_ENABLED */ + } + case XPATH_BOOLEAN: + xmlGenericError(xmlGenericErrorContext, + "Is a Boolean:%s\n", + xmlBoolToText(list->boolval)); + break; + case XPATH_NUMBER: + xmlGenericError(xmlGenericErrorContext, + "Is a number:%0g\n", list->floatval); + break; + case XPATH_STRING: + xmlGenericError(xmlGenericErrorContext, + "Is a string:%s\n", list->stringval); + break; + + default: + xmlShellPrintXPathError(list->type, NULL); + } + } +} + +/** + * xmlShellPrintXPathResult: + * @list: a valid result generated by an xpath evaluation + * + * Prints result to the output FILE + */ +void +xmlShellPrintXPathResult(xmlXPathObjectPtr list) +{ + xmlShellPrintXPathResultCtxt(NULL, list); +} + +/** + * xmlShellList: + * @ctxt: the shell context + * @arg: unused + * @node: a node + * @node2: unused + * + * Implements the XML shell function "ls" + * Does an Unix like listing of the given node (like a directory) + * + * Returns 0 + */ +int +xmlShellList(xmlShellCtxtPtr ctxt, + char *arg ATTRIBUTE_UNUSED, xmlNodePtr node, + xmlNodePtr node2 ATTRIBUTE_UNUSED) +{ + xmlNodePtr cur; + if (!ctxt) + return (0); + if (node == NULL) { + fprintf(ctxt->output, "NULL\n"); + return (0); + } + if ((node->type == XML_DOCUMENT_NODE) || + (node->type == XML_HTML_DOCUMENT_NODE)) { + cur = ((xmlDocPtr) node)->children; + } else if (node->type == XML_NAMESPACE_DECL) { + xmlLsOneNode(ctxt->output, node); + return (0); + } else if (node->children != NULL) { + cur = node->children; + } else { + xmlLsOneNode(ctxt->output, node); + return (0); + } + while (cur != NULL) { + xmlLsOneNode(ctxt->output, cur); + cur = cur->next; + } + return (0); +} + +/** + * xmlShellBase: + * @ctxt: the shell context + * @arg: unused + * @node: a node + * @node2: unused + * + * Implements the XML shell function "base" + * dumps the current XML base of the node + * + * Returns 0 + */ +int +xmlShellBase(xmlShellCtxtPtr ctxt, + char *arg ATTRIBUTE_UNUSED, xmlNodePtr node, + xmlNodePtr node2 ATTRIBUTE_UNUSED) +{ + xmlChar *base; + if (!ctxt) + return 0; + if (node == NULL) { + fprintf(ctxt->output, "NULL\n"); + return (0); + } + + base = xmlNodeGetBase(node->doc, node); + + if (base == NULL) { + fprintf(ctxt->output, " No base found !!!\n"); + } else { + fprintf(ctxt->output, "%s\n", base); + xmlFree(base); + } + return (0); +} + +#ifdef LIBXML_TREE_ENABLED +/** + * xmlShellSetBase: + * @ctxt: the shell context + * @arg: the new base + * @node: a node + * @node2: unused + * + * Implements the XML shell function "setbase" + * change the current XML base of the node + * + * Returns 0 + */ +static int +xmlShellSetBase(xmlShellCtxtPtr ctxt ATTRIBUTE_UNUSED, + char *arg ATTRIBUTE_UNUSED, xmlNodePtr node, + xmlNodePtr node2 ATTRIBUTE_UNUSED) +{ + xmlNodeSetBase(node, (xmlChar*) arg); + return (0); +} +#endif + +#ifdef LIBXML_XPATH_ENABLED +/** + * xmlShellRegisterNamespace: + * @ctxt: the shell context + * @arg: a string in prefix=nsuri format + * @node: unused + * @node2: unused + * + * Implements the XML shell function "setns" + * register/unregister a prefix=namespace pair + * on the XPath context + * + * Returns 0 on success and a negative value otherwise. + */ +static int +xmlShellRegisterNamespace(xmlShellCtxtPtr ctxt, char *arg, + xmlNodePtr node ATTRIBUTE_UNUSED, xmlNodePtr node2 ATTRIBUTE_UNUSED) +{ + xmlChar* nsListDup; + xmlChar* prefix; + xmlChar* href; + xmlChar* next; + + nsListDup = xmlStrdup((xmlChar *) arg); + next = nsListDup; + while(next != NULL) { + /* skip spaces */ + /*while((*next) == ' ') next++;*/ + if((*next) == '\0') break; + + /* find prefix */ + prefix = next; + next = (xmlChar*)xmlStrchr(next, '='); + if(next == NULL) { + fprintf(ctxt->output, "setns: prefix=[nsuri] required\n"); + xmlFree(nsListDup); + return(-1); + } + *(next++) = '\0'; + + /* find href */ + href = next; + next = (xmlChar*)xmlStrchr(next, ' '); + if(next != NULL) { + *(next++) = '\0'; + } + + /* do register namespace */ + if(xmlXPathRegisterNs(ctxt->pctxt, prefix, href) != 0) { + fprintf(ctxt->output,"Error: unable to register NS with prefix=\"%s\" and href=\"%s\"\n", prefix, href); + xmlFree(nsListDup); + return(-1); + } + } + + xmlFree(nsListDup); + return(0); +} +/** + * xmlShellRegisterRootNamespaces: + * @ctxt: the shell context + * @arg: unused + * @node: the root element + * @node2: unused + * + * Implements the XML shell function "setrootns" + * which registers all namespaces declarations found on the root element. + * + * Returns 0 on success and a negative value otherwise. + */ +static int +xmlShellRegisterRootNamespaces(xmlShellCtxtPtr ctxt, char *arg ATTRIBUTE_UNUSED, + xmlNodePtr root, xmlNodePtr node2 ATTRIBUTE_UNUSED) +{ + xmlNsPtr ns; + + if ((root == NULL) || (root->type != XML_ELEMENT_NODE) || + (root->nsDef == NULL) || (ctxt == NULL) || (ctxt->pctxt == NULL)) + return(-1); + ns = root->nsDef; + while (ns != NULL) { + if (ns->prefix == NULL) + xmlXPathRegisterNs(ctxt->pctxt, BAD_CAST "defaultns", ns->href); + else + xmlXPathRegisterNs(ctxt->pctxt, ns->prefix, ns->href); + ns = ns->next; + } + return(0); +} +#endif + +/** + * xmlShellGrep: + * @ctxt: the shell context + * @arg: the string or regular expression to find + * @node: a node + * @node2: unused + * + * Implements the XML shell function "grep" + * dumps informations about the node (namespace, attributes, content). + * + * Returns 0 + */ +static int +xmlShellGrep(xmlShellCtxtPtr ctxt ATTRIBUTE_UNUSED, + char *arg, xmlNodePtr node, xmlNodePtr node2 ATTRIBUTE_UNUSED) +{ + if (!ctxt) + return (0); + if (node == NULL) + return (0); + if (arg == NULL) + return (0); +#ifdef LIBXML_REGEXP_ENABLED + if ((xmlStrchr((xmlChar *) arg, '?')) || + (xmlStrchr((xmlChar *) arg, '*')) || + (xmlStrchr((xmlChar *) arg, '.')) || + (xmlStrchr((xmlChar *) arg, '['))) { + } +#endif + while (node != NULL) { + if (node->type == XML_COMMENT_NODE) { + if (xmlStrstr(node->content, (xmlChar *) arg)) { + + fprintf(ctxt->output, "%s : ", xmlGetNodePath(node)); + xmlShellList(ctxt, NULL, node, NULL); + } + } else if (node->type == XML_TEXT_NODE) { + if (xmlStrstr(node->content, (xmlChar *) arg)) { + + fprintf(ctxt->output, "%s : ", xmlGetNodePath(node->parent)); + xmlShellList(ctxt, NULL, node->parent, NULL); + } + } + + /* + * Browse the full subtree, deep first + */ + + if ((node->type == XML_DOCUMENT_NODE) || + (node->type == XML_HTML_DOCUMENT_NODE)) { + node = ((xmlDocPtr) node)->children; + } else if ((node->children != NULL) + && (node->type != XML_ENTITY_REF_NODE)) { + /* deep first */ + node = node->children; + } else if (node->next != NULL) { + /* then siblings */ + node = node->next; + } else { + /* go up to parents->next if needed */ + while (node != NULL) { + if (node->parent != NULL) { + node = node->parent; + } + if (node->next != NULL) { + node = node->next; + break; + } + if (node->parent == NULL) { + node = NULL; + break; + } + } + } + } + return (0); +} + +/** + * xmlShellDir: + * @ctxt: the shell context + * @arg: unused + * @node: a node + * @node2: unused + * + * Implements the XML shell function "dir" + * dumps informations about the node (namespace, attributes, content). + * + * Returns 0 + */ +int +xmlShellDir(xmlShellCtxtPtr ctxt ATTRIBUTE_UNUSED, + char *arg ATTRIBUTE_UNUSED, xmlNodePtr node, + xmlNodePtr node2 ATTRIBUTE_UNUSED) +{ + if (!ctxt) + return (0); + if (node == NULL) { + fprintf(ctxt->output, "NULL\n"); + return (0); + } + if ((node->type == XML_DOCUMENT_NODE) || + (node->type == XML_HTML_DOCUMENT_NODE)) { + xmlDebugDumpDocumentHead(ctxt->output, (xmlDocPtr) node); + } else if (node->type == XML_ATTRIBUTE_NODE) { + xmlDebugDumpAttr(ctxt->output, (xmlAttrPtr) node, 0); + } else { + xmlDebugDumpOneNode(ctxt->output, node, 0); + } + return (0); +} + +/** + * xmlShellSetContent: + * @ctxt: the shell context + * @value: the content as a string + * @node: a node + * @node2: unused + * + * Implements the XML shell function "dir" + * dumps informations about the node (namespace, attributes, content). + * + * Returns 0 + */ +static int +xmlShellSetContent(xmlShellCtxtPtr ctxt ATTRIBUTE_UNUSED, + char *value, xmlNodePtr node, + xmlNodePtr node2 ATTRIBUTE_UNUSED) +{ + xmlNodePtr results; + xmlParserErrors ret; + + if (!ctxt) + return (0); + if (node == NULL) { + fprintf(ctxt->output, "NULL\n"); + return (0); + } + if (value == NULL) { + fprintf(ctxt->output, "NULL\n"); + return (0); + } + + ret = xmlParseInNodeContext(node, value, strlen(value), 0, &results); + if (ret == XML_ERR_OK) { + if (node->children != NULL) { + xmlFreeNodeList(node->children); + node->children = NULL; + node->last = NULL; + } + xmlAddChildList(node, results); + } else { + fprintf(ctxt->output, "failed to parse content\n"); + } + return (0); +} + +#ifdef LIBXML_SCHEMAS_ENABLED +/** + * xmlShellRNGValidate: + * @ctxt: the shell context + * @schemas: the path to the Relax-NG schemas + * @node: a node + * @node2: unused + * + * Implements the XML shell function "relaxng" + * validating the instance against a Relax-NG schemas + * + * Returns 0 + */ +static int +xmlShellRNGValidate(xmlShellCtxtPtr sctxt, char *schemas, + xmlNodePtr node ATTRIBUTE_UNUSED, + xmlNodePtr node2 ATTRIBUTE_UNUSED) +{ + xmlRelaxNGPtr relaxngschemas; + xmlRelaxNGParserCtxtPtr ctxt; + xmlRelaxNGValidCtxtPtr vctxt; + int ret; + + ctxt = xmlRelaxNGNewParserCtxt(schemas); + xmlRelaxNGSetParserErrors(ctxt, + (xmlRelaxNGValidityErrorFunc) fprintf, + (xmlRelaxNGValidityWarningFunc) fprintf, + stderr); + relaxngschemas = xmlRelaxNGParse(ctxt); + xmlRelaxNGFreeParserCtxt(ctxt); + if (relaxngschemas == NULL) { + xmlGenericError(xmlGenericErrorContext, + "Relax-NG schema %s failed to compile\n", schemas); + return(-1); + } + vctxt = xmlRelaxNGNewValidCtxt(relaxngschemas); + xmlRelaxNGSetValidErrors(vctxt, + (xmlRelaxNGValidityErrorFunc) fprintf, + (xmlRelaxNGValidityWarningFunc) fprintf, + stderr); + ret = xmlRelaxNGValidateDoc(vctxt, sctxt->doc); + if (ret == 0) { + fprintf(stderr, "%s validates\n", sctxt->filename); + } else if (ret > 0) { + fprintf(stderr, "%s fails to validate\n", sctxt->filename); + } else { + fprintf(stderr, "%s validation generated an internal error\n", + sctxt->filename); + } + xmlRelaxNGFreeValidCtxt(vctxt); + if (relaxngschemas != NULL) + xmlRelaxNGFree(relaxngschemas); + return(0); +} +#endif + +#ifdef LIBXML_OUTPUT_ENABLED +/** + * xmlShellCat: + * @ctxt: the shell context + * @arg: unused + * @node: a node + * @node2: unused + * + * Implements the XML shell function "cat" + * dumps the serialization node content (XML or HTML). + * + * Returns 0 + */ +int +xmlShellCat(xmlShellCtxtPtr ctxt, char *arg ATTRIBUTE_UNUSED, + xmlNodePtr node, xmlNodePtr node2 ATTRIBUTE_UNUSED) +{ + if (!ctxt) + return (0); + if (node == NULL) { + fprintf(ctxt->output, "NULL\n"); + return (0); + } + if (ctxt->doc->type == XML_HTML_DOCUMENT_NODE) { +#ifdef LIBXML_HTML_ENABLED + if (node->type == XML_HTML_DOCUMENT_NODE) + htmlDocDump(ctxt->output, (htmlDocPtr) node); + else + htmlNodeDumpFile(ctxt->output, ctxt->doc, node); +#else + if (node->type == XML_DOCUMENT_NODE) + xmlDocDump(ctxt->output, (xmlDocPtr) node); + else + xmlElemDump(ctxt->output, ctxt->doc, node); +#endif /* LIBXML_HTML_ENABLED */ + } else { + if (node->type == XML_DOCUMENT_NODE) + xmlDocDump(ctxt->output, (xmlDocPtr) node); + else + xmlElemDump(ctxt->output, ctxt->doc, node); + } + fprintf(ctxt->output, "\n"); + return (0); +} +#endif /* LIBXML_OUTPUT_ENABLED */ + +/** + * xmlShellLoad: + * @ctxt: the shell context + * @filename: the file name + * @node: unused + * @node2: unused + * + * Implements the XML shell function "load" + * loads a new document specified by the filename + * + * Returns 0 or -1 if loading failed + */ +int +xmlShellLoad(xmlShellCtxtPtr ctxt, char *filename, + xmlNodePtr node ATTRIBUTE_UNUSED, + xmlNodePtr node2 ATTRIBUTE_UNUSED) +{ + xmlDocPtr doc; + int html = 0; + + if ((ctxt == NULL) || (filename == NULL)) return(-1); + if (ctxt->doc != NULL) + html = (ctxt->doc->type == XML_HTML_DOCUMENT_NODE); + + if (html) { +#ifdef LIBXML_HTML_ENABLED + doc = htmlParseFile(filename, NULL); +#else + fprintf(ctxt->output, "HTML support not compiled in\n"); + doc = NULL; +#endif /* LIBXML_HTML_ENABLED */ + } else { + doc = xmlReadFile(filename,NULL,0); + } + if (doc != NULL) { + if (ctxt->loaded == 1) { + xmlFreeDoc(ctxt->doc); + } + ctxt->loaded = 1; +#ifdef LIBXML_XPATH_ENABLED + xmlXPathFreeContext(ctxt->pctxt); +#endif /* LIBXML_XPATH_ENABLED */ + xmlFree(ctxt->filename); + ctxt->doc = doc; + ctxt->node = (xmlNodePtr) doc; +#ifdef LIBXML_XPATH_ENABLED + ctxt->pctxt = xmlXPathNewContext(doc); +#endif /* LIBXML_XPATH_ENABLED */ + ctxt->filename = (char *) xmlCanonicPath((xmlChar *) filename); + } else + return (-1); + return (0); +} + +#ifdef LIBXML_OUTPUT_ENABLED +/** + * xmlShellWrite: + * @ctxt: the shell context + * @filename: the file name + * @node: a node in the tree + * @node2: unused + * + * Implements the XML shell function "write" + * Write the current node to the filename, it saves the serialization + * of the subtree under the @node specified + * + * Returns 0 or -1 in case of error + */ +int +xmlShellWrite(xmlShellCtxtPtr ctxt, char *filename, xmlNodePtr node, + xmlNodePtr node2 ATTRIBUTE_UNUSED) +{ + if (node == NULL) + return (-1); + if ((filename == NULL) || (filename[0] == 0)) { + return (-1); + } +#ifdef W_OK + if (access((char *) filename, W_OK)) { + xmlGenericError(xmlGenericErrorContext, + "Cannot write to %s\n", filename); + return (-1); + } +#endif + switch (node->type) { + case XML_DOCUMENT_NODE: + if (xmlSaveFile((char *) filename, ctxt->doc) < -1) { + xmlGenericError(xmlGenericErrorContext, + "Failed to write to %s\n", filename); + return (-1); + } + break; + case XML_HTML_DOCUMENT_NODE: +#ifdef LIBXML_HTML_ENABLED + if (htmlSaveFile((char *) filename, ctxt->doc) < 0) { + xmlGenericError(xmlGenericErrorContext, + "Failed to write to %s\n", filename); + return (-1); + } +#else + if (xmlSaveFile((char *) filename, ctxt->doc) < -1) { + xmlGenericError(xmlGenericErrorContext, + "Failed to write to %s\n", filename); + return (-1); + } +#endif /* LIBXML_HTML_ENABLED */ + break; + default:{ + FILE *f; + + f = fopen((char *) filename, "w"); + if (f == NULL) { + xmlGenericError(xmlGenericErrorContext, + "Failed to write to %s\n", filename); + return (-1); + } + xmlElemDump(f, ctxt->doc, node); + fclose(f); + } + } + return (0); +} + +/** + * xmlShellSave: + * @ctxt: the shell context + * @filename: the file name (optional) + * @node: unused + * @node2: unused + * + * Implements the XML shell function "save" + * Write the current document to the filename, or it's original name + * + * Returns 0 or -1 in case of error + */ +int +xmlShellSave(xmlShellCtxtPtr ctxt, char *filename, + xmlNodePtr node ATTRIBUTE_UNUSED, + xmlNodePtr node2 ATTRIBUTE_UNUSED) +{ + if ((ctxt == NULL) || (ctxt->doc == NULL)) + return (-1); + if ((filename == NULL) || (filename[0] == 0)) + filename = ctxt->filename; + if (filename == NULL) + return (-1); +#ifdef W_OK + if (access((char *) filename, W_OK)) { + xmlGenericError(xmlGenericErrorContext, + "Cannot save to %s\n", filename); + return (-1); + } +#endif + switch (ctxt->doc->type) { + case XML_DOCUMENT_NODE: + if (xmlSaveFile((char *) filename, ctxt->doc) < 0) { + xmlGenericError(xmlGenericErrorContext, + "Failed to save to %s\n", filename); + } + break; + case XML_HTML_DOCUMENT_NODE: +#ifdef LIBXML_HTML_ENABLED + if (htmlSaveFile((char *) filename, ctxt->doc) < 0) { + xmlGenericError(xmlGenericErrorContext, + "Failed to save to %s\n", filename); + } +#else + if (xmlSaveFile((char *) filename, ctxt->doc) < 0) { + xmlGenericError(xmlGenericErrorContext, + "Failed to save to %s\n", filename); + } +#endif /* LIBXML_HTML_ENABLED */ + break; + default: + xmlGenericError(xmlGenericErrorContext, + "To save to subparts of a document use the 'write' command\n"); + return (-1); + + } + return (0); +} +#endif /* LIBXML_OUTPUT_ENABLED */ + +#ifdef LIBXML_VALID_ENABLED +/** + * xmlShellValidate: + * @ctxt: the shell context + * @dtd: the DTD URI (optional) + * @node: unused + * @node2: unused + * + * Implements the XML shell function "validate" + * Validate the document, if a DTD path is provided, then the validation + * is done against the given DTD. + * + * Returns 0 or -1 in case of error + */ +int +xmlShellValidate(xmlShellCtxtPtr ctxt, char *dtd, + xmlNodePtr node ATTRIBUTE_UNUSED, + xmlNodePtr node2 ATTRIBUTE_UNUSED) +{ + xmlValidCtxt vctxt; + int res = -1; + + if ((ctxt == NULL) || (ctxt->doc == NULL)) return(-1); + vctxt.userData = stderr; + vctxt.error = (xmlValidityErrorFunc) fprintf; + vctxt.warning = (xmlValidityWarningFunc) fprintf; + + if ((dtd == NULL) || (dtd[0] == 0)) { + res = xmlValidateDocument(&vctxt, ctxt->doc); + } else { + xmlDtdPtr subset; + + subset = xmlParseDTD(NULL, (xmlChar *) dtd); + if (subset != NULL) { + res = xmlValidateDtd(&vctxt, ctxt->doc, subset); + + xmlFreeDtd(subset); + } + } + return (res); +} +#endif /* LIBXML_VALID_ENABLED */ + +/** + * xmlShellDu: + * @ctxt: the shell context + * @arg: unused + * @tree: a node defining a subtree + * @node2: unused + * + * Implements the XML shell function "du" + * show the structure of the subtree under node @tree + * If @tree is null, the command works on the current node. + * + * Returns 0 or -1 in case of error + */ +int +xmlShellDu(xmlShellCtxtPtr ctxt, + char *arg ATTRIBUTE_UNUSED, xmlNodePtr tree, + xmlNodePtr node2 ATTRIBUTE_UNUSED) +{ + xmlNodePtr node; + int indent = 0, i; + + if (!ctxt) + return (-1); + + if (tree == NULL) + return (-1); + node = tree; + while (node != NULL) { + if ((node->type == XML_DOCUMENT_NODE) || + (node->type == XML_HTML_DOCUMENT_NODE)) { + fprintf(ctxt->output, "/\n"); + } else if (node->type == XML_ELEMENT_NODE) { + for (i = 0; i < indent; i++) + fprintf(ctxt->output, " "); + if ((node->ns) && (node->ns->prefix)) + fprintf(ctxt->output, "%s:", node->ns->prefix); + fprintf(ctxt->output, "%s\n", node->name); + } else { + } + + /* + * Browse the full subtree, deep first + */ + + if ((node->type == XML_DOCUMENT_NODE) || + (node->type == XML_HTML_DOCUMENT_NODE)) { + node = ((xmlDocPtr) node)->children; + } else if ((node->children != NULL) + && (node->type != XML_ENTITY_REF_NODE)) { + /* deep first */ + node = node->children; + indent++; + } else if ((node != tree) && (node->next != NULL)) { + /* then siblings */ + node = node->next; + } else if (node != tree) { + /* go up to parents->next if needed */ + while (node != tree) { + if (node->parent != NULL) { + node = node->parent; + indent--; + } + if ((node != tree) && (node->next != NULL)) { + node = node->next; + break; + } + if (node->parent == NULL) { + node = NULL; + break; + } + if (node == tree) { + node = NULL; + break; + } + } + /* exit condition */ + if (node == tree) + node = NULL; + } else + node = NULL; + } + return (0); +} + +/** + * xmlShellPwd: + * @ctxt: the shell context + * @buffer: the output buffer + * @node: a node + * @node2: unused + * + * Implements the XML shell function "pwd" + * Show the full path from the root to the node, if needed building + * thumblers when similar elements exists at a given ancestor level. + * The output is compatible with XPath commands. + * + * Returns 0 or -1 in case of error + */ +int +xmlShellPwd(xmlShellCtxtPtr ctxt ATTRIBUTE_UNUSED, char *buffer, + xmlNodePtr node, xmlNodePtr node2 ATTRIBUTE_UNUSED) +{ + xmlChar *path; + + if ((node == NULL) || (buffer == NULL)) + return (-1); + + path = xmlGetNodePath(node); + if (path == NULL) + return (-1); + + /* + * This test prevents buffer overflow, because this routine + * is only called by xmlShell, in which the second argument is + * 500 chars long. + * It is a dirty hack before a cleaner solution is found. + * Documentation should mention that the second argument must + * be at least 500 chars long, and could be stripped if too long. + */ + snprintf(buffer, 499, "%s", path); + buffer[499] = '0'; + xmlFree(path); + + return (0); +} + +/** + * xmlShell: + * @doc: the initial document + * @filename: the output buffer + * @input: the line reading function + * @output: the output FILE*, defaults to stdout if NULL + * + * Implements the XML shell + * This allow to load, validate, view, modify and save a document + * using a environment similar to a UNIX commandline. + */ +void +xmlShell(xmlDocPtr doc, char *filename, xmlShellReadlineFunc input, + FILE * output) +{ + char prompt[500] = "/ > "; + char *cmdline = NULL, *cur; + char command[100]; + char arg[400]; + int i; + xmlShellCtxtPtr ctxt; + xmlXPathObjectPtr list; + + if (doc == NULL) + return; + if (filename == NULL) + return; + if (input == NULL) + return; + if (output == NULL) + output = stdout; + ctxt = (xmlShellCtxtPtr) xmlMalloc(sizeof(xmlShellCtxt)); + if (ctxt == NULL) + return; + ctxt->loaded = 0; + ctxt->doc = doc; + ctxt->input = input; + ctxt->output = output; + ctxt->filename = (char *) xmlStrdup((xmlChar *) filename); + ctxt->node = (xmlNodePtr) ctxt->doc; + +#ifdef LIBXML_XPATH_ENABLED + ctxt->pctxt = xmlXPathNewContext(ctxt->doc); + if (ctxt->pctxt == NULL) { + xmlFree(ctxt); + return; + } +#endif /* LIBXML_XPATH_ENABLED */ + while (1) { + if (ctxt->node == (xmlNodePtr) ctxt->doc) + snprintf(prompt, sizeof(prompt), "%s > ", "/"); + else if ((ctxt->node != NULL) && (ctxt->node->name) && + (ctxt->node->ns) && (ctxt->node->ns->prefix)) + snprintf(prompt, sizeof(prompt), "%s:%s > ", + (ctxt->node->ns->prefix), ctxt->node->name); + else if ((ctxt->node != NULL) && (ctxt->node->name)) + snprintf(prompt, sizeof(prompt), "%s > ", ctxt->node->name); + else + snprintf(prompt, sizeof(prompt), "? > "); + prompt[sizeof(prompt) - 1] = 0; + + /* + * Get a new command line + */ + cmdline = ctxt->input(prompt); + if (cmdline == NULL) + break; + + /* + * Parse the command itself + */ + cur = cmdline; + while ((*cur == ' ') || (*cur == '\t')) + cur++; + i = 0; + while ((*cur != ' ') && (*cur != '\t') && + (*cur != '\n') && (*cur != '\r')) { + if (*cur == 0) + break; + command[i++] = *cur++; + } + command[i] = 0; + if (i == 0) + continue; + + /* + * Parse the argument + */ + while ((*cur == ' ') || (*cur == '\t')) + cur++; + i = 0; + while ((*cur != '\n') && (*cur != '\r') && (*cur != 0)) { + if (*cur == 0) + break; + arg[i++] = *cur++; + } + arg[i] = 0; + + /* + * start interpreting the command + */ + if (!strcmp(command, "exit")) + break; + if (!strcmp(command, "quit")) + break; + if (!strcmp(command, "bye")) + break; + if (!strcmp(command, "help")) { + fprintf(ctxt->output, "\tbase display XML base of the node\n"); + fprintf(ctxt->output, "\tsetbase URI change the XML base of the node\n"); + fprintf(ctxt->output, "\tbye leave shell\n"); + fprintf(ctxt->output, "\tcat [node] display node or current node\n"); + fprintf(ctxt->output, "\tcd [path] change directory to path or to root\n"); + fprintf(ctxt->output, "\tdir [path] dumps informations about the node (namespace, attributes, content)\n"); + fprintf(ctxt->output, "\tdu [path] show the structure of the subtree under path or the current node\n"); + fprintf(ctxt->output, "\texit leave shell\n"); + fprintf(ctxt->output, "\thelp display this help\n"); + fprintf(ctxt->output, "\tfree display memory usage\n"); + fprintf(ctxt->output, "\tload [name] load a new document with name\n"); + fprintf(ctxt->output, "\tls [path] list contents of path or the current directory\n"); + fprintf(ctxt->output, "\tset xml_fragment replace the current node content with the fragment parsed in context\n"); +#ifdef LIBXML_XPATH_ENABLED + fprintf(ctxt->output, "\txpath expr evaluate the XPath expression in that context and print the result\n"); + fprintf(ctxt->output, "\tsetns nsreg register a namespace to a prefix in the XPath evaluation context\n"); + fprintf(ctxt->output, "\t format for nsreg is: prefix=[nsuri] (i.e. prefix= unsets a prefix)\n"); + fprintf(ctxt->output, "\tsetrootns register all namespace found on the root element\n"); + fprintf(ctxt->output, "\t the default namespace if any uses 'defaultns' prefix\n"); +#endif /* LIBXML_XPATH_ENABLED */ + fprintf(ctxt->output, "\tpwd display current working directory\n"); + fprintf(ctxt->output, "\twhereis display absolute path of [path] or current working directory\n"); + fprintf(ctxt->output, "\tquit leave shell\n"); +#ifdef LIBXML_OUTPUT_ENABLED + fprintf(ctxt->output, "\tsave [name] save this document to name or the original name\n"); + fprintf(ctxt->output, "\twrite [name] write the current node to the filename\n"); +#endif /* LIBXML_OUTPUT_ENABLED */ +#ifdef LIBXML_VALID_ENABLED + fprintf(ctxt->output, "\tvalidate check the document for errors\n"); +#endif /* LIBXML_VALID_ENABLED */ +#ifdef LIBXML_SCHEMAS_ENABLED + fprintf(ctxt->output, "\trelaxng rng validate the document agaisnt the Relax-NG schemas\n"); +#endif + fprintf(ctxt->output, "\tgrep string search for a string in the subtree\n"); +#ifdef LIBXML_VALID_ENABLED + } else if (!strcmp(command, "validate")) { + xmlShellValidate(ctxt, arg, NULL, NULL); +#endif /* LIBXML_VALID_ENABLED */ + } else if (!strcmp(command, "load")) { + xmlShellLoad(ctxt, arg, NULL, NULL); +#ifdef LIBXML_SCHEMAS_ENABLED + } else if (!strcmp(command, "relaxng")) { + xmlShellRNGValidate(ctxt, arg, NULL, NULL); +#endif +#ifdef LIBXML_OUTPUT_ENABLED + } else if (!strcmp(command, "save")) { + xmlShellSave(ctxt, arg, NULL, NULL); + } else if (!strcmp(command, "write")) { + if ((arg == NULL) || (arg[0] == 0)) + xmlGenericError(xmlGenericErrorContext, + "Write command requires a filename argument\n"); + else + xmlShellWrite(ctxt, arg, ctxt->node, NULL); +#endif /* LIBXML_OUTPUT_ENABLED */ + } else if (!strcmp(command, "grep")) { + xmlShellGrep(ctxt, arg, ctxt->node, NULL); + } else if (!strcmp(command, "free")) { + if (arg[0] == 0) { + xmlMemShow(ctxt->output, 0); + } else { + int len = 0; + + sscanf(arg, "%d", &len); + xmlMemShow(ctxt->output, len); + } + } else if (!strcmp(command, "pwd")) { + char dir[500]; + + if (!xmlShellPwd(ctxt, dir, ctxt->node, NULL)) + fprintf(ctxt->output, "%s\n", dir); + } else if (!strcmp(command, "du")) { + if (arg[0] == 0) { + xmlShellDu(ctxt, NULL, ctxt->node, NULL); + } else { + ctxt->pctxt->node = ctxt->node; +#ifdef LIBXML_XPATH_ENABLED + ctxt->pctxt->node = ctxt->node; + list = xmlXPathEval((xmlChar *) arg, ctxt->pctxt); +#else + list = NULL; +#endif /* LIBXML_XPATH_ENABLED */ + if (list != NULL) { + switch (list->type) { + case XPATH_UNDEFINED: + xmlGenericError(xmlGenericErrorContext, + "%s: no such node\n", arg); + break; + case XPATH_NODESET:{ + int indx; + + if (list->nodesetval == NULL) + break; + + for (indx = 0; + indx < list->nodesetval->nodeNr; + indx++) + xmlShellDu(ctxt, NULL, + list->nodesetval-> + nodeTab[indx], NULL); + break; + } + case XPATH_BOOLEAN: + xmlGenericError(xmlGenericErrorContext, + "%s is a Boolean\n", arg); + break; + case XPATH_NUMBER: + xmlGenericError(xmlGenericErrorContext, + "%s is a number\n", arg); + break; + case XPATH_STRING: + xmlGenericError(xmlGenericErrorContext, + "%s is a string\n", arg); + break; + case XPATH_POINT: + xmlGenericError(xmlGenericErrorContext, + "%s is a point\n", arg); + break; + case XPATH_RANGE: + xmlGenericError(xmlGenericErrorContext, + "%s is a range\n", arg); + break; + case XPATH_LOCATIONSET: + xmlGenericError(xmlGenericErrorContext, + "%s is a range\n", arg); + break; + case XPATH_USERS: + xmlGenericError(xmlGenericErrorContext, + "%s is user-defined\n", arg); + break; + case XPATH_XSLT_TREE: + xmlGenericError(xmlGenericErrorContext, + "%s is an XSLT value tree\n", + arg); + break; + } +#ifdef LIBXML_XPATH_ENABLED + xmlXPathFreeObject(list); +#endif + } else { + xmlGenericError(xmlGenericErrorContext, + "%s: no such node\n", arg); + } + ctxt->pctxt->node = NULL; + } + } else if (!strcmp(command, "base")) { + xmlShellBase(ctxt, NULL, ctxt->node, NULL); + } else if (!strcmp(command, "set")) { + xmlShellSetContent(ctxt, arg, ctxt->node, NULL); +#ifdef LIBXML_XPATH_ENABLED + } else if (!strcmp(command, "setns")) { + if (arg[0] == 0) { + xmlGenericError(xmlGenericErrorContext, + "setns: prefix=[nsuri] required\n"); + } else { + xmlShellRegisterNamespace(ctxt, arg, NULL, NULL); + } + } else if (!strcmp(command, "setrootns")) { + xmlNodePtr root; + + root = xmlDocGetRootElement(ctxt->doc); + xmlShellRegisterRootNamespaces(ctxt, NULL, root, NULL); + } else if (!strcmp(command, "xpath")) { + if (arg[0] == 0) { + xmlGenericError(xmlGenericErrorContext, + "xpath: expression required\n"); + } else { + ctxt->pctxt->node = ctxt->node; + list = xmlXPathEval((xmlChar *) arg, ctxt->pctxt); + xmlXPathDebugDumpObject(ctxt->output, list, 0); + xmlXPathFreeObject(list); + } +#endif /* LIBXML_XPATH_ENABLED */ +#ifdef LIBXML_TREE_ENABLED + } else if (!strcmp(command, "setbase")) { + xmlShellSetBase(ctxt, arg, ctxt->node, NULL); +#endif + } else if ((!strcmp(command, "ls")) || (!strcmp(command, "dir"))) { + int dir = (!strcmp(command, "dir")); + + if (arg[0] == 0) { + if (dir) + xmlShellDir(ctxt, NULL, ctxt->node, NULL); + else + xmlShellList(ctxt, NULL, ctxt->node, NULL); + } else { + ctxt->pctxt->node = ctxt->node; +#ifdef LIBXML_XPATH_ENABLED + ctxt->pctxt->node = ctxt->node; + list = xmlXPathEval((xmlChar *) arg, ctxt->pctxt); +#else + list = NULL; +#endif /* LIBXML_XPATH_ENABLED */ + if (list != NULL) { + switch (list->type) { + case XPATH_UNDEFINED: + xmlGenericError(xmlGenericErrorContext, + "%s: no such node\n", arg); + break; + case XPATH_NODESET:{ + int indx; + + if (list->nodesetval == NULL) + break; + + for (indx = 0; + indx < list->nodesetval->nodeNr; + indx++) { + if (dir) + xmlShellDir(ctxt, NULL, + list->nodesetval-> + nodeTab[indx], NULL); + else + xmlShellList(ctxt, NULL, + list->nodesetval-> + nodeTab[indx], NULL); + } + break; + } + case XPATH_BOOLEAN: + xmlGenericError(xmlGenericErrorContext, + "%s is a Boolean\n", arg); + break; + case XPATH_NUMBER: + xmlGenericError(xmlGenericErrorContext, + "%s is a number\n", arg); + break; + case XPATH_STRING: + xmlGenericError(xmlGenericErrorContext, + "%s is a string\n", arg); + break; + case XPATH_POINT: + xmlGenericError(xmlGenericErrorContext, + "%s is a point\n", arg); + break; + case XPATH_RANGE: + xmlGenericError(xmlGenericErrorContext, + "%s is a range\n", arg); + break; + case XPATH_LOCATIONSET: + xmlGenericError(xmlGenericErrorContext, + "%s is a range\n", arg); + break; + case XPATH_USERS: + xmlGenericError(xmlGenericErrorContext, + "%s is user-defined\n", arg); + break; + case XPATH_XSLT_TREE: + xmlGenericError(xmlGenericErrorContext, + "%s is an XSLT value tree\n", + arg); + break; + } +#ifdef LIBXML_XPATH_ENABLED + xmlXPathFreeObject(list); +#endif + } else { + xmlGenericError(xmlGenericErrorContext, + "%s: no such node\n", arg); + } + ctxt->pctxt->node = NULL; + } + } else if (!strcmp(command, "whereis")) { + char dir[500]; + + if (arg[0] == 0) { + if (!xmlShellPwd(ctxt, dir, ctxt->node, NULL)) + fprintf(ctxt->output, "%s\n", dir); + } else { + ctxt->pctxt->node = ctxt->node; +#ifdef LIBXML_XPATH_ENABLED + list = xmlXPathEval((xmlChar *) arg, ctxt->pctxt); +#else + list = NULL; +#endif /* LIBXML_XPATH_ENABLED */ + if (list != NULL) { + switch (list->type) { + case XPATH_UNDEFINED: + xmlGenericError(xmlGenericErrorContext, + "%s: no such node\n", arg); + break; + case XPATH_NODESET:{ + int indx; + + if (list->nodesetval == NULL) + break; + + for (indx = 0; + indx < list->nodesetval->nodeNr; + indx++) { + if (!xmlShellPwd(ctxt, dir, list->nodesetval-> + nodeTab[indx], NULL)) + fprintf(ctxt->output, "%s\n", dir); + } + break; + } + case XPATH_BOOLEAN: + xmlGenericError(xmlGenericErrorContext, + "%s is a Boolean\n", arg); + break; + case XPATH_NUMBER: + xmlGenericError(xmlGenericErrorContext, + "%s is a number\n", arg); + break; + case XPATH_STRING: + xmlGenericError(xmlGenericErrorContext, + "%s is a string\n", arg); + break; + case XPATH_POINT: + xmlGenericError(xmlGenericErrorContext, + "%s is a point\n", arg); + break; + case XPATH_RANGE: + xmlGenericError(xmlGenericErrorContext, + "%s is a range\n", arg); + break; + case XPATH_LOCATIONSET: + xmlGenericError(xmlGenericErrorContext, + "%s is a range\n", arg); + break; + case XPATH_USERS: + xmlGenericError(xmlGenericErrorContext, + "%s is user-defined\n", arg); + break; + case XPATH_XSLT_TREE: + xmlGenericError(xmlGenericErrorContext, + "%s is an XSLT value tree\n", + arg); + break; + } +#ifdef LIBXML_XPATH_ENABLED + xmlXPathFreeObject(list); +#endif + } else { + xmlGenericError(xmlGenericErrorContext, + "%s: no such node\n", arg); + } + ctxt->pctxt->node = NULL; + } + } else if (!strcmp(command, "cd")) { + if (arg[0] == 0) { + ctxt->node = (xmlNodePtr) ctxt->doc; + } else { +#ifdef LIBXML_XPATH_ENABLED + ctxt->pctxt->node = ctxt->node; + list = xmlXPathEval((xmlChar *) arg, ctxt->pctxt); +#else + list = NULL; +#endif /* LIBXML_XPATH_ENABLED */ + if (list != NULL) { + switch (list->type) { + case XPATH_UNDEFINED: + xmlGenericError(xmlGenericErrorContext, + "%s: no such node\n", arg); + break; + case XPATH_NODESET: + if (list->nodesetval != NULL) { + if (list->nodesetval->nodeNr == 1) { + ctxt->node = list->nodesetval->nodeTab[0]; + if ((ctxt->node != NULL) && + (ctxt->node->type == + XML_NAMESPACE_DECL)) { + xmlGenericError(xmlGenericErrorContext, + "cannot cd to namespace\n"); + ctxt->node = NULL; + } + } else + xmlGenericError(xmlGenericErrorContext, + "%s is a %d Node Set\n", + arg, + list->nodesetval->nodeNr); + } else + xmlGenericError(xmlGenericErrorContext, + "%s is an empty Node Set\n", + arg); + break; + case XPATH_BOOLEAN: + xmlGenericError(xmlGenericErrorContext, + "%s is a Boolean\n", arg); + break; + case XPATH_NUMBER: + xmlGenericError(xmlGenericErrorContext, + "%s is a number\n", arg); + break; + case XPATH_STRING: + xmlGenericError(xmlGenericErrorContext, + "%s is a string\n", arg); + break; + case XPATH_POINT: + xmlGenericError(xmlGenericErrorContext, + "%s is a point\n", arg); + break; + case XPATH_RANGE: + xmlGenericError(xmlGenericErrorContext, + "%s is a range\n", arg); + break; + case XPATH_LOCATIONSET: + xmlGenericError(xmlGenericErrorContext, + "%s is a range\n", arg); + break; + case XPATH_USERS: + xmlGenericError(xmlGenericErrorContext, + "%s is user-defined\n", arg); + break; + case XPATH_XSLT_TREE: + xmlGenericError(xmlGenericErrorContext, + "%s is an XSLT value tree\n", + arg); + break; + } +#ifdef LIBXML_XPATH_ENABLED + xmlXPathFreeObject(list); +#endif + } else { + xmlGenericError(xmlGenericErrorContext, + "%s: no such node\n", arg); + } + ctxt->pctxt->node = NULL; + } +#ifdef LIBXML_OUTPUT_ENABLED + } else if (!strcmp(command, "cat")) { + if (arg[0] == 0) { + xmlShellCat(ctxt, NULL, ctxt->node, NULL); + } else { + ctxt->pctxt->node = ctxt->node; +#ifdef LIBXML_XPATH_ENABLED + ctxt->pctxt->node = ctxt->node; + list = xmlXPathEval((xmlChar *) arg, ctxt->pctxt); +#else + list = NULL; +#endif /* LIBXML_XPATH_ENABLED */ + if (list != NULL) { + switch (list->type) { + case XPATH_UNDEFINED: + xmlGenericError(xmlGenericErrorContext, + "%s: no such node\n", arg); + break; + case XPATH_NODESET:{ + int indx; + + if (list->nodesetval == NULL) + break; + + for (indx = 0; + indx < list->nodesetval->nodeNr; + indx++) { + if (i > 0) + fprintf(ctxt->output, " -------\n"); + xmlShellCat(ctxt, NULL, + list->nodesetval-> + nodeTab[indx], NULL); + } + break; + } + case XPATH_BOOLEAN: + xmlGenericError(xmlGenericErrorContext, + "%s is a Boolean\n", arg); + break; + case XPATH_NUMBER: + xmlGenericError(xmlGenericErrorContext, + "%s is a number\n", arg); + break; + case XPATH_STRING: + xmlGenericError(xmlGenericErrorContext, + "%s is a string\n", arg); + break; + case XPATH_POINT: + xmlGenericError(xmlGenericErrorContext, + "%s is a point\n", arg); + break; + case XPATH_RANGE: + xmlGenericError(xmlGenericErrorContext, + "%s is a range\n", arg); + break; + case XPATH_LOCATIONSET: + xmlGenericError(xmlGenericErrorContext, + "%s is a range\n", arg); + break; + case XPATH_USERS: + xmlGenericError(xmlGenericErrorContext, + "%s is user-defined\n", arg); + break; + case XPATH_XSLT_TREE: + xmlGenericError(xmlGenericErrorContext, + "%s is an XSLT value tree\n", + arg); + break; + } +#ifdef LIBXML_XPATH_ENABLED + xmlXPathFreeObject(list); +#endif + } else { + xmlGenericError(xmlGenericErrorContext, + "%s: no such node\n", arg); + } + ctxt->pctxt->node = NULL; + } +#endif /* LIBXML_OUTPUT_ENABLED */ + } else { + xmlGenericError(xmlGenericErrorContext, + "Unknown command %s\n", command); + } + free(cmdline); /* not xmlFree here ! */ + cmdline = NULL; + } +#ifdef LIBXML_XPATH_ENABLED + xmlXPathFreeContext(ctxt->pctxt); +#endif /* LIBXML_XPATH_ENABLED */ + if (ctxt->loaded) { + xmlFreeDoc(ctxt->doc); + } + if (ctxt->filename != NULL) + xmlFree(ctxt->filename); + xmlFree(ctxt); + if (cmdline != NULL) + free(cmdline); /* not xmlFree here ! */ +} + +#endif /* LIBXML_XPATH_ENABLED */ +#define bottom_debugXML +#include "elfgcchack.h" +#endif /* LIBXML_DEBUG_ENABLED */ diff --git a/vendors/libxml/src/dict.c b/vendors/libxml/src/dict.c new file mode 100644 index 0000000..5f71d55 --- /dev/null +++ b/vendors/libxml/src/dict.c @@ -0,0 +1,1259 @@ +/* + * dict.c: dictionary of reusable strings, just used to avoid allocation + * and freeing operations. + * + * Copyright (C) 2003-2012 Daniel Veillard. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF + * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND + * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. + * + * Author: daniel@veillard.com + */ + +#define IN_LIBXML +#include "libxml.h" + +#include +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_TIME_H +#include +#endif + +/* + * Following http://www.ocert.org/advisories/ocert-2011-003.html + * it seems that having hash randomization might be a good idea + * when using XML with untrusted data + * Note1: that it works correctly only if compiled with WITH_BIG_KEY + * which is the default. + * Note2: the fast function used for a small dict won't protect very + * well but since the attack is based on growing a very big hash + * list we will use the BigKey algo as soon as the hash size grows + * over MIN_DICT_SIZE so this actually works + */ +#if defined(HAVE_RAND) && defined(HAVE_SRAND) && defined(HAVE_TIME) +#define DICT_RANDOMIZATION +#endif + +#include +#ifdef HAVE_STDINT_H +#include +#else +#ifdef HAVE_INTTYPES_H +#include +#elif defined(WIN32) +typedef unsigned __int32 uint32_t; +#endif +#endif +#include +#include +#include +#include +#include + +/* #define DEBUG_GROW */ +/* #define DICT_DEBUG_PATTERNS */ + +#define MAX_HASH_LEN 3 +#define MIN_DICT_SIZE 128 +#define MAX_DICT_HASH 8 * 2048 +#define WITH_BIG_KEY + +#ifdef WITH_BIG_KEY +#define xmlDictComputeKey(dict, name, len) \ + (((dict)->size == MIN_DICT_SIZE) ? \ + xmlDictComputeFastKey(name, len, (dict)->seed) : \ + xmlDictComputeBigKey(name, len, (dict)->seed)) + +#define xmlDictComputeQKey(dict, prefix, plen, name, len) \ + (((prefix) == NULL) ? \ + (xmlDictComputeKey(dict, name, len)) : \ + (((dict)->size == MIN_DICT_SIZE) ? \ + xmlDictComputeFastQKey(prefix, plen, name, len, (dict)->seed) : \ + xmlDictComputeBigQKey(prefix, plen, name, len, (dict)->seed))) + +#else /* !WITH_BIG_KEY */ +#define xmlDictComputeKey(dict, name, len) \ + xmlDictComputeFastKey(name, len, (dict)->seed) +#define xmlDictComputeQKey(dict, prefix, plen, name, len) \ + xmlDictComputeFastQKey(prefix, plen, name, len, (dict)->seed) +#endif /* WITH_BIG_KEY */ + +/* + * An entry in the dictionnary + */ +typedef struct _xmlDictEntry xmlDictEntry; +typedef xmlDictEntry *xmlDictEntryPtr; +struct _xmlDictEntry { + struct _xmlDictEntry *next; + const xmlChar *name; + unsigned int len; + int valid; + unsigned long okey; +}; + +typedef struct _xmlDictStrings xmlDictStrings; +typedef xmlDictStrings *xmlDictStringsPtr; +struct _xmlDictStrings { + xmlDictStringsPtr next; + xmlChar *free; + xmlChar *end; + size_t size; + size_t nbStrings; + xmlChar array[1]; +}; +/* + * The entire dictionnary + */ +struct _xmlDict { + int ref_counter; + + struct _xmlDictEntry *dict; + size_t size; + unsigned int nbElems; + xmlDictStringsPtr strings; + + struct _xmlDict *subdict; + /* used for randomization */ + int seed; + /* used to impose a limit on size */ + size_t limit; +}; + +/* + * A mutex for modifying the reference counter for shared + * dictionaries. + */ +static xmlRMutexPtr xmlDictMutex = NULL; + +/* + * Whether the dictionary mutex was initialized. + */ +static int xmlDictInitialized = 0; + +#ifdef DICT_RANDOMIZATION +#ifdef HAVE_RAND_R +/* + * Internal data for random function, protected by xmlDictMutex + */ +static unsigned int rand_seed = 0; +#endif +#endif + +/** + * xmlInitializeDict: + * + * Do the dictionary mutex initialization. + * this function is deprecated + * + * Returns 0 if initialization was already done, and 1 if that + * call led to the initialization + */ +int xmlInitializeDict(void) { + return(0); +} + +/** + * __xmlInitializeDict: + * + * This function is not public + * Do the dictionary mutex initialization. + * this function is not thread safe, initialization should + * normally be done once at setup when called from xmlOnceInit() + * we may also land in this code if thread support is not compiled in + * + * Returns 0 if initialization was already done, and 1 if that + * call led to the initialization + */ +int __xmlInitializeDict(void) { + if (xmlDictInitialized) + return(1); + + if ((xmlDictMutex = xmlNewRMutex()) == NULL) + return(0); + xmlRMutexLock(xmlDictMutex); + +#ifdef DICT_RANDOMIZATION +#ifdef HAVE_RAND_R + rand_seed = time(NULL); + rand_r(& rand_seed); +#else + srand(time(NULL)); +#endif +#endif + xmlDictInitialized = 1; + xmlRMutexUnlock(xmlDictMutex); + return(1); +} + +#ifdef DICT_RANDOMIZATION +int __xmlRandom(void) { + int ret; + + if (xmlDictInitialized == 0) + __xmlInitializeDict(); + + xmlRMutexLock(xmlDictMutex); +#ifdef HAVE_RAND_R + ret = rand_r(& rand_seed); +#else + ret = rand(); +#endif + xmlRMutexUnlock(xmlDictMutex); + return(ret); +} +#endif + +/** + * xmlDictCleanup: + * + * Free the dictionary mutex. Do not call unless sure the library + * is not in use anymore ! + */ +void +xmlDictCleanup(void) { + if (!xmlDictInitialized) + return; + + xmlFreeRMutex(xmlDictMutex); + + xmlDictInitialized = 0; +} + +/* + * xmlDictAddString: + * @dict: the dictionnary + * @name: the name of the userdata + * @len: the length of the name + * + * Add the string to the array[s] + * + * Returns the pointer of the local string, or NULL in case of error. + */ +static const xmlChar * +xmlDictAddString(xmlDictPtr dict, const xmlChar *name, unsigned int namelen) { + xmlDictStringsPtr pool; + const xmlChar *ret; + size_t size = 0; /* + sizeof(_xmlDictStrings) == 1024 */ + size_t limit = 0; + +#ifdef DICT_DEBUG_PATTERNS + fprintf(stderr, "-"); +#endif + pool = dict->strings; + while (pool != NULL) { + if (pool->end - pool->free > namelen) + goto found_pool; + if (pool->size > size) size = pool->size; + limit += pool->size; + pool = pool->next; + } + /* + * Not found, need to allocate + */ + if (pool == NULL) { + if ((dict->limit > 0) && (limit > dict->limit)) { + return(NULL); + } + + if (size == 0) size = 1000; + else size *= 4; /* exponential growth */ + if (size < 4 * namelen) + size = 4 * namelen; /* just in case ! */ + pool = (xmlDictStringsPtr) xmlMalloc(sizeof(xmlDictStrings) + size); + if (pool == NULL) + return(NULL); + pool->size = size; + pool->nbStrings = 0; + pool->free = &pool->array[0]; + pool->end = &pool->array[size]; + pool->next = dict->strings; + dict->strings = pool; +#ifdef DICT_DEBUG_PATTERNS + fprintf(stderr, "+"); +#endif + } +found_pool: + ret = pool->free; + memcpy(pool->free, name, namelen); + pool->free += namelen; + *(pool->free++) = 0; + pool->nbStrings++; + return(ret); +} + +/* + * xmlDictAddQString: + * @dict: the dictionnary + * @prefix: the prefix of the userdata + * @plen: the prefix length + * @name: the name of the userdata + * @len: the length of the name + * + * Add the QName to the array[s] + * + * Returns the pointer of the local string, or NULL in case of error. + */ +static const xmlChar * +xmlDictAddQString(xmlDictPtr dict, const xmlChar *prefix, unsigned int plen, + const xmlChar *name, unsigned int namelen) +{ + xmlDictStringsPtr pool; + const xmlChar *ret; + size_t size = 0; /* + sizeof(_xmlDictStrings) == 1024 */ + size_t limit = 0; + + if (prefix == NULL) return(xmlDictAddString(dict, name, namelen)); + +#ifdef DICT_DEBUG_PATTERNS + fprintf(stderr, "="); +#endif + pool = dict->strings; + while (pool != NULL) { + if (pool->end - pool->free > namelen + plen + 1) + goto found_pool; + if (pool->size > size) size = pool->size; + limit += pool->size; + pool = pool->next; + } + /* + * Not found, need to allocate + */ + if (pool == NULL) { + if ((dict->limit > 0) && (limit > dict->limit)) { + return(NULL); + } + + if (size == 0) size = 1000; + else size *= 4; /* exponential growth */ + if (size < 4 * (namelen + plen + 1)) + size = 4 * (namelen + plen + 1); /* just in case ! */ + pool = (xmlDictStringsPtr) xmlMalloc(sizeof(xmlDictStrings) + size); + if (pool == NULL) + return(NULL); + pool->size = size; + pool->nbStrings = 0; + pool->free = &pool->array[0]; + pool->end = &pool->array[size]; + pool->next = dict->strings; + dict->strings = pool; +#ifdef DICT_DEBUG_PATTERNS + fprintf(stderr, "+"); +#endif + } +found_pool: + ret = pool->free; + memcpy(pool->free, prefix, plen); + pool->free += plen; + *(pool->free++) = ':'; + memcpy(pool->free, name, namelen); + pool->free += namelen; + *(pool->free++) = 0; + pool->nbStrings++; + return(ret); +} + +#ifdef WITH_BIG_KEY +/* + * xmlDictComputeBigKey: + * + * Calculate a hash key using a good hash function that works well for + * larger hash table sizes. + * + * Hash function by "One-at-a-Time Hash" see + * http://burtleburtle.net/bob/hash/doobs.html + */ + +static uint32_t +xmlDictComputeBigKey(const xmlChar* data, int namelen, int seed) { + uint32_t hash; + int i; + + if (namelen <= 0 || data == NULL) return(0); + + hash = seed; + + for (i = 0;i < namelen; i++) { + hash += data[i]; + hash += (hash << 10); + hash ^= (hash >> 6); + } + hash += (hash << 3); + hash ^= (hash >> 11); + hash += (hash << 15); + + return hash; +} + +/* + * xmlDictComputeBigQKey: + * + * Calculate a hash key for two strings using a good hash function + * that works well for larger hash table sizes. + * + * Hash function by "One-at-a-Time Hash" see + * http://burtleburtle.net/bob/hash/doobs.html + * + * Neither of the two strings must be NULL. + */ +static unsigned long +xmlDictComputeBigQKey(const xmlChar *prefix, int plen, + const xmlChar *name, int len, int seed) +{ + uint32_t hash; + int i; + + hash = seed; + + for (i = 0;i < plen; i++) { + hash += prefix[i]; + hash += (hash << 10); + hash ^= (hash >> 6); + } + hash += ':'; + hash += (hash << 10); + hash ^= (hash >> 6); + + for (i = 0;i < len; i++) { + hash += name[i]; + hash += (hash << 10); + hash ^= (hash >> 6); + } + hash += (hash << 3); + hash ^= (hash >> 11); + hash += (hash << 15); + + return hash; +} +#endif /* WITH_BIG_KEY */ + +/* + * xmlDictComputeFastKey: + * + * Calculate a hash key using a fast hash function that works well + * for low hash table fill. + */ +static unsigned long +xmlDictComputeFastKey(const xmlChar *name, int namelen, int seed) { + unsigned long value = seed; + + if (name == NULL) return(0); + value = *name; + value <<= 5; + if (namelen > 10) { + value += name[namelen - 1]; + namelen = 10; + } + switch (namelen) { + case 10: value += name[9]; + case 9: value += name[8]; + case 8: value += name[7]; + case 7: value += name[6]; + case 6: value += name[5]; + case 5: value += name[4]; + case 4: value += name[3]; + case 3: value += name[2]; + case 2: value += name[1]; + default: break; + } + return(value); +} + +/* + * xmlDictComputeFastQKey: + * + * Calculate a hash key for two strings using a fast hash function + * that works well for low hash table fill. + * + * Neither of the two strings must be NULL. + */ +static unsigned long +xmlDictComputeFastQKey(const xmlChar *prefix, int plen, + const xmlChar *name, int len, int seed) +{ + unsigned long value = (unsigned long) seed; + + if (plen == 0) + value += 30 * (unsigned long) ':'; + else + value += 30 * (*prefix); + + if (len > 10) { + value += name[len - (plen + 1 + 1)]; + len = 10; + if (plen > 10) + plen = 10; + } + switch (plen) { + case 10: value += prefix[9]; + case 9: value += prefix[8]; + case 8: value += prefix[7]; + case 7: value += prefix[6]; + case 6: value += prefix[5]; + case 5: value += prefix[4]; + case 4: value += prefix[3]; + case 3: value += prefix[2]; + case 2: value += prefix[1]; + case 1: value += prefix[0]; + default: break; + } + len -= plen; + if (len > 0) { + value += (unsigned long) ':'; + len--; + } + switch (len) { + case 10: value += name[9]; + case 9: value += name[8]; + case 8: value += name[7]; + case 7: value += name[6]; + case 6: value += name[5]; + case 5: value += name[4]; + case 4: value += name[3]; + case 3: value += name[2]; + case 2: value += name[1]; + case 1: value += name[0]; + default: break; + } + return(value); +} + +/** + * xmlDictCreate: + * + * Create a new dictionary + * + * Returns the newly created dictionnary, or NULL if an error occured. + */ +xmlDictPtr +xmlDictCreate(void) { + xmlDictPtr dict; + + if (!xmlDictInitialized) + if (!__xmlInitializeDict()) + return(NULL); + +#ifdef DICT_DEBUG_PATTERNS + fprintf(stderr, "C"); +#endif + + dict = xmlMalloc(sizeof(xmlDict)); + if (dict) { + dict->ref_counter = 1; + dict->limit = 0; + + dict->size = MIN_DICT_SIZE; + dict->nbElems = 0; + dict->dict = xmlMalloc(MIN_DICT_SIZE * sizeof(xmlDictEntry)); + dict->strings = NULL; + dict->subdict = NULL; + if (dict->dict) { + memset(dict->dict, 0, MIN_DICT_SIZE * sizeof(xmlDictEntry)); +#ifdef DICT_RANDOMIZATION + dict->seed = __xmlRandom(); +#else + dict->seed = 0; +#endif + return(dict); + } + xmlFree(dict); + } + return(NULL); +} + +/** + * xmlDictCreateSub: + * @sub: an existing dictionnary + * + * Create a new dictionary, inheriting strings from the read-only + * dictionnary @sub. On lookup, strings are first searched in the + * new dictionnary, then in @sub, and if not found are created in the + * new dictionnary. + * + * Returns the newly created dictionnary, or NULL if an error occured. + */ +xmlDictPtr +xmlDictCreateSub(xmlDictPtr sub) { + xmlDictPtr dict = xmlDictCreate(); + + if ((dict != NULL) && (sub != NULL)) { +#ifdef DICT_DEBUG_PATTERNS + fprintf(stderr, "R"); +#endif + dict->seed = sub->seed; + dict->subdict = sub; + xmlDictReference(dict->subdict); + } + return(dict); +} + +/** + * xmlDictReference: + * @dict: the dictionnary + * + * Increment the reference counter of a dictionary + * + * Returns 0 in case of success and -1 in case of error + */ +int +xmlDictReference(xmlDictPtr dict) { + if (!xmlDictInitialized) + if (!__xmlInitializeDict()) + return(-1); + + if (dict == NULL) return -1; + xmlRMutexLock(xmlDictMutex); + dict->ref_counter++; + xmlRMutexUnlock(xmlDictMutex); + return(0); +} + +/** + * xmlDictGrow: + * @dict: the dictionnary + * @size: the new size of the dictionnary + * + * resize the dictionnary + * + * Returns 0 in case of success, -1 in case of failure + */ +static int +xmlDictGrow(xmlDictPtr dict, size_t size) { + unsigned long key, okey; + size_t oldsize, i; + xmlDictEntryPtr iter, next; + struct _xmlDictEntry *olddict; +#ifdef DEBUG_GROW + unsigned long nbElem = 0; +#endif + int ret = 0; + int keep_keys = 1; + + if (dict == NULL) + return(-1); + if (size < 8) + return(-1); + if (size > 8 * 2048) + return(-1); + +#ifdef DICT_DEBUG_PATTERNS + fprintf(stderr, "*"); +#endif + + oldsize = dict->size; + olddict = dict->dict; + if (olddict == NULL) + return(-1); + if (oldsize == MIN_DICT_SIZE) + keep_keys = 0; + + dict->dict = xmlMalloc(size * sizeof(xmlDictEntry)); + if (dict->dict == NULL) { + dict->dict = olddict; + return(-1); + } + memset(dict->dict, 0, size * sizeof(xmlDictEntry)); + dict->size = size; + + /* If the two loops are merged, there would be situations where + a new entry needs to allocated and data copied into it from + the main dict. It is nicer to run through the array twice, first + copying all the elements in the main array (less probability of + allocate) and then the rest, so we only free in the second loop. + */ + for (i = 0; i < oldsize; i++) { + if (olddict[i].valid == 0) + continue; + + if (keep_keys) + okey = olddict[i].okey; + else + okey = xmlDictComputeKey(dict, olddict[i].name, olddict[i].len); + key = okey % dict->size; + + if (dict->dict[key].valid == 0) { + memcpy(&(dict->dict[key]), &(olddict[i]), sizeof(xmlDictEntry)); + dict->dict[key].next = NULL; + dict->dict[key].okey = okey; + } else { + xmlDictEntryPtr entry; + + entry = xmlMalloc(sizeof(xmlDictEntry)); + if (entry != NULL) { + entry->name = olddict[i].name; + entry->len = olddict[i].len; + entry->okey = okey; + entry->next = dict->dict[key].next; + entry->valid = 1; + dict->dict[key].next = entry; + } else { + /* + * we don't have much ways to alert from herei + * result is loosing an entry and unicity garantee + */ + ret = -1; + } + } +#ifdef DEBUG_GROW + nbElem++; +#endif + } + + for (i = 0; i < oldsize; i++) { + iter = olddict[i].next; + while (iter) { + next = iter->next; + + /* + * put back the entry in the new dict + */ + + if (keep_keys) + okey = iter->okey; + else + okey = xmlDictComputeKey(dict, iter->name, iter->len); + key = okey % dict->size; + if (dict->dict[key].valid == 0) { + memcpy(&(dict->dict[key]), iter, sizeof(xmlDictEntry)); + dict->dict[key].next = NULL; + dict->dict[key].valid = 1; + dict->dict[key].okey = okey; + xmlFree(iter); + } else { + iter->next = dict->dict[key].next; + iter->okey = okey; + dict->dict[key].next = iter; + } + +#ifdef DEBUG_GROW + nbElem++; +#endif + + iter = next; + } + } + + xmlFree(olddict); + +#ifdef DEBUG_GROW + xmlGenericError(xmlGenericErrorContext, + "xmlDictGrow : from %lu to %lu, %u elems\n", oldsize, size, nbElem); +#endif + + return(ret); +} + +/** + * xmlDictFree: + * @dict: the dictionnary + * + * Free the hash @dict and its contents. The userdata is + * deallocated with @f if provided. + */ +void +xmlDictFree(xmlDictPtr dict) { + size_t i; + xmlDictEntryPtr iter; + xmlDictEntryPtr next; + int inside_dict = 0; + xmlDictStringsPtr pool, nextp; + + if (dict == NULL) + return; + + if (!xmlDictInitialized) + if (!__xmlInitializeDict()) + return; + + /* decrement the counter, it may be shared by a parser and docs */ + xmlRMutexLock(xmlDictMutex); + dict->ref_counter--; + if (dict->ref_counter > 0) { + xmlRMutexUnlock(xmlDictMutex); + return; + } + + xmlRMutexUnlock(xmlDictMutex); + + if (dict->subdict != NULL) { + xmlDictFree(dict->subdict); + } + + if (dict->dict) { + for(i = 0; ((i < dict->size) && (dict->nbElems > 0)); i++) { + iter = &(dict->dict[i]); + if (iter->valid == 0) + continue; + inside_dict = 1; + while (iter) { + next = iter->next; + if (!inside_dict) + xmlFree(iter); + dict->nbElems--; + inside_dict = 0; + iter = next; + } + } + xmlFree(dict->dict); + } + pool = dict->strings; + while (pool != NULL) { + nextp = pool->next; + xmlFree(pool); + pool = nextp; + } + xmlFree(dict); +} + +/** + * xmlDictLookup: + * @dict: the dictionnary + * @name: the name of the userdata + * @len: the length of the name, if -1 it is recomputed + * + * Add the @name to the dictionnary @dict if not present. + * + * Returns the internal copy of the name or NULL in case of internal error + */ +const xmlChar * +xmlDictLookup(xmlDictPtr dict, const xmlChar *name, int len) { + unsigned long key, okey, nbi = 0; + xmlDictEntryPtr entry; + xmlDictEntryPtr insert; + const xmlChar *ret; + unsigned int l; + + if ((dict == NULL) || (name == NULL)) + return(NULL); + + if (len < 0) + l = strlen((const char *) name); + else + l = len; + + if (((dict->limit > 0) && (l >= dict->limit)) || + (l > INT_MAX / 2)) + return(NULL); + + /* + * Check for duplicate and insertion location. + */ + okey = xmlDictComputeKey(dict, name, l); + key = okey % dict->size; + if (dict->dict[key].valid == 0) { + insert = NULL; + } else { + for (insert = &(dict->dict[key]); insert->next != NULL; + insert = insert->next) { +#ifdef __GNUC__ + if ((insert->okey == okey) && (insert->len == l)) { + if (!memcmp(insert->name, name, l)) + return(insert->name); + } +#else + if ((insert->okey == okey) && (insert->len == l) && + (!xmlStrncmp(insert->name, name, l))) + return(insert->name); +#endif + nbi++; + } +#ifdef __GNUC__ + if ((insert->okey == okey) && (insert->len == l)) { + if (!memcmp(insert->name, name, l)) + return(insert->name); + } +#else + if ((insert->okey == okey) && (insert->len == l) && + (!xmlStrncmp(insert->name, name, l))) + return(insert->name); +#endif + } + + if (dict->subdict) { + unsigned long skey; + + /* we cannot always reuse the same okey for the subdict */ + if (((dict->size == MIN_DICT_SIZE) && + (dict->subdict->size != MIN_DICT_SIZE)) || + ((dict->size != MIN_DICT_SIZE) && + (dict->subdict->size == MIN_DICT_SIZE))) + skey = xmlDictComputeKey(dict->subdict, name, l); + else + skey = okey; + + key = skey % dict->subdict->size; + if (dict->subdict->dict[key].valid != 0) { + xmlDictEntryPtr tmp; + + for (tmp = &(dict->subdict->dict[key]); tmp->next != NULL; + tmp = tmp->next) { +#ifdef __GNUC__ + if ((tmp->okey == skey) && (tmp->len == l)) { + if (!memcmp(tmp->name, name, l)) + return(tmp->name); + } +#else + if ((tmp->okey == skey) && (tmp->len == l) && + (!xmlStrncmp(tmp->name, name, l))) + return(tmp->name); +#endif + nbi++; + } +#ifdef __GNUC__ + if ((tmp->okey == skey) && (tmp->len == l)) { + if (!memcmp(tmp->name, name, l)) + return(tmp->name); + } +#else + if ((tmp->okey == skey) && (tmp->len == l) && + (!xmlStrncmp(tmp->name, name, l))) + return(tmp->name); +#endif + } + key = okey % dict->size; + } + + ret = xmlDictAddString(dict, name, l); + if (ret == NULL) + return(NULL); + if (insert == NULL) { + entry = &(dict->dict[key]); + } else { + entry = xmlMalloc(sizeof(xmlDictEntry)); + if (entry == NULL) + return(NULL); + } + entry->name = ret; + entry->len = l; + entry->next = NULL; + entry->valid = 1; + entry->okey = okey; + + + if (insert != NULL) + insert->next = entry; + + dict->nbElems++; + + if ((nbi > MAX_HASH_LEN) && + (dict->size <= ((MAX_DICT_HASH / 2) / MAX_HASH_LEN))) { + if (xmlDictGrow(dict, MAX_HASH_LEN * 2 * dict->size) != 0) + return(NULL); + } + /* Note that entry may have been freed at this point by xmlDictGrow */ + + return(ret); +} + +/** + * xmlDictExists: + * @dict: the dictionnary + * @name: the name of the userdata + * @len: the length of the name, if -1 it is recomputed + * + * Check if the @name exists in the dictionnary @dict. + * + * Returns the internal copy of the name or NULL if not found. + */ +const xmlChar * +xmlDictExists(xmlDictPtr dict, const xmlChar *name, int len) { + unsigned long key, okey, nbi = 0; + xmlDictEntryPtr insert; + unsigned int l; + + if ((dict == NULL) || (name == NULL)) + return(NULL); + + if (len < 0) + l = strlen((const char *) name); + else + l = len; + if (((dict->limit > 0) && (l >= dict->limit)) || + (l > INT_MAX / 2)) + return(NULL); + + /* + * Check for duplicate and insertion location. + */ + okey = xmlDictComputeKey(dict, name, l); + key = okey % dict->size; + if (dict->dict[key].valid == 0) { + insert = NULL; + } else { + for (insert = &(dict->dict[key]); insert->next != NULL; + insert = insert->next) { +#ifdef __GNUC__ + if ((insert->okey == okey) && (insert->len == l)) { + if (!memcmp(insert->name, name, l)) + return(insert->name); + } +#else + if ((insert->okey == okey) && (insert->len == l) && + (!xmlStrncmp(insert->name, name, l))) + return(insert->name); +#endif + nbi++; + } +#ifdef __GNUC__ + if ((insert->okey == okey) && (insert->len == l)) { + if (!memcmp(insert->name, name, l)) + return(insert->name); + } +#else + if ((insert->okey == okey) && (insert->len == l) && + (!xmlStrncmp(insert->name, name, l))) + return(insert->name); +#endif + } + + if (dict->subdict) { + unsigned long skey; + + /* we cannot always reuse the same okey for the subdict */ + if (((dict->size == MIN_DICT_SIZE) && + (dict->subdict->size != MIN_DICT_SIZE)) || + ((dict->size != MIN_DICT_SIZE) && + (dict->subdict->size == MIN_DICT_SIZE))) + skey = xmlDictComputeKey(dict->subdict, name, l); + else + skey = okey; + + key = skey % dict->subdict->size; + if (dict->subdict->dict[key].valid != 0) { + xmlDictEntryPtr tmp; + + for (tmp = &(dict->subdict->dict[key]); tmp->next != NULL; + tmp = tmp->next) { +#ifdef __GNUC__ + if ((tmp->okey == skey) && (tmp->len == l)) { + if (!memcmp(tmp->name, name, l)) + return(tmp->name); + } +#else + if ((tmp->okey == skey) && (tmp->len == l) && + (!xmlStrncmp(tmp->name, name, l))) + return(tmp->name); +#endif + nbi++; + } +#ifdef __GNUC__ + if ((tmp->okey == skey) && (tmp->len == l)) { + if (!memcmp(tmp->name, name, l)) + return(tmp->name); + } +#else + if ((tmp->okey == skey) && (tmp->len == l) && + (!xmlStrncmp(tmp->name, name, l))) + return(tmp->name); +#endif + } + } + + /* not found */ + return(NULL); +} + +/** + * xmlDictQLookup: + * @dict: the dictionnary + * @prefix: the prefix + * @name: the name + * + * Add the QName @prefix:@name to the hash @dict if not present. + * + * Returns the internal copy of the QName or NULL in case of internal error + */ +const xmlChar * +xmlDictQLookup(xmlDictPtr dict, const xmlChar *prefix, const xmlChar *name) { + unsigned long okey, key, nbi = 0; + xmlDictEntryPtr entry; + xmlDictEntryPtr insert; + const xmlChar *ret; + unsigned int len, plen, l; + + if ((dict == NULL) || (name == NULL)) + return(NULL); + if (prefix == NULL) + return(xmlDictLookup(dict, name, -1)); + + l = len = strlen((const char *) name); + plen = strlen((const char *) prefix); + len += 1 + plen; + + /* + * Check for duplicate and insertion location. + */ + okey = xmlDictComputeQKey(dict, prefix, plen, name, l); + key = okey % dict->size; + if (dict->dict[key].valid == 0) { + insert = NULL; + } else { + for (insert = &(dict->dict[key]); insert->next != NULL; + insert = insert->next) { + if ((insert->okey == okey) && (insert->len == len) && + (xmlStrQEqual(prefix, name, insert->name))) + return(insert->name); + nbi++; + } + if ((insert->okey == okey) && (insert->len == len) && + (xmlStrQEqual(prefix, name, insert->name))) + return(insert->name); + } + + if (dict->subdict) { + unsigned long skey; + + /* we cannot always reuse the same okey for the subdict */ + if (((dict->size == MIN_DICT_SIZE) && + (dict->subdict->size != MIN_DICT_SIZE)) || + ((dict->size != MIN_DICT_SIZE) && + (dict->subdict->size == MIN_DICT_SIZE))) + skey = xmlDictComputeQKey(dict->subdict, prefix, plen, name, l); + else + skey = okey; + + key = skey % dict->subdict->size; + if (dict->subdict->dict[key].valid != 0) { + xmlDictEntryPtr tmp; + for (tmp = &(dict->subdict->dict[key]); tmp->next != NULL; + tmp = tmp->next) { + if ((tmp->okey == skey) && (tmp->len == len) && + (xmlStrQEqual(prefix, name, tmp->name))) + return(tmp->name); + nbi++; + } + if ((tmp->okey == skey) && (tmp->len == len) && + (xmlStrQEqual(prefix, name, tmp->name))) + return(tmp->name); + } + key = okey % dict->size; + } + + ret = xmlDictAddQString(dict, prefix, plen, name, l); + if (ret == NULL) + return(NULL); + if (insert == NULL) { + entry = &(dict->dict[key]); + } else { + entry = xmlMalloc(sizeof(xmlDictEntry)); + if (entry == NULL) + return(NULL); + } + entry->name = ret; + entry->len = len; + entry->next = NULL; + entry->valid = 1; + entry->okey = okey; + + if (insert != NULL) + insert->next = entry; + + dict->nbElems++; + + if ((nbi > MAX_HASH_LEN) && + (dict->size <= ((MAX_DICT_HASH / 2) / MAX_HASH_LEN))) + xmlDictGrow(dict, MAX_HASH_LEN * 2 * dict->size); + /* Note that entry may have been freed at this point by xmlDictGrow */ + + return(ret); +} + +/** + * xmlDictOwns: + * @dict: the dictionnary + * @str: the string + * + * check if a string is owned by the disctionary + * + * Returns 1 if true, 0 if false and -1 in case of error + * -1 in case of error + */ +int +xmlDictOwns(xmlDictPtr dict, const xmlChar *str) { + xmlDictStringsPtr pool; + + if ((dict == NULL) || (str == NULL)) + return(-1); + pool = dict->strings; + while (pool != NULL) { + if ((str >= &pool->array[0]) && (str <= pool->free)) + return(1); + pool = pool->next; + } + if (dict->subdict) + return(xmlDictOwns(dict->subdict, str)); + return(0); +} + +/** + * xmlDictSize: + * @dict: the dictionnary + * + * Query the number of elements installed in the hash @dict. + * + * Returns the number of elements in the dictionnary or + * -1 in case of error + */ +int +xmlDictSize(xmlDictPtr dict) { + if (dict == NULL) + return(-1); + if (dict->subdict) + return(dict->nbElems + dict->subdict->nbElems); + return(dict->nbElems); +} + +/** + * xmlDictSetLimit: + * @dict: the dictionnary + * @limit: the limit in bytes + * + * Set a size limit for the dictionary + * Added in 2.9.0 + * + * Returns the previous limit of the dictionary or 0 + */ +size_t +xmlDictSetLimit(xmlDictPtr dict, size_t limit) { + size_t ret; + + if (dict == NULL) + return(0); + ret = dict->limit; + dict->limit = limit; + return(ret); +} + +/** + * xmlDictGetUsage: + * @dict: the dictionnary + * + * Get how much memory is used by a dictionary for strings + * Added in 2.9.0 + * + * Returns the amount of strings allocated + */ +size_t +xmlDictGetUsage(xmlDictPtr dict) { + xmlDictStringsPtr pool; + size_t limit = 0; + + if (dict == NULL) + return(0); + pool = dict->strings; + while (pool != NULL) { + limit += pool->size; + pool = pool->next; + } + return(limit); +} + +#define bottom_dict +#include "elfgcchack.h" diff --git a/vendors/libxml/src/elfgcchack.h b/vendors/libxml/src/elfgcchack.h new file mode 100644 index 0000000..85c49d6 --- /dev/null +++ b/vendors/libxml/src/elfgcchack.h @@ -0,0 +1,17784 @@ +/* + * elfgcchack.h: hack by Arjan van de Ven to speed + * up the code when using gcc for call within the library. + * + * Based on the analysis http://people.redhat.com/drepper/dsohowto.pdf + * from Ulrich drepper. Rewritten to be generated from the XML description + * file for libxml2 API + * autogenerated with xsltproc doc/elfgcchack.xsl doc/libxml2-api.xml + */ + +#ifdef IN_LIBXML +#ifdef __GNUC__ +#ifdef PIC +#ifdef linux +#if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || (__GNUC__ > 3) + +#include "libxml/c14n.h" +#include "libxml/catalog.h" +#include "libxml/chvalid.h" +#include "libxml/debugXML.h" +#include "libxml/dict.h" +#include "libxml/DOCBparser.h" +#include "libxml/encoding.h" +#include "libxml/entities.h" +#include "libxml/globals.h" +#include "libxml/hash.h" +#include "libxml/HTMLparser.h" +#include "libxml/HTMLtree.h" +#include "libxml/list.h" +#include "libxml/nanoftp.h" +#include "libxml/nanohttp.h" +#include "libxml/parser.h" +#include "libxml/parserInternals.h" +#include "libxml/pattern.h" +#include "libxml/relaxng.h" +#include "libxml/SAX2.h" +#include "libxml/SAX.h" +#include "libxml/schemasInternals.h" +#include "libxml/schematron.h" +#include "libxml/threads.h" +#include "libxml/tree.h" +#include "libxml/uri.h" +#include "libxml/valid.h" +#include "libxml/xinclude.h" +#include "libxml/xlink.h" +#include "libxml/xmlautomata.h" +#include "libxml/xmlerror.h" +#include "libxml/xmlexports.h" +#include "libxml/xmlIO.h" +#include "libxml/xmlmemory.h" +#include "libxml/xmlreader.h" +#include "libxml/xmlregexp.h" +#include "libxml/xmlsave.h" +#include "libxml/xmlschemas.h" +#include "libxml/xmlschemastypes.h" +#include "libxml/xmlstring.h" +#include "libxml/xmlunicode.h" +#include "libxml/xmlversion.h" +#include "libxml/xmlwriter.h" +#include "libxml/xpath.h" +#include "libxml/xpathInternals.h" +#include "libxml/xpointer.h" +#include "libxml/xmlmodule.h" + +/* special hot spot not exported ones */ + +#ifdef bottom_globals +#undef __xmlGenericError +extern __typeof (__xmlGenericError) __xmlGenericError __attribute((alias("__xmlGenericError__internal_alias"))); +#else +#ifndef __xmlGenericError +extern __typeof (__xmlGenericError) __xmlGenericError__internal_alias __attribute((visibility("hidden"))); +#define __xmlGenericError __xmlGenericError__internal_alias +#endif +#endif + +#ifdef bottom_globals +#undef __xmlGenericErrorContext +extern __typeof (__xmlGenericErrorContext) __xmlGenericErrorContext __attribute((alias("__xmlGenericErrorContext__internal_alias"))); +#else +#ifndef __xmlGenericErrorContext +extern __typeof (__xmlGenericErrorContext) __xmlGenericErrorContext__internal_alias __attribute((visibility("hidden"))); +#define __xmlGenericErrorContext __xmlGenericErrorContext__internal_alias +#endif +#endif + +/* list generated from libxml2-api.xml */ +#if defined(LIBXML_DOCB_ENABLED) +#ifdef bottom_DOCBparser +#undef docbCreatePushParserCtxt +extern __typeof (docbCreatePushParserCtxt) docbCreatePushParserCtxt __attribute((alias("docbCreatePushParserCtxt__internal_alias"))); +#else +#ifndef docbCreatePushParserCtxt +extern __typeof (docbCreatePushParserCtxt) docbCreatePushParserCtxt__internal_alias __attribute((visibility("hidden"))); +#define docbCreatePushParserCtxt docbCreatePushParserCtxt__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlAttrAllowed +extern __typeof (htmlAttrAllowed) htmlAttrAllowed __attribute((alias("htmlAttrAllowed__internal_alias"))); +#else +#ifndef htmlAttrAllowed +extern __typeof (htmlAttrAllowed) htmlAttrAllowed__internal_alias __attribute((visibility("hidden"))); +#define htmlAttrAllowed htmlAttrAllowed__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlAutoCloseTag +extern __typeof (htmlAutoCloseTag) htmlAutoCloseTag __attribute((alias("htmlAutoCloseTag__internal_alias"))); +#else +#ifndef htmlAutoCloseTag +extern __typeof (htmlAutoCloseTag) htmlAutoCloseTag__internal_alias __attribute((visibility("hidden"))); +#define htmlAutoCloseTag htmlAutoCloseTag__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlCreateFileParserCtxt +extern __typeof (htmlCreateFileParserCtxt) htmlCreateFileParserCtxt __attribute((alias("htmlCreateFileParserCtxt__internal_alias"))); +#else +#ifndef htmlCreateFileParserCtxt +extern __typeof (htmlCreateFileParserCtxt) htmlCreateFileParserCtxt__internal_alias __attribute((visibility("hidden"))); +#define htmlCreateFileParserCtxt htmlCreateFileParserCtxt__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlCreateMemoryParserCtxt +extern __typeof (htmlCreateMemoryParserCtxt) htmlCreateMemoryParserCtxt __attribute((alias("htmlCreateMemoryParserCtxt__internal_alias"))); +#else +#ifndef htmlCreateMemoryParserCtxt +extern __typeof (htmlCreateMemoryParserCtxt) htmlCreateMemoryParserCtxt__internal_alias __attribute((visibility("hidden"))); +#define htmlCreateMemoryParserCtxt htmlCreateMemoryParserCtxt__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_PUSH_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlCreatePushParserCtxt +extern __typeof (htmlCreatePushParserCtxt) htmlCreatePushParserCtxt __attribute((alias("htmlCreatePushParserCtxt__internal_alias"))); +#else +#ifndef htmlCreatePushParserCtxt +extern __typeof (htmlCreatePushParserCtxt) htmlCreatePushParserCtxt__internal_alias __attribute((visibility("hidden"))); +#define htmlCreatePushParserCtxt htmlCreatePushParserCtxt__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlCtxtReadDoc +extern __typeof (htmlCtxtReadDoc) htmlCtxtReadDoc __attribute((alias("htmlCtxtReadDoc__internal_alias"))); +#else +#ifndef htmlCtxtReadDoc +extern __typeof (htmlCtxtReadDoc) htmlCtxtReadDoc__internal_alias __attribute((visibility("hidden"))); +#define htmlCtxtReadDoc htmlCtxtReadDoc__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlCtxtReadFd +extern __typeof (htmlCtxtReadFd) htmlCtxtReadFd __attribute((alias("htmlCtxtReadFd__internal_alias"))); +#else +#ifndef htmlCtxtReadFd +extern __typeof (htmlCtxtReadFd) htmlCtxtReadFd__internal_alias __attribute((visibility("hidden"))); +#define htmlCtxtReadFd htmlCtxtReadFd__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlCtxtReadFile +extern __typeof (htmlCtxtReadFile) htmlCtxtReadFile __attribute((alias("htmlCtxtReadFile__internal_alias"))); +#else +#ifndef htmlCtxtReadFile +extern __typeof (htmlCtxtReadFile) htmlCtxtReadFile__internal_alias __attribute((visibility("hidden"))); +#define htmlCtxtReadFile htmlCtxtReadFile__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlCtxtReadIO +extern __typeof (htmlCtxtReadIO) htmlCtxtReadIO __attribute((alias("htmlCtxtReadIO__internal_alias"))); +#else +#ifndef htmlCtxtReadIO +extern __typeof (htmlCtxtReadIO) htmlCtxtReadIO__internal_alias __attribute((visibility("hidden"))); +#define htmlCtxtReadIO htmlCtxtReadIO__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlCtxtReadMemory +extern __typeof (htmlCtxtReadMemory) htmlCtxtReadMemory __attribute((alias("htmlCtxtReadMemory__internal_alias"))); +#else +#ifndef htmlCtxtReadMemory +extern __typeof (htmlCtxtReadMemory) htmlCtxtReadMemory__internal_alias __attribute((visibility("hidden"))); +#define htmlCtxtReadMemory htmlCtxtReadMemory__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlCtxtReset +extern __typeof (htmlCtxtReset) htmlCtxtReset __attribute((alias("htmlCtxtReset__internal_alias"))); +#else +#ifndef htmlCtxtReset +extern __typeof (htmlCtxtReset) htmlCtxtReset__internal_alias __attribute((visibility("hidden"))); +#define htmlCtxtReset htmlCtxtReset__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlCtxtUseOptions +extern __typeof (htmlCtxtUseOptions) htmlCtxtUseOptions __attribute((alias("htmlCtxtUseOptions__internal_alias"))); +#else +#ifndef htmlCtxtUseOptions +extern __typeof (htmlCtxtUseOptions) htmlCtxtUseOptions__internal_alias __attribute((visibility("hidden"))); +#define htmlCtxtUseOptions htmlCtxtUseOptions__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_SAX2 +#undef htmlDefaultSAXHandlerInit +extern __typeof (htmlDefaultSAXHandlerInit) htmlDefaultSAXHandlerInit __attribute((alias("htmlDefaultSAXHandlerInit__internal_alias"))); +#else +#ifndef htmlDefaultSAXHandlerInit +extern __typeof (htmlDefaultSAXHandlerInit) htmlDefaultSAXHandlerInit__internal_alias __attribute((visibility("hidden"))); +#define htmlDefaultSAXHandlerInit htmlDefaultSAXHandlerInit__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_HTMLtree +#undef htmlDocContentDumpFormatOutput +extern __typeof (htmlDocContentDumpFormatOutput) htmlDocContentDumpFormatOutput __attribute((alias("htmlDocContentDumpFormatOutput__internal_alias"))); +#else +#ifndef htmlDocContentDumpFormatOutput +extern __typeof (htmlDocContentDumpFormatOutput) htmlDocContentDumpFormatOutput__internal_alias __attribute((visibility("hidden"))); +#define htmlDocContentDumpFormatOutput htmlDocContentDumpFormatOutput__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_HTMLtree +#undef htmlDocContentDumpOutput +extern __typeof (htmlDocContentDumpOutput) htmlDocContentDumpOutput __attribute((alias("htmlDocContentDumpOutput__internal_alias"))); +#else +#ifndef htmlDocContentDumpOutput +extern __typeof (htmlDocContentDumpOutput) htmlDocContentDumpOutput__internal_alias __attribute((visibility("hidden"))); +#define htmlDocContentDumpOutput htmlDocContentDumpOutput__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_HTMLtree +#undef htmlDocDump +extern __typeof (htmlDocDump) htmlDocDump __attribute((alias("htmlDocDump__internal_alias"))); +#else +#ifndef htmlDocDump +extern __typeof (htmlDocDump) htmlDocDump__internal_alias __attribute((visibility("hidden"))); +#define htmlDocDump htmlDocDump__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_HTMLtree +#undef htmlDocDumpMemory +extern __typeof (htmlDocDumpMemory) htmlDocDumpMemory __attribute((alias("htmlDocDumpMemory__internal_alias"))); +#else +#ifndef htmlDocDumpMemory +extern __typeof (htmlDocDumpMemory) htmlDocDumpMemory__internal_alias __attribute((visibility("hidden"))); +#define htmlDocDumpMemory htmlDocDumpMemory__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_HTMLtree +#undef htmlDocDumpMemoryFormat +extern __typeof (htmlDocDumpMemoryFormat) htmlDocDumpMemoryFormat __attribute((alias("htmlDocDumpMemoryFormat__internal_alias"))); +#else +#ifndef htmlDocDumpMemoryFormat +extern __typeof (htmlDocDumpMemoryFormat) htmlDocDumpMemoryFormat__internal_alias __attribute((visibility("hidden"))); +#define htmlDocDumpMemoryFormat htmlDocDumpMemoryFormat__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlElementAllowedHere +extern __typeof (htmlElementAllowedHere) htmlElementAllowedHere __attribute((alias("htmlElementAllowedHere__internal_alias"))); +#else +#ifndef htmlElementAllowedHere +extern __typeof (htmlElementAllowedHere) htmlElementAllowedHere__internal_alias __attribute((visibility("hidden"))); +#define htmlElementAllowedHere htmlElementAllowedHere__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlElementStatusHere +extern __typeof (htmlElementStatusHere) htmlElementStatusHere __attribute((alias("htmlElementStatusHere__internal_alias"))); +#else +#ifndef htmlElementStatusHere +extern __typeof (htmlElementStatusHere) htmlElementStatusHere__internal_alias __attribute((visibility("hidden"))); +#define htmlElementStatusHere htmlElementStatusHere__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlEncodeEntities +extern __typeof (htmlEncodeEntities) htmlEncodeEntities __attribute((alias("htmlEncodeEntities__internal_alias"))); +#else +#ifndef htmlEncodeEntities +extern __typeof (htmlEncodeEntities) htmlEncodeEntities__internal_alias __attribute((visibility("hidden"))); +#define htmlEncodeEntities htmlEncodeEntities__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlEntityLookup +extern __typeof (htmlEntityLookup) htmlEntityLookup __attribute((alias("htmlEntityLookup__internal_alias"))); +#else +#ifndef htmlEntityLookup +extern __typeof (htmlEntityLookup) htmlEntityLookup__internal_alias __attribute((visibility("hidden"))); +#define htmlEntityLookup htmlEntityLookup__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlEntityValueLookup +extern __typeof (htmlEntityValueLookup) htmlEntityValueLookup __attribute((alias("htmlEntityValueLookup__internal_alias"))); +#else +#ifndef htmlEntityValueLookup +extern __typeof (htmlEntityValueLookup) htmlEntityValueLookup__internal_alias __attribute((visibility("hidden"))); +#define htmlEntityValueLookup htmlEntityValueLookup__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlFreeParserCtxt +extern __typeof (htmlFreeParserCtxt) htmlFreeParserCtxt __attribute((alias("htmlFreeParserCtxt__internal_alias"))); +#else +#ifndef htmlFreeParserCtxt +extern __typeof (htmlFreeParserCtxt) htmlFreeParserCtxt__internal_alias __attribute((visibility("hidden"))); +#define htmlFreeParserCtxt htmlFreeParserCtxt__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLtree +#undef htmlGetMetaEncoding +extern __typeof (htmlGetMetaEncoding) htmlGetMetaEncoding __attribute((alias("htmlGetMetaEncoding__internal_alias"))); +#else +#ifndef htmlGetMetaEncoding +extern __typeof (htmlGetMetaEncoding) htmlGetMetaEncoding__internal_alias __attribute((visibility("hidden"))); +#define htmlGetMetaEncoding htmlGetMetaEncoding__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlHandleOmittedElem +extern __typeof (htmlHandleOmittedElem) htmlHandleOmittedElem __attribute((alias("htmlHandleOmittedElem__internal_alias"))); +#else +#ifndef htmlHandleOmittedElem +extern __typeof (htmlHandleOmittedElem) htmlHandleOmittedElem__internal_alias __attribute((visibility("hidden"))); +#define htmlHandleOmittedElem htmlHandleOmittedElem__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlInitAutoClose +extern __typeof (htmlInitAutoClose) htmlInitAutoClose __attribute((alias("htmlInitAutoClose__internal_alias"))); +#else +#ifndef htmlInitAutoClose +extern __typeof (htmlInitAutoClose) htmlInitAutoClose__internal_alias __attribute((visibility("hidden"))); +#define htmlInitAutoClose htmlInitAutoClose__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlIsAutoClosed +extern __typeof (htmlIsAutoClosed) htmlIsAutoClosed __attribute((alias("htmlIsAutoClosed__internal_alias"))); +#else +#ifndef htmlIsAutoClosed +extern __typeof (htmlIsAutoClosed) htmlIsAutoClosed__internal_alias __attribute((visibility("hidden"))); +#define htmlIsAutoClosed htmlIsAutoClosed__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLtree +#undef htmlIsBooleanAttr +extern __typeof (htmlIsBooleanAttr) htmlIsBooleanAttr __attribute((alias("htmlIsBooleanAttr__internal_alias"))); +#else +#ifndef htmlIsBooleanAttr +extern __typeof (htmlIsBooleanAttr) htmlIsBooleanAttr__internal_alias __attribute((visibility("hidden"))); +#define htmlIsBooleanAttr htmlIsBooleanAttr__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlIsScriptAttribute +extern __typeof (htmlIsScriptAttribute) htmlIsScriptAttribute __attribute((alias("htmlIsScriptAttribute__internal_alias"))); +#else +#ifndef htmlIsScriptAttribute +extern __typeof (htmlIsScriptAttribute) htmlIsScriptAttribute__internal_alias __attribute((visibility("hidden"))); +#define htmlIsScriptAttribute htmlIsScriptAttribute__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlNewDoc +extern __typeof (htmlNewDoc) htmlNewDoc __attribute((alias("htmlNewDoc__internal_alias"))); +#else +#ifndef htmlNewDoc +extern __typeof (htmlNewDoc) htmlNewDoc__internal_alias __attribute((visibility("hidden"))); +#define htmlNewDoc htmlNewDoc__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlNewDocNoDtD +extern __typeof (htmlNewDocNoDtD) htmlNewDocNoDtD __attribute((alias("htmlNewDocNoDtD__internal_alias"))); +#else +#ifndef htmlNewDocNoDtD +extern __typeof (htmlNewDocNoDtD) htmlNewDocNoDtD__internal_alias __attribute((visibility("hidden"))); +#define htmlNewDocNoDtD htmlNewDocNoDtD__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlNewParserCtxt +extern __typeof (htmlNewParserCtxt) htmlNewParserCtxt __attribute((alias("htmlNewParserCtxt__internal_alias"))); +#else +#ifndef htmlNewParserCtxt +extern __typeof (htmlNewParserCtxt) htmlNewParserCtxt__internal_alias __attribute((visibility("hidden"))); +#define htmlNewParserCtxt htmlNewParserCtxt__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_HTMLtree +#undef htmlNodeDump +extern __typeof (htmlNodeDump) htmlNodeDump __attribute((alias("htmlNodeDump__internal_alias"))); +#else +#ifndef htmlNodeDump +extern __typeof (htmlNodeDump) htmlNodeDump__internal_alias __attribute((visibility("hidden"))); +#define htmlNodeDump htmlNodeDump__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_HTMLtree +#undef htmlNodeDumpFile +extern __typeof (htmlNodeDumpFile) htmlNodeDumpFile __attribute((alias("htmlNodeDumpFile__internal_alias"))); +#else +#ifndef htmlNodeDumpFile +extern __typeof (htmlNodeDumpFile) htmlNodeDumpFile__internal_alias __attribute((visibility("hidden"))); +#define htmlNodeDumpFile htmlNodeDumpFile__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_HTMLtree +#undef htmlNodeDumpFileFormat +extern __typeof (htmlNodeDumpFileFormat) htmlNodeDumpFileFormat __attribute((alias("htmlNodeDumpFileFormat__internal_alias"))); +#else +#ifndef htmlNodeDumpFileFormat +extern __typeof (htmlNodeDumpFileFormat) htmlNodeDumpFileFormat__internal_alias __attribute((visibility("hidden"))); +#define htmlNodeDumpFileFormat htmlNodeDumpFileFormat__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_HTMLtree +#undef htmlNodeDumpFormatOutput +extern __typeof (htmlNodeDumpFormatOutput) htmlNodeDumpFormatOutput __attribute((alias("htmlNodeDumpFormatOutput__internal_alias"))); +#else +#ifndef htmlNodeDumpFormatOutput +extern __typeof (htmlNodeDumpFormatOutput) htmlNodeDumpFormatOutput__internal_alias __attribute((visibility("hidden"))); +#define htmlNodeDumpFormatOutput htmlNodeDumpFormatOutput__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_HTMLtree +#undef htmlNodeDumpOutput +extern __typeof (htmlNodeDumpOutput) htmlNodeDumpOutput __attribute((alias("htmlNodeDumpOutput__internal_alias"))); +#else +#ifndef htmlNodeDumpOutput +extern __typeof (htmlNodeDumpOutput) htmlNodeDumpOutput__internal_alias __attribute((visibility("hidden"))); +#define htmlNodeDumpOutput htmlNodeDumpOutput__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlNodeStatus +extern __typeof (htmlNodeStatus) htmlNodeStatus __attribute((alias("htmlNodeStatus__internal_alias"))); +#else +#ifndef htmlNodeStatus +extern __typeof (htmlNodeStatus) htmlNodeStatus__internal_alias __attribute((visibility("hidden"))); +#define htmlNodeStatus htmlNodeStatus__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlParseCharRef +extern __typeof (htmlParseCharRef) htmlParseCharRef __attribute((alias("htmlParseCharRef__internal_alias"))); +#else +#ifndef htmlParseCharRef +extern __typeof (htmlParseCharRef) htmlParseCharRef__internal_alias __attribute((visibility("hidden"))); +#define htmlParseCharRef htmlParseCharRef__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_PUSH_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlParseChunk +extern __typeof (htmlParseChunk) htmlParseChunk __attribute((alias("htmlParseChunk__internal_alias"))); +#else +#ifndef htmlParseChunk +extern __typeof (htmlParseChunk) htmlParseChunk__internal_alias __attribute((visibility("hidden"))); +#define htmlParseChunk htmlParseChunk__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlParseDoc +extern __typeof (htmlParseDoc) htmlParseDoc __attribute((alias("htmlParseDoc__internal_alias"))); +#else +#ifndef htmlParseDoc +extern __typeof (htmlParseDoc) htmlParseDoc__internal_alias __attribute((visibility("hidden"))); +#define htmlParseDoc htmlParseDoc__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlParseDocument +extern __typeof (htmlParseDocument) htmlParseDocument __attribute((alias("htmlParseDocument__internal_alias"))); +#else +#ifndef htmlParseDocument +extern __typeof (htmlParseDocument) htmlParseDocument__internal_alias __attribute((visibility("hidden"))); +#define htmlParseDocument htmlParseDocument__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlParseElement +extern __typeof (htmlParseElement) htmlParseElement __attribute((alias("htmlParseElement__internal_alias"))); +#else +#ifndef htmlParseElement +extern __typeof (htmlParseElement) htmlParseElement__internal_alias __attribute((visibility("hidden"))); +#define htmlParseElement htmlParseElement__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlParseEntityRef +extern __typeof (htmlParseEntityRef) htmlParseEntityRef __attribute((alias("htmlParseEntityRef__internal_alias"))); +#else +#ifndef htmlParseEntityRef +extern __typeof (htmlParseEntityRef) htmlParseEntityRef__internal_alias __attribute((visibility("hidden"))); +#define htmlParseEntityRef htmlParseEntityRef__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlParseFile +extern __typeof (htmlParseFile) htmlParseFile __attribute((alias("htmlParseFile__internal_alias"))); +#else +#ifndef htmlParseFile +extern __typeof (htmlParseFile) htmlParseFile__internal_alias __attribute((visibility("hidden"))); +#define htmlParseFile htmlParseFile__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlReadDoc +extern __typeof (htmlReadDoc) htmlReadDoc __attribute((alias("htmlReadDoc__internal_alias"))); +#else +#ifndef htmlReadDoc +extern __typeof (htmlReadDoc) htmlReadDoc__internal_alias __attribute((visibility("hidden"))); +#define htmlReadDoc htmlReadDoc__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlReadFd +extern __typeof (htmlReadFd) htmlReadFd __attribute((alias("htmlReadFd__internal_alias"))); +#else +#ifndef htmlReadFd +extern __typeof (htmlReadFd) htmlReadFd__internal_alias __attribute((visibility("hidden"))); +#define htmlReadFd htmlReadFd__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlReadFile +extern __typeof (htmlReadFile) htmlReadFile __attribute((alias("htmlReadFile__internal_alias"))); +#else +#ifndef htmlReadFile +extern __typeof (htmlReadFile) htmlReadFile__internal_alias __attribute((visibility("hidden"))); +#define htmlReadFile htmlReadFile__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlReadIO +extern __typeof (htmlReadIO) htmlReadIO __attribute((alias("htmlReadIO__internal_alias"))); +#else +#ifndef htmlReadIO +extern __typeof (htmlReadIO) htmlReadIO__internal_alias __attribute((visibility("hidden"))); +#define htmlReadIO htmlReadIO__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlReadMemory +extern __typeof (htmlReadMemory) htmlReadMemory __attribute((alias("htmlReadMemory__internal_alias"))); +#else +#ifndef htmlReadMemory +extern __typeof (htmlReadMemory) htmlReadMemory__internal_alias __attribute((visibility("hidden"))); +#define htmlReadMemory htmlReadMemory__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlSAXParseDoc +extern __typeof (htmlSAXParseDoc) htmlSAXParseDoc __attribute((alias("htmlSAXParseDoc__internal_alias"))); +#else +#ifndef htmlSAXParseDoc +extern __typeof (htmlSAXParseDoc) htmlSAXParseDoc__internal_alias __attribute((visibility("hidden"))); +#define htmlSAXParseDoc htmlSAXParseDoc__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlSAXParseFile +extern __typeof (htmlSAXParseFile) htmlSAXParseFile __attribute((alias("htmlSAXParseFile__internal_alias"))); +#else +#ifndef htmlSAXParseFile +extern __typeof (htmlSAXParseFile) htmlSAXParseFile__internal_alias __attribute((visibility("hidden"))); +#define htmlSAXParseFile htmlSAXParseFile__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_HTMLtree +#undef htmlSaveFile +extern __typeof (htmlSaveFile) htmlSaveFile __attribute((alias("htmlSaveFile__internal_alias"))); +#else +#ifndef htmlSaveFile +extern __typeof (htmlSaveFile) htmlSaveFile__internal_alias __attribute((visibility("hidden"))); +#define htmlSaveFile htmlSaveFile__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_HTMLtree +#undef htmlSaveFileEnc +extern __typeof (htmlSaveFileEnc) htmlSaveFileEnc __attribute((alias("htmlSaveFileEnc__internal_alias"))); +#else +#ifndef htmlSaveFileEnc +extern __typeof (htmlSaveFileEnc) htmlSaveFileEnc__internal_alias __attribute((visibility("hidden"))); +#define htmlSaveFileEnc htmlSaveFileEnc__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_HTMLtree +#undef htmlSaveFileFormat +extern __typeof (htmlSaveFileFormat) htmlSaveFileFormat __attribute((alias("htmlSaveFileFormat__internal_alias"))); +#else +#ifndef htmlSaveFileFormat +extern __typeof (htmlSaveFileFormat) htmlSaveFileFormat__internal_alias __attribute((visibility("hidden"))); +#define htmlSaveFileFormat htmlSaveFileFormat__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLtree +#undef htmlSetMetaEncoding +extern __typeof (htmlSetMetaEncoding) htmlSetMetaEncoding __attribute((alias("htmlSetMetaEncoding__internal_alias"))); +#else +#ifndef htmlSetMetaEncoding +extern __typeof (htmlSetMetaEncoding) htmlSetMetaEncoding__internal_alias __attribute((visibility("hidden"))); +#define htmlSetMetaEncoding htmlSetMetaEncoding__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_HTMLparser +#undef htmlTagLookup +extern __typeof (htmlTagLookup) htmlTagLookup __attribute((alias("htmlTagLookup__internal_alias"))); +#else +#ifndef htmlTagLookup +extern __typeof (htmlTagLookup) htmlTagLookup__internal_alias __attribute((visibility("hidden"))); +#define htmlTagLookup htmlTagLookup__internal_alias +#endif +#endif +#endif + +#ifdef bottom_parser +#undef inputPop +extern __typeof (inputPop) inputPop __attribute((alias("inputPop__internal_alias"))); +#else +#ifndef inputPop +extern __typeof (inputPop) inputPop__internal_alias __attribute((visibility("hidden"))); +#define inputPop inputPop__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef inputPush +extern __typeof (inputPush) inputPush __attribute((alias("inputPush__internal_alias"))); +#else +#ifndef inputPush +extern __typeof (inputPush) inputPush__internal_alias __attribute((visibility("hidden"))); +#define inputPush inputPush__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef namePop +extern __typeof (namePop) namePop __attribute((alias("namePop__internal_alias"))); +#else +#ifndef namePop +extern __typeof (namePop) namePop__internal_alias __attribute((visibility("hidden"))); +#define namePop namePop__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef namePush +extern __typeof (namePush) namePush __attribute((alias("namePush__internal_alias"))); +#else +#ifndef namePush +extern __typeof (namePush) namePush__internal_alias __attribute((visibility("hidden"))); +#define namePush namePush__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef nodePop +extern __typeof (nodePop) nodePop __attribute((alias("nodePop__internal_alias"))); +#else +#ifndef nodePop +extern __typeof (nodePop) nodePop__internal_alias __attribute((visibility("hidden"))); +#define nodePop nodePop__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef nodePush +extern __typeof (nodePush) nodePush __attribute((alias("nodePush__internal_alias"))); +#else +#ifndef nodePush +extern __typeof (nodePush) nodePush__internal_alias __attribute((visibility("hidden"))); +#define nodePush nodePush__internal_alias +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef valuePop +extern __typeof (valuePop) valuePop __attribute((alias("valuePop__internal_alias"))); +#else +#ifndef valuePop +extern __typeof (valuePop) valuePop__internal_alias __attribute((visibility("hidden"))); +#define valuePop valuePop__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef valuePush +extern __typeof (valuePush) valuePush __attribute((alias("valuePush__internal_alias"))); +#else +#ifndef valuePush +extern __typeof (valuePush) valuePush__internal_alias __attribute((visibility("hidden"))); +#define valuePush valuePush__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_CATALOG_ENABLED) +#ifdef bottom_catalog +#undef xmlACatalogAdd +extern __typeof (xmlACatalogAdd) xmlACatalogAdd __attribute((alias("xmlACatalogAdd__internal_alias"))); +#else +#ifndef xmlACatalogAdd +extern __typeof (xmlACatalogAdd) xmlACatalogAdd__internal_alias __attribute((visibility("hidden"))); +#define xmlACatalogAdd xmlACatalogAdd__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_CATALOG_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_catalog +#undef xmlACatalogDump +extern __typeof (xmlACatalogDump) xmlACatalogDump __attribute((alias("xmlACatalogDump__internal_alias"))); +#else +#ifndef xmlACatalogDump +extern __typeof (xmlACatalogDump) xmlACatalogDump__internal_alias __attribute((visibility("hidden"))); +#define xmlACatalogDump xmlACatalogDump__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_CATALOG_ENABLED) +#ifdef bottom_catalog +#undef xmlACatalogRemove +extern __typeof (xmlACatalogRemove) xmlACatalogRemove __attribute((alias("xmlACatalogRemove__internal_alias"))); +#else +#ifndef xmlACatalogRemove +extern __typeof (xmlACatalogRemove) xmlACatalogRemove__internal_alias __attribute((visibility("hidden"))); +#define xmlACatalogRemove xmlACatalogRemove__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_CATALOG_ENABLED) +#ifdef bottom_catalog +#undef xmlACatalogResolve +extern __typeof (xmlACatalogResolve) xmlACatalogResolve __attribute((alias("xmlACatalogResolve__internal_alias"))); +#else +#ifndef xmlACatalogResolve +extern __typeof (xmlACatalogResolve) xmlACatalogResolve__internal_alias __attribute((visibility("hidden"))); +#define xmlACatalogResolve xmlACatalogResolve__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_CATALOG_ENABLED) +#ifdef bottom_catalog +#undef xmlACatalogResolvePublic +extern __typeof (xmlACatalogResolvePublic) xmlACatalogResolvePublic __attribute((alias("xmlACatalogResolvePublic__internal_alias"))); +#else +#ifndef xmlACatalogResolvePublic +extern __typeof (xmlACatalogResolvePublic) xmlACatalogResolvePublic__internal_alias __attribute((visibility("hidden"))); +#define xmlACatalogResolvePublic xmlACatalogResolvePublic__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_CATALOG_ENABLED) +#ifdef bottom_catalog +#undef xmlACatalogResolveSystem +extern __typeof (xmlACatalogResolveSystem) xmlACatalogResolveSystem __attribute((alias("xmlACatalogResolveSystem__internal_alias"))); +#else +#ifndef xmlACatalogResolveSystem +extern __typeof (xmlACatalogResolveSystem) xmlACatalogResolveSystem__internal_alias __attribute((visibility("hidden"))); +#define xmlACatalogResolveSystem xmlACatalogResolveSystem__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_CATALOG_ENABLED) +#ifdef bottom_catalog +#undef xmlACatalogResolveURI +extern __typeof (xmlACatalogResolveURI) xmlACatalogResolveURI __attribute((alias("xmlACatalogResolveURI__internal_alias"))); +#else +#ifndef xmlACatalogResolveURI +extern __typeof (xmlACatalogResolveURI) xmlACatalogResolveURI__internal_alias __attribute((visibility("hidden"))); +#define xmlACatalogResolveURI xmlACatalogResolveURI__internal_alias +#endif +#endif +#endif + +#ifdef bottom_valid +#undef xmlAddAttributeDecl +extern __typeof (xmlAddAttributeDecl) xmlAddAttributeDecl __attribute((alias("xmlAddAttributeDecl__internal_alias"))); +#else +#ifndef xmlAddAttributeDecl +extern __typeof (xmlAddAttributeDecl) xmlAddAttributeDecl__internal_alias __attribute((visibility("hidden"))); +#define xmlAddAttributeDecl xmlAddAttributeDecl__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlAddChild +extern __typeof (xmlAddChild) xmlAddChild __attribute((alias("xmlAddChild__internal_alias"))); +#else +#ifndef xmlAddChild +extern __typeof (xmlAddChild) xmlAddChild__internal_alias __attribute((visibility("hidden"))); +#define xmlAddChild xmlAddChild__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlAddChildList +extern __typeof (xmlAddChildList) xmlAddChildList __attribute((alias("xmlAddChildList__internal_alias"))); +#else +#ifndef xmlAddChildList +extern __typeof (xmlAddChildList) xmlAddChildList__internal_alias __attribute((visibility("hidden"))); +#define xmlAddChildList xmlAddChildList__internal_alias +#endif +#endif + +#ifdef bottom_entities +#undef xmlAddDocEntity +extern __typeof (xmlAddDocEntity) xmlAddDocEntity __attribute((alias("xmlAddDocEntity__internal_alias"))); +#else +#ifndef xmlAddDocEntity +extern __typeof (xmlAddDocEntity) xmlAddDocEntity__internal_alias __attribute((visibility("hidden"))); +#define xmlAddDocEntity xmlAddDocEntity__internal_alias +#endif +#endif + +#ifdef bottom_entities +#undef xmlAddDtdEntity +extern __typeof (xmlAddDtdEntity) xmlAddDtdEntity __attribute((alias("xmlAddDtdEntity__internal_alias"))); +#else +#ifndef xmlAddDtdEntity +extern __typeof (xmlAddDtdEntity) xmlAddDtdEntity__internal_alias __attribute((visibility("hidden"))); +#define xmlAddDtdEntity xmlAddDtdEntity__internal_alias +#endif +#endif + +#ifdef bottom_valid +#undef xmlAddElementDecl +extern __typeof (xmlAddElementDecl) xmlAddElementDecl __attribute((alias("xmlAddElementDecl__internal_alias"))); +#else +#ifndef xmlAddElementDecl +extern __typeof (xmlAddElementDecl) xmlAddElementDecl__internal_alias __attribute((visibility("hidden"))); +#define xmlAddElementDecl xmlAddElementDecl__internal_alias +#endif +#endif + +#ifdef bottom_encoding +#undef xmlAddEncodingAlias +extern __typeof (xmlAddEncodingAlias) xmlAddEncodingAlias __attribute((alias("xmlAddEncodingAlias__internal_alias"))); +#else +#ifndef xmlAddEncodingAlias +extern __typeof (xmlAddEncodingAlias) xmlAddEncodingAlias__internal_alias __attribute((visibility("hidden"))); +#define xmlAddEncodingAlias xmlAddEncodingAlias__internal_alias +#endif +#endif + +#ifdef bottom_valid +#undef xmlAddID +extern __typeof (xmlAddID) xmlAddID __attribute((alias("xmlAddID__internal_alias"))); +#else +#ifndef xmlAddID +extern __typeof (xmlAddID) xmlAddID__internal_alias __attribute((visibility("hidden"))); +#define xmlAddID xmlAddID__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlAddNextSibling +extern __typeof (xmlAddNextSibling) xmlAddNextSibling __attribute((alias("xmlAddNextSibling__internal_alias"))); +#else +#ifndef xmlAddNextSibling +extern __typeof (xmlAddNextSibling) xmlAddNextSibling__internal_alias __attribute((visibility("hidden"))); +#define xmlAddNextSibling xmlAddNextSibling__internal_alias +#endif +#endif + +#ifdef bottom_valid +#undef xmlAddNotationDecl +extern __typeof (xmlAddNotationDecl) xmlAddNotationDecl __attribute((alias("xmlAddNotationDecl__internal_alias"))); +#else +#ifndef xmlAddNotationDecl +extern __typeof (xmlAddNotationDecl) xmlAddNotationDecl__internal_alias __attribute((visibility("hidden"))); +#define xmlAddNotationDecl xmlAddNotationDecl__internal_alias +#endif +#endif + +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_tree +#undef xmlAddPrevSibling +extern __typeof (xmlAddPrevSibling) xmlAddPrevSibling __attribute((alias("xmlAddPrevSibling__internal_alias"))); +#else +#ifndef xmlAddPrevSibling +extern __typeof (xmlAddPrevSibling) xmlAddPrevSibling__internal_alias __attribute((visibility("hidden"))); +#define xmlAddPrevSibling xmlAddPrevSibling__internal_alias +#endif +#endif +#endif + +#ifdef bottom_valid +#undef xmlAddRef +extern __typeof (xmlAddRef) xmlAddRef __attribute((alias("xmlAddRef__internal_alias"))); +#else +#ifndef xmlAddRef +extern __typeof (xmlAddRef) xmlAddRef__internal_alias __attribute((visibility("hidden"))); +#define xmlAddRef xmlAddRef__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlAddSibling +extern __typeof (xmlAddSibling) xmlAddSibling __attribute((alias("xmlAddSibling__internal_alias"))); +#else +#ifndef xmlAddSibling +extern __typeof (xmlAddSibling) xmlAddSibling__internal_alias __attribute((visibility("hidden"))); +#define xmlAddSibling xmlAddSibling__internal_alias +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlIO +#undef xmlAllocOutputBuffer +extern __typeof (xmlAllocOutputBuffer) xmlAllocOutputBuffer __attribute((alias("xmlAllocOutputBuffer__internal_alias"))); +#else +#ifndef xmlAllocOutputBuffer +extern __typeof (xmlAllocOutputBuffer) xmlAllocOutputBuffer__internal_alias __attribute((visibility("hidden"))); +#define xmlAllocOutputBuffer xmlAllocOutputBuffer__internal_alias +#endif +#endif +#endif + +#ifdef bottom_xmlIO +#undef xmlAllocParserInputBuffer +extern __typeof (xmlAllocParserInputBuffer) xmlAllocParserInputBuffer __attribute((alias("xmlAllocParserInputBuffer__internal_alias"))); +#else +#ifndef xmlAllocParserInputBuffer +extern __typeof (xmlAllocParserInputBuffer) xmlAllocParserInputBuffer__internal_alias __attribute((visibility("hidden"))); +#define xmlAllocParserInputBuffer xmlAllocParserInputBuffer__internal_alias +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlsave +#undef xmlAttrSerializeTxtContent +extern __typeof (xmlAttrSerializeTxtContent) xmlAttrSerializeTxtContent __attribute((alias("xmlAttrSerializeTxtContent__internal_alias"))); +#else +#ifndef xmlAttrSerializeTxtContent +extern __typeof (xmlAttrSerializeTxtContent) xmlAttrSerializeTxtContent__internal_alias __attribute((visibility("hidden"))); +#define xmlAttrSerializeTxtContent xmlAttrSerializeTxtContent__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlAutomataCompile +extern __typeof (xmlAutomataCompile) xmlAutomataCompile __attribute((alias("xmlAutomataCompile__internal_alias"))); +#else +#ifndef xmlAutomataCompile +extern __typeof (xmlAutomataCompile) xmlAutomataCompile__internal_alias __attribute((visibility("hidden"))); +#define xmlAutomataCompile xmlAutomataCompile__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlAutomataGetInitState +extern __typeof (xmlAutomataGetInitState) xmlAutomataGetInitState __attribute((alias("xmlAutomataGetInitState__internal_alias"))); +#else +#ifndef xmlAutomataGetInitState +extern __typeof (xmlAutomataGetInitState) xmlAutomataGetInitState__internal_alias __attribute((visibility("hidden"))); +#define xmlAutomataGetInitState xmlAutomataGetInitState__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlAutomataIsDeterminist +extern __typeof (xmlAutomataIsDeterminist) xmlAutomataIsDeterminist __attribute((alias("xmlAutomataIsDeterminist__internal_alias"))); +#else +#ifndef xmlAutomataIsDeterminist +extern __typeof (xmlAutomataIsDeterminist) xmlAutomataIsDeterminist__internal_alias __attribute((visibility("hidden"))); +#define xmlAutomataIsDeterminist xmlAutomataIsDeterminist__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlAutomataNewAllTrans +extern __typeof (xmlAutomataNewAllTrans) xmlAutomataNewAllTrans __attribute((alias("xmlAutomataNewAllTrans__internal_alias"))); +#else +#ifndef xmlAutomataNewAllTrans +extern __typeof (xmlAutomataNewAllTrans) xmlAutomataNewAllTrans__internal_alias __attribute((visibility("hidden"))); +#define xmlAutomataNewAllTrans xmlAutomataNewAllTrans__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlAutomataNewCountTrans +extern __typeof (xmlAutomataNewCountTrans) xmlAutomataNewCountTrans __attribute((alias("xmlAutomataNewCountTrans__internal_alias"))); +#else +#ifndef xmlAutomataNewCountTrans +extern __typeof (xmlAutomataNewCountTrans) xmlAutomataNewCountTrans__internal_alias __attribute((visibility("hidden"))); +#define xmlAutomataNewCountTrans xmlAutomataNewCountTrans__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlAutomataNewCountTrans2 +extern __typeof (xmlAutomataNewCountTrans2) xmlAutomataNewCountTrans2 __attribute((alias("xmlAutomataNewCountTrans2__internal_alias"))); +#else +#ifndef xmlAutomataNewCountTrans2 +extern __typeof (xmlAutomataNewCountTrans2) xmlAutomataNewCountTrans2__internal_alias __attribute((visibility("hidden"))); +#define xmlAutomataNewCountTrans2 xmlAutomataNewCountTrans2__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlAutomataNewCountedTrans +extern __typeof (xmlAutomataNewCountedTrans) xmlAutomataNewCountedTrans __attribute((alias("xmlAutomataNewCountedTrans__internal_alias"))); +#else +#ifndef xmlAutomataNewCountedTrans +extern __typeof (xmlAutomataNewCountedTrans) xmlAutomataNewCountedTrans__internal_alias __attribute((visibility("hidden"))); +#define xmlAutomataNewCountedTrans xmlAutomataNewCountedTrans__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlAutomataNewCounter +extern __typeof (xmlAutomataNewCounter) xmlAutomataNewCounter __attribute((alias("xmlAutomataNewCounter__internal_alias"))); +#else +#ifndef xmlAutomataNewCounter +extern __typeof (xmlAutomataNewCounter) xmlAutomataNewCounter__internal_alias __attribute((visibility("hidden"))); +#define xmlAutomataNewCounter xmlAutomataNewCounter__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlAutomataNewCounterTrans +extern __typeof (xmlAutomataNewCounterTrans) xmlAutomataNewCounterTrans __attribute((alias("xmlAutomataNewCounterTrans__internal_alias"))); +#else +#ifndef xmlAutomataNewCounterTrans +extern __typeof (xmlAutomataNewCounterTrans) xmlAutomataNewCounterTrans__internal_alias __attribute((visibility("hidden"))); +#define xmlAutomataNewCounterTrans xmlAutomataNewCounterTrans__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlAutomataNewEpsilon +extern __typeof (xmlAutomataNewEpsilon) xmlAutomataNewEpsilon __attribute((alias("xmlAutomataNewEpsilon__internal_alias"))); +#else +#ifndef xmlAutomataNewEpsilon +extern __typeof (xmlAutomataNewEpsilon) xmlAutomataNewEpsilon__internal_alias __attribute((visibility("hidden"))); +#define xmlAutomataNewEpsilon xmlAutomataNewEpsilon__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlAutomataNewNegTrans +extern __typeof (xmlAutomataNewNegTrans) xmlAutomataNewNegTrans __attribute((alias("xmlAutomataNewNegTrans__internal_alias"))); +#else +#ifndef xmlAutomataNewNegTrans +extern __typeof (xmlAutomataNewNegTrans) xmlAutomataNewNegTrans__internal_alias __attribute((visibility("hidden"))); +#define xmlAutomataNewNegTrans xmlAutomataNewNegTrans__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlAutomataNewOnceTrans +extern __typeof (xmlAutomataNewOnceTrans) xmlAutomataNewOnceTrans __attribute((alias("xmlAutomataNewOnceTrans__internal_alias"))); +#else +#ifndef xmlAutomataNewOnceTrans +extern __typeof (xmlAutomataNewOnceTrans) xmlAutomataNewOnceTrans__internal_alias __attribute((visibility("hidden"))); +#define xmlAutomataNewOnceTrans xmlAutomataNewOnceTrans__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlAutomataNewOnceTrans2 +extern __typeof (xmlAutomataNewOnceTrans2) xmlAutomataNewOnceTrans2 __attribute((alias("xmlAutomataNewOnceTrans2__internal_alias"))); +#else +#ifndef xmlAutomataNewOnceTrans2 +extern __typeof (xmlAutomataNewOnceTrans2) xmlAutomataNewOnceTrans2__internal_alias __attribute((visibility("hidden"))); +#define xmlAutomataNewOnceTrans2 xmlAutomataNewOnceTrans2__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlAutomataNewState +extern __typeof (xmlAutomataNewState) xmlAutomataNewState __attribute((alias("xmlAutomataNewState__internal_alias"))); +#else +#ifndef xmlAutomataNewState +extern __typeof (xmlAutomataNewState) xmlAutomataNewState__internal_alias __attribute((visibility("hidden"))); +#define xmlAutomataNewState xmlAutomataNewState__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlAutomataNewTransition +extern __typeof (xmlAutomataNewTransition) xmlAutomataNewTransition __attribute((alias("xmlAutomataNewTransition__internal_alias"))); +#else +#ifndef xmlAutomataNewTransition +extern __typeof (xmlAutomataNewTransition) xmlAutomataNewTransition__internal_alias __attribute((visibility("hidden"))); +#define xmlAutomataNewTransition xmlAutomataNewTransition__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlAutomataNewTransition2 +extern __typeof (xmlAutomataNewTransition2) xmlAutomataNewTransition2 __attribute((alias("xmlAutomataNewTransition2__internal_alias"))); +#else +#ifndef xmlAutomataNewTransition2 +extern __typeof (xmlAutomataNewTransition2) xmlAutomataNewTransition2__internal_alias __attribute((visibility("hidden"))); +#define xmlAutomataNewTransition2 xmlAutomataNewTransition2__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlAutomataSetFinalState +extern __typeof (xmlAutomataSetFinalState) xmlAutomataSetFinalState __attribute((alias("xmlAutomataSetFinalState__internal_alias"))); +#else +#ifndef xmlAutomataSetFinalState +extern __typeof (xmlAutomataSetFinalState) xmlAutomataSetFinalState__internal_alias __attribute((visibility("hidden"))); +#define xmlAutomataSetFinalState xmlAutomataSetFinalState__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_DEBUG_ENABLED) +#ifdef bottom_debugXML +#undef xmlBoolToText +extern __typeof (xmlBoolToText) xmlBoolToText __attribute((alias("xmlBoolToText__internal_alias"))); +#else +#ifndef xmlBoolToText +extern __typeof (xmlBoolToText) xmlBoolToText__internal_alias __attribute((visibility("hidden"))); +#define xmlBoolToText xmlBoolToText__internal_alias +#endif +#endif +#endif + +#ifdef bottom_buf +#undef xmlBufContent +extern __typeof (xmlBufContent) xmlBufContent __attribute((alias("xmlBufContent__internal_alias"))); +#else +#ifndef xmlBufContent +extern __typeof (xmlBufContent) xmlBufContent__internal_alias __attribute((visibility("hidden"))); +#define xmlBufContent xmlBufContent__internal_alias +#endif +#endif + +#ifdef bottom_buf +#undef xmlBufEnd +extern __typeof (xmlBufEnd) xmlBufEnd __attribute((alias("xmlBufEnd__internal_alias"))); +#else +#ifndef xmlBufEnd +extern __typeof (xmlBufEnd) xmlBufEnd__internal_alias __attribute((visibility("hidden"))); +#define xmlBufEnd xmlBufEnd__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlBufGetNodeContent +extern __typeof (xmlBufGetNodeContent) xmlBufGetNodeContent __attribute((alias("xmlBufGetNodeContent__internal_alias"))); +#else +#ifndef xmlBufGetNodeContent +extern __typeof (xmlBufGetNodeContent) xmlBufGetNodeContent__internal_alias __attribute((visibility("hidden"))); +#define xmlBufGetNodeContent xmlBufGetNodeContent__internal_alias +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlsave +#undef xmlBufNodeDump +extern __typeof (xmlBufNodeDump) xmlBufNodeDump __attribute((alias("xmlBufNodeDump__internal_alias"))); +#else +#ifndef xmlBufNodeDump +extern __typeof (xmlBufNodeDump) xmlBufNodeDump__internal_alias __attribute((visibility("hidden"))); +#define xmlBufNodeDump xmlBufNodeDump__internal_alias +#endif +#endif +#endif + +#ifdef bottom_buf +#undef xmlBufShrink +extern __typeof (xmlBufShrink) xmlBufShrink __attribute((alias("xmlBufShrink__internal_alias"))); +#else +#ifndef xmlBufShrink +extern __typeof (xmlBufShrink) xmlBufShrink__internal_alias __attribute((visibility("hidden"))); +#define xmlBufShrink xmlBufShrink__internal_alias +#endif +#endif + +#ifdef bottom_buf +#undef xmlBufUse +extern __typeof (xmlBufUse) xmlBufUse __attribute((alias("xmlBufUse__internal_alias"))); +#else +#ifndef xmlBufUse +extern __typeof (xmlBufUse) xmlBufUse__internal_alias __attribute((visibility("hidden"))); +#define xmlBufUse xmlBufUse__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlBufferAdd +extern __typeof (xmlBufferAdd) xmlBufferAdd __attribute((alias("xmlBufferAdd__internal_alias"))); +#else +#ifndef xmlBufferAdd +extern __typeof (xmlBufferAdd) xmlBufferAdd__internal_alias __attribute((visibility("hidden"))); +#define xmlBufferAdd xmlBufferAdd__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlBufferAddHead +extern __typeof (xmlBufferAddHead) xmlBufferAddHead __attribute((alias("xmlBufferAddHead__internal_alias"))); +#else +#ifndef xmlBufferAddHead +extern __typeof (xmlBufferAddHead) xmlBufferAddHead__internal_alias __attribute((visibility("hidden"))); +#define xmlBufferAddHead xmlBufferAddHead__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlBufferCCat +extern __typeof (xmlBufferCCat) xmlBufferCCat __attribute((alias("xmlBufferCCat__internal_alias"))); +#else +#ifndef xmlBufferCCat +extern __typeof (xmlBufferCCat) xmlBufferCCat__internal_alias __attribute((visibility("hidden"))); +#define xmlBufferCCat xmlBufferCCat__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlBufferCat +extern __typeof (xmlBufferCat) xmlBufferCat __attribute((alias("xmlBufferCat__internal_alias"))); +#else +#ifndef xmlBufferCat +extern __typeof (xmlBufferCat) xmlBufferCat__internal_alias __attribute((visibility("hidden"))); +#define xmlBufferCat xmlBufferCat__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlBufferContent +extern __typeof (xmlBufferContent) xmlBufferContent __attribute((alias("xmlBufferContent__internal_alias"))); +#else +#ifndef xmlBufferContent +extern __typeof (xmlBufferContent) xmlBufferContent__internal_alias __attribute((visibility("hidden"))); +#define xmlBufferContent xmlBufferContent__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlBufferCreate +extern __typeof (xmlBufferCreate) xmlBufferCreate __attribute((alias("xmlBufferCreate__internal_alias"))); +#else +#ifndef xmlBufferCreate +extern __typeof (xmlBufferCreate) xmlBufferCreate__internal_alias __attribute((visibility("hidden"))); +#define xmlBufferCreate xmlBufferCreate__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlBufferCreateSize +extern __typeof (xmlBufferCreateSize) xmlBufferCreateSize __attribute((alias("xmlBufferCreateSize__internal_alias"))); +#else +#ifndef xmlBufferCreateSize +extern __typeof (xmlBufferCreateSize) xmlBufferCreateSize__internal_alias __attribute((visibility("hidden"))); +#define xmlBufferCreateSize xmlBufferCreateSize__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlBufferCreateStatic +extern __typeof (xmlBufferCreateStatic) xmlBufferCreateStatic __attribute((alias("xmlBufferCreateStatic__internal_alias"))); +#else +#ifndef xmlBufferCreateStatic +extern __typeof (xmlBufferCreateStatic) xmlBufferCreateStatic__internal_alias __attribute((visibility("hidden"))); +#define xmlBufferCreateStatic xmlBufferCreateStatic__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlBufferDetach +extern __typeof (xmlBufferDetach) xmlBufferDetach __attribute((alias("xmlBufferDetach__internal_alias"))); +#else +#ifndef xmlBufferDetach +extern __typeof (xmlBufferDetach) xmlBufferDetach__internal_alias __attribute((visibility("hidden"))); +#define xmlBufferDetach xmlBufferDetach__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlBufferDump +extern __typeof (xmlBufferDump) xmlBufferDump __attribute((alias("xmlBufferDump__internal_alias"))); +#else +#ifndef xmlBufferDump +extern __typeof (xmlBufferDump) xmlBufferDump__internal_alias __attribute((visibility("hidden"))); +#define xmlBufferDump xmlBufferDump__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlBufferEmpty +extern __typeof (xmlBufferEmpty) xmlBufferEmpty __attribute((alias("xmlBufferEmpty__internal_alias"))); +#else +#ifndef xmlBufferEmpty +extern __typeof (xmlBufferEmpty) xmlBufferEmpty__internal_alias __attribute((visibility("hidden"))); +#define xmlBufferEmpty xmlBufferEmpty__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlBufferFree +extern __typeof (xmlBufferFree) xmlBufferFree __attribute((alias("xmlBufferFree__internal_alias"))); +#else +#ifndef xmlBufferFree +extern __typeof (xmlBufferFree) xmlBufferFree__internal_alias __attribute((visibility("hidden"))); +#define xmlBufferFree xmlBufferFree__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlBufferGrow +extern __typeof (xmlBufferGrow) xmlBufferGrow __attribute((alias("xmlBufferGrow__internal_alias"))); +#else +#ifndef xmlBufferGrow +extern __typeof (xmlBufferGrow) xmlBufferGrow__internal_alias __attribute((visibility("hidden"))); +#define xmlBufferGrow xmlBufferGrow__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlBufferLength +extern __typeof (xmlBufferLength) xmlBufferLength __attribute((alias("xmlBufferLength__internal_alias"))); +#else +#ifndef xmlBufferLength +extern __typeof (xmlBufferLength) xmlBufferLength__internal_alias __attribute((visibility("hidden"))); +#define xmlBufferLength xmlBufferLength__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlBufferResize +extern __typeof (xmlBufferResize) xmlBufferResize __attribute((alias("xmlBufferResize__internal_alias"))); +#else +#ifndef xmlBufferResize +extern __typeof (xmlBufferResize) xmlBufferResize__internal_alias __attribute((visibility("hidden"))); +#define xmlBufferResize xmlBufferResize__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlBufferSetAllocationScheme +extern __typeof (xmlBufferSetAllocationScheme) xmlBufferSetAllocationScheme __attribute((alias("xmlBufferSetAllocationScheme__internal_alias"))); +#else +#ifndef xmlBufferSetAllocationScheme +extern __typeof (xmlBufferSetAllocationScheme) xmlBufferSetAllocationScheme__internal_alias __attribute((visibility("hidden"))); +#define xmlBufferSetAllocationScheme xmlBufferSetAllocationScheme__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlBufferShrink +extern __typeof (xmlBufferShrink) xmlBufferShrink __attribute((alias("xmlBufferShrink__internal_alias"))); +#else +#ifndef xmlBufferShrink +extern __typeof (xmlBufferShrink) xmlBufferShrink__internal_alias __attribute((visibility("hidden"))); +#define xmlBufferShrink xmlBufferShrink__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlBufferWriteCHAR +extern __typeof (xmlBufferWriteCHAR) xmlBufferWriteCHAR __attribute((alias("xmlBufferWriteCHAR__internal_alias"))); +#else +#ifndef xmlBufferWriteCHAR +extern __typeof (xmlBufferWriteCHAR) xmlBufferWriteCHAR__internal_alias __attribute((visibility("hidden"))); +#define xmlBufferWriteCHAR xmlBufferWriteCHAR__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlBufferWriteChar +extern __typeof (xmlBufferWriteChar) xmlBufferWriteChar __attribute((alias("xmlBufferWriteChar__internal_alias"))); +#else +#ifndef xmlBufferWriteChar +extern __typeof (xmlBufferWriteChar) xmlBufferWriteChar__internal_alias __attribute((visibility("hidden"))); +#define xmlBufferWriteChar xmlBufferWriteChar__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlBufferWriteQuotedString +extern __typeof (xmlBufferWriteQuotedString) xmlBufferWriteQuotedString __attribute((alias("xmlBufferWriteQuotedString__internal_alias"))); +#else +#ifndef xmlBufferWriteQuotedString +extern __typeof (xmlBufferWriteQuotedString) xmlBufferWriteQuotedString__internal_alias __attribute((visibility("hidden"))); +#define xmlBufferWriteQuotedString xmlBufferWriteQuotedString__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlBuildQName +extern __typeof (xmlBuildQName) xmlBuildQName __attribute((alias("xmlBuildQName__internal_alias"))); +#else +#ifndef xmlBuildQName +extern __typeof (xmlBuildQName) xmlBuildQName__internal_alias __attribute((visibility("hidden"))); +#define xmlBuildQName xmlBuildQName__internal_alias +#endif +#endif + +#ifdef bottom_uri +#undef xmlBuildRelativeURI +extern __typeof (xmlBuildRelativeURI) xmlBuildRelativeURI __attribute((alias("xmlBuildRelativeURI__internal_alias"))); +#else +#ifndef xmlBuildRelativeURI +extern __typeof (xmlBuildRelativeURI) xmlBuildRelativeURI__internal_alias __attribute((visibility("hidden"))); +#define xmlBuildRelativeURI xmlBuildRelativeURI__internal_alias +#endif +#endif + +#ifdef bottom_uri +#undef xmlBuildURI +extern __typeof (xmlBuildURI) xmlBuildURI __attribute((alias("xmlBuildURI__internal_alias"))); +#else +#ifndef xmlBuildURI +extern __typeof (xmlBuildURI) xmlBuildURI__internal_alias __attribute((visibility("hidden"))); +#define xmlBuildURI xmlBuildURI__internal_alias +#endif +#endif + +#ifdef bottom_encoding +#undef xmlByteConsumed +extern __typeof (xmlByteConsumed) xmlByteConsumed __attribute((alias("xmlByteConsumed__internal_alias"))); +#else +#ifndef xmlByteConsumed +extern __typeof (xmlByteConsumed) xmlByteConsumed__internal_alias __attribute((visibility("hidden"))); +#define xmlByteConsumed xmlByteConsumed__internal_alias +#endif +#endif + +#if defined(LIBXML_C14N_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_c14n +#undef xmlC14NDocDumpMemory +extern __typeof (xmlC14NDocDumpMemory) xmlC14NDocDumpMemory __attribute((alias("xmlC14NDocDumpMemory__internal_alias"))); +#else +#ifndef xmlC14NDocDumpMemory +extern __typeof (xmlC14NDocDumpMemory) xmlC14NDocDumpMemory__internal_alias __attribute((visibility("hidden"))); +#define xmlC14NDocDumpMemory xmlC14NDocDumpMemory__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_C14N_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_c14n +#undef xmlC14NDocSave +extern __typeof (xmlC14NDocSave) xmlC14NDocSave __attribute((alias("xmlC14NDocSave__internal_alias"))); +#else +#ifndef xmlC14NDocSave +extern __typeof (xmlC14NDocSave) xmlC14NDocSave__internal_alias __attribute((visibility("hidden"))); +#define xmlC14NDocSave xmlC14NDocSave__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_C14N_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_c14n +#undef xmlC14NDocSaveTo +extern __typeof (xmlC14NDocSaveTo) xmlC14NDocSaveTo __attribute((alias("xmlC14NDocSaveTo__internal_alias"))); +#else +#ifndef xmlC14NDocSaveTo +extern __typeof (xmlC14NDocSaveTo) xmlC14NDocSaveTo__internal_alias __attribute((visibility("hidden"))); +#define xmlC14NDocSaveTo xmlC14NDocSaveTo__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_C14N_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_c14n +#undef xmlC14NExecute +extern __typeof (xmlC14NExecute) xmlC14NExecute __attribute((alias("xmlC14NExecute__internal_alias"))); +#else +#ifndef xmlC14NExecute +extern __typeof (xmlC14NExecute) xmlC14NExecute__internal_alias __attribute((visibility("hidden"))); +#define xmlC14NExecute xmlC14NExecute__internal_alias +#endif +#endif +#endif + +#ifdef bottom_uri +#undef xmlCanonicPath +extern __typeof (xmlCanonicPath) xmlCanonicPath __attribute((alias("xmlCanonicPath__internal_alias"))); +#else +#ifndef xmlCanonicPath +extern __typeof (xmlCanonicPath) xmlCanonicPath__internal_alias __attribute((visibility("hidden"))); +#define xmlCanonicPath xmlCanonicPath__internal_alias +#endif +#endif + +#if defined(LIBXML_CATALOG_ENABLED) +#ifdef bottom_catalog +#undef xmlCatalogAdd +extern __typeof (xmlCatalogAdd) xmlCatalogAdd __attribute((alias("xmlCatalogAdd__internal_alias"))); +#else +#ifndef xmlCatalogAdd +extern __typeof (xmlCatalogAdd) xmlCatalogAdd__internal_alias __attribute((visibility("hidden"))); +#define xmlCatalogAdd xmlCatalogAdd__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_CATALOG_ENABLED) +#ifdef bottom_catalog +#undef xmlCatalogAddLocal +extern __typeof (xmlCatalogAddLocal) xmlCatalogAddLocal __attribute((alias("xmlCatalogAddLocal__internal_alias"))); +#else +#ifndef xmlCatalogAddLocal +extern __typeof (xmlCatalogAddLocal) xmlCatalogAddLocal__internal_alias __attribute((visibility("hidden"))); +#define xmlCatalogAddLocal xmlCatalogAddLocal__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_CATALOG_ENABLED) +#ifdef bottom_catalog +#undef xmlCatalogCleanup +extern __typeof (xmlCatalogCleanup) xmlCatalogCleanup __attribute((alias("xmlCatalogCleanup__internal_alias"))); +#else +#ifndef xmlCatalogCleanup +extern __typeof (xmlCatalogCleanup) xmlCatalogCleanup__internal_alias __attribute((visibility("hidden"))); +#define xmlCatalogCleanup xmlCatalogCleanup__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_CATALOG_ENABLED) +#ifdef bottom_catalog +#undef xmlCatalogConvert +extern __typeof (xmlCatalogConvert) xmlCatalogConvert __attribute((alias("xmlCatalogConvert__internal_alias"))); +#else +#ifndef xmlCatalogConvert +extern __typeof (xmlCatalogConvert) xmlCatalogConvert__internal_alias __attribute((visibility("hidden"))); +#define xmlCatalogConvert xmlCatalogConvert__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_CATALOG_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_catalog +#undef xmlCatalogDump +extern __typeof (xmlCatalogDump) xmlCatalogDump __attribute((alias("xmlCatalogDump__internal_alias"))); +#else +#ifndef xmlCatalogDump +extern __typeof (xmlCatalogDump) xmlCatalogDump__internal_alias __attribute((visibility("hidden"))); +#define xmlCatalogDump xmlCatalogDump__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_CATALOG_ENABLED) +#ifdef bottom_catalog +#undef xmlCatalogFreeLocal +extern __typeof (xmlCatalogFreeLocal) xmlCatalogFreeLocal __attribute((alias("xmlCatalogFreeLocal__internal_alias"))); +#else +#ifndef xmlCatalogFreeLocal +extern __typeof (xmlCatalogFreeLocal) xmlCatalogFreeLocal__internal_alias __attribute((visibility("hidden"))); +#define xmlCatalogFreeLocal xmlCatalogFreeLocal__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_CATALOG_ENABLED) +#ifdef bottom_catalog +#undef xmlCatalogGetDefaults +extern __typeof (xmlCatalogGetDefaults) xmlCatalogGetDefaults __attribute((alias("xmlCatalogGetDefaults__internal_alias"))); +#else +#ifndef xmlCatalogGetDefaults +extern __typeof (xmlCatalogGetDefaults) xmlCatalogGetDefaults__internal_alias __attribute((visibility("hidden"))); +#define xmlCatalogGetDefaults xmlCatalogGetDefaults__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_CATALOG_ENABLED) +#ifdef bottom_catalog +#undef xmlCatalogGetPublic +extern __typeof (xmlCatalogGetPublic) xmlCatalogGetPublic __attribute((alias("xmlCatalogGetPublic__internal_alias"))); +#else +#ifndef xmlCatalogGetPublic +extern __typeof (xmlCatalogGetPublic) xmlCatalogGetPublic__internal_alias __attribute((visibility("hidden"))); +#define xmlCatalogGetPublic xmlCatalogGetPublic__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_CATALOG_ENABLED) +#ifdef bottom_catalog +#undef xmlCatalogGetSystem +extern __typeof (xmlCatalogGetSystem) xmlCatalogGetSystem __attribute((alias("xmlCatalogGetSystem__internal_alias"))); +#else +#ifndef xmlCatalogGetSystem +extern __typeof (xmlCatalogGetSystem) xmlCatalogGetSystem__internal_alias __attribute((visibility("hidden"))); +#define xmlCatalogGetSystem xmlCatalogGetSystem__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_CATALOG_ENABLED) +#ifdef bottom_catalog +#undef xmlCatalogIsEmpty +extern __typeof (xmlCatalogIsEmpty) xmlCatalogIsEmpty __attribute((alias("xmlCatalogIsEmpty__internal_alias"))); +#else +#ifndef xmlCatalogIsEmpty +extern __typeof (xmlCatalogIsEmpty) xmlCatalogIsEmpty__internal_alias __attribute((visibility("hidden"))); +#define xmlCatalogIsEmpty xmlCatalogIsEmpty__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_CATALOG_ENABLED) +#ifdef bottom_catalog +#undef xmlCatalogLocalResolve +extern __typeof (xmlCatalogLocalResolve) xmlCatalogLocalResolve __attribute((alias("xmlCatalogLocalResolve__internal_alias"))); +#else +#ifndef xmlCatalogLocalResolve +extern __typeof (xmlCatalogLocalResolve) xmlCatalogLocalResolve__internal_alias __attribute((visibility("hidden"))); +#define xmlCatalogLocalResolve xmlCatalogLocalResolve__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_CATALOG_ENABLED) +#ifdef bottom_catalog +#undef xmlCatalogLocalResolveURI +extern __typeof (xmlCatalogLocalResolveURI) xmlCatalogLocalResolveURI __attribute((alias("xmlCatalogLocalResolveURI__internal_alias"))); +#else +#ifndef xmlCatalogLocalResolveURI +extern __typeof (xmlCatalogLocalResolveURI) xmlCatalogLocalResolveURI__internal_alias __attribute((visibility("hidden"))); +#define xmlCatalogLocalResolveURI xmlCatalogLocalResolveURI__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_CATALOG_ENABLED) +#ifdef bottom_catalog +#undef xmlCatalogRemove +extern __typeof (xmlCatalogRemove) xmlCatalogRemove __attribute((alias("xmlCatalogRemove__internal_alias"))); +#else +#ifndef xmlCatalogRemove +extern __typeof (xmlCatalogRemove) xmlCatalogRemove__internal_alias __attribute((visibility("hidden"))); +#define xmlCatalogRemove xmlCatalogRemove__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_CATALOG_ENABLED) +#ifdef bottom_catalog +#undef xmlCatalogResolve +extern __typeof (xmlCatalogResolve) xmlCatalogResolve __attribute((alias("xmlCatalogResolve__internal_alias"))); +#else +#ifndef xmlCatalogResolve +extern __typeof (xmlCatalogResolve) xmlCatalogResolve__internal_alias __attribute((visibility("hidden"))); +#define xmlCatalogResolve xmlCatalogResolve__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_CATALOG_ENABLED) +#ifdef bottom_catalog +#undef xmlCatalogResolvePublic +extern __typeof (xmlCatalogResolvePublic) xmlCatalogResolvePublic __attribute((alias("xmlCatalogResolvePublic__internal_alias"))); +#else +#ifndef xmlCatalogResolvePublic +extern __typeof (xmlCatalogResolvePublic) xmlCatalogResolvePublic__internal_alias __attribute((visibility("hidden"))); +#define xmlCatalogResolvePublic xmlCatalogResolvePublic__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_CATALOG_ENABLED) +#ifdef bottom_catalog +#undef xmlCatalogResolveSystem +extern __typeof (xmlCatalogResolveSystem) xmlCatalogResolveSystem __attribute((alias("xmlCatalogResolveSystem__internal_alias"))); +#else +#ifndef xmlCatalogResolveSystem +extern __typeof (xmlCatalogResolveSystem) xmlCatalogResolveSystem__internal_alias __attribute((visibility("hidden"))); +#define xmlCatalogResolveSystem xmlCatalogResolveSystem__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_CATALOG_ENABLED) +#ifdef bottom_catalog +#undef xmlCatalogResolveURI +extern __typeof (xmlCatalogResolveURI) xmlCatalogResolveURI __attribute((alias("xmlCatalogResolveURI__internal_alias"))); +#else +#ifndef xmlCatalogResolveURI +extern __typeof (xmlCatalogResolveURI) xmlCatalogResolveURI__internal_alias __attribute((visibility("hidden"))); +#define xmlCatalogResolveURI xmlCatalogResolveURI__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_CATALOG_ENABLED) +#ifdef bottom_catalog +#undef xmlCatalogSetDebug +extern __typeof (xmlCatalogSetDebug) xmlCatalogSetDebug __attribute((alias("xmlCatalogSetDebug__internal_alias"))); +#else +#ifndef xmlCatalogSetDebug +extern __typeof (xmlCatalogSetDebug) xmlCatalogSetDebug__internal_alias __attribute((visibility("hidden"))); +#define xmlCatalogSetDebug xmlCatalogSetDebug__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_CATALOG_ENABLED) +#ifdef bottom_catalog +#undef xmlCatalogSetDefaultPrefer +extern __typeof (xmlCatalogSetDefaultPrefer) xmlCatalogSetDefaultPrefer __attribute((alias("xmlCatalogSetDefaultPrefer__internal_alias"))); +#else +#ifndef xmlCatalogSetDefaultPrefer +extern __typeof (xmlCatalogSetDefaultPrefer) xmlCatalogSetDefaultPrefer__internal_alias __attribute((visibility("hidden"))); +#define xmlCatalogSetDefaultPrefer xmlCatalogSetDefaultPrefer__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_CATALOG_ENABLED) +#ifdef bottom_catalog +#undef xmlCatalogSetDefaults +extern __typeof (xmlCatalogSetDefaults) xmlCatalogSetDefaults __attribute((alias("xmlCatalogSetDefaults__internal_alias"))); +#else +#ifndef xmlCatalogSetDefaults +extern __typeof (xmlCatalogSetDefaults) xmlCatalogSetDefaults__internal_alias __attribute((visibility("hidden"))); +#define xmlCatalogSetDefaults xmlCatalogSetDefaults__internal_alias +#endif +#endif +#endif + +#ifdef bottom_encoding +#undef xmlCharEncCloseFunc +extern __typeof (xmlCharEncCloseFunc) xmlCharEncCloseFunc __attribute((alias("xmlCharEncCloseFunc__internal_alias"))); +#else +#ifndef xmlCharEncCloseFunc +extern __typeof (xmlCharEncCloseFunc) xmlCharEncCloseFunc__internal_alias __attribute((visibility("hidden"))); +#define xmlCharEncCloseFunc xmlCharEncCloseFunc__internal_alias +#endif +#endif + +#ifdef bottom_encoding +#undef xmlCharEncFirstLine +extern __typeof (xmlCharEncFirstLine) xmlCharEncFirstLine __attribute((alias("xmlCharEncFirstLine__internal_alias"))); +#else +#ifndef xmlCharEncFirstLine +extern __typeof (xmlCharEncFirstLine) xmlCharEncFirstLine__internal_alias __attribute((visibility("hidden"))); +#define xmlCharEncFirstLine xmlCharEncFirstLine__internal_alias +#endif +#endif + +#ifdef bottom_encoding +#undef xmlCharEncInFunc +extern __typeof (xmlCharEncInFunc) xmlCharEncInFunc __attribute((alias("xmlCharEncInFunc__internal_alias"))); +#else +#ifndef xmlCharEncInFunc +extern __typeof (xmlCharEncInFunc) xmlCharEncInFunc__internal_alias __attribute((visibility("hidden"))); +#define xmlCharEncInFunc xmlCharEncInFunc__internal_alias +#endif +#endif + +#ifdef bottom_encoding +#undef xmlCharEncOutFunc +extern __typeof (xmlCharEncOutFunc) xmlCharEncOutFunc __attribute((alias("xmlCharEncOutFunc__internal_alias"))); +#else +#ifndef xmlCharEncOutFunc +extern __typeof (xmlCharEncOutFunc) xmlCharEncOutFunc__internal_alias __attribute((visibility("hidden"))); +#define xmlCharEncOutFunc xmlCharEncOutFunc__internal_alias +#endif +#endif + +#ifdef bottom_chvalid +#undef xmlCharInRange +extern __typeof (xmlCharInRange) xmlCharInRange __attribute((alias("xmlCharInRange__internal_alias"))); +#else +#ifndef xmlCharInRange +extern __typeof (xmlCharInRange) xmlCharInRange__internal_alias __attribute((visibility("hidden"))); +#define xmlCharInRange xmlCharInRange__internal_alias +#endif +#endif + +#ifdef bottom_xmlstring +#undef xmlCharStrdup +extern __typeof (xmlCharStrdup) xmlCharStrdup __attribute((alias("xmlCharStrdup__internal_alias"))); +#else +#ifndef xmlCharStrdup +extern __typeof (xmlCharStrdup) xmlCharStrdup__internal_alias __attribute((visibility("hidden"))); +#define xmlCharStrdup xmlCharStrdup__internal_alias +#endif +#endif + +#ifdef bottom_xmlstring +#undef xmlCharStrndup +extern __typeof (xmlCharStrndup) xmlCharStrndup __attribute((alias("xmlCharStrndup__internal_alias"))); +#else +#ifndef xmlCharStrndup +extern __typeof (xmlCharStrndup) xmlCharStrndup__internal_alias __attribute((visibility("hidden"))); +#define xmlCharStrndup xmlCharStrndup__internal_alias +#endif +#endif + +#ifdef bottom_xmlIO +#undef xmlCheckFilename +extern __typeof (xmlCheckFilename) xmlCheckFilename __attribute((alias("xmlCheckFilename__internal_alias"))); +#else +#ifndef xmlCheckFilename +extern __typeof (xmlCheckFilename) xmlCheckFilename__internal_alias __attribute((visibility("hidden"))); +#define xmlCheckFilename xmlCheckFilename__internal_alias +#endif +#endif + +#ifdef bottom_xmlIO +#undef xmlCheckHTTPInput +extern __typeof (xmlCheckHTTPInput) xmlCheckHTTPInput __attribute((alias("xmlCheckHTTPInput__internal_alias"))); +#else +#ifndef xmlCheckHTTPInput +extern __typeof (xmlCheckHTTPInput) xmlCheckHTTPInput__internal_alias __attribute((visibility("hidden"))); +#define xmlCheckHTTPInput xmlCheckHTTPInput__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlCheckLanguageID +extern __typeof (xmlCheckLanguageID) xmlCheckLanguageID __attribute((alias("xmlCheckLanguageID__internal_alias"))); +#else +#ifndef xmlCheckLanguageID +extern __typeof (xmlCheckLanguageID) xmlCheckLanguageID__internal_alias __attribute((visibility("hidden"))); +#define xmlCheckLanguageID xmlCheckLanguageID__internal_alias +#endif +#endif + +#ifdef bottom_xmlstring +#undef xmlCheckUTF8 +extern __typeof (xmlCheckUTF8) xmlCheckUTF8 __attribute((alias("xmlCheckUTF8__internal_alias"))); +#else +#ifndef xmlCheckUTF8 +extern __typeof (xmlCheckUTF8) xmlCheckUTF8__internal_alias __attribute((visibility("hidden"))); +#define xmlCheckUTF8 xmlCheckUTF8__internal_alias +#endif +#endif + +#ifdef bottom_parserInternals +#undef xmlCheckVersion +extern __typeof (xmlCheckVersion) xmlCheckVersion __attribute((alias("xmlCheckVersion__internal_alias"))); +#else +#ifndef xmlCheckVersion +extern __typeof (xmlCheckVersion) xmlCheckVersion__internal_alias __attribute((visibility("hidden"))); +#define xmlCheckVersion xmlCheckVersion__internal_alias +#endif +#endif + +#if defined(LIBXML_TREE_ENABLED) +#ifdef bottom_tree +#undef xmlChildElementCount +extern __typeof (xmlChildElementCount) xmlChildElementCount __attribute((alias("xmlChildElementCount__internal_alias"))); +#else +#ifndef xmlChildElementCount +extern __typeof (xmlChildElementCount) xmlChildElementCount__internal_alias __attribute((visibility("hidden"))); +#define xmlChildElementCount xmlChildElementCount__internal_alias +#endif +#endif +#endif + +#ifdef bottom_encoding +#undef xmlCleanupCharEncodingHandlers +extern __typeof (xmlCleanupCharEncodingHandlers) xmlCleanupCharEncodingHandlers __attribute((alias("xmlCleanupCharEncodingHandlers__internal_alias"))); +#else +#ifndef xmlCleanupCharEncodingHandlers +extern __typeof (xmlCleanupCharEncodingHandlers) xmlCleanupCharEncodingHandlers__internal_alias __attribute((visibility("hidden"))); +#define xmlCleanupCharEncodingHandlers xmlCleanupCharEncodingHandlers__internal_alias +#endif +#endif + +#ifdef bottom_encoding +#undef xmlCleanupEncodingAliases +extern __typeof (xmlCleanupEncodingAliases) xmlCleanupEncodingAliases __attribute((alias("xmlCleanupEncodingAliases__internal_alias"))); +#else +#ifndef xmlCleanupEncodingAliases +extern __typeof (xmlCleanupEncodingAliases) xmlCleanupEncodingAliases__internal_alias __attribute((visibility("hidden"))); +#define xmlCleanupEncodingAliases xmlCleanupEncodingAliases__internal_alias +#endif +#endif + +#ifdef bottom_globals +#undef xmlCleanupGlobals +extern __typeof (xmlCleanupGlobals) xmlCleanupGlobals __attribute((alias("xmlCleanupGlobals__internal_alias"))); +#else +#ifndef xmlCleanupGlobals +extern __typeof (xmlCleanupGlobals) xmlCleanupGlobals__internal_alias __attribute((visibility("hidden"))); +#define xmlCleanupGlobals xmlCleanupGlobals__internal_alias +#endif +#endif + +#ifdef bottom_xmlIO +#undef xmlCleanupInputCallbacks +extern __typeof (xmlCleanupInputCallbacks) xmlCleanupInputCallbacks __attribute((alias("xmlCleanupInputCallbacks__internal_alias"))); +#else +#ifndef xmlCleanupInputCallbacks +extern __typeof (xmlCleanupInputCallbacks) xmlCleanupInputCallbacks__internal_alias __attribute((visibility("hidden"))); +#define xmlCleanupInputCallbacks xmlCleanupInputCallbacks__internal_alias +#endif +#endif + +#ifdef bottom_xmlmemory +#undef xmlCleanupMemory +extern __typeof (xmlCleanupMemory) xmlCleanupMemory __attribute((alias("xmlCleanupMemory__internal_alias"))); +#else +#ifndef xmlCleanupMemory +extern __typeof (xmlCleanupMemory) xmlCleanupMemory__internal_alias __attribute((visibility("hidden"))); +#define xmlCleanupMemory xmlCleanupMemory__internal_alias +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlIO +#undef xmlCleanupOutputCallbacks +extern __typeof (xmlCleanupOutputCallbacks) xmlCleanupOutputCallbacks __attribute((alias("xmlCleanupOutputCallbacks__internal_alias"))); +#else +#ifndef xmlCleanupOutputCallbacks +extern __typeof (xmlCleanupOutputCallbacks) xmlCleanupOutputCallbacks__internal_alias __attribute((visibility("hidden"))); +#define xmlCleanupOutputCallbacks xmlCleanupOutputCallbacks__internal_alias +#endif +#endif +#endif + +#ifdef bottom_parser +#undef xmlCleanupParser +extern __typeof (xmlCleanupParser) xmlCleanupParser __attribute((alias("xmlCleanupParser__internal_alias"))); +#else +#ifndef xmlCleanupParser +extern __typeof (xmlCleanupParser) xmlCleanupParser__internal_alias __attribute((visibility("hidden"))); +#define xmlCleanupParser xmlCleanupParser__internal_alias +#endif +#endif + +#if defined(LIBXML_LEGACY_ENABLED) +#ifdef bottom_legacy +#undef xmlCleanupPredefinedEntities +extern __typeof (xmlCleanupPredefinedEntities) xmlCleanupPredefinedEntities __attribute((alias("xmlCleanupPredefinedEntities__internal_alias"))); +#else +#ifndef xmlCleanupPredefinedEntities +extern __typeof (xmlCleanupPredefinedEntities) xmlCleanupPredefinedEntities__internal_alias __attribute((visibility("hidden"))); +#define xmlCleanupPredefinedEntities xmlCleanupPredefinedEntities__internal_alias +#endif +#endif +#endif + +#ifdef bottom_threads +#undef xmlCleanupThreads +extern __typeof (xmlCleanupThreads) xmlCleanupThreads __attribute((alias("xmlCleanupThreads__internal_alias"))); +#else +#ifndef xmlCleanupThreads +extern __typeof (xmlCleanupThreads) xmlCleanupThreads__internal_alias __attribute((visibility("hidden"))); +#define xmlCleanupThreads xmlCleanupThreads__internal_alias +#endif +#endif + +#ifdef bottom_parserInternals +#undef xmlClearNodeInfoSeq +extern __typeof (xmlClearNodeInfoSeq) xmlClearNodeInfoSeq __attribute((alias("xmlClearNodeInfoSeq__internal_alias"))); +#else +#ifndef xmlClearNodeInfoSeq +extern __typeof (xmlClearNodeInfoSeq) xmlClearNodeInfoSeq__internal_alias __attribute((visibility("hidden"))); +#define xmlClearNodeInfoSeq xmlClearNodeInfoSeq__internal_alias +#endif +#endif + +#ifdef bottom_parserInternals +#undef xmlClearParserCtxt +extern __typeof (xmlClearParserCtxt) xmlClearParserCtxt __attribute((alias("xmlClearParserCtxt__internal_alias"))); +#else +#ifndef xmlClearParserCtxt +extern __typeof (xmlClearParserCtxt) xmlClearParserCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlClearParserCtxt xmlClearParserCtxt__internal_alias +#endif +#endif + +#if defined(LIBXML_CATALOG_ENABLED) +#ifdef bottom_catalog +#undef xmlConvertSGMLCatalog +extern __typeof (xmlConvertSGMLCatalog) xmlConvertSGMLCatalog __attribute((alias("xmlConvertSGMLCatalog__internal_alias"))); +#else +#ifndef xmlConvertSGMLCatalog +extern __typeof (xmlConvertSGMLCatalog) xmlConvertSGMLCatalog__internal_alias __attribute((visibility("hidden"))); +#define xmlConvertSGMLCatalog xmlConvertSGMLCatalog__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_TREE_ENABLED) +#ifdef bottom_valid +#undef xmlCopyAttributeTable +extern __typeof (xmlCopyAttributeTable) xmlCopyAttributeTable __attribute((alias("xmlCopyAttributeTable__internal_alias"))); +#else +#ifndef xmlCopyAttributeTable +extern __typeof (xmlCopyAttributeTable) xmlCopyAttributeTable__internal_alias __attribute((visibility("hidden"))); +#define xmlCopyAttributeTable xmlCopyAttributeTable__internal_alias +#endif +#endif +#endif + +#ifdef bottom_parserInternals +#undef xmlCopyChar +extern __typeof (xmlCopyChar) xmlCopyChar __attribute((alias("xmlCopyChar__internal_alias"))); +#else +#ifndef xmlCopyChar +extern __typeof (xmlCopyChar) xmlCopyChar__internal_alias __attribute((visibility("hidden"))); +#define xmlCopyChar xmlCopyChar__internal_alias +#endif +#endif + +#ifdef bottom_parserInternals +#undef xmlCopyCharMultiByte +extern __typeof (xmlCopyCharMultiByte) xmlCopyCharMultiByte __attribute((alias("xmlCopyCharMultiByte__internal_alias"))); +#else +#ifndef xmlCopyCharMultiByte +extern __typeof (xmlCopyCharMultiByte) xmlCopyCharMultiByte__internal_alias __attribute((visibility("hidden"))); +#define xmlCopyCharMultiByte xmlCopyCharMultiByte__internal_alias +#endif +#endif + +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_tree +#undef xmlCopyDoc +extern __typeof (xmlCopyDoc) xmlCopyDoc __attribute((alias("xmlCopyDoc__internal_alias"))); +#else +#ifndef xmlCopyDoc +extern __typeof (xmlCopyDoc) xmlCopyDoc__internal_alias __attribute((visibility("hidden"))); +#define xmlCopyDoc xmlCopyDoc__internal_alias +#endif +#endif +#endif + +#ifdef bottom_valid +#undef xmlCopyDocElementContent +extern __typeof (xmlCopyDocElementContent) xmlCopyDocElementContent __attribute((alias("xmlCopyDocElementContent__internal_alias"))); +#else +#ifndef xmlCopyDocElementContent +extern __typeof (xmlCopyDocElementContent) xmlCopyDocElementContent__internal_alias __attribute((visibility("hidden"))); +#define xmlCopyDocElementContent xmlCopyDocElementContent__internal_alias +#endif +#endif + +#if defined(LIBXML_TREE_ENABLED) +#ifdef bottom_tree +#undef xmlCopyDtd +extern __typeof (xmlCopyDtd) xmlCopyDtd __attribute((alias("xmlCopyDtd__internal_alias"))); +#else +#ifndef xmlCopyDtd +extern __typeof (xmlCopyDtd) xmlCopyDtd__internal_alias __attribute((visibility("hidden"))); +#define xmlCopyDtd xmlCopyDtd__internal_alias +#endif +#endif +#endif + +#ifdef bottom_valid +#undef xmlCopyElementContent +extern __typeof (xmlCopyElementContent) xmlCopyElementContent __attribute((alias("xmlCopyElementContent__internal_alias"))); +#else +#ifndef xmlCopyElementContent +extern __typeof (xmlCopyElementContent) xmlCopyElementContent__internal_alias __attribute((visibility("hidden"))); +#define xmlCopyElementContent xmlCopyElementContent__internal_alias +#endif +#endif + +#if defined(LIBXML_TREE_ENABLED) +#ifdef bottom_valid +#undef xmlCopyElementTable +extern __typeof (xmlCopyElementTable) xmlCopyElementTable __attribute((alias("xmlCopyElementTable__internal_alias"))); +#else +#ifndef xmlCopyElementTable +extern __typeof (xmlCopyElementTable) xmlCopyElementTable__internal_alias __attribute((visibility("hidden"))); +#define xmlCopyElementTable xmlCopyElementTable__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_TREE_ENABLED) +#ifdef bottom_entities +#undef xmlCopyEntitiesTable +extern __typeof (xmlCopyEntitiesTable) xmlCopyEntitiesTable __attribute((alias("xmlCopyEntitiesTable__internal_alias"))); +#else +#ifndef xmlCopyEntitiesTable +extern __typeof (xmlCopyEntitiesTable) xmlCopyEntitiesTable__internal_alias __attribute((visibility("hidden"))); +#define xmlCopyEntitiesTable xmlCopyEntitiesTable__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_TREE_ENABLED) +#ifdef bottom_valid +#undef xmlCopyEnumeration +extern __typeof (xmlCopyEnumeration) xmlCopyEnumeration __attribute((alias("xmlCopyEnumeration__internal_alias"))); +#else +#ifndef xmlCopyEnumeration +extern __typeof (xmlCopyEnumeration) xmlCopyEnumeration__internal_alias __attribute((visibility("hidden"))); +#define xmlCopyEnumeration xmlCopyEnumeration__internal_alias +#endif +#endif +#endif + +#ifdef bottom_error +#undef xmlCopyError +extern __typeof (xmlCopyError) xmlCopyError __attribute((alias("xmlCopyError__internal_alias"))); +#else +#ifndef xmlCopyError +extern __typeof (xmlCopyError) xmlCopyError__internal_alias __attribute((visibility("hidden"))); +#define xmlCopyError xmlCopyError__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlCopyNamespace +extern __typeof (xmlCopyNamespace) xmlCopyNamespace __attribute((alias("xmlCopyNamespace__internal_alias"))); +#else +#ifndef xmlCopyNamespace +extern __typeof (xmlCopyNamespace) xmlCopyNamespace__internal_alias __attribute((visibility("hidden"))); +#define xmlCopyNamespace xmlCopyNamespace__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlCopyNamespaceList +extern __typeof (xmlCopyNamespaceList) xmlCopyNamespaceList __attribute((alias("xmlCopyNamespaceList__internal_alias"))); +#else +#ifndef xmlCopyNamespaceList +extern __typeof (xmlCopyNamespaceList) xmlCopyNamespaceList__internal_alias __attribute((visibility("hidden"))); +#define xmlCopyNamespaceList xmlCopyNamespaceList__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlCopyNode +extern __typeof (xmlCopyNode) xmlCopyNode __attribute((alias("xmlCopyNode__internal_alias"))); +#else +#ifndef xmlCopyNode +extern __typeof (xmlCopyNode) xmlCopyNode__internal_alias __attribute((visibility("hidden"))); +#define xmlCopyNode xmlCopyNode__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlCopyNodeList +extern __typeof (xmlCopyNodeList) xmlCopyNodeList __attribute((alias("xmlCopyNodeList__internal_alias"))); +#else +#ifndef xmlCopyNodeList +extern __typeof (xmlCopyNodeList) xmlCopyNodeList__internal_alias __attribute((visibility("hidden"))); +#define xmlCopyNodeList xmlCopyNodeList__internal_alias +#endif +#endif + +#if defined(LIBXML_TREE_ENABLED) +#ifdef bottom_valid +#undef xmlCopyNotationTable +extern __typeof (xmlCopyNotationTable) xmlCopyNotationTable __attribute((alias("xmlCopyNotationTable__internal_alias"))); +#else +#ifndef xmlCopyNotationTable +extern __typeof (xmlCopyNotationTable) xmlCopyNotationTable__internal_alias __attribute((visibility("hidden"))); +#define xmlCopyNotationTable xmlCopyNotationTable__internal_alias +#endif +#endif +#endif + +#ifdef bottom_tree +#undef xmlCopyProp +extern __typeof (xmlCopyProp) xmlCopyProp __attribute((alias("xmlCopyProp__internal_alias"))); +#else +#ifndef xmlCopyProp +extern __typeof (xmlCopyProp) xmlCopyProp__internal_alias __attribute((visibility("hidden"))); +#define xmlCopyProp xmlCopyProp__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlCopyPropList +extern __typeof (xmlCopyPropList) xmlCopyPropList __attribute((alias("xmlCopyPropList__internal_alias"))); +#else +#ifndef xmlCopyPropList +extern __typeof (xmlCopyPropList) xmlCopyPropList__internal_alias __attribute((visibility("hidden"))); +#define xmlCopyPropList xmlCopyPropList__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlCreateDocParserCtxt +extern __typeof (xmlCreateDocParserCtxt) xmlCreateDocParserCtxt __attribute((alias("xmlCreateDocParserCtxt__internal_alias"))); +#else +#ifndef xmlCreateDocParserCtxt +extern __typeof (xmlCreateDocParserCtxt) xmlCreateDocParserCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlCreateDocParserCtxt xmlCreateDocParserCtxt__internal_alias +#endif +#endif + +#ifdef bottom_entities +#undef xmlCreateEntitiesTable +extern __typeof (xmlCreateEntitiesTable) xmlCreateEntitiesTable __attribute((alias("xmlCreateEntitiesTable__internal_alias"))); +#else +#ifndef xmlCreateEntitiesTable +extern __typeof (xmlCreateEntitiesTable) xmlCreateEntitiesTable__internal_alias __attribute((visibility("hidden"))); +#define xmlCreateEntitiesTable xmlCreateEntitiesTable__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlCreateEntityParserCtxt +extern __typeof (xmlCreateEntityParserCtxt) xmlCreateEntityParserCtxt __attribute((alias("xmlCreateEntityParserCtxt__internal_alias"))); +#else +#ifndef xmlCreateEntityParserCtxt +extern __typeof (xmlCreateEntityParserCtxt) xmlCreateEntityParserCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlCreateEntityParserCtxt xmlCreateEntityParserCtxt__internal_alias +#endif +#endif + +#ifdef bottom_valid +#undef xmlCreateEnumeration +extern __typeof (xmlCreateEnumeration) xmlCreateEnumeration __attribute((alias("xmlCreateEnumeration__internal_alias"))); +#else +#ifndef xmlCreateEnumeration +extern __typeof (xmlCreateEnumeration) xmlCreateEnumeration__internal_alias __attribute((visibility("hidden"))); +#define xmlCreateEnumeration xmlCreateEnumeration__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlCreateFileParserCtxt +extern __typeof (xmlCreateFileParserCtxt) xmlCreateFileParserCtxt __attribute((alias("xmlCreateFileParserCtxt__internal_alias"))); +#else +#ifndef xmlCreateFileParserCtxt +extern __typeof (xmlCreateFileParserCtxt) xmlCreateFileParserCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlCreateFileParserCtxt xmlCreateFileParserCtxt__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlCreateIOParserCtxt +extern __typeof (xmlCreateIOParserCtxt) xmlCreateIOParserCtxt __attribute((alias("xmlCreateIOParserCtxt__internal_alias"))); +#else +#ifndef xmlCreateIOParserCtxt +extern __typeof (xmlCreateIOParserCtxt) xmlCreateIOParserCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlCreateIOParserCtxt xmlCreateIOParserCtxt__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlCreateIntSubset +extern __typeof (xmlCreateIntSubset) xmlCreateIntSubset __attribute((alias("xmlCreateIntSubset__internal_alias"))); +#else +#ifndef xmlCreateIntSubset +extern __typeof (xmlCreateIntSubset) xmlCreateIntSubset__internal_alias __attribute((visibility("hidden"))); +#define xmlCreateIntSubset xmlCreateIntSubset__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlCreateMemoryParserCtxt +extern __typeof (xmlCreateMemoryParserCtxt) xmlCreateMemoryParserCtxt __attribute((alias("xmlCreateMemoryParserCtxt__internal_alias"))); +#else +#ifndef xmlCreateMemoryParserCtxt +extern __typeof (xmlCreateMemoryParserCtxt) xmlCreateMemoryParserCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlCreateMemoryParserCtxt xmlCreateMemoryParserCtxt__internal_alias +#endif +#endif + +#if defined(LIBXML_PUSH_ENABLED) +#ifdef bottom_parser +#undef xmlCreatePushParserCtxt +extern __typeof (xmlCreatePushParserCtxt) xmlCreatePushParserCtxt __attribute((alias("xmlCreatePushParserCtxt__internal_alias"))); +#else +#ifndef xmlCreatePushParserCtxt +extern __typeof (xmlCreatePushParserCtxt) xmlCreatePushParserCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlCreatePushParserCtxt xmlCreatePushParserCtxt__internal_alias +#endif +#endif +#endif + +#ifdef bottom_uri +#undef xmlCreateURI +extern __typeof (xmlCreateURI) xmlCreateURI __attribute((alias("xmlCreateURI__internal_alias"))); +#else +#ifndef xmlCreateURI +extern __typeof (xmlCreateURI) xmlCreateURI__internal_alias __attribute((visibility("hidden"))); +#define xmlCreateURI xmlCreateURI__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlCreateURLParserCtxt +extern __typeof (xmlCreateURLParserCtxt) xmlCreateURLParserCtxt __attribute((alias("xmlCreateURLParserCtxt__internal_alias"))); +#else +#ifndef xmlCreateURLParserCtxt +extern __typeof (xmlCreateURLParserCtxt) xmlCreateURLParserCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlCreateURLParserCtxt xmlCreateURLParserCtxt__internal_alias +#endif +#endif + +#ifdef bottom_error +#undef xmlCtxtGetLastError +extern __typeof (xmlCtxtGetLastError) xmlCtxtGetLastError __attribute((alias("xmlCtxtGetLastError__internal_alias"))); +#else +#ifndef xmlCtxtGetLastError +extern __typeof (xmlCtxtGetLastError) xmlCtxtGetLastError__internal_alias __attribute((visibility("hidden"))); +#define xmlCtxtGetLastError xmlCtxtGetLastError__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlCtxtReadDoc +extern __typeof (xmlCtxtReadDoc) xmlCtxtReadDoc __attribute((alias("xmlCtxtReadDoc__internal_alias"))); +#else +#ifndef xmlCtxtReadDoc +extern __typeof (xmlCtxtReadDoc) xmlCtxtReadDoc__internal_alias __attribute((visibility("hidden"))); +#define xmlCtxtReadDoc xmlCtxtReadDoc__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlCtxtReadFd +extern __typeof (xmlCtxtReadFd) xmlCtxtReadFd __attribute((alias("xmlCtxtReadFd__internal_alias"))); +#else +#ifndef xmlCtxtReadFd +extern __typeof (xmlCtxtReadFd) xmlCtxtReadFd__internal_alias __attribute((visibility("hidden"))); +#define xmlCtxtReadFd xmlCtxtReadFd__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlCtxtReadFile +extern __typeof (xmlCtxtReadFile) xmlCtxtReadFile __attribute((alias("xmlCtxtReadFile__internal_alias"))); +#else +#ifndef xmlCtxtReadFile +extern __typeof (xmlCtxtReadFile) xmlCtxtReadFile__internal_alias __attribute((visibility("hidden"))); +#define xmlCtxtReadFile xmlCtxtReadFile__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlCtxtReadIO +extern __typeof (xmlCtxtReadIO) xmlCtxtReadIO __attribute((alias("xmlCtxtReadIO__internal_alias"))); +#else +#ifndef xmlCtxtReadIO +extern __typeof (xmlCtxtReadIO) xmlCtxtReadIO__internal_alias __attribute((visibility("hidden"))); +#define xmlCtxtReadIO xmlCtxtReadIO__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlCtxtReadMemory +extern __typeof (xmlCtxtReadMemory) xmlCtxtReadMemory __attribute((alias("xmlCtxtReadMemory__internal_alias"))); +#else +#ifndef xmlCtxtReadMemory +extern __typeof (xmlCtxtReadMemory) xmlCtxtReadMemory__internal_alias __attribute((visibility("hidden"))); +#define xmlCtxtReadMemory xmlCtxtReadMemory__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlCtxtReset +extern __typeof (xmlCtxtReset) xmlCtxtReset __attribute((alias("xmlCtxtReset__internal_alias"))); +#else +#ifndef xmlCtxtReset +extern __typeof (xmlCtxtReset) xmlCtxtReset__internal_alias __attribute((visibility("hidden"))); +#define xmlCtxtReset xmlCtxtReset__internal_alias +#endif +#endif + +#ifdef bottom_error +#undef xmlCtxtResetLastError +extern __typeof (xmlCtxtResetLastError) xmlCtxtResetLastError __attribute((alias("xmlCtxtResetLastError__internal_alias"))); +#else +#ifndef xmlCtxtResetLastError +extern __typeof (xmlCtxtResetLastError) xmlCtxtResetLastError__internal_alias __attribute((visibility("hidden"))); +#define xmlCtxtResetLastError xmlCtxtResetLastError__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlCtxtResetPush +extern __typeof (xmlCtxtResetPush) xmlCtxtResetPush __attribute((alias("xmlCtxtResetPush__internal_alias"))); +#else +#ifndef xmlCtxtResetPush +extern __typeof (xmlCtxtResetPush) xmlCtxtResetPush__internal_alias __attribute((visibility("hidden"))); +#define xmlCtxtResetPush xmlCtxtResetPush__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlCtxtUseOptions +extern __typeof (xmlCtxtUseOptions) xmlCtxtUseOptions __attribute((alias("xmlCtxtUseOptions__internal_alias"))); +#else +#ifndef xmlCtxtUseOptions +extern __typeof (xmlCtxtUseOptions) xmlCtxtUseOptions__internal_alias __attribute((visibility("hidden"))); +#define xmlCtxtUseOptions xmlCtxtUseOptions__internal_alias +#endif +#endif + +#ifdef bottom_parserInternals +#undef xmlCurrentChar +extern __typeof (xmlCurrentChar) xmlCurrentChar __attribute((alias("xmlCurrentChar__internal_alias"))); +#else +#ifndef xmlCurrentChar +extern __typeof (xmlCurrentChar) xmlCurrentChar__internal_alias __attribute((visibility("hidden"))); +#define xmlCurrentChar xmlCurrentChar__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlDOMWrapAdoptNode +extern __typeof (xmlDOMWrapAdoptNode) xmlDOMWrapAdoptNode __attribute((alias("xmlDOMWrapAdoptNode__internal_alias"))); +#else +#ifndef xmlDOMWrapAdoptNode +extern __typeof (xmlDOMWrapAdoptNode) xmlDOMWrapAdoptNode__internal_alias __attribute((visibility("hidden"))); +#define xmlDOMWrapAdoptNode xmlDOMWrapAdoptNode__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlDOMWrapCloneNode +extern __typeof (xmlDOMWrapCloneNode) xmlDOMWrapCloneNode __attribute((alias("xmlDOMWrapCloneNode__internal_alias"))); +#else +#ifndef xmlDOMWrapCloneNode +extern __typeof (xmlDOMWrapCloneNode) xmlDOMWrapCloneNode__internal_alias __attribute((visibility("hidden"))); +#define xmlDOMWrapCloneNode xmlDOMWrapCloneNode__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlDOMWrapFreeCtxt +extern __typeof (xmlDOMWrapFreeCtxt) xmlDOMWrapFreeCtxt __attribute((alias("xmlDOMWrapFreeCtxt__internal_alias"))); +#else +#ifndef xmlDOMWrapFreeCtxt +extern __typeof (xmlDOMWrapFreeCtxt) xmlDOMWrapFreeCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlDOMWrapFreeCtxt xmlDOMWrapFreeCtxt__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlDOMWrapNewCtxt +extern __typeof (xmlDOMWrapNewCtxt) xmlDOMWrapNewCtxt __attribute((alias("xmlDOMWrapNewCtxt__internal_alias"))); +#else +#ifndef xmlDOMWrapNewCtxt +extern __typeof (xmlDOMWrapNewCtxt) xmlDOMWrapNewCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlDOMWrapNewCtxt xmlDOMWrapNewCtxt__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlDOMWrapReconcileNamespaces +extern __typeof (xmlDOMWrapReconcileNamespaces) xmlDOMWrapReconcileNamespaces __attribute((alias("xmlDOMWrapReconcileNamespaces__internal_alias"))); +#else +#ifndef xmlDOMWrapReconcileNamespaces +extern __typeof (xmlDOMWrapReconcileNamespaces) xmlDOMWrapReconcileNamespaces__internal_alias __attribute((visibility("hidden"))); +#define xmlDOMWrapReconcileNamespaces xmlDOMWrapReconcileNamespaces__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlDOMWrapRemoveNode +extern __typeof (xmlDOMWrapRemoveNode) xmlDOMWrapRemoveNode __attribute((alias("xmlDOMWrapRemoveNode__internal_alias"))); +#else +#ifndef xmlDOMWrapRemoveNode +extern __typeof (xmlDOMWrapRemoveNode) xmlDOMWrapRemoveNode__internal_alias __attribute((visibility("hidden"))); +#define xmlDOMWrapRemoveNode xmlDOMWrapRemoveNode__internal_alias +#endif +#endif + +#if defined(LIBXML_DEBUG_ENABLED) +#ifdef bottom_debugXML +#undef xmlDebugCheckDocument +extern __typeof (xmlDebugCheckDocument) xmlDebugCheckDocument __attribute((alias("xmlDebugCheckDocument__internal_alias"))); +#else +#ifndef xmlDebugCheckDocument +extern __typeof (xmlDebugCheckDocument) xmlDebugCheckDocument__internal_alias __attribute((visibility("hidden"))); +#define xmlDebugCheckDocument xmlDebugCheckDocument__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_DEBUG_ENABLED) +#ifdef bottom_debugXML +#undef xmlDebugDumpAttr +extern __typeof (xmlDebugDumpAttr) xmlDebugDumpAttr __attribute((alias("xmlDebugDumpAttr__internal_alias"))); +#else +#ifndef xmlDebugDumpAttr +extern __typeof (xmlDebugDumpAttr) xmlDebugDumpAttr__internal_alias __attribute((visibility("hidden"))); +#define xmlDebugDumpAttr xmlDebugDumpAttr__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_DEBUG_ENABLED) +#ifdef bottom_debugXML +#undef xmlDebugDumpAttrList +extern __typeof (xmlDebugDumpAttrList) xmlDebugDumpAttrList __attribute((alias("xmlDebugDumpAttrList__internal_alias"))); +#else +#ifndef xmlDebugDumpAttrList +extern __typeof (xmlDebugDumpAttrList) xmlDebugDumpAttrList__internal_alias __attribute((visibility("hidden"))); +#define xmlDebugDumpAttrList xmlDebugDumpAttrList__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_DEBUG_ENABLED) +#ifdef bottom_debugXML +#undef xmlDebugDumpDTD +extern __typeof (xmlDebugDumpDTD) xmlDebugDumpDTD __attribute((alias("xmlDebugDumpDTD__internal_alias"))); +#else +#ifndef xmlDebugDumpDTD +extern __typeof (xmlDebugDumpDTD) xmlDebugDumpDTD__internal_alias __attribute((visibility("hidden"))); +#define xmlDebugDumpDTD xmlDebugDumpDTD__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_DEBUG_ENABLED) +#ifdef bottom_debugXML +#undef xmlDebugDumpDocument +extern __typeof (xmlDebugDumpDocument) xmlDebugDumpDocument __attribute((alias("xmlDebugDumpDocument__internal_alias"))); +#else +#ifndef xmlDebugDumpDocument +extern __typeof (xmlDebugDumpDocument) xmlDebugDumpDocument__internal_alias __attribute((visibility("hidden"))); +#define xmlDebugDumpDocument xmlDebugDumpDocument__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_DEBUG_ENABLED) +#ifdef bottom_debugXML +#undef xmlDebugDumpDocumentHead +extern __typeof (xmlDebugDumpDocumentHead) xmlDebugDumpDocumentHead __attribute((alias("xmlDebugDumpDocumentHead__internal_alias"))); +#else +#ifndef xmlDebugDumpDocumentHead +extern __typeof (xmlDebugDumpDocumentHead) xmlDebugDumpDocumentHead__internal_alias __attribute((visibility("hidden"))); +#define xmlDebugDumpDocumentHead xmlDebugDumpDocumentHead__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_DEBUG_ENABLED) +#ifdef bottom_debugXML +#undef xmlDebugDumpEntities +extern __typeof (xmlDebugDumpEntities) xmlDebugDumpEntities __attribute((alias("xmlDebugDumpEntities__internal_alias"))); +#else +#ifndef xmlDebugDumpEntities +extern __typeof (xmlDebugDumpEntities) xmlDebugDumpEntities__internal_alias __attribute((visibility("hidden"))); +#define xmlDebugDumpEntities xmlDebugDumpEntities__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_DEBUG_ENABLED) +#ifdef bottom_debugXML +#undef xmlDebugDumpNode +extern __typeof (xmlDebugDumpNode) xmlDebugDumpNode __attribute((alias("xmlDebugDumpNode__internal_alias"))); +#else +#ifndef xmlDebugDumpNode +extern __typeof (xmlDebugDumpNode) xmlDebugDumpNode__internal_alias __attribute((visibility("hidden"))); +#define xmlDebugDumpNode xmlDebugDumpNode__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_DEBUG_ENABLED) +#ifdef bottom_debugXML +#undef xmlDebugDumpNodeList +extern __typeof (xmlDebugDumpNodeList) xmlDebugDumpNodeList __attribute((alias("xmlDebugDumpNodeList__internal_alias"))); +#else +#ifndef xmlDebugDumpNodeList +extern __typeof (xmlDebugDumpNodeList) xmlDebugDumpNodeList__internal_alias __attribute((visibility("hidden"))); +#define xmlDebugDumpNodeList xmlDebugDumpNodeList__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_DEBUG_ENABLED) +#ifdef bottom_debugXML +#undef xmlDebugDumpOneNode +extern __typeof (xmlDebugDumpOneNode) xmlDebugDumpOneNode __attribute((alias("xmlDebugDumpOneNode__internal_alias"))); +#else +#ifndef xmlDebugDumpOneNode +extern __typeof (xmlDebugDumpOneNode) xmlDebugDumpOneNode__internal_alias __attribute((visibility("hidden"))); +#define xmlDebugDumpOneNode xmlDebugDumpOneNode__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_DEBUG_ENABLED) +#ifdef bottom_debugXML +#undef xmlDebugDumpString +extern __typeof (xmlDebugDumpString) xmlDebugDumpString __attribute((alias("xmlDebugDumpString__internal_alias"))); +#else +#ifndef xmlDebugDumpString +extern __typeof (xmlDebugDumpString) xmlDebugDumpString__internal_alias __attribute((visibility("hidden"))); +#define xmlDebugDumpString xmlDebugDumpString__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_LEGACY_ENABLED) +#ifdef bottom_legacy +#undef xmlDecodeEntities +extern __typeof (xmlDecodeEntities) xmlDecodeEntities __attribute((alias("xmlDecodeEntities__internal_alias"))); +#else +#ifndef xmlDecodeEntities +extern __typeof (xmlDecodeEntities) xmlDecodeEntities__internal_alias __attribute((visibility("hidden"))); +#define xmlDecodeEntities xmlDecodeEntities__internal_alias +#endif +#endif +#endif + +#ifdef bottom_SAX2 +#undef xmlDefaultSAXHandlerInit +extern __typeof (xmlDefaultSAXHandlerInit) xmlDefaultSAXHandlerInit __attribute((alias("xmlDefaultSAXHandlerInit__internal_alias"))); +#else +#ifndef xmlDefaultSAXHandlerInit +extern __typeof (xmlDefaultSAXHandlerInit) xmlDefaultSAXHandlerInit__internal_alias __attribute((visibility("hidden"))); +#define xmlDefaultSAXHandlerInit xmlDefaultSAXHandlerInit__internal_alias +#endif +#endif + +#ifdef bottom_encoding +#undef xmlDelEncodingAlias +extern __typeof (xmlDelEncodingAlias) xmlDelEncodingAlias __attribute((alias("xmlDelEncodingAlias__internal_alias"))); +#else +#ifndef xmlDelEncodingAlias +extern __typeof (xmlDelEncodingAlias) xmlDelEncodingAlias__internal_alias __attribute((visibility("hidden"))); +#define xmlDelEncodingAlias xmlDelEncodingAlias__internal_alias +#endif +#endif + +#ifdef bottom_globals +#undef xmlDeregisterNodeDefault +extern __typeof (xmlDeregisterNodeDefault) xmlDeregisterNodeDefault __attribute((alias("xmlDeregisterNodeDefault__internal_alias"))); +#else +#ifndef xmlDeregisterNodeDefault +extern __typeof (xmlDeregisterNodeDefault) xmlDeregisterNodeDefault__internal_alias __attribute((visibility("hidden"))); +#define xmlDeregisterNodeDefault xmlDeregisterNodeDefault__internal_alias +#endif +#endif + +#ifdef bottom_encoding +#undef xmlDetectCharEncoding +extern __typeof (xmlDetectCharEncoding) xmlDetectCharEncoding __attribute((alias("xmlDetectCharEncoding__internal_alias"))); +#else +#ifndef xmlDetectCharEncoding +extern __typeof (xmlDetectCharEncoding) xmlDetectCharEncoding__internal_alias __attribute((visibility("hidden"))); +#define xmlDetectCharEncoding xmlDetectCharEncoding__internal_alias +#endif +#endif + +#ifdef bottom_dict +#undef xmlDictCleanup +extern __typeof (xmlDictCleanup) xmlDictCleanup __attribute((alias("xmlDictCleanup__internal_alias"))); +#else +#ifndef xmlDictCleanup +extern __typeof (xmlDictCleanup) xmlDictCleanup__internal_alias __attribute((visibility("hidden"))); +#define xmlDictCleanup xmlDictCleanup__internal_alias +#endif +#endif + +#ifdef bottom_dict +#undef xmlDictCreate +extern __typeof (xmlDictCreate) xmlDictCreate __attribute((alias("xmlDictCreate__internal_alias"))); +#else +#ifndef xmlDictCreate +extern __typeof (xmlDictCreate) xmlDictCreate__internal_alias __attribute((visibility("hidden"))); +#define xmlDictCreate xmlDictCreate__internal_alias +#endif +#endif + +#ifdef bottom_dict +#undef xmlDictCreateSub +extern __typeof (xmlDictCreateSub) xmlDictCreateSub __attribute((alias("xmlDictCreateSub__internal_alias"))); +#else +#ifndef xmlDictCreateSub +extern __typeof (xmlDictCreateSub) xmlDictCreateSub__internal_alias __attribute((visibility("hidden"))); +#define xmlDictCreateSub xmlDictCreateSub__internal_alias +#endif +#endif + +#ifdef bottom_dict +#undef xmlDictExists +extern __typeof (xmlDictExists) xmlDictExists __attribute((alias("xmlDictExists__internal_alias"))); +#else +#ifndef xmlDictExists +extern __typeof (xmlDictExists) xmlDictExists__internal_alias __attribute((visibility("hidden"))); +#define xmlDictExists xmlDictExists__internal_alias +#endif +#endif + +#ifdef bottom_dict +#undef xmlDictFree +extern __typeof (xmlDictFree) xmlDictFree __attribute((alias("xmlDictFree__internal_alias"))); +#else +#ifndef xmlDictFree +extern __typeof (xmlDictFree) xmlDictFree__internal_alias __attribute((visibility("hidden"))); +#define xmlDictFree xmlDictFree__internal_alias +#endif +#endif + +#ifdef bottom_dict +#undef xmlDictGetUsage +extern __typeof (xmlDictGetUsage) xmlDictGetUsage __attribute((alias("xmlDictGetUsage__internal_alias"))); +#else +#ifndef xmlDictGetUsage +extern __typeof (xmlDictGetUsage) xmlDictGetUsage__internal_alias __attribute((visibility("hidden"))); +#define xmlDictGetUsage xmlDictGetUsage__internal_alias +#endif +#endif + +#ifdef bottom_dict +#undef xmlDictLookup +extern __typeof (xmlDictLookup) xmlDictLookup __attribute((alias("xmlDictLookup__internal_alias"))); +#else +#ifndef xmlDictLookup +extern __typeof (xmlDictLookup) xmlDictLookup__internal_alias __attribute((visibility("hidden"))); +#define xmlDictLookup xmlDictLookup__internal_alias +#endif +#endif + +#ifdef bottom_dict +#undef xmlDictOwns +extern __typeof (xmlDictOwns) xmlDictOwns __attribute((alias("xmlDictOwns__internal_alias"))); +#else +#ifndef xmlDictOwns +extern __typeof (xmlDictOwns) xmlDictOwns__internal_alias __attribute((visibility("hidden"))); +#define xmlDictOwns xmlDictOwns__internal_alias +#endif +#endif + +#ifdef bottom_dict +#undef xmlDictQLookup +extern __typeof (xmlDictQLookup) xmlDictQLookup __attribute((alias("xmlDictQLookup__internal_alias"))); +#else +#ifndef xmlDictQLookup +extern __typeof (xmlDictQLookup) xmlDictQLookup__internal_alias __attribute((visibility("hidden"))); +#define xmlDictQLookup xmlDictQLookup__internal_alias +#endif +#endif + +#ifdef bottom_dict +#undef xmlDictReference +extern __typeof (xmlDictReference) xmlDictReference __attribute((alias("xmlDictReference__internal_alias"))); +#else +#ifndef xmlDictReference +extern __typeof (xmlDictReference) xmlDictReference__internal_alias __attribute((visibility("hidden"))); +#define xmlDictReference xmlDictReference__internal_alias +#endif +#endif + +#ifdef bottom_dict +#undef xmlDictSetLimit +extern __typeof (xmlDictSetLimit) xmlDictSetLimit __attribute((alias("xmlDictSetLimit__internal_alias"))); +#else +#ifndef xmlDictSetLimit +extern __typeof (xmlDictSetLimit) xmlDictSetLimit__internal_alias __attribute((visibility("hidden"))); +#define xmlDictSetLimit xmlDictSetLimit__internal_alias +#endif +#endif + +#ifdef bottom_dict +#undef xmlDictSize +extern __typeof (xmlDictSize) xmlDictSize __attribute((alias("xmlDictSize__internal_alias"))); +#else +#ifndef xmlDictSize +extern __typeof (xmlDictSize) xmlDictSize__internal_alias __attribute((visibility("hidden"))); +#define xmlDictSize xmlDictSize__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlDocCopyNode +extern __typeof (xmlDocCopyNode) xmlDocCopyNode __attribute((alias("xmlDocCopyNode__internal_alias"))); +#else +#ifndef xmlDocCopyNode +extern __typeof (xmlDocCopyNode) xmlDocCopyNode__internal_alias __attribute((visibility("hidden"))); +#define xmlDocCopyNode xmlDocCopyNode__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlDocCopyNodeList +extern __typeof (xmlDocCopyNodeList) xmlDocCopyNodeList __attribute((alias("xmlDocCopyNodeList__internal_alias"))); +#else +#ifndef xmlDocCopyNodeList +extern __typeof (xmlDocCopyNodeList) xmlDocCopyNodeList__internal_alias __attribute((visibility("hidden"))); +#define xmlDocCopyNodeList xmlDocCopyNodeList__internal_alias +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlsave +#undef xmlDocDump +extern __typeof (xmlDocDump) xmlDocDump __attribute((alias("xmlDocDump__internal_alias"))); +#else +#ifndef xmlDocDump +extern __typeof (xmlDocDump) xmlDocDump__internal_alias __attribute((visibility("hidden"))); +#define xmlDocDump xmlDocDump__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlsave +#undef xmlDocDumpFormatMemory +extern __typeof (xmlDocDumpFormatMemory) xmlDocDumpFormatMemory __attribute((alias("xmlDocDumpFormatMemory__internal_alias"))); +#else +#ifndef xmlDocDumpFormatMemory +extern __typeof (xmlDocDumpFormatMemory) xmlDocDumpFormatMemory__internal_alias __attribute((visibility("hidden"))); +#define xmlDocDumpFormatMemory xmlDocDumpFormatMemory__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlsave +#undef xmlDocDumpFormatMemoryEnc +extern __typeof (xmlDocDumpFormatMemoryEnc) xmlDocDumpFormatMemoryEnc __attribute((alias("xmlDocDumpFormatMemoryEnc__internal_alias"))); +#else +#ifndef xmlDocDumpFormatMemoryEnc +extern __typeof (xmlDocDumpFormatMemoryEnc) xmlDocDumpFormatMemoryEnc__internal_alias __attribute((visibility("hidden"))); +#define xmlDocDumpFormatMemoryEnc xmlDocDumpFormatMemoryEnc__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlsave +#undef xmlDocDumpMemory +extern __typeof (xmlDocDumpMemory) xmlDocDumpMemory __attribute((alias("xmlDocDumpMemory__internal_alias"))); +#else +#ifndef xmlDocDumpMemory +extern __typeof (xmlDocDumpMemory) xmlDocDumpMemory__internal_alias __attribute((visibility("hidden"))); +#define xmlDocDumpMemory xmlDocDumpMemory__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlsave +#undef xmlDocDumpMemoryEnc +extern __typeof (xmlDocDumpMemoryEnc) xmlDocDumpMemoryEnc __attribute((alias("xmlDocDumpMemoryEnc__internal_alias"))); +#else +#ifndef xmlDocDumpMemoryEnc +extern __typeof (xmlDocDumpMemoryEnc) xmlDocDumpMemoryEnc__internal_alias __attribute((visibility("hidden"))); +#define xmlDocDumpMemoryEnc xmlDocDumpMemoryEnc__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlsave +#undef xmlDocFormatDump +extern __typeof (xmlDocFormatDump) xmlDocFormatDump __attribute((alias("xmlDocFormatDump__internal_alias"))); +#else +#ifndef xmlDocFormatDump +extern __typeof (xmlDocFormatDump) xmlDocFormatDump__internal_alias __attribute((visibility("hidden"))); +#define xmlDocFormatDump xmlDocFormatDump__internal_alias +#endif +#endif +#endif + +#ifdef bottom_tree +#undef xmlDocGetRootElement +extern __typeof (xmlDocGetRootElement) xmlDocGetRootElement __attribute((alias("xmlDocGetRootElement__internal_alias"))); +#else +#ifndef xmlDocGetRootElement +extern __typeof (xmlDocGetRootElement) xmlDocGetRootElement__internal_alias __attribute((visibility("hidden"))); +#define xmlDocGetRootElement xmlDocGetRootElement__internal_alias +#endif +#endif + +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_tree +#undef xmlDocSetRootElement +extern __typeof (xmlDocSetRootElement) xmlDocSetRootElement __attribute((alias("xmlDocSetRootElement__internal_alias"))); +#else +#ifndef xmlDocSetRootElement +extern __typeof (xmlDocSetRootElement) xmlDocSetRootElement__internal_alias __attribute((visibility("hidden"))); +#define xmlDocSetRootElement xmlDocSetRootElement__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_valid +#undef xmlDumpAttributeDecl +extern __typeof (xmlDumpAttributeDecl) xmlDumpAttributeDecl __attribute((alias("xmlDumpAttributeDecl__internal_alias"))); +#else +#ifndef xmlDumpAttributeDecl +extern __typeof (xmlDumpAttributeDecl) xmlDumpAttributeDecl__internal_alias __attribute((visibility("hidden"))); +#define xmlDumpAttributeDecl xmlDumpAttributeDecl__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_valid +#undef xmlDumpAttributeTable +extern __typeof (xmlDumpAttributeTable) xmlDumpAttributeTable __attribute((alias("xmlDumpAttributeTable__internal_alias"))); +#else +#ifndef xmlDumpAttributeTable +extern __typeof (xmlDumpAttributeTable) xmlDumpAttributeTable__internal_alias __attribute((visibility("hidden"))); +#define xmlDumpAttributeTable xmlDumpAttributeTable__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_valid +#undef xmlDumpElementDecl +extern __typeof (xmlDumpElementDecl) xmlDumpElementDecl __attribute((alias("xmlDumpElementDecl__internal_alias"))); +#else +#ifndef xmlDumpElementDecl +extern __typeof (xmlDumpElementDecl) xmlDumpElementDecl__internal_alias __attribute((visibility("hidden"))); +#define xmlDumpElementDecl xmlDumpElementDecl__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_valid +#undef xmlDumpElementTable +extern __typeof (xmlDumpElementTable) xmlDumpElementTable __attribute((alias("xmlDumpElementTable__internal_alias"))); +#else +#ifndef xmlDumpElementTable +extern __typeof (xmlDumpElementTable) xmlDumpElementTable__internal_alias __attribute((visibility("hidden"))); +#define xmlDumpElementTable xmlDumpElementTable__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_entities +#undef xmlDumpEntitiesTable +extern __typeof (xmlDumpEntitiesTable) xmlDumpEntitiesTable __attribute((alias("xmlDumpEntitiesTable__internal_alias"))); +#else +#ifndef xmlDumpEntitiesTable +extern __typeof (xmlDumpEntitiesTable) xmlDumpEntitiesTable__internal_alias __attribute((visibility("hidden"))); +#define xmlDumpEntitiesTable xmlDumpEntitiesTable__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_entities +#undef xmlDumpEntityDecl +extern __typeof (xmlDumpEntityDecl) xmlDumpEntityDecl __attribute((alias("xmlDumpEntityDecl__internal_alias"))); +#else +#ifndef xmlDumpEntityDecl +extern __typeof (xmlDumpEntityDecl) xmlDumpEntityDecl__internal_alias __attribute((visibility("hidden"))); +#define xmlDumpEntityDecl xmlDumpEntityDecl__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_valid +#undef xmlDumpNotationDecl +extern __typeof (xmlDumpNotationDecl) xmlDumpNotationDecl __attribute((alias("xmlDumpNotationDecl__internal_alias"))); +#else +#ifndef xmlDumpNotationDecl +extern __typeof (xmlDumpNotationDecl) xmlDumpNotationDecl__internal_alias __attribute((visibility("hidden"))); +#define xmlDumpNotationDecl xmlDumpNotationDecl__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_valid +#undef xmlDumpNotationTable +extern __typeof (xmlDumpNotationTable) xmlDumpNotationTable __attribute((alias("xmlDumpNotationTable__internal_alias"))); +#else +#ifndef xmlDumpNotationTable +extern __typeof (xmlDumpNotationTable) xmlDumpNotationTable__internal_alias __attribute((visibility("hidden"))); +#define xmlDumpNotationTable xmlDumpNotationTable__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlsave +#undef xmlElemDump +extern __typeof (xmlElemDump) xmlElemDump __attribute((alias("xmlElemDump__internal_alias"))); +#else +#ifndef xmlElemDump +extern __typeof (xmlElemDump) xmlElemDump__internal_alias __attribute((visibility("hidden"))); +#define xmlElemDump xmlElemDump__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_LEGACY_ENABLED) +#ifdef bottom_legacy +#undef xmlEncodeEntities +extern __typeof (xmlEncodeEntities) xmlEncodeEntities __attribute((alias("xmlEncodeEntities__internal_alias"))); +#else +#ifndef xmlEncodeEntities +extern __typeof (xmlEncodeEntities) xmlEncodeEntities__internal_alias __attribute((visibility("hidden"))); +#define xmlEncodeEntities xmlEncodeEntities__internal_alias +#endif +#endif +#endif + +#ifdef bottom_entities +#undef xmlEncodeEntitiesReentrant +extern __typeof (xmlEncodeEntitiesReentrant) xmlEncodeEntitiesReentrant __attribute((alias("xmlEncodeEntitiesReentrant__internal_alias"))); +#else +#ifndef xmlEncodeEntitiesReentrant +extern __typeof (xmlEncodeEntitiesReentrant) xmlEncodeEntitiesReentrant__internal_alias __attribute((visibility("hidden"))); +#define xmlEncodeEntitiesReentrant xmlEncodeEntitiesReentrant__internal_alias +#endif +#endif + +#ifdef bottom_entities +#undef xmlEncodeSpecialChars +extern __typeof (xmlEncodeSpecialChars) xmlEncodeSpecialChars __attribute((alias("xmlEncodeSpecialChars__internal_alias"))); +#else +#ifndef xmlEncodeSpecialChars +extern __typeof (xmlEncodeSpecialChars) xmlEncodeSpecialChars__internal_alias __attribute((visibility("hidden"))); +#define xmlEncodeSpecialChars xmlEncodeSpecialChars__internal_alias +#endif +#endif + +#ifdef bottom_parserInternals +#undef xmlErrMemory +extern __typeof (xmlErrMemory) xmlErrMemory __attribute((alias("xmlErrMemory__internal_alias"))); +#else +#ifndef xmlErrMemory +extern __typeof (xmlErrMemory) xmlErrMemory__internal_alias __attribute((visibility("hidden"))); +#define xmlErrMemory xmlErrMemory__internal_alias +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlExpCtxtNbCons +extern __typeof (xmlExpCtxtNbCons) xmlExpCtxtNbCons __attribute((alias("xmlExpCtxtNbCons__internal_alias"))); +#else +#ifndef xmlExpCtxtNbCons +extern __typeof (xmlExpCtxtNbCons) xmlExpCtxtNbCons__internal_alias __attribute((visibility("hidden"))); +#define xmlExpCtxtNbCons xmlExpCtxtNbCons__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlExpCtxtNbNodes +extern __typeof (xmlExpCtxtNbNodes) xmlExpCtxtNbNodes __attribute((alias("xmlExpCtxtNbNodes__internal_alias"))); +#else +#ifndef xmlExpCtxtNbNodes +extern __typeof (xmlExpCtxtNbNodes) xmlExpCtxtNbNodes__internal_alias __attribute((visibility("hidden"))); +#define xmlExpCtxtNbNodes xmlExpCtxtNbNodes__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlExpDump +extern __typeof (xmlExpDump) xmlExpDump __attribute((alias("xmlExpDump__internal_alias"))); +#else +#ifndef xmlExpDump +extern __typeof (xmlExpDump) xmlExpDump__internal_alias __attribute((visibility("hidden"))); +#define xmlExpDump xmlExpDump__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlExpExpDerive +extern __typeof (xmlExpExpDerive) xmlExpExpDerive __attribute((alias("xmlExpExpDerive__internal_alias"))); +#else +#ifndef xmlExpExpDerive +extern __typeof (xmlExpExpDerive) xmlExpExpDerive__internal_alias __attribute((visibility("hidden"))); +#define xmlExpExpDerive xmlExpExpDerive__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlExpFree +extern __typeof (xmlExpFree) xmlExpFree __attribute((alias("xmlExpFree__internal_alias"))); +#else +#ifndef xmlExpFree +extern __typeof (xmlExpFree) xmlExpFree__internal_alias __attribute((visibility("hidden"))); +#define xmlExpFree xmlExpFree__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlExpFreeCtxt +extern __typeof (xmlExpFreeCtxt) xmlExpFreeCtxt __attribute((alias("xmlExpFreeCtxt__internal_alias"))); +#else +#ifndef xmlExpFreeCtxt +extern __typeof (xmlExpFreeCtxt) xmlExpFreeCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlExpFreeCtxt xmlExpFreeCtxt__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlExpGetLanguage +extern __typeof (xmlExpGetLanguage) xmlExpGetLanguage __attribute((alias("xmlExpGetLanguage__internal_alias"))); +#else +#ifndef xmlExpGetLanguage +extern __typeof (xmlExpGetLanguage) xmlExpGetLanguage__internal_alias __attribute((visibility("hidden"))); +#define xmlExpGetLanguage xmlExpGetLanguage__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlExpGetStart +extern __typeof (xmlExpGetStart) xmlExpGetStart __attribute((alias("xmlExpGetStart__internal_alias"))); +#else +#ifndef xmlExpGetStart +extern __typeof (xmlExpGetStart) xmlExpGetStart__internal_alias __attribute((visibility("hidden"))); +#define xmlExpGetStart xmlExpGetStart__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlExpIsNillable +extern __typeof (xmlExpIsNillable) xmlExpIsNillable __attribute((alias("xmlExpIsNillable__internal_alias"))); +#else +#ifndef xmlExpIsNillable +extern __typeof (xmlExpIsNillable) xmlExpIsNillable__internal_alias __attribute((visibility("hidden"))); +#define xmlExpIsNillable xmlExpIsNillable__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlExpMaxToken +extern __typeof (xmlExpMaxToken) xmlExpMaxToken __attribute((alias("xmlExpMaxToken__internal_alias"))); +#else +#ifndef xmlExpMaxToken +extern __typeof (xmlExpMaxToken) xmlExpMaxToken__internal_alias __attribute((visibility("hidden"))); +#define xmlExpMaxToken xmlExpMaxToken__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlExpNewAtom +extern __typeof (xmlExpNewAtom) xmlExpNewAtom __attribute((alias("xmlExpNewAtom__internal_alias"))); +#else +#ifndef xmlExpNewAtom +extern __typeof (xmlExpNewAtom) xmlExpNewAtom__internal_alias __attribute((visibility("hidden"))); +#define xmlExpNewAtom xmlExpNewAtom__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlExpNewCtxt +extern __typeof (xmlExpNewCtxt) xmlExpNewCtxt __attribute((alias("xmlExpNewCtxt__internal_alias"))); +#else +#ifndef xmlExpNewCtxt +extern __typeof (xmlExpNewCtxt) xmlExpNewCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlExpNewCtxt xmlExpNewCtxt__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlExpNewOr +extern __typeof (xmlExpNewOr) xmlExpNewOr __attribute((alias("xmlExpNewOr__internal_alias"))); +#else +#ifndef xmlExpNewOr +extern __typeof (xmlExpNewOr) xmlExpNewOr__internal_alias __attribute((visibility("hidden"))); +#define xmlExpNewOr xmlExpNewOr__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlExpNewRange +extern __typeof (xmlExpNewRange) xmlExpNewRange __attribute((alias("xmlExpNewRange__internal_alias"))); +#else +#ifndef xmlExpNewRange +extern __typeof (xmlExpNewRange) xmlExpNewRange__internal_alias __attribute((visibility("hidden"))); +#define xmlExpNewRange xmlExpNewRange__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlExpNewSeq +extern __typeof (xmlExpNewSeq) xmlExpNewSeq __attribute((alias("xmlExpNewSeq__internal_alias"))); +#else +#ifndef xmlExpNewSeq +extern __typeof (xmlExpNewSeq) xmlExpNewSeq__internal_alias __attribute((visibility("hidden"))); +#define xmlExpNewSeq xmlExpNewSeq__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlExpParse +extern __typeof (xmlExpParse) xmlExpParse __attribute((alias("xmlExpParse__internal_alias"))); +#else +#ifndef xmlExpParse +extern __typeof (xmlExpParse) xmlExpParse__internal_alias __attribute((visibility("hidden"))); +#define xmlExpParse xmlExpParse__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlExpRef +extern __typeof (xmlExpRef) xmlExpRef __attribute((alias("xmlExpRef__internal_alias"))); +#else +#ifndef xmlExpRef +extern __typeof (xmlExpRef) xmlExpRef__internal_alias __attribute((visibility("hidden"))); +#define xmlExpRef xmlExpRef__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlExpStringDerive +extern __typeof (xmlExpStringDerive) xmlExpStringDerive __attribute((alias("xmlExpStringDerive__internal_alias"))); +#else +#ifndef xmlExpStringDerive +extern __typeof (xmlExpStringDerive) xmlExpStringDerive__internal_alias __attribute((visibility("hidden"))); +#define xmlExpStringDerive xmlExpStringDerive__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlExpSubsume +extern __typeof (xmlExpSubsume) xmlExpSubsume __attribute((alias("xmlExpSubsume__internal_alias"))); +#else +#ifndef xmlExpSubsume +extern __typeof (xmlExpSubsume) xmlExpSubsume__internal_alias __attribute((visibility("hidden"))); +#define xmlExpSubsume xmlExpSubsume__internal_alias +#endif +#endif +#endif + +#ifdef bottom_xmlIO +#undef xmlFileClose +extern __typeof (xmlFileClose) xmlFileClose __attribute((alias("xmlFileClose__internal_alias"))); +#else +#ifndef xmlFileClose +extern __typeof (xmlFileClose) xmlFileClose__internal_alias __attribute((visibility("hidden"))); +#define xmlFileClose xmlFileClose__internal_alias +#endif +#endif + +#ifdef bottom_xmlIO +#undef xmlFileMatch +extern __typeof (xmlFileMatch) xmlFileMatch __attribute((alias("xmlFileMatch__internal_alias"))); +#else +#ifndef xmlFileMatch +extern __typeof (xmlFileMatch) xmlFileMatch__internal_alias __attribute((visibility("hidden"))); +#define xmlFileMatch xmlFileMatch__internal_alias +#endif +#endif + +#ifdef bottom_xmlIO +#undef xmlFileOpen +extern __typeof (xmlFileOpen) xmlFileOpen __attribute((alias("xmlFileOpen__internal_alias"))); +#else +#ifndef xmlFileOpen +extern __typeof (xmlFileOpen) xmlFileOpen__internal_alias __attribute((visibility("hidden"))); +#define xmlFileOpen xmlFileOpen__internal_alias +#endif +#endif + +#ifdef bottom_xmlIO +#undef xmlFileRead +extern __typeof (xmlFileRead) xmlFileRead __attribute((alias("xmlFileRead__internal_alias"))); +#else +#ifndef xmlFileRead +extern __typeof (xmlFileRead) xmlFileRead__internal_alias __attribute((visibility("hidden"))); +#define xmlFileRead xmlFileRead__internal_alias +#endif +#endif + +#ifdef bottom_encoding +#undef xmlFindCharEncodingHandler +extern __typeof (xmlFindCharEncodingHandler) xmlFindCharEncodingHandler __attribute((alias("xmlFindCharEncodingHandler__internal_alias"))); +#else +#ifndef xmlFindCharEncodingHandler +extern __typeof (xmlFindCharEncodingHandler) xmlFindCharEncodingHandler__internal_alias __attribute((visibility("hidden"))); +#define xmlFindCharEncodingHandler xmlFindCharEncodingHandler__internal_alias +#endif +#endif + +#if defined(LIBXML_TREE_ENABLED) +#ifdef bottom_tree +#undef xmlFirstElementChild +extern __typeof (xmlFirstElementChild) xmlFirstElementChild __attribute((alias("xmlFirstElementChild__internal_alias"))); +#else +#ifndef xmlFirstElementChild +extern __typeof (xmlFirstElementChild) xmlFirstElementChild__internal_alias __attribute((visibility("hidden"))); +#define xmlFirstElementChild xmlFirstElementChild__internal_alias +#endif +#endif +#endif + +#ifdef bottom_valid +#undef xmlFreeAttributeTable +extern __typeof (xmlFreeAttributeTable) xmlFreeAttributeTable __attribute((alias("xmlFreeAttributeTable__internal_alias"))); +#else +#ifndef xmlFreeAttributeTable +extern __typeof (xmlFreeAttributeTable) xmlFreeAttributeTable__internal_alias __attribute((visibility("hidden"))); +#define xmlFreeAttributeTable xmlFreeAttributeTable__internal_alias +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlFreeAutomata +extern __typeof (xmlFreeAutomata) xmlFreeAutomata __attribute((alias("xmlFreeAutomata__internal_alias"))); +#else +#ifndef xmlFreeAutomata +extern __typeof (xmlFreeAutomata) xmlFreeAutomata__internal_alias __attribute((visibility("hidden"))); +#define xmlFreeAutomata xmlFreeAutomata__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_CATALOG_ENABLED) +#ifdef bottom_catalog +#undef xmlFreeCatalog +extern __typeof (xmlFreeCatalog) xmlFreeCatalog __attribute((alias("xmlFreeCatalog__internal_alias"))); +#else +#ifndef xmlFreeCatalog +extern __typeof (xmlFreeCatalog) xmlFreeCatalog__internal_alias __attribute((visibility("hidden"))); +#define xmlFreeCatalog xmlFreeCatalog__internal_alias +#endif +#endif +#endif + +#ifdef bottom_tree +#undef xmlFreeDoc +extern __typeof (xmlFreeDoc) xmlFreeDoc __attribute((alias("xmlFreeDoc__internal_alias"))); +#else +#ifndef xmlFreeDoc +extern __typeof (xmlFreeDoc) xmlFreeDoc__internal_alias __attribute((visibility("hidden"))); +#define xmlFreeDoc xmlFreeDoc__internal_alias +#endif +#endif + +#ifdef bottom_valid +#undef xmlFreeDocElementContent +extern __typeof (xmlFreeDocElementContent) xmlFreeDocElementContent __attribute((alias("xmlFreeDocElementContent__internal_alias"))); +#else +#ifndef xmlFreeDocElementContent +extern __typeof (xmlFreeDocElementContent) xmlFreeDocElementContent__internal_alias __attribute((visibility("hidden"))); +#define xmlFreeDocElementContent xmlFreeDocElementContent__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlFreeDtd +extern __typeof (xmlFreeDtd) xmlFreeDtd __attribute((alias("xmlFreeDtd__internal_alias"))); +#else +#ifndef xmlFreeDtd +extern __typeof (xmlFreeDtd) xmlFreeDtd__internal_alias __attribute((visibility("hidden"))); +#define xmlFreeDtd xmlFreeDtd__internal_alias +#endif +#endif + +#ifdef bottom_valid +#undef xmlFreeElementContent +extern __typeof (xmlFreeElementContent) xmlFreeElementContent __attribute((alias("xmlFreeElementContent__internal_alias"))); +#else +#ifndef xmlFreeElementContent +extern __typeof (xmlFreeElementContent) xmlFreeElementContent__internal_alias __attribute((visibility("hidden"))); +#define xmlFreeElementContent xmlFreeElementContent__internal_alias +#endif +#endif + +#ifdef bottom_valid +#undef xmlFreeElementTable +extern __typeof (xmlFreeElementTable) xmlFreeElementTable __attribute((alias("xmlFreeElementTable__internal_alias"))); +#else +#ifndef xmlFreeElementTable +extern __typeof (xmlFreeElementTable) xmlFreeElementTable__internal_alias __attribute((visibility("hidden"))); +#define xmlFreeElementTable xmlFreeElementTable__internal_alias +#endif +#endif + +#ifdef bottom_entities +#undef xmlFreeEntitiesTable +extern __typeof (xmlFreeEntitiesTable) xmlFreeEntitiesTable __attribute((alias("xmlFreeEntitiesTable__internal_alias"))); +#else +#ifndef xmlFreeEntitiesTable +extern __typeof (xmlFreeEntitiesTable) xmlFreeEntitiesTable__internal_alias __attribute((visibility("hidden"))); +#define xmlFreeEntitiesTable xmlFreeEntitiesTable__internal_alias +#endif +#endif + +#ifdef bottom_valid +#undef xmlFreeEnumeration +extern __typeof (xmlFreeEnumeration) xmlFreeEnumeration __attribute((alias("xmlFreeEnumeration__internal_alias"))); +#else +#ifndef xmlFreeEnumeration +extern __typeof (xmlFreeEnumeration) xmlFreeEnumeration__internal_alias __attribute((visibility("hidden"))); +#define xmlFreeEnumeration xmlFreeEnumeration__internal_alias +#endif +#endif + +#ifdef bottom_valid +#undef xmlFreeIDTable +extern __typeof (xmlFreeIDTable) xmlFreeIDTable __attribute((alias("xmlFreeIDTable__internal_alias"))); +#else +#ifndef xmlFreeIDTable +extern __typeof (xmlFreeIDTable) xmlFreeIDTable__internal_alias __attribute((visibility("hidden"))); +#define xmlFreeIDTable xmlFreeIDTable__internal_alias +#endif +#endif + +#ifdef bottom_parserInternals +#undef xmlFreeInputStream +extern __typeof (xmlFreeInputStream) xmlFreeInputStream __attribute((alias("xmlFreeInputStream__internal_alias"))); +#else +#ifndef xmlFreeInputStream +extern __typeof (xmlFreeInputStream) xmlFreeInputStream__internal_alias __attribute((visibility("hidden"))); +#define xmlFreeInputStream xmlFreeInputStream__internal_alias +#endif +#endif + +#ifdef bottom_threads +#undef xmlFreeMutex +extern __typeof (xmlFreeMutex) xmlFreeMutex __attribute((alias("xmlFreeMutex__internal_alias"))); +#else +#ifndef xmlFreeMutex +extern __typeof (xmlFreeMutex) xmlFreeMutex__internal_alias __attribute((visibility("hidden"))); +#define xmlFreeMutex xmlFreeMutex__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlFreeNode +extern __typeof (xmlFreeNode) xmlFreeNode __attribute((alias("xmlFreeNode__internal_alias"))); +#else +#ifndef xmlFreeNode +extern __typeof (xmlFreeNode) xmlFreeNode__internal_alias __attribute((visibility("hidden"))); +#define xmlFreeNode xmlFreeNode__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlFreeNodeList +extern __typeof (xmlFreeNodeList) xmlFreeNodeList __attribute((alias("xmlFreeNodeList__internal_alias"))); +#else +#ifndef xmlFreeNodeList +extern __typeof (xmlFreeNodeList) xmlFreeNodeList__internal_alias __attribute((visibility("hidden"))); +#define xmlFreeNodeList xmlFreeNodeList__internal_alias +#endif +#endif + +#ifdef bottom_valid +#undef xmlFreeNotationTable +extern __typeof (xmlFreeNotationTable) xmlFreeNotationTable __attribute((alias("xmlFreeNotationTable__internal_alias"))); +#else +#ifndef xmlFreeNotationTable +extern __typeof (xmlFreeNotationTable) xmlFreeNotationTable__internal_alias __attribute((visibility("hidden"))); +#define xmlFreeNotationTable xmlFreeNotationTable__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlFreeNs +extern __typeof (xmlFreeNs) xmlFreeNs __attribute((alias("xmlFreeNs__internal_alias"))); +#else +#ifndef xmlFreeNs +extern __typeof (xmlFreeNs) xmlFreeNs__internal_alias __attribute((visibility("hidden"))); +#define xmlFreeNs xmlFreeNs__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlFreeNsList +extern __typeof (xmlFreeNsList) xmlFreeNsList __attribute((alias("xmlFreeNsList__internal_alias"))); +#else +#ifndef xmlFreeNsList +extern __typeof (xmlFreeNsList) xmlFreeNsList__internal_alias __attribute((visibility("hidden"))); +#define xmlFreeNsList xmlFreeNsList__internal_alias +#endif +#endif + +#ifdef bottom_parserInternals +#undef xmlFreeParserCtxt +extern __typeof (xmlFreeParserCtxt) xmlFreeParserCtxt __attribute((alias("xmlFreeParserCtxt__internal_alias"))); +#else +#ifndef xmlFreeParserCtxt +extern __typeof (xmlFreeParserCtxt) xmlFreeParserCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlFreeParserCtxt xmlFreeParserCtxt__internal_alias +#endif +#endif + +#ifdef bottom_xmlIO +#undef xmlFreeParserInputBuffer +extern __typeof (xmlFreeParserInputBuffer) xmlFreeParserInputBuffer __attribute((alias("xmlFreeParserInputBuffer__internal_alias"))); +#else +#ifndef xmlFreeParserInputBuffer +extern __typeof (xmlFreeParserInputBuffer) xmlFreeParserInputBuffer__internal_alias __attribute((visibility("hidden"))); +#define xmlFreeParserInputBuffer xmlFreeParserInputBuffer__internal_alias +#endif +#endif + +#if defined(LIBXML_PATTERN_ENABLED) +#ifdef bottom_pattern +#undef xmlFreePattern +extern __typeof (xmlFreePattern) xmlFreePattern __attribute((alias("xmlFreePattern__internal_alias"))); +#else +#ifndef xmlFreePattern +extern __typeof (xmlFreePattern) xmlFreePattern__internal_alias __attribute((visibility("hidden"))); +#define xmlFreePattern xmlFreePattern__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_PATTERN_ENABLED) +#ifdef bottom_pattern +#undef xmlFreePatternList +extern __typeof (xmlFreePatternList) xmlFreePatternList __attribute((alias("xmlFreePatternList__internal_alias"))); +#else +#ifndef xmlFreePatternList +extern __typeof (xmlFreePatternList) xmlFreePatternList__internal_alias __attribute((visibility("hidden"))); +#define xmlFreePatternList xmlFreePatternList__internal_alias +#endif +#endif +#endif + +#ifdef bottom_tree +#undef xmlFreeProp +extern __typeof (xmlFreeProp) xmlFreeProp __attribute((alias("xmlFreeProp__internal_alias"))); +#else +#ifndef xmlFreeProp +extern __typeof (xmlFreeProp) xmlFreeProp__internal_alias __attribute((visibility("hidden"))); +#define xmlFreeProp xmlFreeProp__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlFreePropList +extern __typeof (xmlFreePropList) xmlFreePropList __attribute((alias("xmlFreePropList__internal_alias"))); +#else +#ifndef xmlFreePropList +extern __typeof (xmlFreePropList) xmlFreePropList__internal_alias __attribute((visibility("hidden"))); +#define xmlFreePropList xmlFreePropList__internal_alias +#endif +#endif + +#ifdef bottom_threads +#undef xmlFreeRMutex +extern __typeof (xmlFreeRMutex) xmlFreeRMutex __attribute((alias("xmlFreeRMutex__internal_alias"))); +#else +#ifndef xmlFreeRMutex +extern __typeof (xmlFreeRMutex) xmlFreeRMutex__internal_alias __attribute((visibility("hidden"))); +#define xmlFreeRMutex xmlFreeRMutex__internal_alias +#endif +#endif + +#ifdef bottom_valid +#undef xmlFreeRefTable +extern __typeof (xmlFreeRefTable) xmlFreeRefTable __attribute((alias("xmlFreeRefTable__internal_alias"))); +#else +#ifndef xmlFreeRefTable +extern __typeof (xmlFreeRefTable) xmlFreeRefTable__internal_alias __attribute((visibility("hidden"))); +#define xmlFreeRefTable xmlFreeRefTable__internal_alias +#endif +#endif + +#if defined(LIBXML_PATTERN_ENABLED) +#ifdef bottom_pattern +#undef xmlFreeStreamCtxt +extern __typeof (xmlFreeStreamCtxt) xmlFreeStreamCtxt __attribute((alias("xmlFreeStreamCtxt__internal_alias"))); +#else +#ifndef xmlFreeStreamCtxt +extern __typeof (xmlFreeStreamCtxt) xmlFreeStreamCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlFreeStreamCtxt xmlFreeStreamCtxt__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlFreeTextReader +extern __typeof (xmlFreeTextReader) xmlFreeTextReader __attribute((alias("xmlFreeTextReader__internal_alias"))); +#else +#ifndef xmlFreeTextReader +extern __typeof (xmlFreeTextReader) xmlFreeTextReader__internal_alias __attribute((visibility("hidden"))); +#define xmlFreeTextReader xmlFreeTextReader__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlFreeTextWriter +extern __typeof (xmlFreeTextWriter) xmlFreeTextWriter __attribute((alias("xmlFreeTextWriter__internal_alias"))); +#else +#ifndef xmlFreeTextWriter +extern __typeof (xmlFreeTextWriter) xmlFreeTextWriter__internal_alias __attribute((visibility("hidden"))); +#define xmlFreeTextWriter xmlFreeTextWriter__internal_alias +#endif +#endif +#endif + +#ifdef bottom_uri +#undef xmlFreeURI +extern __typeof (xmlFreeURI) xmlFreeURI __attribute((alias("xmlFreeURI__internal_alias"))); +#else +#ifndef xmlFreeURI +extern __typeof (xmlFreeURI) xmlFreeURI__internal_alias __attribute((visibility("hidden"))); +#define xmlFreeURI xmlFreeURI__internal_alias +#endif +#endif + +#if defined(LIBXML_VALID_ENABLED) +#ifdef bottom_valid +#undef xmlFreeValidCtxt +extern __typeof (xmlFreeValidCtxt) xmlFreeValidCtxt __attribute((alias("xmlFreeValidCtxt__internal_alias"))); +#else +#ifndef xmlFreeValidCtxt +extern __typeof (xmlFreeValidCtxt) xmlFreeValidCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlFreeValidCtxt xmlFreeValidCtxt__internal_alias +#endif +#endif +#endif + +#ifdef bottom_xmlmemory +#undef xmlGcMemGet +extern __typeof (xmlGcMemGet) xmlGcMemGet __attribute((alias("xmlGcMemGet__internal_alias"))); +#else +#ifndef xmlGcMemGet +extern __typeof (xmlGcMemGet) xmlGcMemGet__internal_alias __attribute((visibility("hidden"))); +#define xmlGcMemGet xmlGcMemGet__internal_alias +#endif +#endif + +#ifdef bottom_xmlmemory +#undef xmlGcMemSetup +extern __typeof (xmlGcMemSetup) xmlGcMemSetup __attribute((alias("xmlGcMemSetup__internal_alias"))); +#else +#ifndef xmlGcMemSetup +extern __typeof (xmlGcMemSetup) xmlGcMemSetup__internal_alias __attribute((visibility("hidden"))); +#define xmlGcMemSetup xmlGcMemSetup__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlGetBufferAllocationScheme +extern __typeof (xmlGetBufferAllocationScheme) xmlGetBufferAllocationScheme __attribute((alias("xmlGetBufferAllocationScheme__internal_alias"))); +#else +#ifndef xmlGetBufferAllocationScheme +extern __typeof (xmlGetBufferAllocationScheme) xmlGetBufferAllocationScheme__internal_alias __attribute((visibility("hidden"))); +#define xmlGetBufferAllocationScheme xmlGetBufferAllocationScheme__internal_alias +#endif +#endif + +#ifdef bottom_encoding +#undef xmlGetCharEncodingHandler +extern __typeof (xmlGetCharEncodingHandler) xmlGetCharEncodingHandler __attribute((alias("xmlGetCharEncodingHandler__internal_alias"))); +#else +#ifndef xmlGetCharEncodingHandler +extern __typeof (xmlGetCharEncodingHandler) xmlGetCharEncodingHandler__internal_alias __attribute((visibility("hidden"))); +#define xmlGetCharEncodingHandler xmlGetCharEncodingHandler__internal_alias +#endif +#endif + +#ifdef bottom_encoding +#undef xmlGetCharEncodingName +extern __typeof (xmlGetCharEncodingName) xmlGetCharEncodingName __attribute((alias("xmlGetCharEncodingName__internal_alias"))); +#else +#ifndef xmlGetCharEncodingName +extern __typeof (xmlGetCharEncodingName) xmlGetCharEncodingName__internal_alias __attribute((visibility("hidden"))); +#define xmlGetCharEncodingName xmlGetCharEncodingName__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlGetCompressMode +extern __typeof (xmlGetCompressMode) xmlGetCompressMode __attribute((alias("xmlGetCompressMode__internal_alias"))); +#else +#ifndef xmlGetCompressMode +extern __typeof (xmlGetCompressMode) xmlGetCompressMode__internal_alias __attribute((visibility("hidden"))); +#define xmlGetCompressMode xmlGetCompressMode__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlGetDocCompressMode +extern __typeof (xmlGetDocCompressMode) xmlGetDocCompressMode __attribute((alias("xmlGetDocCompressMode__internal_alias"))); +#else +#ifndef xmlGetDocCompressMode +extern __typeof (xmlGetDocCompressMode) xmlGetDocCompressMode__internal_alias __attribute((visibility("hidden"))); +#define xmlGetDocCompressMode xmlGetDocCompressMode__internal_alias +#endif +#endif + +#ifdef bottom_entities +#undef xmlGetDocEntity +extern __typeof (xmlGetDocEntity) xmlGetDocEntity __attribute((alias("xmlGetDocEntity__internal_alias"))); +#else +#ifndef xmlGetDocEntity +extern __typeof (xmlGetDocEntity) xmlGetDocEntity__internal_alias __attribute((visibility("hidden"))); +#define xmlGetDocEntity xmlGetDocEntity__internal_alias +#endif +#endif + +#ifdef bottom_valid +#undef xmlGetDtdAttrDesc +extern __typeof (xmlGetDtdAttrDesc) xmlGetDtdAttrDesc __attribute((alias("xmlGetDtdAttrDesc__internal_alias"))); +#else +#ifndef xmlGetDtdAttrDesc +extern __typeof (xmlGetDtdAttrDesc) xmlGetDtdAttrDesc__internal_alias __attribute((visibility("hidden"))); +#define xmlGetDtdAttrDesc xmlGetDtdAttrDesc__internal_alias +#endif +#endif + +#ifdef bottom_valid +#undef xmlGetDtdElementDesc +extern __typeof (xmlGetDtdElementDesc) xmlGetDtdElementDesc __attribute((alias("xmlGetDtdElementDesc__internal_alias"))); +#else +#ifndef xmlGetDtdElementDesc +extern __typeof (xmlGetDtdElementDesc) xmlGetDtdElementDesc__internal_alias __attribute((visibility("hidden"))); +#define xmlGetDtdElementDesc xmlGetDtdElementDesc__internal_alias +#endif +#endif + +#ifdef bottom_entities +#undef xmlGetDtdEntity +extern __typeof (xmlGetDtdEntity) xmlGetDtdEntity __attribute((alias("xmlGetDtdEntity__internal_alias"))); +#else +#ifndef xmlGetDtdEntity +extern __typeof (xmlGetDtdEntity) xmlGetDtdEntity__internal_alias __attribute((visibility("hidden"))); +#define xmlGetDtdEntity xmlGetDtdEntity__internal_alias +#endif +#endif + +#ifdef bottom_valid +#undef xmlGetDtdNotationDesc +extern __typeof (xmlGetDtdNotationDesc) xmlGetDtdNotationDesc __attribute((alias("xmlGetDtdNotationDesc__internal_alias"))); +#else +#ifndef xmlGetDtdNotationDesc +extern __typeof (xmlGetDtdNotationDesc) xmlGetDtdNotationDesc__internal_alias __attribute((visibility("hidden"))); +#define xmlGetDtdNotationDesc xmlGetDtdNotationDesc__internal_alias +#endif +#endif + +#ifdef bottom_valid +#undef xmlGetDtdQAttrDesc +extern __typeof (xmlGetDtdQAttrDesc) xmlGetDtdQAttrDesc __attribute((alias("xmlGetDtdQAttrDesc__internal_alias"))); +#else +#ifndef xmlGetDtdQAttrDesc +extern __typeof (xmlGetDtdQAttrDesc) xmlGetDtdQAttrDesc__internal_alias __attribute((visibility("hidden"))); +#define xmlGetDtdQAttrDesc xmlGetDtdQAttrDesc__internal_alias +#endif +#endif + +#ifdef bottom_valid +#undef xmlGetDtdQElementDesc +extern __typeof (xmlGetDtdQElementDesc) xmlGetDtdQElementDesc __attribute((alias("xmlGetDtdQElementDesc__internal_alias"))); +#else +#ifndef xmlGetDtdQElementDesc +extern __typeof (xmlGetDtdQElementDesc) xmlGetDtdQElementDesc__internal_alias __attribute((visibility("hidden"))); +#define xmlGetDtdQElementDesc xmlGetDtdQElementDesc__internal_alias +#endif +#endif + +#ifdef bottom_encoding +#undef xmlGetEncodingAlias +extern __typeof (xmlGetEncodingAlias) xmlGetEncodingAlias __attribute((alias("xmlGetEncodingAlias__internal_alias"))); +#else +#ifndef xmlGetEncodingAlias +extern __typeof (xmlGetEncodingAlias) xmlGetEncodingAlias__internal_alias __attribute((visibility("hidden"))); +#define xmlGetEncodingAlias xmlGetEncodingAlias__internal_alias +#endif +#endif + +#ifdef bottom_xmlIO +#undef xmlGetExternalEntityLoader +extern __typeof (xmlGetExternalEntityLoader) xmlGetExternalEntityLoader __attribute((alias("xmlGetExternalEntityLoader__internal_alias"))); +#else +#ifndef xmlGetExternalEntityLoader +extern __typeof (xmlGetExternalEntityLoader) xmlGetExternalEntityLoader__internal_alias __attribute((visibility("hidden"))); +#define xmlGetExternalEntityLoader xmlGetExternalEntityLoader__internal_alias +#endif +#endif + +#if defined(LIBXML_LEGACY_ENABLED) +#ifdef bottom_legacy +#undef xmlGetFeature +extern __typeof (xmlGetFeature) xmlGetFeature __attribute((alias("xmlGetFeature__internal_alias"))); +#else +#ifndef xmlGetFeature +extern __typeof (xmlGetFeature) xmlGetFeature__internal_alias __attribute((visibility("hidden"))); +#define xmlGetFeature xmlGetFeature__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_LEGACY_ENABLED) +#ifdef bottom_legacy +#undef xmlGetFeaturesList +extern __typeof (xmlGetFeaturesList) xmlGetFeaturesList __attribute((alias("xmlGetFeaturesList__internal_alias"))); +#else +#ifndef xmlGetFeaturesList +extern __typeof (xmlGetFeaturesList) xmlGetFeaturesList__internal_alias __attribute((visibility("hidden"))); +#define xmlGetFeaturesList xmlGetFeaturesList__internal_alias +#endif +#endif +#endif + +#ifdef bottom_threads +#undef xmlGetGlobalState +extern __typeof (xmlGetGlobalState) xmlGetGlobalState __attribute((alias("xmlGetGlobalState__internal_alias"))); +#else +#ifndef xmlGetGlobalState +extern __typeof (xmlGetGlobalState) xmlGetGlobalState__internal_alias __attribute((visibility("hidden"))); +#define xmlGetGlobalState xmlGetGlobalState__internal_alias +#endif +#endif + +#ifdef bottom_valid +#undef xmlGetID +extern __typeof (xmlGetID) xmlGetID __attribute((alias("xmlGetID__internal_alias"))); +#else +#ifndef xmlGetID +extern __typeof (xmlGetID) xmlGetID__internal_alias __attribute((visibility("hidden"))); +#define xmlGetID xmlGetID__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlGetIntSubset +extern __typeof (xmlGetIntSubset) xmlGetIntSubset __attribute((alias("xmlGetIntSubset__internal_alias"))); +#else +#ifndef xmlGetIntSubset +extern __typeof (xmlGetIntSubset) xmlGetIntSubset__internal_alias __attribute((visibility("hidden"))); +#define xmlGetIntSubset xmlGetIntSubset__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlGetLastChild +extern __typeof (xmlGetLastChild) xmlGetLastChild __attribute((alias("xmlGetLastChild__internal_alias"))); +#else +#ifndef xmlGetLastChild +extern __typeof (xmlGetLastChild) xmlGetLastChild__internal_alias __attribute((visibility("hidden"))); +#define xmlGetLastChild xmlGetLastChild__internal_alias +#endif +#endif + +#ifdef bottom_error +#undef xmlGetLastError +extern __typeof (xmlGetLastError) xmlGetLastError __attribute((alias("xmlGetLastError__internal_alias"))); +#else +#ifndef xmlGetLastError +extern __typeof (xmlGetLastError) xmlGetLastError__internal_alias __attribute((visibility("hidden"))); +#define xmlGetLastError xmlGetLastError__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlGetLineNo +extern __typeof (xmlGetLineNo) xmlGetLineNo __attribute((alias("xmlGetLineNo__internal_alias"))); +#else +#ifndef xmlGetLineNo +extern __typeof (xmlGetLineNo) xmlGetLineNo__internal_alias __attribute((visibility("hidden"))); +#define xmlGetLineNo xmlGetLineNo__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlGetNoNsProp +extern __typeof (xmlGetNoNsProp) xmlGetNoNsProp __attribute((alias("xmlGetNoNsProp__internal_alias"))); +#else +#ifndef xmlGetNoNsProp +extern __typeof (xmlGetNoNsProp) xmlGetNoNsProp__internal_alias __attribute((visibility("hidden"))); +#define xmlGetNoNsProp xmlGetNoNsProp__internal_alias +#endif +#endif + +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_DEBUG_ENABLED) +#ifdef bottom_tree +#undef xmlGetNodePath +extern __typeof (xmlGetNodePath) xmlGetNodePath __attribute((alias("xmlGetNodePath__internal_alias"))); +#else +#ifndef xmlGetNodePath +extern __typeof (xmlGetNodePath) xmlGetNodePath__internal_alias __attribute((visibility("hidden"))); +#define xmlGetNodePath xmlGetNodePath__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_tree +#undef xmlGetNsList +extern __typeof (xmlGetNsList) xmlGetNsList __attribute((alias("xmlGetNsList__internal_alias"))); +#else +#ifndef xmlGetNsList +extern __typeof (xmlGetNsList) xmlGetNsList__internal_alias __attribute((visibility("hidden"))); +#define xmlGetNsList xmlGetNsList__internal_alias +#endif +#endif +#endif + +#ifdef bottom_tree +#undef xmlGetNsProp +extern __typeof (xmlGetNsProp) xmlGetNsProp __attribute((alias("xmlGetNsProp__internal_alias"))); +#else +#ifndef xmlGetNsProp +extern __typeof (xmlGetNsProp) xmlGetNsProp__internal_alias __attribute((visibility("hidden"))); +#define xmlGetNsProp xmlGetNsProp__internal_alias +#endif +#endif + +#ifdef bottom_entities +#undef xmlGetParameterEntity +extern __typeof (xmlGetParameterEntity) xmlGetParameterEntity __attribute((alias("xmlGetParameterEntity__internal_alias"))); +#else +#ifndef xmlGetParameterEntity +extern __typeof (xmlGetParameterEntity) xmlGetParameterEntity__internal_alias __attribute((visibility("hidden"))); +#define xmlGetParameterEntity xmlGetParameterEntity__internal_alias +#endif +#endif + +#ifdef bottom_entities +#undef xmlGetPredefinedEntity +extern __typeof (xmlGetPredefinedEntity) xmlGetPredefinedEntity __attribute((alias("xmlGetPredefinedEntity__internal_alias"))); +#else +#ifndef xmlGetPredefinedEntity +extern __typeof (xmlGetPredefinedEntity) xmlGetPredefinedEntity__internal_alias __attribute((visibility("hidden"))); +#define xmlGetPredefinedEntity xmlGetPredefinedEntity__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlGetProp +extern __typeof (xmlGetProp) xmlGetProp __attribute((alias("xmlGetProp__internal_alias"))); +#else +#ifndef xmlGetProp +extern __typeof (xmlGetProp) xmlGetProp__internal_alias __attribute((visibility("hidden"))); +#define xmlGetProp xmlGetProp__internal_alias +#endif +#endif + +#ifdef bottom_valid +#undef xmlGetRefs +extern __typeof (xmlGetRefs) xmlGetRefs __attribute((alias("xmlGetRefs__internal_alias"))); +#else +#ifndef xmlGetRefs +extern __typeof (xmlGetRefs) xmlGetRefs__internal_alias __attribute((visibility("hidden"))); +#define xmlGetRefs xmlGetRefs__internal_alias +#endif +#endif + +#ifdef bottom_threads +#undef xmlGetThreadId +extern __typeof (xmlGetThreadId) xmlGetThreadId __attribute((alias("xmlGetThreadId__internal_alias"))); +#else +#ifndef xmlGetThreadId +extern __typeof (xmlGetThreadId) xmlGetThreadId__internal_alias __attribute((visibility("hidden"))); +#define xmlGetThreadId xmlGetThreadId__internal_alias +#endif +#endif + +#ifdef bottom_xmlstring +#undef xmlGetUTF8Char +extern __typeof (xmlGetUTF8Char) xmlGetUTF8Char __attribute((alias("xmlGetUTF8Char__internal_alias"))); +#else +#ifndef xmlGetUTF8Char +extern __typeof (xmlGetUTF8Char) xmlGetUTF8Char__internal_alias __attribute((visibility("hidden"))); +#define xmlGetUTF8Char xmlGetUTF8Char__internal_alias +#endif +#endif + +#if defined(LIBXML_LEGACY_ENABLED) +#ifdef bottom_legacy +#undef xmlHandleEntity +extern __typeof (xmlHandleEntity) xmlHandleEntity __attribute((alias("xmlHandleEntity__internal_alias"))); +#else +#ifndef xmlHandleEntity +extern __typeof (xmlHandleEntity) xmlHandleEntity__internal_alias __attribute((visibility("hidden"))); +#define xmlHandleEntity xmlHandleEntity__internal_alias +#endif +#endif +#endif + +#ifdef bottom_parser +#undef xmlHasFeature +extern __typeof (xmlHasFeature) xmlHasFeature __attribute((alias("xmlHasFeature__internal_alias"))); +#else +#ifndef xmlHasFeature +extern __typeof (xmlHasFeature) xmlHasFeature__internal_alias __attribute((visibility("hidden"))); +#define xmlHasFeature xmlHasFeature__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlHasNsProp +extern __typeof (xmlHasNsProp) xmlHasNsProp __attribute((alias("xmlHasNsProp__internal_alias"))); +#else +#ifndef xmlHasNsProp +extern __typeof (xmlHasNsProp) xmlHasNsProp__internal_alias __attribute((visibility("hidden"))); +#define xmlHasNsProp xmlHasNsProp__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlHasProp +extern __typeof (xmlHasProp) xmlHasProp __attribute((alias("xmlHasProp__internal_alias"))); +#else +#ifndef xmlHasProp +extern __typeof (xmlHasProp) xmlHasProp__internal_alias __attribute((visibility("hidden"))); +#define xmlHasProp xmlHasProp__internal_alias +#endif +#endif + +#ifdef bottom_hash +#undef xmlHashAddEntry +extern __typeof (xmlHashAddEntry) xmlHashAddEntry __attribute((alias("xmlHashAddEntry__internal_alias"))); +#else +#ifndef xmlHashAddEntry +extern __typeof (xmlHashAddEntry) xmlHashAddEntry__internal_alias __attribute((visibility("hidden"))); +#define xmlHashAddEntry xmlHashAddEntry__internal_alias +#endif +#endif + +#ifdef bottom_hash +#undef xmlHashAddEntry2 +extern __typeof (xmlHashAddEntry2) xmlHashAddEntry2 __attribute((alias("xmlHashAddEntry2__internal_alias"))); +#else +#ifndef xmlHashAddEntry2 +extern __typeof (xmlHashAddEntry2) xmlHashAddEntry2__internal_alias __attribute((visibility("hidden"))); +#define xmlHashAddEntry2 xmlHashAddEntry2__internal_alias +#endif +#endif + +#ifdef bottom_hash +#undef xmlHashAddEntry3 +extern __typeof (xmlHashAddEntry3) xmlHashAddEntry3 __attribute((alias("xmlHashAddEntry3__internal_alias"))); +#else +#ifndef xmlHashAddEntry3 +extern __typeof (xmlHashAddEntry3) xmlHashAddEntry3__internal_alias __attribute((visibility("hidden"))); +#define xmlHashAddEntry3 xmlHashAddEntry3__internal_alias +#endif +#endif + +#ifdef bottom_hash +#undef xmlHashCopy +extern __typeof (xmlHashCopy) xmlHashCopy __attribute((alias("xmlHashCopy__internal_alias"))); +#else +#ifndef xmlHashCopy +extern __typeof (xmlHashCopy) xmlHashCopy__internal_alias __attribute((visibility("hidden"))); +#define xmlHashCopy xmlHashCopy__internal_alias +#endif +#endif + +#ifdef bottom_hash +#undef xmlHashCreate +extern __typeof (xmlHashCreate) xmlHashCreate __attribute((alias("xmlHashCreate__internal_alias"))); +#else +#ifndef xmlHashCreate +extern __typeof (xmlHashCreate) xmlHashCreate__internal_alias __attribute((visibility("hidden"))); +#define xmlHashCreate xmlHashCreate__internal_alias +#endif +#endif + +#ifdef bottom_hash +#undef xmlHashCreateDict +extern __typeof (xmlHashCreateDict) xmlHashCreateDict __attribute((alias("xmlHashCreateDict__internal_alias"))); +#else +#ifndef xmlHashCreateDict +extern __typeof (xmlHashCreateDict) xmlHashCreateDict__internal_alias __attribute((visibility("hidden"))); +#define xmlHashCreateDict xmlHashCreateDict__internal_alias +#endif +#endif + +#ifdef bottom_hash +#undef xmlHashFree +extern __typeof (xmlHashFree) xmlHashFree __attribute((alias("xmlHashFree__internal_alias"))); +#else +#ifndef xmlHashFree +extern __typeof (xmlHashFree) xmlHashFree__internal_alias __attribute((visibility("hidden"))); +#define xmlHashFree xmlHashFree__internal_alias +#endif +#endif + +#ifdef bottom_hash +#undef xmlHashLookup +extern __typeof (xmlHashLookup) xmlHashLookup __attribute((alias("xmlHashLookup__internal_alias"))); +#else +#ifndef xmlHashLookup +extern __typeof (xmlHashLookup) xmlHashLookup__internal_alias __attribute((visibility("hidden"))); +#define xmlHashLookup xmlHashLookup__internal_alias +#endif +#endif + +#ifdef bottom_hash +#undef xmlHashLookup2 +extern __typeof (xmlHashLookup2) xmlHashLookup2 __attribute((alias("xmlHashLookup2__internal_alias"))); +#else +#ifndef xmlHashLookup2 +extern __typeof (xmlHashLookup2) xmlHashLookup2__internal_alias __attribute((visibility("hidden"))); +#define xmlHashLookup2 xmlHashLookup2__internal_alias +#endif +#endif + +#ifdef bottom_hash +#undef xmlHashLookup3 +extern __typeof (xmlHashLookup3) xmlHashLookup3 __attribute((alias("xmlHashLookup3__internal_alias"))); +#else +#ifndef xmlHashLookup3 +extern __typeof (xmlHashLookup3) xmlHashLookup3__internal_alias __attribute((visibility("hidden"))); +#define xmlHashLookup3 xmlHashLookup3__internal_alias +#endif +#endif + +#ifdef bottom_hash +#undef xmlHashQLookup +extern __typeof (xmlHashQLookup) xmlHashQLookup __attribute((alias("xmlHashQLookup__internal_alias"))); +#else +#ifndef xmlHashQLookup +extern __typeof (xmlHashQLookup) xmlHashQLookup__internal_alias __attribute((visibility("hidden"))); +#define xmlHashQLookup xmlHashQLookup__internal_alias +#endif +#endif + +#ifdef bottom_hash +#undef xmlHashQLookup2 +extern __typeof (xmlHashQLookup2) xmlHashQLookup2 __attribute((alias("xmlHashQLookup2__internal_alias"))); +#else +#ifndef xmlHashQLookup2 +extern __typeof (xmlHashQLookup2) xmlHashQLookup2__internal_alias __attribute((visibility("hidden"))); +#define xmlHashQLookup2 xmlHashQLookup2__internal_alias +#endif +#endif + +#ifdef bottom_hash +#undef xmlHashQLookup3 +extern __typeof (xmlHashQLookup3) xmlHashQLookup3 __attribute((alias("xmlHashQLookup3__internal_alias"))); +#else +#ifndef xmlHashQLookup3 +extern __typeof (xmlHashQLookup3) xmlHashQLookup3__internal_alias __attribute((visibility("hidden"))); +#define xmlHashQLookup3 xmlHashQLookup3__internal_alias +#endif +#endif + +#ifdef bottom_hash +#undef xmlHashRemoveEntry +extern __typeof (xmlHashRemoveEntry) xmlHashRemoveEntry __attribute((alias("xmlHashRemoveEntry__internal_alias"))); +#else +#ifndef xmlHashRemoveEntry +extern __typeof (xmlHashRemoveEntry) xmlHashRemoveEntry__internal_alias __attribute((visibility("hidden"))); +#define xmlHashRemoveEntry xmlHashRemoveEntry__internal_alias +#endif +#endif + +#ifdef bottom_hash +#undef xmlHashRemoveEntry2 +extern __typeof (xmlHashRemoveEntry2) xmlHashRemoveEntry2 __attribute((alias("xmlHashRemoveEntry2__internal_alias"))); +#else +#ifndef xmlHashRemoveEntry2 +extern __typeof (xmlHashRemoveEntry2) xmlHashRemoveEntry2__internal_alias __attribute((visibility("hidden"))); +#define xmlHashRemoveEntry2 xmlHashRemoveEntry2__internal_alias +#endif +#endif + +#ifdef bottom_hash +#undef xmlHashRemoveEntry3 +extern __typeof (xmlHashRemoveEntry3) xmlHashRemoveEntry3 __attribute((alias("xmlHashRemoveEntry3__internal_alias"))); +#else +#ifndef xmlHashRemoveEntry3 +extern __typeof (xmlHashRemoveEntry3) xmlHashRemoveEntry3__internal_alias __attribute((visibility("hidden"))); +#define xmlHashRemoveEntry3 xmlHashRemoveEntry3__internal_alias +#endif +#endif + +#ifdef bottom_hash +#undef xmlHashScan +extern __typeof (xmlHashScan) xmlHashScan __attribute((alias("xmlHashScan__internal_alias"))); +#else +#ifndef xmlHashScan +extern __typeof (xmlHashScan) xmlHashScan__internal_alias __attribute((visibility("hidden"))); +#define xmlHashScan xmlHashScan__internal_alias +#endif +#endif + +#ifdef bottom_hash +#undef xmlHashScan3 +extern __typeof (xmlHashScan3) xmlHashScan3 __attribute((alias("xmlHashScan3__internal_alias"))); +#else +#ifndef xmlHashScan3 +extern __typeof (xmlHashScan3) xmlHashScan3__internal_alias __attribute((visibility("hidden"))); +#define xmlHashScan3 xmlHashScan3__internal_alias +#endif +#endif + +#ifdef bottom_hash +#undef xmlHashScanFull +extern __typeof (xmlHashScanFull) xmlHashScanFull __attribute((alias("xmlHashScanFull__internal_alias"))); +#else +#ifndef xmlHashScanFull +extern __typeof (xmlHashScanFull) xmlHashScanFull__internal_alias __attribute((visibility("hidden"))); +#define xmlHashScanFull xmlHashScanFull__internal_alias +#endif +#endif + +#ifdef bottom_hash +#undef xmlHashScanFull3 +extern __typeof (xmlHashScanFull3) xmlHashScanFull3 __attribute((alias("xmlHashScanFull3__internal_alias"))); +#else +#ifndef xmlHashScanFull3 +extern __typeof (xmlHashScanFull3) xmlHashScanFull3__internal_alias __attribute((visibility("hidden"))); +#define xmlHashScanFull3 xmlHashScanFull3__internal_alias +#endif +#endif + +#ifdef bottom_hash +#undef xmlHashSize +extern __typeof (xmlHashSize) xmlHashSize __attribute((alias("xmlHashSize__internal_alias"))); +#else +#ifndef xmlHashSize +extern __typeof (xmlHashSize) xmlHashSize__internal_alias __attribute((visibility("hidden"))); +#define xmlHashSize xmlHashSize__internal_alias +#endif +#endif + +#ifdef bottom_hash +#undef xmlHashUpdateEntry +extern __typeof (xmlHashUpdateEntry) xmlHashUpdateEntry __attribute((alias("xmlHashUpdateEntry__internal_alias"))); +#else +#ifndef xmlHashUpdateEntry +extern __typeof (xmlHashUpdateEntry) xmlHashUpdateEntry__internal_alias __attribute((visibility("hidden"))); +#define xmlHashUpdateEntry xmlHashUpdateEntry__internal_alias +#endif +#endif + +#ifdef bottom_hash +#undef xmlHashUpdateEntry2 +extern __typeof (xmlHashUpdateEntry2) xmlHashUpdateEntry2 __attribute((alias("xmlHashUpdateEntry2__internal_alias"))); +#else +#ifndef xmlHashUpdateEntry2 +extern __typeof (xmlHashUpdateEntry2) xmlHashUpdateEntry2__internal_alias __attribute((visibility("hidden"))); +#define xmlHashUpdateEntry2 xmlHashUpdateEntry2__internal_alias +#endif +#endif + +#ifdef bottom_hash +#undef xmlHashUpdateEntry3 +extern __typeof (xmlHashUpdateEntry3) xmlHashUpdateEntry3 __attribute((alias("xmlHashUpdateEntry3__internal_alias"))); +#else +#ifndef xmlHashUpdateEntry3 +extern __typeof (xmlHashUpdateEntry3) xmlHashUpdateEntry3__internal_alias __attribute((visibility("hidden"))); +#define xmlHashUpdateEntry3 xmlHashUpdateEntry3__internal_alias +#endif +#endif + +#if defined(LIBXML_FTP_ENABLED) +#ifdef bottom_xmlIO +#undef xmlIOFTPClose +extern __typeof (xmlIOFTPClose) xmlIOFTPClose __attribute((alias("xmlIOFTPClose__internal_alias"))); +#else +#ifndef xmlIOFTPClose +extern __typeof (xmlIOFTPClose) xmlIOFTPClose__internal_alias __attribute((visibility("hidden"))); +#define xmlIOFTPClose xmlIOFTPClose__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_FTP_ENABLED) +#ifdef bottom_xmlIO +#undef xmlIOFTPMatch +extern __typeof (xmlIOFTPMatch) xmlIOFTPMatch __attribute((alias("xmlIOFTPMatch__internal_alias"))); +#else +#ifndef xmlIOFTPMatch +extern __typeof (xmlIOFTPMatch) xmlIOFTPMatch__internal_alias __attribute((visibility("hidden"))); +#define xmlIOFTPMatch xmlIOFTPMatch__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_FTP_ENABLED) +#ifdef bottom_xmlIO +#undef xmlIOFTPOpen +extern __typeof (xmlIOFTPOpen) xmlIOFTPOpen __attribute((alias("xmlIOFTPOpen__internal_alias"))); +#else +#ifndef xmlIOFTPOpen +extern __typeof (xmlIOFTPOpen) xmlIOFTPOpen__internal_alias __attribute((visibility("hidden"))); +#define xmlIOFTPOpen xmlIOFTPOpen__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_FTP_ENABLED) +#ifdef bottom_xmlIO +#undef xmlIOFTPRead +extern __typeof (xmlIOFTPRead) xmlIOFTPRead __attribute((alias("xmlIOFTPRead__internal_alias"))); +#else +#ifndef xmlIOFTPRead +extern __typeof (xmlIOFTPRead) xmlIOFTPRead__internal_alias __attribute((visibility("hidden"))); +#define xmlIOFTPRead xmlIOFTPRead__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTTP_ENABLED) +#ifdef bottom_xmlIO +#undef xmlIOHTTPClose +extern __typeof (xmlIOHTTPClose) xmlIOHTTPClose __attribute((alias("xmlIOHTTPClose__internal_alias"))); +#else +#ifndef xmlIOHTTPClose +extern __typeof (xmlIOHTTPClose) xmlIOHTTPClose__internal_alias __attribute((visibility("hidden"))); +#define xmlIOHTTPClose xmlIOHTTPClose__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTTP_ENABLED) +#ifdef bottom_xmlIO +#undef xmlIOHTTPMatch +extern __typeof (xmlIOHTTPMatch) xmlIOHTTPMatch __attribute((alias("xmlIOHTTPMatch__internal_alias"))); +#else +#ifndef xmlIOHTTPMatch +extern __typeof (xmlIOHTTPMatch) xmlIOHTTPMatch__internal_alias __attribute((visibility("hidden"))); +#define xmlIOHTTPMatch xmlIOHTTPMatch__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTTP_ENABLED) +#ifdef bottom_xmlIO +#undef xmlIOHTTPOpen +extern __typeof (xmlIOHTTPOpen) xmlIOHTTPOpen __attribute((alias("xmlIOHTTPOpen__internal_alias"))); +#else +#ifndef xmlIOHTTPOpen +extern __typeof (xmlIOHTTPOpen) xmlIOHTTPOpen__internal_alias __attribute((visibility("hidden"))); +#define xmlIOHTTPOpen xmlIOHTTPOpen__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTTP_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlIO +#undef xmlIOHTTPOpenW +extern __typeof (xmlIOHTTPOpenW) xmlIOHTTPOpenW __attribute((alias("xmlIOHTTPOpenW__internal_alias"))); +#else +#ifndef xmlIOHTTPOpenW +extern __typeof (xmlIOHTTPOpenW) xmlIOHTTPOpenW__internal_alias __attribute((visibility("hidden"))); +#define xmlIOHTTPOpenW xmlIOHTTPOpenW__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTTP_ENABLED) +#ifdef bottom_xmlIO +#undef xmlIOHTTPRead +extern __typeof (xmlIOHTTPRead) xmlIOHTTPRead __attribute((alias("xmlIOHTTPRead__internal_alias"))); +#else +#ifndef xmlIOHTTPRead +extern __typeof (xmlIOHTTPRead) xmlIOHTTPRead__internal_alias __attribute((visibility("hidden"))); +#define xmlIOHTTPRead xmlIOHTTPRead__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_VALID_ENABLED) +#ifdef bottom_parser +#undef xmlIOParseDTD +extern __typeof (xmlIOParseDTD) xmlIOParseDTD __attribute((alias("xmlIOParseDTD__internal_alias"))); +#else +#ifndef xmlIOParseDTD +extern __typeof (xmlIOParseDTD) xmlIOParseDTD__internal_alias __attribute((visibility("hidden"))); +#define xmlIOParseDTD xmlIOParseDTD__internal_alias +#endif +#endif +#endif + +#ifdef bottom_encoding +#undef xmlInitCharEncodingHandlers +extern __typeof (xmlInitCharEncodingHandlers) xmlInitCharEncodingHandlers __attribute((alias("xmlInitCharEncodingHandlers__internal_alias"))); +#else +#ifndef xmlInitCharEncodingHandlers +extern __typeof (xmlInitCharEncodingHandlers) xmlInitCharEncodingHandlers__internal_alias __attribute((visibility("hidden"))); +#define xmlInitCharEncodingHandlers xmlInitCharEncodingHandlers__internal_alias +#endif +#endif + +#ifdef bottom_globals +#undef xmlInitGlobals +extern __typeof (xmlInitGlobals) xmlInitGlobals __attribute((alias("xmlInitGlobals__internal_alias"))); +#else +#ifndef xmlInitGlobals +extern __typeof (xmlInitGlobals) xmlInitGlobals__internal_alias __attribute((visibility("hidden"))); +#define xmlInitGlobals xmlInitGlobals__internal_alias +#endif +#endif + +#ifdef bottom_xmlmemory +#undef xmlInitMemory +extern __typeof (xmlInitMemory) xmlInitMemory __attribute((alias("xmlInitMemory__internal_alias"))); +#else +#ifndef xmlInitMemory +extern __typeof (xmlInitMemory) xmlInitMemory__internal_alias __attribute((visibility("hidden"))); +#define xmlInitMemory xmlInitMemory__internal_alias +#endif +#endif + +#ifdef bottom_parserInternals +#undef xmlInitNodeInfoSeq +extern __typeof (xmlInitNodeInfoSeq) xmlInitNodeInfoSeq __attribute((alias("xmlInitNodeInfoSeq__internal_alias"))); +#else +#ifndef xmlInitNodeInfoSeq +extern __typeof (xmlInitNodeInfoSeq) xmlInitNodeInfoSeq__internal_alias __attribute((visibility("hidden"))); +#define xmlInitNodeInfoSeq xmlInitNodeInfoSeq__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlInitParser +extern __typeof (xmlInitParser) xmlInitParser __attribute((alias("xmlInitParser__internal_alias"))); +#else +#ifndef xmlInitParser +extern __typeof (xmlInitParser) xmlInitParser__internal_alias __attribute((visibility("hidden"))); +#define xmlInitParser xmlInitParser__internal_alias +#endif +#endif + +#ifdef bottom_parserInternals +#undef xmlInitParserCtxt +extern __typeof (xmlInitParserCtxt) xmlInitParserCtxt __attribute((alias("xmlInitParserCtxt__internal_alias"))); +#else +#ifndef xmlInitParserCtxt +extern __typeof (xmlInitParserCtxt) xmlInitParserCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlInitParserCtxt xmlInitParserCtxt__internal_alias +#endif +#endif + +#ifdef bottom_threads +#undef xmlInitThreads +extern __typeof (xmlInitThreads) xmlInitThreads __attribute((alias("xmlInitThreads__internal_alias"))); +#else +#ifndef xmlInitThreads +extern __typeof (xmlInitThreads) xmlInitThreads__internal_alias __attribute((visibility("hidden"))); +#define xmlInitThreads xmlInitThreads__internal_alias +#endif +#endif + +#if defined(LIBXML_CATALOG_ENABLED) +#ifdef bottom_catalog +#undef xmlInitializeCatalog +extern __typeof (xmlInitializeCatalog) xmlInitializeCatalog __attribute((alias("xmlInitializeCatalog__internal_alias"))); +#else +#ifndef xmlInitializeCatalog +extern __typeof (xmlInitializeCatalog) xmlInitializeCatalog__internal_alias __attribute((visibility("hidden"))); +#define xmlInitializeCatalog xmlInitializeCatalog__internal_alias +#endif +#endif +#endif + +#ifdef bottom_dict +#undef xmlInitializeDict +extern __typeof (xmlInitializeDict) xmlInitializeDict __attribute((alias("xmlInitializeDict__internal_alias"))); +#else +#ifndef xmlInitializeDict +extern __typeof (xmlInitializeDict) xmlInitializeDict__internal_alias __attribute((visibility("hidden"))); +#define xmlInitializeDict xmlInitializeDict__internal_alias +#endif +#endif + +#ifdef bottom_globals +#undef xmlInitializeGlobalState +extern __typeof (xmlInitializeGlobalState) xmlInitializeGlobalState __attribute((alias("xmlInitializeGlobalState__internal_alias"))); +#else +#ifndef xmlInitializeGlobalState +extern __typeof (xmlInitializeGlobalState) xmlInitializeGlobalState__internal_alias __attribute((visibility("hidden"))); +#define xmlInitializeGlobalState xmlInitializeGlobalState__internal_alias +#endif +#endif + +#if defined(LIBXML_LEGACY_ENABLED) +#ifdef bottom_legacy +#undef xmlInitializePredefinedEntities +extern __typeof (xmlInitializePredefinedEntities) xmlInitializePredefinedEntities __attribute((alias("xmlInitializePredefinedEntities__internal_alias"))); +#else +#ifndef xmlInitializePredefinedEntities +extern __typeof (xmlInitializePredefinedEntities) xmlInitializePredefinedEntities__internal_alias __attribute((visibility("hidden"))); +#define xmlInitializePredefinedEntities xmlInitializePredefinedEntities__internal_alias +#endif +#endif +#endif + +#ifdef bottom_chvalid +#undef xmlIsBaseChar +extern __typeof (xmlIsBaseChar) xmlIsBaseChar __attribute((alias("xmlIsBaseChar__internal_alias"))); +#else +#ifndef xmlIsBaseChar +extern __typeof (xmlIsBaseChar) xmlIsBaseChar__internal_alias __attribute((visibility("hidden"))); +#define xmlIsBaseChar xmlIsBaseChar__internal_alias +#endif +#endif + +#ifdef bottom_chvalid +#undef xmlIsBlank +extern __typeof (xmlIsBlank) xmlIsBlank __attribute((alias("xmlIsBlank__internal_alias"))); +#else +#ifndef xmlIsBlank +extern __typeof (xmlIsBlank) xmlIsBlank__internal_alias __attribute((visibility("hidden"))); +#define xmlIsBlank xmlIsBlank__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlIsBlankNode +extern __typeof (xmlIsBlankNode) xmlIsBlankNode __attribute((alias("xmlIsBlankNode__internal_alias"))); +#else +#ifndef xmlIsBlankNode +extern __typeof (xmlIsBlankNode) xmlIsBlankNode__internal_alias __attribute((visibility("hidden"))); +#define xmlIsBlankNode xmlIsBlankNode__internal_alias +#endif +#endif + +#ifdef bottom_chvalid +#undef xmlIsChar +extern __typeof (xmlIsChar) xmlIsChar __attribute((alias("xmlIsChar__internal_alias"))); +#else +#ifndef xmlIsChar +extern __typeof (xmlIsChar) xmlIsChar__internal_alias __attribute((visibility("hidden"))); +#define xmlIsChar xmlIsChar__internal_alias +#endif +#endif + +#ifdef bottom_chvalid +#undef xmlIsCombining +extern __typeof (xmlIsCombining) xmlIsCombining __attribute((alias("xmlIsCombining__internal_alias"))); +#else +#ifndef xmlIsCombining +extern __typeof (xmlIsCombining) xmlIsCombining__internal_alias __attribute((visibility("hidden"))); +#define xmlIsCombining xmlIsCombining__internal_alias +#endif +#endif + +#ifdef bottom_chvalid +#undef xmlIsDigit +extern __typeof (xmlIsDigit) xmlIsDigit __attribute((alias("xmlIsDigit__internal_alias"))); +#else +#ifndef xmlIsDigit +extern __typeof (xmlIsDigit) xmlIsDigit__internal_alias __attribute((visibility("hidden"))); +#define xmlIsDigit xmlIsDigit__internal_alias +#endif +#endif + +#ifdef bottom_chvalid +#undef xmlIsExtender +extern __typeof (xmlIsExtender) xmlIsExtender __attribute((alias("xmlIsExtender__internal_alias"))); +#else +#ifndef xmlIsExtender +extern __typeof (xmlIsExtender) xmlIsExtender__internal_alias __attribute((visibility("hidden"))); +#define xmlIsExtender xmlIsExtender__internal_alias +#endif +#endif + +#ifdef bottom_valid +#undef xmlIsID +extern __typeof (xmlIsID) xmlIsID __attribute((alias("xmlIsID__internal_alias"))); +#else +#ifndef xmlIsID +extern __typeof (xmlIsID) xmlIsID__internal_alias __attribute((visibility("hidden"))); +#define xmlIsID xmlIsID__internal_alias +#endif +#endif + +#ifdef bottom_chvalid +#undef xmlIsIdeographic +extern __typeof (xmlIsIdeographic) xmlIsIdeographic __attribute((alias("xmlIsIdeographic__internal_alias"))); +#else +#ifndef xmlIsIdeographic +extern __typeof (xmlIsIdeographic) xmlIsIdeographic__internal_alias __attribute((visibility("hidden"))); +#define xmlIsIdeographic xmlIsIdeographic__internal_alias +#endif +#endif + +#ifdef bottom_parserInternals +#undef xmlIsLetter +extern __typeof (xmlIsLetter) xmlIsLetter __attribute((alias("xmlIsLetter__internal_alias"))); +#else +#ifndef xmlIsLetter +extern __typeof (xmlIsLetter) xmlIsLetter__internal_alias __attribute((visibility("hidden"))); +#define xmlIsLetter xmlIsLetter__internal_alias +#endif +#endif + +#ifdef bottom_threads +#undef xmlIsMainThread +extern __typeof (xmlIsMainThread) xmlIsMainThread __attribute((alias("xmlIsMainThread__internal_alias"))); +#else +#ifndef xmlIsMainThread +extern __typeof (xmlIsMainThread) xmlIsMainThread__internal_alias __attribute((visibility("hidden"))); +#define xmlIsMainThread xmlIsMainThread__internal_alias +#endif +#endif + +#ifdef bottom_valid +#undef xmlIsMixedElement +extern __typeof (xmlIsMixedElement) xmlIsMixedElement __attribute((alias("xmlIsMixedElement__internal_alias"))); +#else +#ifndef xmlIsMixedElement +extern __typeof (xmlIsMixedElement) xmlIsMixedElement__internal_alias __attribute((visibility("hidden"))); +#define xmlIsMixedElement xmlIsMixedElement__internal_alias +#endif +#endif + +#ifdef bottom_chvalid +#undef xmlIsPubidChar +extern __typeof (xmlIsPubidChar) xmlIsPubidChar __attribute((alias("xmlIsPubidChar__internal_alias"))); +#else +#ifndef xmlIsPubidChar +extern __typeof (xmlIsPubidChar) xmlIsPubidChar__internal_alias __attribute((visibility("hidden"))); +#define xmlIsPubidChar xmlIsPubidChar__internal_alias +#endif +#endif + +#ifdef bottom_valid +#undef xmlIsRef +extern __typeof (xmlIsRef) xmlIsRef __attribute((alias("xmlIsRef__internal_alias"))); +#else +#ifndef xmlIsRef +extern __typeof (xmlIsRef) xmlIsRef__internal_alias __attribute((visibility("hidden"))); +#define xmlIsRef xmlIsRef__internal_alias +#endif +#endif + +#ifdef bottom_xmlsave +#undef xmlIsXHTML +extern __typeof (xmlIsXHTML) xmlIsXHTML __attribute((alias("xmlIsXHTML__internal_alias"))); +#else +#ifndef xmlIsXHTML +extern __typeof (xmlIsXHTML) xmlIsXHTML__internal_alias __attribute((visibility("hidden"))); +#define xmlIsXHTML xmlIsXHTML__internal_alias +#endif +#endif + +#ifdef bottom_parserInternals +#undef xmlKeepBlanksDefault +extern __typeof (xmlKeepBlanksDefault) xmlKeepBlanksDefault __attribute((alias("xmlKeepBlanksDefault__internal_alias"))); +#else +#ifndef xmlKeepBlanksDefault +extern __typeof (xmlKeepBlanksDefault) xmlKeepBlanksDefault__internal_alias __attribute((visibility("hidden"))); +#define xmlKeepBlanksDefault xmlKeepBlanksDefault__internal_alias +#endif +#endif + +#if defined(LIBXML_TREE_ENABLED) +#ifdef bottom_tree +#undef xmlLastElementChild +extern __typeof (xmlLastElementChild) xmlLastElementChild __attribute((alias("xmlLastElementChild__internal_alias"))); +#else +#ifndef xmlLastElementChild +extern __typeof (xmlLastElementChild) xmlLastElementChild__internal_alias __attribute((visibility("hidden"))); +#define xmlLastElementChild xmlLastElementChild__internal_alias +#endif +#endif +#endif + +#ifdef bottom_parserInternals +#undef xmlLineNumbersDefault +extern __typeof (xmlLineNumbersDefault) xmlLineNumbersDefault __attribute((alias("xmlLineNumbersDefault__internal_alias"))); +#else +#ifndef xmlLineNumbersDefault +extern __typeof (xmlLineNumbersDefault) xmlLineNumbersDefault__internal_alias __attribute((visibility("hidden"))); +#define xmlLineNumbersDefault xmlLineNumbersDefault__internal_alias +#endif +#endif + +#ifdef bottom_list +#undef xmlLinkGetData +extern __typeof (xmlLinkGetData) xmlLinkGetData __attribute((alias("xmlLinkGetData__internal_alias"))); +#else +#ifndef xmlLinkGetData +extern __typeof (xmlLinkGetData) xmlLinkGetData__internal_alias __attribute((visibility("hidden"))); +#define xmlLinkGetData xmlLinkGetData__internal_alias +#endif +#endif + +#ifdef bottom_list +#undef xmlListAppend +extern __typeof (xmlListAppend) xmlListAppend __attribute((alias("xmlListAppend__internal_alias"))); +#else +#ifndef xmlListAppend +extern __typeof (xmlListAppend) xmlListAppend__internal_alias __attribute((visibility("hidden"))); +#define xmlListAppend xmlListAppend__internal_alias +#endif +#endif + +#ifdef bottom_list +#undef xmlListClear +extern __typeof (xmlListClear) xmlListClear __attribute((alias("xmlListClear__internal_alias"))); +#else +#ifndef xmlListClear +extern __typeof (xmlListClear) xmlListClear__internal_alias __attribute((visibility("hidden"))); +#define xmlListClear xmlListClear__internal_alias +#endif +#endif + +#ifdef bottom_list +#undef xmlListCopy +extern __typeof (xmlListCopy) xmlListCopy __attribute((alias("xmlListCopy__internal_alias"))); +#else +#ifndef xmlListCopy +extern __typeof (xmlListCopy) xmlListCopy__internal_alias __attribute((visibility("hidden"))); +#define xmlListCopy xmlListCopy__internal_alias +#endif +#endif + +#ifdef bottom_list +#undef xmlListCreate +extern __typeof (xmlListCreate) xmlListCreate __attribute((alias("xmlListCreate__internal_alias"))); +#else +#ifndef xmlListCreate +extern __typeof (xmlListCreate) xmlListCreate__internal_alias __attribute((visibility("hidden"))); +#define xmlListCreate xmlListCreate__internal_alias +#endif +#endif + +#ifdef bottom_list +#undef xmlListDelete +extern __typeof (xmlListDelete) xmlListDelete __attribute((alias("xmlListDelete__internal_alias"))); +#else +#ifndef xmlListDelete +extern __typeof (xmlListDelete) xmlListDelete__internal_alias __attribute((visibility("hidden"))); +#define xmlListDelete xmlListDelete__internal_alias +#endif +#endif + +#ifdef bottom_list +#undef xmlListDup +extern __typeof (xmlListDup) xmlListDup __attribute((alias("xmlListDup__internal_alias"))); +#else +#ifndef xmlListDup +extern __typeof (xmlListDup) xmlListDup__internal_alias __attribute((visibility("hidden"))); +#define xmlListDup xmlListDup__internal_alias +#endif +#endif + +#ifdef bottom_list +#undef xmlListEmpty +extern __typeof (xmlListEmpty) xmlListEmpty __attribute((alias("xmlListEmpty__internal_alias"))); +#else +#ifndef xmlListEmpty +extern __typeof (xmlListEmpty) xmlListEmpty__internal_alias __attribute((visibility("hidden"))); +#define xmlListEmpty xmlListEmpty__internal_alias +#endif +#endif + +#ifdef bottom_list +#undef xmlListEnd +extern __typeof (xmlListEnd) xmlListEnd __attribute((alias("xmlListEnd__internal_alias"))); +#else +#ifndef xmlListEnd +extern __typeof (xmlListEnd) xmlListEnd__internal_alias __attribute((visibility("hidden"))); +#define xmlListEnd xmlListEnd__internal_alias +#endif +#endif + +#ifdef bottom_list +#undef xmlListFront +extern __typeof (xmlListFront) xmlListFront __attribute((alias("xmlListFront__internal_alias"))); +#else +#ifndef xmlListFront +extern __typeof (xmlListFront) xmlListFront__internal_alias __attribute((visibility("hidden"))); +#define xmlListFront xmlListFront__internal_alias +#endif +#endif + +#ifdef bottom_list +#undef xmlListInsert +extern __typeof (xmlListInsert) xmlListInsert __attribute((alias("xmlListInsert__internal_alias"))); +#else +#ifndef xmlListInsert +extern __typeof (xmlListInsert) xmlListInsert__internal_alias __attribute((visibility("hidden"))); +#define xmlListInsert xmlListInsert__internal_alias +#endif +#endif + +#ifdef bottom_list +#undef xmlListMerge +extern __typeof (xmlListMerge) xmlListMerge __attribute((alias("xmlListMerge__internal_alias"))); +#else +#ifndef xmlListMerge +extern __typeof (xmlListMerge) xmlListMerge__internal_alias __attribute((visibility("hidden"))); +#define xmlListMerge xmlListMerge__internal_alias +#endif +#endif + +#ifdef bottom_list +#undef xmlListPopBack +extern __typeof (xmlListPopBack) xmlListPopBack __attribute((alias("xmlListPopBack__internal_alias"))); +#else +#ifndef xmlListPopBack +extern __typeof (xmlListPopBack) xmlListPopBack__internal_alias __attribute((visibility("hidden"))); +#define xmlListPopBack xmlListPopBack__internal_alias +#endif +#endif + +#ifdef bottom_list +#undef xmlListPopFront +extern __typeof (xmlListPopFront) xmlListPopFront __attribute((alias("xmlListPopFront__internal_alias"))); +#else +#ifndef xmlListPopFront +extern __typeof (xmlListPopFront) xmlListPopFront__internal_alias __attribute((visibility("hidden"))); +#define xmlListPopFront xmlListPopFront__internal_alias +#endif +#endif + +#ifdef bottom_list +#undef xmlListPushBack +extern __typeof (xmlListPushBack) xmlListPushBack __attribute((alias("xmlListPushBack__internal_alias"))); +#else +#ifndef xmlListPushBack +extern __typeof (xmlListPushBack) xmlListPushBack__internal_alias __attribute((visibility("hidden"))); +#define xmlListPushBack xmlListPushBack__internal_alias +#endif +#endif + +#ifdef bottom_list +#undef xmlListPushFront +extern __typeof (xmlListPushFront) xmlListPushFront __attribute((alias("xmlListPushFront__internal_alias"))); +#else +#ifndef xmlListPushFront +extern __typeof (xmlListPushFront) xmlListPushFront__internal_alias __attribute((visibility("hidden"))); +#define xmlListPushFront xmlListPushFront__internal_alias +#endif +#endif + +#ifdef bottom_list +#undef xmlListRemoveAll +extern __typeof (xmlListRemoveAll) xmlListRemoveAll __attribute((alias("xmlListRemoveAll__internal_alias"))); +#else +#ifndef xmlListRemoveAll +extern __typeof (xmlListRemoveAll) xmlListRemoveAll__internal_alias __attribute((visibility("hidden"))); +#define xmlListRemoveAll xmlListRemoveAll__internal_alias +#endif +#endif + +#ifdef bottom_list +#undef xmlListRemoveFirst +extern __typeof (xmlListRemoveFirst) xmlListRemoveFirst __attribute((alias("xmlListRemoveFirst__internal_alias"))); +#else +#ifndef xmlListRemoveFirst +extern __typeof (xmlListRemoveFirst) xmlListRemoveFirst__internal_alias __attribute((visibility("hidden"))); +#define xmlListRemoveFirst xmlListRemoveFirst__internal_alias +#endif +#endif + +#ifdef bottom_list +#undef xmlListRemoveLast +extern __typeof (xmlListRemoveLast) xmlListRemoveLast __attribute((alias("xmlListRemoveLast__internal_alias"))); +#else +#ifndef xmlListRemoveLast +extern __typeof (xmlListRemoveLast) xmlListRemoveLast__internal_alias __attribute((visibility("hidden"))); +#define xmlListRemoveLast xmlListRemoveLast__internal_alias +#endif +#endif + +#ifdef bottom_list +#undef xmlListReverse +extern __typeof (xmlListReverse) xmlListReverse __attribute((alias("xmlListReverse__internal_alias"))); +#else +#ifndef xmlListReverse +extern __typeof (xmlListReverse) xmlListReverse__internal_alias __attribute((visibility("hidden"))); +#define xmlListReverse xmlListReverse__internal_alias +#endif +#endif + +#ifdef bottom_list +#undef xmlListReverseSearch +extern __typeof (xmlListReverseSearch) xmlListReverseSearch __attribute((alias("xmlListReverseSearch__internal_alias"))); +#else +#ifndef xmlListReverseSearch +extern __typeof (xmlListReverseSearch) xmlListReverseSearch__internal_alias __attribute((visibility("hidden"))); +#define xmlListReverseSearch xmlListReverseSearch__internal_alias +#endif +#endif + +#ifdef bottom_list +#undef xmlListReverseWalk +extern __typeof (xmlListReverseWalk) xmlListReverseWalk __attribute((alias("xmlListReverseWalk__internal_alias"))); +#else +#ifndef xmlListReverseWalk +extern __typeof (xmlListReverseWalk) xmlListReverseWalk__internal_alias __attribute((visibility("hidden"))); +#define xmlListReverseWalk xmlListReverseWalk__internal_alias +#endif +#endif + +#ifdef bottom_list +#undef xmlListSearch +extern __typeof (xmlListSearch) xmlListSearch __attribute((alias("xmlListSearch__internal_alias"))); +#else +#ifndef xmlListSearch +extern __typeof (xmlListSearch) xmlListSearch__internal_alias __attribute((visibility("hidden"))); +#define xmlListSearch xmlListSearch__internal_alias +#endif +#endif + +#ifdef bottom_list +#undef xmlListSize +extern __typeof (xmlListSize) xmlListSize __attribute((alias("xmlListSize__internal_alias"))); +#else +#ifndef xmlListSize +extern __typeof (xmlListSize) xmlListSize__internal_alias __attribute((visibility("hidden"))); +#define xmlListSize xmlListSize__internal_alias +#endif +#endif + +#ifdef bottom_list +#undef xmlListSort +extern __typeof (xmlListSort) xmlListSort __attribute((alias("xmlListSort__internal_alias"))); +#else +#ifndef xmlListSort +extern __typeof (xmlListSort) xmlListSort__internal_alias __attribute((visibility("hidden"))); +#define xmlListSort xmlListSort__internal_alias +#endif +#endif + +#ifdef bottom_list +#undef xmlListWalk +extern __typeof (xmlListWalk) xmlListWalk __attribute((alias("xmlListWalk__internal_alias"))); +#else +#ifndef xmlListWalk +extern __typeof (xmlListWalk) xmlListWalk__internal_alias __attribute((visibility("hidden"))); +#define xmlListWalk xmlListWalk__internal_alias +#endif +#endif + +#if defined(LIBXML_CATALOG_ENABLED) +#ifdef bottom_catalog +#undef xmlLoadACatalog +extern __typeof (xmlLoadACatalog) xmlLoadACatalog __attribute((alias("xmlLoadACatalog__internal_alias"))); +#else +#ifndef xmlLoadACatalog +extern __typeof (xmlLoadACatalog) xmlLoadACatalog__internal_alias __attribute((visibility("hidden"))); +#define xmlLoadACatalog xmlLoadACatalog__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_CATALOG_ENABLED) +#ifdef bottom_catalog +#undef xmlLoadCatalog +extern __typeof (xmlLoadCatalog) xmlLoadCatalog __attribute((alias("xmlLoadCatalog__internal_alias"))); +#else +#ifndef xmlLoadCatalog +extern __typeof (xmlLoadCatalog) xmlLoadCatalog__internal_alias __attribute((visibility("hidden"))); +#define xmlLoadCatalog xmlLoadCatalog__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_CATALOG_ENABLED) +#ifdef bottom_catalog +#undef xmlLoadCatalogs +extern __typeof (xmlLoadCatalogs) xmlLoadCatalogs __attribute((alias("xmlLoadCatalogs__internal_alias"))); +#else +#ifndef xmlLoadCatalogs +extern __typeof (xmlLoadCatalogs) xmlLoadCatalogs__internal_alias __attribute((visibility("hidden"))); +#define xmlLoadCatalogs xmlLoadCatalogs__internal_alias +#endif +#endif +#endif + +#ifdef bottom_xmlIO +#undef xmlLoadExternalEntity +extern __typeof (xmlLoadExternalEntity) xmlLoadExternalEntity __attribute((alias("xmlLoadExternalEntity__internal_alias"))); +#else +#ifndef xmlLoadExternalEntity +extern __typeof (xmlLoadExternalEntity) xmlLoadExternalEntity__internal_alias __attribute((visibility("hidden"))); +#define xmlLoadExternalEntity xmlLoadExternalEntity__internal_alias +#endif +#endif + +#if defined(LIBXML_CATALOG_ENABLED) +#ifdef bottom_catalog +#undef xmlLoadSGMLSuperCatalog +extern __typeof (xmlLoadSGMLSuperCatalog) xmlLoadSGMLSuperCatalog __attribute((alias("xmlLoadSGMLSuperCatalog__internal_alias"))); +#else +#ifndef xmlLoadSGMLSuperCatalog +extern __typeof (xmlLoadSGMLSuperCatalog) xmlLoadSGMLSuperCatalog__internal_alias __attribute((visibility("hidden"))); +#define xmlLoadSGMLSuperCatalog xmlLoadSGMLSuperCatalog__internal_alias +#endif +#endif +#endif + +#ifdef bottom_threads +#undef xmlLockLibrary +extern __typeof (xmlLockLibrary) xmlLockLibrary __attribute((alias("xmlLockLibrary__internal_alias"))); +#else +#ifndef xmlLockLibrary +extern __typeof (xmlLockLibrary) xmlLockLibrary__internal_alias __attribute((visibility("hidden"))); +#define xmlLockLibrary xmlLockLibrary__internal_alias +#endif +#endif + +#if defined(LIBXML_DEBUG_ENABLED) +#ifdef bottom_debugXML +#undef xmlLsCountNode +extern __typeof (xmlLsCountNode) xmlLsCountNode __attribute((alias("xmlLsCountNode__internal_alias"))); +#else +#ifndef xmlLsCountNode +extern __typeof (xmlLsCountNode) xmlLsCountNode__internal_alias __attribute((visibility("hidden"))); +#define xmlLsCountNode xmlLsCountNode__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_DEBUG_ENABLED) +#ifdef bottom_debugXML +#undef xmlLsOneNode +extern __typeof (xmlLsOneNode) xmlLsOneNode __attribute((alias("xmlLsOneNode__internal_alias"))); +#else +#ifndef xmlLsOneNode +extern __typeof (xmlLsOneNode) xmlLsOneNode__internal_alias __attribute((visibility("hidden"))); +#define xmlLsOneNode xmlLsOneNode__internal_alias +#endif +#endif +#endif + +#ifdef bottom_xmlmemory +#undef xmlMallocAtomicLoc +extern __typeof (xmlMallocAtomicLoc) xmlMallocAtomicLoc __attribute((alias("xmlMallocAtomicLoc__internal_alias"))); +#else +#ifndef xmlMallocAtomicLoc +extern __typeof (xmlMallocAtomicLoc) xmlMallocAtomicLoc__internal_alias __attribute((visibility("hidden"))); +#define xmlMallocAtomicLoc xmlMallocAtomicLoc__internal_alias +#endif +#endif + +#ifdef bottom_xmlmemory +#undef xmlMallocLoc +extern __typeof (xmlMallocLoc) xmlMallocLoc __attribute((alias("xmlMallocLoc__internal_alias"))); +#else +#ifndef xmlMallocLoc +extern __typeof (xmlMallocLoc) xmlMallocLoc__internal_alias __attribute((visibility("hidden"))); +#define xmlMallocLoc xmlMallocLoc__internal_alias +#endif +#endif + +#ifdef bottom_xmlmemory +#undef xmlMemBlocks +extern __typeof (xmlMemBlocks) xmlMemBlocks __attribute((alias("xmlMemBlocks__internal_alias"))); +#else +#ifndef xmlMemBlocks +extern __typeof (xmlMemBlocks) xmlMemBlocks__internal_alias __attribute((visibility("hidden"))); +#define xmlMemBlocks xmlMemBlocks__internal_alias +#endif +#endif + +#ifdef bottom_xmlmemory +#undef xmlMemDisplay +extern __typeof (xmlMemDisplay) xmlMemDisplay __attribute((alias("xmlMemDisplay__internal_alias"))); +#else +#ifndef xmlMemDisplay +extern __typeof (xmlMemDisplay) xmlMemDisplay__internal_alias __attribute((visibility("hidden"))); +#define xmlMemDisplay xmlMemDisplay__internal_alias +#endif +#endif + +#ifdef bottom_xmlmemory +#undef xmlMemDisplayLast +extern __typeof (xmlMemDisplayLast) xmlMemDisplayLast __attribute((alias("xmlMemDisplayLast__internal_alias"))); +#else +#ifndef xmlMemDisplayLast +extern __typeof (xmlMemDisplayLast) xmlMemDisplayLast__internal_alias __attribute((visibility("hidden"))); +#define xmlMemDisplayLast xmlMemDisplayLast__internal_alias +#endif +#endif + +#ifdef bottom_xmlmemory +#undef xmlMemFree +extern __typeof (xmlMemFree) xmlMemFree __attribute((alias("xmlMemFree__internal_alias"))); +#else +#ifndef xmlMemFree +extern __typeof (xmlMemFree) xmlMemFree__internal_alias __attribute((visibility("hidden"))); +#define xmlMemFree xmlMemFree__internal_alias +#endif +#endif + +#ifdef bottom_xmlmemory +#undef xmlMemGet +extern __typeof (xmlMemGet) xmlMemGet __attribute((alias("xmlMemGet__internal_alias"))); +#else +#ifndef xmlMemGet +extern __typeof (xmlMemGet) xmlMemGet__internal_alias __attribute((visibility("hidden"))); +#define xmlMemGet xmlMemGet__internal_alias +#endif +#endif + +#ifdef bottom_xmlmemory +#undef xmlMemMalloc +extern __typeof (xmlMemMalloc) xmlMemMalloc __attribute((alias("xmlMemMalloc__internal_alias"))); +#else +#ifndef xmlMemMalloc +extern __typeof (xmlMemMalloc) xmlMemMalloc__internal_alias __attribute((visibility("hidden"))); +#define xmlMemMalloc xmlMemMalloc__internal_alias +#endif +#endif + +#ifdef bottom_xmlmemory +#undef xmlMemRealloc +extern __typeof (xmlMemRealloc) xmlMemRealloc __attribute((alias("xmlMemRealloc__internal_alias"))); +#else +#ifndef xmlMemRealloc +extern __typeof (xmlMemRealloc) xmlMemRealloc__internal_alias __attribute((visibility("hidden"))); +#define xmlMemRealloc xmlMemRealloc__internal_alias +#endif +#endif + +#ifdef bottom_xmlmemory +#undef xmlMemSetup +extern __typeof (xmlMemSetup) xmlMemSetup __attribute((alias("xmlMemSetup__internal_alias"))); +#else +#ifndef xmlMemSetup +extern __typeof (xmlMemSetup) xmlMemSetup__internal_alias __attribute((visibility("hidden"))); +#define xmlMemSetup xmlMemSetup__internal_alias +#endif +#endif + +#ifdef bottom_xmlmemory +#undef xmlMemShow +extern __typeof (xmlMemShow) xmlMemShow __attribute((alias("xmlMemShow__internal_alias"))); +#else +#ifndef xmlMemShow +extern __typeof (xmlMemShow) xmlMemShow__internal_alias __attribute((visibility("hidden"))); +#define xmlMemShow xmlMemShow__internal_alias +#endif +#endif + +#ifdef bottom_xmlmemory +#undef xmlMemStrdupLoc +extern __typeof (xmlMemStrdupLoc) xmlMemStrdupLoc __attribute((alias("xmlMemStrdupLoc__internal_alias"))); +#else +#ifndef xmlMemStrdupLoc +extern __typeof (xmlMemStrdupLoc) xmlMemStrdupLoc__internal_alias __attribute((visibility("hidden"))); +#define xmlMemStrdupLoc xmlMemStrdupLoc__internal_alias +#endif +#endif + +#ifdef bottom_xmlmemory +#undef xmlMemUsed +extern __typeof (xmlMemUsed) xmlMemUsed __attribute((alias("xmlMemUsed__internal_alias"))); +#else +#ifndef xmlMemUsed +extern __typeof (xmlMemUsed) xmlMemUsed__internal_alias __attribute((visibility("hidden"))); +#define xmlMemUsed xmlMemUsed__internal_alias +#endif +#endif + +#ifdef bottom_xmlmemory +#undef xmlMemoryDump +extern __typeof (xmlMemoryDump) xmlMemoryDump __attribute((alias("xmlMemoryDump__internal_alias"))); +#else +#ifndef xmlMemoryDump +extern __typeof (xmlMemoryDump) xmlMemoryDump__internal_alias __attribute((visibility("hidden"))); +#define xmlMemoryDump xmlMemoryDump__internal_alias +#endif +#endif + +#ifdef bottom_xmlmemory +#undef xmlMemoryStrdup +extern __typeof (xmlMemoryStrdup) xmlMemoryStrdup __attribute((alias("xmlMemoryStrdup__internal_alias"))); +#else +#ifndef xmlMemoryStrdup +extern __typeof (xmlMemoryStrdup) xmlMemoryStrdup__internal_alias __attribute((visibility("hidden"))); +#define xmlMemoryStrdup xmlMemoryStrdup__internal_alias +#endif +#endif + +#if defined(LIBXML_MODULES_ENABLED) +#ifdef bottom_xmlmodule +#undef xmlModuleClose +extern __typeof (xmlModuleClose) xmlModuleClose __attribute((alias("xmlModuleClose__internal_alias"))); +#else +#ifndef xmlModuleClose +extern __typeof (xmlModuleClose) xmlModuleClose__internal_alias __attribute((visibility("hidden"))); +#define xmlModuleClose xmlModuleClose__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_MODULES_ENABLED) +#ifdef bottom_xmlmodule +#undef xmlModuleFree +extern __typeof (xmlModuleFree) xmlModuleFree __attribute((alias("xmlModuleFree__internal_alias"))); +#else +#ifndef xmlModuleFree +extern __typeof (xmlModuleFree) xmlModuleFree__internal_alias __attribute((visibility("hidden"))); +#define xmlModuleFree xmlModuleFree__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_MODULES_ENABLED) +#ifdef bottom_xmlmodule +#undef xmlModuleOpen +extern __typeof (xmlModuleOpen) xmlModuleOpen __attribute((alias("xmlModuleOpen__internal_alias"))); +#else +#ifndef xmlModuleOpen +extern __typeof (xmlModuleOpen) xmlModuleOpen__internal_alias __attribute((visibility("hidden"))); +#define xmlModuleOpen xmlModuleOpen__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_MODULES_ENABLED) +#ifdef bottom_xmlmodule +#undef xmlModuleSymbol +extern __typeof (xmlModuleSymbol) xmlModuleSymbol __attribute((alias("xmlModuleSymbol__internal_alias"))); +#else +#ifndef xmlModuleSymbol +extern __typeof (xmlModuleSymbol) xmlModuleSymbol__internal_alias __attribute((visibility("hidden"))); +#define xmlModuleSymbol xmlModuleSymbol__internal_alias +#endif +#endif +#endif + +#ifdef bottom_threads +#undef xmlMutexLock +extern __typeof (xmlMutexLock) xmlMutexLock __attribute((alias("xmlMutexLock__internal_alias"))); +#else +#ifndef xmlMutexLock +extern __typeof (xmlMutexLock) xmlMutexLock__internal_alias __attribute((visibility("hidden"))); +#define xmlMutexLock xmlMutexLock__internal_alias +#endif +#endif + +#ifdef bottom_threads +#undef xmlMutexUnlock +extern __typeof (xmlMutexUnlock) xmlMutexUnlock __attribute((alias("xmlMutexUnlock__internal_alias"))); +#else +#ifndef xmlMutexUnlock +extern __typeof (xmlMutexUnlock) xmlMutexUnlock__internal_alias __attribute((visibility("hidden"))); +#define xmlMutexUnlock xmlMutexUnlock__internal_alias +#endif +#endif + +#if defined(LIBXML_LEGACY_ENABLED) +#ifdef bottom_legacy +#undef xmlNamespaceParseNCName +extern __typeof (xmlNamespaceParseNCName) xmlNamespaceParseNCName __attribute((alias("xmlNamespaceParseNCName__internal_alias"))); +#else +#ifndef xmlNamespaceParseNCName +extern __typeof (xmlNamespaceParseNCName) xmlNamespaceParseNCName__internal_alias __attribute((visibility("hidden"))); +#define xmlNamespaceParseNCName xmlNamespaceParseNCName__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_LEGACY_ENABLED) +#ifdef bottom_legacy +#undef xmlNamespaceParseNSDef +extern __typeof (xmlNamespaceParseNSDef) xmlNamespaceParseNSDef __attribute((alias("xmlNamespaceParseNSDef__internal_alias"))); +#else +#ifndef xmlNamespaceParseNSDef +extern __typeof (xmlNamespaceParseNSDef) xmlNamespaceParseNSDef__internal_alias __attribute((visibility("hidden"))); +#define xmlNamespaceParseNSDef xmlNamespaceParseNSDef__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_LEGACY_ENABLED) +#ifdef bottom_legacy +#undef xmlNamespaceParseQName +extern __typeof (xmlNamespaceParseQName) xmlNamespaceParseQName __attribute((alias("xmlNamespaceParseQName__internal_alias"))); +#else +#ifndef xmlNamespaceParseQName +extern __typeof (xmlNamespaceParseQName) xmlNamespaceParseQName__internal_alias __attribute((visibility("hidden"))); +#define xmlNamespaceParseQName xmlNamespaceParseQName__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_FTP_ENABLED) +#ifdef bottom_nanoftp +#undef xmlNanoFTPCheckResponse +extern __typeof (xmlNanoFTPCheckResponse) xmlNanoFTPCheckResponse __attribute((alias("xmlNanoFTPCheckResponse__internal_alias"))); +#else +#ifndef xmlNanoFTPCheckResponse +extern __typeof (xmlNanoFTPCheckResponse) xmlNanoFTPCheckResponse__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoFTPCheckResponse xmlNanoFTPCheckResponse__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_FTP_ENABLED) +#ifdef bottom_nanoftp +#undef xmlNanoFTPCleanup +extern __typeof (xmlNanoFTPCleanup) xmlNanoFTPCleanup __attribute((alias("xmlNanoFTPCleanup__internal_alias"))); +#else +#ifndef xmlNanoFTPCleanup +extern __typeof (xmlNanoFTPCleanup) xmlNanoFTPCleanup__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoFTPCleanup xmlNanoFTPCleanup__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_FTP_ENABLED) +#ifdef bottom_nanoftp +#undef xmlNanoFTPClose +extern __typeof (xmlNanoFTPClose) xmlNanoFTPClose __attribute((alias("xmlNanoFTPClose__internal_alias"))); +#else +#ifndef xmlNanoFTPClose +extern __typeof (xmlNanoFTPClose) xmlNanoFTPClose__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoFTPClose xmlNanoFTPClose__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_FTP_ENABLED) +#ifdef bottom_nanoftp +#undef xmlNanoFTPCloseConnection +extern __typeof (xmlNanoFTPCloseConnection) xmlNanoFTPCloseConnection __attribute((alias("xmlNanoFTPCloseConnection__internal_alias"))); +#else +#ifndef xmlNanoFTPCloseConnection +extern __typeof (xmlNanoFTPCloseConnection) xmlNanoFTPCloseConnection__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoFTPCloseConnection xmlNanoFTPCloseConnection__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_FTP_ENABLED) +#ifdef bottom_nanoftp +#undef xmlNanoFTPConnect +extern __typeof (xmlNanoFTPConnect) xmlNanoFTPConnect __attribute((alias("xmlNanoFTPConnect__internal_alias"))); +#else +#ifndef xmlNanoFTPConnect +extern __typeof (xmlNanoFTPConnect) xmlNanoFTPConnect__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoFTPConnect xmlNanoFTPConnect__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_FTP_ENABLED) +#ifdef bottom_nanoftp +#undef xmlNanoFTPConnectTo +extern __typeof (xmlNanoFTPConnectTo) xmlNanoFTPConnectTo __attribute((alias("xmlNanoFTPConnectTo__internal_alias"))); +#else +#ifndef xmlNanoFTPConnectTo +extern __typeof (xmlNanoFTPConnectTo) xmlNanoFTPConnectTo__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoFTPConnectTo xmlNanoFTPConnectTo__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_FTP_ENABLED) +#ifdef bottom_nanoftp +#undef xmlNanoFTPCwd +extern __typeof (xmlNanoFTPCwd) xmlNanoFTPCwd __attribute((alias("xmlNanoFTPCwd__internal_alias"))); +#else +#ifndef xmlNanoFTPCwd +extern __typeof (xmlNanoFTPCwd) xmlNanoFTPCwd__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoFTPCwd xmlNanoFTPCwd__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_FTP_ENABLED) +#ifdef bottom_nanoftp +#undef xmlNanoFTPDele +extern __typeof (xmlNanoFTPDele) xmlNanoFTPDele __attribute((alias("xmlNanoFTPDele__internal_alias"))); +#else +#ifndef xmlNanoFTPDele +extern __typeof (xmlNanoFTPDele) xmlNanoFTPDele__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoFTPDele xmlNanoFTPDele__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_FTP_ENABLED) +#ifdef bottom_nanoftp +#undef xmlNanoFTPFreeCtxt +extern __typeof (xmlNanoFTPFreeCtxt) xmlNanoFTPFreeCtxt __attribute((alias("xmlNanoFTPFreeCtxt__internal_alias"))); +#else +#ifndef xmlNanoFTPFreeCtxt +extern __typeof (xmlNanoFTPFreeCtxt) xmlNanoFTPFreeCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoFTPFreeCtxt xmlNanoFTPFreeCtxt__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_FTP_ENABLED) +#ifdef bottom_nanoftp +#undef xmlNanoFTPGet +extern __typeof (xmlNanoFTPGet) xmlNanoFTPGet __attribute((alias("xmlNanoFTPGet__internal_alias"))); +#else +#ifndef xmlNanoFTPGet +extern __typeof (xmlNanoFTPGet) xmlNanoFTPGet__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoFTPGet xmlNanoFTPGet__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_FTP_ENABLED) +#ifdef bottom_nanoftp +#undef xmlNanoFTPGetConnection +extern __typeof (xmlNanoFTPGetConnection) xmlNanoFTPGetConnection __attribute((alias("xmlNanoFTPGetConnection__internal_alias"))); +#else +#ifndef xmlNanoFTPGetConnection +extern __typeof (xmlNanoFTPGetConnection) xmlNanoFTPGetConnection__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoFTPGetConnection xmlNanoFTPGetConnection__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_FTP_ENABLED) +#ifdef bottom_nanoftp +#undef xmlNanoFTPGetResponse +extern __typeof (xmlNanoFTPGetResponse) xmlNanoFTPGetResponse __attribute((alias("xmlNanoFTPGetResponse__internal_alias"))); +#else +#ifndef xmlNanoFTPGetResponse +extern __typeof (xmlNanoFTPGetResponse) xmlNanoFTPGetResponse__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoFTPGetResponse xmlNanoFTPGetResponse__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_FTP_ENABLED) +#ifdef bottom_nanoftp +#undef xmlNanoFTPGetSocket +extern __typeof (xmlNanoFTPGetSocket) xmlNanoFTPGetSocket __attribute((alias("xmlNanoFTPGetSocket__internal_alias"))); +#else +#ifndef xmlNanoFTPGetSocket +extern __typeof (xmlNanoFTPGetSocket) xmlNanoFTPGetSocket__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoFTPGetSocket xmlNanoFTPGetSocket__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_FTP_ENABLED) +#ifdef bottom_nanoftp +#undef xmlNanoFTPInit +extern __typeof (xmlNanoFTPInit) xmlNanoFTPInit __attribute((alias("xmlNanoFTPInit__internal_alias"))); +#else +#ifndef xmlNanoFTPInit +extern __typeof (xmlNanoFTPInit) xmlNanoFTPInit__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoFTPInit xmlNanoFTPInit__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_FTP_ENABLED) +#ifdef bottom_nanoftp +#undef xmlNanoFTPList +extern __typeof (xmlNanoFTPList) xmlNanoFTPList __attribute((alias("xmlNanoFTPList__internal_alias"))); +#else +#ifndef xmlNanoFTPList +extern __typeof (xmlNanoFTPList) xmlNanoFTPList__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoFTPList xmlNanoFTPList__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_FTP_ENABLED) +#ifdef bottom_nanoftp +#undef xmlNanoFTPNewCtxt +extern __typeof (xmlNanoFTPNewCtxt) xmlNanoFTPNewCtxt __attribute((alias("xmlNanoFTPNewCtxt__internal_alias"))); +#else +#ifndef xmlNanoFTPNewCtxt +extern __typeof (xmlNanoFTPNewCtxt) xmlNanoFTPNewCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoFTPNewCtxt xmlNanoFTPNewCtxt__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_FTP_ENABLED) +#ifdef bottom_nanoftp +#undef xmlNanoFTPOpen +extern __typeof (xmlNanoFTPOpen) xmlNanoFTPOpen __attribute((alias("xmlNanoFTPOpen__internal_alias"))); +#else +#ifndef xmlNanoFTPOpen +extern __typeof (xmlNanoFTPOpen) xmlNanoFTPOpen__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoFTPOpen xmlNanoFTPOpen__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_FTP_ENABLED) +#ifdef bottom_nanoftp +#undef xmlNanoFTPProxy +extern __typeof (xmlNanoFTPProxy) xmlNanoFTPProxy __attribute((alias("xmlNanoFTPProxy__internal_alias"))); +#else +#ifndef xmlNanoFTPProxy +extern __typeof (xmlNanoFTPProxy) xmlNanoFTPProxy__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoFTPProxy xmlNanoFTPProxy__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_FTP_ENABLED) +#ifdef bottom_nanoftp +#undef xmlNanoFTPQuit +extern __typeof (xmlNanoFTPQuit) xmlNanoFTPQuit __attribute((alias("xmlNanoFTPQuit__internal_alias"))); +#else +#ifndef xmlNanoFTPQuit +extern __typeof (xmlNanoFTPQuit) xmlNanoFTPQuit__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoFTPQuit xmlNanoFTPQuit__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_FTP_ENABLED) +#ifdef bottom_nanoftp +#undef xmlNanoFTPRead +extern __typeof (xmlNanoFTPRead) xmlNanoFTPRead __attribute((alias("xmlNanoFTPRead__internal_alias"))); +#else +#ifndef xmlNanoFTPRead +extern __typeof (xmlNanoFTPRead) xmlNanoFTPRead__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoFTPRead xmlNanoFTPRead__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_FTP_ENABLED) +#ifdef bottom_nanoftp +#undef xmlNanoFTPScanProxy +extern __typeof (xmlNanoFTPScanProxy) xmlNanoFTPScanProxy __attribute((alias("xmlNanoFTPScanProxy__internal_alias"))); +#else +#ifndef xmlNanoFTPScanProxy +extern __typeof (xmlNanoFTPScanProxy) xmlNanoFTPScanProxy__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoFTPScanProxy xmlNanoFTPScanProxy__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_FTP_ENABLED) +#ifdef bottom_nanoftp +#undef xmlNanoFTPUpdateURL +extern __typeof (xmlNanoFTPUpdateURL) xmlNanoFTPUpdateURL __attribute((alias("xmlNanoFTPUpdateURL__internal_alias"))); +#else +#ifndef xmlNanoFTPUpdateURL +extern __typeof (xmlNanoFTPUpdateURL) xmlNanoFTPUpdateURL__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoFTPUpdateURL xmlNanoFTPUpdateURL__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTTP_ENABLED) +#ifdef bottom_nanohttp +#undef xmlNanoHTTPAuthHeader +extern __typeof (xmlNanoHTTPAuthHeader) xmlNanoHTTPAuthHeader __attribute((alias("xmlNanoHTTPAuthHeader__internal_alias"))); +#else +#ifndef xmlNanoHTTPAuthHeader +extern __typeof (xmlNanoHTTPAuthHeader) xmlNanoHTTPAuthHeader__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoHTTPAuthHeader xmlNanoHTTPAuthHeader__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTTP_ENABLED) +#ifdef bottom_nanohttp +#undef xmlNanoHTTPCleanup +extern __typeof (xmlNanoHTTPCleanup) xmlNanoHTTPCleanup __attribute((alias("xmlNanoHTTPCleanup__internal_alias"))); +#else +#ifndef xmlNanoHTTPCleanup +extern __typeof (xmlNanoHTTPCleanup) xmlNanoHTTPCleanup__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoHTTPCleanup xmlNanoHTTPCleanup__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTTP_ENABLED) +#ifdef bottom_nanohttp +#undef xmlNanoHTTPClose +extern __typeof (xmlNanoHTTPClose) xmlNanoHTTPClose __attribute((alias("xmlNanoHTTPClose__internal_alias"))); +#else +#ifndef xmlNanoHTTPClose +extern __typeof (xmlNanoHTTPClose) xmlNanoHTTPClose__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoHTTPClose xmlNanoHTTPClose__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTTP_ENABLED) +#ifdef bottom_nanohttp +#undef xmlNanoHTTPContentLength +extern __typeof (xmlNanoHTTPContentLength) xmlNanoHTTPContentLength __attribute((alias("xmlNanoHTTPContentLength__internal_alias"))); +#else +#ifndef xmlNanoHTTPContentLength +extern __typeof (xmlNanoHTTPContentLength) xmlNanoHTTPContentLength__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoHTTPContentLength xmlNanoHTTPContentLength__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTTP_ENABLED) +#ifdef bottom_nanohttp +#undef xmlNanoHTTPEncoding +extern __typeof (xmlNanoHTTPEncoding) xmlNanoHTTPEncoding __attribute((alias("xmlNanoHTTPEncoding__internal_alias"))); +#else +#ifndef xmlNanoHTTPEncoding +extern __typeof (xmlNanoHTTPEncoding) xmlNanoHTTPEncoding__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoHTTPEncoding xmlNanoHTTPEncoding__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTTP_ENABLED) +#ifdef bottom_nanohttp +#undef xmlNanoHTTPFetch +extern __typeof (xmlNanoHTTPFetch) xmlNanoHTTPFetch __attribute((alias("xmlNanoHTTPFetch__internal_alias"))); +#else +#ifndef xmlNanoHTTPFetch +extern __typeof (xmlNanoHTTPFetch) xmlNanoHTTPFetch__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoHTTPFetch xmlNanoHTTPFetch__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTTP_ENABLED) +#ifdef bottom_nanohttp +#undef xmlNanoHTTPInit +extern __typeof (xmlNanoHTTPInit) xmlNanoHTTPInit __attribute((alias("xmlNanoHTTPInit__internal_alias"))); +#else +#ifndef xmlNanoHTTPInit +extern __typeof (xmlNanoHTTPInit) xmlNanoHTTPInit__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoHTTPInit xmlNanoHTTPInit__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTTP_ENABLED) +#ifdef bottom_nanohttp +#undef xmlNanoHTTPMethod +extern __typeof (xmlNanoHTTPMethod) xmlNanoHTTPMethod __attribute((alias("xmlNanoHTTPMethod__internal_alias"))); +#else +#ifndef xmlNanoHTTPMethod +extern __typeof (xmlNanoHTTPMethod) xmlNanoHTTPMethod__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoHTTPMethod xmlNanoHTTPMethod__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTTP_ENABLED) +#ifdef bottom_nanohttp +#undef xmlNanoHTTPMethodRedir +extern __typeof (xmlNanoHTTPMethodRedir) xmlNanoHTTPMethodRedir __attribute((alias("xmlNanoHTTPMethodRedir__internal_alias"))); +#else +#ifndef xmlNanoHTTPMethodRedir +extern __typeof (xmlNanoHTTPMethodRedir) xmlNanoHTTPMethodRedir__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoHTTPMethodRedir xmlNanoHTTPMethodRedir__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTTP_ENABLED) +#ifdef bottom_nanohttp +#undef xmlNanoHTTPMimeType +extern __typeof (xmlNanoHTTPMimeType) xmlNanoHTTPMimeType __attribute((alias("xmlNanoHTTPMimeType__internal_alias"))); +#else +#ifndef xmlNanoHTTPMimeType +extern __typeof (xmlNanoHTTPMimeType) xmlNanoHTTPMimeType__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoHTTPMimeType xmlNanoHTTPMimeType__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTTP_ENABLED) +#ifdef bottom_nanohttp +#undef xmlNanoHTTPOpen +extern __typeof (xmlNanoHTTPOpen) xmlNanoHTTPOpen __attribute((alias("xmlNanoHTTPOpen__internal_alias"))); +#else +#ifndef xmlNanoHTTPOpen +extern __typeof (xmlNanoHTTPOpen) xmlNanoHTTPOpen__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoHTTPOpen xmlNanoHTTPOpen__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTTP_ENABLED) +#ifdef bottom_nanohttp +#undef xmlNanoHTTPOpenRedir +extern __typeof (xmlNanoHTTPOpenRedir) xmlNanoHTTPOpenRedir __attribute((alias("xmlNanoHTTPOpenRedir__internal_alias"))); +#else +#ifndef xmlNanoHTTPOpenRedir +extern __typeof (xmlNanoHTTPOpenRedir) xmlNanoHTTPOpenRedir__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoHTTPOpenRedir xmlNanoHTTPOpenRedir__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTTP_ENABLED) +#ifdef bottom_nanohttp +#undef xmlNanoHTTPRead +extern __typeof (xmlNanoHTTPRead) xmlNanoHTTPRead __attribute((alias("xmlNanoHTTPRead__internal_alias"))); +#else +#ifndef xmlNanoHTTPRead +extern __typeof (xmlNanoHTTPRead) xmlNanoHTTPRead__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoHTTPRead xmlNanoHTTPRead__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTTP_ENABLED) +#ifdef bottom_nanohttp +#undef xmlNanoHTTPRedir +extern __typeof (xmlNanoHTTPRedir) xmlNanoHTTPRedir __attribute((alias("xmlNanoHTTPRedir__internal_alias"))); +#else +#ifndef xmlNanoHTTPRedir +extern __typeof (xmlNanoHTTPRedir) xmlNanoHTTPRedir__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoHTTPRedir xmlNanoHTTPRedir__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTTP_ENABLED) +#ifdef bottom_nanohttp +#undef xmlNanoHTTPReturnCode +extern __typeof (xmlNanoHTTPReturnCode) xmlNanoHTTPReturnCode __attribute((alias("xmlNanoHTTPReturnCode__internal_alias"))); +#else +#ifndef xmlNanoHTTPReturnCode +extern __typeof (xmlNanoHTTPReturnCode) xmlNanoHTTPReturnCode__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoHTTPReturnCode xmlNanoHTTPReturnCode__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTTP_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_nanohttp +#undef xmlNanoHTTPSave +extern __typeof (xmlNanoHTTPSave) xmlNanoHTTPSave __attribute((alias("xmlNanoHTTPSave__internal_alias"))); +#else +#ifndef xmlNanoHTTPSave +extern __typeof (xmlNanoHTTPSave) xmlNanoHTTPSave__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoHTTPSave xmlNanoHTTPSave__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTTP_ENABLED) +#ifdef bottom_nanohttp +#undef xmlNanoHTTPScanProxy +extern __typeof (xmlNanoHTTPScanProxy) xmlNanoHTTPScanProxy __attribute((alias("xmlNanoHTTPScanProxy__internal_alias"))); +#else +#ifndef xmlNanoHTTPScanProxy +extern __typeof (xmlNanoHTTPScanProxy) xmlNanoHTTPScanProxy__internal_alias __attribute((visibility("hidden"))); +#define xmlNanoHTTPScanProxy xmlNanoHTTPScanProxy__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlNewAutomata +extern __typeof (xmlNewAutomata) xmlNewAutomata __attribute((alias("xmlNewAutomata__internal_alias"))); +#else +#ifndef xmlNewAutomata +extern __typeof (xmlNewAutomata) xmlNewAutomata__internal_alias __attribute((visibility("hidden"))); +#define xmlNewAutomata xmlNewAutomata__internal_alias +#endif +#endif +#endif + +#ifdef bottom_tree +#undef xmlNewCDataBlock +extern __typeof (xmlNewCDataBlock) xmlNewCDataBlock __attribute((alias("xmlNewCDataBlock__internal_alias"))); +#else +#ifndef xmlNewCDataBlock +extern __typeof (xmlNewCDataBlock) xmlNewCDataBlock__internal_alias __attribute((visibility("hidden"))); +#define xmlNewCDataBlock xmlNewCDataBlock__internal_alias +#endif +#endif + +#if defined(LIBXML_CATALOG_ENABLED) +#ifdef bottom_catalog +#undef xmlNewCatalog +extern __typeof (xmlNewCatalog) xmlNewCatalog __attribute((alias("xmlNewCatalog__internal_alias"))); +#else +#ifndef xmlNewCatalog +extern __typeof (xmlNewCatalog) xmlNewCatalog__internal_alias __attribute((visibility("hidden"))); +#define xmlNewCatalog xmlNewCatalog__internal_alias +#endif +#endif +#endif + +#ifdef bottom_encoding +#undef xmlNewCharEncodingHandler +extern __typeof (xmlNewCharEncodingHandler) xmlNewCharEncodingHandler __attribute((alias("xmlNewCharEncodingHandler__internal_alias"))); +#else +#ifndef xmlNewCharEncodingHandler +extern __typeof (xmlNewCharEncodingHandler) xmlNewCharEncodingHandler__internal_alias __attribute((visibility("hidden"))); +#define xmlNewCharEncodingHandler xmlNewCharEncodingHandler__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlNewCharRef +extern __typeof (xmlNewCharRef) xmlNewCharRef __attribute((alias("xmlNewCharRef__internal_alias"))); +#else +#ifndef xmlNewCharRef +extern __typeof (xmlNewCharRef) xmlNewCharRef__internal_alias __attribute((visibility("hidden"))); +#define xmlNewCharRef xmlNewCharRef__internal_alias +#endif +#endif + +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_tree +#undef xmlNewChild +extern __typeof (xmlNewChild) xmlNewChild __attribute((alias("xmlNewChild__internal_alias"))); +#else +#ifndef xmlNewChild +extern __typeof (xmlNewChild) xmlNewChild__internal_alias __attribute((visibility("hidden"))); +#define xmlNewChild xmlNewChild__internal_alias +#endif +#endif +#endif + +#ifdef bottom_tree +#undef xmlNewComment +extern __typeof (xmlNewComment) xmlNewComment __attribute((alias("xmlNewComment__internal_alias"))); +#else +#ifndef xmlNewComment +extern __typeof (xmlNewComment) xmlNewComment__internal_alias __attribute((visibility("hidden"))); +#define xmlNewComment xmlNewComment__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlNewDoc +extern __typeof (xmlNewDoc) xmlNewDoc __attribute((alias("xmlNewDoc__internal_alias"))); +#else +#ifndef xmlNewDoc +extern __typeof (xmlNewDoc) xmlNewDoc__internal_alias __attribute((visibility("hidden"))); +#define xmlNewDoc xmlNewDoc__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlNewDocComment +extern __typeof (xmlNewDocComment) xmlNewDocComment __attribute((alias("xmlNewDocComment__internal_alias"))); +#else +#ifndef xmlNewDocComment +extern __typeof (xmlNewDocComment) xmlNewDocComment__internal_alias __attribute((visibility("hidden"))); +#define xmlNewDocComment xmlNewDocComment__internal_alias +#endif +#endif + +#ifdef bottom_valid +#undef xmlNewDocElementContent +extern __typeof (xmlNewDocElementContent) xmlNewDocElementContent __attribute((alias("xmlNewDocElementContent__internal_alias"))); +#else +#ifndef xmlNewDocElementContent +extern __typeof (xmlNewDocElementContent) xmlNewDocElementContent__internal_alias __attribute((visibility("hidden"))); +#define xmlNewDocElementContent xmlNewDocElementContent__internal_alias +#endif +#endif + +#if defined(LIBXML_TREE_ENABLED) +#ifdef bottom_tree +#undef xmlNewDocFragment +extern __typeof (xmlNewDocFragment) xmlNewDocFragment __attribute((alias("xmlNewDocFragment__internal_alias"))); +#else +#ifndef xmlNewDocFragment +extern __typeof (xmlNewDocFragment) xmlNewDocFragment__internal_alias __attribute((visibility("hidden"))); +#define xmlNewDocFragment xmlNewDocFragment__internal_alias +#endif +#endif +#endif + +#ifdef bottom_tree +#undef xmlNewDocNode +extern __typeof (xmlNewDocNode) xmlNewDocNode __attribute((alias("xmlNewDocNode__internal_alias"))); +#else +#ifndef xmlNewDocNode +extern __typeof (xmlNewDocNode) xmlNewDocNode__internal_alias __attribute((visibility("hidden"))); +#define xmlNewDocNode xmlNewDocNode__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlNewDocNodeEatName +extern __typeof (xmlNewDocNodeEatName) xmlNewDocNodeEatName __attribute((alias("xmlNewDocNodeEatName__internal_alias"))); +#else +#ifndef xmlNewDocNodeEatName +extern __typeof (xmlNewDocNodeEatName) xmlNewDocNodeEatName__internal_alias __attribute((visibility("hidden"))); +#define xmlNewDocNodeEatName xmlNewDocNodeEatName__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlNewDocPI +extern __typeof (xmlNewDocPI) xmlNewDocPI __attribute((alias("xmlNewDocPI__internal_alias"))); +#else +#ifndef xmlNewDocPI +extern __typeof (xmlNewDocPI) xmlNewDocPI__internal_alias __attribute((visibility("hidden"))); +#define xmlNewDocPI xmlNewDocPI__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlNewDocProp +extern __typeof (xmlNewDocProp) xmlNewDocProp __attribute((alias("xmlNewDocProp__internal_alias"))); +#else +#ifndef xmlNewDocProp +extern __typeof (xmlNewDocProp) xmlNewDocProp__internal_alias __attribute((visibility("hidden"))); +#define xmlNewDocProp xmlNewDocProp__internal_alias +#endif +#endif + +#if defined(LIBXML_TREE_ENABLED) +#ifdef bottom_tree +#undef xmlNewDocRawNode +extern __typeof (xmlNewDocRawNode) xmlNewDocRawNode __attribute((alias("xmlNewDocRawNode__internal_alias"))); +#else +#ifndef xmlNewDocRawNode +extern __typeof (xmlNewDocRawNode) xmlNewDocRawNode__internal_alias __attribute((visibility("hidden"))); +#define xmlNewDocRawNode xmlNewDocRawNode__internal_alias +#endif +#endif +#endif + +#ifdef bottom_tree +#undef xmlNewDocText +extern __typeof (xmlNewDocText) xmlNewDocText __attribute((alias("xmlNewDocText__internal_alias"))); +#else +#ifndef xmlNewDocText +extern __typeof (xmlNewDocText) xmlNewDocText__internal_alias __attribute((visibility("hidden"))); +#define xmlNewDocText xmlNewDocText__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlNewDocTextLen +extern __typeof (xmlNewDocTextLen) xmlNewDocTextLen __attribute((alias("xmlNewDocTextLen__internal_alias"))); +#else +#ifndef xmlNewDocTextLen +extern __typeof (xmlNewDocTextLen) xmlNewDocTextLen__internal_alias __attribute((visibility("hidden"))); +#define xmlNewDocTextLen xmlNewDocTextLen__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlNewDtd +extern __typeof (xmlNewDtd) xmlNewDtd __attribute((alias("xmlNewDtd__internal_alias"))); +#else +#ifndef xmlNewDtd +extern __typeof (xmlNewDtd) xmlNewDtd__internal_alias __attribute((visibility("hidden"))); +#define xmlNewDtd xmlNewDtd__internal_alias +#endif +#endif + +#ifdef bottom_valid +#undef xmlNewElementContent +extern __typeof (xmlNewElementContent) xmlNewElementContent __attribute((alias("xmlNewElementContent__internal_alias"))); +#else +#ifndef xmlNewElementContent +extern __typeof (xmlNewElementContent) xmlNewElementContent__internal_alias __attribute((visibility("hidden"))); +#define xmlNewElementContent xmlNewElementContent__internal_alias +#endif +#endif + +#ifdef bottom_entities +#undef xmlNewEntity +extern __typeof (xmlNewEntity) xmlNewEntity __attribute((alias("xmlNewEntity__internal_alias"))); +#else +#ifndef xmlNewEntity +extern __typeof (xmlNewEntity) xmlNewEntity__internal_alias __attribute((visibility("hidden"))); +#define xmlNewEntity xmlNewEntity__internal_alias +#endif +#endif + +#ifdef bottom_parserInternals +#undef xmlNewEntityInputStream +extern __typeof (xmlNewEntityInputStream) xmlNewEntityInputStream __attribute((alias("xmlNewEntityInputStream__internal_alias"))); +#else +#ifndef xmlNewEntityInputStream +extern __typeof (xmlNewEntityInputStream) xmlNewEntityInputStream__internal_alias __attribute((visibility("hidden"))); +#define xmlNewEntityInputStream xmlNewEntityInputStream__internal_alias +#endif +#endif + +#if defined(LIBXML_LEGACY_ENABLED) +#ifdef bottom_legacy +#undef xmlNewGlobalNs +extern __typeof (xmlNewGlobalNs) xmlNewGlobalNs __attribute((alias("xmlNewGlobalNs__internal_alias"))); +#else +#ifndef xmlNewGlobalNs +extern __typeof (xmlNewGlobalNs) xmlNewGlobalNs__internal_alias __attribute((visibility("hidden"))); +#define xmlNewGlobalNs xmlNewGlobalNs__internal_alias +#endif +#endif +#endif + +#ifdef bottom_parserInternals +#undef xmlNewIOInputStream +extern __typeof (xmlNewIOInputStream) xmlNewIOInputStream __attribute((alias("xmlNewIOInputStream__internal_alias"))); +#else +#ifndef xmlNewIOInputStream +extern __typeof (xmlNewIOInputStream) xmlNewIOInputStream__internal_alias __attribute((visibility("hidden"))); +#define xmlNewIOInputStream xmlNewIOInputStream__internal_alias +#endif +#endif + +#ifdef bottom_parserInternals +#undef xmlNewInputFromFile +extern __typeof (xmlNewInputFromFile) xmlNewInputFromFile __attribute((alias("xmlNewInputFromFile__internal_alias"))); +#else +#ifndef xmlNewInputFromFile +extern __typeof (xmlNewInputFromFile) xmlNewInputFromFile__internal_alias __attribute((visibility("hidden"))); +#define xmlNewInputFromFile xmlNewInputFromFile__internal_alias +#endif +#endif + +#ifdef bottom_parserInternals +#undef xmlNewInputStream +extern __typeof (xmlNewInputStream) xmlNewInputStream __attribute((alias("xmlNewInputStream__internal_alias"))); +#else +#ifndef xmlNewInputStream +extern __typeof (xmlNewInputStream) xmlNewInputStream__internal_alias __attribute((visibility("hidden"))); +#define xmlNewInputStream xmlNewInputStream__internal_alias +#endif +#endif + +#ifdef bottom_threads +#undef xmlNewMutex +extern __typeof (xmlNewMutex) xmlNewMutex __attribute((alias("xmlNewMutex__internal_alias"))); +#else +#ifndef xmlNewMutex +extern __typeof (xmlNewMutex) xmlNewMutex__internal_alias __attribute((visibility("hidden"))); +#define xmlNewMutex xmlNewMutex__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlNewNode +extern __typeof (xmlNewNode) xmlNewNode __attribute((alias("xmlNewNode__internal_alias"))); +#else +#ifndef xmlNewNode +extern __typeof (xmlNewNode) xmlNewNode__internal_alias __attribute((visibility("hidden"))); +#define xmlNewNode xmlNewNode__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlNewNodeEatName +extern __typeof (xmlNewNodeEatName) xmlNewNodeEatName __attribute((alias("xmlNewNodeEatName__internal_alias"))); +#else +#ifndef xmlNewNodeEatName +extern __typeof (xmlNewNodeEatName) xmlNewNodeEatName__internal_alias __attribute((visibility("hidden"))); +#define xmlNewNodeEatName xmlNewNodeEatName__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlNewNs +extern __typeof (xmlNewNs) xmlNewNs __attribute((alias("xmlNewNs__internal_alias"))); +#else +#ifndef xmlNewNs +extern __typeof (xmlNewNs) xmlNewNs__internal_alias __attribute((visibility("hidden"))); +#define xmlNewNs xmlNewNs__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlNewNsProp +extern __typeof (xmlNewNsProp) xmlNewNsProp __attribute((alias("xmlNewNsProp__internal_alias"))); +#else +#ifndef xmlNewNsProp +extern __typeof (xmlNewNsProp) xmlNewNsProp__internal_alias __attribute((visibility("hidden"))); +#define xmlNewNsProp xmlNewNsProp__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlNewNsPropEatName +extern __typeof (xmlNewNsPropEatName) xmlNewNsPropEatName __attribute((alias("xmlNewNsPropEatName__internal_alias"))); +#else +#ifndef xmlNewNsPropEatName +extern __typeof (xmlNewNsPropEatName) xmlNewNsPropEatName__internal_alias __attribute((visibility("hidden"))); +#define xmlNewNsPropEatName xmlNewNsPropEatName__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlNewPI +extern __typeof (xmlNewPI) xmlNewPI __attribute((alias("xmlNewPI__internal_alias"))); +#else +#ifndef xmlNewPI +extern __typeof (xmlNewPI) xmlNewPI__internal_alias __attribute((visibility("hidden"))); +#define xmlNewPI xmlNewPI__internal_alias +#endif +#endif + +#ifdef bottom_parserInternals +#undef xmlNewParserCtxt +extern __typeof (xmlNewParserCtxt) xmlNewParserCtxt __attribute((alias("xmlNewParserCtxt__internal_alias"))); +#else +#ifndef xmlNewParserCtxt +extern __typeof (xmlNewParserCtxt) xmlNewParserCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlNewParserCtxt xmlNewParserCtxt__internal_alias +#endif +#endif + +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_tree +#undef xmlNewProp +extern __typeof (xmlNewProp) xmlNewProp __attribute((alias("xmlNewProp__internal_alias"))); +#else +#ifndef xmlNewProp +extern __typeof (xmlNewProp) xmlNewProp__internal_alias __attribute((visibility("hidden"))); +#define xmlNewProp xmlNewProp__internal_alias +#endif +#endif +#endif + +#ifdef bottom_threads +#undef xmlNewRMutex +extern __typeof (xmlNewRMutex) xmlNewRMutex __attribute((alias("xmlNewRMutex__internal_alias"))); +#else +#ifndef xmlNewRMutex +extern __typeof (xmlNewRMutex) xmlNewRMutex__internal_alias __attribute((visibility("hidden"))); +#define xmlNewRMutex xmlNewRMutex__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlNewReference +extern __typeof (xmlNewReference) xmlNewReference __attribute((alias("xmlNewReference__internal_alias"))); +#else +#ifndef xmlNewReference +extern __typeof (xmlNewReference) xmlNewReference__internal_alias __attribute((visibility("hidden"))); +#define xmlNewReference xmlNewReference__internal_alias +#endif +#endif + +#ifdef bottom_parserInternals +#undef xmlNewStringInputStream +extern __typeof (xmlNewStringInputStream) xmlNewStringInputStream __attribute((alias("xmlNewStringInputStream__internal_alias"))); +#else +#ifndef xmlNewStringInputStream +extern __typeof (xmlNewStringInputStream) xmlNewStringInputStream__internal_alias __attribute((visibility("hidden"))); +#define xmlNewStringInputStream xmlNewStringInputStream__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlNewText +extern __typeof (xmlNewText) xmlNewText __attribute((alias("xmlNewText__internal_alias"))); +#else +#ifndef xmlNewText +extern __typeof (xmlNewText) xmlNewText__internal_alias __attribute((visibility("hidden"))); +#define xmlNewText xmlNewText__internal_alias +#endif +#endif + +#if defined(LIBXML_TREE_ENABLED) +#ifdef bottom_tree +#undef xmlNewTextChild +extern __typeof (xmlNewTextChild) xmlNewTextChild __attribute((alias("xmlNewTextChild__internal_alias"))); +#else +#ifndef xmlNewTextChild +extern __typeof (xmlNewTextChild) xmlNewTextChild__internal_alias __attribute((visibility("hidden"))); +#define xmlNewTextChild xmlNewTextChild__internal_alias +#endif +#endif +#endif + +#ifdef bottom_tree +#undef xmlNewTextLen +extern __typeof (xmlNewTextLen) xmlNewTextLen __attribute((alias("xmlNewTextLen__internal_alias"))); +#else +#ifndef xmlNewTextLen +extern __typeof (xmlNewTextLen) xmlNewTextLen__internal_alias __attribute((visibility("hidden"))); +#define xmlNewTextLen xmlNewTextLen__internal_alias +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlNewTextReader +extern __typeof (xmlNewTextReader) xmlNewTextReader __attribute((alias("xmlNewTextReader__internal_alias"))); +#else +#ifndef xmlNewTextReader +extern __typeof (xmlNewTextReader) xmlNewTextReader__internal_alias __attribute((visibility("hidden"))); +#define xmlNewTextReader xmlNewTextReader__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlNewTextReaderFilename +extern __typeof (xmlNewTextReaderFilename) xmlNewTextReaderFilename __attribute((alias("xmlNewTextReaderFilename__internal_alias"))); +#else +#ifndef xmlNewTextReaderFilename +extern __typeof (xmlNewTextReaderFilename) xmlNewTextReaderFilename__internal_alias __attribute((visibility("hidden"))); +#define xmlNewTextReaderFilename xmlNewTextReaderFilename__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlNewTextWriter +extern __typeof (xmlNewTextWriter) xmlNewTextWriter __attribute((alias("xmlNewTextWriter__internal_alias"))); +#else +#ifndef xmlNewTextWriter +extern __typeof (xmlNewTextWriter) xmlNewTextWriter__internal_alias __attribute((visibility("hidden"))); +#define xmlNewTextWriter xmlNewTextWriter__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlNewTextWriterDoc +extern __typeof (xmlNewTextWriterDoc) xmlNewTextWriterDoc __attribute((alias("xmlNewTextWriterDoc__internal_alias"))); +#else +#ifndef xmlNewTextWriterDoc +extern __typeof (xmlNewTextWriterDoc) xmlNewTextWriterDoc__internal_alias __attribute((visibility("hidden"))); +#define xmlNewTextWriterDoc xmlNewTextWriterDoc__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlNewTextWriterFilename +extern __typeof (xmlNewTextWriterFilename) xmlNewTextWriterFilename __attribute((alias("xmlNewTextWriterFilename__internal_alias"))); +#else +#ifndef xmlNewTextWriterFilename +extern __typeof (xmlNewTextWriterFilename) xmlNewTextWriterFilename__internal_alias __attribute((visibility("hidden"))); +#define xmlNewTextWriterFilename xmlNewTextWriterFilename__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlNewTextWriterMemory +extern __typeof (xmlNewTextWriterMemory) xmlNewTextWriterMemory __attribute((alias("xmlNewTextWriterMemory__internal_alias"))); +#else +#ifndef xmlNewTextWriterMemory +extern __typeof (xmlNewTextWriterMemory) xmlNewTextWriterMemory__internal_alias __attribute((visibility("hidden"))); +#define xmlNewTextWriterMemory xmlNewTextWriterMemory__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlNewTextWriterPushParser +extern __typeof (xmlNewTextWriterPushParser) xmlNewTextWriterPushParser __attribute((alias("xmlNewTextWriterPushParser__internal_alias"))); +#else +#ifndef xmlNewTextWriterPushParser +extern __typeof (xmlNewTextWriterPushParser) xmlNewTextWriterPushParser__internal_alias __attribute((visibility("hidden"))); +#define xmlNewTextWriterPushParser xmlNewTextWriterPushParser__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlNewTextWriterTree +extern __typeof (xmlNewTextWriterTree) xmlNewTextWriterTree __attribute((alias("xmlNewTextWriterTree__internal_alias"))); +#else +#ifndef xmlNewTextWriterTree +extern __typeof (xmlNewTextWriterTree) xmlNewTextWriterTree__internal_alias __attribute((visibility("hidden"))); +#define xmlNewTextWriterTree xmlNewTextWriterTree__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_VALID_ENABLED) +#ifdef bottom_valid +#undef xmlNewValidCtxt +extern __typeof (xmlNewValidCtxt) xmlNewValidCtxt __attribute((alias("xmlNewValidCtxt__internal_alias"))); +#else +#ifndef xmlNewValidCtxt +extern __typeof (xmlNewValidCtxt) xmlNewValidCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlNewValidCtxt xmlNewValidCtxt__internal_alias +#endif +#endif +#endif + +#ifdef bottom_parserInternals +#undef xmlNextChar +extern __typeof (xmlNextChar) xmlNextChar __attribute((alias("xmlNextChar__internal_alias"))); +#else +#ifndef xmlNextChar +extern __typeof (xmlNextChar) xmlNextChar__internal_alias __attribute((visibility("hidden"))); +#define xmlNextChar xmlNextChar__internal_alias +#endif +#endif + +#if defined(LIBXML_TREE_ENABLED) +#ifdef bottom_tree +#undef xmlNextElementSibling +extern __typeof (xmlNextElementSibling) xmlNextElementSibling __attribute((alias("xmlNextElementSibling__internal_alias"))); +#else +#ifndef xmlNextElementSibling +extern __typeof (xmlNextElementSibling) xmlNextElementSibling__internal_alias __attribute((visibility("hidden"))); +#define xmlNextElementSibling xmlNextElementSibling__internal_alias +#endif +#endif +#endif + +#ifdef bottom_xmlIO +#undef xmlNoNetExternalEntityLoader +extern __typeof (xmlNoNetExternalEntityLoader) xmlNoNetExternalEntityLoader __attribute((alias("xmlNoNetExternalEntityLoader__internal_alias"))); +#else +#ifndef xmlNoNetExternalEntityLoader +extern __typeof (xmlNoNetExternalEntityLoader) xmlNoNetExternalEntityLoader__internal_alias __attribute((visibility("hidden"))); +#define xmlNoNetExternalEntityLoader xmlNoNetExternalEntityLoader__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlNodeAddContent +extern __typeof (xmlNodeAddContent) xmlNodeAddContent __attribute((alias("xmlNodeAddContent__internal_alias"))); +#else +#ifndef xmlNodeAddContent +extern __typeof (xmlNodeAddContent) xmlNodeAddContent__internal_alias __attribute((visibility("hidden"))); +#define xmlNodeAddContent xmlNodeAddContent__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlNodeAddContentLen +extern __typeof (xmlNodeAddContentLen) xmlNodeAddContentLen __attribute((alias("xmlNodeAddContentLen__internal_alias"))); +#else +#ifndef xmlNodeAddContentLen +extern __typeof (xmlNodeAddContentLen) xmlNodeAddContentLen__internal_alias __attribute((visibility("hidden"))); +#define xmlNodeAddContentLen xmlNodeAddContentLen__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlNodeBufGetContent +extern __typeof (xmlNodeBufGetContent) xmlNodeBufGetContent __attribute((alias("xmlNodeBufGetContent__internal_alias"))); +#else +#ifndef xmlNodeBufGetContent +extern __typeof (xmlNodeBufGetContent) xmlNodeBufGetContent__internal_alias __attribute((visibility("hidden"))); +#define xmlNodeBufGetContent xmlNodeBufGetContent__internal_alias +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlsave +#undef xmlNodeDump +extern __typeof (xmlNodeDump) xmlNodeDump __attribute((alias("xmlNodeDump__internal_alias"))); +#else +#ifndef xmlNodeDump +extern __typeof (xmlNodeDump) xmlNodeDump__internal_alias __attribute((visibility("hidden"))); +#define xmlNodeDump xmlNodeDump__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlsave +#undef xmlNodeDumpOutput +extern __typeof (xmlNodeDumpOutput) xmlNodeDumpOutput __attribute((alias("xmlNodeDumpOutput__internal_alias"))); +#else +#ifndef xmlNodeDumpOutput +extern __typeof (xmlNodeDumpOutput) xmlNodeDumpOutput__internal_alias __attribute((visibility("hidden"))); +#define xmlNodeDumpOutput xmlNodeDumpOutput__internal_alias +#endif +#endif +#endif + +#ifdef bottom_tree +#undef xmlNodeGetBase +extern __typeof (xmlNodeGetBase) xmlNodeGetBase __attribute((alias("xmlNodeGetBase__internal_alias"))); +#else +#ifndef xmlNodeGetBase +extern __typeof (xmlNodeGetBase) xmlNodeGetBase__internal_alias __attribute((visibility("hidden"))); +#define xmlNodeGetBase xmlNodeGetBase__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlNodeGetContent +extern __typeof (xmlNodeGetContent) xmlNodeGetContent __attribute((alias("xmlNodeGetContent__internal_alias"))); +#else +#ifndef xmlNodeGetContent +extern __typeof (xmlNodeGetContent) xmlNodeGetContent__internal_alias __attribute((visibility("hidden"))); +#define xmlNodeGetContent xmlNodeGetContent__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlNodeGetLang +extern __typeof (xmlNodeGetLang) xmlNodeGetLang __attribute((alias("xmlNodeGetLang__internal_alias"))); +#else +#ifndef xmlNodeGetLang +extern __typeof (xmlNodeGetLang) xmlNodeGetLang__internal_alias __attribute((visibility("hidden"))); +#define xmlNodeGetLang xmlNodeGetLang__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlNodeGetSpacePreserve +extern __typeof (xmlNodeGetSpacePreserve) xmlNodeGetSpacePreserve __attribute((alias("xmlNodeGetSpacePreserve__internal_alias"))); +#else +#ifndef xmlNodeGetSpacePreserve +extern __typeof (xmlNodeGetSpacePreserve) xmlNodeGetSpacePreserve__internal_alias __attribute((visibility("hidden"))); +#define xmlNodeGetSpacePreserve xmlNodeGetSpacePreserve__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlNodeIsText +extern __typeof (xmlNodeIsText) xmlNodeIsText __attribute((alias("xmlNodeIsText__internal_alias"))); +#else +#ifndef xmlNodeIsText +extern __typeof (xmlNodeIsText) xmlNodeIsText__internal_alias __attribute((visibility("hidden"))); +#define xmlNodeIsText xmlNodeIsText__internal_alias +#endif +#endif + +#if defined(LIBXML_TREE_ENABLED) +#ifdef bottom_tree +#undef xmlNodeListGetRawString +extern __typeof (xmlNodeListGetRawString) xmlNodeListGetRawString __attribute((alias("xmlNodeListGetRawString__internal_alias"))); +#else +#ifndef xmlNodeListGetRawString +extern __typeof (xmlNodeListGetRawString) xmlNodeListGetRawString__internal_alias __attribute((visibility("hidden"))); +#define xmlNodeListGetRawString xmlNodeListGetRawString__internal_alias +#endif +#endif +#endif + +#ifdef bottom_tree +#undef xmlNodeListGetString +extern __typeof (xmlNodeListGetString) xmlNodeListGetString __attribute((alias("xmlNodeListGetString__internal_alias"))); +#else +#ifndef xmlNodeListGetString +extern __typeof (xmlNodeListGetString) xmlNodeListGetString__internal_alias __attribute((visibility("hidden"))); +#define xmlNodeListGetString xmlNodeListGetString__internal_alias +#endif +#endif + +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) +#ifdef bottom_tree +#undef xmlNodeSetBase +extern __typeof (xmlNodeSetBase) xmlNodeSetBase __attribute((alias("xmlNodeSetBase__internal_alias"))); +#else +#ifndef xmlNodeSetBase +extern __typeof (xmlNodeSetBase) xmlNodeSetBase__internal_alias __attribute((visibility("hidden"))); +#define xmlNodeSetBase xmlNodeSetBase__internal_alias +#endif +#endif +#endif + +#ifdef bottom_tree +#undef xmlNodeSetContent +extern __typeof (xmlNodeSetContent) xmlNodeSetContent __attribute((alias("xmlNodeSetContent__internal_alias"))); +#else +#ifndef xmlNodeSetContent +extern __typeof (xmlNodeSetContent) xmlNodeSetContent__internal_alias __attribute((visibility("hidden"))); +#define xmlNodeSetContent xmlNodeSetContent__internal_alias +#endif +#endif + +#if defined(LIBXML_TREE_ENABLED) +#ifdef bottom_tree +#undef xmlNodeSetContentLen +extern __typeof (xmlNodeSetContentLen) xmlNodeSetContentLen __attribute((alias("xmlNodeSetContentLen__internal_alias"))); +#else +#ifndef xmlNodeSetContentLen +extern __typeof (xmlNodeSetContentLen) xmlNodeSetContentLen__internal_alias __attribute((visibility("hidden"))); +#define xmlNodeSetContentLen xmlNodeSetContentLen__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_TREE_ENABLED) +#ifdef bottom_tree +#undef xmlNodeSetLang +extern __typeof (xmlNodeSetLang) xmlNodeSetLang __attribute((alias("xmlNodeSetLang__internal_alias"))); +#else +#ifndef xmlNodeSetLang +extern __typeof (xmlNodeSetLang) xmlNodeSetLang__internal_alias __attribute((visibility("hidden"))); +#define xmlNodeSetLang xmlNodeSetLang__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_TREE_ENABLED) +#ifdef bottom_tree +#undef xmlNodeSetName +extern __typeof (xmlNodeSetName) xmlNodeSetName __attribute((alias("xmlNodeSetName__internal_alias"))); +#else +#ifndef xmlNodeSetName +extern __typeof (xmlNodeSetName) xmlNodeSetName__internal_alias __attribute((visibility("hidden"))); +#define xmlNodeSetName xmlNodeSetName__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_TREE_ENABLED) +#ifdef bottom_tree +#undef xmlNodeSetSpacePreserve +extern __typeof (xmlNodeSetSpacePreserve) xmlNodeSetSpacePreserve __attribute((alias("xmlNodeSetSpacePreserve__internal_alias"))); +#else +#ifndef xmlNodeSetSpacePreserve +extern __typeof (xmlNodeSetSpacePreserve) xmlNodeSetSpacePreserve__internal_alias __attribute((visibility("hidden"))); +#define xmlNodeSetSpacePreserve xmlNodeSetSpacePreserve__internal_alias +#endif +#endif +#endif + +#ifdef bottom_uri +#undef xmlNormalizeURIPath +extern __typeof (xmlNormalizeURIPath) xmlNormalizeURIPath __attribute((alias("xmlNormalizeURIPath__internal_alias"))); +#else +#ifndef xmlNormalizeURIPath +extern __typeof (xmlNormalizeURIPath) xmlNormalizeURIPath__internal_alias __attribute((visibility("hidden"))); +#define xmlNormalizeURIPath xmlNormalizeURIPath__internal_alias +#endif +#endif + +#ifdef bottom_xmlIO +#undef xmlNormalizeWindowsPath +extern __typeof (xmlNormalizeWindowsPath) xmlNormalizeWindowsPath __attribute((alias("xmlNormalizeWindowsPath__internal_alias"))); +#else +#ifndef xmlNormalizeWindowsPath +extern __typeof (xmlNormalizeWindowsPath) xmlNormalizeWindowsPath__internal_alias __attribute((visibility("hidden"))); +#define xmlNormalizeWindowsPath xmlNormalizeWindowsPath__internal_alias +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlIO +#undef xmlOutputBufferClose +extern __typeof (xmlOutputBufferClose) xmlOutputBufferClose __attribute((alias("xmlOutputBufferClose__internal_alias"))); +#else +#ifndef xmlOutputBufferClose +extern __typeof (xmlOutputBufferClose) xmlOutputBufferClose__internal_alias __attribute((visibility("hidden"))); +#define xmlOutputBufferClose xmlOutputBufferClose__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlIO +#undef xmlOutputBufferCreateBuffer +extern __typeof (xmlOutputBufferCreateBuffer) xmlOutputBufferCreateBuffer __attribute((alias("xmlOutputBufferCreateBuffer__internal_alias"))); +#else +#ifndef xmlOutputBufferCreateBuffer +extern __typeof (xmlOutputBufferCreateBuffer) xmlOutputBufferCreateBuffer__internal_alias __attribute((visibility("hidden"))); +#define xmlOutputBufferCreateBuffer xmlOutputBufferCreateBuffer__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlIO +#undef xmlOutputBufferCreateFd +extern __typeof (xmlOutputBufferCreateFd) xmlOutputBufferCreateFd __attribute((alias("xmlOutputBufferCreateFd__internal_alias"))); +#else +#ifndef xmlOutputBufferCreateFd +extern __typeof (xmlOutputBufferCreateFd) xmlOutputBufferCreateFd__internal_alias __attribute((visibility("hidden"))); +#define xmlOutputBufferCreateFd xmlOutputBufferCreateFd__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlIO +#undef xmlOutputBufferCreateFile +extern __typeof (xmlOutputBufferCreateFile) xmlOutputBufferCreateFile __attribute((alias("xmlOutputBufferCreateFile__internal_alias"))); +#else +#ifndef xmlOutputBufferCreateFile +extern __typeof (xmlOutputBufferCreateFile) xmlOutputBufferCreateFile__internal_alias __attribute((visibility("hidden"))); +#define xmlOutputBufferCreateFile xmlOutputBufferCreateFile__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlIO +#undef xmlOutputBufferCreateFilename +extern __typeof (xmlOutputBufferCreateFilename) xmlOutputBufferCreateFilename __attribute((alias("xmlOutputBufferCreateFilename__internal_alias"))); +#else +#ifndef xmlOutputBufferCreateFilename +extern __typeof (xmlOutputBufferCreateFilename) xmlOutputBufferCreateFilename__internal_alias __attribute((visibility("hidden"))); +#define xmlOutputBufferCreateFilename xmlOutputBufferCreateFilename__internal_alias +#endif +#endif +#endif + +#ifdef bottom_xmlIO +#undef xmlOutputBufferCreateFilenameDefault +extern __typeof (xmlOutputBufferCreateFilenameDefault) xmlOutputBufferCreateFilenameDefault __attribute((alias("xmlOutputBufferCreateFilenameDefault__internal_alias"))); +#else +#ifndef xmlOutputBufferCreateFilenameDefault +extern __typeof (xmlOutputBufferCreateFilenameDefault) xmlOutputBufferCreateFilenameDefault__internal_alias __attribute((visibility("hidden"))); +#define xmlOutputBufferCreateFilenameDefault xmlOutputBufferCreateFilenameDefault__internal_alias +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlIO +#undef xmlOutputBufferCreateIO +extern __typeof (xmlOutputBufferCreateIO) xmlOutputBufferCreateIO __attribute((alias("xmlOutputBufferCreateIO__internal_alias"))); +#else +#ifndef xmlOutputBufferCreateIO +extern __typeof (xmlOutputBufferCreateIO) xmlOutputBufferCreateIO__internal_alias __attribute((visibility("hidden"))); +#define xmlOutputBufferCreateIO xmlOutputBufferCreateIO__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlIO +#undef xmlOutputBufferFlush +extern __typeof (xmlOutputBufferFlush) xmlOutputBufferFlush __attribute((alias("xmlOutputBufferFlush__internal_alias"))); +#else +#ifndef xmlOutputBufferFlush +extern __typeof (xmlOutputBufferFlush) xmlOutputBufferFlush__internal_alias __attribute((visibility("hidden"))); +#define xmlOutputBufferFlush xmlOutputBufferFlush__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlIO +#undef xmlOutputBufferGetContent +extern __typeof (xmlOutputBufferGetContent) xmlOutputBufferGetContent __attribute((alias("xmlOutputBufferGetContent__internal_alias"))); +#else +#ifndef xmlOutputBufferGetContent +extern __typeof (xmlOutputBufferGetContent) xmlOutputBufferGetContent__internal_alias __attribute((visibility("hidden"))); +#define xmlOutputBufferGetContent xmlOutputBufferGetContent__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlIO +#undef xmlOutputBufferGetSize +extern __typeof (xmlOutputBufferGetSize) xmlOutputBufferGetSize __attribute((alias("xmlOutputBufferGetSize__internal_alias"))); +#else +#ifndef xmlOutputBufferGetSize +extern __typeof (xmlOutputBufferGetSize) xmlOutputBufferGetSize__internal_alias __attribute((visibility("hidden"))); +#define xmlOutputBufferGetSize xmlOutputBufferGetSize__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlIO +#undef xmlOutputBufferWrite +extern __typeof (xmlOutputBufferWrite) xmlOutputBufferWrite __attribute((alias("xmlOutputBufferWrite__internal_alias"))); +#else +#ifndef xmlOutputBufferWrite +extern __typeof (xmlOutputBufferWrite) xmlOutputBufferWrite__internal_alias __attribute((visibility("hidden"))); +#define xmlOutputBufferWrite xmlOutputBufferWrite__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlIO +#undef xmlOutputBufferWriteEscape +extern __typeof (xmlOutputBufferWriteEscape) xmlOutputBufferWriteEscape __attribute((alias("xmlOutputBufferWriteEscape__internal_alias"))); +#else +#ifndef xmlOutputBufferWriteEscape +extern __typeof (xmlOutputBufferWriteEscape) xmlOutputBufferWriteEscape__internal_alias __attribute((visibility("hidden"))); +#define xmlOutputBufferWriteEscape xmlOutputBufferWriteEscape__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlIO +#undef xmlOutputBufferWriteString +extern __typeof (xmlOutputBufferWriteString) xmlOutputBufferWriteString __attribute((alias("xmlOutputBufferWriteString__internal_alias"))); +#else +#ifndef xmlOutputBufferWriteString +extern __typeof (xmlOutputBufferWriteString) xmlOutputBufferWriteString__internal_alias __attribute((visibility("hidden"))); +#define xmlOutputBufferWriteString xmlOutputBufferWriteString__internal_alias +#endif +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseAttValue +extern __typeof (xmlParseAttValue) xmlParseAttValue __attribute((alias("xmlParseAttValue__internal_alias"))); +#else +#ifndef xmlParseAttValue +extern __typeof (xmlParseAttValue) xmlParseAttValue__internal_alias __attribute((visibility("hidden"))); +#define xmlParseAttValue xmlParseAttValue__internal_alias +#endif +#endif + +#if defined(LIBXML_SAX1_ENABLED) +#ifdef bottom_parser +#undef xmlParseAttribute +extern __typeof (xmlParseAttribute) xmlParseAttribute __attribute((alias("xmlParseAttribute__internal_alias"))); +#else +#ifndef xmlParseAttribute +extern __typeof (xmlParseAttribute) xmlParseAttribute__internal_alias __attribute((visibility("hidden"))); +#define xmlParseAttribute xmlParseAttribute__internal_alias +#endif +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseAttributeListDecl +extern __typeof (xmlParseAttributeListDecl) xmlParseAttributeListDecl __attribute((alias("xmlParseAttributeListDecl__internal_alias"))); +#else +#ifndef xmlParseAttributeListDecl +extern __typeof (xmlParseAttributeListDecl) xmlParseAttributeListDecl__internal_alias __attribute((visibility("hidden"))); +#define xmlParseAttributeListDecl xmlParseAttributeListDecl__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseAttributeType +extern __typeof (xmlParseAttributeType) xmlParseAttributeType __attribute((alias("xmlParseAttributeType__internal_alias"))); +#else +#ifndef xmlParseAttributeType +extern __typeof (xmlParseAttributeType) xmlParseAttributeType__internal_alias __attribute((visibility("hidden"))); +#define xmlParseAttributeType xmlParseAttributeType__internal_alias +#endif +#endif + +#if defined(LIBXML_SAX1_ENABLED) +#ifdef bottom_parser +#undef xmlParseBalancedChunkMemory +extern __typeof (xmlParseBalancedChunkMemory) xmlParseBalancedChunkMemory __attribute((alias("xmlParseBalancedChunkMemory__internal_alias"))); +#else +#ifndef xmlParseBalancedChunkMemory +extern __typeof (xmlParseBalancedChunkMemory) xmlParseBalancedChunkMemory__internal_alias __attribute((visibility("hidden"))); +#define xmlParseBalancedChunkMemory xmlParseBalancedChunkMemory__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SAX1_ENABLED) +#ifdef bottom_parser +#undef xmlParseBalancedChunkMemoryRecover +extern __typeof (xmlParseBalancedChunkMemoryRecover) xmlParseBalancedChunkMemoryRecover __attribute((alias("xmlParseBalancedChunkMemoryRecover__internal_alias"))); +#else +#ifndef xmlParseBalancedChunkMemoryRecover +extern __typeof (xmlParseBalancedChunkMemoryRecover) xmlParseBalancedChunkMemoryRecover__internal_alias __attribute((visibility("hidden"))); +#define xmlParseBalancedChunkMemoryRecover xmlParseBalancedChunkMemoryRecover__internal_alias +#endif +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseCDSect +extern __typeof (xmlParseCDSect) xmlParseCDSect __attribute((alias("xmlParseCDSect__internal_alias"))); +#else +#ifndef xmlParseCDSect +extern __typeof (xmlParseCDSect) xmlParseCDSect__internal_alias __attribute((visibility("hidden"))); +#define xmlParseCDSect xmlParseCDSect__internal_alias +#endif +#endif + +#if defined(LIBXML_CATALOG_ENABLED) +#ifdef bottom_catalog +#undef xmlParseCatalogFile +extern __typeof (xmlParseCatalogFile) xmlParseCatalogFile __attribute((alias("xmlParseCatalogFile__internal_alias"))); +#else +#ifndef xmlParseCatalogFile +extern __typeof (xmlParseCatalogFile) xmlParseCatalogFile__internal_alias __attribute((visibility("hidden"))); +#define xmlParseCatalogFile xmlParseCatalogFile__internal_alias +#endif +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseCharData +extern __typeof (xmlParseCharData) xmlParseCharData __attribute((alias("xmlParseCharData__internal_alias"))); +#else +#ifndef xmlParseCharData +extern __typeof (xmlParseCharData) xmlParseCharData__internal_alias __attribute((visibility("hidden"))); +#define xmlParseCharData xmlParseCharData__internal_alias +#endif +#endif + +#ifdef bottom_encoding +#undef xmlParseCharEncoding +extern __typeof (xmlParseCharEncoding) xmlParseCharEncoding __attribute((alias("xmlParseCharEncoding__internal_alias"))); +#else +#ifndef xmlParseCharEncoding +extern __typeof (xmlParseCharEncoding) xmlParseCharEncoding__internal_alias __attribute((visibility("hidden"))); +#define xmlParseCharEncoding xmlParseCharEncoding__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseCharRef +extern __typeof (xmlParseCharRef) xmlParseCharRef __attribute((alias("xmlParseCharRef__internal_alias"))); +#else +#ifndef xmlParseCharRef +extern __typeof (xmlParseCharRef) xmlParseCharRef__internal_alias __attribute((visibility("hidden"))); +#define xmlParseCharRef xmlParseCharRef__internal_alias +#endif +#endif + +#if defined(LIBXML_PUSH_ENABLED) +#ifdef bottom_parser +#undef xmlParseChunk +extern __typeof (xmlParseChunk) xmlParseChunk __attribute((alias("xmlParseChunk__internal_alias"))); +#else +#ifndef xmlParseChunk +extern __typeof (xmlParseChunk) xmlParseChunk__internal_alias __attribute((visibility("hidden"))); +#define xmlParseChunk xmlParseChunk__internal_alias +#endif +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseComment +extern __typeof (xmlParseComment) xmlParseComment __attribute((alias("xmlParseComment__internal_alias"))); +#else +#ifndef xmlParseComment +extern __typeof (xmlParseComment) xmlParseComment__internal_alias __attribute((visibility("hidden"))); +#define xmlParseComment xmlParseComment__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseContent +extern __typeof (xmlParseContent) xmlParseContent __attribute((alias("xmlParseContent__internal_alias"))); +#else +#ifndef xmlParseContent +extern __typeof (xmlParseContent) xmlParseContent__internal_alias __attribute((visibility("hidden"))); +#define xmlParseContent xmlParseContent__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseCtxtExternalEntity +extern __typeof (xmlParseCtxtExternalEntity) xmlParseCtxtExternalEntity __attribute((alias("xmlParseCtxtExternalEntity__internal_alias"))); +#else +#ifndef xmlParseCtxtExternalEntity +extern __typeof (xmlParseCtxtExternalEntity) xmlParseCtxtExternalEntity__internal_alias __attribute((visibility("hidden"))); +#define xmlParseCtxtExternalEntity xmlParseCtxtExternalEntity__internal_alias +#endif +#endif + +#if defined(LIBXML_VALID_ENABLED) +#ifdef bottom_parser +#undef xmlParseDTD +extern __typeof (xmlParseDTD) xmlParseDTD __attribute((alias("xmlParseDTD__internal_alias"))); +#else +#ifndef xmlParseDTD +extern __typeof (xmlParseDTD) xmlParseDTD__internal_alias __attribute((visibility("hidden"))); +#define xmlParseDTD xmlParseDTD__internal_alias +#endif +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseDefaultDecl +extern __typeof (xmlParseDefaultDecl) xmlParseDefaultDecl __attribute((alias("xmlParseDefaultDecl__internal_alias"))); +#else +#ifndef xmlParseDefaultDecl +extern __typeof (xmlParseDefaultDecl) xmlParseDefaultDecl__internal_alias __attribute((visibility("hidden"))); +#define xmlParseDefaultDecl xmlParseDefaultDecl__internal_alias +#endif +#endif + +#if defined(LIBXML_SAX1_ENABLED) +#ifdef bottom_parser +#undef xmlParseDoc +extern __typeof (xmlParseDoc) xmlParseDoc __attribute((alias("xmlParseDoc__internal_alias"))); +#else +#ifndef xmlParseDoc +extern __typeof (xmlParseDoc) xmlParseDoc__internal_alias __attribute((visibility("hidden"))); +#define xmlParseDoc xmlParseDoc__internal_alias +#endif +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseDocTypeDecl +extern __typeof (xmlParseDocTypeDecl) xmlParseDocTypeDecl __attribute((alias("xmlParseDocTypeDecl__internal_alias"))); +#else +#ifndef xmlParseDocTypeDecl +extern __typeof (xmlParseDocTypeDecl) xmlParseDocTypeDecl__internal_alias __attribute((visibility("hidden"))); +#define xmlParseDocTypeDecl xmlParseDocTypeDecl__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseDocument +extern __typeof (xmlParseDocument) xmlParseDocument __attribute((alias("xmlParseDocument__internal_alias"))); +#else +#ifndef xmlParseDocument +extern __typeof (xmlParseDocument) xmlParseDocument__internal_alias __attribute((visibility("hidden"))); +#define xmlParseDocument xmlParseDocument__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseElement +extern __typeof (xmlParseElement) xmlParseElement __attribute((alias("xmlParseElement__internal_alias"))); +#else +#ifndef xmlParseElement +extern __typeof (xmlParseElement) xmlParseElement__internal_alias __attribute((visibility("hidden"))); +#define xmlParseElement xmlParseElement__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseElementChildrenContentDecl +extern __typeof (xmlParseElementChildrenContentDecl) xmlParseElementChildrenContentDecl __attribute((alias("xmlParseElementChildrenContentDecl__internal_alias"))); +#else +#ifndef xmlParseElementChildrenContentDecl +extern __typeof (xmlParseElementChildrenContentDecl) xmlParseElementChildrenContentDecl__internal_alias __attribute((visibility("hidden"))); +#define xmlParseElementChildrenContentDecl xmlParseElementChildrenContentDecl__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseElementContentDecl +extern __typeof (xmlParseElementContentDecl) xmlParseElementContentDecl __attribute((alias("xmlParseElementContentDecl__internal_alias"))); +#else +#ifndef xmlParseElementContentDecl +extern __typeof (xmlParseElementContentDecl) xmlParseElementContentDecl__internal_alias __attribute((visibility("hidden"))); +#define xmlParseElementContentDecl xmlParseElementContentDecl__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseElementDecl +extern __typeof (xmlParseElementDecl) xmlParseElementDecl __attribute((alias("xmlParseElementDecl__internal_alias"))); +#else +#ifndef xmlParseElementDecl +extern __typeof (xmlParseElementDecl) xmlParseElementDecl__internal_alias __attribute((visibility("hidden"))); +#define xmlParseElementDecl xmlParseElementDecl__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseElementMixedContentDecl +extern __typeof (xmlParseElementMixedContentDecl) xmlParseElementMixedContentDecl __attribute((alias("xmlParseElementMixedContentDecl__internal_alias"))); +#else +#ifndef xmlParseElementMixedContentDecl +extern __typeof (xmlParseElementMixedContentDecl) xmlParseElementMixedContentDecl__internal_alias __attribute((visibility("hidden"))); +#define xmlParseElementMixedContentDecl xmlParseElementMixedContentDecl__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseEncName +extern __typeof (xmlParseEncName) xmlParseEncName __attribute((alias("xmlParseEncName__internal_alias"))); +#else +#ifndef xmlParseEncName +extern __typeof (xmlParseEncName) xmlParseEncName__internal_alias __attribute((visibility("hidden"))); +#define xmlParseEncName xmlParseEncName__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseEncodingDecl +extern __typeof (xmlParseEncodingDecl) xmlParseEncodingDecl __attribute((alias("xmlParseEncodingDecl__internal_alias"))); +#else +#ifndef xmlParseEncodingDecl +extern __typeof (xmlParseEncodingDecl) xmlParseEncodingDecl__internal_alias __attribute((visibility("hidden"))); +#define xmlParseEncodingDecl xmlParseEncodingDecl__internal_alias +#endif +#endif + +#if defined(LIBXML_SAX1_ENABLED) +#ifdef bottom_parser +#undef xmlParseEndTag +extern __typeof (xmlParseEndTag) xmlParseEndTag __attribute((alias("xmlParseEndTag__internal_alias"))); +#else +#ifndef xmlParseEndTag +extern __typeof (xmlParseEndTag) xmlParseEndTag__internal_alias __attribute((visibility("hidden"))); +#define xmlParseEndTag xmlParseEndTag__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SAX1_ENABLED) +#ifdef bottom_parser +#undef xmlParseEntity +extern __typeof (xmlParseEntity) xmlParseEntity __attribute((alias("xmlParseEntity__internal_alias"))); +#else +#ifndef xmlParseEntity +extern __typeof (xmlParseEntity) xmlParseEntity__internal_alias __attribute((visibility("hidden"))); +#define xmlParseEntity xmlParseEntity__internal_alias +#endif +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseEntityDecl +extern __typeof (xmlParseEntityDecl) xmlParseEntityDecl __attribute((alias("xmlParseEntityDecl__internal_alias"))); +#else +#ifndef xmlParseEntityDecl +extern __typeof (xmlParseEntityDecl) xmlParseEntityDecl__internal_alias __attribute((visibility("hidden"))); +#define xmlParseEntityDecl xmlParseEntityDecl__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseEntityRef +extern __typeof (xmlParseEntityRef) xmlParseEntityRef __attribute((alias("xmlParseEntityRef__internal_alias"))); +#else +#ifndef xmlParseEntityRef +extern __typeof (xmlParseEntityRef) xmlParseEntityRef__internal_alias __attribute((visibility("hidden"))); +#define xmlParseEntityRef xmlParseEntityRef__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseEntityValue +extern __typeof (xmlParseEntityValue) xmlParseEntityValue __attribute((alias("xmlParseEntityValue__internal_alias"))); +#else +#ifndef xmlParseEntityValue +extern __typeof (xmlParseEntityValue) xmlParseEntityValue__internal_alias __attribute((visibility("hidden"))); +#define xmlParseEntityValue xmlParseEntityValue__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseEnumeratedType +extern __typeof (xmlParseEnumeratedType) xmlParseEnumeratedType __attribute((alias("xmlParseEnumeratedType__internal_alias"))); +#else +#ifndef xmlParseEnumeratedType +extern __typeof (xmlParseEnumeratedType) xmlParseEnumeratedType__internal_alias __attribute((visibility("hidden"))); +#define xmlParseEnumeratedType xmlParseEnumeratedType__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseEnumerationType +extern __typeof (xmlParseEnumerationType) xmlParseEnumerationType __attribute((alias("xmlParseEnumerationType__internal_alias"))); +#else +#ifndef xmlParseEnumerationType +extern __typeof (xmlParseEnumerationType) xmlParseEnumerationType__internal_alias __attribute((visibility("hidden"))); +#define xmlParseEnumerationType xmlParseEnumerationType__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseExtParsedEnt +extern __typeof (xmlParseExtParsedEnt) xmlParseExtParsedEnt __attribute((alias("xmlParseExtParsedEnt__internal_alias"))); +#else +#ifndef xmlParseExtParsedEnt +extern __typeof (xmlParseExtParsedEnt) xmlParseExtParsedEnt__internal_alias __attribute((visibility("hidden"))); +#define xmlParseExtParsedEnt xmlParseExtParsedEnt__internal_alias +#endif +#endif + +#if defined(LIBXML_SAX1_ENABLED) +#ifdef bottom_parser +#undef xmlParseExternalEntity +extern __typeof (xmlParseExternalEntity) xmlParseExternalEntity __attribute((alias("xmlParseExternalEntity__internal_alias"))); +#else +#ifndef xmlParseExternalEntity +extern __typeof (xmlParseExternalEntity) xmlParseExternalEntity__internal_alias __attribute((visibility("hidden"))); +#define xmlParseExternalEntity xmlParseExternalEntity__internal_alias +#endif +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseExternalID +extern __typeof (xmlParseExternalID) xmlParseExternalID __attribute((alias("xmlParseExternalID__internal_alias"))); +#else +#ifndef xmlParseExternalID +extern __typeof (xmlParseExternalID) xmlParseExternalID__internal_alias __attribute((visibility("hidden"))); +#define xmlParseExternalID xmlParseExternalID__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseExternalSubset +extern __typeof (xmlParseExternalSubset) xmlParseExternalSubset __attribute((alias("xmlParseExternalSubset__internal_alias"))); +#else +#ifndef xmlParseExternalSubset +extern __typeof (xmlParseExternalSubset) xmlParseExternalSubset__internal_alias __attribute((visibility("hidden"))); +#define xmlParseExternalSubset xmlParseExternalSubset__internal_alias +#endif +#endif + +#if defined(LIBXML_SAX1_ENABLED) +#ifdef bottom_parser +#undef xmlParseFile +extern __typeof (xmlParseFile) xmlParseFile __attribute((alias("xmlParseFile__internal_alias"))); +#else +#ifndef xmlParseFile +extern __typeof (xmlParseFile) xmlParseFile__internal_alias __attribute((visibility("hidden"))); +#define xmlParseFile xmlParseFile__internal_alias +#endif +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseInNodeContext +extern __typeof (xmlParseInNodeContext) xmlParseInNodeContext __attribute((alias("xmlParseInNodeContext__internal_alias"))); +#else +#ifndef xmlParseInNodeContext +extern __typeof (xmlParseInNodeContext) xmlParseInNodeContext__internal_alias __attribute((visibility("hidden"))); +#define xmlParseInNodeContext xmlParseInNodeContext__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseMarkupDecl +extern __typeof (xmlParseMarkupDecl) xmlParseMarkupDecl __attribute((alias("xmlParseMarkupDecl__internal_alias"))); +#else +#ifndef xmlParseMarkupDecl +extern __typeof (xmlParseMarkupDecl) xmlParseMarkupDecl__internal_alias __attribute((visibility("hidden"))); +#define xmlParseMarkupDecl xmlParseMarkupDecl__internal_alias +#endif +#endif + +#if defined(LIBXML_SAX1_ENABLED) +#ifdef bottom_parser +#undef xmlParseMemory +extern __typeof (xmlParseMemory) xmlParseMemory __attribute((alias("xmlParseMemory__internal_alias"))); +#else +#ifndef xmlParseMemory +extern __typeof (xmlParseMemory) xmlParseMemory__internal_alias __attribute((visibility("hidden"))); +#define xmlParseMemory xmlParseMemory__internal_alias +#endif +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseMisc +extern __typeof (xmlParseMisc) xmlParseMisc __attribute((alias("xmlParseMisc__internal_alias"))); +#else +#ifndef xmlParseMisc +extern __typeof (xmlParseMisc) xmlParseMisc__internal_alias __attribute((visibility("hidden"))); +#define xmlParseMisc xmlParseMisc__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseName +extern __typeof (xmlParseName) xmlParseName __attribute((alias("xmlParseName__internal_alias"))); +#else +#ifndef xmlParseName +extern __typeof (xmlParseName) xmlParseName__internal_alias __attribute((visibility("hidden"))); +#define xmlParseName xmlParseName__internal_alias +#endif +#endif + +#if defined(LIBXML_LEGACY_ENABLED) +#ifdef bottom_legacy +#undef xmlParseNamespace +extern __typeof (xmlParseNamespace) xmlParseNamespace __attribute((alias("xmlParseNamespace__internal_alias"))); +#else +#ifndef xmlParseNamespace +extern __typeof (xmlParseNamespace) xmlParseNamespace__internal_alias __attribute((visibility("hidden"))); +#define xmlParseNamespace xmlParseNamespace__internal_alias +#endif +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseNmtoken +extern __typeof (xmlParseNmtoken) xmlParseNmtoken __attribute((alias("xmlParseNmtoken__internal_alias"))); +#else +#ifndef xmlParseNmtoken +extern __typeof (xmlParseNmtoken) xmlParseNmtoken__internal_alias __attribute((visibility("hidden"))); +#define xmlParseNmtoken xmlParseNmtoken__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseNotationDecl +extern __typeof (xmlParseNotationDecl) xmlParseNotationDecl __attribute((alias("xmlParseNotationDecl__internal_alias"))); +#else +#ifndef xmlParseNotationDecl +extern __typeof (xmlParseNotationDecl) xmlParseNotationDecl__internal_alias __attribute((visibility("hidden"))); +#define xmlParseNotationDecl xmlParseNotationDecl__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseNotationType +extern __typeof (xmlParseNotationType) xmlParseNotationType __attribute((alias("xmlParseNotationType__internal_alias"))); +#else +#ifndef xmlParseNotationType +extern __typeof (xmlParseNotationType) xmlParseNotationType__internal_alias __attribute((visibility("hidden"))); +#define xmlParseNotationType xmlParseNotationType__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlParsePEReference +extern __typeof (xmlParsePEReference) xmlParsePEReference __attribute((alias("xmlParsePEReference__internal_alias"))); +#else +#ifndef xmlParsePEReference +extern __typeof (xmlParsePEReference) xmlParsePEReference__internal_alias __attribute((visibility("hidden"))); +#define xmlParsePEReference xmlParsePEReference__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlParsePI +extern __typeof (xmlParsePI) xmlParsePI __attribute((alias("xmlParsePI__internal_alias"))); +#else +#ifndef xmlParsePI +extern __typeof (xmlParsePI) xmlParsePI__internal_alias __attribute((visibility("hidden"))); +#define xmlParsePI xmlParsePI__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlParsePITarget +extern __typeof (xmlParsePITarget) xmlParsePITarget __attribute((alias("xmlParsePITarget__internal_alias"))); +#else +#ifndef xmlParsePITarget +extern __typeof (xmlParsePITarget) xmlParsePITarget__internal_alias __attribute((visibility("hidden"))); +#define xmlParsePITarget xmlParsePITarget__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlParsePubidLiteral +extern __typeof (xmlParsePubidLiteral) xmlParsePubidLiteral __attribute((alias("xmlParsePubidLiteral__internal_alias"))); +#else +#ifndef xmlParsePubidLiteral +extern __typeof (xmlParsePubidLiteral) xmlParsePubidLiteral__internal_alias __attribute((visibility("hidden"))); +#define xmlParsePubidLiteral xmlParsePubidLiteral__internal_alias +#endif +#endif + +#if defined(LIBXML_LEGACY_ENABLED) +#ifdef bottom_legacy +#undef xmlParseQuotedString +extern __typeof (xmlParseQuotedString) xmlParseQuotedString __attribute((alias("xmlParseQuotedString__internal_alias"))); +#else +#ifndef xmlParseQuotedString +extern __typeof (xmlParseQuotedString) xmlParseQuotedString__internal_alias __attribute((visibility("hidden"))); +#define xmlParseQuotedString xmlParseQuotedString__internal_alias +#endif +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseReference +extern __typeof (xmlParseReference) xmlParseReference __attribute((alias("xmlParseReference__internal_alias"))); +#else +#ifndef xmlParseReference +extern __typeof (xmlParseReference) xmlParseReference__internal_alias __attribute((visibility("hidden"))); +#define xmlParseReference xmlParseReference__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseSDDecl +extern __typeof (xmlParseSDDecl) xmlParseSDDecl __attribute((alias("xmlParseSDDecl__internal_alias"))); +#else +#ifndef xmlParseSDDecl +extern __typeof (xmlParseSDDecl) xmlParseSDDecl__internal_alias __attribute((visibility("hidden"))); +#define xmlParseSDDecl xmlParseSDDecl__internal_alias +#endif +#endif + +#if defined(LIBXML_SAX1_ENABLED) +#ifdef bottom_parser +#undef xmlParseStartTag +extern __typeof (xmlParseStartTag) xmlParseStartTag __attribute((alias("xmlParseStartTag__internal_alias"))); +#else +#ifndef xmlParseStartTag +extern __typeof (xmlParseStartTag) xmlParseStartTag__internal_alias __attribute((visibility("hidden"))); +#define xmlParseStartTag xmlParseStartTag__internal_alias +#endif +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseSystemLiteral +extern __typeof (xmlParseSystemLiteral) xmlParseSystemLiteral __attribute((alias("xmlParseSystemLiteral__internal_alias"))); +#else +#ifndef xmlParseSystemLiteral +extern __typeof (xmlParseSystemLiteral) xmlParseSystemLiteral__internal_alias __attribute((visibility("hidden"))); +#define xmlParseSystemLiteral xmlParseSystemLiteral__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseTextDecl +extern __typeof (xmlParseTextDecl) xmlParseTextDecl __attribute((alias("xmlParseTextDecl__internal_alias"))); +#else +#ifndef xmlParseTextDecl +extern __typeof (xmlParseTextDecl) xmlParseTextDecl__internal_alias __attribute((visibility("hidden"))); +#define xmlParseTextDecl xmlParseTextDecl__internal_alias +#endif +#endif + +#ifdef bottom_uri +#undef xmlParseURI +extern __typeof (xmlParseURI) xmlParseURI __attribute((alias("xmlParseURI__internal_alias"))); +#else +#ifndef xmlParseURI +extern __typeof (xmlParseURI) xmlParseURI__internal_alias __attribute((visibility("hidden"))); +#define xmlParseURI xmlParseURI__internal_alias +#endif +#endif + +#ifdef bottom_uri +#undef xmlParseURIRaw +extern __typeof (xmlParseURIRaw) xmlParseURIRaw __attribute((alias("xmlParseURIRaw__internal_alias"))); +#else +#ifndef xmlParseURIRaw +extern __typeof (xmlParseURIRaw) xmlParseURIRaw__internal_alias __attribute((visibility("hidden"))); +#define xmlParseURIRaw xmlParseURIRaw__internal_alias +#endif +#endif + +#ifdef bottom_uri +#undef xmlParseURIReference +extern __typeof (xmlParseURIReference) xmlParseURIReference __attribute((alias("xmlParseURIReference__internal_alias"))); +#else +#ifndef xmlParseURIReference +extern __typeof (xmlParseURIReference) xmlParseURIReference__internal_alias __attribute((visibility("hidden"))); +#define xmlParseURIReference xmlParseURIReference__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseVersionInfo +extern __typeof (xmlParseVersionInfo) xmlParseVersionInfo __attribute((alias("xmlParseVersionInfo__internal_alias"))); +#else +#ifndef xmlParseVersionInfo +extern __typeof (xmlParseVersionInfo) xmlParseVersionInfo__internal_alias __attribute((visibility("hidden"))); +#define xmlParseVersionInfo xmlParseVersionInfo__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseVersionNum +extern __typeof (xmlParseVersionNum) xmlParseVersionNum __attribute((alias("xmlParseVersionNum__internal_alias"))); +#else +#ifndef xmlParseVersionNum +extern __typeof (xmlParseVersionNum) xmlParseVersionNum__internal_alias __attribute((visibility("hidden"))); +#define xmlParseVersionNum xmlParseVersionNum__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlParseXMLDecl +extern __typeof (xmlParseXMLDecl) xmlParseXMLDecl __attribute((alias("xmlParseXMLDecl__internal_alias"))); +#else +#ifndef xmlParseXMLDecl +extern __typeof (xmlParseXMLDecl) xmlParseXMLDecl__internal_alias __attribute((visibility("hidden"))); +#define xmlParseXMLDecl xmlParseXMLDecl__internal_alias +#endif +#endif + +#ifdef bottom_parserInternals +#undef xmlParserAddNodeInfo +extern __typeof (xmlParserAddNodeInfo) xmlParserAddNodeInfo __attribute((alias("xmlParserAddNodeInfo__internal_alias"))); +#else +#ifndef xmlParserAddNodeInfo +extern __typeof (xmlParserAddNodeInfo) xmlParserAddNodeInfo__internal_alias __attribute((visibility("hidden"))); +#define xmlParserAddNodeInfo xmlParserAddNodeInfo__internal_alias +#endif +#endif + +#ifdef bottom_error +#undef xmlParserError +extern __typeof (xmlParserError) xmlParserError __attribute((alias("xmlParserError__internal_alias"))); +#else +#ifndef xmlParserError +extern __typeof (xmlParserError) xmlParserError__internal_alias __attribute((visibility("hidden"))); +#define xmlParserError xmlParserError__internal_alias +#endif +#endif + +#ifdef bottom_parserInternals +#undef xmlParserFindNodeInfo +extern __typeof (xmlParserFindNodeInfo) xmlParserFindNodeInfo __attribute((alias("xmlParserFindNodeInfo__internal_alias"))); +#else +#ifndef xmlParserFindNodeInfo +extern __typeof (xmlParserFindNodeInfo) xmlParserFindNodeInfo__internal_alias __attribute((visibility("hidden"))); +#define xmlParserFindNodeInfo xmlParserFindNodeInfo__internal_alias +#endif +#endif + +#ifdef bottom_parserInternals +#undef xmlParserFindNodeInfoIndex +extern __typeof (xmlParserFindNodeInfoIndex) xmlParserFindNodeInfoIndex __attribute((alias("xmlParserFindNodeInfoIndex__internal_alias"))); +#else +#ifndef xmlParserFindNodeInfoIndex +extern __typeof (xmlParserFindNodeInfoIndex) xmlParserFindNodeInfoIndex__internal_alias __attribute((visibility("hidden"))); +#define xmlParserFindNodeInfoIndex xmlParserFindNodeInfoIndex__internal_alias +#endif +#endif + +#ifdef bottom_xmlIO +#undef xmlParserGetDirectory +extern __typeof (xmlParserGetDirectory) xmlParserGetDirectory __attribute((alias("xmlParserGetDirectory__internal_alias"))); +#else +#ifndef xmlParserGetDirectory +extern __typeof (xmlParserGetDirectory) xmlParserGetDirectory__internal_alias __attribute((visibility("hidden"))); +#define xmlParserGetDirectory xmlParserGetDirectory__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlParserHandlePEReference +extern __typeof (xmlParserHandlePEReference) xmlParserHandlePEReference __attribute((alias("xmlParserHandlePEReference__internal_alias"))); +#else +#ifndef xmlParserHandlePEReference +extern __typeof (xmlParserHandlePEReference) xmlParserHandlePEReference__internal_alias __attribute((visibility("hidden"))); +#define xmlParserHandlePEReference xmlParserHandlePEReference__internal_alias +#endif +#endif + +#if defined(LIBXML_LEGACY_ENABLED) +#ifdef bottom_legacy +#undef xmlParserHandleReference +extern __typeof (xmlParserHandleReference) xmlParserHandleReference __attribute((alias("xmlParserHandleReference__internal_alias"))); +#else +#ifndef xmlParserHandleReference +extern __typeof (xmlParserHandleReference) xmlParserHandleReference__internal_alias __attribute((visibility("hidden"))); +#define xmlParserHandleReference xmlParserHandleReference__internal_alias +#endif +#endif +#endif + +#ifdef bottom_xmlIO +#undef xmlParserInputBufferCreateFd +extern __typeof (xmlParserInputBufferCreateFd) xmlParserInputBufferCreateFd __attribute((alias("xmlParserInputBufferCreateFd__internal_alias"))); +#else +#ifndef xmlParserInputBufferCreateFd +extern __typeof (xmlParserInputBufferCreateFd) xmlParserInputBufferCreateFd__internal_alias __attribute((visibility("hidden"))); +#define xmlParserInputBufferCreateFd xmlParserInputBufferCreateFd__internal_alias +#endif +#endif + +#ifdef bottom_xmlIO +#undef xmlParserInputBufferCreateFile +extern __typeof (xmlParserInputBufferCreateFile) xmlParserInputBufferCreateFile __attribute((alias("xmlParserInputBufferCreateFile__internal_alias"))); +#else +#ifndef xmlParserInputBufferCreateFile +extern __typeof (xmlParserInputBufferCreateFile) xmlParserInputBufferCreateFile__internal_alias __attribute((visibility("hidden"))); +#define xmlParserInputBufferCreateFile xmlParserInputBufferCreateFile__internal_alias +#endif +#endif + +#ifdef bottom_xmlIO +#undef xmlParserInputBufferCreateFilename +extern __typeof (xmlParserInputBufferCreateFilename) xmlParserInputBufferCreateFilename __attribute((alias("xmlParserInputBufferCreateFilename__internal_alias"))); +#else +#ifndef xmlParserInputBufferCreateFilename +extern __typeof (xmlParserInputBufferCreateFilename) xmlParserInputBufferCreateFilename__internal_alias __attribute((visibility("hidden"))); +#define xmlParserInputBufferCreateFilename xmlParserInputBufferCreateFilename__internal_alias +#endif +#endif + +#ifdef bottom_xmlIO +#undef xmlParserInputBufferCreateFilenameDefault +extern __typeof (xmlParserInputBufferCreateFilenameDefault) xmlParserInputBufferCreateFilenameDefault __attribute((alias("xmlParserInputBufferCreateFilenameDefault__internal_alias"))); +#else +#ifndef xmlParserInputBufferCreateFilenameDefault +extern __typeof (xmlParserInputBufferCreateFilenameDefault) xmlParserInputBufferCreateFilenameDefault__internal_alias __attribute((visibility("hidden"))); +#define xmlParserInputBufferCreateFilenameDefault xmlParserInputBufferCreateFilenameDefault__internal_alias +#endif +#endif + +#ifdef bottom_xmlIO +#undef xmlParserInputBufferCreateIO +extern __typeof (xmlParserInputBufferCreateIO) xmlParserInputBufferCreateIO __attribute((alias("xmlParserInputBufferCreateIO__internal_alias"))); +#else +#ifndef xmlParserInputBufferCreateIO +extern __typeof (xmlParserInputBufferCreateIO) xmlParserInputBufferCreateIO__internal_alias __attribute((visibility("hidden"))); +#define xmlParserInputBufferCreateIO xmlParserInputBufferCreateIO__internal_alias +#endif +#endif + +#ifdef bottom_xmlIO +#undef xmlParserInputBufferCreateMem +extern __typeof (xmlParserInputBufferCreateMem) xmlParserInputBufferCreateMem __attribute((alias("xmlParserInputBufferCreateMem__internal_alias"))); +#else +#ifndef xmlParserInputBufferCreateMem +extern __typeof (xmlParserInputBufferCreateMem) xmlParserInputBufferCreateMem__internal_alias __attribute((visibility("hidden"))); +#define xmlParserInputBufferCreateMem xmlParserInputBufferCreateMem__internal_alias +#endif +#endif + +#ifdef bottom_xmlIO +#undef xmlParserInputBufferCreateStatic +extern __typeof (xmlParserInputBufferCreateStatic) xmlParserInputBufferCreateStatic __attribute((alias("xmlParserInputBufferCreateStatic__internal_alias"))); +#else +#ifndef xmlParserInputBufferCreateStatic +extern __typeof (xmlParserInputBufferCreateStatic) xmlParserInputBufferCreateStatic__internal_alias __attribute((visibility("hidden"))); +#define xmlParserInputBufferCreateStatic xmlParserInputBufferCreateStatic__internal_alias +#endif +#endif + +#ifdef bottom_xmlIO +#undef xmlParserInputBufferGrow +extern __typeof (xmlParserInputBufferGrow) xmlParserInputBufferGrow __attribute((alias("xmlParserInputBufferGrow__internal_alias"))); +#else +#ifndef xmlParserInputBufferGrow +extern __typeof (xmlParserInputBufferGrow) xmlParserInputBufferGrow__internal_alias __attribute((visibility("hidden"))); +#define xmlParserInputBufferGrow xmlParserInputBufferGrow__internal_alias +#endif +#endif + +#ifdef bottom_xmlIO +#undef xmlParserInputBufferPush +extern __typeof (xmlParserInputBufferPush) xmlParserInputBufferPush __attribute((alias("xmlParserInputBufferPush__internal_alias"))); +#else +#ifndef xmlParserInputBufferPush +extern __typeof (xmlParserInputBufferPush) xmlParserInputBufferPush__internal_alias __attribute((visibility("hidden"))); +#define xmlParserInputBufferPush xmlParserInputBufferPush__internal_alias +#endif +#endif + +#ifdef bottom_xmlIO +#undef xmlParserInputBufferRead +extern __typeof (xmlParserInputBufferRead) xmlParserInputBufferRead __attribute((alias("xmlParserInputBufferRead__internal_alias"))); +#else +#ifndef xmlParserInputBufferRead +extern __typeof (xmlParserInputBufferRead) xmlParserInputBufferRead__internal_alias __attribute((visibility("hidden"))); +#define xmlParserInputBufferRead xmlParserInputBufferRead__internal_alias +#endif +#endif + +#ifdef bottom_parserInternals +#undef xmlParserInputGrow +extern __typeof (xmlParserInputGrow) xmlParserInputGrow __attribute((alias("xmlParserInputGrow__internal_alias"))); +#else +#ifndef xmlParserInputGrow +extern __typeof (xmlParserInputGrow) xmlParserInputGrow__internal_alias __attribute((visibility("hidden"))); +#define xmlParserInputGrow xmlParserInputGrow__internal_alias +#endif +#endif + +#ifdef bottom_parserInternals +#undef xmlParserInputRead +extern __typeof (xmlParserInputRead) xmlParserInputRead __attribute((alias("xmlParserInputRead__internal_alias"))); +#else +#ifndef xmlParserInputRead +extern __typeof (xmlParserInputRead) xmlParserInputRead__internal_alias __attribute((visibility("hidden"))); +#define xmlParserInputRead xmlParserInputRead__internal_alias +#endif +#endif + +#ifdef bottom_parserInternals +#undef xmlParserInputShrink +extern __typeof (xmlParserInputShrink) xmlParserInputShrink __attribute((alias("xmlParserInputShrink__internal_alias"))); +#else +#ifndef xmlParserInputShrink +extern __typeof (xmlParserInputShrink) xmlParserInputShrink__internal_alias __attribute((visibility("hidden"))); +#define xmlParserInputShrink xmlParserInputShrink__internal_alias +#endif +#endif + +#ifdef bottom_error +#undef xmlParserPrintFileContext +extern __typeof (xmlParserPrintFileContext) xmlParserPrintFileContext __attribute((alias("xmlParserPrintFileContext__internal_alias"))); +#else +#ifndef xmlParserPrintFileContext +extern __typeof (xmlParserPrintFileContext) xmlParserPrintFileContext__internal_alias __attribute((visibility("hidden"))); +#define xmlParserPrintFileContext xmlParserPrintFileContext__internal_alias +#endif +#endif + +#ifdef bottom_error +#undef xmlParserPrintFileInfo +extern __typeof (xmlParserPrintFileInfo) xmlParserPrintFileInfo __attribute((alias("xmlParserPrintFileInfo__internal_alias"))); +#else +#ifndef xmlParserPrintFileInfo +extern __typeof (xmlParserPrintFileInfo) xmlParserPrintFileInfo__internal_alias __attribute((visibility("hidden"))); +#define xmlParserPrintFileInfo xmlParserPrintFileInfo__internal_alias +#endif +#endif + +#ifdef bottom_error +#undef xmlParserValidityError +extern __typeof (xmlParserValidityError) xmlParserValidityError __attribute((alias("xmlParserValidityError__internal_alias"))); +#else +#ifndef xmlParserValidityError +extern __typeof (xmlParserValidityError) xmlParserValidityError__internal_alias __attribute((visibility("hidden"))); +#define xmlParserValidityError xmlParserValidityError__internal_alias +#endif +#endif + +#ifdef bottom_error +#undef xmlParserValidityWarning +extern __typeof (xmlParserValidityWarning) xmlParserValidityWarning __attribute((alias("xmlParserValidityWarning__internal_alias"))); +#else +#ifndef xmlParserValidityWarning +extern __typeof (xmlParserValidityWarning) xmlParserValidityWarning__internal_alias __attribute((visibility("hidden"))); +#define xmlParserValidityWarning xmlParserValidityWarning__internal_alias +#endif +#endif + +#ifdef bottom_error +#undef xmlParserWarning +extern __typeof (xmlParserWarning) xmlParserWarning __attribute((alias("xmlParserWarning__internal_alias"))); +#else +#ifndef xmlParserWarning +extern __typeof (xmlParserWarning) xmlParserWarning__internal_alias __attribute((visibility("hidden"))); +#define xmlParserWarning xmlParserWarning__internal_alias +#endif +#endif + +#ifdef bottom_uri +#undef xmlPathToURI +extern __typeof (xmlPathToURI) xmlPathToURI __attribute((alias("xmlPathToURI__internal_alias"))); +#else +#ifndef xmlPathToURI +extern __typeof (xmlPathToURI) xmlPathToURI__internal_alias __attribute((visibility("hidden"))); +#define xmlPathToURI xmlPathToURI__internal_alias +#endif +#endif + +#if defined(LIBXML_PATTERN_ENABLED) +#ifdef bottom_pattern +#undef xmlPatternFromRoot +extern __typeof (xmlPatternFromRoot) xmlPatternFromRoot __attribute((alias("xmlPatternFromRoot__internal_alias"))); +#else +#ifndef xmlPatternFromRoot +extern __typeof (xmlPatternFromRoot) xmlPatternFromRoot__internal_alias __attribute((visibility("hidden"))); +#define xmlPatternFromRoot xmlPatternFromRoot__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_PATTERN_ENABLED) +#ifdef bottom_pattern +#undef xmlPatternGetStreamCtxt +extern __typeof (xmlPatternGetStreamCtxt) xmlPatternGetStreamCtxt __attribute((alias("xmlPatternGetStreamCtxt__internal_alias"))); +#else +#ifndef xmlPatternGetStreamCtxt +extern __typeof (xmlPatternGetStreamCtxt) xmlPatternGetStreamCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlPatternGetStreamCtxt xmlPatternGetStreamCtxt__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_PATTERN_ENABLED) +#ifdef bottom_pattern +#undef xmlPatternMatch +extern __typeof (xmlPatternMatch) xmlPatternMatch __attribute((alias("xmlPatternMatch__internal_alias"))); +#else +#ifndef xmlPatternMatch +extern __typeof (xmlPatternMatch) xmlPatternMatch__internal_alias __attribute((visibility("hidden"))); +#define xmlPatternMatch xmlPatternMatch__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_PATTERN_ENABLED) +#ifdef bottom_pattern +#undef xmlPatternMaxDepth +extern __typeof (xmlPatternMaxDepth) xmlPatternMaxDepth __attribute((alias("xmlPatternMaxDepth__internal_alias"))); +#else +#ifndef xmlPatternMaxDepth +extern __typeof (xmlPatternMaxDepth) xmlPatternMaxDepth__internal_alias __attribute((visibility("hidden"))); +#define xmlPatternMaxDepth xmlPatternMaxDepth__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_PATTERN_ENABLED) +#ifdef bottom_pattern +#undef xmlPatternMinDepth +extern __typeof (xmlPatternMinDepth) xmlPatternMinDepth __attribute((alias("xmlPatternMinDepth__internal_alias"))); +#else +#ifndef xmlPatternMinDepth +extern __typeof (xmlPatternMinDepth) xmlPatternMinDepth__internal_alias __attribute((visibility("hidden"))); +#define xmlPatternMinDepth xmlPatternMinDepth__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_PATTERN_ENABLED) +#ifdef bottom_pattern +#undef xmlPatternStreamable +extern __typeof (xmlPatternStreamable) xmlPatternStreamable __attribute((alias("xmlPatternStreamable__internal_alias"))); +#else +#ifndef xmlPatternStreamable +extern __typeof (xmlPatternStreamable) xmlPatternStreamable__internal_alias __attribute((visibility("hidden"))); +#define xmlPatternStreamable xmlPatternStreamable__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_PATTERN_ENABLED) +#ifdef bottom_pattern +#undef xmlPatterncompile +extern __typeof (xmlPatterncompile) xmlPatterncompile __attribute((alias("xmlPatterncompile__internal_alias"))); +#else +#ifndef xmlPatterncompile +extern __typeof (xmlPatterncompile) xmlPatterncompile__internal_alias __attribute((visibility("hidden"))); +#define xmlPatterncompile xmlPatterncompile__internal_alias +#endif +#endif +#endif + +#ifdef bottom_parserInternals +#undef xmlPedanticParserDefault +extern __typeof (xmlPedanticParserDefault) xmlPedanticParserDefault __attribute((alias("xmlPedanticParserDefault__internal_alias"))); +#else +#ifndef xmlPedanticParserDefault +extern __typeof (xmlPedanticParserDefault) xmlPedanticParserDefault__internal_alias __attribute((visibility("hidden"))); +#define xmlPedanticParserDefault xmlPedanticParserDefault__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlPopInput +extern __typeof (xmlPopInput) xmlPopInput __attribute((alias("xmlPopInput__internal_alias"))); +#else +#ifndef xmlPopInput +extern __typeof (xmlPopInput) xmlPopInput__internal_alias __attribute((visibility("hidden"))); +#define xmlPopInput xmlPopInput__internal_alias +#endif +#endif + +#ifdef bottom_xmlIO +#undef xmlPopInputCallbacks +extern __typeof (xmlPopInputCallbacks) xmlPopInputCallbacks __attribute((alias("xmlPopInputCallbacks__internal_alias"))); +#else +#ifndef xmlPopInputCallbacks +extern __typeof (xmlPopInputCallbacks) xmlPopInputCallbacks__internal_alias __attribute((visibility("hidden"))); +#define xmlPopInputCallbacks xmlPopInputCallbacks__internal_alias +#endif +#endif + +#if defined(LIBXML_TREE_ENABLED) +#ifdef bottom_tree +#undef xmlPreviousElementSibling +extern __typeof (xmlPreviousElementSibling) xmlPreviousElementSibling __attribute((alias("xmlPreviousElementSibling__internal_alias"))); +#else +#ifndef xmlPreviousElementSibling +extern __typeof (xmlPreviousElementSibling) xmlPreviousElementSibling__internal_alias __attribute((visibility("hidden"))); +#define xmlPreviousElementSibling xmlPreviousElementSibling__internal_alias +#endif +#endif +#endif + +#ifdef bottom_uri +#undef xmlPrintURI +extern __typeof (xmlPrintURI) xmlPrintURI __attribute((alias("xmlPrintURI__internal_alias"))); +#else +#ifndef xmlPrintURI +extern __typeof (xmlPrintURI) xmlPrintURI__internal_alias __attribute((visibility("hidden"))); +#define xmlPrintURI xmlPrintURI__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlPushInput +extern __typeof (xmlPushInput) xmlPushInput __attribute((alias("xmlPushInput__internal_alias"))); +#else +#ifndef xmlPushInput +extern __typeof (xmlPushInput) xmlPushInput__internal_alias __attribute((visibility("hidden"))); +#define xmlPushInput xmlPushInput__internal_alias +#endif +#endif + +#ifdef bottom_threads +#undef xmlRMutexLock +extern __typeof (xmlRMutexLock) xmlRMutexLock __attribute((alias("xmlRMutexLock__internal_alias"))); +#else +#ifndef xmlRMutexLock +extern __typeof (xmlRMutexLock) xmlRMutexLock__internal_alias __attribute((visibility("hidden"))); +#define xmlRMutexLock xmlRMutexLock__internal_alias +#endif +#endif + +#ifdef bottom_threads +#undef xmlRMutexUnlock +extern __typeof (xmlRMutexUnlock) xmlRMutexUnlock __attribute((alias("xmlRMutexUnlock__internal_alias"))); +#else +#ifndef xmlRMutexUnlock +extern __typeof (xmlRMutexUnlock) xmlRMutexUnlock__internal_alias __attribute((visibility("hidden"))); +#define xmlRMutexUnlock xmlRMutexUnlock__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlReadDoc +extern __typeof (xmlReadDoc) xmlReadDoc __attribute((alias("xmlReadDoc__internal_alias"))); +#else +#ifndef xmlReadDoc +extern __typeof (xmlReadDoc) xmlReadDoc__internal_alias __attribute((visibility("hidden"))); +#define xmlReadDoc xmlReadDoc__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlReadFd +extern __typeof (xmlReadFd) xmlReadFd __attribute((alias("xmlReadFd__internal_alias"))); +#else +#ifndef xmlReadFd +extern __typeof (xmlReadFd) xmlReadFd__internal_alias __attribute((visibility("hidden"))); +#define xmlReadFd xmlReadFd__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlReadFile +extern __typeof (xmlReadFile) xmlReadFile __attribute((alias("xmlReadFile__internal_alias"))); +#else +#ifndef xmlReadFile +extern __typeof (xmlReadFile) xmlReadFile__internal_alias __attribute((visibility("hidden"))); +#define xmlReadFile xmlReadFile__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlReadIO +extern __typeof (xmlReadIO) xmlReadIO __attribute((alias("xmlReadIO__internal_alias"))); +#else +#ifndef xmlReadIO +extern __typeof (xmlReadIO) xmlReadIO__internal_alias __attribute((visibility("hidden"))); +#define xmlReadIO xmlReadIO__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlReadMemory +extern __typeof (xmlReadMemory) xmlReadMemory __attribute((alias("xmlReadMemory__internal_alias"))); +#else +#ifndef xmlReadMemory +extern __typeof (xmlReadMemory) xmlReadMemory__internal_alias __attribute((visibility("hidden"))); +#define xmlReadMemory xmlReadMemory__internal_alias +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlReaderForDoc +extern __typeof (xmlReaderForDoc) xmlReaderForDoc __attribute((alias("xmlReaderForDoc__internal_alias"))); +#else +#ifndef xmlReaderForDoc +extern __typeof (xmlReaderForDoc) xmlReaderForDoc__internal_alias __attribute((visibility("hidden"))); +#define xmlReaderForDoc xmlReaderForDoc__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlReaderForFd +extern __typeof (xmlReaderForFd) xmlReaderForFd __attribute((alias("xmlReaderForFd__internal_alias"))); +#else +#ifndef xmlReaderForFd +extern __typeof (xmlReaderForFd) xmlReaderForFd__internal_alias __attribute((visibility("hidden"))); +#define xmlReaderForFd xmlReaderForFd__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlReaderForFile +extern __typeof (xmlReaderForFile) xmlReaderForFile __attribute((alias("xmlReaderForFile__internal_alias"))); +#else +#ifndef xmlReaderForFile +extern __typeof (xmlReaderForFile) xmlReaderForFile__internal_alias __attribute((visibility("hidden"))); +#define xmlReaderForFile xmlReaderForFile__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlReaderForIO +extern __typeof (xmlReaderForIO) xmlReaderForIO __attribute((alias("xmlReaderForIO__internal_alias"))); +#else +#ifndef xmlReaderForIO +extern __typeof (xmlReaderForIO) xmlReaderForIO__internal_alias __attribute((visibility("hidden"))); +#define xmlReaderForIO xmlReaderForIO__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlReaderForMemory +extern __typeof (xmlReaderForMemory) xmlReaderForMemory __attribute((alias("xmlReaderForMemory__internal_alias"))); +#else +#ifndef xmlReaderForMemory +extern __typeof (xmlReaderForMemory) xmlReaderForMemory__internal_alias __attribute((visibility("hidden"))); +#define xmlReaderForMemory xmlReaderForMemory__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlReaderNewDoc +extern __typeof (xmlReaderNewDoc) xmlReaderNewDoc __attribute((alias("xmlReaderNewDoc__internal_alias"))); +#else +#ifndef xmlReaderNewDoc +extern __typeof (xmlReaderNewDoc) xmlReaderNewDoc__internal_alias __attribute((visibility("hidden"))); +#define xmlReaderNewDoc xmlReaderNewDoc__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlReaderNewFd +extern __typeof (xmlReaderNewFd) xmlReaderNewFd __attribute((alias("xmlReaderNewFd__internal_alias"))); +#else +#ifndef xmlReaderNewFd +extern __typeof (xmlReaderNewFd) xmlReaderNewFd__internal_alias __attribute((visibility("hidden"))); +#define xmlReaderNewFd xmlReaderNewFd__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlReaderNewFile +extern __typeof (xmlReaderNewFile) xmlReaderNewFile __attribute((alias("xmlReaderNewFile__internal_alias"))); +#else +#ifndef xmlReaderNewFile +extern __typeof (xmlReaderNewFile) xmlReaderNewFile__internal_alias __attribute((visibility("hidden"))); +#define xmlReaderNewFile xmlReaderNewFile__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlReaderNewIO +extern __typeof (xmlReaderNewIO) xmlReaderNewIO __attribute((alias("xmlReaderNewIO__internal_alias"))); +#else +#ifndef xmlReaderNewIO +extern __typeof (xmlReaderNewIO) xmlReaderNewIO__internal_alias __attribute((visibility("hidden"))); +#define xmlReaderNewIO xmlReaderNewIO__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlReaderNewMemory +extern __typeof (xmlReaderNewMemory) xmlReaderNewMemory __attribute((alias("xmlReaderNewMemory__internal_alias"))); +#else +#ifndef xmlReaderNewMemory +extern __typeof (xmlReaderNewMemory) xmlReaderNewMemory__internal_alias __attribute((visibility("hidden"))); +#define xmlReaderNewMemory xmlReaderNewMemory__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlReaderNewWalker +extern __typeof (xmlReaderNewWalker) xmlReaderNewWalker __attribute((alias("xmlReaderNewWalker__internal_alias"))); +#else +#ifndef xmlReaderNewWalker +extern __typeof (xmlReaderNewWalker) xmlReaderNewWalker__internal_alias __attribute((visibility("hidden"))); +#define xmlReaderNewWalker xmlReaderNewWalker__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlReaderWalker +extern __typeof (xmlReaderWalker) xmlReaderWalker __attribute((alias("xmlReaderWalker__internal_alias"))); +#else +#ifndef xmlReaderWalker +extern __typeof (xmlReaderWalker) xmlReaderWalker__internal_alias __attribute((visibility("hidden"))); +#define xmlReaderWalker xmlReaderWalker__internal_alias +#endif +#endif +#endif + +#ifdef bottom_xmlmemory +#undef xmlReallocLoc +extern __typeof (xmlReallocLoc) xmlReallocLoc __attribute((alias("xmlReallocLoc__internal_alias"))); +#else +#ifndef xmlReallocLoc +extern __typeof (xmlReallocLoc) xmlReallocLoc__internal_alias __attribute((visibility("hidden"))); +#define xmlReallocLoc xmlReallocLoc__internal_alias +#endif +#endif + +#if defined(LIBXML_TREE_ENABLED) +#ifdef bottom_tree +#undef xmlReconciliateNs +extern __typeof (xmlReconciliateNs) xmlReconciliateNs __attribute((alias("xmlReconciliateNs__internal_alias"))); +#else +#ifndef xmlReconciliateNs +extern __typeof (xmlReconciliateNs) xmlReconciliateNs__internal_alias __attribute((visibility("hidden"))); +#define xmlReconciliateNs xmlReconciliateNs__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SAX1_ENABLED) +#ifdef bottom_parser +#undef xmlRecoverDoc +extern __typeof (xmlRecoverDoc) xmlRecoverDoc __attribute((alias("xmlRecoverDoc__internal_alias"))); +#else +#ifndef xmlRecoverDoc +extern __typeof (xmlRecoverDoc) xmlRecoverDoc__internal_alias __attribute((visibility("hidden"))); +#define xmlRecoverDoc xmlRecoverDoc__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SAX1_ENABLED) +#ifdef bottom_parser +#undef xmlRecoverFile +extern __typeof (xmlRecoverFile) xmlRecoverFile __attribute((alias("xmlRecoverFile__internal_alias"))); +#else +#ifndef xmlRecoverFile +extern __typeof (xmlRecoverFile) xmlRecoverFile__internal_alias __attribute((visibility("hidden"))); +#define xmlRecoverFile xmlRecoverFile__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SAX1_ENABLED) +#ifdef bottom_parser +#undef xmlRecoverMemory +extern __typeof (xmlRecoverMemory) xmlRecoverMemory __attribute((alias("xmlRecoverMemory__internal_alias"))); +#else +#ifndef xmlRecoverMemory +extern __typeof (xmlRecoverMemory) xmlRecoverMemory__internal_alias __attribute((visibility("hidden"))); +#define xmlRecoverMemory xmlRecoverMemory__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlRegExecErrInfo +extern __typeof (xmlRegExecErrInfo) xmlRegExecErrInfo __attribute((alias("xmlRegExecErrInfo__internal_alias"))); +#else +#ifndef xmlRegExecErrInfo +extern __typeof (xmlRegExecErrInfo) xmlRegExecErrInfo__internal_alias __attribute((visibility("hidden"))); +#define xmlRegExecErrInfo xmlRegExecErrInfo__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlRegExecNextValues +extern __typeof (xmlRegExecNextValues) xmlRegExecNextValues __attribute((alias("xmlRegExecNextValues__internal_alias"))); +#else +#ifndef xmlRegExecNextValues +extern __typeof (xmlRegExecNextValues) xmlRegExecNextValues__internal_alias __attribute((visibility("hidden"))); +#define xmlRegExecNextValues xmlRegExecNextValues__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlRegExecPushString +extern __typeof (xmlRegExecPushString) xmlRegExecPushString __attribute((alias("xmlRegExecPushString__internal_alias"))); +#else +#ifndef xmlRegExecPushString +extern __typeof (xmlRegExecPushString) xmlRegExecPushString__internal_alias __attribute((visibility("hidden"))); +#define xmlRegExecPushString xmlRegExecPushString__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlRegExecPushString2 +extern __typeof (xmlRegExecPushString2) xmlRegExecPushString2 __attribute((alias("xmlRegExecPushString2__internal_alias"))); +#else +#ifndef xmlRegExecPushString2 +extern __typeof (xmlRegExecPushString2) xmlRegExecPushString2__internal_alias __attribute((visibility("hidden"))); +#define xmlRegExecPushString2 xmlRegExecPushString2__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlRegFreeExecCtxt +extern __typeof (xmlRegFreeExecCtxt) xmlRegFreeExecCtxt __attribute((alias("xmlRegFreeExecCtxt__internal_alias"))); +#else +#ifndef xmlRegFreeExecCtxt +extern __typeof (xmlRegFreeExecCtxt) xmlRegFreeExecCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlRegFreeExecCtxt xmlRegFreeExecCtxt__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlRegFreeRegexp +extern __typeof (xmlRegFreeRegexp) xmlRegFreeRegexp __attribute((alias("xmlRegFreeRegexp__internal_alias"))); +#else +#ifndef xmlRegFreeRegexp +extern __typeof (xmlRegFreeRegexp) xmlRegFreeRegexp__internal_alias __attribute((visibility("hidden"))); +#define xmlRegFreeRegexp xmlRegFreeRegexp__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlRegNewExecCtxt +extern __typeof (xmlRegNewExecCtxt) xmlRegNewExecCtxt __attribute((alias("xmlRegNewExecCtxt__internal_alias"))); +#else +#ifndef xmlRegNewExecCtxt +extern __typeof (xmlRegNewExecCtxt) xmlRegNewExecCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlRegNewExecCtxt xmlRegNewExecCtxt__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlRegexpCompile +extern __typeof (xmlRegexpCompile) xmlRegexpCompile __attribute((alias("xmlRegexpCompile__internal_alias"))); +#else +#ifndef xmlRegexpCompile +extern __typeof (xmlRegexpCompile) xmlRegexpCompile__internal_alias __attribute((visibility("hidden"))); +#define xmlRegexpCompile xmlRegexpCompile__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlRegexpExec +extern __typeof (xmlRegexpExec) xmlRegexpExec __attribute((alias("xmlRegexpExec__internal_alias"))); +#else +#ifndef xmlRegexpExec +extern __typeof (xmlRegexpExec) xmlRegexpExec__internal_alias __attribute((visibility("hidden"))); +#define xmlRegexpExec xmlRegexpExec__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlRegexpIsDeterminist +extern __typeof (xmlRegexpIsDeterminist) xmlRegexpIsDeterminist __attribute((alias("xmlRegexpIsDeterminist__internal_alias"))); +#else +#ifndef xmlRegexpIsDeterminist +extern __typeof (xmlRegexpIsDeterminist) xmlRegexpIsDeterminist__internal_alias __attribute((visibility("hidden"))); +#define xmlRegexpIsDeterminist xmlRegexpIsDeterminist__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_REGEXP_ENABLED) +#ifdef bottom_xmlregexp +#undef xmlRegexpPrint +extern __typeof (xmlRegexpPrint) xmlRegexpPrint __attribute((alias("xmlRegexpPrint__internal_alias"))); +#else +#ifndef xmlRegexpPrint +extern __typeof (xmlRegexpPrint) xmlRegexpPrint__internal_alias __attribute((visibility("hidden"))); +#define xmlRegexpPrint xmlRegexpPrint__internal_alias +#endif +#endif +#endif + +#ifdef bottom_encoding +#undef xmlRegisterCharEncodingHandler +extern __typeof (xmlRegisterCharEncodingHandler) xmlRegisterCharEncodingHandler __attribute((alias("xmlRegisterCharEncodingHandler__internal_alias"))); +#else +#ifndef xmlRegisterCharEncodingHandler +extern __typeof (xmlRegisterCharEncodingHandler) xmlRegisterCharEncodingHandler__internal_alias __attribute((visibility("hidden"))); +#define xmlRegisterCharEncodingHandler xmlRegisterCharEncodingHandler__internal_alias +#endif +#endif + +#ifdef bottom_xmlIO +#undef xmlRegisterDefaultInputCallbacks +extern __typeof (xmlRegisterDefaultInputCallbacks) xmlRegisterDefaultInputCallbacks __attribute((alias("xmlRegisterDefaultInputCallbacks__internal_alias"))); +#else +#ifndef xmlRegisterDefaultInputCallbacks +extern __typeof (xmlRegisterDefaultInputCallbacks) xmlRegisterDefaultInputCallbacks__internal_alias __attribute((visibility("hidden"))); +#define xmlRegisterDefaultInputCallbacks xmlRegisterDefaultInputCallbacks__internal_alias +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlIO +#undef xmlRegisterDefaultOutputCallbacks +extern __typeof (xmlRegisterDefaultOutputCallbacks) xmlRegisterDefaultOutputCallbacks __attribute((alias("xmlRegisterDefaultOutputCallbacks__internal_alias"))); +#else +#ifndef xmlRegisterDefaultOutputCallbacks +extern __typeof (xmlRegisterDefaultOutputCallbacks) xmlRegisterDefaultOutputCallbacks__internal_alias __attribute((visibility("hidden"))); +#define xmlRegisterDefaultOutputCallbacks xmlRegisterDefaultOutputCallbacks__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) && defined(LIBXML_HTTP_ENABLED) +#ifdef bottom_xmlIO +#undef xmlRegisterHTTPPostCallbacks +extern __typeof (xmlRegisterHTTPPostCallbacks) xmlRegisterHTTPPostCallbacks __attribute((alias("xmlRegisterHTTPPostCallbacks__internal_alias"))); +#else +#ifndef xmlRegisterHTTPPostCallbacks +extern __typeof (xmlRegisterHTTPPostCallbacks) xmlRegisterHTTPPostCallbacks__internal_alias __attribute((visibility("hidden"))); +#define xmlRegisterHTTPPostCallbacks xmlRegisterHTTPPostCallbacks__internal_alias +#endif +#endif +#endif + +#ifdef bottom_xmlIO +#undef xmlRegisterInputCallbacks +extern __typeof (xmlRegisterInputCallbacks) xmlRegisterInputCallbacks __attribute((alias("xmlRegisterInputCallbacks__internal_alias"))); +#else +#ifndef xmlRegisterInputCallbacks +extern __typeof (xmlRegisterInputCallbacks) xmlRegisterInputCallbacks__internal_alias __attribute((visibility("hidden"))); +#define xmlRegisterInputCallbacks xmlRegisterInputCallbacks__internal_alias +#endif +#endif + +#ifdef bottom_globals +#undef xmlRegisterNodeDefault +extern __typeof (xmlRegisterNodeDefault) xmlRegisterNodeDefault __attribute((alias("xmlRegisterNodeDefault__internal_alias"))); +#else +#ifndef xmlRegisterNodeDefault +extern __typeof (xmlRegisterNodeDefault) xmlRegisterNodeDefault__internal_alias __attribute((visibility("hidden"))); +#define xmlRegisterNodeDefault xmlRegisterNodeDefault__internal_alias +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlIO +#undef xmlRegisterOutputCallbacks +extern __typeof (xmlRegisterOutputCallbacks) xmlRegisterOutputCallbacks __attribute((alias("xmlRegisterOutputCallbacks__internal_alias"))); +#else +#ifndef xmlRegisterOutputCallbacks +extern __typeof (xmlRegisterOutputCallbacks) xmlRegisterOutputCallbacks__internal_alias __attribute((visibility("hidden"))); +#define xmlRegisterOutputCallbacks xmlRegisterOutputCallbacks__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_relaxng +#undef xmlRelaxNGCleanupTypes +extern __typeof (xmlRelaxNGCleanupTypes) xmlRelaxNGCleanupTypes __attribute((alias("xmlRelaxNGCleanupTypes__internal_alias"))); +#else +#ifndef xmlRelaxNGCleanupTypes +extern __typeof (xmlRelaxNGCleanupTypes) xmlRelaxNGCleanupTypes__internal_alias __attribute((visibility("hidden"))); +#define xmlRelaxNGCleanupTypes xmlRelaxNGCleanupTypes__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_relaxng +#undef xmlRelaxNGDump +extern __typeof (xmlRelaxNGDump) xmlRelaxNGDump __attribute((alias("xmlRelaxNGDump__internal_alias"))); +#else +#ifndef xmlRelaxNGDump +extern __typeof (xmlRelaxNGDump) xmlRelaxNGDump__internal_alias __attribute((visibility("hidden"))); +#define xmlRelaxNGDump xmlRelaxNGDump__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_relaxng +#undef xmlRelaxNGDumpTree +extern __typeof (xmlRelaxNGDumpTree) xmlRelaxNGDumpTree __attribute((alias("xmlRelaxNGDumpTree__internal_alias"))); +#else +#ifndef xmlRelaxNGDumpTree +extern __typeof (xmlRelaxNGDumpTree) xmlRelaxNGDumpTree__internal_alias __attribute((visibility("hidden"))); +#define xmlRelaxNGDumpTree xmlRelaxNGDumpTree__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_relaxng +#undef xmlRelaxNGFree +extern __typeof (xmlRelaxNGFree) xmlRelaxNGFree __attribute((alias("xmlRelaxNGFree__internal_alias"))); +#else +#ifndef xmlRelaxNGFree +extern __typeof (xmlRelaxNGFree) xmlRelaxNGFree__internal_alias __attribute((visibility("hidden"))); +#define xmlRelaxNGFree xmlRelaxNGFree__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_relaxng +#undef xmlRelaxNGFreeParserCtxt +extern __typeof (xmlRelaxNGFreeParserCtxt) xmlRelaxNGFreeParserCtxt __attribute((alias("xmlRelaxNGFreeParserCtxt__internal_alias"))); +#else +#ifndef xmlRelaxNGFreeParserCtxt +extern __typeof (xmlRelaxNGFreeParserCtxt) xmlRelaxNGFreeParserCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlRelaxNGFreeParserCtxt xmlRelaxNGFreeParserCtxt__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_relaxng +#undef xmlRelaxNGFreeValidCtxt +extern __typeof (xmlRelaxNGFreeValidCtxt) xmlRelaxNGFreeValidCtxt __attribute((alias("xmlRelaxNGFreeValidCtxt__internal_alias"))); +#else +#ifndef xmlRelaxNGFreeValidCtxt +extern __typeof (xmlRelaxNGFreeValidCtxt) xmlRelaxNGFreeValidCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlRelaxNGFreeValidCtxt xmlRelaxNGFreeValidCtxt__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_relaxng +#undef xmlRelaxNGGetParserErrors +extern __typeof (xmlRelaxNGGetParserErrors) xmlRelaxNGGetParserErrors __attribute((alias("xmlRelaxNGGetParserErrors__internal_alias"))); +#else +#ifndef xmlRelaxNGGetParserErrors +extern __typeof (xmlRelaxNGGetParserErrors) xmlRelaxNGGetParserErrors__internal_alias __attribute((visibility("hidden"))); +#define xmlRelaxNGGetParserErrors xmlRelaxNGGetParserErrors__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_relaxng +#undef xmlRelaxNGGetValidErrors +extern __typeof (xmlRelaxNGGetValidErrors) xmlRelaxNGGetValidErrors __attribute((alias("xmlRelaxNGGetValidErrors__internal_alias"))); +#else +#ifndef xmlRelaxNGGetValidErrors +extern __typeof (xmlRelaxNGGetValidErrors) xmlRelaxNGGetValidErrors__internal_alias __attribute((visibility("hidden"))); +#define xmlRelaxNGGetValidErrors xmlRelaxNGGetValidErrors__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_relaxng +#undef xmlRelaxNGInitTypes +extern __typeof (xmlRelaxNGInitTypes) xmlRelaxNGInitTypes __attribute((alias("xmlRelaxNGInitTypes__internal_alias"))); +#else +#ifndef xmlRelaxNGInitTypes +extern __typeof (xmlRelaxNGInitTypes) xmlRelaxNGInitTypes__internal_alias __attribute((visibility("hidden"))); +#define xmlRelaxNGInitTypes xmlRelaxNGInitTypes__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_relaxng +#undef xmlRelaxNGNewDocParserCtxt +extern __typeof (xmlRelaxNGNewDocParserCtxt) xmlRelaxNGNewDocParserCtxt __attribute((alias("xmlRelaxNGNewDocParserCtxt__internal_alias"))); +#else +#ifndef xmlRelaxNGNewDocParserCtxt +extern __typeof (xmlRelaxNGNewDocParserCtxt) xmlRelaxNGNewDocParserCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlRelaxNGNewDocParserCtxt xmlRelaxNGNewDocParserCtxt__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_relaxng +#undef xmlRelaxNGNewMemParserCtxt +extern __typeof (xmlRelaxNGNewMemParserCtxt) xmlRelaxNGNewMemParserCtxt __attribute((alias("xmlRelaxNGNewMemParserCtxt__internal_alias"))); +#else +#ifndef xmlRelaxNGNewMemParserCtxt +extern __typeof (xmlRelaxNGNewMemParserCtxt) xmlRelaxNGNewMemParserCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlRelaxNGNewMemParserCtxt xmlRelaxNGNewMemParserCtxt__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_relaxng +#undef xmlRelaxNGNewParserCtxt +extern __typeof (xmlRelaxNGNewParserCtxt) xmlRelaxNGNewParserCtxt __attribute((alias("xmlRelaxNGNewParserCtxt__internal_alias"))); +#else +#ifndef xmlRelaxNGNewParserCtxt +extern __typeof (xmlRelaxNGNewParserCtxt) xmlRelaxNGNewParserCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlRelaxNGNewParserCtxt xmlRelaxNGNewParserCtxt__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_relaxng +#undef xmlRelaxNGNewValidCtxt +extern __typeof (xmlRelaxNGNewValidCtxt) xmlRelaxNGNewValidCtxt __attribute((alias("xmlRelaxNGNewValidCtxt__internal_alias"))); +#else +#ifndef xmlRelaxNGNewValidCtxt +extern __typeof (xmlRelaxNGNewValidCtxt) xmlRelaxNGNewValidCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlRelaxNGNewValidCtxt xmlRelaxNGNewValidCtxt__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_relaxng +#undef xmlRelaxNGParse +extern __typeof (xmlRelaxNGParse) xmlRelaxNGParse __attribute((alias("xmlRelaxNGParse__internal_alias"))); +#else +#ifndef xmlRelaxNGParse +extern __typeof (xmlRelaxNGParse) xmlRelaxNGParse__internal_alias __attribute((visibility("hidden"))); +#define xmlRelaxNGParse xmlRelaxNGParse__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_relaxng +#undef xmlRelaxNGSetParserErrors +extern __typeof (xmlRelaxNGSetParserErrors) xmlRelaxNGSetParserErrors __attribute((alias("xmlRelaxNGSetParserErrors__internal_alias"))); +#else +#ifndef xmlRelaxNGSetParserErrors +extern __typeof (xmlRelaxNGSetParserErrors) xmlRelaxNGSetParserErrors__internal_alias __attribute((visibility("hidden"))); +#define xmlRelaxNGSetParserErrors xmlRelaxNGSetParserErrors__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_relaxng +#undef xmlRelaxNGSetParserStructuredErrors +extern __typeof (xmlRelaxNGSetParserStructuredErrors) xmlRelaxNGSetParserStructuredErrors __attribute((alias("xmlRelaxNGSetParserStructuredErrors__internal_alias"))); +#else +#ifndef xmlRelaxNGSetParserStructuredErrors +extern __typeof (xmlRelaxNGSetParserStructuredErrors) xmlRelaxNGSetParserStructuredErrors__internal_alias __attribute((visibility("hidden"))); +#define xmlRelaxNGSetParserStructuredErrors xmlRelaxNGSetParserStructuredErrors__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_relaxng +#undef xmlRelaxNGSetValidErrors +extern __typeof (xmlRelaxNGSetValidErrors) xmlRelaxNGSetValidErrors __attribute((alias("xmlRelaxNGSetValidErrors__internal_alias"))); +#else +#ifndef xmlRelaxNGSetValidErrors +extern __typeof (xmlRelaxNGSetValidErrors) xmlRelaxNGSetValidErrors__internal_alias __attribute((visibility("hidden"))); +#define xmlRelaxNGSetValidErrors xmlRelaxNGSetValidErrors__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_relaxng +#undef xmlRelaxNGSetValidStructuredErrors +extern __typeof (xmlRelaxNGSetValidStructuredErrors) xmlRelaxNGSetValidStructuredErrors __attribute((alias("xmlRelaxNGSetValidStructuredErrors__internal_alias"))); +#else +#ifndef xmlRelaxNGSetValidStructuredErrors +extern __typeof (xmlRelaxNGSetValidStructuredErrors) xmlRelaxNGSetValidStructuredErrors__internal_alias __attribute((visibility("hidden"))); +#define xmlRelaxNGSetValidStructuredErrors xmlRelaxNGSetValidStructuredErrors__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_relaxng +#undef xmlRelaxNGValidateDoc +extern __typeof (xmlRelaxNGValidateDoc) xmlRelaxNGValidateDoc __attribute((alias("xmlRelaxNGValidateDoc__internal_alias"))); +#else +#ifndef xmlRelaxNGValidateDoc +extern __typeof (xmlRelaxNGValidateDoc) xmlRelaxNGValidateDoc__internal_alias __attribute((visibility("hidden"))); +#define xmlRelaxNGValidateDoc xmlRelaxNGValidateDoc__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_relaxng +#undef xmlRelaxNGValidateFullElement +extern __typeof (xmlRelaxNGValidateFullElement) xmlRelaxNGValidateFullElement __attribute((alias("xmlRelaxNGValidateFullElement__internal_alias"))); +#else +#ifndef xmlRelaxNGValidateFullElement +extern __typeof (xmlRelaxNGValidateFullElement) xmlRelaxNGValidateFullElement__internal_alias __attribute((visibility("hidden"))); +#define xmlRelaxNGValidateFullElement xmlRelaxNGValidateFullElement__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_relaxng +#undef xmlRelaxNGValidatePopElement +extern __typeof (xmlRelaxNGValidatePopElement) xmlRelaxNGValidatePopElement __attribute((alias("xmlRelaxNGValidatePopElement__internal_alias"))); +#else +#ifndef xmlRelaxNGValidatePopElement +extern __typeof (xmlRelaxNGValidatePopElement) xmlRelaxNGValidatePopElement__internal_alias __attribute((visibility("hidden"))); +#define xmlRelaxNGValidatePopElement xmlRelaxNGValidatePopElement__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_relaxng +#undef xmlRelaxNGValidatePushCData +extern __typeof (xmlRelaxNGValidatePushCData) xmlRelaxNGValidatePushCData __attribute((alias("xmlRelaxNGValidatePushCData__internal_alias"))); +#else +#ifndef xmlRelaxNGValidatePushCData +extern __typeof (xmlRelaxNGValidatePushCData) xmlRelaxNGValidatePushCData__internal_alias __attribute((visibility("hidden"))); +#define xmlRelaxNGValidatePushCData xmlRelaxNGValidatePushCData__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_relaxng +#undef xmlRelaxNGValidatePushElement +extern __typeof (xmlRelaxNGValidatePushElement) xmlRelaxNGValidatePushElement __attribute((alias("xmlRelaxNGValidatePushElement__internal_alias"))); +#else +#ifndef xmlRelaxNGValidatePushElement +extern __typeof (xmlRelaxNGValidatePushElement) xmlRelaxNGValidatePushElement__internal_alias __attribute((visibility("hidden"))); +#define xmlRelaxNGValidatePushElement xmlRelaxNGValidatePushElement__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_relaxng +#undef xmlRelaxParserSetFlag +extern __typeof (xmlRelaxParserSetFlag) xmlRelaxParserSetFlag __attribute((alias("xmlRelaxParserSetFlag__internal_alias"))); +#else +#ifndef xmlRelaxParserSetFlag +extern __typeof (xmlRelaxParserSetFlag) xmlRelaxParserSetFlag__internal_alias __attribute((visibility("hidden"))); +#define xmlRelaxParserSetFlag xmlRelaxParserSetFlag__internal_alias +#endif +#endif +#endif + +#ifdef bottom_valid +#undef xmlRemoveID +extern __typeof (xmlRemoveID) xmlRemoveID __attribute((alias("xmlRemoveID__internal_alias"))); +#else +#ifndef xmlRemoveID +extern __typeof (xmlRemoveID) xmlRemoveID__internal_alias __attribute((visibility("hidden"))); +#define xmlRemoveID xmlRemoveID__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlRemoveProp +extern __typeof (xmlRemoveProp) xmlRemoveProp __attribute((alias("xmlRemoveProp__internal_alias"))); +#else +#ifndef xmlRemoveProp +extern __typeof (xmlRemoveProp) xmlRemoveProp__internal_alias __attribute((visibility("hidden"))); +#define xmlRemoveProp xmlRemoveProp__internal_alias +#endif +#endif + +#ifdef bottom_valid +#undef xmlRemoveRef +extern __typeof (xmlRemoveRef) xmlRemoveRef __attribute((alias("xmlRemoveRef__internal_alias"))); +#else +#ifndef xmlRemoveRef +extern __typeof (xmlRemoveRef) xmlRemoveRef__internal_alias __attribute((visibility("hidden"))); +#define xmlRemoveRef xmlRemoveRef__internal_alias +#endif +#endif + +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_tree +#undef xmlReplaceNode +extern __typeof (xmlReplaceNode) xmlReplaceNode __attribute((alias("xmlReplaceNode__internal_alias"))); +#else +#ifndef xmlReplaceNode +extern __typeof (xmlReplaceNode) xmlReplaceNode__internal_alias __attribute((visibility("hidden"))); +#define xmlReplaceNode xmlReplaceNode__internal_alias +#endif +#endif +#endif + +#ifdef bottom_error +#undef xmlResetError +extern __typeof (xmlResetError) xmlResetError __attribute((alias("xmlResetError__internal_alias"))); +#else +#ifndef xmlResetError +extern __typeof (xmlResetError) xmlResetError__internal_alias __attribute((visibility("hidden"))); +#define xmlResetError xmlResetError__internal_alias +#endif +#endif + +#ifdef bottom_error +#undef xmlResetLastError +extern __typeof (xmlResetLastError) xmlResetLastError __attribute((alias("xmlResetLastError__internal_alias"))); +#else +#ifndef xmlResetLastError +extern __typeof (xmlResetLastError) xmlResetLastError__internal_alias __attribute((visibility("hidden"))); +#define xmlResetLastError xmlResetLastError__internal_alias +#endif +#endif + +#ifdef bottom_SAX2 +#undef xmlSAX2AttributeDecl +extern __typeof (xmlSAX2AttributeDecl) xmlSAX2AttributeDecl __attribute((alias("xmlSAX2AttributeDecl__internal_alias"))); +#else +#ifndef xmlSAX2AttributeDecl +extern __typeof (xmlSAX2AttributeDecl) xmlSAX2AttributeDecl__internal_alias __attribute((visibility("hidden"))); +#define xmlSAX2AttributeDecl xmlSAX2AttributeDecl__internal_alias +#endif +#endif + +#ifdef bottom_SAX2 +#undef xmlSAX2CDataBlock +extern __typeof (xmlSAX2CDataBlock) xmlSAX2CDataBlock __attribute((alias("xmlSAX2CDataBlock__internal_alias"))); +#else +#ifndef xmlSAX2CDataBlock +extern __typeof (xmlSAX2CDataBlock) xmlSAX2CDataBlock__internal_alias __attribute((visibility("hidden"))); +#define xmlSAX2CDataBlock xmlSAX2CDataBlock__internal_alias +#endif +#endif + +#ifdef bottom_SAX2 +#undef xmlSAX2Characters +extern __typeof (xmlSAX2Characters) xmlSAX2Characters __attribute((alias("xmlSAX2Characters__internal_alias"))); +#else +#ifndef xmlSAX2Characters +extern __typeof (xmlSAX2Characters) xmlSAX2Characters__internal_alias __attribute((visibility("hidden"))); +#define xmlSAX2Characters xmlSAX2Characters__internal_alias +#endif +#endif + +#ifdef bottom_SAX2 +#undef xmlSAX2Comment +extern __typeof (xmlSAX2Comment) xmlSAX2Comment __attribute((alias("xmlSAX2Comment__internal_alias"))); +#else +#ifndef xmlSAX2Comment +extern __typeof (xmlSAX2Comment) xmlSAX2Comment__internal_alias __attribute((visibility("hidden"))); +#define xmlSAX2Comment xmlSAX2Comment__internal_alias +#endif +#endif + +#ifdef bottom_SAX2 +#undef xmlSAX2ElementDecl +extern __typeof (xmlSAX2ElementDecl) xmlSAX2ElementDecl __attribute((alias("xmlSAX2ElementDecl__internal_alias"))); +#else +#ifndef xmlSAX2ElementDecl +extern __typeof (xmlSAX2ElementDecl) xmlSAX2ElementDecl__internal_alias __attribute((visibility("hidden"))); +#define xmlSAX2ElementDecl xmlSAX2ElementDecl__internal_alias +#endif +#endif + +#ifdef bottom_SAX2 +#undef xmlSAX2EndDocument +extern __typeof (xmlSAX2EndDocument) xmlSAX2EndDocument __attribute((alias("xmlSAX2EndDocument__internal_alias"))); +#else +#ifndef xmlSAX2EndDocument +extern __typeof (xmlSAX2EndDocument) xmlSAX2EndDocument__internal_alias __attribute((visibility("hidden"))); +#define xmlSAX2EndDocument xmlSAX2EndDocument__internal_alias +#endif +#endif + +#if defined(LIBXML_SAX1_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBXML_WRITER_ENABLED) || defined(LIBXML_DOCB_ENABLED) +#ifdef bottom_SAX2 +#undef xmlSAX2EndElement +extern __typeof (xmlSAX2EndElement) xmlSAX2EndElement __attribute((alias("xmlSAX2EndElement__internal_alias"))); +#else +#ifndef xmlSAX2EndElement +extern __typeof (xmlSAX2EndElement) xmlSAX2EndElement__internal_alias __attribute((visibility("hidden"))); +#define xmlSAX2EndElement xmlSAX2EndElement__internal_alias +#endif +#endif +#endif + +#ifdef bottom_SAX2 +#undef xmlSAX2EndElementNs +extern __typeof (xmlSAX2EndElementNs) xmlSAX2EndElementNs __attribute((alias("xmlSAX2EndElementNs__internal_alias"))); +#else +#ifndef xmlSAX2EndElementNs +extern __typeof (xmlSAX2EndElementNs) xmlSAX2EndElementNs__internal_alias __attribute((visibility("hidden"))); +#define xmlSAX2EndElementNs xmlSAX2EndElementNs__internal_alias +#endif +#endif + +#ifdef bottom_SAX2 +#undef xmlSAX2EntityDecl +extern __typeof (xmlSAX2EntityDecl) xmlSAX2EntityDecl __attribute((alias("xmlSAX2EntityDecl__internal_alias"))); +#else +#ifndef xmlSAX2EntityDecl +extern __typeof (xmlSAX2EntityDecl) xmlSAX2EntityDecl__internal_alias __attribute((visibility("hidden"))); +#define xmlSAX2EntityDecl xmlSAX2EntityDecl__internal_alias +#endif +#endif + +#ifdef bottom_SAX2 +#undef xmlSAX2ExternalSubset +extern __typeof (xmlSAX2ExternalSubset) xmlSAX2ExternalSubset __attribute((alias("xmlSAX2ExternalSubset__internal_alias"))); +#else +#ifndef xmlSAX2ExternalSubset +extern __typeof (xmlSAX2ExternalSubset) xmlSAX2ExternalSubset__internal_alias __attribute((visibility("hidden"))); +#define xmlSAX2ExternalSubset xmlSAX2ExternalSubset__internal_alias +#endif +#endif + +#ifdef bottom_SAX2 +#undef xmlSAX2GetColumnNumber +extern __typeof (xmlSAX2GetColumnNumber) xmlSAX2GetColumnNumber __attribute((alias("xmlSAX2GetColumnNumber__internal_alias"))); +#else +#ifndef xmlSAX2GetColumnNumber +extern __typeof (xmlSAX2GetColumnNumber) xmlSAX2GetColumnNumber__internal_alias __attribute((visibility("hidden"))); +#define xmlSAX2GetColumnNumber xmlSAX2GetColumnNumber__internal_alias +#endif +#endif + +#ifdef bottom_SAX2 +#undef xmlSAX2GetEntity +extern __typeof (xmlSAX2GetEntity) xmlSAX2GetEntity __attribute((alias("xmlSAX2GetEntity__internal_alias"))); +#else +#ifndef xmlSAX2GetEntity +extern __typeof (xmlSAX2GetEntity) xmlSAX2GetEntity__internal_alias __attribute((visibility("hidden"))); +#define xmlSAX2GetEntity xmlSAX2GetEntity__internal_alias +#endif +#endif + +#ifdef bottom_SAX2 +#undef xmlSAX2GetLineNumber +extern __typeof (xmlSAX2GetLineNumber) xmlSAX2GetLineNumber __attribute((alias("xmlSAX2GetLineNumber__internal_alias"))); +#else +#ifndef xmlSAX2GetLineNumber +extern __typeof (xmlSAX2GetLineNumber) xmlSAX2GetLineNumber__internal_alias __attribute((visibility("hidden"))); +#define xmlSAX2GetLineNumber xmlSAX2GetLineNumber__internal_alias +#endif +#endif + +#ifdef bottom_SAX2 +#undef xmlSAX2GetParameterEntity +extern __typeof (xmlSAX2GetParameterEntity) xmlSAX2GetParameterEntity __attribute((alias("xmlSAX2GetParameterEntity__internal_alias"))); +#else +#ifndef xmlSAX2GetParameterEntity +extern __typeof (xmlSAX2GetParameterEntity) xmlSAX2GetParameterEntity__internal_alias __attribute((visibility("hidden"))); +#define xmlSAX2GetParameterEntity xmlSAX2GetParameterEntity__internal_alias +#endif +#endif + +#ifdef bottom_SAX2 +#undef xmlSAX2GetPublicId +extern __typeof (xmlSAX2GetPublicId) xmlSAX2GetPublicId __attribute((alias("xmlSAX2GetPublicId__internal_alias"))); +#else +#ifndef xmlSAX2GetPublicId +extern __typeof (xmlSAX2GetPublicId) xmlSAX2GetPublicId__internal_alias __attribute((visibility("hidden"))); +#define xmlSAX2GetPublicId xmlSAX2GetPublicId__internal_alias +#endif +#endif + +#ifdef bottom_SAX2 +#undef xmlSAX2GetSystemId +extern __typeof (xmlSAX2GetSystemId) xmlSAX2GetSystemId __attribute((alias("xmlSAX2GetSystemId__internal_alias"))); +#else +#ifndef xmlSAX2GetSystemId +extern __typeof (xmlSAX2GetSystemId) xmlSAX2GetSystemId__internal_alias __attribute((visibility("hidden"))); +#define xmlSAX2GetSystemId xmlSAX2GetSystemId__internal_alias +#endif +#endif + +#ifdef bottom_SAX2 +#undef xmlSAX2HasExternalSubset +extern __typeof (xmlSAX2HasExternalSubset) xmlSAX2HasExternalSubset __attribute((alias("xmlSAX2HasExternalSubset__internal_alias"))); +#else +#ifndef xmlSAX2HasExternalSubset +extern __typeof (xmlSAX2HasExternalSubset) xmlSAX2HasExternalSubset__internal_alias __attribute((visibility("hidden"))); +#define xmlSAX2HasExternalSubset xmlSAX2HasExternalSubset__internal_alias +#endif +#endif + +#ifdef bottom_SAX2 +#undef xmlSAX2HasInternalSubset +extern __typeof (xmlSAX2HasInternalSubset) xmlSAX2HasInternalSubset __attribute((alias("xmlSAX2HasInternalSubset__internal_alias"))); +#else +#ifndef xmlSAX2HasInternalSubset +extern __typeof (xmlSAX2HasInternalSubset) xmlSAX2HasInternalSubset__internal_alias __attribute((visibility("hidden"))); +#define xmlSAX2HasInternalSubset xmlSAX2HasInternalSubset__internal_alias +#endif +#endif + +#ifdef bottom_SAX2 +#undef xmlSAX2IgnorableWhitespace +extern __typeof (xmlSAX2IgnorableWhitespace) xmlSAX2IgnorableWhitespace __attribute((alias("xmlSAX2IgnorableWhitespace__internal_alias"))); +#else +#ifndef xmlSAX2IgnorableWhitespace +extern __typeof (xmlSAX2IgnorableWhitespace) xmlSAX2IgnorableWhitespace__internal_alias __attribute((visibility("hidden"))); +#define xmlSAX2IgnorableWhitespace xmlSAX2IgnorableWhitespace__internal_alias +#endif +#endif + +#ifdef bottom_SAX2 +#undef xmlSAX2InitDefaultSAXHandler +extern __typeof (xmlSAX2InitDefaultSAXHandler) xmlSAX2InitDefaultSAXHandler __attribute((alias("xmlSAX2InitDefaultSAXHandler__internal_alias"))); +#else +#ifndef xmlSAX2InitDefaultSAXHandler +extern __typeof (xmlSAX2InitDefaultSAXHandler) xmlSAX2InitDefaultSAXHandler__internal_alias __attribute((visibility("hidden"))); +#define xmlSAX2InitDefaultSAXHandler xmlSAX2InitDefaultSAXHandler__internal_alias +#endif +#endif + +#if defined(LIBXML_DOCB_ENABLED) +#ifdef bottom_SAX2 +#undef xmlSAX2InitDocbDefaultSAXHandler +extern __typeof (xmlSAX2InitDocbDefaultSAXHandler) xmlSAX2InitDocbDefaultSAXHandler __attribute((alias("xmlSAX2InitDocbDefaultSAXHandler__internal_alias"))); +#else +#ifndef xmlSAX2InitDocbDefaultSAXHandler +extern __typeof (xmlSAX2InitDocbDefaultSAXHandler) xmlSAX2InitDocbDefaultSAXHandler__internal_alias __attribute((visibility("hidden"))); +#define xmlSAX2InitDocbDefaultSAXHandler xmlSAX2InitDocbDefaultSAXHandler__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_HTML_ENABLED) +#ifdef bottom_SAX2 +#undef xmlSAX2InitHtmlDefaultSAXHandler +extern __typeof (xmlSAX2InitHtmlDefaultSAXHandler) xmlSAX2InitHtmlDefaultSAXHandler __attribute((alias("xmlSAX2InitHtmlDefaultSAXHandler__internal_alias"))); +#else +#ifndef xmlSAX2InitHtmlDefaultSAXHandler +extern __typeof (xmlSAX2InitHtmlDefaultSAXHandler) xmlSAX2InitHtmlDefaultSAXHandler__internal_alias __attribute((visibility("hidden"))); +#define xmlSAX2InitHtmlDefaultSAXHandler xmlSAX2InitHtmlDefaultSAXHandler__internal_alias +#endif +#endif +#endif + +#ifdef bottom_SAX2 +#undef xmlSAX2InternalSubset +extern __typeof (xmlSAX2InternalSubset) xmlSAX2InternalSubset __attribute((alias("xmlSAX2InternalSubset__internal_alias"))); +#else +#ifndef xmlSAX2InternalSubset +extern __typeof (xmlSAX2InternalSubset) xmlSAX2InternalSubset__internal_alias __attribute((visibility("hidden"))); +#define xmlSAX2InternalSubset xmlSAX2InternalSubset__internal_alias +#endif +#endif + +#ifdef bottom_SAX2 +#undef xmlSAX2IsStandalone +extern __typeof (xmlSAX2IsStandalone) xmlSAX2IsStandalone __attribute((alias("xmlSAX2IsStandalone__internal_alias"))); +#else +#ifndef xmlSAX2IsStandalone +extern __typeof (xmlSAX2IsStandalone) xmlSAX2IsStandalone__internal_alias __attribute((visibility("hidden"))); +#define xmlSAX2IsStandalone xmlSAX2IsStandalone__internal_alias +#endif +#endif + +#ifdef bottom_SAX2 +#undef xmlSAX2NotationDecl +extern __typeof (xmlSAX2NotationDecl) xmlSAX2NotationDecl __attribute((alias("xmlSAX2NotationDecl__internal_alias"))); +#else +#ifndef xmlSAX2NotationDecl +extern __typeof (xmlSAX2NotationDecl) xmlSAX2NotationDecl__internal_alias __attribute((visibility("hidden"))); +#define xmlSAX2NotationDecl xmlSAX2NotationDecl__internal_alias +#endif +#endif + +#ifdef bottom_SAX2 +#undef xmlSAX2ProcessingInstruction +extern __typeof (xmlSAX2ProcessingInstruction) xmlSAX2ProcessingInstruction __attribute((alias("xmlSAX2ProcessingInstruction__internal_alias"))); +#else +#ifndef xmlSAX2ProcessingInstruction +extern __typeof (xmlSAX2ProcessingInstruction) xmlSAX2ProcessingInstruction__internal_alias __attribute((visibility("hidden"))); +#define xmlSAX2ProcessingInstruction xmlSAX2ProcessingInstruction__internal_alias +#endif +#endif + +#ifdef bottom_SAX2 +#undef xmlSAX2Reference +extern __typeof (xmlSAX2Reference) xmlSAX2Reference __attribute((alias("xmlSAX2Reference__internal_alias"))); +#else +#ifndef xmlSAX2Reference +extern __typeof (xmlSAX2Reference) xmlSAX2Reference__internal_alias __attribute((visibility("hidden"))); +#define xmlSAX2Reference xmlSAX2Reference__internal_alias +#endif +#endif + +#ifdef bottom_SAX2 +#undef xmlSAX2ResolveEntity +extern __typeof (xmlSAX2ResolveEntity) xmlSAX2ResolveEntity __attribute((alias("xmlSAX2ResolveEntity__internal_alias"))); +#else +#ifndef xmlSAX2ResolveEntity +extern __typeof (xmlSAX2ResolveEntity) xmlSAX2ResolveEntity__internal_alias __attribute((visibility("hidden"))); +#define xmlSAX2ResolveEntity xmlSAX2ResolveEntity__internal_alias +#endif +#endif + +#ifdef bottom_SAX2 +#undef xmlSAX2SetDocumentLocator +extern __typeof (xmlSAX2SetDocumentLocator) xmlSAX2SetDocumentLocator __attribute((alias("xmlSAX2SetDocumentLocator__internal_alias"))); +#else +#ifndef xmlSAX2SetDocumentLocator +extern __typeof (xmlSAX2SetDocumentLocator) xmlSAX2SetDocumentLocator__internal_alias __attribute((visibility("hidden"))); +#define xmlSAX2SetDocumentLocator xmlSAX2SetDocumentLocator__internal_alias +#endif +#endif + +#ifdef bottom_SAX2 +#undef xmlSAX2StartDocument +extern __typeof (xmlSAX2StartDocument) xmlSAX2StartDocument __attribute((alias("xmlSAX2StartDocument__internal_alias"))); +#else +#ifndef xmlSAX2StartDocument +extern __typeof (xmlSAX2StartDocument) xmlSAX2StartDocument__internal_alias __attribute((visibility("hidden"))); +#define xmlSAX2StartDocument xmlSAX2StartDocument__internal_alias +#endif +#endif + +#if defined(LIBXML_SAX1_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBXML_WRITER_ENABLED) || defined(LIBXML_DOCB_ENABLED) +#ifdef bottom_SAX2 +#undef xmlSAX2StartElement +extern __typeof (xmlSAX2StartElement) xmlSAX2StartElement __attribute((alias("xmlSAX2StartElement__internal_alias"))); +#else +#ifndef xmlSAX2StartElement +extern __typeof (xmlSAX2StartElement) xmlSAX2StartElement__internal_alias __attribute((visibility("hidden"))); +#define xmlSAX2StartElement xmlSAX2StartElement__internal_alias +#endif +#endif +#endif + +#ifdef bottom_SAX2 +#undef xmlSAX2StartElementNs +extern __typeof (xmlSAX2StartElementNs) xmlSAX2StartElementNs __attribute((alias("xmlSAX2StartElementNs__internal_alias"))); +#else +#ifndef xmlSAX2StartElementNs +extern __typeof (xmlSAX2StartElementNs) xmlSAX2StartElementNs__internal_alias __attribute((visibility("hidden"))); +#define xmlSAX2StartElementNs xmlSAX2StartElementNs__internal_alias +#endif +#endif + +#ifdef bottom_SAX2 +#undef xmlSAX2UnparsedEntityDecl +extern __typeof (xmlSAX2UnparsedEntityDecl) xmlSAX2UnparsedEntityDecl __attribute((alias("xmlSAX2UnparsedEntityDecl__internal_alias"))); +#else +#ifndef xmlSAX2UnparsedEntityDecl +extern __typeof (xmlSAX2UnparsedEntityDecl) xmlSAX2UnparsedEntityDecl__internal_alias __attribute((visibility("hidden"))); +#define xmlSAX2UnparsedEntityDecl xmlSAX2UnparsedEntityDecl__internal_alias +#endif +#endif + +#if defined(LIBXML_SAX1_ENABLED) +#ifdef bottom_SAX2 +#undef xmlSAXDefaultVersion +extern __typeof (xmlSAXDefaultVersion) xmlSAXDefaultVersion __attribute((alias("xmlSAXDefaultVersion__internal_alias"))); +#else +#ifndef xmlSAXDefaultVersion +extern __typeof (xmlSAXDefaultVersion) xmlSAXDefaultVersion__internal_alias __attribute((visibility("hidden"))); +#define xmlSAXDefaultVersion xmlSAXDefaultVersion__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_VALID_ENABLED) +#ifdef bottom_parser +#undef xmlSAXParseDTD +extern __typeof (xmlSAXParseDTD) xmlSAXParseDTD __attribute((alias("xmlSAXParseDTD__internal_alias"))); +#else +#ifndef xmlSAXParseDTD +extern __typeof (xmlSAXParseDTD) xmlSAXParseDTD__internal_alias __attribute((visibility("hidden"))); +#define xmlSAXParseDTD xmlSAXParseDTD__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SAX1_ENABLED) +#ifdef bottom_parser +#undef xmlSAXParseDoc +extern __typeof (xmlSAXParseDoc) xmlSAXParseDoc __attribute((alias("xmlSAXParseDoc__internal_alias"))); +#else +#ifndef xmlSAXParseDoc +extern __typeof (xmlSAXParseDoc) xmlSAXParseDoc__internal_alias __attribute((visibility("hidden"))); +#define xmlSAXParseDoc xmlSAXParseDoc__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SAX1_ENABLED) +#ifdef bottom_parser +#undef xmlSAXParseEntity +extern __typeof (xmlSAXParseEntity) xmlSAXParseEntity __attribute((alias("xmlSAXParseEntity__internal_alias"))); +#else +#ifndef xmlSAXParseEntity +extern __typeof (xmlSAXParseEntity) xmlSAXParseEntity__internal_alias __attribute((visibility("hidden"))); +#define xmlSAXParseEntity xmlSAXParseEntity__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SAX1_ENABLED) +#ifdef bottom_parser +#undef xmlSAXParseFile +extern __typeof (xmlSAXParseFile) xmlSAXParseFile __attribute((alias("xmlSAXParseFile__internal_alias"))); +#else +#ifndef xmlSAXParseFile +extern __typeof (xmlSAXParseFile) xmlSAXParseFile__internal_alias __attribute((visibility("hidden"))); +#define xmlSAXParseFile xmlSAXParseFile__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SAX1_ENABLED) +#ifdef bottom_parser +#undef xmlSAXParseFileWithData +extern __typeof (xmlSAXParseFileWithData) xmlSAXParseFileWithData __attribute((alias("xmlSAXParseFileWithData__internal_alias"))); +#else +#ifndef xmlSAXParseFileWithData +extern __typeof (xmlSAXParseFileWithData) xmlSAXParseFileWithData__internal_alias __attribute((visibility("hidden"))); +#define xmlSAXParseFileWithData xmlSAXParseFileWithData__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SAX1_ENABLED) +#ifdef bottom_parser +#undef xmlSAXParseMemory +extern __typeof (xmlSAXParseMemory) xmlSAXParseMemory __attribute((alias("xmlSAXParseMemory__internal_alias"))); +#else +#ifndef xmlSAXParseMemory +extern __typeof (xmlSAXParseMemory) xmlSAXParseMemory__internal_alias __attribute((visibility("hidden"))); +#define xmlSAXParseMemory xmlSAXParseMemory__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SAX1_ENABLED) +#ifdef bottom_parser +#undef xmlSAXParseMemoryWithData +extern __typeof (xmlSAXParseMemoryWithData) xmlSAXParseMemoryWithData __attribute((alias("xmlSAXParseMemoryWithData__internal_alias"))); +#else +#ifndef xmlSAXParseMemoryWithData +extern __typeof (xmlSAXParseMemoryWithData) xmlSAXParseMemoryWithData__internal_alias __attribute((visibility("hidden"))); +#define xmlSAXParseMemoryWithData xmlSAXParseMemoryWithData__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SAX1_ENABLED) +#ifdef bottom_parser +#undef xmlSAXUserParseFile +extern __typeof (xmlSAXUserParseFile) xmlSAXUserParseFile __attribute((alias("xmlSAXUserParseFile__internal_alias"))); +#else +#ifndef xmlSAXUserParseFile +extern __typeof (xmlSAXUserParseFile) xmlSAXUserParseFile__internal_alias __attribute((visibility("hidden"))); +#define xmlSAXUserParseFile xmlSAXUserParseFile__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SAX1_ENABLED) +#ifdef bottom_parser +#undef xmlSAXUserParseMemory +extern __typeof (xmlSAXUserParseMemory) xmlSAXUserParseMemory __attribute((alias("xmlSAXUserParseMemory__internal_alias"))); +#else +#ifndef xmlSAXUserParseMemory +extern __typeof (xmlSAXUserParseMemory) xmlSAXUserParseMemory__internal_alias __attribute((visibility("hidden"))); +#define xmlSAXUserParseMemory xmlSAXUserParseMemory__internal_alias +#endif +#endif +#endif + +#ifdef bottom_SAX2 +#undef xmlSAXVersion +extern __typeof (xmlSAXVersion) xmlSAXVersion __attribute((alias("xmlSAXVersion__internal_alias"))); +#else +#ifndef xmlSAXVersion +extern __typeof (xmlSAXVersion) xmlSAXVersion__internal_alias __attribute((visibility("hidden"))); +#define xmlSAXVersion xmlSAXVersion__internal_alias +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlsave +#undef xmlSaveClose +extern __typeof (xmlSaveClose) xmlSaveClose __attribute((alias("xmlSaveClose__internal_alias"))); +#else +#ifndef xmlSaveClose +extern __typeof (xmlSaveClose) xmlSaveClose__internal_alias __attribute((visibility("hidden"))); +#define xmlSaveClose xmlSaveClose__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlsave +#undef xmlSaveDoc +extern __typeof (xmlSaveDoc) xmlSaveDoc __attribute((alias("xmlSaveDoc__internal_alias"))); +#else +#ifndef xmlSaveDoc +extern __typeof (xmlSaveDoc) xmlSaveDoc__internal_alias __attribute((visibility("hidden"))); +#define xmlSaveDoc xmlSaveDoc__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlsave +#undef xmlSaveFile +extern __typeof (xmlSaveFile) xmlSaveFile __attribute((alias("xmlSaveFile__internal_alias"))); +#else +#ifndef xmlSaveFile +extern __typeof (xmlSaveFile) xmlSaveFile__internal_alias __attribute((visibility("hidden"))); +#define xmlSaveFile xmlSaveFile__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlsave +#undef xmlSaveFileEnc +extern __typeof (xmlSaveFileEnc) xmlSaveFileEnc __attribute((alias("xmlSaveFileEnc__internal_alias"))); +#else +#ifndef xmlSaveFileEnc +extern __typeof (xmlSaveFileEnc) xmlSaveFileEnc__internal_alias __attribute((visibility("hidden"))); +#define xmlSaveFileEnc xmlSaveFileEnc__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlsave +#undef xmlSaveFileTo +extern __typeof (xmlSaveFileTo) xmlSaveFileTo __attribute((alias("xmlSaveFileTo__internal_alias"))); +#else +#ifndef xmlSaveFileTo +extern __typeof (xmlSaveFileTo) xmlSaveFileTo__internal_alias __attribute((visibility("hidden"))); +#define xmlSaveFileTo xmlSaveFileTo__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlsave +#undef xmlSaveFlush +extern __typeof (xmlSaveFlush) xmlSaveFlush __attribute((alias("xmlSaveFlush__internal_alias"))); +#else +#ifndef xmlSaveFlush +extern __typeof (xmlSaveFlush) xmlSaveFlush__internal_alias __attribute((visibility("hidden"))); +#define xmlSaveFlush xmlSaveFlush__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlsave +#undef xmlSaveFormatFile +extern __typeof (xmlSaveFormatFile) xmlSaveFormatFile __attribute((alias("xmlSaveFormatFile__internal_alias"))); +#else +#ifndef xmlSaveFormatFile +extern __typeof (xmlSaveFormatFile) xmlSaveFormatFile__internal_alias __attribute((visibility("hidden"))); +#define xmlSaveFormatFile xmlSaveFormatFile__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlsave +#undef xmlSaveFormatFileEnc +extern __typeof (xmlSaveFormatFileEnc) xmlSaveFormatFileEnc __attribute((alias("xmlSaveFormatFileEnc__internal_alias"))); +#else +#ifndef xmlSaveFormatFileEnc +extern __typeof (xmlSaveFormatFileEnc) xmlSaveFormatFileEnc__internal_alias __attribute((visibility("hidden"))); +#define xmlSaveFormatFileEnc xmlSaveFormatFileEnc__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlsave +#undef xmlSaveFormatFileTo +extern __typeof (xmlSaveFormatFileTo) xmlSaveFormatFileTo __attribute((alias("xmlSaveFormatFileTo__internal_alias"))); +#else +#ifndef xmlSaveFormatFileTo +extern __typeof (xmlSaveFormatFileTo) xmlSaveFormatFileTo__internal_alias __attribute((visibility("hidden"))); +#define xmlSaveFormatFileTo xmlSaveFormatFileTo__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlsave +#undef xmlSaveSetAttrEscape +extern __typeof (xmlSaveSetAttrEscape) xmlSaveSetAttrEscape __attribute((alias("xmlSaveSetAttrEscape__internal_alias"))); +#else +#ifndef xmlSaveSetAttrEscape +extern __typeof (xmlSaveSetAttrEscape) xmlSaveSetAttrEscape__internal_alias __attribute((visibility("hidden"))); +#define xmlSaveSetAttrEscape xmlSaveSetAttrEscape__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlsave +#undef xmlSaveSetEscape +extern __typeof (xmlSaveSetEscape) xmlSaveSetEscape __attribute((alias("xmlSaveSetEscape__internal_alias"))); +#else +#ifndef xmlSaveSetEscape +extern __typeof (xmlSaveSetEscape) xmlSaveSetEscape__internal_alias __attribute((visibility("hidden"))); +#define xmlSaveSetEscape xmlSaveSetEscape__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlsave +#undef xmlSaveToBuffer +extern __typeof (xmlSaveToBuffer) xmlSaveToBuffer __attribute((alias("xmlSaveToBuffer__internal_alias"))); +#else +#ifndef xmlSaveToBuffer +extern __typeof (xmlSaveToBuffer) xmlSaveToBuffer__internal_alias __attribute((visibility("hidden"))); +#define xmlSaveToBuffer xmlSaveToBuffer__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlsave +#undef xmlSaveToFd +extern __typeof (xmlSaveToFd) xmlSaveToFd __attribute((alias("xmlSaveToFd__internal_alias"))); +#else +#ifndef xmlSaveToFd +extern __typeof (xmlSaveToFd) xmlSaveToFd__internal_alias __attribute((visibility("hidden"))); +#define xmlSaveToFd xmlSaveToFd__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlsave +#undef xmlSaveToFilename +extern __typeof (xmlSaveToFilename) xmlSaveToFilename __attribute((alias("xmlSaveToFilename__internal_alias"))); +#else +#ifndef xmlSaveToFilename +extern __typeof (xmlSaveToFilename) xmlSaveToFilename__internal_alias __attribute((visibility("hidden"))); +#define xmlSaveToFilename xmlSaveToFilename__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlsave +#undef xmlSaveToIO +extern __typeof (xmlSaveToIO) xmlSaveToIO __attribute((alias("xmlSaveToIO__internal_alias"))); +#else +#ifndef xmlSaveToIO +extern __typeof (xmlSaveToIO) xmlSaveToIO__internal_alias __attribute((visibility("hidden"))); +#define xmlSaveToIO xmlSaveToIO__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlsave +#undef xmlSaveTree +extern __typeof (xmlSaveTree) xmlSaveTree __attribute((alias("xmlSaveTree__internal_alias"))); +#else +#ifndef xmlSaveTree +extern __typeof (xmlSaveTree) xmlSaveTree__internal_alias __attribute((visibility("hidden"))); +#define xmlSaveTree xmlSaveTree__internal_alias +#endif +#endif +#endif + +#ifdef bottom_uri +#undef xmlSaveUri +extern __typeof (xmlSaveUri) xmlSaveUri __attribute((alias("xmlSaveUri__internal_alias"))); +#else +#ifndef xmlSaveUri +extern __typeof (xmlSaveUri) xmlSaveUri__internal_alias __attribute((visibility("hidden"))); +#define xmlSaveUri xmlSaveUri__internal_alias +#endif +#endif + +#if defined(LIBXML_LEGACY_ENABLED) +#ifdef bottom_legacy +#undef xmlScanName +extern __typeof (xmlScanName) xmlScanName __attribute((alias("xmlScanName__internal_alias"))); +#else +#ifndef xmlScanName +extern __typeof (xmlScanName) xmlScanName__internal_alias __attribute((visibility("hidden"))); +#define xmlScanName xmlScanName__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemas +#undef xmlSchemaCheckFacet +extern __typeof (xmlSchemaCheckFacet) xmlSchemaCheckFacet __attribute((alias("xmlSchemaCheckFacet__internal_alias"))); +#else +#ifndef xmlSchemaCheckFacet +extern __typeof (xmlSchemaCheckFacet) xmlSchemaCheckFacet__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaCheckFacet xmlSchemaCheckFacet__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemastypes +#undef xmlSchemaCleanupTypes +extern __typeof (xmlSchemaCleanupTypes) xmlSchemaCleanupTypes __attribute((alias("xmlSchemaCleanupTypes__internal_alias"))); +#else +#ifndef xmlSchemaCleanupTypes +extern __typeof (xmlSchemaCleanupTypes) xmlSchemaCleanupTypes__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaCleanupTypes xmlSchemaCleanupTypes__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemastypes +#undef xmlSchemaCollapseString +extern __typeof (xmlSchemaCollapseString) xmlSchemaCollapseString __attribute((alias("xmlSchemaCollapseString__internal_alias"))); +#else +#ifndef xmlSchemaCollapseString +extern __typeof (xmlSchemaCollapseString) xmlSchemaCollapseString__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaCollapseString xmlSchemaCollapseString__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemastypes +#undef xmlSchemaCompareValues +extern __typeof (xmlSchemaCompareValues) xmlSchemaCompareValues __attribute((alias("xmlSchemaCompareValues__internal_alias"))); +#else +#ifndef xmlSchemaCompareValues +extern __typeof (xmlSchemaCompareValues) xmlSchemaCompareValues__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaCompareValues xmlSchemaCompareValues__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemastypes +#undef xmlSchemaCompareValuesWhtsp +extern __typeof (xmlSchemaCompareValuesWhtsp) xmlSchemaCompareValuesWhtsp __attribute((alias("xmlSchemaCompareValuesWhtsp__internal_alias"))); +#else +#ifndef xmlSchemaCompareValuesWhtsp +extern __typeof (xmlSchemaCompareValuesWhtsp) xmlSchemaCompareValuesWhtsp__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaCompareValuesWhtsp xmlSchemaCompareValuesWhtsp__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemastypes +#undef xmlSchemaCopyValue +extern __typeof (xmlSchemaCopyValue) xmlSchemaCopyValue __attribute((alias("xmlSchemaCopyValue__internal_alias"))); +#else +#ifndef xmlSchemaCopyValue +extern __typeof (xmlSchemaCopyValue) xmlSchemaCopyValue__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaCopyValue xmlSchemaCopyValue__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_xmlschemas +#undef xmlSchemaDump +extern __typeof (xmlSchemaDump) xmlSchemaDump __attribute((alias("xmlSchemaDump__internal_alias"))); +#else +#ifndef xmlSchemaDump +extern __typeof (xmlSchemaDump) xmlSchemaDump__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaDump xmlSchemaDump__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemas +#undef xmlSchemaFree +extern __typeof (xmlSchemaFree) xmlSchemaFree __attribute((alias("xmlSchemaFree__internal_alias"))); +#else +#ifndef xmlSchemaFree +extern __typeof (xmlSchemaFree) xmlSchemaFree__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaFree xmlSchemaFree__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemas +#undef xmlSchemaFreeFacet +extern __typeof (xmlSchemaFreeFacet) xmlSchemaFreeFacet __attribute((alias("xmlSchemaFreeFacet__internal_alias"))); +#else +#ifndef xmlSchemaFreeFacet +extern __typeof (xmlSchemaFreeFacet) xmlSchemaFreeFacet__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaFreeFacet xmlSchemaFreeFacet__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemas +#undef xmlSchemaFreeParserCtxt +extern __typeof (xmlSchemaFreeParserCtxt) xmlSchemaFreeParserCtxt __attribute((alias("xmlSchemaFreeParserCtxt__internal_alias"))); +#else +#ifndef xmlSchemaFreeParserCtxt +extern __typeof (xmlSchemaFreeParserCtxt) xmlSchemaFreeParserCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaFreeParserCtxt xmlSchemaFreeParserCtxt__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemas +#undef xmlSchemaFreeType +extern __typeof (xmlSchemaFreeType) xmlSchemaFreeType __attribute((alias("xmlSchemaFreeType__internal_alias"))); +#else +#ifndef xmlSchemaFreeType +extern __typeof (xmlSchemaFreeType) xmlSchemaFreeType__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaFreeType xmlSchemaFreeType__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemas +#undef xmlSchemaFreeValidCtxt +extern __typeof (xmlSchemaFreeValidCtxt) xmlSchemaFreeValidCtxt __attribute((alias("xmlSchemaFreeValidCtxt__internal_alias"))); +#else +#ifndef xmlSchemaFreeValidCtxt +extern __typeof (xmlSchemaFreeValidCtxt) xmlSchemaFreeValidCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaFreeValidCtxt xmlSchemaFreeValidCtxt__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemastypes +#undef xmlSchemaFreeValue +extern __typeof (xmlSchemaFreeValue) xmlSchemaFreeValue __attribute((alias("xmlSchemaFreeValue__internal_alias"))); +#else +#ifndef xmlSchemaFreeValue +extern __typeof (xmlSchemaFreeValue) xmlSchemaFreeValue__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaFreeValue xmlSchemaFreeValue__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemas +#undef xmlSchemaFreeWildcard +extern __typeof (xmlSchemaFreeWildcard) xmlSchemaFreeWildcard __attribute((alias("xmlSchemaFreeWildcard__internal_alias"))); +#else +#ifndef xmlSchemaFreeWildcard +extern __typeof (xmlSchemaFreeWildcard) xmlSchemaFreeWildcard__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaFreeWildcard xmlSchemaFreeWildcard__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemastypes +#undef xmlSchemaGetBuiltInListSimpleTypeItemType +extern __typeof (xmlSchemaGetBuiltInListSimpleTypeItemType) xmlSchemaGetBuiltInListSimpleTypeItemType __attribute((alias("xmlSchemaGetBuiltInListSimpleTypeItemType__internal_alias"))); +#else +#ifndef xmlSchemaGetBuiltInListSimpleTypeItemType +extern __typeof (xmlSchemaGetBuiltInListSimpleTypeItemType) xmlSchemaGetBuiltInListSimpleTypeItemType__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaGetBuiltInListSimpleTypeItemType xmlSchemaGetBuiltInListSimpleTypeItemType__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemastypes +#undef xmlSchemaGetBuiltInType +extern __typeof (xmlSchemaGetBuiltInType) xmlSchemaGetBuiltInType __attribute((alias("xmlSchemaGetBuiltInType__internal_alias"))); +#else +#ifndef xmlSchemaGetBuiltInType +extern __typeof (xmlSchemaGetBuiltInType) xmlSchemaGetBuiltInType__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaGetBuiltInType xmlSchemaGetBuiltInType__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemastypes +#undef xmlSchemaGetCanonValue +extern __typeof (xmlSchemaGetCanonValue) xmlSchemaGetCanonValue __attribute((alias("xmlSchemaGetCanonValue__internal_alias"))); +#else +#ifndef xmlSchemaGetCanonValue +extern __typeof (xmlSchemaGetCanonValue) xmlSchemaGetCanonValue__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaGetCanonValue xmlSchemaGetCanonValue__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemastypes +#undef xmlSchemaGetCanonValueWhtsp +extern __typeof (xmlSchemaGetCanonValueWhtsp) xmlSchemaGetCanonValueWhtsp __attribute((alias("xmlSchemaGetCanonValueWhtsp__internal_alias"))); +#else +#ifndef xmlSchemaGetCanonValueWhtsp +extern __typeof (xmlSchemaGetCanonValueWhtsp) xmlSchemaGetCanonValueWhtsp__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaGetCanonValueWhtsp xmlSchemaGetCanonValueWhtsp__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemastypes +#undef xmlSchemaGetFacetValueAsULong +extern __typeof (xmlSchemaGetFacetValueAsULong) xmlSchemaGetFacetValueAsULong __attribute((alias("xmlSchemaGetFacetValueAsULong__internal_alias"))); +#else +#ifndef xmlSchemaGetFacetValueAsULong +extern __typeof (xmlSchemaGetFacetValueAsULong) xmlSchemaGetFacetValueAsULong__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaGetFacetValueAsULong xmlSchemaGetFacetValueAsULong__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemas +#undef xmlSchemaGetParserErrors +extern __typeof (xmlSchemaGetParserErrors) xmlSchemaGetParserErrors __attribute((alias("xmlSchemaGetParserErrors__internal_alias"))); +#else +#ifndef xmlSchemaGetParserErrors +extern __typeof (xmlSchemaGetParserErrors) xmlSchemaGetParserErrors__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaGetParserErrors xmlSchemaGetParserErrors__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemastypes +#undef xmlSchemaGetPredefinedType +extern __typeof (xmlSchemaGetPredefinedType) xmlSchemaGetPredefinedType __attribute((alias("xmlSchemaGetPredefinedType__internal_alias"))); +#else +#ifndef xmlSchemaGetPredefinedType +extern __typeof (xmlSchemaGetPredefinedType) xmlSchemaGetPredefinedType__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaGetPredefinedType xmlSchemaGetPredefinedType__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemastypes +#undef xmlSchemaGetValType +extern __typeof (xmlSchemaGetValType) xmlSchemaGetValType __attribute((alias("xmlSchemaGetValType__internal_alias"))); +#else +#ifndef xmlSchemaGetValType +extern __typeof (xmlSchemaGetValType) xmlSchemaGetValType__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaGetValType xmlSchemaGetValType__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemas +#undef xmlSchemaGetValidErrors +extern __typeof (xmlSchemaGetValidErrors) xmlSchemaGetValidErrors __attribute((alias("xmlSchemaGetValidErrors__internal_alias"))); +#else +#ifndef xmlSchemaGetValidErrors +extern __typeof (xmlSchemaGetValidErrors) xmlSchemaGetValidErrors__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaGetValidErrors xmlSchemaGetValidErrors__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemastypes +#undef xmlSchemaInitTypes +extern __typeof (xmlSchemaInitTypes) xmlSchemaInitTypes __attribute((alias("xmlSchemaInitTypes__internal_alias"))); +#else +#ifndef xmlSchemaInitTypes +extern __typeof (xmlSchemaInitTypes) xmlSchemaInitTypes__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaInitTypes xmlSchemaInitTypes__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemastypes +#undef xmlSchemaIsBuiltInTypeFacet +extern __typeof (xmlSchemaIsBuiltInTypeFacet) xmlSchemaIsBuiltInTypeFacet __attribute((alias("xmlSchemaIsBuiltInTypeFacet__internal_alias"))); +#else +#ifndef xmlSchemaIsBuiltInTypeFacet +extern __typeof (xmlSchemaIsBuiltInTypeFacet) xmlSchemaIsBuiltInTypeFacet__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaIsBuiltInTypeFacet xmlSchemaIsBuiltInTypeFacet__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemas +#undef xmlSchemaIsValid +extern __typeof (xmlSchemaIsValid) xmlSchemaIsValid __attribute((alias("xmlSchemaIsValid__internal_alias"))); +#else +#ifndef xmlSchemaIsValid +extern __typeof (xmlSchemaIsValid) xmlSchemaIsValid__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaIsValid xmlSchemaIsValid__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemas +#undef xmlSchemaNewDocParserCtxt +extern __typeof (xmlSchemaNewDocParserCtxt) xmlSchemaNewDocParserCtxt __attribute((alias("xmlSchemaNewDocParserCtxt__internal_alias"))); +#else +#ifndef xmlSchemaNewDocParserCtxt +extern __typeof (xmlSchemaNewDocParserCtxt) xmlSchemaNewDocParserCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaNewDocParserCtxt xmlSchemaNewDocParserCtxt__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemas +#undef xmlSchemaNewFacet +extern __typeof (xmlSchemaNewFacet) xmlSchemaNewFacet __attribute((alias("xmlSchemaNewFacet__internal_alias"))); +#else +#ifndef xmlSchemaNewFacet +extern __typeof (xmlSchemaNewFacet) xmlSchemaNewFacet__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaNewFacet xmlSchemaNewFacet__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemas +#undef xmlSchemaNewMemParserCtxt +extern __typeof (xmlSchemaNewMemParserCtxt) xmlSchemaNewMemParserCtxt __attribute((alias("xmlSchemaNewMemParserCtxt__internal_alias"))); +#else +#ifndef xmlSchemaNewMemParserCtxt +extern __typeof (xmlSchemaNewMemParserCtxt) xmlSchemaNewMemParserCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaNewMemParserCtxt xmlSchemaNewMemParserCtxt__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemastypes +#undef xmlSchemaNewNOTATIONValue +extern __typeof (xmlSchemaNewNOTATIONValue) xmlSchemaNewNOTATIONValue __attribute((alias("xmlSchemaNewNOTATIONValue__internal_alias"))); +#else +#ifndef xmlSchemaNewNOTATIONValue +extern __typeof (xmlSchemaNewNOTATIONValue) xmlSchemaNewNOTATIONValue__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaNewNOTATIONValue xmlSchemaNewNOTATIONValue__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemas +#undef xmlSchemaNewParserCtxt +extern __typeof (xmlSchemaNewParserCtxt) xmlSchemaNewParserCtxt __attribute((alias("xmlSchemaNewParserCtxt__internal_alias"))); +#else +#ifndef xmlSchemaNewParserCtxt +extern __typeof (xmlSchemaNewParserCtxt) xmlSchemaNewParserCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaNewParserCtxt xmlSchemaNewParserCtxt__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemastypes +#undef xmlSchemaNewQNameValue +extern __typeof (xmlSchemaNewQNameValue) xmlSchemaNewQNameValue __attribute((alias("xmlSchemaNewQNameValue__internal_alias"))); +#else +#ifndef xmlSchemaNewQNameValue +extern __typeof (xmlSchemaNewQNameValue) xmlSchemaNewQNameValue__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaNewQNameValue xmlSchemaNewQNameValue__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemastypes +#undef xmlSchemaNewStringValue +extern __typeof (xmlSchemaNewStringValue) xmlSchemaNewStringValue __attribute((alias("xmlSchemaNewStringValue__internal_alias"))); +#else +#ifndef xmlSchemaNewStringValue +extern __typeof (xmlSchemaNewStringValue) xmlSchemaNewStringValue__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaNewStringValue xmlSchemaNewStringValue__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemas +#undef xmlSchemaNewValidCtxt +extern __typeof (xmlSchemaNewValidCtxt) xmlSchemaNewValidCtxt __attribute((alias("xmlSchemaNewValidCtxt__internal_alias"))); +#else +#ifndef xmlSchemaNewValidCtxt +extern __typeof (xmlSchemaNewValidCtxt) xmlSchemaNewValidCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaNewValidCtxt xmlSchemaNewValidCtxt__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemas +#undef xmlSchemaParse +extern __typeof (xmlSchemaParse) xmlSchemaParse __attribute((alias("xmlSchemaParse__internal_alias"))); +#else +#ifndef xmlSchemaParse +extern __typeof (xmlSchemaParse) xmlSchemaParse__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaParse xmlSchemaParse__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemas +#undef xmlSchemaSAXPlug +extern __typeof (xmlSchemaSAXPlug) xmlSchemaSAXPlug __attribute((alias("xmlSchemaSAXPlug__internal_alias"))); +#else +#ifndef xmlSchemaSAXPlug +extern __typeof (xmlSchemaSAXPlug) xmlSchemaSAXPlug__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaSAXPlug xmlSchemaSAXPlug__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemas +#undef xmlSchemaSAXUnplug +extern __typeof (xmlSchemaSAXUnplug) xmlSchemaSAXUnplug __attribute((alias("xmlSchemaSAXUnplug__internal_alias"))); +#else +#ifndef xmlSchemaSAXUnplug +extern __typeof (xmlSchemaSAXUnplug) xmlSchemaSAXUnplug__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaSAXUnplug xmlSchemaSAXUnplug__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemas +#undef xmlSchemaSetParserErrors +extern __typeof (xmlSchemaSetParserErrors) xmlSchemaSetParserErrors __attribute((alias("xmlSchemaSetParserErrors__internal_alias"))); +#else +#ifndef xmlSchemaSetParserErrors +extern __typeof (xmlSchemaSetParserErrors) xmlSchemaSetParserErrors__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaSetParserErrors xmlSchemaSetParserErrors__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemas +#undef xmlSchemaSetParserStructuredErrors +extern __typeof (xmlSchemaSetParserStructuredErrors) xmlSchemaSetParserStructuredErrors __attribute((alias("xmlSchemaSetParserStructuredErrors__internal_alias"))); +#else +#ifndef xmlSchemaSetParserStructuredErrors +extern __typeof (xmlSchemaSetParserStructuredErrors) xmlSchemaSetParserStructuredErrors__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaSetParserStructuredErrors xmlSchemaSetParserStructuredErrors__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemas +#undef xmlSchemaSetValidErrors +extern __typeof (xmlSchemaSetValidErrors) xmlSchemaSetValidErrors __attribute((alias("xmlSchemaSetValidErrors__internal_alias"))); +#else +#ifndef xmlSchemaSetValidErrors +extern __typeof (xmlSchemaSetValidErrors) xmlSchemaSetValidErrors__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaSetValidErrors xmlSchemaSetValidErrors__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemas +#undef xmlSchemaSetValidOptions +extern __typeof (xmlSchemaSetValidOptions) xmlSchemaSetValidOptions __attribute((alias("xmlSchemaSetValidOptions__internal_alias"))); +#else +#ifndef xmlSchemaSetValidOptions +extern __typeof (xmlSchemaSetValidOptions) xmlSchemaSetValidOptions__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaSetValidOptions xmlSchemaSetValidOptions__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemas +#undef xmlSchemaSetValidStructuredErrors +extern __typeof (xmlSchemaSetValidStructuredErrors) xmlSchemaSetValidStructuredErrors __attribute((alias("xmlSchemaSetValidStructuredErrors__internal_alias"))); +#else +#ifndef xmlSchemaSetValidStructuredErrors +extern __typeof (xmlSchemaSetValidStructuredErrors) xmlSchemaSetValidStructuredErrors__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaSetValidStructuredErrors xmlSchemaSetValidStructuredErrors__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemastypes +#undef xmlSchemaValPredefTypeNode +extern __typeof (xmlSchemaValPredefTypeNode) xmlSchemaValPredefTypeNode __attribute((alias("xmlSchemaValPredefTypeNode__internal_alias"))); +#else +#ifndef xmlSchemaValPredefTypeNode +extern __typeof (xmlSchemaValPredefTypeNode) xmlSchemaValPredefTypeNode__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaValPredefTypeNode xmlSchemaValPredefTypeNode__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemastypes +#undef xmlSchemaValPredefTypeNodeNoNorm +extern __typeof (xmlSchemaValPredefTypeNodeNoNorm) xmlSchemaValPredefTypeNodeNoNorm __attribute((alias("xmlSchemaValPredefTypeNodeNoNorm__internal_alias"))); +#else +#ifndef xmlSchemaValPredefTypeNodeNoNorm +extern __typeof (xmlSchemaValPredefTypeNodeNoNorm) xmlSchemaValPredefTypeNodeNoNorm__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaValPredefTypeNodeNoNorm xmlSchemaValPredefTypeNodeNoNorm__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemas +#undef xmlSchemaValidCtxtGetOptions +extern __typeof (xmlSchemaValidCtxtGetOptions) xmlSchemaValidCtxtGetOptions __attribute((alias("xmlSchemaValidCtxtGetOptions__internal_alias"))); +#else +#ifndef xmlSchemaValidCtxtGetOptions +extern __typeof (xmlSchemaValidCtxtGetOptions) xmlSchemaValidCtxtGetOptions__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaValidCtxtGetOptions xmlSchemaValidCtxtGetOptions__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemas +#undef xmlSchemaValidCtxtGetParserCtxt +extern __typeof (xmlSchemaValidCtxtGetParserCtxt) xmlSchemaValidCtxtGetParserCtxt __attribute((alias("xmlSchemaValidCtxtGetParserCtxt__internal_alias"))); +#else +#ifndef xmlSchemaValidCtxtGetParserCtxt +extern __typeof (xmlSchemaValidCtxtGetParserCtxt) xmlSchemaValidCtxtGetParserCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaValidCtxtGetParserCtxt xmlSchemaValidCtxtGetParserCtxt__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemas +#undef xmlSchemaValidateDoc +extern __typeof (xmlSchemaValidateDoc) xmlSchemaValidateDoc __attribute((alias("xmlSchemaValidateDoc__internal_alias"))); +#else +#ifndef xmlSchemaValidateDoc +extern __typeof (xmlSchemaValidateDoc) xmlSchemaValidateDoc__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaValidateDoc xmlSchemaValidateDoc__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemastypes +#undef xmlSchemaValidateFacet +extern __typeof (xmlSchemaValidateFacet) xmlSchemaValidateFacet __attribute((alias("xmlSchemaValidateFacet__internal_alias"))); +#else +#ifndef xmlSchemaValidateFacet +extern __typeof (xmlSchemaValidateFacet) xmlSchemaValidateFacet__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaValidateFacet xmlSchemaValidateFacet__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemastypes +#undef xmlSchemaValidateFacetWhtsp +extern __typeof (xmlSchemaValidateFacetWhtsp) xmlSchemaValidateFacetWhtsp __attribute((alias("xmlSchemaValidateFacetWhtsp__internal_alias"))); +#else +#ifndef xmlSchemaValidateFacetWhtsp +extern __typeof (xmlSchemaValidateFacetWhtsp) xmlSchemaValidateFacetWhtsp__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaValidateFacetWhtsp xmlSchemaValidateFacetWhtsp__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemas +#undef xmlSchemaValidateFile +extern __typeof (xmlSchemaValidateFile) xmlSchemaValidateFile __attribute((alias("xmlSchemaValidateFile__internal_alias"))); +#else +#ifndef xmlSchemaValidateFile +extern __typeof (xmlSchemaValidateFile) xmlSchemaValidateFile__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaValidateFile xmlSchemaValidateFile__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemastypes +#undef xmlSchemaValidateLengthFacet +extern __typeof (xmlSchemaValidateLengthFacet) xmlSchemaValidateLengthFacet __attribute((alias("xmlSchemaValidateLengthFacet__internal_alias"))); +#else +#ifndef xmlSchemaValidateLengthFacet +extern __typeof (xmlSchemaValidateLengthFacet) xmlSchemaValidateLengthFacet__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaValidateLengthFacet xmlSchemaValidateLengthFacet__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemastypes +#undef xmlSchemaValidateLengthFacetWhtsp +extern __typeof (xmlSchemaValidateLengthFacetWhtsp) xmlSchemaValidateLengthFacetWhtsp __attribute((alias("xmlSchemaValidateLengthFacetWhtsp__internal_alias"))); +#else +#ifndef xmlSchemaValidateLengthFacetWhtsp +extern __typeof (xmlSchemaValidateLengthFacetWhtsp) xmlSchemaValidateLengthFacetWhtsp__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaValidateLengthFacetWhtsp xmlSchemaValidateLengthFacetWhtsp__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemastypes +#undef xmlSchemaValidateListSimpleTypeFacet +extern __typeof (xmlSchemaValidateListSimpleTypeFacet) xmlSchemaValidateListSimpleTypeFacet __attribute((alias("xmlSchemaValidateListSimpleTypeFacet__internal_alias"))); +#else +#ifndef xmlSchemaValidateListSimpleTypeFacet +extern __typeof (xmlSchemaValidateListSimpleTypeFacet) xmlSchemaValidateListSimpleTypeFacet__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaValidateListSimpleTypeFacet xmlSchemaValidateListSimpleTypeFacet__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemas +#undef xmlSchemaValidateOneElement +extern __typeof (xmlSchemaValidateOneElement) xmlSchemaValidateOneElement __attribute((alias("xmlSchemaValidateOneElement__internal_alias"))); +#else +#ifndef xmlSchemaValidateOneElement +extern __typeof (xmlSchemaValidateOneElement) xmlSchemaValidateOneElement__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaValidateOneElement xmlSchemaValidateOneElement__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemastypes +#undef xmlSchemaValidatePredefinedType +extern __typeof (xmlSchemaValidatePredefinedType) xmlSchemaValidatePredefinedType __attribute((alias("xmlSchemaValidatePredefinedType__internal_alias"))); +#else +#ifndef xmlSchemaValidatePredefinedType +extern __typeof (xmlSchemaValidatePredefinedType) xmlSchemaValidatePredefinedType__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaValidatePredefinedType xmlSchemaValidatePredefinedType__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemas +#undef xmlSchemaValidateSetFilename +extern __typeof (xmlSchemaValidateSetFilename) xmlSchemaValidateSetFilename __attribute((alias("xmlSchemaValidateSetFilename__internal_alias"))); +#else +#ifndef xmlSchemaValidateSetFilename +extern __typeof (xmlSchemaValidateSetFilename) xmlSchemaValidateSetFilename__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaValidateSetFilename xmlSchemaValidateSetFilename__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemas +#undef xmlSchemaValidateSetLocator +extern __typeof (xmlSchemaValidateSetLocator) xmlSchemaValidateSetLocator __attribute((alias("xmlSchemaValidateSetLocator__internal_alias"))); +#else +#ifndef xmlSchemaValidateSetLocator +extern __typeof (xmlSchemaValidateSetLocator) xmlSchemaValidateSetLocator__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaValidateSetLocator xmlSchemaValidateSetLocator__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemas +#undef xmlSchemaValidateStream +extern __typeof (xmlSchemaValidateStream) xmlSchemaValidateStream __attribute((alias("xmlSchemaValidateStream__internal_alias"))); +#else +#ifndef xmlSchemaValidateStream +extern __typeof (xmlSchemaValidateStream) xmlSchemaValidateStream__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaValidateStream xmlSchemaValidateStream__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemastypes +#undef xmlSchemaValueAppend +extern __typeof (xmlSchemaValueAppend) xmlSchemaValueAppend __attribute((alias("xmlSchemaValueAppend__internal_alias"))); +#else +#ifndef xmlSchemaValueAppend +extern __typeof (xmlSchemaValueAppend) xmlSchemaValueAppend__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaValueAppend xmlSchemaValueAppend__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemastypes +#undef xmlSchemaValueGetAsBoolean +extern __typeof (xmlSchemaValueGetAsBoolean) xmlSchemaValueGetAsBoolean __attribute((alias("xmlSchemaValueGetAsBoolean__internal_alias"))); +#else +#ifndef xmlSchemaValueGetAsBoolean +extern __typeof (xmlSchemaValueGetAsBoolean) xmlSchemaValueGetAsBoolean__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaValueGetAsBoolean xmlSchemaValueGetAsBoolean__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemastypes +#undef xmlSchemaValueGetAsString +extern __typeof (xmlSchemaValueGetAsString) xmlSchemaValueGetAsString __attribute((alias("xmlSchemaValueGetAsString__internal_alias"))); +#else +#ifndef xmlSchemaValueGetAsString +extern __typeof (xmlSchemaValueGetAsString) xmlSchemaValueGetAsString__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaValueGetAsString xmlSchemaValueGetAsString__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemastypes +#undef xmlSchemaValueGetNext +extern __typeof (xmlSchemaValueGetNext) xmlSchemaValueGetNext __attribute((alias("xmlSchemaValueGetNext__internal_alias"))); +#else +#ifndef xmlSchemaValueGetNext +extern __typeof (xmlSchemaValueGetNext) xmlSchemaValueGetNext__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaValueGetNext xmlSchemaValueGetNext__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlschemastypes +#undef xmlSchemaWhiteSpaceReplace +extern __typeof (xmlSchemaWhiteSpaceReplace) xmlSchemaWhiteSpaceReplace __attribute((alias("xmlSchemaWhiteSpaceReplace__internal_alias"))); +#else +#ifndef xmlSchemaWhiteSpaceReplace +extern __typeof (xmlSchemaWhiteSpaceReplace) xmlSchemaWhiteSpaceReplace__internal_alias __attribute((visibility("hidden"))); +#define xmlSchemaWhiteSpaceReplace xmlSchemaWhiteSpaceReplace__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMATRON_ENABLED) +#ifdef bottom_schematron +#undef xmlSchematronFree +extern __typeof (xmlSchematronFree) xmlSchematronFree __attribute((alias("xmlSchematronFree__internal_alias"))); +#else +#ifndef xmlSchematronFree +extern __typeof (xmlSchematronFree) xmlSchematronFree__internal_alias __attribute((visibility("hidden"))); +#define xmlSchematronFree xmlSchematronFree__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMATRON_ENABLED) +#ifdef bottom_schematron +#undef xmlSchematronFreeParserCtxt +extern __typeof (xmlSchematronFreeParserCtxt) xmlSchematronFreeParserCtxt __attribute((alias("xmlSchematronFreeParserCtxt__internal_alias"))); +#else +#ifndef xmlSchematronFreeParserCtxt +extern __typeof (xmlSchematronFreeParserCtxt) xmlSchematronFreeParserCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlSchematronFreeParserCtxt xmlSchematronFreeParserCtxt__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMATRON_ENABLED) +#ifdef bottom_schematron +#undef xmlSchematronFreeValidCtxt +extern __typeof (xmlSchematronFreeValidCtxt) xmlSchematronFreeValidCtxt __attribute((alias("xmlSchematronFreeValidCtxt__internal_alias"))); +#else +#ifndef xmlSchematronFreeValidCtxt +extern __typeof (xmlSchematronFreeValidCtxt) xmlSchematronFreeValidCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlSchematronFreeValidCtxt xmlSchematronFreeValidCtxt__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMATRON_ENABLED) +#ifdef bottom_schematron +#undef xmlSchematronNewDocParserCtxt +extern __typeof (xmlSchematronNewDocParserCtxt) xmlSchematronNewDocParserCtxt __attribute((alias("xmlSchematronNewDocParserCtxt__internal_alias"))); +#else +#ifndef xmlSchematronNewDocParserCtxt +extern __typeof (xmlSchematronNewDocParserCtxt) xmlSchematronNewDocParserCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlSchematronNewDocParserCtxt xmlSchematronNewDocParserCtxt__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMATRON_ENABLED) +#ifdef bottom_schematron +#undef xmlSchematronNewMemParserCtxt +extern __typeof (xmlSchematronNewMemParserCtxt) xmlSchematronNewMemParserCtxt __attribute((alias("xmlSchematronNewMemParserCtxt__internal_alias"))); +#else +#ifndef xmlSchematronNewMemParserCtxt +extern __typeof (xmlSchematronNewMemParserCtxt) xmlSchematronNewMemParserCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlSchematronNewMemParserCtxt xmlSchematronNewMemParserCtxt__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMATRON_ENABLED) +#ifdef bottom_schematron +#undef xmlSchematronNewParserCtxt +extern __typeof (xmlSchematronNewParserCtxt) xmlSchematronNewParserCtxt __attribute((alias("xmlSchematronNewParserCtxt__internal_alias"))); +#else +#ifndef xmlSchematronNewParserCtxt +extern __typeof (xmlSchematronNewParserCtxt) xmlSchematronNewParserCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlSchematronNewParserCtxt xmlSchematronNewParserCtxt__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMATRON_ENABLED) +#ifdef bottom_schematron +#undef xmlSchematronNewValidCtxt +extern __typeof (xmlSchematronNewValidCtxt) xmlSchematronNewValidCtxt __attribute((alias("xmlSchematronNewValidCtxt__internal_alias"))); +#else +#ifndef xmlSchematronNewValidCtxt +extern __typeof (xmlSchematronNewValidCtxt) xmlSchematronNewValidCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlSchematronNewValidCtxt xmlSchematronNewValidCtxt__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMATRON_ENABLED) +#ifdef bottom_schematron +#undef xmlSchematronParse +extern __typeof (xmlSchematronParse) xmlSchematronParse __attribute((alias("xmlSchematronParse__internal_alias"))); +#else +#ifndef xmlSchematronParse +extern __typeof (xmlSchematronParse) xmlSchematronParse__internal_alias __attribute((visibility("hidden"))); +#define xmlSchematronParse xmlSchematronParse__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMATRON_ENABLED) +#ifdef bottom_schematron +#undef xmlSchematronSetValidStructuredErrors +extern __typeof (xmlSchematronSetValidStructuredErrors) xmlSchematronSetValidStructuredErrors __attribute((alias("xmlSchematronSetValidStructuredErrors__internal_alias"))); +#else +#ifndef xmlSchematronSetValidStructuredErrors +extern __typeof (xmlSchematronSetValidStructuredErrors) xmlSchematronSetValidStructuredErrors__internal_alias __attribute((visibility("hidden"))); +#define xmlSchematronSetValidStructuredErrors xmlSchematronSetValidStructuredErrors__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_SCHEMATRON_ENABLED) +#ifdef bottom_schematron +#undef xmlSchematronValidateDoc +extern __typeof (xmlSchematronValidateDoc) xmlSchematronValidateDoc __attribute((alias("xmlSchematronValidateDoc__internal_alias"))); +#else +#ifndef xmlSchematronValidateDoc +extern __typeof (xmlSchematronValidateDoc) xmlSchematronValidateDoc__internal_alias __attribute((visibility("hidden"))); +#define xmlSchematronValidateDoc xmlSchematronValidateDoc__internal_alias +#endif +#endif +#endif + +#ifdef bottom_tree +#undef xmlSearchNs +extern __typeof (xmlSearchNs) xmlSearchNs __attribute((alias("xmlSearchNs__internal_alias"))); +#else +#ifndef xmlSearchNs +extern __typeof (xmlSearchNs) xmlSearchNs__internal_alias __attribute((visibility("hidden"))); +#define xmlSearchNs xmlSearchNs__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlSearchNsByHref +extern __typeof (xmlSearchNsByHref) xmlSearchNsByHref __attribute((alias("xmlSearchNsByHref__internal_alias"))); +#else +#ifndef xmlSearchNsByHref +extern __typeof (xmlSearchNsByHref) xmlSearchNsByHref__internal_alias __attribute((visibility("hidden"))); +#define xmlSearchNsByHref xmlSearchNsByHref__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlSetBufferAllocationScheme +extern __typeof (xmlSetBufferAllocationScheme) xmlSetBufferAllocationScheme __attribute((alias("xmlSetBufferAllocationScheme__internal_alias"))); +#else +#ifndef xmlSetBufferAllocationScheme +extern __typeof (xmlSetBufferAllocationScheme) xmlSetBufferAllocationScheme__internal_alias __attribute((visibility("hidden"))); +#define xmlSetBufferAllocationScheme xmlSetBufferAllocationScheme__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlSetCompressMode +extern __typeof (xmlSetCompressMode) xmlSetCompressMode __attribute((alias("xmlSetCompressMode__internal_alias"))); +#else +#ifndef xmlSetCompressMode +extern __typeof (xmlSetCompressMode) xmlSetCompressMode__internal_alias __attribute((visibility("hidden"))); +#define xmlSetCompressMode xmlSetCompressMode__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlSetDocCompressMode +extern __typeof (xmlSetDocCompressMode) xmlSetDocCompressMode __attribute((alias("xmlSetDocCompressMode__internal_alias"))); +#else +#ifndef xmlSetDocCompressMode +extern __typeof (xmlSetDocCompressMode) xmlSetDocCompressMode__internal_alias __attribute((visibility("hidden"))); +#define xmlSetDocCompressMode xmlSetDocCompressMode__internal_alias +#endif +#endif + +#if defined(LIBXML_LEGACY_ENABLED) +#ifdef bottom_parser +#undef xmlSetEntityReferenceFunc +extern __typeof (xmlSetEntityReferenceFunc) xmlSetEntityReferenceFunc __attribute((alias("xmlSetEntityReferenceFunc__internal_alias"))); +#else +#ifndef xmlSetEntityReferenceFunc +extern __typeof (xmlSetEntityReferenceFunc) xmlSetEntityReferenceFunc__internal_alias __attribute((visibility("hidden"))); +#define xmlSetEntityReferenceFunc xmlSetEntityReferenceFunc__internal_alias +#endif +#endif +#endif + +#ifdef bottom_xmlIO +#undef xmlSetExternalEntityLoader +extern __typeof (xmlSetExternalEntityLoader) xmlSetExternalEntityLoader __attribute((alias("xmlSetExternalEntityLoader__internal_alias"))); +#else +#ifndef xmlSetExternalEntityLoader +extern __typeof (xmlSetExternalEntityLoader) xmlSetExternalEntityLoader__internal_alias __attribute((visibility("hidden"))); +#define xmlSetExternalEntityLoader xmlSetExternalEntityLoader__internal_alias +#endif +#endif + +#if defined(LIBXML_LEGACY_ENABLED) +#ifdef bottom_legacy +#undef xmlSetFeature +extern __typeof (xmlSetFeature) xmlSetFeature __attribute((alias("xmlSetFeature__internal_alias"))); +#else +#ifndef xmlSetFeature +extern __typeof (xmlSetFeature) xmlSetFeature__internal_alias __attribute((visibility("hidden"))); +#define xmlSetFeature xmlSetFeature__internal_alias +#endif +#endif +#endif + +#ifdef bottom_error +#undef xmlSetGenericErrorFunc +extern __typeof (xmlSetGenericErrorFunc) xmlSetGenericErrorFunc __attribute((alias("xmlSetGenericErrorFunc__internal_alias"))); +#else +#ifndef xmlSetGenericErrorFunc +extern __typeof (xmlSetGenericErrorFunc) xmlSetGenericErrorFunc__internal_alias __attribute((visibility("hidden"))); +#define xmlSetGenericErrorFunc xmlSetGenericErrorFunc__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlSetListDoc +extern __typeof (xmlSetListDoc) xmlSetListDoc __attribute((alias("xmlSetListDoc__internal_alias"))); +#else +#ifndef xmlSetListDoc +extern __typeof (xmlSetListDoc) xmlSetListDoc__internal_alias __attribute((visibility("hidden"))); +#define xmlSetListDoc xmlSetListDoc__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlSetNs +extern __typeof (xmlSetNs) xmlSetNs __attribute((alias("xmlSetNs__internal_alias"))); +#else +#ifndef xmlSetNs +extern __typeof (xmlSetNs) xmlSetNs__internal_alias __attribute((visibility("hidden"))); +#define xmlSetNs xmlSetNs__internal_alias +#endif +#endif + +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_HTML_ENABLED) +#ifdef bottom_tree +#undef xmlSetNsProp +extern __typeof (xmlSetNsProp) xmlSetNsProp __attribute((alias("xmlSetNsProp__internal_alias"))); +#else +#ifndef xmlSetNsProp +extern __typeof (xmlSetNsProp) xmlSetNsProp__internal_alias __attribute((visibility("hidden"))); +#define xmlSetNsProp xmlSetNsProp__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_HTML_ENABLED) +#ifdef bottom_tree +#undef xmlSetProp +extern __typeof (xmlSetProp) xmlSetProp __attribute((alias("xmlSetProp__internal_alias"))); +#else +#ifndef xmlSetProp +extern __typeof (xmlSetProp) xmlSetProp__internal_alias __attribute((visibility("hidden"))); +#define xmlSetProp xmlSetProp__internal_alias +#endif +#endif +#endif + +#ifdef bottom_error +#undef xmlSetStructuredErrorFunc +extern __typeof (xmlSetStructuredErrorFunc) xmlSetStructuredErrorFunc __attribute((alias("xmlSetStructuredErrorFunc__internal_alias"))); +#else +#ifndef xmlSetStructuredErrorFunc +extern __typeof (xmlSetStructuredErrorFunc) xmlSetStructuredErrorFunc__internal_alias __attribute((visibility("hidden"))); +#define xmlSetStructuredErrorFunc xmlSetStructuredErrorFunc__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlSetTreeDoc +extern __typeof (xmlSetTreeDoc) xmlSetTreeDoc __attribute((alias("xmlSetTreeDoc__internal_alias"))); +#else +#ifndef xmlSetTreeDoc +extern __typeof (xmlSetTreeDoc) xmlSetTreeDoc__internal_alias __attribute((visibility("hidden"))); +#define xmlSetTreeDoc xmlSetTreeDoc__internal_alias +#endif +#endif + +#if defined(LIBXML_SAX1_ENABLED) +#ifdef bottom_parser +#undef xmlSetupParserForBuffer +extern __typeof (xmlSetupParserForBuffer) xmlSetupParserForBuffer __attribute((alias("xmlSetupParserForBuffer__internal_alias"))); +#else +#ifndef xmlSetupParserForBuffer +extern __typeof (xmlSetupParserForBuffer) xmlSetupParserForBuffer__internal_alias __attribute((visibility("hidden"))); +#define xmlSetupParserForBuffer xmlSetupParserForBuffer__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_debugXML +#undef xmlShell +extern __typeof (xmlShell) xmlShell __attribute((alias("xmlShell__internal_alias"))); +#else +#ifndef xmlShell +extern __typeof (xmlShell) xmlShell__internal_alias __attribute((visibility("hidden"))); +#define xmlShell xmlShell__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_debugXML +#undef xmlShellBase +extern __typeof (xmlShellBase) xmlShellBase __attribute((alias("xmlShellBase__internal_alias"))); +#else +#ifndef xmlShellBase +extern __typeof (xmlShellBase) xmlShellBase__internal_alias __attribute((visibility("hidden"))); +#define xmlShellBase xmlShellBase__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_debugXML +#undef xmlShellCat +extern __typeof (xmlShellCat) xmlShellCat __attribute((alias("xmlShellCat__internal_alias"))); +#else +#ifndef xmlShellCat +extern __typeof (xmlShellCat) xmlShellCat__internal_alias __attribute((visibility("hidden"))); +#define xmlShellCat xmlShellCat__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_debugXML +#undef xmlShellDir +extern __typeof (xmlShellDir) xmlShellDir __attribute((alias("xmlShellDir__internal_alias"))); +#else +#ifndef xmlShellDir +extern __typeof (xmlShellDir) xmlShellDir__internal_alias __attribute((visibility("hidden"))); +#define xmlShellDir xmlShellDir__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_debugXML +#undef xmlShellDu +extern __typeof (xmlShellDu) xmlShellDu __attribute((alias("xmlShellDu__internal_alias"))); +#else +#ifndef xmlShellDu +extern __typeof (xmlShellDu) xmlShellDu__internal_alias __attribute((visibility("hidden"))); +#define xmlShellDu xmlShellDu__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_debugXML +#undef xmlShellList +extern __typeof (xmlShellList) xmlShellList __attribute((alias("xmlShellList__internal_alias"))); +#else +#ifndef xmlShellList +extern __typeof (xmlShellList) xmlShellList__internal_alias __attribute((visibility("hidden"))); +#define xmlShellList xmlShellList__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_debugXML +#undef xmlShellLoad +extern __typeof (xmlShellLoad) xmlShellLoad __attribute((alias("xmlShellLoad__internal_alias"))); +#else +#ifndef xmlShellLoad +extern __typeof (xmlShellLoad) xmlShellLoad__internal_alias __attribute((visibility("hidden"))); +#define xmlShellLoad xmlShellLoad__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_debugXML +#undef xmlShellPrintNode +extern __typeof (xmlShellPrintNode) xmlShellPrintNode __attribute((alias("xmlShellPrintNode__internal_alias"))); +#else +#ifndef xmlShellPrintNode +extern __typeof (xmlShellPrintNode) xmlShellPrintNode__internal_alias __attribute((visibility("hidden"))); +#define xmlShellPrintNode xmlShellPrintNode__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_debugXML +#undef xmlShellPrintXPathError +extern __typeof (xmlShellPrintXPathError) xmlShellPrintXPathError __attribute((alias("xmlShellPrintXPathError__internal_alias"))); +#else +#ifndef xmlShellPrintXPathError +extern __typeof (xmlShellPrintXPathError) xmlShellPrintXPathError__internal_alias __attribute((visibility("hidden"))); +#define xmlShellPrintXPathError xmlShellPrintXPathError__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_debugXML +#undef xmlShellPrintXPathResult +extern __typeof (xmlShellPrintXPathResult) xmlShellPrintXPathResult __attribute((alias("xmlShellPrintXPathResult__internal_alias"))); +#else +#ifndef xmlShellPrintXPathResult +extern __typeof (xmlShellPrintXPathResult) xmlShellPrintXPathResult__internal_alias __attribute((visibility("hidden"))); +#define xmlShellPrintXPathResult xmlShellPrintXPathResult__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_debugXML +#undef xmlShellPwd +extern __typeof (xmlShellPwd) xmlShellPwd __attribute((alias("xmlShellPwd__internal_alias"))); +#else +#ifndef xmlShellPwd +extern __typeof (xmlShellPwd) xmlShellPwd__internal_alias __attribute((visibility("hidden"))); +#define xmlShellPwd xmlShellPwd__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_debugXML +#undef xmlShellSave +extern __typeof (xmlShellSave) xmlShellSave __attribute((alias("xmlShellSave__internal_alias"))); +#else +#ifndef xmlShellSave +extern __typeof (xmlShellSave) xmlShellSave__internal_alias __attribute((visibility("hidden"))); +#define xmlShellSave xmlShellSave__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_VALID_ENABLED) +#ifdef bottom_debugXML +#undef xmlShellValidate +extern __typeof (xmlShellValidate) xmlShellValidate __attribute((alias("xmlShellValidate__internal_alias"))); +#else +#ifndef xmlShellValidate +extern __typeof (xmlShellValidate) xmlShellValidate__internal_alias __attribute((visibility("hidden"))); +#define xmlShellValidate xmlShellValidate__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_debugXML +#undef xmlShellWrite +extern __typeof (xmlShellWrite) xmlShellWrite __attribute((alias("xmlShellWrite__internal_alias"))); +#else +#ifndef xmlShellWrite +extern __typeof (xmlShellWrite) xmlShellWrite__internal_alias __attribute((visibility("hidden"))); +#define xmlShellWrite xmlShellWrite__internal_alias +#endif +#endif +#endif + +#ifdef bottom_parser +#undef xmlSkipBlankChars +extern __typeof (xmlSkipBlankChars) xmlSkipBlankChars __attribute((alias("xmlSkipBlankChars__internal_alias"))); +#else +#ifndef xmlSkipBlankChars +extern __typeof (xmlSkipBlankChars) xmlSkipBlankChars__internal_alias __attribute((visibility("hidden"))); +#define xmlSkipBlankChars xmlSkipBlankChars__internal_alias +#endif +#endif + +#ifdef bottom_valid +#undef xmlSnprintfElementContent +extern __typeof (xmlSnprintfElementContent) xmlSnprintfElementContent __attribute((alias("xmlSnprintfElementContent__internal_alias"))); +#else +#ifndef xmlSnprintfElementContent +extern __typeof (xmlSnprintfElementContent) xmlSnprintfElementContent__internal_alias __attribute((visibility("hidden"))); +#define xmlSnprintfElementContent xmlSnprintfElementContent__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlSplitQName +extern __typeof (xmlSplitQName) xmlSplitQName __attribute((alias("xmlSplitQName__internal_alias"))); +#else +#ifndef xmlSplitQName +extern __typeof (xmlSplitQName) xmlSplitQName__internal_alias __attribute((visibility("hidden"))); +#define xmlSplitQName xmlSplitQName__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlSplitQName2 +extern __typeof (xmlSplitQName2) xmlSplitQName2 __attribute((alias("xmlSplitQName2__internal_alias"))); +#else +#ifndef xmlSplitQName2 +extern __typeof (xmlSplitQName2) xmlSplitQName2__internal_alias __attribute((visibility("hidden"))); +#define xmlSplitQName2 xmlSplitQName2__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlSplitQName3 +extern __typeof (xmlSplitQName3) xmlSplitQName3 __attribute((alias("xmlSplitQName3__internal_alias"))); +#else +#ifndef xmlSplitQName3 +extern __typeof (xmlSplitQName3) xmlSplitQName3__internal_alias __attribute((visibility("hidden"))); +#define xmlSplitQName3 xmlSplitQName3__internal_alias +#endif +#endif + +#if defined(LIBXML_OUTPUT_ENABLED) +#ifdef bottom_valid +#undef xmlSprintfElementContent +extern __typeof (xmlSprintfElementContent) xmlSprintfElementContent __attribute((alias("xmlSprintfElementContent__internal_alias"))); +#else +#ifndef xmlSprintfElementContent +extern __typeof (xmlSprintfElementContent) xmlSprintfElementContent__internal_alias __attribute((visibility("hidden"))); +#define xmlSprintfElementContent xmlSprintfElementContent__internal_alias +#endif +#endif +#endif + +#ifdef bottom_parser +#undef xmlStopParser +extern __typeof (xmlStopParser) xmlStopParser __attribute((alias("xmlStopParser__internal_alias"))); +#else +#ifndef xmlStopParser +extern __typeof (xmlStopParser) xmlStopParser__internal_alias __attribute((visibility("hidden"))); +#define xmlStopParser xmlStopParser__internal_alias +#endif +#endif + +#ifdef bottom_xmlstring +#undef xmlStrEqual +extern __typeof (xmlStrEqual) xmlStrEqual __attribute((alias("xmlStrEqual__internal_alias"))); +#else +#ifndef xmlStrEqual +extern __typeof (xmlStrEqual) xmlStrEqual__internal_alias __attribute((visibility("hidden"))); +#define xmlStrEqual xmlStrEqual__internal_alias +#endif +#endif + +#ifdef bottom_xmlstring +#undef xmlStrPrintf +extern __typeof (xmlStrPrintf) xmlStrPrintf __attribute((alias("xmlStrPrintf__internal_alias"))); +#else +#ifndef xmlStrPrintf +extern __typeof (xmlStrPrintf) xmlStrPrintf__internal_alias __attribute((visibility("hidden"))); +#define xmlStrPrintf xmlStrPrintf__internal_alias +#endif +#endif + +#ifdef bottom_xmlstring +#undef xmlStrQEqual +extern __typeof (xmlStrQEqual) xmlStrQEqual __attribute((alias("xmlStrQEqual__internal_alias"))); +#else +#ifndef xmlStrQEqual +extern __typeof (xmlStrQEqual) xmlStrQEqual__internal_alias __attribute((visibility("hidden"))); +#define xmlStrQEqual xmlStrQEqual__internal_alias +#endif +#endif + +#ifdef bottom_xmlstring +#undef xmlStrVPrintf +extern __typeof (xmlStrVPrintf) xmlStrVPrintf __attribute((alias("xmlStrVPrintf__internal_alias"))); +#else +#ifndef xmlStrVPrintf +extern __typeof (xmlStrVPrintf) xmlStrVPrintf__internal_alias __attribute((visibility("hidden"))); +#define xmlStrVPrintf xmlStrVPrintf__internal_alias +#endif +#endif + +#ifdef bottom_xmlstring +#undef xmlStrcasecmp +extern __typeof (xmlStrcasecmp) xmlStrcasecmp __attribute((alias("xmlStrcasecmp__internal_alias"))); +#else +#ifndef xmlStrcasecmp +extern __typeof (xmlStrcasecmp) xmlStrcasecmp__internal_alias __attribute((visibility("hidden"))); +#define xmlStrcasecmp xmlStrcasecmp__internal_alias +#endif +#endif + +#ifdef bottom_xmlstring +#undef xmlStrcasestr +extern __typeof (xmlStrcasestr) xmlStrcasestr __attribute((alias("xmlStrcasestr__internal_alias"))); +#else +#ifndef xmlStrcasestr +extern __typeof (xmlStrcasestr) xmlStrcasestr__internal_alias __attribute((visibility("hidden"))); +#define xmlStrcasestr xmlStrcasestr__internal_alias +#endif +#endif + +#ifdef bottom_xmlstring +#undef xmlStrcat +extern __typeof (xmlStrcat) xmlStrcat __attribute((alias("xmlStrcat__internal_alias"))); +#else +#ifndef xmlStrcat +extern __typeof (xmlStrcat) xmlStrcat__internal_alias __attribute((visibility("hidden"))); +#define xmlStrcat xmlStrcat__internal_alias +#endif +#endif + +#ifdef bottom_xmlstring +#undef xmlStrchr +extern __typeof (xmlStrchr) xmlStrchr __attribute((alias("xmlStrchr__internal_alias"))); +#else +#ifndef xmlStrchr +extern __typeof (xmlStrchr) xmlStrchr__internal_alias __attribute((visibility("hidden"))); +#define xmlStrchr xmlStrchr__internal_alias +#endif +#endif + +#ifdef bottom_xmlstring +#undef xmlStrcmp +extern __typeof (xmlStrcmp) xmlStrcmp __attribute((alias("xmlStrcmp__internal_alias"))); +#else +#ifndef xmlStrcmp +extern __typeof (xmlStrcmp) xmlStrcmp__internal_alias __attribute((visibility("hidden"))); +#define xmlStrcmp xmlStrcmp__internal_alias +#endif +#endif + +#ifdef bottom_xmlstring +#undef xmlStrdup +extern __typeof (xmlStrdup) xmlStrdup __attribute((alias("xmlStrdup__internal_alias"))); +#else +#ifndef xmlStrdup +extern __typeof (xmlStrdup) xmlStrdup__internal_alias __attribute((visibility("hidden"))); +#define xmlStrdup xmlStrdup__internal_alias +#endif +#endif + +#if defined(LIBXML_PATTERN_ENABLED) +#ifdef bottom_pattern +#undef xmlStreamPop +extern __typeof (xmlStreamPop) xmlStreamPop __attribute((alias("xmlStreamPop__internal_alias"))); +#else +#ifndef xmlStreamPop +extern __typeof (xmlStreamPop) xmlStreamPop__internal_alias __attribute((visibility("hidden"))); +#define xmlStreamPop xmlStreamPop__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_PATTERN_ENABLED) +#ifdef bottom_pattern +#undef xmlStreamPush +extern __typeof (xmlStreamPush) xmlStreamPush __attribute((alias("xmlStreamPush__internal_alias"))); +#else +#ifndef xmlStreamPush +extern __typeof (xmlStreamPush) xmlStreamPush__internal_alias __attribute((visibility("hidden"))); +#define xmlStreamPush xmlStreamPush__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_PATTERN_ENABLED) +#ifdef bottom_pattern +#undef xmlStreamPushAttr +extern __typeof (xmlStreamPushAttr) xmlStreamPushAttr __attribute((alias("xmlStreamPushAttr__internal_alias"))); +#else +#ifndef xmlStreamPushAttr +extern __typeof (xmlStreamPushAttr) xmlStreamPushAttr__internal_alias __attribute((visibility("hidden"))); +#define xmlStreamPushAttr xmlStreamPushAttr__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_PATTERN_ENABLED) +#ifdef bottom_pattern +#undef xmlStreamPushNode +extern __typeof (xmlStreamPushNode) xmlStreamPushNode __attribute((alias("xmlStreamPushNode__internal_alias"))); +#else +#ifndef xmlStreamPushNode +extern __typeof (xmlStreamPushNode) xmlStreamPushNode__internal_alias __attribute((visibility("hidden"))); +#define xmlStreamPushNode xmlStreamPushNode__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_PATTERN_ENABLED) +#ifdef bottom_pattern +#undef xmlStreamWantsAnyNode +extern __typeof (xmlStreamWantsAnyNode) xmlStreamWantsAnyNode __attribute((alias("xmlStreamWantsAnyNode__internal_alias"))); +#else +#ifndef xmlStreamWantsAnyNode +extern __typeof (xmlStreamWantsAnyNode) xmlStreamWantsAnyNode__internal_alias __attribute((visibility("hidden"))); +#define xmlStreamWantsAnyNode xmlStreamWantsAnyNode__internal_alias +#endif +#endif +#endif + +#ifdef bottom_parserInternals +#undef xmlStringCurrentChar +extern __typeof (xmlStringCurrentChar) xmlStringCurrentChar __attribute((alias("xmlStringCurrentChar__internal_alias"))); +#else +#ifndef xmlStringCurrentChar +extern __typeof (xmlStringCurrentChar) xmlStringCurrentChar__internal_alias __attribute((visibility("hidden"))); +#define xmlStringCurrentChar xmlStringCurrentChar__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlStringDecodeEntities +extern __typeof (xmlStringDecodeEntities) xmlStringDecodeEntities __attribute((alias("xmlStringDecodeEntities__internal_alias"))); +#else +#ifndef xmlStringDecodeEntities +extern __typeof (xmlStringDecodeEntities) xmlStringDecodeEntities__internal_alias __attribute((visibility("hidden"))); +#define xmlStringDecodeEntities xmlStringDecodeEntities__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlStringGetNodeList +extern __typeof (xmlStringGetNodeList) xmlStringGetNodeList __attribute((alias("xmlStringGetNodeList__internal_alias"))); +#else +#ifndef xmlStringGetNodeList +extern __typeof (xmlStringGetNodeList) xmlStringGetNodeList__internal_alias __attribute((visibility("hidden"))); +#define xmlStringGetNodeList xmlStringGetNodeList__internal_alias +#endif +#endif + +#ifdef bottom_parser +#undef xmlStringLenDecodeEntities +extern __typeof (xmlStringLenDecodeEntities) xmlStringLenDecodeEntities __attribute((alias("xmlStringLenDecodeEntities__internal_alias"))); +#else +#ifndef xmlStringLenDecodeEntities +extern __typeof (xmlStringLenDecodeEntities) xmlStringLenDecodeEntities__internal_alias __attribute((visibility("hidden"))); +#define xmlStringLenDecodeEntities xmlStringLenDecodeEntities__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlStringLenGetNodeList +extern __typeof (xmlStringLenGetNodeList) xmlStringLenGetNodeList __attribute((alias("xmlStringLenGetNodeList__internal_alias"))); +#else +#ifndef xmlStringLenGetNodeList +extern __typeof (xmlStringLenGetNodeList) xmlStringLenGetNodeList__internal_alias __attribute((visibility("hidden"))); +#define xmlStringLenGetNodeList xmlStringLenGetNodeList__internal_alias +#endif +#endif + +#ifdef bottom_xmlstring +#undef xmlStrlen +extern __typeof (xmlStrlen) xmlStrlen __attribute((alias("xmlStrlen__internal_alias"))); +#else +#ifndef xmlStrlen +extern __typeof (xmlStrlen) xmlStrlen__internal_alias __attribute((visibility("hidden"))); +#define xmlStrlen xmlStrlen__internal_alias +#endif +#endif + +#ifdef bottom_xmlstring +#undef xmlStrncasecmp +extern __typeof (xmlStrncasecmp) xmlStrncasecmp __attribute((alias("xmlStrncasecmp__internal_alias"))); +#else +#ifndef xmlStrncasecmp +extern __typeof (xmlStrncasecmp) xmlStrncasecmp__internal_alias __attribute((visibility("hidden"))); +#define xmlStrncasecmp xmlStrncasecmp__internal_alias +#endif +#endif + +#ifdef bottom_xmlstring +#undef xmlStrncat +extern __typeof (xmlStrncat) xmlStrncat __attribute((alias("xmlStrncat__internal_alias"))); +#else +#ifndef xmlStrncat +extern __typeof (xmlStrncat) xmlStrncat__internal_alias __attribute((visibility("hidden"))); +#define xmlStrncat xmlStrncat__internal_alias +#endif +#endif + +#ifdef bottom_xmlstring +#undef xmlStrncatNew +extern __typeof (xmlStrncatNew) xmlStrncatNew __attribute((alias("xmlStrncatNew__internal_alias"))); +#else +#ifndef xmlStrncatNew +extern __typeof (xmlStrncatNew) xmlStrncatNew__internal_alias __attribute((visibility("hidden"))); +#define xmlStrncatNew xmlStrncatNew__internal_alias +#endif +#endif + +#ifdef bottom_xmlstring +#undef xmlStrncmp +extern __typeof (xmlStrncmp) xmlStrncmp __attribute((alias("xmlStrncmp__internal_alias"))); +#else +#ifndef xmlStrncmp +extern __typeof (xmlStrncmp) xmlStrncmp__internal_alias __attribute((visibility("hidden"))); +#define xmlStrncmp xmlStrncmp__internal_alias +#endif +#endif + +#ifdef bottom_xmlstring +#undef xmlStrndup +extern __typeof (xmlStrndup) xmlStrndup __attribute((alias("xmlStrndup__internal_alias"))); +#else +#ifndef xmlStrndup +extern __typeof (xmlStrndup) xmlStrndup__internal_alias __attribute((visibility("hidden"))); +#define xmlStrndup xmlStrndup__internal_alias +#endif +#endif + +#ifdef bottom_xmlstring +#undef xmlStrstr +extern __typeof (xmlStrstr) xmlStrstr __attribute((alias("xmlStrstr__internal_alias"))); +#else +#ifndef xmlStrstr +extern __typeof (xmlStrstr) xmlStrstr__internal_alias __attribute((visibility("hidden"))); +#define xmlStrstr xmlStrstr__internal_alias +#endif +#endif + +#ifdef bottom_xmlstring +#undef xmlStrsub +extern __typeof (xmlStrsub) xmlStrsub __attribute((alias("xmlStrsub__internal_alias"))); +#else +#ifndef xmlStrsub +extern __typeof (xmlStrsub) xmlStrsub__internal_alias __attribute((visibility("hidden"))); +#define xmlStrsub xmlStrsub__internal_alias +#endif +#endif + +#ifdef bottom_parserInternals +#undef xmlSubstituteEntitiesDefault +extern __typeof (xmlSubstituteEntitiesDefault) xmlSubstituteEntitiesDefault __attribute((alias("xmlSubstituteEntitiesDefault__internal_alias"))); +#else +#ifndef xmlSubstituteEntitiesDefault +extern __typeof (xmlSubstituteEntitiesDefault) xmlSubstituteEntitiesDefault__internal_alias __attribute((visibility("hidden"))); +#define xmlSubstituteEntitiesDefault xmlSubstituteEntitiesDefault__internal_alias +#endif +#endif + +#ifdef bottom_parserInternals +#undef xmlSwitchEncoding +extern __typeof (xmlSwitchEncoding) xmlSwitchEncoding __attribute((alias("xmlSwitchEncoding__internal_alias"))); +#else +#ifndef xmlSwitchEncoding +extern __typeof (xmlSwitchEncoding) xmlSwitchEncoding__internal_alias __attribute((visibility("hidden"))); +#define xmlSwitchEncoding xmlSwitchEncoding__internal_alias +#endif +#endif + +#ifdef bottom_parserInternals +#undef xmlSwitchInputEncoding +extern __typeof (xmlSwitchInputEncoding) xmlSwitchInputEncoding __attribute((alias("xmlSwitchInputEncoding__internal_alias"))); +#else +#ifndef xmlSwitchInputEncoding +extern __typeof (xmlSwitchInputEncoding) xmlSwitchInputEncoding__internal_alias __attribute((visibility("hidden"))); +#define xmlSwitchInputEncoding xmlSwitchInputEncoding__internal_alias +#endif +#endif + +#ifdef bottom_parserInternals +#undef xmlSwitchToEncoding +extern __typeof (xmlSwitchToEncoding) xmlSwitchToEncoding __attribute((alias("xmlSwitchToEncoding__internal_alias"))); +#else +#ifndef xmlSwitchToEncoding +extern __typeof (xmlSwitchToEncoding) xmlSwitchToEncoding__internal_alias __attribute((visibility("hidden"))); +#define xmlSwitchToEncoding xmlSwitchToEncoding__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlTextConcat +extern __typeof (xmlTextConcat) xmlTextConcat __attribute((alias("xmlTextConcat__internal_alias"))); +#else +#ifndef xmlTextConcat +extern __typeof (xmlTextConcat) xmlTextConcat__internal_alias __attribute((visibility("hidden"))); +#define xmlTextConcat xmlTextConcat__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlTextMerge +extern __typeof (xmlTextMerge) xmlTextMerge __attribute((alias("xmlTextMerge__internal_alias"))); +#else +#ifndef xmlTextMerge +extern __typeof (xmlTextMerge) xmlTextMerge__internal_alias __attribute((visibility("hidden"))); +#define xmlTextMerge xmlTextMerge__internal_alias +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderAttributeCount +extern __typeof (xmlTextReaderAttributeCount) xmlTextReaderAttributeCount __attribute((alias("xmlTextReaderAttributeCount__internal_alias"))); +#else +#ifndef xmlTextReaderAttributeCount +extern __typeof (xmlTextReaderAttributeCount) xmlTextReaderAttributeCount__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderAttributeCount xmlTextReaderAttributeCount__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderBaseUri +extern __typeof (xmlTextReaderBaseUri) xmlTextReaderBaseUri __attribute((alias("xmlTextReaderBaseUri__internal_alias"))); +#else +#ifndef xmlTextReaderBaseUri +extern __typeof (xmlTextReaderBaseUri) xmlTextReaderBaseUri__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderBaseUri xmlTextReaderBaseUri__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderByteConsumed +extern __typeof (xmlTextReaderByteConsumed) xmlTextReaderByteConsumed __attribute((alias("xmlTextReaderByteConsumed__internal_alias"))); +#else +#ifndef xmlTextReaderByteConsumed +extern __typeof (xmlTextReaderByteConsumed) xmlTextReaderByteConsumed__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderByteConsumed xmlTextReaderByteConsumed__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderClose +extern __typeof (xmlTextReaderClose) xmlTextReaderClose __attribute((alias("xmlTextReaderClose__internal_alias"))); +#else +#ifndef xmlTextReaderClose +extern __typeof (xmlTextReaderClose) xmlTextReaderClose__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderClose xmlTextReaderClose__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderConstBaseUri +extern __typeof (xmlTextReaderConstBaseUri) xmlTextReaderConstBaseUri __attribute((alias("xmlTextReaderConstBaseUri__internal_alias"))); +#else +#ifndef xmlTextReaderConstBaseUri +extern __typeof (xmlTextReaderConstBaseUri) xmlTextReaderConstBaseUri__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderConstBaseUri xmlTextReaderConstBaseUri__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderConstEncoding +extern __typeof (xmlTextReaderConstEncoding) xmlTextReaderConstEncoding __attribute((alias("xmlTextReaderConstEncoding__internal_alias"))); +#else +#ifndef xmlTextReaderConstEncoding +extern __typeof (xmlTextReaderConstEncoding) xmlTextReaderConstEncoding__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderConstEncoding xmlTextReaderConstEncoding__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderConstLocalName +extern __typeof (xmlTextReaderConstLocalName) xmlTextReaderConstLocalName __attribute((alias("xmlTextReaderConstLocalName__internal_alias"))); +#else +#ifndef xmlTextReaderConstLocalName +extern __typeof (xmlTextReaderConstLocalName) xmlTextReaderConstLocalName__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderConstLocalName xmlTextReaderConstLocalName__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderConstName +extern __typeof (xmlTextReaderConstName) xmlTextReaderConstName __attribute((alias("xmlTextReaderConstName__internal_alias"))); +#else +#ifndef xmlTextReaderConstName +extern __typeof (xmlTextReaderConstName) xmlTextReaderConstName__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderConstName xmlTextReaderConstName__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderConstNamespaceUri +extern __typeof (xmlTextReaderConstNamespaceUri) xmlTextReaderConstNamespaceUri __attribute((alias("xmlTextReaderConstNamespaceUri__internal_alias"))); +#else +#ifndef xmlTextReaderConstNamespaceUri +extern __typeof (xmlTextReaderConstNamespaceUri) xmlTextReaderConstNamespaceUri__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderConstNamespaceUri xmlTextReaderConstNamespaceUri__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderConstPrefix +extern __typeof (xmlTextReaderConstPrefix) xmlTextReaderConstPrefix __attribute((alias("xmlTextReaderConstPrefix__internal_alias"))); +#else +#ifndef xmlTextReaderConstPrefix +extern __typeof (xmlTextReaderConstPrefix) xmlTextReaderConstPrefix__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderConstPrefix xmlTextReaderConstPrefix__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderConstString +extern __typeof (xmlTextReaderConstString) xmlTextReaderConstString __attribute((alias("xmlTextReaderConstString__internal_alias"))); +#else +#ifndef xmlTextReaderConstString +extern __typeof (xmlTextReaderConstString) xmlTextReaderConstString__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderConstString xmlTextReaderConstString__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderConstValue +extern __typeof (xmlTextReaderConstValue) xmlTextReaderConstValue __attribute((alias("xmlTextReaderConstValue__internal_alias"))); +#else +#ifndef xmlTextReaderConstValue +extern __typeof (xmlTextReaderConstValue) xmlTextReaderConstValue__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderConstValue xmlTextReaderConstValue__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderConstXmlLang +extern __typeof (xmlTextReaderConstXmlLang) xmlTextReaderConstXmlLang __attribute((alias("xmlTextReaderConstXmlLang__internal_alias"))); +#else +#ifndef xmlTextReaderConstXmlLang +extern __typeof (xmlTextReaderConstXmlLang) xmlTextReaderConstXmlLang__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderConstXmlLang xmlTextReaderConstXmlLang__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderConstXmlVersion +extern __typeof (xmlTextReaderConstXmlVersion) xmlTextReaderConstXmlVersion __attribute((alias("xmlTextReaderConstXmlVersion__internal_alias"))); +#else +#ifndef xmlTextReaderConstXmlVersion +extern __typeof (xmlTextReaderConstXmlVersion) xmlTextReaderConstXmlVersion__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderConstXmlVersion xmlTextReaderConstXmlVersion__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderCurrentDoc +extern __typeof (xmlTextReaderCurrentDoc) xmlTextReaderCurrentDoc __attribute((alias("xmlTextReaderCurrentDoc__internal_alias"))); +#else +#ifndef xmlTextReaderCurrentDoc +extern __typeof (xmlTextReaderCurrentDoc) xmlTextReaderCurrentDoc__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderCurrentDoc xmlTextReaderCurrentDoc__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderCurrentNode +extern __typeof (xmlTextReaderCurrentNode) xmlTextReaderCurrentNode __attribute((alias("xmlTextReaderCurrentNode__internal_alias"))); +#else +#ifndef xmlTextReaderCurrentNode +extern __typeof (xmlTextReaderCurrentNode) xmlTextReaderCurrentNode__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderCurrentNode xmlTextReaderCurrentNode__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderDepth +extern __typeof (xmlTextReaderDepth) xmlTextReaderDepth __attribute((alias("xmlTextReaderDepth__internal_alias"))); +#else +#ifndef xmlTextReaderDepth +extern __typeof (xmlTextReaderDepth) xmlTextReaderDepth__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderDepth xmlTextReaderDepth__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderExpand +extern __typeof (xmlTextReaderExpand) xmlTextReaderExpand __attribute((alias("xmlTextReaderExpand__internal_alias"))); +#else +#ifndef xmlTextReaderExpand +extern __typeof (xmlTextReaderExpand) xmlTextReaderExpand__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderExpand xmlTextReaderExpand__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderGetAttribute +extern __typeof (xmlTextReaderGetAttribute) xmlTextReaderGetAttribute __attribute((alias("xmlTextReaderGetAttribute__internal_alias"))); +#else +#ifndef xmlTextReaderGetAttribute +extern __typeof (xmlTextReaderGetAttribute) xmlTextReaderGetAttribute__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderGetAttribute xmlTextReaderGetAttribute__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderGetAttributeNo +extern __typeof (xmlTextReaderGetAttributeNo) xmlTextReaderGetAttributeNo __attribute((alias("xmlTextReaderGetAttributeNo__internal_alias"))); +#else +#ifndef xmlTextReaderGetAttributeNo +extern __typeof (xmlTextReaderGetAttributeNo) xmlTextReaderGetAttributeNo__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderGetAttributeNo xmlTextReaderGetAttributeNo__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderGetAttributeNs +extern __typeof (xmlTextReaderGetAttributeNs) xmlTextReaderGetAttributeNs __attribute((alias("xmlTextReaderGetAttributeNs__internal_alias"))); +#else +#ifndef xmlTextReaderGetAttributeNs +extern __typeof (xmlTextReaderGetAttributeNs) xmlTextReaderGetAttributeNs__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderGetAttributeNs xmlTextReaderGetAttributeNs__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderGetErrorHandler +extern __typeof (xmlTextReaderGetErrorHandler) xmlTextReaderGetErrorHandler __attribute((alias("xmlTextReaderGetErrorHandler__internal_alias"))); +#else +#ifndef xmlTextReaderGetErrorHandler +extern __typeof (xmlTextReaderGetErrorHandler) xmlTextReaderGetErrorHandler__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderGetErrorHandler xmlTextReaderGetErrorHandler__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderGetParserColumnNumber +extern __typeof (xmlTextReaderGetParserColumnNumber) xmlTextReaderGetParserColumnNumber __attribute((alias("xmlTextReaderGetParserColumnNumber__internal_alias"))); +#else +#ifndef xmlTextReaderGetParserColumnNumber +extern __typeof (xmlTextReaderGetParserColumnNumber) xmlTextReaderGetParserColumnNumber__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderGetParserColumnNumber xmlTextReaderGetParserColumnNumber__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderGetParserLineNumber +extern __typeof (xmlTextReaderGetParserLineNumber) xmlTextReaderGetParserLineNumber __attribute((alias("xmlTextReaderGetParserLineNumber__internal_alias"))); +#else +#ifndef xmlTextReaderGetParserLineNumber +extern __typeof (xmlTextReaderGetParserLineNumber) xmlTextReaderGetParserLineNumber__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderGetParserLineNumber xmlTextReaderGetParserLineNumber__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderGetParserProp +extern __typeof (xmlTextReaderGetParserProp) xmlTextReaderGetParserProp __attribute((alias("xmlTextReaderGetParserProp__internal_alias"))); +#else +#ifndef xmlTextReaderGetParserProp +extern __typeof (xmlTextReaderGetParserProp) xmlTextReaderGetParserProp__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderGetParserProp xmlTextReaderGetParserProp__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderGetRemainder +extern __typeof (xmlTextReaderGetRemainder) xmlTextReaderGetRemainder __attribute((alias("xmlTextReaderGetRemainder__internal_alias"))); +#else +#ifndef xmlTextReaderGetRemainder +extern __typeof (xmlTextReaderGetRemainder) xmlTextReaderGetRemainder__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderGetRemainder xmlTextReaderGetRemainder__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderHasAttributes +extern __typeof (xmlTextReaderHasAttributes) xmlTextReaderHasAttributes __attribute((alias("xmlTextReaderHasAttributes__internal_alias"))); +#else +#ifndef xmlTextReaderHasAttributes +extern __typeof (xmlTextReaderHasAttributes) xmlTextReaderHasAttributes__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderHasAttributes xmlTextReaderHasAttributes__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderHasValue +extern __typeof (xmlTextReaderHasValue) xmlTextReaderHasValue __attribute((alias("xmlTextReaderHasValue__internal_alias"))); +#else +#ifndef xmlTextReaderHasValue +extern __typeof (xmlTextReaderHasValue) xmlTextReaderHasValue__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderHasValue xmlTextReaderHasValue__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderIsDefault +extern __typeof (xmlTextReaderIsDefault) xmlTextReaderIsDefault __attribute((alias("xmlTextReaderIsDefault__internal_alias"))); +#else +#ifndef xmlTextReaderIsDefault +extern __typeof (xmlTextReaderIsDefault) xmlTextReaderIsDefault__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderIsDefault xmlTextReaderIsDefault__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderIsEmptyElement +extern __typeof (xmlTextReaderIsEmptyElement) xmlTextReaderIsEmptyElement __attribute((alias("xmlTextReaderIsEmptyElement__internal_alias"))); +#else +#ifndef xmlTextReaderIsEmptyElement +extern __typeof (xmlTextReaderIsEmptyElement) xmlTextReaderIsEmptyElement__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderIsEmptyElement xmlTextReaderIsEmptyElement__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderIsNamespaceDecl +extern __typeof (xmlTextReaderIsNamespaceDecl) xmlTextReaderIsNamespaceDecl __attribute((alias("xmlTextReaderIsNamespaceDecl__internal_alias"))); +#else +#ifndef xmlTextReaderIsNamespaceDecl +extern __typeof (xmlTextReaderIsNamespaceDecl) xmlTextReaderIsNamespaceDecl__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderIsNamespaceDecl xmlTextReaderIsNamespaceDecl__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderIsValid +extern __typeof (xmlTextReaderIsValid) xmlTextReaderIsValid __attribute((alias("xmlTextReaderIsValid__internal_alias"))); +#else +#ifndef xmlTextReaderIsValid +extern __typeof (xmlTextReaderIsValid) xmlTextReaderIsValid__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderIsValid xmlTextReaderIsValid__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderLocalName +extern __typeof (xmlTextReaderLocalName) xmlTextReaderLocalName __attribute((alias("xmlTextReaderLocalName__internal_alias"))); +#else +#ifndef xmlTextReaderLocalName +extern __typeof (xmlTextReaderLocalName) xmlTextReaderLocalName__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderLocalName xmlTextReaderLocalName__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderLocatorBaseURI +extern __typeof (xmlTextReaderLocatorBaseURI) xmlTextReaderLocatorBaseURI __attribute((alias("xmlTextReaderLocatorBaseURI__internal_alias"))); +#else +#ifndef xmlTextReaderLocatorBaseURI +extern __typeof (xmlTextReaderLocatorBaseURI) xmlTextReaderLocatorBaseURI__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderLocatorBaseURI xmlTextReaderLocatorBaseURI__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderLocatorLineNumber +extern __typeof (xmlTextReaderLocatorLineNumber) xmlTextReaderLocatorLineNumber __attribute((alias("xmlTextReaderLocatorLineNumber__internal_alias"))); +#else +#ifndef xmlTextReaderLocatorLineNumber +extern __typeof (xmlTextReaderLocatorLineNumber) xmlTextReaderLocatorLineNumber__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderLocatorLineNumber xmlTextReaderLocatorLineNumber__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderLookupNamespace +extern __typeof (xmlTextReaderLookupNamespace) xmlTextReaderLookupNamespace __attribute((alias("xmlTextReaderLookupNamespace__internal_alias"))); +#else +#ifndef xmlTextReaderLookupNamespace +extern __typeof (xmlTextReaderLookupNamespace) xmlTextReaderLookupNamespace__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderLookupNamespace xmlTextReaderLookupNamespace__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderMoveToAttribute +extern __typeof (xmlTextReaderMoveToAttribute) xmlTextReaderMoveToAttribute __attribute((alias("xmlTextReaderMoveToAttribute__internal_alias"))); +#else +#ifndef xmlTextReaderMoveToAttribute +extern __typeof (xmlTextReaderMoveToAttribute) xmlTextReaderMoveToAttribute__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderMoveToAttribute xmlTextReaderMoveToAttribute__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderMoveToAttributeNo +extern __typeof (xmlTextReaderMoveToAttributeNo) xmlTextReaderMoveToAttributeNo __attribute((alias("xmlTextReaderMoveToAttributeNo__internal_alias"))); +#else +#ifndef xmlTextReaderMoveToAttributeNo +extern __typeof (xmlTextReaderMoveToAttributeNo) xmlTextReaderMoveToAttributeNo__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderMoveToAttributeNo xmlTextReaderMoveToAttributeNo__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderMoveToAttributeNs +extern __typeof (xmlTextReaderMoveToAttributeNs) xmlTextReaderMoveToAttributeNs __attribute((alias("xmlTextReaderMoveToAttributeNs__internal_alias"))); +#else +#ifndef xmlTextReaderMoveToAttributeNs +extern __typeof (xmlTextReaderMoveToAttributeNs) xmlTextReaderMoveToAttributeNs__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderMoveToAttributeNs xmlTextReaderMoveToAttributeNs__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderMoveToElement +extern __typeof (xmlTextReaderMoveToElement) xmlTextReaderMoveToElement __attribute((alias("xmlTextReaderMoveToElement__internal_alias"))); +#else +#ifndef xmlTextReaderMoveToElement +extern __typeof (xmlTextReaderMoveToElement) xmlTextReaderMoveToElement__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderMoveToElement xmlTextReaderMoveToElement__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderMoveToFirstAttribute +extern __typeof (xmlTextReaderMoveToFirstAttribute) xmlTextReaderMoveToFirstAttribute __attribute((alias("xmlTextReaderMoveToFirstAttribute__internal_alias"))); +#else +#ifndef xmlTextReaderMoveToFirstAttribute +extern __typeof (xmlTextReaderMoveToFirstAttribute) xmlTextReaderMoveToFirstAttribute__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderMoveToFirstAttribute xmlTextReaderMoveToFirstAttribute__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderMoveToNextAttribute +extern __typeof (xmlTextReaderMoveToNextAttribute) xmlTextReaderMoveToNextAttribute __attribute((alias("xmlTextReaderMoveToNextAttribute__internal_alias"))); +#else +#ifndef xmlTextReaderMoveToNextAttribute +extern __typeof (xmlTextReaderMoveToNextAttribute) xmlTextReaderMoveToNextAttribute__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderMoveToNextAttribute xmlTextReaderMoveToNextAttribute__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderName +extern __typeof (xmlTextReaderName) xmlTextReaderName __attribute((alias("xmlTextReaderName__internal_alias"))); +#else +#ifndef xmlTextReaderName +extern __typeof (xmlTextReaderName) xmlTextReaderName__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderName xmlTextReaderName__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderNamespaceUri +extern __typeof (xmlTextReaderNamespaceUri) xmlTextReaderNamespaceUri __attribute((alias("xmlTextReaderNamespaceUri__internal_alias"))); +#else +#ifndef xmlTextReaderNamespaceUri +extern __typeof (xmlTextReaderNamespaceUri) xmlTextReaderNamespaceUri__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderNamespaceUri xmlTextReaderNamespaceUri__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderNext +extern __typeof (xmlTextReaderNext) xmlTextReaderNext __attribute((alias("xmlTextReaderNext__internal_alias"))); +#else +#ifndef xmlTextReaderNext +extern __typeof (xmlTextReaderNext) xmlTextReaderNext__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderNext xmlTextReaderNext__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderNextSibling +extern __typeof (xmlTextReaderNextSibling) xmlTextReaderNextSibling __attribute((alias("xmlTextReaderNextSibling__internal_alias"))); +#else +#ifndef xmlTextReaderNextSibling +extern __typeof (xmlTextReaderNextSibling) xmlTextReaderNextSibling__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderNextSibling xmlTextReaderNextSibling__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderNodeType +extern __typeof (xmlTextReaderNodeType) xmlTextReaderNodeType __attribute((alias("xmlTextReaderNodeType__internal_alias"))); +#else +#ifndef xmlTextReaderNodeType +extern __typeof (xmlTextReaderNodeType) xmlTextReaderNodeType__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderNodeType xmlTextReaderNodeType__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderNormalization +extern __typeof (xmlTextReaderNormalization) xmlTextReaderNormalization __attribute((alias("xmlTextReaderNormalization__internal_alias"))); +#else +#ifndef xmlTextReaderNormalization +extern __typeof (xmlTextReaderNormalization) xmlTextReaderNormalization__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderNormalization xmlTextReaderNormalization__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderPrefix +extern __typeof (xmlTextReaderPrefix) xmlTextReaderPrefix __attribute((alias("xmlTextReaderPrefix__internal_alias"))); +#else +#ifndef xmlTextReaderPrefix +extern __typeof (xmlTextReaderPrefix) xmlTextReaderPrefix__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderPrefix xmlTextReaderPrefix__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderPreserve +extern __typeof (xmlTextReaderPreserve) xmlTextReaderPreserve __attribute((alias("xmlTextReaderPreserve__internal_alias"))); +#else +#ifndef xmlTextReaderPreserve +extern __typeof (xmlTextReaderPreserve) xmlTextReaderPreserve__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderPreserve xmlTextReaderPreserve__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) && defined(LIBXML_PATTERN_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderPreservePattern +extern __typeof (xmlTextReaderPreservePattern) xmlTextReaderPreservePattern __attribute((alias("xmlTextReaderPreservePattern__internal_alias"))); +#else +#ifndef xmlTextReaderPreservePattern +extern __typeof (xmlTextReaderPreservePattern) xmlTextReaderPreservePattern__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderPreservePattern xmlTextReaderPreservePattern__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderQuoteChar +extern __typeof (xmlTextReaderQuoteChar) xmlTextReaderQuoteChar __attribute((alias("xmlTextReaderQuoteChar__internal_alias"))); +#else +#ifndef xmlTextReaderQuoteChar +extern __typeof (xmlTextReaderQuoteChar) xmlTextReaderQuoteChar__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderQuoteChar xmlTextReaderQuoteChar__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderRead +extern __typeof (xmlTextReaderRead) xmlTextReaderRead __attribute((alias("xmlTextReaderRead__internal_alias"))); +#else +#ifndef xmlTextReaderRead +extern __typeof (xmlTextReaderRead) xmlTextReaderRead__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderRead xmlTextReaderRead__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderReadAttributeValue +extern __typeof (xmlTextReaderReadAttributeValue) xmlTextReaderReadAttributeValue __attribute((alias("xmlTextReaderReadAttributeValue__internal_alias"))); +#else +#ifndef xmlTextReaderReadAttributeValue +extern __typeof (xmlTextReaderReadAttributeValue) xmlTextReaderReadAttributeValue__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderReadAttributeValue xmlTextReaderReadAttributeValue__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) && defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderReadInnerXml +extern __typeof (xmlTextReaderReadInnerXml) xmlTextReaderReadInnerXml __attribute((alias("xmlTextReaderReadInnerXml__internal_alias"))); +#else +#ifndef xmlTextReaderReadInnerXml +extern __typeof (xmlTextReaderReadInnerXml) xmlTextReaderReadInnerXml__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderReadInnerXml xmlTextReaderReadInnerXml__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) && defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderReadOuterXml +extern __typeof (xmlTextReaderReadOuterXml) xmlTextReaderReadOuterXml __attribute((alias("xmlTextReaderReadOuterXml__internal_alias"))); +#else +#ifndef xmlTextReaderReadOuterXml +extern __typeof (xmlTextReaderReadOuterXml) xmlTextReaderReadOuterXml__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderReadOuterXml xmlTextReaderReadOuterXml__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderReadState +extern __typeof (xmlTextReaderReadState) xmlTextReaderReadState __attribute((alias("xmlTextReaderReadState__internal_alias"))); +#else +#ifndef xmlTextReaderReadState +extern __typeof (xmlTextReaderReadState) xmlTextReaderReadState__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderReadState xmlTextReaderReadState__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderReadString +extern __typeof (xmlTextReaderReadString) xmlTextReaderReadString __attribute((alias("xmlTextReaderReadString__internal_alias"))); +#else +#ifndef xmlTextReaderReadString +extern __typeof (xmlTextReaderReadString) xmlTextReaderReadString__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderReadString xmlTextReaderReadString__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) && defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderRelaxNGSetSchema +extern __typeof (xmlTextReaderRelaxNGSetSchema) xmlTextReaderRelaxNGSetSchema __attribute((alias("xmlTextReaderRelaxNGSetSchema__internal_alias"))); +#else +#ifndef xmlTextReaderRelaxNGSetSchema +extern __typeof (xmlTextReaderRelaxNGSetSchema) xmlTextReaderRelaxNGSetSchema__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderRelaxNGSetSchema xmlTextReaderRelaxNGSetSchema__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) && defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderRelaxNGValidate +extern __typeof (xmlTextReaderRelaxNGValidate) xmlTextReaderRelaxNGValidate __attribute((alias("xmlTextReaderRelaxNGValidate__internal_alias"))); +#else +#ifndef xmlTextReaderRelaxNGValidate +extern __typeof (xmlTextReaderRelaxNGValidate) xmlTextReaderRelaxNGValidate__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderRelaxNGValidate xmlTextReaderRelaxNGValidate__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) && defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderRelaxNGValidateCtxt +extern __typeof (xmlTextReaderRelaxNGValidateCtxt) xmlTextReaderRelaxNGValidateCtxt __attribute((alias("xmlTextReaderRelaxNGValidateCtxt__internal_alias"))); +#else +#ifndef xmlTextReaderRelaxNGValidateCtxt +extern __typeof (xmlTextReaderRelaxNGValidateCtxt) xmlTextReaderRelaxNGValidateCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderRelaxNGValidateCtxt xmlTextReaderRelaxNGValidateCtxt__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) && defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderSchemaValidate +extern __typeof (xmlTextReaderSchemaValidate) xmlTextReaderSchemaValidate __attribute((alias("xmlTextReaderSchemaValidate__internal_alias"))); +#else +#ifndef xmlTextReaderSchemaValidate +extern __typeof (xmlTextReaderSchemaValidate) xmlTextReaderSchemaValidate__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderSchemaValidate xmlTextReaderSchemaValidate__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) && defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderSchemaValidateCtxt +extern __typeof (xmlTextReaderSchemaValidateCtxt) xmlTextReaderSchemaValidateCtxt __attribute((alias("xmlTextReaderSchemaValidateCtxt__internal_alias"))); +#else +#ifndef xmlTextReaderSchemaValidateCtxt +extern __typeof (xmlTextReaderSchemaValidateCtxt) xmlTextReaderSchemaValidateCtxt__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderSchemaValidateCtxt xmlTextReaderSchemaValidateCtxt__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderSetErrorHandler +extern __typeof (xmlTextReaderSetErrorHandler) xmlTextReaderSetErrorHandler __attribute((alias("xmlTextReaderSetErrorHandler__internal_alias"))); +#else +#ifndef xmlTextReaderSetErrorHandler +extern __typeof (xmlTextReaderSetErrorHandler) xmlTextReaderSetErrorHandler__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderSetErrorHandler xmlTextReaderSetErrorHandler__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderSetParserProp +extern __typeof (xmlTextReaderSetParserProp) xmlTextReaderSetParserProp __attribute((alias("xmlTextReaderSetParserProp__internal_alias"))); +#else +#ifndef xmlTextReaderSetParserProp +extern __typeof (xmlTextReaderSetParserProp) xmlTextReaderSetParserProp__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderSetParserProp xmlTextReaderSetParserProp__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) && defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderSetSchema +extern __typeof (xmlTextReaderSetSchema) xmlTextReaderSetSchema __attribute((alias("xmlTextReaderSetSchema__internal_alias"))); +#else +#ifndef xmlTextReaderSetSchema +extern __typeof (xmlTextReaderSetSchema) xmlTextReaderSetSchema__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderSetSchema xmlTextReaderSetSchema__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderSetStructuredErrorHandler +extern __typeof (xmlTextReaderSetStructuredErrorHandler) xmlTextReaderSetStructuredErrorHandler __attribute((alias("xmlTextReaderSetStructuredErrorHandler__internal_alias"))); +#else +#ifndef xmlTextReaderSetStructuredErrorHandler +extern __typeof (xmlTextReaderSetStructuredErrorHandler) xmlTextReaderSetStructuredErrorHandler__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderSetStructuredErrorHandler xmlTextReaderSetStructuredErrorHandler__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderSetup +extern __typeof (xmlTextReaderSetup) xmlTextReaderSetup __attribute((alias("xmlTextReaderSetup__internal_alias"))); +#else +#ifndef xmlTextReaderSetup +extern __typeof (xmlTextReaderSetup) xmlTextReaderSetup__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderSetup xmlTextReaderSetup__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderStandalone +extern __typeof (xmlTextReaderStandalone) xmlTextReaderStandalone __attribute((alias("xmlTextReaderStandalone__internal_alias"))); +#else +#ifndef xmlTextReaderStandalone +extern __typeof (xmlTextReaderStandalone) xmlTextReaderStandalone__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderStandalone xmlTextReaderStandalone__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderValue +extern __typeof (xmlTextReaderValue) xmlTextReaderValue __attribute((alias("xmlTextReaderValue__internal_alias"))); +#else +#ifndef xmlTextReaderValue +extern __typeof (xmlTextReaderValue) xmlTextReaderValue__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderValue xmlTextReaderValue__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_READER_ENABLED) +#ifdef bottom_xmlreader +#undef xmlTextReaderXmlLang +extern __typeof (xmlTextReaderXmlLang) xmlTextReaderXmlLang __attribute((alias("xmlTextReaderXmlLang__internal_alias"))); +#else +#ifndef xmlTextReaderXmlLang +extern __typeof (xmlTextReaderXmlLang) xmlTextReaderXmlLang__internal_alias __attribute((visibility("hidden"))); +#define xmlTextReaderXmlLang xmlTextReaderXmlLang__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterEndAttribute +extern __typeof (xmlTextWriterEndAttribute) xmlTextWriterEndAttribute __attribute((alias("xmlTextWriterEndAttribute__internal_alias"))); +#else +#ifndef xmlTextWriterEndAttribute +extern __typeof (xmlTextWriterEndAttribute) xmlTextWriterEndAttribute__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterEndAttribute xmlTextWriterEndAttribute__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterEndCDATA +extern __typeof (xmlTextWriterEndCDATA) xmlTextWriterEndCDATA __attribute((alias("xmlTextWriterEndCDATA__internal_alias"))); +#else +#ifndef xmlTextWriterEndCDATA +extern __typeof (xmlTextWriterEndCDATA) xmlTextWriterEndCDATA__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterEndCDATA xmlTextWriterEndCDATA__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterEndComment +extern __typeof (xmlTextWriterEndComment) xmlTextWriterEndComment __attribute((alias("xmlTextWriterEndComment__internal_alias"))); +#else +#ifndef xmlTextWriterEndComment +extern __typeof (xmlTextWriterEndComment) xmlTextWriterEndComment__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterEndComment xmlTextWriterEndComment__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterEndDTD +extern __typeof (xmlTextWriterEndDTD) xmlTextWriterEndDTD __attribute((alias("xmlTextWriterEndDTD__internal_alias"))); +#else +#ifndef xmlTextWriterEndDTD +extern __typeof (xmlTextWriterEndDTD) xmlTextWriterEndDTD__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterEndDTD xmlTextWriterEndDTD__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterEndDTDAttlist +extern __typeof (xmlTextWriterEndDTDAttlist) xmlTextWriterEndDTDAttlist __attribute((alias("xmlTextWriterEndDTDAttlist__internal_alias"))); +#else +#ifndef xmlTextWriterEndDTDAttlist +extern __typeof (xmlTextWriterEndDTDAttlist) xmlTextWriterEndDTDAttlist__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterEndDTDAttlist xmlTextWriterEndDTDAttlist__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterEndDTDElement +extern __typeof (xmlTextWriterEndDTDElement) xmlTextWriterEndDTDElement __attribute((alias("xmlTextWriterEndDTDElement__internal_alias"))); +#else +#ifndef xmlTextWriterEndDTDElement +extern __typeof (xmlTextWriterEndDTDElement) xmlTextWriterEndDTDElement__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterEndDTDElement xmlTextWriterEndDTDElement__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterEndDTDEntity +extern __typeof (xmlTextWriterEndDTDEntity) xmlTextWriterEndDTDEntity __attribute((alias("xmlTextWriterEndDTDEntity__internal_alias"))); +#else +#ifndef xmlTextWriterEndDTDEntity +extern __typeof (xmlTextWriterEndDTDEntity) xmlTextWriterEndDTDEntity__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterEndDTDEntity xmlTextWriterEndDTDEntity__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterEndDocument +extern __typeof (xmlTextWriterEndDocument) xmlTextWriterEndDocument __attribute((alias("xmlTextWriterEndDocument__internal_alias"))); +#else +#ifndef xmlTextWriterEndDocument +extern __typeof (xmlTextWriterEndDocument) xmlTextWriterEndDocument__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterEndDocument xmlTextWriterEndDocument__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterEndElement +extern __typeof (xmlTextWriterEndElement) xmlTextWriterEndElement __attribute((alias("xmlTextWriterEndElement__internal_alias"))); +#else +#ifndef xmlTextWriterEndElement +extern __typeof (xmlTextWriterEndElement) xmlTextWriterEndElement__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterEndElement xmlTextWriterEndElement__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterEndPI +extern __typeof (xmlTextWriterEndPI) xmlTextWriterEndPI __attribute((alias("xmlTextWriterEndPI__internal_alias"))); +#else +#ifndef xmlTextWriterEndPI +extern __typeof (xmlTextWriterEndPI) xmlTextWriterEndPI__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterEndPI xmlTextWriterEndPI__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterFlush +extern __typeof (xmlTextWriterFlush) xmlTextWriterFlush __attribute((alias("xmlTextWriterFlush__internal_alias"))); +#else +#ifndef xmlTextWriterFlush +extern __typeof (xmlTextWriterFlush) xmlTextWriterFlush__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterFlush xmlTextWriterFlush__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterFullEndElement +extern __typeof (xmlTextWriterFullEndElement) xmlTextWriterFullEndElement __attribute((alias("xmlTextWriterFullEndElement__internal_alias"))); +#else +#ifndef xmlTextWriterFullEndElement +extern __typeof (xmlTextWriterFullEndElement) xmlTextWriterFullEndElement__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterFullEndElement xmlTextWriterFullEndElement__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterSetIndent +extern __typeof (xmlTextWriterSetIndent) xmlTextWriterSetIndent __attribute((alias("xmlTextWriterSetIndent__internal_alias"))); +#else +#ifndef xmlTextWriterSetIndent +extern __typeof (xmlTextWriterSetIndent) xmlTextWriterSetIndent__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterSetIndent xmlTextWriterSetIndent__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterSetIndentString +extern __typeof (xmlTextWriterSetIndentString) xmlTextWriterSetIndentString __attribute((alias("xmlTextWriterSetIndentString__internal_alias"))); +#else +#ifndef xmlTextWriterSetIndentString +extern __typeof (xmlTextWriterSetIndentString) xmlTextWriterSetIndentString__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterSetIndentString xmlTextWriterSetIndentString__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterSetQuoteChar +extern __typeof (xmlTextWriterSetQuoteChar) xmlTextWriterSetQuoteChar __attribute((alias("xmlTextWriterSetQuoteChar__internal_alias"))); +#else +#ifndef xmlTextWriterSetQuoteChar +extern __typeof (xmlTextWriterSetQuoteChar) xmlTextWriterSetQuoteChar__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterSetQuoteChar xmlTextWriterSetQuoteChar__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterStartAttribute +extern __typeof (xmlTextWriterStartAttribute) xmlTextWriterStartAttribute __attribute((alias("xmlTextWriterStartAttribute__internal_alias"))); +#else +#ifndef xmlTextWriterStartAttribute +extern __typeof (xmlTextWriterStartAttribute) xmlTextWriterStartAttribute__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterStartAttribute xmlTextWriterStartAttribute__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterStartAttributeNS +extern __typeof (xmlTextWriterStartAttributeNS) xmlTextWriterStartAttributeNS __attribute((alias("xmlTextWriterStartAttributeNS__internal_alias"))); +#else +#ifndef xmlTextWriterStartAttributeNS +extern __typeof (xmlTextWriterStartAttributeNS) xmlTextWriterStartAttributeNS__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterStartAttributeNS xmlTextWriterStartAttributeNS__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterStartCDATA +extern __typeof (xmlTextWriterStartCDATA) xmlTextWriterStartCDATA __attribute((alias("xmlTextWriterStartCDATA__internal_alias"))); +#else +#ifndef xmlTextWriterStartCDATA +extern __typeof (xmlTextWriterStartCDATA) xmlTextWriterStartCDATA__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterStartCDATA xmlTextWriterStartCDATA__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterStartComment +extern __typeof (xmlTextWriterStartComment) xmlTextWriterStartComment __attribute((alias("xmlTextWriterStartComment__internal_alias"))); +#else +#ifndef xmlTextWriterStartComment +extern __typeof (xmlTextWriterStartComment) xmlTextWriterStartComment__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterStartComment xmlTextWriterStartComment__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterStartDTD +extern __typeof (xmlTextWriterStartDTD) xmlTextWriterStartDTD __attribute((alias("xmlTextWriterStartDTD__internal_alias"))); +#else +#ifndef xmlTextWriterStartDTD +extern __typeof (xmlTextWriterStartDTD) xmlTextWriterStartDTD__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterStartDTD xmlTextWriterStartDTD__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterStartDTDAttlist +extern __typeof (xmlTextWriterStartDTDAttlist) xmlTextWriterStartDTDAttlist __attribute((alias("xmlTextWriterStartDTDAttlist__internal_alias"))); +#else +#ifndef xmlTextWriterStartDTDAttlist +extern __typeof (xmlTextWriterStartDTDAttlist) xmlTextWriterStartDTDAttlist__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterStartDTDAttlist xmlTextWriterStartDTDAttlist__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterStartDTDElement +extern __typeof (xmlTextWriterStartDTDElement) xmlTextWriterStartDTDElement __attribute((alias("xmlTextWriterStartDTDElement__internal_alias"))); +#else +#ifndef xmlTextWriterStartDTDElement +extern __typeof (xmlTextWriterStartDTDElement) xmlTextWriterStartDTDElement__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterStartDTDElement xmlTextWriterStartDTDElement__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterStartDTDEntity +extern __typeof (xmlTextWriterStartDTDEntity) xmlTextWriterStartDTDEntity __attribute((alias("xmlTextWriterStartDTDEntity__internal_alias"))); +#else +#ifndef xmlTextWriterStartDTDEntity +extern __typeof (xmlTextWriterStartDTDEntity) xmlTextWriterStartDTDEntity__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterStartDTDEntity xmlTextWriterStartDTDEntity__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterStartDocument +extern __typeof (xmlTextWriterStartDocument) xmlTextWriterStartDocument __attribute((alias("xmlTextWriterStartDocument__internal_alias"))); +#else +#ifndef xmlTextWriterStartDocument +extern __typeof (xmlTextWriterStartDocument) xmlTextWriterStartDocument__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterStartDocument xmlTextWriterStartDocument__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterStartElement +extern __typeof (xmlTextWriterStartElement) xmlTextWriterStartElement __attribute((alias("xmlTextWriterStartElement__internal_alias"))); +#else +#ifndef xmlTextWriterStartElement +extern __typeof (xmlTextWriterStartElement) xmlTextWriterStartElement__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterStartElement xmlTextWriterStartElement__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterStartElementNS +extern __typeof (xmlTextWriterStartElementNS) xmlTextWriterStartElementNS __attribute((alias("xmlTextWriterStartElementNS__internal_alias"))); +#else +#ifndef xmlTextWriterStartElementNS +extern __typeof (xmlTextWriterStartElementNS) xmlTextWriterStartElementNS__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterStartElementNS xmlTextWriterStartElementNS__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterStartPI +extern __typeof (xmlTextWriterStartPI) xmlTextWriterStartPI __attribute((alias("xmlTextWriterStartPI__internal_alias"))); +#else +#ifndef xmlTextWriterStartPI +extern __typeof (xmlTextWriterStartPI) xmlTextWriterStartPI__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterStartPI xmlTextWriterStartPI__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteAttribute +extern __typeof (xmlTextWriterWriteAttribute) xmlTextWriterWriteAttribute __attribute((alias("xmlTextWriterWriteAttribute__internal_alias"))); +#else +#ifndef xmlTextWriterWriteAttribute +extern __typeof (xmlTextWriterWriteAttribute) xmlTextWriterWriteAttribute__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteAttribute xmlTextWriterWriteAttribute__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteAttributeNS +extern __typeof (xmlTextWriterWriteAttributeNS) xmlTextWriterWriteAttributeNS __attribute((alias("xmlTextWriterWriteAttributeNS__internal_alias"))); +#else +#ifndef xmlTextWriterWriteAttributeNS +extern __typeof (xmlTextWriterWriteAttributeNS) xmlTextWriterWriteAttributeNS__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteAttributeNS xmlTextWriterWriteAttributeNS__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteBase64 +extern __typeof (xmlTextWriterWriteBase64) xmlTextWriterWriteBase64 __attribute((alias("xmlTextWriterWriteBase64__internal_alias"))); +#else +#ifndef xmlTextWriterWriteBase64 +extern __typeof (xmlTextWriterWriteBase64) xmlTextWriterWriteBase64__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteBase64 xmlTextWriterWriteBase64__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteBinHex +extern __typeof (xmlTextWriterWriteBinHex) xmlTextWriterWriteBinHex __attribute((alias("xmlTextWriterWriteBinHex__internal_alias"))); +#else +#ifndef xmlTextWriterWriteBinHex +extern __typeof (xmlTextWriterWriteBinHex) xmlTextWriterWriteBinHex__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteBinHex xmlTextWriterWriteBinHex__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteCDATA +extern __typeof (xmlTextWriterWriteCDATA) xmlTextWriterWriteCDATA __attribute((alias("xmlTextWriterWriteCDATA__internal_alias"))); +#else +#ifndef xmlTextWriterWriteCDATA +extern __typeof (xmlTextWriterWriteCDATA) xmlTextWriterWriteCDATA__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteCDATA xmlTextWriterWriteCDATA__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteComment +extern __typeof (xmlTextWriterWriteComment) xmlTextWriterWriteComment __attribute((alias("xmlTextWriterWriteComment__internal_alias"))); +#else +#ifndef xmlTextWriterWriteComment +extern __typeof (xmlTextWriterWriteComment) xmlTextWriterWriteComment__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteComment xmlTextWriterWriteComment__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteDTD +extern __typeof (xmlTextWriterWriteDTD) xmlTextWriterWriteDTD __attribute((alias("xmlTextWriterWriteDTD__internal_alias"))); +#else +#ifndef xmlTextWriterWriteDTD +extern __typeof (xmlTextWriterWriteDTD) xmlTextWriterWriteDTD__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteDTD xmlTextWriterWriteDTD__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteDTDAttlist +extern __typeof (xmlTextWriterWriteDTDAttlist) xmlTextWriterWriteDTDAttlist __attribute((alias("xmlTextWriterWriteDTDAttlist__internal_alias"))); +#else +#ifndef xmlTextWriterWriteDTDAttlist +extern __typeof (xmlTextWriterWriteDTDAttlist) xmlTextWriterWriteDTDAttlist__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteDTDAttlist xmlTextWriterWriteDTDAttlist__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteDTDElement +extern __typeof (xmlTextWriterWriteDTDElement) xmlTextWriterWriteDTDElement __attribute((alias("xmlTextWriterWriteDTDElement__internal_alias"))); +#else +#ifndef xmlTextWriterWriteDTDElement +extern __typeof (xmlTextWriterWriteDTDElement) xmlTextWriterWriteDTDElement__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteDTDElement xmlTextWriterWriteDTDElement__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteDTDEntity +extern __typeof (xmlTextWriterWriteDTDEntity) xmlTextWriterWriteDTDEntity __attribute((alias("xmlTextWriterWriteDTDEntity__internal_alias"))); +#else +#ifndef xmlTextWriterWriteDTDEntity +extern __typeof (xmlTextWriterWriteDTDEntity) xmlTextWriterWriteDTDEntity__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteDTDEntity xmlTextWriterWriteDTDEntity__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteDTDExternalEntity +extern __typeof (xmlTextWriterWriteDTDExternalEntity) xmlTextWriterWriteDTDExternalEntity __attribute((alias("xmlTextWriterWriteDTDExternalEntity__internal_alias"))); +#else +#ifndef xmlTextWriterWriteDTDExternalEntity +extern __typeof (xmlTextWriterWriteDTDExternalEntity) xmlTextWriterWriteDTDExternalEntity__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteDTDExternalEntity xmlTextWriterWriteDTDExternalEntity__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteDTDExternalEntityContents +extern __typeof (xmlTextWriterWriteDTDExternalEntityContents) xmlTextWriterWriteDTDExternalEntityContents __attribute((alias("xmlTextWriterWriteDTDExternalEntityContents__internal_alias"))); +#else +#ifndef xmlTextWriterWriteDTDExternalEntityContents +extern __typeof (xmlTextWriterWriteDTDExternalEntityContents) xmlTextWriterWriteDTDExternalEntityContents__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteDTDExternalEntityContents xmlTextWriterWriteDTDExternalEntityContents__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteDTDInternalEntity +extern __typeof (xmlTextWriterWriteDTDInternalEntity) xmlTextWriterWriteDTDInternalEntity __attribute((alias("xmlTextWriterWriteDTDInternalEntity__internal_alias"))); +#else +#ifndef xmlTextWriterWriteDTDInternalEntity +extern __typeof (xmlTextWriterWriteDTDInternalEntity) xmlTextWriterWriteDTDInternalEntity__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteDTDInternalEntity xmlTextWriterWriteDTDInternalEntity__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteDTDNotation +extern __typeof (xmlTextWriterWriteDTDNotation) xmlTextWriterWriteDTDNotation __attribute((alias("xmlTextWriterWriteDTDNotation__internal_alias"))); +#else +#ifndef xmlTextWriterWriteDTDNotation +extern __typeof (xmlTextWriterWriteDTDNotation) xmlTextWriterWriteDTDNotation__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteDTDNotation xmlTextWriterWriteDTDNotation__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteElement +extern __typeof (xmlTextWriterWriteElement) xmlTextWriterWriteElement __attribute((alias("xmlTextWriterWriteElement__internal_alias"))); +#else +#ifndef xmlTextWriterWriteElement +extern __typeof (xmlTextWriterWriteElement) xmlTextWriterWriteElement__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteElement xmlTextWriterWriteElement__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteElementNS +extern __typeof (xmlTextWriterWriteElementNS) xmlTextWriterWriteElementNS __attribute((alias("xmlTextWriterWriteElementNS__internal_alias"))); +#else +#ifndef xmlTextWriterWriteElementNS +extern __typeof (xmlTextWriterWriteElementNS) xmlTextWriterWriteElementNS__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteElementNS xmlTextWriterWriteElementNS__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteFormatAttribute +extern __typeof (xmlTextWriterWriteFormatAttribute) xmlTextWriterWriteFormatAttribute __attribute((alias("xmlTextWriterWriteFormatAttribute__internal_alias"))); +#else +#ifndef xmlTextWriterWriteFormatAttribute +extern __typeof (xmlTextWriterWriteFormatAttribute) xmlTextWriterWriteFormatAttribute__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteFormatAttribute xmlTextWriterWriteFormatAttribute__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteFormatAttributeNS +extern __typeof (xmlTextWriterWriteFormatAttributeNS) xmlTextWriterWriteFormatAttributeNS __attribute((alias("xmlTextWriterWriteFormatAttributeNS__internal_alias"))); +#else +#ifndef xmlTextWriterWriteFormatAttributeNS +extern __typeof (xmlTextWriterWriteFormatAttributeNS) xmlTextWriterWriteFormatAttributeNS__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteFormatAttributeNS xmlTextWriterWriteFormatAttributeNS__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteFormatCDATA +extern __typeof (xmlTextWriterWriteFormatCDATA) xmlTextWriterWriteFormatCDATA __attribute((alias("xmlTextWriterWriteFormatCDATA__internal_alias"))); +#else +#ifndef xmlTextWriterWriteFormatCDATA +extern __typeof (xmlTextWriterWriteFormatCDATA) xmlTextWriterWriteFormatCDATA__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteFormatCDATA xmlTextWriterWriteFormatCDATA__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteFormatComment +extern __typeof (xmlTextWriterWriteFormatComment) xmlTextWriterWriteFormatComment __attribute((alias("xmlTextWriterWriteFormatComment__internal_alias"))); +#else +#ifndef xmlTextWriterWriteFormatComment +extern __typeof (xmlTextWriterWriteFormatComment) xmlTextWriterWriteFormatComment__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteFormatComment xmlTextWriterWriteFormatComment__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteFormatDTD +extern __typeof (xmlTextWriterWriteFormatDTD) xmlTextWriterWriteFormatDTD __attribute((alias("xmlTextWriterWriteFormatDTD__internal_alias"))); +#else +#ifndef xmlTextWriterWriteFormatDTD +extern __typeof (xmlTextWriterWriteFormatDTD) xmlTextWriterWriteFormatDTD__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteFormatDTD xmlTextWriterWriteFormatDTD__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteFormatDTDAttlist +extern __typeof (xmlTextWriterWriteFormatDTDAttlist) xmlTextWriterWriteFormatDTDAttlist __attribute((alias("xmlTextWriterWriteFormatDTDAttlist__internal_alias"))); +#else +#ifndef xmlTextWriterWriteFormatDTDAttlist +extern __typeof (xmlTextWriterWriteFormatDTDAttlist) xmlTextWriterWriteFormatDTDAttlist__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteFormatDTDAttlist xmlTextWriterWriteFormatDTDAttlist__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteFormatDTDElement +extern __typeof (xmlTextWriterWriteFormatDTDElement) xmlTextWriterWriteFormatDTDElement __attribute((alias("xmlTextWriterWriteFormatDTDElement__internal_alias"))); +#else +#ifndef xmlTextWriterWriteFormatDTDElement +extern __typeof (xmlTextWriterWriteFormatDTDElement) xmlTextWriterWriteFormatDTDElement__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteFormatDTDElement xmlTextWriterWriteFormatDTDElement__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteFormatDTDInternalEntity +extern __typeof (xmlTextWriterWriteFormatDTDInternalEntity) xmlTextWriterWriteFormatDTDInternalEntity __attribute((alias("xmlTextWriterWriteFormatDTDInternalEntity__internal_alias"))); +#else +#ifndef xmlTextWriterWriteFormatDTDInternalEntity +extern __typeof (xmlTextWriterWriteFormatDTDInternalEntity) xmlTextWriterWriteFormatDTDInternalEntity__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteFormatDTDInternalEntity xmlTextWriterWriteFormatDTDInternalEntity__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteFormatElement +extern __typeof (xmlTextWriterWriteFormatElement) xmlTextWriterWriteFormatElement __attribute((alias("xmlTextWriterWriteFormatElement__internal_alias"))); +#else +#ifndef xmlTextWriterWriteFormatElement +extern __typeof (xmlTextWriterWriteFormatElement) xmlTextWriterWriteFormatElement__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteFormatElement xmlTextWriterWriteFormatElement__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteFormatElementNS +extern __typeof (xmlTextWriterWriteFormatElementNS) xmlTextWriterWriteFormatElementNS __attribute((alias("xmlTextWriterWriteFormatElementNS__internal_alias"))); +#else +#ifndef xmlTextWriterWriteFormatElementNS +extern __typeof (xmlTextWriterWriteFormatElementNS) xmlTextWriterWriteFormatElementNS__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteFormatElementNS xmlTextWriterWriteFormatElementNS__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteFormatPI +extern __typeof (xmlTextWriterWriteFormatPI) xmlTextWriterWriteFormatPI __attribute((alias("xmlTextWriterWriteFormatPI__internal_alias"))); +#else +#ifndef xmlTextWriterWriteFormatPI +extern __typeof (xmlTextWriterWriteFormatPI) xmlTextWriterWriteFormatPI__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteFormatPI xmlTextWriterWriteFormatPI__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteFormatRaw +extern __typeof (xmlTextWriterWriteFormatRaw) xmlTextWriterWriteFormatRaw __attribute((alias("xmlTextWriterWriteFormatRaw__internal_alias"))); +#else +#ifndef xmlTextWriterWriteFormatRaw +extern __typeof (xmlTextWriterWriteFormatRaw) xmlTextWriterWriteFormatRaw__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteFormatRaw xmlTextWriterWriteFormatRaw__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteFormatString +extern __typeof (xmlTextWriterWriteFormatString) xmlTextWriterWriteFormatString __attribute((alias("xmlTextWriterWriteFormatString__internal_alias"))); +#else +#ifndef xmlTextWriterWriteFormatString +extern __typeof (xmlTextWriterWriteFormatString) xmlTextWriterWriteFormatString__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteFormatString xmlTextWriterWriteFormatString__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWritePI +extern __typeof (xmlTextWriterWritePI) xmlTextWriterWritePI __attribute((alias("xmlTextWriterWritePI__internal_alias"))); +#else +#ifndef xmlTextWriterWritePI +extern __typeof (xmlTextWriterWritePI) xmlTextWriterWritePI__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWritePI xmlTextWriterWritePI__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteRaw +extern __typeof (xmlTextWriterWriteRaw) xmlTextWriterWriteRaw __attribute((alias("xmlTextWriterWriteRaw__internal_alias"))); +#else +#ifndef xmlTextWriterWriteRaw +extern __typeof (xmlTextWriterWriteRaw) xmlTextWriterWriteRaw__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteRaw xmlTextWriterWriteRaw__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteRawLen +extern __typeof (xmlTextWriterWriteRawLen) xmlTextWriterWriteRawLen __attribute((alias("xmlTextWriterWriteRawLen__internal_alias"))); +#else +#ifndef xmlTextWriterWriteRawLen +extern __typeof (xmlTextWriterWriteRawLen) xmlTextWriterWriteRawLen__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteRawLen xmlTextWriterWriteRawLen__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteString +extern __typeof (xmlTextWriterWriteString) xmlTextWriterWriteString __attribute((alias("xmlTextWriterWriteString__internal_alias"))); +#else +#ifndef xmlTextWriterWriteString +extern __typeof (xmlTextWriterWriteString) xmlTextWriterWriteString__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteString xmlTextWriterWriteString__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteVFormatAttribute +extern __typeof (xmlTextWriterWriteVFormatAttribute) xmlTextWriterWriteVFormatAttribute __attribute((alias("xmlTextWriterWriteVFormatAttribute__internal_alias"))); +#else +#ifndef xmlTextWriterWriteVFormatAttribute +extern __typeof (xmlTextWriterWriteVFormatAttribute) xmlTextWriterWriteVFormatAttribute__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteVFormatAttribute xmlTextWriterWriteVFormatAttribute__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteVFormatAttributeNS +extern __typeof (xmlTextWriterWriteVFormatAttributeNS) xmlTextWriterWriteVFormatAttributeNS __attribute((alias("xmlTextWriterWriteVFormatAttributeNS__internal_alias"))); +#else +#ifndef xmlTextWriterWriteVFormatAttributeNS +extern __typeof (xmlTextWriterWriteVFormatAttributeNS) xmlTextWriterWriteVFormatAttributeNS__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteVFormatAttributeNS xmlTextWriterWriteVFormatAttributeNS__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteVFormatCDATA +extern __typeof (xmlTextWriterWriteVFormatCDATA) xmlTextWriterWriteVFormatCDATA __attribute((alias("xmlTextWriterWriteVFormatCDATA__internal_alias"))); +#else +#ifndef xmlTextWriterWriteVFormatCDATA +extern __typeof (xmlTextWriterWriteVFormatCDATA) xmlTextWriterWriteVFormatCDATA__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteVFormatCDATA xmlTextWriterWriteVFormatCDATA__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteVFormatComment +extern __typeof (xmlTextWriterWriteVFormatComment) xmlTextWriterWriteVFormatComment __attribute((alias("xmlTextWriterWriteVFormatComment__internal_alias"))); +#else +#ifndef xmlTextWriterWriteVFormatComment +extern __typeof (xmlTextWriterWriteVFormatComment) xmlTextWriterWriteVFormatComment__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteVFormatComment xmlTextWriterWriteVFormatComment__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteVFormatDTD +extern __typeof (xmlTextWriterWriteVFormatDTD) xmlTextWriterWriteVFormatDTD __attribute((alias("xmlTextWriterWriteVFormatDTD__internal_alias"))); +#else +#ifndef xmlTextWriterWriteVFormatDTD +extern __typeof (xmlTextWriterWriteVFormatDTD) xmlTextWriterWriteVFormatDTD__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteVFormatDTD xmlTextWriterWriteVFormatDTD__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteVFormatDTDAttlist +extern __typeof (xmlTextWriterWriteVFormatDTDAttlist) xmlTextWriterWriteVFormatDTDAttlist __attribute((alias("xmlTextWriterWriteVFormatDTDAttlist__internal_alias"))); +#else +#ifndef xmlTextWriterWriteVFormatDTDAttlist +extern __typeof (xmlTextWriterWriteVFormatDTDAttlist) xmlTextWriterWriteVFormatDTDAttlist__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteVFormatDTDAttlist xmlTextWriterWriteVFormatDTDAttlist__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteVFormatDTDElement +extern __typeof (xmlTextWriterWriteVFormatDTDElement) xmlTextWriterWriteVFormatDTDElement __attribute((alias("xmlTextWriterWriteVFormatDTDElement__internal_alias"))); +#else +#ifndef xmlTextWriterWriteVFormatDTDElement +extern __typeof (xmlTextWriterWriteVFormatDTDElement) xmlTextWriterWriteVFormatDTDElement__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteVFormatDTDElement xmlTextWriterWriteVFormatDTDElement__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteVFormatDTDInternalEntity +extern __typeof (xmlTextWriterWriteVFormatDTDInternalEntity) xmlTextWriterWriteVFormatDTDInternalEntity __attribute((alias("xmlTextWriterWriteVFormatDTDInternalEntity__internal_alias"))); +#else +#ifndef xmlTextWriterWriteVFormatDTDInternalEntity +extern __typeof (xmlTextWriterWriteVFormatDTDInternalEntity) xmlTextWriterWriteVFormatDTDInternalEntity__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteVFormatDTDInternalEntity xmlTextWriterWriteVFormatDTDInternalEntity__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteVFormatElement +extern __typeof (xmlTextWriterWriteVFormatElement) xmlTextWriterWriteVFormatElement __attribute((alias("xmlTextWriterWriteVFormatElement__internal_alias"))); +#else +#ifndef xmlTextWriterWriteVFormatElement +extern __typeof (xmlTextWriterWriteVFormatElement) xmlTextWriterWriteVFormatElement__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteVFormatElement xmlTextWriterWriteVFormatElement__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteVFormatElementNS +extern __typeof (xmlTextWriterWriteVFormatElementNS) xmlTextWriterWriteVFormatElementNS __attribute((alias("xmlTextWriterWriteVFormatElementNS__internal_alias"))); +#else +#ifndef xmlTextWriterWriteVFormatElementNS +extern __typeof (xmlTextWriterWriteVFormatElementNS) xmlTextWriterWriteVFormatElementNS__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteVFormatElementNS xmlTextWriterWriteVFormatElementNS__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteVFormatPI +extern __typeof (xmlTextWriterWriteVFormatPI) xmlTextWriterWriteVFormatPI __attribute((alias("xmlTextWriterWriteVFormatPI__internal_alias"))); +#else +#ifndef xmlTextWriterWriteVFormatPI +extern __typeof (xmlTextWriterWriteVFormatPI) xmlTextWriterWriteVFormatPI__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteVFormatPI xmlTextWriterWriteVFormatPI__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteVFormatRaw +extern __typeof (xmlTextWriterWriteVFormatRaw) xmlTextWriterWriteVFormatRaw __attribute((alias("xmlTextWriterWriteVFormatRaw__internal_alias"))); +#else +#ifndef xmlTextWriterWriteVFormatRaw +extern __typeof (xmlTextWriterWriteVFormatRaw) xmlTextWriterWriteVFormatRaw__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteVFormatRaw xmlTextWriterWriteVFormatRaw__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_WRITER_ENABLED) +#ifdef bottom_xmlwriter +#undef xmlTextWriterWriteVFormatString +extern __typeof (xmlTextWriterWriteVFormatString) xmlTextWriterWriteVFormatString __attribute((alias("xmlTextWriterWriteVFormatString__internal_alias"))); +#else +#ifndef xmlTextWriterWriteVFormatString +extern __typeof (xmlTextWriterWriteVFormatString) xmlTextWriterWriteVFormatString__internal_alias __attribute((visibility("hidden"))); +#define xmlTextWriterWriteVFormatString xmlTextWriterWriteVFormatString__internal_alias +#endif +#endif +#endif + +#ifdef bottom_globals +#undef xmlThrDefBufferAllocScheme +extern __typeof (xmlThrDefBufferAllocScheme) xmlThrDefBufferAllocScheme __attribute((alias("xmlThrDefBufferAllocScheme__internal_alias"))); +#else +#ifndef xmlThrDefBufferAllocScheme +extern __typeof (xmlThrDefBufferAllocScheme) xmlThrDefBufferAllocScheme__internal_alias __attribute((visibility("hidden"))); +#define xmlThrDefBufferAllocScheme xmlThrDefBufferAllocScheme__internal_alias +#endif +#endif + +#ifdef bottom_globals +#undef xmlThrDefDefaultBufferSize +extern __typeof (xmlThrDefDefaultBufferSize) xmlThrDefDefaultBufferSize __attribute((alias("xmlThrDefDefaultBufferSize__internal_alias"))); +#else +#ifndef xmlThrDefDefaultBufferSize +extern __typeof (xmlThrDefDefaultBufferSize) xmlThrDefDefaultBufferSize__internal_alias __attribute((visibility("hidden"))); +#define xmlThrDefDefaultBufferSize xmlThrDefDefaultBufferSize__internal_alias +#endif +#endif + +#ifdef bottom_globals +#undef xmlThrDefDeregisterNodeDefault +extern __typeof (xmlThrDefDeregisterNodeDefault) xmlThrDefDeregisterNodeDefault __attribute((alias("xmlThrDefDeregisterNodeDefault__internal_alias"))); +#else +#ifndef xmlThrDefDeregisterNodeDefault +extern __typeof (xmlThrDefDeregisterNodeDefault) xmlThrDefDeregisterNodeDefault__internal_alias __attribute((visibility("hidden"))); +#define xmlThrDefDeregisterNodeDefault xmlThrDefDeregisterNodeDefault__internal_alias +#endif +#endif + +#ifdef bottom_globals +#undef xmlThrDefDoValidityCheckingDefaultValue +extern __typeof (xmlThrDefDoValidityCheckingDefaultValue) xmlThrDefDoValidityCheckingDefaultValue __attribute((alias("xmlThrDefDoValidityCheckingDefaultValue__internal_alias"))); +#else +#ifndef xmlThrDefDoValidityCheckingDefaultValue +extern __typeof (xmlThrDefDoValidityCheckingDefaultValue) xmlThrDefDoValidityCheckingDefaultValue__internal_alias __attribute((visibility("hidden"))); +#define xmlThrDefDoValidityCheckingDefaultValue xmlThrDefDoValidityCheckingDefaultValue__internal_alias +#endif +#endif + +#ifdef bottom_globals +#undef xmlThrDefGetWarningsDefaultValue +extern __typeof (xmlThrDefGetWarningsDefaultValue) xmlThrDefGetWarningsDefaultValue __attribute((alias("xmlThrDefGetWarningsDefaultValue__internal_alias"))); +#else +#ifndef xmlThrDefGetWarningsDefaultValue +extern __typeof (xmlThrDefGetWarningsDefaultValue) xmlThrDefGetWarningsDefaultValue__internal_alias __attribute((visibility("hidden"))); +#define xmlThrDefGetWarningsDefaultValue xmlThrDefGetWarningsDefaultValue__internal_alias +#endif +#endif + +#ifdef bottom_globals +#undef xmlThrDefIndentTreeOutput +extern __typeof (xmlThrDefIndentTreeOutput) xmlThrDefIndentTreeOutput __attribute((alias("xmlThrDefIndentTreeOutput__internal_alias"))); +#else +#ifndef xmlThrDefIndentTreeOutput +extern __typeof (xmlThrDefIndentTreeOutput) xmlThrDefIndentTreeOutput__internal_alias __attribute((visibility("hidden"))); +#define xmlThrDefIndentTreeOutput xmlThrDefIndentTreeOutput__internal_alias +#endif +#endif + +#ifdef bottom_globals +#undef xmlThrDefKeepBlanksDefaultValue +extern __typeof (xmlThrDefKeepBlanksDefaultValue) xmlThrDefKeepBlanksDefaultValue __attribute((alias("xmlThrDefKeepBlanksDefaultValue__internal_alias"))); +#else +#ifndef xmlThrDefKeepBlanksDefaultValue +extern __typeof (xmlThrDefKeepBlanksDefaultValue) xmlThrDefKeepBlanksDefaultValue__internal_alias __attribute((visibility("hidden"))); +#define xmlThrDefKeepBlanksDefaultValue xmlThrDefKeepBlanksDefaultValue__internal_alias +#endif +#endif + +#ifdef bottom_globals +#undef xmlThrDefLineNumbersDefaultValue +extern __typeof (xmlThrDefLineNumbersDefaultValue) xmlThrDefLineNumbersDefaultValue __attribute((alias("xmlThrDefLineNumbersDefaultValue__internal_alias"))); +#else +#ifndef xmlThrDefLineNumbersDefaultValue +extern __typeof (xmlThrDefLineNumbersDefaultValue) xmlThrDefLineNumbersDefaultValue__internal_alias __attribute((visibility("hidden"))); +#define xmlThrDefLineNumbersDefaultValue xmlThrDefLineNumbersDefaultValue__internal_alias +#endif +#endif + +#ifdef bottom_globals +#undef xmlThrDefLoadExtDtdDefaultValue +extern __typeof (xmlThrDefLoadExtDtdDefaultValue) xmlThrDefLoadExtDtdDefaultValue __attribute((alias("xmlThrDefLoadExtDtdDefaultValue__internal_alias"))); +#else +#ifndef xmlThrDefLoadExtDtdDefaultValue +extern __typeof (xmlThrDefLoadExtDtdDefaultValue) xmlThrDefLoadExtDtdDefaultValue__internal_alias __attribute((visibility("hidden"))); +#define xmlThrDefLoadExtDtdDefaultValue xmlThrDefLoadExtDtdDefaultValue__internal_alias +#endif +#endif + +#ifdef bottom_globals +#undef xmlThrDefOutputBufferCreateFilenameDefault +extern __typeof (xmlThrDefOutputBufferCreateFilenameDefault) xmlThrDefOutputBufferCreateFilenameDefault __attribute((alias("xmlThrDefOutputBufferCreateFilenameDefault__internal_alias"))); +#else +#ifndef xmlThrDefOutputBufferCreateFilenameDefault +extern __typeof (xmlThrDefOutputBufferCreateFilenameDefault) xmlThrDefOutputBufferCreateFilenameDefault__internal_alias __attribute((visibility("hidden"))); +#define xmlThrDefOutputBufferCreateFilenameDefault xmlThrDefOutputBufferCreateFilenameDefault__internal_alias +#endif +#endif + +#ifdef bottom_globals +#undef xmlThrDefParserDebugEntities +extern __typeof (xmlThrDefParserDebugEntities) xmlThrDefParserDebugEntities __attribute((alias("xmlThrDefParserDebugEntities__internal_alias"))); +#else +#ifndef xmlThrDefParserDebugEntities +extern __typeof (xmlThrDefParserDebugEntities) xmlThrDefParserDebugEntities__internal_alias __attribute((visibility("hidden"))); +#define xmlThrDefParserDebugEntities xmlThrDefParserDebugEntities__internal_alias +#endif +#endif + +#ifdef bottom_globals +#undef xmlThrDefParserInputBufferCreateFilenameDefault +extern __typeof (xmlThrDefParserInputBufferCreateFilenameDefault) xmlThrDefParserInputBufferCreateFilenameDefault __attribute((alias("xmlThrDefParserInputBufferCreateFilenameDefault__internal_alias"))); +#else +#ifndef xmlThrDefParserInputBufferCreateFilenameDefault +extern __typeof (xmlThrDefParserInputBufferCreateFilenameDefault) xmlThrDefParserInputBufferCreateFilenameDefault__internal_alias __attribute((visibility("hidden"))); +#define xmlThrDefParserInputBufferCreateFilenameDefault xmlThrDefParserInputBufferCreateFilenameDefault__internal_alias +#endif +#endif + +#ifdef bottom_globals +#undef xmlThrDefPedanticParserDefaultValue +extern __typeof (xmlThrDefPedanticParserDefaultValue) xmlThrDefPedanticParserDefaultValue __attribute((alias("xmlThrDefPedanticParserDefaultValue__internal_alias"))); +#else +#ifndef xmlThrDefPedanticParserDefaultValue +extern __typeof (xmlThrDefPedanticParserDefaultValue) xmlThrDefPedanticParserDefaultValue__internal_alias __attribute((visibility("hidden"))); +#define xmlThrDefPedanticParserDefaultValue xmlThrDefPedanticParserDefaultValue__internal_alias +#endif +#endif + +#ifdef bottom_globals +#undef xmlThrDefRegisterNodeDefault +extern __typeof (xmlThrDefRegisterNodeDefault) xmlThrDefRegisterNodeDefault __attribute((alias("xmlThrDefRegisterNodeDefault__internal_alias"))); +#else +#ifndef xmlThrDefRegisterNodeDefault +extern __typeof (xmlThrDefRegisterNodeDefault) xmlThrDefRegisterNodeDefault__internal_alias __attribute((visibility("hidden"))); +#define xmlThrDefRegisterNodeDefault xmlThrDefRegisterNodeDefault__internal_alias +#endif +#endif + +#ifdef bottom_globals +#undef xmlThrDefSaveNoEmptyTags +extern __typeof (xmlThrDefSaveNoEmptyTags) xmlThrDefSaveNoEmptyTags __attribute((alias("xmlThrDefSaveNoEmptyTags__internal_alias"))); +#else +#ifndef xmlThrDefSaveNoEmptyTags +extern __typeof (xmlThrDefSaveNoEmptyTags) xmlThrDefSaveNoEmptyTags__internal_alias __attribute((visibility("hidden"))); +#define xmlThrDefSaveNoEmptyTags xmlThrDefSaveNoEmptyTags__internal_alias +#endif +#endif + +#ifdef bottom_globals +#undef xmlThrDefSetGenericErrorFunc +extern __typeof (xmlThrDefSetGenericErrorFunc) xmlThrDefSetGenericErrorFunc __attribute((alias("xmlThrDefSetGenericErrorFunc__internal_alias"))); +#else +#ifndef xmlThrDefSetGenericErrorFunc +extern __typeof (xmlThrDefSetGenericErrorFunc) xmlThrDefSetGenericErrorFunc__internal_alias __attribute((visibility("hidden"))); +#define xmlThrDefSetGenericErrorFunc xmlThrDefSetGenericErrorFunc__internal_alias +#endif +#endif + +#ifdef bottom_globals +#undef xmlThrDefSetStructuredErrorFunc +extern __typeof (xmlThrDefSetStructuredErrorFunc) xmlThrDefSetStructuredErrorFunc __attribute((alias("xmlThrDefSetStructuredErrorFunc__internal_alias"))); +#else +#ifndef xmlThrDefSetStructuredErrorFunc +extern __typeof (xmlThrDefSetStructuredErrorFunc) xmlThrDefSetStructuredErrorFunc__internal_alias __attribute((visibility("hidden"))); +#define xmlThrDefSetStructuredErrorFunc xmlThrDefSetStructuredErrorFunc__internal_alias +#endif +#endif + +#ifdef bottom_globals +#undef xmlThrDefSubstituteEntitiesDefaultValue +extern __typeof (xmlThrDefSubstituteEntitiesDefaultValue) xmlThrDefSubstituteEntitiesDefaultValue __attribute((alias("xmlThrDefSubstituteEntitiesDefaultValue__internal_alias"))); +#else +#ifndef xmlThrDefSubstituteEntitiesDefaultValue +extern __typeof (xmlThrDefSubstituteEntitiesDefaultValue) xmlThrDefSubstituteEntitiesDefaultValue__internal_alias __attribute((visibility("hidden"))); +#define xmlThrDefSubstituteEntitiesDefaultValue xmlThrDefSubstituteEntitiesDefaultValue__internal_alias +#endif +#endif + +#ifdef bottom_globals +#undef xmlThrDefTreeIndentString +extern __typeof (xmlThrDefTreeIndentString) xmlThrDefTreeIndentString __attribute((alias("xmlThrDefTreeIndentString__internal_alias"))); +#else +#ifndef xmlThrDefTreeIndentString +extern __typeof (xmlThrDefTreeIndentString) xmlThrDefTreeIndentString__internal_alias __attribute((visibility("hidden"))); +#define xmlThrDefTreeIndentString xmlThrDefTreeIndentString__internal_alias +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsAegeanNumbers +extern __typeof (xmlUCSIsAegeanNumbers) xmlUCSIsAegeanNumbers __attribute((alias("xmlUCSIsAegeanNumbers__internal_alias"))); +#else +#ifndef xmlUCSIsAegeanNumbers +extern __typeof (xmlUCSIsAegeanNumbers) xmlUCSIsAegeanNumbers__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsAegeanNumbers xmlUCSIsAegeanNumbers__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsAlphabeticPresentationForms +extern __typeof (xmlUCSIsAlphabeticPresentationForms) xmlUCSIsAlphabeticPresentationForms __attribute((alias("xmlUCSIsAlphabeticPresentationForms__internal_alias"))); +#else +#ifndef xmlUCSIsAlphabeticPresentationForms +extern __typeof (xmlUCSIsAlphabeticPresentationForms) xmlUCSIsAlphabeticPresentationForms__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsAlphabeticPresentationForms xmlUCSIsAlphabeticPresentationForms__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsArabic +extern __typeof (xmlUCSIsArabic) xmlUCSIsArabic __attribute((alias("xmlUCSIsArabic__internal_alias"))); +#else +#ifndef xmlUCSIsArabic +extern __typeof (xmlUCSIsArabic) xmlUCSIsArabic__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsArabic xmlUCSIsArabic__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsArabicPresentationFormsA +extern __typeof (xmlUCSIsArabicPresentationFormsA) xmlUCSIsArabicPresentationFormsA __attribute((alias("xmlUCSIsArabicPresentationFormsA__internal_alias"))); +#else +#ifndef xmlUCSIsArabicPresentationFormsA +extern __typeof (xmlUCSIsArabicPresentationFormsA) xmlUCSIsArabicPresentationFormsA__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsArabicPresentationFormsA xmlUCSIsArabicPresentationFormsA__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsArabicPresentationFormsB +extern __typeof (xmlUCSIsArabicPresentationFormsB) xmlUCSIsArabicPresentationFormsB __attribute((alias("xmlUCSIsArabicPresentationFormsB__internal_alias"))); +#else +#ifndef xmlUCSIsArabicPresentationFormsB +extern __typeof (xmlUCSIsArabicPresentationFormsB) xmlUCSIsArabicPresentationFormsB__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsArabicPresentationFormsB xmlUCSIsArabicPresentationFormsB__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsArmenian +extern __typeof (xmlUCSIsArmenian) xmlUCSIsArmenian __attribute((alias("xmlUCSIsArmenian__internal_alias"))); +#else +#ifndef xmlUCSIsArmenian +extern __typeof (xmlUCSIsArmenian) xmlUCSIsArmenian__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsArmenian xmlUCSIsArmenian__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsArrows +extern __typeof (xmlUCSIsArrows) xmlUCSIsArrows __attribute((alias("xmlUCSIsArrows__internal_alias"))); +#else +#ifndef xmlUCSIsArrows +extern __typeof (xmlUCSIsArrows) xmlUCSIsArrows__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsArrows xmlUCSIsArrows__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsBasicLatin +extern __typeof (xmlUCSIsBasicLatin) xmlUCSIsBasicLatin __attribute((alias("xmlUCSIsBasicLatin__internal_alias"))); +#else +#ifndef xmlUCSIsBasicLatin +extern __typeof (xmlUCSIsBasicLatin) xmlUCSIsBasicLatin__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsBasicLatin xmlUCSIsBasicLatin__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsBengali +extern __typeof (xmlUCSIsBengali) xmlUCSIsBengali __attribute((alias("xmlUCSIsBengali__internal_alias"))); +#else +#ifndef xmlUCSIsBengali +extern __typeof (xmlUCSIsBengali) xmlUCSIsBengali__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsBengali xmlUCSIsBengali__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsBlock +extern __typeof (xmlUCSIsBlock) xmlUCSIsBlock __attribute((alias("xmlUCSIsBlock__internal_alias"))); +#else +#ifndef xmlUCSIsBlock +extern __typeof (xmlUCSIsBlock) xmlUCSIsBlock__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsBlock xmlUCSIsBlock__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsBlockElements +extern __typeof (xmlUCSIsBlockElements) xmlUCSIsBlockElements __attribute((alias("xmlUCSIsBlockElements__internal_alias"))); +#else +#ifndef xmlUCSIsBlockElements +extern __typeof (xmlUCSIsBlockElements) xmlUCSIsBlockElements__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsBlockElements xmlUCSIsBlockElements__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsBopomofo +extern __typeof (xmlUCSIsBopomofo) xmlUCSIsBopomofo __attribute((alias("xmlUCSIsBopomofo__internal_alias"))); +#else +#ifndef xmlUCSIsBopomofo +extern __typeof (xmlUCSIsBopomofo) xmlUCSIsBopomofo__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsBopomofo xmlUCSIsBopomofo__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsBopomofoExtended +extern __typeof (xmlUCSIsBopomofoExtended) xmlUCSIsBopomofoExtended __attribute((alias("xmlUCSIsBopomofoExtended__internal_alias"))); +#else +#ifndef xmlUCSIsBopomofoExtended +extern __typeof (xmlUCSIsBopomofoExtended) xmlUCSIsBopomofoExtended__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsBopomofoExtended xmlUCSIsBopomofoExtended__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsBoxDrawing +extern __typeof (xmlUCSIsBoxDrawing) xmlUCSIsBoxDrawing __attribute((alias("xmlUCSIsBoxDrawing__internal_alias"))); +#else +#ifndef xmlUCSIsBoxDrawing +extern __typeof (xmlUCSIsBoxDrawing) xmlUCSIsBoxDrawing__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsBoxDrawing xmlUCSIsBoxDrawing__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsBraillePatterns +extern __typeof (xmlUCSIsBraillePatterns) xmlUCSIsBraillePatterns __attribute((alias("xmlUCSIsBraillePatterns__internal_alias"))); +#else +#ifndef xmlUCSIsBraillePatterns +extern __typeof (xmlUCSIsBraillePatterns) xmlUCSIsBraillePatterns__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsBraillePatterns xmlUCSIsBraillePatterns__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsBuhid +extern __typeof (xmlUCSIsBuhid) xmlUCSIsBuhid __attribute((alias("xmlUCSIsBuhid__internal_alias"))); +#else +#ifndef xmlUCSIsBuhid +extern __typeof (xmlUCSIsBuhid) xmlUCSIsBuhid__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsBuhid xmlUCSIsBuhid__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsByzantineMusicalSymbols +extern __typeof (xmlUCSIsByzantineMusicalSymbols) xmlUCSIsByzantineMusicalSymbols __attribute((alias("xmlUCSIsByzantineMusicalSymbols__internal_alias"))); +#else +#ifndef xmlUCSIsByzantineMusicalSymbols +extern __typeof (xmlUCSIsByzantineMusicalSymbols) xmlUCSIsByzantineMusicalSymbols__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsByzantineMusicalSymbols xmlUCSIsByzantineMusicalSymbols__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCJKCompatibility +extern __typeof (xmlUCSIsCJKCompatibility) xmlUCSIsCJKCompatibility __attribute((alias("xmlUCSIsCJKCompatibility__internal_alias"))); +#else +#ifndef xmlUCSIsCJKCompatibility +extern __typeof (xmlUCSIsCJKCompatibility) xmlUCSIsCJKCompatibility__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCJKCompatibility xmlUCSIsCJKCompatibility__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCJKCompatibilityForms +extern __typeof (xmlUCSIsCJKCompatibilityForms) xmlUCSIsCJKCompatibilityForms __attribute((alias("xmlUCSIsCJKCompatibilityForms__internal_alias"))); +#else +#ifndef xmlUCSIsCJKCompatibilityForms +extern __typeof (xmlUCSIsCJKCompatibilityForms) xmlUCSIsCJKCompatibilityForms__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCJKCompatibilityForms xmlUCSIsCJKCompatibilityForms__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCJKCompatibilityIdeographs +extern __typeof (xmlUCSIsCJKCompatibilityIdeographs) xmlUCSIsCJKCompatibilityIdeographs __attribute((alias("xmlUCSIsCJKCompatibilityIdeographs__internal_alias"))); +#else +#ifndef xmlUCSIsCJKCompatibilityIdeographs +extern __typeof (xmlUCSIsCJKCompatibilityIdeographs) xmlUCSIsCJKCompatibilityIdeographs__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCJKCompatibilityIdeographs xmlUCSIsCJKCompatibilityIdeographs__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCJKCompatibilityIdeographsSupplement +extern __typeof (xmlUCSIsCJKCompatibilityIdeographsSupplement) xmlUCSIsCJKCompatibilityIdeographsSupplement __attribute((alias("xmlUCSIsCJKCompatibilityIdeographsSupplement__internal_alias"))); +#else +#ifndef xmlUCSIsCJKCompatibilityIdeographsSupplement +extern __typeof (xmlUCSIsCJKCompatibilityIdeographsSupplement) xmlUCSIsCJKCompatibilityIdeographsSupplement__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCJKCompatibilityIdeographsSupplement xmlUCSIsCJKCompatibilityIdeographsSupplement__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCJKRadicalsSupplement +extern __typeof (xmlUCSIsCJKRadicalsSupplement) xmlUCSIsCJKRadicalsSupplement __attribute((alias("xmlUCSIsCJKRadicalsSupplement__internal_alias"))); +#else +#ifndef xmlUCSIsCJKRadicalsSupplement +extern __typeof (xmlUCSIsCJKRadicalsSupplement) xmlUCSIsCJKRadicalsSupplement__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCJKRadicalsSupplement xmlUCSIsCJKRadicalsSupplement__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCJKSymbolsandPunctuation +extern __typeof (xmlUCSIsCJKSymbolsandPunctuation) xmlUCSIsCJKSymbolsandPunctuation __attribute((alias("xmlUCSIsCJKSymbolsandPunctuation__internal_alias"))); +#else +#ifndef xmlUCSIsCJKSymbolsandPunctuation +extern __typeof (xmlUCSIsCJKSymbolsandPunctuation) xmlUCSIsCJKSymbolsandPunctuation__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCJKSymbolsandPunctuation xmlUCSIsCJKSymbolsandPunctuation__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCJKUnifiedIdeographs +extern __typeof (xmlUCSIsCJKUnifiedIdeographs) xmlUCSIsCJKUnifiedIdeographs __attribute((alias("xmlUCSIsCJKUnifiedIdeographs__internal_alias"))); +#else +#ifndef xmlUCSIsCJKUnifiedIdeographs +extern __typeof (xmlUCSIsCJKUnifiedIdeographs) xmlUCSIsCJKUnifiedIdeographs__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCJKUnifiedIdeographs xmlUCSIsCJKUnifiedIdeographs__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCJKUnifiedIdeographsExtensionA +extern __typeof (xmlUCSIsCJKUnifiedIdeographsExtensionA) xmlUCSIsCJKUnifiedIdeographsExtensionA __attribute((alias("xmlUCSIsCJKUnifiedIdeographsExtensionA__internal_alias"))); +#else +#ifndef xmlUCSIsCJKUnifiedIdeographsExtensionA +extern __typeof (xmlUCSIsCJKUnifiedIdeographsExtensionA) xmlUCSIsCJKUnifiedIdeographsExtensionA__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCJKUnifiedIdeographsExtensionA xmlUCSIsCJKUnifiedIdeographsExtensionA__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCJKUnifiedIdeographsExtensionB +extern __typeof (xmlUCSIsCJKUnifiedIdeographsExtensionB) xmlUCSIsCJKUnifiedIdeographsExtensionB __attribute((alias("xmlUCSIsCJKUnifiedIdeographsExtensionB__internal_alias"))); +#else +#ifndef xmlUCSIsCJKUnifiedIdeographsExtensionB +extern __typeof (xmlUCSIsCJKUnifiedIdeographsExtensionB) xmlUCSIsCJKUnifiedIdeographsExtensionB__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCJKUnifiedIdeographsExtensionB xmlUCSIsCJKUnifiedIdeographsExtensionB__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCat +extern __typeof (xmlUCSIsCat) xmlUCSIsCat __attribute((alias("xmlUCSIsCat__internal_alias"))); +#else +#ifndef xmlUCSIsCat +extern __typeof (xmlUCSIsCat) xmlUCSIsCat__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCat xmlUCSIsCat__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCatC +extern __typeof (xmlUCSIsCatC) xmlUCSIsCatC __attribute((alias("xmlUCSIsCatC__internal_alias"))); +#else +#ifndef xmlUCSIsCatC +extern __typeof (xmlUCSIsCatC) xmlUCSIsCatC__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCatC xmlUCSIsCatC__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCatCc +extern __typeof (xmlUCSIsCatCc) xmlUCSIsCatCc __attribute((alias("xmlUCSIsCatCc__internal_alias"))); +#else +#ifndef xmlUCSIsCatCc +extern __typeof (xmlUCSIsCatCc) xmlUCSIsCatCc__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCatCc xmlUCSIsCatCc__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCatCf +extern __typeof (xmlUCSIsCatCf) xmlUCSIsCatCf __attribute((alias("xmlUCSIsCatCf__internal_alias"))); +#else +#ifndef xmlUCSIsCatCf +extern __typeof (xmlUCSIsCatCf) xmlUCSIsCatCf__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCatCf xmlUCSIsCatCf__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCatCo +extern __typeof (xmlUCSIsCatCo) xmlUCSIsCatCo __attribute((alias("xmlUCSIsCatCo__internal_alias"))); +#else +#ifndef xmlUCSIsCatCo +extern __typeof (xmlUCSIsCatCo) xmlUCSIsCatCo__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCatCo xmlUCSIsCatCo__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCatCs +extern __typeof (xmlUCSIsCatCs) xmlUCSIsCatCs __attribute((alias("xmlUCSIsCatCs__internal_alias"))); +#else +#ifndef xmlUCSIsCatCs +extern __typeof (xmlUCSIsCatCs) xmlUCSIsCatCs__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCatCs xmlUCSIsCatCs__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCatL +extern __typeof (xmlUCSIsCatL) xmlUCSIsCatL __attribute((alias("xmlUCSIsCatL__internal_alias"))); +#else +#ifndef xmlUCSIsCatL +extern __typeof (xmlUCSIsCatL) xmlUCSIsCatL__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCatL xmlUCSIsCatL__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCatLl +extern __typeof (xmlUCSIsCatLl) xmlUCSIsCatLl __attribute((alias("xmlUCSIsCatLl__internal_alias"))); +#else +#ifndef xmlUCSIsCatLl +extern __typeof (xmlUCSIsCatLl) xmlUCSIsCatLl__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCatLl xmlUCSIsCatLl__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCatLm +extern __typeof (xmlUCSIsCatLm) xmlUCSIsCatLm __attribute((alias("xmlUCSIsCatLm__internal_alias"))); +#else +#ifndef xmlUCSIsCatLm +extern __typeof (xmlUCSIsCatLm) xmlUCSIsCatLm__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCatLm xmlUCSIsCatLm__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCatLo +extern __typeof (xmlUCSIsCatLo) xmlUCSIsCatLo __attribute((alias("xmlUCSIsCatLo__internal_alias"))); +#else +#ifndef xmlUCSIsCatLo +extern __typeof (xmlUCSIsCatLo) xmlUCSIsCatLo__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCatLo xmlUCSIsCatLo__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCatLt +extern __typeof (xmlUCSIsCatLt) xmlUCSIsCatLt __attribute((alias("xmlUCSIsCatLt__internal_alias"))); +#else +#ifndef xmlUCSIsCatLt +extern __typeof (xmlUCSIsCatLt) xmlUCSIsCatLt__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCatLt xmlUCSIsCatLt__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCatLu +extern __typeof (xmlUCSIsCatLu) xmlUCSIsCatLu __attribute((alias("xmlUCSIsCatLu__internal_alias"))); +#else +#ifndef xmlUCSIsCatLu +extern __typeof (xmlUCSIsCatLu) xmlUCSIsCatLu__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCatLu xmlUCSIsCatLu__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCatM +extern __typeof (xmlUCSIsCatM) xmlUCSIsCatM __attribute((alias("xmlUCSIsCatM__internal_alias"))); +#else +#ifndef xmlUCSIsCatM +extern __typeof (xmlUCSIsCatM) xmlUCSIsCatM__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCatM xmlUCSIsCatM__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCatMc +extern __typeof (xmlUCSIsCatMc) xmlUCSIsCatMc __attribute((alias("xmlUCSIsCatMc__internal_alias"))); +#else +#ifndef xmlUCSIsCatMc +extern __typeof (xmlUCSIsCatMc) xmlUCSIsCatMc__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCatMc xmlUCSIsCatMc__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCatMe +extern __typeof (xmlUCSIsCatMe) xmlUCSIsCatMe __attribute((alias("xmlUCSIsCatMe__internal_alias"))); +#else +#ifndef xmlUCSIsCatMe +extern __typeof (xmlUCSIsCatMe) xmlUCSIsCatMe__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCatMe xmlUCSIsCatMe__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCatMn +extern __typeof (xmlUCSIsCatMn) xmlUCSIsCatMn __attribute((alias("xmlUCSIsCatMn__internal_alias"))); +#else +#ifndef xmlUCSIsCatMn +extern __typeof (xmlUCSIsCatMn) xmlUCSIsCatMn__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCatMn xmlUCSIsCatMn__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCatN +extern __typeof (xmlUCSIsCatN) xmlUCSIsCatN __attribute((alias("xmlUCSIsCatN__internal_alias"))); +#else +#ifndef xmlUCSIsCatN +extern __typeof (xmlUCSIsCatN) xmlUCSIsCatN__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCatN xmlUCSIsCatN__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCatNd +extern __typeof (xmlUCSIsCatNd) xmlUCSIsCatNd __attribute((alias("xmlUCSIsCatNd__internal_alias"))); +#else +#ifndef xmlUCSIsCatNd +extern __typeof (xmlUCSIsCatNd) xmlUCSIsCatNd__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCatNd xmlUCSIsCatNd__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCatNl +extern __typeof (xmlUCSIsCatNl) xmlUCSIsCatNl __attribute((alias("xmlUCSIsCatNl__internal_alias"))); +#else +#ifndef xmlUCSIsCatNl +extern __typeof (xmlUCSIsCatNl) xmlUCSIsCatNl__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCatNl xmlUCSIsCatNl__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCatNo +extern __typeof (xmlUCSIsCatNo) xmlUCSIsCatNo __attribute((alias("xmlUCSIsCatNo__internal_alias"))); +#else +#ifndef xmlUCSIsCatNo +extern __typeof (xmlUCSIsCatNo) xmlUCSIsCatNo__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCatNo xmlUCSIsCatNo__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCatP +extern __typeof (xmlUCSIsCatP) xmlUCSIsCatP __attribute((alias("xmlUCSIsCatP__internal_alias"))); +#else +#ifndef xmlUCSIsCatP +extern __typeof (xmlUCSIsCatP) xmlUCSIsCatP__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCatP xmlUCSIsCatP__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCatPc +extern __typeof (xmlUCSIsCatPc) xmlUCSIsCatPc __attribute((alias("xmlUCSIsCatPc__internal_alias"))); +#else +#ifndef xmlUCSIsCatPc +extern __typeof (xmlUCSIsCatPc) xmlUCSIsCatPc__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCatPc xmlUCSIsCatPc__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCatPd +extern __typeof (xmlUCSIsCatPd) xmlUCSIsCatPd __attribute((alias("xmlUCSIsCatPd__internal_alias"))); +#else +#ifndef xmlUCSIsCatPd +extern __typeof (xmlUCSIsCatPd) xmlUCSIsCatPd__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCatPd xmlUCSIsCatPd__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCatPe +extern __typeof (xmlUCSIsCatPe) xmlUCSIsCatPe __attribute((alias("xmlUCSIsCatPe__internal_alias"))); +#else +#ifndef xmlUCSIsCatPe +extern __typeof (xmlUCSIsCatPe) xmlUCSIsCatPe__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCatPe xmlUCSIsCatPe__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCatPf +extern __typeof (xmlUCSIsCatPf) xmlUCSIsCatPf __attribute((alias("xmlUCSIsCatPf__internal_alias"))); +#else +#ifndef xmlUCSIsCatPf +extern __typeof (xmlUCSIsCatPf) xmlUCSIsCatPf__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCatPf xmlUCSIsCatPf__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCatPi +extern __typeof (xmlUCSIsCatPi) xmlUCSIsCatPi __attribute((alias("xmlUCSIsCatPi__internal_alias"))); +#else +#ifndef xmlUCSIsCatPi +extern __typeof (xmlUCSIsCatPi) xmlUCSIsCatPi__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCatPi xmlUCSIsCatPi__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCatPo +extern __typeof (xmlUCSIsCatPo) xmlUCSIsCatPo __attribute((alias("xmlUCSIsCatPo__internal_alias"))); +#else +#ifndef xmlUCSIsCatPo +extern __typeof (xmlUCSIsCatPo) xmlUCSIsCatPo__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCatPo xmlUCSIsCatPo__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCatPs +extern __typeof (xmlUCSIsCatPs) xmlUCSIsCatPs __attribute((alias("xmlUCSIsCatPs__internal_alias"))); +#else +#ifndef xmlUCSIsCatPs +extern __typeof (xmlUCSIsCatPs) xmlUCSIsCatPs__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCatPs xmlUCSIsCatPs__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCatS +extern __typeof (xmlUCSIsCatS) xmlUCSIsCatS __attribute((alias("xmlUCSIsCatS__internal_alias"))); +#else +#ifndef xmlUCSIsCatS +extern __typeof (xmlUCSIsCatS) xmlUCSIsCatS__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCatS xmlUCSIsCatS__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCatSc +extern __typeof (xmlUCSIsCatSc) xmlUCSIsCatSc __attribute((alias("xmlUCSIsCatSc__internal_alias"))); +#else +#ifndef xmlUCSIsCatSc +extern __typeof (xmlUCSIsCatSc) xmlUCSIsCatSc__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCatSc xmlUCSIsCatSc__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCatSk +extern __typeof (xmlUCSIsCatSk) xmlUCSIsCatSk __attribute((alias("xmlUCSIsCatSk__internal_alias"))); +#else +#ifndef xmlUCSIsCatSk +extern __typeof (xmlUCSIsCatSk) xmlUCSIsCatSk__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCatSk xmlUCSIsCatSk__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCatSm +extern __typeof (xmlUCSIsCatSm) xmlUCSIsCatSm __attribute((alias("xmlUCSIsCatSm__internal_alias"))); +#else +#ifndef xmlUCSIsCatSm +extern __typeof (xmlUCSIsCatSm) xmlUCSIsCatSm__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCatSm xmlUCSIsCatSm__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCatSo +extern __typeof (xmlUCSIsCatSo) xmlUCSIsCatSo __attribute((alias("xmlUCSIsCatSo__internal_alias"))); +#else +#ifndef xmlUCSIsCatSo +extern __typeof (xmlUCSIsCatSo) xmlUCSIsCatSo__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCatSo xmlUCSIsCatSo__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCatZ +extern __typeof (xmlUCSIsCatZ) xmlUCSIsCatZ __attribute((alias("xmlUCSIsCatZ__internal_alias"))); +#else +#ifndef xmlUCSIsCatZ +extern __typeof (xmlUCSIsCatZ) xmlUCSIsCatZ__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCatZ xmlUCSIsCatZ__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCatZl +extern __typeof (xmlUCSIsCatZl) xmlUCSIsCatZl __attribute((alias("xmlUCSIsCatZl__internal_alias"))); +#else +#ifndef xmlUCSIsCatZl +extern __typeof (xmlUCSIsCatZl) xmlUCSIsCatZl__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCatZl xmlUCSIsCatZl__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCatZp +extern __typeof (xmlUCSIsCatZp) xmlUCSIsCatZp __attribute((alias("xmlUCSIsCatZp__internal_alias"))); +#else +#ifndef xmlUCSIsCatZp +extern __typeof (xmlUCSIsCatZp) xmlUCSIsCatZp__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCatZp xmlUCSIsCatZp__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCatZs +extern __typeof (xmlUCSIsCatZs) xmlUCSIsCatZs __attribute((alias("xmlUCSIsCatZs__internal_alias"))); +#else +#ifndef xmlUCSIsCatZs +extern __typeof (xmlUCSIsCatZs) xmlUCSIsCatZs__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCatZs xmlUCSIsCatZs__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCherokee +extern __typeof (xmlUCSIsCherokee) xmlUCSIsCherokee __attribute((alias("xmlUCSIsCherokee__internal_alias"))); +#else +#ifndef xmlUCSIsCherokee +extern __typeof (xmlUCSIsCherokee) xmlUCSIsCherokee__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCherokee xmlUCSIsCherokee__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCombiningDiacriticalMarks +extern __typeof (xmlUCSIsCombiningDiacriticalMarks) xmlUCSIsCombiningDiacriticalMarks __attribute((alias("xmlUCSIsCombiningDiacriticalMarks__internal_alias"))); +#else +#ifndef xmlUCSIsCombiningDiacriticalMarks +extern __typeof (xmlUCSIsCombiningDiacriticalMarks) xmlUCSIsCombiningDiacriticalMarks__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCombiningDiacriticalMarks xmlUCSIsCombiningDiacriticalMarks__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCombiningDiacriticalMarksforSymbols +extern __typeof (xmlUCSIsCombiningDiacriticalMarksforSymbols) xmlUCSIsCombiningDiacriticalMarksforSymbols __attribute((alias("xmlUCSIsCombiningDiacriticalMarksforSymbols__internal_alias"))); +#else +#ifndef xmlUCSIsCombiningDiacriticalMarksforSymbols +extern __typeof (xmlUCSIsCombiningDiacriticalMarksforSymbols) xmlUCSIsCombiningDiacriticalMarksforSymbols__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCombiningDiacriticalMarksforSymbols xmlUCSIsCombiningDiacriticalMarksforSymbols__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCombiningHalfMarks +extern __typeof (xmlUCSIsCombiningHalfMarks) xmlUCSIsCombiningHalfMarks __attribute((alias("xmlUCSIsCombiningHalfMarks__internal_alias"))); +#else +#ifndef xmlUCSIsCombiningHalfMarks +extern __typeof (xmlUCSIsCombiningHalfMarks) xmlUCSIsCombiningHalfMarks__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCombiningHalfMarks xmlUCSIsCombiningHalfMarks__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCombiningMarksforSymbols +extern __typeof (xmlUCSIsCombiningMarksforSymbols) xmlUCSIsCombiningMarksforSymbols __attribute((alias("xmlUCSIsCombiningMarksforSymbols__internal_alias"))); +#else +#ifndef xmlUCSIsCombiningMarksforSymbols +extern __typeof (xmlUCSIsCombiningMarksforSymbols) xmlUCSIsCombiningMarksforSymbols__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCombiningMarksforSymbols xmlUCSIsCombiningMarksforSymbols__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsControlPictures +extern __typeof (xmlUCSIsControlPictures) xmlUCSIsControlPictures __attribute((alias("xmlUCSIsControlPictures__internal_alias"))); +#else +#ifndef xmlUCSIsControlPictures +extern __typeof (xmlUCSIsControlPictures) xmlUCSIsControlPictures__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsControlPictures xmlUCSIsControlPictures__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCurrencySymbols +extern __typeof (xmlUCSIsCurrencySymbols) xmlUCSIsCurrencySymbols __attribute((alias("xmlUCSIsCurrencySymbols__internal_alias"))); +#else +#ifndef xmlUCSIsCurrencySymbols +extern __typeof (xmlUCSIsCurrencySymbols) xmlUCSIsCurrencySymbols__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCurrencySymbols xmlUCSIsCurrencySymbols__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCypriotSyllabary +extern __typeof (xmlUCSIsCypriotSyllabary) xmlUCSIsCypriotSyllabary __attribute((alias("xmlUCSIsCypriotSyllabary__internal_alias"))); +#else +#ifndef xmlUCSIsCypriotSyllabary +extern __typeof (xmlUCSIsCypriotSyllabary) xmlUCSIsCypriotSyllabary__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCypriotSyllabary xmlUCSIsCypriotSyllabary__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCyrillic +extern __typeof (xmlUCSIsCyrillic) xmlUCSIsCyrillic __attribute((alias("xmlUCSIsCyrillic__internal_alias"))); +#else +#ifndef xmlUCSIsCyrillic +extern __typeof (xmlUCSIsCyrillic) xmlUCSIsCyrillic__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCyrillic xmlUCSIsCyrillic__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsCyrillicSupplement +extern __typeof (xmlUCSIsCyrillicSupplement) xmlUCSIsCyrillicSupplement __attribute((alias("xmlUCSIsCyrillicSupplement__internal_alias"))); +#else +#ifndef xmlUCSIsCyrillicSupplement +extern __typeof (xmlUCSIsCyrillicSupplement) xmlUCSIsCyrillicSupplement__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsCyrillicSupplement xmlUCSIsCyrillicSupplement__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsDeseret +extern __typeof (xmlUCSIsDeseret) xmlUCSIsDeseret __attribute((alias("xmlUCSIsDeseret__internal_alias"))); +#else +#ifndef xmlUCSIsDeseret +extern __typeof (xmlUCSIsDeseret) xmlUCSIsDeseret__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsDeseret xmlUCSIsDeseret__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsDevanagari +extern __typeof (xmlUCSIsDevanagari) xmlUCSIsDevanagari __attribute((alias("xmlUCSIsDevanagari__internal_alias"))); +#else +#ifndef xmlUCSIsDevanagari +extern __typeof (xmlUCSIsDevanagari) xmlUCSIsDevanagari__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsDevanagari xmlUCSIsDevanagari__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsDingbats +extern __typeof (xmlUCSIsDingbats) xmlUCSIsDingbats __attribute((alias("xmlUCSIsDingbats__internal_alias"))); +#else +#ifndef xmlUCSIsDingbats +extern __typeof (xmlUCSIsDingbats) xmlUCSIsDingbats__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsDingbats xmlUCSIsDingbats__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsEnclosedAlphanumerics +extern __typeof (xmlUCSIsEnclosedAlphanumerics) xmlUCSIsEnclosedAlphanumerics __attribute((alias("xmlUCSIsEnclosedAlphanumerics__internal_alias"))); +#else +#ifndef xmlUCSIsEnclosedAlphanumerics +extern __typeof (xmlUCSIsEnclosedAlphanumerics) xmlUCSIsEnclosedAlphanumerics__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsEnclosedAlphanumerics xmlUCSIsEnclosedAlphanumerics__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsEnclosedCJKLettersandMonths +extern __typeof (xmlUCSIsEnclosedCJKLettersandMonths) xmlUCSIsEnclosedCJKLettersandMonths __attribute((alias("xmlUCSIsEnclosedCJKLettersandMonths__internal_alias"))); +#else +#ifndef xmlUCSIsEnclosedCJKLettersandMonths +extern __typeof (xmlUCSIsEnclosedCJKLettersandMonths) xmlUCSIsEnclosedCJKLettersandMonths__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsEnclosedCJKLettersandMonths xmlUCSIsEnclosedCJKLettersandMonths__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsEthiopic +extern __typeof (xmlUCSIsEthiopic) xmlUCSIsEthiopic __attribute((alias("xmlUCSIsEthiopic__internal_alias"))); +#else +#ifndef xmlUCSIsEthiopic +extern __typeof (xmlUCSIsEthiopic) xmlUCSIsEthiopic__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsEthiopic xmlUCSIsEthiopic__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsGeneralPunctuation +extern __typeof (xmlUCSIsGeneralPunctuation) xmlUCSIsGeneralPunctuation __attribute((alias("xmlUCSIsGeneralPunctuation__internal_alias"))); +#else +#ifndef xmlUCSIsGeneralPunctuation +extern __typeof (xmlUCSIsGeneralPunctuation) xmlUCSIsGeneralPunctuation__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsGeneralPunctuation xmlUCSIsGeneralPunctuation__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsGeometricShapes +extern __typeof (xmlUCSIsGeometricShapes) xmlUCSIsGeometricShapes __attribute((alias("xmlUCSIsGeometricShapes__internal_alias"))); +#else +#ifndef xmlUCSIsGeometricShapes +extern __typeof (xmlUCSIsGeometricShapes) xmlUCSIsGeometricShapes__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsGeometricShapes xmlUCSIsGeometricShapes__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsGeorgian +extern __typeof (xmlUCSIsGeorgian) xmlUCSIsGeorgian __attribute((alias("xmlUCSIsGeorgian__internal_alias"))); +#else +#ifndef xmlUCSIsGeorgian +extern __typeof (xmlUCSIsGeorgian) xmlUCSIsGeorgian__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsGeorgian xmlUCSIsGeorgian__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsGothic +extern __typeof (xmlUCSIsGothic) xmlUCSIsGothic __attribute((alias("xmlUCSIsGothic__internal_alias"))); +#else +#ifndef xmlUCSIsGothic +extern __typeof (xmlUCSIsGothic) xmlUCSIsGothic__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsGothic xmlUCSIsGothic__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsGreek +extern __typeof (xmlUCSIsGreek) xmlUCSIsGreek __attribute((alias("xmlUCSIsGreek__internal_alias"))); +#else +#ifndef xmlUCSIsGreek +extern __typeof (xmlUCSIsGreek) xmlUCSIsGreek__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsGreek xmlUCSIsGreek__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsGreekExtended +extern __typeof (xmlUCSIsGreekExtended) xmlUCSIsGreekExtended __attribute((alias("xmlUCSIsGreekExtended__internal_alias"))); +#else +#ifndef xmlUCSIsGreekExtended +extern __typeof (xmlUCSIsGreekExtended) xmlUCSIsGreekExtended__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsGreekExtended xmlUCSIsGreekExtended__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsGreekandCoptic +extern __typeof (xmlUCSIsGreekandCoptic) xmlUCSIsGreekandCoptic __attribute((alias("xmlUCSIsGreekandCoptic__internal_alias"))); +#else +#ifndef xmlUCSIsGreekandCoptic +extern __typeof (xmlUCSIsGreekandCoptic) xmlUCSIsGreekandCoptic__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsGreekandCoptic xmlUCSIsGreekandCoptic__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsGujarati +extern __typeof (xmlUCSIsGujarati) xmlUCSIsGujarati __attribute((alias("xmlUCSIsGujarati__internal_alias"))); +#else +#ifndef xmlUCSIsGujarati +extern __typeof (xmlUCSIsGujarati) xmlUCSIsGujarati__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsGujarati xmlUCSIsGujarati__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsGurmukhi +extern __typeof (xmlUCSIsGurmukhi) xmlUCSIsGurmukhi __attribute((alias("xmlUCSIsGurmukhi__internal_alias"))); +#else +#ifndef xmlUCSIsGurmukhi +extern __typeof (xmlUCSIsGurmukhi) xmlUCSIsGurmukhi__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsGurmukhi xmlUCSIsGurmukhi__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsHalfwidthandFullwidthForms +extern __typeof (xmlUCSIsHalfwidthandFullwidthForms) xmlUCSIsHalfwidthandFullwidthForms __attribute((alias("xmlUCSIsHalfwidthandFullwidthForms__internal_alias"))); +#else +#ifndef xmlUCSIsHalfwidthandFullwidthForms +extern __typeof (xmlUCSIsHalfwidthandFullwidthForms) xmlUCSIsHalfwidthandFullwidthForms__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsHalfwidthandFullwidthForms xmlUCSIsHalfwidthandFullwidthForms__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsHangulCompatibilityJamo +extern __typeof (xmlUCSIsHangulCompatibilityJamo) xmlUCSIsHangulCompatibilityJamo __attribute((alias("xmlUCSIsHangulCompatibilityJamo__internal_alias"))); +#else +#ifndef xmlUCSIsHangulCompatibilityJamo +extern __typeof (xmlUCSIsHangulCompatibilityJamo) xmlUCSIsHangulCompatibilityJamo__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsHangulCompatibilityJamo xmlUCSIsHangulCompatibilityJamo__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsHangulJamo +extern __typeof (xmlUCSIsHangulJamo) xmlUCSIsHangulJamo __attribute((alias("xmlUCSIsHangulJamo__internal_alias"))); +#else +#ifndef xmlUCSIsHangulJamo +extern __typeof (xmlUCSIsHangulJamo) xmlUCSIsHangulJamo__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsHangulJamo xmlUCSIsHangulJamo__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsHangulSyllables +extern __typeof (xmlUCSIsHangulSyllables) xmlUCSIsHangulSyllables __attribute((alias("xmlUCSIsHangulSyllables__internal_alias"))); +#else +#ifndef xmlUCSIsHangulSyllables +extern __typeof (xmlUCSIsHangulSyllables) xmlUCSIsHangulSyllables__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsHangulSyllables xmlUCSIsHangulSyllables__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsHanunoo +extern __typeof (xmlUCSIsHanunoo) xmlUCSIsHanunoo __attribute((alias("xmlUCSIsHanunoo__internal_alias"))); +#else +#ifndef xmlUCSIsHanunoo +extern __typeof (xmlUCSIsHanunoo) xmlUCSIsHanunoo__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsHanunoo xmlUCSIsHanunoo__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsHebrew +extern __typeof (xmlUCSIsHebrew) xmlUCSIsHebrew __attribute((alias("xmlUCSIsHebrew__internal_alias"))); +#else +#ifndef xmlUCSIsHebrew +extern __typeof (xmlUCSIsHebrew) xmlUCSIsHebrew__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsHebrew xmlUCSIsHebrew__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsHighPrivateUseSurrogates +extern __typeof (xmlUCSIsHighPrivateUseSurrogates) xmlUCSIsHighPrivateUseSurrogates __attribute((alias("xmlUCSIsHighPrivateUseSurrogates__internal_alias"))); +#else +#ifndef xmlUCSIsHighPrivateUseSurrogates +extern __typeof (xmlUCSIsHighPrivateUseSurrogates) xmlUCSIsHighPrivateUseSurrogates__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsHighPrivateUseSurrogates xmlUCSIsHighPrivateUseSurrogates__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsHighSurrogates +extern __typeof (xmlUCSIsHighSurrogates) xmlUCSIsHighSurrogates __attribute((alias("xmlUCSIsHighSurrogates__internal_alias"))); +#else +#ifndef xmlUCSIsHighSurrogates +extern __typeof (xmlUCSIsHighSurrogates) xmlUCSIsHighSurrogates__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsHighSurrogates xmlUCSIsHighSurrogates__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsHiragana +extern __typeof (xmlUCSIsHiragana) xmlUCSIsHiragana __attribute((alias("xmlUCSIsHiragana__internal_alias"))); +#else +#ifndef xmlUCSIsHiragana +extern __typeof (xmlUCSIsHiragana) xmlUCSIsHiragana__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsHiragana xmlUCSIsHiragana__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsIPAExtensions +extern __typeof (xmlUCSIsIPAExtensions) xmlUCSIsIPAExtensions __attribute((alias("xmlUCSIsIPAExtensions__internal_alias"))); +#else +#ifndef xmlUCSIsIPAExtensions +extern __typeof (xmlUCSIsIPAExtensions) xmlUCSIsIPAExtensions__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsIPAExtensions xmlUCSIsIPAExtensions__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsIdeographicDescriptionCharacters +extern __typeof (xmlUCSIsIdeographicDescriptionCharacters) xmlUCSIsIdeographicDescriptionCharacters __attribute((alias("xmlUCSIsIdeographicDescriptionCharacters__internal_alias"))); +#else +#ifndef xmlUCSIsIdeographicDescriptionCharacters +extern __typeof (xmlUCSIsIdeographicDescriptionCharacters) xmlUCSIsIdeographicDescriptionCharacters__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsIdeographicDescriptionCharacters xmlUCSIsIdeographicDescriptionCharacters__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsKanbun +extern __typeof (xmlUCSIsKanbun) xmlUCSIsKanbun __attribute((alias("xmlUCSIsKanbun__internal_alias"))); +#else +#ifndef xmlUCSIsKanbun +extern __typeof (xmlUCSIsKanbun) xmlUCSIsKanbun__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsKanbun xmlUCSIsKanbun__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsKangxiRadicals +extern __typeof (xmlUCSIsKangxiRadicals) xmlUCSIsKangxiRadicals __attribute((alias("xmlUCSIsKangxiRadicals__internal_alias"))); +#else +#ifndef xmlUCSIsKangxiRadicals +extern __typeof (xmlUCSIsKangxiRadicals) xmlUCSIsKangxiRadicals__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsKangxiRadicals xmlUCSIsKangxiRadicals__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsKannada +extern __typeof (xmlUCSIsKannada) xmlUCSIsKannada __attribute((alias("xmlUCSIsKannada__internal_alias"))); +#else +#ifndef xmlUCSIsKannada +extern __typeof (xmlUCSIsKannada) xmlUCSIsKannada__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsKannada xmlUCSIsKannada__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsKatakana +extern __typeof (xmlUCSIsKatakana) xmlUCSIsKatakana __attribute((alias("xmlUCSIsKatakana__internal_alias"))); +#else +#ifndef xmlUCSIsKatakana +extern __typeof (xmlUCSIsKatakana) xmlUCSIsKatakana__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsKatakana xmlUCSIsKatakana__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsKatakanaPhoneticExtensions +extern __typeof (xmlUCSIsKatakanaPhoneticExtensions) xmlUCSIsKatakanaPhoneticExtensions __attribute((alias("xmlUCSIsKatakanaPhoneticExtensions__internal_alias"))); +#else +#ifndef xmlUCSIsKatakanaPhoneticExtensions +extern __typeof (xmlUCSIsKatakanaPhoneticExtensions) xmlUCSIsKatakanaPhoneticExtensions__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsKatakanaPhoneticExtensions xmlUCSIsKatakanaPhoneticExtensions__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsKhmer +extern __typeof (xmlUCSIsKhmer) xmlUCSIsKhmer __attribute((alias("xmlUCSIsKhmer__internal_alias"))); +#else +#ifndef xmlUCSIsKhmer +extern __typeof (xmlUCSIsKhmer) xmlUCSIsKhmer__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsKhmer xmlUCSIsKhmer__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsKhmerSymbols +extern __typeof (xmlUCSIsKhmerSymbols) xmlUCSIsKhmerSymbols __attribute((alias("xmlUCSIsKhmerSymbols__internal_alias"))); +#else +#ifndef xmlUCSIsKhmerSymbols +extern __typeof (xmlUCSIsKhmerSymbols) xmlUCSIsKhmerSymbols__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsKhmerSymbols xmlUCSIsKhmerSymbols__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsLao +extern __typeof (xmlUCSIsLao) xmlUCSIsLao __attribute((alias("xmlUCSIsLao__internal_alias"))); +#else +#ifndef xmlUCSIsLao +extern __typeof (xmlUCSIsLao) xmlUCSIsLao__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsLao xmlUCSIsLao__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsLatin1Supplement +extern __typeof (xmlUCSIsLatin1Supplement) xmlUCSIsLatin1Supplement __attribute((alias("xmlUCSIsLatin1Supplement__internal_alias"))); +#else +#ifndef xmlUCSIsLatin1Supplement +extern __typeof (xmlUCSIsLatin1Supplement) xmlUCSIsLatin1Supplement__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsLatin1Supplement xmlUCSIsLatin1Supplement__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsLatinExtendedA +extern __typeof (xmlUCSIsLatinExtendedA) xmlUCSIsLatinExtendedA __attribute((alias("xmlUCSIsLatinExtendedA__internal_alias"))); +#else +#ifndef xmlUCSIsLatinExtendedA +extern __typeof (xmlUCSIsLatinExtendedA) xmlUCSIsLatinExtendedA__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsLatinExtendedA xmlUCSIsLatinExtendedA__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsLatinExtendedAdditional +extern __typeof (xmlUCSIsLatinExtendedAdditional) xmlUCSIsLatinExtendedAdditional __attribute((alias("xmlUCSIsLatinExtendedAdditional__internal_alias"))); +#else +#ifndef xmlUCSIsLatinExtendedAdditional +extern __typeof (xmlUCSIsLatinExtendedAdditional) xmlUCSIsLatinExtendedAdditional__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsLatinExtendedAdditional xmlUCSIsLatinExtendedAdditional__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsLatinExtendedB +extern __typeof (xmlUCSIsLatinExtendedB) xmlUCSIsLatinExtendedB __attribute((alias("xmlUCSIsLatinExtendedB__internal_alias"))); +#else +#ifndef xmlUCSIsLatinExtendedB +extern __typeof (xmlUCSIsLatinExtendedB) xmlUCSIsLatinExtendedB__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsLatinExtendedB xmlUCSIsLatinExtendedB__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsLetterlikeSymbols +extern __typeof (xmlUCSIsLetterlikeSymbols) xmlUCSIsLetterlikeSymbols __attribute((alias("xmlUCSIsLetterlikeSymbols__internal_alias"))); +#else +#ifndef xmlUCSIsLetterlikeSymbols +extern __typeof (xmlUCSIsLetterlikeSymbols) xmlUCSIsLetterlikeSymbols__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsLetterlikeSymbols xmlUCSIsLetterlikeSymbols__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsLimbu +extern __typeof (xmlUCSIsLimbu) xmlUCSIsLimbu __attribute((alias("xmlUCSIsLimbu__internal_alias"))); +#else +#ifndef xmlUCSIsLimbu +extern __typeof (xmlUCSIsLimbu) xmlUCSIsLimbu__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsLimbu xmlUCSIsLimbu__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsLinearBIdeograms +extern __typeof (xmlUCSIsLinearBIdeograms) xmlUCSIsLinearBIdeograms __attribute((alias("xmlUCSIsLinearBIdeograms__internal_alias"))); +#else +#ifndef xmlUCSIsLinearBIdeograms +extern __typeof (xmlUCSIsLinearBIdeograms) xmlUCSIsLinearBIdeograms__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsLinearBIdeograms xmlUCSIsLinearBIdeograms__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsLinearBSyllabary +extern __typeof (xmlUCSIsLinearBSyllabary) xmlUCSIsLinearBSyllabary __attribute((alias("xmlUCSIsLinearBSyllabary__internal_alias"))); +#else +#ifndef xmlUCSIsLinearBSyllabary +extern __typeof (xmlUCSIsLinearBSyllabary) xmlUCSIsLinearBSyllabary__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsLinearBSyllabary xmlUCSIsLinearBSyllabary__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsLowSurrogates +extern __typeof (xmlUCSIsLowSurrogates) xmlUCSIsLowSurrogates __attribute((alias("xmlUCSIsLowSurrogates__internal_alias"))); +#else +#ifndef xmlUCSIsLowSurrogates +extern __typeof (xmlUCSIsLowSurrogates) xmlUCSIsLowSurrogates__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsLowSurrogates xmlUCSIsLowSurrogates__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsMalayalam +extern __typeof (xmlUCSIsMalayalam) xmlUCSIsMalayalam __attribute((alias("xmlUCSIsMalayalam__internal_alias"))); +#else +#ifndef xmlUCSIsMalayalam +extern __typeof (xmlUCSIsMalayalam) xmlUCSIsMalayalam__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsMalayalam xmlUCSIsMalayalam__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsMathematicalAlphanumericSymbols +extern __typeof (xmlUCSIsMathematicalAlphanumericSymbols) xmlUCSIsMathematicalAlphanumericSymbols __attribute((alias("xmlUCSIsMathematicalAlphanumericSymbols__internal_alias"))); +#else +#ifndef xmlUCSIsMathematicalAlphanumericSymbols +extern __typeof (xmlUCSIsMathematicalAlphanumericSymbols) xmlUCSIsMathematicalAlphanumericSymbols__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsMathematicalAlphanumericSymbols xmlUCSIsMathematicalAlphanumericSymbols__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsMathematicalOperators +extern __typeof (xmlUCSIsMathematicalOperators) xmlUCSIsMathematicalOperators __attribute((alias("xmlUCSIsMathematicalOperators__internal_alias"))); +#else +#ifndef xmlUCSIsMathematicalOperators +extern __typeof (xmlUCSIsMathematicalOperators) xmlUCSIsMathematicalOperators__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsMathematicalOperators xmlUCSIsMathematicalOperators__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsMiscellaneousMathematicalSymbolsA +extern __typeof (xmlUCSIsMiscellaneousMathematicalSymbolsA) xmlUCSIsMiscellaneousMathematicalSymbolsA __attribute((alias("xmlUCSIsMiscellaneousMathematicalSymbolsA__internal_alias"))); +#else +#ifndef xmlUCSIsMiscellaneousMathematicalSymbolsA +extern __typeof (xmlUCSIsMiscellaneousMathematicalSymbolsA) xmlUCSIsMiscellaneousMathematicalSymbolsA__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsMiscellaneousMathematicalSymbolsA xmlUCSIsMiscellaneousMathematicalSymbolsA__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsMiscellaneousMathematicalSymbolsB +extern __typeof (xmlUCSIsMiscellaneousMathematicalSymbolsB) xmlUCSIsMiscellaneousMathematicalSymbolsB __attribute((alias("xmlUCSIsMiscellaneousMathematicalSymbolsB__internal_alias"))); +#else +#ifndef xmlUCSIsMiscellaneousMathematicalSymbolsB +extern __typeof (xmlUCSIsMiscellaneousMathematicalSymbolsB) xmlUCSIsMiscellaneousMathematicalSymbolsB__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsMiscellaneousMathematicalSymbolsB xmlUCSIsMiscellaneousMathematicalSymbolsB__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsMiscellaneousSymbols +extern __typeof (xmlUCSIsMiscellaneousSymbols) xmlUCSIsMiscellaneousSymbols __attribute((alias("xmlUCSIsMiscellaneousSymbols__internal_alias"))); +#else +#ifndef xmlUCSIsMiscellaneousSymbols +extern __typeof (xmlUCSIsMiscellaneousSymbols) xmlUCSIsMiscellaneousSymbols__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsMiscellaneousSymbols xmlUCSIsMiscellaneousSymbols__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsMiscellaneousSymbolsandArrows +extern __typeof (xmlUCSIsMiscellaneousSymbolsandArrows) xmlUCSIsMiscellaneousSymbolsandArrows __attribute((alias("xmlUCSIsMiscellaneousSymbolsandArrows__internal_alias"))); +#else +#ifndef xmlUCSIsMiscellaneousSymbolsandArrows +extern __typeof (xmlUCSIsMiscellaneousSymbolsandArrows) xmlUCSIsMiscellaneousSymbolsandArrows__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsMiscellaneousSymbolsandArrows xmlUCSIsMiscellaneousSymbolsandArrows__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsMiscellaneousTechnical +extern __typeof (xmlUCSIsMiscellaneousTechnical) xmlUCSIsMiscellaneousTechnical __attribute((alias("xmlUCSIsMiscellaneousTechnical__internal_alias"))); +#else +#ifndef xmlUCSIsMiscellaneousTechnical +extern __typeof (xmlUCSIsMiscellaneousTechnical) xmlUCSIsMiscellaneousTechnical__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsMiscellaneousTechnical xmlUCSIsMiscellaneousTechnical__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsMongolian +extern __typeof (xmlUCSIsMongolian) xmlUCSIsMongolian __attribute((alias("xmlUCSIsMongolian__internal_alias"))); +#else +#ifndef xmlUCSIsMongolian +extern __typeof (xmlUCSIsMongolian) xmlUCSIsMongolian__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsMongolian xmlUCSIsMongolian__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsMusicalSymbols +extern __typeof (xmlUCSIsMusicalSymbols) xmlUCSIsMusicalSymbols __attribute((alias("xmlUCSIsMusicalSymbols__internal_alias"))); +#else +#ifndef xmlUCSIsMusicalSymbols +extern __typeof (xmlUCSIsMusicalSymbols) xmlUCSIsMusicalSymbols__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsMusicalSymbols xmlUCSIsMusicalSymbols__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsMyanmar +extern __typeof (xmlUCSIsMyanmar) xmlUCSIsMyanmar __attribute((alias("xmlUCSIsMyanmar__internal_alias"))); +#else +#ifndef xmlUCSIsMyanmar +extern __typeof (xmlUCSIsMyanmar) xmlUCSIsMyanmar__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsMyanmar xmlUCSIsMyanmar__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsNumberForms +extern __typeof (xmlUCSIsNumberForms) xmlUCSIsNumberForms __attribute((alias("xmlUCSIsNumberForms__internal_alias"))); +#else +#ifndef xmlUCSIsNumberForms +extern __typeof (xmlUCSIsNumberForms) xmlUCSIsNumberForms__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsNumberForms xmlUCSIsNumberForms__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsOgham +extern __typeof (xmlUCSIsOgham) xmlUCSIsOgham __attribute((alias("xmlUCSIsOgham__internal_alias"))); +#else +#ifndef xmlUCSIsOgham +extern __typeof (xmlUCSIsOgham) xmlUCSIsOgham__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsOgham xmlUCSIsOgham__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsOldItalic +extern __typeof (xmlUCSIsOldItalic) xmlUCSIsOldItalic __attribute((alias("xmlUCSIsOldItalic__internal_alias"))); +#else +#ifndef xmlUCSIsOldItalic +extern __typeof (xmlUCSIsOldItalic) xmlUCSIsOldItalic__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsOldItalic xmlUCSIsOldItalic__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsOpticalCharacterRecognition +extern __typeof (xmlUCSIsOpticalCharacterRecognition) xmlUCSIsOpticalCharacterRecognition __attribute((alias("xmlUCSIsOpticalCharacterRecognition__internal_alias"))); +#else +#ifndef xmlUCSIsOpticalCharacterRecognition +extern __typeof (xmlUCSIsOpticalCharacterRecognition) xmlUCSIsOpticalCharacterRecognition__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsOpticalCharacterRecognition xmlUCSIsOpticalCharacterRecognition__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsOriya +extern __typeof (xmlUCSIsOriya) xmlUCSIsOriya __attribute((alias("xmlUCSIsOriya__internal_alias"))); +#else +#ifndef xmlUCSIsOriya +extern __typeof (xmlUCSIsOriya) xmlUCSIsOriya__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsOriya xmlUCSIsOriya__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsOsmanya +extern __typeof (xmlUCSIsOsmanya) xmlUCSIsOsmanya __attribute((alias("xmlUCSIsOsmanya__internal_alias"))); +#else +#ifndef xmlUCSIsOsmanya +extern __typeof (xmlUCSIsOsmanya) xmlUCSIsOsmanya__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsOsmanya xmlUCSIsOsmanya__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsPhoneticExtensions +extern __typeof (xmlUCSIsPhoneticExtensions) xmlUCSIsPhoneticExtensions __attribute((alias("xmlUCSIsPhoneticExtensions__internal_alias"))); +#else +#ifndef xmlUCSIsPhoneticExtensions +extern __typeof (xmlUCSIsPhoneticExtensions) xmlUCSIsPhoneticExtensions__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsPhoneticExtensions xmlUCSIsPhoneticExtensions__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsPrivateUse +extern __typeof (xmlUCSIsPrivateUse) xmlUCSIsPrivateUse __attribute((alias("xmlUCSIsPrivateUse__internal_alias"))); +#else +#ifndef xmlUCSIsPrivateUse +extern __typeof (xmlUCSIsPrivateUse) xmlUCSIsPrivateUse__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsPrivateUse xmlUCSIsPrivateUse__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsPrivateUseArea +extern __typeof (xmlUCSIsPrivateUseArea) xmlUCSIsPrivateUseArea __attribute((alias("xmlUCSIsPrivateUseArea__internal_alias"))); +#else +#ifndef xmlUCSIsPrivateUseArea +extern __typeof (xmlUCSIsPrivateUseArea) xmlUCSIsPrivateUseArea__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsPrivateUseArea xmlUCSIsPrivateUseArea__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsRunic +extern __typeof (xmlUCSIsRunic) xmlUCSIsRunic __attribute((alias("xmlUCSIsRunic__internal_alias"))); +#else +#ifndef xmlUCSIsRunic +extern __typeof (xmlUCSIsRunic) xmlUCSIsRunic__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsRunic xmlUCSIsRunic__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsShavian +extern __typeof (xmlUCSIsShavian) xmlUCSIsShavian __attribute((alias("xmlUCSIsShavian__internal_alias"))); +#else +#ifndef xmlUCSIsShavian +extern __typeof (xmlUCSIsShavian) xmlUCSIsShavian__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsShavian xmlUCSIsShavian__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsSinhala +extern __typeof (xmlUCSIsSinhala) xmlUCSIsSinhala __attribute((alias("xmlUCSIsSinhala__internal_alias"))); +#else +#ifndef xmlUCSIsSinhala +extern __typeof (xmlUCSIsSinhala) xmlUCSIsSinhala__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsSinhala xmlUCSIsSinhala__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsSmallFormVariants +extern __typeof (xmlUCSIsSmallFormVariants) xmlUCSIsSmallFormVariants __attribute((alias("xmlUCSIsSmallFormVariants__internal_alias"))); +#else +#ifndef xmlUCSIsSmallFormVariants +extern __typeof (xmlUCSIsSmallFormVariants) xmlUCSIsSmallFormVariants__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsSmallFormVariants xmlUCSIsSmallFormVariants__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsSpacingModifierLetters +extern __typeof (xmlUCSIsSpacingModifierLetters) xmlUCSIsSpacingModifierLetters __attribute((alias("xmlUCSIsSpacingModifierLetters__internal_alias"))); +#else +#ifndef xmlUCSIsSpacingModifierLetters +extern __typeof (xmlUCSIsSpacingModifierLetters) xmlUCSIsSpacingModifierLetters__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsSpacingModifierLetters xmlUCSIsSpacingModifierLetters__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsSpecials +extern __typeof (xmlUCSIsSpecials) xmlUCSIsSpecials __attribute((alias("xmlUCSIsSpecials__internal_alias"))); +#else +#ifndef xmlUCSIsSpecials +extern __typeof (xmlUCSIsSpecials) xmlUCSIsSpecials__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsSpecials xmlUCSIsSpecials__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsSuperscriptsandSubscripts +extern __typeof (xmlUCSIsSuperscriptsandSubscripts) xmlUCSIsSuperscriptsandSubscripts __attribute((alias("xmlUCSIsSuperscriptsandSubscripts__internal_alias"))); +#else +#ifndef xmlUCSIsSuperscriptsandSubscripts +extern __typeof (xmlUCSIsSuperscriptsandSubscripts) xmlUCSIsSuperscriptsandSubscripts__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsSuperscriptsandSubscripts xmlUCSIsSuperscriptsandSubscripts__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsSupplementalArrowsA +extern __typeof (xmlUCSIsSupplementalArrowsA) xmlUCSIsSupplementalArrowsA __attribute((alias("xmlUCSIsSupplementalArrowsA__internal_alias"))); +#else +#ifndef xmlUCSIsSupplementalArrowsA +extern __typeof (xmlUCSIsSupplementalArrowsA) xmlUCSIsSupplementalArrowsA__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsSupplementalArrowsA xmlUCSIsSupplementalArrowsA__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsSupplementalArrowsB +extern __typeof (xmlUCSIsSupplementalArrowsB) xmlUCSIsSupplementalArrowsB __attribute((alias("xmlUCSIsSupplementalArrowsB__internal_alias"))); +#else +#ifndef xmlUCSIsSupplementalArrowsB +extern __typeof (xmlUCSIsSupplementalArrowsB) xmlUCSIsSupplementalArrowsB__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsSupplementalArrowsB xmlUCSIsSupplementalArrowsB__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsSupplementalMathematicalOperators +extern __typeof (xmlUCSIsSupplementalMathematicalOperators) xmlUCSIsSupplementalMathematicalOperators __attribute((alias("xmlUCSIsSupplementalMathematicalOperators__internal_alias"))); +#else +#ifndef xmlUCSIsSupplementalMathematicalOperators +extern __typeof (xmlUCSIsSupplementalMathematicalOperators) xmlUCSIsSupplementalMathematicalOperators__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsSupplementalMathematicalOperators xmlUCSIsSupplementalMathematicalOperators__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsSupplementaryPrivateUseAreaA +extern __typeof (xmlUCSIsSupplementaryPrivateUseAreaA) xmlUCSIsSupplementaryPrivateUseAreaA __attribute((alias("xmlUCSIsSupplementaryPrivateUseAreaA__internal_alias"))); +#else +#ifndef xmlUCSIsSupplementaryPrivateUseAreaA +extern __typeof (xmlUCSIsSupplementaryPrivateUseAreaA) xmlUCSIsSupplementaryPrivateUseAreaA__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsSupplementaryPrivateUseAreaA xmlUCSIsSupplementaryPrivateUseAreaA__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsSupplementaryPrivateUseAreaB +extern __typeof (xmlUCSIsSupplementaryPrivateUseAreaB) xmlUCSIsSupplementaryPrivateUseAreaB __attribute((alias("xmlUCSIsSupplementaryPrivateUseAreaB__internal_alias"))); +#else +#ifndef xmlUCSIsSupplementaryPrivateUseAreaB +extern __typeof (xmlUCSIsSupplementaryPrivateUseAreaB) xmlUCSIsSupplementaryPrivateUseAreaB__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsSupplementaryPrivateUseAreaB xmlUCSIsSupplementaryPrivateUseAreaB__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsSyriac +extern __typeof (xmlUCSIsSyriac) xmlUCSIsSyriac __attribute((alias("xmlUCSIsSyriac__internal_alias"))); +#else +#ifndef xmlUCSIsSyriac +extern __typeof (xmlUCSIsSyriac) xmlUCSIsSyriac__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsSyriac xmlUCSIsSyriac__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsTagalog +extern __typeof (xmlUCSIsTagalog) xmlUCSIsTagalog __attribute((alias("xmlUCSIsTagalog__internal_alias"))); +#else +#ifndef xmlUCSIsTagalog +extern __typeof (xmlUCSIsTagalog) xmlUCSIsTagalog__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsTagalog xmlUCSIsTagalog__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsTagbanwa +extern __typeof (xmlUCSIsTagbanwa) xmlUCSIsTagbanwa __attribute((alias("xmlUCSIsTagbanwa__internal_alias"))); +#else +#ifndef xmlUCSIsTagbanwa +extern __typeof (xmlUCSIsTagbanwa) xmlUCSIsTagbanwa__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsTagbanwa xmlUCSIsTagbanwa__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsTags +extern __typeof (xmlUCSIsTags) xmlUCSIsTags __attribute((alias("xmlUCSIsTags__internal_alias"))); +#else +#ifndef xmlUCSIsTags +extern __typeof (xmlUCSIsTags) xmlUCSIsTags__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsTags xmlUCSIsTags__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsTaiLe +extern __typeof (xmlUCSIsTaiLe) xmlUCSIsTaiLe __attribute((alias("xmlUCSIsTaiLe__internal_alias"))); +#else +#ifndef xmlUCSIsTaiLe +extern __typeof (xmlUCSIsTaiLe) xmlUCSIsTaiLe__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsTaiLe xmlUCSIsTaiLe__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsTaiXuanJingSymbols +extern __typeof (xmlUCSIsTaiXuanJingSymbols) xmlUCSIsTaiXuanJingSymbols __attribute((alias("xmlUCSIsTaiXuanJingSymbols__internal_alias"))); +#else +#ifndef xmlUCSIsTaiXuanJingSymbols +extern __typeof (xmlUCSIsTaiXuanJingSymbols) xmlUCSIsTaiXuanJingSymbols__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsTaiXuanJingSymbols xmlUCSIsTaiXuanJingSymbols__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsTamil +extern __typeof (xmlUCSIsTamil) xmlUCSIsTamil __attribute((alias("xmlUCSIsTamil__internal_alias"))); +#else +#ifndef xmlUCSIsTamil +extern __typeof (xmlUCSIsTamil) xmlUCSIsTamil__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsTamil xmlUCSIsTamil__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsTelugu +extern __typeof (xmlUCSIsTelugu) xmlUCSIsTelugu __attribute((alias("xmlUCSIsTelugu__internal_alias"))); +#else +#ifndef xmlUCSIsTelugu +extern __typeof (xmlUCSIsTelugu) xmlUCSIsTelugu__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsTelugu xmlUCSIsTelugu__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsThaana +extern __typeof (xmlUCSIsThaana) xmlUCSIsThaana __attribute((alias("xmlUCSIsThaana__internal_alias"))); +#else +#ifndef xmlUCSIsThaana +extern __typeof (xmlUCSIsThaana) xmlUCSIsThaana__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsThaana xmlUCSIsThaana__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsThai +extern __typeof (xmlUCSIsThai) xmlUCSIsThai __attribute((alias("xmlUCSIsThai__internal_alias"))); +#else +#ifndef xmlUCSIsThai +extern __typeof (xmlUCSIsThai) xmlUCSIsThai__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsThai xmlUCSIsThai__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsTibetan +extern __typeof (xmlUCSIsTibetan) xmlUCSIsTibetan __attribute((alias("xmlUCSIsTibetan__internal_alias"))); +#else +#ifndef xmlUCSIsTibetan +extern __typeof (xmlUCSIsTibetan) xmlUCSIsTibetan__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsTibetan xmlUCSIsTibetan__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsUgaritic +extern __typeof (xmlUCSIsUgaritic) xmlUCSIsUgaritic __attribute((alias("xmlUCSIsUgaritic__internal_alias"))); +#else +#ifndef xmlUCSIsUgaritic +extern __typeof (xmlUCSIsUgaritic) xmlUCSIsUgaritic__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsUgaritic xmlUCSIsUgaritic__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsUnifiedCanadianAboriginalSyllabics +extern __typeof (xmlUCSIsUnifiedCanadianAboriginalSyllabics) xmlUCSIsUnifiedCanadianAboriginalSyllabics __attribute((alias("xmlUCSIsUnifiedCanadianAboriginalSyllabics__internal_alias"))); +#else +#ifndef xmlUCSIsUnifiedCanadianAboriginalSyllabics +extern __typeof (xmlUCSIsUnifiedCanadianAboriginalSyllabics) xmlUCSIsUnifiedCanadianAboriginalSyllabics__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsUnifiedCanadianAboriginalSyllabics xmlUCSIsUnifiedCanadianAboriginalSyllabics__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsVariationSelectors +extern __typeof (xmlUCSIsVariationSelectors) xmlUCSIsVariationSelectors __attribute((alias("xmlUCSIsVariationSelectors__internal_alias"))); +#else +#ifndef xmlUCSIsVariationSelectors +extern __typeof (xmlUCSIsVariationSelectors) xmlUCSIsVariationSelectors__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsVariationSelectors xmlUCSIsVariationSelectors__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsVariationSelectorsSupplement +extern __typeof (xmlUCSIsVariationSelectorsSupplement) xmlUCSIsVariationSelectorsSupplement __attribute((alias("xmlUCSIsVariationSelectorsSupplement__internal_alias"))); +#else +#ifndef xmlUCSIsVariationSelectorsSupplement +extern __typeof (xmlUCSIsVariationSelectorsSupplement) xmlUCSIsVariationSelectorsSupplement__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsVariationSelectorsSupplement xmlUCSIsVariationSelectorsSupplement__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsYiRadicals +extern __typeof (xmlUCSIsYiRadicals) xmlUCSIsYiRadicals __attribute((alias("xmlUCSIsYiRadicals__internal_alias"))); +#else +#ifndef xmlUCSIsYiRadicals +extern __typeof (xmlUCSIsYiRadicals) xmlUCSIsYiRadicals__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsYiRadicals xmlUCSIsYiRadicals__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsYiSyllables +extern __typeof (xmlUCSIsYiSyllables) xmlUCSIsYiSyllables __attribute((alias("xmlUCSIsYiSyllables__internal_alias"))); +#else +#ifndef xmlUCSIsYiSyllables +extern __typeof (xmlUCSIsYiSyllables) xmlUCSIsYiSyllables__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsYiSyllables xmlUCSIsYiSyllables__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_UNICODE_ENABLED) +#ifdef bottom_xmlunicode +#undef xmlUCSIsYijingHexagramSymbols +extern __typeof (xmlUCSIsYijingHexagramSymbols) xmlUCSIsYijingHexagramSymbols __attribute((alias("xmlUCSIsYijingHexagramSymbols__internal_alias"))); +#else +#ifndef xmlUCSIsYijingHexagramSymbols +extern __typeof (xmlUCSIsYijingHexagramSymbols) xmlUCSIsYijingHexagramSymbols__internal_alias __attribute((visibility("hidden"))); +#define xmlUCSIsYijingHexagramSymbols xmlUCSIsYijingHexagramSymbols__internal_alias +#endif +#endif +#endif + +#ifdef bottom_uri +#undef xmlURIEscape +extern __typeof (xmlURIEscape) xmlURIEscape __attribute((alias("xmlURIEscape__internal_alias"))); +#else +#ifndef xmlURIEscape +extern __typeof (xmlURIEscape) xmlURIEscape__internal_alias __attribute((visibility("hidden"))); +#define xmlURIEscape xmlURIEscape__internal_alias +#endif +#endif + +#ifdef bottom_uri +#undef xmlURIEscapeStr +extern __typeof (xmlURIEscapeStr) xmlURIEscapeStr __attribute((alias("xmlURIEscapeStr__internal_alias"))); +#else +#ifndef xmlURIEscapeStr +extern __typeof (xmlURIEscapeStr) xmlURIEscapeStr__internal_alias __attribute((visibility("hidden"))); +#define xmlURIEscapeStr xmlURIEscapeStr__internal_alias +#endif +#endif + +#ifdef bottom_uri +#undef xmlURIUnescapeString +extern __typeof (xmlURIUnescapeString) xmlURIUnescapeString __attribute((alias("xmlURIUnescapeString__internal_alias"))); +#else +#ifndef xmlURIUnescapeString +extern __typeof (xmlURIUnescapeString) xmlURIUnescapeString__internal_alias __attribute((visibility("hidden"))); +#define xmlURIUnescapeString xmlURIUnescapeString__internal_alias +#endif +#endif + +#ifdef bottom_xmlstring +#undef xmlUTF8Charcmp +extern __typeof (xmlUTF8Charcmp) xmlUTF8Charcmp __attribute((alias("xmlUTF8Charcmp__internal_alias"))); +#else +#ifndef xmlUTF8Charcmp +extern __typeof (xmlUTF8Charcmp) xmlUTF8Charcmp__internal_alias __attribute((visibility("hidden"))); +#define xmlUTF8Charcmp xmlUTF8Charcmp__internal_alias +#endif +#endif + +#ifdef bottom_xmlstring +#undef xmlUTF8Size +extern __typeof (xmlUTF8Size) xmlUTF8Size __attribute((alias("xmlUTF8Size__internal_alias"))); +#else +#ifndef xmlUTF8Size +extern __typeof (xmlUTF8Size) xmlUTF8Size__internal_alias __attribute((visibility("hidden"))); +#define xmlUTF8Size xmlUTF8Size__internal_alias +#endif +#endif + +#ifdef bottom_xmlstring +#undef xmlUTF8Strlen +extern __typeof (xmlUTF8Strlen) xmlUTF8Strlen __attribute((alias("xmlUTF8Strlen__internal_alias"))); +#else +#ifndef xmlUTF8Strlen +extern __typeof (xmlUTF8Strlen) xmlUTF8Strlen__internal_alias __attribute((visibility("hidden"))); +#define xmlUTF8Strlen xmlUTF8Strlen__internal_alias +#endif +#endif + +#ifdef bottom_xmlstring +#undef xmlUTF8Strloc +extern __typeof (xmlUTF8Strloc) xmlUTF8Strloc __attribute((alias("xmlUTF8Strloc__internal_alias"))); +#else +#ifndef xmlUTF8Strloc +extern __typeof (xmlUTF8Strloc) xmlUTF8Strloc__internal_alias __attribute((visibility("hidden"))); +#define xmlUTF8Strloc xmlUTF8Strloc__internal_alias +#endif +#endif + +#ifdef bottom_xmlstring +#undef xmlUTF8Strndup +extern __typeof (xmlUTF8Strndup) xmlUTF8Strndup __attribute((alias("xmlUTF8Strndup__internal_alias"))); +#else +#ifndef xmlUTF8Strndup +extern __typeof (xmlUTF8Strndup) xmlUTF8Strndup__internal_alias __attribute((visibility("hidden"))); +#define xmlUTF8Strndup xmlUTF8Strndup__internal_alias +#endif +#endif + +#ifdef bottom_xmlstring +#undef xmlUTF8Strpos +extern __typeof (xmlUTF8Strpos) xmlUTF8Strpos __attribute((alias("xmlUTF8Strpos__internal_alias"))); +#else +#ifndef xmlUTF8Strpos +extern __typeof (xmlUTF8Strpos) xmlUTF8Strpos__internal_alias __attribute((visibility("hidden"))); +#define xmlUTF8Strpos xmlUTF8Strpos__internal_alias +#endif +#endif + +#ifdef bottom_xmlstring +#undef xmlUTF8Strsize +extern __typeof (xmlUTF8Strsize) xmlUTF8Strsize __attribute((alias("xmlUTF8Strsize__internal_alias"))); +#else +#ifndef xmlUTF8Strsize +extern __typeof (xmlUTF8Strsize) xmlUTF8Strsize__internal_alias __attribute((visibility("hidden"))); +#define xmlUTF8Strsize xmlUTF8Strsize__internal_alias +#endif +#endif + +#ifdef bottom_xmlstring +#undef xmlUTF8Strsub +extern __typeof (xmlUTF8Strsub) xmlUTF8Strsub __attribute((alias("xmlUTF8Strsub__internal_alias"))); +#else +#ifndef xmlUTF8Strsub +extern __typeof (xmlUTF8Strsub) xmlUTF8Strsub__internal_alias __attribute((visibility("hidden"))); +#define xmlUTF8Strsub xmlUTF8Strsub__internal_alias +#endif +#endif + +#ifdef bottom_tree +#undef xmlUnlinkNode +extern __typeof (xmlUnlinkNode) xmlUnlinkNode __attribute((alias("xmlUnlinkNode__internal_alias"))); +#else +#ifndef xmlUnlinkNode +extern __typeof (xmlUnlinkNode) xmlUnlinkNode__internal_alias __attribute((visibility("hidden"))); +#define xmlUnlinkNode xmlUnlinkNode__internal_alias +#endif +#endif + +#ifdef bottom_threads +#undef xmlUnlockLibrary +extern __typeof (xmlUnlockLibrary) xmlUnlockLibrary __attribute((alias("xmlUnlockLibrary__internal_alias"))); +#else +#ifndef xmlUnlockLibrary +extern __typeof (xmlUnlockLibrary) xmlUnlockLibrary__internal_alias __attribute((visibility("hidden"))); +#define xmlUnlockLibrary xmlUnlockLibrary__internal_alias +#endif +#endif + +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_tree +#undef xmlUnsetNsProp +extern __typeof (xmlUnsetNsProp) xmlUnsetNsProp __attribute((alias("xmlUnsetNsProp__internal_alias"))); +#else +#ifndef xmlUnsetNsProp +extern __typeof (xmlUnsetNsProp) xmlUnsetNsProp__internal_alias __attribute((visibility("hidden"))); +#define xmlUnsetNsProp xmlUnsetNsProp__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_tree +#undef xmlUnsetProp +extern __typeof (xmlUnsetProp) xmlUnsetProp __attribute((alias("xmlUnsetProp__internal_alias"))); +#else +#ifndef xmlUnsetProp +extern __typeof (xmlUnsetProp) xmlUnsetProp__internal_alias __attribute((visibility("hidden"))); +#define xmlUnsetProp xmlUnsetProp__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_VALID_ENABLED) && defined(LIBXML_REGEXP_ENABLED) +#ifdef bottom_valid +#undef xmlValidBuildContentModel +extern __typeof (xmlValidBuildContentModel) xmlValidBuildContentModel __attribute((alias("xmlValidBuildContentModel__internal_alias"))); +#else +#ifndef xmlValidBuildContentModel +extern __typeof (xmlValidBuildContentModel) xmlValidBuildContentModel__internal_alias __attribute((visibility("hidden"))); +#define xmlValidBuildContentModel xmlValidBuildContentModel__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_VALID_ENABLED) +#ifdef bottom_valid +#undef xmlValidCtxtNormalizeAttributeValue +extern __typeof (xmlValidCtxtNormalizeAttributeValue) xmlValidCtxtNormalizeAttributeValue __attribute((alias("xmlValidCtxtNormalizeAttributeValue__internal_alias"))); +#else +#ifndef xmlValidCtxtNormalizeAttributeValue +extern __typeof (xmlValidCtxtNormalizeAttributeValue) xmlValidCtxtNormalizeAttributeValue__internal_alias __attribute((visibility("hidden"))); +#define xmlValidCtxtNormalizeAttributeValue xmlValidCtxtNormalizeAttributeValue__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_VALID_ENABLED) +#ifdef bottom_valid +#undef xmlValidGetPotentialChildren +extern __typeof (xmlValidGetPotentialChildren) xmlValidGetPotentialChildren __attribute((alias("xmlValidGetPotentialChildren__internal_alias"))); +#else +#ifndef xmlValidGetPotentialChildren +extern __typeof (xmlValidGetPotentialChildren) xmlValidGetPotentialChildren__internal_alias __attribute((visibility("hidden"))); +#define xmlValidGetPotentialChildren xmlValidGetPotentialChildren__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_VALID_ENABLED) +#ifdef bottom_valid +#undef xmlValidGetValidElements +extern __typeof (xmlValidGetValidElements) xmlValidGetValidElements __attribute((alias("xmlValidGetValidElements__internal_alias"))); +#else +#ifndef xmlValidGetValidElements +extern __typeof (xmlValidGetValidElements) xmlValidGetValidElements__internal_alias __attribute((visibility("hidden"))); +#define xmlValidGetValidElements xmlValidGetValidElements__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_VALID_ENABLED) +#ifdef bottom_valid +#undef xmlValidNormalizeAttributeValue +extern __typeof (xmlValidNormalizeAttributeValue) xmlValidNormalizeAttributeValue __attribute((alias("xmlValidNormalizeAttributeValue__internal_alias"))); +#else +#ifndef xmlValidNormalizeAttributeValue +extern __typeof (xmlValidNormalizeAttributeValue) xmlValidNormalizeAttributeValue__internal_alias __attribute((visibility("hidden"))); +#define xmlValidNormalizeAttributeValue xmlValidNormalizeAttributeValue__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_VALID_ENABLED) +#ifdef bottom_valid +#undef xmlValidateAttributeDecl +extern __typeof (xmlValidateAttributeDecl) xmlValidateAttributeDecl __attribute((alias("xmlValidateAttributeDecl__internal_alias"))); +#else +#ifndef xmlValidateAttributeDecl +extern __typeof (xmlValidateAttributeDecl) xmlValidateAttributeDecl__internal_alias __attribute((visibility("hidden"))); +#define xmlValidateAttributeDecl xmlValidateAttributeDecl__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_VALID_ENABLED) +#ifdef bottom_valid +#undef xmlValidateAttributeValue +extern __typeof (xmlValidateAttributeValue) xmlValidateAttributeValue __attribute((alias("xmlValidateAttributeValue__internal_alias"))); +#else +#ifndef xmlValidateAttributeValue +extern __typeof (xmlValidateAttributeValue) xmlValidateAttributeValue__internal_alias __attribute((visibility("hidden"))); +#define xmlValidateAttributeValue xmlValidateAttributeValue__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_VALID_ENABLED) +#ifdef bottom_valid +#undef xmlValidateDocument +extern __typeof (xmlValidateDocument) xmlValidateDocument __attribute((alias("xmlValidateDocument__internal_alias"))); +#else +#ifndef xmlValidateDocument +extern __typeof (xmlValidateDocument) xmlValidateDocument__internal_alias __attribute((visibility("hidden"))); +#define xmlValidateDocument xmlValidateDocument__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_VALID_ENABLED) +#ifdef bottom_valid +#undef xmlValidateDocumentFinal +extern __typeof (xmlValidateDocumentFinal) xmlValidateDocumentFinal __attribute((alias("xmlValidateDocumentFinal__internal_alias"))); +#else +#ifndef xmlValidateDocumentFinal +extern __typeof (xmlValidateDocumentFinal) xmlValidateDocumentFinal__internal_alias __attribute((visibility("hidden"))); +#define xmlValidateDocumentFinal xmlValidateDocumentFinal__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_VALID_ENABLED) +#ifdef bottom_valid +#undef xmlValidateDtd +extern __typeof (xmlValidateDtd) xmlValidateDtd __attribute((alias("xmlValidateDtd__internal_alias"))); +#else +#ifndef xmlValidateDtd +extern __typeof (xmlValidateDtd) xmlValidateDtd__internal_alias __attribute((visibility("hidden"))); +#define xmlValidateDtd xmlValidateDtd__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_VALID_ENABLED) +#ifdef bottom_valid +#undef xmlValidateDtdFinal +extern __typeof (xmlValidateDtdFinal) xmlValidateDtdFinal __attribute((alias("xmlValidateDtdFinal__internal_alias"))); +#else +#ifndef xmlValidateDtdFinal +extern __typeof (xmlValidateDtdFinal) xmlValidateDtdFinal__internal_alias __attribute((visibility("hidden"))); +#define xmlValidateDtdFinal xmlValidateDtdFinal__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_VALID_ENABLED) +#ifdef bottom_valid +#undef xmlValidateElement +extern __typeof (xmlValidateElement) xmlValidateElement __attribute((alias("xmlValidateElement__internal_alias"))); +#else +#ifndef xmlValidateElement +extern __typeof (xmlValidateElement) xmlValidateElement__internal_alias __attribute((visibility("hidden"))); +#define xmlValidateElement xmlValidateElement__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_VALID_ENABLED) +#ifdef bottom_valid +#undef xmlValidateElementDecl +extern __typeof (xmlValidateElementDecl) xmlValidateElementDecl __attribute((alias("xmlValidateElementDecl__internal_alias"))); +#else +#ifndef xmlValidateElementDecl +extern __typeof (xmlValidateElementDecl) xmlValidateElementDecl__internal_alias __attribute((visibility("hidden"))); +#define xmlValidateElementDecl xmlValidateElementDecl__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_DEBUG_ENABLED) || defined (LIBXML_HTML_ENABLED) || defined(LIBXML_SAX1_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBXML_WRITER_ENABLED) || defined(LIBXML_DOCB_ENABLED) +#ifdef bottom_tree +#undef xmlValidateNCName +extern __typeof (xmlValidateNCName) xmlValidateNCName __attribute((alias("xmlValidateNCName__internal_alias"))); +#else +#ifndef xmlValidateNCName +extern __typeof (xmlValidateNCName) xmlValidateNCName__internal_alias __attribute((visibility("hidden"))); +#define xmlValidateNCName xmlValidateNCName__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_tree +#undef xmlValidateNMToken +extern __typeof (xmlValidateNMToken) xmlValidateNMToken __attribute((alias("xmlValidateNMToken__internal_alias"))); +#else +#ifndef xmlValidateNMToken +extern __typeof (xmlValidateNMToken) xmlValidateNMToken__internal_alias __attribute((visibility("hidden"))); +#define xmlValidateNMToken xmlValidateNMToken__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_tree +#undef xmlValidateName +extern __typeof (xmlValidateName) xmlValidateName __attribute((alias("xmlValidateName__internal_alias"))); +#else +#ifndef xmlValidateName +extern __typeof (xmlValidateName) xmlValidateName__internal_alias __attribute((visibility("hidden"))); +#define xmlValidateName xmlValidateName__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_VALID_ENABLED) +#ifdef bottom_valid +#undef xmlValidateNameValue +extern __typeof (xmlValidateNameValue) xmlValidateNameValue __attribute((alias("xmlValidateNameValue__internal_alias"))); +#else +#ifndef xmlValidateNameValue +extern __typeof (xmlValidateNameValue) xmlValidateNameValue__internal_alias __attribute((visibility("hidden"))); +#define xmlValidateNameValue xmlValidateNameValue__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_VALID_ENABLED) +#ifdef bottom_valid +#undef xmlValidateNamesValue +extern __typeof (xmlValidateNamesValue) xmlValidateNamesValue __attribute((alias("xmlValidateNamesValue__internal_alias"))); +#else +#ifndef xmlValidateNamesValue +extern __typeof (xmlValidateNamesValue) xmlValidateNamesValue__internal_alias __attribute((visibility("hidden"))); +#define xmlValidateNamesValue xmlValidateNamesValue__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_VALID_ENABLED) +#ifdef bottom_valid +#undef xmlValidateNmtokenValue +extern __typeof (xmlValidateNmtokenValue) xmlValidateNmtokenValue __attribute((alias("xmlValidateNmtokenValue__internal_alias"))); +#else +#ifndef xmlValidateNmtokenValue +extern __typeof (xmlValidateNmtokenValue) xmlValidateNmtokenValue__internal_alias __attribute((visibility("hidden"))); +#define xmlValidateNmtokenValue xmlValidateNmtokenValue__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_VALID_ENABLED) +#ifdef bottom_valid +#undef xmlValidateNmtokensValue +extern __typeof (xmlValidateNmtokensValue) xmlValidateNmtokensValue __attribute((alias("xmlValidateNmtokensValue__internal_alias"))); +#else +#ifndef xmlValidateNmtokensValue +extern __typeof (xmlValidateNmtokensValue) xmlValidateNmtokensValue__internal_alias __attribute((visibility("hidden"))); +#define xmlValidateNmtokensValue xmlValidateNmtokensValue__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_VALID_ENABLED) +#ifdef bottom_valid +#undef xmlValidateNotationDecl +extern __typeof (xmlValidateNotationDecl) xmlValidateNotationDecl __attribute((alias("xmlValidateNotationDecl__internal_alias"))); +#else +#ifndef xmlValidateNotationDecl +extern __typeof (xmlValidateNotationDecl) xmlValidateNotationDecl__internal_alias __attribute((visibility("hidden"))); +#define xmlValidateNotationDecl xmlValidateNotationDecl__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_VALID_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_valid +#undef xmlValidateNotationUse +extern __typeof (xmlValidateNotationUse) xmlValidateNotationUse __attribute((alias("xmlValidateNotationUse__internal_alias"))); +#else +#ifndef xmlValidateNotationUse +extern __typeof (xmlValidateNotationUse) xmlValidateNotationUse__internal_alias __attribute((visibility("hidden"))); +#define xmlValidateNotationUse xmlValidateNotationUse__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_VALID_ENABLED) +#ifdef bottom_valid +#undef xmlValidateOneAttribute +extern __typeof (xmlValidateOneAttribute) xmlValidateOneAttribute __attribute((alias("xmlValidateOneAttribute__internal_alias"))); +#else +#ifndef xmlValidateOneAttribute +extern __typeof (xmlValidateOneAttribute) xmlValidateOneAttribute__internal_alias __attribute((visibility("hidden"))); +#define xmlValidateOneAttribute xmlValidateOneAttribute__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_VALID_ENABLED) +#ifdef bottom_valid +#undef xmlValidateOneElement +extern __typeof (xmlValidateOneElement) xmlValidateOneElement __attribute((alias("xmlValidateOneElement__internal_alias"))); +#else +#ifndef xmlValidateOneElement +extern __typeof (xmlValidateOneElement) xmlValidateOneElement__internal_alias __attribute((visibility("hidden"))); +#define xmlValidateOneElement xmlValidateOneElement__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_VALID_ENABLED) +#ifdef bottom_valid +#undef xmlValidateOneNamespace +extern __typeof (xmlValidateOneNamespace) xmlValidateOneNamespace __attribute((alias("xmlValidateOneNamespace__internal_alias"))); +#else +#ifndef xmlValidateOneNamespace +extern __typeof (xmlValidateOneNamespace) xmlValidateOneNamespace__internal_alias __attribute((visibility("hidden"))); +#define xmlValidateOneNamespace xmlValidateOneNamespace__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_VALID_ENABLED) && defined(LIBXML_REGEXP_ENABLED) +#ifdef bottom_valid +#undef xmlValidatePopElement +extern __typeof (xmlValidatePopElement) xmlValidatePopElement __attribute((alias("xmlValidatePopElement__internal_alias"))); +#else +#ifndef xmlValidatePopElement +extern __typeof (xmlValidatePopElement) xmlValidatePopElement__internal_alias __attribute((visibility("hidden"))); +#define xmlValidatePopElement xmlValidatePopElement__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_VALID_ENABLED) && defined(LIBXML_REGEXP_ENABLED) +#ifdef bottom_valid +#undef xmlValidatePushCData +extern __typeof (xmlValidatePushCData) xmlValidatePushCData __attribute((alias("xmlValidatePushCData__internal_alias"))); +#else +#ifndef xmlValidatePushCData +extern __typeof (xmlValidatePushCData) xmlValidatePushCData__internal_alias __attribute((visibility("hidden"))); +#define xmlValidatePushCData xmlValidatePushCData__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_VALID_ENABLED) && defined(LIBXML_REGEXP_ENABLED) +#ifdef bottom_valid +#undef xmlValidatePushElement +extern __typeof (xmlValidatePushElement) xmlValidatePushElement __attribute((alias("xmlValidatePushElement__internal_alias"))); +#else +#ifndef xmlValidatePushElement +extern __typeof (xmlValidatePushElement) xmlValidatePushElement__internal_alias __attribute((visibility("hidden"))); +#define xmlValidatePushElement xmlValidatePushElement__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_tree +#undef xmlValidateQName +extern __typeof (xmlValidateQName) xmlValidateQName __attribute((alias("xmlValidateQName__internal_alias"))); +#else +#ifndef xmlValidateQName +extern __typeof (xmlValidateQName) xmlValidateQName__internal_alias __attribute((visibility("hidden"))); +#define xmlValidateQName xmlValidateQName__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_VALID_ENABLED) +#ifdef bottom_valid +#undef xmlValidateRoot +extern __typeof (xmlValidateRoot) xmlValidateRoot __attribute((alias("xmlValidateRoot__internal_alias"))); +#else +#ifndef xmlValidateRoot +extern __typeof (xmlValidateRoot) xmlValidateRoot__internal_alias __attribute((visibility("hidden"))); +#define xmlValidateRoot xmlValidateRoot__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XINCLUDE_ENABLED) +#ifdef bottom_xinclude +#undef xmlXIncludeFreeContext +extern __typeof (xmlXIncludeFreeContext) xmlXIncludeFreeContext __attribute((alias("xmlXIncludeFreeContext__internal_alias"))); +#else +#ifndef xmlXIncludeFreeContext +extern __typeof (xmlXIncludeFreeContext) xmlXIncludeFreeContext__internal_alias __attribute((visibility("hidden"))); +#define xmlXIncludeFreeContext xmlXIncludeFreeContext__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XINCLUDE_ENABLED) +#ifdef bottom_xinclude +#undef xmlXIncludeNewContext +extern __typeof (xmlXIncludeNewContext) xmlXIncludeNewContext __attribute((alias("xmlXIncludeNewContext__internal_alias"))); +#else +#ifndef xmlXIncludeNewContext +extern __typeof (xmlXIncludeNewContext) xmlXIncludeNewContext__internal_alias __attribute((visibility("hidden"))); +#define xmlXIncludeNewContext xmlXIncludeNewContext__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XINCLUDE_ENABLED) +#ifdef bottom_xinclude +#undef xmlXIncludeProcess +extern __typeof (xmlXIncludeProcess) xmlXIncludeProcess __attribute((alias("xmlXIncludeProcess__internal_alias"))); +#else +#ifndef xmlXIncludeProcess +extern __typeof (xmlXIncludeProcess) xmlXIncludeProcess__internal_alias __attribute((visibility("hidden"))); +#define xmlXIncludeProcess xmlXIncludeProcess__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XINCLUDE_ENABLED) +#ifdef bottom_xinclude +#undef xmlXIncludeProcessFlags +extern __typeof (xmlXIncludeProcessFlags) xmlXIncludeProcessFlags __attribute((alias("xmlXIncludeProcessFlags__internal_alias"))); +#else +#ifndef xmlXIncludeProcessFlags +extern __typeof (xmlXIncludeProcessFlags) xmlXIncludeProcessFlags__internal_alias __attribute((visibility("hidden"))); +#define xmlXIncludeProcessFlags xmlXIncludeProcessFlags__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XINCLUDE_ENABLED) +#ifdef bottom_xinclude +#undef xmlXIncludeProcessFlagsData +extern __typeof (xmlXIncludeProcessFlagsData) xmlXIncludeProcessFlagsData __attribute((alias("xmlXIncludeProcessFlagsData__internal_alias"))); +#else +#ifndef xmlXIncludeProcessFlagsData +extern __typeof (xmlXIncludeProcessFlagsData) xmlXIncludeProcessFlagsData__internal_alias __attribute((visibility("hidden"))); +#define xmlXIncludeProcessFlagsData xmlXIncludeProcessFlagsData__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XINCLUDE_ENABLED) +#ifdef bottom_xinclude +#undef xmlXIncludeProcessNode +extern __typeof (xmlXIncludeProcessNode) xmlXIncludeProcessNode __attribute((alias("xmlXIncludeProcessNode__internal_alias"))); +#else +#ifndef xmlXIncludeProcessNode +extern __typeof (xmlXIncludeProcessNode) xmlXIncludeProcessNode__internal_alias __attribute((visibility("hidden"))); +#define xmlXIncludeProcessNode xmlXIncludeProcessNode__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XINCLUDE_ENABLED) +#ifdef bottom_xinclude +#undef xmlXIncludeProcessTree +extern __typeof (xmlXIncludeProcessTree) xmlXIncludeProcessTree __attribute((alias("xmlXIncludeProcessTree__internal_alias"))); +#else +#ifndef xmlXIncludeProcessTree +extern __typeof (xmlXIncludeProcessTree) xmlXIncludeProcessTree__internal_alias __attribute((visibility("hidden"))); +#define xmlXIncludeProcessTree xmlXIncludeProcessTree__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XINCLUDE_ENABLED) +#ifdef bottom_xinclude +#undef xmlXIncludeProcessTreeFlags +extern __typeof (xmlXIncludeProcessTreeFlags) xmlXIncludeProcessTreeFlags __attribute((alias("xmlXIncludeProcessTreeFlags__internal_alias"))); +#else +#ifndef xmlXIncludeProcessTreeFlags +extern __typeof (xmlXIncludeProcessTreeFlags) xmlXIncludeProcessTreeFlags__internal_alias __attribute((visibility("hidden"))); +#define xmlXIncludeProcessTreeFlags xmlXIncludeProcessTreeFlags__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XINCLUDE_ENABLED) +#ifdef bottom_xinclude +#undef xmlXIncludeProcessTreeFlagsData +extern __typeof (xmlXIncludeProcessTreeFlagsData) xmlXIncludeProcessTreeFlagsData __attribute((alias("xmlXIncludeProcessTreeFlagsData__internal_alias"))); +#else +#ifndef xmlXIncludeProcessTreeFlagsData +extern __typeof (xmlXIncludeProcessTreeFlagsData) xmlXIncludeProcessTreeFlagsData__internal_alias __attribute((visibility("hidden"))); +#define xmlXIncludeProcessTreeFlagsData xmlXIncludeProcessTreeFlagsData__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XINCLUDE_ENABLED) +#ifdef bottom_xinclude +#undef xmlXIncludeSetFlags +extern __typeof (xmlXIncludeSetFlags) xmlXIncludeSetFlags __attribute((alias("xmlXIncludeSetFlags__internal_alias"))); +#else +#ifndef xmlXIncludeSetFlags +extern __typeof (xmlXIncludeSetFlags) xmlXIncludeSetFlags__internal_alias __attribute((visibility("hidden"))); +#define xmlXIncludeSetFlags xmlXIncludeSetFlags__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathAddValues +extern __typeof (xmlXPathAddValues) xmlXPathAddValues __attribute((alias("xmlXPathAddValues__internal_alias"))); +#else +#ifndef xmlXPathAddValues +extern __typeof (xmlXPathAddValues) xmlXPathAddValues__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathAddValues xmlXPathAddValues__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathBooleanFunction +extern __typeof (xmlXPathBooleanFunction) xmlXPathBooleanFunction __attribute((alias("xmlXPathBooleanFunction__internal_alias"))); +#else +#ifndef xmlXPathBooleanFunction +extern __typeof (xmlXPathBooleanFunction) xmlXPathBooleanFunction__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathBooleanFunction xmlXPathBooleanFunction__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathCastBooleanToNumber +extern __typeof (xmlXPathCastBooleanToNumber) xmlXPathCastBooleanToNumber __attribute((alias("xmlXPathCastBooleanToNumber__internal_alias"))); +#else +#ifndef xmlXPathCastBooleanToNumber +extern __typeof (xmlXPathCastBooleanToNumber) xmlXPathCastBooleanToNumber__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathCastBooleanToNumber xmlXPathCastBooleanToNumber__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathCastBooleanToString +extern __typeof (xmlXPathCastBooleanToString) xmlXPathCastBooleanToString __attribute((alias("xmlXPathCastBooleanToString__internal_alias"))); +#else +#ifndef xmlXPathCastBooleanToString +extern __typeof (xmlXPathCastBooleanToString) xmlXPathCastBooleanToString__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathCastBooleanToString xmlXPathCastBooleanToString__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathCastNodeSetToBoolean +extern __typeof (xmlXPathCastNodeSetToBoolean) xmlXPathCastNodeSetToBoolean __attribute((alias("xmlXPathCastNodeSetToBoolean__internal_alias"))); +#else +#ifndef xmlXPathCastNodeSetToBoolean +extern __typeof (xmlXPathCastNodeSetToBoolean) xmlXPathCastNodeSetToBoolean__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathCastNodeSetToBoolean xmlXPathCastNodeSetToBoolean__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathCastNodeSetToNumber +extern __typeof (xmlXPathCastNodeSetToNumber) xmlXPathCastNodeSetToNumber __attribute((alias("xmlXPathCastNodeSetToNumber__internal_alias"))); +#else +#ifndef xmlXPathCastNodeSetToNumber +extern __typeof (xmlXPathCastNodeSetToNumber) xmlXPathCastNodeSetToNumber__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathCastNodeSetToNumber xmlXPathCastNodeSetToNumber__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathCastNodeSetToString +extern __typeof (xmlXPathCastNodeSetToString) xmlXPathCastNodeSetToString __attribute((alias("xmlXPathCastNodeSetToString__internal_alias"))); +#else +#ifndef xmlXPathCastNodeSetToString +extern __typeof (xmlXPathCastNodeSetToString) xmlXPathCastNodeSetToString__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathCastNodeSetToString xmlXPathCastNodeSetToString__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathCastNodeToNumber +extern __typeof (xmlXPathCastNodeToNumber) xmlXPathCastNodeToNumber __attribute((alias("xmlXPathCastNodeToNumber__internal_alias"))); +#else +#ifndef xmlXPathCastNodeToNumber +extern __typeof (xmlXPathCastNodeToNumber) xmlXPathCastNodeToNumber__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathCastNodeToNumber xmlXPathCastNodeToNumber__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathCastNodeToString +extern __typeof (xmlXPathCastNodeToString) xmlXPathCastNodeToString __attribute((alias("xmlXPathCastNodeToString__internal_alias"))); +#else +#ifndef xmlXPathCastNodeToString +extern __typeof (xmlXPathCastNodeToString) xmlXPathCastNodeToString__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathCastNodeToString xmlXPathCastNodeToString__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathCastNumberToBoolean +extern __typeof (xmlXPathCastNumberToBoolean) xmlXPathCastNumberToBoolean __attribute((alias("xmlXPathCastNumberToBoolean__internal_alias"))); +#else +#ifndef xmlXPathCastNumberToBoolean +extern __typeof (xmlXPathCastNumberToBoolean) xmlXPathCastNumberToBoolean__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathCastNumberToBoolean xmlXPathCastNumberToBoolean__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathCastNumberToString +extern __typeof (xmlXPathCastNumberToString) xmlXPathCastNumberToString __attribute((alias("xmlXPathCastNumberToString__internal_alias"))); +#else +#ifndef xmlXPathCastNumberToString +extern __typeof (xmlXPathCastNumberToString) xmlXPathCastNumberToString__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathCastNumberToString xmlXPathCastNumberToString__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathCastStringToBoolean +extern __typeof (xmlXPathCastStringToBoolean) xmlXPathCastStringToBoolean __attribute((alias("xmlXPathCastStringToBoolean__internal_alias"))); +#else +#ifndef xmlXPathCastStringToBoolean +extern __typeof (xmlXPathCastStringToBoolean) xmlXPathCastStringToBoolean__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathCastStringToBoolean xmlXPathCastStringToBoolean__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathCastStringToNumber +extern __typeof (xmlXPathCastStringToNumber) xmlXPathCastStringToNumber __attribute((alias("xmlXPathCastStringToNumber__internal_alias"))); +#else +#ifndef xmlXPathCastStringToNumber +extern __typeof (xmlXPathCastStringToNumber) xmlXPathCastStringToNumber__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathCastStringToNumber xmlXPathCastStringToNumber__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathCastToBoolean +extern __typeof (xmlXPathCastToBoolean) xmlXPathCastToBoolean __attribute((alias("xmlXPathCastToBoolean__internal_alias"))); +#else +#ifndef xmlXPathCastToBoolean +extern __typeof (xmlXPathCastToBoolean) xmlXPathCastToBoolean__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathCastToBoolean xmlXPathCastToBoolean__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathCastToNumber +extern __typeof (xmlXPathCastToNumber) xmlXPathCastToNumber __attribute((alias("xmlXPathCastToNumber__internal_alias"))); +#else +#ifndef xmlXPathCastToNumber +extern __typeof (xmlXPathCastToNumber) xmlXPathCastToNumber__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathCastToNumber xmlXPathCastToNumber__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathCastToString +extern __typeof (xmlXPathCastToString) xmlXPathCastToString __attribute((alias("xmlXPathCastToString__internal_alias"))); +#else +#ifndef xmlXPathCastToString +extern __typeof (xmlXPathCastToString) xmlXPathCastToString__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathCastToString xmlXPathCastToString__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathCeilingFunction +extern __typeof (xmlXPathCeilingFunction) xmlXPathCeilingFunction __attribute((alias("xmlXPathCeilingFunction__internal_alias"))); +#else +#ifndef xmlXPathCeilingFunction +extern __typeof (xmlXPathCeilingFunction) xmlXPathCeilingFunction__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathCeilingFunction xmlXPathCeilingFunction__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathCmpNodes +extern __typeof (xmlXPathCmpNodes) xmlXPathCmpNodes __attribute((alias("xmlXPathCmpNodes__internal_alias"))); +#else +#ifndef xmlXPathCmpNodes +extern __typeof (xmlXPathCmpNodes) xmlXPathCmpNodes__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathCmpNodes xmlXPathCmpNodes__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathCompareValues +extern __typeof (xmlXPathCompareValues) xmlXPathCompareValues __attribute((alias("xmlXPathCompareValues__internal_alias"))); +#else +#ifndef xmlXPathCompareValues +extern __typeof (xmlXPathCompareValues) xmlXPathCompareValues__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathCompareValues xmlXPathCompareValues__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathCompile +extern __typeof (xmlXPathCompile) xmlXPathCompile __attribute((alias("xmlXPathCompile__internal_alias"))); +#else +#ifndef xmlXPathCompile +extern __typeof (xmlXPathCompile) xmlXPathCompile__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathCompile xmlXPathCompile__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathCompiledEval +extern __typeof (xmlXPathCompiledEval) xmlXPathCompiledEval __attribute((alias("xmlXPathCompiledEval__internal_alias"))); +#else +#ifndef xmlXPathCompiledEval +extern __typeof (xmlXPathCompiledEval) xmlXPathCompiledEval__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathCompiledEval xmlXPathCompiledEval__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathCompiledEvalToBoolean +extern __typeof (xmlXPathCompiledEvalToBoolean) xmlXPathCompiledEvalToBoolean __attribute((alias("xmlXPathCompiledEvalToBoolean__internal_alias"))); +#else +#ifndef xmlXPathCompiledEvalToBoolean +extern __typeof (xmlXPathCompiledEvalToBoolean) xmlXPathCompiledEvalToBoolean__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathCompiledEvalToBoolean xmlXPathCompiledEvalToBoolean__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathConcatFunction +extern __typeof (xmlXPathConcatFunction) xmlXPathConcatFunction __attribute((alias("xmlXPathConcatFunction__internal_alias"))); +#else +#ifndef xmlXPathConcatFunction +extern __typeof (xmlXPathConcatFunction) xmlXPathConcatFunction__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathConcatFunction xmlXPathConcatFunction__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathContainsFunction +extern __typeof (xmlXPathContainsFunction) xmlXPathContainsFunction __attribute((alias("xmlXPathContainsFunction__internal_alias"))); +#else +#ifndef xmlXPathContainsFunction +extern __typeof (xmlXPathContainsFunction) xmlXPathContainsFunction__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathContainsFunction xmlXPathContainsFunction__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathContextSetCache +extern __typeof (xmlXPathContextSetCache) xmlXPathContextSetCache __attribute((alias("xmlXPathContextSetCache__internal_alias"))); +#else +#ifndef xmlXPathContextSetCache +extern __typeof (xmlXPathContextSetCache) xmlXPathContextSetCache__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathContextSetCache xmlXPathContextSetCache__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathConvertBoolean +extern __typeof (xmlXPathConvertBoolean) xmlXPathConvertBoolean __attribute((alias("xmlXPathConvertBoolean__internal_alias"))); +#else +#ifndef xmlXPathConvertBoolean +extern __typeof (xmlXPathConvertBoolean) xmlXPathConvertBoolean__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathConvertBoolean xmlXPathConvertBoolean__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathConvertNumber +extern __typeof (xmlXPathConvertNumber) xmlXPathConvertNumber __attribute((alias("xmlXPathConvertNumber__internal_alias"))); +#else +#ifndef xmlXPathConvertNumber +extern __typeof (xmlXPathConvertNumber) xmlXPathConvertNumber__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathConvertNumber xmlXPathConvertNumber__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathConvertString +extern __typeof (xmlXPathConvertString) xmlXPathConvertString __attribute((alias("xmlXPathConvertString__internal_alias"))); +#else +#ifndef xmlXPathConvertString +extern __typeof (xmlXPathConvertString) xmlXPathConvertString__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathConvertString xmlXPathConvertString__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathCountFunction +extern __typeof (xmlXPathCountFunction) xmlXPathCountFunction __attribute((alias("xmlXPathCountFunction__internal_alias"))); +#else +#ifndef xmlXPathCountFunction +extern __typeof (xmlXPathCountFunction) xmlXPathCountFunction__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathCountFunction xmlXPathCountFunction__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathCtxtCompile +extern __typeof (xmlXPathCtxtCompile) xmlXPathCtxtCompile __attribute((alias("xmlXPathCtxtCompile__internal_alias"))); +#else +#ifndef xmlXPathCtxtCompile +extern __typeof (xmlXPathCtxtCompile) xmlXPathCtxtCompile__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathCtxtCompile xmlXPathCtxtCompile__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_DEBUG_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathDebugDumpCompExpr +extern __typeof (xmlXPathDebugDumpCompExpr) xmlXPathDebugDumpCompExpr __attribute((alias("xmlXPathDebugDumpCompExpr__internal_alias"))); +#else +#ifndef xmlXPathDebugDumpCompExpr +extern __typeof (xmlXPathDebugDumpCompExpr) xmlXPathDebugDumpCompExpr__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathDebugDumpCompExpr xmlXPathDebugDumpCompExpr__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_DEBUG_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathDebugDumpObject +extern __typeof (xmlXPathDebugDumpObject) xmlXPathDebugDumpObject __attribute((alias("xmlXPathDebugDumpObject__internal_alias"))); +#else +#ifndef xmlXPathDebugDumpObject +extern __typeof (xmlXPathDebugDumpObject) xmlXPathDebugDumpObject__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathDebugDumpObject xmlXPathDebugDumpObject__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathDifference +extern __typeof (xmlXPathDifference) xmlXPathDifference __attribute((alias("xmlXPathDifference__internal_alias"))); +#else +#ifndef xmlXPathDifference +extern __typeof (xmlXPathDifference) xmlXPathDifference__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathDifference xmlXPathDifference__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathDistinct +extern __typeof (xmlXPathDistinct) xmlXPathDistinct __attribute((alias("xmlXPathDistinct__internal_alias"))); +#else +#ifndef xmlXPathDistinct +extern __typeof (xmlXPathDistinct) xmlXPathDistinct__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathDistinct xmlXPathDistinct__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathDistinctSorted +extern __typeof (xmlXPathDistinctSorted) xmlXPathDistinctSorted __attribute((alias("xmlXPathDistinctSorted__internal_alias"))); +#else +#ifndef xmlXPathDistinctSorted +extern __typeof (xmlXPathDistinctSorted) xmlXPathDistinctSorted__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathDistinctSorted xmlXPathDistinctSorted__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathDivValues +extern __typeof (xmlXPathDivValues) xmlXPathDivValues __attribute((alias("xmlXPathDivValues__internal_alias"))); +#else +#ifndef xmlXPathDivValues +extern __typeof (xmlXPathDivValues) xmlXPathDivValues__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathDivValues xmlXPathDivValues__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathEqualValues +extern __typeof (xmlXPathEqualValues) xmlXPathEqualValues __attribute((alias("xmlXPathEqualValues__internal_alias"))); +#else +#ifndef xmlXPathEqualValues +extern __typeof (xmlXPathEqualValues) xmlXPathEqualValues__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathEqualValues xmlXPathEqualValues__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathErr +extern __typeof (xmlXPathErr) xmlXPathErr __attribute((alias("xmlXPathErr__internal_alias"))); +#else +#ifndef xmlXPathErr +extern __typeof (xmlXPathErr) xmlXPathErr__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathErr xmlXPathErr__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathEval +extern __typeof (xmlXPathEval) xmlXPathEval __attribute((alias("xmlXPathEval__internal_alias"))); +#else +#ifndef xmlXPathEval +extern __typeof (xmlXPathEval) xmlXPathEval__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathEval xmlXPathEval__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathEvalExpr +extern __typeof (xmlXPathEvalExpr) xmlXPathEvalExpr __attribute((alias("xmlXPathEvalExpr__internal_alias"))); +#else +#ifndef xmlXPathEvalExpr +extern __typeof (xmlXPathEvalExpr) xmlXPathEvalExpr__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathEvalExpr xmlXPathEvalExpr__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathEvalExpression +extern __typeof (xmlXPathEvalExpression) xmlXPathEvalExpression __attribute((alias("xmlXPathEvalExpression__internal_alias"))); +#else +#ifndef xmlXPathEvalExpression +extern __typeof (xmlXPathEvalExpression) xmlXPathEvalExpression__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathEvalExpression xmlXPathEvalExpression__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathEvalPredicate +extern __typeof (xmlXPathEvalPredicate) xmlXPathEvalPredicate __attribute((alias("xmlXPathEvalPredicate__internal_alias"))); +#else +#ifndef xmlXPathEvalPredicate +extern __typeof (xmlXPathEvalPredicate) xmlXPathEvalPredicate__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathEvalPredicate xmlXPathEvalPredicate__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathEvaluatePredicateResult +extern __typeof (xmlXPathEvaluatePredicateResult) xmlXPathEvaluatePredicateResult __attribute((alias("xmlXPathEvaluatePredicateResult__internal_alias"))); +#else +#ifndef xmlXPathEvaluatePredicateResult +extern __typeof (xmlXPathEvaluatePredicateResult) xmlXPathEvaluatePredicateResult__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathEvaluatePredicateResult xmlXPathEvaluatePredicateResult__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathFalseFunction +extern __typeof (xmlXPathFalseFunction) xmlXPathFalseFunction __attribute((alias("xmlXPathFalseFunction__internal_alias"))); +#else +#ifndef xmlXPathFalseFunction +extern __typeof (xmlXPathFalseFunction) xmlXPathFalseFunction__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathFalseFunction xmlXPathFalseFunction__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathFloorFunction +extern __typeof (xmlXPathFloorFunction) xmlXPathFloorFunction __attribute((alias("xmlXPathFloorFunction__internal_alias"))); +#else +#ifndef xmlXPathFloorFunction +extern __typeof (xmlXPathFloorFunction) xmlXPathFloorFunction__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathFloorFunction xmlXPathFloorFunction__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathFreeCompExpr +extern __typeof (xmlXPathFreeCompExpr) xmlXPathFreeCompExpr __attribute((alias("xmlXPathFreeCompExpr__internal_alias"))); +#else +#ifndef xmlXPathFreeCompExpr +extern __typeof (xmlXPathFreeCompExpr) xmlXPathFreeCompExpr__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathFreeCompExpr xmlXPathFreeCompExpr__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathFreeContext +extern __typeof (xmlXPathFreeContext) xmlXPathFreeContext __attribute((alias("xmlXPathFreeContext__internal_alias"))); +#else +#ifndef xmlXPathFreeContext +extern __typeof (xmlXPathFreeContext) xmlXPathFreeContext__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathFreeContext xmlXPathFreeContext__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathFreeNodeSet +extern __typeof (xmlXPathFreeNodeSet) xmlXPathFreeNodeSet __attribute((alias("xmlXPathFreeNodeSet__internal_alias"))); +#else +#ifndef xmlXPathFreeNodeSet +extern __typeof (xmlXPathFreeNodeSet) xmlXPathFreeNodeSet__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathFreeNodeSet xmlXPathFreeNodeSet__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathFreeNodeSetList +extern __typeof (xmlXPathFreeNodeSetList) xmlXPathFreeNodeSetList __attribute((alias("xmlXPathFreeNodeSetList__internal_alias"))); +#else +#ifndef xmlXPathFreeNodeSetList +extern __typeof (xmlXPathFreeNodeSetList) xmlXPathFreeNodeSetList__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathFreeNodeSetList xmlXPathFreeNodeSetList__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathFreeObject +extern __typeof (xmlXPathFreeObject) xmlXPathFreeObject __attribute((alias("xmlXPathFreeObject__internal_alias"))); +#else +#ifndef xmlXPathFreeObject +extern __typeof (xmlXPathFreeObject) xmlXPathFreeObject__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathFreeObject xmlXPathFreeObject__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathFreeParserContext +extern __typeof (xmlXPathFreeParserContext) xmlXPathFreeParserContext __attribute((alias("xmlXPathFreeParserContext__internal_alias"))); +#else +#ifndef xmlXPathFreeParserContext +extern __typeof (xmlXPathFreeParserContext) xmlXPathFreeParserContext__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathFreeParserContext xmlXPathFreeParserContext__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathFunctionLookup +extern __typeof (xmlXPathFunctionLookup) xmlXPathFunctionLookup __attribute((alias("xmlXPathFunctionLookup__internal_alias"))); +#else +#ifndef xmlXPathFunctionLookup +extern __typeof (xmlXPathFunctionLookup) xmlXPathFunctionLookup__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathFunctionLookup xmlXPathFunctionLookup__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathFunctionLookupNS +extern __typeof (xmlXPathFunctionLookupNS) xmlXPathFunctionLookupNS __attribute((alias("xmlXPathFunctionLookupNS__internal_alias"))); +#else +#ifndef xmlXPathFunctionLookupNS +extern __typeof (xmlXPathFunctionLookupNS) xmlXPathFunctionLookupNS__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathFunctionLookupNS xmlXPathFunctionLookupNS__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathHasSameNodes +extern __typeof (xmlXPathHasSameNodes) xmlXPathHasSameNodes __attribute((alias("xmlXPathHasSameNodes__internal_alias"))); +#else +#ifndef xmlXPathHasSameNodes +extern __typeof (xmlXPathHasSameNodes) xmlXPathHasSameNodes__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathHasSameNodes xmlXPathHasSameNodes__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathIdFunction +extern __typeof (xmlXPathIdFunction) xmlXPathIdFunction __attribute((alias("xmlXPathIdFunction__internal_alias"))); +#else +#ifndef xmlXPathIdFunction +extern __typeof (xmlXPathIdFunction) xmlXPathIdFunction__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathIdFunction xmlXPathIdFunction__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathInit +extern __typeof (xmlXPathInit) xmlXPathInit __attribute((alias("xmlXPathInit__internal_alias"))); +#else +#ifndef xmlXPathInit +extern __typeof (xmlXPathInit) xmlXPathInit__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathInit xmlXPathInit__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathIntersection +extern __typeof (xmlXPathIntersection) xmlXPathIntersection __attribute((alias("xmlXPathIntersection__internal_alias"))); +#else +#ifndef xmlXPathIntersection +extern __typeof (xmlXPathIntersection) xmlXPathIntersection__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathIntersection xmlXPathIntersection__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathIsInf +extern __typeof (xmlXPathIsInf) xmlXPathIsInf __attribute((alias("xmlXPathIsInf__internal_alias"))); +#else +#ifndef xmlXPathIsInf +extern __typeof (xmlXPathIsInf) xmlXPathIsInf__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathIsInf xmlXPathIsInf__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathIsNaN +extern __typeof (xmlXPathIsNaN) xmlXPathIsNaN __attribute((alias("xmlXPathIsNaN__internal_alias"))); +#else +#ifndef xmlXPathIsNaN +extern __typeof (xmlXPathIsNaN) xmlXPathIsNaN__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathIsNaN xmlXPathIsNaN__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathIsNodeType +extern __typeof (xmlXPathIsNodeType) xmlXPathIsNodeType __attribute((alias("xmlXPathIsNodeType__internal_alias"))); +#else +#ifndef xmlXPathIsNodeType +extern __typeof (xmlXPathIsNodeType) xmlXPathIsNodeType__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathIsNodeType xmlXPathIsNodeType__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathLangFunction +extern __typeof (xmlXPathLangFunction) xmlXPathLangFunction __attribute((alias("xmlXPathLangFunction__internal_alias"))); +#else +#ifndef xmlXPathLangFunction +extern __typeof (xmlXPathLangFunction) xmlXPathLangFunction__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathLangFunction xmlXPathLangFunction__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathLastFunction +extern __typeof (xmlXPathLastFunction) xmlXPathLastFunction __attribute((alias("xmlXPathLastFunction__internal_alias"))); +#else +#ifndef xmlXPathLastFunction +extern __typeof (xmlXPathLastFunction) xmlXPathLastFunction__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathLastFunction xmlXPathLastFunction__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathLeading +extern __typeof (xmlXPathLeading) xmlXPathLeading __attribute((alias("xmlXPathLeading__internal_alias"))); +#else +#ifndef xmlXPathLeading +extern __typeof (xmlXPathLeading) xmlXPathLeading__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathLeading xmlXPathLeading__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathLeadingSorted +extern __typeof (xmlXPathLeadingSorted) xmlXPathLeadingSorted __attribute((alias("xmlXPathLeadingSorted__internal_alias"))); +#else +#ifndef xmlXPathLeadingSorted +extern __typeof (xmlXPathLeadingSorted) xmlXPathLeadingSorted__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathLeadingSorted xmlXPathLeadingSorted__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathLocalNameFunction +extern __typeof (xmlXPathLocalNameFunction) xmlXPathLocalNameFunction __attribute((alias("xmlXPathLocalNameFunction__internal_alias"))); +#else +#ifndef xmlXPathLocalNameFunction +extern __typeof (xmlXPathLocalNameFunction) xmlXPathLocalNameFunction__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathLocalNameFunction xmlXPathLocalNameFunction__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathModValues +extern __typeof (xmlXPathModValues) xmlXPathModValues __attribute((alias("xmlXPathModValues__internal_alias"))); +#else +#ifndef xmlXPathModValues +extern __typeof (xmlXPathModValues) xmlXPathModValues__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathModValues xmlXPathModValues__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathMultValues +extern __typeof (xmlXPathMultValues) xmlXPathMultValues __attribute((alias("xmlXPathMultValues__internal_alias"))); +#else +#ifndef xmlXPathMultValues +extern __typeof (xmlXPathMultValues) xmlXPathMultValues__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathMultValues xmlXPathMultValues__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNamespaceURIFunction +extern __typeof (xmlXPathNamespaceURIFunction) xmlXPathNamespaceURIFunction __attribute((alias("xmlXPathNamespaceURIFunction__internal_alias"))); +#else +#ifndef xmlXPathNamespaceURIFunction +extern __typeof (xmlXPathNamespaceURIFunction) xmlXPathNamespaceURIFunction__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNamespaceURIFunction xmlXPathNamespaceURIFunction__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNewBoolean +extern __typeof (xmlXPathNewBoolean) xmlXPathNewBoolean __attribute((alias("xmlXPathNewBoolean__internal_alias"))); +#else +#ifndef xmlXPathNewBoolean +extern __typeof (xmlXPathNewBoolean) xmlXPathNewBoolean__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNewBoolean xmlXPathNewBoolean__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNewCString +extern __typeof (xmlXPathNewCString) xmlXPathNewCString __attribute((alias("xmlXPathNewCString__internal_alias"))); +#else +#ifndef xmlXPathNewCString +extern __typeof (xmlXPathNewCString) xmlXPathNewCString__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNewCString xmlXPathNewCString__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNewContext +extern __typeof (xmlXPathNewContext) xmlXPathNewContext __attribute((alias("xmlXPathNewContext__internal_alias"))); +#else +#ifndef xmlXPathNewContext +extern __typeof (xmlXPathNewContext) xmlXPathNewContext__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNewContext xmlXPathNewContext__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNewFloat +extern __typeof (xmlXPathNewFloat) xmlXPathNewFloat __attribute((alias("xmlXPathNewFloat__internal_alias"))); +#else +#ifndef xmlXPathNewFloat +extern __typeof (xmlXPathNewFloat) xmlXPathNewFloat__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNewFloat xmlXPathNewFloat__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNewNodeSet +extern __typeof (xmlXPathNewNodeSet) xmlXPathNewNodeSet __attribute((alias("xmlXPathNewNodeSet__internal_alias"))); +#else +#ifndef xmlXPathNewNodeSet +extern __typeof (xmlXPathNewNodeSet) xmlXPathNewNodeSet__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNewNodeSet xmlXPathNewNodeSet__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNewNodeSetList +extern __typeof (xmlXPathNewNodeSetList) xmlXPathNewNodeSetList __attribute((alias("xmlXPathNewNodeSetList__internal_alias"))); +#else +#ifndef xmlXPathNewNodeSetList +extern __typeof (xmlXPathNewNodeSetList) xmlXPathNewNodeSetList__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNewNodeSetList xmlXPathNewNodeSetList__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNewParserContext +extern __typeof (xmlXPathNewParserContext) xmlXPathNewParserContext __attribute((alias("xmlXPathNewParserContext__internal_alias"))); +#else +#ifndef xmlXPathNewParserContext +extern __typeof (xmlXPathNewParserContext) xmlXPathNewParserContext__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNewParserContext xmlXPathNewParserContext__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNewString +extern __typeof (xmlXPathNewString) xmlXPathNewString __attribute((alias("xmlXPathNewString__internal_alias"))); +#else +#ifndef xmlXPathNewString +extern __typeof (xmlXPathNewString) xmlXPathNewString__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNewString xmlXPathNewString__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNewValueTree +extern __typeof (xmlXPathNewValueTree) xmlXPathNewValueTree __attribute((alias("xmlXPathNewValueTree__internal_alias"))); +#else +#ifndef xmlXPathNewValueTree +extern __typeof (xmlXPathNewValueTree) xmlXPathNewValueTree__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNewValueTree xmlXPathNewValueTree__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNextAncestor +extern __typeof (xmlXPathNextAncestor) xmlXPathNextAncestor __attribute((alias("xmlXPathNextAncestor__internal_alias"))); +#else +#ifndef xmlXPathNextAncestor +extern __typeof (xmlXPathNextAncestor) xmlXPathNextAncestor__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNextAncestor xmlXPathNextAncestor__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNextAncestorOrSelf +extern __typeof (xmlXPathNextAncestorOrSelf) xmlXPathNextAncestorOrSelf __attribute((alias("xmlXPathNextAncestorOrSelf__internal_alias"))); +#else +#ifndef xmlXPathNextAncestorOrSelf +extern __typeof (xmlXPathNextAncestorOrSelf) xmlXPathNextAncestorOrSelf__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNextAncestorOrSelf xmlXPathNextAncestorOrSelf__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNextAttribute +extern __typeof (xmlXPathNextAttribute) xmlXPathNextAttribute __attribute((alias("xmlXPathNextAttribute__internal_alias"))); +#else +#ifndef xmlXPathNextAttribute +extern __typeof (xmlXPathNextAttribute) xmlXPathNextAttribute__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNextAttribute xmlXPathNextAttribute__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNextChild +extern __typeof (xmlXPathNextChild) xmlXPathNextChild __attribute((alias("xmlXPathNextChild__internal_alias"))); +#else +#ifndef xmlXPathNextChild +extern __typeof (xmlXPathNextChild) xmlXPathNextChild__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNextChild xmlXPathNextChild__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNextDescendant +extern __typeof (xmlXPathNextDescendant) xmlXPathNextDescendant __attribute((alias("xmlXPathNextDescendant__internal_alias"))); +#else +#ifndef xmlXPathNextDescendant +extern __typeof (xmlXPathNextDescendant) xmlXPathNextDescendant__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNextDescendant xmlXPathNextDescendant__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNextDescendantOrSelf +extern __typeof (xmlXPathNextDescendantOrSelf) xmlXPathNextDescendantOrSelf __attribute((alias("xmlXPathNextDescendantOrSelf__internal_alias"))); +#else +#ifndef xmlXPathNextDescendantOrSelf +extern __typeof (xmlXPathNextDescendantOrSelf) xmlXPathNextDescendantOrSelf__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNextDescendantOrSelf xmlXPathNextDescendantOrSelf__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNextFollowing +extern __typeof (xmlXPathNextFollowing) xmlXPathNextFollowing __attribute((alias("xmlXPathNextFollowing__internal_alias"))); +#else +#ifndef xmlXPathNextFollowing +extern __typeof (xmlXPathNextFollowing) xmlXPathNextFollowing__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNextFollowing xmlXPathNextFollowing__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNextFollowingSibling +extern __typeof (xmlXPathNextFollowingSibling) xmlXPathNextFollowingSibling __attribute((alias("xmlXPathNextFollowingSibling__internal_alias"))); +#else +#ifndef xmlXPathNextFollowingSibling +extern __typeof (xmlXPathNextFollowingSibling) xmlXPathNextFollowingSibling__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNextFollowingSibling xmlXPathNextFollowingSibling__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNextNamespace +extern __typeof (xmlXPathNextNamespace) xmlXPathNextNamespace __attribute((alias("xmlXPathNextNamespace__internal_alias"))); +#else +#ifndef xmlXPathNextNamespace +extern __typeof (xmlXPathNextNamespace) xmlXPathNextNamespace__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNextNamespace xmlXPathNextNamespace__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNextParent +extern __typeof (xmlXPathNextParent) xmlXPathNextParent __attribute((alias("xmlXPathNextParent__internal_alias"))); +#else +#ifndef xmlXPathNextParent +extern __typeof (xmlXPathNextParent) xmlXPathNextParent__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNextParent xmlXPathNextParent__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNextPreceding +extern __typeof (xmlXPathNextPreceding) xmlXPathNextPreceding __attribute((alias("xmlXPathNextPreceding__internal_alias"))); +#else +#ifndef xmlXPathNextPreceding +extern __typeof (xmlXPathNextPreceding) xmlXPathNextPreceding__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNextPreceding xmlXPathNextPreceding__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNextPrecedingSibling +extern __typeof (xmlXPathNextPrecedingSibling) xmlXPathNextPrecedingSibling __attribute((alias("xmlXPathNextPrecedingSibling__internal_alias"))); +#else +#ifndef xmlXPathNextPrecedingSibling +extern __typeof (xmlXPathNextPrecedingSibling) xmlXPathNextPrecedingSibling__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNextPrecedingSibling xmlXPathNextPrecedingSibling__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNextSelf +extern __typeof (xmlXPathNextSelf) xmlXPathNextSelf __attribute((alias("xmlXPathNextSelf__internal_alias"))); +#else +#ifndef xmlXPathNextSelf +extern __typeof (xmlXPathNextSelf) xmlXPathNextSelf__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNextSelf xmlXPathNextSelf__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNodeLeading +extern __typeof (xmlXPathNodeLeading) xmlXPathNodeLeading __attribute((alias("xmlXPathNodeLeading__internal_alias"))); +#else +#ifndef xmlXPathNodeLeading +extern __typeof (xmlXPathNodeLeading) xmlXPathNodeLeading__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNodeLeading xmlXPathNodeLeading__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNodeLeadingSorted +extern __typeof (xmlXPathNodeLeadingSorted) xmlXPathNodeLeadingSorted __attribute((alias("xmlXPathNodeLeadingSorted__internal_alias"))); +#else +#ifndef xmlXPathNodeLeadingSorted +extern __typeof (xmlXPathNodeLeadingSorted) xmlXPathNodeLeadingSorted__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNodeLeadingSorted xmlXPathNodeLeadingSorted__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNodeSetAdd +extern __typeof (xmlXPathNodeSetAdd) xmlXPathNodeSetAdd __attribute((alias("xmlXPathNodeSetAdd__internal_alias"))); +#else +#ifndef xmlXPathNodeSetAdd +extern __typeof (xmlXPathNodeSetAdd) xmlXPathNodeSetAdd__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNodeSetAdd xmlXPathNodeSetAdd__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNodeSetAddNs +extern __typeof (xmlXPathNodeSetAddNs) xmlXPathNodeSetAddNs __attribute((alias("xmlXPathNodeSetAddNs__internal_alias"))); +#else +#ifndef xmlXPathNodeSetAddNs +extern __typeof (xmlXPathNodeSetAddNs) xmlXPathNodeSetAddNs__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNodeSetAddNs xmlXPathNodeSetAddNs__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNodeSetAddUnique +extern __typeof (xmlXPathNodeSetAddUnique) xmlXPathNodeSetAddUnique __attribute((alias("xmlXPathNodeSetAddUnique__internal_alias"))); +#else +#ifndef xmlXPathNodeSetAddUnique +extern __typeof (xmlXPathNodeSetAddUnique) xmlXPathNodeSetAddUnique__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNodeSetAddUnique xmlXPathNodeSetAddUnique__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNodeSetContains +extern __typeof (xmlXPathNodeSetContains) xmlXPathNodeSetContains __attribute((alias("xmlXPathNodeSetContains__internal_alias"))); +#else +#ifndef xmlXPathNodeSetContains +extern __typeof (xmlXPathNodeSetContains) xmlXPathNodeSetContains__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNodeSetContains xmlXPathNodeSetContains__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNodeSetCreate +extern __typeof (xmlXPathNodeSetCreate) xmlXPathNodeSetCreate __attribute((alias("xmlXPathNodeSetCreate__internal_alias"))); +#else +#ifndef xmlXPathNodeSetCreate +extern __typeof (xmlXPathNodeSetCreate) xmlXPathNodeSetCreate__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNodeSetCreate xmlXPathNodeSetCreate__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNodeSetDel +extern __typeof (xmlXPathNodeSetDel) xmlXPathNodeSetDel __attribute((alias("xmlXPathNodeSetDel__internal_alias"))); +#else +#ifndef xmlXPathNodeSetDel +extern __typeof (xmlXPathNodeSetDel) xmlXPathNodeSetDel__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNodeSetDel xmlXPathNodeSetDel__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNodeSetFreeNs +extern __typeof (xmlXPathNodeSetFreeNs) xmlXPathNodeSetFreeNs __attribute((alias("xmlXPathNodeSetFreeNs__internal_alias"))); +#else +#ifndef xmlXPathNodeSetFreeNs +extern __typeof (xmlXPathNodeSetFreeNs) xmlXPathNodeSetFreeNs__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNodeSetFreeNs xmlXPathNodeSetFreeNs__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNodeSetMerge +extern __typeof (xmlXPathNodeSetMerge) xmlXPathNodeSetMerge __attribute((alias("xmlXPathNodeSetMerge__internal_alias"))); +#else +#ifndef xmlXPathNodeSetMerge +extern __typeof (xmlXPathNodeSetMerge) xmlXPathNodeSetMerge__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNodeSetMerge xmlXPathNodeSetMerge__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNodeSetRemove +extern __typeof (xmlXPathNodeSetRemove) xmlXPathNodeSetRemove __attribute((alias("xmlXPathNodeSetRemove__internal_alias"))); +#else +#ifndef xmlXPathNodeSetRemove +extern __typeof (xmlXPathNodeSetRemove) xmlXPathNodeSetRemove__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNodeSetRemove xmlXPathNodeSetRemove__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNodeSetSort +extern __typeof (xmlXPathNodeSetSort) xmlXPathNodeSetSort __attribute((alias("xmlXPathNodeSetSort__internal_alias"))); +#else +#ifndef xmlXPathNodeSetSort +extern __typeof (xmlXPathNodeSetSort) xmlXPathNodeSetSort__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNodeSetSort xmlXPathNodeSetSort__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNodeTrailing +extern __typeof (xmlXPathNodeTrailing) xmlXPathNodeTrailing __attribute((alias("xmlXPathNodeTrailing__internal_alias"))); +#else +#ifndef xmlXPathNodeTrailing +extern __typeof (xmlXPathNodeTrailing) xmlXPathNodeTrailing__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNodeTrailing xmlXPathNodeTrailing__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNodeTrailingSorted +extern __typeof (xmlXPathNodeTrailingSorted) xmlXPathNodeTrailingSorted __attribute((alias("xmlXPathNodeTrailingSorted__internal_alias"))); +#else +#ifndef xmlXPathNodeTrailingSorted +extern __typeof (xmlXPathNodeTrailingSorted) xmlXPathNodeTrailingSorted__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNodeTrailingSorted xmlXPathNodeTrailingSorted__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNormalizeFunction +extern __typeof (xmlXPathNormalizeFunction) xmlXPathNormalizeFunction __attribute((alias("xmlXPathNormalizeFunction__internal_alias"))); +#else +#ifndef xmlXPathNormalizeFunction +extern __typeof (xmlXPathNormalizeFunction) xmlXPathNormalizeFunction__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNormalizeFunction xmlXPathNormalizeFunction__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNotEqualValues +extern __typeof (xmlXPathNotEqualValues) xmlXPathNotEqualValues __attribute((alias("xmlXPathNotEqualValues__internal_alias"))); +#else +#ifndef xmlXPathNotEqualValues +extern __typeof (xmlXPathNotEqualValues) xmlXPathNotEqualValues__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNotEqualValues xmlXPathNotEqualValues__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNotFunction +extern __typeof (xmlXPathNotFunction) xmlXPathNotFunction __attribute((alias("xmlXPathNotFunction__internal_alias"))); +#else +#ifndef xmlXPathNotFunction +extern __typeof (xmlXPathNotFunction) xmlXPathNotFunction__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNotFunction xmlXPathNotFunction__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNsLookup +extern __typeof (xmlXPathNsLookup) xmlXPathNsLookup __attribute((alias("xmlXPathNsLookup__internal_alias"))); +#else +#ifndef xmlXPathNsLookup +extern __typeof (xmlXPathNsLookup) xmlXPathNsLookup__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNsLookup xmlXPathNsLookup__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathNumberFunction +extern __typeof (xmlXPathNumberFunction) xmlXPathNumberFunction __attribute((alias("xmlXPathNumberFunction__internal_alias"))); +#else +#ifndef xmlXPathNumberFunction +extern __typeof (xmlXPathNumberFunction) xmlXPathNumberFunction__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathNumberFunction xmlXPathNumberFunction__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathObjectCopy +extern __typeof (xmlXPathObjectCopy) xmlXPathObjectCopy __attribute((alias("xmlXPathObjectCopy__internal_alias"))); +#else +#ifndef xmlXPathObjectCopy +extern __typeof (xmlXPathObjectCopy) xmlXPathObjectCopy__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathObjectCopy xmlXPathObjectCopy__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathOrderDocElems +extern __typeof (xmlXPathOrderDocElems) xmlXPathOrderDocElems __attribute((alias("xmlXPathOrderDocElems__internal_alias"))); +#else +#ifndef xmlXPathOrderDocElems +extern __typeof (xmlXPathOrderDocElems) xmlXPathOrderDocElems__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathOrderDocElems xmlXPathOrderDocElems__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathParseNCName +extern __typeof (xmlXPathParseNCName) xmlXPathParseNCName __attribute((alias("xmlXPathParseNCName__internal_alias"))); +#else +#ifndef xmlXPathParseNCName +extern __typeof (xmlXPathParseNCName) xmlXPathParseNCName__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathParseNCName xmlXPathParseNCName__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathParseName +extern __typeof (xmlXPathParseName) xmlXPathParseName __attribute((alias("xmlXPathParseName__internal_alias"))); +#else +#ifndef xmlXPathParseName +extern __typeof (xmlXPathParseName) xmlXPathParseName__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathParseName xmlXPathParseName__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathPopBoolean +extern __typeof (xmlXPathPopBoolean) xmlXPathPopBoolean __attribute((alias("xmlXPathPopBoolean__internal_alias"))); +#else +#ifndef xmlXPathPopBoolean +extern __typeof (xmlXPathPopBoolean) xmlXPathPopBoolean__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathPopBoolean xmlXPathPopBoolean__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathPopExternal +extern __typeof (xmlXPathPopExternal) xmlXPathPopExternal __attribute((alias("xmlXPathPopExternal__internal_alias"))); +#else +#ifndef xmlXPathPopExternal +extern __typeof (xmlXPathPopExternal) xmlXPathPopExternal__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathPopExternal xmlXPathPopExternal__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathPopNodeSet +extern __typeof (xmlXPathPopNodeSet) xmlXPathPopNodeSet __attribute((alias("xmlXPathPopNodeSet__internal_alias"))); +#else +#ifndef xmlXPathPopNodeSet +extern __typeof (xmlXPathPopNodeSet) xmlXPathPopNodeSet__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathPopNodeSet xmlXPathPopNodeSet__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathPopNumber +extern __typeof (xmlXPathPopNumber) xmlXPathPopNumber __attribute((alias("xmlXPathPopNumber__internal_alias"))); +#else +#ifndef xmlXPathPopNumber +extern __typeof (xmlXPathPopNumber) xmlXPathPopNumber__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathPopNumber xmlXPathPopNumber__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathPopString +extern __typeof (xmlXPathPopString) xmlXPathPopString __attribute((alias("xmlXPathPopString__internal_alias"))); +#else +#ifndef xmlXPathPopString +extern __typeof (xmlXPathPopString) xmlXPathPopString__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathPopString xmlXPathPopString__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathPositionFunction +extern __typeof (xmlXPathPositionFunction) xmlXPathPositionFunction __attribute((alias("xmlXPathPositionFunction__internal_alias"))); +#else +#ifndef xmlXPathPositionFunction +extern __typeof (xmlXPathPositionFunction) xmlXPathPositionFunction__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathPositionFunction xmlXPathPositionFunction__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathRegisterAllFunctions +extern __typeof (xmlXPathRegisterAllFunctions) xmlXPathRegisterAllFunctions __attribute((alias("xmlXPathRegisterAllFunctions__internal_alias"))); +#else +#ifndef xmlXPathRegisterAllFunctions +extern __typeof (xmlXPathRegisterAllFunctions) xmlXPathRegisterAllFunctions__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathRegisterAllFunctions xmlXPathRegisterAllFunctions__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathRegisterFunc +extern __typeof (xmlXPathRegisterFunc) xmlXPathRegisterFunc __attribute((alias("xmlXPathRegisterFunc__internal_alias"))); +#else +#ifndef xmlXPathRegisterFunc +extern __typeof (xmlXPathRegisterFunc) xmlXPathRegisterFunc__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathRegisterFunc xmlXPathRegisterFunc__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathRegisterFuncLookup +extern __typeof (xmlXPathRegisterFuncLookup) xmlXPathRegisterFuncLookup __attribute((alias("xmlXPathRegisterFuncLookup__internal_alias"))); +#else +#ifndef xmlXPathRegisterFuncLookup +extern __typeof (xmlXPathRegisterFuncLookup) xmlXPathRegisterFuncLookup__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathRegisterFuncLookup xmlXPathRegisterFuncLookup__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathRegisterFuncNS +extern __typeof (xmlXPathRegisterFuncNS) xmlXPathRegisterFuncNS __attribute((alias("xmlXPathRegisterFuncNS__internal_alias"))); +#else +#ifndef xmlXPathRegisterFuncNS +extern __typeof (xmlXPathRegisterFuncNS) xmlXPathRegisterFuncNS__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathRegisterFuncNS xmlXPathRegisterFuncNS__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathRegisterNs +extern __typeof (xmlXPathRegisterNs) xmlXPathRegisterNs __attribute((alias("xmlXPathRegisterNs__internal_alias"))); +#else +#ifndef xmlXPathRegisterNs +extern __typeof (xmlXPathRegisterNs) xmlXPathRegisterNs__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathRegisterNs xmlXPathRegisterNs__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathRegisterVariable +extern __typeof (xmlXPathRegisterVariable) xmlXPathRegisterVariable __attribute((alias("xmlXPathRegisterVariable__internal_alias"))); +#else +#ifndef xmlXPathRegisterVariable +extern __typeof (xmlXPathRegisterVariable) xmlXPathRegisterVariable__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathRegisterVariable xmlXPathRegisterVariable__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathRegisterVariableLookup +extern __typeof (xmlXPathRegisterVariableLookup) xmlXPathRegisterVariableLookup __attribute((alias("xmlXPathRegisterVariableLookup__internal_alias"))); +#else +#ifndef xmlXPathRegisterVariableLookup +extern __typeof (xmlXPathRegisterVariableLookup) xmlXPathRegisterVariableLookup__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathRegisterVariableLookup xmlXPathRegisterVariableLookup__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathRegisterVariableNS +extern __typeof (xmlXPathRegisterVariableNS) xmlXPathRegisterVariableNS __attribute((alias("xmlXPathRegisterVariableNS__internal_alias"))); +#else +#ifndef xmlXPathRegisterVariableNS +extern __typeof (xmlXPathRegisterVariableNS) xmlXPathRegisterVariableNS__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathRegisterVariableNS xmlXPathRegisterVariableNS__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathRegisteredFuncsCleanup +extern __typeof (xmlXPathRegisteredFuncsCleanup) xmlXPathRegisteredFuncsCleanup __attribute((alias("xmlXPathRegisteredFuncsCleanup__internal_alias"))); +#else +#ifndef xmlXPathRegisteredFuncsCleanup +extern __typeof (xmlXPathRegisteredFuncsCleanup) xmlXPathRegisteredFuncsCleanup__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathRegisteredFuncsCleanup xmlXPathRegisteredFuncsCleanup__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathRegisteredNsCleanup +extern __typeof (xmlXPathRegisteredNsCleanup) xmlXPathRegisteredNsCleanup __attribute((alias("xmlXPathRegisteredNsCleanup__internal_alias"))); +#else +#ifndef xmlXPathRegisteredNsCleanup +extern __typeof (xmlXPathRegisteredNsCleanup) xmlXPathRegisteredNsCleanup__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathRegisteredNsCleanup xmlXPathRegisteredNsCleanup__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathRegisteredVariablesCleanup +extern __typeof (xmlXPathRegisteredVariablesCleanup) xmlXPathRegisteredVariablesCleanup __attribute((alias("xmlXPathRegisteredVariablesCleanup__internal_alias"))); +#else +#ifndef xmlXPathRegisteredVariablesCleanup +extern __typeof (xmlXPathRegisteredVariablesCleanup) xmlXPathRegisteredVariablesCleanup__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathRegisteredVariablesCleanup xmlXPathRegisteredVariablesCleanup__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathRoot +extern __typeof (xmlXPathRoot) xmlXPathRoot __attribute((alias("xmlXPathRoot__internal_alias"))); +#else +#ifndef xmlXPathRoot +extern __typeof (xmlXPathRoot) xmlXPathRoot__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathRoot xmlXPathRoot__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathRoundFunction +extern __typeof (xmlXPathRoundFunction) xmlXPathRoundFunction __attribute((alias("xmlXPathRoundFunction__internal_alias"))); +#else +#ifndef xmlXPathRoundFunction +extern __typeof (xmlXPathRoundFunction) xmlXPathRoundFunction__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathRoundFunction xmlXPathRoundFunction__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathStartsWithFunction +extern __typeof (xmlXPathStartsWithFunction) xmlXPathStartsWithFunction __attribute((alias("xmlXPathStartsWithFunction__internal_alias"))); +#else +#ifndef xmlXPathStartsWithFunction +extern __typeof (xmlXPathStartsWithFunction) xmlXPathStartsWithFunction__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathStartsWithFunction xmlXPathStartsWithFunction__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathStringEvalNumber +extern __typeof (xmlXPathStringEvalNumber) xmlXPathStringEvalNumber __attribute((alias("xmlXPathStringEvalNumber__internal_alias"))); +#else +#ifndef xmlXPathStringEvalNumber +extern __typeof (xmlXPathStringEvalNumber) xmlXPathStringEvalNumber__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathStringEvalNumber xmlXPathStringEvalNumber__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathStringFunction +extern __typeof (xmlXPathStringFunction) xmlXPathStringFunction __attribute((alias("xmlXPathStringFunction__internal_alias"))); +#else +#ifndef xmlXPathStringFunction +extern __typeof (xmlXPathStringFunction) xmlXPathStringFunction__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathStringFunction xmlXPathStringFunction__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathStringLengthFunction +extern __typeof (xmlXPathStringLengthFunction) xmlXPathStringLengthFunction __attribute((alias("xmlXPathStringLengthFunction__internal_alias"))); +#else +#ifndef xmlXPathStringLengthFunction +extern __typeof (xmlXPathStringLengthFunction) xmlXPathStringLengthFunction__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathStringLengthFunction xmlXPathStringLengthFunction__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathSubValues +extern __typeof (xmlXPathSubValues) xmlXPathSubValues __attribute((alias("xmlXPathSubValues__internal_alias"))); +#else +#ifndef xmlXPathSubValues +extern __typeof (xmlXPathSubValues) xmlXPathSubValues__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathSubValues xmlXPathSubValues__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathSubstringAfterFunction +extern __typeof (xmlXPathSubstringAfterFunction) xmlXPathSubstringAfterFunction __attribute((alias("xmlXPathSubstringAfterFunction__internal_alias"))); +#else +#ifndef xmlXPathSubstringAfterFunction +extern __typeof (xmlXPathSubstringAfterFunction) xmlXPathSubstringAfterFunction__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathSubstringAfterFunction xmlXPathSubstringAfterFunction__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathSubstringBeforeFunction +extern __typeof (xmlXPathSubstringBeforeFunction) xmlXPathSubstringBeforeFunction __attribute((alias("xmlXPathSubstringBeforeFunction__internal_alias"))); +#else +#ifndef xmlXPathSubstringBeforeFunction +extern __typeof (xmlXPathSubstringBeforeFunction) xmlXPathSubstringBeforeFunction__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathSubstringBeforeFunction xmlXPathSubstringBeforeFunction__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathSubstringFunction +extern __typeof (xmlXPathSubstringFunction) xmlXPathSubstringFunction __attribute((alias("xmlXPathSubstringFunction__internal_alias"))); +#else +#ifndef xmlXPathSubstringFunction +extern __typeof (xmlXPathSubstringFunction) xmlXPathSubstringFunction__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathSubstringFunction xmlXPathSubstringFunction__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathSumFunction +extern __typeof (xmlXPathSumFunction) xmlXPathSumFunction __attribute((alias("xmlXPathSumFunction__internal_alias"))); +#else +#ifndef xmlXPathSumFunction +extern __typeof (xmlXPathSumFunction) xmlXPathSumFunction__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathSumFunction xmlXPathSumFunction__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathTrailing +extern __typeof (xmlXPathTrailing) xmlXPathTrailing __attribute((alias("xmlXPathTrailing__internal_alias"))); +#else +#ifndef xmlXPathTrailing +extern __typeof (xmlXPathTrailing) xmlXPathTrailing__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathTrailing xmlXPathTrailing__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathTrailingSorted +extern __typeof (xmlXPathTrailingSorted) xmlXPathTrailingSorted __attribute((alias("xmlXPathTrailingSorted__internal_alias"))); +#else +#ifndef xmlXPathTrailingSorted +extern __typeof (xmlXPathTrailingSorted) xmlXPathTrailingSorted__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathTrailingSorted xmlXPathTrailingSorted__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathTranslateFunction +extern __typeof (xmlXPathTranslateFunction) xmlXPathTranslateFunction __attribute((alias("xmlXPathTranslateFunction__internal_alias"))); +#else +#ifndef xmlXPathTranslateFunction +extern __typeof (xmlXPathTranslateFunction) xmlXPathTranslateFunction__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathTranslateFunction xmlXPathTranslateFunction__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathTrueFunction +extern __typeof (xmlXPathTrueFunction) xmlXPathTrueFunction __attribute((alias("xmlXPathTrueFunction__internal_alias"))); +#else +#ifndef xmlXPathTrueFunction +extern __typeof (xmlXPathTrueFunction) xmlXPathTrueFunction__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathTrueFunction xmlXPathTrueFunction__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathValueFlipSign +extern __typeof (xmlXPathValueFlipSign) xmlXPathValueFlipSign __attribute((alias("xmlXPathValueFlipSign__internal_alias"))); +#else +#ifndef xmlXPathValueFlipSign +extern __typeof (xmlXPathValueFlipSign) xmlXPathValueFlipSign__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathValueFlipSign xmlXPathValueFlipSign__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathVariableLookup +extern __typeof (xmlXPathVariableLookup) xmlXPathVariableLookup __attribute((alias("xmlXPathVariableLookup__internal_alias"))); +#else +#ifndef xmlXPathVariableLookup +extern __typeof (xmlXPathVariableLookup) xmlXPathVariableLookup__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathVariableLookup xmlXPathVariableLookup__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathVariableLookupNS +extern __typeof (xmlXPathVariableLookupNS) xmlXPathVariableLookupNS __attribute((alias("xmlXPathVariableLookupNS__internal_alias"))); +#else +#ifndef xmlXPathVariableLookupNS +extern __typeof (xmlXPathVariableLookupNS) xmlXPathVariableLookupNS__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathVariableLookupNS xmlXPathVariableLookupNS__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathWrapCString +extern __typeof (xmlXPathWrapCString) xmlXPathWrapCString __attribute((alias("xmlXPathWrapCString__internal_alias"))); +#else +#ifndef xmlXPathWrapCString +extern __typeof (xmlXPathWrapCString) xmlXPathWrapCString__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathWrapCString xmlXPathWrapCString__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathWrapExternal +extern __typeof (xmlXPathWrapExternal) xmlXPathWrapExternal __attribute((alias("xmlXPathWrapExternal__internal_alias"))); +#else +#ifndef xmlXPathWrapExternal +extern __typeof (xmlXPathWrapExternal) xmlXPathWrapExternal__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathWrapExternal xmlXPathWrapExternal__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathWrapNodeSet +extern __typeof (xmlXPathWrapNodeSet) xmlXPathWrapNodeSet __attribute((alias("xmlXPathWrapNodeSet__internal_alias"))); +#else +#ifndef xmlXPathWrapNodeSet +extern __typeof (xmlXPathWrapNodeSet) xmlXPathWrapNodeSet__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathWrapNodeSet xmlXPathWrapNodeSet__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPathWrapString +extern __typeof (xmlXPathWrapString) xmlXPathWrapString __attribute((alias("xmlXPathWrapString__internal_alias"))); +#else +#ifndef xmlXPathWrapString +extern __typeof (xmlXPathWrapString) xmlXPathWrapString__internal_alias __attribute((visibility("hidden"))); +#define xmlXPathWrapString xmlXPathWrapString__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPATH_ENABLED) +#ifdef bottom_xpath +#undef xmlXPatherror +extern __typeof (xmlXPatherror) xmlXPatherror __attribute((alias("xmlXPatherror__internal_alias"))); +#else +#ifndef xmlXPatherror +extern __typeof (xmlXPatherror) xmlXPatherror__internal_alias __attribute((visibility("hidden"))); +#define xmlXPatherror xmlXPatherror__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPTR_ENABLED) +#ifdef bottom_xpointer +#undef xmlXPtrBuildNodeList +extern __typeof (xmlXPtrBuildNodeList) xmlXPtrBuildNodeList __attribute((alias("xmlXPtrBuildNodeList__internal_alias"))); +#else +#ifndef xmlXPtrBuildNodeList +extern __typeof (xmlXPtrBuildNodeList) xmlXPtrBuildNodeList__internal_alias __attribute((visibility("hidden"))); +#define xmlXPtrBuildNodeList xmlXPtrBuildNodeList__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPTR_ENABLED) +#ifdef bottom_xpointer +#undef xmlXPtrEval +extern __typeof (xmlXPtrEval) xmlXPtrEval __attribute((alias("xmlXPtrEval__internal_alias"))); +#else +#ifndef xmlXPtrEval +extern __typeof (xmlXPtrEval) xmlXPtrEval__internal_alias __attribute((visibility("hidden"))); +#define xmlXPtrEval xmlXPtrEval__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPTR_ENABLED) +#ifdef bottom_xpointer +#undef xmlXPtrEvalRangePredicate +extern __typeof (xmlXPtrEvalRangePredicate) xmlXPtrEvalRangePredicate __attribute((alias("xmlXPtrEvalRangePredicate__internal_alias"))); +#else +#ifndef xmlXPtrEvalRangePredicate +extern __typeof (xmlXPtrEvalRangePredicate) xmlXPtrEvalRangePredicate__internal_alias __attribute((visibility("hidden"))); +#define xmlXPtrEvalRangePredicate xmlXPtrEvalRangePredicate__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPTR_ENABLED) +#ifdef bottom_xpointer +#undef xmlXPtrFreeLocationSet +extern __typeof (xmlXPtrFreeLocationSet) xmlXPtrFreeLocationSet __attribute((alias("xmlXPtrFreeLocationSet__internal_alias"))); +#else +#ifndef xmlXPtrFreeLocationSet +extern __typeof (xmlXPtrFreeLocationSet) xmlXPtrFreeLocationSet__internal_alias __attribute((visibility("hidden"))); +#define xmlXPtrFreeLocationSet xmlXPtrFreeLocationSet__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPTR_ENABLED) +#ifdef bottom_xpointer +#undef xmlXPtrLocationSetAdd +extern __typeof (xmlXPtrLocationSetAdd) xmlXPtrLocationSetAdd __attribute((alias("xmlXPtrLocationSetAdd__internal_alias"))); +#else +#ifndef xmlXPtrLocationSetAdd +extern __typeof (xmlXPtrLocationSetAdd) xmlXPtrLocationSetAdd__internal_alias __attribute((visibility("hidden"))); +#define xmlXPtrLocationSetAdd xmlXPtrLocationSetAdd__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPTR_ENABLED) +#ifdef bottom_xpointer +#undef xmlXPtrLocationSetCreate +extern __typeof (xmlXPtrLocationSetCreate) xmlXPtrLocationSetCreate __attribute((alias("xmlXPtrLocationSetCreate__internal_alias"))); +#else +#ifndef xmlXPtrLocationSetCreate +extern __typeof (xmlXPtrLocationSetCreate) xmlXPtrLocationSetCreate__internal_alias __attribute((visibility("hidden"))); +#define xmlXPtrLocationSetCreate xmlXPtrLocationSetCreate__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPTR_ENABLED) +#ifdef bottom_xpointer +#undef xmlXPtrLocationSetDel +extern __typeof (xmlXPtrLocationSetDel) xmlXPtrLocationSetDel __attribute((alias("xmlXPtrLocationSetDel__internal_alias"))); +#else +#ifndef xmlXPtrLocationSetDel +extern __typeof (xmlXPtrLocationSetDel) xmlXPtrLocationSetDel__internal_alias __attribute((visibility("hidden"))); +#define xmlXPtrLocationSetDel xmlXPtrLocationSetDel__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPTR_ENABLED) +#ifdef bottom_xpointer +#undef xmlXPtrLocationSetMerge +extern __typeof (xmlXPtrLocationSetMerge) xmlXPtrLocationSetMerge __attribute((alias("xmlXPtrLocationSetMerge__internal_alias"))); +#else +#ifndef xmlXPtrLocationSetMerge +extern __typeof (xmlXPtrLocationSetMerge) xmlXPtrLocationSetMerge__internal_alias __attribute((visibility("hidden"))); +#define xmlXPtrLocationSetMerge xmlXPtrLocationSetMerge__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPTR_ENABLED) +#ifdef bottom_xpointer +#undef xmlXPtrLocationSetRemove +extern __typeof (xmlXPtrLocationSetRemove) xmlXPtrLocationSetRemove __attribute((alias("xmlXPtrLocationSetRemove__internal_alias"))); +#else +#ifndef xmlXPtrLocationSetRemove +extern __typeof (xmlXPtrLocationSetRemove) xmlXPtrLocationSetRemove__internal_alias __attribute((visibility("hidden"))); +#define xmlXPtrLocationSetRemove xmlXPtrLocationSetRemove__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPTR_ENABLED) +#ifdef bottom_xpointer +#undef xmlXPtrNewCollapsedRange +extern __typeof (xmlXPtrNewCollapsedRange) xmlXPtrNewCollapsedRange __attribute((alias("xmlXPtrNewCollapsedRange__internal_alias"))); +#else +#ifndef xmlXPtrNewCollapsedRange +extern __typeof (xmlXPtrNewCollapsedRange) xmlXPtrNewCollapsedRange__internal_alias __attribute((visibility("hidden"))); +#define xmlXPtrNewCollapsedRange xmlXPtrNewCollapsedRange__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPTR_ENABLED) +#ifdef bottom_xpointer +#undef xmlXPtrNewContext +extern __typeof (xmlXPtrNewContext) xmlXPtrNewContext __attribute((alias("xmlXPtrNewContext__internal_alias"))); +#else +#ifndef xmlXPtrNewContext +extern __typeof (xmlXPtrNewContext) xmlXPtrNewContext__internal_alias __attribute((visibility("hidden"))); +#define xmlXPtrNewContext xmlXPtrNewContext__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPTR_ENABLED) +#ifdef bottom_xpointer +#undef xmlXPtrNewLocationSetNodeSet +extern __typeof (xmlXPtrNewLocationSetNodeSet) xmlXPtrNewLocationSetNodeSet __attribute((alias("xmlXPtrNewLocationSetNodeSet__internal_alias"))); +#else +#ifndef xmlXPtrNewLocationSetNodeSet +extern __typeof (xmlXPtrNewLocationSetNodeSet) xmlXPtrNewLocationSetNodeSet__internal_alias __attribute((visibility("hidden"))); +#define xmlXPtrNewLocationSetNodeSet xmlXPtrNewLocationSetNodeSet__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPTR_ENABLED) +#ifdef bottom_xpointer +#undef xmlXPtrNewLocationSetNodes +extern __typeof (xmlXPtrNewLocationSetNodes) xmlXPtrNewLocationSetNodes __attribute((alias("xmlXPtrNewLocationSetNodes__internal_alias"))); +#else +#ifndef xmlXPtrNewLocationSetNodes +extern __typeof (xmlXPtrNewLocationSetNodes) xmlXPtrNewLocationSetNodes__internal_alias __attribute((visibility("hidden"))); +#define xmlXPtrNewLocationSetNodes xmlXPtrNewLocationSetNodes__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPTR_ENABLED) +#ifdef bottom_xpointer +#undef xmlXPtrNewRange +extern __typeof (xmlXPtrNewRange) xmlXPtrNewRange __attribute((alias("xmlXPtrNewRange__internal_alias"))); +#else +#ifndef xmlXPtrNewRange +extern __typeof (xmlXPtrNewRange) xmlXPtrNewRange__internal_alias __attribute((visibility("hidden"))); +#define xmlXPtrNewRange xmlXPtrNewRange__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPTR_ENABLED) +#ifdef bottom_xpointer +#undef xmlXPtrNewRangeNodeObject +extern __typeof (xmlXPtrNewRangeNodeObject) xmlXPtrNewRangeNodeObject __attribute((alias("xmlXPtrNewRangeNodeObject__internal_alias"))); +#else +#ifndef xmlXPtrNewRangeNodeObject +extern __typeof (xmlXPtrNewRangeNodeObject) xmlXPtrNewRangeNodeObject__internal_alias __attribute((visibility("hidden"))); +#define xmlXPtrNewRangeNodeObject xmlXPtrNewRangeNodeObject__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPTR_ENABLED) +#ifdef bottom_xpointer +#undef xmlXPtrNewRangeNodePoint +extern __typeof (xmlXPtrNewRangeNodePoint) xmlXPtrNewRangeNodePoint __attribute((alias("xmlXPtrNewRangeNodePoint__internal_alias"))); +#else +#ifndef xmlXPtrNewRangeNodePoint +extern __typeof (xmlXPtrNewRangeNodePoint) xmlXPtrNewRangeNodePoint__internal_alias __attribute((visibility("hidden"))); +#define xmlXPtrNewRangeNodePoint xmlXPtrNewRangeNodePoint__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPTR_ENABLED) +#ifdef bottom_xpointer +#undef xmlXPtrNewRangeNodes +extern __typeof (xmlXPtrNewRangeNodes) xmlXPtrNewRangeNodes __attribute((alias("xmlXPtrNewRangeNodes__internal_alias"))); +#else +#ifndef xmlXPtrNewRangeNodes +extern __typeof (xmlXPtrNewRangeNodes) xmlXPtrNewRangeNodes__internal_alias __attribute((visibility("hidden"))); +#define xmlXPtrNewRangeNodes xmlXPtrNewRangeNodes__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPTR_ENABLED) +#ifdef bottom_xpointer +#undef xmlXPtrNewRangePointNode +extern __typeof (xmlXPtrNewRangePointNode) xmlXPtrNewRangePointNode __attribute((alias("xmlXPtrNewRangePointNode__internal_alias"))); +#else +#ifndef xmlXPtrNewRangePointNode +extern __typeof (xmlXPtrNewRangePointNode) xmlXPtrNewRangePointNode__internal_alias __attribute((visibility("hidden"))); +#define xmlXPtrNewRangePointNode xmlXPtrNewRangePointNode__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPTR_ENABLED) +#ifdef bottom_xpointer +#undef xmlXPtrNewRangePoints +extern __typeof (xmlXPtrNewRangePoints) xmlXPtrNewRangePoints __attribute((alias("xmlXPtrNewRangePoints__internal_alias"))); +#else +#ifndef xmlXPtrNewRangePoints +extern __typeof (xmlXPtrNewRangePoints) xmlXPtrNewRangePoints__internal_alias __attribute((visibility("hidden"))); +#define xmlXPtrNewRangePoints xmlXPtrNewRangePoints__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPTR_ENABLED) +#ifdef bottom_xpointer +#undef xmlXPtrRangeToFunction +extern __typeof (xmlXPtrRangeToFunction) xmlXPtrRangeToFunction __attribute((alias("xmlXPtrRangeToFunction__internal_alias"))); +#else +#ifndef xmlXPtrRangeToFunction +extern __typeof (xmlXPtrRangeToFunction) xmlXPtrRangeToFunction__internal_alias __attribute((visibility("hidden"))); +#define xmlXPtrRangeToFunction xmlXPtrRangeToFunction__internal_alias +#endif +#endif +#endif + +#if defined(LIBXML_XPTR_ENABLED) +#ifdef bottom_xpointer +#undef xmlXPtrWrapLocationSet +extern __typeof (xmlXPtrWrapLocationSet) xmlXPtrWrapLocationSet __attribute((alias("xmlXPtrWrapLocationSet__internal_alias"))); +#else +#ifndef xmlXPtrWrapLocationSet +extern __typeof (xmlXPtrWrapLocationSet) xmlXPtrWrapLocationSet__internal_alias __attribute((visibility("hidden"))); +#define xmlXPtrWrapLocationSet xmlXPtrWrapLocationSet__internal_alias +#endif +#endif +#endif + + +#endif +#endif +#endif +#endif +#endif + diff --git a/vendors/libxml/src/enc.h b/vendors/libxml/src/enc.h new file mode 100644 index 0000000..057d206 --- /dev/null +++ b/vendors/libxml/src/enc.h @@ -0,0 +1,32 @@ +/* + * Summary: Internal Interfaces for encoding in libxml2 + * Description: this module describes a few interfaces which were + * addded along with the API changes in 2.9.0 + * those are private routines at this point + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_ENC_H__ +#define __XML_ENC_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +int xmlCharEncFirstLineInt(xmlCharEncodingHandler *handler, xmlBufferPtr out, + xmlBufferPtr in, int len); +int xmlCharEncFirstLineInput(xmlParserInputBufferPtr input, int len); +int xmlCharEncInput(xmlParserInputBufferPtr input, int flush); +int xmlCharEncOutput(xmlOutputBufferPtr output, int init); + +#ifdef __cplusplus +} +#endif +#endif /* __XML_ENC_H__ */ + + diff --git a/vendors/libxml/src/encoding.c b/vendors/libxml/src/encoding.c new file mode 100644 index 0000000..7330e90 --- /dev/null +++ b/vendors/libxml/src/encoding.c @@ -0,0 +1,4071 @@ +/* + * encoding.c : implements the encoding conversion functions needed for XML + * + * Related specs: + * rfc2044 (UTF-8 and UTF-16) F. Yergeau Alis Technologies + * rfc2781 UTF-16, an encoding of ISO 10646, P. Hoffman, F. Yergeau + * [ISO-10646] UTF-8 and UTF-16 in Annexes + * [ISO-8859-1] ISO Latin-1 characters codes. + * [UNICODE] The Unicode Consortium, "The Unicode Standard -- + * Worldwide Character Encoding -- Version 1.0", Addison- + * Wesley, Volume 1, 1991, Volume 2, 1992. UTF-8 is + * described in Unicode Technical Report #4. + * [US-ASCII] Coded Character Set--7-bit American Standard Code for + * Information Interchange, ANSI X3.4-1986. + * + * See Copyright for the status of this software. + * + * daniel@veillard.com + * + * Original code for IsoLatin1 and UTF-16 by "Martin J. Duerst" + */ + +#define IN_LIBXML +#include "libxml.h" + +#include +#include + +#ifdef HAVE_CTYPE_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef LIBXML_ICONV_ENABLED +#ifdef HAVE_ERRNO_H +#include +#endif +#endif +#include +#include +#ifdef LIBXML_HTML_ENABLED +#include +#endif +#include +#include + +#include "buf.h" +#include "enc.h" + +static xmlCharEncodingHandlerPtr xmlUTF16LEHandler = NULL; +static xmlCharEncodingHandlerPtr xmlUTF16BEHandler = NULL; + +typedef struct _xmlCharEncodingAlias xmlCharEncodingAlias; +typedef xmlCharEncodingAlias *xmlCharEncodingAliasPtr; +struct _xmlCharEncodingAlias { + const char *name; + const char *alias; +}; + +static xmlCharEncodingAliasPtr xmlCharEncodingAliases = NULL; +static int xmlCharEncodingAliasesNb = 0; +static int xmlCharEncodingAliasesMax = 0; + +#if defined(LIBXML_ICONV_ENABLED) || defined(LIBXML_ICU_ENABLED) +#if 0 +#define DEBUG_ENCODING /* Define this to get encoding traces */ +#endif +#else +#ifdef LIBXML_ISO8859X_ENABLED +static void xmlRegisterCharEncodingHandlersISO8859x (void); +#endif +#endif + +static int xmlLittleEndian = 1; + +/** + * xmlEncodingErrMemory: + * @extra: extra informations + * + * Handle an out of memory condition + */ +static void +xmlEncodingErrMemory(const char *extra) +{ + __xmlSimpleError(XML_FROM_I18N, XML_ERR_NO_MEMORY, NULL, NULL, extra); +} + +/** + * xmlErrEncoding: + * @error: the error number + * @msg: the error message + * + * n encoding error + */ +static void +xmlEncodingErr(xmlParserErrors error, const char *msg, const char *val) +{ + __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, + XML_FROM_I18N, error, XML_ERR_FATAL, + NULL, 0, val, NULL, NULL, 0, 0, msg, val); +} + +#ifdef LIBXML_ICU_ENABLED +static uconv_t* +openIcuConverter(const char* name, int toUnicode) +{ + UErrorCode status = U_ZERO_ERROR; + uconv_t *conv = (uconv_t *) xmlMalloc(sizeof(uconv_t)); + if (conv == NULL) + return NULL; + + conv->uconv = ucnv_open(name, &status); + if (U_FAILURE(status)) + goto error; + + status = U_ZERO_ERROR; + if (toUnicode) { + ucnv_setToUCallBack(conv->uconv, UCNV_TO_U_CALLBACK_STOP, + NULL, NULL, NULL, &status); + } + else { + ucnv_setFromUCallBack(conv->uconv, UCNV_FROM_U_CALLBACK_STOP, + NULL, NULL, NULL, &status); + } + if (U_FAILURE(status)) + goto error; + + status = U_ZERO_ERROR; + conv->utf8 = ucnv_open("UTF-8", &status); + if (U_SUCCESS(status)) + return conv; + +error: + if (conv->uconv) + ucnv_close(conv->uconv); + xmlFree(conv); + return NULL; +} + +static void +closeIcuConverter(uconv_t *conv) +{ + if (conv != NULL) { + ucnv_close(conv->uconv); + ucnv_close(conv->utf8); + xmlFree(conv); + } +} +#endif /* LIBXML_ICU_ENABLED */ + +/************************************************************************ + * * + * Conversions To/From UTF8 encoding * + * * + ************************************************************************/ + +/** + * asciiToUTF8: + * @out: a pointer to an array of bytes to store the result + * @outlen: the length of @out + * @in: a pointer to an array of ASCII chars + * @inlen: the length of @in + * + * Take a block of ASCII chars in and try to convert it to an UTF-8 + * block of chars out. + * Returns 0 if success, or -1 otherwise + * The value of @inlen after return is the number of octets consumed + * if the return value is positive, else unpredictable. + * The value of @outlen after return is the number of octets consumed. + */ +static int +asciiToUTF8(unsigned char* out, int *outlen, + const unsigned char* in, int *inlen) { + unsigned char* outstart = out; + const unsigned char* base = in; + const unsigned char* processed = in; + unsigned char* outend = out + *outlen; + const unsigned char* inend; + unsigned int c; + + inend = in + (*inlen); + while ((in < inend) && (out - outstart + 5 < *outlen)) { + c= *in++; + + if (out >= outend) + break; + if (c < 0x80) { + *out++ = c; + } else { + *outlen = out - outstart; + *inlen = processed - base; + return(-1); + } + + processed = (const unsigned char*) in; + } + *outlen = out - outstart; + *inlen = processed - base; + return(*outlen); +} + +#ifdef LIBXML_OUTPUT_ENABLED +/** + * UTF8Toascii: + * @out: a pointer to an array of bytes to store the result + * @outlen: the length of @out + * @in: a pointer to an array of UTF-8 chars + * @inlen: the length of @in + * + * Take a block of UTF-8 chars in and try to convert it to an ASCII + * block of chars out. + * + * Returns 0 if success, -2 if the transcoding fails, or -1 otherwise + * The value of @inlen after return is the number of octets consumed + * if the return value is positive, else unpredictable. + * The value of @outlen after return is the number of octets consumed. + */ +static int +UTF8Toascii(unsigned char* out, int *outlen, + const unsigned char* in, int *inlen) { + const unsigned char* processed = in; + const unsigned char* outend; + const unsigned char* outstart = out; + const unsigned char* instart = in; + const unsigned char* inend; + unsigned int c, d; + int trailing; + + if ((out == NULL) || (outlen == NULL) || (inlen == NULL)) return(-1); + if (in == NULL) { + /* + * initialization nothing to do + */ + *outlen = 0; + *inlen = 0; + return(0); + } + inend = in + (*inlen); + outend = out + (*outlen); + while (in < inend) { + d = *in++; + if (d < 0x80) { c= d; trailing= 0; } + else if (d < 0xC0) { + /* trailing byte in leading position */ + *outlen = out - outstart; + *inlen = processed - instart; + return(-2); + } else if (d < 0xE0) { c= d & 0x1F; trailing= 1; } + else if (d < 0xF0) { c= d & 0x0F; trailing= 2; } + else if (d < 0xF8) { c= d & 0x07; trailing= 3; } + else { + /* no chance for this in Ascii */ + *outlen = out - outstart; + *inlen = processed - instart; + return(-2); + } + + if (inend - in < trailing) { + break; + } + + for ( ; trailing; trailing--) { + if ((in >= inend) || (((d= *in++) & 0xC0) != 0x80)) + break; + c <<= 6; + c |= d & 0x3F; + } + + /* assertion: c is a single UTF-4 value */ + if (c < 0x80) { + if (out >= outend) + break; + *out++ = c; + } else { + /* no chance for this in Ascii */ + *outlen = out - outstart; + *inlen = processed - instart; + return(-2); + } + processed = in; + } + *outlen = out - outstart; + *inlen = processed - instart; + return(*outlen); +} +#endif /* LIBXML_OUTPUT_ENABLED */ + +/** + * isolat1ToUTF8: + * @out: a pointer to an array of bytes to store the result + * @outlen: the length of @out + * @in: a pointer to an array of ISO Latin 1 chars + * @inlen: the length of @in + * + * Take a block of ISO Latin 1 chars in and try to convert it to an UTF-8 + * block of chars out. + * Returns the number of bytes written if success, or -1 otherwise + * The value of @inlen after return is the number of octets consumed + * if the return value is positive, else unpredictable. + * The value of @outlen after return is the number of octets consumed. + */ +int +isolat1ToUTF8(unsigned char* out, int *outlen, + const unsigned char* in, int *inlen) { + unsigned char* outstart = out; + const unsigned char* base = in; + unsigned char* outend; + const unsigned char* inend; + const unsigned char* instop; + + if ((out == NULL) || (in == NULL) || (outlen == NULL) || (inlen == NULL)) + return(-1); + + outend = out + *outlen; + inend = in + (*inlen); + instop = inend; + + while ((in < inend) && (out < outend - 1)) { + if (*in >= 0x80) { + *out++ = (((*in) >> 6) & 0x1F) | 0xC0; + *out++ = ((*in) & 0x3F) | 0x80; + ++in; + } + if ((instop - in) > (outend - out)) instop = in + (outend - out); + while ((in < instop) && (*in < 0x80)) { + *out++ = *in++; + } + } + if ((in < inend) && (out < outend) && (*in < 0x80)) { + *out++ = *in++; + } + *outlen = out - outstart; + *inlen = in - base; + return(*outlen); +} + +/** + * UTF8ToUTF8: + * @out: a pointer to an array of bytes to store the result + * @outlen: the length of @out + * @inb: a pointer to an array of UTF-8 chars + * @inlenb: the length of @in in UTF-8 chars + * + * No op copy operation for UTF8 handling. + * + * Returns the number of bytes written, or -1 if lack of space. + * The value of *inlen after return is the number of octets consumed + * if the return value is positive, else unpredictable. + */ +static int +UTF8ToUTF8(unsigned char* out, int *outlen, + const unsigned char* inb, int *inlenb) +{ + int len; + + if ((out == NULL) || (inb == NULL) || (outlen == NULL) || (inlenb == NULL)) + return(-1); + if (*outlen > *inlenb) { + len = *inlenb; + } else { + len = *outlen; + } + if (len < 0) + return(-1); + + memcpy(out, inb, len); + + *outlen = len; + *inlenb = len; + return(*outlen); +} + + +#ifdef LIBXML_OUTPUT_ENABLED +/** + * UTF8Toisolat1: + * @out: a pointer to an array of bytes to store the result + * @outlen: the length of @out + * @in: a pointer to an array of UTF-8 chars + * @inlen: the length of @in + * + * Take a block of UTF-8 chars in and try to convert it to an ISO Latin 1 + * block of chars out. + * + * Returns the number of bytes written if success, -2 if the transcoding fails, + or -1 otherwise + * The value of @inlen after return is the number of octets consumed + * if the return value is positive, else unpredictable. + * The value of @outlen after return is the number of octets consumed. + */ +int +UTF8Toisolat1(unsigned char* out, int *outlen, + const unsigned char* in, int *inlen) { + const unsigned char* processed = in; + const unsigned char* outend; + const unsigned char* outstart = out; + const unsigned char* instart = in; + const unsigned char* inend; + unsigned int c, d; + int trailing; + + if ((out == NULL) || (outlen == NULL) || (inlen == NULL)) return(-1); + if (in == NULL) { + /* + * initialization nothing to do + */ + *outlen = 0; + *inlen = 0; + return(0); + } + inend = in + (*inlen); + outend = out + (*outlen); + while (in < inend) { + d = *in++; + if (d < 0x80) { c= d; trailing= 0; } + else if (d < 0xC0) { + /* trailing byte in leading position */ + *outlen = out - outstart; + *inlen = processed - instart; + return(-2); + } else if (d < 0xE0) { c= d & 0x1F; trailing= 1; } + else if (d < 0xF0) { c= d & 0x0F; trailing= 2; } + else if (d < 0xF8) { c= d & 0x07; trailing= 3; } + else { + /* no chance for this in IsoLat1 */ + *outlen = out - outstart; + *inlen = processed - instart; + return(-2); + } + + if (inend - in < trailing) { + break; + } + + for ( ; trailing; trailing--) { + if (in >= inend) + break; + if (((d= *in++) & 0xC0) != 0x80) { + *outlen = out - outstart; + *inlen = processed - instart; + return(-2); + } + c <<= 6; + c |= d & 0x3F; + } + + /* assertion: c is a single UTF-4 value */ + if (c <= 0xFF) { + if (out >= outend) + break; + *out++ = c; + } else { + /* no chance for this in IsoLat1 */ + *outlen = out - outstart; + *inlen = processed - instart; + return(-2); + } + processed = in; + } + *outlen = out - outstart; + *inlen = processed - instart; + return(*outlen); +} +#endif /* LIBXML_OUTPUT_ENABLED */ + +/** + * UTF16LEToUTF8: + * @out: a pointer to an array of bytes to store the result + * @outlen: the length of @out + * @inb: a pointer to an array of UTF-16LE passwd as a byte array + * @inlenb: the length of @in in UTF-16LE chars + * + * Take a block of UTF-16LE ushorts in and try to convert it to an UTF-8 + * block of chars out. This function assumes the endian property + * is the same between the native type of this machine and the + * inputed one. + * + * Returns the number of bytes written, or -1 if lack of space, or -2 + * if the transcoding fails (if *in is not a valid utf16 string) + * The value of *inlen after return is the number of octets consumed + * if the return value is positive, else unpredictable. + */ +static int +UTF16LEToUTF8(unsigned char* out, int *outlen, + const unsigned char* inb, int *inlenb) +{ + unsigned char* outstart = out; + const unsigned char* processed = inb; + unsigned char* outend = out + *outlen; + unsigned short* in = (unsigned short*) inb; + unsigned short* inend; + unsigned int c, d, inlen; + unsigned char *tmp; + int bits; + + if ((*inlenb % 2) == 1) + (*inlenb)--; + inlen = *inlenb / 2; + inend = in + inlen; + while ((in < inend) && (out - outstart + 5 < *outlen)) { + if (xmlLittleEndian) { + c= *in++; + } else { + tmp = (unsigned char *) in; + c = *tmp++; + c = c | (((unsigned int)*tmp) << 8); + in++; + } + if ((c & 0xFC00) == 0xD800) { /* surrogates */ + if (in >= inend) { /* (in > inend) shouldn't happens */ + break; + } + if (xmlLittleEndian) { + d = *in++; + } else { + tmp = (unsigned char *) in; + d = *tmp++; + d = d | (((unsigned int)*tmp) << 8); + in++; + } + if ((d & 0xFC00) == 0xDC00) { + c &= 0x03FF; + c <<= 10; + c |= d & 0x03FF; + c += 0x10000; + } + else { + *outlen = out - outstart; + *inlenb = processed - inb; + return(-2); + } + } + + /* assertion: c is a single UTF-4 value */ + if (out >= outend) + break; + if (c < 0x80) { *out++= c; bits= -6; } + else if (c < 0x800) { *out++= ((c >> 6) & 0x1F) | 0xC0; bits= 0; } + else if (c < 0x10000) { *out++= ((c >> 12) & 0x0F) | 0xE0; bits= 6; } + else { *out++= ((c >> 18) & 0x07) | 0xF0; bits= 12; } + + for ( ; bits >= 0; bits-= 6) { + if (out >= outend) + break; + *out++= ((c >> bits) & 0x3F) | 0x80; + } + processed = (const unsigned char*) in; + } + *outlen = out - outstart; + *inlenb = processed - inb; + return(*outlen); +} + +#ifdef LIBXML_OUTPUT_ENABLED +/** + * UTF8ToUTF16LE: + * @outb: a pointer to an array of bytes to store the result + * @outlen: the length of @outb + * @in: a pointer to an array of UTF-8 chars + * @inlen: the length of @in + * + * Take a block of UTF-8 chars in and try to convert it to an UTF-16LE + * block of chars out. + * + * Returns the number of bytes written, or -1 if lack of space, or -2 + * if the transcoding failed. + */ +static int +UTF8ToUTF16LE(unsigned char* outb, int *outlen, + const unsigned char* in, int *inlen) +{ + unsigned short* out = (unsigned short*) outb; + const unsigned char* processed = in; + const unsigned char *const instart = in; + unsigned short* outstart= out; + unsigned short* outend; + const unsigned char* inend; + unsigned int c, d; + int trailing; + unsigned char *tmp; + unsigned short tmp1, tmp2; + + /* UTF16LE encoding has no BOM */ + if ((out == NULL) || (outlen == NULL) || (inlen == NULL)) return(-1); + if (in == NULL) { + *outlen = 0; + *inlen = 0; + return(0); + } + inend= in + *inlen; + outend = out + (*outlen / 2); + while (in < inend) { + d= *in++; + if (d < 0x80) { c= d; trailing= 0; } + else if (d < 0xC0) { + /* trailing byte in leading position */ + *outlen = (out - outstart) * 2; + *inlen = processed - instart; + return(-2); + } else if (d < 0xE0) { c= d & 0x1F; trailing= 1; } + else if (d < 0xF0) { c= d & 0x0F; trailing= 2; } + else if (d < 0xF8) { c= d & 0x07; trailing= 3; } + else { + /* no chance for this in UTF-16 */ + *outlen = (out - outstart) * 2; + *inlen = processed - instart; + return(-2); + } + + if (inend - in < trailing) { + break; + } + + for ( ; trailing; trailing--) { + if ((in >= inend) || (((d= *in++) & 0xC0) != 0x80)) + break; + c <<= 6; + c |= d & 0x3F; + } + + /* assertion: c is a single UTF-4 value */ + if (c < 0x10000) { + if (out >= outend) + break; + if (xmlLittleEndian) { + *out++ = c; + } else { + tmp = (unsigned char *) out; + *tmp = c ; + *(tmp + 1) = c >> 8 ; + out++; + } + } + else if (c < 0x110000) { + if (out+1 >= outend) + break; + c -= 0x10000; + if (xmlLittleEndian) { + *out++ = 0xD800 | (c >> 10); + *out++ = 0xDC00 | (c & 0x03FF); + } else { + tmp1 = 0xD800 | (c >> 10); + tmp = (unsigned char *) out; + *tmp = (unsigned char) tmp1; + *(tmp + 1) = tmp1 >> 8; + out++; + + tmp2 = 0xDC00 | (c & 0x03FF); + tmp = (unsigned char *) out; + *tmp = (unsigned char) tmp2; + *(tmp + 1) = tmp2 >> 8; + out++; + } + } + else + break; + processed = in; + } + *outlen = (out - outstart) * 2; + *inlen = processed - instart; + return(*outlen); +} + +/** + * UTF8ToUTF16: + * @outb: a pointer to an array of bytes to store the result + * @outlen: the length of @outb + * @in: a pointer to an array of UTF-8 chars + * @inlen: the length of @in + * + * Take a block of UTF-8 chars in and try to convert it to an UTF-16 + * block of chars out. + * + * Returns the number of bytes written, or -1 if lack of space, or -2 + * if the transcoding failed. + */ +static int +UTF8ToUTF16(unsigned char* outb, int *outlen, + const unsigned char* in, int *inlen) +{ + if (in == NULL) { + /* + * initialization, add the Byte Order Mark for UTF-16LE + */ + if (*outlen >= 2) { + outb[0] = 0xFF; + outb[1] = 0xFE; + *outlen = 2; + *inlen = 0; +#ifdef DEBUG_ENCODING + xmlGenericError(xmlGenericErrorContext, + "Added FFFE Byte Order Mark\n"); +#endif + return(2); + } + *outlen = 0; + *inlen = 0; + return(0); + } + return (UTF8ToUTF16LE(outb, outlen, in, inlen)); +} +#endif /* LIBXML_OUTPUT_ENABLED */ + +/** + * UTF16BEToUTF8: + * @out: a pointer to an array of bytes to store the result + * @outlen: the length of @out + * @inb: a pointer to an array of UTF-16 passed as a byte array + * @inlenb: the length of @in in UTF-16 chars + * + * Take a block of UTF-16 ushorts in and try to convert it to an UTF-8 + * block of chars out. This function assumes the endian property + * is the same between the native type of this machine and the + * inputed one. + * + * Returns the number of bytes written, or -1 if lack of space, or -2 + * if the transcoding fails (if *in is not a valid utf16 string) + * The value of *inlen after return is the number of octets consumed + * if the return value is positive, else unpredictable. + */ +static int +UTF16BEToUTF8(unsigned char* out, int *outlen, + const unsigned char* inb, int *inlenb) +{ + unsigned char* outstart = out; + const unsigned char* processed = inb; + unsigned char* outend = out + *outlen; + unsigned short* in = (unsigned short*) inb; + unsigned short* inend; + unsigned int c, d, inlen; + unsigned char *tmp; + int bits; + + if ((*inlenb % 2) == 1) + (*inlenb)--; + inlen = *inlenb / 2; + inend= in + inlen; + while (in < inend) { + if (xmlLittleEndian) { + tmp = (unsigned char *) in; + c = *tmp++; + c = c << 8; + c = c | (unsigned int) *tmp; + in++; + } else { + c= *in++; + } + if ((c & 0xFC00) == 0xD800) { /* surrogates */ + if (in >= inend) { /* (in > inend) shouldn't happens */ + *outlen = out - outstart; + *inlenb = processed - inb; + return(-2); + } + if (xmlLittleEndian) { + tmp = (unsigned char *) in; + d = *tmp++; + d = d << 8; + d = d | (unsigned int) *tmp; + in++; + } else { + d= *in++; + } + if ((d & 0xFC00) == 0xDC00) { + c &= 0x03FF; + c <<= 10; + c |= d & 0x03FF; + c += 0x10000; + } + else { + *outlen = out - outstart; + *inlenb = processed - inb; + return(-2); + } + } + + /* assertion: c is a single UTF-4 value */ + if (out >= outend) + break; + if (c < 0x80) { *out++= c; bits= -6; } + else if (c < 0x800) { *out++= ((c >> 6) & 0x1F) | 0xC0; bits= 0; } + else if (c < 0x10000) { *out++= ((c >> 12) & 0x0F) | 0xE0; bits= 6; } + else { *out++= ((c >> 18) & 0x07) | 0xF0; bits= 12; } + + for ( ; bits >= 0; bits-= 6) { + if (out >= outend) + break; + *out++= ((c >> bits) & 0x3F) | 0x80; + } + processed = (const unsigned char*) in; + } + *outlen = out - outstart; + *inlenb = processed - inb; + return(*outlen); +} + +#ifdef LIBXML_OUTPUT_ENABLED +/** + * UTF8ToUTF16BE: + * @outb: a pointer to an array of bytes to store the result + * @outlen: the length of @outb + * @in: a pointer to an array of UTF-8 chars + * @inlen: the length of @in + * + * Take a block of UTF-8 chars in and try to convert it to an UTF-16BE + * block of chars out. + * + * Returns the number of byte written, or -1 by lack of space, or -2 + * if the transcoding failed. + */ +static int +UTF8ToUTF16BE(unsigned char* outb, int *outlen, + const unsigned char* in, int *inlen) +{ + unsigned short* out = (unsigned short*) outb; + const unsigned char* processed = in; + const unsigned char *const instart = in; + unsigned short* outstart= out; + unsigned short* outend; + const unsigned char* inend; + unsigned int c, d; + int trailing; + unsigned char *tmp; + unsigned short tmp1, tmp2; + + /* UTF-16BE has no BOM */ + if ((outb == NULL) || (outlen == NULL) || (inlen == NULL)) return(-1); + if (in == NULL) { + *outlen = 0; + *inlen = 0; + return(0); + } + inend= in + *inlen; + outend = out + (*outlen / 2); + while (in < inend) { + d= *in++; + if (d < 0x80) { c= d; trailing= 0; } + else if (d < 0xC0) { + /* trailing byte in leading position */ + *outlen = out - outstart; + *inlen = processed - instart; + return(-2); + } else if (d < 0xE0) { c= d & 0x1F; trailing= 1; } + else if (d < 0xF0) { c= d & 0x0F; trailing= 2; } + else if (d < 0xF8) { c= d & 0x07; trailing= 3; } + else { + /* no chance for this in UTF-16 */ + *outlen = out - outstart; + *inlen = processed - instart; + return(-2); + } + + if (inend - in < trailing) { + break; + } + + for ( ; trailing; trailing--) { + if ((in >= inend) || (((d= *in++) & 0xC0) != 0x80)) break; + c <<= 6; + c |= d & 0x3F; + } + + /* assertion: c is a single UTF-4 value */ + if (c < 0x10000) { + if (out >= outend) break; + if (xmlLittleEndian) { + tmp = (unsigned char *) out; + *tmp = c >> 8; + *(tmp + 1) = c; + out++; + } else { + *out++ = c; + } + } + else if (c < 0x110000) { + if (out+1 >= outend) break; + c -= 0x10000; + if (xmlLittleEndian) { + tmp1 = 0xD800 | (c >> 10); + tmp = (unsigned char *) out; + *tmp = tmp1 >> 8; + *(tmp + 1) = (unsigned char) tmp1; + out++; + + tmp2 = 0xDC00 | (c & 0x03FF); + tmp = (unsigned char *) out; + *tmp = tmp2 >> 8; + *(tmp + 1) = (unsigned char) tmp2; + out++; + } else { + *out++ = 0xD800 | (c >> 10); + *out++ = 0xDC00 | (c & 0x03FF); + } + } + else + break; + processed = in; + } + *outlen = (out - outstart) * 2; + *inlen = processed - instart; + return(*outlen); +} +#endif /* LIBXML_OUTPUT_ENABLED */ + +/************************************************************************ + * * + * Generic encoding handling routines * + * * + ************************************************************************/ + +/** + * xmlDetectCharEncoding: + * @in: a pointer to the first bytes of the XML entity, must be at least + * 2 bytes long (at least 4 if encoding is UTF4 variant). + * @len: pointer to the length of the buffer + * + * Guess the encoding of the entity using the first bytes of the entity content + * according to the non-normative appendix F of the XML-1.0 recommendation. + * + * Returns one of the XML_CHAR_ENCODING_... values. + */ +xmlCharEncoding +xmlDetectCharEncoding(const unsigned char* in, int len) +{ + if (in == NULL) + return(XML_CHAR_ENCODING_NONE); + if (len >= 4) { + if ((in[0] == 0x00) && (in[1] == 0x00) && + (in[2] == 0x00) && (in[3] == 0x3C)) + return(XML_CHAR_ENCODING_UCS4BE); + if ((in[0] == 0x3C) && (in[1] == 0x00) && + (in[2] == 0x00) && (in[3] == 0x00)) + return(XML_CHAR_ENCODING_UCS4LE); + if ((in[0] == 0x00) && (in[1] == 0x00) && + (in[2] == 0x3C) && (in[3] == 0x00)) + return(XML_CHAR_ENCODING_UCS4_2143); + if ((in[0] == 0x00) && (in[1] == 0x3C) && + (in[2] == 0x00) && (in[3] == 0x00)) + return(XML_CHAR_ENCODING_UCS4_3412); + if ((in[0] == 0x4C) && (in[1] == 0x6F) && + (in[2] == 0xA7) && (in[3] == 0x94)) + return(XML_CHAR_ENCODING_EBCDIC); + if ((in[0] == 0x3C) && (in[1] == 0x3F) && + (in[2] == 0x78) && (in[3] == 0x6D)) + return(XML_CHAR_ENCODING_UTF8); + /* + * Although not part of the recommendation, we also + * attempt an "auto-recognition" of UTF-16LE and + * UTF-16BE encodings. + */ + if ((in[0] == 0x3C) && (in[1] == 0x00) && + (in[2] == 0x3F) && (in[3] == 0x00)) + return(XML_CHAR_ENCODING_UTF16LE); + if ((in[0] == 0x00) && (in[1] == 0x3C) && + (in[2] == 0x00) && (in[3] == 0x3F)) + return(XML_CHAR_ENCODING_UTF16BE); + } + if (len >= 3) { + /* + * Errata on XML-1.0 June 20 2001 + * We now allow an UTF8 encoded BOM + */ + if ((in[0] == 0xEF) && (in[1] == 0xBB) && + (in[2] == 0xBF)) + return(XML_CHAR_ENCODING_UTF8); + } + /* For UTF-16 we can recognize by the BOM */ + if (len >= 2) { + if ((in[0] == 0xFE) && (in[1] == 0xFF)) + return(XML_CHAR_ENCODING_UTF16BE); + if ((in[0] == 0xFF) && (in[1] == 0xFE)) + return(XML_CHAR_ENCODING_UTF16LE); + } + return(XML_CHAR_ENCODING_NONE); +} + +/** + * xmlCleanupEncodingAliases: + * + * Unregisters all aliases + */ +void +xmlCleanupEncodingAliases(void) { + int i; + + if (xmlCharEncodingAliases == NULL) + return; + + for (i = 0;i < xmlCharEncodingAliasesNb;i++) { + if (xmlCharEncodingAliases[i].name != NULL) + xmlFree((char *) xmlCharEncodingAliases[i].name); + if (xmlCharEncodingAliases[i].alias != NULL) + xmlFree((char *) xmlCharEncodingAliases[i].alias); + } + xmlCharEncodingAliasesNb = 0; + xmlCharEncodingAliasesMax = 0; + xmlFree(xmlCharEncodingAliases); + xmlCharEncodingAliases = NULL; +} + +/** + * xmlGetEncodingAlias: + * @alias: the alias name as parsed, in UTF-8 format (ASCII actually) + * + * Lookup an encoding name for the given alias. + * + * Returns NULL if not found, otherwise the original name + */ +const char * +xmlGetEncodingAlias(const char *alias) { + int i; + char upper[100]; + + if (alias == NULL) + return(NULL); + + if (xmlCharEncodingAliases == NULL) + return(NULL); + + for (i = 0;i < 99;i++) { + upper[i] = toupper(alias[i]); + if (upper[i] == 0) break; + } + upper[i] = 0; + + /* + * Walk down the list looking for a definition of the alias + */ + for (i = 0;i < xmlCharEncodingAliasesNb;i++) { + if (!strcmp(xmlCharEncodingAliases[i].alias, upper)) { + return(xmlCharEncodingAliases[i].name); + } + } + return(NULL); +} + +/** + * xmlAddEncodingAlias: + * @name: the encoding name as parsed, in UTF-8 format (ASCII actually) + * @alias: the alias name as parsed, in UTF-8 format (ASCII actually) + * + * Registers an alias @alias for an encoding named @name. Existing alias + * will be overwritten. + * + * Returns 0 in case of success, -1 in case of error + */ +int +xmlAddEncodingAlias(const char *name, const char *alias) { + int i; + char upper[100]; + + if ((name == NULL) || (alias == NULL)) + return(-1); + + for (i = 0;i < 99;i++) { + upper[i] = toupper(alias[i]); + if (upper[i] == 0) break; + } + upper[i] = 0; + + if (xmlCharEncodingAliases == NULL) { + xmlCharEncodingAliasesNb = 0; + xmlCharEncodingAliasesMax = 20; + xmlCharEncodingAliases = (xmlCharEncodingAliasPtr) + xmlMalloc(xmlCharEncodingAliasesMax * sizeof(xmlCharEncodingAlias)); + if (xmlCharEncodingAliases == NULL) + return(-1); + } else if (xmlCharEncodingAliasesNb >= xmlCharEncodingAliasesMax) { + xmlCharEncodingAliasesMax *= 2; + xmlCharEncodingAliases = (xmlCharEncodingAliasPtr) + xmlRealloc(xmlCharEncodingAliases, + xmlCharEncodingAliasesMax * sizeof(xmlCharEncodingAlias)); + } + /* + * Walk down the list looking for a definition of the alias + */ + for (i = 0;i < xmlCharEncodingAliasesNb;i++) { + if (!strcmp(xmlCharEncodingAliases[i].alias, upper)) { + /* + * Replace the definition. + */ + xmlFree((char *) xmlCharEncodingAliases[i].name); + xmlCharEncodingAliases[i].name = xmlMemStrdup(name); + return(0); + } + } + /* + * Add the definition + */ + xmlCharEncodingAliases[xmlCharEncodingAliasesNb].name = xmlMemStrdup(name); + xmlCharEncodingAliases[xmlCharEncodingAliasesNb].alias = xmlMemStrdup(upper); + xmlCharEncodingAliasesNb++; + return(0); +} + +/** + * xmlDelEncodingAlias: + * @alias: the alias name as parsed, in UTF-8 format (ASCII actually) + * + * Unregisters an encoding alias @alias + * + * Returns 0 in case of success, -1 in case of error + */ +int +xmlDelEncodingAlias(const char *alias) { + int i; + + if (alias == NULL) + return(-1); + + if (xmlCharEncodingAliases == NULL) + return(-1); + /* + * Walk down the list looking for a definition of the alias + */ + for (i = 0;i < xmlCharEncodingAliasesNb;i++) { + if (!strcmp(xmlCharEncodingAliases[i].alias, alias)) { + xmlFree((char *) xmlCharEncodingAliases[i].name); + xmlFree((char *) xmlCharEncodingAliases[i].alias); + xmlCharEncodingAliasesNb--; + memmove(&xmlCharEncodingAliases[i], &xmlCharEncodingAliases[i + 1], + sizeof(xmlCharEncodingAlias) * (xmlCharEncodingAliasesNb - i)); + return(0); + } + } + return(-1); +} + +/** + * xmlParseCharEncoding: + * @name: the encoding name as parsed, in UTF-8 format (ASCII actually) + * + * Compare the string to the encoding schemes already known. Note + * that the comparison is case insensitive accordingly to the section + * [XML] 4.3.3 Character Encoding in Entities. + * + * Returns one of the XML_CHAR_ENCODING_... values or XML_CHAR_ENCODING_NONE + * if not recognized. + */ +xmlCharEncoding +xmlParseCharEncoding(const char* name) +{ + const char *alias; + char upper[500]; + int i; + + if (name == NULL) + return(XML_CHAR_ENCODING_NONE); + + /* + * Do the alias resolution + */ + alias = xmlGetEncodingAlias(name); + if (alias != NULL) + name = alias; + + for (i = 0;i < 499;i++) { + upper[i] = toupper(name[i]); + if (upper[i] == 0) break; + } + upper[i] = 0; + + if (!strcmp(upper, "")) return(XML_CHAR_ENCODING_NONE); + if (!strcmp(upper, "UTF-8")) return(XML_CHAR_ENCODING_UTF8); + if (!strcmp(upper, "UTF8")) return(XML_CHAR_ENCODING_UTF8); + + /* + * NOTE: if we were able to parse this, the endianness of UTF16 is + * already found and in use + */ + if (!strcmp(upper, "UTF-16")) return(XML_CHAR_ENCODING_UTF16LE); + if (!strcmp(upper, "UTF16")) return(XML_CHAR_ENCODING_UTF16LE); + + if (!strcmp(upper, "ISO-10646-UCS-2")) return(XML_CHAR_ENCODING_UCS2); + if (!strcmp(upper, "UCS-2")) return(XML_CHAR_ENCODING_UCS2); + if (!strcmp(upper, "UCS2")) return(XML_CHAR_ENCODING_UCS2); + + /* + * NOTE: if we were able to parse this, the endianness of UCS4 is + * already found and in use + */ + if (!strcmp(upper, "ISO-10646-UCS-4")) return(XML_CHAR_ENCODING_UCS4LE); + if (!strcmp(upper, "UCS-4")) return(XML_CHAR_ENCODING_UCS4LE); + if (!strcmp(upper, "UCS4")) return(XML_CHAR_ENCODING_UCS4LE); + + + if (!strcmp(upper, "ISO-8859-1")) return(XML_CHAR_ENCODING_8859_1); + if (!strcmp(upper, "ISO-LATIN-1")) return(XML_CHAR_ENCODING_8859_1); + if (!strcmp(upper, "ISO LATIN 1")) return(XML_CHAR_ENCODING_8859_1); + + if (!strcmp(upper, "ISO-8859-2")) return(XML_CHAR_ENCODING_8859_2); + if (!strcmp(upper, "ISO-LATIN-2")) return(XML_CHAR_ENCODING_8859_2); + if (!strcmp(upper, "ISO LATIN 2")) return(XML_CHAR_ENCODING_8859_2); + + if (!strcmp(upper, "ISO-8859-3")) return(XML_CHAR_ENCODING_8859_3); + if (!strcmp(upper, "ISO-8859-4")) return(XML_CHAR_ENCODING_8859_4); + if (!strcmp(upper, "ISO-8859-5")) return(XML_CHAR_ENCODING_8859_5); + if (!strcmp(upper, "ISO-8859-6")) return(XML_CHAR_ENCODING_8859_6); + if (!strcmp(upper, "ISO-8859-7")) return(XML_CHAR_ENCODING_8859_7); + if (!strcmp(upper, "ISO-8859-8")) return(XML_CHAR_ENCODING_8859_8); + if (!strcmp(upper, "ISO-8859-9")) return(XML_CHAR_ENCODING_8859_9); + + if (!strcmp(upper, "ISO-2022-JP")) return(XML_CHAR_ENCODING_2022_JP); + if (!strcmp(upper, "SHIFT_JIS")) return(XML_CHAR_ENCODING_SHIFT_JIS); + if (!strcmp(upper, "EUC-JP")) return(XML_CHAR_ENCODING_EUC_JP); + +#ifdef DEBUG_ENCODING + xmlGenericError(xmlGenericErrorContext, "Unknown encoding %s\n", name); +#endif + return(XML_CHAR_ENCODING_ERROR); +} + +/** + * xmlGetCharEncodingName: + * @enc: the encoding + * + * The "canonical" name for XML encoding. + * C.f. http://www.w3.org/TR/REC-xml#charencoding + * Section 4.3.3 Character Encoding in Entities + * + * Returns the canonical name for the given encoding + */ + +const char* +xmlGetCharEncodingName(xmlCharEncoding enc) { + switch (enc) { + case XML_CHAR_ENCODING_ERROR: + return(NULL); + case XML_CHAR_ENCODING_NONE: + return(NULL); + case XML_CHAR_ENCODING_UTF8: + return("UTF-8"); + case XML_CHAR_ENCODING_UTF16LE: + return("UTF-16"); + case XML_CHAR_ENCODING_UTF16BE: + return("UTF-16"); + case XML_CHAR_ENCODING_EBCDIC: + return("EBCDIC"); + case XML_CHAR_ENCODING_UCS4LE: + return("ISO-10646-UCS-4"); + case XML_CHAR_ENCODING_UCS4BE: + return("ISO-10646-UCS-4"); + case XML_CHAR_ENCODING_UCS4_2143: + return("ISO-10646-UCS-4"); + case XML_CHAR_ENCODING_UCS4_3412: + return("ISO-10646-UCS-4"); + case XML_CHAR_ENCODING_UCS2: + return("ISO-10646-UCS-2"); + case XML_CHAR_ENCODING_8859_1: + return("ISO-8859-1"); + case XML_CHAR_ENCODING_8859_2: + return("ISO-8859-2"); + case XML_CHAR_ENCODING_8859_3: + return("ISO-8859-3"); + case XML_CHAR_ENCODING_8859_4: + return("ISO-8859-4"); + case XML_CHAR_ENCODING_8859_5: + return("ISO-8859-5"); + case XML_CHAR_ENCODING_8859_6: + return("ISO-8859-6"); + case XML_CHAR_ENCODING_8859_7: + return("ISO-8859-7"); + case XML_CHAR_ENCODING_8859_8: + return("ISO-8859-8"); + case XML_CHAR_ENCODING_8859_9: + return("ISO-8859-9"); + case XML_CHAR_ENCODING_2022_JP: + return("ISO-2022-JP"); + case XML_CHAR_ENCODING_SHIFT_JIS: + return("Shift-JIS"); + case XML_CHAR_ENCODING_EUC_JP: + return("EUC-JP"); + case XML_CHAR_ENCODING_ASCII: + return(NULL); + } + return(NULL); +} + +/************************************************************************ + * * + * Char encoding handlers * + * * + ************************************************************************/ + + +/* the size should be growable, but it's not a big deal ... */ +#define MAX_ENCODING_HANDLERS 50 +static xmlCharEncodingHandlerPtr *handlers = NULL; +static int nbCharEncodingHandler = 0; + +/* + * The default is UTF-8 for XML, that's also the default used for the + * parser internals, so the default encoding handler is NULL + */ + +static xmlCharEncodingHandlerPtr xmlDefaultCharEncodingHandler = NULL; + +/** + * xmlNewCharEncodingHandler: + * @name: the encoding name, in UTF-8 format (ASCII actually) + * @input: the xmlCharEncodingInputFunc to read that encoding + * @output: the xmlCharEncodingOutputFunc to write that encoding + * + * Create and registers an xmlCharEncodingHandler. + * + * Returns the xmlCharEncodingHandlerPtr created (or NULL in case of error). + */ +xmlCharEncodingHandlerPtr +xmlNewCharEncodingHandler(const char *name, + xmlCharEncodingInputFunc input, + xmlCharEncodingOutputFunc output) { + xmlCharEncodingHandlerPtr handler; + const char *alias; + char upper[500]; + int i; + char *up = NULL; + + /* + * Do the alias resolution + */ + alias = xmlGetEncodingAlias(name); + if (alias != NULL) + name = alias; + + /* + * Keep only the uppercase version of the encoding. + */ + if (name == NULL) { + xmlEncodingErr(XML_I18N_NO_NAME, + "xmlNewCharEncodingHandler : no name !\n", NULL); + return(NULL); + } + for (i = 0;i < 499;i++) { + upper[i] = toupper(name[i]); + if (upper[i] == 0) break; + } + upper[i] = 0; + up = xmlMemStrdup(upper); + if (up == NULL) { + xmlEncodingErrMemory("xmlNewCharEncodingHandler : out of memory !\n"); + return(NULL); + } + + /* + * allocate and fill-up an handler block. + */ + handler = (xmlCharEncodingHandlerPtr) + xmlMalloc(sizeof(xmlCharEncodingHandler)); + if (handler == NULL) { + xmlFree(up); + xmlEncodingErrMemory("xmlNewCharEncodingHandler : out of memory !\n"); + return(NULL); + } + memset(handler, 0, sizeof(xmlCharEncodingHandler)); + handler->input = input; + handler->output = output; + handler->name = up; + +#ifdef LIBXML_ICONV_ENABLED + handler->iconv_in = NULL; + handler->iconv_out = NULL; +#endif +#ifdef LIBXML_ICU_ENABLED + handler->uconv_in = NULL; + handler->uconv_out = NULL; +#endif + + /* + * registers and returns the handler. + */ + xmlRegisterCharEncodingHandler(handler); +#ifdef DEBUG_ENCODING + xmlGenericError(xmlGenericErrorContext, + "Registered encoding handler for %s\n", name); +#endif + return(handler); +} + +/** + * xmlInitCharEncodingHandlers: + * + * Initialize the char encoding support, it registers the default + * encoding supported. + * NOTE: while public, this function usually doesn't need to be called + * in normal processing. + */ +void +xmlInitCharEncodingHandlers(void) { + unsigned short int tst = 0x1234; + unsigned char *ptr = (unsigned char *) &tst; + + if (handlers != NULL) return; + + handlers = (xmlCharEncodingHandlerPtr *) + xmlMalloc(MAX_ENCODING_HANDLERS * sizeof(xmlCharEncodingHandlerPtr)); + + if (*ptr == 0x12) xmlLittleEndian = 0; + else if (*ptr == 0x34) xmlLittleEndian = 1; + else { + xmlEncodingErr(XML_ERR_INTERNAL_ERROR, + "Odd problem at endianness detection\n", NULL); + } + + if (handlers == NULL) { + xmlEncodingErrMemory("xmlInitCharEncodingHandlers : out of memory !\n"); + return; + } + xmlNewCharEncodingHandler("UTF-8", UTF8ToUTF8, UTF8ToUTF8); +#ifdef LIBXML_OUTPUT_ENABLED + xmlUTF16LEHandler = + xmlNewCharEncodingHandler("UTF-16LE", UTF16LEToUTF8, UTF8ToUTF16LE); + xmlUTF16BEHandler = + xmlNewCharEncodingHandler("UTF-16BE", UTF16BEToUTF8, UTF8ToUTF16BE); + xmlNewCharEncodingHandler("UTF-16", UTF16LEToUTF8, UTF8ToUTF16); + xmlNewCharEncodingHandler("ISO-8859-1", isolat1ToUTF8, UTF8Toisolat1); + xmlNewCharEncodingHandler("ASCII", asciiToUTF8, UTF8Toascii); + xmlNewCharEncodingHandler("US-ASCII", asciiToUTF8, UTF8Toascii); +#ifdef LIBXML_HTML_ENABLED + xmlNewCharEncodingHandler("HTML", NULL, UTF8ToHtml); +#endif +#else + xmlUTF16LEHandler = + xmlNewCharEncodingHandler("UTF-16LE", UTF16LEToUTF8, NULL); + xmlUTF16BEHandler = + xmlNewCharEncodingHandler("UTF-16BE", UTF16BEToUTF8, NULL); + xmlNewCharEncodingHandler("UTF-16", UTF16LEToUTF8, NULL); + xmlNewCharEncodingHandler("ISO-8859-1", isolat1ToUTF8, NULL); + xmlNewCharEncodingHandler("ASCII", asciiToUTF8, NULL); + xmlNewCharEncodingHandler("US-ASCII", asciiToUTF8, NULL); +#endif /* LIBXML_OUTPUT_ENABLED */ +#if !defined(LIBXML_ICONV_ENABLED) && !defined(LIBXML_ICU_ENABLED) +#ifdef LIBXML_ISO8859X_ENABLED + xmlRegisterCharEncodingHandlersISO8859x (); +#endif +#endif + +} + +/** + * xmlCleanupCharEncodingHandlers: + * + * Cleanup the memory allocated for the char encoding support, it + * unregisters all the encoding handlers and the aliases. + */ +void +xmlCleanupCharEncodingHandlers(void) { + xmlCleanupEncodingAliases(); + + if (handlers == NULL) return; + + for (;nbCharEncodingHandler > 0;) { + nbCharEncodingHandler--; + if (handlers[nbCharEncodingHandler] != NULL) { + if (handlers[nbCharEncodingHandler]->name != NULL) + xmlFree(handlers[nbCharEncodingHandler]->name); + xmlFree(handlers[nbCharEncodingHandler]); + } + } + xmlFree(handlers); + handlers = NULL; + nbCharEncodingHandler = 0; + xmlDefaultCharEncodingHandler = NULL; +} + +/** + * xmlRegisterCharEncodingHandler: + * @handler: the xmlCharEncodingHandlerPtr handler block + * + * Register the char encoding handler, surprising, isn't it ? + */ +void +xmlRegisterCharEncodingHandler(xmlCharEncodingHandlerPtr handler) { + if (handlers == NULL) xmlInitCharEncodingHandlers(); + if ((handler == NULL) || (handlers == NULL)) { + xmlEncodingErr(XML_I18N_NO_HANDLER, + "xmlRegisterCharEncodingHandler: NULL handler !\n", NULL); + return; + } + + if (nbCharEncodingHandler >= MAX_ENCODING_HANDLERS) { + xmlEncodingErr(XML_I18N_EXCESS_HANDLER, + "xmlRegisterCharEncodingHandler: Too many handler registered, see %s\n", + "MAX_ENCODING_HANDLERS"); + return; + } + handlers[nbCharEncodingHandler++] = handler; +} + +/** + * xmlGetCharEncodingHandler: + * @enc: an xmlCharEncoding value. + * + * Search in the registered set the handler able to read/write that encoding. + * + * Returns the handler or NULL if not found + */ +xmlCharEncodingHandlerPtr +xmlGetCharEncodingHandler(xmlCharEncoding enc) { + xmlCharEncodingHandlerPtr handler; + + if (handlers == NULL) xmlInitCharEncodingHandlers(); + switch (enc) { + case XML_CHAR_ENCODING_ERROR: + return(NULL); + case XML_CHAR_ENCODING_NONE: + return(NULL); + case XML_CHAR_ENCODING_UTF8: + return(NULL); + case XML_CHAR_ENCODING_UTF16LE: + return(xmlUTF16LEHandler); + case XML_CHAR_ENCODING_UTF16BE: + return(xmlUTF16BEHandler); + case XML_CHAR_ENCODING_EBCDIC: + handler = xmlFindCharEncodingHandler("EBCDIC"); + if (handler != NULL) return(handler); + handler = xmlFindCharEncodingHandler("ebcdic"); + if (handler != NULL) return(handler); + handler = xmlFindCharEncodingHandler("EBCDIC-US"); + if (handler != NULL) return(handler); + handler = xmlFindCharEncodingHandler("IBM-037"); + if (handler != NULL) return(handler); + break; + case XML_CHAR_ENCODING_UCS4BE: + handler = xmlFindCharEncodingHandler("ISO-10646-UCS-4"); + if (handler != NULL) return(handler); + handler = xmlFindCharEncodingHandler("UCS-4"); + if (handler != NULL) return(handler); + handler = xmlFindCharEncodingHandler("UCS4"); + if (handler != NULL) return(handler); + break; + case XML_CHAR_ENCODING_UCS4LE: + handler = xmlFindCharEncodingHandler("ISO-10646-UCS-4"); + if (handler != NULL) return(handler); + handler = xmlFindCharEncodingHandler("UCS-4"); + if (handler != NULL) return(handler); + handler = xmlFindCharEncodingHandler("UCS4"); + if (handler != NULL) return(handler); + break; + case XML_CHAR_ENCODING_UCS4_2143: + break; + case XML_CHAR_ENCODING_UCS4_3412: + break; + case XML_CHAR_ENCODING_UCS2: + handler = xmlFindCharEncodingHandler("ISO-10646-UCS-2"); + if (handler != NULL) return(handler); + handler = xmlFindCharEncodingHandler("UCS-2"); + if (handler != NULL) return(handler); + handler = xmlFindCharEncodingHandler("UCS2"); + if (handler != NULL) return(handler); + break; + + /* + * We used to keep ISO Latin encodings native in the + * generated data. This led to so many problems that + * this has been removed. One can still change this + * back by registering no-ops encoders for those + */ + case XML_CHAR_ENCODING_8859_1: + handler = xmlFindCharEncodingHandler("ISO-8859-1"); + if (handler != NULL) return(handler); + break; + case XML_CHAR_ENCODING_8859_2: + handler = xmlFindCharEncodingHandler("ISO-8859-2"); + if (handler != NULL) return(handler); + break; + case XML_CHAR_ENCODING_8859_3: + handler = xmlFindCharEncodingHandler("ISO-8859-3"); + if (handler != NULL) return(handler); + break; + case XML_CHAR_ENCODING_8859_4: + handler = xmlFindCharEncodingHandler("ISO-8859-4"); + if (handler != NULL) return(handler); + break; + case XML_CHAR_ENCODING_8859_5: + handler = xmlFindCharEncodingHandler("ISO-8859-5"); + if (handler != NULL) return(handler); + break; + case XML_CHAR_ENCODING_8859_6: + handler = xmlFindCharEncodingHandler("ISO-8859-6"); + if (handler != NULL) return(handler); + break; + case XML_CHAR_ENCODING_8859_7: + handler = xmlFindCharEncodingHandler("ISO-8859-7"); + if (handler != NULL) return(handler); + break; + case XML_CHAR_ENCODING_8859_8: + handler = xmlFindCharEncodingHandler("ISO-8859-8"); + if (handler != NULL) return(handler); + break; + case XML_CHAR_ENCODING_8859_9: + handler = xmlFindCharEncodingHandler("ISO-8859-9"); + if (handler != NULL) return(handler); + break; + + + case XML_CHAR_ENCODING_2022_JP: + handler = xmlFindCharEncodingHandler("ISO-2022-JP"); + if (handler != NULL) return(handler); + break; + case XML_CHAR_ENCODING_SHIFT_JIS: + handler = xmlFindCharEncodingHandler("SHIFT-JIS"); + if (handler != NULL) return(handler); + handler = xmlFindCharEncodingHandler("SHIFT_JIS"); + if (handler != NULL) return(handler); + handler = xmlFindCharEncodingHandler("Shift_JIS"); + if (handler != NULL) return(handler); + break; + case XML_CHAR_ENCODING_EUC_JP: + handler = xmlFindCharEncodingHandler("EUC-JP"); + if (handler != NULL) return(handler); + break; + default: + break; + } + +#ifdef DEBUG_ENCODING + xmlGenericError(xmlGenericErrorContext, + "No handler found for encoding %d\n", enc); +#endif + return(NULL); +} + +/** + * xmlFindCharEncodingHandler: + * @name: a string describing the char encoding. + * + * Search in the registered set the handler able to read/write that encoding. + * + * Returns the handler or NULL if not found + */ +xmlCharEncodingHandlerPtr +xmlFindCharEncodingHandler(const char *name) { + const char *nalias; + const char *norig; + xmlCharEncoding alias; +#ifdef LIBXML_ICONV_ENABLED + xmlCharEncodingHandlerPtr enc; + iconv_t icv_in, icv_out; +#endif /* LIBXML_ICONV_ENABLED */ +#ifdef LIBXML_ICU_ENABLED + xmlCharEncodingHandlerPtr encu; + uconv_t *ucv_in, *ucv_out; +#endif /* LIBXML_ICU_ENABLED */ + char upper[100]; + int i; + + if (handlers == NULL) xmlInitCharEncodingHandlers(); + if (name == NULL) return(xmlDefaultCharEncodingHandler); + if (name[0] == 0) return(xmlDefaultCharEncodingHandler); + + /* + * Do the alias resolution + */ + norig = name; + nalias = xmlGetEncodingAlias(name); + if (nalias != NULL) + name = nalias; + + /* + * Check first for directly registered encoding names + */ + for (i = 0;i < 99;i++) { + upper[i] = toupper(name[i]); + if (upper[i] == 0) break; + } + upper[i] = 0; + + if (handlers != NULL) { + for (i = 0;i < nbCharEncodingHandler; i++) { + if (!strcmp(upper, handlers[i]->name)) { +#ifdef DEBUG_ENCODING + xmlGenericError(xmlGenericErrorContext, + "Found registered handler for encoding %s\n", name); +#endif + return(handlers[i]); + } + } + } + +#ifdef LIBXML_ICONV_ENABLED + /* check whether iconv can handle this */ + icv_in = iconv_open("UTF-8", name); + icv_out = iconv_open(name, "UTF-8"); + if (icv_in == (iconv_t) -1) { + icv_in = iconv_open("UTF-8", upper); + } + if (icv_out == (iconv_t) -1) { + icv_out = iconv_open(upper, "UTF-8"); + } + if ((icv_in != (iconv_t) -1) && (icv_out != (iconv_t) -1)) { + enc = (xmlCharEncodingHandlerPtr) + xmlMalloc(sizeof(xmlCharEncodingHandler)); + if (enc == NULL) { + iconv_close(icv_in); + iconv_close(icv_out); + return(NULL); + } + memset(enc, 0, sizeof(xmlCharEncodingHandler)); + enc->name = xmlMemStrdup(name); + enc->input = NULL; + enc->output = NULL; + enc->iconv_in = icv_in; + enc->iconv_out = icv_out; +#ifdef DEBUG_ENCODING + xmlGenericError(xmlGenericErrorContext, + "Found iconv handler for encoding %s\n", name); +#endif + return enc; + } else if ((icv_in != (iconv_t) -1) || icv_out != (iconv_t) -1) { + xmlEncodingErr(XML_ERR_INTERNAL_ERROR, + "iconv : problems with filters for '%s'\n", name); + } +#endif /* LIBXML_ICONV_ENABLED */ +#ifdef LIBXML_ICU_ENABLED + /* check whether icu can handle this */ + ucv_in = openIcuConverter(name, 1); + ucv_out = openIcuConverter(name, 0); + if (ucv_in != NULL && ucv_out != NULL) { + encu = (xmlCharEncodingHandlerPtr) + xmlMalloc(sizeof(xmlCharEncodingHandler)); + if (encu == NULL) { + closeIcuConverter(ucv_in); + closeIcuConverter(ucv_out); + return(NULL); + } + memset(encu, 0, sizeof(xmlCharEncodingHandler)); + encu->name = xmlMemStrdup(name); + encu->input = NULL; + encu->output = NULL; + encu->uconv_in = ucv_in; + encu->uconv_out = ucv_out; +#ifdef DEBUG_ENCODING + xmlGenericError(xmlGenericErrorContext, + "Found ICU converter handler for encoding %s\n", name); +#endif + return encu; + } else if (ucv_in != NULL || ucv_out != NULL) { + closeIcuConverter(ucv_in); + closeIcuConverter(ucv_out); + xmlEncodingErr(XML_ERR_INTERNAL_ERROR, + "ICU converter : problems with filters for '%s'\n", name); + } +#endif /* LIBXML_ICU_ENABLED */ + +#ifdef DEBUG_ENCODING + xmlGenericError(xmlGenericErrorContext, + "No handler found for encoding %s\n", name); +#endif + + /* + * Fallback using the canonical names + */ + alias = xmlParseCharEncoding(norig); + if (alias != XML_CHAR_ENCODING_ERROR) { + const char* canon; + canon = xmlGetCharEncodingName(alias); + if ((canon != NULL) && (strcmp(name, canon))) { + return(xmlFindCharEncodingHandler(canon)); + } + } + + /* If "none of the above", give up */ + return(NULL); +} + +/************************************************************************ + * * + * ICONV based generic conversion functions * + * * + ************************************************************************/ + +#ifdef LIBXML_ICONV_ENABLED +/** + * xmlIconvWrapper: + * @cd: iconv converter data structure + * @out: a pointer to an array of bytes to store the result + * @outlen: the length of @out + * @in: a pointer to an array of ISO Latin 1 chars + * @inlen: the length of @in + * + * Returns 0 if success, or + * -1 by lack of space, or + * -2 if the transcoding fails (for *in is not valid utf8 string or + * the result of transformation can't fit into the encoding we want), or + * -3 if there the last byte can't form a single output char. + * + * The value of @inlen after return is the number of octets consumed + * as the return value is positive, else unpredictable. + * The value of @outlen after return is the number of ocetes consumed. + */ +static int +xmlIconvWrapper(iconv_t cd, unsigned char *out, int *outlen, + const unsigned char *in, int *inlen) { + size_t icv_inlen, icv_outlen; + const char *icv_in = (const char *) in; + char *icv_out = (char *) out; + int ret; + + if ((out == NULL) || (outlen == NULL) || (inlen == NULL) || (in == NULL)) { + if (outlen != NULL) *outlen = 0; + return(-1); + } + icv_inlen = *inlen; + icv_outlen = *outlen; + ret = iconv(cd, (ICONV_CONST char **) &icv_in, &icv_inlen, &icv_out, &icv_outlen); + *inlen -= icv_inlen; + *outlen -= icv_outlen; + if ((icv_inlen != 0) || (ret == -1)) { +#ifdef EILSEQ + if (errno == EILSEQ) { + return -2; + } else +#endif +#ifdef E2BIG + if (errno == E2BIG) { + return -1; + } else +#endif +#ifdef EINVAL + if (errno == EINVAL) { + return -3; + } else +#endif + { + return -3; + } + } + return 0; +} +#endif /* LIBXML_ICONV_ENABLED */ + +/************************************************************************ + * * + * ICU based generic conversion functions * + * * + ************************************************************************/ + +#ifdef LIBXML_ICU_ENABLED +/** + * xmlUconvWrapper: + * @cd: ICU uconverter data structure + * @toUnicode : non-zero if toUnicode. 0 otherwise. + * @out: a pointer to an array of bytes to store the result + * @outlen: the length of @out + * @in: a pointer to an array of ISO Latin 1 chars + * @inlen: the length of @in + * + * Returns 0 if success, or + * -1 by lack of space, or + * -2 if the transcoding fails (for *in is not valid utf8 string or + * the result of transformation can't fit into the encoding we want), or + * -3 if there the last byte can't form a single output char. + * + * The value of @inlen after return is the number of octets consumed + * as the return value is positive, else unpredictable. + * The value of @outlen after return is the number of ocetes consumed. + */ +static int +xmlUconvWrapper(uconv_t *cd, int toUnicode, unsigned char *out, int *outlen, + const unsigned char *in, int *inlen) { + const char *ucv_in = (const char *) in; + char *ucv_out = (char *) out; + UErrorCode err = U_ZERO_ERROR; + + if ((out == NULL) || (outlen == NULL) || (inlen == NULL) || (in == NULL)) { + if (outlen != NULL) *outlen = 0; + return(-1); + } + + /* + * TODO(jungshik) + * 1. is ucnv_convert(To|From)Algorithmic better? + * 2. had we better use an explicit pivot buffer? + * 3. error returned comes from 'fromUnicode' only even + * when toUnicode is true ! + */ + if (toUnicode) { + /* encoding => UTF-16 => UTF-8 */ + ucnv_convertEx(cd->utf8, cd->uconv, &ucv_out, ucv_out + *outlen, + &ucv_in, ucv_in + *inlen, NULL, NULL, NULL, NULL, + 0, TRUE, &err); + } else { + /* UTF-8 => UTF-16 => encoding */ + ucnv_convertEx(cd->uconv, cd->utf8, &ucv_out, ucv_out + *outlen, + &ucv_in, ucv_in + *inlen, NULL, NULL, NULL, NULL, + 0, TRUE, &err); + } + *inlen = ucv_in - (const char*) in; + *outlen = ucv_out - (char *) out; + if (U_SUCCESS(err)) + return 0; + if (err == U_BUFFER_OVERFLOW_ERROR) + return -1; + if (err == U_INVALID_CHAR_FOUND || err == U_ILLEGAL_CHAR_FOUND) + return -2; + /* if (err == U_TRUNCATED_CHAR_FOUND) */ + return -3; +} +#endif /* LIBXML_ICU_ENABLED */ + +/************************************************************************ + * * + * The real API used by libxml for on-the-fly conversion * + * * + ************************************************************************/ + +/** + * xmlCharEncFirstLineInt: + * @handler: char enconding transformation data structure + * @out: an xmlBuffer for the output. + * @in: an xmlBuffer for the input + * @len: number of bytes to convert for the first line, or -1 + * + * Front-end for the encoding handler input function, but handle only + * the very first line, i.e. limit itself to 45 chars. + * + * Returns the number of byte written if success, or + * -1 general error + * -2 if the transcoding fails (for *in is not valid utf8 string or + * the result of transformation can't fit into the encoding we want), or + */ +int +xmlCharEncFirstLineInt(xmlCharEncodingHandler *handler, xmlBufferPtr out, + xmlBufferPtr in, int len) { + int ret = -2; + int written; + int toconv; + + if (handler == NULL) return(-1); + if (out == NULL) return(-1); + if (in == NULL) return(-1); + + /* calculate space available */ + written = out->size - out->use - 1; /* count '\0' */ + toconv = in->use; + /* + * echo '' | wc -c => 38 + * 45 chars should be sufficient to reach the end of the encoding + * declaration without going too far inside the document content. + * on UTF-16 this means 90bytes, on UCS4 this means 180 + * The actual value depending on guessed encoding is passed as @len + * if provided + */ + if (len >= 0) { + if (toconv > len) + toconv = len; + } else { + if (toconv > 180) + toconv = 180; + } + if (toconv * 2 >= written) { + xmlBufferGrow(out, toconv * 2); + written = out->size - out->use - 1; + } + + if (handler->input != NULL) { + ret = handler->input(&out->content[out->use], &written, + in->content, &toconv); + xmlBufferShrink(in, toconv); + out->use += written; + out->content[out->use] = 0; + } +#ifdef LIBXML_ICONV_ENABLED + else if (handler->iconv_in != NULL) { + ret = xmlIconvWrapper(handler->iconv_in, &out->content[out->use], + &written, in->content, &toconv); + xmlBufferShrink(in, toconv); + out->use += written; + out->content[out->use] = 0; + if (ret == -1) ret = -3; + } +#endif /* LIBXML_ICONV_ENABLED */ +#ifdef LIBXML_ICU_ENABLED + else if (handler->uconv_in != NULL) { + ret = xmlUconvWrapper(handler->uconv_in, 1, &out->content[out->use], + &written, in->content, &toconv); + xmlBufferShrink(in, toconv); + out->use += written; + out->content[out->use] = 0; + if (ret == -1) ret = -3; + } +#endif /* LIBXML_ICU_ENABLED */ +#ifdef DEBUG_ENCODING + switch (ret) { + case 0: + xmlGenericError(xmlGenericErrorContext, + "converted %d bytes to %d bytes of input\n", + toconv, written); + break; + case -1: + xmlGenericError(xmlGenericErrorContext,"converted %d bytes to %d bytes of input, %d left\n", + toconv, written, in->use); + break; + case -2: + xmlGenericError(xmlGenericErrorContext, + "input conversion failed due to input error\n"); + break; + case -3: + xmlGenericError(xmlGenericErrorContext,"converted %d bytes to %d bytes of input, %d left\n", + toconv, written, in->use); + break; + default: + xmlGenericError(xmlGenericErrorContext,"Unknown input conversion failed %d\n", ret); + } +#endif /* DEBUG_ENCODING */ + /* + * Ignore when input buffer is not on a boundary + */ + if (ret == -3) ret = 0; + if (ret == -1) ret = 0; + return(ret); +} + +/** + * xmlCharEncFirstLine: + * @handler: char enconding transformation data structure + * @out: an xmlBuffer for the output. + * @in: an xmlBuffer for the input + * + * Front-end for the encoding handler input function, but handle only + * the very first line, i.e. limit itself to 45 chars. + * + * Returns the number of byte written if success, or + * -1 general error + * -2 if the transcoding fails (for *in is not valid utf8 string or + * the result of transformation can't fit into the encoding we want), or + */ +int +xmlCharEncFirstLine(xmlCharEncodingHandler *handler, xmlBufferPtr out, + xmlBufferPtr in) { + return(xmlCharEncFirstLineInt(handler, out, in, -1)); +} + +/** + * xmlCharEncFirstLineInput: + * @input: a parser input buffer + * @len: number of bytes to convert for the first line, or -1 + * + * Front-end for the encoding handler input function, but handle only + * the very first line. Point is that this is based on autodetection + * of the encoding and once that first line is converted we may find + * out that a different decoder is needed to process the input. + * + * Returns the number of byte written if success, or + * -1 general error + * -2 if the transcoding fails (for *in is not valid utf8 string or + * the result of transformation can't fit into the encoding we want), or + */ +int +xmlCharEncFirstLineInput(xmlParserInputBufferPtr input, int len) +{ + int ret = -2; + size_t written; + size_t toconv; + int c_in; + int c_out; + xmlBufPtr in; + xmlBufPtr out; + + if ((input == NULL) || (input->encoder == NULL) || + (input->buffer == NULL) || (input->raw == NULL)) + return (-1); + out = input->buffer; + in = input->raw; + + toconv = xmlBufUse(in); + if (toconv == 0) + return (0); + written = xmlBufAvail(out) - 1; /* count '\0' */ + /* + * echo '' | wc -c => 38 + * 45 chars should be sufficient to reach the end of the encoding + * declaration without going too far inside the document content. + * on UTF-16 this means 90bytes, on UCS4 this means 180 + * The actual value depending on guessed encoding is passed as @len + * if provided + */ + if (len >= 0) { + if (toconv > (unsigned int) len) + toconv = len; + } else { + if (toconv > 180) + toconv = 180; + } + if (toconv * 2 >= written) { + xmlBufGrow(out, toconv * 2); + written = xmlBufAvail(out) - 1; + } + if (written > 360) + written = 360; + + c_in = toconv; + c_out = written; + if (input->encoder->input != NULL) { + ret = input->encoder->input(xmlBufEnd(out), &c_out, + xmlBufContent(in), &c_in); + xmlBufShrink(in, c_in); + xmlBufAddLen(out, c_out); + } +#ifdef LIBXML_ICONV_ENABLED + else if (input->encoder->iconv_in != NULL) { + ret = xmlIconvWrapper(input->encoder->iconv_in, xmlBufEnd(out), + &c_out, xmlBufContent(in), &c_in); + xmlBufShrink(in, c_in); + xmlBufAddLen(out, c_out); + if (ret == -1) + ret = -3; + } +#endif /* LIBXML_ICONV_ENABLED */ +#ifdef LIBXML_ICU_ENABLED + else if (input->encoder->uconv_in != NULL) { + ret = xmlUconvWrapper(input->encoder->uconv_in, 1, xmlBufEnd(out), + &c_out, xmlBufContent(in), &c_in); + xmlBufShrink(in, c_in); + xmlBufAddLen(out, c_out); + if (ret == -1) + ret = -3; + } +#endif /* LIBXML_ICU_ENABLED */ + switch (ret) { + case 0: +#ifdef DEBUG_ENCODING + xmlGenericError(xmlGenericErrorContext, + "converted %d bytes to %d bytes of input\n", + c_in, c_out); +#endif + break; + case -1: +#ifdef DEBUG_ENCODING + xmlGenericError(xmlGenericErrorContext, + "converted %d bytes to %d bytes of input, %d left\n", + c_in, c_out, (int)xmlBufUse(in)); +#endif + break; + case -3: +#ifdef DEBUG_ENCODING + xmlGenericError(xmlGenericErrorContext, + "converted %d bytes to %d bytes of input, %d left\n", + c_in, c_out, (int)xmlBufUse(in)); +#endif + break; + case -2: { + char buf[50]; + const xmlChar *content = xmlBufContent(in); + + snprintf(&buf[0], 49, "0x%02X 0x%02X 0x%02X 0x%02X", + content[0], content[1], + content[2], content[3]); + buf[49] = 0; + xmlEncodingErr(XML_I18N_CONV_FAILED, + "input conversion failed due to input error, bytes %s\n", + buf); + } + } + /* + * Ignore when input buffer is not on a boundary + */ + if (ret == -3) ret = 0; + if (ret == -1) ret = 0; + return(ret); +} + +/** + * xmlCharEncInput: + * @input: a parser input buffer + * @flush: try to flush all the raw buffer + * + * Generic front-end for the encoding handler on parser input + * + * Returns the number of byte written if success, or + * -1 general error + * -2 if the transcoding fails (for *in is not valid utf8 string or + * the result of transformation can't fit into the encoding we want), or + */ +int +xmlCharEncInput(xmlParserInputBufferPtr input, int flush) +{ + int ret = -2; + size_t written; + size_t toconv; + int c_in; + int c_out; + xmlBufPtr in; + xmlBufPtr out; + + if ((input == NULL) || (input->encoder == NULL) || + (input->buffer == NULL) || (input->raw == NULL)) + return (-1); + out = input->buffer; + in = input->raw; + + toconv = xmlBufUse(in); + if (toconv == 0) + return (0); + if ((toconv > 64 * 1024) && (flush == 0)) + toconv = 64 * 1024; + written = xmlBufAvail(out); + if (written > 0) + written--; /* count '\0' */ + if (toconv * 2 >= written) { + xmlBufGrow(out, toconv * 2); + written = xmlBufAvail(out); + if (written > 0) + written--; /* count '\0' */ + } + if ((written > 128 * 1024) && (flush == 0)) + written = 128 * 1024; + + c_in = toconv; + c_out = written; + if (input->encoder->input != NULL) { + ret = input->encoder->input(xmlBufEnd(out), &c_out, + xmlBufContent(in), &c_in); + xmlBufShrink(in, c_in); + xmlBufAddLen(out, c_out); + } +#ifdef LIBXML_ICONV_ENABLED + else if (input->encoder->iconv_in != NULL) { + ret = xmlIconvWrapper(input->encoder->iconv_in, xmlBufEnd(out), + &c_out, xmlBufContent(in), &c_in); + xmlBufShrink(in, c_in); + xmlBufAddLen(out, c_out); + if (ret == -1) + ret = -3; + } +#endif /* LIBXML_ICONV_ENABLED */ +#ifdef LIBXML_ICU_ENABLED + else if (input->encoder->uconv_in != NULL) { + ret = xmlUconvWrapper(input->encoder->uconv_in, 1, xmlBufEnd(out), + &c_out, xmlBufContent(in), &c_in); + xmlBufShrink(in, c_in); + xmlBufAddLen(out, c_out); + if (ret == -1) + ret = -3; + } +#endif /* LIBXML_ICU_ENABLED */ + switch (ret) { + case 0: +#ifdef DEBUG_ENCODING + xmlGenericError(xmlGenericErrorContext, + "converted %d bytes to %d bytes of input\n", + c_in, c_out); +#endif + break; + case -1: +#ifdef DEBUG_ENCODING + xmlGenericError(xmlGenericErrorContext, + "converted %d bytes to %d bytes of input, %d left\n", + c_in, c_out, (int)xmlBufUse(in)); +#endif + break; + case -3: +#ifdef DEBUG_ENCODING + xmlGenericError(xmlGenericErrorContext, + "converted %d bytes to %d bytes of input, %d left\n", + c_in, c_out, (int)xmlBufUse(in)); +#endif + break; + case -2: { + char buf[50]; + const xmlChar *content = xmlBufContent(in); + + snprintf(&buf[0], 49, "0x%02X 0x%02X 0x%02X 0x%02X", + content[0], content[1], + content[2], content[3]); + buf[49] = 0; + xmlEncodingErr(XML_I18N_CONV_FAILED, + "input conversion failed due to input error, bytes %s\n", + buf); + } + } + /* + * Ignore when input buffer is not on a boundary + */ + if (ret == -3) + ret = 0; + return (c_out? c_out : ret); +} + +/** + * xmlCharEncInFunc: + * @handler: char encoding transformation data structure + * @out: an xmlBuffer for the output. + * @in: an xmlBuffer for the input + * + * Generic front-end for the encoding handler input function + * + * Returns the number of byte written if success, or + * -1 general error + * -2 if the transcoding fails (for *in is not valid utf8 string or + * the result of transformation can't fit into the encoding we want), or + */ +int +xmlCharEncInFunc(xmlCharEncodingHandler * handler, xmlBufferPtr out, + xmlBufferPtr in) +{ + int ret = -2; + int written; + int toconv; + + if (handler == NULL) + return (-1); + if (out == NULL) + return (-1); + if (in == NULL) + return (-1); + + toconv = in->use; + if (toconv == 0) + return (0); + written = out->size - out->use -1; /* count '\0' */ + if (toconv * 2 >= written) { + xmlBufferGrow(out, out->size + toconv * 2); + written = out->size - out->use - 1; + } + if (handler->input != NULL) { + ret = handler->input(&out->content[out->use], &written, + in->content, &toconv); + xmlBufferShrink(in, toconv); + out->use += written; + out->content[out->use] = 0; + } +#ifdef LIBXML_ICONV_ENABLED + else if (handler->iconv_in != NULL) { + ret = xmlIconvWrapper(handler->iconv_in, &out->content[out->use], + &written, in->content, &toconv); + xmlBufferShrink(in, toconv); + out->use += written; + out->content[out->use] = 0; + if (ret == -1) + ret = -3; + } +#endif /* LIBXML_ICONV_ENABLED */ +#ifdef LIBXML_ICU_ENABLED + else if (handler->uconv_in != NULL) { + ret = xmlUconvWrapper(handler->uconv_in, 1, &out->content[out->use], + &written, in->content, &toconv); + xmlBufferShrink(in, toconv); + out->use += written; + out->content[out->use] = 0; + if (ret == -1) + ret = -3; + } +#endif /* LIBXML_ICU_ENABLED */ + switch (ret) { + case 0: +#ifdef DEBUG_ENCODING + xmlGenericError(xmlGenericErrorContext, + "converted %d bytes to %d bytes of input\n", + toconv, written); +#endif + break; + case -1: +#ifdef DEBUG_ENCODING + xmlGenericError(xmlGenericErrorContext, + "converted %d bytes to %d bytes of input, %d left\n", + toconv, written, in->use); +#endif + break; + case -3: +#ifdef DEBUG_ENCODING + xmlGenericError(xmlGenericErrorContext, + "converted %d bytes to %d bytes of input, %d left\n", + toconv, written, in->use); +#endif + break; + case -2: { + char buf[50]; + + snprintf(&buf[0], 49, "0x%02X 0x%02X 0x%02X 0x%02X", + in->content[0], in->content[1], + in->content[2], in->content[3]); + buf[49] = 0; + xmlEncodingErr(XML_I18N_CONV_FAILED, + "input conversion failed due to input error, bytes %s\n", + buf); + } + } + /* + * Ignore when input buffer is not on a boundary + */ + if (ret == -3) + ret = 0; + return (written? written : ret); +} + +/** + * xmlCharEncOutput: + * @output: a parser output buffer + * @init: is this an initialization call without data + * + * Generic front-end for the encoding handler on parser output + * a first call with @init == 1 has to be made first to initiate the + * output in case of non-stateless encoding needing to initiate their + * state or the output (like the BOM in UTF16). + * In case of UTF8 sequence conversion errors for the given encoder, + * the content will be automatically remapped to a CharRef sequence. + * + * Returns the number of byte written if success, or + * -1 general error + * -2 if the transcoding fails (for *in is not valid utf8 string or + * the result of transformation can't fit into the encoding we want), or + */ +int +xmlCharEncOutput(xmlOutputBufferPtr output, int init) +{ + int ret = -2; + size_t written; + size_t writtentot = 0; + size_t toconv; + int c_in; + int c_out; + xmlBufPtr in; + xmlBufPtr out; + int charref_len = 0; + + if ((output == NULL) || (output->encoder == NULL) || + (output->buffer == NULL) || (output->conv == NULL)) + return (-1); + out = output->conv; + in = output->buffer; + +retry: + + written = xmlBufAvail(out); + if (written > 0) + written--; /* count '\0' */ + + /* + * First specific handling of the initialization call + */ + if (init) { + c_in = 0; + c_out = written; + if (output->encoder->output != NULL) { + ret = output->encoder->output(xmlBufEnd(out), &c_out, + NULL, &c_in); + if (ret > 0) /* Gennady: check return value */ + xmlBufAddLen(out, c_out); + } +#ifdef LIBXML_ICONV_ENABLED + else if (output->encoder->iconv_out != NULL) { + ret = xmlIconvWrapper(output->encoder->iconv_out, xmlBufEnd(out), + &c_out, NULL, &c_in); + xmlBufAddLen(out, c_out); + } +#endif /* LIBXML_ICONV_ENABLED */ +#ifdef LIBXML_ICU_ENABLED + else if (output->encoder->uconv_out != NULL) { + ret = xmlUconvWrapper(output->encoder->uconv_out, 0, xmlBufEnd(out), + &c_out, NULL, &c_in); + xmlBufAddLen(out, c_out); + } +#endif /* LIBXML_ICU_ENABLED */ +#ifdef DEBUG_ENCODING + xmlGenericError(xmlGenericErrorContext, + "initialized encoder\n"); +#endif + return(0); + } + + /* + * Conversion itself. + */ + toconv = xmlBufUse(in); + if (toconv == 0) + return (0); + if (toconv > 64 * 1024) + toconv = 64 * 1024; + if (toconv * 4 >= written) { + xmlBufGrow(out, toconv * 4); + written = xmlBufAvail(out) - 1; + } + if (written > 256 * 1024) + written = 256 * 1024; + + c_in = toconv; + c_out = written; + if (output->encoder->output != NULL) { + ret = output->encoder->output(xmlBufEnd(out), &c_out, + xmlBufContent(in), &c_in); + if (c_out > 0) { + xmlBufShrink(in, c_in); + xmlBufAddLen(out, c_out); + writtentot += c_out; + } + } +#ifdef LIBXML_ICONV_ENABLED + else if (output->encoder->iconv_out != NULL) { + ret = xmlIconvWrapper(output->encoder->iconv_out, xmlBufEnd(out), + &c_out, xmlBufContent(in), &c_in); + xmlBufShrink(in, c_in); + xmlBufAddLen(out, c_out); + writtentot += c_out; + if (ret == -1) { + if (c_out > 0) { + /* + * Can be a limitation of iconv + */ + charref_len = 0; + goto retry; + } + ret = -3; + } + } +#endif /* LIBXML_ICONV_ENABLED */ +#ifdef LIBXML_ICU_ENABLED + else if (output->encoder->uconv_out != NULL) { + ret = xmlUconvWrapper(output->encoder->uconv_out, 0, xmlBufEnd(out), + &c_out, xmlBufContent(in), &c_in); + xmlBufShrink(in, c_in); + xmlBufAddLen(out, c_out); + writtentot += c_out; + if (ret == -1) { + if (c_out > 0) { + /* + * Can be a limitation of uconv + */ + charref_len = 0; + goto retry; + } + ret = -3; + } + } +#endif /* LIBXML_ICU_ENABLED */ + else { + xmlEncodingErr(XML_I18N_NO_OUTPUT, + "xmlCharEncOutFunc: no output function !\n", NULL); + return(-1); + } + + if (ret >= 0) output += ret; + + /* + * Attempt to handle error cases + */ + switch (ret) { + case 0: +#ifdef DEBUG_ENCODING + xmlGenericError(xmlGenericErrorContext, + "converted %d bytes to %d bytes of output\n", + c_in, c_out); +#endif + break; + case -1: +#ifdef DEBUG_ENCODING + xmlGenericError(xmlGenericErrorContext, + "output conversion failed by lack of space\n"); +#endif + break; + case -3: +#ifdef DEBUG_ENCODING + xmlGenericError(xmlGenericErrorContext,"converted %d bytes to %d bytes of output %d left\n", + c_in, c_out, (int) xmlBufUse(in)); +#endif + break; + case -2: { + int len = (int) xmlBufUse(in); + xmlChar *content = xmlBufContent(in); + int cur; + + cur = xmlGetUTF8Char(content, &len); + if ((charref_len != 0) && (c_out < charref_len)) { + /* + * We attempted to insert a character reference and failed. + * Undo what was written and skip the remaining charref. + */ + xmlBufErase(out, c_out); + writtentot -= c_out; + xmlBufShrink(in, charref_len - c_out); + charref_len = 0; + + ret = -1; + break; + } else if (cur > 0) { + xmlChar charref[20]; + +#ifdef DEBUG_ENCODING + xmlGenericError(xmlGenericErrorContext, + "handling output conversion error\n"); + xmlGenericError(xmlGenericErrorContext, + "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n", + content[0], content[1], + content[2], content[3]); +#endif + /* + * Removes the UTF8 sequence, and replace it by a charref + * and continue the transcoding phase, hoping the error + * did not mangle the encoder state. + */ + charref_len = snprintf((char *) &charref[0], sizeof(charref), + "&#%d;", cur); + xmlBufShrink(in, len); + xmlBufAddHead(in, charref, -1); + + goto retry; + } else { + char buf[50]; + + snprintf(&buf[0], 49, "0x%02X 0x%02X 0x%02X 0x%02X", + content[0], content[1], + content[2], content[3]); + buf[49] = 0; + xmlEncodingErr(XML_I18N_CONV_FAILED, + "output conversion failed due to conv error, bytes %s\n", + buf); + if (xmlBufGetAllocationScheme(in) != XML_BUFFER_ALLOC_IMMUTABLE) + content[0] = ' '; + } + break; + } + } + return(ret); +} + +/** + * xmlCharEncOutFunc: + * @handler: char enconding transformation data structure + * @out: an xmlBuffer for the output. + * @in: an xmlBuffer for the input + * + * Generic front-end for the encoding handler output function + * a first call with @in == NULL has to be made firs to initiate the + * output in case of non-stateless encoding needing to initiate their + * state or the output (like the BOM in UTF16). + * In case of UTF8 sequence conversion errors for the given encoder, + * the content will be automatically remapped to a CharRef sequence. + * + * Returns the number of byte written if success, or + * -1 general error + * -2 if the transcoding fails (for *in is not valid utf8 string or + * the result of transformation can't fit into the encoding we want), or + */ +int +xmlCharEncOutFunc(xmlCharEncodingHandler *handler, xmlBufferPtr out, + xmlBufferPtr in) { + int ret = -2; + int written; + int writtentot = 0; + int toconv; + int output = 0; + int charref_len = 0; + + if (handler == NULL) return(-1); + if (out == NULL) return(-1); + +retry: + + written = out->size - out->use; + + if (written > 0) + written--; /* Gennady: count '/0' */ + + /* + * First specific handling of in = NULL, i.e. the initialization call + */ + if (in == NULL) { + toconv = 0; + if (handler->output != NULL) { + ret = handler->output(&out->content[out->use], &written, + NULL, &toconv); + if (ret >= 0) { /* Gennady: check return value */ + out->use += written; + out->content[out->use] = 0; + } + } +#ifdef LIBXML_ICONV_ENABLED + else if (handler->iconv_out != NULL) { + ret = xmlIconvWrapper(handler->iconv_out, &out->content[out->use], + &written, NULL, &toconv); + out->use += written; + out->content[out->use] = 0; + } +#endif /* LIBXML_ICONV_ENABLED */ +#ifdef LIBXML_ICU_ENABLED + else if (handler->uconv_out != NULL) { + ret = xmlUconvWrapper(handler->uconv_out, 0, + &out->content[out->use], + &written, NULL, &toconv); + out->use += written; + out->content[out->use] = 0; + } +#endif /* LIBXML_ICU_ENABLED */ +#ifdef DEBUG_ENCODING + xmlGenericError(xmlGenericErrorContext, + "initialized encoder\n"); +#endif + return(0); + } + + /* + * Conversion itself. + */ + toconv = in->use; + if (toconv == 0) + return(0); + if (toconv * 4 >= written) { + xmlBufferGrow(out, toconv * 4); + written = out->size - out->use - 1; + } + if (handler->output != NULL) { + ret = handler->output(&out->content[out->use], &written, + in->content, &toconv); + if (written > 0) { + xmlBufferShrink(in, toconv); + out->use += written; + writtentot += written; + } + out->content[out->use] = 0; + } +#ifdef LIBXML_ICONV_ENABLED + else if (handler->iconv_out != NULL) { + ret = xmlIconvWrapper(handler->iconv_out, &out->content[out->use], + &written, in->content, &toconv); + xmlBufferShrink(in, toconv); + out->use += written; + writtentot += written; + out->content[out->use] = 0; + if (ret == -1) { + if (written > 0) { + /* + * Can be a limitation of iconv + */ + charref_len = 0; + goto retry; + } + ret = -3; + } + } +#endif /* LIBXML_ICONV_ENABLED */ +#ifdef LIBXML_ICU_ENABLED + else if (handler->uconv_out != NULL) { + ret = xmlUconvWrapper(handler->uconv_out, 0, + &out->content[out->use], + &written, in->content, &toconv); + xmlBufferShrink(in, toconv); + out->use += written; + writtentot += written; + out->content[out->use] = 0; + if (ret == -1) { + if (written > 0) { + /* + * Can be a limitation of iconv + */ + charref_len = 0; + goto retry; + } + ret = -3; + } + } +#endif /* LIBXML_ICU_ENABLED */ + else { + xmlEncodingErr(XML_I18N_NO_OUTPUT, + "xmlCharEncOutFunc: no output function !\n", NULL); + return(-1); + } + + if (ret >= 0) output += ret; + + /* + * Attempt to handle error cases + */ + switch (ret) { + case 0: +#ifdef DEBUG_ENCODING + xmlGenericError(xmlGenericErrorContext, + "converted %d bytes to %d bytes of output\n", + toconv, written); +#endif + break; + case -1: +#ifdef DEBUG_ENCODING + xmlGenericError(xmlGenericErrorContext, + "output conversion failed by lack of space\n"); +#endif + break; + case -3: +#ifdef DEBUG_ENCODING + xmlGenericError(xmlGenericErrorContext,"converted %d bytes to %d bytes of output %d left\n", + toconv, written, in->use); +#endif + break; + case -2: { + int len = in->use; + const xmlChar *utf = (const xmlChar *) in->content; + int cur; + + cur = xmlGetUTF8Char(utf, &len); + if ((charref_len != 0) && (written < charref_len)) { + /* + * We attempted to insert a character reference and failed. + * Undo what was written and skip the remaining charref. + */ + out->use -= written; + writtentot -= written; + xmlBufferShrink(in, charref_len - written); + charref_len = 0; + + ret = -1; + break; + } else if (cur > 0) { + xmlChar charref[20]; + +#ifdef DEBUG_ENCODING + xmlGenericError(xmlGenericErrorContext, + "handling output conversion error\n"); + xmlGenericError(xmlGenericErrorContext, + "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n", + in->content[0], in->content[1], + in->content[2], in->content[3]); +#endif + /* + * Removes the UTF8 sequence, and replace it by a charref + * and continue the transcoding phase, hoping the error + * did not mangle the encoder state. + */ + charref_len = snprintf((char *) &charref[0], sizeof(charref), + "&#%d;", cur); + xmlBufferShrink(in, len); + xmlBufferAddHead(in, charref, -1); + + goto retry; + } else { + char buf[50]; + + snprintf(&buf[0], 49, "0x%02X 0x%02X 0x%02X 0x%02X", + in->content[0], in->content[1], + in->content[2], in->content[3]); + buf[49] = 0; + xmlEncodingErr(XML_I18N_CONV_FAILED, + "output conversion failed due to conv error, bytes %s\n", + buf); + if (in->alloc != XML_BUFFER_ALLOC_IMMUTABLE) + in->content[0] = ' '; + } + break; + } + } + return(ret); +} + +/** + * xmlCharEncCloseFunc: + * @handler: char enconding transformation data structure + * + * Generic front-end for encoding handler close function + * + * Returns 0 if success, or -1 in case of error + */ +int +xmlCharEncCloseFunc(xmlCharEncodingHandler *handler) { + int ret = 0; + int tofree = 0; + if (handler == NULL) return(-1); + if (handler->name == NULL) return(-1); +#ifdef LIBXML_ICONV_ENABLED + /* + * Iconv handlers can be used only once, free the whole block. + * and the associated icon resources. + */ + if ((handler->iconv_out != NULL) || (handler->iconv_in != NULL)) { + tofree = 1; + if (handler->iconv_out != NULL) { + if (iconv_close(handler->iconv_out)) + ret = -1; + handler->iconv_out = NULL; + } + if (handler->iconv_in != NULL) { + if (iconv_close(handler->iconv_in)) + ret = -1; + handler->iconv_in = NULL; + } + } +#endif /* LIBXML_ICONV_ENABLED */ +#ifdef LIBXML_ICU_ENABLED + if ((handler->uconv_out != NULL) || (handler->uconv_in != NULL)) { + tofree = 1; + if (handler->uconv_out != NULL) { + closeIcuConverter(handler->uconv_out); + handler->uconv_out = NULL; + } + if (handler->uconv_in != NULL) { + closeIcuConverter(handler->uconv_in); + handler->uconv_in = NULL; + } + } +#endif + if (tofree) { + /* free up only dynamic handlers iconv/uconv */ + if (handler->name != NULL) + xmlFree(handler->name); + handler->name = NULL; + xmlFree(handler); + } +#ifdef DEBUG_ENCODING + if (ret) + xmlGenericError(xmlGenericErrorContext, + "failed to close the encoding handler\n"); + else + xmlGenericError(xmlGenericErrorContext, + "closed the encoding handler\n"); +#endif + + return(ret); +} + +/** + * xmlByteConsumed: + * @ctxt: an XML parser context + * + * This function provides the current index of the parser relative + * to the start of the current entity. This function is computed in + * bytes from the beginning starting at zero and finishing at the + * size in byte of the file if parsing a file. The function is + * of constant cost if the input is UTF-8 but can be costly if run + * on non-UTF-8 input. + * + * Returns the index in bytes from the beginning of the entity or -1 + * in case the index could not be computed. + */ +long +xmlByteConsumed(xmlParserCtxtPtr ctxt) { + xmlParserInputPtr in; + + if (ctxt == NULL) return(-1); + in = ctxt->input; + if (in == NULL) return(-1); + if ((in->buf != NULL) && (in->buf->encoder != NULL)) { + unsigned int unused = 0; + xmlCharEncodingHandler * handler = in->buf->encoder; + /* + * Encoding conversion, compute the number of unused original + * bytes from the input not consumed and substract that from + * the raw consumed value, this is not a cheap operation + */ + if (in->end - in->cur > 0) { + unsigned char convbuf[32000]; + const unsigned char *cur = (const unsigned char *)in->cur; + int toconv = in->end - in->cur, written = 32000; + + int ret; + + if (handler->output != NULL) { + do { + toconv = in->end - cur; + written = 32000; + ret = handler->output(&convbuf[0], &written, + cur, &toconv); + if (ret == -1) return(-1); + unused += written; + cur += toconv; + } while (ret == -2); +#ifdef LIBXML_ICONV_ENABLED + } else if (handler->iconv_out != NULL) { + do { + toconv = in->end - cur; + written = 32000; + ret = xmlIconvWrapper(handler->iconv_out, &convbuf[0], + &written, cur, &toconv); + if (ret < 0) { + if (written > 0) + ret = -2; + else + return(-1); + } + unused += written; + cur += toconv; + } while (ret == -2); +#endif +#ifdef LIBXML_ICU_ENABLED + } else if (handler->uconv_out != NULL) { + do { + toconv = in->end - cur; + written = 32000; + ret = xmlUconvWrapper(handler->uconv_out, 0, &convbuf[0], + &written, cur, &toconv); + if (ret < 0) { + if (written > 0) + ret = -2; + else + return(-1); + } + unused += written; + cur += toconv; + } while (ret == -2); +#endif + } else { + /* could not find a converter */ + return(-1); + } + } + if (in->buf->rawconsumed < unused) + return(-1); + return(in->buf->rawconsumed - unused); + } + return(in->consumed + (in->cur - in->base)); +} + +#if !defined(LIBXML_ICONV_ENABLED) && !defined(LIBXML_ICU_ENABLED) +#ifdef LIBXML_ISO8859X_ENABLED + +/** + * UTF8ToISO8859x: + * @out: a pointer to an array of bytes to store the result + * @outlen: the length of @out + * @in: a pointer to an array of UTF-8 chars + * @inlen: the length of @in + * @xlattable: the 2-level transcoding table + * + * Take a block of UTF-8 chars in and try to convert it to an ISO 8859-* + * block of chars out. + * + * Returns 0 if success, -2 if the transcoding fails, or -1 otherwise + * The value of @inlen after return is the number of octets consumed + * as the return value is positive, else unpredictable. + * The value of @outlen after return is the number of ocetes consumed. + */ +static int +UTF8ToISO8859x(unsigned char* out, int *outlen, + const unsigned char* in, int *inlen, + unsigned char const *xlattable) { + const unsigned char* outstart = out; + const unsigned char* inend; + const unsigned char* instart = in; + const unsigned char* processed = in; + + if ((out == NULL) || (outlen == NULL) || (inlen == NULL) || + (xlattable == NULL)) + return(-1); + if (in == NULL) { + /* + * initialization nothing to do + */ + *outlen = 0; + *inlen = 0; + return(0); + } + inend = in + (*inlen); + while (in < inend) { + unsigned char d = *in++; + if (d < 0x80) { + *out++ = d; + } else if (d < 0xC0) { + /* trailing byte in leading position */ + *outlen = out - outstart; + *inlen = processed - instart; + return(-2); + } else if (d < 0xE0) { + unsigned char c; + if (!(in < inend)) { + /* trailing byte not in input buffer */ + *outlen = out - outstart; + *inlen = processed - instart; + return(-3); + } + c = *in++; + if ((c & 0xC0) != 0x80) { + /* not a trailing byte */ + *outlen = out - outstart; + *inlen = processed - instart; + return(-2); + } + c = c & 0x3F; + d = d & 0x1F; + d = xlattable [48 + c + xlattable [d] * 64]; + if (d == 0) { + /* not in character set */ + *outlen = out - outstart; + *inlen = processed - instart; + return(-2); + } + *out++ = d; + } else if (d < 0xF0) { + unsigned char c1; + unsigned char c2; + if (!(in < inend - 1)) { + /* trailing bytes not in input buffer */ + *outlen = out - outstart; + *inlen = processed - instart; + return(-3); + } + c1 = *in++; + if ((c1 & 0xC0) != 0x80) { + /* not a trailing byte (c1) */ + *outlen = out - outstart; + *inlen = processed - instart; + return(-2); + } + c2 = *in++; + if ((c2 & 0xC0) != 0x80) { + /* not a trailing byte (c2) */ + *outlen = out - outstart; + *inlen = processed - instart; + return(-2); + } + c1 = c1 & 0x3F; + c2 = c2 & 0x3F; + d = d & 0x0F; + d = xlattable [48 + c2 + xlattable [48 + c1 + + xlattable [32 + d] * 64] * 64]; + if (d == 0) { + /* not in character set */ + *outlen = out - outstart; + *inlen = processed - instart; + return(-2); + } + *out++ = d; + } else { + /* cannot transcode >= U+010000 */ + *outlen = out - outstart; + *inlen = processed - instart; + return(-2); + } + processed = in; + } + *outlen = out - outstart; + *inlen = processed - instart; + return(*outlen); +} + +/** + * ISO8859xToUTF8 + * @out: a pointer to an array of bytes to store the result + * @outlen: the length of @out + * @in: a pointer to an array of ISO Latin 1 chars + * @inlen: the length of @in + * + * Take a block of ISO 8859-* chars in and try to convert it to an UTF-8 + * block of chars out. + * Returns 0 if success, or -1 otherwise + * The value of @inlen after return is the number of octets consumed + * The value of @outlen after return is the number of ocetes produced. + */ +static int +ISO8859xToUTF8(unsigned char* out, int *outlen, + const unsigned char* in, int *inlen, + unsigned short const *unicodetable) { + unsigned char* outstart = out; + unsigned char* outend; + const unsigned char* instart = in; + const unsigned char* inend; + const unsigned char* instop; + unsigned int c; + + if ((out == NULL) || (outlen == NULL) || (inlen == NULL) || + (in == NULL) || (unicodetable == NULL)) + return(-1); + outend = out + *outlen; + inend = in + *inlen; + instop = inend; + + while ((in < inend) && (out < outend - 2)) { + if (*in >= 0x80) { + c = unicodetable [*in - 0x80]; + if (c == 0) { + /* undefined code point */ + *outlen = out - outstart; + *inlen = in - instart; + return (-1); + } + if (c < 0x800) { + *out++ = ((c >> 6) & 0x1F) | 0xC0; + *out++ = (c & 0x3F) | 0x80; + } else { + *out++ = ((c >> 12) & 0x0F) | 0xE0; + *out++ = ((c >> 6) & 0x3F) | 0x80; + *out++ = (c & 0x3F) | 0x80; + } + ++in; + } + if (instop - in > outend - out) instop = in + (outend - out); + while ((*in < 0x80) && (in < instop)) { + *out++ = *in++; + } + } + if ((in < inend) && (out < outend) && (*in < 0x80)) { + *out++ = *in++; + } + if ((in < inend) && (out < outend) && (*in < 0x80)) { + *out++ = *in++; + } + *outlen = out - outstart; + *inlen = in - instart; + return (*outlen); +} + + +/************************************************************************ + * Lookup tables for ISO-8859-2..ISO-8859-16 transcoding * + ************************************************************************/ + +static unsigned short const xmlunicodetable_ISO8859_2 [128] = { + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, + 0x00a0, 0x0104, 0x02d8, 0x0141, 0x00a4, 0x013d, 0x015a, 0x00a7, + 0x00a8, 0x0160, 0x015e, 0x0164, 0x0179, 0x00ad, 0x017d, 0x017b, + 0x00b0, 0x0105, 0x02db, 0x0142, 0x00b4, 0x013e, 0x015b, 0x02c7, + 0x00b8, 0x0161, 0x015f, 0x0165, 0x017a, 0x02dd, 0x017e, 0x017c, + 0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7, + 0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e, + 0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7, + 0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df, + 0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7, + 0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f, + 0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7, + 0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9, +}; + +static unsigned char const xmltranscodetable_ISO8859_2 [48 + 6 * 64] = { + "\x00\x00\x01\x05\x02\x04\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" + "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" + "\xa0\x00\x00\x00\xa4\x00\x00\xa7\xa8\x00\x00\x00\x00\xad\x00\x00" + "\xb0\x00\x00\x00\xb4\x00\x00\x00\xb8\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\xc3\xe3\xa1\xb1\xc6\xe6\x00\x00\x00\x00\xc8\xe8\xcf\xef" + "\xd0\xf0\x00\x00\x00\x00\x00\x00\xca\xea\xcc\xec\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5\xe5\x00\x00\xa5\xb5\x00" + "\x00\x00\x00\x00\x00\x00\x00\xb7\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\xa2\xff\x00\xb2\x00\xbd\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\xa3\xb3\xd1\xf1\x00\x00\xd2\xf2\x00\x00\x00\x00\x00\x00\x00" + "\xd5\xf5\x00\x00\xc0\xe0\x00\x00\xd8\xf8\xa6\xb6\x00\x00\xaa\xba" + "\xa9\xb9\xde\xfe\xab\xbb\x00\x00\x00\x00\x00\x00\x00\x00\xd9\xf9" + "\xdb\xfb\x00\x00\x00\x00\x00\x00\x00\xac\xbc\xaf\xbf\xae\xbe\x00" + "\x00\xc1\xc2\x00\xc4\x00\x00\xc7\x00\xc9\x00\xcb\x00\xcd\xce\x00" + "\x00\x00\x00\xd3\xd4\x00\xd6\xd7\x00\x00\xda\x00\xdc\xdd\x00\xdf" + "\x00\xe1\xe2\x00\xe4\x00\x00\xe7\x00\xe9\x00\xeb\x00\xed\xee\x00" + "\x00\x00\x00\xf3\xf4\x00\xf6\xf7\x00\x00\xfa\x00\xfc\xfd\x00\x00" +}; + +static unsigned short const xmlunicodetable_ISO8859_3 [128] = { + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, + 0x00a0, 0x0126, 0x02d8, 0x00a3, 0x00a4, 0x0000, 0x0124, 0x00a7, + 0x00a8, 0x0130, 0x015e, 0x011e, 0x0134, 0x00ad, 0x0000, 0x017b, + 0x00b0, 0x0127, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x0125, 0x00b7, + 0x00b8, 0x0131, 0x015f, 0x011f, 0x0135, 0x00bd, 0x0000, 0x017c, + 0x00c0, 0x00c1, 0x00c2, 0x0000, 0x00c4, 0x010a, 0x0108, 0x00c7, + 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, + 0x0000, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x0120, 0x00d6, 0x00d7, + 0x011c, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x016c, 0x015c, 0x00df, + 0x00e0, 0x00e1, 0x00e2, 0x0000, 0x00e4, 0x010b, 0x0109, 0x00e7, + 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, + 0x0000, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x0121, 0x00f6, 0x00f7, + 0x011d, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x016d, 0x015d, 0x02d9, +}; + +static unsigned char const xmltranscodetable_ISO8859_3 [48 + 7 * 64] = { + "\x04\x00\x01\x06\x02\x05\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" + "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" + "\xa0\x00\x00\xa3\xa4\x00\x00\xa7\xa8\x00\x00\x00\x00\xad\x00\x00" + "\xb0\x00\xb2\xb3\xb4\xb5\x00\xb7\xb8\x00\x00\x00\x00\xbd\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\xc6\xe6\xc5\xe5\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\xf8\xab\xbb" + "\xd5\xf5\x00\x00\xa6\xb6\xa1\xb1\x00\x00\x00\x00\x00\x00\x00\x00" + "\xa9\xb9\x00\x00\xac\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\xa2\xff\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xfe\xaa\xba" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\xfd\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaf\xbf\x00\x00\x00" + "\xc0\xc1\xc2\x00\xc4\x00\x00\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf" + "\x00\xd1\xd2\xd3\xd4\x00\xd6\xd7\x00\xd9\xda\xdb\xdc\x00\x00\xdf" + "\xe0\xe1\xe2\x00\xe4\x00\x00\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef" + "\x00\xf1\xf2\xf3\xf4\x00\xf6\xf7\x00\xf9\xfa\xfb\xfc\x00\x00\x00" +}; + +static unsigned short const xmlunicodetable_ISO8859_4 [128] = { + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, + 0x00a0, 0x0104, 0x0138, 0x0156, 0x00a4, 0x0128, 0x013b, 0x00a7, + 0x00a8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00ad, 0x017d, 0x00af, + 0x00b0, 0x0105, 0x02db, 0x0157, 0x00b4, 0x0129, 0x013c, 0x02c7, + 0x00b8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014a, 0x017e, 0x014b, + 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e, + 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x012a, + 0x0110, 0x0145, 0x014c, 0x0136, 0x00d4, 0x00d5, 0x00d6, 0x00d7, + 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x0168, 0x016a, 0x00df, + 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f, + 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x012b, + 0x0111, 0x0146, 0x014d, 0x0137, 0x00f4, 0x00f5, 0x00f6, 0x00f7, + 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x0169, 0x016b, 0x02d9, +}; + +static unsigned char const xmltranscodetable_ISO8859_4 [48 + 6 * 64] = { + "\x00\x00\x01\x05\x02\x03\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" + "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" + "\xa0\x00\x00\x00\xa4\x00\x00\xa7\xa8\x00\x00\x00\x00\xad\x00\xaf" + "\xb0\x00\x00\x00\xb4\x00\x00\x00\xb8\x00\x00\x00\x00\x00\x00\x00" + "\xc0\xe0\x00\x00\xa1\xb1\x00\x00\x00\x00\x00\x00\xc8\xe8\x00\x00" + "\xd0\xf0\xaa\xba\x00\x00\xcc\xec\xca\xea\x00\x00\x00\x00\x00\x00" + "\x00\x00\xab\xbb\x00\x00\x00\x00\xa5\xb5\xcf\xef\x00\x00\xc7\xe7" + "\x00\x00\x00\x00\x00\x00\xd3\xf3\xa2\x00\x00\xa6\xb6\x00\x00\x00" + "\x00\x00\x00\x00\x00\xd1\xf1\x00\x00\x00\xbd\xbf\xd2\xf2\x00\x00" + "\x00\x00\x00\x00\x00\x00\xa3\xb3\x00\x00\x00\x00\x00\x00\x00\x00" + "\xa9\xb9\x00\x00\x00\x00\xac\xbc\xdd\xfd\xde\xfe\x00\x00\x00\x00" + "\x00\x00\xd9\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xae\xbe\x00" + "\x00\x00\x00\x00\x00\x00\x00\xb7\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\xb2\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\xc1\xc2\xc3\xc4\xc5\xc6\x00\x00\xc9\x00\xcb\x00\xcd\xce\x00" + "\x00\x00\x00\x00\xd4\xd5\xd6\xd7\xd8\x00\xda\xdb\xdc\x00\x00\xdf" + "\x00\xe1\xe2\xe3\xe4\xe5\xe6\x00\x00\xe9\x00\xeb\x00\xed\xee\x00" + "\x00\x00\x00\x00\xf4\xf5\xf6\xf7\xf8\x00\xfa\xfb\xfc\x00\x00\x00" +}; + +static unsigned short const xmlunicodetable_ISO8859_5 [128] = { + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, + 0x00a0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, + 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x00ad, 0x040e, 0x040f, + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, + 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, + 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, + 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, + 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, + 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x00a7, 0x045e, 0x045f, +}; + +static unsigned char const xmltranscodetable_ISO8859_5 [48 + 6 * 64] = { + "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x02\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" + "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" + "\xa0\x00\x00\x00\x00\x00\x00\xfd\x00\x00\x00\x00\x00\xad\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\x00\xae\xaf" + "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf" + "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf" + "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf" + "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef" + "\x00\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\x00\xfe\xff" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +}; + +static unsigned short const xmlunicodetable_ISO8859_6 [128] = { + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, + 0x00a0, 0x0000, 0x0000, 0x0000, 0x00a4, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x060c, 0x00ad, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x061b, 0x0000, 0x0000, 0x0000, 0x061f, + 0x0000, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, + 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f, + 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, + 0x0638, 0x0639, 0x063a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, + 0x0648, 0x0649, 0x064a, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f, + 0x0650, 0x0651, 0x0652, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +}; + +static unsigned char const xmltranscodetable_ISO8859_6 [48 + 5 * 64] = { + "\x02\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x03\x04\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" + "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" + "\xa0\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\xad\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbb\x00\x00\x00\xbf" + "\x00\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf" + "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\x00\x00\x00\x00\x00" + "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef" + "\xf0\xf1\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +}; + +static unsigned short const xmlunicodetable_ISO8859_7 [128] = { + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, + 0x00a0, 0x2018, 0x2019, 0x00a3, 0x0000, 0x0000, 0x00a6, 0x00a7, + 0x00a8, 0x00a9, 0x0000, 0x00ab, 0x00ac, 0x00ad, 0x0000, 0x2015, + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0384, 0x0385, 0x0386, 0x00b7, + 0x0388, 0x0389, 0x038a, 0x00bb, 0x038c, 0x00bd, 0x038e, 0x038f, + 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, + 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, + 0x03a0, 0x03a1, 0x0000, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, + 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af, + 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, + 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, + 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, + 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0x0000, +}; + +static unsigned char const xmltranscodetable_ISO8859_7 [48 + 7 * 64] = { + "\x04\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x06" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" + "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" + "\xa0\x00\x00\xa3\x00\x00\xa6\xa7\xa8\xa9\x00\xab\xac\xad\x00\x00" + "\xb0\xb1\xb2\xb3\x00\x00\x00\xb7\x00\x00\x00\xbb\x00\xbd\x00\x00" + "\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\xaf\x00\x00\xa1\xa2\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\xb4\xb5\xb6\x00\xb8\xb9\xba\x00\xbc\x00\xbe\xbf" + "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf" + "\xd0\xd1\x00\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf" + "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef" + "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +}; + +static unsigned short const xmlunicodetable_ISO8859_8 [128] = { + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, + 0x00a0, 0x0000, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, + 0x00a8, 0x00a9, 0x00d7, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, + 0x00b8, 0x00b9, 0x00f7, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2017, + 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, + 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, + 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, + 0x05e8, 0x05e9, 0x05ea, 0x0000, 0x0000, 0x200e, 0x200f, 0x0000, +}; + +static unsigned char const xmltranscodetable_ISO8859_8 [48 + 7 * 64] = { + "\x02\x00\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" + "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" + "\xa0\x00\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\x00\xab\xac\xad\xae\xaf" + "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\x00\xbb\xbc\xbd\xbe\x00" + "\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\xaa\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\xba\x00\x00\x00\x00\x00\x00\x00\x00" + "\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\xfe" + "\x00\x00\x00\x00\x00\x00\x00\xdf\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef" + "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +}; + +static unsigned short const xmlunicodetable_ISO8859_9 [128] = { + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, + 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, + 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, + 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, + 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, + 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, + 0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, + 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df, + 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, + 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, + 0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, + 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff, +}; + +static unsigned char const xmltranscodetable_ISO8859_9 [48 + 5 * 64] = { + "\x00\x00\x01\x02\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" + "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" + "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf" + "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf" + "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf" + "\x00\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\x00\x00\xdf" + "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef" + "\x00\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\x00\x00\xff" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\xf0" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\xdd\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xfe" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +}; + +static unsigned short const xmlunicodetable_ISO8859_10 [128] = { + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, + 0x00a0, 0x0104, 0x0112, 0x0122, 0x012a, 0x0128, 0x0136, 0x00a7, + 0x013b, 0x0110, 0x0160, 0x0166, 0x017d, 0x00ad, 0x016a, 0x014a, + 0x00b0, 0x0105, 0x0113, 0x0123, 0x012b, 0x0129, 0x0137, 0x00b7, + 0x013c, 0x0111, 0x0161, 0x0167, 0x017e, 0x2015, 0x016b, 0x014b, + 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e, + 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x00cf, + 0x00d0, 0x0145, 0x014c, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x0168, + 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, + 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f, + 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x00ef, + 0x00f0, 0x0146, 0x014d, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x0169, + 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x0138, +}; + +static unsigned char const xmltranscodetable_ISO8859_10 [48 + 7 * 64] = { + "\x00\x00\x01\x06\x02\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" + "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" + "\xa0\x00\x00\x00\x00\x00\x00\xa7\x00\x00\x00\x00\x00\xad\x00\x00" + "\xb0\x00\x00\x00\x00\x00\x00\xb7\x00\x00\x00\x00\x00\x00\x00\x00" + "\xc0\xe0\x00\x00\xa1\xb1\x00\x00\x00\x00\x00\x00\xc8\xe8\x00\x00" + "\xa9\xb9\xa2\xb2\x00\x00\xcc\xec\xca\xea\x00\x00\x00\x00\x00\x00" + "\x00\x00\xa3\xb3\x00\x00\x00\x00\xa5\xb5\xa4\xb4\x00\x00\xc7\xe7" + "\x00\x00\x00\x00\x00\x00\xa6\xb6\xff\x00\x00\xa8\xb8\x00\x00\x00" + "\x00\x00\x00\x00\x00\xd1\xf1\x00\x00\x00\xaf\xbf\xd2\xf2\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\xaa\xba\x00\x00\x00\x00\xab\xbb\xd7\xf7\xae\xbe\x00\x00\x00\x00" + "\x00\x00\xd9\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\xbc\x00" + "\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\xc1\xc2\xc3\xc4\xc5\xc6\x00\x00\xc9\x00\xcb\x00\xcd\xce\xcf" + "\xd0\x00\x00\xd3\xd4\xd5\xd6\x00\xd8\x00\xda\xdb\xdc\xdd\xde\xdf" + "\x00\xe1\xe2\xe3\xe4\xe5\xe6\x00\x00\xe9\x00\xeb\x00\xed\xee\xef" + "\xf0\x00\x00\xf3\xf4\xf5\xf6\x00\xf8\x00\xfa\xfb\xfc\xfd\xfe\x00" +}; + +static unsigned short const xmlunicodetable_ISO8859_11 [128] = { + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, + 0x00a0, 0x0e01, 0x0e02, 0x0e03, 0x0e04, 0x0e05, 0x0e06, 0x0e07, + 0x0e08, 0x0e09, 0x0e0a, 0x0e0b, 0x0e0c, 0x0e0d, 0x0e0e, 0x0e0f, + 0x0e10, 0x0e11, 0x0e12, 0x0e13, 0x0e14, 0x0e15, 0x0e16, 0x0e17, + 0x0e18, 0x0e19, 0x0e1a, 0x0e1b, 0x0e1c, 0x0e1d, 0x0e1e, 0x0e1f, + 0x0e20, 0x0e21, 0x0e22, 0x0e23, 0x0e24, 0x0e25, 0x0e26, 0x0e27, + 0x0e28, 0x0e29, 0x0e2a, 0x0e2b, 0x0e2c, 0x0e2d, 0x0e2e, 0x0e2f, + 0x0e30, 0x0e31, 0x0e32, 0x0e33, 0x0e34, 0x0e35, 0x0e36, 0x0e37, + 0x0e38, 0x0e39, 0x0e3a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0e3f, + 0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x0e45, 0x0e46, 0x0e47, + 0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x0e4d, 0x0e4e, 0x0e4f, + 0x0e50, 0x0e51, 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57, + 0x0e58, 0x0e59, 0x0e5a, 0x0e5b, 0x0000, 0x0000, 0x0000, 0x0000, +}; + +static unsigned char const xmltranscodetable_ISO8859_11 [48 + 6 * 64] = { + "\x04\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" + "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" + "\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x03\x05\x00\x00\x00\x00\x00\x00" + "\x00\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf" + "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf" + "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf" + "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\x00\x00\x00\x00\xdf" + "\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef" + "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +}; + +static unsigned short const xmlunicodetable_ISO8859_13 [128] = { + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, + 0x00a0, 0x201d, 0x00a2, 0x00a3, 0x00a4, 0x201e, 0x00a6, 0x00a7, + 0x00d8, 0x00a9, 0x0156, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00c6, + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x201c, 0x00b5, 0x00b6, 0x00b7, + 0x00f8, 0x00b9, 0x0157, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00e6, + 0x0104, 0x012e, 0x0100, 0x0106, 0x00c4, 0x00c5, 0x0118, 0x0112, + 0x010c, 0x00c9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012a, 0x013b, + 0x0160, 0x0143, 0x0145, 0x00d3, 0x014c, 0x00d5, 0x00d6, 0x00d7, + 0x0172, 0x0141, 0x015a, 0x016a, 0x00dc, 0x017b, 0x017d, 0x00df, + 0x0105, 0x012f, 0x0101, 0x0107, 0x00e4, 0x00e5, 0x0119, 0x0113, + 0x010d, 0x00e9, 0x017a, 0x0117, 0x0123, 0x0137, 0x012b, 0x013c, + 0x0161, 0x0144, 0x0146, 0x00f3, 0x014d, 0x00f5, 0x00f6, 0x00f7, + 0x0173, 0x0142, 0x015b, 0x016b, 0x00fc, 0x017c, 0x017e, 0x2019, +}; + +static unsigned char const xmltranscodetable_ISO8859_13 [48 + 7 * 64] = { + "\x00\x00\x01\x04\x06\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" + "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" + "\xa0\x00\xa2\xa3\xa4\x00\xa6\xa7\x00\xa9\x00\xab\xac\xad\xae\x00" + "\xb0\xb1\xb2\xb3\x00\xb5\xb6\xb7\x00\xb9\x00\xbb\xbc\xbd\xbe\x00" + "\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\xb4\xa1\xa5\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\xc4\xc5\xaf\x00\x00\xc9\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\xd3\x00\xd5\xd6\xd7\xa8\x00\x00\x00\xdc\x00\x00\xdf" + "\x00\x00\x00\x00\xe4\xe5\xbf\x00\x00\xe9\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\xf3\x00\xf5\xf6\xf7\xb8\x00\x00\x00\xfc\x00\x00\x00" + "\x00\xd9\xf9\xd1\xf1\xd2\xf2\x00\x00\x00\x00\x00\xd4\xf4\x00\x00" + "\x00\x00\x00\x00\x00\x00\xaa\xba\x00\x00\xda\xfa\x00\x00\x00\x00" + "\xd0\xf0\x00\x00\x00\x00\x00\x00\x00\x00\xdb\xfb\x00\x00\x00\x00" + "\x00\x00\xd8\xf8\x00\x00\x00\x00\x00\xca\xea\xdd\xfd\xde\xfe\x00" + "\xc2\xe2\x00\x00\xc0\xe0\xc3\xe3\x00\x00\x00\x00\xc8\xe8\x00\x00" + "\x00\x00\xc7\xe7\x00\x00\xcb\xeb\xc6\xe6\x00\x00\x00\x00\x00\x00" + "\x00\x00\xcc\xec\x00\x00\x00\x00\x00\x00\xce\xee\x00\x00\xc1\xe1" + "\x00\x00\x00\x00\x00\x00\xcd\xed\x00\x00\x00\xcf\xef\x00\x00\x00" +}; + +static unsigned short const xmlunicodetable_ISO8859_14 [128] = { + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, + 0x00a0, 0x1e02, 0x1e03, 0x00a3, 0x010a, 0x010b, 0x1e0a, 0x00a7, + 0x1e80, 0x00a9, 0x1e82, 0x1e0b, 0x1ef2, 0x00ad, 0x00ae, 0x0178, + 0x1e1e, 0x1e1f, 0x0120, 0x0121, 0x1e40, 0x1e41, 0x00b6, 0x1e56, + 0x1e81, 0x1e57, 0x1e83, 0x1e60, 0x1ef3, 0x1e84, 0x1e85, 0x1e61, + 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, + 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, + 0x0174, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x1e6a, + 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x0176, 0x00df, + 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, + 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, + 0x0175, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x1e6b, + 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x0177, 0x00ff, +}; + +static unsigned char const xmltranscodetable_ISO8859_14 [48 + 10 * 64] = { + "\x00\x00\x01\x09\x04\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" + "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" + "\xa0\x00\x00\xa3\x00\x00\x00\xa7\x00\xa9\x00\x00\x00\xad\xae\x00" + "\x00\x00\x00\x00\x00\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x03\x08\x05\x06\x00\x00\x00\x00" + "\x00\x00\xa1\xa2\x00\x00\x00\x00\x00\x00\xa6\xab\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\xb1" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\xa5\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\xb2\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\xa8\xb8\xaa\xba\xbd\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\xac\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\xd0\xf0\xde\xfe\xaf\x00\x00\x00\x00\x00\x00\x00" + "\xb4\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\xb7\xb9\x00\x00\x00\x00\x00\x00\x00\x00" + "\xbb\xbf\x00\x00\x00\x00\x00\x00\x00\x00\xd7\xf7\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf" + "\x00\xd1\xd2\xd3\xd4\xd5\xd6\x00\xd8\xd9\xda\xdb\xdc\xdd\x00\xdf" + "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef" + "\x00\xf1\xf2\xf3\xf4\xf5\xf6\x00\xf8\xf9\xfa\xfb\xfc\xfd\x00\xff" +}; + +static unsigned short const xmlunicodetable_ISO8859_15 [128] = { + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, + 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20ac, 0x00a5, 0x0160, 0x00a7, + 0x0161, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x017d, 0x00b5, 0x00b6, 0x00b7, + 0x017e, 0x00b9, 0x00ba, 0x00bb, 0x0152, 0x0153, 0x0178, 0x00bf, + 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, + 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, + 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, + 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, + 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, + 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, + 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, + 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff, +}; + +static unsigned char const xmltranscodetable_ISO8859_15 [48 + 6 * 64] = { + "\x00\x00\x01\x05\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" + "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" + "\xa0\xa1\xa2\xa3\x00\xa5\x00\xa7\x00\xa9\xaa\xab\xac\xad\xae\xaf" + "\xb0\xb1\xb2\xb3\x00\xb5\xb6\xb7\x00\xb9\xba\xbb\x00\x00\x00\xbf" + "\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\xbc\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\xa6\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\xbe\x00\x00\x00\x00\xb4\xb8\x00" + "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf" + "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf" + "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef" + "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff" +}; + +static unsigned short const xmlunicodetable_ISO8859_16 [128] = { + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, + 0x00a0, 0x0104, 0x0105, 0x0141, 0x20ac, 0x201e, 0x0160, 0x00a7, + 0x0161, 0x00a9, 0x0218, 0x00ab, 0x0179, 0x00ad, 0x017a, 0x017b, + 0x00b0, 0x00b1, 0x010c, 0x0142, 0x017d, 0x201d, 0x00b6, 0x00b7, + 0x017e, 0x010d, 0x0219, 0x00bb, 0x0152, 0x0153, 0x0178, 0x017c, + 0x00c0, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0106, 0x00c6, 0x00c7, + 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, + 0x0110, 0x0143, 0x00d2, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x015a, + 0x0170, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0118, 0x021a, 0x00df, + 0x00e0, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x0107, 0x00e6, 0x00e7, + 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, + 0x0111, 0x0144, 0x00f2, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x015b, + 0x0171, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0119, 0x021b, 0x00ff, +}; + +static unsigned char const xmltranscodetable_ISO8859_16 [48 + 9 * 64] = { + "\x00\x00\x01\x08\x02\x03\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" + "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" + "\xa0\x00\x00\x00\x00\x00\x00\xa7\x00\xa9\x00\xab\x00\xad\x00\x00" + "\xb0\xb1\x00\x00\x00\x00\xb6\xb7\x00\x00\x00\xbb\x00\x00\x00\x00" + "\x00\x00\xc3\xe3\xa1\xa2\xc5\xe5\x00\x00\x00\x00\xb2\xb9\x00\x00" + "\xd0\xf0\x00\x00\x00\x00\x00\x00\xdd\xfd\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\xa3\xb3\xd1\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\xd5\xf5\xbc\xbd\x00\x00\x00\x00\x00\x00\xd7\xf7\x00\x00\x00\x00" + "\xa6\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\xd8\xf8\x00\x00\x00\x00\x00\x00\xbe\xac\xae\xaf\xbf\xb4\xb8\x00" + "\x06\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\xa5\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\xaa\xba\xde\xfe\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\xc0\xc1\xc2\x00\xc4\x00\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf" + "\x00\x00\xd2\xd3\xd4\x00\xd6\x00\x00\xd9\xda\xdb\xdc\x00\x00\xdf" + "\xe0\xe1\xe2\x00\xe4\x00\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef" + "\x00\x00\xf2\xf3\xf4\x00\xf6\x00\x00\xf9\xfa\xfb\xfc\x00\x00\xff" +}; + + +/* + * auto-generated functions for ISO-8859-2 .. ISO-8859-16 + */ + +static int ISO8859_2ToUTF8 (unsigned char* out, int *outlen, + const unsigned char* in, int *inlen) { + return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_2); +} +static int UTF8ToISO8859_2 (unsigned char* out, int *outlen, + const unsigned char* in, int *inlen) { + return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_2); +} + +static int ISO8859_3ToUTF8 (unsigned char* out, int *outlen, + const unsigned char* in, int *inlen) { + return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_3); +} +static int UTF8ToISO8859_3 (unsigned char* out, int *outlen, + const unsigned char* in, int *inlen) { + return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_3); +} + +static int ISO8859_4ToUTF8 (unsigned char* out, int *outlen, + const unsigned char* in, int *inlen) { + return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_4); +} +static int UTF8ToISO8859_4 (unsigned char* out, int *outlen, + const unsigned char* in, int *inlen) { + return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_4); +} + +static int ISO8859_5ToUTF8 (unsigned char* out, int *outlen, + const unsigned char* in, int *inlen) { + return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_5); +} +static int UTF8ToISO8859_5 (unsigned char* out, int *outlen, + const unsigned char* in, int *inlen) { + return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_5); +} + +static int ISO8859_6ToUTF8 (unsigned char* out, int *outlen, + const unsigned char* in, int *inlen) { + return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_6); +} +static int UTF8ToISO8859_6 (unsigned char* out, int *outlen, + const unsigned char* in, int *inlen) { + return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_6); +} + +static int ISO8859_7ToUTF8 (unsigned char* out, int *outlen, + const unsigned char* in, int *inlen) { + return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_7); +} +static int UTF8ToISO8859_7 (unsigned char* out, int *outlen, + const unsigned char* in, int *inlen) { + return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_7); +} + +static int ISO8859_8ToUTF8 (unsigned char* out, int *outlen, + const unsigned char* in, int *inlen) { + return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_8); +} +static int UTF8ToISO8859_8 (unsigned char* out, int *outlen, + const unsigned char* in, int *inlen) { + return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_8); +} + +static int ISO8859_9ToUTF8 (unsigned char* out, int *outlen, + const unsigned char* in, int *inlen) { + return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_9); +} +static int UTF8ToISO8859_9 (unsigned char* out, int *outlen, + const unsigned char* in, int *inlen) { + return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_9); +} + +static int ISO8859_10ToUTF8 (unsigned char* out, int *outlen, + const unsigned char* in, int *inlen) { + return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_10); +} +static int UTF8ToISO8859_10 (unsigned char* out, int *outlen, + const unsigned char* in, int *inlen) { + return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_10); +} + +static int ISO8859_11ToUTF8 (unsigned char* out, int *outlen, + const unsigned char* in, int *inlen) { + return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_11); +} +static int UTF8ToISO8859_11 (unsigned char* out, int *outlen, + const unsigned char* in, int *inlen) { + return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_11); +} + +static int ISO8859_13ToUTF8 (unsigned char* out, int *outlen, + const unsigned char* in, int *inlen) { + return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_13); +} +static int UTF8ToISO8859_13 (unsigned char* out, int *outlen, + const unsigned char* in, int *inlen) { + return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_13); +} + +static int ISO8859_14ToUTF8 (unsigned char* out, int *outlen, + const unsigned char* in, int *inlen) { + return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_14); +} +static int UTF8ToISO8859_14 (unsigned char* out, int *outlen, + const unsigned char* in, int *inlen) { + return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_14); +} + +static int ISO8859_15ToUTF8 (unsigned char* out, int *outlen, + const unsigned char* in, int *inlen) { + return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_15); +} +static int UTF8ToISO8859_15 (unsigned char* out, int *outlen, + const unsigned char* in, int *inlen) { + return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_15); +} + +static int ISO8859_16ToUTF8 (unsigned char* out, int *outlen, + const unsigned char* in, int *inlen) { + return ISO8859xToUTF8 (out, outlen, in, inlen, xmlunicodetable_ISO8859_16); +} +static int UTF8ToISO8859_16 (unsigned char* out, int *outlen, + const unsigned char* in, int *inlen) { + return UTF8ToISO8859x (out, outlen, in, inlen, xmltranscodetable_ISO8859_16); +} + +static void +xmlRegisterCharEncodingHandlersISO8859x (void) { + xmlNewCharEncodingHandler ("ISO-8859-2", ISO8859_2ToUTF8, UTF8ToISO8859_2); + xmlNewCharEncodingHandler ("ISO-8859-3", ISO8859_3ToUTF8, UTF8ToISO8859_3); + xmlNewCharEncodingHandler ("ISO-8859-4", ISO8859_4ToUTF8, UTF8ToISO8859_4); + xmlNewCharEncodingHandler ("ISO-8859-5", ISO8859_5ToUTF8, UTF8ToISO8859_5); + xmlNewCharEncodingHandler ("ISO-8859-6", ISO8859_6ToUTF8, UTF8ToISO8859_6); + xmlNewCharEncodingHandler ("ISO-8859-7", ISO8859_7ToUTF8, UTF8ToISO8859_7); + xmlNewCharEncodingHandler ("ISO-8859-8", ISO8859_8ToUTF8, UTF8ToISO8859_8); + xmlNewCharEncodingHandler ("ISO-8859-9", ISO8859_9ToUTF8, UTF8ToISO8859_9); + xmlNewCharEncodingHandler ("ISO-8859-10", ISO8859_10ToUTF8, UTF8ToISO8859_10); + xmlNewCharEncodingHandler ("ISO-8859-11", ISO8859_11ToUTF8, UTF8ToISO8859_11); + xmlNewCharEncodingHandler ("ISO-8859-13", ISO8859_13ToUTF8, UTF8ToISO8859_13); + xmlNewCharEncodingHandler ("ISO-8859-14", ISO8859_14ToUTF8, UTF8ToISO8859_14); + xmlNewCharEncodingHandler ("ISO-8859-15", ISO8859_15ToUTF8, UTF8ToISO8859_15); + xmlNewCharEncodingHandler ("ISO-8859-16", ISO8859_16ToUTF8, UTF8ToISO8859_16); +} + +#endif +#endif + +#define bottom_encoding +#include "elfgcchack.h" diff --git a/vendors/libxml/src/entities.c b/vendors/libxml/src/entities.c new file mode 100644 index 0000000..0c484a7 --- /dev/null +++ b/vendors/libxml/src/entities.c @@ -0,0 +1,1105 @@ +/* + * entities.c : implementation for the XML entities handling + * + * See Copyright for the status of this software. + * + * daniel@veillard.com + */ + +#define IN_LIBXML +#include "libxml.h" + +#include +#ifdef HAVE_STDLIB_H +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +#include "save.h" + +/* + * The XML predefined entities. + */ + +static xmlEntity xmlEntityLt = { + NULL, XML_ENTITY_DECL, BAD_CAST "lt", + NULL, NULL, NULL, NULL, NULL, NULL, + BAD_CAST "<", BAD_CAST "<", 1, + XML_INTERNAL_PREDEFINED_ENTITY, + NULL, NULL, NULL, NULL, 0, 1 +}; +static xmlEntity xmlEntityGt = { + NULL, XML_ENTITY_DECL, BAD_CAST "gt", + NULL, NULL, NULL, NULL, NULL, NULL, + BAD_CAST ">", BAD_CAST ">", 1, + XML_INTERNAL_PREDEFINED_ENTITY, + NULL, NULL, NULL, NULL, 0, 1 +}; +static xmlEntity xmlEntityAmp = { + NULL, XML_ENTITY_DECL, BAD_CAST "amp", + NULL, NULL, NULL, NULL, NULL, NULL, + BAD_CAST "&", BAD_CAST "&", 1, + XML_INTERNAL_PREDEFINED_ENTITY, + NULL, NULL, NULL, NULL, 0, 1 +}; +static xmlEntity xmlEntityQuot = { + NULL, XML_ENTITY_DECL, BAD_CAST "quot", + NULL, NULL, NULL, NULL, NULL, NULL, + BAD_CAST "\"", BAD_CAST "\"", 1, + XML_INTERNAL_PREDEFINED_ENTITY, + NULL, NULL, NULL, NULL, 0, 1 +}; +static xmlEntity xmlEntityApos = { + NULL, XML_ENTITY_DECL, BAD_CAST "apos", + NULL, NULL, NULL, NULL, NULL, NULL, + BAD_CAST "'", BAD_CAST "'", 1, + XML_INTERNAL_PREDEFINED_ENTITY, + NULL, NULL, NULL, NULL, 0, 1 +}; + +/** + * xmlEntitiesErrMemory: + * @extra: extra informations + * + * Handle an out of memory condition + */ +static void +xmlEntitiesErrMemory(const char *extra) +{ + __xmlSimpleError(XML_FROM_TREE, XML_ERR_NO_MEMORY, NULL, NULL, extra); +} + +/** + * xmlEntitiesErr: + * @code: the error code + * @msg: the message + * + * Handle an out of memory condition + */ +static void +xmlEntitiesErr(xmlParserErrors code, const char *msg) +{ + __xmlSimpleError(XML_FROM_TREE, code, NULL, msg, NULL); +} + +/* + * xmlFreeEntity : clean-up an entity record. + */ +static void +xmlFreeEntity(xmlEntityPtr entity) +{ + xmlDictPtr dict = NULL; + + if (entity == NULL) + return; + + if (entity->doc != NULL) + dict = entity->doc->dict; + + + if ((entity->children) && (entity->owner == 1) && + (entity == (xmlEntityPtr) entity->children->parent)) + xmlFreeNodeList(entity->children); + if (dict != NULL) { + if ((entity->name != NULL) && (!xmlDictOwns(dict, entity->name))) + xmlFree((char *) entity->name); + if ((entity->ExternalID != NULL) && + (!xmlDictOwns(dict, entity->ExternalID))) + xmlFree((char *) entity->ExternalID); + if ((entity->SystemID != NULL) && + (!xmlDictOwns(dict, entity->SystemID))) + xmlFree((char *) entity->SystemID); + if ((entity->URI != NULL) && (!xmlDictOwns(dict, entity->URI))) + xmlFree((char *) entity->URI); + if ((entity->content != NULL) + && (!xmlDictOwns(dict, entity->content))) + xmlFree((char *) entity->content); + if ((entity->orig != NULL) && (!xmlDictOwns(dict, entity->orig))) + xmlFree((char *) entity->orig); + } else { + if (entity->name != NULL) + xmlFree((char *) entity->name); + if (entity->ExternalID != NULL) + xmlFree((char *) entity->ExternalID); + if (entity->SystemID != NULL) + xmlFree((char *) entity->SystemID); + if (entity->URI != NULL) + xmlFree((char *) entity->URI); + if (entity->content != NULL) + xmlFree((char *) entity->content); + if (entity->orig != NULL) + xmlFree((char *) entity->orig); + } + xmlFree(entity); +} + +/* + * xmlCreateEntity: + * + * internal routine doing the entity node strutures allocations + */ +static xmlEntityPtr +xmlCreateEntity(xmlDictPtr dict, const xmlChar *name, int type, + const xmlChar *ExternalID, const xmlChar *SystemID, + const xmlChar *content) { + xmlEntityPtr ret; + + ret = (xmlEntityPtr) xmlMalloc(sizeof(xmlEntity)); + if (ret == NULL) { + xmlEntitiesErrMemory("xmlCreateEntity: malloc failed"); + return(NULL); + } + memset(ret, 0, sizeof(xmlEntity)); + ret->type = XML_ENTITY_DECL; + ret->checked = 0; + + /* + * fill the structure. + */ + ret->etype = (xmlEntityType) type; + if (dict == NULL) { + ret->name = xmlStrdup(name); + if (ExternalID != NULL) + ret->ExternalID = xmlStrdup(ExternalID); + if (SystemID != NULL) + ret->SystemID = xmlStrdup(SystemID); + } else { + ret->name = xmlDictLookup(dict, name, -1); + if (ExternalID != NULL) + ret->ExternalID = xmlDictLookup(dict, ExternalID, -1); + if (SystemID != NULL) + ret->SystemID = xmlDictLookup(dict, SystemID, -1); + } + if (content != NULL) { + ret->length = xmlStrlen(content); + if ((dict != NULL) && (ret->length < 5)) + ret->content = (xmlChar *) + xmlDictLookup(dict, content, ret->length); + else + ret->content = xmlStrndup(content, ret->length); + } else { + ret->length = 0; + ret->content = NULL; + } + ret->URI = NULL; /* to be computed by the layer knowing + the defining entity */ + ret->orig = NULL; + ret->owner = 0; + + return(ret); +} + +/* + * xmlAddEntity : register a new entity for an entities table. + */ +static xmlEntityPtr +xmlAddEntity(xmlDtdPtr dtd, const xmlChar *name, int type, + const xmlChar *ExternalID, const xmlChar *SystemID, + const xmlChar *content) { + xmlDictPtr dict = NULL; + xmlEntitiesTablePtr table = NULL; + xmlEntityPtr ret; + + if (name == NULL) + return(NULL); + if (dtd == NULL) + return(NULL); + if (dtd->doc != NULL) + dict = dtd->doc->dict; + + switch (type) { + case XML_INTERNAL_GENERAL_ENTITY: + case XML_EXTERNAL_GENERAL_PARSED_ENTITY: + case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: + if (dtd->entities == NULL) + dtd->entities = xmlHashCreateDict(0, dict); + table = dtd->entities; + break; + case XML_INTERNAL_PARAMETER_ENTITY: + case XML_EXTERNAL_PARAMETER_ENTITY: + if (dtd->pentities == NULL) + dtd->pentities = xmlHashCreateDict(0, dict); + table = dtd->pentities; + break; + case XML_INTERNAL_PREDEFINED_ENTITY: + return(NULL); + } + if (table == NULL) + return(NULL); + ret = xmlCreateEntity(dict, name, type, ExternalID, SystemID, content); + if (ret == NULL) + return(NULL); + ret->doc = dtd->doc; + + if (xmlHashAddEntry(table, name, ret)) { + /* + * entity was already defined at another level. + */ + xmlFreeEntity(ret); + return(NULL); + } + return(ret); +} + +/** + * xmlGetPredefinedEntity: + * @name: the entity name + * + * Check whether this name is an predefined entity. + * + * Returns NULL if not, otherwise the entity + */ +xmlEntityPtr +xmlGetPredefinedEntity(const xmlChar *name) { + if (name == NULL) return(NULL); + switch (name[0]) { + case 'l': + if (xmlStrEqual(name, BAD_CAST "lt")) + return(&xmlEntityLt); + break; + case 'g': + if (xmlStrEqual(name, BAD_CAST "gt")) + return(&xmlEntityGt); + break; + case 'a': + if (xmlStrEqual(name, BAD_CAST "amp")) + return(&xmlEntityAmp); + if (xmlStrEqual(name, BAD_CAST "apos")) + return(&xmlEntityApos); + break; + case 'q': + if (xmlStrEqual(name, BAD_CAST "quot")) + return(&xmlEntityQuot); + break; + default: + break; + } + return(NULL); +} + +/** + * xmlAddDtdEntity: + * @doc: the document + * @name: the entity name + * @type: the entity type XML_xxx_yyy_ENTITY + * @ExternalID: the entity external ID if available + * @SystemID: the entity system ID if available + * @content: the entity content + * + * Register a new entity for this document DTD external subset. + * + * Returns a pointer to the entity or NULL in case of error + */ +xmlEntityPtr +xmlAddDtdEntity(xmlDocPtr doc, const xmlChar *name, int type, + const xmlChar *ExternalID, const xmlChar *SystemID, + const xmlChar *content) { + xmlEntityPtr ret; + xmlDtdPtr dtd; + + if (doc == NULL) { + xmlEntitiesErr(XML_DTD_NO_DOC, + "xmlAddDtdEntity: document is NULL"); + return(NULL); + } + if (doc->extSubset == NULL) { + xmlEntitiesErr(XML_DTD_NO_DTD, + "xmlAddDtdEntity: document without external subset"); + return(NULL); + } + dtd = doc->extSubset; + ret = xmlAddEntity(dtd, name, type, ExternalID, SystemID, content); + if (ret == NULL) return(NULL); + + /* + * Link it to the DTD + */ + ret->parent = dtd; + ret->doc = dtd->doc; + if (dtd->last == NULL) { + dtd->children = dtd->last = (xmlNodePtr) ret; + } else { + dtd->last->next = (xmlNodePtr) ret; + ret->prev = dtd->last; + dtd->last = (xmlNodePtr) ret; + } + return(ret); +} + +/** + * xmlAddDocEntity: + * @doc: the document + * @name: the entity name + * @type: the entity type XML_xxx_yyy_ENTITY + * @ExternalID: the entity external ID if available + * @SystemID: the entity system ID if available + * @content: the entity content + * + * Register a new entity for this document. + * + * Returns a pointer to the entity or NULL in case of error + */ +xmlEntityPtr +xmlAddDocEntity(xmlDocPtr doc, const xmlChar *name, int type, + const xmlChar *ExternalID, const xmlChar *SystemID, + const xmlChar *content) { + xmlEntityPtr ret; + xmlDtdPtr dtd; + + if (doc == NULL) { + xmlEntitiesErr(XML_DTD_NO_DOC, + "xmlAddDocEntity: document is NULL"); + return(NULL); + } + if (doc->intSubset == NULL) { + xmlEntitiesErr(XML_DTD_NO_DTD, + "xmlAddDocEntity: document without internal subset"); + return(NULL); + } + dtd = doc->intSubset; + ret = xmlAddEntity(dtd, name, type, ExternalID, SystemID, content); + if (ret == NULL) return(NULL); + + /* + * Link it to the DTD + */ + ret->parent = dtd; + ret->doc = dtd->doc; + if (dtd->last == NULL) { + dtd->children = dtd->last = (xmlNodePtr) ret; + } else { + dtd->last->next = (xmlNodePtr) ret; + ret->prev = dtd->last; + dtd->last = (xmlNodePtr) ret; + } + return(ret); +} + +/** + * xmlNewEntity: + * @doc: the document + * @name: the entity name + * @type: the entity type XML_xxx_yyy_ENTITY + * @ExternalID: the entity external ID if available + * @SystemID: the entity system ID if available + * @content: the entity content + * + * Create a new entity, this differs from xmlAddDocEntity() that if + * the document is NULL or has no internal subset defined, then an + * unlinked entity structure will be returned, it is then the responsability + * of the caller to link it to the document later or free it when not needed + * anymore. + * + * Returns a pointer to the entity or NULL in case of error + */ +xmlEntityPtr +xmlNewEntity(xmlDocPtr doc, const xmlChar *name, int type, + const xmlChar *ExternalID, const xmlChar *SystemID, + const xmlChar *content) { + xmlEntityPtr ret; + xmlDictPtr dict; + + if ((doc != NULL) && (doc->intSubset != NULL)) { + return(xmlAddDocEntity(doc, name, type, ExternalID, SystemID, content)); + } + if (doc != NULL) + dict = doc->dict; + else + dict = NULL; + ret = xmlCreateEntity(dict, name, type, ExternalID, SystemID, content); + if (ret == NULL) + return(NULL); + ret->doc = doc; + return(ret); +} + +/** + * xmlGetEntityFromTable: + * @table: an entity table + * @name: the entity name + * @parameter: look for parameter entities + * + * Do an entity lookup in the table. + * returns the corresponding parameter entity, if found. + * + * Returns A pointer to the entity structure or NULL if not found. + */ +static xmlEntityPtr +xmlGetEntityFromTable(xmlEntitiesTablePtr table, const xmlChar *name) { + return((xmlEntityPtr) xmlHashLookup(table, name)); +} + +/** + * xmlGetParameterEntity: + * @doc: the document referencing the entity + * @name: the entity name + * + * Do an entity lookup in the internal and external subsets and + * returns the corresponding parameter entity, if found. + * + * Returns A pointer to the entity structure or NULL if not found. + */ +xmlEntityPtr +xmlGetParameterEntity(xmlDocPtr doc, const xmlChar *name) { + xmlEntitiesTablePtr table; + xmlEntityPtr ret; + + if (doc == NULL) + return(NULL); + if ((doc->intSubset != NULL) && (doc->intSubset->pentities != NULL)) { + table = (xmlEntitiesTablePtr) doc->intSubset->pentities; + ret = xmlGetEntityFromTable(table, name); + if (ret != NULL) + return(ret); + } + if ((doc->extSubset != NULL) && (doc->extSubset->pentities != NULL)) { + table = (xmlEntitiesTablePtr) doc->extSubset->pentities; + return(xmlGetEntityFromTable(table, name)); + } + return(NULL); +} + +/** + * xmlGetDtdEntity: + * @doc: the document referencing the entity + * @name: the entity name + * + * Do an entity lookup in the DTD entity hash table and + * returns the corresponding entity, if found. + * Note: the first argument is the document node, not the DTD node. + * + * Returns A pointer to the entity structure or NULL if not found. + */ +xmlEntityPtr +xmlGetDtdEntity(xmlDocPtr doc, const xmlChar *name) { + xmlEntitiesTablePtr table; + + if (doc == NULL) + return(NULL); + if ((doc->extSubset != NULL) && (doc->extSubset->entities != NULL)) { + table = (xmlEntitiesTablePtr) doc->extSubset->entities; + return(xmlGetEntityFromTable(table, name)); + } + return(NULL); +} + +/** + * xmlGetDocEntity: + * @doc: the document referencing the entity + * @name: the entity name + * + * Do an entity lookup in the document entity hash table and + * returns the corresponding entity, otherwise a lookup is done + * in the predefined entities too. + * + * Returns A pointer to the entity structure or NULL if not found. + */ +xmlEntityPtr +xmlGetDocEntity(xmlDocPtr doc, const xmlChar *name) { + xmlEntityPtr cur; + xmlEntitiesTablePtr table; + + if (doc != NULL) { + if ((doc->intSubset != NULL) && (doc->intSubset->entities != NULL)) { + table = (xmlEntitiesTablePtr) doc->intSubset->entities; + cur = xmlGetEntityFromTable(table, name); + if (cur != NULL) + return(cur); + } + if (doc->standalone != 1) { + if ((doc->extSubset != NULL) && + (doc->extSubset->entities != NULL)) { + table = (xmlEntitiesTablePtr) doc->extSubset->entities; + cur = xmlGetEntityFromTable(table, name); + if (cur != NULL) + return(cur); + } + } + } + return(xmlGetPredefinedEntity(name)); +} + +/* + * Macro used to grow the current buffer. + */ +#define growBufferReentrant() { \ + xmlChar *tmp; \ + size_t new_size = buffer_size * 2; \ + if (new_size < buffer_size) goto mem_error; \ + tmp = (xmlChar *) xmlRealloc(buffer, new_size); \ + if (tmp == NULL) goto mem_error; \ + buffer = tmp; \ + buffer_size = new_size; \ +} + +/** + * xmlEncodeEntitiesInternal: + * @doc: the document containing the string + * @input: A string to convert to XML. + * @attr: are we handling an atrbute value + * + * Do a global encoding of a string, replacing the predefined entities + * and non ASCII values with their entities and CharRef counterparts. + * Contrary to xmlEncodeEntities, this routine is reentrant, and result + * must be deallocated. + * + * Returns A newly allocated string with the substitution done. + */ +static xmlChar * +xmlEncodeEntitiesInternal(xmlDocPtr doc, const xmlChar *input, int attr) { + const xmlChar *cur = input; + xmlChar *buffer = NULL; + xmlChar *out = NULL; + size_t buffer_size = 0; + int html = 0; + + if (input == NULL) return(NULL); + if (doc != NULL) + html = (doc->type == XML_HTML_DOCUMENT_NODE); + + /* + * allocate an translation buffer. + */ + buffer_size = 1000; + buffer = (xmlChar *) xmlMalloc(buffer_size * sizeof(xmlChar)); + if (buffer == NULL) { + xmlEntitiesErrMemory("xmlEncodeEntities: malloc failed"); + return(NULL); + } + out = buffer; + + while (*cur != '\0') { + size_t indx = out - buffer; + if (indx + 100 > buffer_size) { + + growBufferReentrant(); + out = &buffer[indx]; + } + + /* + * By default one have to encode at least '<', '>', '"' and '&' ! + */ + if (*cur == '<') { + const xmlChar *end; + + /* + * Special handling of server side include in HTML attributes + */ + if (html && attr && + (cur[1] == '!') && (cur[2] == '-') && (cur[3] == '-') && + ((end = xmlStrstr(cur, BAD_CAST "-->")) != NULL)) { + while (cur != end) { + *out++ = *cur++; + indx = out - buffer; + if (indx + 100 > buffer_size) { + growBufferReentrant(); + out = &buffer[indx]; + } + } + *out++ = *cur++; + *out++ = *cur++; + *out++ = *cur++; + continue; + } + *out++ = '&'; + *out++ = 'l'; + *out++ = 't'; + *out++ = ';'; + } else if (*cur == '>') { + *out++ = '&'; + *out++ = 'g'; + *out++ = 't'; + *out++ = ';'; + } else if (*cur == '&') { + /* + * Special handling of &{...} construct from HTML 4, see + * http://www.w3.org/TR/html401/appendix/notes.html#h-B.7.1 + */ + if (html && attr && (cur[1] == '{') && + (strchr((const char *) cur, '}'))) { + while (*cur != '}') { + *out++ = *cur++; + indx = out - buffer; + if (indx + 100 > buffer_size) { + growBufferReentrant(); + out = &buffer[indx]; + } + } + *out++ = *cur++; + continue; + } + *out++ = '&'; + *out++ = 'a'; + *out++ = 'm'; + *out++ = 'p'; + *out++ = ';'; + } else if (((*cur >= 0x20) && (*cur < 0x80)) || + (*cur == '\n') || (*cur == '\t') || ((html) && (*cur == '\r'))) { + /* + * default case, just copy ! + */ + *out++ = *cur; + } else if (*cur >= 0x80) { + if (((doc != NULL) && (doc->encoding != NULL)) || (html)) { + /* + * Bjørn Reese provided the patch + xmlChar xc; + xc = (*cur & 0x3F) << 6; + if (cur[1] != 0) { + xc += *(++cur) & 0x3F; + *out++ = xc; + } else + */ + *out++ = *cur; + } else { + /* + * We assume we have UTF-8 input. + */ + char buf[11], *ptr; + int val = 0, l = 1; + + if (*cur < 0xC0) { + xmlEntitiesErr(XML_CHECK_NOT_UTF8, + "xmlEncodeEntities: input not UTF-8"); + if (doc != NULL) + doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1"); + snprintf(buf, sizeof(buf), "&#%d;", *cur); + buf[sizeof(buf) - 1] = 0; + ptr = buf; + while (*ptr != 0) *out++ = *ptr++; + cur++; + continue; + } else if (*cur < 0xE0) { + val = (cur[0]) & 0x1F; + val <<= 6; + val |= (cur[1]) & 0x3F; + l = 2; + } else if (*cur < 0xF0) { + val = (cur[0]) & 0x0F; + val <<= 6; + val |= (cur[1]) & 0x3F; + val <<= 6; + val |= (cur[2]) & 0x3F; + l = 3; + } else if (*cur < 0xF8) { + val = (cur[0]) & 0x07; + val <<= 6; + val |= (cur[1]) & 0x3F; + val <<= 6; + val |= (cur[2]) & 0x3F; + val <<= 6; + val |= (cur[3]) & 0x3F; + l = 4; + } + if ((l == 1) || (!IS_CHAR(val))) { + xmlEntitiesErr(XML_ERR_INVALID_CHAR, + "xmlEncodeEntities: char out of range\n"); + if (doc != NULL) + doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1"); + snprintf(buf, sizeof(buf), "&#%d;", *cur); + buf[sizeof(buf) - 1] = 0; + ptr = buf; + while (*ptr != 0) *out++ = *ptr++; + cur++; + continue; + } + /* + * We could do multiple things here. Just save as a char ref + */ + snprintf(buf, sizeof(buf), "&#x%X;", val); + buf[sizeof(buf) - 1] = 0; + ptr = buf; + while (*ptr != 0) *out++ = *ptr++; + cur += l; + continue; + } + } else if (IS_BYTE_CHAR(*cur)) { + char buf[11], *ptr; + + snprintf(buf, sizeof(buf), "&#%d;", *cur); + buf[sizeof(buf) - 1] = 0; + ptr = buf; + while (*ptr != 0) *out++ = *ptr++; + } + cur++; + } + *out = 0; + return(buffer); + +mem_error: + xmlEntitiesErrMemory("xmlEncodeEntities: realloc failed"); + xmlFree(buffer); + return(NULL); +} + +/** + * xmlEncodeAttributeEntities: + * @doc: the document containing the string + * @input: A string to convert to XML. + * + * Do a global encoding of a string, replacing the predefined entities + * and non ASCII values with their entities and CharRef counterparts for + * attribute values. + * + * Returns A newly allocated string with the substitution done. + */ +xmlChar * +xmlEncodeAttributeEntities(xmlDocPtr doc, const xmlChar *input) { + return xmlEncodeEntitiesInternal(doc, input, 1); +} + +/** + * xmlEncodeEntitiesReentrant: + * @doc: the document containing the string + * @input: A string to convert to XML. + * + * Do a global encoding of a string, replacing the predefined entities + * and non ASCII values with their entities and CharRef counterparts. + * Contrary to xmlEncodeEntities, this routine is reentrant, and result + * must be deallocated. + * + * Returns A newly allocated string with the substitution done. + */ +xmlChar * +xmlEncodeEntitiesReentrant(xmlDocPtr doc, const xmlChar *input) { + return xmlEncodeEntitiesInternal(doc, input, 0); +} + +/** + * xmlEncodeSpecialChars: + * @doc: the document containing the string + * @input: A string to convert to XML. + * + * Do a global encoding of a string, replacing the predefined entities + * this routine is reentrant, and result must be deallocated. + * + * Returns A newly allocated string with the substitution done. + */ +xmlChar * +xmlEncodeSpecialChars(xmlDocPtr doc ATTRIBUTE_UNUSED, const xmlChar *input) { + const xmlChar *cur = input; + xmlChar *buffer = NULL; + xmlChar *out = NULL; + size_t buffer_size = 0; + if (input == NULL) return(NULL); + + /* + * allocate an translation buffer. + */ + buffer_size = 1000; + buffer = (xmlChar *) xmlMalloc(buffer_size * sizeof(xmlChar)); + if (buffer == NULL) { + xmlEntitiesErrMemory("xmlEncodeSpecialChars: malloc failed"); + return(NULL); + } + out = buffer; + + while (*cur != '\0') { + size_t indx = out - buffer; + if (indx + 10 > buffer_size) { + + growBufferReentrant(); + out = &buffer[indx]; + } + + /* + * By default one have to encode at least '<', '>', '"' and '&' ! + */ + if (*cur == '<') { + *out++ = '&'; + *out++ = 'l'; + *out++ = 't'; + *out++ = ';'; + } else if (*cur == '>') { + *out++ = '&'; + *out++ = 'g'; + *out++ = 't'; + *out++ = ';'; + } else if (*cur == '&') { + *out++ = '&'; + *out++ = 'a'; + *out++ = 'm'; + *out++ = 'p'; + *out++ = ';'; + } else if (*cur == '"') { + *out++ = '&'; + *out++ = 'q'; + *out++ = 'u'; + *out++ = 'o'; + *out++ = 't'; + *out++ = ';'; + } else if (*cur == '\r') { + *out++ = '&'; + *out++ = '#'; + *out++ = '1'; + *out++ = '3'; + *out++ = ';'; + } else { + /* + * Works because on UTF-8, all extended sequences cannot + * result in bytes in the ASCII range. + */ + *out++ = *cur; + } + cur++; + } + *out = 0; + return(buffer); + +mem_error: + xmlEntitiesErrMemory("xmlEncodeSpecialChars: realloc failed"); + xmlFree(buffer); + return(NULL); +} + +/** + * xmlCreateEntitiesTable: + * + * create and initialize an empty entities hash table. + * This really doesn't make sense and should be deprecated + * + * Returns the xmlEntitiesTablePtr just created or NULL in case of error. + */ +xmlEntitiesTablePtr +xmlCreateEntitiesTable(void) { + return((xmlEntitiesTablePtr) xmlHashCreate(0)); +} + +/** + * xmlFreeEntityWrapper: + * @entity: An entity + * @name: its name + * + * Deallocate the memory used by an entities in the hash table. + */ +static void +xmlFreeEntityWrapper(xmlEntityPtr entity, + const xmlChar *name ATTRIBUTE_UNUSED) { + if (entity != NULL) + xmlFreeEntity(entity); +} + +/** + * xmlFreeEntitiesTable: + * @table: An entity table + * + * Deallocate the memory used by an entities hash table. + */ +void +xmlFreeEntitiesTable(xmlEntitiesTablePtr table) { + xmlHashFree(table, (xmlHashDeallocator) xmlFreeEntityWrapper); +} + +#ifdef LIBXML_TREE_ENABLED +/** + * xmlCopyEntity: + * @ent: An entity + * + * Build a copy of an entity + * + * Returns the new xmlEntitiesPtr or NULL in case of error. + */ +static xmlEntityPtr +xmlCopyEntity(xmlEntityPtr ent) { + xmlEntityPtr cur; + + cur = (xmlEntityPtr) xmlMalloc(sizeof(xmlEntity)); + if (cur == NULL) { + xmlEntitiesErrMemory("xmlCopyEntity:: malloc failed"); + return(NULL); + } + memset(cur, 0, sizeof(xmlEntity)); + cur->type = XML_ENTITY_DECL; + + cur->etype = ent->etype; + if (ent->name != NULL) + cur->name = xmlStrdup(ent->name); + if (ent->ExternalID != NULL) + cur->ExternalID = xmlStrdup(ent->ExternalID); + if (ent->SystemID != NULL) + cur->SystemID = xmlStrdup(ent->SystemID); + if (ent->content != NULL) + cur->content = xmlStrdup(ent->content); + if (ent->orig != NULL) + cur->orig = xmlStrdup(ent->orig); + if (ent->URI != NULL) + cur->URI = xmlStrdup(ent->URI); + return(cur); +} + +/** + * xmlCopyEntitiesTable: + * @table: An entity table + * + * Build a copy of an entity table. + * + * Returns the new xmlEntitiesTablePtr or NULL in case of error. + */ +xmlEntitiesTablePtr +xmlCopyEntitiesTable(xmlEntitiesTablePtr table) { + return(xmlHashCopy(table, (xmlHashCopier) xmlCopyEntity)); +} +#endif /* LIBXML_TREE_ENABLED */ + +#ifdef LIBXML_OUTPUT_ENABLED + +/** + * xmlDumpEntityContent: + * @buf: An XML buffer. + * @content: The entity content. + * + * This will dump the quoted string value, taking care of the special + * treatment required by % + */ +static void +xmlDumpEntityContent(xmlBufferPtr buf, const xmlChar *content) { + if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return; + if (xmlStrchr(content, '%')) { + const xmlChar * base, *cur; + + xmlBufferCCat(buf, "\""); + base = cur = content; + while (*cur != 0) { + if (*cur == '"') { + if (base != cur) + xmlBufferAdd(buf, base, cur - base); + xmlBufferAdd(buf, BAD_CAST """, 6); + cur++; + base = cur; + } else if (*cur == '%') { + if (base != cur) + xmlBufferAdd(buf, base, cur - base); + xmlBufferAdd(buf, BAD_CAST "%", 6); + cur++; + base = cur; + } else { + cur++; + } + } + if (base != cur) + xmlBufferAdd(buf, base, cur - base); + xmlBufferCCat(buf, "\""); + } else { + xmlBufferWriteQuotedString(buf, content); + } +} + +/** + * xmlDumpEntityDecl: + * @buf: An XML buffer. + * @ent: An entity table + * + * This will dump the content of the entity table as an XML DTD definition + */ +void +xmlDumpEntityDecl(xmlBufferPtr buf, xmlEntityPtr ent) { + if ((buf == NULL) || (ent == NULL)) return; + switch (ent->etype) { + case XML_INTERNAL_GENERAL_ENTITY: + xmlBufferWriteChar(buf, "name); + xmlBufferWriteChar(buf, " "); + if (ent->orig != NULL) + xmlBufferWriteQuotedString(buf, ent->orig); + else + xmlDumpEntityContent(buf, ent->content); + xmlBufferWriteChar(buf, ">\n"); + break; + case XML_EXTERNAL_GENERAL_PARSED_ENTITY: + xmlBufferWriteChar(buf, "name); + if (ent->ExternalID != NULL) { + xmlBufferWriteChar(buf, " PUBLIC "); + xmlBufferWriteQuotedString(buf, ent->ExternalID); + xmlBufferWriteChar(buf, " "); + xmlBufferWriteQuotedString(buf, ent->SystemID); + } else { + xmlBufferWriteChar(buf, " SYSTEM "); + xmlBufferWriteQuotedString(buf, ent->SystemID); + } + xmlBufferWriteChar(buf, ">\n"); + break; + case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: + xmlBufferWriteChar(buf, "name); + if (ent->ExternalID != NULL) { + xmlBufferWriteChar(buf, " PUBLIC "); + xmlBufferWriteQuotedString(buf, ent->ExternalID); + xmlBufferWriteChar(buf, " "); + xmlBufferWriteQuotedString(buf, ent->SystemID); + } else { + xmlBufferWriteChar(buf, " SYSTEM "); + xmlBufferWriteQuotedString(buf, ent->SystemID); + } + if (ent->content != NULL) { /* Should be true ! */ + xmlBufferWriteChar(buf, " NDATA "); + if (ent->orig != NULL) + xmlBufferWriteCHAR(buf, ent->orig); + else + xmlBufferWriteCHAR(buf, ent->content); + } + xmlBufferWriteChar(buf, ">\n"); + break; + case XML_INTERNAL_PARAMETER_ENTITY: + xmlBufferWriteChar(buf, "name); + xmlBufferWriteChar(buf, " "); + if (ent->orig == NULL) + xmlDumpEntityContent(buf, ent->content); + else + xmlBufferWriteQuotedString(buf, ent->orig); + xmlBufferWriteChar(buf, ">\n"); + break; + case XML_EXTERNAL_PARAMETER_ENTITY: + xmlBufferWriteChar(buf, "name); + if (ent->ExternalID != NULL) { + xmlBufferWriteChar(buf, " PUBLIC "); + xmlBufferWriteQuotedString(buf, ent->ExternalID); + xmlBufferWriteChar(buf, " "); + xmlBufferWriteQuotedString(buf, ent->SystemID); + } else { + xmlBufferWriteChar(buf, " SYSTEM "); + xmlBufferWriteQuotedString(buf, ent->SystemID); + } + xmlBufferWriteChar(buf, ">\n"); + break; + default: + xmlEntitiesErr(XML_DTD_UNKNOWN_ENTITY, + "xmlDumpEntitiesDecl: internal: unknown type entity type"); + } +} + +/** + * xmlDumpEntityDeclScan: + * @ent: An entity table + * @buf: An XML buffer. + * + * When using the hash table scan function, arguments need to be reversed + */ +static void +xmlDumpEntityDeclScan(xmlEntityPtr ent, xmlBufferPtr buf) { + xmlDumpEntityDecl(buf, ent); +} + +/** + * xmlDumpEntitiesTable: + * @buf: An XML buffer. + * @table: An entity table + * + * This will dump the content of the entity table as an XML DTD definition + */ +void +xmlDumpEntitiesTable(xmlBufferPtr buf, xmlEntitiesTablePtr table) { + xmlHashScan(table, (xmlHashScanner)xmlDumpEntityDeclScan, buf); +} +#endif /* LIBXML_OUTPUT_ENABLED */ +#define bottom_entities +#include "elfgcchack.h" diff --git a/vendors/libxml/src/error.c b/vendors/libxml/src/error.c new file mode 100644 index 0000000..cbcf5c9 --- /dev/null +++ b/vendors/libxml/src/error.c @@ -0,0 +1,996 @@ +/* + * error.c: module displaying/handling XML parser errors + * + * See Copyright for the status of this software. + * + * Daniel Veillard + */ + +#define IN_LIBXML +#include "libxml.h" + +#include +#include +#include +#include +#include +#include + +void XMLCDECL xmlGenericErrorDefaultFunc (void *ctx ATTRIBUTE_UNUSED, + const char *msg, + ...); + +#define XML_GET_VAR_STR(msg, str) { \ + int size, prev_size = -1; \ + int chars; \ + char *larger; \ + va_list ap; \ + \ + str = (char *) xmlMalloc(150); \ + if (str != NULL) { \ + \ + size = 150; \ + \ + while (size < 64000) { \ + va_start(ap, msg); \ + chars = vsnprintf(str, size, msg, ap); \ + va_end(ap); \ + if ((chars > -1) && (chars < size)) { \ + if (prev_size == chars) { \ + break; \ + } else { \ + prev_size = chars; \ + } \ + } \ + if (chars > -1) \ + size += chars + 1; \ + else \ + size += 100; \ + if ((larger = (char *) xmlRealloc(str, size)) == NULL) {\ + break; \ + } \ + str = larger; \ + }} \ +} + +/************************************************************************ + * * + * Handling of out of context errors * + * * + ************************************************************************/ + +/** + * xmlGenericErrorDefaultFunc: + * @ctx: an error context + * @msg: the message to display/transmit + * @...: extra parameters for the message display + * + * Default handler for out of context error messages. + */ +void XMLCDECL +xmlGenericErrorDefaultFunc(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...) { + va_list args; + + if (xmlGenericErrorContext == NULL) + xmlGenericErrorContext = (void *) stderr; + + va_start(args, msg); + vfprintf((FILE *)xmlGenericErrorContext, msg, args); + va_end(args); +} + +/** + * initGenericErrorDefaultFunc: + * @handler: the handler + * + * Set or reset (if NULL) the default handler for generic errors + * to the builtin error function. + */ +void +initGenericErrorDefaultFunc(xmlGenericErrorFunc * handler) +{ + if (handler == NULL) + xmlGenericError = xmlGenericErrorDefaultFunc; + else + xmlGenericError = (*handler); +} + +/** + * xmlSetGenericErrorFunc: + * @ctx: the new error handling context + * @handler: the new handler function + * + * Function to reset the handler and the error context for out of + * context error messages. + * This simply means that @handler will be called for subsequent + * error messages while not parsing nor validating. And @ctx will + * be passed as first argument to @handler + * One can simply force messages to be emitted to another FILE * than + * stderr by setting @ctx to this file handle and @handler to NULL. + * For multi-threaded applications, this must be set separately for each thread. + */ +void +xmlSetGenericErrorFunc(void *ctx, xmlGenericErrorFunc handler) { + xmlGenericErrorContext = ctx; + if (handler != NULL) + xmlGenericError = handler; + else + xmlGenericError = xmlGenericErrorDefaultFunc; +} + +/** + * xmlSetStructuredErrorFunc: + * @ctx: the new error handling context + * @handler: the new handler function + * + * Function to reset the handler and the error context for out of + * context structured error messages. + * This simply means that @handler will be called for subsequent + * error messages while not parsing nor validating. And @ctx will + * be passed as first argument to @handler + * For multi-threaded applications, this must be set separately for each thread. + */ +void +xmlSetStructuredErrorFunc(void *ctx, xmlStructuredErrorFunc handler) { + xmlStructuredErrorContext = ctx; + xmlStructuredError = handler; +} + +/************************************************************************ + * * + * Handling of parsing errors * + * * + ************************************************************************/ + +/** + * xmlParserPrintFileInfo: + * @input: an xmlParserInputPtr input + * + * Displays the associated file and line informations for the current input + */ + +void +xmlParserPrintFileInfo(xmlParserInputPtr input) { + if (input != NULL) { + if (input->filename) + xmlGenericError(xmlGenericErrorContext, + "%s:%d: ", input->filename, + input->line); + else + xmlGenericError(xmlGenericErrorContext, + "Entity: line %d: ", input->line); + } +} + +/** + * xmlParserPrintFileContext: + * @input: an xmlParserInputPtr input + * + * Displays current context within the input content for error tracking + */ + +static void +xmlParserPrintFileContextInternal(xmlParserInputPtr input , + xmlGenericErrorFunc channel, void *data ) { + const xmlChar *cur, *base; + unsigned int n, col; /* GCC warns if signed, because compared with sizeof() */ + xmlChar content[81]; /* space for 80 chars + line terminator */ + xmlChar *ctnt; + + if (input == NULL) return; + cur = input->cur; + base = input->base; + /* skip backwards over any end-of-lines */ + while ((cur > base) && ((*(cur) == '\n') || (*(cur) == '\r'))) { + cur--; + } + n = 0; + /* search backwards for beginning-of-line (to max buff size) */ + while ((n++ < (sizeof(content)-1)) && (cur > base) && + (*(cur) != '\n') && (*(cur) != '\r')) + cur--; + if ((*(cur) == '\n') || (*(cur) == '\r')) cur++; + /* calculate the error position in terms of the current position */ + col = input->cur - cur; + /* search forward for end-of-line (to max buff size) */ + n = 0; + ctnt = content; + /* copy selected text to our buffer */ + while ((*cur != 0) && (*(cur) != '\n') && + (*(cur) != '\r') && (n < sizeof(content)-1)) { + *ctnt++ = *cur++; + n++; + } + *ctnt = 0; + /* print out the selected text */ + channel(data ,"%s\n", content); + /* create blank line with problem pointer */ + n = 0; + ctnt = content; + /* (leave buffer space for pointer + line terminator) */ + while ((nfile; + line = err->line; + code = err->code; + domain = err->domain; + level = err->level; + node = err->node; + + if (code == XML_ERR_OK) + return; + + if ((node != NULL) && (node->type == XML_ELEMENT_NODE)) + name = node->name; + + /* + * Maintain the compatibility with the legacy error handling + */ + if (ctxt != NULL) { + input = ctxt->input; + if ((input != NULL) && (input->filename == NULL) && + (ctxt->inputNr > 1)) { + cur = input; + input = ctxt->inputTab[ctxt->inputNr - 2]; + } + if (input != NULL) { + if (input->filename) + channel(data, "%s:%d: ", input->filename, input->line); + else if ((line != 0) && (domain == XML_FROM_PARSER)) + channel(data, "Entity: line %d: ", input->line); + } + } else { + if (file != NULL) + channel(data, "%s:%d: ", file, line); + else if ((line != 0) && + ((domain == XML_FROM_PARSER) || (domain == XML_FROM_SCHEMASV)|| + (domain == XML_FROM_SCHEMASP)||(domain == XML_FROM_DTD) || + (domain == XML_FROM_RELAXNGP)||(domain == XML_FROM_RELAXNGV))) + channel(data, "Entity: line %d: ", line); + } + if (name != NULL) { + channel(data, "element %s: ", name); + } + switch (domain) { + case XML_FROM_PARSER: + channel(data, "parser "); + break; + case XML_FROM_NAMESPACE: + channel(data, "namespace "); + break; + case XML_FROM_DTD: + case XML_FROM_VALID: + channel(data, "validity "); + break; + case XML_FROM_HTML: + channel(data, "HTML parser "); + break; + case XML_FROM_MEMORY: + channel(data, "memory "); + break; + case XML_FROM_OUTPUT: + channel(data, "output "); + break; + case XML_FROM_IO: + channel(data, "I/O "); + break; + case XML_FROM_XINCLUDE: + channel(data, "XInclude "); + break; + case XML_FROM_XPATH: + channel(data, "XPath "); + break; + case XML_FROM_XPOINTER: + channel(data, "parser "); + break; + case XML_FROM_REGEXP: + channel(data, "regexp "); + break; + case XML_FROM_MODULE: + channel(data, "module "); + break; + case XML_FROM_SCHEMASV: + channel(data, "Schemas validity "); + break; + case XML_FROM_SCHEMASP: + channel(data, "Schemas parser "); + break; + case XML_FROM_RELAXNGP: + channel(data, "Relax-NG parser "); + break; + case XML_FROM_RELAXNGV: + channel(data, "Relax-NG validity "); + break; + case XML_FROM_CATALOG: + channel(data, "Catalog "); + break; + case XML_FROM_C14N: + channel(data, "C14N "); + break; + case XML_FROM_XSLT: + channel(data, "XSLT "); + break; + case XML_FROM_I18N: + channel(data, "encoding "); + break; + case XML_FROM_SCHEMATRONV: + channel(data, "schematron "); + break; + case XML_FROM_BUFFER: + channel(data, "internal buffer "); + break; + case XML_FROM_URI: + channel(data, "URI "); + break; + default: + break; + } + switch (level) { + case XML_ERR_NONE: + channel(data, ": "); + break; + case XML_ERR_WARNING: + channel(data, "warning : "); + break; + case XML_ERR_ERROR: + channel(data, "error : "); + break; + case XML_ERR_FATAL: + channel(data, "error : "); + break; + } + if (str != NULL) { + int len; + len = xmlStrlen((const xmlChar *)str); + if ((len > 0) && (str[len - 1] != '\n')) + channel(data, "%s\n", str); + else + channel(data, "%s", str); + } else { + channel(data, "%s\n", "out of memory error"); + } + + if (ctxt != NULL) { + xmlParserPrintFileContextInternal(input, channel, data); + if (cur != NULL) { + if (cur->filename) + channel(data, "%s:%d: \n", cur->filename, cur->line); + else if ((line != 0) && (domain == XML_FROM_PARSER)) + channel(data, "Entity: line %d: \n", cur->line); + xmlParserPrintFileContextInternal(cur, channel, data); + } + } + if ((domain == XML_FROM_XPATH) && (err->str1 != NULL) && + (err->int1 < 100) && + (err->int1 < xmlStrlen((const xmlChar *)err->str1))) { + xmlChar buf[150]; + int i; + + channel(data, "%s\n", err->str1); + for (i=0;i < err->int1;i++) + buf[i] = ' '; + buf[i++] = '^'; + buf[i] = 0; + channel(data, "%s\n", buf); + } +} + +/** + * __xmlRaiseError: + * @schannel: the structured callback channel + * @channel: the old callback channel + * @data: the callback data + * @ctx: the parser context or NULL + * @ctx: the parser context or NULL + * @domain: the domain for the error + * @code: the code for the error + * @level: the xmlErrorLevel for the error + * @file: the file source of the error (or NULL) + * @line: the line of the error or 0 if N/A + * @str1: extra string info + * @str2: extra string info + * @str3: extra string info + * @int1: extra int info + * @col: column number of the error or 0 if N/A + * @msg: the message to display/transmit + * @...: extra parameters for the message display + * + * Update the appropriate global or contextual error structure, + * then forward the error message down the parser or generic + * error callback handler + */ +void XMLCDECL +__xmlRaiseError(xmlStructuredErrorFunc schannel, + xmlGenericErrorFunc channel, void *data, void *ctx, + void *nod, int domain, int code, xmlErrorLevel level, + const char *file, int line, const char *str1, + const char *str2, const char *str3, int int1, int col, + const char *msg, ...) +{ + xmlParserCtxtPtr ctxt = NULL; + xmlNodePtr node = (xmlNodePtr) nod; + char *str = NULL; + xmlParserInputPtr input = NULL; + xmlErrorPtr to = &xmlLastError; + xmlNodePtr baseptr = NULL; + + if (code == XML_ERR_OK) + return; + if ((xmlGetWarningsDefaultValue == 0) && (level == XML_ERR_WARNING)) + return; + if ((domain == XML_FROM_PARSER) || (domain == XML_FROM_HTML) || + (domain == XML_FROM_DTD) || (domain == XML_FROM_NAMESPACE) || + (domain == XML_FROM_IO) || (domain == XML_FROM_VALID)) { + ctxt = (xmlParserCtxtPtr) ctx; + if ((schannel == NULL) && (ctxt != NULL) && (ctxt->sax != NULL) && + (ctxt->sax->initialized == XML_SAX2_MAGIC) && + (ctxt->sax->serror != NULL)) { + schannel = ctxt->sax->serror; + data = ctxt->userData; + } + } + /* + * Check if structured error handler set + */ + if (schannel == NULL) { + schannel = xmlStructuredError; + /* + * if user has defined handler, change data ptr to user's choice + */ + if (schannel != NULL) + data = xmlStructuredErrorContext; + } + /* + * Formatting the message + */ + if (msg == NULL) { + str = (char *) xmlStrdup(BAD_CAST "No error message provided"); + } else { + XML_GET_VAR_STR(msg, str); + } + + /* + * specific processing if a parser context is provided + */ + if (ctxt != NULL) { + if (file == NULL) { + input = ctxt->input; + if ((input != NULL) && (input->filename == NULL) && + (ctxt->inputNr > 1)) { + input = ctxt->inputTab[ctxt->inputNr - 2]; + } + if (input != NULL) { + file = input->filename; + line = input->line; + col = input->col; + } + } + to = &ctxt->lastError; + } else if ((node != NULL) && (file == NULL)) { + int i; + + if ((node->doc != NULL) && (node->doc->URL != NULL)) { + baseptr = node; +/* file = (const char *) node->doc->URL; */ + } + for (i = 0; + ((i < 10) && (node != NULL) && (node->type != XML_ELEMENT_NODE)); + i++) + node = node->parent; + if ((baseptr == NULL) && (node != NULL) && + (node->doc != NULL) && (node->doc->URL != NULL)) + baseptr = node; + + if ((node != NULL) && (node->type == XML_ELEMENT_NODE)) + line = node->line; + if ((line == 0) || (line == 65535)) + line = xmlGetLineNo(node); + } + + /* + * Save the information about the error + */ + xmlResetError(to); + to->domain = domain; + to->code = code; + to->message = str; + to->level = level; + if (file != NULL) + to->file = (char *) xmlStrdup((const xmlChar *) file); + else if (baseptr != NULL) { +#ifdef LIBXML_XINCLUDE_ENABLED + /* + * We check if the error is within an XInclude section and, + * if so, attempt to print out the href of the XInclude instead + * of the usual "base" (doc->URL) for the node (bug 152623). + */ + xmlNodePtr prev = baseptr; + int inclcount = 0; + while (prev != NULL) { + if (prev->prev == NULL) + prev = prev->parent; + else { + prev = prev->prev; + if (prev->type == XML_XINCLUDE_START) { + if (--inclcount < 0) + break; + } else if (prev->type == XML_XINCLUDE_END) + inclcount++; + } + } + if (prev != NULL) { + if (prev->type == XML_XINCLUDE_START) { + prev->type = XML_ELEMENT_NODE; + to->file = (char *) xmlGetProp(prev, BAD_CAST "href"); + prev->type = XML_XINCLUDE_START; + } else { + to->file = (char *) xmlGetProp(prev, BAD_CAST "href"); + } + } else +#endif + to->file = (char *) xmlStrdup(baseptr->doc->URL); + if ((to->file == NULL) && (node != NULL) && (node->doc != NULL)) { + to->file = (char *) xmlStrdup(node->doc->URL); + } + } + to->line = line; + if (str1 != NULL) + to->str1 = (char *) xmlStrdup((const xmlChar *) str1); + if (str2 != NULL) + to->str2 = (char *) xmlStrdup((const xmlChar *) str2); + if (str3 != NULL) + to->str3 = (char *) xmlStrdup((const xmlChar *) str3); + to->int1 = int1; + to->int2 = col; + to->node = node; + to->ctxt = ctx; + + if (to != &xmlLastError) + xmlCopyError(to,&xmlLastError); + + if (schannel != NULL) { + schannel(data, to); + return; + } + + /* + * Find the callback channel if channel param is NULL + */ + if ((ctxt != NULL) && (channel == NULL) && + (xmlStructuredError == NULL) && (ctxt->sax != NULL)) { + if (level == XML_ERR_WARNING) + channel = ctxt->sax->warning; + else + channel = ctxt->sax->error; + data = ctxt->userData; + } else if (channel == NULL) { + channel = xmlGenericError; + if (ctxt != NULL) { + data = ctxt; + } else { + data = xmlGenericErrorContext; + } + } + if (channel == NULL) + return; + + if ((channel == xmlParserError) || + (channel == xmlParserWarning) || + (channel == xmlParserValidityError) || + (channel == xmlParserValidityWarning)) + xmlReportError(to, ctxt, str, NULL, NULL); + else if ((channel == (xmlGenericErrorFunc) fprintf) || + (channel == xmlGenericErrorDefaultFunc)) + xmlReportError(to, ctxt, str, channel, data); + else + channel(data, "%s", str); +} + +/** + * __xmlSimpleError: + * @domain: where the error comes from + * @code: the error code + * @node: the context node + * @extra: extra informations + * + * Handle an out of memory condition + */ +void +__xmlSimpleError(int domain, int code, xmlNodePtr node, + const char *msg, const char *extra) +{ + + if (code == XML_ERR_NO_MEMORY) { + if (extra) + __xmlRaiseError(NULL, NULL, NULL, NULL, node, domain, + XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, extra, + NULL, NULL, 0, 0, + "Memory allocation failed : %s\n", extra); + else + __xmlRaiseError(NULL, NULL, NULL, NULL, node, domain, + XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, NULL, + NULL, NULL, 0, 0, "Memory allocation failed\n"); + } else { + __xmlRaiseError(NULL, NULL, NULL, NULL, node, domain, + code, XML_ERR_ERROR, NULL, 0, extra, + NULL, NULL, 0, 0, msg, extra); + } +} +/** + * xmlParserError: + * @ctx: an XML parser context + * @msg: the message to display/transmit + * @...: extra parameters for the message display + * + * Display and format an error messages, gives file, line, position and + * extra parameters. + */ +void XMLCDECL +xmlParserError(void *ctx, const char *msg, ...) +{ + xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; + xmlParserInputPtr input = NULL; + xmlParserInputPtr cur = NULL; + char * str; + + if (ctxt != NULL) { + input = ctxt->input; + if ((input != NULL) && (input->filename == NULL) && + (ctxt->inputNr > 1)) { + cur = input; + input = ctxt->inputTab[ctxt->inputNr - 2]; + } + xmlParserPrintFileInfo(input); + } + + xmlGenericError(xmlGenericErrorContext, "error: "); + XML_GET_VAR_STR(msg, str); + xmlGenericError(xmlGenericErrorContext, "%s", str); + if (str != NULL) + xmlFree(str); + + if (ctxt != NULL) { + xmlParserPrintFileContext(input); + if (cur != NULL) { + xmlParserPrintFileInfo(cur); + xmlGenericError(xmlGenericErrorContext, "\n"); + xmlParserPrintFileContext(cur); + } + } +} + +/** + * xmlParserWarning: + * @ctx: an XML parser context + * @msg: the message to display/transmit + * @...: extra parameters for the message display + * + * Display and format a warning messages, gives file, line, position and + * extra parameters. + */ +void XMLCDECL +xmlParserWarning(void *ctx, const char *msg, ...) +{ + xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; + xmlParserInputPtr input = NULL; + xmlParserInputPtr cur = NULL; + char * str; + + if (ctxt != NULL) { + input = ctxt->input; + if ((input != NULL) && (input->filename == NULL) && + (ctxt->inputNr > 1)) { + cur = input; + input = ctxt->inputTab[ctxt->inputNr - 2]; + } + xmlParserPrintFileInfo(input); + } + + xmlGenericError(xmlGenericErrorContext, "warning: "); + XML_GET_VAR_STR(msg, str); + xmlGenericError(xmlGenericErrorContext, "%s", str); + if (str != NULL) + xmlFree(str); + + if (ctxt != NULL) { + xmlParserPrintFileContext(input); + if (cur != NULL) { + xmlParserPrintFileInfo(cur); + xmlGenericError(xmlGenericErrorContext, "\n"); + xmlParserPrintFileContext(cur); + } + } +} + +/************************************************************************ + * * + * Handling of validation errors * + * * + ************************************************************************/ + +/** + * xmlParserValidityError: + * @ctx: an XML parser context + * @msg: the message to display/transmit + * @...: extra parameters for the message display + * + * Display and format an validity error messages, gives file, + * line, position and extra parameters. + */ +void XMLCDECL +xmlParserValidityError(void *ctx, const char *msg, ...) +{ + xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; + xmlParserInputPtr input = NULL; + char * str; + int len = xmlStrlen((const xmlChar *) msg); + static int had_info = 0; + + if ((len > 1) && (msg[len - 2] != ':')) { + if (ctxt != NULL) { + input = ctxt->input; + if ((input->filename == NULL) && (ctxt->inputNr > 1)) + input = ctxt->inputTab[ctxt->inputNr - 2]; + + if (had_info == 0) { + xmlParserPrintFileInfo(input); + } + } + xmlGenericError(xmlGenericErrorContext, "validity error: "); + had_info = 0; + } else { + had_info = 1; + } + + XML_GET_VAR_STR(msg, str); + xmlGenericError(xmlGenericErrorContext, "%s", str); + if (str != NULL) + xmlFree(str); + + if ((ctxt != NULL) && (input != NULL)) { + xmlParserPrintFileContext(input); + } +} + +/** + * xmlParserValidityWarning: + * @ctx: an XML parser context + * @msg: the message to display/transmit + * @...: extra parameters for the message display + * + * Display and format a validity warning messages, gives file, line, + * position and extra parameters. + */ +void XMLCDECL +xmlParserValidityWarning(void *ctx, const char *msg, ...) +{ + xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; + xmlParserInputPtr input = NULL; + char * str; + int len = xmlStrlen((const xmlChar *) msg); + + if ((ctxt != NULL) && (len != 0) && (msg[len - 1] != ':')) { + input = ctxt->input; + if ((input->filename == NULL) && (ctxt->inputNr > 1)) + input = ctxt->inputTab[ctxt->inputNr - 2]; + + xmlParserPrintFileInfo(input); + } + + xmlGenericError(xmlGenericErrorContext, "validity warning: "); + XML_GET_VAR_STR(msg, str); + xmlGenericError(xmlGenericErrorContext, "%s", str); + if (str != NULL) + xmlFree(str); + + if (ctxt != NULL) { + xmlParserPrintFileContext(input); + } +} + + +/************************************************************************ + * * + * Extended Error Handling * + * * + ************************************************************************/ + +/** + * xmlGetLastError: + * + * Get the last global error registered. This is per thread if compiled + * with thread support. + * + * Returns NULL if no error occured or a pointer to the error + */ +xmlErrorPtr +xmlGetLastError(void) +{ + if (xmlLastError.code == XML_ERR_OK) + return (NULL); + return (&xmlLastError); +} + +/** + * xmlResetError: + * @err: pointer to the error. + * + * Cleanup the error. + */ +void +xmlResetError(xmlErrorPtr err) +{ + if (err == NULL) + return; + if (err->code == XML_ERR_OK) + return; + if (err->message != NULL) + xmlFree(err->message); + if (err->file != NULL) + xmlFree(err->file); + if (err->str1 != NULL) + xmlFree(err->str1); + if (err->str2 != NULL) + xmlFree(err->str2); + if (err->str3 != NULL) + xmlFree(err->str3); + memset(err, 0, sizeof(xmlError)); + err->code = XML_ERR_OK; +} + +/** + * xmlResetLastError: + * + * Cleanup the last global error registered. For parsing error + * this does not change the well-formedness result. + */ +void +xmlResetLastError(void) +{ + if (xmlLastError.code == XML_ERR_OK) + return; + xmlResetError(&xmlLastError); +} + +/** + * xmlCtxtGetLastError: + * @ctx: an XML parser context + * + * Get the last parsing error registered. + * + * Returns NULL if no error occured or a pointer to the error + */ +xmlErrorPtr +xmlCtxtGetLastError(void *ctx) +{ + xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; + + if (ctxt == NULL) + return (NULL); + if (ctxt->lastError.code == XML_ERR_OK) + return (NULL); + return (&ctxt->lastError); +} + +/** + * xmlCtxtResetLastError: + * @ctx: an XML parser context + * + * Cleanup the last global error registered. For parsing error + * this does not change the well-formedness result. + */ +void +xmlCtxtResetLastError(void *ctx) +{ + xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; + + if (ctxt == NULL) + return; + ctxt->errNo = XML_ERR_OK; + if (ctxt->lastError.code == XML_ERR_OK) + return; + xmlResetError(&ctxt->lastError); +} + +/** + * xmlCopyError: + * @from: a source error + * @to: a target error + * + * Save the original error to the new place. + * + * Returns 0 in case of success and -1 in case of error. + */ +int +xmlCopyError(xmlErrorPtr from, xmlErrorPtr to) { + char *message, *file, *str1, *str2, *str3; + + if ((from == NULL) || (to == NULL)) + return(-1); + + message = (char *) xmlStrdup((xmlChar *) from->message); + file = (char *) xmlStrdup ((xmlChar *) from->file); + str1 = (char *) xmlStrdup ((xmlChar *) from->str1); + str2 = (char *) xmlStrdup ((xmlChar *) from->str2); + str3 = (char *) xmlStrdup ((xmlChar *) from->str3); + + if (to->message != NULL) + xmlFree(to->message); + if (to->file != NULL) + xmlFree(to->file); + if (to->str1 != NULL) + xmlFree(to->str1); + if (to->str2 != NULL) + xmlFree(to->str2); + if (to->str3 != NULL) + xmlFree(to->str3); + to->domain = from->domain; + to->code = from->code; + to->level = from->level; + to->line = from->line; + to->node = from->node; + to->int1 = from->int1; + to->int2 = from->int2; + to->node = from->node; + to->ctxt = from->ctxt; + to->message = message; + to->file = file; + to->str1 = str1; + to->str2 = str2; + to->str3 = str3; + + return 0; +} + +#define bottom_error +#include "elfgcchack.h" diff --git a/vendors/libxml/src/globals.c b/vendors/libxml/src/globals.c new file mode 100644 index 0000000..e351b03 --- /dev/null +++ b/vendors/libxml/src/globals.c @@ -0,0 +1,1114 @@ +/* + * globals.c: definition and handling of the set of global variables + * of the library + * + * The bottom of this file is automatically generated by build_glob.py + * based on the description file global.data + * + * See Copyright for the status of this software. + * + * Gary Pennington + * daniel@veillard.com + */ + +#define IN_LIBXML +#include "libxml.h" + +#ifdef HAVE_STDLIB_H +#include +#endif +#include + +#include +#include +#include + +/* #define DEBUG_GLOBALS */ + +/* + * Helpful Macro + */ +#ifdef LIBXML_THREAD_ENABLED +#define IS_MAIN_THREAD (xmlIsMainThread()) +#else +#define IS_MAIN_THREAD 1 +#endif + +/* + * Mutex to protect "ForNewThreads" variables + */ +static xmlMutexPtr xmlThrDefMutex = NULL; + +/** + * xmlInitGlobals: + * + * Additional initialisation for multi-threading + */ +void xmlInitGlobals(void) +{ + if (xmlThrDefMutex == NULL) + xmlThrDefMutex = xmlNewMutex(); +} + +/** + * xmlCleanupGlobals: + * + * Additional cleanup for multi-threading + */ +void xmlCleanupGlobals(void) +{ + if (xmlThrDefMutex != NULL) { + xmlFreeMutex(xmlThrDefMutex); + xmlThrDefMutex = NULL; + } + __xmlGlobalInitMutexDestroy(); +} + +/************************************************************************ + * * + * All the user accessible global variables of the library * + * * + ************************************************************************/ + +/* + * Memory allocation routines + */ +#undef xmlFree +#undef xmlMalloc +#undef xmlMallocAtomic +#undef xmlMemStrdup +#undef xmlRealloc + +#if defined(DEBUG_MEMORY_LOCATION) || defined(DEBUG_MEMORY) +xmlFreeFunc xmlFree = (xmlFreeFunc) xmlMemFree; +xmlMallocFunc xmlMalloc = (xmlMallocFunc) xmlMemMalloc; +xmlMallocFunc xmlMallocAtomic = (xmlMallocFunc) xmlMemMalloc; +xmlReallocFunc xmlRealloc = (xmlReallocFunc) xmlMemRealloc; +xmlStrdupFunc xmlMemStrdup = (xmlStrdupFunc) xmlMemoryStrdup; +#else +/** + * xmlFree: + * @mem: an already allocated block of memory + * + * The variable holding the libxml free() implementation + */ +xmlFreeFunc xmlFree = (xmlFreeFunc) free; +/** + * xmlMalloc: + * @size: the size requested in bytes + * + * The variable holding the libxml malloc() implementation + * + * Returns a pointer to the newly allocated block or NULL in case of error + */ +xmlMallocFunc xmlMalloc = (xmlMallocFunc) malloc; +/** + * xmlMallocAtomic: + * @size: the size requested in bytes + * + * The variable holding the libxml malloc() implementation for atomic + * data (i.e. blocks not containings pointers), useful when using a + * garbage collecting allocator. + * + * Returns a pointer to the newly allocated block or NULL in case of error + */ +xmlMallocFunc xmlMallocAtomic = (xmlMallocFunc) malloc; +/** + * xmlRealloc: + * @mem: an already allocated block of memory + * @size: the new size requested in bytes + * + * The variable holding the libxml realloc() implementation + * + * Returns a pointer to the newly reallocated block or NULL in case of error + */ +xmlReallocFunc xmlRealloc = (xmlReallocFunc) realloc; +/** + * xmlMemStrdup: + * @str: a zero terminated string + * + * The variable holding the libxml strdup() implementation + * + * Returns the copy of the string or NULL in case of error + */ +xmlStrdupFunc xmlMemStrdup = (xmlStrdupFunc) xmlStrdup; +#endif /* DEBUG_MEMORY_LOCATION || DEBUG_MEMORY */ + +#include +#include +#include + +#undef docbDefaultSAXHandler +#undef htmlDefaultSAXHandler +#undef oldXMLWDcompatibility +#undef xmlBufferAllocScheme +#undef xmlDefaultBufferSize +#undef xmlDefaultSAXHandler +#undef xmlDefaultSAXLocator +#undef xmlDoValidityCheckingDefaultValue +#undef xmlGenericError +#undef xmlStructuredError +#undef xmlGenericErrorContext +#undef xmlStructuredErrorContext +#undef xmlGetWarningsDefaultValue +#undef xmlIndentTreeOutput +#undef xmlTreeIndentString +#undef xmlKeepBlanksDefaultValue +#undef xmlLineNumbersDefaultValue +#undef xmlLoadExtDtdDefaultValue +#undef xmlParserDebugEntities +#undef xmlParserVersion +#undef xmlPedanticParserDefaultValue +#undef xmlSaveNoEmptyTags +#undef xmlSubstituteEntitiesDefaultValue +#undef xmlRegisterNodeDefaultValue +#undef xmlDeregisterNodeDefaultValue +#undef xmlLastError + +#undef xmlParserInputBufferCreateFilenameValue +#undef xmlOutputBufferCreateFilenameValue +/** + * xmlParserVersion: + * + * Constant string describing the internal version of the library + */ +const char *xmlParserVersion = LIBXML_VERSION_STRING LIBXML_VERSION_EXTRA; + +/** + * xmlBufferAllocScheme: + * + * Global setting, default allocation policy for buffers, default is + * XML_BUFFER_ALLOC_EXACT + */ +xmlBufferAllocationScheme xmlBufferAllocScheme = XML_BUFFER_ALLOC_EXACT; +static xmlBufferAllocationScheme xmlBufferAllocSchemeThrDef = XML_BUFFER_ALLOC_EXACT; +/** + * xmlDefaultBufferSize: + * + * Global setting, default buffer size. Default value is BASE_BUFFER_SIZE + */ +int xmlDefaultBufferSize = BASE_BUFFER_SIZE; +static int xmlDefaultBufferSizeThrDef = BASE_BUFFER_SIZE; + +/* + * Parser defaults + */ + +/** + * oldXMLWDcompatibility: + * + * Global setting, DEPRECATED. + */ +int oldXMLWDcompatibility = 0; /* DEPRECATED */ +/** + * xmlParserDebugEntities: + * + * Global setting, asking the parser to print out debugging informations. + * while handling entities. + * Disabled by default + */ +int xmlParserDebugEntities = 0; +static int xmlParserDebugEntitiesThrDef = 0; +/** + * xmlDoValidityCheckingDefaultValue: + * + * Global setting, indicate that the parser should work in validating mode. + * Disabled by default. + */ +int xmlDoValidityCheckingDefaultValue = 0; +static int xmlDoValidityCheckingDefaultValueThrDef = 0; +/** + * xmlGetWarningsDefaultValue: + * + * Global setting, indicate that the parser should provide warnings. + * Activated by default. + */ +int xmlGetWarningsDefaultValue = 1; +static int xmlGetWarningsDefaultValueThrDef = 1; +/** + * xmlLoadExtDtdDefaultValue: + * + * Global setting, indicate that the parser should load DTD while not + * validating. + * Disabled by default. + */ +int xmlLoadExtDtdDefaultValue = 0; +static int xmlLoadExtDtdDefaultValueThrDef = 0; +/** + * xmlPedanticParserDefaultValue: + * + * Global setting, indicate that the parser be pedantic + * Disabled by default. + */ +int xmlPedanticParserDefaultValue = 0; +static int xmlPedanticParserDefaultValueThrDef = 0; +/** + * xmlLineNumbersDefaultValue: + * + * Global setting, indicate that the parser should store the line number + * in the content field of elements in the DOM tree. + * Disabled by default since this may not be safe for old classes of + * applicaton. + */ +int xmlLineNumbersDefaultValue = 0; +static int xmlLineNumbersDefaultValueThrDef = 0; +/** + * xmlKeepBlanksDefaultValue: + * + * Global setting, indicate that the parser should keep all blanks + * nodes found in the content + * Activated by default, this is actually needed to have the parser + * conformant to the XML Recommendation, however the option is kept + * for some applications since this was libxml1 default behaviour. + */ +int xmlKeepBlanksDefaultValue = 1; +static int xmlKeepBlanksDefaultValueThrDef = 1; +/** + * xmlSubstituteEntitiesDefaultValue: + * + * Global setting, indicate that the parser should not generate entity + * references but replace them with the actual content of the entity + * Disabled by default, this should be activated when using XPath since + * the XPath data model requires entities replacement and the XPath + * engine does not handle entities references transparently. + */ +int xmlSubstituteEntitiesDefaultValue = 0; +static int xmlSubstituteEntitiesDefaultValueThrDef = 0; + +xmlRegisterNodeFunc xmlRegisterNodeDefaultValue = NULL; +static xmlRegisterNodeFunc xmlRegisterNodeDefaultValueThrDef = NULL; +xmlDeregisterNodeFunc xmlDeregisterNodeDefaultValue = NULL; +static xmlDeregisterNodeFunc xmlDeregisterNodeDefaultValueThrDef = NULL; + +xmlParserInputBufferCreateFilenameFunc xmlParserInputBufferCreateFilenameValue = NULL; +static xmlParserInputBufferCreateFilenameFunc xmlParserInputBufferCreateFilenameValueThrDef = NULL; + +xmlOutputBufferCreateFilenameFunc xmlOutputBufferCreateFilenameValue = NULL; +static xmlOutputBufferCreateFilenameFunc xmlOutputBufferCreateFilenameValueThrDef = NULL; + +/* + * Error handling + */ + +/* xmlGenericErrorFunc xmlGenericError = xmlGenericErrorDefaultFunc; */ +/* Must initialize xmlGenericError in xmlInitParser */ +void XMLCDECL xmlGenericErrorDefaultFunc (void *ctx ATTRIBUTE_UNUSED, + const char *msg, + ...); +/** + * xmlGenericError: + * + * Global setting: function used for generic error callbacks + */ +xmlGenericErrorFunc xmlGenericError = xmlGenericErrorDefaultFunc; +static xmlGenericErrorFunc xmlGenericErrorThrDef = xmlGenericErrorDefaultFunc; +/** + * xmlStructuredError: + * + * Global setting: function used for structured error callbacks + */ +xmlStructuredErrorFunc xmlStructuredError = NULL; +static xmlStructuredErrorFunc xmlStructuredErrorThrDef = NULL; +/** + * xmlGenericErrorContext: + * + * Global setting passed to generic error callbacks + */ +void *xmlGenericErrorContext = NULL; +static void *xmlGenericErrorContextThrDef = NULL; +/** + * xmlStructuredErrorContext: + * + * Global setting passed to structured error callbacks + */ +void *xmlStructuredErrorContext = NULL; +static void *xmlStructuredErrorContextThrDef = NULL; +xmlError xmlLastError; + +/* + * output defaults + */ +/** + * xmlIndentTreeOutput: + * + * Global setting, asking the serializer to indent the output tree by default + * Enabled by default + */ +int xmlIndentTreeOutput = 1; +static int xmlIndentTreeOutputThrDef = 1; + +/** + * xmlTreeIndentString: + * + * The string used to do one-level indent. By default is equal to " " (two spaces) + */ +const char *xmlTreeIndentString = " "; +static const char *xmlTreeIndentStringThrDef = " "; + +/** + * xmlSaveNoEmptyTags: + * + * Global setting, asking the serializer to not output empty tags + * as but . those two forms are undistinguishable + * once parsed. + * Disabled by default + */ +int xmlSaveNoEmptyTags = 0; +static int xmlSaveNoEmptyTagsThrDef = 0; + +#ifdef LIBXML_SAX1_ENABLED +/** + * xmlDefaultSAXHandler: + * + * Default SAX version1 handler for XML, builds the DOM tree + */ +xmlSAXHandlerV1 xmlDefaultSAXHandler = { + xmlSAX2InternalSubset, + xmlSAX2IsStandalone, + xmlSAX2HasInternalSubset, + xmlSAX2HasExternalSubset, + xmlSAX2ResolveEntity, + xmlSAX2GetEntity, + xmlSAX2EntityDecl, + xmlSAX2NotationDecl, + xmlSAX2AttributeDecl, + xmlSAX2ElementDecl, + xmlSAX2UnparsedEntityDecl, + xmlSAX2SetDocumentLocator, + xmlSAX2StartDocument, + xmlSAX2EndDocument, + xmlSAX2StartElement, + xmlSAX2EndElement, + xmlSAX2Reference, + xmlSAX2Characters, + xmlSAX2Characters, + xmlSAX2ProcessingInstruction, + xmlSAX2Comment, + xmlParserWarning, + xmlParserError, + xmlParserError, + xmlSAX2GetParameterEntity, + xmlSAX2CDataBlock, + xmlSAX2ExternalSubset, + 0, +}; +#endif /* LIBXML_SAX1_ENABLED */ + +/** + * xmlDefaultSAXLocator: + * + * The default SAX Locator + * { getPublicId, getSystemId, getLineNumber, getColumnNumber} + */ +xmlSAXLocator xmlDefaultSAXLocator = { + xmlSAX2GetPublicId, + xmlSAX2GetSystemId, + xmlSAX2GetLineNumber, + xmlSAX2GetColumnNumber +}; + +#ifdef LIBXML_HTML_ENABLED +/** + * htmlDefaultSAXHandler: + * + * Default old SAX v1 handler for HTML, builds the DOM tree + */ +xmlSAXHandlerV1 htmlDefaultSAXHandler = { + xmlSAX2InternalSubset, + NULL, + NULL, + NULL, + NULL, + xmlSAX2GetEntity, + NULL, + NULL, + NULL, + NULL, + NULL, + xmlSAX2SetDocumentLocator, + xmlSAX2StartDocument, + xmlSAX2EndDocument, + xmlSAX2StartElement, + xmlSAX2EndElement, + NULL, + xmlSAX2Characters, + xmlSAX2IgnorableWhitespace, + xmlSAX2ProcessingInstruction, + xmlSAX2Comment, + xmlParserWarning, + xmlParserError, + xmlParserError, + xmlSAX2GetParameterEntity, + xmlSAX2CDataBlock, + NULL, + 0, +}; +#endif /* LIBXML_HTML_ENABLED */ + +#ifdef LIBXML_DOCB_ENABLED +/** + * docbDefaultSAXHandler: + * + * Default old SAX v1 handler for SGML DocBook, builds the DOM tree + */ +xmlSAXHandlerV1 docbDefaultSAXHandler = { + xmlSAX2InternalSubset, + xmlSAX2IsStandalone, + xmlSAX2HasInternalSubset, + xmlSAX2HasExternalSubset, + xmlSAX2ResolveEntity, + xmlSAX2GetEntity, + xmlSAX2EntityDecl, + NULL, + NULL, + NULL, + NULL, + xmlSAX2SetDocumentLocator, + xmlSAX2StartDocument, + xmlSAX2EndDocument, + xmlSAX2StartElement, + xmlSAX2EndElement, + xmlSAX2Reference, + xmlSAX2Characters, + xmlSAX2IgnorableWhitespace, + NULL, + xmlSAX2Comment, + xmlParserWarning, + xmlParserError, + xmlParserError, + xmlSAX2GetParameterEntity, + NULL, + NULL, + 0, +}; +#endif /* LIBXML_DOCB_ENABLED */ + +/** + * xmlInitializeGlobalState: + * @gs: a pointer to a newly allocated global state + * + * xmlInitializeGlobalState() initialize a global state with all the + * default values of the library. + */ +void +xmlInitializeGlobalState(xmlGlobalStatePtr gs) +{ +#ifdef DEBUG_GLOBALS + fprintf(stderr, "Initializing globals at %lu for thread %d\n", + (unsigned long) gs, xmlGetThreadId()); +#endif + + /* + * Perform initialization as required by libxml + */ + if (xmlThrDefMutex == NULL) + xmlInitGlobals(); + + xmlMutexLock(xmlThrDefMutex); + +#if defined(LIBXML_DOCB_ENABLED) && defined(LIBXML_LEGACY_ENABLED) && defined(LIBXML_SAX1_ENABLED) + initdocbDefaultSAXHandler(&gs->docbDefaultSAXHandler); +#endif +#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_LEGACY_ENABLED) && defined(LIBXML_SAX1_ENABLED) + inithtmlDefaultSAXHandler(&gs->htmlDefaultSAXHandler); +#endif + + gs->oldXMLWDcompatibility = 0; + gs->xmlBufferAllocScheme = xmlBufferAllocSchemeThrDef; + gs->xmlDefaultBufferSize = xmlDefaultBufferSizeThrDef; +#if defined(LIBXML_SAX1_ENABLED) && defined(LIBXML_LEGACY_ENABLED) + initxmlDefaultSAXHandler(&gs->xmlDefaultSAXHandler, 1); +#endif /* LIBXML_SAX1_ENABLED */ + gs->xmlDefaultSAXLocator.getPublicId = xmlSAX2GetPublicId; + gs->xmlDefaultSAXLocator.getSystemId = xmlSAX2GetSystemId; + gs->xmlDefaultSAXLocator.getLineNumber = xmlSAX2GetLineNumber; + gs->xmlDefaultSAXLocator.getColumnNumber = xmlSAX2GetColumnNumber; + gs->xmlDoValidityCheckingDefaultValue = + xmlDoValidityCheckingDefaultValueThrDef; +#if defined(DEBUG_MEMORY_LOCATION) | defined(DEBUG_MEMORY) + gs->xmlFree = (xmlFreeFunc) xmlMemFree; + gs->xmlMalloc = (xmlMallocFunc) xmlMemMalloc; + gs->xmlMallocAtomic = (xmlMallocFunc) xmlMemMalloc; + gs->xmlRealloc = (xmlReallocFunc) xmlMemRealloc; + gs->xmlMemStrdup = (xmlStrdupFunc) xmlMemoryStrdup; +#else + gs->xmlFree = (xmlFreeFunc) free; + gs->xmlMalloc = (xmlMallocFunc) malloc; + gs->xmlMallocAtomic = (xmlMallocFunc) malloc; + gs->xmlRealloc = (xmlReallocFunc) realloc; + gs->xmlMemStrdup = (xmlStrdupFunc) xmlStrdup; +#endif + gs->xmlGetWarningsDefaultValue = xmlGetWarningsDefaultValueThrDef; + gs->xmlIndentTreeOutput = xmlIndentTreeOutputThrDef; + gs->xmlTreeIndentString = xmlTreeIndentStringThrDef; + gs->xmlKeepBlanksDefaultValue = xmlKeepBlanksDefaultValueThrDef; + gs->xmlLineNumbersDefaultValue = xmlLineNumbersDefaultValueThrDef; + gs->xmlLoadExtDtdDefaultValue = xmlLoadExtDtdDefaultValueThrDef; + gs->xmlParserDebugEntities = xmlParserDebugEntitiesThrDef; + gs->xmlParserVersion = LIBXML_VERSION_STRING; + gs->xmlPedanticParserDefaultValue = xmlPedanticParserDefaultValueThrDef; + gs->xmlSaveNoEmptyTags = xmlSaveNoEmptyTagsThrDef; + gs->xmlSubstituteEntitiesDefaultValue = + xmlSubstituteEntitiesDefaultValueThrDef; + + gs->xmlGenericError = xmlGenericErrorThrDef; + gs->xmlStructuredError = xmlStructuredErrorThrDef; + gs->xmlGenericErrorContext = xmlGenericErrorContextThrDef; + gs->xmlStructuredErrorContext = xmlStructuredErrorContextThrDef; + gs->xmlRegisterNodeDefaultValue = xmlRegisterNodeDefaultValueThrDef; + gs->xmlDeregisterNodeDefaultValue = xmlDeregisterNodeDefaultValueThrDef; + + gs->xmlParserInputBufferCreateFilenameValue = xmlParserInputBufferCreateFilenameValueThrDef; + gs->xmlOutputBufferCreateFilenameValue = xmlOutputBufferCreateFilenameValueThrDef; + memset(&gs->xmlLastError, 0, sizeof(xmlError)); + + xmlMutexUnlock(xmlThrDefMutex); +} + +/** + * DOC_DISABLE : we ignore missing doc for the xmlThrDef functions, + * those are really internal work + */ +void +xmlThrDefSetGenericErrorFunc(void *ctx, xmlGenericErrorFunc handler) { + xmlMutexLock(xmlThrDefMutex); + xmlGenericErrorContextThrDef = ctx; + if (handler != NULL) + xmlGenericErrorThrDef = handler; + else + xmlGenericErrorThrDef = xmlGenericErrorDefaultFunc; + xmlMutexUnlock(xmlThrDefMutex); +} + +void +xmlThrDefSetStructuredErrorFunc(void *ctx, xmlStructuredErrorFunc handler) { + xmlMutexLock(xmlThrDefMutex); + xmlStructuredErrorContextThrDef = ctx; + xmlStructuredErrorThrDef = handler; + xmlMutexUnlock(xmlThrDefMutex); +} + +/** + * xmlRegisterNodeDefault: + * @func: function pointer to the new RegisterNodeFunc + * + * Registers a callback for node creation + * + * Returns the old value of the registration function + */ +xmlRegisterNodeFunc +xmlRegisterNodeDefault(xmlRegisterNodeFunc func) +{ + xmlRegisterNodeFunc old = xmlRegisterNodeDefaultValue; + + __xmlRegisterCallbacks = 1; + xmlRegisterNodeDefaultValue = func; + return(old); +} + +xmlRegisterNodeFunc +xmlThrDefRegisterNodeDefault(xmlRegisterNodeFunc func) +{ + xmlRegisterNodeFunc old; + + xmlMutexLock(xmlThrDefMutex); + old = xmlRegisterNodeDefaultValueThrDef; + + __xmlRegisterCallbacks = 1; + xmlRegisterNodeDefaultValueThrDef = func; + xmlMutexUnlock(xmlThrDefMutex); + + return(old); +} + +/** + * xmlDeregisterNodeDefault: + * @func: function pointer to the new DeregisterNodeFunc + * + * Registers a callback for node destruction + * + * Returns the previous value of the deregistration function + */ +xmlDeregisterNodeFunc +xmlDeregisterNodeDefault(xmlDeregisterNodeFunc func) +{ + xmlDeregisterNodeFunc old = xmlDeregisterNodeDefaultValue; + + __xmlRegisterCallbacks = 1; + xmlDeregisterNodeDefaultValue = func; + return(old); +} + +xmlDeregisterNodeFunc +xmlThrDefDeregisterNodeDefault(xmlDeregisterNodeFunc func) +{ + xmlDeregisterNodeFunc old; + + xmlMutexLock(xmlThrDefMutex); + old = xmlDeregisterNodeDefaultValueThrDef; + + __xmlRegisterCallbacks = 1; + xmlDeregisterNodeDefaultValueThrDef = func; + xmlMutexUnlock(xmlThrDefMutex); + + return(old); +} + +xmlParserInputBufferCreateFilenameFunc +xmlThrDefParserInputBufferCreateFilenameDefault(xmlParserInputBufferCreateFilenameFunc func) +{ + xmlParserInputBufferCreateFilenameFunc old; + + xmlMutexLock(xmlThrDefMutex); + old = xmlParserInputBufferCreateFilenameValueThrDef; + if (old == NULL) { + old = __xmlParserInputBufferCreateFilename; + } + + xmlParserInputBufferCreateFilenameValueThrDef = func; + xmlMutexUnlock(xmlThrDefMutex); + + return(old); +} + +xmlOutputBufferCreateFilenameFunc +xmlThrDefOutputBufferCreateFilenameDefault(xmlOutputBufferCreateFilenameFunc func) +{ + xmlOutputBufferCreateFilenameFunc old; + + xmlMutexLock(xmlThrDefMutex); + old = xmlOutputBufferCreateFilenameValueThrDef; +#ifdef LIBXML_OUTPUT_ENABLED + if (old == NULL) { + old = __xmlOutputBufferCreateFilename; + } +#endif + xmlOutputBufferCreateFilenameValueThrDef = func; + xmlMutexUnlock(xmlThrDefMutex); + + return(old); +} + +#ifdef LIBXML_DOCB_ENABLED +#undef docbDefaultSAXHandler +xmlSAXHandlerV1 * +__docbDefaultSAXHandler(void) { + if (IS_MAIN_THREAD) + return (&docbDefaultSAXHandler); + else + return (&xmlGetGlobalState()->docbDefaultSAXHandler); +} +#endif + +#ifdef LIBXML_HTML_ENABLED +#undef htmlDefaultSAXHandler +xmlSAXHandlerV1 * +__htmlDefaultSAXHandler(void) { + if (IS_MAIN_THREAD) + return (&htmlDefaultSAXHandler); + else + return (&xmlGetGlobalState()->htmlDefaultSAXHandler); +} +#endif + +#undef xmlLastError +xmlError * +__xmlLastError(void) { + if (IS_MAIN_THREAD) + return (&xmlLastError); + else + return (&xmlGetGlobalState()->xmlLastError); +} + +/* + * The following memory routines were apparently lost at some point, + * and were re-inserted at this point on June 10, 2004. Hope it's + * the right place for them :-) + */ +#if defined(LIBXML_THREAD_ALLOC_ENABLED) && defined(LIBXML_THREAD_ENABLED) +#undef xmlMalloc +xmlMallocFunc * +__xmlMalloc(void){ + if (IS_MAIN_THREAD) + return (&xmlMalloc); + else + return (&xmlGetGlobalState()->xmlMalloc); +} + +#undef xmlMallocAtomic +xmlMallocFunc * +__xmlMallocAtomic(void){ + if (IS_MAIN_THREAD) + return (&xmlMallocAtomic); + else + return (&xmlGetGlobalState()->xmlMallocAtomic); +} + +#undef xmlRealloc +xmlReallocFunc * +__xmlRealloc(void){ + if (IS_MAIN_THREAD) + return (&xmlRealloc); + else + return (&xmlGetGlobalState()->xmlRealloc); +} + +#undef xmlFree +xmlFreeFunc * +__xmlFree(void){ + if (IS_MAIN_THREAD) + return (&xmlFree); + else + return (&xmlGetGlobalState()->xmlFree); +} + +xmlStrdupFunc * +__xmlMemStrdup(void){ + if (IS_MAIN_THREAD) + return (&xmlMemStrdup); + else + return (&xmlGetGlobalState()->xmlMemStrdup); +} + +#endif + +/* + * Everything starting from the line below is + * Automatically generated by build_glob.py. + * Do not modify the previous line. + */ + + +#undef oldXMLWDcompatibility +int * +__oldXMLWDcompatibility(void) { + if (IS_MAIN_THREAD) + return (&oldXMLWDcompatibility); + else + return (&xmlGetGlobalState()->oldXMLWDcompatibility); +} + +#undef xmlBufferAllocScheme +xmlBufferAllocationScheme * +__xmlBufferAllocScheme(void) { + if (IS_MAIN_THREAD) + return (&xmlBufferAllocScheme); + else + return (&xmlGetGlobalState()->xmlBufferAllocScheme); +} +xmlBufferAllocationScheme xmlThrDefBufferAllocScheme(xmlBufferAllocationScheme v) { + xmlBufferAllocationScheme ret; + xmlMutexLock(xmlThrDefMutex); + ret = xmlBufferAllocSchemeThrDef; + xmlBufferAllocSchemeThrDef = v; + xmlMutexUnlock(xmlThrDefMutex); + return ret; +} + +#undef xmlDefaultBufferSize +int * +__xmlDefaultBufferSize(void) { + if (IS_MAIN_THREAD) + return (&xmlDefaultBufferSize); + else + return (&xmlGetGlobalState()->xmlDefaultBufferSize); +} +int xmlThrDefDefaultBufferSize(int v) { + int ret; + xmlMutexLock(xmlThrDefMutex); + ret = xmlDefaultBufferSizeThrDef; + xmlDefaultBufferSizeThrDef = v; + xmlMutexUnlock(xmlThrDefMutex); + return ret; +} + +#ifdef LIBXML_SAX1_ENABLED +#undef xmlDefaultSAXHandler +xmlSAXHandlerV1 * +__xmlDefaultSAXHandler(void) { + if (IS_MAIN_THREAD) + return (&xmlDefaultSAXHandler); + else + return (&xmlGetGlobalState()->xmlDefaultSAXHandler); +} +#endif /* LIBXML_SAX1_ENABLED */ + +#undef xmlDefaultSAXLocator +xmlSAXLocator * +__xmlDefaultSAXLocator(void) { + if (IS_MAIN_THREAD) + return (&xmlDefaultSAXLocator); + else + return (&xmlGetGlobalState()->xmlDefaultSAXLocator); +} + +#undef xmlDoValidityCheckingDefaultValue +int * +__xmlDoValidityCheckingDefaultValue(void) { + if (IS_MAIN_THREAD) + return (&xmlDoValidityCheckingDefaultValue); + else + return (&xmlGetGlobalState()->xmlDoValidityCheckingDefaultValue); +} +int xmlThrDefDoValidityCheckingDefaultValue(int v) { + int ret; + xmlMutexLock(xmlThrDefMutex); + ret = xmlDoValidityCheckingDefaultValueThrDef; + xmlDoValidityCheckingDefaultValueThrDef = v; + xmlMutexUnlock(xmlThrDefMutex); + return ret; +} + +#undef xmlGenericError +xmlGenericErrorFunc * +__xmlGenericError(void) { + if (IS_MAIN_THREAD) + return (&xmlGenericError); + else + return (&xmlGetGlobalState()->xmlGenericError); +} + +#undef xmlStructuredError +xmlStructuredErrorFunc * +__xmlStructuredError(void) { + if (IS_MAIN_THREAD) + return (&xmlStructuredError); + else + return (&xmlGetGlobalState()->xmlStructuredError); +} + +#undef xmlGenericErrorContext +void * * +__xmlGenericErrorContext(void) { + if (IS_MAIN_THREAD) + return (&xmlGenericErrorContext); + else + return (&xmlGetGlobalState()->xmlGenericErrorContext); +} + +#undef xmlStructuredErrorContext +void * * +__xmlStructuredErrorContext(void) { + if (IS_MAIN_THREAD) + return (&xmlStructuredErrorContext); + else + return (&xmlGetGlobalState()->xmlStructuredErrorContext); +} + +#undef xmlGetWarningsDefaultValue +int * +__xmlGetWarningsDefaultValue(void) { + if (IS_MAIN_THREAD) + return (&xmlGetWarningsDefaultValue); + else + return (&xmlGetGlobalState()->xmlGetWarningsDefaultValue); +} +int xmlThrDefGetWarningsDefaultValue(int v) { + int ret; + xmlMutexLock(xmlThrDefMutex); + ret = xmlGetWarningsDefaultValueThrDef; + xmlGetWarningsDefaultValueThrDef = v; + xmlMutexUnlock(xmlThrDefMutex); + return ret; +} + +#undef xmlIndentTreeOutput +int * +__xmlIndentTreeOutput(void) { + if (IS_MAIN_THREAD) + return (&xmlIndentTreeOutput); + else + return (&xmlGetGlobalState()->xmlIndentTreeOutput); +} +int xmlThrDefIndentTreeOutput(int v) { + int ret; + xmlMutexLock(xmlThrDefMutex); + ret = xmlIndentTreeOutputThrDef; + xmlIndentTreeOutputThrDef = v; + xmlMutexUnlock(xmlThrDefMutex); + return ret; +} + +#undef xmlTreeIndentString +const char * * +__xmlTreeIndentString(void) { + if (IS_MAIN_THREAD) + return (&xmlTreeIndentString); + else + return (&xmlGetGlobalState()->xmlTreeIndentString); +} +const char * xmlThrDefTreeIndentString(const char * v) { + const char * ret; + xmlMutexLock(xmlThrDefMutex); + ret = xmlTreeIndentStringThrDef; + xmlTreeIndentStringThrDef = v; + xmlMutexUnlock(xmlThrDefMutex); + return ret; +} + +#undef xmlKeepBlanksDefaultValue +int * +__xmlKeepBlanksDefaultValue(void) { + if (IS_MAIN_THREAD) + return (&xmlKeepBlanksDefaultValue); + else + return (&xmlGetGlobalState()->xmlKeepBlanksDefaultValue); +} +int xmlThrDefKeepBlanksDefaultValue(int v) { + int ret; + xmlMutexLock(xmlThrDefMutex); + ret = xmlKeepBlanksDefaultValueThrDef; + xmlKeepBlanksDefaultValueThrDef = v; + xmlMutexUnlock(xmlThrDefMutex); + return ret; +} + +#undef xmlLineNumbersDefaultValue +int * +__xmlLineNumbersDefaultValue(void) { + if (IS_MAIN_THREAD) + return (&xmlLineNumbersDefaultValue); + else + return (&xmlGetGlobalState()->xmlLineNumbersDefaultValue); +} +int xmlThrDefLineNumbersDefaultValue(int v) { + int ret; + xmlMutexLock(xmlThrDefMutex); + ret = xmlLineNumbersDefaultValueThrDef; + xmlLineNumbersDefaultValueThrDef = v; + xmlMutexUnlock(xmlThrDefMutex); + return ret; +} + +#undef xmlLoadExtDtdDefaultValue +int * +__xmlLoadExtDtdDefaultValue(void) { + if (IS_MAIN_THREAD) + return (&xmlLoadExtDtdDefaultValue); + else + return (&xmlGetGlobalState()->xmlLoadExtDtdDefaultValue); +} +int xmlThrDefLoadExtDtdDefaultValue(int v) { + int ret; + xmlMutexLock(xmlThrDefMutex); + ret = xmlLoadExtDtdDefaultValueThrDef; + xmlLoadExtDtdDefaultValueThrDef = v; + xmlMutexUnlock(xmlThrDefMutex); + return ret; +} + +#undef xmlParserDebugEntities +int * +__xmlParserDebugEntities(void) { + if (IS_MAIN_THREAD) + return (&xmlParserDebugEntities); + else + return (&xmlGetGlobalState()->xmlParserDebugEntities); +} +int xmlThrDefParserDebugEntities(int v) { + int ret; + xmlMutexLock(xmlThrDefMutex); + ret = xmlParserDebugEntitiesThrDef; + xmlParserDebugEntitiesThrDef = v; + xmlMutexUnlock(xmlThrDefMutex); + return ret; +} + +#undef xmlParserVersion +const char * * +__xmlParserVersion(void) { + if (IS_MAIN_THREAD) + return (&xmlParserVersion); + else + return (&xmlGetGlobalState()->xmlParserVersion); +} + +#undef xmlPedanticParserDefaultValue +int * +__xmlPedanticParserDefaultValue(void) { + if (IS_MAIN_THREAD) + return (&xmlPedanticParserDefaultValue); + else + return (&xmlGetGlobalState()->xmlPedanticParserDefaultValue); +} +int xmlThrDefPedanticParserDefaultValue(int v) { + int ret; + xmlMutexLock(xmlThrDefMutex); + ret = xmlPedanticParserDefaultValueThrDef; + xmlPedanticParserDefaultValueThrDef = v; + xmlMutexUnlock(xmlThrDefMutex); + return ret; +} + +#undef xmlSaveNoEmptyTags +int * +__xmlSaveNoEmptyTags(void) { + if (IS_MAIN_THREAD) + return (&xmlSaveNoEmptyTags); + else + return (&xmlGetGlobalState()->xmlSaveNoEmptyTags); +} +int xmlThrDefSaveNoEmptyTags(int v) { + int ret; + xmlMutexLock(xmlThrDefMutex); + ret = xmlSaveNoEmptyTagsThrDef; + xmlSaveNoEmptyTagsThrDef = v; + xmlMutexUnlock(xmlThrDefMutex); + return ret; +} + +#undef xmlSubstituteEntitiesDefaultValue +int * +__xmlSubstituteEntitiesDefaultValue(void) { + if (IS_MAIN_THREAD) + return (&xmlSubstituteEntitiesDefaultValue); + else + return (&xmlGetGlobalState()->xmlSubstituteEntitiesDefaultValue); +} +int xmlThrDefSubstituteEntitiesDefaultValue(int v) { + int ret; + xmlMutexLock(xmlThrDefMutex); + ret = xmlSubstituteEntitiesDefaultValueThrDef; + xmlSubstituteEntitiesDefaultValueThrDef = v; + xmlMutexUnlock(xmlThrDefMutex); + return ret; +} + +#undef xmlRegisterNodeDefaultValue +xmlRegisterNodeFunc * +__xmlRegisterNodeDefaultValue(void) { + if (IS_MAIN_THREAD) + return (&xmlRegisterNodeDefaultValue); + else + return (&xmlGetGlobalState()->xmlRegisterNodeDefaultValue); +} + +#undef xmlDeregisterNodeDefaultValue +xmlDeregisterNodeFunc * +__xmlDeregisterNodeDefaultValue(void) { + if (IS_MAIN_THREAD) + return (&xmlDeregisterNodeDefaultValue); + else + return (&xmlGetGlobalState()->xmlDeregisterNodeDefaultValue); +} + +#undef xmlParserInputBufferCreateFilenameValue +xmlParserInputBufferCreateFilenameFunc * +__xmlParserInputBufferCreateFilenameValue(void) { + if (IS_MAIN_THREAD) + return (&xmlParserInputBufferCreateFilenameValue); + else + return (&xmlGetGlobalState()->xmlParserInputBufferCreateFilenameValue); +} + +#undef xmlOutputBufferCreateFilenameValue +xmlOutputBufferCreateFilenameFunc * +__xmlOutputBufferCreateFilenameValue(void) { + if (IS_MAIN_THREAD) + return (&xmlOutputBufferCreateFilenameValue); + else + return (&xmlGetGlobalState()->xmlOutputBufferCreateFilenameValue); +} + +#define bottom_globals +#include "elfgcchack.h" diff --git a/vendors/libxml/src/hash.c b/vendors/libxml/src/hash.c new file mode 100644 index 0000000..0145109 --- /dev/null +++ b/vendors/libxml/src/hash.c @@ -0,0 +1,1121 @@ +/* + * hash.c: chained hash tables + * + * Reference: Your favorite introductory book on algorithms + * + * Copyright (C) 2000,2012 Bjorn Reese and Daniel Veillard. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF + * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND + * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. + * + * Author: breese@users.sourceforge.net + */ + +#define IN_LIBXML +#include "libxml.h" + +#include +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_TIME_H +#include +#endif + +/* + * Following http://www.ocert.org/advisories/ocert-2011-003.html + * it seems that having hash randomization might be a good idea + * when using XML with untrusted data + */ +#if defined(HAVE_RAND) && defined(HAVE_SRAND) && defined(HAVE_TIME) +#define HASH_RANDOMIZATION +#endif + +#include +#include +#include +#include +#include + +#define MAX_HASH_LEN 8 + +/* #define DEBUG_GROW */ + +/* + * A single entry in the hash table + */ +typedef struct _xmlHashEntry xmlHashEntry; +typedef xmlHashEntry *xmlHashEntryPtr; +struct _xmlHashEntry { + struct _xmlHashEntry *next; + xmlChar *name; + xmlChar *name2; + xmlChar *name3; + void *payload; + int valid; +}; + +/* + * The entire hash table + */ +struct _xmlHashTable { + struct _xmlHashEntry *table; + int size; + int nbElems; + xmlDictPtr dict; +#ifdef HASH_RANDOMIZATION + int random_seed; +#endif +}; + +/* + * xmlHashComputeKey: + * Calculate the hash key + */ +static unsigned long +xmlHashComputeKey(xmlHashTablePtr table, const xmlChar *name, + const xmlChar *name2, const xmlChar *name3) { + unsigned long value = 0L; + char ch; + +#ifdef HASH_RANDOMIZATION + value = table->random_seed; +#endif + if (name != NULL) { + value += 30 * (*name); + while ((ch = *name++) != 0) { + value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch); + } + } + value = value ^ ((value << 5) + (value >> 3)); + if (name2 != NULL) { + while ((ch = *name2++) != 0) { + value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch); + } + } + value = value ^ ((value << 5) + (value >> 3)); + if (name3 != NULL) { + while ((ch = *name3++) != 0) { + value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch); + } + } + return (value % table->size); +} + +static unsigned long +xmlHashComputeQKey(xmlHashTablePtr table, + const xmlChar *prefix, const xmlChar *name, + const xmlChar *prefix2, const xmlChar *name2, + const xmlChar *prefix3, const xmlChar *name3) { + unsigned long value = 0L; + char ch; + +#ifdef HASH_RANDOMIZATION + value = table->random_seed; +#endif + if (prefix != NULL) + value += 30 * (*prefix); + else + value += 30 * (*name); + + if (prefix != NULL) { + while ((ch = *prefix++) != 0) { + value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch); + } + value = value ^ ((value << 5) + (value >> 3) + (unsigned long)':'); + } + if (name != NULL) { + while ((ch = *name++) != 0) { + value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch); + } + } + value = value ^ ((value << 5) + (value >> 3)); + if (prefix2 != NULL) { + while ((ch = *prefix2++) != 0) { + value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch); + } + value = value ^ ((value << 5) + (value >> 3) + (unsigned long)':'); + } + if (name2 != NULL) { + while ((ch = *name2++) != 0) { + value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch); + } + } + value = value ^ ((value << 5) + (value >> 3)); + if (prefix3 != NULL) { + while ((ch = *prefix3++) != 0) { + value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch); + } + value = value ^ ((value << 5) + (value >> 3) + (unsigned long)':'); + } + if (name3 != NULL) { + while ((ch = *name3++) != 0) { + value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch); + } + } + return (value % table->size); +} + +/** + * xmlHashCreate: + * @size: the size of the hash table + * + * Create a new xmlHashTablePtr. + * + * Returns the newly created object, or NULL if an error occured. + */ +xmlHashTablePtr +xmlHashCreate(int size) { + xmlHashTablePtr table; + + if (size <= 0) + size = 256; + + table = xmlMalloc(sizeof(xmlHashTable)); + if (table) { + table->dict = NULL; + table->size = size; + table->nbElems = 0; + table->table = xmlMalloc(size * sizeof(xmlHashEntry)); + if (table->table) { + memset(table->table, 0, size * sizeof(xmlHashEntry)); +#ifdef HASH_RANDOMIZATION + table->random_seed = __xmlRandom(); +#endif + return(table); + } + xmlFree(table); + } + return(NULL); +} + +/** + * xmlHashCreateDict: + * @size: the size of the hash table + * @dict: a dictionary to use for the hash + * + * Create a new xmlHashTablePtr which will use @dict as the internal dictionary + * + * Returns the newly created object, or NULL if an error occured. + */ +xmlHashTablePtr +xmlHashCreateDict(int size, xmlDictPtr dict) { + xmlHashTablePtr table; + + table = xmlHashCreate(size); + if (table != NULL) { + table->dict = dict; + xmlDictReference(dict); + } + return(table); +} + +/** + * xmlHashGrow: + * @table: the hash table + * @size: the new size of the hash table + * + * resize the hash table + * + * Returns 0 in case of success, -1 in case of failure + */ +static int +xmlHashGrow(xmlHashTablePtr table, int size) { + unsigned long key; + int oldsize, i; + xmlHashEntryPtr iter, next; + struct _xmlHashEntry *oldtable; +#ifdef DEBUG_GROW + unsigned long nbElem = 0; +#endif + + if (table == NULL) + return(-1); + if (size < 8) + return(-1); + if (size > 8 * 2048) + return(-1); + + oldsize = table->size; + oldtable = table->table; + if (oldtable == NULL) + return(-1); + + table->table = xmlMalloc(size * sizeof(xmlHashEntry)); + if (table->table == NULL) { + table->table = oldtable; + return(-1); + } + memset(table->table, 0, size * sizeof(xmlHashEntry)); + table->size = size; + + /* If the two loops are merged, there would be situations where + a new entry needs to allocated and data copied into it from + the main table. So instead, we run through the array twice, first + copying all the elements in the main array (where we can't get + conflicts) and then the rest, so we only free (and don't allocate) + */ + for (i = 0; i < oldsize; i++) { + if (oldtable[i].valid == 0) + continue; + key = xmlHashComputeKey(table, oldtable[i].name, oldtable[i].name2, + oldtable[i].name3); + memcpy(&(table->table[key]), &(oldtable[i]), sizeof(xmlHashEntry)); + table->table[key].next = NULL; + } + + for (i = 0; i < oldsize; i++) { + iter = oldtable[i].next; + while (iter) { + next = iter->next; + + /* + * put back the entry in the new table + */ + + key = xmlHashComputeKey(table, iter->name, iter->name2, + iter->name3); + if (table->table[key].valid == 0) { + memcpy(&(table->table[key]), iter, sizeof(xmlHashEntry)); + table->table[key].next = NULL; + xmlFree(iter); + } else { + iter->next = table->table[key].next; + table->table[key].next = iter; + } + +#ifdef DEBUG_GROW + nbElem++; +#endif + + iter = next; + } + } + + xmlFree(oldtable); + +#ifdef DEBUG_GROW + xmlGenericError(xmlGenericErrorContext, + "xmlHashGrow : from %d to %d, %d elems\n", oldsize, size, nbElem); +#endif + + return(0); +} + +/** + * xmlHashFree: + * @table: the hash table + * @f: the deallocator function for items in the hash + * + * Free the hash @table and its contents. The userdata is + * deallocated with @f if provided. + */ +void +xmlHashFree(xmlHashTablePtr table, xmlHashDeallocator f) { + int i; + xmlHashEntryPtr iter; + xmlHashEntryPtr next; + int inside_table = 0; + int nbElems; + + if (table == NULL) + return; + if (table->table) { + nbElems = table->nbElems; + for(i = 0; (i < table->size) && (nbElems > 0); i++) { + iter = &(table->table[i]); + if (iter->valid == 0) + continue; + inside_table = 1; + while (iter) { + next = iter->next; + if ((f != NULL) && (iter->payload != NULL)) + f(iter->payload, iter->name); + if (table->dict == NULL) { + if (iter->name) + xmlFree(iter->name); + if (iter->name2) + xmlFree(iter->name2); + if (iter->name3) + xmlFree(iter->name3); + } + iter->payload = NULL; + if (!inside_table) + xmlFree(iter); + nbElems--; + inside_table = 0; + iter = next; + } + } + xmlFree(table->table); + } + if (table->dict) + xmlDictFree(table->dict); + xmlFree(table); +} + +/** + * xmlHashAddEntry: + * @table: the hash table + * @name: the name of the userdata + * @userdata: a pointer to the userdata + * + * Add the @userdata to the hash @table. This can later be retrieved + * by using the @name. Duplicate names generate errors. + * + * Returns 0 the addition succeeded and -1 in case of error. + */ +int +xmlHashAddEntry(xmlHashTablePtr table, const xmlChar *name, void *userdata) { + return(xmlHashAddEntry3(table, name, NULL, NULL, userdata)); +} + +/** + * xmlHashAddEntry2: + * @table: the hash table + * @name: the name of the userdata + * @name2: a second name of the userdata + * @userdata: a pointer to the userdata + * + * Add the @userdata to the hash @table. This can later be retrieved + * by using the (@name, @name2) tuple. Duplicate tuples generate errors. + * + * Returns 0 the addition succeeded and -1 in case of error. + */ +int +xmlHashAddEntry2(xmlHashTablePtr table, const xmlChar *name, + const xmlChar *name2, void *userdata) { + return(xmlHashAddEntry3(table, name, name2, NULL, userdata)); +} + +/** + * xmlHashUpdateEntry: + * @table: the hash table + * @name: the name of the userdata + * @userdata: a pointer to the userdata + * @f: the deallocator function for replaced item (if any) + * + * Add the @userdata to the hash @table. This can later be retrieved + * by using the @name. Existing entry for this @name will be removed + * and freed with @f if found. + * + * Returns 0 the addition succeeded and -1 in case of error. + */ +int +xmlHashUpdateEntry(xmlHashTablePtr table, const xmlChar *name, + void *userdata, xmlHashDeallocator f) { + return(xmlHashUpdateEntry3(table, name, NULL, NULL, userdata, f)); +} + +/** + * xmlHashUpdateEntry2: + * @table: the hash table + * @name: the name of the userdata + * @name2: a second name of the userdata + * @userdata: a pointer to the userdata + * @f: the deallocator function for replaced item (if any) + * + * Add the @userdata to the hash @table. This can later be retrieved + * by using the (@name, @name2) tuple. Existing entry for this tuple will + * be removed and freed with @f if found. + * + * Returns 0 the addition succeeded and -1 in case of error. + */ +int +xmlHashUpdateEntry2(xmlHashTablePtr table, const xmlChar *name, + const xmlChar *name2, void *userdata, + xmlHashDeallocator f) { + return(xmlHashUpdateEntry3(table, name, name2, NULL, userdata, f)); +} + +/** + * xmlHashLookup: + * @table: the hash table + * @name: the name of the userdata + * + * Find the userdata specified by the @name. + * + * Returns the pointer to the userdata + */ +void * +xmlHashLookup(xmlHashTablePtr table, const xmlChar *name) { + return(xmlHashLookup3(table, name, NULL, NULL)); +} + +/** + * xmlHashLookup2: + * @table: the hash table + * @name: the name of the userdata + * @name2: a second name of the userdata + * + * Find the userdata specified by the (@name, @name2) tuple. + * + * Returns the pointer to the userdata + */ +void * +xmlHashLookup2(xmlHashTablePtr table, const xmlChar *name, + const xmlChar *name2) { + return(xmlHashLookup3(table, name, name2, NULL)); +} + +/** + * xmlHashQLookup: + * @table: the hash table + * @prefix: the prefix of the userdata + * @name: the name of the userdata + * + * Find the userdata specified by the QName @prefix:@name/@name. + * + * Returns the pointer to the userdata + */ +void * +xmlHashQLookup(xmlHashTablePtr table, const xmlChar *prefix, + const xmlChar *name) { + return(xmlHashQLookup3(table, prefix, name, NULL, NULL, NULL, NULL)); +} + +/** + * xmlHashQLookup2: + * @table: the hash table + * @prefix: the prefix of the userdata + * @name: the name of the userdata + * @prefix2: the second prefix of the userdata + * @name2: a second name of the userdata + * + * Find the userdata specified by the QNames tuple + * + * Returns the pointer to the userdata + */ +void * +xmlHashQLookup2(xmlHashTablePtr table, const xmlChar *prefix, + const xmlChar *name, const xmlChar *prefix2, + const xmlChar *name2) { + return(xmlHashQLookup3(table, prefix, name, prefix2, name2, NULL, NULL)); +} + +/** + * xmlHashAddEntry3: + * @table: the hash table + * @name: the name of the userdata + * @name2: a second name of the userdata + * @name3: a third name of the userdata + * @userdata: a pointer to the userdata + * + * Add the @userdata to the hash @table. This can later be retrieved + * by using the tuple (@name, @name2, @name3). Duplicate entries generate + * errors. + * + * Returns 0 the addition succeeded and -1 in case of error. + */ +int +xmlHashAddEntry3(xmlHashTablePtr table, const xmlChar *name, + const xmlChar *name2, const xmlChar *name3, + void *userdata) { + unsigned long key, len = 0; + xmlHashEntryPtr entry; + xmlHashEntryPtr insert; + + if ((table == NULL) || (name == NULL)) + return(-1); + + /* + * If using a dict internalize if needed + */ + if (table->dict) { + if (!xmlDictOwns(table->dict, name)) { + name = xmlDictLookup(table->dict, name, -1); + if (name == NULL) + return(-1); + } + if ((name2 != NULL) && (!xmlDictOwns(table->dict, name2))) { + name2 = xmlDictLookup(table->dict, name2, -1); + if (name2 == NULL) + return(-1); + } + if ((name3 != NULL) && (!xmlDictOwns(table->dict, name3))) { + name3 = xmlDictLookup(table->dict, name3, -1); + if (name3 == NULL) + return(-1); + } + } + + /* + * Check for duplicate and insertion location. + */ + key = xmlHashComputeKey(table, name, name2, name3); + if (table->table[key].valid == 0) { + insert = NULL; + } else { + if (table->dict) { + for (insert = &(table->table[key]); insert->next != NULL; + insert = insert->next) { + if ((insert->name == name) && + (insert->name2 == name2) && + (insert->name3 == name3)) + return(-1); + len++; + } + if ((insert->name == name) && + (insert->name2 == name2) && + (insert->name3 == name3)) + return(-1); + } else { + for (insert = &(table->table[key]); insert->next != NULL; + insert = insert->next) { + if ((xmlStrEqual(insert->name, name)) && + (xmlStrEqual(insert->name2, name2)) && + (xmlStrEqual(insert->name3, name3))) + return(-1); + len++; + } + if ((xmlStrEqual(insert->name, name)) && + (xmlStrEqual(insert->name2, name2)) && + (xmlStrEqual(insert->name3, name3))) + return(-1); + } + } + + if (insert == NULL) { + entry = &(table->table[key]); + } else { + entry = xmlMalloc(sizeof(xmlHashEntry)); + if (entry == NULL) + return(-1); + } + + if (table->dict != NULL) { + entry->name = (xmlChar *) name; + entry->name2 = (xmlChar *) name2; + entry->name3 = (xmlChar *) name3; + } else { + entry->name = xmlStrdup(name); + entry->name2 = xmlStrdup(name2); + entry->name3 = xmlStrdup(name3); + } + entry->payload = userdata; + entry->next = NULL; + entry->valid = 1; + + + if (insert != NULL) + insert->next = entry; + + table->nbElems++; + + if (len > MAX_HASH_LEN) + xmlHashGrow(table, MAX_HASH_LEN * table->size); + + return(0); +} + +/** + * xmlHashUpdateEntry3: + * @table: the hash table + * @name: the name of the userdata + * @name2: a second name of the userdata + * @name3: a third name of the userdata + * @userdata: a pointer to the userdata + * @f: the deallocator function for replaced item (if any) + * + * Add the @userdata to the hash @table. This can later be retrieved + * by using the tuple (@name, @name2, @name3). Existing entry for this tuple + * will be removed and freed with @f if found. + * + * Returns 0 the addition succeeded and -1 in case of error. + */ +int +xmlHashUpdateEntry3(xmlHashTablePtr table, const xmlChar *name, + const xmlChar *name2, const xmlChar *name3, + void *userdata, xmlHashDeallocator f) { + unsigned long key; + xmlHashEntryPtr entry; + xmlHashEntryPtr insert; + + if ((table == NULL) || name == NULL) + return(-1); + + /* + * If using a dict internalize if needed + */ + if (table->dict) { + if (!xmlDictOwns(table->dict, name)) { + name = xmlDictLookup(table->dict, name, -1); + if (name == NULL) + return(-1); + } + if ((name2 != NULL) && (!xmlDictOwns(table->dict, name2))) { + name2 = xmlDictLookup(table->dict, name2, -1); + if (name2 == NULL) + return(-1); + } + if ((name3 != NULL) && (!xmlDictOwns(table->dict, name3))) { + name3 = xmlDictLookup(table->dict, name3, -1); + if (name3 == NULL) + return(-1); + } + } + + /* + * Check for duplicate and insertion location. + */ + key = xmlHashComputeKey(table, name, name2, name3); + if (table->table[key].valid == 0) { + insert = NULL; + } else { + if (table ->dict) { + for (insert = &(table->table[key]); insert->next != NULL; + insert = insert->next) { + if ((insert->name == name) && + (insert->name2 == name2) && + (insert->name3 == name3)) { + if (f) + f(insert->payload, insert->name); + insert->payload = userdata; + return(0); + } + } + if ((insert->name == name) && + (insert->name2 == name2) && + (insert->name3 == name3)) { + if (f) + f(insert->payload, insert->name); + insert->payload = userdata; + return(0); + } + } else { + for (insert = &(table->table[key]); insert->next != NULL; + insert = insert->next) { + if ((xmlStrEqual(insert->name, name)) && + (xmlStrEqual(insert->name2, name2)) && + (xmlStrEqual(insert->name3, name3))) { + if (f) + f(insert->payload, insert->name); + insert->payload = userdata; + return(0); + } + } + if ((xmlStrEqual(insert->name, name)) && + (xmlStrEqual(insert->name2, name2)) && + (xmlStrEqual(insert->name3, name3))) { + if (f) + f(insert->payload, insert->name); + insert->payload = userdata; + return(0); + } + } + } + + if (insert == NULL) { + entry = &(table->table[key]); + } else { + entry = xmlMalloc(sizeof(xmlHashEntry)); + if (entry == NULL) + return(-1); + } + + if (table->dict != NULL) { + entry->name = (xmlChar *) name; + entry->name2 = (xmlChar *) name2; + entry->name3 = (xmlChar *) name3; + } else { + entry->name = xmlStrdup(name); + entry->name2 = xmlStrdup(name2); + entry->name3 = xmlStrdup(name3); + } + entry->payload = userdata; + entry->next = NULL; + entry->valid = 1; + table->nbElems++; + + + if (insert != NULL) { + insert->next = entry; + } + return(0); +} + +/** + * xmlHashLookup3: + * @table: the hash table + * @name: the name of the userdata + * @name2: a second name of the userdata + * @name3: a third name of the userdata + * + * Find the userdata specified by the (@name, @name2, @name3) tuple. + * + * Returns the a pointer to the userdata + */ +void * +xmlHashLookup3(xmlHashTablePtr table, const xmlChar *name, + const xmlChar *name2, const xmlChar *name3) { + unsigned long key; + xmlHashEntryPtr entry; + + if (table == NULL) + return(NULL); + if (name == NULL) + return(NULL); + key = xmlHashComputeKey(table, name, name2, name3); + if (table->table[key].valid == 0) + return(NULL); + if (table->dict) { + for (entry = &(table->table[key]); entry != NULL; entry = entry->next) { + if ((entry->name == name) && + (entry->name2 == name2) && + (entry->name3 == name3)) + return(entry->payload); + } + } + for (entry = &(table->table[key]); entry != NULL; entry = entry->next) { + if ((xmlStrEqual(entry->name, name)) && + (xmlStrEqual(entry->name2, name2)) && + (xmlStrEqual(entry->name3, name3))) + return(entry->payload); + } + return(NULL); +} + +/** + * xmlHashQLookup3: + * @table: the hash table + * @prefix: the prefix of the userdata + * @name: the name of the userdata + * @prefix2: the second prefix of the userdata + * @name2: a second name of the userdata + * @prefix3: the third prefix of the userdata + * @name3: a third name of the userdata + * + * Find the userdata specified by the (@name, @name2, @name3) tuple. + * + * Returns the a pointer to the userdata + */ +void * +xmlHashQLookup3(xmlHashTablePtr table, + const xmlChar *prefix, const xmlChar *name, + const xmlChar *prefix2, const xmlChar *name2, + const xmlChar *prefix3, const xmlChar *name3) { + unsigned long key; + xmlHashEntryPtr entry; + + if (table == NULL) + return(NULL); + if (name == NULL) + return(NULL); + key = xmlHashComputeQKey(table, prefix, name, prefix2, + name2, prefix3, name3); + if (table->table[key].valid == 0) + return(NULL); + for (entry = &(table->table[key]); entry != NULL; entry = entry->next) { + if ((xmlStrQEqual(prefix, name, entry->name)) && + (xmlStrQEqual(prefix2, name2, entry->name2)) && + (xmlStrQEqual(prefix3, name3, entry->name3))) + return(entry->payload); + } + return(NULL); +} + +typedef struct { + xmlHashScanner hashscanner; + void *data; +} stubData; + +static void +stubHashScannerFull (void *payload, void *data, const xmlChar *name, + const xmlChar *name2 ATTRIBUTE_UNUSED, + const xmlChar *name3 ATTRIBUTE_UNUSED) { + stubData *stubdata = (stubData *) data; + stubdata->hashscanner (payload, stubdata->data, (xmlChar *) name); +} + +/** + * xmlHashScan: + * @table: the hash table + * @f: the scanner function for items in the hash + * @data: extra data passed to f + * + * Scan the hash @table and applied @f to each value. + */ +void +xmlHashScan(xmlHashTablePtr table, xmlHashScanner f, void *data) { + stubData stubdata; + stubdata.data = data; + stubdata.hashscanner = f; + xmlHashScanFull (table, stubHashScannerFull, &stubdata); +} + +/** + * xmlHashScanFull: + * @table: the hash table + * @f: the scanner function for items in the hash + * @data: extra data passed to f + * + * Scan the hash @table and applied @f to each value. + */ +void +xmlHashScanFull(xmlHashTablePtr table, xmlHashScannerFull f, void *data) { + int i, nb; + xmlHashEntryPtr iter; + xmlHashEntryPtr next; + + if (table == NULL) + return; + if (f == NULL) + return; + + if (table->table) { + for(i = 0; i < table->size; i++) { + if (table->table[i].valid == 0) + continue; + iter = &(table->table[i]); + while (iter) { + next = iter->next; + nb = table->nbElems; + if ((f != NULL) && (iter->payload != NULL)) + f(iter->payload, data, iter->name, + iter->name2, iter->name3); + if (nb != table->nbElems) { + /* table was modified by the callback, be careful */ + if (iter == &(table->table[i])) { + if (table->table[i].valid == 0) + iter = NULL; + if (table->table[i].next != next) + iter = &(table->table[i]); + } else + iter = next; + } else + iter = next; + } + } + } +} + +/** + * xmlHashScan3: + * @table: the hash table + * @name: the name of the userdata or NULL + * @name2: a second name of the userdata or NULL + * @name3: a third name of the userdata or NULL + * @f: the scanner function for items in the hash + * @data: extra data passed to f + * + * Scan the hash @table and applied @f to each value matching + * (@name, @name2, @name3) tuple. If one of the names is null, + * the comparison is considered to match. + */ +void +xmlHashScan3(xmlHashTablePtr table, const xmlChar *name, + const xmlChar *name2, const xmlChar *name3, + xmlHashScanner f, void *data) { + xmlHashScanFull3 (table, name, name2, name3, + (xmlHashScannerFull) f, data); +} + +/** + * xmlHashScanFull3: + * @table: the hash table + * @name: the name of the userdata or NULL + * @name2: a second name of the userdata or NULL + * @name3: a third name of the userdata or NULL + * @f: the scanner function for items in the hash + * @data: extra data passed to f + * + * Scan the hash @table and applied @f to each value matching + * (@name, @name2, @name3) tuple. If one of the names is null, + * the comparison is considered to match. + */ +void +xmlHashScanFull3(xmlHashTablePtr table, const xmlChar *name, + const xmlChar *name2, const xmlChar *name3, + xmlHashScannerFull f, void *data) { + int i; + xmlHashEntryPtr iter; + xmlHashEntryPtr next; + + if (table == NULL) + return; + if (f == NULL) + return; + + if (table->table) { + for(i = 0; i < table->size; i++) { + if (table->table[i].valid == 0) + continue; + iter = &(table->table[i]); + while (iter) { + next = iter->next; + if (((name == NULL) || (xmlStrEqual(name, iter->name))) && + ((name2 == NULL) || (xmlStrEqual(name2, iter->name2))) && + ((name3 == NULL) || (xmlStrEqual(name3, iter->name3))) && + (iter->payload != NULL)) { + f(iter->payload, data, iter->name, + iter->name2, iter->name3); + } + iter = next; + } + } + } +} + +/** + * xmlHashCopy: + * @table: the hash table + * @f: the copier function for items in the hash + * + * Scan the hash @table and applied @f to each value. + * + * Returns the new table or NULL in case of error. + */ +xmlHashTablePtr +xmlHashCopy(xmlHashTablePtr table, xmlHashCopier f) { + int i; + xmlHashEntryPtr iter; + xmlHashEntryPtr next; + xmlHashTablePtr ret; + + if (table == NULL) + return(NULL); + if (f == NULL) + return(NULL); + + ret = xmlHashCreate(table->size); + if (table->table) { + for(i = 0; i < table->size; i++) { + if (table->table[i].valid == 0) + continue; + iter = &(table->table[i]); + while (iter) { + next = iter->next; + xmlHashAddEntry3(ret, iter->name, iter->name2, + iter->name3, f(iter->payload, iter->name)); + iter = next; + } + } + } + ret->nbElems = table->nbElems; + return(ret); +} + +/** + * xmlHashSize: + * @table: the hash table + * + * Query the number of elements installed in the hash @table. + * + * Returns the number of elements in the hash table or + * -1 in case of error + */ +int +xmlHashSize(xmlHashTablePtr table) { + if (table == NULL) + return(-1); + return(table->nbElems); +} + +/** + * xmlHashRemoveEntry: + * @table: the hash table + * @name: the name of the userdata + * @f: the deallocator function for removed item (if any) + * + * Find the userdata specified by the @name and remove + * it from the hash @table. Existing userdata for this tuple will be removed + * and freed with @f. + * + * Returns 0 if the removal succeeded and -1 in case of error or not found. + */ +int xmlHashRemoveEntry(xmlHashTablePtr table, const xmlChar *name, + xmlHashDeallocator f) { + return(xmlHashRemoveEntry3(table, name, NULL, NULL, f)); +} + +/** + * xmlHashRemoveEntry2: + * @table: the hash table + * @name: the name of the userdata + * @name2: a second name of the userdata + * @f: the deallocator function for removed item (if any) + * + * Find the userdata specified by the (@name, @name2) tuple and remove + * it from the hash @table. Existing userdata for this tuple will be removed + * and freed with @f. + * + * Returns 0 if the removal succeeded and -1 in case of error or not found. + */ +int +xmlHashRemoveEntry2(xmlHashTablePtr table, const xmlChar *name, + const xmlChar *name2, xmlHashDeallocator f) { + return(xmlHashRemoveEntry3(table, name, name2, NULL, f)); +} + +/** + * xmlHashRemoveEntry3: + * @table: the hash table + * @name: the name of the userdata + * @name2: a second name of the userdata + * @name3: a third name of the userdata + * @f: the deallocator function for removed item (if any) + * + * Find the userdata specified by the (@name, @name2, @name3) tuple and remove + * it from the hash @table. Existing userdata for this tuple will be removed + * and freed with @f. + * + * Returns 0 if the removal succeeded and -1 in case of error or not found. + */ +int +xmlHashRemoveEntry3(xmlHashTablePtr table, const xmlChar *name, + const xmlChar *name2, const xmlChar *name3, xmlHashDeallocator f) { + unsigned long key; + xmlHashEntryPtr entry; + xmlHashEntryPtr prev = NULL; + + if (table == NULL || name == NULL) + return(-1); + + key = xmlHashComputeKey(table, name, name2, name3); + if (table->table[key].valid == 0) { + return(-1); + } else { + for (entry = &(table->table[key]); entry != NULL; entry = entry->next) { + if (xmlStrEqual(entry->name, name) && + xmlStrEqual(entry->name2, name2) && + xmlStrEqual(entry->name3, name3)) { + if ((f != NULL) && (entry->payload != NULL)) + f(entry->payload, entry->name); + entry->payload = NULL; + if (table->dict == NULL) { + if(entry->name) + xmlFree(entry->name); + if(entry->name2) + xmlFree(entry->name2); + if(entry->name3) + xmlFree(entry->name3); + } + if(prev) { + prev->next = entry->next; + xmlFree(entry); + } else { + if (entry->next == NULL) { + entry->valid = 0; + } else { + entry = entry->next; + memcpy(&(table->table[key]), entry, sizeof(xmlHashEntry)); + xmlFree(entry); + } + } + table->nbElems--; + return(0); + } + prev = entry; + } + return(-1); + } +} + +#define bottom_hash +#include "elfgcchack.h" diff --git a/vendors/libxml/src/legacy.c b/vendors/libxml/src/legacy.c new file mode 100644 index 0000000..e941cb0 --- /dev/null +++ b/vendors/libxml/src/legacy.c @@ -0,0 +1,1343 @@ +/* + * legacy.c: set of deprecated routines, not to be used anymore but + * kept purely for ABI compatibility + * + * See Copyright for the status of this software. + * + * daniel@veillard.com + */ + +#define IN_LIBXML +#include "libxml.h" + +#ifdef LIBXML_LEGACY_ENABLED +#include + +#include +#include +#include +#include +#include + +void xmlUpgradeOldNs(xmlDocPtr doc); + +/************************************************************************ + * * + * Deprecated functions kept for compatibility * + * * + ************************************************************************/ + +#ifdef LIBXML_HTML_ENABLED +xmlChar *htmlDecodeEntities(htmlParserCtxtPtr ctxt, int len, xmlChar end, + xmlChar end2, xmlChar end3); + +/** + * htmlDecodeEntities: + * @ctxt: the parser context + * @len: the len to decode (in bytes !), -1 for no size limit + * @end: an end marker xmlChar, 0 if none + * @end2: an end marker xmlChar, 0 if none + * @end3: an end marker xmlChar, 0 if none + * + * Substitute the HTML entities by their value + * + * DEPRECATED !!!! + * + * Returns A newly allocated string with the substitution done. The caller + * must deallocate it ! + */ +xmlChar * +htmlDecodeEntities(htmlParserCtxtPtr ctxt ATTRIBUTE_UNUSED, + int len ATTRIBUTE_UNUSED, xmlChar end ATTRIBUTE_UNUSED, + xmlChar end2 ATTRIBUTE_UNUSED, + xmlChar end3 ATTRIBUTE_UNUSED) +{ + static int deprecated = 0; + + if (!deprecated) { + xmlGenericError(xmlGenericErrorContext, + "htmlDecodeEntities() deprecated function reached\n"); + deprecated = 1; + } + return (NULL); +} +#endif + +/** + * xmlInitializePredefinedEntities: + * + * Set up the predefined entities. + * Deprecated call + */ +void +xmlInitializePredefinedEntities(void) +{ +} + +/** + * xmlCleanupPredefinedEntities: + * + * Cleanup up the predefined entities table. + * Deprecated call + */ +void +xmlCleanupPredefinedEntities(void) +{ +} + +static const char *xmlFeaturesList[] = { + "validate", + "load subset", + "keep blanks", + "disable SAX", + "fetch external entities", + "substitute entities", + "gather line info", + "user data", + "is html", + "is standalone", + "stop parser", + "document", + "is well formed", + "is valid", + "SAX block", + "SAX function internalSubset", + "SAX function isStandalone", + "SAX function hasInternalSubset", + "SAX function hasExternalSubset", + "SAX function resolveEntity", + "SAX function getEntity", + "SAX function entityDecl", + "SAX function notationDecl", + "SAX function attributeDecl", + "SAX function elementDecl", + "SAX function unparsedEntityDecl", + "SAX function setDocumentLocator", + "SAX function startDocument", + "SAX function endDocument", + "SAX function startElement", + "SAX function endElement", + "SAX function reference", + "SAX function characters", + "SAX function ignorableWhitespace", + "SAX function processingInstruction", + "SAX function comment", + "SAX function warning", + "SAX function error", + "SAX function fatalError", + "SAX function getParameterEntity", + "SAX function cdataBlock", + "SAX function externalSubset", +}; + +/** + * xmlGetFeaturesList: + * @len: the length of the features name array (input/output) + * @result: an array of string to be filled with the features name. + * + * Copy at most *@len feature names into the @result array + * + * Returns -1 in case or error, or the total number of features, + * len is updated with the number of strings copied, + * strings must not be deallocated + */ +int +xmlGetFeaturesList(int *len, const char **result) +{ + int ret, i; + + ret = sizeof(xmlFeaturesList) / sizeof(xmlFeaturesList[0]); + if ((len == NULL) || (result == NULL)) + return (ret); + if ((*len < 0) || (*len >= 1000)) + return (-1); + if (*len > ret) + *len = ret; + for (i = 0; i < *len; i++) + result[i] = xmlFeaturesList[i]; + return (ret); +} + +/** + * xmlGetFeature: + * @ctxt: an XML/HTML parser context + * @name: the feature name + * @result: location to store the result + * + * Read the current value of one feature of this parser instance + * + * Returns -1 in case or error, 0 otherwise + */ +int +xmlGetFeature(xmlParserCtxtPtr ctxt, const char *name, void *result) +{ + if ((ctxt == NULL) || (name == NULL) || (result == NULL)) + return (-1); + + if (!strcmp(name, "validate")) { + *((int *) result) = ctxt->validate; + } else if (!strcmp(name, "keep blanks")) { + *((int *) result) = ctxt->keepBlanks; + } else if (!strcmp(name, "disable SAX")) { + *((int *) result) = ctxt->disableSAX; + } else if (!strcmp(name, "fetch external entities")) { + *((int *) result) = ctxt->loadsubset; + } else if (!strcmp(name, "substitute entities")) { + *((int *) result) = ctxt->replaceEntities; + } else if (!strcmp(name, "gather line info")) { + *((int *) result) = ctxt->record_info; + } else if (!strcmp(name, "user data")) { + *((void **) result) = ctxt->userData; + } else if (!strcmp(name, "is html")) { + *((int *) result) = ctxt->html; + } else if (!strcmp(name, "is standalone")) { + *((int *) result) = ctxt->standalone; + } else if (!strcmp(name, "document")) { + *((xmlDocPtr *) result) = ctxt->myDoc; + } else if (!strcmp(name, "is well formed")) { + *((int *) result) = ctxt->wellFormed; + } else if (!strcmp(name, "is valid")) { + *((int *) result) = ctxt->valid; + } else if (!strcmp(name, "SAX block")) { + *((xmlSAXHandlerPtr *) result) = ctxt->sax; + } else if (!strcmp(name, "SAX function internalSubset")) { + *((internalSubsetSAXFunc *) result) = ctxt->sax->internalSubset; + } else if (!strcmp(name, "SAX function isStandalone")) { + *((isStandaloneSAXFunc *) result) = ctxt->sax->isStandalone; + } else if (!strcmp(name, "SAX function hasInternalSubset")) { + *((hasInternalSubsetSAXFunc *) result) = + ctxt->sax->hasInternalSubset; + } else if (!strcmp(name, "SAX function hasExternalSubset")) { + *((hasExternalSubsetSAXFunc *) result) = + ctxt->sax->hasExternalSubset; + } else if (!strcmp(name, "SAX function resolveEntity")) { + *((resolveEntitySAXFunc *) result) = ctxt->sax->resolveEntity; + } else if (!strcmp(name, "SAX function getEntity")) { + *((getEntitySAXFunc *) result) = ctxt->sax->getEntity; + } else if (!strcmp(name, "SAX function entityDecl")) { + *((entityDeclSAXFunc *) result) = ctxt->sax->entityDecl; + } else if (!strcmp(name, "SAX function notationDecl")) { + *((notationDeclSAXFunc *) result) = ctxt->sax->notationDecl; + } else if (!strcmp(name, "SAX function attributeDecl")) { + *((attributeDeclSAXFunc *) result) = ctxt->sax->attributeDecl; + } else if (!strcmp(name, "SAX function elementDecl")) { + *((elementDeclSAXFunc *) result) = ctxt->sax->elementDecl; + } else if (!strcmp(name, "SAX function unparsedEntityDecl")) { + *((unparsedEntityDeclSAXFunc *) result) = + ctxt->sax->unparsedEntityDecl; + } else if (!strcmp(name, "SAX function setDocumentLocator")) { + *((setDocumentLocatorSAXFunc *) result) = + ctxt->sax->setDocumentLocator; + } else if (!strcmp(name, "SAX function startDocument")) { + *((startDocumentSAXFunc *) result) = ctxt->sax->startDocument; + } else if (!strcmp(name, "SAX function endDocument")) { + *((endDocumentSAXFunc *) result) = ctxt->sax->endDocument; + } else if (!strcmp(name, "SAX function startElement")) { + *((startElementSAXFunc *) result) = ctxt->sax->startElement; + } else if (!strcmp(name, "SAX function endElement")) { + *((endElementSAXFunc *) result) = ctxt->sax->endElement; + } else if (!strcmp(name, "SAX function reference")) { + *((referenceSAXFunc *) result) = ctxt->sax->reference; + } else if (!strcmp(name, "SAX function characters")) { + *((charactersSAXFunc *) result) = ctxt->sax->characters; + } else if (!strcmp(name, "SAX function ignorableWhitespace")) { + *((ignorableWhitespaceSAXFunc *) result) = + ctxt->sax->ignorableWhitespace; + } else if (!strcmp(name, "SAX function processingInstruction")) { + *((processingInstructionSAXFunc *) result) = + ctxt->sax->processingInstruction; + } else if (!strcmp(name, "SAX function comment")) { + *((commentSAXFunc *) result) = ctxt->sax->comment; + } else if (!strcmp(name, "SAX function warning")) { + *((warningSAXFunc *) result) = ctxt->sax->warning; + } else if (!strcmp(name, "SAX function error")) { + *((errorSAXFunc *) result) = ctxt->sax->error; + } else if (!strcmp(name, "SAX function fatalError")) { + *((fatalErrorSAXFunc *) result) = ctxt->sax->fatalError; + } else if (!strcmp(name, "SAX function getParameterEntity")) { + *((getParameterEntitySAXFunc *) result) = + ctxt->sax->getParameterEntity; + } else if (!strcmp(name, "SAX function cdataBlock")) { + *((cdataBlockSAXFunc *) result) = ctxt->sax->cdataBlock; + } else if (!strcmp(name, "SAX function externalSubset")) { + *((externalSubsetSAXFunc *) result) = ctxt->sax->externalSubset; + } else { + return (-1); + } + return (0); +} + +/** + * xmlSetFeature: + * @ctxt: an XML/HTML parser context + * @name: the feature name + * @value: pointer to the location of the new value + * + * Change the current value of one feature of this parser instance + * + * Returns -1 in case or error, 0 otherwise + */ +int +xmlSetFeature(xmlParserCtxtPtr ctxt, const char *name, void *value) +{ + if ((ctxt == NULL) || (name == NULL) || (value == NULL)) + return (-1); + + if (!strcmp(name, "validate")) { + int newvalidate = *((int *) value); + + if ((!ctxt->validate) && (newvalidate != 0)) { + if (ctxt->vctxt.warning == NULL) + ctxt->vctxt.warning = xmlParserValidityWarning; + if (ctxt->vctxt.error == NULL) + ctxt->vctxt.error = xmlParserValidityError; + ctxt->vctxt.nodeMax = 0; + } + ctxt->validate = newvalidate; + } else if (!strcmp(name, "keep blanks")) { + ctxt->keepBlanks = *((int *) value); + } else if (!strcmp(name, "disable SAX")) { + ctxt->disableSAX = *((int *) value); + } else if (!strcmp(name, "fetch external entities")) { + ctxt->loadsubset = *((int *) value); + } else if (!strcmp(name, "substitute entities")) { + ctxt->replaceEntities = *((int *) value); + } else if (!strcmp(name, "gather line info")) { + ctxt->record_info = *((int *) value); + } else if (!strcmp(name, "user data")) { + ctxt->userData = *((void **) value); + } else if (!strcmp(name, "is html")) { + ctxt->html = *((int *) value); + } else if (!strcmp(name, "is standalone")) { + ctxt->standalone = *((int *) value); + } else if (!strcmp(name, "document")) { + ctxt->myDoc = *((xmlDocPtr *) value); + } else if (!strcmp(name, "is well formed")) { + ctxt->wellFormed = *((int *) value); + } else if (!strcmp(name, "is valid")) { + ctxt->valid = *((int *) value); + } else if (!strcmp(name, "SAX block")) { + ctxt->sax = *((xmlSAXHandlerPtr *) value); + } else if (!strcmp(name, "SAX function internalSubset")) { + ctxt->sax->internalSubset = *((internalSubsetSAXFunc *) value); + } else if (!strcmp(name, "SAX function isStandalone")) { + ctxt->sax->isStandalone = *((isStandaloneSAXFunc *) value); + } else if (!strcmp(name, "SAX function hasInternalSubset")) { + ctxt->sax->hasInternalSubset = + *((hasInternalSubsetSAXFunc *) value); + } else if (!strcmp(name, "SAX function hasExternalSubset")) { + ctxt->sax->hasExternalSubset = + *((hasExternalSubsetSAXFunc *) value); + } else if (!strcmp(name, "SAX function resolveEntity")) { + ctxt->sax->resolveEntity = *((resolveEntitySAXFunc *) value); + } else if (!strcmp(name, "SAX function getEntity")) { + ctxt->sax->getEntity = *((getEntitySAXFunc *) value); + } else if (!strcmp(name, "SAX function entityDecl")) { + ctxt->sax->entityDecl = *((entityDeclSAXFunc *) value); + } else if (!strcmp(name, "SAX function notationDecl")) { + ctxt->sax->notationDecl = *((notationDeclSAXFunc *) value); + } else if (!strcmp(name, "SAX function attributeDecl")) { + ctxt->sax->attributeDecl = *((attributeDeclSAXFunc *) value); + } else if (!strcmp(name, "SAX function elementDecl")) { + ctxt->sax->elementDecl = *((elementDeclSAXFunc *) value); + } else if (!strcmp(name, "SAX function unparsedEntityDecl")) { + ctxt->sax->unparsedEntityDecl = + *((unparsedEntityDeclSAXFunc *) value); + } else if (!strcmp(name, "SAX function setDocumentLocator")) { + ctxt->sax->setDocumentLocator = + *((setDocumentLocatorSAXFunc *) value); + } else if (!strcmp(name, "SAX function startDocument")) { + ctxt->sax->startDocument = *((startDocumentSAXFunc *) value); + } else if (!strcmp(name, "SAX function endDocument")) { + ctxt->sax->endDocument = *((endDocumentSAXFunc *) value); + } else if (!strcmp(name, "SAX function startElement")) { + ctxt->sax->startElement = *((startElementSAXFunc *) value); + } else if (!strcmp(name, "SAX function endElement")) { + ctxt->sax->endElement = *((endElementSAXFunc *) value); + } else if (!strcmp(name, "SAX function reference")) { + ctxt->sax->reference = *((referenceSAXFunc *) value); + } else if (!strcmp(name, "SAX function characters")) { + ctxt->sax->characters = *((charactersSAXFunc *) value); + } else if (!strcmp(name, "SAX function ignorableWhitespace")) { + ctxt->sax->ignorableWhitespace = + *((ignorableWhitespaceSAXFunc *) value); + } else if (!strcmp(name, "SAX function processingInstruction")) { + ctxt->sax->processingInstruction = + *((processingInstructionSAXFunc *) value); + } else if (!strcmp(name, "SAX function comment")) { + ctxt->sax->comment = *((commentSAXFunc *) value); + } else if (!strcmp(name, "SAX function warning")) { + ctxt->sax->warning = *((warningSAXFunc *) value); + } else if (!strcmp(name, "SAX function error")) { + ctxt->sax->error = *((errorSAXFunc *) value); + } else if (!strcmp(name, "SAX function fatalError")) { + ctxt->sax->fatalError = *((fatalErrorSAXFunc *) value); + } else if (!strcmp(name, "SAX function getParameterEntity")) { + ctxt->sax->getParameterEntity = + *((getParameterEntitySAXFunc *) value); + } else if (!strcmp(name, "SAX function cdataBlock")) { + ctxt->sax->cdataBlock = *((cdataBlockSAXFunc *) value); + } else if (!strcmp(name, "SAX function externalSubset")) { + ctxt->sax->externalSubset = *((externalSubsetSAXFunc *) value); + } else { + return (-1); + } + return (0); +} + +/** + * xmlDecodeEntities: + * @ctxt: the parser context + * @len: the len to decode (in bytes !), -1 for no size limit + * @what: combination of XML_SUBSTITUTE_REF and XML_SUBSTITUTE_PEREF + * @end: an end marker xmlChar, 0 if none + * @end2: an end marker xmlChar, 0 if none + * @end3: an end marker xmlChar, 0 if none + * + * This function is deprecated, we now always process entities content + * through xmlStringDecodeEntities + * + * TODO: remove it in next major release. + * + * [67] Reference ::= EntityRef | CharRef + * + * [69] PEReference ::= '%' Name ';' + * + * Returns A newly allocated string with the substitution done. The caller + * must deallocate it ! + */ +xmlChar * +xmlDecodeEntities(xmlParserCtxtPtr ctxt ATTRIBUTE_UNUSED, + int len ATTRIBUTE_UNUSED, int what ATTRIBUTE_UNUSED, + xmlChar end ATTRIBUTE_UNUSED, + xmlChar end2 ATTRIBUTE_UNUSED, + xmlChar end3 ATTRIBUTE_UNUSED) +{ + static int deprecated = 0; + + if (!deprecated) { + xmlGenericError(xmlGenericErrorContext, + "xmlDecodeEntities() deprecated function reached\n"); + deprecated = 1; + } + return (NULL); +} + +/** + * xmlNamespaceParseNCName: + * @ctxt: an XML parser context + * + * parse an XML namespace name. + * + * TODO: this seems not in use anymore, the namespace handling is done on + * top of the SAX interfaces, i.e. not on raw input. + * + * [NS 3] NCName ::= (Letter | '_') (NCNameChar)* + * + * [NS 4] NCNameChar ::= Letter | Digit | '.' | '-' | '_' | + * CombiningChar | Extender + * + * Returns the namespace name or NULL + */ + +xmlChar * +xmlNamespaceParseNCName(xmlParserCtxtPtr ctxt ATTRIBUTE_UNUSED) +{ + static int deprecated = 0; + + if (!deprecated) { + xmlGenericError(xmlGenericErrorContext, + "xmlNamespaceParseNCName() deprecated function reached\n"); + deprecated = 1; + } + return (NULL); +} + +/** + * xmlNamespaceParseQName: + * @ctxt: an XML parser context + * @prefix: a xmlChar ** + * + * TODO: this seems not in use anymore, the namespace handling is done on + * top of the SAX interfaces, i.e. not on raw input. + * + * parse an XML qualified name + * + * [NS 5] QName ::= (Prefix ':')? LocalPart + * + * [NS 6] Prefix ::= NCName + * + * [NS 7] LocalPart ::= NCName + * + * Returns the local part, and prefix is updated + * to get the Prefix if any. + */ + +xmlChar * +xmlNamespaceParseQName(xmlParserCtxtPtr ctxt ATTRIBUTE_UNUSED, + xmlChar ** prefix ATTRIBUTE_UNUSED) +{ + + static int deprecated = 0; + + if (!deprecated) { + xmlGenericError(xmlGenericErrorContext, + "xmlNamespaceParseQName() deprecated function reached\n"); + deprecated = 1; + } + return (NULL); +} + +/** + * xmlNamespaceParseNSDef: + * @ctxt: an XML parser context + * + * parse a namespace prefix declaration + * + * TODO: this seems not in use anymore, the namespace handling is done on + * top of the SAX interfaces, i.e. not on raw input. + * + * [NS 1] NSDef ::= PrefixDef Eq SystemLiteral + * + * [NS 2] PrefixDef ::= 'xmlns' (':' NCName)? + * + * Returns the namespace name + */ + +xmlChar * +xmlNamespaceParseNSDef(xmlParserCtxtPtr ctxt ATTRIBUTE_UNUSED) +{ + static int deprecated = 0; + + if (!deprecated) { + xmlGenericError(xmlGenericErrorContext, + "xmlNamespaceParseNSDef() deprecated function reached\n"); + deprecated = 1; + } + return (NULL); +} + +/** + * xmlParseQuotedString: + * @ctxt: an XML parser context + * + * Parse and return a string between quotes or doublequotes + * + * TODO: Deprecated, to be removed at next drop of binary compatibility + * + * Returns the string parser or NULL. + */ +xmlChar * +xmlParseQuotedString(xmlParserCtxtPtr ctxt ATTRIBUTE_UNUSED) +{ + static int deprecated = 0; + + if (!deprecated) { + xmlGenericError(xmlGenericErrorContext, + "xmlParseQuotedString() deprecated function reached\n"); + deprecated = 1; + } + return (NULL); +} + +/** + * xmlParseNamespace: + * @ctxt: an XML parser context + * + * xmlParseNamespace: parse specific PI ' +#include +#else +/* + * Currently supported platforms use either autoconf or + * copy to config.h own "preset" configuration file. + * As result ifdef HAVE_CONFIG_H is omited here. + */ +#include "config.h" +#include +#endif + +#if defined(__Lynx__) +#include /* pull definition of size_t */ +#include +int snprintf(char *, size_t, const char *, ...); +int vfprintf(FILE *, const char *, va_list); +#endif + +#ifndef WITH_TRIO +#include +#else +/** + * TRIO_REPLACE_STDIO: + * + * This macro is defined if teh trio string formatting functions are to + * be used instead of the default stdio ones. + */ +#define TRIO_REPLACE_STDIO +#include "trio.h" +#endif + +/* + * Internal variable indicating if a callback has been registered for + * node creation/destruction. It avoids spending a lot of time in locking + * function while checking if the callback exists. + */ +extern int __xmlRegisterCallbacks; +/* + * internal error reporting routines, shared but not partof the API. + */ +void __xmlIOErr(int domain, int code, const char *extra); +void __xmlLoaderErr(void *ctx, const char *msg, const char *filename); +#ifdef LIBXML_HTML_ENABLED +/* + * internal function of HTML parser needed for xmlParseInNodeContext + * but not part of the API + */ +void __htmlParseContent(void *ctx); +#endif + +/* + * internal global initialization critical section routines. + */ +void __xmlGlobalInitMutexLock(void); +void __xmlGlobalInitMutexUnlock(void); +void __xmlGlobalInitMutexDestroy(void); + +int __xmlInitializeDict(void); + +#if defined(HAVE_RAND) && defined(HAVE_SRAND) && defined(HAVE_TIME) +/* + * internal thread safe random function + */ +int __xmlRandom(void); +#endif + +int xmlNop(void); + +#ifdef IN_LIBXML +#ifdef __GNUC__ +#ifdef PIC +#ifdef linux +#if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || (__GNUC__ > 3) +#include "elfgcchack.h" +#endif +#endif +#endif +#endif +#endif +#if !defined(PIC) && !defined(NOLIBTOOL) +# define LIBXML_STATIC +#endif +#endif /* ! __XML_LIBXML_H__ */ diff --git a/vendors/libxml2/include/libxml/DOCBparser.h b/vendors/libxml/src/libxml/DOCBparser.h similarity index 88% rename from vendors/libxml2/include/libxml/DOCBparser.h rename to vendors/libxml/src/libxml/DOCBparser.h index 461d4ee..9394fa7 100644 --- a/vendors/libxml2/include/libxml/DOCBparser.h +++ b/vendors/libxml/src/libxml/DOCBparser.h @@ -47,44 +47,44 @@ XMLPUBFUN int XMLCALL const unsigned char *in, int *inlen, int quoteChar); -XMLPUBFUN docbDocPtr XMLCALL +XMLPUBFUN docbDocPtr XMLCALL docbSAXParseDoc (xmlChar *cur, const char *encoding, docbSAXHandlerPtr sax, void *userData); -XMLPUBFUN docbDocPtr XMLCALL +XMLPUBFUN docbDocPtr XMLCALL docbParseDoc (xmlChar *cur, const char *encoding); -XMLPUBFUN docbDocPtr XMLCALL +XMLPUBFUN docbDocPtr XMLCALL docbSAXParseFile (const char *filename, const char *encoding, docbSAXHandlerPtr sax, void *userData); -XMLPUBFUN docbDocPtr XMLCALL +XMLPUBFUN docbDocPtr XMLCALL docbParseFile (const char *filename, const char *encoding); /** * Interfaces for the Push mode. */ -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL docbFreeParserCtxt (docbParserCtxtPtr ctxt); -XMLPUBFUN docbParserCtxtPtr XMLCALL +XMLPUBFUN docbParserCtxtPtr XMLCALL docbCreatePushParserCtxt(docbSAXHandlerPtr sax, void *user_data, const char *chunk, int size, const char *filename, xmlCharEncoding enc); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL docbParseChunk (docbParserCtxtPtr ctxt, const char *chunk, int size, int terminate); -XMLPUBFUN docbParserCtxtPtr XMLCALL +XMLPUBFUN docbParserCtxtPtr XMLCALL docbCreateFileParserCtxt(const char *filename, const char *encoding); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL docbParseDocument (docbParserCtxtPtr ctxt); #ifdef __cplusplus diff --git a/vendors/libxml2/include/libxml/HTMLparser.h b/vendors/libxml/src/libxml/HTMLparser.h similarity index 91% rename from vendors/libxml2/include/libxml/HTMLparser.h rename to vendors/libxml/src/libxml/HTMLparser.h index fbcc811..551186c 100644 --- a/vendors/libxml2/include/libxml/HTMLparser.h +++ b/vendors/libxml/src/libxml/HTMLparser.h @@ -83,87 +83,87 @@ struct _htmlEntityDesc { /* * There is only few public functions. */ -XMLPUBFUN const htmlElemDesc * XMLCALL +XMLPUBFUN const htmlElemDesc * XMLCALL htmlTagLookup (const xmlChar *tag); -XMLPUBFUN const htmlEntityDesc * XMLCALL +XMLPUBFUN const htmlEntityDesc * XMLCALL htmlEntityLookup(const xmlChar *name); -XMLPUBFUN const htmlEntityDesc * XMLCALL +XMLPUBFUN const htmlEntityDesc * XMLCALL htmlEntityValueLookup(unsigned int value); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL htmlIsAutoClosed(htmlDocPtr doc, htmlNodePtr elem); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL htmlAutoCloseTag(htmlDocPtr doc, const xmlChar *name, htmlNodePtr elem); -XMLPUBFUN const htmlEntityDesc * XMLCALL +XMLPUBFUN const htmlEntityDesc * XMLCALL htmlParseEntityRef(htmlParserCtxtPtr ctxt, const xmlChar **str); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL htmlParseCharRef(htmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL htmlParseElement(htmlParserCtxtPtr ctxt); -XMLPUBFUN htmlParserCtxtPtr XMLCALL +XMLPUBFUN htmlParserCtxtPtr XMLCALL htmlNewParserCtxt(void); -XMLPUBFUN htmlParserCtxtPtr XMLCALL +XMLPUBFUN htmlParserCtxtPtr XMLCALL htmlCreateMemoryParserCtxt(const char *buffer, int size); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL htmlParseDocument(htmlParserCtxtPtr ctxt); -XMLPUBFUN htmlDocPtr XMLCALL +XMLPUBFUN htmlDocPtr XMLCALL htmlSAXParseDoc (xmlChar *cur, const char *encoding, htmlSAXHandlerPtr sax, void *userData); -XMLPUBFUN htmlDocPtr XMLCALL +XMLPUBFUN htmlDocPtr XMLCALL htmlParseDoc (xmlChar *cur, const char *encoding); -XMLPUBFUN htmlDocPtr XMLCALL +XMLPUBFUN htmlDocPtr XMLCALL htmlSAXParseFile(const char *filename, const char *encoding, htmlSAXHandlerPtr sax, void *userData); -XMLPUBFUN htmlDocPtr XMLCALL +XMLPUBFUN htmlDocPtr XMLCALL htmlParseFile (const char *filename, const char *encoding); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL UTF8ToHtml (unsigned char *out, int *outlen, const unsigned char *in, int *inlen); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL htmlEncodeEntities(unsigned char *out, int *outlen, const unsigned char *in, int *inlen, int quoteChar); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL htmlIsScriptAttribute(const xmlChar *name); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL htmlHandleOmittedElem(int val); #ifdef LIBXML_PUSH_ENABLED /** * Interfaces for the Push mode. */ -XMLPUBFUN htmlParserCtxtPtr XMLCALL +XMLPUBFUN htmlParserCtxtPtr XMLCALL htmlCreatePushParserCtxt(htmlSAXHandlerPtr sax, void *user_data, const char *chunk, int size, const char *filename, xmlCharEncoding enc); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL htmlParseChunk (htmlParserCtxtPtr ctxt, const char *chunk, int size, int terminate); #endif /* LIBXML_PUSH_ENABLED */ -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL htmlFreeParserCtxt (htmlParserCtxtPtr ctxt); /* @@ -184,7 +184,8 @@ typedef enum { HTML_PARSE_NOBLANKS = 1<<8, /* remove blank nodes */ HTML_PARSE_NONET = 1<<11,/* Forbid network access */ HTML_PARSE_NOIMPLIED= 1<<13,/* Do not add implied html/body... elements */ - HTML_PARSE_COMPACT = 1<<16 /* compact small text nodes */ + HTML_PARSE_COMPACT = 1<<16,/* compact small text nodes */ + HTML_PARSE_IGNORE_ENC=1<<21 /* ignore internal document encoding hint */ } htmlParserOption; XMLPUBFUN void XMLCALL diff --git a/vendors/libxml2/include/libxml/HTMLtree.h b/vendors/libxml/src/libxml/HTMLtree.h similarity index 86% rename from vendors/libxml2/include/libxml/HTMLtree.h rename to vendors/libxml/src/libxml/HTMLtree.h index 6ea8207..c0e1103 100644 --- a/vendors/libxml2/include/libxml/HTMLtree.h +++ b/vendors/libxml/src/libxml/HTMLtree.h @@ -62,78 +62,78 @@ extern "C" { XMLPUBFUN htmlDocPtr XMLCALL htmlNewDoc (const xmlChar *URI, const xmlChar *ExternalID); -XMLPUBFUN htmlDocPtr XMLCALL +XMLPUBFUN htmlDocPtr XMLCALL htmlNewDocNoDtD (const xmlChar *URI, const xmlChar *ExternalID); -XMLPUBFUN const xmlChar * XMLCALL +XMLPUBFUN const xmlChar * XMLCALL htmlGetMetaEncoding (htmlDocPtr doc); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL htmlSetMetaEncoding (htmlDocPtr doc, const xmlChar *encoding); #ifdef LIBXML_OUTPUT_ENABLED -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL htmlDocDumpMemory (xmlDocPtr cur, xmlChar **mem, int *size); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL htmlDocDumpMemoryFormat (xmlDocPtr cur, xmlChar **mem, int *size, int format); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL htmlDocDump (FILE *f, xmlDocPtr cur); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL htmlSaveFile (const char *filename, xmlDocPtr cur); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL htmlNodeDump (xmlBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL htmlNodeDumpFile (FILE *out, xmlDocPtr doc, xmlNodePtr cur); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL htmlNodeDumpFileFormat (FILE *out, xmlDocPtr doc, xmlNodePtr cur, const char *encoding, int format); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL htmlSaveFileEnc (const char *filename, xmlDocPtr cur, const char *encoding); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL htmlSaveFileFormat (const char *filename, xmlDocPtr cur, const char *encoding, int format); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL htmlNodeDumpFormatOutput(xmlOutputBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur, const char *encoding, int format); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL htmlDocContentDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr cur, const char *encoding); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL htmlDocContentDumpFormatOutput(xmlOutputBufferPtr buf, xmlDocPtr cur, const char *encoding, int format); -XMLPUBFUN void XMLCALL - htmlNodeDumpOutput (xmlOutputBufferPtr buf, +XMLPUBFUN void XMLCALL + htmlNodeDumpOutput (xmlOutputBufferPtr buf, xmlDocPtr doc, - xmlNodePtr cur, + xmlNodePtr cur, const char *encoding); #endif /* LIBXML_OUTPUT_ENABLED */ -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL htmlIsBooleanAttr (const xmlChar *name); diff --git a/vendors/libxml2/include/libxml/SAX.h b/vendors/libxml/src/libxml/SAX.h similarity index 78% rename from vendors/libxml2/include/libxml/SAX.h rename to vendors/libxml/src/libxml/SAX.h index 0ca161b..20093ce 100644 --- a/vendors/libxml2/include/libxml/SAX.h +++ b/vendors/libxml/src/libxml/SAX.h @@ -25,53 +25,53 @@ extern "C" { #endif XMLPUBFUN const xmlChar * XMLCALL getPublicId (void *ctx); -XMLPUBFUN const xmlChar * XMLCALL +XMLPUBFUN const xmlChar * XMLCALL getSystemId (void *ctx); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL setDocumentLocator (void *ctx, xmlSAXLocatorPtr loc); - -XMLPUBFUN int XMLCALL + +XMLPUBFUN int XMLCALL getLineNumber (void *ctx); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL getColumnNumber (void *ctx); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL isStandalone (void *ctx); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL hasInternalSubset (void *ctx); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL hasExternalSubset (void *ctx); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL internalSubset (void *ctx, const xmlChar *name, const xmlChar *ExternalID, const xmlChar *SystemID); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL externalSubset (void *ctx, const xmlChar *name, const xmlChar *ExternalID, const xmlChar *SystemID); -XMLPUBFUN xmlEntityPtr XMLCALL +XMLPUBFUN xmlEntityPtr XMLCALL getEntity (void *ctx, const xmlChar *name); -XMLPUBFUN xmlEntityPtr XMLCALL +XMLPUBFUN xmlEntityPtr XMLCALL getParameterEntity (void *ctx, const xmlChar *name); -XMLPUBFUN xmlParserInputPtr XMLCALL +XMLPUBFUN xmlParserInputPtr XMLCALL resolveEntity (void *ctx, const xmlChar *publicId, const xmlChar *systemId); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL entityDecl (void *ctx, const xmlChar *name, int type, const xmlChar *publicId, const xmlChar *systemId, xmlChar *content); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL attributeDecl (void *ctx, const xmlChar *elem, const xmlChar *fullname, @@ -79,87 +79,87 @@ XMLPUBFUN void XMLCALL int def, const xmlChar *defaultValue, xmlEnumerationPtr tree); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL elementDecl (void *ctx, const xmlChar *name, int type, xmlElementContentPtr content); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL notationDecl (void *ctx, const xmlChar *name, const xmlChar *publicId, const xmlChar *systemId); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL unparsedEntityDecl (void *ctx, const xmlChar *name, const xmlChar *publicId, const xmlChar *systemId, const xmlChar *notationName); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL startDocument (void *ctx); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL endDocument (void *ctx); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL attribute (void *ctx, const xmlChar *fullname, const xmlChar *value); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL startElement (void *ctx, const xmlChar *fullname, const xmlChar **atts); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL endElement (void *ctx, const xmlChar *name); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL reference (void *ctx, const xmlChar *name); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL characters (void *ctx, const xmlChar *ch, int len); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL ignorableWhitespace (void *ctx, const xmlChar *ch, int len); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL processingInstruction (void *ctx, const xmlChar *target, const xmlChar *data); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL globalNamespace (void *ctx, const xmlChar *href, const xmlChar *prefix); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL setNamespace (void *ctx, const xmlChar *name); -XMLPUBFUN xmlNsPtr XMLCALL +XMLPUBFUN xmlNsPtr XMLCALL getNamespace (void *ctx); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL checkNamespace (void *ctx, xmlChar *nameSpace); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL namespaceDecl (void *ctx, const xmlChar *href, const xmlChar *prefix); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL comment (void *ctx, const xmlChar *value); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL cdataBlock (void *ctx, const xmlChar *value, int len); #ifdef LIBXML_SAX1_ENABLED -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL initxmlDefaultSAXHandler (xmlSAXHandlerV1 *hdlr, int warning); #ifdef LIBXML_HTML_ENABLED -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL inithtmlDefaultSAXHandler (xmlSAXHandlerV1 *hdlr); #endif #ifdef LIBXML_DOCB_ENABLED -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL initdocbDefaultSAXHandler (xmlSAXHandlerV1 *hdlr); #endif #endif /* LIBXML_SAX1_ENABLED */ diff --git a/vendors/libxml2/include/libxml/SAX2.h b/vendors/libxml/src/libxml/SAX2.h similarity index 82% rename from vendors/libxml2/include/libxml/SAX2.h rename to vendors/libxml/src/libxml/SAX2.h index 8d2db02..daafd17 100644 --- a/vendors/libxml2/include/libxml/SAX2.h +++ b/vendors/libxml/src/libxml/SAX2.h @@ -23,53 +23,53 @@ extern "C" { #endif XMLPUBFUN const xmlChar * XMLCALL xmlSAX2GetPublicId (void *ctx); -XMLPUBFUN const xmlChar * XMLCALL +XMLPUBFUN const xmlChar * XMLCALL xmlSAX2GetSystemId (void *ctx); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlSAX2SetDocumentLocator (void *ctx, xmlSAXLocatorPtr loc); - -XMLPUBFUN int XMLCALL + +XMLPUBFUN int XMLCALL xmlSAX2GetLineNumber (void *ctx); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlSAX2GetColumnNumber (void *ctx); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlSAX2IsStandalone (void *ctx); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlSAX2HasInternalSubset (void *ctx); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlSAX2HasExternalSubset (void *ctx); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlSAX2InternalSubset (void *ctx, const xmlChar *name, const xmlChar *ExternalID, const xmlChar *SystemID); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlSAX2ExternalSubset (void *ctx, const xmlChar *name, const xmlChar *ExternalID, const xmlChar *SystemID); -XMLPUBFUN xmlEntityPtr XMLCALL +XMLPUBFUN xmlEntityPtr XMLCALL xmlSAX2GetEntity (void *ctx, const xmlChar *name); -XMLPUBFUN xmlEntityPtr XMLCALL +XMLPUBFUN xmlEntityPtr XMLCALL xmlSAX2GetParameterEntity (void *ctx, const xmlChar *name); -XMLPUBFUN xmlParserInputPtr XMLCALL +XMLPUBFUN xmlParserInputPtr XMLCALL xmlSAX2ResolveEntity (void *ctx, const xmlChar *publicId, const xmlChar *systemId); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlSAX2EntityDecl (void *ctx, const xmlChar *name, int type, const xmlChar *publicId, const xmlChar *systemId, xmlChar *content); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlSAX2AttributeDecl (void *ctx, const xmlChar *elem, const xmlChar *fullname, @@ -77,33 +77,33 @@ XMLPUBFUN void XMLCALL int def, const xmlChar *defaultValue, xmlEnumerationPtr tree); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlSAX2ElementDecl (void *ctx, const xmlChar *name, int type, xmlElementContentPtr content); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlSAX2NotationDecl (void *ctx, const xmlChar *name, const xmlChar *publicId, const xmlChar *systemId); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlSAX2UnparsedEntityDecl (void *ctx, const xmlChar *name, const xmlChar *publicId, const xmlChar *systemId, const xmlChar *notationName); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlSAX2StartDocument (void *ctx); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlSAX2EndDocument (void *ctx); #if defined(LIBXML_SAX1_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBXML_WRITER_ENABLED) || defined(LIBXML_DOCB_ENABLED) -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlSAX2StartElement (void *ctx, const xmlChar *fullname, const xmlChar **atts); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlSAX2EndElement (void *ctx, const xmlChar *name); #endif /* LIBXML_SAX1_ENABLED or LIBXML_HTML_ENABLED */ @@ -122,25 +122,25 @@ XMLPUBFUN void XMLCALL const xmlChar *localname, const xmlChar *prefix, const xmlChar *URI); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlSAX2Reference (void *ctx, const xmlChar *name); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlSAX2Characters (void *ctx, const xmlChar *ch, int len); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlSAX2IgnorableWhitespace (void *ctx, const xmlChar *ch, int len); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlSAX2ProcessingInstruction (void *ctx, const xmlChar *target, const xmlChar *data); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlSAX2Comment (void *ctx, const xmlChar *value); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlSAX2CDataBlock (void *ctx, const xmlChar *value, int len); @@ -153,22 +153,22 @@ XMLPUBFUN int XMLCALL XMLPUBFUN int XMLCALL xmlSAXVersion (xmlSAXHandler *hdlr, int version); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlSAX2InitDefaultSAXHandler (xmlSAXHandler *hdlr, int warning); #ifdef LIBXML_HTML_ENABLED -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlSAX2InitHtmlDefaultSAXHandler(xmlSAXHandler *hdlr); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL htmlDefaultSAXHandlerInit (void); #endif #ifdef LIBXML_DOCB_ENABLED -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlSAX2InitDocbDefaultSAXHandler(xmlSAXHandler *hdlr); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL docbDefaultSAXHandlerInit (void); #endif -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlDefaultSAXHandlerInit (void); #ifdef __cplusplus } diff --git a/vendors/libxml2/include/libxml/c14n.h b/vendors/libxml/src/libxml/c14n.h similarity index 99% rename from vendors/libxml2/include/libxml/c14n.h rename to vendors/libxml/src/libxml/c14n.h index 3011af7..b8971d9 100644 --- a/vendors/libxml2/include/libxml/c14n.h +++ b/vendors/libxml/src/libxml/c14n.h @@ -54,7 +54,7 @@ extern "C" { /* * xmlC14NMode: - * + * * Predefined values for C14N modes * */ diff --git a/vendors/libxml2/include/libxml/catalog.h b/vendors/libxml/src/libxml/catalog.h similarity index 80% rename from vendors/libxml2/include/libxml/catalog.h rename to vendors/libxml/src/libxml/catalog.h index b444137..5a13f51 100644 --- a/vendors/libxml2/include/libxml/catalog.h +++ b/vendors/libxml/src/libxml/catalog.h @@ -68,111 +68,111 @@ typedef xmlCatalog *xmlCatalogPtr; */ XMLPUBFUN xmlCatalogPtr XMLCALL xmlNewCatalog (int sgml); -XMLPUBFUN xmlCatalogPtr XMLCALL +XMLPUBFUN xmlCatalogPtr XMLCALL xmlLoadACatalog (const char *filename); -XMLPUBFUN xmlCatalogPtr XMLCALL +XMLPUBFUN xmlCatalogPtr XMLCALL xmlLoadSGMLSuperCatalog (const char *filename); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlConvertSGMLCatalog (xmlCatalogPtr catal); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlACatalogAdd (xmlCatalogPtr catal, const xmlChar *type, const xmlChar *orig, const xmlChar *replace); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlACatalogRemove (xmlCatalogPtr catal, const xmlChar *value); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlACatalogResolve (xmlCatalogPtr catal, const xmlChar *pubID, const xmlChar *sysID); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlACatalogResolveSystem(xmlCatalogPtr catal, const xmlChar *sysID); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlACatalogResolvePublic(xmlCatalogPtr catal, const xmlChar *pubID); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlACatalogResolveURI (xmlCatalogPtr catal, const xmlChar *URI); #ifdef LIBXML_OUTPUT_ENABLED -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlACatalogDump (xmlCatalogPtr catal, FILE *out); #endif /* LIBXML_OUTPUT_ENABLED */ -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlFreeCatalog (xmlCatalogPtr catal); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlCatalogIsEmpty (xmlCatalogPtr catal); /* * Global operations. */ -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlInitializeCatalog (void); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlLoadCatalog (const char *filename); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlLoadCatalogs (const char *paths); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlCatalogCleanup (void); #ifdef LIBXML_OUTPUT_ENABLED -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlCatalogDump (FILE *out); #endif /* LIBXML_OUTPUT_ENABLED */ -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlCatalogResolve (const xmlChar *pubID, const xmlChar *sysID); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlCatalogResolveSystem (const xmlChar *sysID); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlCatalogResolvePublic (const xmlChar *pubID); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlCatalogResolveURI (const xmlChar *URI); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlCatalogAdd (const xmlChar *type, const xmlChar *orig, const xmlChar *replace); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlCatalogRemove (const xmlChar *value); -XMLPUBFUN xmlDocPtr XMLCALL +XMLPUBFUN xmlDocPtr XMLCALL xmlParseCatalogFile (const char *filename); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlCatalogConvert (void); /* * Strictly minimal interfaces for per-document catalogs used * by the parser. */ -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlCatalogFreeLocal (void *catalogs); -XMLPUBFUN void * XMLCALL +XMLPUBFUN void * XMLCALL xmlCatalogAddLocal (void *catalogs, const xmlChar *URL); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlCatalogLocalResolve (void *catalogs, const xmlChar *pubID, const xmlChar *sysID); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlCatalogLocalResolveURI(void *catalogs, const xmlChar *URI); /* * Preference settings. */ -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlCatalogSetDebug (int level); -XMLPUBFUN xmlCatalogPrefer XMLCALL +XMLPUBFUN xmlCatalogPrefer XMLCALL xmlCatalogSetDefaultPrefer(xmlCatalogPrefer prefer); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlCatalogSetDefaults (xmlCatalogAllow allow); -XMLPUBFUN xmlCatalogAllow XMLCALL +XMLPUBFUN xmlCatalogAllow XMLCALL xmlCatalogGetDefaults (void); /* DEPRECATED interfaces */ -XMLPUBFUN const xmlChar * XMLCALL +XMLPUBFUN const xmlChar * XMLCALL xmlCatalogGetSystem (const xmlChar *sysID); -XMLPUBFUN const xmlChar * XMLCALL +XMLPUBFUN const xmlChar * XMLCALL xmlCatalogGetPublic (const xmlChar *pubID); #ifdef __cplusplus diff --git a/vendors/libxml2/include/libxml/chvalid.h b/vendors/libxml/src/libxml/chvalid.h similarity index 100% rename from vendors/libxml2/include/libxml/chvalid.h rename to vendors/libxml/src/libxml/chvalid.h diff --git a/vendors/libxml2/include/libxml/debugXML.h b/vendors/libxml/src/libxml/debugXML.h similarity index 88% rename from vendors/libxml2/include/libxml/debugXML.h rename to vendors/libxml/src/libxml/debugXML.h index 5a9d20b..5b3be13 100644 --- a/vendors/libxml2/include/libxml/debugXML.h +++ b/vendors/libxml/src/libxml/debugXML.h @@ -25,18 +25,18 @@ extern "C" { /* * The standard Dump routines. */ -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlDebugDumpString (FILE *output, const xmlChar *str); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlDebugDumpAttr (FILE *output, xmlAttrPtr attr, int depth); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlDebugDumpAttrList (FILE *output, xmlAttrPtr attr, int depth); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlDebugDumpOneNode (FILE *output, xmlNodePtr node, int depth); @@ -54,16 +54,16 @@ XMLPUBFUN void XMLCALL XMLPUBFUN void XMLCALL xmlDebugDumpDocument (FILE *output, xmlDocPtr doc); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlDebugDumpDTD (FILE *output, xmlDtdPtr dtd); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlDebugDumpEntities (FILE *output, xmlDocPtr doc); /**************************************************************** * * - * Checking routines * + * Checking routines * * * ****************************************************************/ @@ -73,16 +73,16 @@ XMLPUBFUN int XMLCALL /**************************************************************** * * - * XML shell helpers * + * XML shell helpers * * * ****************************************************************/ -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlLsOneNode (FILE *output, xmlNodePtr node); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlLsCountNode (xmlNodePtr node); -XMLPUBFUN const char * XMLCALL +XMLPUBFUN const char * XMLCALL xmlBoolToText (int boolval); /**************************************************************** @@ -136,63 +136,63 @@ typedef int (* xmlShellCmd) (xmlShellCtxtPtr ctxt, xmlNodePtr node, xmlNodePtr node2); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlShellPrintXPathError (int errorType, const char *arg); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlShellPrintXPathResult(xmlXPathObjectPtr list); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlShellList (xmlShellCtxtPtr ctxt, char *arg, xmlNodePtr node, xmlNodePtr node2); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlShellBase (xmlShellCtxtPtr ctxt, char *arg, xmlNodePtr node, xmlNodePtr node2); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlShellDir (xmlShellCtxtPtr ctxt, char *arg, xmlNodePtr node, xmlNodePtr node2); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlShellLoad (xmlShellCtxtPtr ctxt, char *filename, xmlNodePtr node, xmlNodePtr node2); #ifdef LIBXML_OUTPUT_ENABLED -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlShellPrintNode (xmlNodePtr node); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlShellCat (xmlShellCtxtPtr ctxt, char *arg, xmlNodePtr node, xmlNodePtr node2); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlShellWrite (xmlShellCtxtPtr ctxt, char *filename, xmlNodePtr node, xmlNodePtr node2); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlShellSave (xmlShellCtxtPtr ctxt, char *filename, xmlNodePtr node, xmlNodePtr node2); #endif /* LIBXML_OUTPUT_ENABLED */ #ifdef LIBXML_VALID_ENABLED -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlShellValidate (xmlShellCtxtPtr ctxt, char *dtd, xmlNodePtr node, xmlNodePtr node2); #endif /* LIBXML_VALID_ENABLED */ -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlShellDu (xmlShellCtxtPtr ctxt, char *arg, xmlNodePtr tree, xmlNodePtr node2); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlShellPwd (xmlShellCtxtPtr ctxt, char *buffer, xmlNodePtr node, @@ -201,12 +201,12 @@ XMLPUBFUN int XMLCALL /* * The Shell interface. */ -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlShell (xmlDocPtr doc, char *filename, xmlShellReadlineFunc input, FILE *output); - + #endif /* LIBXML_XPATH_ENABLED */ #ifdef __cplusplus diff --git a/vendors/libxml2/include/libxml/dict.h b/vendors/libxml/src/libxml/dict.h similarity index 77% rename from vendors/libxml2/include/libxml/dict.h rename to vendors/libxml/src/libxml/dict.h index abb8339..7022ec8 100644 --- a/vendors/libxml2/include/libxml/dict.h +++ b/vendors/libxml/src/libxml/dict.h @@ -11,6 +11,7 @@ #ifndef __XML_DICT_H__ #define __XML_DICT_H__ +#include #include #include @@ -24,37 +25,47 @@ extern "C" { typedef struct _xmlDict xmlDict; typedef xmlDict *xmlDictPtr; +/* + * Initializer + */ +XMLPUBFUN int XMLCALL xmlInitializeDict(void); + /* * Constructor and destructor. */ XMLPUBFUN xmlDictPtr XMLCALL xmlDictCreate (void); +XMLPUBFUN size_t XMLCALL + xmlDictSetLimit (xmlDictPtr dict, + size_t limit); +XMLPUBFUN size_t XMLCALL + xmlDictGetUsage (xmlDictPtr dict); XMLPUBFUN xmlDictPtr XMLCALL xmlDictCreateSub(xmlDictPtr sub); XMLPUBFUN int XMLCALL xmlDictReference(xmlDictPtr dict); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlDictFree (xmlDictPtr dict); /* * Lookup of entry in the dictionnary. */ -XMLPUBFUN const xmlChar * XMLCALL +XMLPUBFUN const xmlChar * XMLCALL xmlDictLookup (xmlDictPtr dict, const xmlChar *name, int len); -XMLPUBFUN const xmlChar * XMLCALL +XMLPUBFUN const xmlChar * XMLCALL xmlDictExists (xmlDictPtr dict, const xmlChar *name, int len); -XMLPUBFUN const xmlChar * XMLCALL +XMLPUBFUN const xmlChar * XMLCALL xmlDictQLookup (xmlDictPtr dict, const xmlChar *prefix, const xmlChar *name); XMLPUBFUN int XMLCALL xmlDictOwns (xmlDictPtr dict, const xmlChar *str); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlDictSize (xmlDictPtr dict); /* diff --git a/vendors/libxml2/include/libxml/encoding.h b/vendors/libxml/src/libxml/encoding.h similarity index 94% rename from vendors/libxml2/include/libxml/encoding.h rename to vendors/libxml/src/libxml/encoding.h index 3a3b9b2..7967cc6 100644 --- a/vendors/libxml2/include/libxml/encoding.h +++ b/vendors/libxml/src/libxml/encoding.h @@ -163,32 +163,32 @@ extern "C" { /* * Interfaces for encoding handlers. */ -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlInitCharEncodingHandlers (void); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlCleanupCharEncodingHandlers (void); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlRegisterCharEncodingHandler (xmlCharEncodingHandlerPtr handler); XMLPUBFUN xmlCharEncodingHandlerPtr XMLCALL xmlGetCharEncodingHandler (xmlCharEncoding enc); XMLPUBFUN xmlCharEncodingHandlerPtr XMLCALL xmlFindCharEncodingHandler (const char *name); XMLPUBFUN xmlCharEncodingHandlerPtr XMLCALL - xmlNewCharEncodingHandler (const char *name, - xmlCharEncodingInputFunc input, - xmlCharEncodingOutputFunc output); + xmlNewCharEncodingHandler (const char *name, + xmlCharEncodingInputFunc input, + xmlCharEncodingOutputFunc output); /* * Interfaces for encoding names and aliases. */ -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlAddEncodingAlias (const char *name, const char *alias); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlDelEncodingAlias (const char *alias); XMLPUBFUN const char * XMLCALL xmlGetEncodingAlias (const char *alias); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlCleanupEncodingAliases (void); XMLPUBFUN xmlCharEncoding XMLCALL xmlParseCharEncoding (const char *name); @@ -202,12 +202,12 @@ XMLPUBFUN xmlCharEncoding XMLCALL xmlDetectCharEncoding (const unsigned char *in, int len); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlCharEncOutFunc (xmlCharEncodingHandler *handler, xmlBufferPtr out, xmlBufferPtr in); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlCharEncInFunc (xmlCharEncodingHandler *handler, xmlBufferPtr out, xmlBufferPtr in); @@ -215,20 +215,20 @@ XMLPUBFUN int XMLCALL xmlCharEncFirstLine (xmlCharEncodingHandler *handler, xmlBufferPtr out, xmlBufferPtr in); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlCharEncCloseFunc (xmlCharEncodingHandler *handler); /* * Export a few useful functions */ #ifdef LIBXML_OUTPUT_ENABLED -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL UTF8Toisolat1 (unsigned char *out, int *outlen, const unsigned char *in, int *inlen); #endif /* LIBXML_OUTPUT_ENABLED */ -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL isolat1ToUTF8 (unsigned char *out, int *outlen, const unsigned char *in, diff --git a/vendors/libxml2/include/libxml/entities.h b/vendors/libxml/src/libxml/entities.h similarity index 98% rename from vendors/libxml2/include/libxml/entities.h rename to vendors/libxml/src/libxml/entities.h index cefb97f..1e91189 100644 --- a/vendors/libxml2/include/libxml/entities.h +++ b/vendors/libxml/src/libxml/entities.h @@ -58,7 +58,8 @@ struct _xmlEntity { int owner; /* does the entity own the childrens */ int checked; /* was the entity content checked */ /* this is also used to count entites - * references done from that entity */ + * references done from that entity + * and if it contains '<' */ }; /* diff --git a/vendors/libxml2/include/libxml/globals.h b/vendors/libxml/src/libxml/globals.h similarity index 100% rename from vendors/libxml2/include/libxml/globals.h rename to vendors/libxml/src/libxml/globals.h diff --git a/vendors/libxml2/include/libxml/hash.h b/vendors/libxml/src/libxml/hash.h similarity index 90% rename from vendors/libxml2/include/libxml/hash.h rename to vendors/libxml/src/libxml/hash.h index 7fe4be7..dc8ab7e 100644 --- a/vendors/libxml2/include/libxml/hash.h +++ b/vendors/libxml/src/libxml/hash.h @@ -1,7 +1,7 @@ /* * Summary: Chained hash tables - * Description: This module implements the hash table support used in - * various places in the library. + * Description: This module implements the hash table support used in + * various places in the library. * * Copy: See Copyright for the status of this software. * @@ -108,40 +108,40 @@ XMLPUBFUN xmlHashTablePtr XMLCALL XMLPUBFUN xmlHashTablePtr XMLCALL xmlHashCreateDict(int size, xmlDictPtr dict); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlHashFree (xmlHashTablePtr table, xmlHashDeallocator f); /* * Add a new entry to the hash table. */ -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlHashAddEntry (xmlHashTablePtr table, const xmlChar *name, void *userdata); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlHashUpdateEntry(xmlHashTablePtr table, const xmlChar *name, void *userdata, xmlHashDeallocator f); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlHashAddEntry2(xmlHashTablePtr table, const xmlChar *name, const xmlChar *name2, void *userdata); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlHashUpdateEntry2(xmlHashTablePtr table, const xmlChar *name, const xmlChar *name2, void *userdata, xmlHashDeallocator f); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlHashAddEntry3(xmlHashTablePtr table, const xmlChar *name, const xmlChar *name2, const xmlChar *name3, void *userdata); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlHashUpdateEntry3(xmlHashTablePtr table, const xmlChar *name, const xmlChar *name2, @@ -152,13 +152,13 @@ XMLPUBFUN int XMLCALL /* * Remove an entry from the hash table. */ -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlHashRemoveEntry(xmlHashTablePtr table, const xmlChar *name, xmlHashDeallocator f); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlHashRemoveEntry2(xmlHashTablePtr table, const xmlChar *name, const xmlChar *name2, xmlHashDeallocator f); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlHashRemoveEntry3(xmlHashTablePtr table, const xmlChar *name, const xmlChar *name2, const xmlChar *name3, xmlHashDeallocator f); @@ -166,29 +166,29 @@ XMLPUBFUN int XMLCALL /* * Retrieve the userdata. */ -XMLPUBFUN void * XMLCALL +XMLPUBFUN void * XMLCALL xmlHashLookup (xmlHashTablePtr table, const xmlChar *name); -XMLPUBFUN void * XMLCALL +XMLPUBFUN void * XMLCALL xmlHashLookup2 (xmlHashTablePtr table, const xmlChar *name, const xmlChar *name2); -XMLPUBFUN void * XMLCALL +XMLPUBFUN void * XMLCALL xmlHashLookup3 (xmlHashTablePtr table, const xmlChar *name, const xmlChar *name2, const xmlChar *name3); -XMLPUBFUN void * XMLCALL +XMLPUBFUN void * XMLCALL xmlHashQLookup (xmlHashTablePtr table, const xmlChar *name, const xmlChar *prefix); -XMLPUBFUN void * XMLCALL +XMLPUBFUN void * XMLCALL xmlHashQLookup2 (xmlHashTablePtr table, const xmlChar *name, const xmlChar *prefix, const xmlChar *name2, const xmlChar *prefix2); -XMLPUBFUN void * XMLCALL +XMLPUBFUN void * XMLCALL xmlHashQLookup3 (xmlHashTablePtr table, const xmlChar *name, const xmlChar *prefix, @@ -200,27 +200,27 @@ XMLPUBFUN void * XMLCALL /* * Helpers. */ -XMLPUBFUN xmlHashTablePtr XMLCALL +XMLPUBFUN xmlHashTablePtr XMLCALL xmlHashCopy (xmlHashTablePtr table, xmlHashCopier f); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlHashSize (xmlHashTablePtr table); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlHashScan (xmlHashTablePtr table, xmlHashScanner f, void *data); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlHashScan3 (xmlHashTablePtr table, const xmlChar *name, const xmlChar *name2, const xmlChar *name3, xmlHashScanner f, void *data); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlHashScanFull (xmlHashTablePtr table, xmlHashScannerFull f, void *data); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlHashScanFull3(xmlHashTablePtr table, const xmlChar *name, const xmlChar *name2, diff --git a/vendors/libxml2/include/libxml/list.h b/vendors/libxml/src/libxml/list.h similarity index 79% rename from vendors/libxml2/include/libxml/list.h rename to vendors/libxml/src/libxml/list.h index 1d83482..0504e0c 100644 --- a/vendors/libxml2/include/libxml/list.h +++ b/vendors/libxml/src/libxml/list.h @@ -1,6 +1,6 @@ /* * Summary: lists interfaces - * Description: this module implement the list support used in + * Description: this module implement the list support used in * various place in the library. * * Copy: See Copyright for the status of this software. @@ -55,76 +55,76 @@ typedef int (*xmlListWalker) (const void *data, const void *user); XMLPUBFUN xmlListPtr XMLCALL xmlListCreate (xmlListDeallocator deallocator, xmlListDataCompare compare); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlListDelete (xmlListPtr l); /* Basic Operators */ -XMLPUBFUN void * XMLCALL +XMLPUBFUN void * XMLCALL xmlListSearch (xmlListPtr l, void *data); -XMLPUBFUN void * XMLCALL +XMLPUBFUN void * XMLCALL xmlListReverseSearch (xmlListPtr l, void *data); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlListInsert (xmlListPtr l, void *data) ; -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlListAppend (xmlListPtr l, void *data) ; -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlListRemoveFirst (xmlListPtr l, void *data); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlListRemoveLast (xmlListPtr l, void *data); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlListRemoveAll (xmlListPtr l, void *data); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlListClear (xmlListPtr l); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlListEmpty (xmlListPtr l); -XMLPUBFUN xmlLinkPtr XMLCALL +XMLPUBFUN xmlLinkPtr XMLCALL xmlListFront (xmlListPtr l); -XMLPUBFUN xmlLinkPtr XMLCALL +XMLPUBFUN xmlLinkPtr XMLCALL xmlListEnd (xmlListPtr l); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlListSize (xmlListPtr l); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlListPopFront (xmlListPtr l); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlListPopBack (xmlListPtr l); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlListPushFront (xmlListPtr l, void *data); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlListPushBack (xmlListPtr l, void *data); /* Advanced Operators */ -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlListReverse (xmlListPtr l); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlListSort (xmlListPtr l); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlListWalk (xmlListPtr l, xmlListWalker walker, const void *user); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlListReverseWalk (xmlListPtr l, xmlListWalker walker, const void *user); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlListMerge (xmlListPtr l1, xmlListPtr l2); -XMLPUBFUN xmlListPtr XMLCALL +XMLPUBFUN xmlListPtr XMLCALL xmlListDup (const xmlListPtr old); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlListCopy (xmlListPtr cur, const xmlListPtr old); /* Link operators */ -XMLPUBFUN void * XMLCALL +XMLPUBFUN void * XMLCALL xmlLinkGetData (xmlLinkPtr lk); /* xmlListUnique() */ diff --git a/vendors/libxml2/include/libxml/nanoftp.h b/vendors/libxml/src/libxml/nanoftp.h similarity index 99% rename from vendors/libxml2/include/libxml/nanoftp.h rename to vendors/libxml/src/libxml/nanoftp.h index 397bbba..abb4bf7 100644 --- a/vendors/libxml2/include/libxml/nanoftp.h +++ b/vendors/libxml/src/libxml/nanoftp.h @@ -31,6 +31,7 @@ * macro used to provide portability of code to windows sockets * the value to be used when the socket is not valid */ +#undef INVALID_SOCKET #define INVALID_SOCKET (-1) #endif diff --git a/vendors/libxml2/include/libxml/nanohttp.h b/vendors/libxml/src/libxml/nanohttp.h similarity index 85% rename from vendors/libxml2/include/libxml/nanohttp.h rename to vendors/libxml/src/libxml/nanohttp.h index 1d8ac24..22b8fb4 100644 --- a/vendors/libxml2/include/libxml/nanohttp.h +++ b/vendors/libxml/src/libxml/nanohttp.h @@ -7,7 +7,7 @@ * * Author: Daniel Veillard */ - + #ifndef __NANO_HTTP_H__ #define __NANO_HTTP_H__ @@ -20,22 +20,22 @@ extern "C" { #endif XMLPUBFUN void XMLCALL xmlNanoHTTPInit (void); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlNanoHTTPCleanup (void); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlNanoHTTPScanProxy (const char *URL); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlNanoHTTPFetch (const char *URL, const char *filename, char **contentType); -XMLPUBFUN void * XMLCALL +XMLPUBFUN void * XMLCALL xmlNanoHTTPMethod (const char *URL, const char *method, const char *input, char **contentType, const char *headers, int ilen); -XMLPUBFUN void * XMLCALL +XMLPUBFUN void * XMLCALL xmlNanoHTTPMethodRedir (const char *URL, const char *method, const char *input, @@ -43,16 +43,16 @@ XMLPUBFUN void * XMLCALL char **redir, const char *headers, int ilen); -XMLPUBFUN void * XMLCALL +XMLPUBFUN void * XMLCALL xmlNanoHTTPOpen (const char *URL, char **contentType); -XMLPUBFUN void * XMLCALL +XMLPUBFUN void * XMLCALL xmlNanoHTTPOpenRedir (const char *URL, char **contentType, char **redir); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlNanoHTTPReturnCode (void *ctx); -XMLPUBFUN const char * XMLCALL +XMLPUBFUN const char * XMLCALL xmlNanoHTTPAuthHeader (void *ctx); XMLPUBFUN const char * XMLCALL xmlNanoHTTPRedir (void *ctx); @@ -62,16 +62,16 @@ XMLPUBFUN const char * XMLCALL xmlNanoHTTPEncoding (void *ctx); XMLPUBFUN const char * XMLCALL xmlNanoHTTPMimeType (void *ctx); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlNanoHTTPRead (void *ctx, void *dest, int len); #ifdef LIBXML_OUTPUT_ENABLED -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlNanoHTTPSave (void *ctxt, const char *filename); #endif /* LIBXML_OUTPUT_ENABLED */ -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlNanoHTTPClose (void *ctx); #ifdef __cplusplus } diff --git a/vendors/libxml2/include/libxml/parser.h b/vendors/libxml/src/libxml/parser.h similarity index 94% rename from vendors/libxml2/include/libxml/parser.h rename to vendors/libxml/src/libxml/parser.h index 47b3df1..3f5730d 100644 --- a/vendors/libxml2/include/libxml/parser.h +++ b/vendors/libxml/src/libxml/parser.h @@ -80,7 +80,7 @@ struct _xmlParserInput { * xmlParserNodeInfo: * * The parser can be asked to collect Node informations, i.e. at what - * place in the file they were detected. + * place in the file they were detected. * NOTE: This is off by default and not very well tested. */ typedef struct _xmlParserNodeInfo xmlParserNodeInfo; @@ -125,9 +125,9 @@ typedef enum { XML_PARSER_ENTITY_VALUE, /* within an entity value in a decl */ XML_PARSER_ATTRIBUTE_VALUE, /* within an attribute value */ XML_PARSER_SYSTEM_LITERAL, /* within a SYSTEM value */ - XML_PARSER_EPILOG, /* the Misc* after the last end tag */ + XML_PARSER_EPILOG, /* the Misc* after the last end tag */ XML_PARSER_IGNORE, /* within an IGNORED section */ - XML_PARSER_PUBLIC_LITERAL /* within a PUBLIC value */ + XML_PARSER_PUBLIC_LITERAL /* within a PUBLIC value */ } xmlParserInputState; /** @@ -221,7 +221,7 @@ struct _xmlParserCtxt { xmlValidCtxt vctxt; /* The validity context */ xmlParserInputState instate; /* current type of input */ - int token; /* next char look-ahead */ + int token; /* next char look-ahead */ char *directory; /* the data directory */ @@ -308,6 +308,9 @@ struct _xmlParserCtxt { int nodeInfoNr; /* Depth of the parsing stack */ int nodeInfoMax; /* Max depth of the parsing stack */ xmlParserNodeInfo *nodeInfoTab; /* array of nodeInfos */ + + int input_id; /* we need to label inputs */ + unsigned long sizeentcopy; /* volume of entity copy */ }; /** @@ -398,8 +401,8 @@ typedef xmlEntityPtr (*getParameterEntitySAXFunc) (void *ctx, /** * entityDeclSAXFunc: * @ctx: the user data (XML parser context) - * @name: the entity name - * @type: the entity type + * @name: the entity name + * @type: the entity type * @publicId: The public ID of the entity * @systemId: The system ID of the entity * @content: the entity value (without processing). @@ -429,8 +432,8 @@ typedef void (*notationDeclSAXFunc)(void *ctx, * attributeDeclSAXFunc: * @ctx: the user data (XML parser context) * @elem: the name of the element - * @fullname: the attribute name - * @type: the attribute type + * @fullname: the attribute name + * @type: the attribute type * @def: the type of default value * @defaultValue: the attribute default value * @tree: the tree of enumerated value set @@ -447,8 +450,8 @@ typedef void (*attributeDeclSAXFunc)(void *ctx, /** * elementDeclSAXFunc: * @ctx: the user data (XML parser context) - * @name: the element name - * @type: the element type + * @name: the element name + * @type: the element type * @content: the element value tree * * An element definition has been parsed. @@ -535,7 +538,7 @@ typedef void (*attributeSAXFunc) (void *ctx, * @ctx: the user data (XML parser context) * @name: The entity name * - * Called when an entity reference is detected. + * Called when an entity reference is detected. */ typedef void (*referenceSAXFunc) (void *ctx, const xmlChar *name); @@ -599,7 +602,7 @@ typedef void (*cdataBlockSAXFunc) ( * @ctx: an XML parser context * @msg: the message to display/transmit * @...: extra parameters for the message display - * + * * Display and format a warning messages, callback. */ typedef void (XMLCDECL *warningSAXFunc) (void *ctx, @@ -609,7 +612,7 @@ typedef void (XMLCDECL *warningSAXFunc) (void *ctx, * @ctx: an XML parser context * @msg: the message to display/transmit * @...: extra parameters for the message display - * + * * Display and format an error messages, callback. */ typedef void (XMLCDECL *errorSAXFunc) (void *ctx, @@ -619,7 +622,7 @@ typedef void (XMLCDECL *errorSAXFunc) (void *ctx, * @ctx: an XML parser context * @msg: the message to display/transmit * @...: extra parameters for the message display - * + * * Display and format fatal error messages, callback. * Note: so far fatalError() SAX callbacks are not used, error() * get all the callbacks for errors. @@ -695,7 +698,7 @@ typedef void (*startElementNsSAX2Func) (void *ctx, int nb_attributes, int nb_defaulted, const xmlChar **attributes); - + /** * endElementNsSAX2Func: * @ctx: the user data (XML parser context) @@ -790,7 +793,7 @@ struct _xmlSAXHandlerV1 { * xmlExternalEntityLoader: * @URL: The System ID of the resource requested * @ID: The Public ID of the resource requested - * @context: the XML parser context + * @context: the XML parser context * * External entity loaders types. * @@ -816,18 +819,18 @@ extern "C" { /* * Init/Cleanup */ -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlInitParser (void); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlCleanupParser (void); /* * Input functions */ -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlParserInputRead (xmlParserInputPtr in, int len); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlParserInputGrow (xmlParserInputPtr in, int len); @@ -835,101 +838,101 @@ XMLPUBFUN int XMLCALL * Basic parsing Interfaces */ #ifdef LIBXML_SAX1_ENABLED -XMLPUBFUN xmlDocPtr XMLCALL +XMLPUBFUN xmlDocPtr XMLCALL xmlParseDoc (const xmlChar *cur); -XMLPUBFUN xmlDocPtr XMLCALL +XMLPUBFUN xmlDocPtr XMLCALL xmlParseFile (const char *filename); -XMLPUBFUN xmlDocPtr XMLCALL +XMLPUBFUN xmlDocPtr XMLCALL xmlParseMemory (const char *buffer, int size); #endif /* LIBXML_SAX1_ENABLED */ -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlSubstituteEntitiesDefault(int val); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlKeepBlanksDefault (int val); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlStopParser (xmlParserCtxtPtr ctxt); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlPedanticParserDefault(int val); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlLineNumbersDefault (int val); #ifdef LIBXML_SAX1_ENABLED /* - * Recovery mode + * Recovery mode */ -XMLPUBFUN xmlDocPtr XMLCALL +XMLPUBFUN xmlDocPtr XMLCALL xmlRecoverDoc (const xmlChar *cur); -XMLPUBFUN xmlDocPtr XMLCALL +XMLPUBFUN xmlDocPtr XMLCALL xmlRecoverMemory (const char *buffer, int size); -XMLPUBFUN xmlDocPtr XMLCALL +XMLPUBFUN xmlDocPtr XMLCALL xmlRecoverFile (const char *filename); #endif /* LIBXML_SAX1_ENABLED */ /* * Less common routines and SAX interfaces */ -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlParseDocument (xmlParserCtxtPtr ctxt); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlParseExtParsedEnt (xmlParserCtxtPtr ctxt); #ifdef LIBXML_SAX1_ENABLED -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlSAXUserParseFile (xmlSAXHandlerPtr sax, void *user_data, const char *filename); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlSAXUserParseMemory (xmlSAXHandlerPtr sax, void *user_data, const char *buffer, int size); -XMLPUBFUN xmlDocPtr XMLCALL +XMLPUBFUN xmlDocPtr XMLCALL xmlSAXParseDoc (xmlSAXHandlerPtr sax, const xmlChar *cur, int recovery); -XMLPUBFUN xmlDocPtr XMLCALL +XMLPUBFUN xmlDocPtr XMLCALL xmlSAXParseMemory (xmlSAXHandlerPtr sax, const char *buffer, - int size, + int size, int recovery); -XMLPUBFUN xmlDocPtr XMLCALL +XMLPUBFUN xmlDocPtr XMLCALL xmlSAXParseMemoryWithData (xmlSAXHandlerPtr sax, const char *buffer, - int size, + int size, int recovery, void *data); -XMLPUBFUN xmlDocPtr XMLCALL +XMLPUBFUN xmlDocPtr XMLCALL xmlSAXParseFile (xmlSAXHandlerPtr sax, const char *filename, int recovery); -XMLPUBFUN xmlDocPtr XMLCALL +XMLPUBFUN xmlDocPtr XMLCALL xmlSAXParseFileWithData (xmlSAXHandlerPtr sax, const char *filename, int recovery, void *data); -XMLPUBFUN xmlDocPtr XMLCALL +XMLPUBFUN xmlDocPtr XMLCALL xmlSAXParseEntity (xmlSAXHandlerPtr sax, const char *filename); -XMLPUBFUN xmlDocPtr XMLCALL +XMLPUBFUN xmlDocPtr XMLCALL xmlParseEntity (const char *filename); #endif /* LIBXML_SAX1_ENABLED */ #ifdef LIBXML_VALID_ENABLED -XMLPUBFUN xmlDtdPtr XMLCALL +XMLPUBFUN xmlDtdPtr XMLCALL xmlSAXParseDTD (xmlSAXHandlerPtr sax, const xmlChar *ExternalID, const xmlChar *SystemID); -XMLPUBFUN xmlDtdPtr XMLCALL +XMLPUBFUN xmlDtdPtr XMLCALL xmlParseDTD (const xmlChar *ExternalID, const xmlChar *SystemID); -XMLPUBFUN xmlDtdPtr XMLCALL +XMLPUBFUN xmlDtdPtr XMLCALL xmlIOParseDTD (xmlSAXHandlerPtr sax, xmlParserInputBufferPtr input, xmlCharEncoding enc); #endif /* LIBXML_VALID_ENABLE */ #ifdef LIBXML_SAX1_ENABLED -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlParseBalancedChunkMemory(xmlDocPtr doc, xmlSAXHandlerPtr sax, void *user_data, @@ -944,7 +947,7 @@ XMLPUBFUN xmlParserErrors XMLCALL int options, xmlNodePtr *lst); #ifdef LIBXML_SAX1_ENABLED -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlParseBalancedChunkMemoryRecover(xmlDocPtr doc, xmlSAXHandlerPtr sax, void *user_data, @@ -952,7 +955,7 @@ XMLPUBFUN int XMLCALL const xmlChar *string, xmlNodePtr *lst, int recover); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlParseExternalEntity (xmlDocPtr doc, xmlSAXHandlerPtr sax, void *user_data, @@ -961,7 +964,7 @@ XMLPUBFUN int XMLCALL const xmlChar *ID, xmlNodePtr *lst); #endif /* LIBXML_SAX1_ENABLED */ -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlParseCtxtExternalEntity(xmlParserCtxtPtr ctx, const xmlChar *URL, const xmlChar *ID, @@ -970,35 +973,35 @@ XMLPUBFUN int XMLCALL /* * Parser contexts handling. */ -XMLPUBFUN xmlParserCtxtPtr XMLCALL +XMLPUBFUN xmlParserCtxtPtr XMLCALL xmlNewParserCtxt (void); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlInitParserCtxt (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlClearParserCtxt (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlFreeParserCtxt (xmlParserCtxtPtr ctxt); #ifdef LIBXML_SAX1_ENABLED -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlSetupParserForBuffer (xmlParserCtxtPtr ctxt, const xmlChar* buffer, const char *filename); #endif /* LIBXML_SAX1_ENABLED */ -XMLPUBFUN xmlParserCtxtPtr XMLCALL +XMLPUBFUN xmlParserCtxtPtr XMLCALL xmlCreateDocParserCtxt (const xmlChar *cur); #ifdef LIBXML_LEGACY_ENABLED /* * Reading/setting optional parsing features. */ -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlGetFeaturesList (int *len, const char **result); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlGetFeature (xmlParserCtxtPtr ctxt, const char *name, void *result); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlSetFeature (xmlParserCtxtPtr ctxt, const char *name, void *value); @@ -1008,13 +1011,13 @@ XMLPUBFUN int XMLCALL /* * Interfaces for the Push mode. */ -XMLPUBFUN xmlParserCtxtPtr XMLCALL +XMLPUBFUN xmlParserCtxtPtr XMLCALL xmlCreatePushParserCtxt(xmlSAXHandlerPtr sax, void *user_data, const char *chunk, int size, const char *filename); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlParseChunk (xmlParserCtxtPtr ctxt, const char *chunk, int size, @@ -1025,7 +1028,7 @@ XMLPUBFUN int XMLCALL * Special I/O mode. */ -XMLPUBFUN xmlParserCtxtPtr XMLCALL +XMLPUBFUN xmlParserCtxtPtr XMLCALL xmlCreateIOParserCtxt (xmlSAXHandlerPtr sax, void *user_data, xmlInputReadCallback ioread, @@ -1033,7 +1036,7 @@ XMLPUBFUN xmlParserCtxtPtr XMLCALL void *ioctx, xmlCharEncoding enc); -XMLPUBFUN xmlParserInputPtr XMLCALL +XMLPUBFUN xmlParserInputPtr XMLCALL xmlNewIOInputStream (xmlParserCtxtPtr ctxt, xmlParserInputBufferPtr input, xmlCharEncoding enc); @@ -1044,14 +1047,14 @@ XMLPUBFUN xmlParserInputPtr XMLCALL XMLPUBFUN const xmlParserNodeInfo* XMLCALL xmlParserFindNodeInfo (const xmlParserCtxtPtr ctxt, const xmlNodePtr node); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlInitNodeInfoSeq (xmlParserNodeInfoSeqPtr seq); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlClearNodeInfoSeq (xmlParserNodeInfoSeqPtr seq); -XMLPUBFUN unsigned long XMLCALL +XMLPUBFUN unsigned long XMLCALL xmlParserFindNodeInfoIndex(const xmlParserNodeInfoSeqPtr seq, const xmlNodePtr node); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlParserAddNodeInfo (xmlParserCtxtPtr ctxt, const xmlParserNodeInfoPtr info); @@ -1059,7 +1062,7 @@ XMLPUBFUN void XMLCALL * External entities handling actually implemented in xmlIO. */ -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlSetExternalEntityLoader(xmlExternalEntityLoader f); XMLPUBFUN xmlExternalEntityLoader XMLCALL xmlGetExternalEntityLoader(void); @@ -1105,8 +1108,10 @@ typedef enum { crash if you try to modify the tree) */ XML_PARSE_OLD10 = 1<<17,/* parse using XML-1.0 before update 5 */ XML_PARSE_NOBASEFIX = 1<<18,/* do not fixup XINCLUDE xml:base uris */ - XML_PARSE_HUGE = 1<<19, /* relax any hardcoded limit from the parser */ - XML_PARSE_OLDSAX = 1<<20 /* parse using SAX2 interface from before 2.7.0 */ + XML_PARSE_HUGE = 1<<19,/* relax any hardcoded limit from the parser */ + XML_PARSE_OLDSAX = 1<<20,/* parse using SAX2 interface before 2.7.0 */ + XML_PARSE_IGNORE_ENC= 1<<21,/* ignore internal document encoding hint */ + XML_PARSE_BIG_LINES = 1<<22 /* Store big lines numbers in text PSVI field */ } xmlParserOption; XMLPUBFUN void XMLCALL @@ -1223,6 +1228,7 @@ typedef enum { XML_WITH_DEBUG_RUN = 30, XML_WITH_ZLIB = 31, XML_WITH_ICU = 32, + XML_WITH_LZMA = 33, XML_WITH_NONE = 99999 /* just to be sure of allocation size */ } xmlFeature; diff --git a/vendors/libxml2/include/libxml/parserInternals.h b/vendors/libxml/src/libxml/parserInternals.h similarity index 82% rename from vendors/libxml2/include/libxml/parserInternals.h rename to vendors/libxml/src/libxml/parserInternals.h index a5e75b5..6065320 100644 --- a/vendors/libxml2/include/libxml/parserInternals.h +++ b/vendors/libxml/src/libxml/parserInternals.h @@ -1,5 +1,5 @@ /* - * Summary: internals routines exported by the parser. + * Summary: internals routines and limits exported by the parser. * Description: this module exports a number of internal parsing routines * they are not really all intended for applications but * can prove useful doing low level processing. @@ -36,9 +36,42 @@ XMLPUBVAR unsigned int xmlParserMaxDepth; * Maximum size allowed for a single text node when building a tree. * This is not a limitation of the parser but a safety boundary feature, * use XML_PARSE_HUGE option to override it. + * Introduced in 2.9.0 */ #define XML_MAX_TEXT_LENGTH 10000000 +/** + * XML_MAX_NAME_LENGTH: + * + * Maximum size allowed for a markup identitier + * This is not a limitation of the parser but a safety boundary feature, + * use XML_PARSE_HUGE option to override it. + * Note that with the use of parsing dictionaries overriding the limit + * may result in more runtime memory usage in face of "unfriendly' content + * Introduced in 2.9.0 + */ +#define XML_MAX_NAME_LENGTH 50000 + +/** + * XML_MAX_DICTIONARY_LIMIT: + * + * Maximum size allowed by the parser for a dictionary by default + * This is not a limitation of the parser but a safety boundary feature, + * use XML_PARSE_HUGE option to override it. + * Introduced in 2.9.0 + */ +#define XML_MAX_DICTIONARY_LIMIT 10000000 + +/** + * XML_MAX_LOOKUP_LIMIT: + * + * Maximum size allowed by the parser for ahead lookup + * This is an upper boundary enforced by the parser to avoid bad + * behaviour on "unfriendly' content + * Introduced in 2.9.0 + */ +#define XML_MAX_LOOKUP_LIMIT 10000000 + /** * XML_MAX_NAMELEN: * @@ -57,7 +90,7 @@ XMLPUBVAR unsigned int xmlParserMaxDepth; /************************************************************************ * * - * UNICODE version of the macros. * + * UNICODE version of the macros. * * * ************************************************************************/ /** @@ -153,7 +186,7 @@ XMLPUBVAR unsigned int xmlParserMaxDepth; * * Always false (all combining chars > 0xff) */ -#define IS_COMBINING_CH(c) 0 +#define IS_COMBINING_CH(c) 0 /** * IS_EXTENDER: @@ -194,7 +227,7 @@ XMLPUBVAR unsigned int xmlParserMaxDepth; * Macro to check the following production in the XML spec: * * - * [84] Letter ::= BaseChar | Ideographic + * [84] Letter ::= BaseChar | Ideographic */ #define IS_LETTER(c) (IS_BASECHAR(c) || IS_IDEOGRAPHIC(c)) @@ -251,7 +284,7 @@ XMLPUBVAR unsigned int xmlParserMaxDepth; * * Skips the end of line chars. */ -#define SKIP_EOL(p) \ +#define SKIP_EOL(p) \ if (*(p) == 0x13) { p++ ; if (*(p) == 0x10) p++; } \ if (*(p) == 0x10) { p++ ; if (*(p) == 0x13) p++; } @@ -288,25 +321,25 @@ XMLPUBFUN int XMLCALL xmlIsLetter (int c); /** * Parser context. */ -XMLPUBFUN xmlParserCtxtPtr XMLCALL +XMLPUBFUN xmlParserCtxtPtr XMLCALL xmlCreateFileParserCtxt (const char *filename); -XMLPUBFUN xmlParserCtxtPtr XMLCALL +XMLPUBFUN xmlParserCtxtPtr XMLCALL xmlCreateURLParserCtxt (const char *filename, int options); -XMLPUBFUN xmlParserCtxtPtr XMLCALL +XMLPUBFUN xmlParserCtxtPtr XMLCALL xmlCreateMemoryParserCtxt(const char *buffer, int size); -XMLPUBFUN xmlParserCtxtPtr XMLCALL +XMLPUBFUN xmlParserCtxtPtr XMLCALL xmlCreateEntityParserCtxt(const xmlChar *URL, const xmlChar *ID, const xmlChar *base); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlSwitchEncoding (xmlParserCtxtPtr ctxt, xmlCharEncoding enc); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlSwitchToEncoding (xmlParserCtxtPtr ctxt, xmlCharEncodingHandlerPtr handler); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlSwitchInputEncoding (xmlParserCtxtPtr ctxt, xmlParserInputPtr input, xmlCharEncodingHandlerPtr handler); @@ -324,29 +357,29 @@ XMLPUBFUN void XMLCALL /** * Input Streams. */ -XMLPUBFUN xmlParserInputPtr XMLCALL +XMLPUBFUN xmlParserInputPtr XMLCALL xmlNewStringInputStream (xmlParserCtxtPtr ctxt, const xmlChar *buffer); -XMLPUBFUN xmlParserInputPtr XMLCALL +XMLPUBFUN xmlParserInputPtr XMLCALL xmlNewEntityInputStream (xmlParserCtxtPtr ctxt, xmlEntityPtr entity); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlPushInput (xmlParserCtxtPtr ctxt, xmlParserInputPtr input); -XMLPUBFUN xmlChar XMLCALL +XMLPUBFUN xmlChar XMLCALL xmlPopInput (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlFreeInputStream (xmlParserInputPtr input); -XMLPUBFUN xmlParserInputPtr XMLCALL +XMLPUBFUN xmlParserInputPtr XMLCALL xmlNewInputFromFile (xmlParserCtxtPtr ctxt, const char *filename); -XMLPUBFUN xmlParserInputPtr XMLCALL +XMLPUBFUN xmlParserInputPtr XMLCALL xmlNewInputStream (xmlParserCtxtPtr ctxt); /** * Namespaces. */ -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlSplitQName (xmlParserCtxtPtr ctxt, const xmlChar *name, xmlChar **prefix); @@ -354,112 +387,112 @@ XMLPUBFUN xmlChar * XMLCALL /** * Generic production rules. */ -XMLPUBFUN const xmlChar * XMLCALL +XMLPUBFUN const xmlChar * XMLCALL xmlParseName (xmlParserCtxtPtr ctxt); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlParseNmtoken (xmlParserCtxtPtr ctxt); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlParseEntityValue (xmlParserCtxtPtr ctxt, xmlChar **orig); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlParseAttValue (xmlParserCtxtPtr ctxt); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlParseSystemLiteral (xmlParserCtxtPtr ctxt); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlParsePubidLiteral (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlParseCharData (xmlParserCtxtPtr ctxt, int cdata); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlParseExternalID (xmlParserCtxtPtr ctxt, xmlChar **publicID, int strict); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlParseComment (xmlParserCtxtPtr ctxt); -XMLPUBFUN const xmlChar * XMLCALL +XMLPUBFUN const xmlChar * XMLCALL xmlParsePITarget (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlParsePI (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlParseNotationDecl (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlParseEntityDecl (xmlParserCtxtPtr ctxt); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlParseDefaultDecl (xmlParserCtxtPtr ctxt, xmlChar **value); -XMLPUBFUN xmlEnumerationPtr XMLCALL +XMLPUBFUN xmlEnumerationPtr XMLCALL xmlParseNotationType (xmlParserCtxtPtr ctxt); -XMLPUBFUN xmlEnumerationPtr XMLCALL +XMLPUBFUN xmlEnumerationPtr XMLCALL xmlParseEnumerationType (xmlParserCtxtPtr ctxt); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlParseEnumeratedType (xmlParserCtxtPtr ctxt, xmlEnumerationPtr *tree); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlParseAttributeType (xmlParserCtxtPtr ctxt, xmlEnumerationPtr *tree); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlParseAttributeListDecl(xmlParserCtxtPtr ctxt); -XMLPUBFUN xmlElementContentPtr XMLCALL +XMLPUBFUN xmlElementContentPtr XMLCALL xmlParseElementMixedContentDecl (xmlParserCtxtPtr ctxt, int inputchk); -XMLPUBFUN xmlElementContentPtr XMLCALL +XMLPUBFUN xmlElementContentPtr XMLCALL xmlParseElementChildrenContentDecl (xmlParserCtxtPtr ctxt, int inputchk); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlParseElementContentDecl(xmlParserCtxtPtr ctxt, const xmlChar *name, xmlElementContentPtr *result); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlParseElementDecl (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlParseMarkupDecl (xmlParserCtxtPtr ctxt); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlParseCharRef (xmlParserCtxtPtr ctxt); -XMLPUBFUN xmlEntityPtr XMLCALL +XMLPUBFUN xmlEntityPtr XMLCALL xmlParseEntityRef (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlParseReference (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlParsePEReference (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlParseDocTypeDecl (xmlParserCtxtPtr ctxt); #ifdef LIBXML_SAX1_ENABLED -XMLPUBFUN const xmlChar * XMLCALL +XMLPUBFUN const xmlChar * XMLCALL xmlParseAttribute (xmlParserCtxtPtr ctxt, xmlChar **value); -XMLPUBFUN const xmlChar * XMLCALL +XMLPUBFUN const xmlChar * XMLCALL xmlParseStartTag (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlParseEndTag (xmlParserCtxtPtr ctxt); #endif /* LIBXML_SAX1_ENABLED */ -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlParseCDSect (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlParseContent (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlParseElement (xmlParserCtxtPtr ctxt); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlParseVersionNum (xmlParserCtxtPtr ctxt); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlParseVersionInfo (xmlParserCtxtPtr ctxt); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlParseEncName (xmlParserCtxtPtr ctxt); -XMLPUBFUN const xmlChar * XMLCALL +XMLPUBFUN const xmlChar * XMLCALL xmlParseEncodingDecl (xmlParserCtxtPtr ctxt); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlParseSDDecl (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlParseXMLDecl (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlParseTextDecl (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlParseMisc (xmlParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlParseExternalSubset (xmlParserCtxtPtr ctxt, const xmlChar *ExternalID, - const xmlChar *SystemID); + const xmlChar *SystemID); /** * XML_SUBSTITUTE_NONE: * @@ -483,7 +516,7 @@ XMLPUBFUN void XMLCALL * * Both general and parameter entities need to be substituted. */ -#define XML_SUBSTITUTE_BOTH 3 +#define XML_SUBSTITUTE_BOTH 3 XMLPUBFUN xmlChar * XMLCALL xmlStringDecodeEntities (xmlParserCtxtPtr ctxt, @@ -563,21 +596,21 @@ XMLPUBFUN htmlParserCtxtPtr XMLCALL htmlCreateFileParserCtxt(const char *filenam typedef void (*xmlEntityReferenceFunc) (xmlEntityPtr ent, xmlNodePtr firstNode, xmlNodePtr lastNode); - + XMLPUBFUN void XMLCALL xmlSetEntityReferenceFunc (xmlEntityReferenceFunc func); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlParseQuotedString (xmlParserCtxtPtr ctxt); XMLPUBFUN void XMLCALL xmlParseNamespace (xmlParserCtxtPtr ctxt); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlNamespaceParseNSDef (xmlParserCtxtPtr ctxt); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlScanName (xmlParserCtxtPtr ctxt); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlNamespaceParseNCName (xmlParserCtxtPtr ctxt); XMLPUBFUN void XMLCALL xmlParserHandleReference(xmlParserCtxtPtr ctxt); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlNamespaceParseQName (xmlParserCtxtPtr ctxt, xmlChar **prefix); /** @@ -590,7 +623,7 @@ XMLPUBFUN xmlChar * XMLCALL xmlChar end, xmlChar end2, xmlChar end3); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlHandleEntity (xmlParserCtxtPtr ctxt, xmlEntityPtr entity); diff --git a/vendors/libxml2/include/libxml/pattern.h b/vendors/libxml/src/libxml/pattern.h similarity index 100% rename from vendors/libxml2/include/libxml/pattern.h rename to vendors/libxml/src/libxml/pattern.h diff --git a/vendors/libxml2/include/libxml/relaxng.h b/vendors/libxml/src/libxml/relaxng.h similarity index 100% rename from vendors/libxml2/include/libxml/relaxng.h rename to vendors/libxml/src/libxml/relaxng.h diff --git a/vendors/libxml2/include/libxml/schemasInternals.h b/vendors/libxml/src/libxml/schemasInternals.h similarity index 99% rename from vendors/libxml2/include/libxml/schemasInternals.h rename to vendors/libxml/src/libxml/schemasInternals.h index b68a6e1..4f0ca9a 100644 --- a/vendors/libxml2/include/libxml/schemasInternals.h +++ b/vendors/libxml/src/libxml/schemasInternals.h @@ -104,8 +104,8 @@ typedef enum { XML_SCHEMA_TYPE_IDC_UNIQUE, XML_SCHEMA_TYPE_IDC_KEY, XML_SCHEMA_TYPE_IDC_KEYREF, - XML_SCHEMA_TYPE_PARTICLE = 25, - XML_SCHEMA_TYPE_ATTRIBUTE_USE, + XML_SCHEMA_TYPE_PARTICLE = 25, + XML_SCHEMA_TYPE_ATTRIBUTE_USE, XML_SCHEMA_FACET_MININCLUSIVE = 1000, XML_SCHEMA_FACET_MINEXCLUSIVE, XML_SCHEMA_FACET_MAXINCLUSIVE, diff --git a/vendors/libxml2/include/libxml/schematron.h b/vendors/libxml/src/libxml/schematron.h similarity index 92% rename from vendors/libxml2/include/libxml/schematron.h rename to vendors/libxml/src/libxml/schematron.h index f442826..364eaec 100644 --- a/vendors/libxml2/include/libxml/schematron.h +++ b/vendors/libxml/src/libxml/schematron.h @@ -69,17 +69,17 @@ typedef xmlSchematronValidCtxt *xmlSchematronValidCtxtPtr; /* * Interfaces for parsing. */ -XMLPUBFUN xmlSchematronParserCtxtPtr XMLCALL +XMLPUBFUN xmlSchematronParserCtxtPtr XMLCALL xmlSchematronNewParserCtxt (const char *URL); -XMLPUBFUN xmlSchematronParserCtxtPtr XMLCALL +XMLPUBFUN xmlSchematronParserCtxtPtr XMLCALL xmlSchematronNewMemParserCtxt(const char *buffer, int size); XMLPUBFUN xmlSchematronParserCtxtPtr XMLCALL xmlSchematronNewDocParserCtxt(xmlDocPtr doc); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlSchematronFreeParserCtxt (xmlSchematronParserCtxtPtr ctxt); /***** -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlSchematronSetParserErrors(xmlSchematronParserCtxtPtr ctxt, xmlSchematronValidityErrorFunc err, xmlSchematronValidityWarningFunc warn, @@ -92,9 +92,9 @@ XMLPUBFUN int XMLCALL XMLPUBFUN int XMLCALL xmlSchematronIsValid (xmlSchematronValidCtxtPtr ctxt); *****/ -XMLPUBFUN xmlSchematronPtr XMLCALL +XMLPUBFUN xmlSchematronPtr XMLCALL xmlSchematronParse (xmlSchematronParserCtxtPtr ctxt); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlSchematronFree (xmlSchematronPtr schema); /* * Interfaces for validating @@ -105,7 +105,7 @@ XMLPUBFUN void XMLCALL xmlStructuredErrorFunc serror, void *ctx); /****** -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlSchematronSetValidErrors (xmlSchematronValidCtxtPtr ctxt, xmlSchematronValidityErrorFunc err, xmlSchematronValidityWarningFunc warn, @@ -125,12 +125,12 @@ XMLPUBFUN int XMLCALL xmlNodePtr elem); *******/ -XMLPUBFUN xmlSchematronValidCtxtPtr XMLCALL +XMLPUBFUN xmlSchematronValidCtxtPtr XMLCALL xmlSchematronNewValidCtxt (xmlSchematronPtr schema, - int options); -XMLPUBFUN void XMLCALL + int options); +XMLPUBFUN void XMLCALL xmlSchematronFreeValidCtxt (xmlSchematronValidCtxtPtr ctxt); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlSchematronValidateDoc (xmlSchematronValidCtxtPtr ctxt, xmlDocPtr instance); diff --git a/vendors/libxml2/include/libxml/threads.h b/vendors/libxml/src/libxml/threads.h similarity index 100% rename from vendors/libxml2/include/libxml/threads.h rename to vendors/libxml/src/libxml/threads.h diff --git a/vendors/libxml2/include/libxml/tree.h b/vendors/libxml/src/libxml/tree.h similarity index 85% rename from vendors/libxml2/include/libxml/tree.h rename to vendors/libxml/src/libxml/tree.h index b733589..7e06686 100644 --- a/vendors/libxml2/include/libxml/tree.h +++ b/vendors/libxml/src/libxml/tree.h @@ -13,6 +13,7 @@ #define __XML_TREE_H__ #include +#include #include #include @@ -74,13 +75,15 @@ typedef enum { XML_BUFFER_ALLOC_DOUBLEIT, /* double each time one need to grow */ XML_BUFFER_ALLOC_EXACT, /* grow only to the minimal size */ XML_BUFFER_ALLOC_IMMUTABLE, /* immutable buffer */ - XML_BUFFER_ALLOC_IO /* special allocation scheme used for I/O */ + XML_BUFFER_ALLOC_IO, /* special allocation scheme used for I/O */ + XML_BUFFER_ALLOC_HYBRID /* exact up to a threshold, and doubleit thereafter */ } xmlBufferAllocationScheme; /** * xmlBuffer: * - * A buffer structure. + * A buffer structure, this old construct is limited to 2GB and + * is being deprecated, use API with xmlBuf instead */ typedef struct _xmlBuffer xmlBuffer; typedef xmlBuffer *xmlBufferPtr; @@ -92,6 +95,41 @@ struct _xmlBuffer { xmlChar *contentIO; /* in IO mode we may have a different base */ }; +/** + * xmlBuf: + * + * A buffer structure, new one, the actual structure internals are not public + */ + +typedef struct _xmlBuf xmlBuf; + +/** + * xmlBufPtr: + * + * A pointer to a buffer structure, the actual structure internals are not + * public + */ + +typedef xmlBuf *xmlBufPtr; + +/* + * A few public routines for xmlBuf. As those are expected to be used + * mostly internally the bulk of the routines are internal in buf.h + */ +XMLPUBFUN xmlChar* XMLCALL xmlBufContent (const xmlBufPtr buf); +XMLPUBFUN xmlChar* XMLCALL xmlBufEnd (const xmlBufPtr buf); +XMLPUBFUN size_t XMLCALL xmlBufUse (const xmlBufPtr buf); +XMLPUBFUN size_t XMLCALL xmlBufShrink (xmlBufPtr buf, size_t len); + +/* + * LIBXML2_NEW_BUFFER: + * + * Macro used to express that the API use the new buffers for + * xmlParserInputBuffer and xmlOutputBuffer. The change was + * introduced in 2.9.0. + */ +#define LIBXML2_NEW_BUFFER + /** * XML_XML_NAMESPACE: * @@ -479,7 +517,7 @@ struct _xmlNode { /** * XML_GET_LINE: * - * Macro to extract the line number of an element node. + * Macro to extract the line number of an element node. */ #define XML_GET_LINE(n) \ (xmlGetLineNo(n)) @@ -522,7 +560,7 @@ struct _xmlDoc { /* End of common part */ int compression;/* level of zlib compression */ - int standalone; /* standalone document (no external refs) + int standalone; /* standalone document (no external refs) 1 if standalone="yes" 0 if standalone="no" -1 if there is no XML declaration @@ -553,9 +591,9 @@ typedef xmlDOMWrapCtxt *xmlDOMWrapCtxtPtr; /** * xmlDOMWrapAcquireNsFunction: * @ctxt: a DOM wrapper context - * @node: the context node (element or attribute) + * @node: the context node (element or attribute) * @nsName: the requested namespace name - * @nsPrefix: the requested namespace prefix + * @nsPrefix: the requested namespace prefix * * A function called to acquire namespaces (xmlNs) from the wrapper. * @@ -602,7 +640,7 @@ struct _xmlDOMWrapCtxt { /** * xmlRootNode: * - * Macro for compatibility naming layer with libxml1. Maps + * Macro for compatibility naming layer with libxml1. Maps * to "children". */ #ifndef xmlRootNode @@ -623,429 +661,436 @@ XMLPUBFUN int XMLCALL #endif #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlValidateQName (const xmlChar *value, int space); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlValidateName (const xmlChar *value, int space); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlValidateNMToken (const xmlChar *value, int space); #endif -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlBuildQName (const xmlChar *ncname, const xmlChar *prefix, xmlChar *memory, int len); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlSplitQName2 (const xmlChar *name, xmlChar **prefix); -XMLPUBFUN const xmlChar * XMLCALL +XMLPUBFUN const xmlChar * XMLCALL xmlSplitQName3 (const xmlChar *name, int *len); /* - * Handling Buffers. + * Handling Buffers, the old ones see @xmlBuf for the new ones. */ -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlSetBufferAllocationScheme(xmlBufferAllocationScheme scheme); -XMLPUBFUN xmlBufferAllocationScheme XMLCALL +XMLPUBFUN xmlBufferAllocationScheme XMLCALL xmlGetBufferAllocationScheme(void); -XMLPUBFUN xmlBufferPtr XMLCALL +XMLPUBFUN xmlBufferPtr XMLCALL xmlBufferCreate (void); -XMLPUBFUN xmlBufferPtr XMLCALL +XMLPUBFUN xmlBufferPtr XMLCALL xmlBufferCreateSize (size_t size); -XMLPUBFUN xmlBufferPtr XMLCALL +XMLPUBFUN xmlBufferPtr XMLCALL xmlBufferCreateStatic (void *mem, size_t size); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlBufferResize (xmlBufferPtr buf, unsigned int size); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlBufferFree (xmlBufferPtr buf); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlBufferDump (FILE *file, xmlBufferPtr buf); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlBufferAdd (xmlBufferPtr buf, const xmlChar *str, int len); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlBufferAddHead (xmlBufferPtr buf, const xmlChar *str, int len); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlBufferCat (xmlBufferPtr buf, const xmlChar *str); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlBufferCCat (xmlBufferPtr buf, const char *str); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlBufferShrink (xmlBufferPtr buf, unsigned int len); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlBufferGrow (xmlBufferPtr buf, unsigned int len); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlBufferEmpty (xmlBufferPtr buf); -XMLPUBFUN const xmlChar* XMLCALL +XMLPUBFUN const xmlChar* XMLCALL xmlBufferContent (const xmlBufferPtr buf); -XMLPUBFUN void XMLCALL +XMLPUBFUN xmlChar* XMLCALL + xmlBufferDetach (xmlBufferPtr buf); +XMLPUBFUN void XMLCALL xmlBufferSetAllocationScheme(xmlBufferPtr buf, xmlBufferAllocationScheme scheme); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlBufferLength (const xmlBufferPtr buf); /* * Creating/freeing new structures. */ -XMLPUBFUN xmlDtdPtr XMLCALL +XMLPUBFUN xmlDtdPtr XMLCALL xmlCreateIntSubset (xmlDocPtr doc, const xmlChar *name, const xmlChar *ExternalID, const xmlChar *SystemID); -XMLPUBFUN xmlDtdPtr XMLCALL +XMLPUBFUN xmlDtdPtr XMLCALL xmlNewDtd (xmlDocPtr doc, const xmlChar *name, const xmlChar *ExternalID, const xmlChar *SystemID); -XMLPUBFUN xmlDtdPtr XMLCALL +XMLPUBFUN xmlDtdPtr XMLCALL xmlGetIntSubset (xmlDocPtr doc); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlFreeDtd (xmlDtdPtr cur); #ifdef LIBXML_LEGACY_ENABLED -XMLPUBFUN xmlNsPtr XMLCALL +XMLPUBFUN xmlNsPtr XMLCALL xmlNewGlobalNs (xmlDocPtr doc, const xmlChar *href, const xmlChar *prefix); #endif /* LIBXML_LEGACY_ENABLED */ -XMLPUBFUN xmlNsPtr XMLCALL +XMLPUBFUN xmlNsPtr XMLCALL xmlNewNs (xmlNodePtr node, const xmlChar *href, const xmlChar *prefix); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlFreeNs (xmlNsPtr cur); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlFreeNsList (xmlNsPtr cur); -XMLPUBFUN xmlDocPtr XMLCALL +XMLPUBFUN xmlDocPtr XMLCALL xmlNewDoc (const xmlChar *version); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlFreeDoc (xmlDocPtr cur); -XMLPUBFUN xmlAttrPtr XMLCALL +XMLPUBFUN xmlAttrPtr XMLCALL xmlNewDocProp (xmlDocPtr doc, const xmlChar *name, const xmlChar *value); #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_HTML_ENABLED) || \ defined(LIBXML_SCHEMAS_ENABLED) -XMLPUBFUN xmlAttrPtr XMLCALL +XMLPUBFUN xmlAttrPtr XMLCALL xmlNewProp (xmlNodePtr node, const xmlChar *name, const xmlChar *value); #endif -XMLPUBFUN xmlAttrPtr XMLCALL +XMLPUBFUN xmlAttrPtr XMLCALL xmlNewNsProp (xmlNodePtr node, xmlNsPtr ns, const xmlChar *name, const xmlChar *value); -XMLPUBFUN xmlAttrPtr XMLCALL +XMLPUBFUN xmlAttrPtr XMLCALL xmlNewNsPropEatName (xmlNodePtr node, xmlNsPtr ns, xmlChar *name, const xmlChar *value); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlFreePropList (xmlAttrPtr cur); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlFreeProp (xmlAttrPtr cur); -XMLPUBFUN xmlAttrPtr XMLCALL +XMLPUBFUN xmlAttrPtr XMLCALL xmlCopyProp (xmlNodePtr target, xmlAttrPtr cur); -XMLPUBFUN xmlAttrPtr XMLCALL +XMLPUBFUN xmlAttrPtr XMLCALL xmlCopyPropList (xmlNodePtr target, xmlAttrPtr cur); #ifdef LIBXML_TREE_ENABLED -XMLPUBFUN xmlDtdPtr XMLCALL +XMLPUBFUN xmlDtdPtr XMLCALL xmlCopyDtd (xmlDtdPtr dtd); #endif /* LIBXML_TREE_ENABLED */ #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) -XMLPUBFUN xmlDocPtr XMLCALL +XMLPUBFUN xmlDocPtr XMLCALL xmlCopyDoc (xmlDocPtr doc, int recursive); #endif /* defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) */ /* * Creating new nodes. */ -XMLPUBFUN xmlNodePtr XMLCALL +XMLPUBFUN xmlNodePtr XMLCALL xmlNewDocNode (xmlDocPtr doc, xmlNsPtr ns, const xmlChar *name, const xmlChar *content); -XMLPUBFUN xmlNodePtr XMLCALL +XMLPUBFUN xmlNodePtr XMLCALL xmlNewDocNodeEatName (xmlDocPtr doc, xmlNsPtr ns, xmlChar *name, const xmlChar *content); -XMLPUBFUN xmlNodePtr XMLCALL +XMLPUBFUN xmlNodePtr XMLCALL xmlNewNode (xmlNsPtr ns, const xmlChar *name); -XMLPUBFUN xmlNodePtr XMLCALL +XMLPUBFUN xmlNodePtr XMLCALL xmlNewNodeEatName (xmlNsPtr ns, xmlChar *name); #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) -XMLPUBFUN xmlNodePtr XMLCALL +XMLPUBFUN xmlNodePtr XMLCALL xmlNewChild (xmlNodePtr parent, xmlNsPtr ns, const xmlChar *name, const xmlChar *content); #endif -XMLPUBFUN xmlNodePtr XMLCALL +XMLPUBFUN xmlNodePtr XMLCALL xmlNewDocText (xmlDocPtr doc, const xmlChar *content); -XMLPUBFUN xmlNodePtr XMLCALL +XMLPUBFUN xmlNodePtr XMLCALL xmlNewText (const xmlChar *content); -XMLPUBFUN xmlNodePtr XMLCALL +XMLPUBFUN xmlNodePtr XMLCALL xmlNewDocPI (xmlDocPtr doc, const xmlChar *name, const xmlChar *content); -XMLPUBFUN xmlNodePtr XMLCALL +XMLPUBFUN xmlNodePtr XMLCALL xmlNewPI (const xmlChar *name, const xmlChar *content); -XMLPUBFUN xmlNodePtr XMLCALL +XMLPUBFUN xmlNodePtr XMLCALL xmlNewDocTextLen (xmlDocPtr doc, const xmlChar *content, int len); -XMLPUBFUN xmlNodePtr XMLCALL +XMLPUBFUN xmlNodePtr XMLCALL xmlNewTextLen (const xmlChar *content, int len); -XMLPUBFUN xmlNodePtr XMLCALL +XMLPUBFUN xmlNodePtr XMLCALL xmlNewDocComment (xmlDocPtr doc, const xmlChar *content); -XMLPUBFUN xmlNodePtr XMLCALL +XMLPUBFUN xmlNodePtr XMLCALL xmlNewComment (const xmlChar *content); -XMLPUBFUN xmlNodePtr XMLCALL +XMLPUBFUN xmlNodePtr XMLCALL xmlNewCDataBlock (xmlDocPtr doc, const xmlChar *content, int len); -XMLPUBFUN xmlNodePtr XMLCALL +XMLPUBFUN xmlNodePtr XMLCALL xmlNewCharRef (xmlDocPtr doc, const xmlChar *name); -XMLPUBFUN xmlNodePtr XMLCALL +XMLPUBFUN xmlNodePtr XMLCALL xmlNewReference (xmlDocPtr doc, const xmlChar *name); -XMLPUBFUN xmlNodePtr XMLCALL +XMLPUBFUN xmlNodePtr XMLCALL xmlCopyNode (const xmlNodePtr node, int recursive); -XMLPUBFUN xmlNodePtr XMLCALL +XMLPUBFUN xmlNodePtr XMLCALL xmlDocCopyNode (const xmlNodePtr node, xmlDocPtr doc, int recursive); -XMLPUBFUN xmlNodePtr XMLCALL +XMLPUBFUN xmlNodePtr XMLCALL xmlDocCopyNodeList (xmlDocPtr doc, const xmlNodePtr node); -XMLPUBFUN xmlNodePtr XMLCALL +XMLPUBFUN xmlNodePtr XMLCALL xmlCopyNodeList (const xmlNodePtr node); #ifdef LIBXML_TREE_ENABLED -XMLPUBFUN xmlNodePtr XMLCALL +XMLPUBFUN xmlNodePtr XMLCALL xmlNewTextChild (xmlNodePtr parent, xmlNsPtr ns, const xmlChar *name, const xmlChar *content); -XMLPUBFUN xmlNodePtr XMLCALL +XMLPUBFUN xmlNodePtr XMLCALL xmlNewDocRawNode (xmlDocPtr doc, xmlNsPtr ns, const xmlChar *name, const xmlChar *content); -XMLPUBFUN xmlNodePtr XMLCALL +XMLPUBFUN xmlNodePtr XMLCALL xmlNewDocFragment (xmlDocPtr doc); #endif /* LIBXML_TREE_ENABLED */ /* * Navigating. */ -XMLPUBFUN long XMLCALL +XMLPUBFUN long XMLCALL xmlGetLineNo (xmlNodePtr node); #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_DEBUG_ENABLED) -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlGetNodePath (xmlNodePtr node); #endif /* defined(LIBXML_TREE_ENABLED) || defined(LIBXML_DEBUG_ENABLED) */ -XMLPUBFUN xmlNodePtr XMLCALL +XMLPUBFUN xmlNodePtr XMLCALL xmlDocGetRootElement (xmlDocPtr doc); -XMLPUBFUN xmlNodePtr XMLCALL +XMLPUBFUN xmlNodePtr XMLCALL xmlGetLastChild (xmlNodePtr parent); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlNodeIsText (xmlNodePtr node); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlIsBlankNode (xmlNodePtr node); /* * Changing the structure. */ #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_WRITER_ENABLED) -XMLPUBFUN xmlNodePtr XMLCALL +XMLPUBFUN xmlNodePtr XMLCALL xmlDocSetRootElement (xmlDocPtr doc, xmlNodePtr root); #endif /* defined(LIBXML_TREE_ENABLED) || defined(LIBXML_WRITER_ENABLED) */ #ifdef LIBXML_TREE_ENABLED -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlNodeSetName (xmlNodePtr cur, const xmlChar *name); #endif /* LIBXML_TREE_ENABLED */ -XMLPUBFUN xmlNodePtr XMLCALL +XMLPUBFUN xmlNodePtr XMLCALL xmlAddChild (xmlNodePtr parent, xmlNodePtr cur); -XMLPUBFUN xmlNodePtr XMLCALL +XMLPUBFUN xmlNodePtr XMLCALL xmlAddChildList (xmlNodePtr parent, xmlNodePtr cur); #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_WRITER_ENABLED) -XMLPUBFUN xmlNodePtr XMLCALL +XMLPUBFUN xmlNodePtr XMLCALL xmlReplaceNode (xmlNodePtr old, xmlNodePtr cur); #endif /* defined(LIBXML_TREE_ENABLED) || defined(LIBXML_WRITER_ENABLED) */ #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_HTML_ENABLED) || \ defined(LIBXML_SCHEMAS_ENABLED) -XMLPUBFUN xmlNodePtr XMLCALL +XMLPUBFUN xmlNodePtr XMLCALL xmlAddPrevSibling (xmlNodePtr cur, xmlNodePtr elem); #endif /* LIBXML_TREE_ENABLED || LIBXML_HTML_ENABLED || LIBXML_SCHEMAS_ENABLED */ -XMLPUBFUN xmlNodePtr XMLCALL +XMLPUBFUN xmlNodePtr XMLCALL xmlAddSibling (xmlNodePtr cur, xmlNodePtr elem); -XMLPUBFUN xmlNodePtr XMLCALL +XMLPUBFUN xmlNodePtr XMLCALL xmlAddNextSibling (xmlNodePtr cur, xmlNodePtr elem); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlUnlinkNode (xmlNodePtr cur); -XMLPUBFUN xmlNodePtr XMLCALL +XMLPUBFUN xmlNodePtr XMLCALL xmlTextMerge (xmlNodePtr first, xmlNodePtr second); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlTextConcat (xmlNodePtr node, const xmlChar *content, int len); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlFreeNodeList (xmlNodePtr cur); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlFreeNode (xmlNodePtr cur); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlSetTreeDoc (xmlNodePtr tree, xmlDocPtr doc); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlSetListDoc (xmlNodePtr list, xmlDocPtr doc); /* * Namespaces. */ -XMLPUBFUN xmlNsPtr XMLCALL +XMLPUBFUN xmlNsPtr XMLCALL xmlSearchNs (xmlDocPtr doc, xmlNodePtr node, const xmlChar *nameSpace); -XMLPUBFUN xmlNsPtr XMLCALL +XMLPUBFUN xmlNsPtr XMLCALL xmlSearchNsByHref (xmlDocPtr doc, xmlNodePtr node, const xmlChar *href); #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) -XMLPUBFUN xmlNsPtr * XMLCALL +XMLPUBFUN xmlNsPtr * XMLCALL xmlGetNsList (xmlDocPtr doc, xmlNodePtr node); #endif /* defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XPATH_ENABLED) */ -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlSetNs (xmlNodePtr node, xmlNsPtr ns); -XMLPUBFUN xmlNsPtr XMLCALL +XMLPUBFUN xmlNsPtr XMLCALL xmlCopyNamespace (xmlNsPtr cur); -XMLPUBFUN xmlNsPtr XMLCALL +XMLPUBFUN xmlNsPtr XMLCALL xmlCopyNamespaceList (xmlNsPtr cur); /* * Changing the content. */ #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_HTML_ENABLED) -XMLPUBFUN xmlAttrPtr XMLCALL +XMLPUBFUN xmlAttrPtr XMLCALL xmlSetProp (xmlNodePtr node, const xmlChar *name, const xmlChar *value); -XMLPUBFUN xmlAttrPtr XMLCALL +XMLPUBFUN xmlAttrPtr XMLCALL xmlSetNsProp (xmlNodePtr node, xmlNsPtr ns, const xmlChar *name, const xmlChar *value); #endif /* defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_HTML_ENABLED) */ -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlGetNoNsProp (xmlNodePtr node, const xmlChar *name); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlGetProp (xmlNodePtr node, const xmlChar *name); -XMLPUBFUN xmlAttrPtr XMLCALL +XMLPUBFUN xmlAttrPtr XMLCALL xmlHasProp (xmlNodePtr node, const xmlChar *name); -XMLPUBFUN xmlAttrPtr XMLCALL +XMLPUBFUN xmlAttrPtr XMLCALL xmlHasNsProp (xmlNodePtr node, const xmlChar *name, const xmlChar *nameSpace); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlGetNsProp (xmlNodePtr node, const xmlChar *name, const xmlChar *nameSpace); -XMLPUBFUN xmlNodePtr XMLCALL +XMLPUBFUN xmlNodePtr XMLCALL xmlStringGetNodeList (xmlDocPtr doc, const xmlChar *value); -XMLPUBFUN xmlNodePtr XMLCALL +XMLPUBFUN xmlNodePtr XMLCALL xmlStringLenGetNodeList (xmlDocPtr doc, const xmlChar *value, int len); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlNodeListGetString (xmlDocPtr doc, xmlNodePtr list, int inLine); #ifdef LIBXML_TREE_ENABLED -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlNodeListGetRawString (xmlDocPtr doc, xmlNodePtr list, int inLine); #endif /* LIBXML_TREE_ENABLED */ -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlNodeSetContent (xmlNodePtr cur, const xmlChar *content); #ifdef LIBXML_TREE_ENABLED -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlNodeSetContentLen (xmlNodePtr cur, const xmlChar *content, int len); #endif /* LIBXML_TREE_ENABLED */ -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlNodeAddContent (xmlNodePtr cur, const xmlChar *content); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlNodeAddContentLen (xmlNodePtr cur, const xmlChar *content, int len); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlNodeGetContent (xmlNodePtr cur); + XMLPUBFUN int XMLCALL xmlNodeBufGetContent (xmlBufferPtr buffer, xmlNodePtr cur); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN int XMLCALL + xmlBufGetNodeContent (xmlBufPtr buf, + xmlNodePtr cur); + +XMLPUBFUN xmlChar * XMLCALL xmlNodeGetLang (xmlNodePtr cur); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlNodeGetSpacePreserve (xmlNodePtr cur); #ifdef LIBXML_TREE_ENABLED -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlNodeSetLang (xmlNodePtr cur, const xmlChar *lang); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlNodeSetSpacePreserve (xmlNodePtr cur, int val); #endif /* LIBXML_TREE_ENABLED */ -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlNodeGetBase (xmlDocPtr doc, xmlNodePtr cur); #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlNodeSetBase (xmlNodePtr cur, const xmlChar *uri); #endif @@ -1053,14 +1098,14 @@ XMLPUBFUN void XMLCALL /* * Removing content. */ -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlRemoveProp (xmlAttrPtr cur); #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlUnsetNsProp (xmlNodePtr node, xmlNsPtr ns, const xmlChar *name); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlUnsetProp (xmlNodePtr node, const xmlChar *name); #endif /* defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) */ @@ -1068,13 +1113,13 @@ XMLPUBFUN int XMLCALL /* * Internal, don't use. */ -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlBufferWriteCHAR (xmlBufferPtr buf, const xmlChar *string); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlBufferWriteChar (xmlBufferPtr buf, const char *string); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlBufferWriteQuotedString(xmlBufferPtr buf, const xmlChar *string); @@ -1089,7 +1134,7 @@ XMLPUBFUN void xmlAttrSerializeTxtContent(xmlBufferPtr buf, /* * Namespace handling. */ -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlReconciliateNs (xmlDocPtr doc, xmlNodePtr tree); #endif @@ -1098,61 +1143,67 @@ XMLPUBFUN int XMLCALL /* * Saving. */ -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlDocDumpFormatMemory (xmlDocPtr cur, xmlChar **mem, int *size, int format); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlDocDumpMemory (xmlDocPtr cur, xmlChar **mem, int *size); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlDocDumpMemoryEnc (xmlDocPtr out_doc, xmlChar **doc_txt_ptr, int * doc_txt_len, const char *txt_encoding); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlDocDumpFormatMemoryEnc(xmlDocPtr out_doc, xmlChar **doc_txt_ptr, int * doc_txt_len, const char *txt_encoding, int format); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlDocFormatDump (FILE *f, xmlDocPtr cur, int format); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlDocDump (FILE *f, xmlDocPtr cur); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlElemDump (FILE *f, xmlDocPtr doc, xmlNodePtr cur); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlSaveFile (const char *filename, xmlDocPtr cur); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlSaveFormatFile (const char *filename, xmlDocPtr cur, int format); -XMLPUBFUN int XMLCALL +XMLPUBFUN size_t XMLCALL + xmlBufNodeDump (xmlBufPtr buf, + xmlDocPtr doc, + xmlNodePtr cur, + int level, + int format); +XMLPUBFUN int XMLCALL xmlNodeDump (xmlBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur, int level, int format); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlSaveFileTo (xmlOutputBufferPtr buf, xmlDocPtr cur, const char *encoding); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlSaveFormatFileTo (xmlOutputBufferPtr buf, xmlDocPtr cur, const char *encoding, int format); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlNodeDumpOutput (xmlOutputBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur, @@ -1160,13 +1211,13 @@ XMLPUBFUN void XMLCALL int format, const char *encoding); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlSaveFormatFileEnc (const char *filename, xmlDocPtr cur, const char *encoding, int format); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlSaveFileEnc (const char *filename, xmlDocPtr cur, const char *encoding); @@ -1175,21 +1226,21 @@ XMLPUBFUN int XMLCALL /* * XHTML */ -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlIsXHTML (const xmlChar *systemID, const xmlChar *publicID); /* * Compression. */ -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlGetDocCompressMode (xmlDocPtr doc); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlSetDocCompressMode (xmlDocPtr doc, int mode); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlGetCompressMode (void); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlSetCompressMode (int mode); /* @@ -1207,7 +1258,7 @@ XMLPUBFUN int XMLCALL xmlDOMWrapAdoptNode (xmlDOMWrapCtxtPtr ctxt, xmlDocPtr sourceDoc, xmlNodePtr node, - xmlDocPtr destDoc, + xmlDocPtr destDoc, xmlNodePtr destParent, int options); XMLPUBFUN int XMLCALL diff --git a/vendors/libxml2/include/libxml/uri.h b/vendors/libxml/src/libxml/uri.h similarity index 100% rename from vendors/libxml2/include/libxml/uri.h rename to vendors/libxml/src/libxml/uri.h diff --git a/vendors/libxml2/include/libxml/valid.h b/vendors/libxml/src/libxml/valid.h similarity index 84% rename from vendors/libxml2/include/libxml/valid.h rename to vendors/libxml/src/libxml/valid.h index a2307f1..2bc7b38 100644 --- a/vendors/libxml2/include/libxml/valid.h +++ b/vendors/libxml/src/libxml/valid.h @@ -150,55 +150,55 @@ typedef struct _xmlHashTable xmlRefTable; typedef xmlRefTable *xmlRefTablePtr; /* Notation */ -XMLPUBFUN xmlNotationPtr XMLCALL +XMLPUBFUN xmlNotationPtr XMLCALL xmlAddNotationDecl (xmlValidCtxtPtr ctxt, xmlDtdPtr dtd, const xmlChar *name, const xmlChar *PublicID, const xmlChar *SystemID); #ifdef LIBXML_TREE_ENABLED -XMLPUBFUN xmlNotationTablePtr XMLCALL +XMLPUBFUN xmlNotationTablePtr XMLCALL xmlCopyNotationTable (xmlNotationTablePtr table); #endif /* LIBXML_TREE_ENABLED */ -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlFreeNotationTable (xmlNotationTablePtr table); #ifdef LIBXML_OUTPUT_ENABLED -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlDumpNotationDecl (xmlBufferPtr buf, xmlNotationPtr nota); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlDumpNotationTable (xmlBufferPtr buf, xmlNotationTablePtr table); #endif /* LIBXML_OUTPUT_ENABLED */ /* Element Content */ /* the non Doc version are being deprecated */ -XMLPUBFUN xmlElementContentPtr XMLCALL +XMLPUBFUN xmlElementContentPtr XMLCALL xmlNewElementContent (const xmlChar *name, xmlElementContentType type); -XMLPUBFUN xmlElementContentPtr XMLCALL +XMLPUBFUN xmlElementContentPtr XMLCALL xmlCopyElementContent (xmlElementContentPtr content); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlFreeElementContent (xmlElementContentPtr cur); /* the new versions with doc argument */ -XMLPUBFUN xmlElementContentPtr XMLCALL +XMLPUBFUN xmlElementContentPtr XMLCALL xmlNewDocElementContent (xmlDocPtr doc, const xmlChar *name, xmlElementContentType type); -XMLPUBFUN xmlElementContentPtr XMLCALL +XMLPUBFUN xmlElementContentPtr XMLCALL xmlCopyDocElementContent(xmlDocPtr doc, xmlElementContentPtr content); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlFreeDocElementContent(xmlDocPtr doc, xmlElementContentPtr cur); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlSnprintfElementContent(char *buf, int size, xmlElementContentPtr content, int englob); #ifdef LIBXML_OUTPUT_ENABLED /* DEPRECATED */ -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlSprintfElementContent(char *buf, xmlElementContentPtr content, int englob); @@ -206,39 +206,39 @@ XMLPUBFUN void XMLCALL /* DEPRECATED */ /* Element */ -XMLPUBFUN xmlElementPtr XMLCALL +XMLPUBFUN xmlElementPtr XMLCALL xmlAddElementDecl (xmlValidCtxtPtr ctxt, xmlDtdPtr dtd, const xmlChar *name, xmlElementTypeVal type, xmlElementContentPtr content); #ifdef LIBXML_TREE_ENABLED -XMLPUBFUN xmlElementTablePtr XMLCALL +XMLPUBFUN xmlElementTablePtr XMLCALL xmlCopyElementTable (xmlElementTablePtr table); #endif /* LIBXML_TREE_ENABLED */ -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlFreeElementTable (xmlElementTablePtr table); #ifdef LIBXML_OUTPUT_ENABLED -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlDumpElementTable (xmlBufferPtr buf, xmlElementTablePtr table); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlDumpElementDecl (xmlBufferPtr buf, xmlElementPtr elem); #endif /* LIBXML_OUTPUT_ENABLED */ /* Enumeration */ -XMLPUBFUN xmlEnumerationPtr XMLCALL +XMLPUBFUN xmlEnumerationPtr XMLCALL xmlCreateEnumeration (const xmlChar *name); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlFreeEnumeration (xmlEnumerationPtr cur); #ifdef LIBXML_TREE_ENABLED -XMLPUBFUN xmlEnumerationPtr XMLCALL +XMLPUBFUN xmlEnumerationPtr XMLCALL xmlCopyEnumeration (xmlEnumerationPtr cur); #endif /* LIBXML_TREE_ENABLED */ /* Attribute */ -XMLPUBFUN xmlAttributePtr XMLCALL +XMLPUBFUN xmlAttributePtr XMLCALL xmlAddAttributeDecl (xmlValidCtxtPtr ctxt, xmlDtdPtr dtd, const xmlChar *elem, @@ -249,55 +249,55 @@ XMLPUBFUN xmlAttributePtr XMLCALL const xmlChar *defaultValue, xmlEnumerationPtr tree); #ifdef LIBXML_TREE_ENABLED -XMLPUBFUN xmlAttributeTablePtr XMLCALL +XMLPUBFUN xmlAttributeTablePtr XMLCALL xmlCopyAttributeTable (xmlAttributeTablePtr table); #endif /* LIBXML_TREE_ENABLED */ -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlFreeAttributeTable (xmlAttributeTablePtr table); #ifdef LIBXML_OUTPUT_ENABLED -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlDumpAttributeTable (xmlBufferPtr buf, xmlAttributeTablePtr table); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlDumpAttributeDecl (xmlBufferPtr buf, xmlAttributePtr attr); #endif /* LIBXML_OUTPUT_ENABLED */ /* IDs */ -XMLPUBFUN xmlIDPtr XMLCALL +XMLPUBFUN xmlIDPtr XMLCALL xmlAddID (xmlValidCtxtPtr ctxt, xmlDocPtr doc, const xmlChar *value, xmlAttrPtr attr); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlFreeIDTable (xmlIDTablePtr table); -XMLPUBFUN xmlAttrPtr XMLCALL +XMLPUBFUN xmlAttrPtr XMLCALL xmlGetID (xmlDocPtr doc, const xmlChar *ID); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlIsID (xmlDocPtr doc, xmlNodePtr elem, xmlAttrPtr attr); -XMLPUBFUN int XMLCALL - xmlRemoveID (xmlDocPtr doc, +XMLPUBFUN int XMLCALL + xmlRemoveID (xmlDocPtr doc, xmlAttrPtr attr); /* IDREFs */ -XMLPUBFUN xmlRefPtr XMLCALL +XMLPUBFUN xmlRefPtr XMLCALL xmlAddRef (xmlValidCtxtPtr ctxt, xmlDocPtr doc, const xmlChar *value, xmlAttrPtr attr); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlFreeRefTable (xmlRefTablePtr table); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlIsRef (xmlDocPtr doc, xmlNodePtr elem, xmlAttrPtr attr); -XMLPUBFUN int XMLCALL - xmlRemoveRef (xmlDocPtr doc, +XMLPUBFUN int XMLCALL + xmlRemoveRef (xmlDocPtr doc, xmlAttrPtr attr); -XMLPUBFUN xmlListPtr XMLCALL +XMLPUBFUN xmlListPtr XMLCALL xmlGetRefs (xmlDocPtr doc, const xmlChar *ID); @@ -306,146 +306,146 @@ XMLPUBFUN xmlListPtr XMLCALL */ #ifdef LIBXML_VALID_ENABLED /* Allocate/Release Validation Contexts */ -XMLPUBFUN xmlValidCtxtPtr XMLCALL +XMLPUBFUN xmlValidCtxtPtr XMLCALL xmlNewValidCtxt(void); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlFreeValidCtxt(xmlValidCtxtPtr); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlValidateRoot (xmlValidCtxtPtr ctxt, xmlDocPtr doc); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlValidateElementDecl (xmlValidCtxtPtr ctxt, xmlDocPtr doc, xmlElementPtr elem); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlValidNormalizeAttributeValue(xmlDocPtr doc, xmlNodePtr elem, const xmlChar *name, const xmlChar *value); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlValidCtxtNormalizeAttributeValue(xmlValidCtxtPtr ctxt, xmlDocPtr doc, xmlNodePtr elem, const xmlChar *name, const xmlChar *value); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlValidateAttributeDecl(xmlValidCtxtPtr ctxt, xmlDocPtr doc, xmlAttributePtr attr); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlValidateAttributeValue(xmlAttributeType type, const xmlChar *value); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlValidateNotationDecl (xmlValidCtxtPtr ctxt, xmlDocPtr doc, xmlNotationPtr nota); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlValidateDtd (xmlValidCtxtPtr ctxt, xmlDocPtr doc, xmlDtdPtr dtd); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlValidateDtdFinal (xmlValidCtxtPtr ctxt, xmlDocPtr doc); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlValidateDocument (xmlValidCtxtPtr ctxt, xmlDocPtr doc); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlValidateElement (xmlValidCtxtPtr ctxt, xmlDocPtr doc, xmlNodePtr elem); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlValidateOneElement (xmlValidCtxtPtr ctxt, xmlDocPtr doc, xmlNodePtr elem); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlValidateOneAttribute (xmlValidCtxtPtr ctxt, xmlDocPtr doc, xmlNodePtr elem, xmlAttrPtr attr, const xmlChar *value); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlValidateOneNamespace (xmlValidCtxtPtr ctxt, xmlDocPtr doc, xmlNodePtr elem, const xmlChar *prefix, xmlNsPtr ns, const xmlChar *value); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlValidateDocumentFinal(xmlValidCtxtPtr ctxt, xmlDocPtr doc); #endif /* LIBXML_VALID_ENABLED */ #if defined(LIBXML_VALID_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlValidateNotationUse (xmlValidCtxtPtr ctxt, xmlDocPtr doc, const xmlChar *notationName); #endif /* LIBXML_VALID_ENABLED or LIBXML_SCHEMAS_ENABLED */ -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlIsMixedElement (xmlDocPtr doc, const xmlChar *name); -XMLPUBFUN xmlAttributePtr XMLCALL +XMLPUBFUN xmlAttributePtr XMLCALL xmlGetDtdAttrDesc (xmlDtdPtr dtd, const xmlChar *elem, const xmlChar *name); -XMLPUBFUN xmlAttributePtr XMLCALL +XMLPUBFUN xmlAttributePtr XMLCALL xmlGetDtdQAttrDesc (xmlDtdPtr dtd, const xmlChar *elem, const xmlChar *name, const xmlChar *prefix); -XMLPUBFUN xmlNotationPtr XMLCALL +XMLPUBFUN xmlNotationPtr XMLCALL xmlGetDtdNotationDesc (xmlDtdPtr dtd, const xmlChar *name); -XMLPUBFUN xmlElementPtr XMLCALL +XMLPUBFUN xmlElementPtr XMLCALL xmlGetDtdQElementDesc (xmlDtdPtr dtd, const xmlChar *name, const xmlChar *prefix); -XMLPUBFUN xmlElementPtr XMLCALL +XMLPUBFUN xmlElementPtr XMLCALL xmlGetDtdElementDesc (xmlDtdPtr dtd, const xmlChar *name); #ifdef LIBXML_VALID_ENABLED -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlValidGetPotentialChildren(xmlElementContent *ctree, const xmlChar **names, int *len, int max); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlValidGetValidElements(xmlNode *prev, xmlNode *next, const xmlChar **names, int max); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlValidateNameValue (const xmlChar *value); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlValidateNamesValue (const xmlChar *value); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlValidateNmtokenValue (const xmlChar *value); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlValidateNmtokensValue(const xmlChar *value); #ifdef LIBXML_REGEXP_ENABLED /* * Validation based on the regexp support */ -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlValidBuildContentModel(xmlValidCtxtPtr ctxt, xmlElementPtr elem); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlValidatePushElement (xmlValidCtxtPtr ctxt, xmlDocPtr doc, xmlNodePtr elem, const xmlChar *qname); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlValidatePushCData (xmlValidCtxtPtr ctxt, const xmlChar *data, int len); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlValidatePopElement (xmlValidCtxtPtr ctxt, xmlDocPtr doc, xmlNodePtr elem, diff --git a/vendors/libxml2/include/libxml/xinclude.h b/vendors/libxml/src/libxml/xinclude.h similarity index 100% rename from vendors/libxml2/include/libxml/xinclude.h rename to vendors/libxml/src/libxml/xinclude.h diff --git a/vendors/libxml2/include/libxml/xlink.h b/vendors/libxml/src/libxml/xlink.h similarity index 96% rename from vendors/libxml2/include/libxml/xlink.h rename to vendors/libxml/src/libxml/xlink.h index 083c7ed..a209a99 100644 --- a/vendors/libxml2/include/libxml/xlink.h +++ b/vendors/libxml/src/libxml/xlink.h @@ -57,7 +57,7 @@ typedef enum { * xlinkNodeDetectFunc: * @ctx: user data pointer * @node: the node to check - * + * * This is the prototype for the link detection routine. * It calls the default link detection callbacks upon link detection. */ @@ -157,26 +157,26 @@ struct _xlinkHandler { /* * The default detection routine, can be overridden, they call the default - * detection callbacks. + * detection callbacks. */ -XMLPUBFUN xlinkNodeDetectFunc XMLCALL +XMLPUBFUN xlinkNodeDetectFunc XMLCALL xlinkGetDefaultDetect (void); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xlinkSetDefaultDetect (xlinkNodeDetectFunc func); /* * Routines to set/get the default handlers. */ -XMLPUBFUN xlinkHandlerPtr XMLCALL +XMLPUBFUN xlinkHandlerPtr XMLCALL xlinkGetDefaultHandler (void); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xlinkSetDefaultHandler (xlinkHandlerPtr handler); /* * Link detection module itself. */ -XMLPUBFUN xlinkType XMLCALL +XMLPUBFUN xlinkType XMLCALL xlinkIsLink (xmlDocPtr doc, xmlNodePtr node); diff --git a/vendors/libxml2/include/libxml/xmlIO.h b/vendors/libxml/src/libxml/xmlIO.h similarity index 80% rename from vendors/libxml2/include/libxml/xmlIO.h rename to vendors/libxml/src/libxml/xmlIO.h index eea9ed6..6c241a8 100644 --- a/vendors/libxml2/include/libxml/xmlIO.h +++ b/vendors/libxml/src/libxml/xmlIO.h @@ -26,7 +26,7 @@ extern "C" { * xmlInputMatchCallback: * @filename: the filename or URI * - * Callback used in the I/O Input API to detect if the current handler + * Callback used in the I/O Input API to detect if the current handler * can provide input fonctionnalities for this resource. * * Returns 1 if yes and 0 if another Input module should be used @@ -72,7 +72,7 @@ typedef int (XMLCALL *xmlInputCloseCallback) (void * context); * xmlOutputMatchCallback: * @filename: the filename or URI * - * Callback used in the I/O Output API to detect if the current handler + * Callback used in the I/O Output API to detect if the current handler * can provide output fonctionnalities for this resource. * * Returns 1 if yes and 0 if another Output module should be used @@ -126,11 +126,11 @@ struct _xmlParserInputBuffer { void* context; xmlInputReadCallback readcallback; xmlInputCloseCallback closecallback; - + xmlCharEncodingHandlerPtr encoder; /* I18N conversions to UTF-8 */ - - xmlBufferPtr buffer; /* Local buffer encoded in UTF-8 */ - xmlBufferPtr raw; /* if encoder != NULL buffer for raw input */ + + xmlBufPtr buffer; /* Local buffer encoded in UTF-8 */ + xmlBufPtr raw; /* if encoder != NULL buffer for raw input */ int compressed; /* -1=unknown, 0=not compressed, 1=compressed */ int error; unsigned long rawconsumed;/* amount consumed from raw */ @@ -142,11 +142,11 @@ struct _xmlOutputBuffer { void* context; xmlOutputWriteCallback writecallback; xmlOutputCloseCallback closecallback; - + xmlCharEncodingHandlerPtr encoder; /* I18N conversions to UTF-8 */ - - xmlBufferPtr buffer; /* Local buffer encoded in UTF-8 or ISOLatin */ - xmlBufferPtr conv; /* if encoder != NULL buffer for output */ + + xmlBufPtr buffer; /* Local buffer encoded in UTF-8 or ISOLatin */ + xmlBufPtr conv; /* if encoder != NULL buffer for output */ int written; /* total number of byte written */ int error; }; @@ -155,13 +155,13 @@ struct _xmlOutputBuffer { /* * Interfaces for input */ -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlCleanupInputCallbacks (void); XMLPUBFUN int XMLCALL xmlPopInputCallbacks (void); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlRegisterDefaultInputCallbacks (void); XMLPUBFUN xmlParserInputBufferPtr XMLCALL xmlAllocParserInputBuffer (xmlCharEncoding enc); @@ -186,22 +186,22 @@ XMLPUBFUN xmlParserInputBufferPtr XMLCALL xmlInputCloseCallback ioclose, void *ioctx, xmlCharEncoding enc); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlParserInputBufferRead (xmlParserInputBufferPtr in, int len); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlParserInputBufferGrow (xmlParserInputBufferPtr in, int len); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlParserInputBufferPush (xmlParserInputBufferPtr in, int len, const char *buf); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlFreeParserInputBuffer (xmlParserInputBufferPtr in); -XMLPUBFUN char * XMLCALL +XMLPUBFUN char * XMLCALL xmlParserGetDirectory (const char *filename); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlRegisterInputCallbacks (xmlInputMatchCallback matchFunc, xmlInputOpenCallback openFunc, xmlInputReadCallback readFunc, @@ -215,9 +215,9 @@ xmlParserInputBufferPtr /* * Interfaces for output */ -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlCleanupOutputCallbacks (void); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlRegisterDefaultOutputCallbacks(void); XMLPUBFUN xmlOutputBufferPtr XMLCALL xmlAllocOutputBuffer (xmlCharEncodingHandlerPtr encoder); @@ -245,24 +245,30 @@ XMLPUBFUN xmlOutputBufferPtr XMLCALL void *ioctx, xmlCharEncodingHandlerPtr encoder); -XMLPUBFUN int XMLCALL +/* Couple of APIs to get the output without digging into the buffers */ +XMLPUBFUN const xmlChar * XMLCALL + xmlOutputBufferGetContent (xmlOutputBufferPtr out); +XMLPUBFUN size_t XMLCALL + xmlOutputBufferGetSize (xmlOutputBufferPtr out); + +XMLPUBFUN int XMLCALL xmlOutputBufferWrite (xmlOutputBufferPtr out, int len, const char *buf); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlOutputBufferWriteString (xmlOutputBufferPtr out, const char *str); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlOutputBufferWriteEscape (xmlOutputBufferPtr out, const xmlChar *str, xmlCharEncodingOutputFunc escaping); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlOutputBufferFlush (xmlOutputBufferPtr out); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlOutputBufferClose (xmlOutputBufferPtr out); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlRegisterOutputCallbacks (xmlOutputMatchCallback matchFunc, xmlOutputOpenCallback openFunc, xmlOutputWriteCallback writeFunc, @@ -275,10 +281,10 @@ xmlOutputBufferPtr #ifdef LIBXML_HTTP_ENABLED /* This function only exists if HTTP support built into the library */ -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlRegisterHTTPPostCallbacks (void ); #endif /* LIBXML_HTTP_ENABLED */ - + #endif /* LIBXML_OUTPUT_ENABLED */ XMLPUBFUN xmlParserInputPtr XMLCALL @@ -288,69 +294,69 @@ XMLPUBFUN xmlParserInputPtr XMLCALL /* * A predefined entity loader disabling network accesses */ -XMLPUBFUN xmlParserInputPtr XMLCALL +XMLPUBFUN xmlParserInputPtr XMLCALL xmlNoNetExternalEntityLoader (const char *URL, const char *ID, xmlParserCtxtPtr ctxt); -/* - * xmlNormalizeWindowsPath is obsolete, don't use it. +/* + * xmlNormalizeWindowsPath is obsolete, don't use it. * Check xmlCanonicPath in uri.h for a better alternative. */ -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlNormalizeWindowsPath (const xmlChar *path); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlCheckFilename (const char *path); /** - * Default 'file://' protocol callbacks + * Default 'file://' protocol callbacks */ -XMLPUBFUN int XMLCALL - xmlFileMatch (const char *filename); -XMLPUBFUN void * XMLCALL - xmlFileOpen (const char *filename); -XMLPUBFUN int XMLCALL - xmlFileRead (void * context, - char * buffer, +XMLPUBFUN int XMLCALL + xmlFileMatch (const char *filename); +XMLPUBFUN void * XMLCALL + xmlFileOpen (const char *filename); +XMLPUBFUN int XMLCALL + xmlFileRead (void * context, + char * buffer, int len); -XMLPUBFUN int XMLCALL - xmlFileClose (void * context); +XMLPUBFUN int XMLCALL + xmlFileClose (void * context); /** - * Default 'http://' protocol callbacks + * Default 'http://' protocol callbacks */ #ifdef LIBXML_HTTP_ENABLED -XMLPUBFUN int XMLCALL - xmlIOHTTPMatch (const char *filename); -XMLPUBFUN void * XMLCALL - xmlIOHTTPOpen (const char *filename); +XMLPUBFUN int XMLCALL + xmlIOHTTPMatch (const char *filename); +XMLPUBFUN void * XMLCALL + xmlIOHTTPOpen (const char *filename); #ifdef LIBXML_OUTPUT_ENABLED -XMLPUBFUN void * XMLCALL +XMLPUBFUN void * XMLCALL xmlIOHTTPOpenW (const char * post_uri, int compression ); #endif /* LIBXML_OUTPUT_ENABLED */ -XMLPUBFUN int XMLCALL - xmlIOHTTPRead (void * context, - char * buffer, +XMLPUBFUN int XMLCALL + xmlIOHTTPRead (void * context, + char * buffer, int len); -XMLPUBFUN int XMLCALL - xmlIOHTTPClose (void * context); +XMLPUBFUN int XMLCALL + xmlIOHTTPClose (void * context); #endif /* LIBXML_HTTP_ENABLED */ /** - * Default 'ftp://' protocol callbacks + * Default 'ftp://' protocol callbacks */ -#ifdef LIBXML_FTP_ENABLED -XMLPUBFUN int XMLCALL - xmlIOFTPMatch (const char *filename); -XMLPUBFUN void * XMLCALL - xmlIOFTPOpen (const char *filename); -XMLPUBFUN int XMLCALL - xmlIOFTPRead (void * context, - char * buffer, +#ifdef LIBXML_FTP_ENABLED +XMLPUBFUN int XMLCALL + xmlIOFTPMatch (const char *filename); +XMLPUBFUN void * XMLCALL + xmlIOFTPOpen (const char *filename); +XMLPUBFUN int XMLCALL + xmlIOFTPRead (void * context, + char * buffer, int len); -XMLPUBFUN int XMLCALL - xmlIOFTPClose (void * context); +XMLPUBFUN int XMLCALL + xmlIOFTPClose (void * context); #endif /* LIBXML_FTP_ENABLED */ #ifdef __cplusplus diff --git a/vendors/libxml2/include/libxml/xmlautomata.h b/vendors/libxml/src/libxml/xmlautomata.h similarity index 81% rename from vendors/libxml2/include/libxml/xmlautomata.h rename to vendors/libxml/src/libxml/xmlautomata.h index f98b55e..bf1b131 100644 --- a/vendors/libxml2/include/libxml/xmlautomata.h +++ b/vendors/libxml/src/libxml/xmlautomata.h @@ -40,25 +40,25 @@ typedef xmlAutomataState *xmlAutomataStatePtr; /* * Building API */ -XMLPUBFUN xmlAutomataPtr XMLCALL +XMLPUBFUN xmlAutomataPtr XMLCALL xmlNewAutomata (void); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlFreeAutomata (xmlAutomataPtr am); -XMLPUBFUN xmlAutomataStatePtr XMLCALL +XMLPUBFUN xmlAutomataStatePtr XMLCALL xmlAutomataGetInitState (xmlAutomataPtr am); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlAutomataSetFinalState (xmlAutomataPtr am, xmlAutomataStatePtr state); -XMLPUBFUN xmlAutomataStatePtr XMLCALL +XMLPUBFUN xmlAutomataStatePtr XMLCALL xmlAutomataNewState (xmlAutomataPtr am); -XMLPUBFUN xmlAutomataStatePtr XMLCALL +XMLPUBFUN xmlAutomataStatePtr XMLCALL xmlAutomataNewTransition (xmlAutomataPtr am, xmlAutomataStatePtr from, xmlAutomataStatePtr to, const xmlChar *token, void *data); -XMLPUBFUN xmlAutomataStatePtr XMLCALL +XMLPUBFUN xmlAutomataStatePtr XMLCALL xmlAutomataNewTransition2 (xmlAutomataPtr am, xmlAutomataStatePtr from, xmlAutomataStatePtr to, @@ -73,7 +73,7 @@ XMLPUBFUN xmlAutomataStatePtr XMLCALL const xmlChar *token2, void *data); -XMLPUBFUN xmlAutomataStatePtr XMLCALL +XMLPUBFUN xmlAutomataStatePtr XMLCALL xmlAutomataNewCountTrans (xmlAutomataPtr am, xmlAutomataStatePtr from, xmlAutomataStatePtr to, @@ -81,7 +81,7 @@ XMLPUBFUN xmlAutomataStatePtr XMLCALL int min, int max, void *data); -XMLPUBFUN xmlAutomataStatePtr XMLCALL +XMLPUBFUN xmlAutomataStatePtr XMLCALL xmlAutomataNewCountTrans2 (xmlAutomataPtr am, xmlAutomataStatePtr from, xmlAutomataStatePtr to, @@ -90,7 +90,7 @@ XMLPUBFUN xmlAutomataStatePtr XMLCALL int min, int max, void *data); -XMLPUBFUN xmlAutomataStatePtr XMLCALL +XMLPUBFUN xmlAutomataStatePtr XMLCALL xmlAutomataNewOnceTrans (xmlAutomataPtr am, xmlAutomataStatePtr from, xmlAutomataStatePtr to, @@ -99,46 +99,46 @@ XMLPUBFUN xmlAutomataStatePtr XMLCALL int max, void *data); XMLPUBFUN xmlAutomataStatePtr XMLCALL - xmlAutomataNewOnceTrans2 (xmlAutomataPtr am, + xmlAutomataNewOnceTrans2 (xmlAutomataPtr am, xmlAutomataStatePtr from, - xmlAutomataStatePtr to, + xmlAutomataStatePtr to, const xmlChar *token, const xmlChar *token2, - int min, - int max, + int min, + int max, void *data); -XMLPUBFUN xmlAutomataStatePtr XMLCALL +XMLPUBFUN xmlAutomataStatePtr XMLCALL xmlAutomataNewAllTrans (xmlAutomataPtr am, xmlAutomataStatePtr from, xmlAutomataStatePtr to, int lax); -XMLPUBFUN xmlAutomataStatePtr XMLCALL +XMLPUBFUN xmlAutomataStatePtr XMLCALL xmlAutomataNewEpsilon (xmlAutomataPtr am, xmlAutomataStatePtr from, xmlAutomataStatePtr to); -XMLPUBFUN xmlAutomataStatePtr XMLCALL +XMLPUBFUN xmlAutomataStatePtr XMLCALL xmlAutomataNewCountedTrans (xmlAutomataPtr am, xmlAutomataStatePtr from, xmlAutomataStatePtr to, int counter); -XMLPUBFUN xmlAutomataStatePtr XMLCALL +XMLPUBFUN xmlAutomataStatePtr XMLCALL xmlAutomataNewCounterTrans (xmlAutomataPtr am, xmlAutomataStatePtr from, xmlAutomataStatePtr to, int counter); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlAutomataNewCounter (xmlAutomataPtr am, int min, int max); -XMLPUBFUN xmlRegexpPtr XMLCALL +XMLPUBFUN xmlRegexpPtr XMLCALL xmlAutomataCompile (xmlAutomataPtr am); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlAutomataIsDeterminist (xmlAutomataPtr am); #ifdef __cplusplus } -#endif +#endif #endif /* LIBXML_AUTOMATA_ENABLED */ #endif /* LIBXML_REGEXP_ENABLED */ diff --git a/vendors/libxml2/include/libxml/xmlerror.h b/vendors/libxml/src/libxml/xmlerror.h similarity index 99% rename from vendors/libxml2/include/libxml/xmlerror.h rename to vendors/libxml/src/libxml/xmlerror.h index e924211..537a396 100644 --- a/vendors/libxml2/include/libxml/xmlerror.h +++ b/vendors/libxml/src/libxml/xmlerror.h @@ -62,7 +62,9 @@ typedef enum { XML_FROM_WRITER, /* The xmlwriter module */ XML_FROM_MODULE, /* The dynamically loaded module module*/ XML_FROM_I18N, /* The module handling character conversion */ - XML_FROM_SCHEMATRONV /* The Schematron validator module */ + XML_FROM_SCHEMATRONV,/* The Schematron validator module */ + XML_FROM_BUFFER, /* The buffers module */ + XML_FROM_URI /* The URI module */ } xmlErrorDomain; /** @@ -205,6 +207,8 @@ typedef enum { XML_WAR_ENTITY_REDEFINED, /* 107 */ XML_ERR_UNKNOWN_VERSION, /* 108 */ XML_ERR_VERSION_MISMATCH, /* 109 */ + XML_ERR_NAME_TOO_LONG, /* 110 */ + XML_ERR_USER_STOP, /* 111 */ XML_NS_ERR_XML_NAMESPACE = 200, XML_NS_ERR_UNDEFINED_NAMESPACE, /* 201 */ XML_NS_ERR_QNAME, /* 202 */ @@ -825,11 +829,8 @@ typedef enum { XML_I18N_NO_HANDLER, /* 6001 */ XML_I18N_EXCESS_HANDLER, /* 6002 */ XML_I18N_CONV_FAILED, /* 6003 */ - XML_I18N_NO_OUTPUT /* 6004 */ -#if 0 - XML_CHECK_, /* 5033 */ - XML_CHECK_X /* 503 */ -#endif + XML_I18N_NO_OUTPUT, /* 6004 */ + XML_BUF_OVERFLOW = 7000 } xmlParserErrors; /** diff --git a/vendors/libxml2/include/libxml/xmlexports.h b/vendors/libxml/src/libxml/xmlexports.h similarity index 98% rename from vendors/libxml2/include/libxml/xmlexports.h rename to vendors/libxml/src/libxml/xmlexports.h index 9c6790c..2c79f81 100644 --- a/vendors/libxml2/include/libxml/xmlexports.h +++ b/vendors/libxml/src/libxml/xmlexports.h @@ -43,7 +43,7 @@ /** * XMLCDECL: * - * Macro which declares the calling convention for exported functions that + * Macro which declares the calling convention for exported functions that * use '...'. */ #define XMLCDECL @@ -115,7 +115,7 @@ */ #if defined(IN_LIBXML) && !defined(LIBXML_STATIC) #define XMLPUBFUN __declspec(dllexport) - #define XMLPUBVAR __declspec(dllexport) + #define XMLPUBVAR __declspec(dllexport) extern #else #define XMLPUBFUN #if !defined(LIBXML_STATIC) diff --git a/vendors/libxml2/include/libxml/xmlmemory.h b/vendors/libxml/src/libxml/xmlmemory.h similarity index 100% rename from vendors/libxml2/include/libxml/xmlmemory.h rename to vendors/libxml/src/libxml/xmlmemory.h diff --git a/vendors/libxml2/include/libxml/xmlmodule.h b/vendors/libxml/src/libxml/xmlmodule.h similarity index 99% rename from vendors/libxml2/include/libxml/xmlmodule.h rename to vendors/libxml/src/libxml/xmlmodule.h index 8f4a560..9667820 100644 --- a/vendors/libxml2/include/libxml/xmlmodule.h +++ b/vendors/libxml/src/libxml/xmlmodule.h @@ -50,7 +50,7 @@ XMLPUBFUN int XMLCALL xmlModuleFree (xmlModulePtr module); #ifdef __cplusplus } -#endif +#endif #endif /* LIBXML_MODULES_ENABLED */ diff --git a/vendors/libxml2/include/libxml/xmlreader.h b/vendors/libxml/src/libxml/xmlreader.h similarity index 91% rename from vendors/libxml2/include/libxml/xmlreader.h rename to vendors/libxml/src/libxml/xmlreader.h index 6964482..2c99e3a 100644 --- a/vendors/libxml2/include/libxml/xmlreader.h +++ b/vendors/libxml/src/libxml/xmlreader.h @@ -130,16 +130,16 @@ XMLPUBFUN int XMLCALL #ifdef LIBXML_WRITER_ENABLED XMLPUBFUN xmlChar * XMLCALL - xmlTextReaderReadInnerXml (xmlTextReaderPtr reader); + xmlTextReaderReadInnerXml(xmlTextReaderPtr reader); XMLPUBFUN xmlChar * XMLCALL - xmlTextReaderReadOuterXml (xmlTextReaderPtr reader); + xmlTextReaderReadOuterXml(xmlTextReaderPtr reader); #endif XMLPUBFUN xmlChar * XMLCALL - xmlTextReaderReadString (xmlTextReaderPtr reader); + xmlTextReaderReadString (xmlTextReaderPtr reader); XMLPUBFUN int XMLCALL - xmlTextReaderReadAttributeValue (xmlTextReaderPtr reader); + xmlTextReaderReadAttributeValue(xmlTextReaderPtr reader); /* * Attributes of the node @@ -284,6 +284,11 @@ XMLPUBFUN int XMLCALL XMLPUBFUN int XMLCALL xmlTextReaderRelaxNGValidate(xmlTextReaderPtr reader, const char *rng); +XMLPUBFUN int XMLCALL + xmlTextReaderRelaxNGValidateCtxt(xmlTextReaderPtr reader, + xmlRelaxNGValidCtxtPtr ctxt, + int options); + XMLPUBFUN int XMLCALL xmlTextReaderRelaxNGSetSchema(xmlTextReaderPtr reader, xmlRelaxNGPtr schema); @@ -392,27 +397,26 @@ typedef void * xmlTextReaderLocatorPtr; * * Signature of an error callback from a reader parser */ -typedef void (XMLCALL *xmlTextReaderErrorFunc)(void *arg, - const char *msg, - xmlParserSeverities severity, - xmlTextReaderLocatorPtr locator); +typedef void (XMLCALL *xmlTextReaderErrorFunc)(void *arg, + const char *msg, + xmlParserSeverities severity, + xmlTextReaderLocatorPtr locator); XMLPUBFUN int XMLCALL - xmlTextReaderLocatorLineNumber(xmlTextReaderLocatorPtr locator); -/*int xmlTextReaderLocatorLinePosition(xmlTextReaderLocatorPtr locator);*/ + xmlTextReaderLocatorLineNumber(xmlTextReaderLocatorPtr locator); XMLPUBFUN xmlChar * XMLCALL - xmlTextReaderLocatorBaseURI (xmlTextReaderLocatorPtr locator); + xmlTextReaderLocatorBaseURI (xmlTextReaderLocatorPtr locator); XMLPUBFUN void XMLCALL - xmlTextReaderSetErrorHandler(xmlTextReaderPtr reader, - xmlTextReaderErrorFunc f, - void *arg); + xmlTextReaderSetErrorHandler(xmlTextReaderPtr reader, + xmlTextReaderErrorFunc f, + void *arg); XMLPUBFUN void XMLCALL - xmlTextReaderSetStructuredErrorHandler(xmlTextReaderPtr reader, - xmlStructuredErrorFunc f, - void *arg); + xmlTextReaderSetStructuredErrorHandler(xmlTextReaderPtr reader, + xmlStructuredErrorFunc f, + void *arg); XMLPUBFUN void XMLCALL - xmlTextReaderGetErrorHandler(xmlTextReaderPtr reader, - xmlTextReaderErrorFunc *f, - void **arg); + xmlTextReaderGetErrorHandler(xmlTextReaderPtr reader, + xmlTextReaderErrorFunc *f, + void **arg); #endif /* LIBXML_READER_ENABLED */ diff --git a/vendors/libxml2/include/libxml/xmlregexp.h b/vendors/libxml/src/libxml/xmlregexp.h similarity index 100% rename from vendors/libxml2/include/libxml/xmlregexp.h rename to vendors/libxml/src/libxml/xmlregexp.h diff --git a/vendors/libxml2/include/libxml/xmlsave.h b/vendors/libxml/src/libxml/xmlsave.h similarity index 100% rename from vendors/libxml2/include/libxml/xmlsave.h rename to vendors/libxml/src/libxml/xmlsave.h diff --git a/vendors/libxml2/include/libxml/xmlschemas.h b/vendors/libxml/src/libxml/xmlschemas.h similarity index 84% rename from vendors/libxml2/include/libxml/xmlschemas.h rename to vendors/libxml/src/libxml/xmlschemas.h index 752bc3a..97930c7 100644 --- a/vendors/libxml2/include/libxml/xmlschemas.h +++ b/vendors/libxml/src/libxml/xmlschemas.h @@ -92,7 +92,8 @@ typedef xmlSchema *xmlSchemaPtr; * * Signature of an error callback from an XSD validation */ -typedef void (XMLCDECL *xmlSchemaValidityErrorFunc) (void *ctx, const char *msg, ...) LIBXML_ATTR_FORMAT(2,3); +typedef void (XMLCDECL *xmlSchemaValidityErrorFunc) + (void *ctx, const char *msg, ...) LIBXML_ATTR_FORMAT(2,3); /** * xmlSchemaValidityWarningFunc: @@ -102,7 +103,8 @@ typedef void (XMLCDECL *xmlSchemaValidityErrorFunc) (void *ctx, const char *msg, * * Signature of a warning callback from an XSD validation */ -typedef void (XMLCDECL *xmlSchemaValidityWarningFunc) (void *ctx, const char *msg, ...) LIBXML_ATTR_FORMAT(2,3); +typedef void (XMLCDECL *xmlSchemaValidityWarningFunc) + (void *ctx, const char *msg, ...) LIBXML_ATTR_FORMAT(2,3); /** * A schemas validation context @@ -113,6 +115,22 @@ typedef xmlSchemaParserCtxt *xmlSchemaParserCtxtPtr; typedef struct _xmlSchemaValidCtxt xmlSchemaValidCtxt; typedef xmlSchemaValidCtxt *xmlSchemaValidCtxtPtr; +/** + * xmlSchemaValidityLocatorFunc: + * @ctx: user provided context + * @file: returned file information + * @line: returned line information + * + * A schemas validation locator, a callback called by the validator. + * This is used when file or node informations are not available + * to find out what file and line number are affected + * + * Returns: 0 in case of success and -1 in case of error + */ + +typedef int (XMLCDECL *xmlSchemaValidityLocatorFunc) (void *ctx, + const char **file, unsigned long *line); + /* * Interfaces for parsing. */ @@ -171,6 +189,9 @@ XMLPUBFUN int XMLCALL XMLPUBFUN int XMLCALL xmlSchemaSetValidOptions (xmlSchemaValidCtxtPtr ctxt, int options); +XMLPUBFUN void XMLCALL + xmlSchemaValidateSetFilename(xmlSchemaValidCtxtPtr vctxt, + const char *filename); XMLPUBFUN int XMLCALL xmlSchemaValidCtxtGetOptions(xmlSchemaValidCtxtPtr ctxt); @@ -210,6 +231,13 @@ XMLPUBFUN xmlSchemaSAXPlugPtr XMLCALL void **user_data); XMLPUBFUN int XMLCALL xmlSchemaSAXUnplug (xmlSchemaSAXPlugPtr plug); + + +XMLPUBFUN void XMLCALL + xmlSchemaValidateSetLocator (xmlSchemaValidCtxtPtr vctxt, + xmlSchemaValidityLocatorFunc f, + void *ctxt); + #ifdef __cplusplus } #endif diff --git a/vendors/libxml2/include/libxml/xmlschemastypes.h b/vendors/libxml/src/libxml/xmlschemastypes.h similarity index 85% rename from vendors/libxml2/include/libxml/xmlschemastypes.h rename to vendors/libxml/src/libxml/xmlschemastypes.h index 9a3a7a1..35d48d4 100644 --- a/vendors/libxml2/include/libxml/xmlschemastypes.h +++ b/vendors/libxml/src/libxml/xmlschemastypes.h @@ -30,23 +30,23 @@ typedef enum { XML_SCHEMA_WHITESPACE_COLLAPSE = 3 } xmlSchemaWhitespaceValueType; -XMLPUBFUN void XMLCALL - xmlSchemaInitTypes (void); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL + xmlSchemaInitTypes (void); +XMLPUBFUN void XMLCALL xmlSchemaCleanupTypes (void); -XMLPUBFUN xmlSchemaTypePtr XMLCALL +XMLPUBFUN xmlSchemaTypePtr XMLCALL xmlSchemaGetPredefinedType (const xmlChar *name, const xmlChar *ns); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlSchemaValidatePredefinedType (xmlSchemaTypePtr type, const xmlChar *value, xmlSchemaValPtr *val); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlSchemaValPredefTypeNode (xmlSchemaTypePtr type, const xmlChar *value, xmlSchemaValPtr *val, xmlNodePtr node); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlSchemaValidateFacet (xmlSchemaTypePtr base, xmlSchemaFacetPtr facet, const xmlChar *value, @@ -54,25 +54,25 @@ XMLPUBFUN int XMLCALL XMLPUBFUN int XMLCALL xmlSchemaValidateFacetWhtsp (xmlSchemaFacetPtr facet, xmlSchemaWhitespaceValueType fws, - xmlSchemaValType valType, + xmlSchemaValType valType, const xmlChar *value, xmlSchemaValPtr val, xmlSchemaWhitespaceValueType ws); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlSchemaFreeValue (xmlSchemaValPtr val); -XMLPUBFUN xmlSchemaFacetPtr XMLCALL +XMLPUBFUN xmlSchemaFacetPtr XMLCALL xmlSchemaNewFacet (void); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlSchemaCheckFacet (xmlSchemaFacetPtr facet, xmlSchemaTypePtr typeDecl, xmlSchemaParserCtxtPtr ctxt, const xmlChar *name); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlSchemaFreeFacet (xmlSchemaFacetPtr facet); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlSchemaCompareValues (xmlSchemaValPtr x, xmlSchemaValPtr y); -XMLPUBFUN xmlSchemaTypePtr XMLCALL +XMLPUBFUN xmlSchemaTypePtr XMLCALL xmlSchemaGetBuiltInListSimpleTypeItemType (xmlSchemaTypePtr type); XMLPUBFUN int XMLCALL xmlSchemaValidateListSimpleTypeFacet (xmlSchemaFacetPtr facet, @@ -82,7 +82,7 @@ XMLPUBFUN int XMLCALL XMLPUBFUN xmlSchemaTypePtr XMLCALL xmlSchemaGetBuiltInType (xmlSchemaValType type); XMLPUBFUN int XMLCALL - xmlSchemaIsBuiltInTypeFacet (xmlSchemaTypePtr type, + xmlSchemaIsBuiltInTypeFacet (xmlSchemaTypePtr type, int facetType); XMLPUBFUN xmlChar * XMLCALL xmlSchemaCollapseString (const xmlChar *value); @@ -91,7 +91,7 @@ XMLPUBFUN xmlChar * XMLCALL XMLPUBFUN unsigned long XMLCALL xmlSchemaGetFacetValueAsULong (xmlSchemaFacetPtr facet); XMLPUBFUN int XMLCALL - xmlSchemaValidateLengthFacet (xmlSchemaTypePtr type, + xmlSchemaValidateLengthFacet (xmlSchemaTypePtr type, xmlSchemaFacetPtr facet, const xmlChar *value, xmlSchemaValPtr val, @@ -100,19 +100,19 @@ XMLPUBFUN int XMLCALL xmlSchemaValidateLengthFacetWhtsp(xmlSchemaFacetPtr facet, xmlSchemaValType valType, const xmlChar *value, - xmlSchemaValPtr val, + xmlSchemaValPtr val, unsigned long *length, xmlSchemaWhitespaceValueType ws); XMLPUBFUN int XMLCALL - xmlSchemaValPredefTypeNodeNoNorm(xmlSchemaTypePtr type, + xmlSchemaValPredefTypeNodeNoNorm(xmlSchemaTypePtr type, const xmlChar *value, - xmlSchemaValPtr *val, + xmlSchemaValPtr *val, xmlNodePtr node); XMLPUBFUN int XMLCALL xmlSchemaGetCanonValue (xmlSchemaValPtr val, const xmlChar **retValue); XMLPUBFUN int XMLCALL - xmlSchemaGetCanonValueWhtsp (xmlSchemaValPtr val, + xmlSchemaGetCanonValueWhtsp (xmlSchemaValPtr val, const xmlChar **retValue, xmlSchemaWhitespaceValueType ws); XMLPUBFUN int XMLCALL diff --git a/vendors/libxml2/include/libxml/xmlstring.h b/vendors/libxml/src/libxml/xmlstring.h similarity index 98% rename from vendors/libxml2/include/libxml/xmlstring.h rename to vendors/libxml/src/libxml/xmlstring.h index 0bc6888..2036236 100644 --- a/vendors/libxml2/include/libxml/xmlstring.h +++ b/vendors/libxml/src/libxml/xmlstring.h @@ -113,16 +113,16 @@ XMLPUBFUN int XMLCALL XMLPUBFUN int XMLCALL xmlUTF8Strsize (const xmlChar *utf, int len); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlUTF8Strndup (const xmlChar *utf, int len); -XMLPUBFUN const xmlChar * XMLCALL +XMLPUBFUN const xmlChar * XMLCALL xmlUTF8Strpos (const xmlChar *utf, int pos); XMLPUBFUN int XMLCALL xmlUTF8Strloc (const xmlChar *utf, const xmlChar *utfchar); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlUTF8Strsub (const xmlChar *utf, int start, int len); diff --git a/vendors/libxml2/include/libxml/xmlunicode.h b/vendors/libxml/src/libxml/xmlunicode.h similarity index 100% rename from vendors/libxml2/include/libxml/xmlunicode.h rename to vendors/libxml/src/libxml/xmlunicode.h diff --git a/vendors/libxml2/include/libxml/xmlversion.h b/vendors/libxml/src/libxml/xmlversion.h similarity index 91% rename from vendors/libxml2/include/libxml/xmlversion.h rename to vendors/libxml/src/libxml/xmlversion.h index 2ac7c55..09e546f 100644 --- a/vendors/libxml2/include/libxml/xmlversion.h +++ b/vendors/libxml/src/libxml/xmlversion.h @@ -29,28 +29,28 @@ XMLPUBFUN void XMLCALL xmlCheckVersion(int version); * * the version string like "1.2.3" */ -#define LIBXML_DOTTED_VERSION "2.7.8" +#define LIBXML_DOTTED_VERSION "2.9.1" /** * LIBXML_VERSION: * * the version number: 1.2.3 value is 10203 */ -#define LIBXML_VERSION 20708 +#define LIBXML_VERSION 20901 /** * LIBXML_VERSION_STRING: * * the version number string, 1.2.3 value is "10203" */ -#define LIBXML_VERSION_STRING "20708" +#define LIBXML_VERSION_STRING "20901" /** * LIBXML_VERSION_EXTRA: * * extra version information, used to show a CVS compilation */ -#define LIBXML_VERSION_EXTRA "" +#define LIBXML_VERSION_EXTRA "-GITv2.9.0-69-gc0a8dd1" /** * LIBXML_TEST_VERSION: @@ -58,7 +58,7 @@ XMLPUBFUN void XMLCALL xmlCheckVersion(int version); * Macro to check that the libxml version in use is compatible with * the version the software has been compiled against */ -#define LIBXML_TEST_VERSION xmlCheckVersion(20708); +#define LIBXML_TEST_VERSION xmlCheckVersion(20901); #ifndef VMS #if 0 @@ -97,6 +97,15 @@ XMLPUBFUN void XMLCALL xmlCheckVersion(int version); #endif #endif +/** + * LIBXML_THREAD_ALLOC_ENABLED: + * + * Whether the allocation hooks are per-thread + */ +#if 0 +#define LIBXML_THREAD_ALLOC_ENABLED +#endif + /** * LIBXML_TREE_ENABLED: * @@ -282,7 +291,7 @@ XMLPUBFUN void XMLCALL xmlCheckVersion(int version); * * Whether ISO-8859-* support is made available in case iconv is not */ -#if 0 +#if 1 #define LIBXML_ISO8859X_ENABLED #endif @@ -379,7 +388,7 @@ XMLPUBFUN void XMLCALL xmlCheckVersion(int version); * * the string suffix used by dynamic modules (usually shared libraries) */ -#define LIBXML_MODULE_EXTENSION ".dll" +#define LIBXML_MODULE_EXTENSION ".so" #endif /** @@ -391,6 +400,15 @@ XMLPUBFUN void XMLCALL xmlCheckVersion(int version); #define LIBXML_ZLIB_ENABLED #endif +/** + * LIBXML_LZMA_ENABLED: + * + * Whether the Lzma support is compiled in + */ +#if 1 +#define LIBXML_LZMA_ENABLED +#endif + #ifdef __GNUC__ #ifdef HAVE_ANSIDECL_H #include @@ -403,7 +421,11 @@ XMLPUBFUN void XMLCALL xmlCheckVersion(int version); */ #ifndef ATTRIBUTE_UNUSED -#define ATTRIBUTE_UNUSED __attribute__((unused)) +# if ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 7))) +# define ATTRIBUTE_UNUSED __attribute__((unused)) +# else +# define ATTRIBUTE_UNUSED +# endif #endif /** diff --git a/vendors/libxml/src/libxml/xmlversion.h.in b/vendors/libxml/src/libxml/xmlversion.h.in new file mode 100644 index 0000000..00a836f --- /dev/null +++ b/vendors/libxml/src/libxml/xmlversion.h.in @@ -0,0 +1,489 @@ +/* + * Summary: compile-time version informations + * Description: compile-time version informations for the XML library + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_VERSION_H__ +#define __XML_VERSION_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * use those to be sure nothing nasty will happen if + * your library and includes mismatch + */ +#ifndef LIBXML2_COMPILING_MSCCDEF +XMLPUBFUN void XMLCALL xmlCheckVersion(int version); +#endif /* LIBXML2_COMPILING_MSCCDEF */ + +/** + * LIBXML_DOTTED_VERSION: + * + * the version string like "1.2.3" + */ +#define LIBXML_DOTTED_VERSION "@VERSION@" + +/** + * LIBXML_VERSION: + * + * the version number: 1.2.3 value is 10203 + */ +#define LIBXML_VERSION @LIBXML_VERSION_NUMBER@ + +/** + * LIBXML_VERSION_STRING: + * + * the version number string, 1.2.3 value is "10203" + */ +#define LIBXML_VERSION_STRING "@LIBXML_VERSION_NUMBER@" + +/** + * LIBXML_VERSION_EXTRA: + * + * extra version information, used to show a CVS compilation + */ +#define LIBXML_VERSION_EXTRA "@LIBXML_VERSION_EXTRA@" + +/** + * LIBXML_TEST_VERSION: + * + * Macro to check that the libxml version in use is compatible with + * the version the software has been compiled against + */ +#define LIBXML_TEST_VERSION xmlCheckVersion(@LIBXML_VERSION_NUMBER@); + +#ifndef VMS +#if @WITH_TRIO@ +/** + * WITH_TRIO: + * + * defined if the trio support need to be configured in + */ +#define WITH_TRIO +#else +/** + * WITHOUT_TRIO: + * + * defined if the trio support should not be configured in + */ +#define WITHOUT_TRIO +#endif +#else /* VMS */ +/** + * WITH_TRIO: + * + * defined if the trio support need to be configured in + */ +#define WITH_TRIO 1 +#endif /* VMS */ + +/** + * LIBXML_THREAD_ENABLED: + * + * Whether the thread support is configured in + */ +#if @WITH_THREADS@ +#if defined(_REENTRANT) || defined(__MT__) || \ + (defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE - 0 >= 199506L)) +#define LIBXML_THREAD_ENABLED +#endif +#endif + +/** + * LIBXML_THREAD_ALLOC_ENABLED: + * + * Whether the allocation hooks are per-thread + */ +#if @WITH_THREAD_ALLOC@ +#define LIBXML_THREAD_ALLOC_ENABLED +#endif + +/** + * LIBXML_TREE_ENABLED: + * + * Whether the DOM like tree manipulation API support is configured in + */ +#if @WITH_TREE@ +#define LIBXML_TREE_ENABLED +#endif + +/** + * LIBXML_OUTPUT_ENABLED: + * + * Whether the serialization/saving support is configured in + */ +#if @WITH_OUTPUT@ +#define LIBXML_OUTPUT_ENABLED +#endif + +/** + * LIBXML_PUSH_ENABLED: + * + * Whether the push parsing interfaces are configured in + */ +#if @WITH_PUSH@ +#define LIBXML_PUSH_ENABLED +#endif + +/** + * LIBXML_READER_ENABLED: + * + * Whether the xmlReader parsing interface is configured in + */ +#if @WITH_READER@ +#define LIBXML_READER_ENABLED +#endif + +/** + * LIBXML_PATTERN_ENABLED: + * + * Whether the xmlPattern node selection interface is configured in + */ +#if @WITH_PATTERN@ +#define LIBXML_PATTERN_ENABLED +#endif + +/** + * LIBXML_WRITER_ENABLED: + * + * Whether the xmlWriter saving interface is configured in + */ +#if @WITH_WRITER@ +#define LIBXML_WRITER_ENABLED +#endif + +/** + * LIBXML_SAX1_ENABLED: + * + * Whether the older SAX1 interface is configured in + */ +#if @WITH_SAX1@ +#define LIBXML_SAX1_ENABLED +#endif + +/** + * LIBXML_FTP_ENABLED: + * + * Whether the FTP support is configured in + */ +#if @WITH_FTP@ +#define LIBXML_FTP_ENABLED +#endif + +/** + * LIBXML_HTTP_ENABLED: + * + * Whether the HTTP support is configured in + */ +#if @WITH_HTTP@ +#define LIBXML_HTTP_ENABLED +#endif + +/** + * LIBXML_VALID_ENABLED: + * + * Whether the DTD validation support is configured in + */ +#if @WITH_VALID@ +#define LIBXML_VALID_ENABLED +#endif + +/** + * LIBXML_HTML_ENABLED: + * + * Whether the HTML support is configured in + */ +#if @WITH_HTML@ +#define LIBXML_HTML_ENABLED +#endif + +/** + * LIBXML_LEGACY_ENABLED: + * + * Whether the deprecated APIs are compiled in for compatibility + */ +#if @WITH_LEGACY@ +#define LIBXML_LEGACY_ENABLED +#endif + +/** + * LIBXML_C14N_ENABLED: + * + * Whether the Canonicalization support is configured in + */ +#if @WITH_C14N@ +#define LIBXML_C14N_ENABLED +#endif + +/** + * LIBXML_CATALOG_ENABLED: + * + * Whether the Catalog support is configured in + */ +#if @WITH_CATALOG@ +#define LIBXML_CATALOG_ENABLED +#endif + +/** + * LIBXML_DOCB_ENABLED: + * + * Whether the SGML Docbook support is configured in + */ +#if @WITH_DOCB@ +#define LIBXML_DOCB_ENABLED +#endif + +/** + * LIBXML_XPATH_ENABLED: + * + * Whether XPath is configured in + */ +#if @WITH_XPATH@ +#define LIBXML_XPATH_ENABLED +#endif + +/** + * LIBXML_XPTR_ENABLED: + * + * Whether XPointer is configured in + */ +#if @WITH_XPTR@ +#define LIBXML_XPTR_ENABLED +#endif + +/** + * LIBXML_XINCLUDE_ENABLED: + * + * Whether XInclude is configured in + */ +#if @WITH_XINCLUDE@ +#define LIBXML_XINCLUDE_ENABLED +#endif + +/** + * LIBXML_ICONV_ENABLED: + * + * Whether iconv support is available + */ +#if @WITH_ICONV@ +#define LIBXML_ICONV_ENABLED +#endif + +/** + * LIBXML_ICU_ENABLED: + * + * Whether icu support is available + */ +#if @WITH_ICU@ +#define LIBXML_ICU_ENABLED +#endif + +/** + * LIBXML_ISO8859X_ENABLED: + * + * Whether ISO-8859-* support is made available in case iconv is not + */ +#if @WITH_ISO8859X@ +#define LIBXML_ISO8859X_ENABLED +#endif + +/** + * LIBXML_DEBUG_ENABLED: + * + * Whether Debugging module is configured in + */ +#if @WITH_DEBUG@ +#define LIBXML_DEBUG_ENABLED +#endif + +/** + * DEBUG_MEMORY_LOCATION: + * + * Whether the memory debugging is configured in + */ +#if @WITH_MEM_DEBUG@ +#define DEBUG_MEMORY_LOCATION +#endif + +/** + * LIBXML_DEBUG_RUNTIME: + * + * Whether the runtime debugging is configured in + */ +#if @WITH_RUN_DEBUG@ +#define LIBXML_DEBUG_RUNTIME +#endif + +/** + * LIBXML_UNICODE_ENABLED: + * + * Whether the Unicode related interfaces are compiled in + */ +#if @WITH_REGEXPS@ +#define LIBXML_UNICODE_ENABLED +#endif + +/** + * LIBXML_REGEXP_ENABLED: + * + * Whether the regular expressions interfaces are compiled in + */ +#if @WITH_REGEXPS@ +#define LIBXML_REGEXP_ENABLED +#endif + +/** + * LIBXML_AUTOMATA_ENABLED: + * + * Whether the automata interfaces are compiled in + */ +#if @WITH_REGEXPS@ +#define LIBXML_AUTOMATA_ENABLED +#endif + +/** + * LIBXML_EXPR_ENABLED: + * + * Whether the formal expressions interfaces are compiled in + */ +#if @WITH_SCHEMAS@ +#define LIBXML_EXPR_ENABLED +#endif + +/** + * LIBXML_SCHEMAS_ENABLED: + * + * Whether the Schemas validation interfaces are compiled in + */ +#if @WITH_SCHEMAS@ +#define LIBXML_SCHEMAS_ENABLED +#endif + +/** + * LIBXML_SCHEMATRON_ENABLED: + * + * Whether the Schematron validation interfaces are compiled in + */ +#if @WITH_SCHEMATRON@ +#define LIBXML_SCHEMATRON_ENABLED +#endif + +/** + * LIBXML_MODULES_ENABLED: + * + * Whether the module interfaces are compiled in + */ +#if @WITH_MODULES@ +#define LIBXML_MODULES_ENABLED +/** + * LIBXML_MODULE_EXTENSION: + * + * the string suffix used by dynamic modules (usually shared libraries) + */ +#define LIBXML_MODULE_EXTENSION "@MODULE_EXTENSION@" +#endif + +/** + * LIBXML_ZLIB_ENABLED: + * + * Whether the Zlib support is compiled in + */ +#if @WITH_ZLIB@ +#define LIBXML_ZLIB_ENABLED +#endif + +/** + * LIBXML_LZMA_ENABLED: + * + * Whether the Lzma support is compiled in + */ +#if @WITH_LZMA@ +#define LIBXML_LZMA_ENABLED +#endif + +#ifdef __GNUC__ +#ifdef HAVE_ANSIDECL_H +#include +#endif + +/** + * ATTRIBUTE_UNUSED: + * + * Macro used to signal to GCC unused function parameters + */ + +#ifndef ATTRIBUTE_UNUSED +# if ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 7))) +# define ATTRIBUTE_UNUSED __attribute__((unused)) +# else +# define ATTRIBUTE_UNUSED +# endif +#endif + +/** + * LIBXML_ATTR_ALLOC_SIZE: + * + * Macro used to indicate to GCC this is an allocator function + */ + +#ifndef LIBXML_ATTR_ALLOC_SIZE +# if ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3))) +# define LIBXML_ATTR_ALLOC_SIZE(x) __attribute__((alloc_size(x))) +# else +# define LIBXML_ATTR_ALLOC_SIZE(x) +# endif +#else +# define LIBXML_ATTR_ALLOC_SIZE(x) +#endif + +/** + * LIBXML_ATTR_FORMAT: + * + * Macro used to indicate to GCC the parameter are printf like + */ + +#ifndef LIBXML_ATTR_FORMAT +# if ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3))) +# define LIBXML_ATTR_FORMAT(fmt,args) __attribute__((__format__(__printf__,fmt,args))) +# else +# define LIBXML_ATTR_FORMAT(fmt,args) +# endif +#else +# define LIBXML_ATTR_FORMAT(fmt,args) +#endif + +#else /* ! __GNUC__ */ +/** + * ATTRIBUTE_UNUSED: + * + * Macro used to signal to GCC unused function parameters + */ +#define ATTRIBUTE_UNUSED +/** + * LIBXML_ATTR_ALLOC_SIZE: + * + * Macro used to indicate to GCC this is an allocator function + */ +#define LIBXML_ATTR_ALLOC_SIZE(x) +/** + * LIBXML_ATTR_FORMAT: + * + * Macro used to indicate to GCC the parameter are printf like + */ +#define LIBXML_ATTR_FORMAT(fmt,args) +#endif /* __GNUC__ */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif + + diff --git a/vendors/libxml2/include/libxml/xmlwriter.h b/vendors/libxml/src/libxml/xmlwriter.h similarity index 99% rename from vendors/libxml2/include/libxml/xmlwriter.h rename to vendors/libxml/src/libxml/xmlwriter.h index 91e683c..dd5add3 100644 --- a/vendors/libxml2/include/libxml/xmlwriter.h +++ b/vendors/libxml/src/libxml/xmlwriter.h @@ -1,4 +1,3 @@ - /* * Summary: text writing API for XML * Description: text writing API for XML @@ -471,6 +470,10 @@ extern "C" { xmlTextWriterSetIndentString(xmlTextWriterPtr writer, const xmlChar * str); + XMLPUBFUN int XMLCALL + xmlTextWriterSetQuoteChar(xmlTextWriterPtr writer, xmlChar quotechar); + + /* * misc */ diff --git a/vendors/libxml2/include/libxml/xpath.h b/vendors/libxml/src/libxml/xpath.h similarity index 90% rename from vendors/libxml2/include/libxml/xpath.h rename to vendors/libxml/src/libxml/xpath.h index 1a9e30e..d96776c 100644 --- a/vendors/libxml2/include/libxml/xpath.h +++ b/vendors/libxml/src/libxml/xpath.h @@ -33,7 +33,7 @@ extern "C" { #endif #endif /* LIBXML_XPATH_ENABLED or LIBXML_SCHEMAS_ENABLED */ - + #ifdef LIBXML_XPATH_ENABLED typedef struct _xmlXPathContext xmlXPathContext; @@ -68,7 +68,9 @@ typedef enum { XPATH_UNDEF_PREFIX_ERROR, XPATH_ENCODING_ERROR, XPATH_INVALID_CHAR_ERROR, - XPATH_INVALID_CTXT + XPATH_INVALID_CTXT, + XPATH_STACK_ERROR, + XPATH_FORBID_VARIABLE_ERROR } xmlXPathError; /* @@ -271,11 +273,11 @@ typedef xmlXPathFunction (*xmlXPathFuncLookupFunc) (void *ctxt, * * Expression evaluation occurs with respect to a context. * he context consists of: - * - a node (the context node) - * - a node list (the context node list) - * - a set of variable bindings - * - a function library - * - the set of namespace declarations in scope for the expression + * - a node (the context node) + * - a node list (the context node list) + * - a set of variable bindings + * - a function library + * - the set of namespace declarations in scope for the expression * Following the switch to hash tables, this need to be trimmed up at * the next binary incompatible release. * The node may be modified when the context is passed to libxml2 @@ -380,6 +382,8 @@ struct _xmlXPathParserContext { xmlXPathCompExprPtr comp; /* the precompiled expression */ int xptr; /* it this an XPointer expression */ xmlNodePtr ancestor; /* used for walking preceding axis */ + + int valueFrame; /* used to limit Pop on the stack */ }; /************************************************************************ @@ -417,7 +421,7 @@ XMLPUBVAR double xmlXPathNINF; * @index is out of range (0 to length-1) */ #define xmlXPathNodeSetItem(ns, index) \ - ((((ns) != NULL) && \ + ((((ns) != NULL) && \ ((index) >= 0) && ((index) < (ns)->nodeNr)) ? \ (ns)->nodeTab[(index)] \ : NULL) @@ -433,64 +437,64 @@ XMLPUBVAR double xmlXPathNINF; (((ns) == NULL) || ((ns)->nodeNr == 0) || ((ns)->nodeTab == NULL)) -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlXPathFreeObject (xmlXPathObjectPtr obj); -XMLPUBFUN xmlNodeSetPtr XMLCALL +XMLPUBFUN xmlNodeSetPtr XMLCALL xmlXPathNodeSetCreate (xmlNodePtr val); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlXPathFreeNodeSetList (xmlXPathObjectPtr obj); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlXPathFreeNodeSet (xmlNodeSetPtr obj); -XMLPUBFUN xmlXPathObjectPtr XMLCALL +XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathObjectCopy (xmlXPathObjectPtr val); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlXPathCmpNodes (xmlNodePtr node1, xmlNodePtr node2); /** * Conversion functions to basic types. */ -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlXPathCastNumberToBoolean (double val); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlXPathCastStringToBoolean (const xmlChar * val); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlXPathCastNodeSetToBoolean(xmlNodeSetPtr ns); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlXPathCastToBoolean (xmlXPathObjectPtr val); -XMLPUBFUN double XMLCALL +XMLPUBFUN double XMLCALL xmlXPathCastBooleanToNumber (int val); -XMLPUBFUN double XMLCALL +XMLPUBFUN double XMLCALL xmlXPathCastStringToNumber (const xmlChar * val); -XMLPUBFUN double XMLCALL +XMLPUBFUN double XMLCALL xmlXPathCastNodeToNumber (xmlNodePtr node); -XMLPUBFUN double XMLCALL +XMLPUBFUN double XMLCALL xmlXPathCastNodeSetToNumber (xmlNodeSetPtr ns); -XMLPUBFUN double XMLCALL +XMLPUBFUN double XMLCALL xmlXPathCastToNumber (xmlXPathObjectPtr val); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlXPathCastBooleanToString (int val); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlXPathCastNumberToString (double val); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlXPathCastNodeToString (xmlNodePtr node); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlXPathCastNodeSetToString (xmlNodeSetPtr ns); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlXPathCastToString (xmlXPathObjectPtr val); -XMLPUBFUN xmlXPathObjectPtr XMLCALL +XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathConvertBoolean (xmlXPathObjectPtr val); -XMLPUBFUN xmlXPathObjectPtr XMLCALL +XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathConvertNumber (xmlXPathObjectPtr val); -XMLPUBFUN xmlXPathObjectPtr XMLCALL +XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathConvertString (xmlXPathObjectPtr val); /** * Context handling. */ -XMLPUBFUN xmlXPathContextPtr XMLCALL +XMLPUBFUN xmlXPathContextPtr XMLCALL xmlXPathNewContext (xmlDocPtr doc); XMLPUBFUN void XMLCALL xmlXPathFreeContext (xmlXPathContextPtr ctxt); @@ -502,36 +506,43 @@ XMLPUBFUN int XMLCALL /** * Evaluation functions. */ -XMLPUBFUN long XMLCALL +XMLPUBFUN long XMLCALL xmlXPathOrderDocElems (xmlDocPtr doc); -XMLPUBFUN xmlXPathObjectPtr XMLCALL +XMLPUBFUN int XMLCALL + xmlXPathSetContextNode (xmlNodePtr node, + xmlXPathContextPtr ctx); +XMLPUBFUN xmlXPathObjectPtr XMLCALL + xmlXPathNodeEval (xmlNodePtr node, + const xmlChar *str, + xmlXPathContextPtr ctx); +XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathEval (const xmlChar *str, xmlXPathContextPtr ctx); -XMLPUBFUN xmlXPathObjectPtr XMLCALL +XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathEvalExpression (const xmlChar *str, xmlXPathContextPtr ctxt); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlXPathEvalPredicate (xmlXPathContextPtr ctxt, xmlXPathObjectPtr res); /** * Separate compilation/evaluation entry points. */ -XMLPUBFUN xmlXPathCompExprPtr XMLCALL +XMLPUBFUN xmlXPathCompExprPtr XMLCALL xmlXPathCompile (const xmlChar *str); -XMLPUBFUN xmlXPathCompExprPtr XMLCALL +XMLPUBFUN xmlXPathCompExprPtr XMLCALL xmlXPathCtxtCompile (xmlXPathContextPtr ctxt, - const xmlChar *str); -XMLPUBFUN xmlXPathObjectPtr XMLCALL + const xmlChar *str); +XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathCompiledEval (xmlXPathCompExprPtr comp, xmlXPathContextPtr ctx); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlXPathCompiledEvalToBoolean(xmlXPathCompExprPtr comp, xmlXPathContextPtr ctxt); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlXPathFreeCompExpr (xmlXPathCompExprPtr comp); #endif /* LIBXML_XPATH_ENABLED */ #if defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlXPathInit (void); XMLPUBFUN int XMLCALL xmlXPathIsNaN (double val); diff --git a/vendors/libxml2/include/libxml/xpathInternals.h b/vendors/libxml/src/libxml/xpathInternals.h similarity index 86% rename from vendors/libxml2/include/libxml/xpathInternals.h rename to vendors/libxml/src/libxml/xpathInternals.h index dcd5243..70c9db9 100644 --- a/vendors/libxml2/include/libxml/xpathInternals.h +++ b/vendors/libxml/src/libxml/xpathInternals.h @@ -100,16 +100,16 @@ extern "C" { */ #define xmlXPathGetContextNode(ctxt) ((ctxt)->context->node) -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlXPathPopBoolean (xmlXPathParserContextPtr ctxt); -XMLPUBFUN double XMLCALL - xmlXPathPopNumber (xmlXPathParserContextPtr ctxt); -XMLPUBFUN xmlChar * XMLCALL - xmlXPathPopString (xmlXPathParserContextPtr ctxt); -XMLPUBFUN xmlNodeSetPtr XMLCALL - xmlXPathPopNodeSet (xmlXPathParserContextPtr ctxt); -XMLPUBFUN void * XMLCALL - xmlXPathPopExternal (xmlXPathParserContextPtr ctxt); +XMLPUBFUN double XMLCALL + xmlXPathPopNumber (xmlXPathParserContextPtr ctxt); +XMLPUBFUN xmlChar * XMLCALL + xmlXPathPopString (xmlXPathParserContextPtr ctxt); +XMLPUBFUN xmlNodeSetPtr XMLCALL + xmlXPathPopNodeSet (xmlXPathParserContextPtr ctxt); +XMLPUBFUN void * XMLCALL + xmlXPathPopExternal (xmlXPathParserContextPtr ctxt); /** * xmlXPathReturnBoolean: @@ -296,7 +296,9 @@ XMLPUBFUN void * XMLCALL #define CHECK_ARITY(x) \ if (ctxt == NULL) return; \ if (nargs != (x)) \ - XP_ERROR(XPATH_INVALID_ARITY); + XP_ERROR(XPATH_INVALID_ARITY); \ + if (ctxt->valueNr < ctxt->valueFrame + (x)) \ + XP_ERROR(XPATH_STACK_ERROR); /** * CAST_TO_STRING: @@ -329,7 +331,7 @@ XMLPUBFUN void * XMLCALL * Variable Lookup forwarding. */ -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlXPathRegisterVariableLookup (xmlXPathContextPtr ctxt, xmlXPathVariableLookupFunc f, void *data); @@ -338,7 +340,7 @@ XMLPUBFUN void XMLCALL * Function Lookup forwarding. */ -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlXPathRegisterFuncLookup (xmlXPathContextPtr ctxt, xmlXPathFuncLookupFunc f, void *funcCtxt); @@ -346,7 +348,7 @@ XMLPUBFUN void XMLCALL /* * Error reporting. */ -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlXPatherror (xmlXPathParserContextPtr ctxt, const char *file, int line, @@ -357,11 +359,11 @@ XMLPUBFUN void XMLCALL int error); #ifdef LIBXML_DEBUG_ENABLED -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlXPathDebugDumpObject (FILE *output, xmlXPathObjectPtr cur, int depth); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlXPathDebugDumpCompExpr(FILE *output, xmlXPathCompExprPtr comp, int depth); @@ -369,48 +371,48 @@ XMLPUBFUN void XMLCALL /** * NodeSet handling. */ -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlXPathNodeSetContains (xmlNodeSetPtr cur, xmlNodePtr val); -XMLPUBFUN xmlNodeSetPtr XMLCALL +XMLPUBFUN xmlNodeSetPtr XMLCALL xmlXPathDifference (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2); -XMLPUBFUN xmlNodeSetPtr XMLCALL +XMLPUBFUN xmlNodeSetPtr XMLCALL xmlXPathIntersection (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2); -XMLPUBFUN xmlNodeSetPtr XMLCALL +XMLPUBFUN xmlNodeSetPtr XMLCALL xmlXPathDistinctSorted (xmlNodeSetPtr nodes); -XMLPUBFUN xmlNodeSetPtr XMLCALL +XMLPUBFUN xmlNodeSetPtr XMLCALL xmlXPathDistinct (xmlNodeSetPtr nodes); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlXPathHasSameNodes (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2); -XMLPUBFUN xmlNodeSetPtr XMLCALL +XMLPUBFUN xmlNodeSetPtr XMLCALL xmlXPathNodeLeadingSorted (xmlNodeSetPtr nodes, xmlNodePtr node); -XMLPUBFUN xmlNodeSetPtr XMLCALL +XMLPUBFUN xmlNodeSetPtr XMLCALL xmlXPathLeadingSorted (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2); -XMLPUBFUN xmlNodeSetPtr XMLCALL +XMLPUBFUN xmlNodeSetPtr XMLCALL xmlXPathNodeLeading (xmlNodeSetPtr nodes, xmlNodePtr node); -XMLPUBFUN xmlNodeSetPtr XMLCALL +XMLPUBFUN xmlNodeSetPtr XMLCALL xmlXPathLeading (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2); -XMLPUBFUN xmlNodeSetPtr XMLCALL +XMLPUBFUN xmlNodeSetPtr XMLCALL xmlXPathNodeTrailingSorted (xmlNodeSetPtr nodes, xmlNodePtr node); -XMLPUBFUN xmlNodeSetPtr XMLCALL +XMLPUBFUN xmlNodeSetPtr XMLCALL xmlXPathTrailingSorted (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2); -XMLPUBFUN xmlNodeSetPtr XMLCALL +XMLPUBFUN xmlNodeSetPtr XMLCALL xmlXPathNodeTrailing (xmlNodeSetPtr nodes, xmlNodePtr node); -XMLPUBFUN xmlNodeSetPtr XMLCALL +XMLPUBFUN xmlNodeSetPtr XMLCALL xmlXPathTrailing (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2); @@ -419,51 +421,51 @@ XMLPUBFUN xmlNodeSetPtr XMLCALL * Extending a context. */ -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlXPathRegisterNs (xmlXPathContextPtr ctxt, const xmlChar *prefix, const xmlChar *ns_uri); -XMLPUBFUN const xmlChar * XMLCALL +XMLPUBFUN const xmlChar * XMLCALL xmlXPathNsLookup (xmlXPathContextPtr ctxt, const xmlChar *prefix); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlXPathRegisteredNsCleanup (xmlXPathContextPtr ctxt); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlXPathRegisterFunc (xmlXPathContextPtr ctxt, const xmlChar *name, xmlXPathFunction f); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlXPathRegisterFuncNS (xmlXPathContextPtr ctxt, const xmlChar *name, const xmlChar *ns_uri, xmlXPathFunction f); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlXPathRegisterVariable (xmlXPathContextPtr ctxt, const xmlChar *name, xmlXPathObjectPtr value); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL xmlXPathRegisterVariableNS (xmlXPathContextPtr ctxt, const xmlChar *name, const xmlChar *ns_uri, xmlXPathObjectPtr value); -XMLPUBFUN xmlXPathFunction XMLCALL +XMLPUBFUN xmlXPathFunction XMLCALL xmlXPathFunctionLookup (xmlXPathContextPtr ctxt, const xmlChar *name); -XMLPUBFUN xmlXPathFunction XMLCALL +XMLPUBFUN xmlXPathFunction XMLCALL xmlXPathFunctionLookupNS (xmlXPathContextPtr ctxt, const xmlChar *name, const xmlChar *ns_uri); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlXPathRegisteredFuncsCleanup (xmlXPathContextPtr ctxt); -XMLPUBFUN xmlXPathObjectPtr XMLCALL +XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathVariableLookup (xmlXPathContextPtr ctxt, const xmlChar *name); -XMLPUBFUN xmlXPathObjectPtr XMLCALL +XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathVariableLookupNS (xmlXPathContextPtr ctxt, const xmlChar *name, const xmlChar *ns_uri); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlXPathRegisteredVariablesCleanup(xmlXPathContextPtr ctxt); /** @@ -471,79 +473,79 @@ XMLPUBFUN void XMLCALL */ XMLPUBFUN xmlXPathParserContextPtr XMLCALL xmlXPathNewParserContext (const xmlChar *str, - xmlXPathContextPtr ctxt); -XMLPUBFUN void XMLCALL + xmlXPathContextPtr ctxt); +XMLPUBFUN void XMLCALL xmlXPathFreeParserContext (xmlXPathParserContextPtr ctxt); /* TODO: remap to xmlXPathValuePop and Push. */ -XMLPUBFUN xmlXPathObjectPtr XMLCALL +XMLPUBFUN xmlXPathObjectPtr XMLCALL valuePop (xmlXPathParserContextPtr ctxt); -XMLPUBFUN int XMLCALL +XMLPUBFUN int XMLCALL valuePush (xmlXPathParserContextPtr ctxt, - xmlXPathObjectPtr value); + xmlXPathObjectPtr value); -XMLPUBFUN xmlXPathObjectPtr XMLCALL +XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathNewString (const xmlChar *val); -XMLPUBFUN xmlXPathObjectPtr XMLCALL +XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathNewCString (const char *val); -XMLPUBFUN xmlXPathObjectPtr XMLCALL +XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathWrapString (xmlChar *val); -XMLPUBFUN xmlXPathObjectPtr XMLCALL +XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathWrapCString (char * val); -XMLPUBFUN xmlXPathObjectPtr XMLCALL +XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathNewFloat (double val); -XMLPUBFUN xmlXPathObjectPtr XMLCALL +XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathNewBoolean (int val); -XMLPUBFUN xmlXPathObjectPtr XMLCALL +XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathNewNodeSet (xmlNodePtr val); -XMLPUBFUN xmlXPathObjectPtr XMLCALL +XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathNewValueTree (xmlNodePtr val); -XMLPUBFUN void XMLCALL +XMLPUBFUN int XMLCALL xmlXPathNodeSetAdd (xmlNodeSetPtr cur, xmlNodePtr val); -XMLPUBFUN void XMLCALL +XMLPUBFUN int XMLCALL xmlXPathNodeSetAddUnique (xmlNodeSetPtr cur, xmlNodePtr val); -XMLPUBFUN void XMLCALL - xmlXPathNodeSetAddNs (xmlNodeSetPtr cur, - xmlNodePtr node, +XMLPUBFUN int XMLCALL + xmlXPathNodeSetAddNs (xmlNodeSetPtr cur, + xmlNodePtr node, xmlNsPtr ns); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlXPathNodeSetSort (xmlNodeSetPtr set); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlXPathRoot (xmlXPathParserContextPtr ctxt); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlXPathEvalExpr (xmlXPathParserContextPtr ctxt); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlXPathParseName (xmlXPathParserContextPtr ctxt); -XMLPUBFUN xmlChar * XMLCALL +XMLPUBFUN xmlChar * XMLCALL xmlXPathParseNCName (xmlXPathParserContextPtr ctxt); /* * Existing functions. */ -XMLPUBFUN double XMLCALL +XMLPUBFUN double XMLCALL xmlXPathStringEvalNumber (const xmlChar *str); -XMLPUBFUN int XMLCALL - xmlXPathEvaluatePredicateResult (xmlXPathParserContextPtr ctxt, +XMLPUBFUN int XMLCALL + xmlXPathEvaluatePredicateResult (xmlXPathParserContextPtr ctxt, xmlXPathObjectPtr res); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlXPathRegisterAllFunctions (xmlXPathContextPtr ctxt); -XMLPUBFUN xmlNodeSetPtr XMLCALL - xmlXPathNodeSetMerge (xmlNodeSetPtr val1, +XMLPUBFUN xmlNodeSetPtr XMLCALL + xmlXPathNodeSetMerge (xmlNodeSetPtr val1, xmlNodeSetPtr val2); -XMLPUBFUN void XMLCALL - xmlXPathNodeSetDel (xmlNodeSetPtr cur, +XMLPUBFUN void XMLCALL + xmlXPathNodeSetDel (xmlNodeSetPtr cur, xmlNodePtr val); -XMLPUBFUN void XMLCALL - xmlXPathNodeSetRemove (xmlNodeSetPtr cur, +XMLPUBFUN void XMLCALL + xmlXPathNodeSetRemove (xmlNodeSetPtr cur, int val); -XMLPUBFUN xmlXPathObjectPtr XMLCALL +XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathNewNodeSetList (xmlNodeSetPtr val); -XMLPUBFUN xmlXPathObjectPtr XMLCALL +XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathWrapNodeSet (xmlNodeSetPtr val); -XMLPUBFUN xmlXPathObjectPtr XMLCALL +XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPathWrapExternal (void *val); XMLPUBFUN int XMLCALL xmlXPathEqualValues(xmlXPathParserContextPtr ctxt); @@ -621,7 +623,7 @@ XMLPUBFUN void XMLCALL xmlXPathBooleanFunction(xmlXPathParserContextPtr ctxt, in * Really internal functions */ XMLPUBFUN void XMLCALL xmlXPathNodeSetFreeNs(xmlNsPtr ns); - + #ifdef __cplusplus } #endif diff --git a/vendors/libxml2/include/libxml/xpointer.h b/vendors/libxml/src/libxml/xpointer.h similarity index 76% rename from vendors/libxml2/include/libxml/xpointer.h rename to vendors/libxml/src/libxml/xpointer.h index dde1dfb..b99112b 100644 --- a/vendors/libxml2/include/libxml/xpointer.h +++ b/vendors/libxml/src/libxml/xpointer.h @@ -7,7 +7,7 @@ * * Added support for the element() scheme described in: * W3C Proposed Recommendation 13 November 2002 - * http://www.w3.org/TR/2002/PR-xptr-element-20021113/ + * http://www.w3.org/TR/2002/PR-xptr-element-20021113/ * * Copy: See Copyright for the status of this software. * @@ -43,68 +43,68 @@ struct _xmlLocationSet { * Handling of location sets. */ -XMLPUBFUN xmlLocationSetPtr XMLCALL +XMLPUBFUN xmlLocationSetPtr XMLCALL xmlXPtrLocationSetCreate (xmlXPathObjectPtr val); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlXPtrFreeLocationSet (xmlLocationSetPtr obj); -XMLPUBFUN xmlLocationSetPtr XMLCALL +XMLPUBFUN xmlLocationSetPtr XMLCALL xmlXPtrLocationSetMerge (xmlLocationSetPtr val1, xmlLocationSetPtr val2); -XMLPUBFUN xmlXPathObjectPtr XMLCALL +XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPtrNewRange (xmlNodePtr start, int startindex, xmlNodePtr end, int endindex); -XMLPUBFUN xmlXPathObjectPtr XMLCALL +XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPtrNewRangePoints (xmlXPathObjectPtr start, xmlXPathObjectPtr end); -XMLPUBFUN xmlXPathObjectPtr XMLCALL +XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPtrNewRangeNodePoint (xmlNodePtr start, xmlXPathObjectPtr end); -XMLPUBFUN xmlXPathObjectPtr XMLCALL +XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPtrNewRangePointNode (xmlXPathObjectPtr start, xmlNodePtr end); -XMLPUBFUN xmlXPathObjectPtr XMLCALL +XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPtrNewRangeNodes (xmlNodePtr start, xmlNodePtr end); -XMLPUBFUN xmlXPathObjectPtr XMLCALL +XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPtrNewLocationSetNodes (xmlNodePtr start, xmlNodePtr end); -XMLPUBFUN xmlXPathObjectPtr XMLCALL +XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPtrNewLocationSetNodeSet(xmlNodeSetPtr set); -XMLPUBFUN xmlXPathObjectPtr XMLCALL +XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPtrNewRangeNodeObject (xmlNodePtr start, xmlXPathObjectPtr end); -XMLPUBFUN xmlXPathObjectPtr XMLCALL +XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPtrNewCollapsedRange (xmlNodePtr start); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlXPtrLocationSetAdd (xmlLocationSetPtr cur, xmlXPathObjectPtr val); -XMLPUBFUN xmlXPathObjectPtr XMLCALL +XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPtrWrapLocationSet (xmlLocationSetPtr val); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlXPtrLocationSetDel (xmlLocationSetPtr cur, xmlXPathObjectPtr val); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlXPtrLocationSetRemove (xmlLocationSetPtr cur, int val); /* * Functions. */ -XMLPUBFUN xmlXPathContextPtr XMLCALL +XMLPUBFUN xmlXPathContextPtr XMLCALL xmlXPtrNewContext (xmlDocPtr doc, xmlNodePtr here, xmlNodePtr origin); -XMLPUBFUN xmlXPathObjectPtr XMLCALL +XMLPUBFUN xmlXPathObjectPtr XMLCALL xmlXPtrEval (const xmlChar *str, xmlXPathContextPtr ctx); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlXPtrRangeToFunction (xmlXPathParserContextPtr ctxt, - int nargs); -XMLPUBFUN xmlNodePtr XMLCALL + int nargs); +XMLPUBFUN xmlNodePtr XMLCALL xmlXPtrBuildNodeList (xmlXPathObjectPtr obj); -XMLPUBFUN void XMLCALL +XMLPUBFUN void XMLCALL xmlXPtrEvalRangePredicate (xmlXPathParserContextPtr ctxt); #ifdef __cplusplus } diff --git a/vendors/libxml/src/list.c b/vendors/libxml/src/list.c new file mode 100644 index 0000000..d33d928 --- /dev/null +++ b/vendors/libxml/src/list.c @@ -0,0 +1,779 @@ +/* + * list.c: lists handling implementation + * + * Copyright (C) 2000 Gary Pennington and Daniel Veillard. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF + * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND + * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. + * + * Author: Gary.Pennington@uk.sun.com + */ + +#define IN_LIBXML +#include "libxml.h" + +#include +#include +#include +#include +#include + +/* + * Type definition are kept internal + */ + +struct _xmlLink +{ + struct _xmlLink *next; + struct _xmlLink *prev; + void *data; +}; + +struct _xmlList +{ + xmlLinkPtr sentinel; + void (*linkDeallocator)(xmlLinkPtr ); + int (*linkCompare)(const void *, const void*); +}; + +/************************************************************************ + * * + * Interfaces * + * * + ************************************************************************/ + +/** + * xmlLinkDeallocator: + * @l: a list + * @lk: a link + * + * Unlink and deallocate @lk from list @l + */ +static void +xmlLinkDeallocator(xmlListPtr l, xmlLinkPtr lk) +{ + (lk->prev)->next = lk->next; + (lk->next)->prev = lk->prev; + if(l->linkDeallocator) + l->linkDeallocator(lk); + xmlFree(lk); +} + +/** + * xmlLinkCompare: + * @data0: first data + * @data1: second data + * + * Compares two arbitrary data + * + * Returns -1, 0 or 1 depending on whether data1 is greater equal or smaller + * than data0 + */ +static int +xmlLinkCompare(const void *data0, const void *data1) +{ + if (data0 < data1) + return (-1); + else if (data0 == data1) + return (0); + return (1); +} + +/** + * xmlListLowerSearch: + * @l: a list + * @data: a data + * + * Search data in the ordered list walking from the beginning + * + * Returns the link containing the data or NULL + */ +static xmlLinkPtr +xmlListLowerSearch(xmlListPtr l, void *data) +{ + xmlLinkPtr lk; + + if (l == NULL) + return(NULL); + for(lk = l->sentinel->next;lk != l->sentinel && l->linkCompare(lk->data, data) <0 ;lk = lk->next); + return lk; +} + +/** + * xmlListHigherSearch: + * @l: a list + * @data: a data + * + * Search data in the ordered list walking backward from the end + * + * Returns the link containing the data or NULL + */ +static xmlLinkPtr +xmlListHigherSearch(xmlListPtr l, void *data) +{ + xmlLinkPtr lk; + + if (l == NULL) + return(NULL); + for(lk = l->sentinel->prev;lk != l->sentinel && l->linkCompare(lk->data, data) >0 ;lk = lk->prev); + return lk; +} + +/** + * xmlListSearch: + * @l: a list + * @data: a data + * + * Search data in the list + * + * Returns the link containing the data or NULL + */ +static xmlLinkPtr +xmlListLinkSearch(xmlListPtr l, void *data) +{ + xmlLinkPtr lk; + if (l == NULL) + return(NULL); + lk = xmlListLowerSearch(l, data); + if (lk == l->sentinel) + return NULL; + else { + if (l->linkCompare(lk->data, data) ==0) + return lk; + return NULL; + } +} + +/** + * xmlListLinkReverseSearch: + * @l: a list + * @data: a data + * + * Search data in the list processing backward + * + * Returns the link containing the data or NULL + */ +static xmlLinkPtr +xmlListLinkReverseSearch(xmlListPtr l, void *data) +{ + xmlLinkPtr lk; + if (l == NULL) + return(NULL); + lk = xmlListHigherSearch(l, data); + if (lk == l->sentinel) + return NULL; + else { + if (l->linkCompare(lk->data, data) ==0) + return lk; + return NULL; + } +} + +/** + * xmlListCreate: + * @deallocator: an optional deallocator function + * @compare: an optional comparison function + * + * Create a new list + * + * Returns the new list or NULL in case of error + */ +xmlListPtr +xmlListCreate(xmlListDeallocator deallocator, xmlListDataCompare compare) +{ + xmlListPtr l; + if (NULL == (l = (xmlListPtr )xmlMalloc( sizeof(xmlList)))) { + xmlGenericError(xmlGenericErrorContext, + "Cannot initialize memory for list"); + return (NULL); + } + /* Initialize the list to NULL */ + memset(l, 0, sizeof(xmlList)); + + /* Add the sentinel */ + if (NULL ==(l->sentinel = (xmlLinkPtr )xmlMalloc(sizeof(xmlLink)))) { + xmlGenericError(xmlGenericErrorContext, + "Cannot initialize memory for sentinel"); + xmlFree(l); + return (NULL); + } + l->sentinel->next = l->sentinel; + l->sentinel->prev = l->sentinel; + l->sentinel->data = NULL; + + /* If there is a link deallocator, use it */ + if (deallocator != NULL) + l->linkDeallocator = deallocator; + /* If there is a link comparator, use it */ + if (compare != NULL) + l->linkCompare = compare; + else /* Use our own */ + l->linkCompare = xmlLinkCompare; + return l; +} + +/** + * xmlListSearch: + * @l: a list + * @data: a search value + * + * Search the list for an existing value of @data + * + * Returns the value associated to @data or NULL in case of error + */ +void * +xmlListSearch(xmlListPtr l, void *data) +{ + xmlLinkPtr lk; + if (l == NULL) + return(NULL); + lk = xmlListLinkSearch(l, data); + if (lk) + return (lk->data); + return NULL; +} + +/** + * xmlListReverseSearch: + * @l: a list + * @data: a search value + * + * Search the list in reverse order for an existing value of @data + * + * Returns the value associated to @data or NULL in case of error + */ +void * +xmlListReverseSearch(xmlListPtr l, void *data) +{ + xmlLinkPtr lk; + if (l == NULL) + return(NULL); + lk = xmlListLinkReverseSearch(l, data); + if (lk) + return (lk->data); + return NULL; +} + +/** + * xmlListInsert: + * @l: a list + * @data: the data + * + * Insert data in the ordered list at the beginning for this value + * + * Returns 0 in case of success, 1 in case of failure + */ +int +xmlListInsert(xmlListPtr l, void *data) +{ + xmlLinkPtr lkPlace, lkNew; + + if (l == NULL) + return(1); + lkPlace = xmlListLowerSearch(l, data); + /* Add the new link */ + lkNew = (xmlLinkPtr) xmlMalloc(sizeof(xmlLink)); + if (lkNew == NULL) { + xmlGenericError(xmlGenericErrorContext, + "Cannot initialize memory for new link"); + return (1); + } + lkNew->data = data; + lkPlace = lkPlace->prev; + lkNew->next = lkPlace->next; + (lkPlace->next)->prev = lkNew; + lkPlace->next = lkNew; + lkNew->prev = lkPlace; + return 0; +} + +/** + * xmlListAppend: + * @l: a list + * @data: the data + * + * Insert data in the ordered list at the end for this value + * + * Returns 0 in case of success, 1 in case of failure + */ +int xmlListAppend(xmlListPtr l, void *data) +{ + xmlLinkPtr lkPlace, lkNew; + + if (l == NULL) + return(1); + lkPlace = xmlListHigherSearch(l, data); + /* Add the new link */ + lkNew = (xmlLinkPtr) xmlMalloc(sizeof(xmlLink)); + if (lkNew == NULL) { + xmlGenericError(xmlGenericErrorContext, + "Cannot initialize memory for new link"); + return (1); + } + lkNew->data = data; + lkNew->next = lkPlace->next; + (lkPlace->next)->prev = lkNew; + lkPlace->next = lkNew; + lkNew->prev = lkPlace; + return 0; +} + +/** + * xmlListDelete: + * @l: a list + * + * Deletes the list and its associated data + */ +void xmlListDelete(xmlListPtr l) +{ + if (l == NULL) + return; + + xmlListClear(l); + xmlFree(l->sentinel); + xmlFree(l); +} + +/** + * xmlListRemoveFirst: + * @l: a list + * @data: list data + * + * Remove the first instance associated to data in the list + * + * Returns 1 if a deallocation occured, or 0 if not found + */ +int +xmlListRemoveFirst(xmlListPtr l, void *data) +{ + xmlLinkPtr lk; + + if (l == NULL) + return(0); + /*Find the first instance of this data */ + lk = xmlListLinkSearch(l, data); + if (lk != NULL) { + xmlLinkDeallocator(l, lk); + return 1; + } + return 0; +} + +/** + * xmlListRemoveLast: + * @l: a list + * @data: list data + * + * Remove the last instance associated to data in the list + * + * Returns 1 if a deallocation occured, or 0 if not found + */ +int +xmlListRemoveLast(xmlListPtr l, void *data) +{ + xmlLinkPtr lk; + + if (l == NULL) + return(0); + /*Find the last instance of this data */ + lk = xmlListLinkReverseSearch(l, data); + if (lk != NULL) { + xmlLinkDeallocator(l, lk); + return 1; + } + return 0; +} + +/** + * xmlListRemoveAll: + * @l: a list + * @data: list data + * + * Remove the all instance associated to data in the list + * + * Returns the number of deallocation, or 0 if not found + */ +int +xmlListRemoveAll(xmlListPtr l, void *data) +{ + int count=0; + + if (l == NULL) + return(0); + + while(xmlListRemoveFirst(l, data)) + count++; + return count; +} + +/** + * xmlListClear: + * @l: a list + * + * Remove the all data in the list + */ +void +xmlListClear(xmlListPtr l) +{ + xmlLinkPtr lk; + + if (l == NULL) + return; + lk = l->sentinel->next; + while(lk != l->sentinel) { + xmlLinkPtr next = lk->next; + + xmlLinkDeallocator(l, lk); + lk = next; + } +} + +/** + * xmlListEmpty: + * @l: a list + * + * Is the list empty ? + * + * Returns 1 if the list is empty, 0 if not empty and -1 in case of error + */ +int +xmlListEmpty(xmlListPtr l) +{ + if (l == NULL) + return(-1); + return (l->sentinel->next == l->sentinel); +} + +/** + * xmlListFront: + * @l: a list + * + * Get the first element in the list + * + * Returns the first element in the list, or NULL + */ +xmlLinkPtr +xmlListFront(xmlListPtr l) +{ + if (l == NULL) + return(NULL); + return (l->sentinel->next); +} + +/** + * xmlListEnd: + * @l: a list + * + * Get the last element in the list + * + * Returns the last element in the list, or NULL + */ +xmlLinkPtr +xmlListEnd(xmlListPtr l) +{ + if (l == NULL) + return(NULL); + return (l->sentinel->prev); +} + +/** + * xmlListSize: + * @l: a list + * + * Get the number of elements in the list + * + * Returns the number of elements in the list or -1 in case of error + */ +int +xmlListSize(xmlListPtr l) +{ + xmlLinkPtr lk; + int count=0; + + if (l == NULL) + return(-1); + /* TODO: keep a counter in xmlList instead */ + for(lk = l->sentinel->next; lk != l->sentinel; lk = lk->next, count++); + return count; +} + +/** + * xmlListPopFront: + * @l: a list + * + * Removes the first element in the list + */ +void +xmlListPopFront(xmlListPtr l) +{ + if(!xmlListEmpty(l)) + xmlLinkDeallocator(l, l->sentinel->next); +} + +/** + * xmlListPopBack: + * @l: a list + * + * Removes the last element in the list + */ +void +xmlListPopBack(xmlListPtr l) +{ + if(!xmlListEmpty(l)) + xmlLinkDeallocator(l, l->sentinel->prev); +} + +/** + * xmlListPushFront: + * @l: a list + * @data: new data + * + * add the new data at the beginning of the list + * + * Returns 1 if successful, 0 otherwise + */ +int +xmlListPushFront(xmlListPtr l, void *data) +{ + xmlLinkPtr lkPlace, lkNew; + + if (l == NULL) + return(0); + lkPlace = l->sentinel; + /* Add the new link */ + lkNew = (xmlLinkPtr) xmlMalloc(sizeof(xmlLink)); + if (lkNew == NULL) { + xmlGenericError(xmlGenericErrorContext, + "Cannot initialize memory for new link"); + return (0); + } + lkNew->data = data; + lkNew->next = lkPlace->next; + (lkPlace->next)->prev = lkNew; + lkPlace->next = lkNew; + lkNew->prev = lkPlace; + return 1; +} + +/** + * xmlListPushBack: + * @l: a list + * @data: new data + * + * add the new data at the end of the list + * + * Returns 1 if successful, 0 otherwise + */ +int +xmlListPushBack(xmlListPtr l, void *data) +{ + xmlLinkPtr lkPlace, lkNew; + + if (l == NULL) + return(0); + lkPlace = l->sentinel->prev; + /* Add the new link */ + if (NULL ==(lkNew = (xmlLinkPtr )xmlMalloc(sizeof(xmlLink)))) { + xmlGenericError(xmlGenericErrorContext, + "Cannot initialize memory for new link"); + return (0); + } + lkNew->data = data; + lkNew->next = lkPlace->next; + (lkPlace->next)->prev = lkNew; + lkPlace->next = lkNew; + lkNew->prev = lkPlace; + return 1; +} + +/** + * xmlLinkGetData: + * @lk: a link + * + * See Returns. + * + * Returns a pointer to the data referenced from this link + */ +void * +xmlLinkGetData(xmlLinkPtr lk) +{ + if (lk == NULL) + return(NULL); + return lk->data; +} + +/** + * xmlListReverse: + * @l: a list + * + * Reverse the order of the elements in the list + */ +void +xmlListReverse(xmlListPtr l) +{ + xmlLinkPtr lk; + xmlLinkPtr lkPrev; + + if (l == NULL) + return; + lkPrev = l->sentinel; + for (lk = l->sentinel->next; lk != l->sentinel; lk = lk->next) { + lkPrev->next = lkPrev->prev; + lkPrev->prev = lk; + lkPrev = lk; + } + /* Fix up the last node */ + lkPrev->next = lkPrev->prev; + lkPrev->prev = lk; +} + +/** + * xmlListSort: + * @l: a list + * + * Sort all the elements in the list + */ +void +xmlListSort(xmlListPtr l) +{ + xmlListPtr lTemp; + + if (l == NULL) + return; + if(xmlListEmpty(l)) + return; + + /* I think that the real answer is to implement quicksort, the + * alternative is to implement some list copying procedure which + * would be based on a list copy followed by a clear followed by + * an insert. This is slow... + */ + + if (NULL ==(lTemp = xmlListDup(l))) + return; + xmlListClear(l); + xmlListMerge(l, lTemp); + xmlListDelete(lTemp); + return; +} + +/** + * xmlListWalk: + * @l: a list + * @walker: a processing function + * @user: a user parameter passed to the walker function + * + * Walk all the element of the first from first to last and + * apply the walker function to it + */ +void +xmlListWalk(xmlListPtr l, xmlListWalker walker, const void *user) { + xmlLinkPtr lk; + + if ((l == NULL) || (walker == NULL)) + return; + for(lk = l->sentinel->next; lk != l->sentinel; lk = lk->next) { + if((walker(lk->data, user)) == 0) + break; + } +} + +/** + * xmlListReverseWalk: + * @l: a list + * @walker: a processing function + * @user: a user parameter passed to the walker function + * + * Walk all the element of the list in reverse order and + * apply the walker function to it + */ +void +xmlListReverseWalk(xmlListPtr l, xmlListWalker walker, const void *user) { + xmlLinkPtr lk; + + if ((l == NULL) || (walker == NULL)) + return; + for(lk = l->sentinel->prev; lk != l->sentinel; lk = lk->prev) { + if((walker(lk->data, user)) == 0) + break; + } +} + +/** + * xmlListMerge: + * @l1: the original list + * @l2: the new list + * + * include all the elements of the second list in the first one and + * clear the second list + */ +void +xmlListMerge(xmlListPtr l1, xmlListPtr l2) +{ + xmlListCopy(l1, l2); + xmlListClear(l2); +} + +/** + * xmlListDup: + * @old: the list + * + * Duplicate the list + * + * Returns a new copy of the list or NULL in case of error + */ +xmlListPtr +xmlListDup(const xmlListPtr old) +{ + xmlListPtr cur; + + if (old == NULL) + return(NULL); + /* Hmmm, how to best deal with allocation issues when copying + * lists. If there is a de-allocator, should responsibility lie with + * the new list or the old list. Surely not both. I'll arbitrarily + * set it to be the old list for the time being whilst I work out + * the answer + */ + if (NULL ==(cur = xmlListCreate(NULL, old->linkCompare))) + return (NULL); + if (0 != xmlListCopy(cur, old)) + return NULL; + return cur; +} + +/** + * xmlListCopy: + * @cur: the new list + * @old: the old list + * + * Move all the element from the old list in the new list + * + * Returns 0 in case of success 1 in case of error + */ +int +xmlListCopy(xmlListPtr cur, const xmlListPtr old) +{ + /* Walk the old tree and insert the data into the new one */ + xmlLinkPtr lk; + + if ((old == NULL) || (cur == NULL)) + return(1); + for(lk = old->sentinel->next; lk != old->sentinel; lk = lk->next) { + if (0 !=xmlListInsert(cur, lk->data)) { + xmlListDelete(cur); + return (1); + } + } + return (0); +} +/* xmlListUnique() */ +/* xmlListSwap */ +#define bottom_list +#include "elfgcchack.h" diff --git a/vendors/libxml/src/nanoftp.c b/vendors/libxml/src/nanoftp.c new file mode 100644 index 0000000..077bfe2 --- /dev/null +++ b/vendors/libxml/src/nanoftp.c @@ -0,0 +1,2113 @@ +/* + * nanoftp.c: basic FTP client support + * + * Reference: RFC 959 + */ + +#ifdef TESTING +#define STANDALONE +#define HAVE_STDLIB_H +#define HAVE_UNISTD_H +#define HAVE_SYS_SOCKET_H +#define HAVE_NETINET_IN_H +#define HAVE_NETDB_H +#define HAVE_SYS_TIME_H +#else /* TESTING */ +#define NEED_SOCKETS +#endif /* TESTING */ + +#define IN_LIBXML +#include "libxml.h" + +#ifdef LIBXML_FTP_ENABLED +#include + +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_ARPA_INET_H +#include +#endif +#ifdef HAVE_NETDB_H +#include +#endif +#ifdef HAVE_FCNTL_H +#include +#endif +#ifdef HAVE_ERRNO_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_SYS_SELECT_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_STRINGS_H +#include +#endif + +#include +#include +#include +#include +#include +#include + +/* #define DEBUG_FTP 1 */ +#ifdef STANDALONE +#ifndef DEBUG_FTP +#define DEBUG_FTP 1 +#endif +#endif + + +#if defined(__MINGW32__) || defined(_WIN32_WCE) +#ifndef _WINSOCKAPI_ +#define _WINSOCKAPI_ +#endif +#include +#include +#undef XML_SOCKLEN_T +#define XML_SOCKLEN_T unsigned int +#endif + +/** + * A couple portability macros + */ +#ifndef _WINSOCKAPI_ +#if !defined(__BEOS__) || defined(__HAIKU__) +#define closesocket(s) close(s) +#endif +#endif + +#ifdef __BEOS__ +#ifndef PF_INET +#define PF_INET AF_INET +#endif +#endif + +#ifdef _AIX +#ifdef HAVE_BROKEN_SS_FAMILY +#define ss_family __ss_family +#endif +#endif + +#ifndef XML_SOCKLEN_T +#define XML_SOCKLEN_T unsigned int +#endif + +#define FTP_COMMAND_OK 200 +#define FTP_SYNTAX_ERROR 500 +#define FTP_GET_PASSWD 331 +#define FTP_BUF_SIZE 1024 + +#define XML_NANO_MAX_URLBUF 4096 + +typedef struct xmlNanoFTPCtxt { + char *protocol; /* the protocol name */ + char *hostname; /* the host name */ + int port; /* the port */ + char *path; /* the path within the URL */ + char *user; /* user string */ + char *passwd; /* passwd string */ +#ifdef SUPPORT_IP6 + struct sockaddr_storage ftpAddr; /* this is large enough to hold IPv6 address*/ +#else + struct sockaddr_in ftpAddr; /* the socket address struct */ +#endif + int passive; /* currently we support only passive !!! */ + SOCKET controlFd; /* the file descriptor for the control socket */ + SOCKET dataFd; /* the file descriptor for the data socket */ + int state; /* WRITE / READ / CLOSED */ + int returnValue; /* the protocol return value */ + /* buffer for data received from the control connection */ + char controlBuf[FTP_BUF_SIZE + 1]; + int controlBufIndex; + int controlBufUsed; + int controlBufAnswer; +} xmlNanoFTPCtxt, *xmlNanoFTPCtxtPtr; + +static int initialized = 0; +static char *proxy = NULL; /* the proxy name if any */ +static int proxyPort = 0; /* the proxy port if any */ +static char *proxyUser = NULL; /* user for proxy authentication */ +static char *proxyPasswd = NULL;/* passwd for proxy authentication */ +static int proxyType = 0; /* uses TYPE or a@b ? */ + +#ifdef SUPPORT_IP6 +static +int have_ipv6(void) { + int s; + + s = socket (AF_INET6, SOCK_STREAM, 0); + if (s != -1) { + close (s); + return (1); + } + return (0); +} +#endif + +/** + * xmlFTPErrMemory: + * @extra: extra informations + * + * Handle an out of memory condition + */ +static void +xmlFTPErrMemory(const char *extra) +{ + __xmlSimpleError(XML_FROM_FTP, XML_ERR_NO_MEMORY, NULL, NULL, extra); +} + +/** + * xmlNanoFTPInit: + * + * Initialize the FTP protocol layer. + * Currently it just checks for proxy informations, + * and get the hostname + */ + +void +xmlNanoFTPInit(void) { + const char *env; +#ifdef _WINSOCKAPI_ + WSADATA wsaData; +#endif + + if (initialized) + return; + +#ifdef _WINSOCKAPI_ + if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) + return; +#endif + + proxyPort = 21; + env = getenv("no_proxy"); + if (env && ((env[0] == '*' ) && (env[1] == 0))) + return; + env = getenv("ftp_proxy"); + if (env != NULL) { + xmlNanoFTPScanProxy(env); + } else { + env = getenv("FTP_PROXY"); + if (env != NULL) { + xmlNanoFTPScanProxy(env); + } + } + env = getenv("ftp_proxy_user"); + if (env != NULL) { + proxyUser = xmlMemStrdup(env); + } + env = getenv("ftp_proxy_password"); + if (env != NULL) { + proxyPasswd = xmlMemStrdup(env); + } + initialized = 1; +} + +/** + * xmlNanoFTPCleanup: + * + * Cleanup the FTP protocol layer. This cleanup proxy informations. + */ + +void +xmlNanoFTPCleanup(void) { + if (proxy != NULL) { + xmlFree(proxy); + proxy = NULL; + } + if (proxyUser != NULL) { + xmlFree(proxyUser); + proxyUser = NULL; + } + if (proxyPasswd != NULL) { + xmlFree(proxyPasswd); + proxyPasswd = NULL; + } +#ifdef _WINSOCKAPI_ + if (initialized) + WSACleanup(); +#endif + initialized = 0; +} + +/** + * xmlNanoFTPProxy: + * @host: the proxy host name + * @port: the proxy port + * @user: the proxy user name + * @passwd: the proxy password + * @type: the type of proxy 1 for using SITE, 2 for USER a@b + * + * Setup the FTP proxy informations. + * This can also be done by using ftp_proxy ftp_proxy_user and + * ftp_proxy_password environment variables. + */ + +void +xmlNanoFTPProxy(const char *host, int port, const char *user, + const char *passwd, int type) { + if (proxy != NULL) { + xmlFree(proxy); + proxy = NULL; + } + if (proxyUser != NULL) { + xmlFree(proxyUser); + proxyUser = NULL; + } + if (proxyPasswd != NULL) { + xmlFree(proxyPasswd); + proxyPasswd = NULL; + } + if (host) + proxy = xmlMemStrdup(host); + if (user) + proxyUser = xmlMemStrdup(user); + if (passwd) + proxyPasswd = xmlMemStrdup(passwd); + proxyPort = port; + proxyType = type; +} + +/** + * xmlNanoFTPScanURL: + * @ctx: an FTP context + * @URL: The URL used to initialize the context + * + * (Re)Initialize an FTP context by parsing the URL and finding + * the protocol host port and path it indicates. + */ + +static void +xmlNanoFTPScanURL(void *ctx, const char *URL) { + xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; + xmlURIPtr uri; + + /* + * Clear any existing data from the context + */ + if (ctxt->protocol != NULL) { + xmlFree(ctxt->protocol); + ctxt->protocol = NULL; + } + if (ctxt->hostname != NULL) { + xmlFree(ctxt->hostname); + ctxt->hostname = NULL; + } + if (ctxt->path != NULL) { + xmlFree(ctxt->path); + ctxt->path = NULL; + } + if (URL == NULL) return; + + uri = xmlParseURIRaw(URL, 1); + if (uri == NULL) + return; + + if ((uri->scheme == NULL) || (uri->server == NULL)) { + xmlFreeURI(uri); + return; + } + + ctxt->protocol = xmlMemStrdup(uri->scheme); + ctxt->hostname = xmlMemStrdup(uri->server); + if (uri->path != NULL) + ctxt->path = xmlMemStrdup(uri->path); + else + ctxt->path = xmlMemStrdup("/"); + if (uri->port != 0) + ctxt->port = uri->port; + + if (uri->user != NULL) { + char *cptr; + if ((cptr=strchr(uri->user, ':')) == NULL) + ctxt->user = xmlMemStrdup(uri->user); + else { + ctxt->user = (char *)xmlStrndup((xmlChar *)uri->user, + (cptr - uri->user)); + ctxt->passwd = xmlMemStrdup(cptr+1); + } + } + + xmlFreeURI(uri); + +} + +/** + * xmlNanoFTPUpdateURL: + * @ctx: an FTP context + * @URL: The URL used to update the context + * + * Update an FTP context by parsing the URL and finding + * new path it indicates. If there is an error in the + * protocol, hostname, port or other information, the + * error is raised. It indicates a new connection has to + * be established. + * + * Returns 0 if Ok, -1 in case of error (other host). + */ + +int +xmlNanoFTPUpdateURL(void *ctx, const char *URL) { + xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; + xmlURIPtr uri; + + if (URL == NULL) + return(-1); + if (ctxt == NULL) + return(-1); + if (ctxt->protocol == NULL) + return(-1); + if (ctxt->hostname == NULL) + return(-1); + + uri = xmlParseURIRaw(URL, 1); + if (uri == NULL) + return(-1); + + if ((uri->scheme == NULL) || (uri->server == NULL)) { + xmlFreeURI(uri); + return(-1); + } + if ((strcmp(ctxt->protocol, uri->scheme)) || + (strcmp(ctxt->hostname, uri->server)) || + ((uri->port != 0) && (ctxt->port != uri->port))) { + xmlFreeURI(uri); + return(-1); + } + + if (uri->port != 0) + ctxt->port = uri->port; + + if (ctxt->path != NULL) { + xmlFree(ctxt->path); + ctxt->path = NULL; + } + + if (uri->path == NULL) + ctxt->path = xmlMemStrdup("/"); + else + ctxt->path = xmlMemStrdup(uri->path); + + xmlFreeURI(uri); + + return(0); +} + +/** + * xmlNanoFTPScanProxy: + * @URL: The proxy URL used to initialize the proxy context + * + * (Re)Initialize the FTP Proxy context by parsing the URL and finding + * the protocol host port it indicates. + * Should be like ftp://myproxy/ or ftp://myproxy:3128/ + * A NULL URL cleans up proxy informations. + */ + +void +xmlNanoFTPScanProxy(const char *URL) { + xmlURIPtr uri; + + if (proxy != NULL) { + xmlFree(proxy); + proxy = NULL; + } + proxyPort = 0; + +#ifdef DEBUG_FTP + if (URL == NULL) + xmlGenericError(xmlGenericErrorContext, + "Removing FTP proxy info\n"); + else + xmlGenericError(xmlGenericErrorContext, + "Using FTP proxy %s\n", URL); +#endif + if (URL == NULL) return; + + uri = xmlParseURIRaw(URL, 1); + if ((uri == NULL) || (uri->scheme == NULL) || + (strcmp(uri->scheme, "ftp")) || (uri->server == NULL)) { + __xmlIOErr(XML_FROM_FTP, XML_FTP_URL_SYNTAX, "Syntax Error\n"); + if (uri != NULL) + xmlFreeURI(uri); + return; + } + + proxy = xmlMemStrdup(uri->server); + if (uri->port != 0) + proxyPort = uri->port; + + xmlFreeURI(uri); +} + +/** + * xmlNanoFTPNewCtxt: + * @URL: The URL used to initialize the context + * + * Allocate and initialize a new FTP context. + * + * Returns an FTP context or NULL in case of error. + */ + +void* +xmlNanoFTPNewCtxt(const char *URL) { + xmlNanoFTPCtxtPtr ret; + char *unescaped; + + ret = (xmlNanoFTPCtxtPtr) xmlMalloc(sizeof(xmlNanoFTPCtxt)); + if (ret == NULL) { + xmlFTPErrMemory("allocating FTP context"); + return(NULL); + } + + memset(ret, 0, sizeof(xmlNanoFTPCtxt)); + ret->port = 21; + ret->passive = 1; + ret->returnValue = 0; + ret->controlBufIndex = 0; + ret->controlBufUsed = 0; + ret->controlFd = INVALID_SOCKET; + + unescaped = xmlURIUnescapeString(URL, 0, NULL); + if (unescaped != NULL) { + xmlNanoFTPScanURL(ret, unescaped); + xmlFree(unescaped); + } else if (URL != NULL) + xmlNanoFTPScanURL(ret, URL); + + return(ret); +} + +/** + * xmlNanoFTPFreeCtxt: + * @ctx: an FTP context + * + * Frees the context after closing the connection. + */ + +void +xmlNanoFTPFreeCtxt(void * ctx) { + xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; + if (ctxt == NULL) return; + if (ctxt->hostname != NULL) xmlFree(ctxt->hostname); + if (ctxt->protocol != NULL) xmlFree(ctxt->protocol); + if (ctxt->path != NULL) xmlFree(ctxt->path); + ctxt->passive = 1; + if (ctxt->controlFd != INVALID_SOCKET) closesocket(ctxt->controlFd); + ctxt->controlFd = INVALID_SOCKET; + ctxt->controlBufIndex = -1; + ctxt->controlBufUsed = -1; + xmlFree(ctxt); +} + +/** + * xmlNanoFTPParseResponse: + * @buf: the buffer containing the response + * @len: the buffer length + * + * Parsing of the server answer, we just extract the code. + * + * returns 0 for errors + * +XXX for last line of response + * -XXX for response to be continued + */ +static int +xmlNanoFTPParseResponse(char *buf, int len) { + int val = 0; + + if (len < 3) return(-1); + if ((*buf >= '0') && (*buf <= '9')) + val = val * 10 + (*buf - '0'); + else + return(0); + buf++; + if ((*buf >= '0') && (*buf <= '9')) + val = val * 10 + (*buf - '0'); + else + return(0); + buf++; + if ((*buf >= '0') && (*buf <= '9')) + val = val * 10 + (*buf - '0'); + else + return(0); + buf++; + if (*buf == '-') + return(-val); + return(val); +} + +/** + * xmlNanoFTPGetMore: + * @ctx: an FTP context + * + * Read more information from the FTP control connection + * Returns the number of bytes read, < 0 indicates an error + */ +static int +xmlNanoFTPGetMore(void *ctx) { + xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; + int len; + int size; + + if ((ctxt == NULL) || (ctxt->controlFd == INVALID_SOCKET)) return(-1); + + if ((ctxt->controlBufIndex < 0) || (ctxt->controlBufIndex > FTP_BUF_SIZE)) { +#ifdef DEBUG_FTP + xmlGenericError(xmlGenericErrorContext, + "xmlNanoFTPGetMore : controlBufIndex = %d\n", + ctxt->controlBufIndex); +#endif + return(-1); + } + + if ((ctxt->controlBufUsed < 0) || (ctxt->controlBufUsed > FTP_BUF_SIZE)) { +#ifdef DEBUG_FTP + xmlGenericError(xmlGenericErrorContext, + "xmlNanoFTPGetMore : controlBufUsed = %d\n", + ctxt->controlBufUsed); +#endif + return(-1); + } + if (ctxt->controlBufIndex > ctxt->controlBufUsed) { +#ifdef DEBUG_FTP + xmlGenericError(xmlGenericErrorContext, + "xmlNanoFTPGetMore : controlBufIndex > controlBufUsed %d > %d\n", + ctxt->controlBufIndex, ctxt->controlBufUsed); +#endif + return(-1); + } + + /* + * First pack the control buffer + */ + if (ctxt->controlBufIndex > 0) { + memmove(&ctxt->controlBuf[0], &ctxt->controlBuf[ctxt->controlBufIndex], + ctxt->controlBufUsed - ctxt->controlBufIndex); + ctxt->controlBufUsed -= ctxt->controlBufIndex; + ctxt->controlBufIndex = 0; + } + size = FTP_BUF_SIZE - ctxt->controlBufUsed; + if (size == 0) { +#ifdef DEBUG_FTP + xmlGenericError(xmlGenericErrorContext, + "xmlNanoFTPGetMore : buffer full %d \n", ctxt->controlBufUsed); +#endif + return(0); + } + + /* + * Read the amount left on the control connection + */ + if ((len = recv(ctxt->controlFd, &ctxt->controlBuf[ctxt->controlBufIndex], + size, 0)) < 0) { + __xmlIOErr(XML_FROM_FTP, 0, "recv failed"); + closesocket(ctxt->controlFd); ctxt->controlFd = INVALID_SOCKET; + ctxt->controlFd = INVALID_SOCKET; + return(-1); + } +#ifdef DEBUG_FTP + xmlGenericError(xmlGenericErrorContext, + "xmlNanoFTPGetMore : read %d [%d - %d]\n", len, + ctxt->controlBufUsed, ctxt->controlBufUsed + len); +#endif + ctxt->controlBufUsed += len; + ctxt->controlBuf[ctxt->controlBufUsed] = 0; + + return(len); +} + +/** + * xmlNanoFTPReadResponse: + * @ctx: an FTP context + * + * Read the response from the FTP server after a command. + * Returns the code number + */ +static int +xmlNanoFTPReadResponse(void *ctx) { + xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; + char *ptr, *end; + int len; + int res = -1, cur = -1; + + if ((ctxt == NULL) || (ctxt->controlFd == INVALID_SOCKET)) return(-1); + +get_more: + /* + * Assumes everything up to controlBuf[controlBufIndex] has been read + * and analyzed. + */ + len = xmlNanoFTPGetMore(ctx); + if (len < 0) { + return(-1); + } + if ((ctxt->controlBufUsed == 0) && (len == 0)) { + return(-1); + } + ptr = &ctxt->controlBuf[ctxt->controlBufIndex]; + end = &ctxt->controlBuf[ctxt->controlBufUsed]; + +#ifdef DEBUG_FTP + xmlGenericError(xmlGenericErrorContext, + "\n<<<\n%s\n--\n", ptr); +#endif + while (ptr < end) { + cur = xmlNanoFTPParseResponse(ptr, end - ptr); + if (cur > 0) { + /* + * Successfully scanned the control code, scratch + * till the end of the line, but keep the index to be + * able to analyze the result if needed. + */ + res = cur; + ptr += 3; + ctxt->controlBufAnswer = ptr - ctxt->controlBuf; + while ((ptr < end) && (*ptr != '\n')) ptr++; + if (*ptr == '\n') ptr++; + if (*ptr == '\r') ptr++; + break; + } + while ((ptr < end) && (*ptr != '\n')) ptr++; + if (ptr >= end) { + ctxt->controlBufIndex = ctxt->controlBufUsed; + goto get_more; + } + if (*ptr != '\r') ptr++; + } + + if (res < 0) goto get_more; + ctxt->controlBufIndex = ptr - ctxt->controlBuf; +#ifdef DEBUG_FTP + ptr = &ctxt->controlBuf[ctxt->controlBufIndex]; + xmlGenericError(xmlGenericErrorContext, "\n---\n%s\n--\n", ptr); +#endif + +#ifdef DEBUG_FTP + xmlGenericError(xmlGenericErrorContext, "Got %d\n", res); +#endif + return(res / 100); +} + +/** + * xmlNanoFTPGetResponse: + * @ctx: an FTP context + * + * Get the response from the FTP server after a command. + * Returns the code number + */ + +int +xmlNanoFTPGetResponse(void *ctx) { + int res; + + res = xmlNanoFTPReadResponse(ctx); + + return(res); +} + +/** + * xmlNanoFTPCheckResponse: + * @ctx: an FTP context + * + * Check if there is a response from the FTP server after a command. + * Returns the code number, or 0 + */ + +int +xmlNanoFTPCheckResponse(void *ctx) { + xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; + fd_set rfd; + struct timeval tv; + + if ((ctxt == NULL) || (ctxt->controlFd == INVALID_SOCKET)) return(-1); + tv.tv_sec = 0; + tv.tv_usec = 0; + FD_ZERO(&rfd); + FD_SET(ctxt->controlFd, &rfd); + switch(select(ctxt->controlFd + 1, &rfd, NULL, NULL, &tv)) { + case 0: + return(0); + case -1: + __xmlIOErr(XML_FROM_FTP, 0, "select"); + return(-1); + + } + + return(xmlNanoFTPReadResponse(ctx)); +} + +/** + * Send the user authentication + */ + +static int +xmlNanoFTPSendUser(void *ctx) { + xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; + char buf[200]; + int len; + int res; + + if (ctxt->user == NULL) + snprintf(buf, sizeof(buf), "USER anonymous\r\n"); + else + snprintf(buf, sizeof(buf), "USER %s\r\n", ctxt->user); + buf[sizeof(buf) - 1] = 0; + len = strlen(buf); +#ifdef DEBUG_FTP + xmlGenericError(xmlGenericErrorContext, "%s", buf); +#endif + res = send(ctxt->controlFd, buf, len, 0); + if (res < 0) { + __xmlIOErr(XML_FROM_FTP, 0, "send failed"); + return(res); + } + return(0); +} + +/** + * Send the password authentication + */ + +static int +xmlNanoFTPSendPasswd(void *ctx) { + xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; + char buf[200]; + int len; + int res; + + if (ctxt->passwd == NULL) + snprintf(buf, sizeof(buf), "PASS anonymous@\r\n"); + else + snprintf(buf, sizeof(buf), "PASS %s\r\n", ctxt->passwd); + buf[sizeof(buf) - 1] = 0; + len = strlen(buf); +#ifdef DEBUG_FTP + xmlGenericError(xmlGenericErrorContext, "%s", buf); +#endif + res = send(ctxt->controlFd, buf, len, 0); + if (res < 0) { + __xmlIOErr(XML_FROM_FTP, 0, "send failed"); + return(res); + } + return(0); +} + +/** + * xmlNanoFTPQuit: + * @ctx: an FTP context + * + * Send a QUIT command to the server + * + * Returns -1 in case of error, 0 otherwise + */ + + +int +xmlNanoFTPQuit(void *ctx) { + xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; + char buf[200]; + int len, res; + + if ((ctxt == NULL) || (ctxt->controlFd == INVALID_SOCKET)) return(-1); + + snprintf(buf, sizeof(buf), "QUIT\r\n"); + len = strlen(buf); +#ifdef DEBUG_FTP + xmlGenericError(xmlGenericErrorContext, "%s", buf); /* Just to be consistent, even though we know it can't have a % in it */ +#endif + res = send(ctxt->controlFd, buf, len, 0); + if (res < 0) { + __xmlIOErr(XML_FROM_FTP, 0, "send failed"); + return(res); + } + return(0); +} + +/** + * xmlNanoFTPConnect: + * @ctx: an FTP context + * + * Tries to open a control connection + * + * Returns -1 in case of error, 0 otherwise + */ + +int +xmlNanoFTPConnect(void *ctx) { + xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; + struct hostent *hp; + int port; + int res; + int addrlen = sizeof (struct sockaddr_in); + + if (ctxt == NULL) + return(-1); + if (ctxt->hostname == NULL) + return(-1); + + /* + * do the blocking DNS query. + */ + if (proxy) { + port = proxyPort; + } else { + port = ctxt->port; + } + if (port == 0) + port = 21; + + memset (&ctxt->ftpAddr, 0, sizeof(ctxt->ftpAddr)); + +#ifdef SUPPORT_IP6 + if (have_ipv6 ()) { + struct addrinfo hints, *tmp, *result; + + result = NULL; + memset (&hints, 0, sizeof(hints)); + hints.ai_socktype = SOCK_STREAM; + + if (proxy) { + if (getaddrinfo (proxy, NULL, &hints, &result) != 0) { + __xmlIOErr(XML_FROM_FTP, 0, "getaddrinfo failed"); + return (-1); + } + } + else + if (getaddrinfo (ctxt->hostname, NULL, &hints, &result) != 0) { + __xmlIOErr(XML_FROM_FTP, 0, "getaddrinfo failed"); + return (-1); + } + + for (tmp = result; tmp; tmp = tmp->ai_next) + if (tmp->ai_family == AF_INET || tmp->ai_family == AF_INET6) + break; + + if (!tmp) { + if (result) + freeaddrinfo (result); + __xmlIOErr(XML_FROM_FTP, 0, "getaddrinfo failed"); + return (-1); + } + if (tmp->ai_addrlen > sizeof(ctxt->ftpAddr)) { + __xmlIOErr(XML_FROM_FTP, 0, "gethostbyname address mismatch"); + return (-1); + } + if (tmp->ai_family == AF_INET6) { + memcpy (&ctxt->ftpAddr, tmp->ai_addr, tmp->ai_addrlen); + ((struct sockaddr_in6 *) &ctxt->ftpAddr)->sin6_port = htons (port); + ctxt->controlFd = socket (AF_INET6, SOCK_STREAM, 0); + } + else { + memcpy (&ctxt->ftpAddr, tmp->ai_addr, tmp->ai_addrlen); + ((struct sockaddr_in *) &ctxt->ftpAddr)->sin_port = htons (port); + ctxt->controlFd = socket (AF_INET, SOCK_STREAM, 0); + } + addrlen = tmp->ai_addrlen; + freeaddrinfo (result); + } + else +#endif + { + if (proxy) + hp = gethostbyname (proxy); + else + hp = gethostbyname (ctxt->hostname); + if (hp == NULL) { + __xmlIOErr(XML_FROM_FTP, 0, "gethostbyname failed"); + return (-1); + } + if ((unsigned int) hp->h_length > + sizeof(((struct sockaddr_in *)&ctxt->ftpAddr)->sin_addr)) { + __xmlIOErr(XML_FROM_FTP, 0, "gethostbyname address mismatch"); + return (-1); + } + + /* + * Prepare the socket + */ + ((struct sockaddr_in *)&ctxt->ftpAddr)->sin_family = AF_INET; + memcpy (&((struct sockaddr_in *)&ctxt->ftpAddr)->sin_addr, + hp->h_addr_list[0], hp->h_length); + ((struct sockaddr_in *)&ctxt->ftpAddr)->sin_port = + (unsigned short)htons ((unsigned short)port); + ctxt->controlFd = socket (AF_INET, SOCK_STREAM, 0); + addrlen = sizeof (struct sockaddr_in); + } + + if (ctxt->controlFd == INVALID_SOCKET) { + __xmlIOErr(XML_FROM_FTP, 0, "socket failed"); + return(-1); + } + + /* + * Do the connect. + */ + if (connect(ctxt->controlFd, (struct sockaddr *) &ctxt->ftpAddr, + addrlen) < 0) { + __xmlIOErr(XML_FROM_FTP, 0, "Failed to create a connection"); + closesocket(ctxt->controlFd); ctxt->controlFd = INVALID_SOCKET; + ctxt->controlFd = INVALID_SOCKET; + return(-1); + } + + /* + * Wait for the HELLO from the server. + */ + res = xmlNanoFTPGetResponse(ctxt); + if (res != 2) { + closesocket(ctxt->controlFd); ctxt->controlFd = INVALID_SOCKET; + ctxt->controlFd = INVALID_SOCKET; + return(-1); + } + + /* + * State diagram for the login operation on the FTP server + * + * Reference: RFC 959 + * + * 1 + * +---+ USER +---+------------->+---+ + * | B |---------->| W | 2 ---->| E | + * +---+ +---+------ | -->+---+ + * | | | | | + * 3 | | 4,5 | | | + * -------------- ----- | | | + * | | | | | + * | | | | | + * | --------- | + * | 1| | | | + * V | | | | + * +---+ PASS +---+ 2 | ------>+---+ + * | |---------->| W |------------->| S | + * +---+ +---+ ---------->+---+ + * | | | | | + * 3 | |4,5| | | + * -------------- -------- | + * | | | | | + * | | | | | + * | ----------- + * | 1,3| | | | + * V | 2| | | + * +---+ ACCT +---+-- | ----->+---+ + * | |---------->| W | 4,5 -------->| F | + * +---+ +---+------------->+---+ + * + * Of course in case of using a proxy this get really nasty and is not + * standardized at all :-( + */ + if (proxy) { + int len; + char buf[400]; + + if (proxyUser != NULL) { + /* + * We need proxy auth + */ + snprintf(buf, sizeof(buf), "USER %s\r\n", proxyUser); + buf[sizeof(buf) - 1] = 0; + len = strlen(buf); +#ifdef DEBUG_FTP + xmlGenericError(xmlGenericErrorContext, "%s", buf); +#endif + res = send(ctxt->controlFd, buf, len, 0); + if (res < 0) { + __xmlIOErr(XML_FROM_FTP, 0, "send failed"); + closesocket(ctxt->controlFd); + ctxt->controlFd = INVALID_SOCKET; + return(res); + } + res = xmlNanoFTPGetResponse(ctxt); + switch (res) { + case 2: + if (proxyPasswd == NULL) + break; + case 3: + if (proxyPasswd != NULL) + snprintf(buf, sizeof(buf), "PASS %s\r\n", proxyPasswd); + else + snprintf(buf, sizeof(buf), "PASS anonymous@\r\n"); + buf[sizeof(buf) - 1] = 0; + len = strlen(buf); +#ifdef DEBUG_FTP + xmlGenericError(xmlGenericErrorContext, "%s", buf); +#endif + res = send(ctxt->controlFd, buf, len, 0); + if (res < 0) { + __xmlIOErr(XML_FROM_FTP, 0, "send failed"); + closesocket(ctxt->controlFd); + ctxt->controlFd = INVALID_SOCKET; + return(res); + } + res = xmlNanoFTPGetResponse(ctxt); + if (res > 3) { + closesocket(ctxt->controlFd); + ctxt->controlFd = INVALID_SOCKET; + return(-1); + } + break; + case 1: + break; + case 4: + case 5: + case -1: + default: + closesocket(ctxt->controlFd); + ctxt->controlFd = INVALID_SOCKET; + return(-1); + } + } + + /* + * We assume we don't need more authentication to the proxy + * and that it succeeded :-\ + */ + switch (proxyType) { + case 0: + /* we will try in sequence */ + case 1: + /* Using SITE command */ + snprintf(buf, sizeof(buf), "SITE %s\r\n", ctxt->hostname); + buf[sizeof(buf) - 1] = 0; + len = strlen(buf); +#ifdef DEBUG_FTP + xmlGenericError(xmlGenericErrorContext, "%s", buf); +#endif + res = send(ctxt->controlFd, buf, len, 0); + if (res < 0) { + __xmlIOErr(XML_FROM_FTP, 0, "send failed"); + closesocket(ctxt->controlFd); ctxt->controlFd = INVALID_SOCKET; + ctxt->controlFd = INVALID_SOCKET; + return(res); + } + res = xmlNanoFTPGetResponse(ctxt); + if (res == 2) { + /* we assume it worked :-\ 1 is error for SITE command */ + proxyType = 1; + break; + } + if (proxyType == 1) { + closesocket(ctxt->controlFd); ctxt->controlFd = INVALID_SOCKET; + ctxt->controlFd = INVALID_SOCKET; + return(-1); + } + case 2: + /* USER user@host command */ + if (ctxt->user == NULL) + snprintf(buf, sizeof(buf), "USER anonymous@%s\r\n", + ctxt->hostname); + else + snprintf(buf, sizeof(buf), "USER %s@%s\r\n", + ctxt->user, ctxt->hostname); + buf[sizeof(buf) - 1] = 0; + len = strlen(buf); +#ifdef DEBUG_FTP + xmlGenericError(xmlGenericErrorContext, "%s", buf); +#endif + res = send(ctxt->controlFd, buf, len, 0); + if (res < 0) { + __xmlIOErr(XML_FROM_FTP, 0, "send failed"); + closesocket(ctxt->controlFd); ctxt->controlFd = INVALID_SOCKET; + ctxt->controlFd = INVALID_SOCKET; + return(res); + } + res = xmlNanoFTPGetResponse(ctxt); + if ((res == 1) || (res == 2)) { + /* we assume it worked :-\ */ + proxyType = 2; + return(0); + } + if (ctxt->passwd == NULL) + snprintf(buf, sizeof(buf), "PASS anonymous@\r\n"); + else + snprintf(buf, sizeof(buf), "PASS %s\r\n", ctxt->passwd); + buf[sizeof(buf) - 1] = 0; + len = strlen(buf); +#ifdef DEBUG_FTP + xmlGenericError(xmlGenericErrorContext, "%s", buf); +#endif + res = send(ctxt->controlFd, buf, len, 0); + if (res < 0) { + __xmlIOErr(XML_FROM_FTP, 0, "send failed"); + closesocket(ctxt->controlFd); ctxt->controlFd = INVALID_SOCKET; + ctxt->controlFd = INVALID_SOCKET; + return(res); + } + res = xmlNanoFTPGetResponse(ctxt); + if ((res == 1) || (res == 2)) { + /* we assume it worked :-\ */ + proxyType = 2; + return(0); + } + if (proxyType == 2) { + closesocket(ctxt->controlFd); ctxt->controlFd = INVALID_SOCKET; + ctxt->controlFd = INVALID_SOCKET; + return(-1); + } + case 3: + /* + * If you need support for other Proxy authentication scheme + * send the code or at least the sequence in use. + */ + default: + closesocket(ctxt->controlFd); ctxt->controlFd = INVALID_SOCKET; + ctxt->controlFd = INVALID_SOCKET; + return(-1); + } + } + /* + * Non-proxy handling. + */ + res = xmlNanoFTPSendUser(ctxt); + if (res < 0) { + closesocket(ctxt->controlFd); ctxt->controlFd = INVALID_SOCKET; + ctxt->controlFd = INVALID_SOCKET; + return(-1); + } + res = xmlNanoFTPGetResponse(ctxt); + switch (res) { + case 2: + return(0); + case 3: + break; + case 1: + case 4: + case 5: + case -1: + default: + closesocket(ctxt->controlFd); ctxt->controlFd = INVALID_SOCKET; + ctxt->controlFd = INVALID_SOCKET; + return(-1); + } + res = xmlNanoFTPSendPasswd(ctxt); + if (res < 0) { + closesocket(ctxt->controlFd); ctxt->controlFd = INVALID_SOCKET; + ctxt->controlFd = INVALID_SOCKET; + return(-1); + } + res = xmlNanoFTPGetResponse(ctxt); + switch (res) { + case 2: + break; + case 3: + __xmlIOErr(XML_FROM_FTP, XML_FTP_ACCNT, + "FTP server asking for ACCNT on anonymous\n"); + case 1: + case 4: + case 5: + case -1: + default: + closesocket(ctxt->controlFd); ctxt->controlFd = INVALID_SOCKET; + ctxt->controlFd = INVALID_SOCKET; + return(-1); + } + + return(0); +} + +/** + * xmlNanoFTPConnectTo: + * @server: an FTP server name + * @port: the port (use 21 if 0) + * + * Tries to open a control connection to the given server/port + * + * Returns an fTP context or NULL if it failed + */ + +void* +xmlNanoFTPConnectTo(const char *server, int port) { + xmlNanoFTPCtxtPtr ctxt; + int res; + + xmlNanoFTPInit(); + if (server == NULL) + return(NULL); + if (port <= 0) + return(NULL); + ctxt = (xmlNanoFTPCtxtPtr) xmlNanoFTPNewCtxt(NULL); + ctxt->hostname = xmlMemStrdup(server); + if (port != 0) + ctxt->port = port; + res = xmlNanoFTPConnect(ctxt); + if (res < 0) { + xmlNanoFTPFreeCtxt(ctxt); + return(NULL); + } + return(ctxt); +} + +/** + * xmlNanoFTPCwd: + * @ctx: an FTP context + * @directory: a directory on the server + * + * Tries to change the remote directory + * + * Returns -1 incase of error, 1 if CWD worked, 0 if it failed + */ + +int +xmlNanoFTPCwd(void *ctx, const char *directory) { + xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; + char buf[400]; + int len; + int res; + + if ((ctxt == NULL) || (ctxt->controlFd == INVALID_SOCKET)) return(-1); + if (directory == NULL) return 0; + + /* + * Expected response code for CWD: + * + * CWD + * 250 + * 500, 501, 502, 421, 530, 550 + */ + snprintf(buf, sizeof(buf), "CWD %s\r\n", directory); + buf[sizeof(buf) - 1] = 0; + len = strlen(buf); +#ifdef DEBUG_FTP + xmlGenericError(xmlGenericErrorContext, "%s", buf); +#endif + res = send(ctxt->controlFd, buf, len, 0); + if (res < 0) { + __xmlIOErr(XML_FROM_FTP, 0, "send failed"); + return(res); + } + res = xmlNanoFTPGetResponse(ctxt); + if (res == 4) { + return(-1); + } + if (res == 2) return(1); + if (res == 5) { + return(0); + } + return(0); +} + +/** + * xmlNanoFTPDele: + * @ctx: an FTP context + * @file: a file or directory on the server + * + * Tries to delete an item (file or directory) from server + * + * Returns -1 incase of error, 1 if DELE worked, 0 if it failed + */ + +int +xmlNanoFTPDele(void *ctx, const char *file) { + xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; + char buf[400]; + int len; + int res; + + if ((ctxt == NULL) || (ctxt->controlFd == INVALID_SOCKET) || (file == NULL)) return(-1); + if (file == NULL) return (0); + + /* + * Expected response code for DELE: + * + * DELE + * 250 + * 450, 550 + * 500, 501, 502, 421, 530 + */ + + snprintf(buf, sizeof(buf), "DELE %s\r\n", file); + buf[sizeof(buf) - 1] = 0; + len = strlen(buf); +#ifdef DEBUG_FTP + xmlGenericError(xmlGenericErrorContext, "%s", buf); +#endif + res = send(ctxt->controlFd, buf, len, 0); + if (res < 0) { + __xmlIOErr(XML_FROM_FTP, 0, "send failed"); + return(res); + } + res = xmlNanoFTPGetResponse(ctxt); + if (res == 4) { + return(-1); + } + if (res == 2) return(1); + if (res == 5) { + return(0); + } + return(0); +} +/** + * xmlNanoFTPGetConnection: + * @ctx: an FTP context + * + * Try to open a data connection to the server. Currently only + * passive mode is supported. + * + * Returns -1 incase of error, 0 otherwise + */ + +SOCKET +xmlNanoFTPGetConnection(void *ctx) { + xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; + char buf[200], *cur; + int len, i; + int res; + unsigned char ad[6], *adp, *portp; + unsigned int temp[6]; +#ifdef SUPPORT_IP6 + struct sockaddr_storage dataAddr; +#else + struct sockaddr_in dataAddr; +#endif + XML_SOCKLEN_T dataAddrLen; + + if (ctxt == NULL) return INVALID_SOCKET; + + memset (&dataAddr, 0, sizeof(dataAddr)); +#ifdef SUPPORT_IP6 + if ((ctxt->ftpAddr).ss_family == AF_INET6) { + ctxt->dataFd = socket (AF_INET6, SOCK_STREAM, IPPROTO_TCP); + ((struct sockaddr_in6 *)&dataAddr)->sin6_family = AF_INET6; + dataAddrLen = sizeof(struct sockaddr_in6); + } else +#endif + { + ctxt->dataFd = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP); + ((struct sockaddr_in *)&dataAddr)->sin_family = AF_INET; + dataAddrLen = sizeof (struct sockaddr_in); + } + + if (ctxt->dataFd == INVALID_SOCKET) { + __xmlIOErr(XML_FROM_FTP, 0, "socket failed"); + return INVALID_SOCKET; + } + + if (ctxt->passive) { +#ifdef SUPPORT_IP6 + if ((ctxt->ftpAddr).ss_family == AF_INET6) + snprintf (buf, sizeof(buf), "EPSV\r\n"); + else +#endif + snprintf (buf, sizeof(buf), "PASV\r\n"); + len = strlen (buf); +#ifdef DEBUG_FTP + xmlGenericError(xmlGenericErrorContext, "%s", buf); +#endif + res = send(ctxt->controlFd, buf, len, 0); + if (res < 0) { + __xmlIOErr(XML_FROM_FTP, 0, "send failed"); + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + return INVALID_SOCKET; + } + res = xmlNanoFTPReadResponse(ctx); + if (res != 2) { + if (res == 5) { + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + return INVALID_SOCKET; + } else { + /* + * retry with an active connection + */ + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + ctxt->passive = 0; + } + } + cur = &ctxt->controlBuf[ctxt->controlBufAnswer]; + while (((*cur < '0') || (*cur > '9')) && *cur != '\0') cur++; +#ifdef SUPPORT_IP6 + if ((ctxt->ftpAddr).ss_family == AF_INET6) { + if (sscanf (cur, "%u", &temp[0]) != 1) { + __xmlIOErr(XML_FROM_FTP, XML_FTP_EPSV_ANSWER, + "Invalid answer to EPSV\n"); + if (ctxt->dataFd != INVALID_SOCKET) { + closesocket (ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + } + return INVALID_SOCKET; + } + memcpy (&((struct sockaddr_in6 *)&dataAddr)->sin6_addr, &((struct sockaddr_in6 *)&ctxt->ftpAddr)->sin6_addr, sizeof(struct in6_addr)); + ((struct sockaddr_in6 *)&dataAddr)->sin6_port = htons (temp[0]); + } + else +#endif + { + if (sscanf (cur, "%u,%u,%u,%u,%u,%u", &temp[0], &temp[1], &temp[2], + &temp[3], &temp[4], &temp[5]) != 6) { + __xmlIOErr(XML_FROM_FTP, XML_FTP_PASV_ANSWER, + "Invalid answer to PASV\n"); + if (ctxt->dataFd != INVALID_SOCKET) { + closesocket (ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + } + return INVALID_SOCKET; + } + for (i=0; i<6; i++) ad[i] = (unsigned char) (temp[i] & 0xff); + memcpy (&((struct sockaddr_in *)&dataAddr)->sin_addr, &ad[0], 4); + memcpy (&((struct sockaddr_in *)&dataAddr)->sin_port, &ad[4], 2); + } + + if (connect(ctxt->dataFd, (struct sockaddr *) &dataAddr, dataAddrLen) < 0) { + __xmlIOErr(XML_FROM_FTP, 0, "Failed to create a data connection"); + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + return INVALID_SOCKET; + } + } else { + getsockname(ctxt->dataFd, (struct sockaddr *) &dataAddr, &dataAddrLen); +#ifdef SUPPORT_IP6 + if ((ctxt->ftpAddr).ss_family == AF_INET6) + ((struct sockaddr_in6 *)&dataAddr)->sin6_port = 0; + else +#endif + ((struct sockaddr_in *)&dataAddr)->sin_port = 0; + + if (bind(ctxt->dataFd, (struct sockaddr *) &dataAddr, dataAddrLen) < 0) { + __xmlIOErr(XML_FROM_FTP, 0, "bind failed"); + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + return INVALID_SOCKET; + } + getsockname(ctxt->dataFd, (struct sockaddr *) &dataAddr, &dataAddrLen); + + if (listen(ctxt->dataFd, 1) < 0) { + __xmlIOErr(XML_FROM_FTP, 0, "listen failed"); + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + return INVALID_SOCKET; + } +#ifdef SUPPORT_IP6 + if ((ctxt->ftpAddr).ss_family == AF_INET6) { + char buf6[INET6_ADDRSTRLEN]; + inet_ntop (AF_INET6, &((struct sockaddr_in6 *)&dataAddr)->sin6_addr, + buf6, INET6_ADDRSTRLEN); + adp = (unsigned char *) buf6; + portp = (unsigned char *) &((struct sockaddr_in6 *)&dataAddr)->sin6_port; + snprintf (buf, sizeof(buf), "EPRT |2|%s|%s|\r\n", adp, portp); + } else +#endif + { + adp = (unsigned char *) &((struct sockaddr_in *)&dataAddr)->sin_addr; + portp = (unsigned char *) &((struct sockaddr_in *)&dataAddr)->sin_port; + snprintf (buf, sizeof(buf), "PORT %d,%d,%d,%d,%d,%d\r\n", + adp[0] & 0xff, adp[1] & 0xff, adp[2] & 0xff, adp[3] & 0xff, + portp[0] & 0xff, portp[1] & 0xff); + } + + buf[sizeof(buf) - 1] = 0; + len = strlen(buf); +#ifdef DEBUG_FTP + xmlGenericError(xmlGenericErrorContext, "%s", buf); +#endif + + res = send(ctxt->controlFd, buf, len, 0); + if (res < 0) { + __xmlIOErr(XML_FROM_FTP, 0, "send failed"); + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + return INVALID_SOCKET; + } + res = xmlNanoFTPGetResponse(ctxt); + if (res != 2) { + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + return INVALID_SOCKET; + } + } + return(ctxt->dataFd); + +} + +/** + * xmlNanoFTPCloseConnection: + * @ctx: an FTP context + * + * Close the data connection from the server + * + * Returns -1 incase of error, 0 otherwise + */ + +int +xmlNanoFTPCloseConnection(void *ctx) { + xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; + int res; + fd_set rfd, efd; + struct timeval tv; + + if ((ctxt == NULL) || (ctxt->controlFd == INVALID_SOCKET)) return(-1); + + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + tv.tv_sec = 15; + tv.tv_usec = 0; + FD_ZERO(&rfd); + FD_SET(ctxt->controlFd, &rfd); + FD_ZERO(&efd); + FD_SET(ctxt->controlFd, &efd); + res = select(ctxt->controlFd + 1, &rfd, NULL, &efd, &tv); + if (res < 0) { +#ifdef DEBUG_FTP + perror("select"); +#endif + closesocket(ctxt->controlFd); ctxt->controlFd = INVALID_SOCKET; + return(-1); + } + if (res == 0) { +#ifdef DEBUG_FTP + xmlGenericError(xmlGenericErrorContext, + "xmlNanoFTPCloseConnection: timeout\n"); +#endif + closesocket(ctxt->controlFd); ctxt->controlFd = INVALID_SOCKET; + } else { + res = xmlNanoFTPGetResponse(ctxt); + if (res != 2) { + closesocket(ctxt->controlFd); ctxt->controlFd = INVALID_SOCKET; + return(-1); + } + } + return(0); +} + +/** + * xmlNanoFTPParseList: + * @list: some data listing received from the server + * @callback: the user callback + * @userData: the user callback data + * + * Parse at most one entry from the listing. + * + * Returns -1 incase of error, the length of data parsed otherwise + */ + +static int +xmlNanoFTPParseList(const char *list, ftpListCallback callback, void *userData) { + const char *cur = list; + char filename[151]; + char attrib[11]; + char owner[11]; + char group[11]; + char month[4]; + int year = 0; + int minute = 0; + int hour = 0; + int day = 0; + unsigned long size = 0; + int links = 0; + int i; + + if (!strncmp(cur, "total", 5)) { + cur += 5; + while (*cur == ' ') cur++; + while ((*cur >= '0') && (*cur <= '9')) + links = (links * 10) + (*cur++ - '0'); + while ((*cur == ' ') || (*cur == '\n') || (*cur == '\r')) + cur++; + return(cur - list); + } else if (*list == '+') { + return(0); + } else { + while ((*cur == ' ') || (*cur == '\n') || (*cur == '\r')) + cur++; + if (*cur == 0) return(0); + i = 0; + while (*cur != ' ') { + if (i < 10) + attrib[i++] = *cur; + cur++; + if (*cur == 0) return(0); + } + attrib[10] = 0; + while (*cur == ' ') cur++; + if (*cur == 0) return(0); + while ((*cur >= '0') && (*cur <= '9')) + links = (links * 10) + (*cur++ - '0'); + while (*cur == ' ') cur++; + if (*cur == 0) return(0); + i = 0; + while (*cur != ' ') { + if (i < 10) + owner[i++] = *cur; + cur++; + if (*cur == 0) return(0); + } + owner[i] = 0; + while (*cur == ' ') cur++; + if (*cur == 0) return(0); + i = 0; + while (*cur != ' ') { + if (i < 10) + group[i++] = *cur; + cur++; + if (*cur == 0) return(0); + } + group[i] = 0; + while (*cur == ' ') cur++; + if (*cur == 0) return(0); + while ((*cur >= '0') && (*cur <= '9')) + size = (size * 10) + (*cur++ - '0'); + while (*cur == ' ') cur++; + if (*cur == 0) return(0); + i = 0; + while (*cur != ' ') { + if (i < 3) + month[i++] = *cur; + cur++; + if (*cur == 0) return(0); + } + month[i] = 0; + while (*cur == ' ') cur++; + if (*cur == 0) return(0); + while ((*cur >= '0') && (*cur <= '9')) + day = (day * 10) + (*cur++ - '0'); + while (*cur == ' ') cur++; + if (*cur == 0) return(0); + if ((cur[1] == 0) || (cur[2] == 0)) return(0); + if ((cur[1] == ':') || (cur[2] == ':')) { + while ((*cur >= '0') && (*cur <= '9')) + hour = (hour * 10) + (*cur++ - '0'); + if (*cur == ':') cur++; + while ((*cur >= '0') && (*cur <= '9')) + minute = (minute * 10) + (*cur++ - '0'); + } else { + while ((*cur >= '0') && (*cur <= '9')) + year = (year * 10) + (*cur++ - '0'); + } + while (*cur == ' ') cur++; + if (*cur == 0) return(0); + i = 0; + while ((*cur != '\n') && (*cur != '\r')) { + if (i < 150) + filename[i++] = *cur; + cur++; + if (*cur == 0) return(0); + } + filename[i] = 0; + if ((*cur != '\n') && (*cur != '\r')) + return(0); + while ((*cur == '\n') || (*cur == '\r')) + cur++; + } + if (callback != NULL) { + callback(userData, filename, attrib, owner, group, size, links, + year, month, day, hour, minute); + } + return(cur - list); +} + +/** + * xmlNanoFTPList: + * @ctx: an FTP context + * @callback: the user callback + * @userData: the user callback data + * @filename: optional files to list + * + * Do a listing on the server. All files info are passed back + * in the callbacks. + * + * Returns -1 incase of error, 0 otherwise + */ + +int +xmlNanoFTPList(void *ctx, ftpListCallback callback, void *userData, + const char *filename) { + xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; + char buf[4096 + 1]; + int len, res; + int indx = 0, base; + fd_set rfd, efd; + struct timeval tv; + + if (ctxt == NULL) return (-1); + if (filename == NULL) { + if (xmlNanoFTPCwd(ctxt, ctxt->path) < 1) + return(-1); + ctxt->dataFd = xmlNanoFTPGetConnection(ctxt); + if (ctxt->dataFd == INVALID_SOCKET) + return(-1); + snprintf(buf, sizeof(buf), "LIST -L\r\n"); + } else { + if (filename[0] != '/') { + if (xmlNanoFTPCwd(ctxt, ctxt->path) < 1) + return(-1); + } + ctxt->dataFd = xmlNanoFTPGetConnection(ctxt); + if (ctxt->dataFd == INVALID_SOCKET) + return(-1); + snprintf(buf, sizeof(buf), "LIST -L %s\r\n", filename); + } + buf[sizeof(buf) - 1] = 0; + len = strlen(buf); +#ifdef DEBUG_FTP + xmlGenericError(xmlGenericErrorContext, "%s", buf); +#endif + res = send(ctxt->controlFd, buf, len, 0); + if (res < 0) { + __xmlIOErr(XML_FROM_FTP, 0, "send failed"); + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + return(res); + } + res = xmlNanoFTPReadResponse(ctxt); + if (res != 1) { + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + return(-res); + } + + do { + tv.tv_sec = 1; + tv.tv_usec = 0; + FD_ZERO(&rfd); + FD_SET(ctxt->dataFd, &rfd); + FD_ZERO(&efd); + FD_SET(ctxt->dataFd, &efd); + res = select(ctxt->dataFd + 1, &rfd, NULL, &efd, &tv); + if (res < 0) { +#ifdef DEBUG_FTP + perror("select"); +#endif + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + return(-1); + } + if (res == 0) { + res = xmlNanoFTPCheckResponse(ctxt); + if (res < 0) { + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + ctxt->dataFd = INVALID_SOCKET; + return(-1); + } + if (res == 2) { + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + return(0); + } + + continue; + } + + if ((len = recv(ctxt->dataFd, &buf[indx], sizeof(buf) - (indx + 1), 0)) < 0) { + __xmlIOErr(XML_FROM_FTP, 0, "recv"); + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + ctxt->dataFd = INVALID_SOCKET; + return(-1); + } +#ifdef DEBUG_FTP + write(1, &buf[indx], len); +#endif + indx += len; + buf[indx] = 0; + base = 0; + do { + res = xmlNanoFTPParseList(&buf[base], callback, userData); + base += res; + } while (res > 0); + + memmove(&buf[0], &buf[base], indx - base); + indx -= base; + } while (len != 0); + xmlNanoFTPCloseConnection(ctxt); + return(0); +} + +/** + * xmlNanoFTPGetSocket: + * @ctx: an FTP context + * @filename: the file to retrieve (or NULL if path is in context). + * + * Initiate fetch of the given file from the server. + * + * Returns the socket for the data connection, or <0 in case of error + */ + + +SOCKET +xmlNanoFTPGetSocket(void *ctx, const char *filename) { + xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; + char buf[300]; + int res, len; + if (ctx == NULL) + return INVALID_SOCKET; + if ((filename == NULL) && (ctxt->path == NULL)) + return INVALID_SOCKET; + ctxt->dataFd = xmlNanoFTPGetConnection(ctxt); + if (ctxt->dataFd == INVALID_SOCKET) + return INVALID_SOCKET; + + snprintf(buf, sizeof(buf), "TYPE I\r\n"); + len = strlen(buf); +#ifdef DEBUG_FTP + xmlGenericError(xmlGenericErrorContext, "%s", buf); +#endif + res = send(ctxt->controlFd, buf, len, 0); + if (res < 0) { + __xmlIOErr(XML_FROM_FTP, 0, "send failed"); + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + return INVALID_SOCKET; + } + res = xmlNanoFTPReadResponse(ctxt); + if (res != 2) { + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + return INVALID_SOCKET; + } + if (filename == NULL) + snprintf(buf, sizeof(buf), "RETR %s\r\n", ctxt->path); + else + snprintf(buf, sizeof(buf), "RETR %s\r\n", filename); + buf[sizeof(buf) - 1] = 0; + len = strlen(buf); +#ifdef DEBUG_FTP + xmlGenericError(xmlGenericErrorContext, "%s", buf); +#endif + res = send(ctxt->controlFd, buf, len, 0); + if (res < 0) { + __xmlIOErr(XML_FROM_FTP, 0, "send failed"); + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + return INVALID_SOCKET; + } + res = xmlNanoFTPReadResponse(ctxt); + if (res != 1) { + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + return INVALID_SOCKET; + } + return(ctxt->dataFd); +} + +/** + * xmlNanoFTPGet: + * @ctx: an FTP context + * @callback: the user callback + * @userData: the user callback data + * @filename: the file to retrieve + * + * Fetch the given file from the server. All data are passed back + * in the callbacks. The last callback has a size of 0 block. + * + * Returns -1 incase of error, 0 otherwise + */ + +int +xmlNanoFTPGet(void *ctx, ftpDataCallback callback, void *userData, + const char *filename) { + xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; + char buf[4096]; + int len = 0, res; + fd_set rfd; + struct timeval tv; + + if (ctxt == NULL) return(-1); + if ((filename == NULL) && (ctxt->path == NULL)) + return(-1); + if (callback == NULL) + return(-1); + if (xmlNanoFTPGetSocket(ctxt, filename) == INVALID_SOCKET) + return(-1); + + do { + tv.tv_sec = 1; + tv.tv_usec = 0; + FD_ZERO(&rfd); + FD_SET(ctxt->dataFd, &rfd); + res = select(ctxt->dataFd + 1, &rfd, NULL, NULL, &tv); + if (res < 0) { +#ifdef DEBUG_FTP + perror("select"); +#endif + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + return(-1); + } + if (res == 0) { + res = xmlNanoFTPCheckResponse(ctxt); + if (res < 0) { + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + ctxt->dataFd = INVALID_SOCKET; + return(-1); + } + if (res == 2) { + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + return(0); + } + + continue; + } + if ((len = recv(ctxt->dataFd, buf, sizeof(buf), 0)) < 0) { + __xmlIOErr(XML_FROM_FTP, 0, "recv failed"); + callback(userData, buf, len); + closesocket(ctxt->dataFd); ctxt->dataFd = INVALID_SOCKET; + return(-1); + } + callback(userData, buf, len); + } while (len != 0); + + return(xmlNanoFTPCloseConnection(ctxt)); +} + +/** + * xmlNanoFTPRead: + * @ctx: the FTP context + * @dest: a buffer + * @len: the buffer length + * + * This function tries to read @len bytes from the existing FTP connection + * and saves them in @dest. This is a blocking call. + * + * Returns the number of byte read. 0 is an indication of an end of connection. + * -1 indicates a parameter error. + */ +int +xmlNanoFTPRead(void *ctx, void *dest, int len) { + xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; + + if (ctx == NULL) return(-1); + if (ctxt->dataFd == INVALID_SOCKET) return(0); + if (dest == NULL) return(-1); + if (len <= 0) return(0); + + len = recv(ctxt->dataFd, dest, len, 0); + if (len <= 0) { + if (len < 0) + __xmlIOErr(XML_FROM_FTP, 0, "recv failed"); + xmlNanoFTPCloseConnection(ctxt); + } +#ifdef DEBUG_FTP + xmlGenericError(xmlGenericErrorContext, "Recvd %d bytes\n", len); +#endif + return(len); +} + +/** + * xmlNanoFTPOpen: + * @URL: the URL to the resource + * + * Start to fetch the given ftp:// resource + * + * Returns an FTP context, or NULL + */ + +void* +xmlNanoFTPOpen(const char *URL) { + xmlNanoFTPCtxtPtr ctxt; + SOCKET sock; + + xmlNanoFTPInit(); + if (URL == NULL) return(NULL); + if (strncmp("ftp://", URL, 6)) return(NULL); + + ctxt = (xmlNanoFTPCtxtPtr) xmlNanoFTPNewCtxt(URL); + if (ctxt == NULL) return(NULL); + if (xmlNanoFTPConnect(ctxt) < 0) { + xmlNanoFTPFreeCtxt(ctxt); + return(NULL); + } + sock = xmlNanoFTPGetSocket(ctxt, ctxt->path); + if (sock == INVALID_SOCKET) { + xmlNanoFTPFreeCtxt(ctxt); + return(NULL); + } + return(ctxt); +} + +/** + * xmlNanoFTPClose: + * @ctx: an FTP context + * + * Close the connection and both control and transport + * + * Returns -1 incase of error, 0 otherwise + */ + +int +xmlNanoFTPClose(void *ctx) { + xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx; + + if (ctxt == NULL) + return(-1); + + if (ctxt->dataFd != INVALID_SOCKET) { + closesocket(ctxt->dataFd); + ctxt->dataFd = INVALID_SOCKET; + } + if (ctxt->controlFd != INVALID_SOCKET) { + xmlNanoFTPQuit(ctxt); + closesocket(ctxt->controlFd); + ctxt->controlFd = INVALID_SOCKET; + } + xmlNanoFTPFreeCtxt(ctxt); + return(0); +} + +#ifdef STANDALONE +/************************************************************************ + * * + * Basic test in Standalone mode * + * * + ************************************************************************/ +static +void ftpList(void *userData, const char *filename, const char* attrib, + const char *owner, const char *group, unsigned long size, int links, + int year, const char *month, int day, int hour, int minute) { + xmlGenericError(xmlGenericErrorContext, + "%s %s %s %ld %s\n", attrib, owner, group, size, filename); +} +static +void ftpData(void *userData, const char *data, int len) { + if (userData == NULL) return; + if (len <= 0) { + fclose((FILE*)userData); + return; + } + fwrite(data, len, 1, (FILE*)userData); +} + +int main(int argc, char **argv) { + void *ctxt; + FILE *output; + char *tstfile = NULL; + + xmlNanoFTPInit(); + if (argc > 1) { + ctxt = xmlNanoFTPNewCtxt(argv[1]); + if (xmlNanoFTPConnect(ctxt) < 0) { + xmlGenericError(xmlGenericErrorContext, + "Couldn't connect to %s\n", argv[1]); + exit(1); + } + if (argc > 2) + tstfile = argv[2]; + } else + ctxt = xmlNanoFTPConnectTo("localhost", 0); + if (ctxt == NULL) { + xmlGenericError(xmlGenericErrorContext, + "Couldn't connect to localhost\n"); + exit(1); + } + xmlNanoFTPList(ctxt, ftpList, NULL, tstfile); + output = fopen("/tmp/tstdata", "w"); + if (output != NULL) { + if (xmlNanoFTPGet(ctxt, ftpData, (void *) output, tstfile) < 0) + xmlGenericError(xmlGenericErrorContext, + "Failed to get file\n"); + + } + xmlNanoFTPClose(ctxt); + xmlMemoryDump(); + exit(0); +} +#endif /* STANDALONE */ +#else /* !LIBXML_FTP_ENABLED */ +#ifdef STANDALONE +#include +int main(int argc, char **argv) { + xmlGenericError(xmlGenericErrorContext, + "%s : FTP support not compiled in\n", argv[0]); + return(0); +} +#endif /* STANDALONE */ +#endif /* LIBXML_FTP_ENABLED */ +#define bottom_nanoftp +#include "elfgcchack.h" diff --git a/vendors/libxml/src/nanohttp.c b/vendors/libxml/src/nanohttp.c new file mode 100644 index 0000000..ac47ea6 --- /dev/null +++ b/vendors/libxml/src/nanohttp.c @@ -0,0 +1,1889 @@ +/* + * nanohttp.c: minimalist HTTP GET implementation to fetch external subsets. + * focuses on size, streamability, reentrancy and portability + * + * This is clearly not a general purpose HTTP implementation + * If you look for one, check: + * http://www.w3.org/Library/ + * + * See Copyright for the status of this software. + * + * daniel@veillard.com + */ + +#define NEED_SOCKETS +#define IN_LIBXML +#include "libxml.h" + +#ifdef LIBXML_HTTP_ENABLED +#include + +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_ARPA_INET_H +#include +#endif +#ifdef HAVE_NETDB_H +#include +#endif +#ifdef HAVE_RESOLV_H +#ifdef HAVE_ARPA_NAMESER_H +#include +#endif +#include +#endif +#ifdef HAVE_FCNTL_H +#include +#endif +#ifdef HAVE_ERRNO_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifndef HAVE_POLL_H +#ifdef HAVE_SYS_SELECT_H +#include +#endif +#else +#include +#endif +#ifdef HAVE_STRINGS_H +#include +#endif +#ifdef HAVE_ZLIB_H +#include +#endif + + +#ifdef VMS +#include +#define XML_SOCKLEN_T unsigned int +#endif + +#if defined(__MINGW32__) || defined(_WIN32_WCE) +#ifndef _WINSOCKAPI_ +#define _WINSOCKAPI_ +#endif +#include +#include +#undef XML_SOCKLEN_T +#define XML_SOCKLEN_T unsigned int +#endif + +#include +#include +#include +#include /* for xmlStr(n)casecmp() */ +#include +#include +#include + +/** + * A couple portability macros + */ +#ifndef _WINSOCKAPI_ +#if !defined(__BEOS__) || defined(__HAIKU__) +#define closesocket(s) close(s) +#endif +#define SOCKET int +#define INVALID_SOCKET (-1) +#endif + +#ifdef __BEOS__ +#ifndef PF_INET +#define PF_INET AF_INET +#endif +#endif + +#ifndef XML_SOCKLEN_T +#define XML_SOCKLEN_T unsigned int +#endif + +#ifdef STANDALONE +#define DEBUG_HTTP +#define xmlStrncasecmp(a, b, n) strncasecmp((char *)a, (char *)b, n) +#define xmlStrcasecmpi(a, b) strcasecmp((char *)a, (char *)b) +#endif + +#define XML_NANO_HTTP_MAX_REDIR 10 + +#define XML_NANO_HTTP_CHUNK 4096 + +#define XML_NANO_HTTP_CLOSED 0 +#define XML_NANO_HTTP_WRITE 1 +#define XML_NANO_HTTP_READ 2 +#define XML_NANO_HTTP_NONE 4 + +typedef struct xmlNanoHTTPCtxt { + char *protocol; /* the protocol name */ + char *hostname; /* the host name */ + int port; /* the port */ + char *path; /* the path within the URL */ + char *query; /* the query string */ + SOCKET fd; /* the file descriptor for the socket */ + int state; /* WRITE / READ / CLOSED */ + char *out; /* buffer sent (zero terminated) */ + char *outptr; /* index within the buffer sent */ + char *in; /* the receiving buffer */ + char *content; /* the start of the content */ + char *inptr; /* the next byte to read from network */ + char *inrptr; /* the next byte to give back to the client */ + int inlen; /* len of the input buffer */ + int last; /* return code for last operation */ + int returnValue; /* the protocol return value */ + int version; /* the protocol version */ + int ContentLength; /* specified content length from HTTP header */ + char *contentType; /* the MIME type for the input */ + char *location; /* the new URL in case of redirect */ + char *authHeader; /* contents of {WWW,Proxy}-Authenticate header */ + char *encoding; /* encoding extracted from the contentType */ + char *mimeType; /* Mime-Type extracted from the contentType */ +#ifdef HAVE_ZLIB_H + z_stream *strm; /* Zlib stream object */ + int usesGzip; /* "Content-Encoding: gzip" was detected */ +#endif +} xmlNanoHTTPCtxt, *xmlNanoHTTPCtxtPtr; + +static int initialized = 0; +static char *proxy = NULL; /* the proxy name if any */ +static int proxyPort; /* the proxy port if any */ +static unsigned int timeout = 60;/* the select() timeout in seconds */ + +static int xmlNanoHTTPFetchContent( void * ctx, char ** ptr, int * len ); + +/** + * xmlHTTPErrMemory: + * @extra: extra informations + * + * Handle an out of memory condition + */ +static void +xmlHTTPErrMemory(const char *extra) +{ + __xmlSimpleError(XML_FROM_HTTP, XML_ERR_NO_MEMORY, NULL, NULL, extra); +} + +/** + * A portability function + */ +static int socket_errno(void) { +#ifdef _WINSOCKAPI_ + return(WSAGetLastError()); +#else + return(errno); +#endif +} + +#ifdef SUPPORT_IP6 +static +int have_ipv6(void) { + SOCKET s; + + s = socket (AF_INET6, SOCK_STREAM, 0); + if (s != INVALID_SOCKET) { + close (s); + return (1); + } + return (0); +} +#endif + +/** + * xmlNanoHTTPInit: + * + * Initialize the HTTP protocol layer. + * Currently it just checks for proxy informations + */ + +void +xmlNanoHTTPInit(void) { + const char *env; +#ifdef _WINSOCKAPI_ + WSADATA wsaData; +#endif + + if (initialized) + return; + +#ifdef _WINSOCKAPI_ + if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) + return; +#endif + + if (proxy == NULL) { + proxyPort = 80; + env = getenv("no_proxy"); + if (env && ((env[0] == '*') && (env[1] == 0))) + goto done; + env = getenv("http_proxy"); + if (env != NULL) { + xmlNanoHTTPScanProxy(env); + goto done; + } + env = getenv("HTTP_PROXY"); + if (env != NULL) { + xmlNanoHTTPScanProxy(env); + goto done; + } + } +done: + initialized = 1; +} + +/** + * xmlNanoHTTPCleanup: + * + * Cleanup the HTTP protocol layer. + */ + +void +xmlNanoHTTPCleanup(void) { + if (proxy != NULL) { + xmlFree(proxy); + proxy = NULL; + } +#ifdef _WINSOCKAPI_ + if (initialized) + WSACleanup(); +#endif + initialized = 0; + return; +} + +/** + * xmlNanoHTTPScanURL: + * @ctxt: an HTTP context + * @URL: The URL used to initialize the context + * + * (Re)Initialize an HTTP context by parsing the URL and finding + * the protocol host port and path it indicates. + */ + +static void +xmlNanoHTTPScanURL(xmlNanoHTTPCtxtPtr ctxt, const char *URL) { + xmlURIPtr uri; + int len; + + /* + * Clear any existing data from the context + */ + if (ctxt->protocol != NULL) { + xmlFree(ctxt->protocol); + ctxt->protocol = NULL; + } + if (ctxt->hostname != NULL) { + xmlFree(ctxt->hostname); + ctxt->hostname = NULL; + } + if (ctxt->path != NULL) { + xmlFree(ctxt->path); + ctxt->path = NULL; + } + if (ctxt->query != NULL) { + xmlFree(ctxt->query); + ctxt->query = NULL; + } + if (URL == NULL) return; + + uri = xmlParseURIRaw(URL, 1); + if (uri == NULL) + return; + + if ((uri->scheme == NULL) || (uri->server == NULL)) { + xmlFreeURI(uri); + return; + } + + ctxt->protocol = xmlMemStrdup(uri->scheme); + /* special case of IPv6 addresses, the [] need to be removed */ + if ((uri->server != NULL) && (*uri->server == '[')) { + len = strlen(uri->server); + if ((len > 2) && (uri->server[len - 1] == ']')) { + ctxt->hostname = (char *) xmlCharStrndup(uri->server + 1, len -2); + } else + ctxt->hostname = xmlMemStrdup(uri->server); + } else + ctxt->hostname = xmlMemStrdup(uri->server); + if (uri->path != NULL) + ctxt->path = xmlMemStrdup(uri->path); + else + ctxt->path = xmlMemStrdup("/"); + if (uri->query != NULL) + ctxt->query = xmlMemStrdup(uri->query); + if (uri->port != 0) + ctxt->port = uri->port; + + xmlFreeURI(uri); +} + +/** + * xmlNanoHTTPScanProxy: + * @URL: The proxy URL used to initialize the proxy context + * + * (Re)Initialize the HTTP Proxy context by parsing the URL and finding + * the protocol host port it indicates. + * Should be like http://myproxy/ or http://myproxy:3128/ + * A NULL URL cleans up proxy informations. + */ + +void +xmlNanoHTTPScanProxy(const char *URL) { + xmlURIPtr uri; + + if (proxy != NULL) { + xmlFree(proxy); + proxy = NULL; + } + proxyPort = 0; + +#ifdef DEBUG_HTTP + if (URL == NULL) + xmlGenericError(xmlGenericErrorContext, + "Removing HTTP proxy info\n"); + else + xmlGenericError(xmlGenericErrorContext, + "Using HTTP proxy %s\n", URL); +#endif + if (URL == NULL) return; + + uri = xmlParseURIRaw(URL, 1); + if ((uri == NULL) || (uri->scheme == NULL) || + (strcmp(uri->scheme, "http")) || (uri->server == NULL)) { + __xmlIOErr(XML_FROM_HTTP, XML_HTTP_URL_SYNTAX, "Syntax Error\n"); + if (uri != NULL) + xmlFreeURI(uri); + return; + } + + proxy = xmlMemStrdup(uri->server); + if (uri->port != 0) + proxyPort = uri->port; + + xmlFreeURI(uri); +} + +/** + * xmlNanoHTTPNewCtxt: + * @URL: The URL used to initialize the context + * + * Allocate and initialize a new HTTP context. + * + * Returns an HTTP context or NULL in case of error. + */ + +static xmlNanoHTTPCtxtPtr +xmlNanoHTTPNewCtxt(const char *URL) { + xmlNanoHTTPCtxtPtr ret; + + ret = (xmlNanoHTTPCtxtPtr) xmlMalloc(sizeof(xmlNanoHTTPCtxt)); + if (ret == NULL) { + xmlHTTPErrMemory("allocating context"); + return(NULL); + } + + memset(ret, 0, sizeof(xmlNanoHTTPCtxt)); + ret->port = 80; + ret->returnValue = 0; + ret->fd = INVALID_SOCKET; + ret->ContentLength = -1; + + xmlNanoHTTPScanURL(ret, URL); + + return(ret); +} + +/** + * xmlNanoHTTPFreeCtxt: + * @ctxt: an HTTP context + * + * Frees the context after closing the connection. + */ + +static void +xmlNanoHTTPFreeCtxt(xmlNanoHTTPCtxtPtr ctxt) { + if (ctxt == NULL) return; + if (ctxt->hostname != NULL) xmlFree(ctxt->hostname); + if (ctxt->protocol != NULL) xmlFree(ctxt->protocol); + if (ctxt->path != NULL) xmlFree(ctxt->path); + if (ctxt->query != NULL) xmlFree(ctxt->query); + if (ctxt->out != NULL) xmlFree(ctxt->out); + if (ctxt->in != NULL) xmlFree(ctxt->in); + if (ctxt->contentType != NULL) xmlFree(ctxt->contentType); + if (ctxt->encoding != NULL) xmlFree(ctxt->encoding); + if (ctxt->mimeType != NULL) xmlFree(ctxt->mimeType); + if (ctxt->location != NULL) xmlFree(ctxt->location); + if (ctxt->authHeader != NULL) xmlFree(ctxt->authHeader); +#ifdef HAVE_ZLIB_H + if (ctxt->strm != NULL) { + inflateEnd(ctxt->strm); + xmlFree(ctxt->strm); + } +#endif + + ctxt->state = XML_NANO_HTTP_NONE; + if (ctxt->fd != INVALID_SOCKET) closesocket(ctxt->fd); + ctxt->fd = INVALID_SOCKET; + xmlFree(ctxt); +} + +/** + * xmlNanoHTTPSend: + * @ctxt: an HTTP context + * + * Send the input needed to initiate the processing on the server side + * Returns number of bytes sent or -1 on error. + */ + +static int +xmlNanoHTTPSend(xmlNanoHTTPCtxtPtr ctxt, const char *xmt_ptr, int outlen) +{ + int total_sent = 0; +#ifdef HAVE_POLL_H + struct pollfd p; +#else + struct timeval tv; + fd_set wfd; +#endif + + if ((ctxt->state & XML_NANO_HTTP_WRITE) && (xmt_ptr != NULL)) { + while (total_sent < outlen) { + int nsent = send(ctxt->fd, xmt_ptr + total_sent, + outlen - total_sent, 0); + + if (nsent > 0) + total_sent += nsent; + else if ((nsent == -1) && +#if defined(EAGAIN) && EAGAIN != EWOULDBLOCK + (socket_errno() != EAGAIN) && +#endif + (socket_errno() != EWOULDBLOCK)) { + __xmlIOErr(XML_FROM_HTTP, 0, "send failed\n"); + if (total_sent == 0) + total_sent = -1; + break; + } else { + /* + * No data sent + * Since non-blocking sockets are used, wait for + * socket to be writable or default timeout prior + * to retrying. + */ +#ifndef HAVE_POLL_H +#ifndef _WINSOCKAPI_ + if (ctxt->fd > FD_SETSIZE) + return -1; +#endif + + tv.tv_sec = timeout; + tv.tv_usec = 0; + FD_ZERO(&wfd); +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable: 4018) +#endif + FD_SET(ctxt->fd, &wfd); +#ifdef _MSC_VER +#pragma warning(pop) +#endif + (void) select(ctxt->fd + 1, NULL, &wfd, NULL, &tv); +#else + p.fd = ctxt->fd; + p.events = POLLOUT; + (void) poll(&p, 1, timeout * 1000); +#endif /* !HAVE_POLL_H */ + } + } + } + + return total_sent; +} + +/** + * xmlNanoHTTPRecv: + * @ctxt: an HTTP context + * + * Read information coming from the HTTP connection. + * This is a blocking call (but it blocks in select(), not read()). + * + * Returns the number of byte read or -1 in case of error. + */ + +static int +xmlNanoHTTPRecv(xmlNanoHTTPCtxtPtr ctxt) +{ +#ifdef HAVE_POLL_H + struct pollfd p; +#else + fd_set rfd; + struct timeval tv; +#endif + + + while (ctxt->state & XML_NANO_HTTP_READ) { + if (ctxt->in == NULL) { + ctxt->in = (char *) xmlMallocAtomic(65000 * sizeof(char)); + if (ctxt->in == NULL) { + xmlHTTPErrMemory("allocating input"); + ctxt->last = -1; + return (-1); + } + ctxt->inlen = 65000; + ctxt->inptr = ctxt->content = ctxt->inrptr = ctxt->in; + } + if (ctxt->inrptr > ctxt->in + XML_NANO_HTTP_CHUNK) { + int delta = ctxt->inrptr - ctxt->in; + int len = ctxt->inptr - ctxt->inrptr; + + memmove(ctxt->in, ctxt->inrptr, len); + ctxt->inrptr -= delta; + ctxt->content -= delta; + ctxt->inptr -= delta; + } + if ((ctxt->in + ctxt->inlen) < (ctxt->inptr + XML_NANO_HTTP_CHUNK)) { + int d_inptr = ctxt->inptr - ctxt->in; + int d_content = ctxt->content - ctxt->in; + int d_inrptr = ctxt->inrptr - ctxt->in; + char *tmp_ptr = ctxt->in; + + ctxt->inlen *= 2; + ctxt->in = (char *) xmlRealloc(tmp_ptr, ctxt->inlen); + if (ctxt->in == NULL) { + xmlHTTPErrMemory("allocating input buffer"); + xmlFree(tmp_ptr); + ctxt->last = -1; + return (-1); + } + ctxt->inptr = ctxt->in + d_inptr; + ctxt->content = ctxt->in + d_content; + ctxt->inrptr = ctxt->in + d_inrptr; + } + ctxt->last = recv(ctxt->fd, ctxt->inptr, XML_NANO_HTTP_CHUNK, 0); + if (ctxt->last > 0) { + ctxt->inptr += ctxt->last; + return (ctxt->last); + } + if (ctxt->last == 0) { + return (0); + } + if (ctxt->last == -1) { + switch (socket_errno()) { + case EINPROGRESS: + case EWOULDBLOCK: +#if defined(EAGAIN) && EAGAIN != EWOULDBLOCK + case EAGAIN: +#endif + break; + + case ECONNRESET: + case ESHUTDOWN: + return (0); + + default: + __xmlIOErr(XML_FROM_HTTP, 0, "recv failed\n"); + return (-1); + } + } +#ifdef HAVE_POLL_H + p.fd = ctxt->fd; + p.events = POLLIN; + if ((poll(&p, 1, timeout * 1000) < 1) +#if defined(EINTR) + && (errno != EINTR) +#endif + ) + return (0); +#else /* !HAVE_POLL_H */ +#ifndef _WINSOCKAPI_ + if (ctxt->fd > FD_SETSIZE) + return 0; +#endif + + tv.tv_sec = timeout; + tv.tv_usec = 0; + FD_ZERO(&rfd); + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable: 4018) +#endif + + FD_SET(ctxt->fd, &rfd); + +#ifdef _MSC_VER +#pragma warning(pop) +#endif + + if ((select(ctxt->fd + 1, &rfd, NULL, NULL, &tv) < 1) +#if defined(EINTR) + && (errno != EINTR) +#endif + ) + return (0); +#endif /* !HAVE_POLL_H */ + } + return (0); +} + +/** + * xmlNanoHTTPReadLine: + * @ctxt: an HTTP context + * + * Read one line in the HTTP server output, usually for extracting + * the HTTP protocol informations from the answer header. + * + * Returns a newly allocated string with a copy of the line, or NULL + * which indicate the end of the input. + */ + +static char * +xmlNanoHTTPReadLine(xmlNanoHTTPCtxtPtr ctxt) { + char buf[4096]; + char *bp = buf; + int rc; + + while (bp - buf < 4095) { + if (ctxt->inrptr == ctxt->inptr) { + if ( (rc = xmlNanoHTTPRecv(ctxt)) == 0) { + if (bp == buf) + return(NULL); + else + *bp = 0; + return(xmlMemStrdup(buf)); + } + else if ( rc == -1 ) { + return ( NULL ); + } + } + *bp = *ctxt->inrptr++; + if (*bp == '\n') { + *bp = 0; + return(xmlMemStrdup(buf)); + } + if (*bp != '\r') + bp++; + } + buf[4095] = 0; + return(xmlMemStrdup(buf)); +} + + +/** + * xmlNanoHTTPScanAnswer: + * @ctxt: an HTTP context + * @line: an HTTP header line + * + * Try to extract useful informations from the server answer. + * We currently parse and process: + * - The HTTP revision/ return code + * - The Content-Type, Mime-Type and charset used + * - The Location for redirect processing. + * + * Returns -1 in case of failure, the file descriptor number otherwise + */ + +static void +xmlNanoHTTPScanAnswer(xmlNanoHTTPCtxtPtr ctxt, const char *line) { + const char *cur = line; + + if (line == NULL) return; + + if (!strncmp(line, "HTTP/", 5)) { + int version = 0; + int ret = 0; + + cur += 5; + while ((*cur >= '0') && (*cur <= '9')) { + version *= 10; + version += *cur - '0'; + cur++; + } + if (*cur == '.') { + cur++; + if ((*cur >= '0') && (*cur <= '9')) { + version *= 10; + version += *cur - '0'; + cur++; + } + while ((*cur >= '0') && (*cur <= '9')) + cur++; + } else + version *= 10; + if ((*cur != ' ') && (*cur != '\t')) return; + while ((*cur == ' ') || (*cur == '\t')) cur++; + if ((*cur < '0') || (*cur > '9')) return; + while ((*cur >= '0') && (*cur <= '9')) { + ret *= 10; + ret += *cur - '0'; + cur++; + } + if ((*cur != 0) && (*cur != ' ') && (*cur != '\t')) return; + ctxt->returnValue = ret; + ctxt->version = version; + } else if (!xmlStrncasecmp(BAD_CAST line, BAD_CAST"Content-Type:", 13)) { + const xmlChar *charset, *last, *mime; + cur += 13; + while ((*cur == ' ') || (*cur == '\t')) cur++; + if (ctxt->contentType != NULL) + xmlFree(ctxt->contentType); + ctxt->contentType = xmlMemStrdup(cur); + mime = (const xmlChar *) cur; + last = mime; + while ((*last != 0) && (*last != ' ') && (*last != '\t') && + (*last != ';') && (*last != ',')) + last++; + if (ctxt->mimeType != NULL) + xmlFree(ctxt->mimeType); + ctxt->mimeType = (char *) xmlStrndup(mime, last - mime); + charset = xmlStrstr(BAD_CAST ctxt->contentType, BAD_CAST "charset="); + if (charset != NULL) { + charset += 8; + last = charset; + while ((*last != 0) && (*last != ' ') && (*last != '\t') && + (*last != ';') && (*last != ',')) + last++; + if (ctxt->encoding != NULL) + xmlFree(ctxt->encoding); + ctxt->encoding = (char *) xmlStrndup(charset, last - charset); + } + } else if (!xmlStrncasecmp(BAD_CAST line, BAD_CAST"ContentType:", 12)) { + const xmlChar *charset, *last, *mime; + cur += 12; + if (ctxt->contentType != NULL) return; + while ((*cur == ' ') || (*cur == '\t')) cur++; + ctxt->contentType = xmlMemStrdup(cur); + mime = (const xmlChar *) cur; + last = mime; + while ((*last != 0) && (*last != ' ') && (*last != '\t') && + (*last != ';') && (*last != ',')) + last++; + if (ctxt->mimeType != NULL) + xmlFree(ctxt->mimeType); + ctxt->mimeType = (char *) xmlStrndup(mime, last - mime); + charset = xmlStrstr(BAD_CAST ctxt->contentType, BAD_CAST "charset="); + if (charset != NULL) { + charset += 8; + last = charset; + while ((*last != 0) && (*last != ' ') && (*last != '\t') && + (*last != ';') && (*last != ',')) + last++; + if (ctxt->encoding != NULL) + xmlFree(ctxt->encoding); + ctxt->encoding = (char *) xmlStrndup(charset, last - charset); + } + } else if (!xmlStrncasecmp(BAD_CAST line, BAD_CAST"Location:", 9)) { + cur += 9; + while ((*cur == ' ') || (*cur == '\t')) cur++; + if (ctxt->location != NULL) + xmlFree(ctxt->location); + if (*cur == '/') { + xmlChar *tmp_http = xmlStrdup(BAD_CAST "http://"); + xmlChar *tmp_loc = + xmlStrcat(tmp_http, (const xmlChar *) ctxt->hostname); + ctxt->location = + (char *) xmlStrcat (tmp_loc, (const xmlChar *) cur); + } else { + ctxt->location = xmlMemStrdup(cur); + } + } else if (!xmlStrncasecmp(BAD_CAST line, BAD_CAST"WWW-Authenticate:", 17)) { + cur += 17; + while ((*cur == ' ') || (*cur == '\t')) cur++; + if (ctxt->authHeader != NULL) + xmlFree(ctxt->authHeader); + ctxt->authHeader = xmlMemStrdup(cur); + } else if (!xmlStrncasecmp(BAD_CAST line, BAD_CAST"Proxy-Authenticate:", 19)) { + cur += 19; + while ((*cur == ' ') || (*cur == '\t')) cur++; + if (ctxt->authHeader != NULL) + xmlFree(ctxt->authHeader); + ctxt->authHeader = xmlMemStrdup(cur); +#ifdef HAVE_ZLIB_H + } else if ( !xmlStrncasecmp( BAD_CAST line, BAD_CAST"Content-Encoding:", 17) ) { + cur += 17; + while ((*cur == ' ') || (*cur == '\t')) cur++; + if ( !xmlStrncasecmp( BAD_CAST cur, BAD_CAST"gzip", 4) ) { + ctxt->usesGzip = 1; + + ctxt->strm = xmlMalloc(sizeof(z_stream)); + + if (ctxt->strm != NULL) { + ctxt->strm->zalloc = Z_NULL; + ctxt->strm->zfree = Z_NULL; + ctxt->strm->opaque = Z_NULL; + ctxt->strm->avail_in = 0; + ctxt->strm->next_in = Z_NULL; + + inflateInit2( ctxt->strm, 31 ); + } + } +#endif + } else if ( !xmlStrncasecmp( BAD_CAST line, BAD_CAST"Content-Length:", 15) ) { + cur += 15; + ctxt->ContentLength = strtol( cur, NULL, 10 ); + } +} + +/** + * xmlNanoHTTPConnectAttempt: + * @addr: a socket address structure + * + * Attempt a connection to the given IP:port endpoint. It forces + * non-blocking semantic on the socket, and allow 60 seconds for + * the host to answer. + * + * Returns -1 in case of failure, the file descriptor number otherwise + */ + +static SOCKET +xmlNanoHTTPConnectAttempt(struct sockaddr *addr) +{ +#ifndef HAVE_POLL_H + fd_set wfd; +#ifdef _WINSOCKAPI_ + fd_set xfd; +#endif + struct timeval tv; +#else /* !HAVE_POLL_H */ + struct pollfd p; +#endif /* !HAVE_POLL_H */ + int status; + + int addrlen; + + SOCKET s; + +#ifdef SUPPORT_IP6 + if (addr->sa_family == AF_INET6) { + s = socket(PF_INET6, SOCK_STREAM, IPPROTO_TCP); + addrlen = sizeof(struct sockaddr_in6); + } else +#endif + { + s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); + addrlen = sizeof(struct sockaddr_in); + } + if (s == INVALID_SOCKET) { +#ifdef DEBUG_HTTP + perror("socket"); +#endif + __xmlIOErr(XML_FROM_HTTP, 0, "socket failed\n"); + return INVALID_SOCKET; + } +#ifdef _WINSOCKAPI_ + { + u_long one = 1; + + status = ioctlsocket(s, FIONBIO, &one) == SOCKET_ERROR ? -1 : 0; + } +#else /* _WINSOCKAPI_ */ +#if defined(VMS) + { + int enable = 1; + + status = ioctl(s, FIONBIO, &enable); + } +#else /* VMS */ +#if defined(__BEOS__) && !defined(__HAIKU__) + { + bool noblock = true; + + status = + setsockopt(s, SOL_SOCKET, SO_NONBLOCK, &noblock, + sizeof(noblock)); + } +#else /* __BEOS__ */ + if ((status = fcntl(s, F_GETFL, 0)) != -1) { +#ifdef O_NONBLOCK + status |= O_NONBLOCK; +#else /* O_NONBLOCK */ +#ifdef F_NDELAY + status |= F_NDELAY; +#endif /* F_NDELAY */ +#endif /* !O_NONBLOCK */ + status = fcntl(s, F_SETFL, status); + } + if (status < 0) { +#ifdef DEBUG_HTTP + perror("nonblocking"); +#endif + __xmlIOErr(XML_FROM_HTTP, 0, "error setting non-blocking IO\n"); + closesocket(s); + return INVALID_SOCKET; + } +#endif /* !__BEOS__ */ +#endif /* !VMS */ +#endif /* !_WINSOCKAPI_ */ + + if (connect(s, addr, addrlen) == -1) { + switch (socket_errno()) { + case EINPROGRESS: + case EWOULDBLOCK: + break; + default: + __xmlIOErr(XML_FROM_HTTP, 0, + "error connecting to HTTP server"); + closesocket(s); + return INVALID_SOCKET; + } + } +#ifndef HAVE_POLL_H + tv.tv_sec = timeout; + tv.tv_usec = 0; + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable: 4018) +#endif +#ifndef _WINSOCKAPI_ + if (s > FD_SETSIZE) + return INVALID_SOCKET; +#endif + FD_ZERO(&wfd); + FD_SET(s, &wfd); + +#ifdef _WINSOCKAPI_ + FD_ZERO(&xfd); + FD_SET(s, &xfd); + + switch (select(s + 1, NULL, &wfd, &xfd, &tv)) +#else + switch (select(s + 1, NULL, &wfd, NULL, &tv)) +#endif +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +#else /* !HAVE_POLL_H */ + p.fd = s; + p.events = POLLOUT; + switch (poll(&p, 1, timeout * 1000)) +#endif /* !HAVE_POLL_H */ + + { + case 0: + /* Time out */ + __xmlIOErr(XML_FROM_HTTP, 0, "Connect attempt timed out"); + closesocket(s); + return INVALID_SOCKET; + case -1: + /* Ermm.. ?? */ + __xmlIOErr(XML_FROM_HTTP, 0, "Connect failed"); + closesocket(s); + return INVALID_SOCKET; + } + +#ifndef HAVE_POLL_H + if (FD_ISSET(s, &wfd) +#ifdef _WINSOCKAPI_ + || FD_ISSET(s, &xfd) +#endif + ) +#else /* !HAVE_POLL_H */ + if (p.revents == POLLOUT) +#endif /* !HAVE_POLL_H */ + { + XML_SOCKLEN_T len; + + len = sizeof(status); +#ifdef SO_ERROR + if (getsockopt(s, SOL_SOCKET, SO_ERROR, (char *) &status, &len) < + 0) { + /* Solaris error code */ + __xmlIOErr(XML_FROM_HTTP, 0, "getsockopt failed\n"); + return INVALID_SOCKET; + } +#endif + if (status) { + __xmlIOErr(XML_FROM_HTTP, 0, + "Error connecting to remote host"); + closesocket(s); + errno = status; + return INVALID_SOCKET; + } + } else { + /* pbm */ + __xmlIOErr(XML_FROM_HTTP, 0, "select failed\n"); + closesocket(s); + return INVALID_SOCKET; + } + + return (s); +} + +/** + * xmlNanoHTTPConnectHost: + * @host: the host name + * @port: the port number + * + * Attempt a connection to the given host:port endpoint. It tries + * the multiple IP provided by the DNS if available. + * + * Returns -1 in case of failure, the file descriptor number otherwise + */ + +static SOCKET +xmlNanoHTTPConnectHost(const char *host, int port) +{ + struct hostent *h; + struct sockaddr *addr = NULL; + struct in_addr ia; + struct sockaddr_in sockin; + +#ifdef SUPPORT_IP6 + struct in6_addr ia6; + struct sockaddr_in6 sockin6; +#endif + int i; + SOCKET s; + + memset (&sockin, 0, sizeof(sockin)); +#ifdef SUPPORT_IP6 + memset (&sockin6, 0, sizeof(sockin6)); +#endif + +#if !defined(HAVE_GETADDRINFO) && defined(SUPPORT_IP6) && defined(RES_USE_INET6) + if (have_ipv6 ()) + { + if (!(_res.options & RES_INIT)) + res_init(); + _res.options |= RES_USE_INET6; + } +#endif + +#if defined(HAVE_GETADDRINFO) && defined(SUPPORT_IP6) && !defined(_WIN32) + if (have_ipv6 ()) +#endif +#if defined(HAVE_GETADDRINFO) && (defined(SUPPORT_IP6) || defined(_WIN32)) + { + int status; + struct addrinfo hints, *res, *result; + + result = NULL; + memset (&hints, 0,sizeof(hints)); + hints.ai_socktype = SOCK_STREAM; + + status = getaddrinfo (host, NULL, &hints, &result); + if (status) { + __xmlIOErr(XML_FROM_HTTP, 0, "getaddrinfo failed\n"); + return INVALID_SOCKET; + } + + for (res = result; res; res = res->ai_next) { + if (res->ai_family == AF_INET) { + if (res->ai_addrlen > sizeof(sockin)) { + __xmlIOErr(XML_FROM_HTTP, 0, "address size mismatch\n"); + freeaddrinfo (result); + return INVALID_SOCKET; + } + memcpy (&sockin, res->ai_addr, res->ai_addrlen); + sockin.sin_port = htons (port); + addr = (struct sockaddr *)&sockin; +#ifdef SUPPORT_IP6 + } else if (have_ipv6 () && (res->ai_family == AF_INET6)) { + if (res->ai_addrlen > sizeof(sockin6)) { + __xmlIOErr(XML_FROM_HTTP, 0, "address size mismatch\n"); + freeaddrinfo (result); + return INVALID_SOCKET; + } + memcpy (&sockin6, res->ai_addr, res->ai_addrlen); + sockin6.sin6_port = htons (port); + addr = (struct sockaddr *)&sockin6; +#endif + } else + continue; /* for */ + + s = xmlNanoHTTPConnectAttempt (addr); + if (s != INVALID_SOCKET) { + freeaddrinfo (result); + return (s); + } + } + + if (result) + freeaddrinfo (result); + } +#endif +#if defined(HAVE_GETADDRINFO) && defined(SUPPORT_IP6) && !defined(_WIN32) + else +#endif +#if !defined(HAVE_GETADDRINFO) || !defined(_WIN32) + { + h = gethostbyname (host); + if (h == NULL) { + +/* + * Okay, I got fed up by the non-portability of this error message + * extraction code. it work on Linux, if it work on your platform + * and one want to enable it, send me the defined(foobar) needed + */ +#if defined(HAVE_NETDB_H) && defined(HOST_NOT_FOUND) && defined(linux) + const char *h_err_txt = ""; + + switch (h_errno) { + case HOST_NOT_FOUND: + h_err_txt = "Authoritive host not found"; + break; + + case TRY_AGAIN: + h_err_txt = + "Non-authoritive host not found or server failure."; + break; + + case NO_RECOVERY: + h_err_txt = + "Non-recoverable errors: FORMERR, REFUSED, or NOTIMP."; + break; + +#ifdef NO_ADDRESS + case NO_ADDRESS: + h_err_txt = + "Valid name, no data record of requested type."; + break; +#endif + + default: + h_err_txt = "No error text defined."; + break; + } + __xmlIOErr(XML_FROM_HTTP, 0, h_err_txt); +#else + __xmlIOErr(XML_FROM_HTTP, 0, "Failed to resolve host"); +#endif + return INVALID_SOCKET; + } + + for (i = 0; h->h_addr_list[i]; i++) { + if (h->h_addrtype == AF_INET) { + /* A records (IPv4) */ + if ((unsigned int) h->h_length > sizeof(ia)) { + __xmlIOErr(XML_FROM_HTTP, 0, "address size mismatch\n"); + return INVALID_SOCKET; + } + memcpy (&ia, h->h_addr_list[i], h->h_length); + sockin.sin_family = h->h_addrtype; + sockin.sin_addr = ia; + sockin.sin_port = (unsigned short)htons ((unsigned short)port); + addr = (struct sockaddr *) &sockin; +#ifdef SUPPORT_IP6 + } else if (have_ipv6 () && (h->h_addrtype == AF_INET6)) { + /* AAAA records (IPv6) */ + if ((unsigned int) h->h_length > sizeof(ia6)) { + __xmlIOErr(XML_FROM_HTTP, 0, "address size mismatch\n"); + return INVALID_SOCKET; + } + memcpy (&ia6, h->h_addr_list[i], h->h_length); + sockin6.sin6_family = h->h_addrtype; + sockin6.sin6_addr = ia6; + sockin6.sin6_port = htons (port); + addr = (struct sockaddr *) &sockin6; +#endif + } else + break; /* for */ + + s = xmlNanoHTTPConnectAttempt (addr); + if (s != INVALID_SOCKET) + return (s); + } + } +#endif + +#ifdef DEBUG_HTTP + xmlGenericError(xmlGenericErrorContext, + "xmlNanoHTTPConnectHost: unable to connect to '%s'.\n", + host); +#endif + return INVALID_SOCKET; +} + + +/** + * xmlNanoHTTPOpen: + * @URL: The URL to load + * @contentType: if available the Content-Type information will be + * returned at that location + * + * This function try to open a connection to the indicated resource + * via HTTP GET. + * + * Returns NULL in case of failure, otherwise a request handler. + * The contentType, if provided must be freed by the caller + */ + +void* +xmlNanoHTTPOpen(const char *URL, char **contentType) { + if (contentType != NULL) *contentType = NULL; + return(xmlNanoHTTPMethod(URL, NULL, NULL, contentType, NULL, 0)); +} + +/** + * xmlNanoHTTPOpenRedir: + * @URL: The URL to load + * @contentType: if available the Content-Type information will be + * returned at that location + * @redir: if available the redirected URL will be returned + * + * This function try to open a connection to the indicated resource + * via HTTP GET. + * + * Returns NULL in case of failure, otherwise a request handler. + * The contentType, if provided must be freed by the caller + */ + +void* +xmlNanoHTTPOpenRedir(const char *URL, char **contentType, char **redir) { + if (contentType != NULL) *contentType = NULL; + if (redir != NULL) *redir = NULL; + return(xmlNanoHTTPMethodRedir(URL, NULL, NULL, contentType, redir, NULL,0)); +} + +/** + * xmlNanoHTTPRead: + * @ctx: the HTTP context + * @dest: a buffer + * @len: the buffer length + * + * This function tries to read @len bytes from the existing HTTP connection + * and saves them in @dest. This is a blocking call. + * + * Returns the number of byte read. 0 is an indication of an end of connection. + * -1 indicates a parameter error. + */ +int +xmlNanoHTTPRead(void *ctx, void *dest, int len) { + xmlNanoHTTPCtxtPtr ctxt = (xmlNanoHTTPCtxtPtr) ctx; +#ifdef HAVE_ZLIB_H + int bytes_read = 0; + int orig_avail_in; + int z_ret; +#endif + + if (ctx == NULL) return(-1); + if (dest == NULL) return(-1); + if (len <= 0) return(0); + +#ifdef HAVE_ZLIB_H + if (ctxt->usesGzip == 1) { + if (ctxt->strm == NULL) return(0); + + ctxt->strm->next_out = dest; + ctxt->strm->avail_out = len; + ctxt->strm->avail_in = ctxt->inptr - ctxt->inrptr; + + while (ctxt->strm->avail_out > 0 && + (ctxt->strm->avail_in > 0 || xmlNanoHTTPRecv(ctxt) > 0)) { + orig_avail_in = ctxt->strm->avail_in = + ctxt->inptr - ctxt->inrptr - bytes_read; + ctxt->strm->next_in = BAD_CAST (ctxt->inrptr + bytes_read); + + z_ret = inflate(ctxt->strm, Z_NO_FLUSH); + bytes_read += orig_avail_in - ctxt->strm->avail_in; + + if (z_ret != Z_OK) break; + } + + ctxt->inrptr += bytes_read; + return(len - ctxt->strm->avail_out); + } +#endif + + while (ctxt->inptr - ctxt->inrptr < len) { + if (xmlNanoHTTPRecv(ctxt) <= 0) break; + } + if (ctxt->inptr - ctxt->inrptr < len) + len = ctxt->inptr - ctxt->inrptr; + memcpy(dest, ctxt->inrptr, len); + ctxt->inrptr += len; + return(len); +} + +/** + * xmlNanoHTTPClose: + * @ctx: the HTTP context + * + * This function closes an HTTP context, it ends up the connection and + * free all data related to it. + */ +void +xmlNanoHTTPClose(void *ctx) { + xmlNanoHTTPCtxtPtr ctxt = (xmlNanoHTTPCtxtPtr) ctx; + + if (ctx == NULL) return; + + xmlNanoHTTPFreeCtxt(ctxt); +} + +/** + * xmlNanoHTTPMethodRedir: + * @URL: The URL to load + * @method: the HTTP method to use + * @input: the input string if any + * @contentType: the Content-Type information IN and OUT + * @redir: the redirected URL OUT + * @headers: the extra headers + * @ilen: input length + * + * This function try to open a connection to the indicated resource + * via HTTP using the given @method, adding the given extra headers + * and the input buffer for the request content. + * + * Returns NULL in case of failure, otherwise a request handler. + * The contentType, or redir, if provided must be freed by the caller + */ + +void* +xmlNanoHTTPMethodRedir(const char *URL, const char *method, const char *input, + char **contentType, char **redir, + const char *headers, int ilen ) { + xmlNanoHTTPCtxtPtr ctxt; + char *bp, *p; + int blen; + SOCKET ret; + int nbRedirects = 0; + char *redirURL = NULL; +#ifdef DEBUG_HTTP + int xmt_bytes; +#endif + + if (URL == NULL) return(NULL); + if (method == NULL) method = "GET"; + xmlNanoHTTPInit(); + +retry: + if (redirURL == NULL) + ctxt = xmlNanoHTTPNewCtxt(URL); + else { + ctxt = xmlNanoHTTPNewCtxt(redirURL); + ctxt->location = xmlMemStrdup(redirURL); + } + + if ( ctxt == NULL ) { + return ( NULL ); + } + + if ((ctxt->protocol == NULL) || (strcmp(ctxt->protocol, "http"))) { + __xmlIOErr(XML_FROM_HTTP, XML_HTTP_URL_SYNTAX, "Not a valid HTTP URI"); + xmlNanoHTTPFreeCtxt(ctxt); + if (redirURL != NULL) xmlFree(redirURL); + return(NULL); + } + if (ctxt->hostname == NULL) { + __xmlIOErr(XML_FROM_HTTP, XML_HTTP_UNKNOWN_HOST, + "Failed to identify host in URI"); + xmlNanoHTTPFreeCtxt(ctxt); + if (redirURL != NULL) xmlFree(redirURL); + return(NULL); + } + if (proxy) { + blen = strlen(ctxt->hostname) * 2 + 16; + ret = xmlNanoHTTPConnectHost(proxy, proxyPort); + } + else { + blen = strlen(ctxt->hostname); + ret = xmlNanoHTTPConnectHost(ctxt->hostname, ctxt->port); + } + if (ret == INVALID_SOCKET) { + xmlNanoHTTPFreeCtxt(ctxt); + if (redirURL != NULL) xmlFree(redirURL); + return(NULL); + } + ctxt->fd = ret; + + if (input == NULL) + ilen = 0; + else + blen += 36; + + if (headers != NULL) + blen += strlen(headers) + 2; + if (contentType && *contentType) + /* reserve for string plus 'Content-Type: \r\n" */ + blen += strlen(*contentType) + 16; + if (ctxt->query != NULL) + /* 1 for '?' */ + blen += strlen(ctxt->query) + 1; + blen += strlen(method) + strlen(ctxt->path) + 24; +#ifdef HAVE_ZLIB_H + /* reserve for possible 'Accept-Encoding: gzip' string */ + blen += 23; +#endif + if (ctxt->port != 80) { + /* reserve space for ':xxxxx', incl. potential proxy */ + if (proxy) + blen += 12; + else + blen += 6; + } + bp = (char*)xmlMallocAtomic(blen); + if ( bp == NULL ) { + xmlNanoHTTPFreeCtxt( ctxt ); + xmlHTTPErrMemory("allocating header buffer"); + return ( NULL ); + } + + p = bp; + + if (proxy) { + if (ctxt->port != 80) { + p += snprintf( p, blen - (p - bp), "%s http://%s:%d%s", + method, ctxt->hostname, + ctxt->port, ctxt->path ); + } + else + p += snprintf( p, blen - (p - bp), "%s http://%s%s", method, + ctxt->hostname, ctxt->path); + } + else + p += snprintf( p, blen - (p - bp), "%s %s", method, ctxt->path); + + if (ctxt->query != NULL) + p += snprintf( p, blen - (p - bp), "?%s", ctxt->query); + + if (ctxt->port == 80) { + p += snprintf( p, blen - (p - bp), " HTTP/1.0\r\nHost: %s\r\n", + ctxt->hostname); + } else { + p += snprintf( p, blen - (p - bp), " HTTP/1.0\r\nHost: %s:%d\r\n", + ctxt->hostname, ctxt->port); + } + +#ifdef HAVE_ZLIB_H + p += snprintf(p, blen - (p - bp), "Accept-Encoding: gzip\r\n"); +#endif + + if (contentType != NULL && *contentType) + p += snprintf(p, blen - (p - bp), "Content-Type: %s\r\n", *contentType); + + if (headers != NULL) + p += snprintf( p, blen - (p - bp), "%s", headers ); + + if (input != NULL) + snprintf(p, blen - (p - bp), "Content-Length: %d\r\n\r\n", ilen ); + else + snprintf(p, blen - (p - bp), "\r\n"); + +#ifdef DEBUG_HTTP + xmlGenericError(xmlGenericErrorContext, + "-> %s%s", proxy? "(Proxy) " : "", bp); + if ((blen -= strlen(bp)+1) < 0) + xmlGenericError(xmlGenericErrorContext, + "ERROR: overflowed buffer by %d bytes\n", -blen); +#endif + ctxt->outptr = ctxt->out = bp; + ctxt->state = XML_NANO_HTTP_WRITE; + blen = strlen( ctxt->out ); +#ifdef DEBUG_HTTP + xmt_bytes = xmlNanoHTTPSend(ctxt, ctxt->out, blen ); + if ( xmt_bytes != blen ) + xmlGenericError( xmlGenericErrorContext, + "xmlNanoHTTPMethodRedir: Only %d of %d %s %s\n", + xmt_bytes, blen, + "bytes of HTTP headers sent to host", + ctxt->hostname ); +#else + xmlNanoHTTPSend(ctxt, ctxt->out, blen ); +#endif + + if ( input != NULL ) { +#ifdef DEBUG_HTTP + xmt_bytes = xmlNanoHTTPSend( ctxt, input, ilen ); + + if ( xmt_bytes != ilen ) + xmlGenericError( xmlGenericErrorContext, + "xmlNanoHTTPMethodRedir: Only %d of %d %s %s\n", + xmt_bytes, ilen, + "bytes of HTTP content sent to host", + ctxt->hostname ); +#else + xmlNanoHTTPSend( ctxt, input, ilen ); +#endif + } + + ctxt->state = XML_NANO_HTTP_READ; + + while ((p = xmlNanoHTTPReadLine(ctxt)) != NULL) { + if (*p == 0) { + ctxt->content = ctxt->inrptr; + xmlFree(p); + break; + } + xmlNanoHTTPScanAnswer(ctxt, p); + +#ifdef DEBUG_HTTP + xmlGenericError(xmlGenericErrorContext, "<- %s\n", p); +#endif + xmlFree(p); + } + + if ((ctxt->location != NULL) && (ctxt->returnValue >= 300) && + (ctxt->returnValue < 400)) { +#ifdef DEBUG_HTTP + xmlGenericError(xmlGenericErrorContext, + "\nRedirect to: %s\n", ctxt->location); +#endif + while ( xmlNanoHTTPRecv(ctxt) > 0 ) ; + if (nbRedirects < XML_NANO_HTTP_MAX_REDIR) { + nbRedirects++; + if (redirURL != NULL) + xmlFree(redirURL); + redirURL = xmlMemStrdup(ctxt->location); + xmlNanoHTTPFreeCtxt(ctxt); + goto retry; + } + xmlNanoHTTPFreeCtxt(ctxt); + if (redirURL != NULL) xmlFree(redirURL); +#ifdef DEBUG_HTTP + xmlGenericError(xmlGenericErrorContext, + "xmlNanoHTTPMethodRedir: Too many redirects, aborting ...\n"); +#endif + return(NULL); + } + + if (contentType != NULL) { + if (ctxt->contentType != NULL) + *contentType = xmlMemStrdup(ctxt->contentType); + else + *contentType = NULL; + } + + if ((redir != NULL) && (redirURL != NULL)) { + *redir = redirURL; + } else { + if (redirURL != NULL) + xmlFree(redirURL); + if (redir != NULL) + *redir = NULL; + } + +#ifdef DEBUG_HTTP + if (ctxt->contentType != NULL) + xmlGenericError(xmlGenericErrorContext, + "\nCode %d, content-type '%s'\n\n", + ctxt->returnValue, ctxt->contentType); + else + xmlGenericError(xmlGenericErrorContext, + "\nCode %d, no content-type\n\n", + ctxt->returnValue); +#endif + + return((void *) ctxt); +} + +/** + * xmlNanoHTTPMethod: + * @URL: The URL to load + * @method: the HTTP method to use + * @input: the input string if any + * @contentType: the Content-Type information IN and OUT + * @headers: the extra headers + * @ilen: input length + * + * This function try to open a connection to the indicated resource + * via HTTP using the given @method, adding the given extra headers + * and the input buffer for the request content. + * + * Returns NULL in case of failure, otherwise a request handler. + * The contentType, if provided must be freed by the caller + */ + +void* +xmlNanoHTTPMethod(const char *URL, const char *method, const char *input, + char **contentType, const char *headers, int ilen) { + return(xmlNanoHTTPMethodRedir(URL, method, input, contentType, + NULL, headers, ilen)); +} + +/** + * xmlNanoHTTPFetch: + * @URL: The URL to load + * @filename: the filename where the content should be saved + * @contentType: if available the Content-Type information will be + * returned at that location + * + * This function try to fetch the indicated resource via HTTP GET + * and save it's content in the file. + * + * Returns -1 in case of failure, 0 incase of success. The contentType, + * if provided must be freed by the caller + */ +int +xmlNanoHTTPFetch(const char *URL, const char *filename, char **contentType) { + void *ctxt = NULL; + char *buf = NULL; + int fd; + int len; + int ret = 0; + + if (filename == NULL) return(-1); + ctxt = xmlNanoHTTPOpen(URL, contentType); + if (ctxt == NULL) return(-1); + + if (!strcmp(filename, "-")) + fd = 0; + else { + fd = open(filename, O_CREAT | O_WRONLY, 00644); + if (fd < 0) { + xmlNanoHTTPClose(ctxt); + if ((contentType != NULL) && (*contentType != NULL)) { + xmlFree(*contentType); + *contentType = NULL; + } + return(-1); + } + } + + xmlNanoHTTPFetchContent( ctxt, &buf, &len ); + if ( len > 0 ) { + if (write(fd, buf, len) == -1) { + ret = -1; + } + } + + xmlNanoHTTPClose(ctxt); + close(fd); + return(ret); +} + +#ifdef LIBXML_OUTPUT_ENABLED +/** + * xmlNanoHTTPSave: + * @ctxt: the HTTP context + * @filename: the filename where the content should be saved + * + * This function saves the output of the HTTP transaction to a file + * It closes and free the context at the end + * + * Returns -1 in case of failure, 0 incase of success. + */ +int +xmlNanoHTTPSave(void *ctxt, const char *filename) { + char *buf = NULL; + int fd; + int len; + int ret = 0; + + if ((ctxt == NULL) || (filename == NULL)) return(-1); + + if (!strcmp(filename, "-")) + fd = 0; + else { + fd = open(filename, O_CREAT | O_WRONLY, 0666); + if (fd < 0) { + xmlNanoHTTPClose(ctxt); + return(-1); + } + } + + xmlNanoHTTPFetchContent( ctxt, &buf, &len ); + if ( len > 0 ) { + if (write(fd, buf, len) == -1) { + ret = -1; + } + } + + xmlNanoHTTPClose(ctxt); + close(fd); + return(ret); +} +#endif /* LIBXML_OUTPUT_ENABLED */ + +/** + * xmlNanoHTTPReturnCode: + * @ctx: the HTTP context + * + * Get the latest HTTP return code received + * + * Returns the HTTP return code for the request. + */ +int +xmlNanoHTTPReturnCode(void *ctx) { + xmlNanoHTTPCtxtPtr ctxt = (xmlNanoHTTPCtxtPtr) ctx; + + if (ctxt == NULL) return(-1); + + return(ctxt->returnValue); +} + +/** + * xmlNanoHTTPAuthHeader: + * @ctx: the HTTP context + * + * Get the authentication header of an HTTP context + * + * Returns the stashed value of the WWW-Authenticate or Proxy-Authenticate + * header. + */ +const char * +xmlNanoHTTPAuthHeader(void *ctx) { + xmlNanoHTTPCtxtPtr ctxt = (xmlNanoHTTPCtxtPtr) ctx; + + if (ctxt == NULL) return(NULL); + + return(ctxt->authHeader); +} + +/** + * xmlNanoHTTPContentLength: + * @ctx: the HTTP context + * + * Provides the specified content length from the HTTP header. + * + * Return the specified content length from the HTTP header. Note that + * a value of -1 indicates that the content length element was not included in + * the response header. + */ +int +xmlNanoHTTPContentLength( void * ctx ) { + xmlNanoHTTPCtxtPtr ctxt = (xmlNanoHTTPCtxtPtr)ctx; + + return ( ( ctxt == NULL ) ? -1 : ctxt->ContentLength ); +} + +/** + * xmlNanoHTTPRedir: + * @ctx: the HTTP context + * + * Provides the specified redirection URL if available from the HTTP header. + * + * Return the specified redirection URL or NULL if not redirected. + */ +const char * +xmlNanoHTTPRedir( void * ctx ) { + xmlNanoHTTPCtxtPtr ctxt = (xmlNanoHTTPCtxtPtr)ctx; + + return ( ( ctxt == NULL ) ? NULL : ctxt->location ); +} + +/** + * xmlNanoHTTPEncoding: + * @ctx: the HTTP context + * + * Provides the specified encoding if specified in the HTTP headers. + * + * Return the specified encoding or NULL if not available + */ +const char * +xmlNanoHTTPEncoding( void * ctx ) { + xmlNanoHTTPCtxtPtr ctxt = (xmlNanoHTTPCtxtPtr)ctx; + + return ( ( ctxt == NULL ) ? NULL : ctxt->encoding ); +} + +/** + * xmlNanoHTTPMimeType: + * @ctx: the HTTP context + * + * Provides the specified Mime-Type if specified in the HTTP headers. + * + * Return the specified Mime-Type or NULL if not available + */ +const char * +xmlNanoHTTPMimeType( void * ctx ) { + xmlNanoHTTPCtxtPtr ctxt = (xmlNanoHTTPCtxtPtr)ctx; + + return ( ( ctxt == NULL ) ? NULL : ctxt->mimeType ); +} + +/** + * xmlNanoHTTPFetchContent: + * @ctx: the HTTP context + * @ptr: pointer to set to the content buffer. + * @len: integer pointer to hold the length of the content + * + * Check if all the content was read + * + * Returns 0 if all the content was read and available, returns + * -1 if received content length was less than specified or an error + * occurred. + */ +static int +xmlNanoHTTPFetchContent( void * ctx, char ** ptr, int * len ) { + xmlNanoHTTPCtxtPtr ctxt = (xmlNanoHTTPCtxtPtr)ctx; + + int rc = 0; + int cur_lgth; + int rcvd_lgth; + int dummy_int; + char * dummy_ptr = NULL; + + /* Dummy up return input parameters if not provided */ + + if ( len == NULL ) + len = &dummy_int; + + if ( ptr == NULL ) + ptr = &dummy_ptr; + + /* But can't work without the context pointer */ + + if ( ( ctxt == NULL ) || ( ctxt->content == NULL ) ) { + *len = 0; + *ptr = NULL; + return ( -1 ); + } + + rcvd_lgth = ctxt->inptr - ctxt->content; + + while ( (cur_lgth = xmlNanoHTTPRecv( ctxt )) > 0 ) { + + rcvd_lgth += cur_lgth; + if ( (ctxt->ContentLength > 0) && (rcvd_lgth >= ctxt->ContentLength) ) + break; + } + + *ptr = ctxt->content; + *len = rcvd_lgth; + + if ( ( ctxt->ContentLength > 0 ) && ( rcvd_lgth < ctxt->ContentLength ) ) + rc = -1; + else if ( rcvd_lgth == 0 ) + rc = -1; + + return ( rc ); +} + +#ifdef STANDALONE +int main(int argc, char **argv) { + char *contentType = NULL; + + if (argv[1] != NULL) { + if (argv[2] != NULL) + xmlNanoHTTPFetch(argv[1], argv[2], &contentType); + else + xmlNanoHTTPFetch(argv[1], "-", &contentType); + if (contentType != NULL) xmlFree(contentType); + } else { + xmlGenericError(xmlGenericErrorContext, + "%s: minimal HTTP GET implementation\n", argv[0]); + xmlGenericError(xmlGenericErrorContext, + "\tusage %s [ URL [ filename ] ]\n", argv[0]); + } + xmlNanoHTTPCleanup(); + xmlMemoryDump(); + return(0); +} +#endif /* STANDALONE */ +#else /* !LIBXML_HTTP_ENABLED */ +#ifdef STANDALONE +#include +int main(int argc, char **argv) { + xmlGenericError(xmlGenericErrorContext, + "%s : HTTP support not compiled in\n", argv[0]); + return(0); +} +#endif /* STANDALONE */ +#endif /* LIBXML_HTTP_ENABLED */ +#define bottom_nanohttp +#include "elfgcchack.h" diff --git a/vendors/libxml/src/parser.c b/vendors/libxml/src/parser.c new file mode 100644 index 0000000..ee429f3 --- /dev/null +++ b/vendors/libxml/src/parser.c @@ -0,0 +1,15556 @@ +/* + * parser.c : an XML 1.0 parser, namespaces and validity support are mostly + * implemented on top of the SAX interfaces + * + * References: + * The XML specification: + * http://www.w3.org/TR/REC-xml + * Original 1.0 version: + * http://www.w3.org/TR/1998/REC-xml-19980210 + * XML second edition working draft + * http://www.w3.org/TR/2000/WD-xml-2e-20000814 + * + * Okay this is a big file, the parser core is around 7000 lines, then it + * is followed by the progressive parser top routines, then the various + * high level APIs to call the parser and a few miscellaneous functions. + * A number of helper functions and deprecated ones have been moved to + * parserInternals.c to reduce this file size. + * As much as possible the functions are associated with their relative + * production in the XML specification. A few productions defining the + * different ranges of character are actually implanted either in + * parserInternals.h or parserInternals.c + * The DOM tree build is realized from the default SAX callbacks in + * the module SAX.c. + * The routines doing the validation checks are in valid.c and called either + * from the SAX callbacks or as standalone functions using a preparsed + * document. + * + * See Copyright for the status of this software. + * + * daniel@veillard.com + */ + +#define IN_LIBXML +#include "libxml.h" + +#if defined(WIN32) && !defined (__CYGWIN__) +#define XML_DIR_SEP '\\' +#else +#define XML_DIR_SEP '/' +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef LIBXML_CATALOG_ENABLED +#include +#endif +#ifdef LIBXML_SCHEMAS_ENABLED +#include +#include +#endif +#ifdef HAVE_CTYPE_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_FCNTL_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_ZLIB_H +#include +#endif +#ifdef HAVE_LZMA_H +#include +#endif + +#include "buf.h" +#include "enc.h" + +static void +xmlFatalErr(xmlParserCtxtPtr ctxt, xmlParserErrors error, const char *info); + +static xmlParserCtxtPtr +xmlCreateEntityParserCtxtInternal(const xmlChar *URL, const xmlChar *ID, + const xmlChar *base, xmlParserCtxtPtr pctx); + +/************************************************************************ + * * + * Arbitrary limits set in the parser. See XML_PARSE_HUGE * + * * + ************************************************************************/ + +#define XML_PARSER_BIG_ENTITY 1000 +#define XML_PARSER_LOT_ENTITY 5000 + +/* + * XML_PARSER_NON_LINEAR is the threshold where the ratio of parsed entity + * replacement over the size in byte of the input indicates that you have + * and eponential behaviour. A value of 10 correspond to at least 3 entity + * replacement per byte of input. + */ +#define XML_PARSER_NON_LINEAR 10 + +/* + * xmlParserEntityCheck + * + * Function to check non-linear entity expansion behaviour + * This is here to detect and stop exponential linear entity expansion + * This is not a limitation of the parser but a safety + * boundary feature. It can be disabled with the XML_PARSE_HUGE + * parser option. + */ +static int +xmlParserEntityCheck(xmlParserCtxtPtr ctxt, size_t size, + xmlEntityPtr ent, size_t replacement) +{ + size_t consumed = 0; + + if ((ctxt == NULL) || (ctxt->options & XML_PARSE_HUGE)) + return (0); + if (ctxt->lastError.code == XML_ERR_ENTITY_LOOP) + return (1); + if (replacement != 0) { + if (replacement < XML_MAX_TEXT_LENGTH) + return(0); + + /* + * If the volume of entity copy reaches 10 times the + * amount of parsed data and over the large text threshold + * then that's very likely to be an abuse. + */ + if (ctxt->input != NULL) { + consumed = ctxt->input->consumed + + (ctxt->input->cur - ctxt->input->base); + } + consumed += ctxt->sizeentities; + + if (replacement < XML_PARSER_NON_LINEAR * consumed) + return(0); + } else if (size != 0) { + /* + * Do the check based on the replacement size of the entity + */ + if (size < XML_PARSER_BIG_ENTITY) + return(0); + + /* + * A limit on the amount of text data reasonably used + */ + if (ctxt->input != NULL) { + consumed = ctxt->input->consumed + + (ctxt->input->cur - ctxt->input->base); + } + consumed += ctxt->sizeentities; + + if ((size < XML_PARSER_NON_LINEAR * consumed) && + (ctxt->nbentities * 3 < XML_PARSER_NON_LINEAR * consumed)) + return (0); + } else if (ent != NULL) { + /* + * use the number of parsed entities in the replacement + */ + size = ent->checked / 2; + + /* + * The amount of data parsed counting entities size only once + */ + if (ctxt->input != NULL) { + consumed = ctxt->input->consumed + + (ctxt->input->cur - ctxt->input->base); + } + consumed += ctxt->sizeentities; + + /* + * Check the density of entities for the amount of data + * knowing an entity reference will take at least 3 bytes + */ + if (size * 3 < consumed * XML_PARSER_NON_LINEAR) + return (0); + } else { + /* + * strange we got no data for checking just return + */ + return (0); + } + xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL); + return (1); +} + +/** + * xmlParserMaxDepth: + * + * arbitrary depth limit for the XML documents that we allow to + * process. This is not a limitation of the parser but a safety + * boundary feature. It can be disabled with the XML_PARSE_HUGE + * parser option. + */ +unsigned int xmlParserMaxDepth = 256; + + + +#define SAX2 1 +#define XML_PARSER_BIG_BUFFER_SIZE 300 +#define XML_PARSER_BUFFER_SIZE 100 +#define SAX_COMPAT_MODE BAD_CAST "SAX compatibility mode document" + +/** + * XML_PARSER_CHUNK_SIZE + * + * When calling GROW that's the minimal amount of data + * the parser expected to have received. It is not a hard + * limit but an optimization when reading strings like Names + * It is not strictly needed as long as inputs available characters + * are followed by 0, which should be provided by the I/O level + */ +#define XML_PARSER_CHUNK_SIZE 100 + +/* + * List of XML prefixed PI allowed by W3C specs + */ + +static const char *xmlW3CPIs[] = { + "xml-stylesheet", + "xml-model", + NULL +}; + + +/* DEPR void xmlParserHandleReference(xmlParserCtxtPtr ctxt); */ +static xmlEntityPtr xmlParseStringPEReference(xmlParserCtxtPtr ctxt, + const xmlChar **str); + +static xmlParserErrors +xmlParseExternalEntityPrivate(xmlDocPtr doc, xmlParserCtxtPtr oldctxt, + xmlSAXHandlerPtr sax, + void *user_data, int depth, const xmlChar *URL, + const xmlChar *ID, xmlNodePtr *list); + +static int +xmlCtxtUseOptionsInternal(xmlParserCtxtPtr ctxt, int options, + const char *encoding); +#ifdef LIBXML_LEGACY_ENABLED +static void +xmlAddEntityReference(xmlEntityPtr ent, xmlNodePtr firstNode, + xmlNodePtr lastNode); +#endif /* LIBXML_LEGACY_ENABLED */ + +static xmlParserErrors +xmlParseBalancedChunkMemoryInternal(xmlParserCtxtPtr oldctxt, + const xmlChar *string, void *user_data, xmlNodePtr *lst); + +static int +xmlLoadEntityContent(xmlParserCtxtPtr ctxt, xmlEntityPtr entity); + +/************************************************************************ + * * + * Some factorized error routines * + * * + ************************************************************************/ + +/** + * xmlErrAttributeDup: + * @ctxt: an XML parser context + * @prefix: the attribute prefix + * @localname: the attribute localname + * + * Handle a redefinition of attribute error + */ +static void +xmlErrAttributeDup(xmlParserCtxtPtr ctxt, const xmlChar * prefix, + const xmlChar * localname) +{ + if ((ctxt != NULL) && (ctxt->disableSAX != 0) && + (ctxt->instate == XML_PARSER_EOF)) + return; + if (ctxt != NULL) + ctxt->errNo = XML_ERR_ATTRIBUTE_REDEFINED; + + if (prefix == NULL) + __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, + XML_ERR_ATTRIBUTE_REDEFINED, XML_ERR_FATAL, NULL, 0, + (const char *) localname, NULL, NULL, 0, 0, + "Attribute %s redefined\n", localname); + else + __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, + XML_ERR_ATTRIBUTE_REDEFINED, XML_ERR_FATAL, NULL, 0, + (const char *) prefix, (const char *) localname, + NULL, 0, 0, "Attribute %s:%s redefined\n", prefix, + localname); + if (ctxt != NULL) { + ctxt->wellFormed = 0; + if (ctxt->recovery == 0) + ctxt->disableSAX = 1; + } +} + +/** + * xmlFatalErr: + * @ctxt: an XML parser context + * @error: the error number + * @extra: extra information string + * + * Handle a fatal parser error, i.e. violating Well-Formedness constraints + */ +static void +xmlFatalErr(xmlParserCtxtPtr ctxt, xmlParserErrors error, const char *info) +{ + const char *errmsg; + char errstr[129] = ""; + + if ((ctxt != NULL) && (ctxt->disableSAX != 0) && + (ctxt->instate == XML_PARSER_EOF)) + return; + switch (error) { + case XML_ERR_INVALID_HEX_CHARREF: + errmsg = "CharRef: invalid hexadecimal value"; + break; + case XML_ERR_INVALID_DEC_CHARREF: + errmsg = "CharRef: invalid decimal value"; + break; + case XML_ERR_INVALID_CHARREF: + errmsg = "CharRef: invalid value"; + break; + case XML_ERR_INTERNAL_ERROR: + errmsg = "internal error"; + break; + case XML_ERR_PEREF_AT_EOF: + errmsg = "PEReference at end of document"; + break; + case XML_ERR_PEREF_IN_PROLOG: + errmsg = "PEReference in prolog"; + break; + case XML_ERR_PEREF_IN_EPILOG: + errmsg = "PEReference in epilog"; + break; + case XML_ERR_PEREF_NO_NAME: + errmsg = "PEReference: no name"; + break; + case XML_ERR_PEREF_SEMICOL_MISSING: + errmsg = "PEReference: expecting ';'"; + break; + case XML_ERR_ENTITY_LOOP: + errmsg = "Detected an entity reference loop"; + break; + case XML_ERR_ENTITY_NOT_STARTED: + errmsg = "EntityValue: \" or ' expected"; + break; + case XML_ERR_ENTITY_PE_INTERNAL: + errmsg = "PEReferences forbidden in internal subset"; + break; + case XML_ERR_ENTITY_NOT_FINISHED: + errmsg = "EntityValue: \" or ' expected"; + break; + case XML_ERR_ATTRIBUTE_NOT_STARTED: + errmsg = "AttValue: \" or ' expected"; + break; + case XML_ERR_LT_IN_ATTRIBUTE: + errmsg = "Unescaped '<' not allowed in attributes values"; + break; + case XML_ERR_LITERAL_NOT_STARTED: + errmsg = "SystemLiteral \" or ' expected"; + break; + case XML_ERR_LITERAL_NOT_FINISHED: + errmsg = "Unfinished System or Public ID \" or ' expected"; + break; + case XML_ERR_MISPLACED_CDATA_END: + errmsg = "Sequence ']]>' not allowed in content"; + break; + case XML_ERR_URI_REQUIRED: + errmsg = "SYSTEM or PUBLIC, the URI is missing"; + break; + case XML_ERR_PUBID_REQUIRED: + errmsg = "PUBLIC, the Public Identifier is missing"; + break; + case XML_ERR_HYPHEN_IN_COMMENT: + errmsg = "Comment must not contain '--' (double-hyphen)"; + break; + case XML_ERR_PI_NOT_STARTED: + errmsg = "xmlParsePI : no target name"; + break; + case XML_ERR_RESERVED_XML_NAME: + errmsg = "Invalid PI name"; + break; + case XML_ERR_NOTATION_NOT_STARTED: + errmsg = "NOTATION: Name expected here"; + break; + case XML_ERR_NOTATION_NOT_FINISHED: + errmsg = "'>' required to close NOTATION declaration"; + break; + case XML_ERR_VALUE_REQUIRED: + errmsg = "Entity value required"; + break; + case XML_ERR_URI_FRAGMENT: + errmsg = "Fragment not allowed"; + break; + case XML_ERR_ATTLIST_NOT_STARTED: + errmsg = "'(' required to start ATTLIST enumeration"; + break; + case XML_ERR_NMTOKEN_REQUIRED: + errmsg = "NmToken expected in ATTLIST enumeration"; + break; + case XML_ERR_ATTLIST_NOT_FINISHED: + errmsg = "')' required to finish ATTLIST enumeration"; + break; + case XML_ERR_MIXED_NOT_STARTED: + errmsg = "MixedContentDecl : '|' or ')*' expected"; + break; + case XML_ERR_PCDATA_REQUIRED: + errmsg = "MixedContentDecl : '#PCDATA' expected"; + break; + case XML_ERR_ELEMCONTENT_NOT_STARTED: + errmsg = "ContentDecl : Name or '(' expected"; + break; + case XML_ERR_ELEMCONTENT_NOT_FINISHED: + errmsg = "ContentDecl : ',' '|' or ')' expected"; + break; + case XML_ERR_PEREF_IN_INT_SUBSET: + errmsg = + "PEReference: forbidden within markup decl in internal subset"; + break; + case XML_ERR_GT_REQUIRED: + errmsg = "expected '>'"; + break; + case XML_ERR_CONDSEC_INVALID: + errmsg = "XML conditional section '[' expected"; + break; + case XML_ERR_EXT_SUBSET_NOT_FINISHED: + errmsg = "Content error in the external subset"; + break; + case XML_ERR_CONDSEC_INVALID_KEYWORD: + errmsg = + "conditional section INCLUDE or IGNORE keyword expected"; + break; + case XML_ERR_CONDSEC_NOT_FINISHED: + errmsg = "XML conditional section not closed"; + break; + case XML_ERR_XMLDECL_NOT_STARTED: + errmsg = "Text declaration '' expected"; + break; + case XML_ERR_EXT_ENTITY_STANDALONE: + errmsg = "external parsed entities cannot be standalone"; + break; + case XML_ERR_ENTITYREF_SEMICOL_MISSING: + errmsg = "EntityRef: expecting ';'"; + break; + case XML_ERR_DOCTYPE_NOT_FINISHED: + errmsg = "DOCTYPE improperly terminated"; + break; + case XML_ERR_LTSLASH_REQUIRED: + errmsg = "EndTag: 'errNo = error; + __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, error, + XML_ERR_FATAL, NULL, 0, info, NULL, NULL, 0, 0, &errstr[0], + info); + if (ctxt != NULL) { + ctxt->wellFormed = 0; + if (ctxt->recovery == 0) + ctxt->disableSAX = 1; + } +} + +/** + * xmlFatalErrMsg: + * @ctxt: an XML parser context + * @error: the error number + * @msg: the error message + * + * Handle a fatal parser error, i.e. violating Well-Formedness constraints + */ +static void +xmlFatalErrMsg(xmlParserCtxtPtr ctxt, xmlParserErrors error, + const char *msg) +{ + if ((ctxt != NULL) && (ctxt->disableSAX != 0) && + (ctxt->instate == XML_PARSER_EOF)) + return; + if (ctxt != NULL) + ctxt->errNo = error; + __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, error, + XML_ERR_FATAL, NULL, 0, NULL, NULL, NULL, 0, 0, "%s", msg); + if (ctxt != NULL) { + ctxt->wellFormed = 0; + if (ctxt->recovery == 0) + ctxt->disableSAX = 1; + } +} + +/** + * xmlWarningMsg: + * @ctxt: an XML parser context + * @error: the error number + * @msg: the error message + * @str1: extra data + * @str2: extra data + * + * Handle a warning. + */ +static void +xmlWarningMsg(xmlParserCtxtPtr ctxt, xmlParserErrors error, + const char *msg, const xmlChar *str1, const xmlChar *str2) +{ + xmlStructuredErrorFunc schannel = NULL; + + if ((ctxt != NULL) && (ctxt->disableSAX != 0) && + (ctxt->instate == XML_PARSER_EOF)) + return; + if ((ctxt != NULL) && (ctxt->sax != NULL) && + (ctxt->sax->initialized == XML_SAX2_MAGIC)) + schannel = ctxt->sax->serror; + if (ctxt != NULL) { + __xmlRaiseError(schannel, + (ctxt->sax) ? ctxt->sax->warning : NULL, + ctxt->userData, + ctxt, NULL, XML_FROM_PARSER, error, + XML_ERR_WARNING, NULL, 0, + (const char *) str1, (const char *) str2, NULL, 0, 0, + msg, (const char *) str1, (const char *) str2); + } else { + __xmlRaiseError(schannel, NULL, NULL, + ctxt, NULL, XML_FROM_PARSER, error, + XML_ERR_WARNING, NULL, 0, + (const char *) str1, (const char *) str2, NULL, 0, 0, + msg, (const char *) str1, (const char *) str2); + } +} + +/** + * xmlValidityError: + * @ctxt: an XML parser context + * @error: the error number + * @msg: the error message + * @str1: extra data + * + * Handle a validity error. + */ +static void +xmlValidityError(xmlParserCtxtPtr ctxt, xmlParserErrors error, + const char *msg, const xmlChar *str1, const xmlChar *str2) +{ + xmlStructuredErrorFunc schannel = NULL; + + if ((ctxt != NULL) && (ctxt->disableSAX != 0) && + (ctxt->instate == XML_PARSER_EOF)) + return; + if (ctxt != NULL) { + ctxt->errNo = error; + if ((ctxt->sax != NULL) && (ctxt->sax->initialized == XML_SAX2_MAGIC)) + schannel = ctxt->sax->serror; + } + if (ctxt != NULL) { + __xmlRaiseError(schannel, + ctxt->vctxt.error, ctxt->vctxt.userData, + ctxt, NULL, XML_FROM_DTD, error, + XML_ERR_ERROR, NULL, 0, (const char *) str1, + (const char *) str2, NULL, 0, 0, + msg, (const char *) str1, (const char *) str2); + ctxt->valid = 0; + } else { + __xmlRaiseError(schannel, NULL, NULL, + ctxt, NULL, XML_FROM_DTD, error, + XML_ERR_ERROR, NULL, 0, (const char *) str1, + (const char *) str2, NULL, 0, 0, + msg, (const char *) str1, (const char *) str2); + } +} + +/** + * xmlFatalErrMsgInt: + * @ctxt: an XML parser context + * @error: the error number + * @msg: the error message + * @val: an integer value + * + * Handle a fatal parser error, i.e. violating Well-Formedness constraints + */ +static void +xmlFatalErrMsgInt(xmlParserCtxtPtr ctxt, xmlParserErrors error, + const char *msg, int val) +{ + if ((ctxt != NULL) && (ctxt->disableSAX != 0) && + (ctxt->instate == XML_PARSER_EOF)) + return; + if (ctxt != NULL) + ctxt->errNo = error; + __xmlRaiseError(NULL, NULL, NULL, + ctxt, NULL, XML_FROM_PARSER, error, XML_ERR_FATAL, + NULL, 0, NULL, NULL, NULL, val, 0, msg, val); + if (ctxt != NULL) { + ctxt->wellFormed = 0; + if (ctxt->recovery == 0) + ctxt->disableSAX = 1; + } +} + +/** + * xmlFatalErrMsgStrIntStr: + * @ctxt: an XML parser context + * @error: the error number + * @msg: the error message + * @str1: an string info + * @val: an integer value + * @str2: an string info + * + * Handle a fatal parser error, i.e. violating Well-Formedness constraints + */ +static void +xmlFatalErrMsgStrIntStr(xmlParserCtxtPtr ctxt, xmlParserErrors error, + const char *msg, const xmlChar *str1, int val, + const xmlChar *str2) +{ + if ((ctxt != NULL) && (ctxt->disableSAX != 0) && + (ctxt->instate == XML_PARSER_EOF)) + return; + if (ctxt != NULL) + ctxt->errNo = error; + __xmlRaiseError(NULL, NULL, NULL, + ctxt, NULL, XML_FROM_PARSER, error, XML_ERR_FATAL, + NULL, 0, (const char *) str1, (const char *) str2, + NULL, val, 0, msg, str1, val, str2); + if (ctxt != NULL) { + ctxt->wellFormed = 0; + if (ctxt->recovery == 0) + ctxt->disableSAX = 1; + } +} + +/** + * xmlFatalErrMsgStr: + * @ctxt: an XML parser context + * @error: the error number + * @msg: the error message + * @val: a string value + * + * Handle a fatal parser error, i.e. violating Well-Formedness constraints + */ +static void +xmlFatalErrMsgStr(xmlParserCtxtPtr ctxt, xmlParserErrors error, + const char *msg, const xmlChar * val) +{ + if ((ctxt != NULL) && (ctxt->disableSAX != 0) && + (ctxt->instate == XML_PARSER_EOF)) + return; + if (ctxt != NULL) + ctxt->errNo = error; + __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, + XML_FROM_PARSER, error, XML_ERR_FATAL, + NULL, 0, (const char *) val, NULL, NULL, 0, 0, msg, + val); + if (ctxt != NULL) { + ctxt->wellFormed = 0; + if (ctxt->recovery == 0) + ctxt->disableSAX = 1; + } +} + +/** + * xmlErrMsgStr: + * @ctxt: an XML parser context + * @error: the error number + * @msg: the error message + * @val: a string value + * + * Handle a non fatal parser error + */ +static void +xmlErrMsgStr(xmlParserCtxtPtr ctxt, xmlParserErrors error, + const char *msg, const xmlChar * val) +{ + if ((ctxt != NULL) && (ctxt->disableSAX != 0) && + (ctxt->instate == XML_PARSER_EOF)) + return; + if (ctxt != NULL) + ctxt->errNo = error; + __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, + XML_FROM_PARSER, error, XML_ERR_ERROR, + NULL, 0, (const char *) val, NULL, NULL, 0, 0, msg, + val); +} + +/** + * xmlNsErr: + * @ctxt: an XML parser context + * @error: the error number + * @msg: the message + * @info1: extra information string + * @info2: extra information string + * + * Handle a fatal parser error, i.e. violating Well-Formedness constraints + */ +static void +xmlNsErr(xmlParserCtxtPtr ctxt, xmlParserErrors error, + const char *msg, + const xmlChar * info1, const xmlChar * info2, + const xmlChar * info3) +{ + if ((ctxt != NULL) && (ctxt->disableSAX != 0) && + (ctxt->instate == XML_PARSER_EOF)) + return; + if (ctxt != NULL) + ctxt->errNo = error; + __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_NAMESPACE, error, + XML_ERR_ERROR, NULL, 0, (const char *) info1, + (const char *) info2, (const char *) info3, 0, 0, msg, + info1, info2, info3); + if (ctxt != NULL) + ctxt->nsWellFormed = 0; +} + +/** + * xmlNsWarn + * @ctxt: an XML parser context + * @error: the error number + * @msg: the message + * @info1: extra information string + * @info2: extra information string + * + * Handle a namespace warning error + */ +static void +xmlNsWarn(xmlParserCtxtPtr ctxt, xmlParserErrors error, + const char *msg, + const xmlChar * info1, const xmlChar * info2, + const xmlChar * info3) +{ + if ((ctxt != NULL) && (ctxt->disableSAX != 0) && + (ctxt->instate == XML_PARSER_EOF)) + return; + __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_NAMESPACE, error, + XML_ERR_WARNING, NULL, 0, (const char *) info1, + (const char *) info2, (const char *) info3, 0, 0, msg, + info1, info2, info3); +} + +/************************************************************************ + * * + * Library wide options * + * * + ************************************************************************/ + +/** + * xmlHasFeature: + * @feature: the feature to be examined + * + * Examines if the library has been compiled with a given feature. + * + * Returns a non-zero value if the feature exist, otherwise zero. + * Returns zero (0) if the feature does not exist or an unknown + * unknown feature is requested, non-zero otherwise. + */ +int +xmlHasFeature(xmlFeature feature) +{ + switch (feature) { + case XML_WITH_THREAD: +#ifdef LIBXML_THREAD_ENABLED + return(1); +#else + return(0); +#endif + case XML_WITH_TREE: +#ifdef LIBXML_TREE_ENABLED + return(1); +#else + return(0); +#endif + case XML_WITH_OUTPUT: +#ifdef LIBXML_OUTPUT_ENABLED + return(1); +#else + return(0); +#endif + case XML_WITH_PUSH: +#ifdef LIBXML_PUSH_ENABLED + return(1); +#else + return(0); +#endif + case XML_WITH_READER: +#ifdef LIBXML_READER_ENABLED + return(1); +#else + return(0); +#endif + case XML_WITH_PATTERN: +#ifdef LIBXML_PATTERN_ENABLED + return(1); +#else + return(0); +#endif + case XML_WITH_WRITER: +#ifdef LIBXML_WRITER_ENABLED + return(1); +#else + return(0); +#endif + case XML_WITH_SAX1: +#ifdef LIBXML_SAX1_ENABLED + return(1); +#else + return(0); +#endif + case XML_WITH_FTP: +#ifdef LIBXML_FTP_ENABLED + return(1); +#else + return(0); +#endif + case XML_WITH_HTTP: +#ifdef LIBXML_HTTP_ENABLED + return(1); +#else + return(0); +#endif + case XML_WITH_VALID: +#ifdef LIBXML_VALID_ENABLED + return(1); +#else + return(0); +#endif + case XML_WITH_HTML: +#ifdef LIBXML_HTML_ENABLED + return(1); +#else + return(0); +#endif + case XML_WITH_LEGACY: +#ifdef LIBXML_LEGACY_ENABLED + return(1); +#else + return(0); +#endif + case XML_WITH_C14N: +#ifdef LIBXML_C14N_ENABLED + return(1); +#else + return(0); +#endif + case XML_WITH_CATALOG: +#ifdef LIBXML_CATALOG_ENABLED + return(1); +#else + return(0); +#endif + case XML_WITH_XPATH: +#ifdef LIBXML_XPATH_ENABLED + return(1); +#else + return(0); +#endif + case XML_WITH_XPTR: +#ifdef LIBXML_XPTR_ENABLED + return(1); +#else + return(0); +#endif + case XML_WITH_XINCLUDE: +#ifdef LIBXML_XINCLUDE_ENABLED + return(1); +#else + return(0); +#endif + case XML_WITH_ICONV: +#ifdef LIBXML_ICONV_ENABLED + return(1); +#else + return(0); +#endif + case XML_WITH_ISO8859X: +#ifdef LIBXML_ISO8859X_ENABLED + return(1); +#else + return(0); +#endif + case XML_WITH_UNICODE: +#ifdef LIBXML_UNICODE_ENABLED + return(1); +#else + return(0); +#endif + case XML_WITH_REGEXP: +#ifdef LIBXML_REGEXP_ENABLED + return(1); +#else + return(0); +#endif + case XML_WITH_AUTOMATA: +#ifdef LIBXML_AUTOMATA_ENABLED + return(1); +#else + return(0); +#endif + case XML_WITH_EXPR: +#ifdef LIBXML_EXPR_ENABLED + return(1); +#else + return(0); +#endif + case XML_WITH_SCHEMAS: +#ifdef LIBXML_SCHEMAS_ENABLED + return(1); +#else + return(0); +#endif + case XML_WITH_SCHEMATRON: +#ifdef LIBXML_SCHEMATRON_ENABLED + return(1); +#else + return(0); +#endif + case XML_WITH_MODULES: +#ifdef LIBXML_MODULES_ENABLED + return(1); +#else + return(0); +#endif + case XML_WITH_DEBUG: +#ifdef LIBXML_DEBUG_ENABLED + return(1); +#else + return(0); +#endif + case XML_WITH_DEBUG_MEM: +#ifdef DEBUG_MEMORY_LOCATION + return(1); +#else + return(0); +#endif + case XML_WITH_DEBUG_RUN: +#ifdef LIBXML_DEBUG_RUNTIME + return(1); +#else + return(0); +#endif + case XML_WITH_ZLIB: +#ifdef LIBXML_ZLIB_ENABLED + return(1); +#else + return(0); +#endif + case XML_WITH_LZMA: +#ifdef LIBXML_LZMA_ENABLED + return(1); +#else + return(0); +#endif + case XML_WITH_ICU: +#ifdef LIBXML_ICU_ENABLED + return(1); +#else + return(0); +#endif + default: + break; + } + return(0); +} + +/************************************************************************ + * * + * SAX2 defaulted attributes handling * + * * + ************************************************************************/ + +/** + * xmlDetectSAX2: + * @ctxt: an XML parser context + * + * Do the SAX2 detection and specific intialization + */ +static void +xmlDetectSAX2(xmlParserCtxtPtr ctxt) { + if (ctxt == NULL) return; +#ifdef LIBXML_SAX1_ENABLED + if ((ctxt->sax) && (ctxt->sax->initialized == XML_SAX2_MAGIC) && + ((ctxt->sax->startElementNs != NULL) || + (ctxt->sax->endElementNs != NULL))) ctxt->sax2 = 1; +#else + ctxt->sax2 = 1; +#endif /* LIBXML_SAX1_ENABLED */ + + ctxt->str_xml = xmlDictLookup(ctxt->dict, BAD_CAST "xml", 3); + ctxt->str_xmlns = xmlDictLookup(ctxt->dict, BAD_CAST "xmlns", 5); + ctxt->str_xml_ns = xmlDictLookup(ctxt->dict, XML_XML_NAMESPACE, 36); + if ((ctxt->str_xml==NULL) || (ctxt->str_xmlns==NULL) || + (ctxt->str_xml_ns == NULL)) { + xmlErrMemory(ctxt, NULL); + } +} + +typedef struct _xmlDefAttrs xmlDefAttrs; +typedef xmlDefAttrs *xmlDefAttrsPtr; +struct _xmlDefAttrs { + int nbAttrs; /* number of defaulted attributes on that element */ + int maxAttrs; /* the size of the array */ + const xmlChar *values[5]; /* array of localname/prefix/values/external */ +}; + +/** + * xmlAttrNormalizeSpace: + * @src: the source string + * @dst: the target string + * + * Normalize the space in non CDATA attribute values: + * If the attribute type is not CDATA, then the XML processor MUST further + * process the normalized attribute value by discarding any leading and + * trailing space (#x20) characters, and by replacing sequences of space + * (#x20) characters by a single space (#x20) character. + * Note that the size of dst need to be at least src, and if one doesn't need + * to preserve dst (and it doesn't come from a dictionary or read-only) then + * passing src as dst is just fine. + * + * Returns a pointer to the normalized value (dst) or NULL if no conversion + * is needed. + */ +static xmlChar * +xmlAttrNormalizeSpace(const xmlChar *src, xmlChar *dst) +{ + if ((src == NULL) || (dst == NULL)) + return(NULL); + + while (*src == 0x20) src++; + while (*src != 0) { + if (*src == 0x20) { + while (*src == 0x20) src++; + if (*src != 0) + *dst++ = 0x20; + } else { + *dst++ = *src++; + } + } + *dst = 0; + if (dst == src) + return(NULL); + return(dst); +} + +/** + * xmlAttrNormalizeSpace2: + * @src: the source string + * + * Normalize the space in non CDATA attribute values, a slightly more complex + * front end to avoid allocation problems when running on attribute values + * coming from the input. + * + * Returns a pointer to the normalized value (dst) or NULL if no conversion + * is needed. + */ +static const xmlChar * +xmlAttrNormalizeSpace2(xmlParserCtxtPtr ctxt, xmlChar *src, int *len) +{ + int i; + int remove_head = 0; + int need_realloc = 0; + const xmlChar *cur; + + if ((ctxt == NULL) || (src == NULL) || (len == NULL)) + return(NULL); + i = *len; + if (i <= 0) + return(NULL); + + cur = src; + while (*cur == 0x20) { + cur++; + remove_head++; + } + while (*cur != 0) { + if (*cur == 0x20) { + cur++; + if ((*cur == 0x20) || (*cur == 0)) { + need_realloc = 1; + break; + } + } else + cur++; + } + if (need_realloc) { + xmlChar *ret; + + ret = xmlStrndup(src + remove_head, i - remove_head + 1); + if (ret == NULL) { + xmlErrMemory(ctxt, NULL); + return(NULL); + } + xmlAttrNormalizeSpace(ret, ret); + *len = (int) strlen((const char *)ret); + return(ret); + } else if (remove_head) { + *len -= remove_head; + memmove(src, src + remove_head, 1 + *len); + return(src); + } + return(NULL); +} + +/** + * xmlAddDefAttrs: + * @ctxt: an XML parser context + * @fullname: the element fullname + * @fullattr: the attribute fullname + * @value: the attribute value + * + * Add a defaulted attribute for an element + */ +static void +xmlAddDefAttrs(xmlParserCtxtPtr ctxt, + const xmlChar *fullname, + const xmlChar *fullattr, + const xmlChar *value) { + xmlDefAttrsPtr defaults; + int len; + const xmlChar *name; + const xmlChar *prefix; + + /* + * Allows to detect attribute redefinitions + */ + if (ctxt->attsSpecial != NULL) { + if (xmlHashLookup2(ctxt->attsSpecial, fullname, fullattr) != NULL) + return; + } + + if (ctxt->attsDefault == NULL) { + ctxt->attsDefault = xmlHashCreateDict(10, ctxt->dict); + if (ctxt->attsDefault == NULL) + goto mem_error; + } + + /* + * split the element name into prefix:localname , the string found + * are within the DTD and then not associated to namespace names. + */ + name = xmlSplitQName3(fullname, &len); + if (name == NULL) { + name = xmlDictLookup(ctxt->dict, fullname, -1); + prefix = NULL; + } else { + name = xmlDictLookup(ctxt->dict, name, -1); + prefix = xmlDictLookup(ctxt->dict, fullname, len); + } + + /* + * make sure there is some storage + */ + defaults = xmlHashLookup2(ctxt->attsDefault, name, prefix); + if (defaults == NULL) { + defaults = (xmlDefAttrsPtr) xmlMalloc(sizeof(xmlDefAttrs) + + (4 * 5) * sizeof(const xmlChar *)); + if (defaults == NULL) + goto mem_error; + defaults->nbAttrs = 0; + defaults->maxAttrs = 4; + if (xmlHashUpdateEntry2(ctxt->attsDefault, name, prefix, + defaults, NULL) < 0) { + xmlFree(defaults); + goto mem_error; + } + } else if (defaults->nbAttrs >= defaults->maxAttrs) { + xmlDefAttrsPtr temp; + + temp = (xmlDefAttrsPtr) xmlRealloc(defaults, sizeof(xmlDefAttrs) + + (2 * defaults->maxAttrs * 5) * sizeof(const xmlChar *)); + if (temp == NULL) + goto mem_error; + defaults = temp; + defaults->maxAttrs *= 2; + if (xmlHashUpdateEntry2(ctxt->attsDefault, name, prefix, + defaults, NULL) < 0) { + xmlFree(defaults); + goto mem_error; + } + } + + /* + * Split the element name into prefix:localname , the string found + * are within the DTD and hen not associated to namespace names. + */ + name = xmlSplitQName3(fullattr, &len); + if (name == NULL) { + name = xmlDictLookup(ctxt->dict, fullattr, -1); + prefix = NULL; + } else { + name = xmlDictLookup(ctxt->dict, name, -1); + prefix = xmlDictLookup(ctxt->dict, fullattr, len); + } + + defaults->values[5 * defaults->nbAttrs] = name; + defaults->values[5 * defaults->nbAttrs + 1] = prefix; + /* intern the string and precompute the end */ + len = xmlStrlen(value); + value = xmlDictLookup(ctxt->dict, value, len); + defaults->values[5 * defaults->nbAttrs + 2] = value; + defaults->values[5 * defaults->nbAttrs + 3] = value + len; + if (ctxt->external) + defaults->values[5 * defaults->nbAttrs + 4] = BAD_CAST "external"; + else + defaults->values[5 * defaults->nbAttrs + 4] = NULL; + defaults->nbAttrs++; + + return; + +mem_error: + xmlErrMemory(ctxt, NULL); + return; +} + +/** + * xmlAddSpecialAttr: + * @ctxt: an XML parser context + * @fullname: the element fullname + * @fullattr: the attribute fullname + * @type: the attribute type + * + * Register this attribute type + */ +static void +xmlAddSpecialAttr(xmlParserCtxtPtr ctxt, + const xmlChar *fullname, + const xmlChar *fullattr, + int type) +{ + if (ctxt->attsSpecial == NULL) { + ctxt->attsSpecial = xmlHashCreateDict(10, ctxt->dict); + if (ctxt->attsSpecial == NULL) + goto mem_error; + } + + if (xmlHashLookup2(ctxt->attsSpecial, fullname, fullattr) != NULL) + return; + + xmlHashAddEntry2(ctxt->attsSpecial, fullname, fullattr, + (void *) (long) type); + return; + +mem_error: + xmlErrMemory(ctxt, NULL); + return; +} + +/** + * xmlCleanSpecialAttrCallback: + * + * Removes CDATA attributes from the special attribute table + */ +static void +xmlCleanSpecialAttrCallback(void *payload, void *data, + const xmlChar *fullname, const xmlChar *fullattr, + const xmlChar *unused ATTRIBUTE_UNUSED) { + xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) data; + + if (((long) payload) == XML_ATTRIBUTE_CDATA) { + xmlHashRemoveEntry2(ctxt->attsSpecial, fullname, fullattr, NULL); + } +} + +/** + * xmlCleanSpecialAttr: + * @ctxt: an XML parser context + * + * Trim the list of attributes defined to remove all those of type + * CDATA as they are not special. This call should be done when finishing + * to parse the DTD and before starting to parse the document root. + */ +static void +xmlCleanSpecialAttr(xmlParserCtxtPtr ctxt) +{ + if (ctxt->attsSpecial == NULL) + return; + + xmlHashScanFull(ctxt->attsSpecial, xmlCleanSpecialAttrCallback, ctxt); + + if (xmlHashSize(ctxt->attsSpecial) == 0) { + xmlHashFree(ctxt->attsSpecial, NULL); + ctxt->attsSpecial = NULL; + } + return; +} + +/** + * xmlCheckLanguageID: + * @lang: pointer to the string value + * + * Checks that the value conforms to the LanguageID production: + * + * NOTE: this is somewhat deprecated, those productions were removed from + * the XML Second edition. + * + * [33] LanguageID ::= Langcode ('-' Subcode)* + * [34] Langcode ::= ISO639Code | IanaCode | UserCode + * [35] ISO639Code ::= ([a-z] | [A-Z]) ([a-z] | [A-Z]) + * [36] IanaCode ::= ('i' | 'I') '-' ([a-z] | [A-Z])+ + * [37] UserCode ::= ('x' | 'X') '-' ([a-z] | [A-Z])+ + * [38] Subcode ::= ([a-z] | [A-Z])+ + * + * The current REC reference the sucessors of RFC 1766, currently 5646 + * + * http://www.rfc-editor.org/rfc/rfc5646.txt + * langtag = language + * ["-" script] + * ["-" region] + * *("-" variant) + * *("-" extension) + * ["-" privateuse] + * language = 2*3ALPHA ; shortest ISO 639 code + * ["-" extlang] ; sometimes followed by + * ; extended language subtags + * / 4ALPHA ; or reserved for future use + * / 5*8ALPHA ; or registered language subtag + * + * extlang = 3ALPHA ; selected ISO 639 codes + * *2("-" 3ALPHA) ; permanently reserved + * + * script = 4ALPHA ; ISO 15924 code + * + * region = 2ALPHA ; ISO 3166-1 code + * / 3DIGIT ; UN M.49 code + * + * variant = 5*8alphanum ; registered variants + * / (DIGIT 3alphanum) + * + * extension = singleton 1*("-" (2*8alphanum)) + * + * ; Single alphanumerics + * ; "x" reserved for private use + * singleton = DIGIT ; 0 - 9 + * / %x41-57 ; A - W + * / %x59-5A ; Y - Z + * / %x61-77 ; a - w + * / %x79-7A ; y - z + * + * it sounds right to still allow Irregular i-xxx IANA and user codes too + * The parser below doesn't try to cope with extension or privateuse + * that could be added but that's not interoperable anyway + * + * Returns 1 if correct 0 otherwise + **/ +int +xmlCheckLanguageID(const xmlChar * lang) +{ + const xmlChar *cur = lang, *nxt; + + if (cur == NULL) + return (0); + if (((cur[0] == 'i') && (cur[1] == '-')) || + ((cur[0] == 'I') && (cur[1] == '-')) || + ((cur[0] == 'x') && (cur[1] == '-')) || + ((cur[0] == 'X') && (cur[1] == '-'))) { + /* + * Still allow IANA code and user code which were coming + * from the previous version of the XML-1.0 specification + * it's deprecated but we should not fail + */ + cur += 2; + while (((cur[0] >= 'A') && (cur[0] <= 'Z')) || + ((cur[0] >= 'a') && (cur[0] <= 'z'))) + cur++; + return(cur[0] == 0); + } + nxt = cur; + while (((nxt[0] >= 'A') && (nxt[0] <= 'Z')) || + ((nxt[0] >= 'a') && (nxt[0] <= 'z'))) + nxt++; + if (nxt - cur >= 4) { + /* + * Reserved + */ + if ((nxt - cur > 8) || (nxt[0] != 0)) + return(0); + return(1); + } + if (nxt - cur < 2) + return(0); + /* we got an ISO 639 code */ + if (nxt[0] == 0) + return(1); + if (nxt[0] != '-') + return(0); + + nxt++; + cur = nxt; + /* now we can have extlang or script or region or variant */ + if ((nxt[0] >= '0') && (nxt[0] <= '9')) + goto region_m49; + + while (((nxt[0] >= 'A') && (nxt[0] <= 'Z')) || + ((nxt[0] >= 'a') && (nxt[0] <= 'z'))) + nxt++; + if (nxt - cur == 4) + goto script; + if (nxt - cur == 2) + goto region; + if ((nxt - cur >= 5) && (nxt - cur <= 8)) + goto variant; + if (nxt - cur != 3) + return(0); + /* we parsed an extlang */ + if (nxt[0] == 0) + return(1); + if (nxt[0] != '-') + return(0); + + nxt++; + cur = nxt; + /* now we can have script or region or variant */ + if ((nxt[0] >= '0') && (nxt[0] <= '9')) + goto region_m49; + + while (((nxt[0] >= 'A') && (nxt[0] <= 'Z')) || + ((nxt[0] >= 'a') && (nxt[0] <= 'z'))) + nxt++; + if (nxt - cur == 2) + goto region; + if ((nxt - cur >= 5) && (nxt - cur <= 8)) + goto variant; + if (nxt - cur != 4) + return(0); + /* we parsed a script */ +script: + if (nxt[0] == 0) + return(1); + if (nxt[0] != '-') + return(0); + + nxt++; + cur = nxt; + /* now we can have region or variant */ + if ((nxt[0] >= '0') && (nxt[0] <= '9')) + goto region_m49; + + while (((nxt[0] >= 'A') && (nxt[0] <= 'Z')) || + ((nxt[0] >= 'a') && (nxt[0] <= 'z'))) + nxt++; + + if ((nxt - cur >= 5) && (nxt - cur <= 8)) + goto variant; + if (nxt - cur != 2) + return(0); + /* we parsed a region */ +region: + if (nxt[0] == 0) + return(1); + if (nxt[0] != '-') + return(0); + + nxt++; + cur = nxt; + /* now we can just have a variant */ + while (((nxt[0] >= 'A') && (nxt[0] <= 'Z')) || + ((nxt[0] >= 'a') && (nxt[0] <= 'z'))) + nxt++; + + if ((nxt - cur < 5) || (nxt - cur > 8)) + return(0); + + /* we parsed a variant */ +variant: + if (nxt[0] == 0) + return(1); + if (nxt[0] != '-') + return(0); + /* extensions and private use subtags not checked */ + return (1); + +region_m49: + if (((nxt[1] >= '0') && (nxt[1] <= '9')) && + ((nxt[2] >= '0') && (nxt[2] <= '9'))) { + nxt += 3; + goto region; + } + return(0); +} + +/************************************************************************ + * * + * Parser stacks related functions and macros * + * * + ************************************************************************/ + +static xmlEntityPtr xmlParseStringEntityRef(xmlParserCtxtPtr ctxt, + const xmlChar ** str); + +#ifdef SAX2 +/** + * nsPush: + * @ctxt: an XML parser context + * @prefix: the namespace prefix or NULL + * @URL: the namespace name + * + * Pushes a new parser namespace on top of the ns stack + * + * Returns -1 in case of error, -2 if the namespace should be discarded + * and the index in the stack otherwise. + */ +static int +nsPush(xmlParserCtxtPtr ctxt, const xmlChar *prefix, const xmlChar *URL) +{ + if (ctxt->options & XML_PARSE_NSCLEAN) { + int i; + for (i = ctxt->nsNr - 2;i >= 0;i -= 2) { + if (ctxt->nsTab[i] == prefix) { + /* in scope */ + if (ctxt->nsTab[i + 1] == URL) + return(-2); + /* out of scope keep it */ + break; + } + } + } + if ((ctxt->nsMax == 0) || (ctxt->nsTab == NULL)) { + ctxt->nsMax = 10; + ctxt->nsNr = 0; + ctxt->nsTab = (const xmlChar **) + xmlMalloc(ctxt->nsMax * sizeof(xmlChar *)); + if (ctxt->nsTab == NULL) { + xmlErrMemory(ctxt, NULL); + ctxt->nsMax = 0; + return (-1); + } + } else if (ctxt->nsNr >= ctxt->nsMax) { + const xmlChar ** tmp; + ctxt->nsMax *= 2; + tmp = (const xmlChar **) xmlRealloc((char *) ctxt->nsTab, + ctxt->nsMax * sizeof(ctxt->nsTab[0])); + if (tmp == NULL) { + xmlErrMemory(ctxt, NULL); + ctxt->nsMax /= 2; + return (-1); + } + ctxt->nsTab = tmp; + } + ctxt->nsTab[ctxt->nsNr++] = prefix; + ctxt->nsTab[ctxt->nsNr++] = URL; + return (ctxt->nsNr); +} +/** + * nsPop: + * @ctxt: an XML parser context + * @nr: the number to pop + * + * Pops the top @nr parser prefix/namespace from the ns stack + * + * Returns the number of namespaces removed + */ +static int +nsPop(xmlParserCtxtPtr ctxt, int nr) +{ + int i; + + if (ctxt->nsTab == NULL) return(0); + if (ctxt->nsNr < nr) { + xmlGenericError(xmlGenericErrorContext, "Pbm popping %d NS\n", nr); + nr = ctxt->nsNr; + } + if (ctxt->nsNr <= 0) + return (0); + + for (i = 0;i < nr;i++) { + ctxt->nsNr--; + ctxt->nsTab[ctxt->nsNr] = NULL; + } + return(nr); +} +#endif + +static int +xmlCtxtGrowAttrs(xmlParserCtxtPtr ctxt, int nr) { + const xmlChar **atts; + int *attallocs; + int maxatts; + + if (ctxt->atts == NULL) { + maxatts = 55; /* allow for 10 attrs by default */ + atts = (const xmlChar **) + xmlMalloc(maxatts * sizeof(xmlChar *)); + if (atts == NULL) goto mem_error; + ctxt->atts = atts; + attallocs = (int *) xmlMalloc((maxatts / 5) * sizeof(int)); + if (attallocs == NULL) goto mem_error; + ctxt->attallocs = attallocs; + ctxt->maxatts = maxatts; + } else if (nr + 5 > ctxt->maxatts) { + maxatts = (nr + 5) * 2; + atts = (const xmlChar **) xmlRealloc((void *) ctxt->atts, + maxatts * sizeof(const xmlChar *)); + if (atts == NULL) goto mem_error; + ctxt->atts = atts; + attallocs = (int *) xmlRealloc((void *) ctxt->attallocs, + (maxatts / 5) * sizeof(int)); + if (attallocs == NULL) goto mem_error; + ctxt->attallocs = attallocs; + ctxt->maxatts = maxatts; + } + return(ctxt->maxatts); +mem_error: + xmlErrMemory(ctxt, NULL); + return(-1); +} + +/** + * inputPush: + * @ctxt: an XML parser context + * @value: the parser input + * + * Pushes a new parser input on top of the input stack + * + * Returns -1 in case of error, the index in the stack otherwise + */ +int +inputPush(xmlParserCtxtPtr ctxt, xmlParserInputPtr value) +{ + if ((ctxt == NULL) || (value == NULL)) + return(-1); + if (ctxt->inputNr >= ctxt->inputMax) { + ctxt->inputMax *= 2; + ctxt->inputTab = + (xmlParserInputPtr *) xmlRealloc(ctxt->inputTab, + ctxt->inputMax * + sizeof(ctxt->inputTab[0])); + if (ctxt->inputTab == NULL) { + xmlErrMemory(ctxt, NULL); + xmlFreeInputStream(value); + ctxt->inputMax /= 2; + value = NULL; + return (-1); + } + } + ctxt->inputTab[ctxt->inputNr] = value; + ctxt->input = value; + return (ctxt->inputNr++); +} +/** + * inputPop: + * @ctxt: an XML parser context + * + * Pops the top parser input from the input stack + * + * Returns the input just removed + */ +xmlParserInputPtr +inputPop(xmlParserCtxtPtr ctxt) +{ + xmlParserInputPtr ret; + + if (ctxt == NULL) + return(NULL); + if (ctxt->inputNr <= 0) + return (NULL); + ctxt->inputNr--; + if (ctxt->inputNr > 0) + ctxt->input = ctxt->inputTab[ctxt->inputNr - 1]; + else + ctxt->input = NULL; + ret = ctxt->inputTab[ctxt->inputNr]; + ctxt->inputTab[ctxt->inputNr] = NULL; + return (ret); +} +/** + * nodePush: + * @ctxt: an XML parser context + * @value: the element node + * + * Pushes a new element node on top of the node stack + * + * Returns -1 in case of error, the index in the stack otherwise + */ +int +nodePush(xmlParserCtxtPtr ctxt, xmlNodePtr value) +{ + if (ctxt == NULL) return(0); + if (ctxt->nodeNr >= ctxt->nodeMax) { + xmlNodePtr *tmp; + + tmp = (xmlNodePtr *) xmlRealloc(ctxt->nodeTab, + ctxt->nodeMax * 2 * + sizeof(ctxt->nodeTab[0])); + if (tmp == NULL) { + xmlErrMemory(ctxt, NULL); + return (-1); + } + ctxt->nodeTab = tmp; + ctxt->nodeMax *= 2; + } + if ((((unsigned int) ctxt->nodeNr) > xmlParserMaxDepth) && + ((ctxt->options & XML_PARSE_HUGE) == 0)) { + xmlFatalErrMsgInt(ctxt, XML_ERR_INTERNAL_ERROR, + "Excessive depth in document: %d use XML_PARSE_HUGE option\n", + xmlParserMaxDepth); + ctxt->instate = XML_PARSER_EOF; + return(-1); + } + ctxt->nodeTab[ctxt->nodeNr] = value; + ctxt->node = value; + return (ctxt->nodeNr++); +} + +/** + * nodePop: + * @ctxt: an XML parser context + * + * Pops the top element node from the node stack + * + * Returns the node just removed + */ +xmlNodePtr +nodePop(xmlParserCtxtPtr ctxt) +{ + xmlNodePtr ret; + + if (ctxt == NULL) return(NULL); + if (ctxt->nodeNr <= 0) + return (NULL); + ctxt->nodeNr--; + if (ctxt->nodeNr > 0) + ctxt->node = ctxt->nodeTab[ctxt->nodeNr - 1]; + else + ctxt->node = NULL; + ret = ctxt->nodeTab[ctxt->nodeNr]; + ctxt->nodeTab[ctxt->nodeNr] = NULL; + return (ret); +} + +#ifdef LIBXML_PUSH_ENABLED +/** + * nameNsPush: + * @ctxt: an XML parser context + * @value: the element name + * @prefix: the element prefix + * @URI: the element namespace name + * + * Pushes a new element name/prefix/URL on top of the name stack + * + * Returns -1 in case of error, the index in the stack otherwise + */ +static int +nameNsPush(xmlParserCtxtPtr ctxt, const xmlChar * value, + const xmlChar *prefix, const xmlChar *URI, int nsNr) +{ + if (ctxt->nameNr >= ctxt->nameMax) { + const xmlChar * *tmp; + void **tmp2; + ctxt->nameMax *= 2; + tmp = (const xmlChar * *) xmlRealloc((xmlChar * *)ctxt->nameTab, + ctxt->nameMax * + sizeof(ctxt->nameTab[0])); + if (tmp == NULL) { + ctxt->nameMax /= 2; + goto mem_error; + } + ctxt->nameTab = tmp; + tmp2 = (void **) xmlRealloc((void * *)ctxt->pushTab, + ctxt->nameMax * 3 * + sizeof(ctxt->pushTab[0])); + if (tmp2 == NULL) { + ctxt->nameMax /= 2; + goto mem_error; + } + ctxt->pushTab = tmp2; + } + ctxt->nameTab[ctxt->nameNr] = value; + ctxt->name = value; + ctxt->pushTab[ctxt->nameNr * 3] = (void *) prefix; + ctxt->pushTab[ctxt->nameNr * 3 + 1] = (void *) URI; + ctxt->pushTab[ctxt->nameNr * 3 + 2] = (void *) (long) nsNr; + return (ctxt->nameNr++); +mem_error: + xmlErrMemory(ctxt, NULL); + return (-1); +} +/** + * nameNsPop: + * @ctxt: an XML parser context + * + * Pops the top element/prefix/URI name from the name stack + * + * Returns the name just removed + */ +static const xmlChar * +nameNsPop(xmlParserCtxtPtr ctxt) +{ + const xmlChar *ret; + + if (ctxt->nameNr <= 0) + return (NULL); + ctxt->nameNr--; + if (ctxt->nameNr > 0) + ctxt->name = ctxt->nameTab[ctxt->nameNr - 1]; + else + ctxt->name = NULL; + ret = ctxt->nameTab[ctxt->nameNr]; + ctxt->nameTab[ctxt->nameNr] = NULL; + return (ret); +} +#endif /* LIBXML_PUSH_ENABLED */ + +/** + * namePush: + * @ctxt: an XML parser context + * @value: the element name + * + * Pushes a new element name on top of the name stack + * + * Returns -1 in case of error, the index in the stack otherwise + */ +int +namePush(xmlParserCtxtPtr ctxt, const xmlChar * value) +{ + if (ctxt == NULL) return (-1); + + if (ctxt->nameNr >= ctxt->nameMax) { + const xmlChar * *tmp; + tmp = (const xmlChar * *) xmlRealloc((xmlChar * *)ctxt->nameTab, + ctxt->nameMax * 2 * + sizeof(ctxt->nameTab[0])); + if (tmp == NULL) { + goto mem_error; + } + ctxt->nameTab = tmp; + ctxt->nameMax *= 2; + } + ctxt->nameTab[ctxt->nameNr] = value; + ctxt->name = value; + return (ctxt->nameNr++); +mem_error: + xmlErrMemory(ctxt, NULL); + return (-1); +} +/** + * namePop: + * @ctxt: an XML parser context + * + * Pops the top element name from the name stack + * + * Returns the name just removed + */ +const xmlChar * +namePop(xmlParserCtxtPtr ctxt) +{ + const xmlChar *ret; + + if ((ctxt == NULL) || (ctxt->nameNr <= 0)) + return (NULL); + ctxt->nameNr--; + if (ctxt->nameNr > 0) + ctxt->name = ctxt->nameTab[ctxt->nameNr - 1]; + else + ctxt->name = NULL; + ret = ctxt->nameTab[ctxt->nameNr]; + ctxt->nameTab[ctxt->nameNr] = NULL; + return (ret); +} + +static int spacePush(xmlParserCtxtPtr ctxt, int val) { + if (ctxt->spaceNr >= ctxt->spaceMax) { + int *tmp; + + ctxt->spaceMax *= 2; + tmp = (int *) xmlRealloc(ctxt->spaceTab, + ctxt->spaceMax * sizeof(ctxt->spaceTab[0])); + if (tmp == NULL) { + xmlErrMemory(ctxt, NULL); + ctxt->spaceMax /=2; + return(-1); + } + ctxt->spaceTab = tmp; + } + ctxt->spaceTab[ctxt->spaceNr] = val; + ctxt->space = &ctxt->spaceTab[ctxt->spaceNr]; + return(ctxt->spaceNr++); +} + +static int spacePop(xmlParserCtxtPtr ctxt) { + int ret; + if (ctxt->spaceNr <= 0) return(0); + ctxt->spaceNr--; + if (ctxt->spaceNr > 0) + ctxt->space = &ctxt->spaceTab[ctxt->spaceNr - 1]; + else + ctxt->space = &ctxt->spaceTab[0]; + ret = ctxt->spaceTab[ctxt->spaceNr]; + ctxt->spaceTab[ctxt->spaceNr] = -1; + return(ret); +} + +/* + * Macros for accessing the content. Those should be used only by the parser, + * and not exported. + * + * Dirty macros, i.e. one often need to make assumption on the context to + * use them + * + * CUR_PTR return the current pointer to the xmlChar to be parsed. + * To be used with extreme caution since operations consuming + * characters may move the input buffer to a different location ! + * CUR returns the current xmlChar value, i.e. a 8 bit value if compiled + * This should be used internally by the parser + * only to compare to ASCII values otherwise it would break when + * running with UTF-8 encoding. + * RAW same as CUR but in the input buffer, bypass any token + * extraction that may have been done + * NXT(n) returns the n'th next xmlChar. Same as CUR is should be used only + * to compare on ASCII based substring. + * SKIP(n) Skip n xmlChar, and must also be used only to skip ASCII defined + * strings without newlines within the parser. + * NEXT1(l) Skip 1 xmlChar, and must also be used only to skip 1 non-newline ASCII + * defined char within the parser. + * Clean macros, not dependent of an ASCII context, expect UTF-8 encoding + * + * NEXT Skip to the next character, this does the proper decoding + * in UTF-8 mode. It also pop-up unfinished entities on the fly. + * NEXTL(l) Skip the current unicode character of l xmlChars long. + * CUR_CHAR(l) returns the current unicode character (int), set l + * to the number of xmlChars used for the encoding [0-5]. + * CUR_SCHAR same but operate on a string instead of the context + * COPY_BUF copy the current unicode char to the target buffer, increment + * the index + * GROW, SHRINK handling of input buffers + */ + +#define RAW (*ctxt->input->cur) +#define CUR (*ctxt->input->cur) +#define NXT(val) ctxt->input->cur[(val)] +#define CUR_PTR ctxt->input->cur + +#define CMP4( s, c1, c2, c3, c4 ) \ + ( ((unsigned char *) s)[ 0 ] == c1 && ((unsigned char *) s)[ 1 ] == c2 && \ + ((unsigned char *) s)[ 2 ] == c3 && ((unsigned char *) s)[ 3 ] == c4 ) +#define CMP5( s, c1, c2, c3, c4, c5 ) \ + ( CMP4( s, c1, c2, c3, c4 ) && ((unsigned char *) s)[ 4 ] == c5 ) +#define CMP6( s, c1, c2, c3, c4, c5, c6 ) \ + ( CMP5( s, c1, c2, c3, c4, c5 ) && ((unsigned char *) s)[ 5 ] == c6 ) +#define CMP7( s, c1, c2, c3, c4, c5, c6, c7 ) \ + ( CMP6( s, c1, c2, c3, c4, c5, c6 ) && ((unsigned char *) s)[ 6 ] == c7 ) +#define CMP8( s, c1, c2, c3, c4, c5, c6, c7, c8 ) \ + ( CMP7( s, c1, c2, c3, c4, c5, c6, c7 ) && ((unsigned char *) s)[ 7 ] == c8 ) +#define CMP9( s, c1, c2, c3, c4, c5, c6, c7, c8, c9 ) \ + ( CMP8( s, c1, c2, c3, c4, c5, c6, c7, c8 ) && \ + ((unsigned char *) s)[ 8 ] == c9 ) +#define CMP10( s, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10 ) \ + ( CMP9( s, c1, c2, c3, c4, c5, c6, c7, c8, c9 ) && \ + ((unsigned char *) s)[ 9 ] == c10 ) + +#define SKIP(val) do { \ + ctxt->nbChars += (val),ctxt->input->cur += (val),ctxt->input->col+=(val); \ + if (*ctxt->input->cur == '%') xmlParserHandlePEReference(ctxt); \ + if ((*ctxt->input->cur == 0) && \ + (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) \ + xmlPopInput(ctxt); \ + } while (0) + +#define SKIPL(val) do { \ + int skipl; \ + for(skipl=0; skiplinput->cur) == '\n') { \ + ctxt->input->line++; ctxt->input->col = 1; \ + } else ctxt->input->col++; \ + ctxt->nbChars++; \ + ctxt->input->cur++; \ + } \ + if (*ctxt->input->cur == '%') xmlParserHandlePEReference(ctxt); \ + if ((*ctxt->input->cur == 0) && \ + (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) \ + xmlPopInput(ctxt); \ + } while (0) + +#define SHRINK if ((ctxt->progressive == 0) && \ + (ctxt->input->cur - ctxt->input->base > 2 * INPUT_CHUNK) && \ + (ctxt->input->end - ctxt->input->cur < 2 * INPUT_CHUNK)) \ + xmlSHRINK (ctxt); + +static void xmlSHRINK (xmlParserCtxtPtr ctxt) { + xmlParserInputShrink(ctxt->input); + if ((*ctxt->input->cur == 0) && + (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) + xmlPopInput(ctxt); + } + +#define GROW if ((ctxt->progressive == 0) && \ + (ctxt->input->end - ctxt->input->cur < INPUT_CHUNK)) \ + xmlGROW (ctxt); + +static void xmlGROW (xmlParserCtxtPtr ctxt) { + if ((((ctxt->input->end - ctxt->input->cur) > XML_MAX_LOOKUP_LIMIT) || + ((ctxt->input->cur - ctxt->input->base) > XML_MAX_LOOKUP_LIMIT)) && + ((ctxt->input->buf) && (ctxt->input->buf->readcallback != (xmlInputReadCallback) xmlNop)) && + ((ctxt->options & XML_PARSE_HUGE) == 0)) { + xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, "Huge input lookup"); + ctxt->instate = XML_PARSER_EOF; + } + xmlParserInputGrow(ctxt->input, INPUT_CHUNK); + if ((ctxt->input->cur != NULL) && (*ctxt->input->cur == 0) && + (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) + xmlPopInput(ctxt); +} + +#define SKIP_BLANKS xmlSkipBlankChars(ctxt) + +#define NEXT xmlNextChar(ctxt) + +#define NEXT1 { \ + ctxt->input->col++; \ + ctxt->input->cur++; \ + ctxt->nbChars++; \ + if (*ctxt->input->cur == 0) \ + xmlParserInputGrow(ctxt->input, INPUT_CHUNK); \ + } + +#define NEXTL(l) do { \ + if (*(ctxt->input->cur) == '\n') { \ + ctxt->input->line++; ctxt->input->col = 1; \ + } else ctxt->input->col++; \ + ctxt->input->cur += l; \ + if (*ctxt->input->cur == '%') xmlParserHandlePEReference(ctxt); \ + } while (0) + +#define CUR_CHAR(l) xmlCurrentChar(ctxt, &l) +#define CUR_SCHAR(s, l) xmlStringCurrentChar(ctxt, s, &l) + +#define COPY_BUF(l,b,i,v) \ + if (l == 1) b[i++] = (xmlChar) v; \ + else i += xmlCopyCharMultiByte(&b[i],v) + +/** + * xmlSkipBlankChars: + * @ctxt: the XML parser context + * + * skip all blanks character found at that point in the input streams. + * It pops up finished entities in the process if allowable at that point. + * + * Returns the number of space chars skipped + */ + +int +xmlSkipBlankChars(xmlParserCtxtPtr ctxt) { + int res = 0; + + /* + * It's Okay to use CUR/NEXT here since all the blanks are on + * the ASCII range. + */ + if ((ctxt->inputNr == 1) && (ctxt->instate != XML_PARSER_DTD)) { + const xmlChar *cur; + /* + * if we are in the document content, go really fast + */ + cur = ctxt->input->cur; + while (IS_BLANK_CH(*cur)) { + if (*cur == '\n') { + ctxt->input->line++; ctxt->input->col = 1; + } + cur++; + res++; + if (*cur == 0) { + ctxt->input->cur = cur; + xmlParserInputGrow(ctxt->input, INPUT_CHUNK); + cur = ctxt->input->cur; + } + } + ctxt->input->cur = cur; + } else { + int cur; + do { + cur = CUR; + while (IS_BLANK_CH(cur)) { /* CHECKED tstblanks.xml */ + NEXT; + cur = CUR; + res++; + } + while ((cur == 0) && (ctxt->inputNr > 1) && + (ctxt->instate != XML_PARSER_COMMENT)) { + xmlPopInput(ctxt); + cur = CUR; + } + /* + * Need to handle support of entities branching here + */ + if (*ctxt->input->cur == '%') xmlParserHandlePEReference(ctxt); + } while (IS_BLANK(cur)); /* CHECKED tstblanks.xml */ + } + return(res); +} + +/************************************************************************ + * * + * Commodity functions to handle entities * + * * + ************************************************************************/ + +/** + * xmlPopInput: + * @ctxt: an XML parser context + * + * xmlPopInput: the current input pointed by ctxt->input came to an end + * pop it and return the next char. + * + * Returns the current xmlChar in the parser context + */ +xmlChar +xmlPopInput(xmlParserCtxtPtr ctxt) { + if ((ctxt == NULL) || (ctxt->inputNr <= 1)) return(0); + if (xmlParserDebugEntities) + xmlGenericError(xmlGenericErrorContext, + "Popping input %d\n", ctxt->inputNr); + xmlFreeInputStream(inputPop(ctxt)); + if ((*ctxt->input->cur == 0) && + (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) + return(xmlPopInput(ctxt)); + return(CUR); +} + +/** + * xmlPushInput: + * @ctxt: an XML parser context + * @input: an XML parser input fragment (entity, XML fragment ...). + * + * xmlPushInput: switch to a new input stream which is stacked on top + * of the previous one(s). + * Returns -1 in case of error or the index in the input stack + */ +int +xmlPushInput(xmlParserCtxtPtr ctxt, xmlParserInputPtr input) { + int ret; + if (input == NULL) return(-1); + + if (xmlParserDebugEntities) { + if ((ctxt->input != NULL) && (ctxt->input->filename)) + xmlGenericError(xmlGenericErrorContext, + "%s(%d): ", ctxt->input->filename, + ctxt->input->line); + xmlGenericError(xmlGenericErrorContext, + "Pushing input %d : %.30s\n", ctxt->inputNr+1, input->cur); + } + ret = inputPush(ctxt, input); + if (ctxt->instate == XML_PARSER_EOF) + return(-1); + GROW; + return(ret); +} + +/** + * xmlParseCharRef: + * @ctxt: an XML parser context + * + * parse Reference declarations + * + * [66] CharRef ::= '&#' [0-9]+ ';' | + * '&#x' [0-9a-fA-F]+ ';' + * + * [ WFC: Legal Character ] + * Characters referred to using character references must match the + * production for Char. + * + * Returns the value parsed (as an int), 0 in case of error + */ +int +xmlParseCharRef(xmlParserCtxtPtr ctxt) { + unsigned int val = 0; + int count = 0; + unsigned int outofrange = 0; + + /* + * Using RAW/CUR/NEXT is okay since we are working on ASCII range here + */ + if ((RAW == '&') && (NXT(1) == '#') && + (NXT(2) == 'x')) { + SKIP(3); + GROW; + while (RAW != ';') { /* loop blocked by count */ + if (count++ > 20) { + count = 0; + GROW; + if (ctxt->instate == XML_PARSER_EOF) + return(0); + } + if ((RAW >= '0') && (RAW <= '9')) + val = val * 16 + (CUR - '0'); + else if ((RAW >= 'a') && (RAW <= 'f') && (count < 20)) + val = val * 16 + (CUR - 'a') + 10; + else if ((RAW >= 'A') && (RAW <= 'F') && (count < 20)) + val = val * 16 + (CUR - 'A') + 10; + else { + xmlFatalErr(ctxt, XML_ERR_INVALID_HEX_CHARREF, NULL); + val = 0; + break; + } + if (val > 0x10FFFF) + outofrange = val; + + NEXT; + count++; + } + if (RAW == ';') { + /* on purpose to avoid reentrancy problems with NEXT and SKIP */ + ctxt->input->col++; + ctxt->nbChars ++; + ctxt->input->cur++; + } + } else if ((RAW == '&') && (NXT(1) == '#')) { + SKIP(2); + GROW; + while (RAW != ';') { /* loop blocked by count */ + if (count++ > 20) { + count = 0; + GROW; + if (ctxt->instate == XML_PARSER_EOF) + return(0); + } + if ((RAW >= '0') && (RAW <= '9')) + val = val * 10 + (CUR - '0'); + else { + xmlFatalErr(ctxt, XML_ERR_INVALID_DEC_CHARREF, NULL); + val = 0; + break; + } + if (val > 0x10FFFF) + outofrange = val; + + NEXT; + count++; + } + if (RAW == ';') { + /* on purpose to avoid reentrancy problems with NEXT and SKIP */ + ctxt->input->col++; + ctxt->nbChars ++; + ctxt->input->cur++; + } + } else { + xmlFatalErr(ctxt, XML_ERR_INVALID_CHARREF, NULL); + } + + /* + * [ WFC: Legal Character ] + * Characters referred to using character references must match the + * production for Char. + */ + if ((IS_CHAR(val) && (outofrange == 0))) { + return(val); + } else { + xmlFatalErrMsgInt(ctxt, XML_ERR_INVALID_CHAR, + "xmlParseCharRef: invalid xmlChar value %d\n", + val); + } + return(0); +} + +/** + * xmlParseStringCharRef: + * @ctxt: an XML parser context + * @str: a pointer to an index in the string + * + * parse Reference declarations, variant parsing from a string rather + * than an an input flow. + * + * [66] CharRef ::= '&#' [0-9]+ ';' | + * '&#x' [0-9a-fA-F]+ ';' + * + * [ WFC: Legal Character ] + * Characters referred to using character references must match the + * production for Char. + * + * Returns the value parsed (as an int), 0 in case of error, str will be + * updated to the current value of the index + */ +static int +xmlParseStringCharRef(xmlParserCtxtPtr ctxt, const xmlChar **str) { + const xmlChar *ptr; + xmlChar cur; + unsigned int val = 0; + unsigned int outofrange = 0; + + if ((str == NULL) || (*str == NULL)) return(0); + ptr = *str; + cur = *ptr; + if ((cur == '&') && (ptr[1] == '#') && (ptr[2] == 'x')) { + ptr += 3; + cur = *ptr; + while (cur != ';') { /* Non input consuming loop */ + if ((cur >= '0') && (cur <= '9')) + val = val * 16 + (cur - '0'); + else if ((cur >= 'a') && (cur <= 'f')) + val = val * 16 + (cur - 'a') + 10; + else if ((cur >= 'A') && (cur <= 'F')) + val = val * 16 + (cur - 'A') + 10; + else { + xmlFatalErr(ctxt, XML_ERR_INVALID_HEX_CHARREF, NULL); + val = 0; + break; + } + if (val > 0x10FFFF) + outofrange = val; + + ptr++; + cur = *ptr; + } + if (cur == ';') + ptr++; + } else if ((cur == '&') && (ptr[1] == '#')){ + ptr += 2; + cur = *ptr; + while (cur != ';') { /* Non input consuming loops */ + if ((cur >= '0') && (cur <= '9')) + val = val * 10 + (cur - '0'); + else { + xmlFatalErr(ctxt, XML_ERR_INVALID_DEC_CHARREF, NULL); + val = 0; + break; + } + if (val > 0x10FFFF) + outofrange = val; + + ptr++; + cur = *ptr; + } + if (cur == ';') + ptr++; + } else { + xmlFatalErr(ctxt, XML_ERR_INVALID_CHARREF, NULL); + return(0); + } + *str = ptr; + + /* + * [ WFC: Legal Character ] + * Characters referred to using character references must match the + * production for Char. + */ + if ((IS_CHAR(val) && (outofrange == 0))) { + return(val); + } else { + xmlFatalErrMsgInt(ctxt, XML_ERR_INVALID_CHAR, + "xmlParseStringCharRef: invalid xmlChar value %d\n", + val); + } + return(0); +} + +/** + * xmlNewBlanksWrapperInputStream: + * @ctxt: an XML parser context + * @entity: an Entity pointer + * + * Create a new input stream for wrapping + * blanks around a PEReference + * + * Returns the new input stream or NULL + */ + +static void deallocblankswrapper (xmlChar *str) {xmlFree(str);} + +static xmlParserInputPtr +xmlNewBlanksWrapperInputStream(xmlParserCtxtPtr ctxt, xmlEntityPtr entity) { + xmlParserInputPtr input; + xmlChar *buffer; + size_t length; + if (entity == NULL) { + xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, + "xmlNewBlanksWrapperInputStream entity\n"); + return(NULL); + } + if (xmlParserDebugEntities) + xmlGenericError(xmlGenericErrorContext, + "new blanks wrapper for entity: %s\n", entity->name); + input = xmlNewInputStream(ctxt); + if (input == NULL) { + return(NULL); + } + length = xmlStrlen(entity->name) + 5; + buffer = xmlMallocAtomic(length); + if (buffer == NULL) { + xmlErrMemory(ctxt, NULL); + xmlFree(input); + return(NULL); + } + buffer [0] = ' '; + buffer [1] = '%'; + buffer [length-3] = ';'; + buffer [length-2] = ' '; + buffer [length-1] = 0; + memcpy(buffer + 2, entity->name, length - 5); + input->free = deallocblankswrapper; + input->base = buffer; + input->cur = buffer; + input->length = length; + input->end = &buffer[length]; + return(input); +} + +/** + * xmlParserHandlePEReference: + * @ctxt: the parser context + * + * [69] PEReference ::= '%' Name ';' + * + * [ WFC: No Recursion ] + * A parsed entity must not contain a recursive + * reference to itself, either directly or indirectly. + * + * [ WFC: Entity Declared ] + * In a document without any DTD, a document with only an internal DTD + * subset which contains no parameter entity references, or a document + * with "standalone='yes'", ... ... The declaration of a parameter + * entity must precede any reference to it... + * + * [ VC: Entity Declared ] + * In a document with an external subset or external parameter entities + * with "standalone='no'", ... ... The declaration of a parameter entity + * must precede any reference to it... + * + * [ WFC: In DTD ] + * Parameter-entity references may only appear in the DTD. + * NOTE: misleading but this is handled. + * + * A PEReference may have been detected in the current input stream + * the handling is done accordingly to + * http://www.w3.org/TR/REC-xml#entproc + * i.e. + * - Included in literal in entity values + * - Included as Parameter Entity reference within DTDs + */ +void +xmlParserHandlePEReference(xmlParserCtxtPtr ctxt) { + const xmlChar *name; + xmlEntityPtr entity = NULL; + xmlParserInputPtr input; + + if (RAW != '%') return; + switch(ctxt->instate) { + case XML_PARSER_CDATA_SECTION: + return; + case XML_PARSER_COMMENT: + return; + case XML_PARSER_START_TAG: + return; + case XML_PARSER_END_TAG: + return; + case XML_PARSER_EOF: + xmlFatalErr(ctxt, XML_ERR_PEREF_AT_EOF, NULL); + return; + case XML_PARSER_PROLOG: + case XML_PARSER_START: + case XML_PARSER_MISC: + xmlFatalErr(ctxt, XML_ERR_PEREF_IN_PROLOG, NULL); + return; + case XML_PARSER_ENTITY_DECL: + case XML_PARSER_CONTENT: + case XML_PARSER_ATTRIBUTE_VALUE: + case XML_PARSER_PI: + case XML_PARSER_SYSTEM_LITERAL: + case XML_PARSER_PUBLIC_LITERAL: + /* we just ignore it there */ + return; + case XML_PARSER_EPILOG: + xmlFatalErr(ctxt, XML_ERR_PEREF_IN_EPILOG, NULL); + return; + case XML_PARSER_ENTITY_VALUE: + /* + * NOTE: in the case of entity values, we don't do the + * substitution here since we need the literal + * entity value to be able to save the internal + * subset of the document. + * This will be handled by xmlStringDecodeEntities + */ + return; + case XML_PARSER_DTD: + /* + * [WFC: Well-Formedness Constraint: PEs in Internal Subset] + * In the internal DTD subset, parameter-entity references + * can occur only where markup declarations can occur, not + * within markup declarations. + * In that case this is handled in xmlParseMarkupDecl + */ + if ((ctxt->external == 0) && (ctxt->inputNr == 1)) + return; + if (IS_BLANK_CH(NXT(1)) || NXT(1) == 0) + return; + break; + case XML_PARSER_IGNORE: + return; + } + + NEXT; + name = xmlParseName(ctxt); + if (xmlParserDebugEntities) + xmlGenericError(xmlGenericErrorContext, + "PEReference: %s\n", name); + if (name == NULL) { + xmlFatalErr(ctxt, XML_ERR_PEREF_NO_NAME, NULL); + } else { + if (RAW == ';') { + NEXT; + if ((ctxt->sax != NULL) && (ctxt->sax->getParameterEntity != NULL)) + entity = ctxt->sax->getParameterEntity(ctxt->userData, name); + if (ctxt->instate == XML_PARSER_EOF) + return; + if (entity == NULL) { + + /* + * [ WFC: Entity Declared ] + * In a document without any DTD, a document with only an + * internal DTD subset which contains no parameter entity + * references, or a document with "standalone='yes'", ... + * ... The declaration of a parameter entity must precede + * any reference to it... + */ + if ((ctxt->standalone == 1) || + ((ctxt->hasExternalSubset == 0) && + (ctxt->hasPErefs == 0))) { + xmlFatalErrMsgStr(ctxt, XML_ERR_UNDECLARED_ENTITY, + "PEReference: %%%s; not found\n", name); + } else { + /* + * [ VC: Entity Declared ] + * In a document with an external subset or external + * parameter entities with "standalone='no'", ... + * ... The declaration of a parameter entity must precede + * any reference to it... + */ + if ((ctxt->validate) && (ctxt->vctxt.error != NULL)) { + xmlValidityError(ctxt, XML_WAR_UNDECLARED_ENTITY, + "PEReference: %%%s; not found\n", + name, NULL); + } else + xmlWarningMsg(ctxt, XML_WAR_UNDECLARED_ENTITY, + "PEReference: %%%s; not found\n", + name, NULL); + ctxt->valid = 0; + } + } else if (ctxt->input->free != deallocblankswrapper) { + input = xmlNewBlanksWrapperInputStream(ctxt, entity); + if (xmlPushInput(ctxt, input) < 0) + return; + } else { + if ((entity->etype == XML_INTERNAL_PARAMETER_ENTITY) || + (entity->etype == XML_EXTERNAL_PARAMETER_ENTITY)) { + xmlChar start[4]; + xmlCharEncoding enc; + + /* + * handle the extra spaces added before and after + * c.f. http://www.w3.org/TR/REC-xml#as-PE + * this is done independently. + */ + input = xmlNewEntityInputStream(ctxt, entity); + if (xmlPushInput(ctxt, input) < 0) + return; + + /* + * Get the 4 first bytes and decode the charset + * if enc != XML_CHAR_ENCODING_NONE + * plug some encoding conversion routines. + * Note that, since we may have some non-UTF8 + * encoding (like UTF16, bug 135229), the 'length' + * is not known, but we can calculate based upon + * the amount of data in the buffer. + */ + GROW + if (ctxt->instate == XML_PARSER_EOF) + return; + if ((ctxt->input->end - ctxt->input->cur)>=4) { + start[0] = RAW; + start[1] = NXT(1); + start[2] = NXT(2); + start[3] = NXT(3); + enc = xmlDetectCharEncoding(start, 4); + if (enc != XML_CHAR_ENCODING_NONE) { + xmlSwitchEncoding(ctxt, enc); + } + } + + if ((entity->etype == XML_EXTERNAL_PARAMETER_ENTITY) && + (CMP5(CUR_PTR, '<', '?', 'x', 'm', 'l' )) && + (IS_BLANK_CH(NXT(5)))) { + xmlParseTextDecl(ctxt); + } + } else { + xmlFatalErrMsgStr(ctxt, XML_ERR_ENTITY_IS_PARAMETER, + "PEReference: %s is not a parameter entity\n", + name); + } + } + } else { + xmlFatalErr(ctxt, XML_ERR_PEREF_SEMICOL_MISSING, NULL); + } + } +} + +/* + * Macro used to grow the current buffer. + * buffer##_size is expected to be a size_t + * mem_error: is expected to handle memory allocation failures + */ +#define growBuffer(buffer, n) { \ + xmlChar *tmp; \ + size_t new_size = buffer##_size * 2 + n; \ + if (new_size < buffer##_size) goto mem_error; \ + tmp = (xmlChar *) xmlRealloc(buffer, new_size); \ + if (tmp == NULL) goto mem_error; \ + buffer = tmp; \ + buffer##_size = new_size; \ +} + +/** + * xmlStringLenDecodeEntities: + * @ctxt: the parser context + * @str: the input string + * @len: the string length + * @what: combination of XML_SUBSTITUTE_REF and XML_SUBSTITUTE_PEREF + * @end: an end marker xmlChar, 0 if none + * @end2: an end marker xmlChar, 0 if none + * @end3: an end marker xmlChar, 0 if none + * + * Takes a entity string content and process to do the adequate substitutions. + * + * [67] Reference ::= EntityRef | CharRef + * + * [69] PEReference ::= '%' Name ';' + * + * Returns A newly allocated string with the substitution done. The caller + * must deallocate it ! + */ +xmlChar * +xmlStringLenDecodeEntities(xmlParserCtxtPtr ctxt, const xmlChar *str, int len, + int what, xmlChar end, xmlChar end2, xmlChar end3) { + xmlChar *buffer = NULL; + size_t buffer_size = 0; + size_t nbchars = 0; + + xmlChar *current = NULL; + xmlChar *rep = NULL; + const xmlChar *last; + xmlEntityPtr ent; + int c,l; + + if ((ctxt == NULL) || (str == NULL) || (len < 0)) + return(NULL); + last = str + len; + + if (((ctxt->depth > 40) && + ((ctxt->options & XML_PARSE_HUGE) == 0)) || + (ctxt->depth > 1024)) { + xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL); + return(NULL); + } + + /* + * allocate a translation buffer. + */ + buffer_size = XML_PARSER_BIG_BUFFER_SIZE; + buffer = (xmlChar *) xmlMallocAtomic(buffer_size); + if (buffer == NULL) goto mem_error; + + /* + * OK loop until we reach one of the ending char or a size limit. + * we are operating on already parsed values. + */ + if (str < last) + c = CUR_SCHAR(str, l); + else + c = 0; + while ((c != 0) && (c != end) && /* non input consuming loop */ + (c != end2) && (c != end3)) { + + if (c == 0) break; + if ((c == '&') && (str[1] == '#')) { + int val = xmlParseStringCharRef(ctxt, &str); + if (val != 0) { + COPY_BUF(0,buffer,nbchars,val); + } + if (nbchars + XML_PARSER_BUFFER_SIZE > buffer_size) { + growBuffer(buffer, XML_PARSER_BUFFER_SIZE); + } + } else if ((c == '&') && (what & XML_SUBSTITUTE_REF)) { + if (xmlParserDebugEntities) + xmlGenericError(xmlGenericErrorContext, + "String decoding Entity Reference: %.30s\n", + str); + ent = xmlParseStringEntityRef(ctxt, &str); + if ((ctxt->lastError.code == XML_ERR_ENTITY_LOOP) || + (ctxt->lastError.code == XML_ERR_INTERNAL_ERROR)) + goto int_error; + if (ent != NULL) + ctxt->nbentities += ent->checked / 2; + if ((ent != NULL) && + (ent->etype == XML_INTERNAL_PREDEFINED_ENTITY)) { + if (ent->content != NULL) { + COPY_BUF(0,buffer,nbchars,ent->content[0]); + if (nbchars + XML_PARSER_BUFFER_SIZE > buffer_size) { + growBuffer(buffer, XML_PARSER_BUFFER_SIZE); + } + } else { + xmlFatalErrMsg(ctxt, XML_ERR_INTERNAL_ERROR, + "predefined entity has no content\n"); + } + } else if ((ent != NULL) && (ent->content != NULL)) { + ctxt->depth++; + rep = xmlStringDecodeEntities(ctxt, ent->content, what, + 0, 0, 0); + ctxt->depth--; + + if (rep != NULL) { + current = rep; + while (*current != 0) { /* non input consuming loop */ + buffer[nbchars++] = *current++; + if (nbchars + XML_PARSER_BUFFER_SIZE > buffer_size) { + if (xmlParserEntityCheck(ctxt, nbchars, ent, 0)) + goto int_error; + growBuffer(buffer, XML_PARSER_BUFFER_SIZE); + } + } + xmlFree(rep); + rep = NULL; + } + } else if (ent != NULL) { + int i = xmlStrlen(ent->name); + const xmlChar *cur = ent->name; + + buffer[nbchars++] = '&'; + if (nbchars + i + XML_PARSER_BUFFER_SIZE > buffer_size) { + growBuffer(buffer, i + XML_PARSER_BUFFER_SIZE); + } + for (;i > 0;i--) + buffer[nbchars++] = *cur++; + buffer[nbchars++] = ';'; + } + } else if (c == '%' && (what & XML_SUBSTITUTE_PEREF)) { + if (xmlParserDebugEntities) + xmlGenericError(xmlGenericErrorContext, + "String decoding PE Reference: %.30s\n", str); + ent = xmlParseStringPEReference(ctxt, &str); + if (ctxt->lastError.code == XML_ERR_ENTITY_LOOP) + goto int_error; + if (ent != NULL) + ctxt->nbentities += ent->checked / 2; + if (ent != NULL) { + if (ent->content == NULL) { + xmlLoadEntityContent(ctxt, ent); + } + ctxt->depth++; + rep = xmlStringDecodeEntities(ctxt, ent->content, what, + 0, 0, 0); + ctxt->depth--; + if (rep != NULL) { + current = rep; + while (*current != 0) { /* non input consuming loop */ + buffer[nbchars++] = *current++; + if (nbchars + XML_PARSER_BUFFER_SIZE > buffer_size) { + if (xmlParserEntityCheck(ctxt, nbchars, ent, 0)) + goto int_error; + growBuffer(buffer, XML_PARSER_BUFFER_SIZE); + } + } + xmlFree(rep); + rep = NULL; + } + } + } else { + COPY_BUF(l,buffer,nbchars,c); + str += l; + if (nbchars + XML_PARSER_BUFFER_SIZE > buffer_size) { + growBuffer(buffer, XML_PARSER_BUFFER_SIZE); + } + } + if (str < last) + c = CUR_SCHAR(str, l); + else + c = 0; + } + buffer[nbchars] = 0; + return(buffer); + +mem_error: + xmlErrMemory(ctxt, NULL); +int_error: + if (rep != NULL) + xmlFree(rep); + if (buffer != NULL) + xmlFree(buffer); + return(NULL); +} + +/** + * xmlStringDecodeEntities: + * @ctxt: the parser context + * @str: the input string + * @what: combination of XML_SUBSTITUTE_REF and XML_SUBSTITUTE_PEREF + * @end: an end marker xmlChar, 0 if none + * @end2: an end marker xmlChar, 0 if none + * @end3: an end marker xmlChar, 0 if none + * + * Takes a entity string content and process to do the adequate substitutions. + * + * [67] Reference ::= EntityRef | CharRef + * + * [69] PEReference ::= '%' Name ';' + * + * Returns A newly allocated string with the substitution done. The caller + * must deallocate it ! + */ +xmlChar * +xmlStringDecodeEntities(xmlParserCtxtPtr ctxt, const xmlChar *str, int what, + xmlChar end, xmlChar end2, xmlChar end3) { + if ((ctxt == NULL) || (str == NULL)) return(NULL); + return(xmlStringLenDecodeEntities(ctxt, str, xmlStrlen(str), what, + end, end2, end3)); +} + +/************************************************************************ + * * + * Commodity functions, cleanup needed ? * + * * + ************************************************************************/ + +/** + * areBlanks: + * @ctxt: an XML parser context + * @str: a xmlChar * + * @len: the size of @str + * @blank_chars: we know the chars are blanks + * + * Is this a sequence of blank chars that one can ignore ? + * + * Returns 1 if ignorable 0 otherwise. + */ + +static int areBlanks(xmlParserCtxtPtr ctxt, const xmlChar *str, int len, + int blank_chars) { + int i, ret; + xmlNodePtr lastChild; + + /* + * Don't spend time trying to differentiate them, the same callback is + * used ! + */ + if (ctxt->sax->ignorableWhitespace == ctxt->sax->characters) + return(0); + + /* + * Check for xml:space value. + */ + if ((ctxt->space == NULL) || (*(ctxt->space) == 1) || + (*(ctxt->space) == -2)) + return(0); + + /* + * Check that the string is made of blanks + */ + if (blank_chars == 0) { + for (i = 0;i < len;i++) + if (!(IS_BLANK_CH(str[i]))) return(0); + } + + /* + * Look if the element is mixed content in the DTD if available + */ + if (ctxt->node == NULL) return(0); + if (ctxt->myDoc != NULL) { + ret = xmlIsMixedElement(ctxt->myDoc, ctxt->node->name); + if (ret == 0) return(1); + if (ret == 1) return(0); + } + + /* + * Otherwise, heuristic :-\ + */ + if ((RAW != '<') && (RAW != 0xD)) return(0); + if ((ctxt->node->children == NULL) && + (RAW == '<') && (NXT(1) == '/')) return(0); + + lastChild = xmlGetLastChild(ctxt->node); + if (lastChild == NULL) { + if ((ctxt->node->type != XML_ELEMENT_NODE) && + (ctxt->node->content != NULL)) return(0); + } else if (xmlNodeIsText(lastChild)) + return(0); + else if ((ctxt->node->children != NULL) && + (xmlNodeIsText(ctxt->node->children))) + return(0); + return(1); +} + +/************************************************************************ + * * + * Extra stuff for namespace support * + * Relates to http://www.w3.org/TR/WD-xml-names * + * * + ************************************************************************/ + +/** + * xmlSplitQName: + * @ctxt: an XML parser context + * @name: an XML parser context + * @prefix: a xmlChar ** + * + * parse an UTF8 encoded XML qualified name string + * + * [NS 5] QName ::= (Prefix ':')? LocalPart + * + * [NS 6] Prefix ::= NCName + * + * [NS 7] LocalPart ::= NCName + * + * Returns the local part, and prefix is updated + * to get the Prefix if any. + */ + +xmlChar * +xmlSplitQName(xmlParserCtxtPtr ctxt, const xmlChar *name, xmlChar **prefix) { + xmlChar buf[XML_MAX_NAMELEN + 5]; + xmlChar *buffer = NULL; + int len = 0; + int max = XML_MAX_NAMELEN; + xmlChar *ret = NULL; + const xmlChar *cur = name; + int c; + + if (prefix == NULL) return(NULL); + *prefix = NULL; + + if (cur == NULL) return(NULL); + +#ifndef XML_XML_NAMESPACE + /* xml: prefix is not really a namespace */ + if ((cur[0] == 'x') && (cur[1] == 'm') && + (cur[2] == 'l') && (cur[3] == ':')) + return(xmlStrdup(name)); +#endif + + /* nasty but well=formed */ + if (cur[0] == ':') + return(xmlStrdup(name)); + + c = *cur++; + while ((c != 0) && (c != ':') && (len < max)) { /* tested bigname.xml */ + buf[len++] = c; + c = *cur++; + } + if (len >= max) { + /* + * Okay someone managed to make a huge name, so he's ready to pay + * for the processing speed. + */ + max = len * 2; + + buffer = (xmlChar *) xmlMallocAtomic(max * sizeof(xmlChar)); + if (buffer == NULL) { + xmlErrMemory(ctxt, NULL); + return(NULL); + } + memcpy(buffer, buf, len); + while ((c != 0) && (c != ':')) { /* tested bigname.xml */ + if (len + 10 > max) { + xmlChar *tmp; + + max *= 2; + tmp = (xmlChar *) xmlRealloc(buffer, + max * sizeof(xmlChar)); + if (tmp == NULL) { + xmlFree(buffer); + xmlErrMemory(ctxt, NULL); + return(NULL); + } + buffer = tmp; + } + buffer[len++] = c; + c = *cur++; + } + buffer[len] = 0; + } + + if ((c == ':') && (*cur == 0)) { + if (buffer != NULL) + xmlFree(buffer); + *prefix = NULL; + return(xmlStrdup(name)); + } + + if (buffer == NULL) + ret = xmlStrndup(buf, len); + else { + ret = buffer; + buffer = NULL; + max = XML_MAX_NAMELEN; + } + + + if (c == ':') { + c = *cur; + *prefix = ret; + if (c == 0) { + return(xmlStrndup(BAD_CAST "", 0)); + } + len = 0; + + /* + * Check that the first character is proper to start + * a new name + */ + if (!(((c >= 0x61) && (c <= 0x7A)) || + ((c >= 0x41) && (c <= 0x5A)) || + (c == '_') || (c == ':'))) { + int l; + int first = CUR_SCHAR(cur, l); + + if (!IS_LETTER(first) && (first != '_')) { + xmlFatalErrMsgStr(ctxt, XML_NS_ERR_QNAME, + "Name %s is not XML Namespace compliant\n", + name); + } + } + cur++; + + while ((c != 0) && (len < max)) { /* tested bigname2.xml */ + buf[len++] = c; + c = *cur++; + } + if (len >= max) { + /* + * Okay someone managed to make a huge name, so he's ready to pay + * for the processing speed. + */ + max = len * 2; + + buffer = (xmlChar *) xmlMallocAtomic(max * sizeof(xmlChar)); + if (buffer == NULL) { + xmlErrMemory(ctxt, NULL); + return(NULL); + } + memcpy(buffer, buf, len); + while (c != 0) { /* tested bigname2.xml */ + if (len + 10 > max) { + xmlChar *tmp; + + max *= 2; + tmp = (xmlChar *) xmlRealloc(buffer, + max * sizeof(xmlChar)); + if (tmp == NULL) { + xmlErrMemory(ctxt, NULL); + xmlFree(buffer); + return(NULL); + } + buffer = tmp; + } + buffer[len++] = c; + c = *cur++; + } + buffer[len] = 0; + } + + if (buffer == NULL) + ret = xmlStrndup(buf, len); + else { + ret = buffer; + } + } + + return(ret); +} + +/************************************************************************ + * * + * The parser itself * + * Relates to http://www.w3.org/TR/REC-xml * + * * + ************************************************************************/ + +/************************************************************************ + * * + * Routines to parse Name, NCName and NmToken * + * * + ************************************************************************/ +#ifdef DEBUG +static unsigned long nbParseName = 0; +static unsigned long nbParseNmToken = 0; +static unsigned long nbParseNCName = 0; +static unsigned long nbParseNCNameComplex = 0; +static unsigned long nbParseNameComplex = 0; +static unsigned long nbParseStringName = 0; +#endif + +/* + * The two following functions are related to the change of accepted + * characters for Name and NmToken in the Revision 5 of XML-1.0 + * They correspond to the modified production [4] and the new production [4a] + * changes in that revision. Also note that the macros used for the + * productions Letter, Digit, CombiningChar and Extender are not needed + * anymore. + * We still keep compatibility to pre-revision5 parsing semantic if the + * new XML_PARSE_OLD10 option is given to the parser. + */ +static int +xmlIsNameStartChar(xmlParserCtxtPtr ctxt, int c) { + if ((ctxt->options & XML_PARSE_OLD10) == 0) { + /* + * Use the new checks of production [4] [4a] amd [5] of the + * Update 5 of XML-1.0 + */ + if ((c != ' ') && (c != '>') && (c != '/') && /* accelerators */ + (((c >= 'a') && (c <= 'z')) || + ((c >= 'A') && (c <= 'Z')) || + (c == '_') || (c == ':') || + ((c >= 0xC0) && (c <= 0xD6)) || + ((c >= 0xD8) && (c <= 0xF6)) || + ((c >= 0xF8) && (c <= 0x2FF)) || + ((c >= 0x370) && (c <= 0x37D)) || + ((c >= 0x37F) && (c <= 0x1FFF)) || + ((c >= 0x200C) && (c <= 0x200D)) || + ((c >= 0x2070) && (c <= 0x218F)) || + ((c >= 0x2C00) && (c <= 0x2FEF)) || + ((c >= 0x3001) && (c <= 0xD7FF)) || + ((c >= 0xF900) && (c <= 0xFDCF)) || + ((c >= 0xFDF0) && (c <= 0xFFFD)) || + ((c >= 0x10000) && (c <= 0xEFFFF)))) + return(1); + } else { + if (IS_LETTER(c) || (c == '_') || (c == ':')) + return(1); + } + return(0); +} + +static int +xmlIsNameChar(xmlParserCtxtPtr ctxt, int c) { + if ((ctxt->options & XML_PARSE_OLD10) == 0) { + /* + * Use the new checks of production [4] [4a] amd [5] of the + * Update 5 of XML-1.0 + */ + if ((c != ' ') && (c != '>') && (c != '/') && /* accelerators */ + (((c >= 'a') && (c <= 'z')) || + ((c >= 'A') && (c <= 'Z')) || + ((c >= '0') && (c <= '9')) || /* !start */ + (c == '_') || (c == ':') || + (c == '-') || (c == '.') || (c == 0xB7) || /* !start */ + ((c >= 0xC0) && (c <= 0xD6)) || + ((c >= 0xD8) && (c <= 0xF6)) || + ((c >= 0xF8) && (c <= 0x2FF)) || + ((c >= 0x300) && (c <= 0x36F)) || /* !start */ + ((c >= 0x370) && (c <= 0x37D)) || + ((c >= 0x37F) && (c <= 0x1FFF)) || + ((c >= 0x200C) && (c <= 0x200D)) || + ((c >= 0x203F) && (c <= 0x2040)) || /* !start */ + ((c >= 0x2070) && (c <= 0x218F)) || + ((c >= 0x2C00) && (c <= 0x2FEF)) || + ((c >= 0x3001) && (c <= 0xD7FF)) || + ((c >= 0xF900) && (c <= 0xFDCF)) || + ((c >= 0xFDF0) && (c <= 0xFFFD)) || + ((c >= 0x10000) && (c <= 0xEFFFF)))) + return(1); + } else { + if ((IS_LETTER(c)) || (IS_DIGIT(c)) || + (c == '.') || (c == '-') || + (c == '_') || (c == ':') || + (IS_COMBINING(c)) || + (IS_EXTENDER(c))) + return(1); + } + return(0); +} + +static xmlChar * xmlParseAttValueInternal(xmlParserCtxtPtr ctxt, + int *len, int *alloc, int normalize); + +static const xmlChar * +xmlParseNameComplex(xmlParserCtxtPtr ctxt) { + int len = 0, l; + int c; + int count = 0; + +#ifdef DEBUG + nbParseNameComplex++; +#endif + + /* + * Handler for more complex cases + */ + GROW; + if (ctxt->instate == XML_PARSER_EOF) + return(NULL); + c = CUR_CHAR(l); + if ((ctxt->options & XML_PARSE_OLD10) == 0) { + /* + * Use the new checks of production [4] [4a] amd [5] of the + * Update 5 of XML-1.0 + */ + if ((c == ' ') || (c == '>') || (c == '/') || /* accelerators */ + (!(((c >= 'a') && (c <= 'z')) || + ((c >= 'A') && (c <= 'Z')) || + (c == '_') || (c == ':') || + ((c >= 0xC0) && (c <= 0xD6)) || + ((c >= 0xD8) && (c <= 0xF6)) || + ((c >= 0xF8) && (c <= 0x2FF)) || + ((c >= 0x370) && (c <= 0x37D)) || + ((c >= 0x37F) && (c <= 0x1FFF)) || + ((c >= 0x200C) && (c <= 0x200D)) || + ((c >= 0x2070) && (c <= 0x218F)) || + ((c >= 0x2C00) && (c <= 0x2FEF)) || + ((c >= 0x3001) && (c <= 0xD7FF)) || + ((c >= 0xF900) && (c <= 0xFDCF)) || + ((c >= 0xFDF0) && (c <= 0xFFFD)) || + ((c >= 0x10000) && (c <= 0xEFFFF))))) { + return(NULL); + } + len += l; + NEXTL(l); + c = CUR_CHAR(l); + while ((c != ' ') && (c != '>') && (c != '/') && /* accelerators */ + (((c >= 'a') && (c <= 'z')) || + ((c >= 'A') && (c <= 'Z')) || + ((c >= '0') && (c <= '9')) || /* !start */ + (c == '_') || (c == ':') || + (c == '-') || (c == '.') || (c == 0xB7) || /* !start */ + ((c >= 0xC0) && (c <= 0xD6)) || + ((c >= 0xD8) && (c <= 0xF6)) || + ((c >= 0xF8) && (c <= 0x2FF)) || + ((c >= 0x300) && (c <= 0x36F)) || /* !start */ + ((c >= 0x370) && (c <= 0x37D)) || + ((c >= 0x37F) && (c <= 0x1FFF)) || + ((c >= 0x200C) && (c <= 0x200D)) || + ((c >= 0x203F) && (c <= 0x2040)) || /* !start */ + ((c >= 0x2070) && (c <= 0x218F)) || + ((c >= 0x2C00) && (c <= 0x2FEF)) || + ((c >= 0x3001) && (c <= 0xD7FF)) || + ((c >= 0xF900) && (c <= 0xFDCF)) || + ((c >= 0xFDF0) && (c <= 0xFFFD)) || + ((c >= 0x10000) && (c <= 0xEFFFF)) + )) { + if (count++ > XML_PARSER_CHUNK_SIZE) { + count = 0; + GROW; + if (ctxt->instate == XML_PARSER_EOF) + return(NULL); + } + len += l; + NEXTL(l); + c = CUR_CHAR(l); + } + } else { + if ((c == ' ') || (c == '>') || (c == '/') || /* accelerators */ + (!IS_LETTER(c) && (c != '_') && + (c != ':'))) { + return(NULL); + } + len += l; + NEXTL(l); + c = CUR_CHAR(l); + + while ((c != ' ') && (c != '>') && (c != '/') && /* test bigname.xml */ + ((IS_LETTER(c)) || (IS_DIGIT(c)) || + (c == '.') || (c == '-') || + (c == '_') || (c == ':') || + (IS_COMBINING(c)) || + (IS_EXTENDER(c)))) { + if (count++ > XML_PARSER_CHUNK_SIZE) { + count = 0; + GROW; + if (ctxt->instate == XML_PARSER_EOF) + return(NULL); + } + len += l; + NEXTL(l); + c = CUR_CHAR(l); + if (c == 0) { + count = 0; + GROW; + if (ctxt->instate == XML_PARSER_EOF) + return(NULL); + c = CUR_CHAR(l); + } + } + } + if ((len > XML_MAX_NAME_LENGTH) && + ((ctxt->options & XML_PARSE_HUGE) == 0)) { + xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "Name"); + return(NULL); + } + if ((*ctxt->input->cur == '\n') && (ctxt->input->cur[-1] == '\r')) + return(xmlDictLookup(ctxt->dict, ctxt->input->cur - (len + 1), len)); + return(xmlDictLookup(ctxt->dict, ctxt->input->cur - len, len)); +} + +/** + * xmlParseName: + * @ctxt: an XML parser context + * + * parse an XML name. + * + * [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | + * CombiningChar | Extender + * + * [5] Name ::= (Letter | '_' | ':') (NameChar)* + * + * [6] Names ::= Name (#x20 Name)* + * + * Returns the Name parsed or NULL + */ + +const xmlChar * +xmlParseName(xmlParserCtxtPtr ctxt) { + const xmlChar *in; + const xmlChar *ret; + int count = 0; + + GROW; + +#ifdef DEBUG + nbParseName++; +#endif + + /* + * Accelerator for simple ASCII names + */ + in = ctxt->input->cur; + if (((*in >= 0x61) && (*in <= 0x7A)) || + ((*in >= 0x41) && (*in <= 0x5A)) || + (*in == '_') || (*in == ':')) { + in++; + while (((*in >= 0x61) && (*in <= 0x7A)) || + ((*in >= 0x41) && (*in <= 0x5A)) || + ((*in >= 0x30) && (*in <= 0x39)) || + (*in == '_') || (*in == '-') || + (*in == ':') || (*in == '.')) + in++; + if ((*in > 0) && (*in < 0x80)) { + count = in - ctxt->input->cur; + if ((count > XML_MAX_NAME_LENGTH) && + ((ctxt->options & XML_PARSE_HUGE) == 0)) { + xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "Name"); + return(NULL); + } + ret = xmlDictLookup(ctxt->dict, ctxt->input->cur, count); + ctxt->input->cur = in; + ctxt->nbChars += count; + ctxt->input->col += count; + if (ret == NULL) + xmlErrMemory(ctxt, NULL); + return(ret); + } + } + /* accelerator for special cases */ + return(xmlParseNameComplex(ctxt)); +} + +static const xmlChar * +xmlParseNCNameComplex(xmlParserCtxtPtr ctxt) { + int len = 0, l; + int c; + int count = 0; + +#ifdef DEBUG + nbParseNCNameComplex++; +#endif + + /* + * Handler for more complex cases + */ + GROW; + c = CUR_CHAR(l); + if ((c == ' ') || (c == '>') || (c == '/') || /* accelerators */ + (!xmlIsNameStartChar(ctxt, c) || (c == ':'))) { + return(NULL); + } + + while ((c != ' ') && (c != '>') && (c != '/') && /* test bigname.xml */ + (xmlIsNameChar(ctxt, c) && (c != ':'))) { + if (count++ > XML_PARSER_CHUNK_SIZE) { + if ((len > XML_MAX_NAME_LENGTH) && + ((ctxt->options & XML_PARSE_HUGE) == 0)) { + xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "NCName"); + return(NULL); + } + count = 0; + GROW; + if (ctxt->instate == XML_PARSER_EOF) + return(NULL); + } + len += l; + NEXTL(l); + c = CUR_CHAR(l); + if (c == 0) { + count = 0; + GROW; + if (ctxt->instate == XML_PARSER_EOF) + return(NULL); + c = CUR_CHAR(l); + } + } + if ((len > XML_MAX_NAME_LENGTH) && + ((ctxt->options & XML_PARSE_HUGE) == 0)) { + xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "NCName"); + return(NULL); + } + return(xmlDictLookup(ctxt->dict, ctxt->input->cur - len, len)); +} + +/** + * xmlParseNCName: + * @ctxt: an XML parser context + * @len: length of the string parsed + * + * parse an XML name. + * + * [4NS] NCNameChar ::= Letter | Digit | '.' | '-' | '_' | + * CombiningChar | Extender + * + * [5NS] NCName ::= (Letter | '_') (NCNameChar)* + * + * Returns the Name parsed or NULL + */ + +static const xmlChar * +xmlParseNCName(xmlParserCtxtPtr ctxt) { + const xmlChar *in; + const xmlChar *ret; + int count = 0; + +#ifdef DEBUG + nbParseNCName++; +#endif + + /* + * Accelerator for simple ASCII names + */ + in = ctxt->input->cur; + if (((*in >= 0x61) && (*in <= 0x7A)) || + ((*in >= 0x41) && (*in <= 0x5A)) || + (*in == '_')) { + in++; + while (((*in >= 0x61) && (*in <= 0x7A)) || + ((*in >= 0x41) && (*in <= 0x5A)) || + ((*in >= 0x30) && (*in <= 0x39)) || + (*in == '_') || (*in == '-') || + (*in == '.')) + in++; + if ((*in > 0) && (*in < 0x80)) { + count = in - ctxt->input->cur; + if ((count > XML_MAX_NAME_LENGTH) && + ((ctxt->options & XML_PARSE_HUGE) == 0)) { + xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "NCName"); + return(NULL); + } + ret = xmlDictLookup(ctxt->dict, ctxt->input->cur, count); + ctxt->input->cur = in; + ctxt->nbChars += count; + ctxt->input->col += count; + if (ret == NULL) { + xmlErrMemory(ctxt, NULL); + } + return(ret); + } + } + return(xmlParseNCNameComplex(ctxt)); +} + +/** + * xmlParseNameAndCompare: + * @ctxt: an XML parser context + * + * parse an XML name and compares for match + * (specialized for endtag parsing) + * + * Returns NULL for an illegal name, (xmlChar*) 1 for success + * and the name for mismatch + */ + +static const xmlChar * +xmlParseNameAndCompare(xmlParserCtxtPtr ctxt, xmlChar const *other) { + register const xmlChar *cmp = other; + register const xmlChar *in; + const xmlChar *ret; + + GROW; + if (ctxt->instate == XML_PARSER_EOF) + return(NULL); + + in = ctxt->input->cur; + while (*in != 0 && *in == *cmp) { + ++in; + ++cmp; + ctxt->input->col++; + } + if (*cmp == 0 && (*in == '>' || IS_BLANK_CH (*in))) { + /* success */ + ctxt->input->cur = in; + return (const xmlChar*) 1; + } + /* failure (or end of input buffer), check with full function */ + ret = xmlParseName (ctxt); + /* strings coming from the dictionnary direct compare possible */ + if (ret == other) { + return (const xmlChar*) 1; + } + return ret; +} + +/** + * xmlParseStringName: + * @ctxt: an XML parser context + * @str: a pointer to the string pointer (IN/OUT) + * + * parse an XML name. + * + * [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | + * CombiningChar | Extender + * + * [5] Name ::= (Letter | '_' | ':') (NameChar)* + * + * [6] Names ::= Name (#x20 Name)* + * + * Returns the Name parsed or NULL. The @str pointer + * is updated to the current location in the string. + */ + +static xmlChar * +xmlParseStringName(xmlParserCtxtPtr ctxt, const xmlChar** str) { + xmlChar buf[XML_MAX_NAMELEN + 5]; + const xmlChar *cur = *str; + int len = 0, l; + int c; + +#ifdef DEBUG + nbParseStringName++; +#endif + + c = CUR_SCHAR(cur, l); + if (!xmlIsNameStartChar(ctxt, c)) { + return(NULL); + } + + COPY_BUF(l,buf,len,c); + cur += l; + c = CUR_SCHAR(cur, l); + while (xmlIsNameChar(ctxt, c)) { + COPY_BUF(l,buf,len,c); + cur += l; + c = CUR_SCHAR(cur, l); + if (len >= XML_MAX_NAMELEN) { /* test bigentname.xml */ + /* + * Okay someone managed to make a huge name, so he's ready to pay + * for the processing speed. + */ + xmlChar *buffer; + int max = len * 2; + + buffer = (xmlChar *) xmlMallocAtomic(max * sizeof(xmlChar)); + if (buffer == NULL) { + xmlErrMemory(ctxt, NULL); + return(NULL); + } + memcpy(buffer, buf, len); + while (xmlIsNameChar(ctxt, c)) { + if (len + 10 > max) { + xmlChar *tmp; + + if ((len > XML_MAX_NAME_LENGTH) && + ((ctxt->options & XML_PARSE_HUGE) == 0)) { + xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "NCName"); + xmlFree(buffer); + return(NULL); + } + max *= 2; + tmp = (xmlChar *) xmlRealloc(buffer, + max * sizeof(xmlChar)); + if (tmp == NULL) { + xmlErrMemory(ctxt, NULL); + xmlFree(buffer); + return(NULL); + } + buffer = tmp; + } + COPY_BUF(l,buffer,len,c); + cur += l; + c = CUR_SCHAR(cur, l); + } + buffer[len] = 0; + *str = cur; + return(buffer); + } + } + if ((len > XML_MAX_NAME_LENGTH) && + ((ctxt->options & XML_PARSE_HUGE) == 0)) { + xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "NCName"); + return(NULL); + } + *str = cur; + return(xmlStrndup(buf, len)); +} + +/** + * xmlParseNmtoken: + * @ctxt: an XML parser context + * + * parse an XML Nmtoken. + * + * [7] Nmtoken ::= (NameChar)+ + * + * [8] Nmtokens ::= Nmtoken (#x20 Nmtoken)* + * + * Returns the Nmtoken parsed or NULL + */ + +xmlChar * +xmlParseNmtoken(xmlParserCtxtPtr ctxt) { + xmlChar buf[XML_MAX_NAMELEN + 5]; + int len = 0, l; + int c; + int count = 0; + +#ifdef DEBUG + nbParseNmToken++; +#endif + + GROW; + if (ctxt->instate == XML_PARSER_EOF) + return(NULL); + c = CUR_CHAR(l); + + while (xmlIsNameChar(ctxt, c)) { + if (count++ > XML_PARSER_CHUNK_SIZE) { + count = 0; + GROW; + } + COPY_BUF(l,buf,len,c); + NEXTL(l); + c = CUR_CHAR(l); + if (c == 0) { + count = 0; + GROW; + if (ctxt->instate == XML_PARSER_EOF) + return(NULL); + c = CUR_CHAR(l); + } + if (len >= XML_MAX_NAMELEN) { + /* + * Okay someone managed to make a huge token, so he's ready to pay + * for the processing speed. + */ + xmlChar *buffer; + int max = len * 2; + + buffer = (xmlChar *) xmlMallocAtomic(max * sizeof(xmlChar)); + if (buffer == NULL) { + xmlErrMemory(ctxt, NULL); + return(NULL); + } + memcpy(buffer, buf, len); + while (xmlIsNameChar(ctxt, c)) { + if (count++ > XML_PARSER_CHUNK_SIZE) { + count = 0; + GROW; + if (ctxt->instate == XML_PARSER_EOF) { + xmlFree(buffer); + return(NULL); + } + } + if (len + 10 > max) { + xmlChar *tmp; + + if ((max > XML_MAX_NAME_LENGTH) && + ((ctxt->options & XML_PARSE_HUGE) == 0)) { + xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "NmToken"); + xmlFree(buffer); + return(NULL); + } + max *= 2; + tmp = (xmlChar *) xmlRealloc(buffer, + max * sizeof(xmlChar)); + if (tmp == NULL) { + xmlErrMemory(ctxt, NULL); + xmlFree(buffer); + return(NULL); + } + buffer = tmp; + } + COPY_BUF(l,buffer,len,c); + NEXTL(l); + c = CUR_CHAR(l); + } + buffer[len] = 0; + return(buffer); + } + } + if (len == 0) + return(NULL); + if ((len > XML_MAX_NAME_LENGTH) && + ((ctxt->options & XML_PARSE_HUGE) == 0)) { + xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "NmToken"); + return(NULL); + } + return(xmlStrndup(buf, len)); +} + +/** + * xmlParseEntityValue: + * @ctxt: an XML parser context + * @orig: if non-NULL store a copy of the original entity value + * + * parse a value for ENTITY declarations + * + * [9] EntityValue ::= '"' ([^%&"] | PEReference | Reference)* '"' | + * "'" ([^%&'] | PEReference | Reference)* "'" + * + * Returns the EntityValue parsed with reference substituted or NULL + */ + +xmlChar * +xmlParseEntityValue(xmlParserCtxtPtr ctxt, xmlChar **orig) { + xmlChar *buf = NULL; + int len = 0; + int size = XML_PARSER_BUFFER_SIZE; + int c, l; + xmlChar stop; + xmlChar *ret = NULL; + const xmlChar *cur = NULL; + xmlParserInputPtr input; + + if (RAW == '"') stop = '"'; + else if (RAW == '\'') stop = '\''; + else { + xmlFatalErr(ctxt, XML_ERR_ENTITY_NOT_STARTED, NULL); + return(NULL); + } + buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar)); + if (buf == NULL) { + xmlErrMemory(ctxt, NULL); + return(NULL); + } + + /* + * The content of the entity definition is copied in a buffer. + */ + + ctxt->instate = XML_PARSER_ENTITY_VALUE; + input = ctxt->input; + GROW; + if (ctxt->instate == XML_PARSER_EOF) { + xmlFree(buf); + return(NULL); + } + NEXT; + c = CUR_CHAR(l); + /* + * NOTE: 4.4.5 Included in Literal + * When a parameter entity reference appears in a literal entity + * value, ... a single or double quote character in the replacement + * text is always treated as a normal data character and will not + * terminate the literal. + * In practice it means we stop the loop only when back at parsing + * the initial entity and the quote is found + */ + while (((IS_CHAR(c)) && ((c != stop) || /* checked */ + (ctxt->input != input))) && (ctxt->instate != XML_PARSER_EOF)) { + if (len + 5 >= size) { + xmlChar *tmp; + + size *= 2; + tmp = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar)); + if (tmp == NULL) { + xmlErrMemory(ctxt, NULL); + xmlFree(buf); + return(NULL); + } + buf = tmp; + } + COPY_BUF(l,buf,len,c); + NEXTL(l); + /* + * Pop-up of finished entities. + */ + while ((RAW == 0) && (ctxt->inputNr > 1)) /* non input consuming */ + xmlPopInput(ctxt); + + GROW; + c = CUR_CHAR(l); + if (c == 0) { + GROW; + c = CUR_CHAR(l); + } + } + buf[len] = 0; + if (ctxt->instate == XML_PARSER_EOF) { + xmlFree(buf); + return(NULL); + } + + /* + * Raise problem w.r.t. '&' and '%' being used in non-entities + * reference constructs. Note Charref will be handled in + * xmlStringDecodeEntities() + */ + cur = buf; + while (*cur != 0) { /* non input consuming */ + if ((*cur == '%') || ((*cur == '&') && (cur[1] != '#'))) { + xmlChar *name; + xmlChar tmp = *cur; + + cur++; + name = xmlParseStringName(ctxt, &cur); + if ((name == NULL) || (*cur != ';')) { + xmlFatalErrMsgInt(ctxt, XML_ERR_ENTITY_CHAR_ERROR, + "EntityValue: '%c' forbidden except for entities references\n", + tmp); + } + if ((tmp == '%') && (ctxt->inSubset == 1) && + (ctxt->inputNr == 1)) { + xmlFatalErr(ctxt, XML_ERR_ENTITY_PE_INTERNAL, NULL); + } + if (name != NULL) + xmlFree(name); + if (*cur == 0) + break; + } + cur++; + } + + /* + * Then PEReference entities are substituted. + */ + if (c != stop) { + xmlFatalErr(ctxt, XML_ERR_ENTITY_NOT_FINISHED, NULL); + xmlFree(buf); + } else { + NEXT; + /* + * NOTE: 4.4.7 Bypassed + * When a general entity reference appears in the EntityValue in + * an entity declaration, it is bypassed and left as is. + * so XML_SUBSTITUTE_REF is not set here. + */ + ret = xmlStringDecodeEntities(ctxt, buf, XML_SUBSTITUTE_PEREF, + 0, 0, 0); + if (orig != NULL) + *orig = buf; + else + xmlFree(buf); + } + + return(ret); +} + +/** + * xmlParseAttValueComplex: + * @ctxt: an XML parser context + * @len: the resulting attribute len + * @normalize: wether to apply the inner normalization + * + * parse a value for an attribute, this is the fallback function + * of xmlParseAttValue() when the attribute parsing requires handling + * of non-ASCII characters, or normalization compaction. + * + * Returns the AttValue parsed or NULL. The value has to be freed by the caller. + */ +static xmlChar * +xmlParseAttValueComplex(xmlParserCtxtPtr ctxt, int *attlen, int normalize) { + xmlChar limit = 0; + xmlChar *buf = NULL; + xmlChar *rep = NULL; + size_t len = 0; + size_t buf_size = 0; + int c, l, in_space = 0; + xmlChar *current = NULL; + xmlEntityPtr ent; + + if (NXT(0) == '"') { + ctxt->instate = XML_PARSER_ATTRIBUTE_VALUE; + limit = '"'; + NEXT; + } else if (NXT(0) == '\'') { + limit = '\''; + ctxt->instate = XML_PARSER_ATTRIBUTE_VALUE; + NEXT; + } else { + xmlFatalErr(ctxt, XML_ERR_ATTRIBUTE_NOT_STARTED, NULL); + return(NULL); + } + + /* + * allocate a translation buffer. + */ + buf_size = XML_PARSER_BUFFER_SIZE; + buf = (xmlChar *) xmlMallocAtomic(buf_size); + if (buf == NULL) goto mem_error; + + /* + * OK loop until we reach one of the ending char or a size limit. + */ + c = CUR_CHAR(l); + while (((NXT(0) != limit) && /* checked */ + (IS_CHAR(c)) && (c != '<')) && + (ctxt->instate != XML_PARSER_EOF)) { + /* + * Impose a reasonable limit on attribute size, unless XML_PARSE_HUGE + * special option is given + */ + if ((len > XML_MAX_TEXT_LENGTH) && + ((ctxt->options & XML_PARSE_HUGE) == 0)) { + xmlFatalErrMsg(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED, + "AttValue length too long\n"); + goto mem_error; + } + if (c == 0) break; + if (c == '&') { + in_space = 0; + if (NXT(1) == '#') { + int val = xmlParseCharRef(ctxt); + + if (val == '&') { + if (ctxt->replaceEntities) { + if (len + 10 > buf_size) { + growBuffer(buf, 10); + } + buf[len++] = '&'; + } else { + /* + * The reparsing will be done in xmlStringGetNodeList() + * called by the attribute() function in SAX.c + */ + if (len + 10 > buf_size) { + growBuffer(buf, 10); + } + buf[len++] = '&'; + buf[len++] = '#'; + buf[len++] = '3'; + buf[len++] = '8'; + buf[len++] = ';'; + } + } else if (val != 0) { + if (len + 10 > buf_size) { + growBuffer(buf, 10); + } + len += xmlCopyChar(0, &buf[len], val); + } + } else { + ent = xmlParseEntityRef(ctxt); + ctxt->nbentities++; + if (ent != NULL) + ctxt->nbentities += ent->owner; + if ((ent != NULL) && + (ent->etype == XML_INTERNAL_PREDEFINED_ENTITY)) { + if (len + 10 > buf_size) { + growBuffer(buf, 10); + } + if ((ctxt->replaceEntities == 0) && + (ent->content[0] == '&')) { + buf[len++] = '&'; + buf[len++] = '#'; + buf[len++] = '3'; + buf[len++] = '8'; + buf[len++] = ';'; + } else { + buf[len++] = ent->content[0]; + } + } else if ((ent != NULL) && + (ctxt->replaceEntities != 0)) { + if (ent->etype != XML_INTERNAL_PREDEFINED_ENTITY) { + rep = xmlStringDecodeEntities(ctxt, ent->content, + XML_SUBSTITUTE_REF, + 0, 0, 0); + if (rep != NULL) { + current = rep; + while (*current != 0) { /* non input consuming */ + if ((*current == 0xD) || (*current == 0xA) || + (*current == 0x9)) { + buf[len++] = 0x20; + current++; + } else + buf[len++] = *current++; + if (len + 10 > buf_size) { + growBuffer(buf, 10); + } + } + xmlFree(rep); + rep = NULL; + } + } else { + if (len + 10 > buf_size) { + growBuffer(buf, 10); + } + if (ent->content != NULL) + buf[len++] = ent->content[0]; + } + } else if (ent != NULL) { + int i = xmlStrlen(ent->name); + const xmlChar *cur = ent->name; + + /* + * This may look absurd but is needed to detect + * entities problems + */ + if ((ent->etype != XML_INTERNAL_PREDEFINED_ENTITY) && + (ent->content != NULL) && (ent->checked == 0)) { + unsigned long oldnbent = ctxt->nbentities; + + rep = xmlStringDecodeEntities(ctxt, ent->content, + XML_SUBSTITUTE_REF, 0, 0, 0); + + ent->checked = (ctxt->nbentities - oldnbent + 1) * 2; + if (rep != NULL) { + if (xmlStrchr(rep, '<')) + ent->checked |= 1; + xmlFree(rep); + rep = NULL; + } + } + + /* + * Just output the reference + */ + buf[len++] = '&'; + while (len + i + 10 > buf_size) { + growBuffer(buf, i + 10); + } + for (;i > 0;i--) + buf[len++] = *cur++; + buf[len++] = ';'; + } + } + } else { + if ((c == 0x20) || (c == 0xD) || (c == 0xA) || (c == 0x9)) { + if ((len != 0) || (!normalize)) { + if ((!normalize) || (!in_space)) { + COPY_BUF(l,buf,len,0x20); + while (len + 10 > buf_size) { + growBuffer(buf, 10); + } + } + in_space = 1; + } + } else { + in_space = 0; + COPY_BUF(l,buf,len,c); + if (len + 10 > buf_size) { + growBuffer(buf, 10); + } + } + NEXTL(l); + } + GROW; + c = CUR_CHAR(l); + } + if (ctxt->instate == XML_PARSER_EOF) + goto error; + + if ((in_space) && (normalize)) { + while ((len > 0) && (buf[len - 1] == 0x20)) len--; + } + buf[len] = 0; + if (RAW == '<') { + xmlFatalErr(ctxt, XML_ERR_LT_IN_ATTRIBUTE, NULL); + } else if (RAW != limit) { + if ((c != 0) && (!IS_CHAR(c))) { + xmlFatalErrMsg(ctxt, XML_ERR_INVALID_CHAR, + "invalid character in attribute value\n"); + } else { + xmlFatalErrMsg(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED, + "AttValue: ' expected\n"); + } + } else + NEXT; + + /* + * There we potentially risk an overflow, don't allow attribute value of + * length more than INT_MAX it is a very reasonnable assumption ! + */ + if (len >= INT_MAX) { + xmlFatalErrMsg(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED, + "AttValue length too long\n"); + goto mem_error; + } + + if (attlen != NULL) *attlen = (int) len; + return(buf); + +mem_error: + xmlErrMemory(ctxt, NULL); +error: + if (buf != NULL) + xmlFree(buf); + if (rep != NULL) + xmlFree(rep); + return(NULL); +} + +/** + * xmlParseAttValue: + * @ctxt: an XML parser context + * + * parse a value for an attribute + * Note: the parser won't do substitution of entities here, this + * will be handled later in xmlStringGetNodeList + * + * [10] AttValue ::= '"' ([^<&"] | Reference)* '"' | + * "'" ([^<&'] | Reference)* "'" + * + * 3.3.3 Attribute-Value Normalization: + * Before the value of an attribute is passed to the application or + * checked for validity, the XML processor must normalize it as follows: + * - a character reference is processed by appending the referenced + * character to the attribute value + * - an entity reference is processed by recursively processing the + * replacement text of the entity + * - a whitespace character (#x20, #xD, #xA, #x9) is processed by + * appending #x20 to the normalized value, except that only a single + * #x20 is appended for a "#xD#xA" sequence that is part of an external + * parsed entity or the literal entity value of an internal parsed entity + * - other characters are processed by appending them to the normalized value + * If the declared value is not CDATA, then the XML processor must further + * process the normalized attribute value by discarding any leading and + * trailing space (#x20) characters, and by replacing sequences of space + * (#x20) characters by a single space (#x20) character. + * All attributes for which no declaration has been read should be treated + * by a non-validating parser as if declared CDATA. + * + * Returns the AttValue parsed or NULL. The value has to be freed by the caller. + */ + + +xmlChar * +xmlParseAttValue(xmlParserCtxtPtr ctxt) { + if ((ctxt == NULL) || (ctxt->input == NULL)) return(NULL); + return(xmlParseAttValueInternal(ctxt, NULL, NULL, 0)); +} + +/** + * xmlParseSystemLiteral: + * @ctxt: an XML parser context + * + * parse an XML Literal + * + * [11] SystemLiteral ::= ('"' [^"]* '"') | ("'" [^']* "'") + * + * Returns the SystemLiteral parsed or NULL + */ + +xmlChar * +xmlParseSystemLiteral(xmlParserCtxtPtr ctxt) { + xmlChar *buf = NULL; + int len = 0; + int size = XML_PARSER_BUFFER_SIZE; + int cur, l; + xmlChar stop; + int state = ctxt->instate; + int count = 0; + + SHRINK; + if (RAW == '"') { + NEXT; + stop = '"'; + } else if (RAW == '\'') { + NEXT; + stop = '\''; + } else { + xmlFatalErr(ctxt, XML_ERR_LITERAL_NOT_STARTED, NULL); + return(NULL); + } + + buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar)); + if (buf == NULL) { + xmlErrMemory(ctxt, NULL); + return(NULL); + } + ctxt->instate = XML_PARSER_SYSTEM_LITERAL; + cur = CUR_CHAR(l); + while ((IS_CHAR(cur)) && (cur != stop)) { /* checked */ + if (len + 5 >= size) { + xmlChar *tmp; + + if ((size > XML_MAX_NAME_LENGTH) && + ((ctxt->options & XML_PARSE_HUGE) == 0)) { + xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "SystemLiteral"); + xmlFree(buf); + ctxt->instate = (xmlParserInputState) state; + return(NULL); + } + size *= 2; + tmp = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar)); + if (tmp == NULL) { + xmlFree(buf); + xmlErrMemory(ctxt, NULL); + ctxt->instate = (xmlParserInputState) state; + return(NULL); + } + buf = tmp; + } + count++; + if (count > 50) { + GROW; + count = 0; + if (ctxt->instate == XML_PARSER_EOF) { + xmlFree(buf); + return(NULL); + } + } + COPY_BUF(l,buf,len,cur); + NEXTL(l); + cur = CUR_CHAR(l); + if (cur == 0) { + GROW; + SHRINK; + cur = CUR_CHAR(l); + } + } + buf[len] = 0; + ctxt->instate = (xmlParserInputState) state; + if (!IS_CHAR(cur)) { + xmlFatalErr(ctxt, XML_ERR_LITERAL_NOT_FINISHED, NULL); + } else { + NEXT; + } + return(buf); +} + +/** + * xmlParsePubidLiteral: + * @ctxt: an XML parser context + * + * parse an XML public literal + * + * [12] PubidLiteral ::= '"' PubidChar* '"' | "'" (PubidChar - "'")* "'" + * + * Returns the PubidLiteral parsed or NULL. + */ + +xmlChar * +xmlParsePubidLiteral(xmlParserCtxtPtr ctxt) { + xmlChar *buf = NULL; + int len = 0; + int size = XML_PARSER_BUFFER_SIZE; + xmlChar cur; + xmlChar stop; + int count = 0; + xmlParserInputState oldstate = ctxt->instate; + + SHRINK; + if (RAW == '"') { + NEXT; + stop = '"'; + } else if (RAW == '\'') { + NEXT; + stop = '\''; + } else { + xmlFatalErr(ctxt, XML_ERR_LITERAL_NOT_STARTED, NULL); + return(NULL); + } + buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar)); + if (buf == NULL) { + xmlErrMemory(ctxt, NULL); + return(NULL); + } + ctxt->instate = XML_PARSER_PUBLIC_LITERAL; + cur = CUR; + while ((IS_PUBIDCHAR_CH(cur)) && (cur != stop)) { /* checked */ + if (len + 1 >= size) { + xmlChar *tmp; + + if ((size > XML_MAX_NAME_LENGTH) && + ((ctxt->options & XML_PARSE_HUGE) == 0)) { + xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "Public ID"); + xmlFree(buf); + return(NULL); + } + size *= 2; + tmp = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar)); + if (tmp == NULL) { + xmlErrMemory(ctxt, NULL); + xmlFree(buf); + return(NULL); + } + buf = tmp; + } + buf[len++] = cur; + count++; + if (count > 50) { + GROW; + count = 0; + if (ctxt->instate == XML_PARSER_EOF) { + xmlFree(buf); + return(NULL); + } + } + NEXT; + cur = CUR; + if (cur == 0) { + GROW; + SHRINK; + cur = CUR; + } + } + buf[len] = 0; + if (cur != stop) { + xmlFatalErr(ctxt, XML_ERR_LITERAL_NOT_FINISHED, NULL); + } else { + NEXT; + } + ctxt->instate = oldstate; + return(buf); +} + +static void xmlParseCharDataComplex(xmlParserCtxtPtr ctxt, int cdata); + +/* + * used for the test in the inner loop of the char data testing + */ +static const unsigned char test_char_data[256] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x9, CR/LF separated */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x00, 0x27, /* & */ + 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x3A, 0x3B, 0x00, 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, 0x00, 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, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* non-ascii */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +/** + * xmlParseCharData: + * @ctxt: an XML parser context + * @cdata: int indicating whether we are within a CDATA section + * + * parse a CharData section. + * if we are within a CDATA section ']]>' marks an end of section. + * + * The right angle bracket (>) may be represented using the string ">", + * and must, for compatibility, be escaped using ">" or a character + * reference when it appears in the string "]]>" in content, when that + * string is not marking the end of a CDATA section. + * + * [14] CharData ::= [^<&]* - ([^<&]* ']]>' [^<&]*) + */ + +void +xmlParseCharData(xmlParserCtxtPtr ctxt, int cdata) { + const xmlChar *in; + int nbchar = 0; + int line = ctxt->input->line; + int col = ctxt->input->col; + int ccol; + + SHRINK; + GROW; + /* + * Accelerated common case where input don't need to be + * modified before passing it to the handler. + */ + if (!cdata) { + in = ctxt->input->cur; + do { +get_more_space: + while (*in == 0x20) { in++; ctxt->input->col++; } + if (*in == 0xA) { + do { + ctxt->input->line++; ctxt->input->col = 1; + in++; + } while (*in == 0xA); + goto get_more_space; + } + if (*in == '<') { + nbchar = in - ctxt->input->cur; + if (nbchar > 0) { + const xmlChar *tmp = ctxt->input->cur; + ctxt->input->cur = in; + + if ((ctxt->sax != NULL) && + (ctxt->sax->ignorableWhitespace != + ctxt->sax->characters)) { + if (areBlanks(ctxt, tmp, nbchar, 1)) { + if (ctxt->sax->ignorableWhitespace != NULL) + ctxt->sax->ignorableWhitespace(ctxt->userData, + tmp, nbchar); + } else { + if (ctxt->sax->characters != NULL) + ctxt->sax->characters(ctxt->userData, + tmp, nbchar); + if (*ctxt->space == -1) + *ctxt->space = -2; + } + } else if ((ctxt->sax != NULL) && + (ctxt->sax->characters != NULL)) { + ctxt->sax->characters(ctxt->userData, + tmp, nbchar); + } + } + return; + } + +get_more: + ccol = ctxt->input->col; + while (test_char_data[*in]) { + in++; + ccol++; + } + ctxt->input->col = ccol; + if (*in == 0xA) { + do { + ctxt->input->line++; ctxt->input->col = 1; + in++; + } while (*in == 0xA); + goto get_more; + } + if (*in == ']') { + if ((in[1] == ']') && (in[2] == '>')) { + xmlFatalErr(ctxt, XML_ERR_MISPLACED_CDATA_END, NULL); + ctxt->input->cur = in; + return; + } + in++; + ctxt->input->col++; + goto get_more; + } + nbchar = in - ctxt->input->cur; + if (nbchar > 0) { + if ((ctxt->sax != NULL) && + (ctxt->sax->ignorableWhitespace != + ctxt->sax->characters) && + (IS_BLANK_CH(*ctxt->input->cur))) { + const xmlChar *tmp = ctxt->input->cur; + ctxt->input->cur = in; + + if (areBlanks(ctxt, tmp, nbchar, 0)) { + if (ctxt->sax->ignorableWhitespace != NULL) + ctxt->sax->ignorableWhitespace(ctxt->userData, + tmp, nbchar); + } else { + if (ctxt->sax->characters != NULL) + ctxt->sax->characters(ctxt->userData, + tmp, nbchar); + if (*ctxt->space == -1) + *ctxt->space = -2; + } + line = ctxt->input->line; + col = ctxt->input->col; + } else if (ctxt->sax != NULL) { + if (ctxt->sax->characters != NULL) + ctxt->sax->characters(ctxt->userData, + ctxt->input->cur, nbchar); + line = ctxt->input->line; + col = ctxt->input->col; + } + /* something really bad happened in the SAX callback */ + if (ctxt->instate != XML_PARSER_CONTENT) + return; + } + ctxt->input->cur = in; + if (*in == 0xD) { + in++; + if (*in == 0xA) { + ctxt->input->cur = in; + in++; + ctxt->input->line++; ctxt->input->col = 1; + continue; /* while */ + } + in--; + } + if (*in == '<') { + return; + } + if (*in == '&') { + return; + } + SHRINK; + GROW; + if (ctxt->instate == XML_PARSER_EOF) + return; + in = ctxt->input->cur; + } while (((*in >= 0x20) && (*in <= 0x7F)) || (*in == 0x09)); + nbchar = 0; + } + ctxt->input->line = line; + ctxt->input->col = col; + xmlParseCharDataComplex(ctxt, cdata); +} + +/** + * xmlParseCharDataComplex: + * @ctxt: an XML parser context + * @cdata: int indicating whether we are within a CDATA section + * + * parse a CharData section.this is the fallback function + * of xmlParseCharData() when the parsing requires handling + * of non-ASCII characters. + */ +static void +xmlParseCharDataComplex(xmlParserCtxtPtr ctxt, int cdata) { + xmlChar buf[XML_PARSER_BIG_BUFFER_SIZE + 5]; + int nbchar = 0; + int cur, l; + int count = 0; + + SHRINK; + GROW; + cur = CUR_CHAR(l); + while ((cur != '<') && /* checked */ + (cur != '&') && + (IS_CHAR(cur))) /* test also done in xmlCurrentChar() */ { + if ((cur == ']') && (NXT(1) == ']') && + (NXT(2) == '>')) { + if (cdata) break; + else { + xmlFatalErr(ctxt, XML_ERR_MISPLACED_CDATA_END, NULL); + } + } + COPY_BUF(l,buf,nbchar,cur); + if (nbchar >= XML_PARSER_BIG_BUFFER_SIZE) { + buf[nbchar] = 0; + + /* + * OK the segment is to be consumed as chars. + */ + if ((ctxt->sax != NULL) && (!ctxt->disableSAX)) { + if (areBlanks(ctxt, buf, nbchar, 0)) { + if (ctxt->sax->ignorableWhitespace != NULL) + ctxt->sax->ignorableWhitespace(ctxt->userData, + buf, nbchar); + } else { + if (ctxt->sax->characters != NULL) + ctxt->sax->characters(ctxt->userData, buf, nbchar); + if ((ctxt->sax->characters != + ctxt->sax->ignorableWhitespace) && + (*ctxt->space == -1)) + *ctxt->space = -2; + } + } + nbchar = 0; + /* something really bad happened in the SAX callback */ + if (ctxt->instate != XML_PARSER_CONTENT) + return; + } + count++; + if (count > 50) { + GROW; + count = 0; + if (ctxt->instate == XML_PARSER_EOF) + return; + } + NEXTL(l); + cur = CUR_CHAR(l); + } + if (nbchar != 0) { + buf[nbchar] = 0; + /* + * OK the segment is to be consumed as chars. + */ + if ((ctxt->sax != NULL) && (!ctxt->disableSAX)) { + if (areBlanks(ctxt, buf, nbchar, 0)) { + if (ctxt->sax->ignorableWhitespace != NULL) + ctxt->sax->ignorableWhitespace(ctxt->userData, buf, nbchar); + } else { + if (ctxt->sax->characters != NULL) + ctxt->sax->characters(ctxt->userData, buf, nbchar); + if ((ctxt->sax->characters != ctxt->sax->ignorableWhitespace) && + (*ctxt->space == -1)) + *ctxt->space = -2; + } + } + } + if ((cur != 0) && (!IS_CHAR(cur))) { + /* Generate the error and skip the offending character */ + xmlFatalErrMsgInt(ctxt, XML_ERR_INVALID_CHAR, + "PCDATA invalid Char value %d\n", + cur); + NEXTL(l); + } +} + +/** + * xmlParseExternalID: + * @ctxt: an XML parser context + * @publicID: a xmlChar** receiving PubidLiteral + * @strict: indicate whether we should restrict parsing to only + * production [75], see NOTE below + * + * Parse an External ID or a Public ID + * + * NOTE: Productions [75] and [83] interact badly since [75] can generate + * 'PUBLIC' S PubidLiteral S SystemLiteral + * + * [75] ExternalID ::= 'SYSTEM' S SystemLiteral + * | 'PUBLIC' S PubidLiteral S SystemLiteral + * + * [83] PublicID ::= 'PUBLIC' S PubidLiteral + * + * Returns the function returns SystemLiteral and in the second + * case publicID receives PubidLiteral, is strict is off + * it is possible to return NULL and have publicID set. + */ + +xmlChar * +xmlParseExternalID(xmlParserCtxtPtr ctxt, xmlChar **publicID, int strict) { + xmlChar *URI = NULL; + + SHRINK; + + *publicID = NULL; + if (CMP6(CUR_PTR, 'S', 'Y', 'S', 'T', 'E', 'M')) { + SKIP(6); + if (!IS_BLANK_CH(CUR)) { + xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, + "Space required after 'SYSTEM'\n"); + } + SKIP_BLANKS; + URI = xmlParseSystemLiteral(ctxt); + if (URI == NULL) { + xmlFatalErr(ctxt, XML_ERR_URI_REQUIRED, NULL); + } + } else if (CMP6(CUR_PTR, 'P', 'U', 'B', 'L', 'I', 'C')) { + SKIP(6); + if (!IS_BLANK_CH(CUR)) { + xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, + "Space required after 'PUBLIC'\n"); + } + SKIP_BLANKS; + *publicID = xmlParsePubidLiteral(ctxt); + if (*publicID == NULL) { + xmlFatalErr(ctxt, XML_ERR_PUBID_REQUIRED, NULL); + } + if (strict) { + /* + * We don't handle [83] so "S SystemLiteral" is required. + */ + if (!IS_BLANK_CH(CUR)) { + xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, + "Space required after the Public Identifier\n"); + } + } else { + /* + * We handle [83] so we return immediately, if + * "S SystemLiteral" is not detected. From a purely parsing + * point of view that's a nice mess. + */ + const xmlChar *ptr; + GROW; + + ptr = CUR_PTR; + if (!IS_BLANK_CH(*ptr)) return(NULL); + + while (IS_BLANK_CH(*ptr)) ptr++; /* TODO: dangerous, fix ! */ + if ((*ptr != '\'') && (*ptr != '"')) return(NULL); + } + SKIP_BLANKS; + URI = xmlParseSystemLiteral(ctxt); + if (URI == NULL) { + xmlFatalErr(ctxt, XML_ERR_URI_REQUIRED, NULL); + } + } + return(URI); +} + +/** + * xmlParseCommentComplex: + * @ctxt: an XML parser context + * @buf: the already parsed part of the buffer + * @len: number of bytes filles in the buffer + * @size: allocated size of the buffer + * + * Skip an XML (SGML) comment + * The spec says that "For compatibility, the string "--" (double-hyphen) + * must not occur within comments. " + * This is the slow routine in case the accelerator for ascii didn't work + * + * [15] Comment ::= '' + */ +static void +xmlParseCommentComplex(xmlParserCtxtPtr ctxt, xmlChar *buf, + size_t len, size_t size) { + int q, ql; + int r, rl; + int cur, l; + size_t count = 0; + int inputid; + + inputid = ctxt->input->id; + + if (buf == NULL) { + len = 0; + size = XML_PARSER_BUFFER_SIZE; + buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar)); + if (buf == NULL) { + xmlErrMemory(ctxt, NULL); + return; + } + } + GROW; /* Assure there's enough input data */ + q = CUR_CHAR(ql); + if (q == 0) + goto not_terminated; + if (!IS_CHAR(q)) { + xmlFatalErrMsgInt(ctxt, XML_ERR_INVALID_CHAR, + "xmlParseComment: invalid xmlChar value %d\n", + q); + xmlFree (buf); + return; + } + NEXTL(ql); + r = CUR_CHAR(rl); + if (r == 0) + goto not_terminated; + if (!IS_CHAR(r)) { + xmlFatalErrMsgInt(ctxt, XML_ERR_INVALID_CHAR, + "xmlParseComment: invalid xmlChar value %d\n", + q); + xmlFree (buf); + return; + } + NEXTL(rl); + cur = CUR_CHAR(l); + if (cur == 0) + goto not_terminated; + while (IS_CHAR(cur) && /* checked */ + ((cur != '>') || + (r != '-') || (q != '-'))) { + if ((r == '-') && (q == '-')) { + xmlFatalErr(ctxt, XML_ERR_HYPHEN_IN_COMMENT, NULL); + } + if ((len > XML_MAX_TEXT_LENGTH) && + ((ctxt->options & XML_PARSE_HUGE) == 0)) { + xmlFatalErrMsgStr(ctxt, XML_ERR_COMMENT_NOT_FINISHED, + "Comment too big found", NULL); + xmlFree (buf); + return; + } + if (len + 5 >= size) { + xmlChar *new_buf; + size_t new_size; + + new_size = size * 2; + new_buf = (xmlChar *) xmlRealloc(buf, new_size); + if (new_buf == NULL) { + xmlFree (buf); + xmlErrMemory(ctxt, NULL); + return; + } + buf = new_buf; + size = new_size; + } + COPY_BUF(ql,buf,len,q); + q = r; + ql = rl; + r = cur; + rl = l; + + count++; + if (count > 50) { + GROW; + count = 0; + if (ctxt->instate == XML_PARSER_EOF) { + xmlFree(buf); + return; + } + } + NEXTL(l); + cur = CUR_CHAR(l); + if (cur == 0) { + SHRINK; + GROW; + cur = CUR_CHAR(l); + } + } + buf[len] = 0; + if (cur == 0) { + xmlFatalErrMsgStr(ctxt, XML_ERR_COMMENT_NOT_FINISHED, + "Comment not terminated \n + * The spec says that "For compatibility, the string "--" (double-hyphen) + * must not occur within comments. " + * + * [15] Comment ::= '' + */ +void +xmlParseComment(xmlParserCtxtPtr ctxt) { + xmlChar *buf = NULL; + size_t size = XML_PARSER_BUFFER_SIZE; + size_t len = 0; + xmlParserInputState state; + const xmlChar *in; + size_t nbchar = 0; + int ccol; + int inputid; + + /* + * Check that there is a comment right here. + */ + if ((RAW != '<') || (NXT(1) != '!') || + (NXT(2) != '-') || (NXT(3) != '-')) return; + state = ctxt->instate; + ctxt->instate = XML_PARSER_COMMENT; + inputid = ctxt->input->id; + SKIP(4); + SHRINK; + GROW; + + /* + * Accelerated common case where input don't need to be + * modified before passing it to the handler. + */ + in = ctxt->input->cur; + do { + if (*in == 0xA) { + do { + ctxt->input->line++; ctxt->input->col = 1; + in++; + } while (*in == 0xA); + } +get_more: + ccol = ctxt->input->col; + while (((*in > '-') && (*in <= 0x7F)) || + ((*in >= 0x20) && (*in < '-')) || + (*in == 0x09)) { + in++; + ccol++; + } + ctxt->input->col = ccol; + if (*in == 0xA) { + do { + ctxt->input->line++; ctxt->input->col = 1; + in++; + } while (*in == 0xA); + goto get_more; + } + nbchar = in - ctxt->input->cur; + /* + * save current set of data + */ + if (nbchar > 0) { + if ((ctxt->sax != NULL) && + (ctxt->sax->comment != NULL)) { + if (buf == NULL) { + if ((*in == '-') && (in[1] == '-')) + size = nbchar + 1; + else + size = XML_PARSER_BUFFER_SIZE + nbchar; + buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar)); + if (buf == NULL) { + xmlErrMemory(ctxt, NULL); + ctxt->instate = state; + return; + } + len = 0; + } else if (len + nbchar + 1 >= size) { + xmlChar *new_buf; + size += len + nbchar + XML_PARSER_BUFFER_SIZE; + new_buf = (xmlChar *) xmlRealloc(buf, + size * sizeof(xmlChar)); + if (new_buf == NULL) { + xmlFree (buf); + xmlErrMemory(ctxt, NULL); + ctxt->instate = state; + return; + } + buf = new_buf; + } + memcpy(&buf[len], ctxt->input->cur, nbchar); + len += nbchar; + buf[len] = 0; + } + } + if ((len > XML_MAX_TEXT_LENGTH) && + ((ctxt->options & XML_PARSE_HUGE) == 0)) { + xmlFatalErrMsgStr(ctxt, XML_ERR_COMMENT_NOT_FINISHED, + "Comment too big found", NULL); + xmlFree (buf); + return; + } + ctxt->input->cur = in; + if (*in == 0xA) { + in++; + ctxt->input->line++; ctxt->input->col = 1; + } + if (*in == 0xD) { + in++; + if (*in == 0xA) { + ctxt->input->cur = in; + in++; + ctxt->input->line++; ctxt->input->col = 1; + continue; /* while */ + } + in--; + } + SHRINK; + GROW; + if (ctxt->instate == XML_PARSER_EOF) { + xmlFree(buf); + return; + } + in = ctxt->input->cur; + if (*in == '-') { + if (in[1] == '-') { + if (in[2] == '>') { + if (ctxt->input->id != inputid) { + xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY, + "comment doesn't start and stop in the same entity\n"); + } + SKIP(3); + if ((ctxt->sax != NULL) && (ctxt->sax->comment != NULL) && + (!ctxt->disableSAX)) { + if (buf != NULL) + ctxt->sax->comment(ctxt->userData, buf); + else + ctxt->sax->comment(ctxt->userData, BAD_CAST ""); + } + if (buf != NULL) + xmlFree(buf); + if (ctxt->instate != XML_PARSER_EOF) + ctxt->instate = state; + return; + } + if (buf != NULL) { + xmlFatalErrMsgStr(ctxt, XML_ERR_HYPHEN_IN_COMMENT, + "Double hyphen within comment: " + ""); + } + fprintf(output, ">\n"); + if (grammar->start == NULL) { + fprintf(output, " "); + } else { + fprintf(output, "\n"); + xmlRelaxNGDumpDefine(output, grammar->start); + fprintf(output, "\n"); + } + /* TODO ? Dump the defines ? */ + fprintf(output, "\n"); +} + +/** + * xmlRelaxNGDump: + * @output: the file output + * @schema: a schema structure + * + * Dump a RelaxNG structure back + */ +void +xmlRelaxNGDump(FILE * output, xmlRelaxNGPtr schema) +{ + if (output == NULL) + return; + if (schema == NULL) { + fprintf(output, "RelaxNG empty or failed to compile\n"); + return; + } + fprintf(output, "RelaxNG: "); + if (schema->doc == NULL) { + fprintf(output, "no document\n"); + } else if (schema->doc->URL != NULL) { + fprintf(output, "%s\n", schema->doc->URL); + } else { + fprintf(output, "\n"); + } + if (schema->topgrammar == NULL) { + fprintf(output, "RelaxNG has no top grammar\n"); + return; + } + xmlRelaxNGDumpGrammar(output, schema->topgrammar, 1); +} + +/** + * xmlRelaxNGDumpTree: + * @output: the file output + * @schema: a schema structure + * + * Dump the transformed RelaxNG tree. + */ +void +xmlRelaxNGDumpTree(FILE * output, xmlRelaxNGPtr schema) +{ + if (output == NULL) + return; + if (schema == NULL) { + fprintf(output, "RelaxNG empty or failed to compile\n"); + return; + } + if (schema->doc == NULL) { + fprintf(output, "no document\n"); + } else { + xmlDocDump(output, schema->doc); + } +} +#endif /* LIBXML_OUTPUT_ENABLED */ + +/************************************************************************ + * * + * Validation of compiled content * + * * + ************************************************************************/ +static int xmlRelaxNGValidateDefinition(xmlRelaxNGValidCtxtPtr ctxt, + xmlRelaxNGDefinePtr define); + +/** + * xmlRelaxNGValidateCompiledCallback: + * @exec: the regular expression instance + * @token: the token which matched + * @transdata: callback data, the define for the subelement if available + @ @inputdata: callback data, the Relax NG validation context + * + * Handle the callback and if needed validate the element children. + */ +static void +xmlRelaxNGValidateCompiledCallback(xmlRegExecCtxtPtr exec ATTRIBUTE_UNUSED, + const xmlChar * token, + void *transdata, void *inputdata) +{ + xmlRelaxNGValidCtxtPtr ctxt = (xmlRelaxNGValidCtxtPtr) inputdata; + xmlRelaxNGDefinePtr define = (xmlRelaxNGDefinePtr) transdata; + int ret; + +#ifdef DEBUG_COMPILE + xmlGenericError(xmlGenericErrorContext, + "Compiled callback for: '%s'\n", token); +#endif + if (ctxt == NULL) { + fprintf(stderr, "callback on %s missing context\n", token); + return; + } + if (define == NULL) { + if (token[0] == '#') + return; + fprintf(stderr, "callback on %s missing define\n", token); + if ((ctxt != NULL) && (ctxt->errNo == XML_RELAXNG_OK)) + ctxt->errNo = XML_RELAXNG_ERR_INTERNAL; + return; + } + if ((ctxt == NULL) || (define == NULL)) { + fprintf(stderr, "callback on %s missing info\n", token); + if ((ctxt != NULL) && (ctxt->errNo == XML_RELAXNG_OK)) + ctxt->errNo = XML_RELAXNG_ERR_INTERNAL; + return; + } else if (define->type != XML_RELAXNG_ELEMENT) { + fprintf(stderr, "callback on %s define is not element\n", token); + if (ctxt->errNo == XML_RELAXNG_OK) + ctxt->errNo = XML_RELAXNG_ERR_INTERNAL; + return; + } + ret = xmlRelaxNGValidateDefinition(ctxt, define); + if (ret != 0) + ctxt->perr = ret; +} + +/** + * xmlRelaxNGValidateCompiledContent: + * @ctxt: the RelaxNG validation context + * @regexp: the regular expression as compiled + * @content: list of children to test against the regexp + * + * Validate the content model of an element or start using the regexp + * + * Returns 0 in case of success, -1 in case of error. + */ +static int +xmlRelaxNGValidateCompiledContent(xmlRelaxNGValidCtxtPtr ctxt, + xmlRegexpPtr regexp, xmlNodePtr content) +{ + xmlRegExecCtxtPtr exec; + xmlNodePtr cur; + int ret = 0; + int oldperr; + + if ((ctxt == NULL) || (regexp == NULL)) + return (-1); + oldperr = ctxt->perr; + exec = xmlRegNewExecCtxt(regexp, + xmlRelaxNGValidateCompiledCallback, ctxt); + ctxt->perr = 0; + cur = content; + while (cur != NULL) { + ctxt->state->seq = cur; + switch (cur->type) { + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + if (xmlIsBlankNode(cur)) + break; + ret = xmlRegExecPushString(exec, BAD_CAST "#text", ctxt); + if (ret < 0) { + VALID_ERR2(XML_RELAXNG_ERR_TEXTWRONG, + cur->parent->name); + } + break; + case XML_ELEMENT_NODE: + if (cur->ns != NULL) { + ret = xmlRegExecPushString2(exec, cur->name, + cur->ns->href, ctxt); + } else { + ret = xmlRegExecPushString(exec, cur->name, ctxt); + } + if (ret < 0) { + VALID_ERR2(XML_RELAXNG_ERR_ELEMWRONG, cur->name); + } + break; + default: + break; + } + if (ret < 0) + break; + /* + * Switch to next element + */ + cur = cur->next; + } + ret = xmlRegExecPushString(exec, NULL, NULL); + if (ret == 1) { + ret = 0; + ctxt->state->seq = NULL; + } else if (ret == 0) { + /* + * TODO: get some of the names needed to exit the current state of exec + */ + VALID_ERR2(XML_RELAXNG_ERR_NOELEM, BAD_CAST ""); + ret = -1; + if ((ctxt->flags & FLAGS_IGNORABLE) == 0) + xmlRelaxNGDumpValidError(ctxt); + } else { + ret = -1; + } + xmlRegFreeExecCtxt(exec); + /* + * There might be content model errors outside of the pure + * regexp validation, e.g. for attribute values. + */ + if ((ret == 0) && (ctxt->perr != 0)) { + ret = ctxt->perr; + } + ctxt->perr = oldperr; + return (ret); +} + +/************************************************************************ + * * + * Progressive validation of when possible * + * * + ************************************************************************/ +static int xmlRelaxNGValidateAttributeList(xmlRelaxNGValidCtxtPtr ctxt, + xmlRelaxNGDefinePtr defines); +static int xmlRelaxNGValidateElementEnd(xmlRelaxNGValidCtxtPtr ctxt, + int dolog); +static void xmlRelaxNGLogBestError(xmlRelaxNGValidCtxtPtr ctxt); + +/** + * xmlRelaxNGElemPush: + * @ctxt: the validation context + * @exec: the regexp runtime for the new content model + * + * Push a new regexp for the current node content model on the stack + * + * Returns 0 in case of success and -1 in case of error. + */ +static int +xmlRelaxNGElemPush(xmlRelaxNGValidCtxtPtr ctxt, xmlRegExecCtxtPtr exec) +{ + if (ctxt->elemTab == NULL) { + ctxt->elemMax = 10; + ctxt->elemTab = (xmlRegExecCtxtPtr *) xmlMalloc(ctxt->elemMax * + sizeof + (xmlRegExecCtxtPtr)); + if (ctxt->elemTab == NULL) { + xmlRngVErrMemory(ctxt, "validating\n"); + return (-1); + } + } + if (ctxt->elemNr >= ctxt->elemMax) { + ctxt->elemMax *= 2; + ctxt->elemTab = (xmlRegExecCtxtPtr *) xmlRealloc(ctxt->elemTab, + ctxt->elemMax * + sizeof + (xmlRegExecCtxtPtr)); + if (ctxt->elemTab == NULL) { + xmlRngVErrMemory(ctxt, "validating\n"); + return (-1); + } + } + ctxt->elemTab[ctxt->elemNr++] = exec; + ctxt->elem = exec; + return (0); +} + +/** + * xmlRelaxNGElemPop: + * @ctxt: the validation context + * + * Pop the regexp of the current node content model from the stack + * + * Returns the exec or NULL if empty + */ +static xmlRegExecCtxtPtr +xmlRelaxNGElemPop(xmlRelaxNGValidCtxtPtr ctxt) +{ + xmlRegExecCtxtPtr ret; + + if (ctxt->elemNr <= 0) + return (NULL); + ctxt->elemNr--; + ret = ctxt->elemTab[ctxt->elemNr]; + ctxt->elemTab[ctxt->elemNr] = NULL; + if (ctxt->elemNr > 0) + ctxt->elem = ctxt->elemTab[ctxt->elemNr - 1]; + else + ctxt->elem = NULL; + return (ret); +} + +/** + * xmlRelaxNGValidateProgressiveCallback: + * @exec: the regular expression instance + * @token: the token which matched + * @transdata: callback data, the define for the subelement if available + @ @inputdata: callback data, the Relax NG validation context + * + * Handle the callback and if needed validate the element children. + * some of the in/out informations are passed via the context in @inputdata. + */ +static void +xmlRelaxNGValidateProgressiveCallback(xmlRegExecCtxtPtr exec + ATTRIBUTE_UNUSED, + const xmlChar * token, + void *transdata, void *inputdata) +{ + xmlRelaxNGValidCtxtPtr ctxt = (xmlRelaxNGValidCtxtPtr) inputdata; + xmlRelaxNGDefinePtr define = (xmlRelaxNGDefinePtr) transdata; + xmlRelaxNGValidStatePtr state, oldstate; + xmlNodePtr node; + int ret = 0, oldflags; + +#ifdef DEBUG_PROGRESSIVE + xmlGenericError(xmlGenericErrorContext, + "Progressive callback for: '%s'\n", token); +#endif + if (ctxt == NULL) { + fprintf(stderr, "callback on %s missing context\n", token); + return; + } + node = ctxt->pnode; + ctxt->pstate = 1; + if (define == NULL) { + if (token[0] == '#') + return; + fprintf(stderr, "callback on %s missing define\n", token); + if ((ctxt != NULL) && (ctxt->errNo == XML_RELAXNG_OK)) + ctxt->errNo = XML_RELAXNG_ERR_INTERNAL; + ctxt->pstate = -1; + return; + } + if ((ctxt == NULL) || (define == NULL)) { + fprintf(stderr, "callback on %s missing info\n", token); + if ((ctxt != NULL) && (ctxt->errNo == XML_RELAXNG_OK)) + ctxt->errNo = XML_RELAXNG_ERR_INTERNAL; + ctxt->pstate = -1; + return; + } else if (define->type != XML_RELAXNG_ELEMENT) { + fprintf(stderr, "callback on %s define is not element\n", token); + if (ctxt->errNo == XML_RELAXNG_OK) + ctxt->errNo = XML_RELAXNG_ERR_INTERNAL; + ctxt->pstate = -1; + return; + } + if (node->type != XML_ELEMENT_NODE) { + VALID_ERR(XML_RELAXNG_ERR_NOTELEM); + if ((ctxt->flags & FLAGS_IGNORABLE) == 0) + xmlRelaxNGDumpValidError(ctxt); + ctxt->pstate = -1; + return; + } + if (define->contModel == NULL) { + /* + * this node cannot be validated in a streamable fashion + */ +#ifdef DEBUG_PROGRESSIVE + xmlGenericError(xmlGenericErrorContext, + "Element '%s' validation is not streamable\n", + token); +#endif + ctxt->pstate = 0; + ctxt->pdef = define; + return; + } + exec = xmlRegNewExecCtxt(define->contModel, + xmlRelaxNGValidateProgressiveCallback, ctxt); + if (exec == NULL) { + ctxt->pstate = -1; + return; + } + xmlRelaxNGElemPush(ctxt, exec); + + /* + * Validate the attributes part of the content. + */ + state = xmlRelaxNGNewValidState(ctxt, node); + if (state == NULL) { + ctxt->pstate = -1; + return; + } + oldstate = ctxt->state; + ctxt->state = state; + if (define->attrs != NULL) { + ret = xmlRelaxNGValidateAttributeList(ctxt, define->attrs); + if (ret != 0) { + ctxt->pstate = -1; + VALID_ERR2(XML_RELAXNG_ERR_ATTRVALID, node->name); + } + } + if (ctxt->state != NULL) { + ctxt->state->seq = NULL; + ret = xmlRelaxNGValidateElementEnd(ctxt, 1); + if (ret != 0) { + ctxt->pstate = -1; + } + xmlRelaxNGFreeValidState(ctxt, ctxt->state); + } else if (ctxt->states != NULL) { + int tmp = -1, i; + + oldflags = ctxt->flags; + + for (i = 0; i < ctxt->states->nbState; i++) { + state = ctxt->states->tabState[i]; + ctxt->state = state; + ctxt->state->seq = NULL; + + if (xmlRelaxNGValidateElementEnd(ctxt, 0) == 0) { + tmp = 0; + break; + } + } + if (tmp != 0) { + /* + * validation error, log the message for the "best" one + */ + ctxt->flags |= FLAGS_IGNORABLE; + xmlRelaxNGLogBestError(ctxt); + } + for (i = 0; i < ctxt->states->nbState; i++) { + xmlRelaxNGFreeValidState(ctxt, ctxt->states->tabState[i]); + } + xmlRelaxNGFreeStates(ctxt, ctxt->states); + ctxt->states = NULL; + if ((ret == 0) && (tmp == -1)) + ctxt->pstate = -1; + ctxt->flags = oldflags; + } + if (ctxt->pstate == -1) { + if ((ctxt->flags & FLAGS_IGNORABLE) == 0) { + xmlRelaxNGDumpValidError(ctxt); + } + } + ctxt->state = oldstate; +} + +/** + * xmlRelaxNGValidatePushElement: + * @ctxt: the validation context + * @doc: a document instance + * @elem: an element instance + * + * Push a new element start on the RelaxNG validation stack. + * + * returns 1 if no validation problem was found or 0 if validating the + * element requires a full node, and -1 in case of error. + */ +int +xmlRelaxNGValidatePushElement(xmlRelaxNGValidCtxtPtr ctxt, + xmlDocPtr doc ATTRIBUTE_UNUSED, + xmlNodePtr elem) +{ + int ret = 1; + + if ((ctxt == NULL) || (elem == NULL)) + return (-1); + +#ifdef DEBUG_PROGRESSIVE + xmlGenericError(xmlGenericErrorContext, "PushElem %s\n", elem->name); +#endif + if (ctxt->elem == 0) { + xmlRelaxNGPtr schema; + xmlRelaxNGGrammarPtr grammar; + xmlRegExecCtxtPtr exec; + xmlRelaxNGDefinePtr define; + + schema = ctxt->schema; + if (schema == NULL) { + VALID_ERR(XML_RELAXNG_ERR_NOGRAMMAR); + return (-1); + } + grammar = schema->topgrammar; + if ((grammar == NULL) || (grammar->start == NULL)) { + VALID_ERR(XML_RELAXNG_ERR_NOGRAMMAR); + return (-1); + } + define = grammar->start; + if (define->contModel == NULL) { + ctxt->pdef = define; + return (0); + } + exec = xmlRegNewExecCtxt(define->contModel, + xmlRelaxNGValidateProgressiveCallback, + ctxt); + if (exec == NULL) { + return (-1); + } + xmlRelaxNGElemPush(ctxt, exec); + } + ctxt->pnode = elem; + ctxt->pstate = 0; + if (elem->ns != NULL) { + ret = + xmlRegExecPushString2(ctxt->elem, elem->name, elem->ns->href, + ctxt); + } else { + ret = xmlRegExecPushString(ctxt->elem, elem->name, ctxt); + } + if (ret < 0) { + VALID_ERR2(XML_RELAXNG_ERR_ELEMWRONG, elem->name); + } else { + if (ctxt->pstate == 0) + ret = 0; + else if (ctxt->pstate < 0) + ret = -1; + else + ret = 1; + } +#ifdef DEBUG_PROGRESSIVE + if (ret < 0) + xmlGenericError(xmlGenericErrorContext, "PushElem %s failed\n", + elem->name); +#endif + return (ret); +} + +/** + * xmlRelaxNGValidatePushCData: + * @ctxt: the RelaxNG validation context + * @data: some character data read + * @len: the length of the data + * + * check the CData parsed for validation in the current stack + * + * returns 1 if no validation problem was found or -1 otherwise + */ +int +xmlRelaxNGValidatePushCData(xmlRelaxNGValidCtxtPtr ctxt, + const xmlChar * data, int len ATTRIBUTE_UNUSED) +{ + int ret = 1; + + if ((ctxt == NULL) || (ctxt->elem == NULL) || (data == NULL)) + return (-1); + +#ifdef DEBUG_PROGRESSIVE + xmlGenericError(xmlGenericErrorContext, "CDATA %s %d\n", data, len); +#endif + + while (*data != 0) { + if (!IS_BLANK_CH(*data)) + break; + data++; + } + if (*data == 0) + return (1); + + ret = xmlRegExecPushString(ctxt->elem, BAD_CAST "#text", ctxt); + if (ret < 0) { + VALID_ERR2(XML_RELAXNG_ERR_TEXTWRONG, BAD_CAST " TODO "); +#ifdef DEBUG_PROGRESSIVE + xmlGenericError(xmlGenericErrorContext, "CDATA failed\n"); +#endif + + return (-1); + } + return (1); +} + +/** + * xmlRelaxNGValidatePopElement: + * @ctxt: the RelaxNG validation context + * @doc: a document instance + * @elem: an element instance + * + * Pop the element end from the RelaxNG validation stack. + * + * returns 1 if no validation problem was found or 0 otherwise + */ +int +xmlRelaxNGValidatePopElement(xmlRelaxNGValidCtxtPtr ctxt, + xmlDocPtr doc ATTRIBUTE_UNUSED, + xmlNodePtr elem) +{ + int ret; + xmlRegExecCtxtPtr exec; + + if ((ctxt == NULL) || (ctxt->elem == NULL) || (elem == NULL)) + return (-1); +#ifdef DEBUG_PROGRESSIVE + xmlGenericError(xmlGenericErrorContext, "PopElem %s\n", elem->name); +#endif + /* + * verify that we reached a terminal state of the content model. + */ + exec = xmlRelaxNGElemPop(ctxt); + ret = xmlRegExecPushString(exec, NULL, NULL); + if (ret == 0) { + /* + * TODO: get some of the names needed to exit the current state of exec + */ + VALID_ERR2(XML_RELAXNG_ERR_NOELEM, BAD_CAST ""); + ret = -1; + } else if (ret < 0) { + ret = -1; + } else { + ret = 1; + } + xmlRegFreeExecCtxt(exec); +#ifdef DEBUG_PROGRESSIVE + if (ret < 0) + xmlGenericError(xmlGenericErrorContext, "PopElem %s failed\n", + elem->name); +#endif + return (ret); +} + +/** + * xmlRelaxNGValidateFullElement: + * @ctxt: the validation context + * @doc: a document instance + * @elem: an element instance + * + * Validate a full subtree when xmlRelaxNGValidatePushElement() returned + * 0 and the content of the node has been expanded. + * + * returns 1 if no validation problem was found or -1 in case of error. + */ +int +xmlRelaxNGValidateFullElement(xmlRelaxNGValidCtxtPtr ctxt, + xmlDocPtr doc ATTRIBUTE_UNUSED, + xmlNodePtr elem) +{ + int ret; + xmlRelaxNGValidStatePtr state; + + if ((ctxt == NULL) || (ctxt->pdef == NULL) || (elem == NULL)) + return (-1); +#ifdef DEBUG_PROGRESSIVE + xmlGenericError(xmlGenericErrorContext, "FullElem %s\n", elem->name); +#endif + state = xmlRelaxNGNewValidState(ctxt, elem->parent); + if (state == NULL) { + return (-1); + } + state->seq = elem; + ctxt->state = state; + ctxt->errNo = XML_RELAXNG_OK; + ret = xmlRelaxNGValidateDefinition(ctxt, ctxt->pdef); + if ((ret != 0) || (ctxt->errNo != XML_RELAXNG_OK)) + ret = -1; + else + ret = 1; + xmlRelaxNGFreeValidState(ctxt, ctxt->state); + ctxt->state = NULL; +#ifdef DEBUG_PROGRESSIVE + if (ret < 0) + xmlGenericError(xmlGenericErrorContext, "FullElem %s failed\n", + elem->name); +#endif + return (ret); +} + +/************************************************************************ + * * + * Generic interpreted validation implementation * + * * + ************************************************************************/ +static int xmlRelaxNGValidateValue(xmlRelaxNGValidCtxtPtr ctxt, + xmlRelaxNGDefinePtr define); + +/** + * xmlRelaxNGSkipIgnored: + * @ctxt: a schema validation context + * @node: the top node. + * + * Skip ignorable nodes in that context + * + * Returns the new sibling or NULL in case of error. + */ +static xmlNodePtr +xmlRelaxNGSkipIgnored(xmlRelaxNGValidCtxtPtr ctxt ATTRIBUTE_UNUSED, + xmlNodePtr node) +{ + /* + * TODO complete and handle entities + */ + while ((node != NULL) && + ((node->type == XML_COMMENT_NODE) || + (node->type == XML_PI_NODE) || + (node->type == XML_XINCLUDE_START) || + (node->type == XML_XINCLUDE_END) || + (((node->type == XML_TEXT_NODE) || + (node->type == XML_CDATA_SECTION_NODE)) && + ((ctxt->flags & FLAGS_MIXED_CONTENT) || + (IS_BLANK_NODE(node)))))) { + node = node->next; + } + return (node); +} + +/** + * xmlRelaxNGNormalize: + * @ctxt: a schema validation context + * @str: the string to normalize + * + * Implements the normalizeWhiteSpace( s ) function from + * section 6.2.9 of the spec + * + * Returns the new string or NULL in case of error. + */ +static xmlChar * +xmlRelaxNGNormalize(xmlRelaxNGValidCtxtPtr ctxt, const xmlChar * str) +{ + xmlChar *ret, *p; + const xmlChar *tmp; + int len; + + if (str == NULL) + return (NULL); + tmp = str; + while (*tmp != 0) + tmp++; + len = tmp - str; + + ret = (xmlChar *) xmlMallocAtomic((len + 1) * sizeof(xmlChar)); + if (ret == NULL) { + xmlRngVErrMemory(ctxt, "validating\n"); + return (NULL); + } + p = ret; + while (IS_BLANK_CH(*str)) + str++; + while (*str != 0) { + if (IS_BLANK_CH(*str)) { + while (IS_BLANK_CH(*str)) + str++; + if (*str == 0) + break; + *p++ = ' '; + } else + *p++ = *str++; + } + *p = 0; + return (ret); +} + +/** + * xmlRelaxNGValidateDatatype: + * @ctxt: a Relax-NG validation context + * @value: the string value + * @type: the datatype definition + * @node: the node + * + * Validate the given value against the dataype + * + * Returns 0 if the validation succeeded or an error code. + */ +static int +xmlRelaxNGValidateDatatype(xmlRelaxNGValidCtxtPtr ctxt, + const xmlChar * value, + xmlRelaxNGDefinePtr define, xmlNodePtr node) +{ + int ret, tmp; + xmlRelaxNGTypeLibraryPtr lib; + void *result = NULL; + xmlRelaxNGDefinePtr cur; + + if ((define == NULL) || (define->data == NULL)) { + return (-1); + } + lib = (xmlRelaxNGTypeLibraryPtr) define->data; + if (lib->check != NULL) { + if ((define->attrs != NULL) && + (define->attrs->type == XML_RELAXNG_PARAM)) { + ret = + lib->check(lib->data, define->name, value, &result, node); + } else { + ret = lib->check(lib->data, define->name, value, NULL, node); + } + } else + ret = -1; + if (ret < 0) { + VALID_ERR2(XML_RELAXNG_ERR_TYPE, define->name); + if ((result != NULL) && (lib != NULL) && (lib->freef != NULL)) + lib->freef(lib->data, result); + return (-1); + } else if (ret == 1) { + ret = 0; + } else if (ret == 2) { + VALID_ERR2P(XML_RELAXNG_ERR_DUPID, value); + } else { + VALID_ERR3P(XML_RELAXNG_ERR_TYPEVAL, define->name, value); + ret = -1; + } + cur = define->attrs; + while ((ret == 0) && (cur != NULL) && (cur->type == XML_RELAXNG_PARAM)) { + if (lib->facet != NULL) { + tmp = lib->facet(lib->data, define->name, cur->name, + cur->value, value, result); + if (tmp != 0) + ret = -1; + } + cur = cur->next; + } + if ((ret == 0) && (define->content != NULL)) { + const xmlChar *oldvalue, *oldendvalue; + + oldvalue = ctxt->state->value; + oldendvalue = ctxt->state->endvalue; + ctxt->state->value = (xmlChar *) value; + ctxt->state->endvalue = NULL; + ret = xmlRelaxNGValidateValue(ctxt, define->content); + ctxt->state->value = (xmlChar *) oldvalue; + ctxt->state->endvalue = (xmlChar *) oldendvalue; + } + if ((result != NULL) && (lib != NULL) && (lib->freef != NULL)) + lib->freef(lib->data, result); + return (ret); +} + +/** + * xmlRelaxNGNextValue: + * @ctxt: a Relax-NG validation context + * + * Skip to the next value when validating within a list + * + * Returns 0 if the operation succeeded or an error code. + */ +static int +xmlRelaxNGNextValue(xmlRelaxNGValidCtxtPtr ctxt) +{ + xmlChar *cur; + + cur = ctxt->state->value; + if ((cur == NULL) || (ctxt->state->endvalue == NULL)) { + ctxt->state->value = NULL; + ctxt->state->endvalue = NULL; + return (0); + } + while (*cur != 0) + cur++; + while ((cur != ctxt->state->endvalue) && (*cur == 0)) + cur++; + if (cur == ctxt->state->endvalue) + ctxt->state->value = NULL; + else + ctxt->state->value = cur; + return (0); +} + +/** + * xmlRelaxNGValidateValueList: + * @ctxt: a Relax-NG validation context + * @defines: the list of definitions to verify + * + * Validate the given set of definitions for the current value + * + * Returns 0 if the validation succeeded or an error code. + */ +static int +xmlRelaxNGValidateValueList(xmlRelaxNGValidCtxtPtr ctxt, + xmlRelaxNGDefinePtr defines) +{ + int ret = 0; + + while (defines != NULL) { + ret = xmlRelaxNGValidateValue(ctxt, defines); + if (ret != 0) + break; + defines = defines->next; + } + return (ret); +} + +/** + * xmlRelaxNGValidateValue: + * @ctxt: a Relax-NG validation context + * @define: the definition to verify + * + * Validate the given definition for the current value + * + * Returns 0 if the validation succeeded or an error code. + */ +static int +xmlRelaxNGValidateValue(xmlRelaxNGValidCtxtPtr ctxt, + xmlRelaxNGDefinePtr define) +{ + int ret = 0, oldflags; + xmlChar *value; + + value = ctxt->state->value; + switch (define->type) { + case XML_RELAXNG_EMPTY:{ + if ((value != NULL) && (value[0] != 0)) { + int idx = 0; + + while (IS_BLANK_CH(value[idx])) + idx++; + if (value[idx] != 0) + ret = -1; + } + break; + } + case XML_RELAXNG_TEXT: + break; + case XML_RELAXNG_VALUE:{ + if (!xmlStrEqual(value, define->value)) { + if (define->name != NULL) { + xmlRelaxNGTypeLibraryPtr lib; + + lib = (xmlRelaxNGTypeLibraryPtr) define->data; + if ((lib != NULL) && (lib->comp != NULL)) { + ret = lib->comp(lib->data, define->name, + define->value, define->node, + (void *) define->attrs, + value, ctxt->state->node); + } else + ret = -1; + if (ret < 0) { + VALID_ERR2(XML_RELAXNG_ERR_TYPECMP, + define->name); + return (-1); + } else if (ret == 1) { + ret = 0; + } else { + ret = -1; + } + } else { + xmlChar *nval, *nvalue; + + /* + * TODO: trivial optimizations are possible by + * computing at compile-time + */ + nval = xmlRelaxNGNormalize(ctxt, define->value); + nvalue = xmlRelaxNGNormalize(ctxt, value); + + if ((nval == NULL) || (nvalue == NULL) || + (!xmlStrEqual(nval, nvalue))) + ret = -1; + if (nval != NULL) + xmlFree(nval); + if (nvalue != NULL) + xmlFree(nvalue); + } + } + if (ret == 0) + xmlRelaxNGNextValue(ctxt); + break; + } + case XML_RELAXNG_DATATYPE:{ + ret = xmlRelaxNGValidateDatatype(ctxt, value, define, + ctxt->state->seq); + if (ret == 0) + xmlRelaxNGNextValue(ctxt); + + break; + } + case XML_RELAXNG_CHOICE:{ + xmlRelaxNGDefinePtr list = define->content; + xmlChar *oldvalue; + + oldflags = ctxt->flags; + ctxt->flags |= FLAGS_IGNORABLE; + + oldvalue = ctxt->state->value; + while (list != NULL) { + ret = xmlRelaxNGValidateValue(ctxt, list); + if (ret == 0) { + break; + } + ctxt->state->value = oldvalue; + list = list->next; + } + ctxt->flags = oldflags; + if (ret != 0) { + if ((ctxt->flags & FLAGS_IGNORABLE) == 0) + xmlRelaxNGDumpValidError(ctxt); + } else { + if (ctxt->errNr > 0) + xmlRelaxNGPopErrors(ctxt, 0); + } + break; + } + case XML_RELAXNG_LIST:{ + xmlRelaxNGDefinePtr list = define->content; + xmlChar *oldvalue, *oldend, *val, *cur; + +#ifdef DEBUG_LIST + int nb_values = 0; +#endif + + oldvalue = ctxt->state->value; + oldend = ctxt->state->endvalue; + + val = xmlStrdup(oldvalue); + if (val == NULL) { + val = xmlStrdup(BAD_CAST ""); + } + if (val == NULL) { + VALID_ERR(XML_RELAXNG_ERR_NOSTATE); + return (-1); + } + cur = val; + while (*cur != 0) { + if (IS_BLANK_CH(*cur)) { + *cur = 0; + cur++; +#ifdef DEBUG_LIST + nb_values++; +#endif + while (IS_BLANK_CH(*cur)) + *cur++ = 0; + } else + cur++; + } +#ifdef DEBUG_LIST + xmlGenericError(xmlGenericErrorContext, + "list value: '%s' found %d items\n", + oldvalue, nb_values); + nb_values = 0; +#endif + ctxt->state->endvalue = cur; + cur = val; + while ((*cur == 0) && (cur != ctxt->state->endvalue)) + cur++; + + ctxt->state->value = cur; + + while (list != NULL) { + if (ctxt->state->value == ctxt->state->endvalue) + ctxt->state->value = NULL; + ret = xmlRelaxNGValidateValue(ctxt, list); + if (ret != 0) { +#ifdef DEBUG_LIST + xmlGenericError(xmlGenericErrorContext, + "Failed to validate value: '%s' with %d rule\n", + ctxt->state->value, nb_values); +#endif + break; + } +#ifdef DEBUG_LIST + nb_values++; +#endif + list = list->next; + } + + if ((ret == 0) && (ctxt->state->value != NULL) && + (ctxt->state->value != ctxt->state->endvalue)) { + VALID_ERR2(XML_RELAXNG_ERR_LISTEXTRA, + ctxt->state->value); + ret = -1; + } + xmlFree(val); + ctxt->state->value = oldvalue; + ctxt->state->endvalue = oldend; + break; + } + case XML_RELAXNG_ONEORMORE: + ret = xmlRelaxNGValidateValueList(ctxt, define->content); + if (ret != 0) { + break; + } + /* no break on purpose */ + case XML_RELAXNG_ZEROORMORE:{ + xmlChar *cur, *temp; + + if ((ctxt->state->value == NULL) || + (*ctxt->state->value == 0)) { + ret = 0; + break; + } + oldflags = ctxt->flags; + ctxt->flags |= FLAGS_IGNORABLE; + cur = ctxt->state->value; + temp = NULL; + while ((cur != NULL) && (cur != ctxt->state->endvalue) && + (temp != cur)) { + temp = cur; + ret = + xmlRelaxNGValidateValueList(ctxt, define->content); + if (ret != 0) { + ctxt->state->value = temp; + ret = 0; + break; + } + cur = ctxt->state->value; + } + ctxt->flags = oldflags; + if (ctxt->errNr > 0) + xmlRelaxNGPopErrors(ctxt, 0); + break; + } + case XML_RELAXNG_OPTIONAL:{ + xmlChar *temp; + + if ((ctxt->state->value == NULL) || + (*ctxt->state->value == 0)) { + ret = 0; + break; + } + oldflags = ctxt->flags; + ctxt->flags |= FLAGS_IGNORABLE; + temp = ctxt->state->value; + ret = xmlRelaxNGValidateValue(ctxt, define->content); + ctxt->flags = oldflags; + if (ret != 0) { + ctxt->state->value = temp; + if (ctxt->errNr > 0) + xmlRelaxNGPopErrors(ctxt, 0); + ret = 0; + break; + } + if (ctxt->errNr > 0) + xmlRelaxNGPopErrors(ctxt, 0); + break; + } + case XML_RELAXNG_EXCEPT:{ + xmlRelaxNGDefinePtr list; + + list = define->content; + while (list != NULL) { + ret = xmlRelaxNGValidateValue(ctxt, list); + if (ret == 0) { + ret = -1; + break; + } else + ret = 0; + list = list->next; + } + break; + } + case XML_RELAXNG_DEF: + case XML_RELAXNG_GROUP:{ + xmlRelaxNGDefinePtr list; + + list = define->content; + while (list != NULL) { + ret = xmlRelaxNGValidateValue(ctxt, list); + if (ret != 0) { + ret = -1; + break; + } else + ret = 0; + list = list->next; + } + break; + } + case XML_RELAXNG_REF: + case XML_RELAXNG_PARENTREF: + if (define->content == NULL) { + VALID_ERR(XML_RELAXNG_ERR_NODEFINE); + ret = -1; + } else { + ret = xmlRelaxNGValidateValue(ctxt, define->content); + } + break; + default: + TODO ret = -1; + } + return (ret); +} + +/** + * xmlRelaxNGValidateValueContent: + * @ctxt: a Relax-NG validation context + * @defines: the list of definitions to verify + * + * Validate the given definitions for the current value + * + * Returns 0 if the validation succeeded or an error code. + */ +static int +xmlRelaxNGValidateValueContent(xmlRelaxNGValidCtxtPtr ctxt, + xmlRelaxNGDefinePtr defines) +{ + int ret = 0; + + while (defines != NULL) { + ret = xmlRelaxNGValidateValue(ctxt, defines); + if (ret != 0) + break; + defines = defines->next; + } + return (ret); +} + +/** + * xmlRelaxNGAttributeMatch: + * @ctxt: a Relax-NG validation context + * @define: the definition to check + * @prop: the attribute + * + * Check if the attribute matches the definition nameClass + * + * Returns 1 if the attribute matches, 0 if no, or -1 in case of error + */ +static int +xmlRelaxNGAttributeMatch(xmlRelaxNGValidCtxtPtr ctxt, + xmlRelaxNGDefinePtr define, xmlAttrPtr prop) +{ + int ret; + + if (define->name != NULL) { + if (!xmlStrEqual(define->name, prop->name)) + return (0); + } + if (define->ns != NULL) { + if (define->ns[0] == 0) { + if (prop->ns != NULL) + return (0); + } else { + if ((prop->ns == NULL) || + (!xmlStrEqual(define->ns, prop->ns->href))) + return (0); + } + } + if (define->nameClass == NULL) + return (1); + define = define->nameClass; + if (define->type == XML_RELAXNG_EXCEPT) { + xmlRelaxNGDefinePtr list; + + list = define->content; + while (list != NULL) { + ret = xmlRelaxNGAttributeMatch(ctxt, list, prop); + if (ret == 1) + return (0); + if (ret < 0) + return (ret); + list = list->next; + } + } else { + TODO} + return (1); +} + +/** + * xmlRelaxNGValidateAttribute: + * @ctxt: a Relax-NG validation context + * @define: the definition to verify + * + * Validate the given attribute definition for that node + * + * Returns 0 if the validation succeeded or an error code. + */ +static int +xmlRelaxNGValidateAttribute(xmlRelaxNGValidCtxtPtr ctxt, + xmlRelaxNGDefinePtr define) +{ + int ret = 0, i; + xmlChar *value, *oldvalue; + xmlAttrPtr prop = NULL, tmp; + xmlNodePtr oldseq; + + if (ctxt->state->nbAttrLeft <= 0) + return (-1); + if (define->name != NULL) { + for (i = 0; i < ctxt->state->nbAttrs; i++) { + tmp = ctxt->state->attrs[i]; + if ((tmp != NULL) && (xmlStrEqual(define->name, tmp->name))) { + if ((((define->ns == NULL) || (define->ns[0] == 0)) && + (tmp->ns == NULL)) || + ((tmp->ns != NULL) && + (xmlStrEqual(define->ns, tmp->ns->href)))) { + prop = tmp; + break; + } + } + } + if (prop != NULL) { + value = xmlNodeListGetString(prop->doc, prop->children, 1); + oldvalue = ctxt->state->value; + oldseq = ctxt->state->seq; + ctxt->state->seq = (xmlNodePtr) prop; + ctxt->state->value = value; + ctxt->state->endvalue = NULL; + ret = xmlRelaxNGValidateValueContent(ctxt, define->content); + if (ctxt->state->value != NULL) + value = ctxt->state->value; + if (value != NULL) + xmlFree(value); + ctxt->state->value = oldvalue; + ctxt->state->seq = oldseq; + if (ret == 0) { + /* + * flag the attribute as processed + */ + ctxt->state->attrs[i] = NULL; + ctxt->state->nbAttrLeft--; + } + } else { + ret = -1; + } +#ifdef DEBUG + xmlGenericError(xmlGenericErrorContext, + "xmlRelaxNGValidateAttribute(%s): %d\n", + define->name, ret); +#endif + } else { + for (i = 0; i < ctxt->state->nbAttrs; i++) { + tmp = ctxt->state->attrs[i]; + if ((tmp != NULL) && + (xmlRelaxNGAttributeMatch(ctxt, define, tmp) == 1)) { + prop = tmp; + break; + } + } + if (prop != NULL) { + value = xmlNodeListGetString(prop->doc, prop->children, 1); + oldvalue = ctxt->state->value; + oldseq = ctxt->state->seq; + ctxt->state->seq = (xmlNodePtr) prop; + ctxt->state->value = value; + ret = xmlRelaxNGValidateValueContent(ctxt, define->content); + if (ctxt->state->value != NULL) + value = ctxt->state->value; + if (value != NULL) + xmlFree(value); + ctxt->state->value = oldvalue; + ctxt->state->seq = oldseq; + if (ret == 0) { + /* + * flag the attribute as processed + */ + ctxt->state->attrs[i] = NULL; + ctxt->state->nbAttrLeft--; + } + } else { + ret = -1; + } +#ifdef DEBUG + if (define->ns != NULL) { + xmlGenericError(xmlGenericErrorContext, + "xmlRelaxNGValidateAttribute(nsName ns = %s): %d\n", + define->ns, ret); + } else { + xmlGenericError(xmlGenericErrorContext, + "xmlRelaxNGValidateAttribute(anyName): %d\n", + ret); + } +#endif + } + + return (ret); +} + +/** + * xmlRelaxNGValidateAttributeList: + * @ctxt: a Relax-NG validation context + * @define: the list of definition to verify + * + * Validate the given node against the list of attribute definitions + * + * Returns 0 if the validation succeeded or an error code. + */ +static int +xmlRelaxNGValidateAttributeList(xmlRelaxNGValidCtxtPtr ctxt, + xmlRelaxNGDefinePtr defines) +{ + int ret = 0, res; + int needmore = 0; + xmlRelaxNGDefinePtr cur; + + cur = defines; + while (cur != NULL) { + if (cur->type == XML_RELAXNG_ATTRIBUTE) { + if (xmlRelaxNGValidateAttribute(ctxt, cur) != 0) + ret = -1; + } else + needmore = 1; + cur = cur->next; + } + if (!needmore) + return (ret); + cur = defines; + while (cur != NULL) { + if (cur->type != XML_RELAXNG_ATTRIBUTE) { + if ((ctxt->state != NULL) || (ctxt->states != NULL)) { + res = xmlRelaxNGValidateDefinition(ctxt, cur); + if (res < 0) + ret = -1; + } else { + VALID_ERR(XML_RELAXNG_ERR_NOSTATE); + return (-1); + } + if (res == -1) /* continues on -2 */ + break; + } + cur = cur->next; + } + + return (ret); +} + +/** + * xmlRelaxNGNodeMatchesList: + * @node: the node + * @list: a NULL terminated array of definitions + * + * Check if a node can be matched by one of the definitions + * + * Returns 1 if matches 0 otherwise + */ +static int +xmlRelaxNGNodeMatchesList(xmlNodePtr node, xmlRelaxNGDefinePtr * list) +{ + xmlRelaxNGDefinePtr cur; + int i = 0, tmp; + + if ((node == NULL) || (list == NULL)) + return (0); + + cur = list[i++]; + while (cur != NULL) { + if ((node->type == XML_ELEMENT_NODE) && + (cur->type == XML_RELAXNG_ELEMENT)) { + tmp = xmlRelaxNGElementMatch(NULL, cur, node); + if (tmp == 1) + return (1); + } else if (((node->type == XML_TEXT_NODE) || + (node->type == XML_CDATA_SECTION_NODE)) && + (cur->type == XML_RELAXNG_TEXT)) { + return (1); + } + cur = list[i++]; + } + return (0); +} + +/** + * xmlRelaxNGValidateInterleave: + * @ctxt: a Relax-NG validation context + * @define: the definition to verify + * + * Validate an interleave definition for a node. + * + * Returns 0 if the validation succeeded or an error code. + */ +static int +xmlRelaxNGValidateInterleave(xmlRelaxNGValidCtxtPtr ctxt, + xmlRelaxNGDefinePtr define) +{ + int ret = 0, i, nbgroups; + int errNr = ctxt->errNr; + int oldflags; + + xmlRelaxNGValidStatePtr oldstate; + xmlRelaxNGPartitionPtr partitions; + xmlRelaxNGInterleaveGroupPtr group = NULL; + xmlNodePtr cur, start, last = NULL, lastchg = NULL, lastelem; + xmlNodePtr *list = NULL, *lasts = NULL; + + if (define->data != NULL) { + partitions = (xmlRelaxNGPartitionPtr) define->data; + nbgroups = partitions->nbgroups; + } else { + VALID_ERR(XML_RELAXNG_ERR_INTERNODATA); + return (-1); + } + /* + * Optimizations for MIXED + */ + oldflags = ctxt->flags; + if (define->dflags & IS_MIXED) { + ctxt->flags |= FLAGS_MIXED_CONTENT; + if (nbgroups == 2) { + /* + * this is a pure case + */ + if (ctxt->state != NULL) + ctxt->state->seq = xmlRelaxNGSkipIgnored(ctxt, + ctxt->state->seq); + if (partitions->groups[0]->rule->type == XML_RELAXNG_TEXT) + ret = xmlRelaxNGValidateDefinition(ctxt, + partitions->groups[1]-> + rule); + else + ret = xmlRelaxNGValidateDefinition(ctxt, + partitions->groups[0]-> + rule); + if (ret == 0) { + if (ctxt->state != NULL) + ctxt->state->seq = xmlRelaxNGSkipIgnored(ctxt, + ctxt->state-> + seq); + } + ctxt->flags = oldflags; + return (ret); + } + } + + /* + * Build arrays to store the first and last node of the chain + * pertaining to each group + */ + list = (xmlNodePtr *) xmlMalloc(nbgroups * sizeof(xmlNodePtr)); + if (list == NULL) { + xmlRngVErrMemory(ctxt, "validating\n"); + return (-1); + } + memset(list, 0, nbgroups * sizeof(xmlNodePtr)); + lasts = (xmlNodePtr *) xmlMalloc(nbgroups * sizeof(xmlNodePtr)); + if (lasts == NULL) { + xmlRngVErrMemory(ctxt, "validating\n"); + return (-1); + } + memset(lasts, 0, nbgroups * sizeof(xmlNodePtr)); + + /* + * Walk the sequence of children finding the right group and + * sorting them in sequences. + */ + cur = ctxt->state->seq; + cur = xmlRelaxNGSkipIgnored(ctxt, cur); + start = cur; + while (cur != NULL) { + ctxt->state->seq = cur; + if ((partitions->triage != NULL) && + (partitions->flags & IS_DETERMINIST)) { + void *tmp = NULL; + + if ((cur->type == XML_TEXT_NODE) || + (cur->type == XML_CDATA_SECTION_NODE)) { + tmp = xmlHashLookup2(partitions->triage, BAD_CAST "#text", + NULL); + } else if (cur->type == XML_ELEMENT_NODE) { + if (cur->ns != NULL) { + tmp = xmlHashLookup2(partitions->triage, cur->name, + cur->ns->href); + if (tmp == NULL) + tmp = xmlHashLookup2(partitions->triage, + BAD_CAST "#any", + cur->ns->href); + } else + tmp = + xmlHashLookup2(partitions->triage, cur->name, + NULL); + if (tmp == NULL) + tmp = + xmlHashLookup2(partitions->triage, BAD_CAST "#any", + NULL); + } + + if (tmp == NULL) { + i = nbgroups; + } else { + i = ((long) tmp) - 1; + if (partitions->flags & IS_NEEDCHECK) { + group = partitions->groups[i]; + if (!xmlRelaxNGNodeMatchesList(cur, group->defs)) + i = nbgroups; + } + } + } else { + for (i = 0; i < nbgroups; i++) { + group = partitions->groups[i]; + if (group == NULL) + continue; + if (xmlRelaxNGNodeMatchesList(cur, group->defs)) + break; + } + } + /* + * We break as soon as an element not matched is found + */ + if (i >= nbgroups) { + break; + } + if (lasts[i] != NULL) { + lasts[i]->next = cur; + lasts[i] = cur; + } else { + list[i] = cur; + lasts[i] = cur; + } + if (cur->next != NULL) + lastchg = cur->next; + else + lastchg = cur; + cur = xmlRelaxNGSkipIgnored(ctxt, cur->next); + } + if (ret != 0) { + VALID_ERR(XML_RELAXNG_ERR_INTERSEQ); + ret = -1; + goto done; + } + lastelem = cur; + oldstate = ctxt->state; + for (i = 0; i < nbgroups; i++) { + ctxt->state = xmlRelaxNGCopyValidState(ctxt, oldstate); + group = partitions->groups[i]; + if (lasts[i] != NULL) { + last = lasts[i]->next; + lasts[i]->next = NULL; + } + ctxt->state->seq = list[i]; + ret = xmlRelaxNGValidateDefinition(ctxt, group->rule); + if (ret != 0) + break; + if (ctxt->state != NULL) { + cur = ctxt->state->seq; + cur = xmlRelaxNGSkipIgnored(ctxt, cur); + xmlRelaxNGFreeValidState(ctxt, oldstate); + oldstate = ctxt->state; + ctxt->state = NULL; + if (cur != NULL) { + VALID_ERR2(XML_RELAXNG_ERR_INTEREXTRA, cur->name); + ret = -1; + ctxt->state = oldstate; + goto done; + } + } else if (ctxt->states != NULL) { + int j; + int found = 0; + int best = -1; + int lowattr = -1; + + /* + * PBM: what happen if there is attributes checks in the interleaves + */ + + for (j = 0; j < ctxt->states->nbState; j++) { + cur = ctxt->states->tabState[j]->seq; + cur = xmlRelaxNGSkipIgnored(ctxt, cur); + if (cur == NULL) { + if (found == 0) { + lowattr = ctxt->states->tabState[j]->nbAttrLeft; + best = j; + } + found = 1; + if (ctxt->states->tabState[j]->nbAttrLeft <= lowattr) { + /* try to keep the latest one to mach old heuristic */ + lowattr = ctxt->states->tabState[j]->nbAttrLeft; + best = j; + } + if (lowattr == 0) + break; + } else if (found == 0) { + if (lowattr == -1) { + lowattr = ctxt->states->tabState[j]->nbAttrLeft; + best = j; + } else + if (ctxt->states->tabState[j]->nbAttrLeft <= lowattr) { + /* try to keep the latest one to mach old heuristic */ + lowattr = ctxt->states->tabState[j]->nbAttrLeft; + best = j; + } + } + } + /* + * BIG PBM: here we pick only one restarting point :-( + */ + if (ctxt->states->nbState > 0) { + xmlRelaxNGFreeValidState(ctxt, oldstate); + if (best != -1) { + oldstate = ctxt->states->tabState[best]; + ctxt->states->tabState[best] = NULL; + } else { + oldstate = + ctxt->states->tabState[ctxt->states->nbState - 1]; + ctxt->states->tabState[ctxt->states->nbState - 1] = NULL; + ctxt->states->nbState--; + } + } + for (j = 0; j < ctxt->states->nbState ; j++) { + xmlRelaxNGFreeValidState(ctxt, ctxt->states->tabState[j]); + } + xmlRelaxNGFreeStates(ctxt, ctxt->states); + ctxt->states = NULL; + if (found == 0) { + if (cur == NULL) { + VALID_ERR2(XML_RELAXNG_ERR_INTEREXTRA, + (const xmlChar *) "noname"); + } else { + VALID_ERR2(XML_RELAXNG_ERR_INTEREXTRA, cur->name); + } + ret = -1; + ctxt->state = oldstate; + goto done; + } + } else { + ret = -1; + break; + } + if (lasts[i] != NULL) { + lasts[i]->next = last; + } + } + if (ctxt->state != NULL) + xmlRelaxNGFreeValidState(ctxt, ctxt->state); + ctxt->state = oldstate; + ctxt->state->seq = lastelem; + if (ret != 0) { + VALID_ERR(XML_RELAXNG_ERR_INTERSEQ); + ret = -1; + goto done; + } + + done: + ctxt->flags = oldflags; + /* + * builds the next links chain from the prev one + */ + cur = lastchg; + while (cur != NULL) { + if ((cur == start) || (cur->prev == NULL)) + break; + cur->prev->next = cur; + cur = cur->prev; + } + if (ret == 0) { + if (ctxt->errNr > errNr) + xmlRelaxNGPopErrors(ctxt, errNr); + } + + xmlFree(list); + xmlFree(lasts); + return (ret); +} + +/** + * xmlRelaxNGValidateDefinitionList: + * @ctxt: a Relax-NG validation context + * @define: the list of definition to verify + * + * Validate the given node content against the (list) of definitions + * + * Returns 0 if the validation succeeded or an error code. + */ +static int +xmlRelaxNGValidateDefinitionList(xmlRelaxNGValidCtxtPtr ctxt, + xmlRelaxNGDefinePtr defines) +{ + int ret = 0, res; + + + if (defines == NULL) { + VALID_ERR2(XML_RELAXNG_ERR_INTERNAL, + BAD_CAST "NULL definition list"); + return (-1); + } + while (defines != NULL) { + if ((ctxt->state != NULL) || (ctxt->states != NULL)) { + res = xmlRelaxNGValidateDefinition(ctxt, defines); + if (res < 0) + ret = -1; + } else { + VALID_ERR(XML_RELAXNG_ERR_NOSTATE); + return (-1); + } + if (res == -1) /* continues on -2 */ + break; + defines = defines->next; + } + + return (ret); +} + +/** + * xmlRelaxNGElementMatch: + * @ctxt: a Relax-NG validation context + * @define: the definition to check + * @elem: the element + * + * Check if the element matches the definition nameClass + * + * Returns 1 if the element matches, 0 if no, or -1 in case of error + */ +static int +xmlRelaxNGElementMatch(xmlRelaxNGValidCtxtPtr ctxt, + xmlRelaxNGDefinePtr define, xmlNodePtr elem) +{ + int ret = 0, oldflags = 0; + + if (define->name != NULL) { + if (!xmlStrEqual(elem->name, define->name)) { + VALID_ERR3(XML_RELAXNG_ERR_ELEMNAME, define->name, elem->name); + return (0); + } + } + if ((define->ns != NULL) && (define->ns[0] != 0)) { + if (elem->ns == NULL) { + VALID_ERR2(XML_RELAXNG_ERR_ELEMNONS, elem->name); + return (0); + } else if (!xmlStrEqual(elem->ns->href, define->ns)) { + VALID_ERR3(XML_RELAXNG_ERR_ELEMWRONGNS, + elem->name, define->ns); + return (0); + } + } else if ((elem->ns != NULL) && (define->ns != NULL) && + (define->name == NULL)) { + VALID_ERR2(XML_RELAXNG_ERR_ELEMEXTRANS, elem->name); + return (0); + } else if ((elem->ns != NULL) && (define->name != NULL)) { + VALID_ERR2(XML_RELAXNG_ERR_ELEMEXTRANS, define->name); + return (0); + } + + if (define->nameClass == NULL) + return (1); + + define = define->nameClass; + if (define->type == XML_RELAXNG_EXCEPT) { + xmlRelaxNGDefinePtr list; + + if (ctxt != NULL) { + oldflags = ctxt->flags; + ctxt->flags |= FLAGS_IGNORABLE; + } + + list = define->content; + while (list != NULL) { + ret = xmlRelaxNGElementMatch(ctxt, list, elem); + if (ret == 1) { + if (ctxt != NULL) + ctxt->flags = oldflags; + return (0); + } + if (ret < 0) { + if (ctxt != NULL) + ctxt->flags = oldflags; + return (ret); + } + list = list->next; + } + ret = 1; + if (ctxt != NULL) { + ctxt->flags = oldflags; + } + } else if (define->type == XML_RELAXNG_CHOICE) { + xmlRelaxNGDefinePtr list; + + if (ctxt != NULL) { + oldflags = ctxt->flags; + ctxt->flags |= FLAGS_IGNORABLE; + } + + list = define->nameClass; + while (list != NULL) { + ret = xmlRelaxNGElementMatch(ctxt, list, elem); + if (ret == 1) { + if (ctxt != NULL) + ctxt->flags = oldflags; + return (1); + } + if (ret < 0) { + if (ctxt != NULL) + ctxt->flags = oldflags; + return (ret); + } + list = list->next; + } + if (ctxt != NULL) { + if (ret != 0) { + if ((ctxt->flags & FLAGS_IGNORABLE) == 0) + xmlRelaxNGDumpValidError(ctxt); + } else { + if (ctxt->errNr > 0) + xmlRelaxNGPopErrors(ctxt, 0); + } + } + ret = 0; + if (ctxt != NULL) { + ctxt->flags = oldflags; + } + } else { + TODO ret = -1; + } + return (ret); +} + +/** + * xmlRelaxNGBestState: + * @ctxt: a Relax-NG validation context + * + * Find the "best" state in the ctxt->states list of states to report + * errors about. I.e. a state with no element left in the child list + * or the one with the less attributes left. + * This is called only if a falidation error was detected + * + * Returns the index of the "best" state or -1 in case of error + */ +static int +xmlRelaxNGBestState(xmlRelaxNGValidCtxtPtr ctxt) +{ + xmlRelaxNGValidStatePtr state; + int i, tmp; + int best = -1; + int value = 1000000; + + if ((ctxt == NULL) || (ctxt->states == NULL) || + (ctxt->states->nbState <= 0)) + return (-1); + + for (i = 0; i < ctxt->states->nbState; i++) { + state = ctxt->states->tabState[i]; + if (state == NULL) + continue; + if (state->seq != NULL) { + if ((best == -1) || (value > 100000)) { + value = 100000; + best = i; + } + } else { + tmp = state->nbAttrLeft; + if ((best == -1) || (value > tmp)) { + value = tmp; + best = i; + } + } + } + return (best); +} + +/** + * xmlRelaxNGLogBestError: + * @ctxt: a Relax-NG validation context + * + * Find the "best" state in the ctxt->states list of states to report + * errors about and log it. + */ +static void +xmlRelaxNGLogBestError(xmlRelaxNGValidCtxtPtr ctxt) +{ + int best; + + if ((ctxt == NULL) || (ctxt->states == NULL) || + (ctxt->states->nbState <= 0)) + return; + + best = xmlRelaxNGBestState(ctxt); + if ((best >= 0) && (best < ctxt->states->nbState)) { + ctxt->state = ctxt->states->tabState[best]; + + xmlRelaxNGValidateElementEnd(ctxt, 1); + } +} + +/** + * xmlRelaxNGValidateElementEnd: + * @ctxt: a Relax-NG validation context + * @dolog: indicate that error logging should be done + * + * Validate the end of the element, implements check that + * there is nothing left not consumed in the element content + * or in the attribute list. + * + * Returns 0 if the validation succeeded or an error code. + */ +static int +xmlRelaxNGValidateElementEnd(xmlRelaxNGValidCtxtPtr ctxt, int dolog) +{ + int i; + xmlRelaxNGValidStatePtr state; + + state = ctxt->state; + if (state->seq != NULL) { + state->seq = xmlRelaxNGSkipIgnored(ctxt, state->seq); + if (state->seq != NULL) { + if (dolog) { + VALID_ERR3(XML_RELAXNG_ERR_EXTRACONTENT, + state->node->name, state->seq->name); + } + return (-1); + } + } + for (i = 0; i < state->nbAttrs; i++) { + if (state->attrs[i] != NULL) { + if (dolog) { + VALID_ERR3(XML_RELAXNG_ERR_INVALIDATTR, + state->attrs[i]->name, state->node->name); + } + return (-1 - i); + } + } + return (0); +} + +/** + * xmlRelaxNGValidateState: + * @ctxt: a Relax-NG validation context + * @define: the definition to verify + * + * Validate the current state against the definition + * + * Returns 0 if the validation succeeded or an error code. + */ +static int +xmlRelaxNGValidateState(xmlRelaxNGValidCtxtPtr ctxt, + xmlRelaxNGDefinePtr define) +{ + xmlNodePtr node; + int ret = 0, i, tmp, oldflags, errNr; + xmlRelaxNGValidStatePtr oldstate = NULL, state; + + if (define == NULL) { + VALID_ERR(XML_RELAXNG_ERR_NODEFINE); + return (-1); + } + + if (ctxt->state != NULL) { + node = ctxt->state->seq; + } else { + node = NULL; + } +#ifdef DEBUG + for (i = 0; i < ctxt->depth; i++) + xmlGenericError(xmlGenericErrorContext, " "); + xmlGenericError(xmlGenericErrorContext, + "Start validating %s ", xmlRelaxNGDefName(define)); + if (define->name != NULL) + xmlGenericError(xmlGenericErrorContext, "%s ", define->name); + if ((node != NULL) && (node->name != NULL)) + xmlGenericError(xmlGenericErrorContext, "on %s\n", node->name); + else + xmlGenericError(xmlGenericErrorContext, "\n"); +#endif + ctxt->depth++; + switch (define->type) { + case XML_RELAXNG_EMPTY: + node = xmlRelaxNGSkipIgnored(ctxt, node); + ret = 0; + break; + case XML_RELAXNG_NOT_ALLOWED: + ret = -1; + break; + case XML_RELAXNG_TEXT: + while ((node != NULL) && + ((node->type == XML_TEXT_NODE) || + (node->type == XML_COMMENT_NODE) || + (node->type == XML_PI_NODE) || + (node->type == XML_CDATA_SECTION_NODE))) + node = node->next; + ctxt->state->seq = node; + break; + case XML_RELAXNG_ELEMENT: + errNr = ctxt->errNr; + node = xmlRelaxNGSkipIgnored(ctxt, node); + if (node == NULL) { + VALID_ERR2(XML_RELAXNG_ERR_NOELEM, define->name); + ret = -1; + if ((ctxt->flags & FLAGS_IGNORABLE) == 0) + xmlRelaxNGDumpValidError(ctxt); + break; + } + if (node->type != XML_ELEMENT_NODE) { + VALID_ERR(XML_RELAXNG_ERR_NOTELEM); + ret = -1; + if ((ctxt->flags & FLAGS_IGNORABLE) == 0) + xmlRelaxNGDumpValidError(ctxt); + break; + } + /* + * This node was already validated successfully against + * this definition. + */ + if (node->psvi == define) { + ctxt->state->seq = xmlRelaxNGSkipIgnored(ctxt, node->next); + if (ctxt->errNr > errNr) + xmlRelaxNGPopErrors(ctxt, errNr); + if (ctxt->errNr != 0) { + while ((ctxt->err != NULL) && + (((ctxt->err->err == XML_RELAXNG_ERR_ELEMNAME) + && (xmlStrEqual(ctxt->err->arg2, node->name))) + || + ((ctxt->err->err == + XML_RELAXNG_ERR_ELEMEXTRANS) + && (xmlStrEqual(ctxt->err->arg1, node->name))) + || (ctxt->err->err == XML_RELAXNG_ERR_NOELEM) + || (ctxt->err->err == + XML_RELAXNG_ERR_NOTELEM))) + xmlRelaxNGValidErrorPop(ctxt); + } + break; + } + + ret = xmlRelaxNGElementMatch(ctxt, define, node); + if (ret <= 0) { + ret = -1; + if ((ctxt->flags & FLAGS_IGNORABLE) == 0) + xmlRelaxNGDumpValidError(ctxt); + break; + } + ret = 0; + if (ctxt->errNr != 0) { + if (ctxt->errNr > errNr) + xmlRelaxNGPopErrors(ctxt, errNr); + while ((ctxt->err != NULL) && + (((ctxt->err->err == XML_RELAXNG_ERR_ELEMNAME) && + (xmlStrEqual(ctxt->err->arg2, node->name))) || + ((ctxt->err->err == XML_RELAXNG_ERR_ELEMEXTRANS) && + (xmlStrEqual(ctxt->err->arg1, node->name))) || + (ctxt->err->err == XML_RELAXNG_ERR_NOELEM) || + (ctxt->err->err == XML_RELAXNG_ERR_NOTELEM))) + xmlRelaxNGValidErrorPop(ctxt); + } + errNr = ctxt->errNr; + + oldflags = ctxt->flags; + if (ctxt->flags & FLAGS_MIXED_CONTENT) { + ctxt->flags -= FLAGS_MIXED_CONTENT; + } + state = xmlRelaxNGNewValidState(ctxt, node); + if (state == NULL) { + ret = -1; + if ((ctxt->flags & FLAGS_IGNORABLE) == 0) + xmlRelaxNGDumpValidError(ctxt); + break; + } + + oldstate = ctxt->state; + ctxt->state = state; + if (define->attrs != NULL) { + tmp = xmlRelaxNGValidateAttributeList(ctxt, define->attrs); + if (tmp != 0) { + ret = -1; + VALID_ERR2(XML_RELAXNG_ERR_ATTRVALID, node->name); + } + } + if (define->contModel != NULL) { + xmlRelaxNGValidStatePtr nstate, tmpstate = ctxt->state; + xmlRelaxNGStatesPtr tmpstates = ctxt->states; + xmlNodePtr nseq; + + nstate = xmlRelaxNGNewValidState(ctxt, node); + ctxt->state = nstate; + ctxt->states = NULL; + + tmp = xmlRelaxNGValidateCompiledContent(ctxt, + define->contModel, + ctxt->state->seq); + nseq = ctxt->state->seq; + ctxt->state = tmpstate; + ctxt->states = tmpstates; + xmlRelaxNGFreeValidState(ctxt, nstate); + +#ifdef DEBUG_COMPILE + xmlGenericError(xmlGenericErrorContext, + "Validating content of '%s' : %d\n", + define->name, tmp); +#endif + if (tmp != 0) + ret = -1; + + if (ctxt->states != NULL) { + tmp = -1; + + for (i = 0; i < ctxt->states->nbState; i++) { + state = ctxt->states->tabState[i]; + ctxt->state = state; + ctxt->state->seq = nseq; + + if (xmlRelaxNGValidateElementEnd(ctxt, 0) == 0) { + tmp = 0; + break; + } + } + if (tmp != 0) { + /* + * validation error, log the message for the "best" one + */ + ctxt->flags |= FLAGS_IGNORABLE; + xmlRelaxNGLogBestError(ctxt); + } + for (i = 0; i < ctxt->states->nbState; i++) { + xmlRelaxNGFreeValidState(ctxt, + ctxt->states-> + tabState[i]); + } + xmlRelaxNGFreeStates(ctxt, ctxt->states); + ctxt->flags = oldflags; + ctxt->states = NULL; + if ((ret == 0) && (tmp == -1)) + ret = -1; + } else { + state = ctxt->state; + if (ctxt->state != NULL) + ctxt->state->seq = nseq; + if (ret == 0) + ret = xmlRelaxNGValidateElementEnd(ctxt, 1); + xmlRelaxNGFreeValidState(ctxt, state); + } + } else { + if (define->content != NULL) { + tmp = xmlRelaxNGValidateDefinitionList(ctxt, + define-> + content); + if (tmp != 0) { + ret = -1; + if (ctxt->state == NULL) { + ctxt->state = oldstate; + VALID_ERR2(XML_RELAXNG_ERR_CONTENTVALID, + node->name); + ctxt->state = NULL; + } else { + VALID_ERR2(XML_RELAXNG_ERR_CONTENTVALID, + node->name); + } + + } + } + if (ctxt->states != NULL) { + tmp = -1; + + for (i = 0; i < ctxt->states->nbState; i++) { + state = ctxt->states->tabState[i]; + ctxt->state = state; + + if (xmlRelaxNGValidateElementEnd(ctxt, 0) == 0) { + tmp = 0; + break; + } + } + if (tmp != 0) { + /* + * validation error, log the message for the "best" one + */ + ctxt->flags |= FLAGS_IGNORABLE; + xmlRelaxNGLogBestError(ctxt); + } + for (i = 0; i < ctxt->states->nbState; i++) { + xmlRelaxNGFreeValidState(ctxt, + ctxt->states->tabState[i]); + ctxt->states->tabState[i] = NULL; + } + xmlRelaxNGFreeStates(ctxt, ctxt->states); + ctxt->flags = oldflags; + ctxt->states = NULL; + if ((ret == 0) && (tmp == -1)) + ret = -1; + } else { + state = ctxt->state; + if (ret == 0) + ret = xmlRelaxNGValidateElementEnd(ctxt, 1); + xmlRelaxNGFreeValidState(ctxt, state); + } + } + if (ret == 0) { + node->psvi = define; + } + ctxt->flags = oldflags; + ctxt->state = oldstate; + if (oldstate != NULL) + oldstate->seq = xmlRelaxNGSkipIgnored(ctxt, node->next); + if (ret != 0) { + if ((ctxt->flags & FLAGS_IGNORABLE) == 0) { + xmlRelaxNGDumpValidError(ctxt); + ret = 0; +#if 0 + } else { + ret = -2; +#endif + } + } else { + if (ctxt->errNr > errNr) + xmlRelaxNGPopErrors(ctxt, errNr); + } + +#ifdef DEBUG + xmlGenericError(xmlGenericErrorContext, + "xmlRelaxNGValidateDefinition(): validated %s : %d", + node->name, ret); + if (oldstate == NULL) + xmlGenericError(xmlGenericErrorContext, ": no state\n"); + else if (oldstate->seq == NULL) + xmlGenericError(xmlGenericErrorContext, ": done\n"); + else if (oldstate->seq->type == XML_ELEMENT_NODE) + xmlGenericError(xmlGenericErrorContext, ": next elem %s\n", + oldstate->seq->name); + else + xmlGenericError(xmlGenericErrorContext, ": next %s %d\n", + oldstate->seq->name, oldstate->seq->type); +#endif + break; + case XML_RELAXNG_OPTIONAL:{ + errNr = ctxt->errNr; + oldflags = ctxt->flags; + ctxt->flags |= FLAGS_IGNORABLE; + oldstate = xmlRelaxNGCopyValidState(ctxt, ctxt->state); + ret = + xmlRelaxNGValidateDefinitionList(ctxt, + define->content); + if (ret != 0) { + if (ctxt->state != NULL) + xmlRelaxNGFreeValidState(ctxt, ctxt->state); + ctxt->state = oldstate; + ctxt->flags = oldflags; + ret = 0; + if (ctxt->errNr > errNr) + xmlRelaxNGPopErrors(ctxt, errNr); + break; + } + if (ctxt->states != NULL) { + xmlRelaxNGAddStates(ctxt, ctxt->states, oldstate); + } else { + ctxt->states = xmlRelaxNGNewStates(ctxt, 1); + if (ctxt->states == NULL) { + xmlRelaxNGFreeValidState(ctxt, oldstate); + ctxt->flags = oldflags; + ret = -1; + if (ctxt->errNr > errNr) + xmlRelaxNGPopErrors(ctxt, errNr); + break; + } + xmlRelaxNGAddStates(ctxt, ctxt->states, oldstate); + xmlRelaxNGAddStates(ctxt, ctxt->states, ctxt->state); + ctxt->state = NULL; + } + ctxt->flags = oldflags; + ret = 0; + if (ctxt->errNr > errNr) + xmlRelaxNGPopErrors(ctxt, errNr); + break; + } + case XML_RELAXNG_ONEORMORE: + errNr = ctxt->errNr; + ret = xmlRelaxNGValidateDefinitionList(ctxt, define->content); + if (ret != 0) { + break; + } + if (ctxt->errNr > errNr) + xmlRelaxNGPopErrors(ctxt, errNr); + /* no break on purpose */ + case XML_RELAXNG_ZEROORMORE:{ + int progress; + xmlRelaxNGStatesPtr states = NULL, res = NULL; + int base, j; + + errNr = ctxt->errNr; + res = xmlRelaxNGNewStates(ctxt, 1); + if (res == NULL) { + ret = -1; + break; + } + /* + * All the input states are also exit states + */ + if (ctxt->state != NULL) { + xmlRelaxNGAddStates(ctxt, res, + xmlRelaxNGCopyValidState(ctxt, + ctxt-> + state)); + } else { + for (j = 0; j < ctxt->states->nbState; j++) { + xmlRelaxNGAddStates(ctxt, res, + xmlRelaxNGCopyValidState(ctxt, + ctxt->states->tabState[j])); + } + } + oldflags = ctxt->flags; + ctxt->flags |= FLAGS_IGNORABLE; + do { + progress = 0; + base = res->nbState; + + if (ctxt->states != NULL) { + states = ctxt->states; + for (i = 0; i < states->nbState; i++) { + ctxt->state = states->tabState[i]; + ctxt->states = NULL; + ret = xmlRelaxNGValidateDefinitionList(ctxt, + define-> + content); + if (ret == 0) { + if (ctxt->state != NULL) { + tmp = xmlRelaxNGAddStates(ctxt, res, + ctxt->state); + ctxt->state = NULL; + if (tmp == 1) + progress = 1; + } else if (ctxt->states != NULL) { + for (j = 0; j < ctxt->states->nbState; + j++) { + tmp = + xmlRelaxNGAddStates(ctxt, res, + ctxt->states->tabState[j]); + if (tmp == 1) + progress = 1; + } + xmlRelaxNGFreeStates(ctxt, + ctxt->states); + ctxt->states = NULL; + } + } else { + if (ctxt->state != NULL) { + xmlRelaxNGFreeValidState(ctxt, + ctxt->state); + ctxt->state = NULL; + } + } + } + } else { + ret = xmlRelaxNGValidateDefinitionList(ctxt, + define-> + content); + if (ret != 0) { + xmlRelaxNGFreeValidState(ctxt, ctxt->state); + ctxt->state = NULL; + } else { + base = res->nbState; + if (ctxt->state != NULL) { + tmp = xmlRelaxNGAddStates(ctxt, res, + ctxt->state); + ctxt->state = NULL; + if (tmp == 1) + progress = 1; + } else if (ctxt->states != NULL) { + for (j = 0; j < ctxt->states->nbState; j++) { + tmp = xmlRelaxNGAddStates(ctxt, res, + ctxt->states->tabState[j]); + if (tmp == 1) + progress = 1; + } + if (states == NULL) { + states = ctxt->states; + } else { + xmlRelaxNGFreeStates(ctxt, + ctxt->states); + } + ctxt->states = NULL; + } + } + } + if (progress) { + /* + * Collect all the new nodes added at that step + * and make them the new node set + */ + if (res->nbState - base == 1) { + ctxt->state = xmlRelaxNGCopyValidState(ctxt, + res-> + tabState + [base]); + } else { + if (states == NULL) { + xmlRelaxNGNewStates(ctxt, + res->nbState - base); + states = ctxt->states; + if (states == NULL) { + progress = 0; + break; + } + } + states->nbState = 0; + for (i = base; i < res->nbState; i++) + xmlRelaxNGAddStates(ctxt, states, + xmlRelaxNGCopyValidState + (ctxt, res->tabState[i])); + ctxt->states = states; + } + } + } while (progress == 1); + if (states != NULL) { + xmlRelaxNGFreeStates(ctxt, states); + } + ctxt->states = res; + ctxt->flags = oldflags; +#if 0 + /* + * errors may have to be propagated back... + */ + if (ctxt->errNr > errNr) + xmlRelaxNGPopErrors(ctxt, errNr); +#endif + ret = 0; + break; + } + case XML_RELAXNG_CHOICE:{ + xmlRelaxNGDefinePtr list = NULL; + xmlRelaxNGStatesPtr states = NULL; + + node = xmlRelaxNGSkipIgnored(ctxt, node); + + errNr = ctxt->errNr; + if ((define->dflags & IS_TRIABLE) && (define->data != NULL) && + (node != NULL)) { + /* + * node == NULL can't be optimized since IS_TRIABLE + * doesn't account for choice which may lead to + * only attributes. + */ + xmlHashTablePtr triage = + (xmlHashTablePtr) define->data; + + /* + * Something we can optimize cleanly there is only one + * possble branch out ! + */ + if ((node->type == XML_TEXT_NODE) || + (node->type == XML_CDATA_SECTION_NODE)) { + list = + xmlHashLookup2(triage, BAD_CAST "#text", NULL); + } else if (node->type == XML_ELEMENT_NODE) { + if (node->ns != NULL) { + list = xmlHashLookup2(triage, node->name, + node->ns->href); + if (list == NULL) + list = + xmlHashLookup2(triage, BAD_CAST "#any", + node->ns->href); + } else + list = + xmlHashLookup2(triage, node->name, NULL); + if (list == NULL) + list = + xmlHashLookup2(triage, BAD_CAST "#any", + NULL); + } + if (list == NULL) { + ret = -1; + VALID_ERR2(XML_RELAXNG_ERR_ELEMWRONG, node->name); + break; + } + ret = xmlRelaxNGValidateDefinition(ctxt, list); + if (ret == 0) { + } + break; + } + + list = define->content; + oldflags = ctxt->flags; + ctxt->flags |= FLAGS_IGNORABLE; + + while (list != NULL) { + oldstate = xmlRelaxNGCopyValidState(ctxt, ctxt->state); + ret = xmlRelaxNGValidateDefinition(ctxt, list); + if (ret == 0) { + if (states == NULL) { + states = xmlRelaxNGNewStates(ctxt, 1); + } + if (ctxt->state != NULL) { + xmlRelaxNGAddStates(ctxt, states, ctxt->state); + } else if (ctxt->states != NULL) { + for (i = 0; i < ctxt->states->nbState; i++) { + xmlRelaxNGAddStates(ctxt, states, + ctxt->states-> + tabState[i]); + } + xmlRelaxNGFreeStates(ctxt, ctxt->states); + ctxt->states = NULL; + } + } else { + xmlRelaxNGFreeValidState(ctxt, ctxt->state); + } + ctxt->state = oldstate; + list = list->next; + } + if (states != NULL) { + xmlRelaxNGFreeValidState(ctxt, oldstate); + ctxt->states = states; + ctxt->state = NULL; + ret = 0; + } else { + ctxt->states = NULL; + } + ctxt->flags = oldflags; + if (ret != 0) { + if ((ctxt->flags & FLAGS_IGNORABLE) == 0) { + xmlRelaxNGDumpValidError(ctxt); + } + } else { + if (ctxt->errNr > errNr) + xmlRelaxNGPopErrors(ctxt, errNr); + } + break; + } + case XML_RELAXNG_DEF: + case XML_RELAXNG_GROUP: + ret = xmlRelaxNGValidateDefinitionList(ctxt, define->content); + break; + case XML_RELAXNG_INTERLEAVE: + ret = xmlRelaxNGValidateInterleave(ctxt, define); + break; + case XML_RELAXNG_ATTRIBUTE: + ret = xmlRelaxNGValidateAttribute(ctxt, define); + break; + case XML_RELAXNG_START: + case XML_RELAXNG_NOOP: + case XML_RELAXNG_REF: + case XML_RELAXNG_EXTERNALREF: + case XML_RELAXNG_PARENTREF: + ret = xmlRelaxNGValidateDefinition(ctxt, define->content); + break; + case XML_RELAXNG_DATATYPE:{ + xmlNodePtr child; + xmlChar *content = NULL; + + child = node; + while (child != NULL) { + if (child->type == XML_ELEMENT_NODE) { + VALID_ERR2(XML_RELAXNG_ERR_DATAELEM, + node->parent->name); + ret = -1; + break; + } else if ((child->type == XML_TEXT_NODE) || + (child->type == XML_CDATA_SECTION_NODE)) { + content = xmlStrcat(content, child->content); + } + /* TODO: handle entities ... */ + child = child->next; + } + if (ret == -1) { + if (content != NULL) + xmlFree(content); + break; + } + if (content == NULL) { + content = xmlStrdup(BAD_CAST ""); + if (content == NULL) { + xmlRngVErrMemory(ctxt, "validating\n"); + ret = -1; + break; + } + } + ret = xmlRelaxNGValidateDatatype(ctxt, content, define, + ctxt->state->seq); + if (ret == -1) { + VALID_ERR2(XML_RELAXNG_ERR_DATATYPE, define->name); + } else if (ret == 0) { + ctxt->state->seq = NULL; + } + if (content != NULL) + xmlFree(content); + break; + } + case XML_RELAXNG_VALUE:{ + xmlChar *content = NULL; + xmlChar *oldvalue; + xmlNodePtr child; + + child = node; + while (child != NULL) { + if (child->type == XML_ELEMENT_NODE) { + VALID_ERR2(XML_RELAXNG_ERR_VALELEM, + node->parent->name); + ret = -1; + break; + } else if ((child->type == XML_TEXT_NODE) || + (child->type == XML_CDATA_SECTION_NODE)) { + content = xmlStrcat(content, child->content); + } + /* TODO: handle entities ... */ + child = child->next; + } + if (ret == -1) { + if (content != NULL) + xmlFree(content); + break; + } + if (content == NULL) { + content = xmlStrdup(BAD_CAST ""); + if (content == NULL) { + xmlRngVErrMemory(ctxt, "validating\n"); + ret = -1; + break; + } + } + oldvalue = ctxt->state->value; + ctxt->state->value = content; + ret = xmlRelaxNGValidateValue(ctxt, define); + ctxt->state->value = oldvalue; + if (ret == -1) { + VALID_ERR2(XML_RELAXNG_ERR_VALUE, define->name); + } else if (ret == 0) { + ctxt->state->seq = NULL; + } + if (content != NULL) + xmlFree(content); + break; + } + case XML_RELAXNG_LIST:{ + xmlChar *content; + xmlNodePtr child; + xmlChar *oldvalue, *oldendvalue; + int len; + + /* + * Make sure it's only text nodes + */ + + content = NULL; + child = node; + while (child != NULL) { + if (child->type == XML_ELEMENT_NODE) { + VALID_ERR2(XML_RELAXNG_ERR_LISTELEM, + node->parent->name); + ret = -1; + break; + } else if ((child->type == XML_TEXT_NODE) || + (child->type == XML_CDATA_SECTION_NODE)) { + content = xmlStrcat(content, child->content); + } + /* TODO: handle entities ... */ + child = child->next; + } + if (ret == -1) { + if (content != NULL) + xmlFree(content); + break; + } + if (content == NULL) { + content = xmlStrdup(BAD_CAST ""); + if (content == NULL) { + xmlRngVErrMemory(ctxt, "validating\n"); + ret = -1; + break; + } + } + len = xmlStrlen(content); + oldvalue = ctxt->state->value; + oldendvalue = ctxt->state->endvalue; + ctxt->state->value = content; + ctxt->state->endvalue = content + len; + ret = xmlRelaxNGValidateValue(ctxt, define); + ctxt->state->value = oldvalue; + ctxt->state->endvalue = oldendvalue; + if (ret == -1) { + VALID_ERR(XML_RELAXNG_ERR_LIST); + } else if ((ret == 0) && (node != NULL)) { + ctxt->state->seq = node->next; + } + if (content != NULL) + xmlFree(content); + break; + } + case XML_RELAXNG_EXCEPT: + case XML_RELAXNG_PARAM: + TODO ret = -1; + break; + } + ctxt->depth--; +#ifdef DEBUG + for (i = 0; i < ctxt->depth; i++) + xmlGenericError(xmlGenericErrorContext, " "); + xmlGenericError(xmlGenericErrorContext, + "Validating %s ", xmlRelaxNGDefName(define)); + if (define->name != NULL) + xmlGenericError(xmlGenericErrorContext, "%s ", define->name); + if (ret == 0) + xmlGenericError(xmlGenericErrorContext, "suceeded\n"); + else + xmlGenericError(xmlGenericErrorContext, "failed\n"); +#endif + return (ret); +} + +/** + * xmlRelaxNGValidateDefinition: + * @ctxt: a Relax-NG validation context + * @define: the definition to verify + * + * Validate the current node lists against the definition + * + * Returns 0 if the validation succeeded or an error code. + */ +static int +xmlRelaxNGValidateDefinition(xmlRelaxNGValidCtxtPtr ctxt, + xmlRelaxNGDefinePtr define) +{ + xmlRelaxNGStatesPtr states, res; + int i, j, k, ret, oldflags; + + /* + * We should NOT have both ctxt->state and ctxt->states + */ + if ((ctxt->state != NULL) && (ctxt->states != NULL)) { + TODO xmlRelaxNGFreeValidState(ctxt, ctxt->state); + ctxt->state = NULL; + } + + if ((ctxt->states == NULL) || (ctxt->states->nbState == 1)) { + if (ctxt->states != NULL) { + ctxt->state = ctxt->states->tabState[0]; + xmlRelaxNGFreeStates(ctxt, ctxt->states); + ctxt->states = NULL; + } + ret = xmlRelaxNGValidateState(ctxt, define); + if ((ctxt->state != NULL) && (ctxt->states != NULL)) { + TODO xmlRelaxNGFreeValidState(ctxt, ctxt->state); + ctxt->state = NULL; + } + if ((ctxt->states != NULL) && (ctxt->states->nbState == 1)) { + ctxt->state = ctxt->states->tabState[0]; + xmlRelaxNGFreeStates(ctxt, ctxt->states); + ctxt->states = NULL; + } + return (ret); + } + + states = ctxt->states; + ctxt->states = NULL; + res = NULL; + j = 0; + oldflags = ctxt->flags; + ctxt->flags |= FLAGS_IGNORABLE; + for (i = 0; i < states->nbState; i++) { + ctxt->state = states->tabState[i]; + ctxt->states = NULL; + ret = xmlRelaxNGValidateState(ctxt, define); + /* + * We should NOT have both ctxt->state and ctxt->states + */ + if ((ctxt->state != NULL) && (ctxt->states != NULL)) { + TODO xmlRelaxNGFreeValidState(ctxt, ctxt->state); + ctxt->state = NULL; + } + if (ret == 0) { + if (ctxt->states == NULL) { + if (res != NULL) { + /* add the state to the container */ + xmlRelaxNGAddStates(ctxt, res, ctxt->state); + ctxt->state = NULL; + } else { + /* add the state directly in states */ + states->tabState[j++] = ctxt->state; + ctxt->state = NULL; + } + } else { + if (res == NULL) { + /* make it the new container and copy other results */ + res = ctxt->states; + ctxt->states = NULL; + for (k = 0; k < j; k++) + xmlRelaxNGAddStates(ctxt, res, + states->tabState[k]); + } else { + /* add all the new results to res and reff the container */ + for (k = 0; k < ctxt->states->nbState; k++) + xmlRelaxNGAddStates(ctxt, res, + ctxt->states->tabState[k]); + xmlRelaxNGFreeStates(ctxt, ctxt->states); + ctxt->states = NULL; + } + } + } else { + if (ctxt->state != NULL) { + xmlRelaxNGFreeValidState(ctxt, ctxt->state); + ctxt->state = NULL; + } else if (ctxt->states != NULL) { + for (k = 0; k < ctxt->states->nbState; k++) + xmlRelaxNGFreeValidState(ctxt, + ctxt->states->tabState[k]); + xmlRelaxNGFreeStates(ctxt, ctxt->states); + ctxt->states = NULL; + } + } + } + ctxt->flags = oldflags; + if (res != NULL) { + xmlRelaxNGFreeStates(ctxt, states); + ctxt->states = res; + ret = 0; + } else if (j > 1) { + states->nbState = j; + ctxt->states = states; + ret = 0; + } else if (j == 1) { + ctxt->state = states->tabState[0]; + xmlRelaxNGFreeStates(ctxt, states); + ret = 0; + } else { + ret = -1; + xmlRelaxNGFreeStates(ctxt, states); + if (ctxt->states != NULL) { + xmlRelaxNGFreeStates(ctxt, ctxt->states); + ctxt->states = NULL; + } + } + if ((ctxt->state != NULL) && (ctxt->states != NULL)) { + TODO xmlRelaxNGFreeValidState(ctxt, ctxt->state); + ctxt->state = NULL; + } + return (ret); +} + +/** + * xmlRelaxNGValidateDocument: + * @ctxt: a Relax-NG validation context + * @doc: the document + * + * Validate the given document + * + * Returns 0 if the validation succeeded or an error code. + */ +static int +xmlRelaxNGValidateDocument(xmlRelaxNGValidCtxtPtr ctxt, xmlDocPtr doc) +{ + int ret; + xmlRelaxNGPtr schema; + xmlRelaxNGGrammarPtr grammar; + xmlRelaxNGValidStatePtr state; + xmlNodePtr node; + + if ((ctxt == NULL) || (ctxt->schema == NULL) || (doc == NULL)) + return (-1); + + ctxt->errNo = XML_RELAXNG_OK; + schema = ctxt->schema; + grammar = schema->topgrammar; + if (grammar == NULL) { + VALID_ERR(XML_RELAXNG_ERR_NOGRAMMAR); + return (-1); + } + state = xmlRelaxNGNewValidState(ctxt, NULL); + ctxt->state = state; + ret = xmlRelaxNGValidateDefinition(ctxt, grammar->start); + if ((ctxt->state != NULL) && (state->seq != NULL)) { + state = ctxt->state; + node = state->seq; + node = xmlRelaxNGSkipIgnored(ctxt, node); + if (node != NULL) { + if (ret != -1) { + VALID_ERR(XML_RELAXNG_ERR_EXTRADATA); + ret = -1; + } + } + } else if (ctxt->states != NULL) { + int i; + int tmp = -1; + + for (i = 0; i < ctxt->states->nbState; i++) { + state = ctxt->states->tabState[i]; + node = state->seq; + node = xmlRelaxNGSkipIgnored(ctxt, node); + if (node == NULL) + tmp = 0; + xmlRelaxNGFreeValidState(ctxt, state); + } + if (tmp == -1) { + if (ret != -1) { + VALID_ERR(XML_RELAXNG_ERR_EXTRADATA); + ret = -1; + } + } + } + if (ctxt->state != NULL) { + xmlRelaxNGFreeValidState(ctxt, ctxt->state); + ctxt->state = NULL; + } + if (ret != 0) + xmlRelaxNGDumpValidError(ctxt); +#ifdef DEBUG + else if (ctxt->errNr != 0) { + ctxt->error(ctxt->userData, + "%d Extra error messages left on stack !\n", + ctxt->errNr); + xmlRelaxNGDumpValidError(ctxt); + } +#endif +#ifdef LIBXML_VALID_ENABLED + if (ctxt->idref == 1) { + xmlValidCtxt vctxt; + + memset(&vctxt, 0, sizeof(xmlValidCtxt)); + vctxt.valid = 1; + vctxt.error = ctxt->error; + vctxt.warning = ctxt->warning; + vctxt.userData = ctxt->userData; + + if (xmlValidateDocumentFinal(&vctxt, doc) != 1) + ret = -1; + } +#endif /* LIBXML_VALID_ENABLED */ + if ((ret == 0) && (ctxt->errNo != XML_RELAXNG_OK)) + ret = -1; + + return (ret); +} + +/** + * xmlRelaxNGCleanPSVI: + * @node: an input element or document + * + * Call this routine to speed up XPath computation on static documents. + * This stamps all the element nodes with the document order + * Like for line information, the order is kept in the element->content + * field, the value stored is actually - the node number (starting at -1) + * to be able to differentiate from line numbers. + * + * Returns the number of elements found in the document or -1 in case + * of error. + */ +static void +xmlRelaxNGCleanPSVI(xmlNodePtr node) { + xmlNodePtr cur; + + if ((node == NULL) || + ((node->type != XML_ELEMENT_NODE) && + (node->type != XML_DOCUMENT_NODE) && + (node->type != XML_HTML_DOCUMENT_NODE))) + return; + if (node->type == XML_ELEMENT_NODE) + node->psvi = NULL; + + cur = node->children; + while (cur != NULL) { + if (cur->type == XML_ELEMENT_NODE) { + cur->psvi = NULL; + if (cur->children != NULL) { + cur = cur->children; + continue; + } + } + if (cur->next != NULL) { + cur = cur->next; + continue; + } + do { + cur = cur->parent; + if (cur == NULL) + break; + if (cur == node) { + cur = NULL; + break; + } + if (cur->next != NULL) { + cur = cur->next; + break; + } + } while (cur != NULL); + } + return; +} +/************************************************************************ + * * + * Validation interfaces * + * * + ************************************************************************/ + +/** + * xmlRelaxNGNewValidCtxt: + * @schema: a precompiled XML RelaxNGs + * + * Create an XML RelaxNGs validation context based on the given schema + * + * Returns the validation context or NULL in case of error + */ +xmlRelaxNGValidCtxtPtr +xmlRelaxNGNewValidCtxt(xmlRelaxNGPtr schema) +{ + xmlRelaxNGValidCtxtPtr ret; + + ret = (xmlRelaxNGValidCtxtPtr) xmlMalloc(sizeof(xmlRelaxNGValidCtxt)); + if (ret == NULL) { + xmlRngVErrMemory(NULL, "building context\n"); + return (NULL); + } + memset(ret, 0, sizeof(xmlRelaxNGValidCtxt)); + ret->schema = schema; + ret->error = xmlGenericError; + ret->userData = xmlGenericErrorContext; + ret->errNr = 0; + ret->errMax = 0; + ret->err = NULL; + ret->errTab = NULL; + if (schema != NULL) + ret->idref = schema->idref; + ret->states = NULL; + ret->freeState = NULL; + ret->freeStates = NULL; + ret->errNo = XML_RELAXNG_OK; + return (ret); +} + +/** + * xmlRelaxNGFreeValidCtxt: + * @ctxt: the schema validation context + * + * Free the resources associated to the schema validation context + */ +void +xmlRelaxNGFreeValidCtxt(xmlRelaxNGValidCtxtPtr ctxt) +{ + int k; + + if (ctxt == NULL) + return; + if (ctxt->states != NULL) + xmlRelaxNGFreeStates(NULL, ctxt->states); + if (ctxt->freeState != NULL) { + for (k = 0; k < ctxt->freeState->nbState; k++) { + xmlRelaxNGFreeValidState(NULL, ctxt->freeState->tabState[k]); + } + xmlRelaxNGFreeStates(NULL, ctxt->freeState); + } + if (ctxt->freeStates != NULL) { + for (k = 0; k < ctxt->freeStatesNr; k++) { + xmlRelaxNGFreeStates(NULL, ctxt->freeStates[k]); + } + xmlFree(ctxt->freeStates); + } + if (ctxt->errTab != NULL) + xmlFree(ctxt->errTab); + if (ctxt->elemTab != NULL) { + xmlRegExecCtxtPtr exec; + + exec = xmlRelaxNGElemPop(ctxt); + while (exec != NULL) { + xmlRegFreeExecCtxt(exec); + exec = xmlRelaxNGElemPop(ctxt); + } + xmlFree(ctxt->elemTab); + } + xmlFree(ctxt); +} + +/** + * xmlRelaxNGSetValidErrors: + * @ctxt: a Relax-NG validation context + * @err: the error function + * @warn: the warning function + * @ctx: the functions context + * + * Set the error and warning callback informations + */ +void +xmlRelaxNGSetValidErrors(xmlRelaxNGValidCtxtPtr ctxt, + xmlRelaxNGValidityErrorFunc err, + xmlRelaxNGValidityWarningFunc warn, void *ctx) +{ + if (ctxt == NULL) + return; + ctxt->error = err; + ctxt->warning = warn; + ctxt->userData = ctx; + ctxt->serror = NULL; +} + +/** + * xmlRelaxNGSetValidStructuredErrors: + * @ctxt: a Relax-NG validation context + * @serror: the structured error function + * @ctx: the functions context + * + * Set the structured error callback + */ +void +xmlRelaxNGSetValidStructuredErrors(xmlRelaxNGValidCtxtPtr ctxt, + xmlStructuredErrorFunc serror, void *ctx) +{ + if (ctxt == NULL) + return; + ctxt->serror = serror; + ctxt->error = NULL; + ctxt->warning = NULL; + ctxt->userData = ctx; +} + +/** + * xmlRelaxNGGetValidErrors: + * @ctxt: a Relax-NG validation context + * @err: the error function result + * @warn: the warning function result + * @ctx: the functions context result + * + * Get the error and warning callback informations + * + * Returns -1 in case of error and 0 otherwise + */ +int +xmlRelaxNGGetValidErrors(xmlRelaxNGValidCtxtPtr ctxt, + xmlRelaxNGValidityErrorFunc * err, + xmlRelaxNGValidityWarningFunc * warn, void **ctx) +{ + if (ctxt == NULL) + return (-1); + if (err != NULL) + *err = ctxt->error; + if (warn != NULL) + *warn = ctxt->warning; + if (ctx != NULL) + *ctx = ctxt->userData; + return (0); +} + +/** + * xmlRelaxNGValidateDoc: + * @ctxt: a Relax-NG validation context + * @doc: a parsed document tree + * + * Validate a document tree in memory. + * + * Returns 0 if the document is valid, a positive error code + * number otherwise and -1 in case of internal or API error. + */ +int +xmlRelaxNGValidateDoc(xmlRelaxNGValidCtxtPtr ctxt, xmlDocPtr doc) +{ + int ret; + + if ((ctxt == NULL) || (doc == NULL)) + return (-1); + + ctxt->doc = doc; + + ret = xmlRelaxNGValidateDocument(ctxt, doc); + /* + * Remove all left PSVI + */ + xmlRelaxNGCleanPSVI((xmlNodePtr) doc); + + /* + * TODO: build error codes + */ + if (ret == -1) + return (1); + return (ret); +} + +#define bottom_relaxng +#include "elfgcchack.h" +#endif /* LIBXML_SCHEMAS_ENABLED */ diff --git a/vendors/libxml/src/save.h b/vendors/libxml/src/save.h new file mode 100644 index 0000000..2c32a10 --- /dev/null +++ b/vendors/libxml/src/save.h @@ -0,0 +1,35 @@ +/* + * Summary: Internal Interfaces for saving in libxml2 + * Description: this module describes a few interfaces which were + * addded along with the API changes in 2.9.0 + * those are private routines at this point + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_SAVE_H__ +#define __XML_SAVE_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef LIBXML_OUTPUT_ENABLED +void xmlBufAttrSerializeTxtContent(xmlBufPtr buf, xmlDocPtr doc, + xmlAttrPtr attr, const xmlChar * string); +void xmlBufDumpNotationTable(xmlBufPtr buf, xmlNotationTablePtr table); +void xmlBufDumpElementDecl(xmlBufPtr buf, xmlElementPtr elem); +void xmlBufDumpAttributeDecl(xmlBufPtr buf, xmlAttributePtr attr); +void xmlBufDumpEntityDecl(xmlBufPtr buf, xmlEntityPtr ent); +xmlChar *xmlEncodeAttributeEntities(xmlDocPtr doc, const xmlChar *input); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* __XML_SAVE_H__ */ + diff --git a/vendors/libxml/src/schematron.c b/vendors/libxml/src/schematron.c new file mode 100644 index 0000000..537b868 --- /dev/null +++ b/vendors/libxml/src/schematron.c @@ -0,0 +1,1785 @@ +/* + * schematron.c : implementation of the Schematron schema validity checking + * + * See Copyright for the status of this software. + * + * Daniel Veillard + */ + +/* + * TODO: + * + double check the semantic, especially + * - multiple rules applying in a single pattern/node + * - the semantic of libxml2 patterns vs. XSLT production referenced + * by the spec. + * + export of results in SVRL + * + full parsing and coverage of the spec, conformance of the input to the + * spec + * + divergences between the draft and the ISO proposed standard :-( + * + hook and test include + * + try and compare with the XSLT version + */ + +#define IN_LIBXML +#include "libxml.h" + +#ifdef LIBXML_SCHEMATRON_ENABLED + +#include +#include +#include +#include +#include +#include +#include +#include + +#define SCHEMATRON_PARSE_OPTIONS XML_PARSE_NOENT + +#define SCT_OLD_NS BAD_CAST "http://www.ascc.net/xml/schematron" + +#define XML_SCHEMATRON_NS BAD_CAST "http://purl.oclc.org/dsdl/schematron" + + +static const xmlChar *xmlSchematronNs = XML_SCHEMATRON_NS; +static const xmlChar *xmlOldSchematronNs = SCT_OLD_NS; + +#define IS_SCHEMATRON(node, elem) \ + ((node != NULL) && (node->type == XML_ELEMENT_NODE ) && \ + (node->ns != NULL) && \ + (xmlStrEqual(node->name, (const xmlChar *) elem)) && \ + ((xmlStrEqual(node->ns->href, xmlSchematronNs)) || \ + (xmlStrEqual(node->ns->href, xmlOldSchematronNs)))) + +#define NEXT_SCHEMATRON(node) \ + while (node != NULL) { \ + if ((node->type == XML_ELEMENT_NODE ) && (node->ns != NULL) && \ + ((xmlStrEqual(node->ns->href, xmlSchematronNs)) || \ + (xmlStrEqual(node->ns->href, xmlOldSchematronNs)))) \ + break; \ + node = node->next; \ + } + +/** + * TODO: + * + * macro to flag unimplemented blocks + */ +#define TODO \ + xmlGenericError(xmlGenericErrorContext, \ + "Unimplemented block at %s:%d\n", \ + __FILE__, __LINE__); + +typedef enum { + XML_SCHEMATRON_ASSERT=1, + XML_SCHEMATRON_REPORT=2 +} xmlSchematronTestType; + +/** + * _xmlSchematronTest: + * + * A Schematrons test, either an assert or a report + */ +typedef struct _xmlSchematronTest xmlSchematronTest; +typedef xmlSchematronTest *xmlSchematronTestPtr; +struct _xmlSchematronTest { + xmlSchematronTestPtr next; /* the next test in the list */ + xmlSchematronTestType type; /* the test type */ + xmlNodePtr node; /* the node in the tree */ + xmlChar *test; /* the expression to test */ + xmlXPathCompExprPtr comp; /* the compiled expression */ + xmlChar *report; /* the message to report */ +}; + +/** + * _xmlSchematronRule: + * + * A Schematrons rule + */ +typedef struct _xmlSchematronRule xmlSchematronRule; +typedef xmlSchematronRule *xmlSchematronRulePtr; +struct _xmlSchematronRule { + xmlSchematronRulePtr next; /* the next rule in the list */ + xmlSchematronRulePtr patnext;/* the next rule in the pattern list */ + xmlNodePtr node; /* the node in the tree */ + xmlChar *context; /* the context evaluation rule */ + xmlSchematronTestPtr tests; /* the list of tests */ + xmlPatternPtr pattern; /* the compiled pattern associated */ + xmlChar *report; /* the message to report */ +}; + +/** + * _xmlSchematronPattern: + * + * A Schematrons pattern + */ +typedef struct _xmlSchematronPattern xmlSchematronPattern; +typedef xmlSchematronPattern *xmlSchematronPatternPtr; +struct _xmlSchematronPattern { + xmlSchematronPatternPtr next;/* the next pattern in the list */ + xmlSchematronRulePtr rules; /* the list of rules */ + xmlChar *name; /* the name of the pattern */ +}; + +/** + * _xmlSchematron: + * + * A Schematrons definition + */ +struct _xmlSchematron { + const xmlChar *name; /* schema name */ + int preserve; /* was the document passed by the user */ + xmlDocPtr doc; /* pointer to the parsed document */ + int flags; /* specific to this schematron */ + + void *_private; /* unused by the library */ + xmlDictPtr dict; /* the dictionnary used internally */ + + const xmlChar *title; /* the title if any */ + + int nbNs; /* the number of namespaces */ + + int nbPattern; /* the number of patterns */ + xmlSchematronPatternPtr patterns;/* the patterns found */ + xmlSchematronRulePtr rules; /* the rules gathered */ + int nbNamespaces; /* number of namespaces in the array */ + int maxNamespaces; /* size of the array */ + const xmlChar **namespaces; /* the array of namespaces */ +}; + +/** + * xmlSchematronValidCtxt: + * + * A Schematrons validation context + */ +struct _xmlSchematronValidCtxt { + int type; + int flags; /* an or of xmlSchematronValidOptions */ + + xmlDictPtr dict; + int nberrors; + int err; + + xmlSchematronPtr schema; + xmlXPathContextPtr xctxt; + + FILE *outputFile; /* if using XML_SCHEMATRON_OUT_FILE */ + xmlBufferPtr outputBuffer; /* if using XML_SCHEMATRON_OUT_BUFFER */ + xmlOutputWriteCallback iowrite; /* if using XML_SCHEMATRON_OUT_IO */ + xmlOutputCloseCallback ioclose; + void *ioctx; + + /* error reporting data */ + void *userData; /* user specific data block */ + xmlSchematronValidityErrorFunc error;/* the callback in case of errors */ + xmlSchematronValidityWarningFunc warning;/* callback in case of warning */ + xmlStructuredErrorFunc serror; /* the structured function */ +}; + +struct _xmlSchematronParserCtxt { + int type; + const xmlChar *URL; + xmlDocPtr doc; + int preserve; /* Whether the doc should be freed */ + const char *buffer; + int size; + + xmlDictPtr dict; /* dictionnary for interned string names */ + + int nberrors; + int err; + xmlXPathContextPtr xctxt; /* the XPath context used for compilation */ + xmlSchematronPtr schema; + + int nbNamespaces; /* number of namespaces in the array */ + int maxNamespaces; /* size of the array */ + const xmlChar **namespaces; /* the array of namespaces */ + + int nbIncludes; /* number of includes in the array */ + int maxIncludes; /* size of the array */ + xmlNodePtr *includes; /* the array of includes */ + + /* error reporting data */ + void *userData; /* user specific data block */ + xmlSchematronValidityErrorFunc error;/* the callback in case of errors */ + xmlSchematronValidityWarningFunc warning;/* callback in case of warning */ + xmlStructuredErrorFunc serror; /* the structured function */ +}; + +#define XML_STRON_CTXT_PARSER 1 +#define XML_STRON_CTXT_VALIDATOR 2 + +/************************************************************************ + * * + * Error reporting * + * * + ************************************************************************/ + +/** + * xmlSchematronPErrMemory: + * @node: a context node + * @extra: extra informations + * + * Handle an out of memory condition + */ +static void +xmlSchematronPErrMemory(xmlSchematronParserCtxtPtr ctxt, + const char *extra, xmlNodePtr node) +{ + if (ctxt != NULL) + ctxt->nberrors++; + __xmlSimpleError(XML_FROM_SCHEMASP, XML_ERR_NO_MEMORY, node, NULL, + extra); +} + +/** + * xmlSchematronPErr: + * @ctxt: the parsing context + * @node: the context node + * @error: the error code + * @msg: the error message + * @str1: extra data + * @str2: extra data + * + * Handle a parser error + */ +static void +xmlSchematronPErr(xmlSchematronParserCtxtPtr ctxt, xmlNodePtr node, int error, + const char *msg, const xmlChar * str1, const xmlChar * str2) +{ + xmlGenericErrorFunc channel = NULL; + xmlStructuredErrorFunc schannel = NULL; + void *data = NULL; + + if (ctxt != NULL) { + ctxt->nberrors++; + channel = ctxt->error; + data = ctxt->userData; + schannel = ctxt->serror; + } + __xmlRaiseError(schannel, channel, data, ctxt, node, XML_FROM_SCHEMASP, + error, XML_ERR_ERROR, NULL, 0, + (const char *) str1, (const char *) str2, NULL, 0, 0, + msg, str1, str2); +} + +/** + * xmlSchematronVTypeErrMemory: + * @node: a context node + * @extra: extra informations + * + * Handle an out of memory condition + */ +static void +xmlSchematronVErrMemory(xmlSchematronValidCtxtPtr ctxt, + const char *extra, xmlNodePtr node) +{ + if (ctxt != NULL) { + ctxt->nberrors++; + ctxt->err = XML_SCHEMAV_INTERNAL; + } + __xmlSimpleError(XML_FROM_SCHEMASV, XML_ERR_NO_MEMORY, node, NULL, + extra); +} + +/************************************************************************ + * * + * Parsing and compilation of the Schematrontrons * + * * + ************************************************************************/ + +/** + * xmlSchematronAddTest: + * @ctxt: the schema parsing context + * @type: the type of test + * @rule: the parent rule + * @node: the node hosting the test + * @test: the associated test + * @report: the associated report string + * + * Add a test to a schematron + * + * Returns the new pointer or NULL in case of error + */ +static xmlSchematronTestPtr +xmlSchematronAddTest(xmlSchematronParserCtxtPtr ctxt, + xmlSchematronTestType type, + xmlSchematronRulePtr rule, + xmlNodePtr node, xmlChar *test, xmlChar *report) +{ + xmlSchematronTestPtr ret; + xmlXPathCompExprPtr comp; + + if ((ctxt == NULL) || (rule == NULL) || (node == NULL) || + (test == NULL)) + return(NULL); + + /* + * try first to compile the test expression + */ + comp = xmlXPathCtxtCompile(ctxt->xctxt, test); + if (comp == NULL) { + xmlSchematronPErr(ctxt, node, + XML_SCHEMAP_NOROOT, + "Failed to compile test expression %s", + test, NULL); + return(NULL); + } + + ret = (xmlSchematronTestPtr) xmlMalloc(sizeof(xmlSchematronTest)); + if (ret == NULL) { + xmlSchematronPErrMemory(ctxt, "allocating schema test", node); + return (NULL); + } + memset(ret, 0, sizeof(xmlSchematronTest)); + ret->type = type; + ret->node = node; + ret->test = test; + ret->comp = comp; + ret->report = report; + ret->next = NULL; + if (rule->tests == NULL) { + rule->tests = ret; + } else { + xmlSchematronTestPtr prev = rule->tests; + + while (prev->next != NULL) + prev = prev->next; + prev->next = ret; + } + return (ret); +} + +/** + * xmlSchematronFreeTests: + * @tests: a list of tests + * + * Free a list of tests. + */ +static void +xmlSchematronFreeTests(xmlSchematronTestPtr tests) { + xmlSchematronTestPtr next; + + while (tests != NULL) { + next = tests->next; + if (tests->test != NULL) + xmlFree(tests->test); + if (tests->comp != NULL) + xmlXPathFreeCompExpr(tests->comp); + if (tests->report != NULL) + xmlFree(tests->report); + xmlFree(tests); + tests = next; + } +} + +/** + * xmlSchematronAddRule: + * @ctxt: the schema parsing context + * @schema: a schema structure + * @node: the node hosting the rule + * @context: the associated context string + * @report: the associated report string + * + * Add a rule to a schematron + * + * Returns the new pointer or NULL in case of error + */ +static xmlSchematronRulePtr +xmlSchematronAddRule(xmlSchematronParserCtxtPtr ctxt, xmlSchematronPtr schema, + xmlSchematronPatternPtr pat, xmlNodePtr node, + xmlChar *context, xmlChar *report) +{ + xmlSchematronRulePtr ret; + xmlPatternPtr pattern; + + if ((ctxt == NULL) || (schema == NULL) || (node == NULL) || + (context == NULL)) + return(NULL); + + /* + * Try first to compile the pattern + */ + pattern = xmlPatterncompile(context, ctxt->dict, XML_PATTERN_XPATH, + ctxt->namespaces); + if (pattern == NULL) { + xmlSchematronPErr(ctxt, node, + XML_SCHEMAP_NOROOT, + "Failed to compile context expression %s", + context, NULL); + } + + ret = (xmlSchematronRulePtr) xmlMalloc(sizeof(xmlSchematronRule)); + if (ret == NULL) { + xmlSchematronPErrMemory(ctxt, "allocating schema rule", node); + return (NULL); + } + memset(ret, 0, sizeof(xmlSchematronRule)); + ret->node = node; + ret->context = context; + ret->pattern = pattern; + ret->report = report; + ret->next = NULL; + if (schema->rules == NULL) { + schema->rules = ret; + } else { + xmlSchematronRulePtr prev = schema->rules; + + while (prev->next != NULL) + prev = prev->next; + prev->next = ret; + } + ret->patnext = NULL; + if (pat->rules == NULL) { + pat->rules = ret; + } else { + xmlSchematronRulePtr prev = pat->rules; + + while (prev->patnext != NULL) + prev = prev->patnext; + prev->patnext = ret; + } + return (ret); +} + +/** + * xmlSchematronFreeRules: + * @rules: a list of rules + * + * Free a list of rules. + */ +static void +xmlSchematronFreeRules(xmlSchematronRulePtr rules) { + xmlSchematronRulePtr next; + + while (rules != NULL) { + next = rules->next; + if (rules->tests) + xmlSchematronFreeTests(rules->tests); + if (rules->context != NULL) + xmlFree(rules->context); + if (rules->pattern) + xmlFreePattern(rules->pattern); + if (rules->report != NULL) + xmlFree(rules->report); + xmlFree(rules); + rules = next; + } +} + +/** + * xmlSchematronAddPattern: + * @ctxt: the schema parsing context + * @schema: a schema structure + * @node: the node hosting the pattern + * @id: the id or name of the pattern + * + * Add a pattern to a schematron + * + * Returns the new pointer or NULL in case of error + */ +static xmlSchematronPatternPtr +xmlSchematronAddPattern(xmlSchematronParserCtxtPtr ctxt, + xmlSchematronPtr schema, xmlNodePtr node, xmlChar *name) +{ + xmlSchematronPatternPtr ret; + + if ((ctxt == NULL) || (schema == NULL) || (node == NULL) || (name == NULL)) + return(NULL); + + ret = (xmlSchematronPatternPtr) xmlMalloc(sizeof(xmlSchematronPattern)); + if (ret == NULL) { + xmlSchematronPErrMemory(ctxt, "allocating schema pattern", node); + return (NULL); + } + memset(ret, 0, sizeof(xmlSchematronPattern)); + ret->name = name; + ret->next = NULL; + if (schema->patterns == NULL) { + schema->patterns = ret; + } else { + xmlSchematronPatternPtr prev = schema->patterns; + + while (prev->next != NULL) + prev = prev->next; + prev->next = ret; + } + return (ret); +} + +/** + * xmlSchematronFreePatterns: + * @patterns: a list of patterns + * + * Free a list of patterns. + */ +static void +xmlSchematronFreePatterns(xmlSchematronPatternPtr patterns) { + xmlSchematronPatternPtr next; + + while (patterns != NULL) { + next = patterns->next; + if (patterns->name != NULL) + xmlFree(patterns->name); + xmlFree(patterns); + patterns = next; + } +} + +/** + * xmlSchematronNewSchematron: + * @ctxt: a schema validation context + * + * Allocate a new Schematron structure. + * + * Returns the newly allocated structure or NULL in case or error + */ +static xmlSchematronPtr +xmlSchematronNewSchematron(xmlSchematronParserCtxtPtr ctxt) +{ + xmlSchematronPtr ret; + + ret = (xmlSchematronPtr) xmlMalloc(sizeof(xmlSchematron)); + if (ret == NULL) { + xmlSchematronPErrMemory(ctxt, "allocating schema", NULL); + return (NULL); + } + memset(ret, 0, sizeof(xmlSchematron)); + ret->dict = ctxt->dict; + xmlDictReference(ret->dict); + + return (ret); +} + +/** + * xmlSchematronFree: + * @schema: a schema structure + * + * Deallocate a Schematron structure. + */ +void +xmlSchematronFree(xmlSchematronPtr schema) +{ + if (schema == NULL) + return; + + if ((schema->doc != NULL) && (!(schema->preserve))) + xmlFreeDoc(schema->doc); + + if (schema->namespaces != NULL) + xmlFree((char **) schema->namespaces); + + xmlSchematronFreeRules(schema->rules); + xmlSchematronFreePatterns(schema->patterns); + xmlDictFree(schema->dict); + xmlFree(schema); +} + +/** + * xmlSchematronNewParserCtxt: + * @URL: the location of the schema + * + * Create an XML Schematrons parse context for that file/resource expected + * to contain an XML Schematrons file. + * + * Returns the parser context or NULL in case of error + */ +xmlSchematronParserCtxtPtr +xmlSchematronNewParserCtxt(const char *URL) +{ + xmlSchematronParserCtxtPtr ret; + + if (URL == NULL) + return (NULL); + + ret = + (xmlSchematronParserCtxtPtr) + xmlMalloc(sizeof(xmlSchematronParserCtxt)); + if (ret == NULL) { + xmlSchematronPErrMemory(NULL, "allocating schema parser context", + NULL); + return (NULL); + } + memset(ret, 0, sizeof(xmlSchematronParserCtxt)); + ret->type = XML_STRON_CTXT_PARSER; + ret->dict = xmlDictCreate(); + ret->URL = xmlDictLookup(ret->dict, (const xmlChar *) URL, -1); + ret->includes = NULL; + ret->xctxt = xmlXPathNewContext(NULL); + if (ret->xctxt == NULL) { + xmlSchematronPErrMemory(NULL, "allocating schema parser XPath context", + NULL); + xmlSchematronFreeParserCtxt(ret); + return (NULL); + } + ret->xctxt->flags = XML_XPATH_CHECKNS; + return (ret); +} + +/** + * xmlSchematronNewMemParserCtxt: + * @buffer: a pointer to a char array containing the schemas + * @size: the size of the array + * + * Create an XML Schematrons parse context for that memory buffer expected + * to contain an XML Schematrons file. + * + * Returns the parser context or NULL in case of error + */ +xmlSchematronParserCtxtPtr +xmlSchematronNewMemParserCtxt(const char *buffer, int size) +{ + xmlSchematronParserCtxtPtr ret; + + if ((buffer == NULL) || (size <= 0)) + return (NULL); + + ret = + (xmlSchematronParserCtxtPtr) + xmlMalloc(sizeof(xmlSchematronParserCtxt)); + if (ret == NULL) { + xmlSchematronPErrMemory(NULL, "allocating schema parser context", + NULL); + return (NULL); + } + memset(ret, 0, sizeof(xmlSchematronParserCtxt)); + ret->buffer = buffer; + ret->size = size; + ret->dict = xmlDictCreate(); + ret->xctxt = xmlXPathNewContext(NULL); + if (ret->xctxt == NULL) { + xmlSchematronPErrMemory(NULL, "allocating schema parser XPath context", + NULL); + xmlSchematronFreeParserCtxt(ret); + return (NULL); + } + return (ret); +} + +/** + * xmlSchematronNewDocParserCtxt: + * @doc: a preparsed document tree + * + * Create an XML Schematrons parse context for that document. + * NB. The document may be modified during the parsing process. + * + * Returns the parser context or NULL in case of error + */ +xmlSchematronParserCtxtPtr +xmlSchematronNewDocParserCtxt(xmlDocPtr doc) +{ + xmlSchematronParserCtxtPtr ret; + + if (doc == NULL) + return (NULL); + + ret = + (xmlSchematronParserCtxtPtr) + xmlMalloc(sizeof(xmlSchematronParserCtxt)); + if (ret == NULL) { + xmlSchematronPErrMemory(NULL, "allocating schema parser context", + NULL); + return (NULL); + } + memset(ret, 0, sizeof(xmlSchematronParserCtxt)); + ret->doc = doc; + ret->dict = xmlDictCreate(); + /* The application has responsibility for the document */ + ret->preserve = 1; + ret->xctxt = xmlXPathNewContext(doc); + if (ret->xctxt == NULL) { + xmlSchematronPErrMemory(NULL, "allocating schema parser XPath context", + NULL); + xmlSchematronFreeParserCtxt(ret); + return (NULL); + } + + return (ret); +} + +/** + * xmlSchematronFreeParserCtxt: + * @ctxt: the schema parser context + * + * Free the resources associated to the schema parser context + */ +void +xmlSchematronFreeParserCtxt(xmlSchematronParserCtxtPtr ctxt) +{ + if (ctxt == NULL) + return; + if (ctxt->doc != NULL && !ctxt->preserve) + xmlFreeDoc(ctxt->doc); + if (ctxt->xctxt != NULL) { + xmlXPathFreeContext(ctxt->xctxt); + } + if (ctxt->namespaces != NULL) + xmlFree((char **) ctxt->namespaces); + xmlDictFree(ctxt->dict); + xmlFree(ctxt); +} + +#if 0 +/** + * xmlSchematronPushInclude: + * @ctxt: the schema parser context + * @doc: the included document + * @cur: the current include node + * + * Add an included document + */ +static void +xmlSchematronPushInclude(xmlSchematronParserCtxtPtr ctxt, + xmlDocPtr doc, xmlNodePtr cur) +{ + if (ctxt->includes == NULL) { + ctxt->maxIncludes = 10; + ctxt->includes = (xmlNodePtr *) + xmlMalloc(ctxt->maxIncludes * 2 * sizeof(xmlNodePtr)); + if (ctxt->includes == NULL) { + xmlSchematronPErrMemory(NULL, "allocating parser includes", + NULL); + return; + } + ctxt->nbIncludes = 0; + } else if (ctxt->nbIncludes + 2 >= ctxt->maxIncludes) { + xmlNodePtr *tmp; + + tmp = (xmlNodePtr *) + xmlRealloc(ctxt->includes, ctxt->maxIncludes * 4 * + sizeof(xmlNodePtr)); + if (tmp == NULL) { + xmlSchematronPErrMemory(NULL, "allocating parser includes", + NULL); + return; + } + ctxt->includes = tmp; + ctxt->maxIncludes *= 2; + } + ctxt->includes[2 * ctxt->nbIncludes] = cur; + ctxt->includes[2 * ctxt->nbIncludes + 1] = (xmlNodePtr) doc; + ctxt->nbIncludes++; +} + +/** + * xmlSchematronPopInclude: + * @ctxt: the schema parser context + * + * Pop an include level. The included document is being freed + * + * Returns the node immediately following the include or NULL if the + * include list was empty. + */ +static xmlNodePtr +xmlSchematronPopInclude(xmlSchematronParserCtxtPtr ctxt) +{ + xmlDocPtr doc; + xmlNodePtr ret; + + if (ctxt->nbIncludes <= 0) + return(NULL); + ctxt->nbIncludes--; + doc = (xmlDocPtr) ctxt->includes[2 * ctxt->nbIncludes + 1]; + ret = ctxt->includes[2 * ctxt->nbIncludes]; + xmlFreeDoc(doc); + if (ret != NULL) + ret = ret->next; + if (ret == NULL) + return(xmlSchematronPopInclude(ctxt)); + return(ret); +} +#endif + +/** + * xmlSchematronAddNamespace: + * @ctxt: the schema parser context + * @prefix: the namespace prefix + * @ns: the namespace name + * + * Add a namespace definition in the context + */ +static void +xmlSchematronAddNamespace(xmlSchematronParserCtxtPtr ctxt, + const xmlChar *prefix, const xmlChar *ns) +{ + if (ctxt->namespaces == NULL) { + ctxt->maxNamespaces = 10; + ctxt->namespaces = (const xmlChar **) + xmlMalloc(ctxt->maxNamespaces * 2 * sizeof(const xmlChar *)); + if (ctxt->namespaces == NULL) { + xmlSchematronPErrMemory(NULL, "allocating parser namespaces", + NULL); + return; + } + ctxt->nbNamespaces = 0; + } else if (ctxt->nbNamespaces + 2 >= ctxt->maxNamespaces) { + const xmlChar **tmp; + + tmp = (const xmlChar **) + xmlRealloc((xmlChar **) ctxt->namespaces, ctxt->maxNamespaces * 4 * + sizeof(const xmlChar *)); + if (tmp == NULL) { + xmlSchematronPErrMemory(NULL, "allocating parser namespaces", + NULL); + return; + } + ctxt->namespaces = tmp; + ctxt->maxNamespaces *= 2; + } + ctxt->namespaces[2 * ctxt->nbNamespaces] = + xmlDictLookup(ctxt->dict, ns, -1); + ctxt->namespaces[2 * ctxt->nbNamespaces + 1] = + xmlDictLookup(ctxt->dict, prefix, -1); + ctxt->nbNamespaces++; + ctxt->namespaces[2 * ctxt->nbNamespaces] = NULL; + ctxt->namespaces[2 * ctxt->nbNamespaces + 1] = NULL; + +} + +/** + * xmlSchematronParseRule: + * @ctxt: a schema validation context + * @rule: the rule node + * + * parse a rule element + */ +static void +xmlSchematronParseRule(xmlSchematronParserCtxtPtr ctxt, + xmlSchematronPatternPtr pattern, + xmlNodePtr rule) +{ + xmlNodePtr cur; + int nbChecks = 0; + xmlChar *test; + xmlChar *context; + xmlChar *report; + xmlSchematronRulePtr ruleptr; + xmlSchematronTestPtr testptr; + + if ((ctxt == NULL) || (rule == NULL)) return; + + context = xmlGetNoNsProp(rule, BAD_CAST "context"); + if (context == NULL) { + xmlSchematronPErr(ctxt, rule, + XML_SCHEMAP_NOROOT, + "rule has no context attribute", + NULL, NULL); + return; + } else if (context[0] == 0) { + xmlSchematronPErr(ctxt, rule, + XML_SCHEMAP_NOROOT, + "rule has an empty context attribute", + NULL, NULL); + xmlFree(context); + return; + } else { + ruleptr = xmlSchematronAddRule(ctxt, ctxt->schema, pattern, + rule, context, NULL); + if (ruleptr == NULL) { + xmlFree(context); + return; + } + } + + cur = rule->children; + NEXT_SCHEMATRON(cur); + while (cur != NULL) { + if (IS_SCHEMATRON(cur, "assert")) { + nbChecks++; + test = xmlGetNoNsProp(cur, BAD_CAST "test"); + if (test == NULL) { + xmlSchematronPErr(ctxt, cur, + XML_SCHEMAP_NOROOT, + "assert has no test attribute", + NULL, NULL); + } else if (test[0] == 0) { + xmlSchematronPErr(ctxt, cur, + XML_SCHEMAP_NOROOT, + "assert has an empty test attribute", + NULL, NULL); + xmlFree(test); + } else { + /* TODO will need dynamic processing instead */ + report = xmlNodeGetContent(cur); + + testptr = xmlSchematronAddTest(ctxt, XML_SCHEMATRON_ASSERT, + ruleptr, cur, test, report); + if (testptr == NULL) + xmlFree(test); + } + } else if (IS_SCHEMATRON(cur, "report")) { + nbChecks++; + test = xmlGetNoNsProp(cur, BAD_CAST "test"); + if (test == NULL) { + xmlSchematronPErr(ctxt, cur, + XML_SCHEMAP_NOROOT, + "assert has no test attribute", + NULL, NULL); + } else if (test[0] == 0) { + xmlSchematronPErr(ctxt, cur, + XML_SCHEMAP_NOROOT, + "assert has an empty test attribute", + NULL, NULL); + xmlFree(test); + } else { + /* TODO will need dynamic processing instead */ + report = xmlNodeGetContent(cur); + + testptr = xmlSchematronAddTest(ctxt, XML_SCHEMATRON_REPORT, + ruleptr, cur, test, report); + if (testptr == NULL) + xmlFree(test); + } + } else { + xmlSchematronPErr(ctxt, cur, + XML_SCHEMAP_NOROOT, + "Expecting an assert or a report element instead of %s", + cur->name, NULL); + } + cur = cur->next; + NEXT_SCHEMATRON(cur); + } + if (nbChecks == 0) { + xmlSchematronPErr(ctxt, rule, + XML_SCHEMAP_NOROOT, + "rule has no assert nor report element", NULL, NULL); + } +} + +/** + * xmlSchematronParsePattern: + * @ctxt: a schema validation context + * @pat: the pattern node + * + * parse a pattern element + */ +static void +xmlSchematronParsePattern(xmlSchematronParserCtxtPtr ctxt, xmlNodePtr pat) +{ + xmlNodePtr cur; + xmlSchematronPatternPtr pattern; + int nbRules = 0; + xmlChar *id; + + if ((ctxt == NULL) || (pat == NULL)) return; + + id = xmlGetNoNsProp(pat, BAD_CAST "id"); + if (id == NULL) { + id = xmlGetNoNsProp(pat, BAD_CAST "name"); + } + pattern = xmlSchematronAddPattern(ctxt, ctxt->schema, pat, id); + if (pattern == NULL) { + if (id != NULL) + xmlFree(id); + return; + } + cur = pat->children; + NEXT_SCHEMATRON(cur); + while (cur != NULL) { + if (IS_SCHEMATRON(cur, "rule")) { + xmlSchematronParseRule(ctxt, pattern, cur); + nbRules++; + } else { + xmlSchematronPErr(ctxt, cur, + XML_SCHEMAP_NOROOT, + "Expecting a rule element instead of %s", cur->name, NULL); + } + cur = cur->next; + NEXT_SCHEMATRON(cur); + } + if (nbRules == 0) { + xmlSchematronPErr(ctxt, pat, + XML_SCHEMAP_NOROOT, + "Pattern has no rule element", NULL, NULL); + } +} + +#if 0 +/** + * xmlSchematronLoadInclude: + * @ctxt: a schema validation context + * @cur: the include element + * + * Load the include document, Push the current pointer + * + * Returns the updated node pointer + */ +static xmlNodePtr +xmlSchematronLoadInclude(xmlSchematronParserCtxtPtr ctxt, xmlNodePtr cur) +{ + xmlNodePtr ret = NULL; + xmlDocPtr doc = NULL; + xmlChar *href = NULL; + xmlChar *base = NULL; + xmlChar *URI = NULL; + + if ((ctxt == NULL) || (cur == NULL)) + return(NULL); + + href = xmlGetNoNsProp(cur, BAD_CAST "href"); + if (href == NULL) { + xmlSchematronPErr(ctxt, cur, + XML_SCHEMAP_NOROOT, + "Include has no href attribute", NULL, NULL); + return(cur->next); + } + + /* do the URI base composition, load and find the root */ + base = xmlNodeGetBase(cur->doc, cur); + URI = xmlBuildURI(href, base); + doc = xmlReadFile((const char *) URI, NULL, SCHEMATRON_PARSE_OPTIONS); + if (doc == NULL) { + xmlSchematronPErr(ctxt, cur, + XML_SCHEMAP_FAILED_LOAD, + "could not load include '%s'.\n", + URI, NULL); + goto done; + } + ret = xmlDocGetRootElement(doc); + if (ret == NULL) { + xmlSchematronPErr(ctxt, cur, + XML_SCHEMAP_FAILED_LOAD, + "could not find root from include '%s'.\n", + URI, NULL); + goto done; + } + + /* Success, push the include for rollback on exit */ + xmlSchematronPushInclude(ctxt, doc, cur); + +done: + if (ret == NULL) { + if (doc != NULL) + xmlFreeDoc(doc); + } + xmlFree(href); + if (base != NULL) + xmlFree(base); + if (URI != NULL) + xmlFree(URI); + return(ret); +} +#endif + +/** + * xmlSchematronParse: + * @ctxt: a schema validation context + * + * parse a schema definition resource and build an internal + * XML Shema struture which can be used to validate instances. + * + * Returns the internal XML Schematron structure built from the resource or + * NULL in case of error + */ +xmlSchematronPtr +xmlSchematronParse(xmlSchematronParserCtxtPtr ctxt) +{ + xmlSchematronPtr ret = NULL; + xmlDocPtr doc; + xmlNodePtr root, cur; + int preserve = 0; + + if (ctxt == NULL) + return (NULL); + + ctxt->nberrors = 0; + + /* + * First step is to parse the input document into an DOM/Infoset + */ + if (ctxt->URL != NULL) { + doc = xmlReadFile((const char *) ctxt->URL, NULL, + SCHEMATRON_PARSE_OPTIONS); + if (doc == NULL) { + xmlSchematronPErr(ctxt, NULL, + XML_SCHEMAP_FAILED_LOAD, + "xmlSchematronParse: could not load '%s'.\n", + ctxt->URL, NULL); + return (NULL); + } + ctxt->preserve = 0; + } else if (ctxt->buffer != NULL) { + doc = xmlReadMemory(ctxt->buffer, ctxt->size, NULL, NULL, + SCHEMATRON_PARSE_OPTIONS); + if (doc == NULL) { + xmlSchematronPErr(ctxt, NULL, + XML_SCHEMAP_FAILED_PARSE, + "xmlSchematronParse: could not parse.\n", + NULL, NULL); + return (NULL); + } + doc->URL = xmlStrdup(BAD_CAST "in_memory_buffer"); + ctxt->URL = xmlDictLookup(ctxt->dict, BAD_CAST "in_memory_buffer", -1); + ctxt->preserve = 0; + } else if (ctxt->doc != NULL) { + doc = ctxt->doc; + preserve = 1; + ctxt->preserve = 1; + } else { + xmlSchematronPErr(ctxt, NULL, + XML_SCHEMAP_NOTHING_TO_PARSE, + "xmlSchematronParse: could not parse.\n", + NULL, NULL); + return (NULL); + } + + /* + * Then extract the root and Schematron parse it + */ + root = xmlDocGetRootElement(doc); + if (root == NULL) { + xmlSchematronPErr(ctxt, (xmlNodePtr) doc, + XML_SCHEMAP_NOROOT, + "The schema has no document element.\n", NULL, NULL); + if (!preserve) { + xmlFreeDoc(doc); + } + return (NULL); + } + + if (!IS_SCHEMATRON(root, "schema")) { + xmlSchematronPErr(ctxt, root, + XML_SCHEMAP_NOROOT, + "The XML document '%s' is not a XML schematron document", + ctxt->URL, NULL); + goto exit; + } + ret = xmlSchematronNewSchematron(ctxt); + if (ret == NULL) + goto exit; + ctxt->schema = ret; + + /* + * scan the schema elements + */ + cur = root->children; + NEXT_SCHEMATRON(cur); + if (IS_SCHEMATRON(cur, "title")) { + xmlChar *title = xmlNodeGetContent(cur); + if (title != NULL) { + ret->title = xmlDictLookup(ret->dict, title, -1); + xmlFree(title); + } + cur = cur->next; + NEXT_SCHEMATRON(cur); + } + while (IS_SCHEMATRON(cur, "ns")) { + xmlChar *prefix = xmlGetNoNsProp(cur, BAD_CAST "prefix"); + xmlChar *uri = xmlGetNoNsProp(cur, BAD_CAST "uri"); + if ((uri == NULL) || (uri[0] == 0)) { + xmlSchematronPErr(ctxt, cur, + XML_SCHEMAP_NOROOT, + "ns element has no uri", NULL, NULL); + } + if ((prefix == NULL) || (prefix[0] == 0)) { + xmlSchematronPErr(ctxt, cur, + XML_SCHEMAP_NOROOT, + "ns element has no prefix", NULL, NULL); + } + if ((prefix) && (uri)) { + xmlXPathRegisterNs(ctxt->xctxt, prefix, uri); + xmlSchematronAddNamespace(ctxt, prefix, uri); + ret->nbNs++; + } + if (uri) + xmlFree(uri); + if (prefix) + xmlFree(prefix); + cur = cur->next; + NEXT_SCHEMATRON(cur); + } + while (cur != NULL) { + if (IS_SCHEMATRON(cur, "pattern")) { + xmlSchematronParsePattern(ctxt, cur); + ret->nbPattern++; + } else { + xmlSchematronPErr(ctxt, cur, + XML_SCHEMAP_NOROOT, + "Expecting a pattern element instead of %s", cur->name, NULL); + } + cur = cur->next; + NEXT_SCHEMATRON(cur); + } + if (ret->nbPattern == 0) { + xmlSchematronPErr(ctxt, root, + XML_SCHEMAP_NOROOT, + "The schematron document '%s' has no pattern", + ctxt->URL, NULL); + goto exit; + } + /* the original document must be kept for reporting */ + ret->doc = doc; + if (preserve) { + ret->preserve = 1; + } + preserve = 1; + +exit: + if (!preserve) { + xmlFreeDoc(doc); + } + if (ret != NULL) { + if (ctxt->nberrors != 0) { + xmlSchematronFree(ret); + ret = NULL; + } else { + ret->namespaces = ctxt->namespaces; + ret->nbNamespaces = ctxt->nbNamespaces; + ctxt->namespaces = NULL; + } + } + return (ret); +} + +/************************************************************************ + * * + * Schematrontron Reports handler * + * * + ************************************************************************/ + +static xmlNodePtr +xmlSchematronGetNode(xmlSchematronValidCtxtPtr ctxt, + xmlNodePtr cur, const xmlChar *xpath) { + xmlNodePtr node = NULL; + xmlXPathObjectPtr ret; + + if ((ctxt == NULL) || (cur == NULL) || (xpath == NULL)) + return(NULL); + + ctxt->xctxt->doc = cur->doc; + ctxt->xctxt->node = cur; + ret = xmlXPathEval(xpath, ctxt->xctxt); + if (ret == NULL) + return(NULL); + + if ((ret->type == XPATH_NODESET) && + (ret->nodesetval != NULL) && (ret->nodesetval->nodeNr > 0)) + node = ret->nodesetval->nodeTab[0]; + + xmlXPathFreeObject(ret); + return(node); +} + +/** + * xmlSchematronReportOutput: + * @ctxt: the validation context + * @cur: the current node tested + * @msg: the message output + * + * Output part of the report to whatever channel the user selected + */ +static void +xmlSchematronReportOutput(xmlSchematronValidCtxtPtr ctxt ATTRIBUTE_UNUSED, + xmlNodePtr cur ATTRIBUTE_UNUSED, + const char *msg) { + /* TODO */ + fprintf(stderr, "%s", msg); +} + +/** + * xmlSchematronFormatReport: + * @ctxt: the validation context + * @test: the test node + * @cur: the current node tested + * + * Build the string being reported to the user. + * + * Returns a report string or NULL in case of error. The string needs + * to be deallocated by teh caller + */ +static xmlChar * +xmlSchematronFormatReport(xmlSchematronValidCtxtPtr ctxt, + xmlNodePtr test, xmlNodePtr cur) { + xmlChar *ret = NULL; + xmlNodePtr child, node; + + if ((test == NULL) || (cur == NULL)) + return(ret); + + child = test->children; + while (child != NULL) { + if ((child->type == XML_TEXT_NODE) || + (child->type == XML_CDATA_SECTION_NODE)) + ret = xmlStrcat(ret, child->content); + else if (IS_SCHEMATRON(child, "name")) { + xmlChar *path; + + path = xmlGetNoNsProp(child, BAD_CAST "path"); + + node = cur; + if (path != NULL) { + node = xmlSchematronGetNode(ctxt, cur, path); + if (node == NULL) + node = cur; + xmlFree(path); + } + + if ((node->ns == NULL) || (node->ns->prefix == NULL)) + ret = xmlStrcat(ret, node->name); + else { + ret = xmlStrcat(ret, node->ns->prefix); + ret = xmlStrcat(ret, BAD_CAST ":"); + ret = xmlStrcat(ret, node->name); + } + } else { + child = child->next; + continue; + } + + /* + * remove superfluous \n + */ + if (ret != NULL) { + int len = xmlStrlen(ret); + xmlChar c; + + if (len > 0) { + c = ret[len - 1]; + if ((c == ' ') || (c == '\n') || (c == '\r') || (c == '\t')) { + while ((c == ' ') || (c == '\n') || + (c == '\r') || (c == '\t')) { + len--; + if (len == 0) + break; + c = ret[len - 1]; + } + ret[len] = ' '; + ret[len + 1] = 0; + } + } + } + + child = child->next; + } + return(ret); +} + +/** + * xmlSchematronReportSuccess: + * @ctxt: the validation context + * @test: the compiled test + * @cur: the current node tested + * @success: boolean value for the result + * + * called from the validation engine when an assert or report test have + * been done. + */ +static void +xmlSchematronReportSuccess(xmlSchematronValidCtxtPtr ctxt, + xmlSchematronTestPtr test, xmlNodePtr cur, xmlSchematronPatternPtr pattern, int success) { + if ((ctxt == NULL) || (cur == NULL) || (test == NULL)) + return; + /* if quiet and not SVRL report only failures */ + if ((ctxt->flags & XML_SCHEMATRON_OUT_QUIET) && + ((ctxt->flags & XML_SCHEMATRON_OUT_XML) == 0) && + (test->type == XML_SCHEMATRON_REPORT)) + return; + if (ctxt->flags & XML_SCHEMATRON_OUT_XML) { + TODO + } else { + xmlChar *path; + char msg[1000]; + long line; + const xmlChar *report = NULL; + + if (((test->type == XML_SCHEMATRON_REPORT) & (!success)) || + ((test->type == XML_SCHEMATRON_ASSERT) & (success))) + return; + line = xmlGetLineNo(cur); + path = xmlGetNodePath(cur); + if (path == NULL) + path = (xmlChar *) cur->name; +#if 0 + if ((test->report != NULL) && (test->report[0] != 0)) + report = test->report; +#endif + if (test->node != NULL) + report = xmlSchematronFormatReport(ctxt, test->node, cur); + if (report == NULL) { + if (test->type == XML_SCHEMATRON_ASSERT) { + report = xmlStrdup((const xmlChar *) "node failed assert"); + } else { + report = xmlStrdup((const xmlChar *) "node failed report"); + } + } + snprintf(msg, 999, "%s line %ld: %s\n", (const char *) path, + line, (const char *) report); + + if (ctxt->flags & XML_SCHEMATRON_OUT_ERROR) { + xmlStructuredErrorFunc schannel = NULL; + xmlGenericErrorFunc channel = NULL; + void *data = NULL; + + if (ctxt != NULL) { + if (ctxt->serror != NULL) + schannel = ctxt->serror; + else + channel = ctxt->error; + data = ctxt->userData; + } + + __xmlRaiseError(schannel, channel, data, + NULL, cur, XML_FROM_SCHEMATRONV, + (test->type == XML_SCHEMATRON_ASSERT)?XML_SCHEMATRONV_ASSERT:XML_SCHEMATRONV_REPORT, + XML_ERR_ERROR, NULL, line, + (pattern == NULL)?NULL:((const char *) pattern->name), + (const char *) path, + (const char *) report, 0, 0, + "%s", msg); + } else { + xmlSchematronReportOutput(ctxt, cur, &msg[0]); + } + + xmlFree((char *) report); + + if ((path != NULL) && (path != (xmlChar *) cur->name)) + xmlFree(path); + } +} + +/** + * xmlSchematronReportPattern: + * @ctxt: the validation context + * @pattern: the current pattern + * + * called from the validation engine when starting to check a pattern + */ +static void +xmlSchematronReportPattern(xmlSchematronValidCtxtPtr ctxt, + xmlSchematronPatternPtr pattern) { + if ((ctxt == NULL) || (pattern == NULL)) + return; + if ((ctxt->flags & XML_SCHEMATRON_OUT_QUIET) || (ctxt->flags & XML_SCHEMATRON_OUT_ERROR)) /* Error gives pattern name as part of error */ + return; + if (ctxt->flags & XML_SCHEMATRON_OUT_XML) { + TODO + } else { + char msg[1000]; + + if (pattern->name == NULL) + return; + snprintf(msg, 999, "Pattern: %s\n", (const char *) pattern->name); + xmlSchematronReportOutput(ctxt, NULL, &msg[0]); + } +} + + +/************************************************************************ + * * + * Validation against a Schematrontron * + * * + ************************************************************************/ + +/** + * xmlSchematronSetValidStructuredErrors: + * @ctxt: a Schematron validation context + * @serror: the structured error function + * @ctx: the functions context + * + * Set the structured error callback + */ +void +xmlSchematronSetValidStructuredErrors(xmlSchematronValidCtxtPtr ctxt, + xmlStructuredErrorFunc serror, void *ctx) +{ + if (ctxt == NULL) + return; + ctxt->serror = serror; + ctxt->error = NULL; + ctxt->warning = NULL; + ctxt->userData = ctx; +} + +/** + * xmlSchematronNewValidCtxt: + * @schema: a precompiled XML Schematrons + * @options: a set of xmlSchematronValidOptions + * + * Create an XML Schematrons validation context based on the given schema. + * + * Returns the validation context or NULL in case of error + */ +xmlSchematronValidCtxtPtr +xmlSchematronNewValidCtxt(xmlSchematronPtr schema, int options) +{ + int i; + xmlSchematronValidCtxtPtr ret; + + ret = (xmlSchematronValidCtxtPtr) xmlMalloc(sizeof(xmlSchematronValidCtxt)); + if (ret == NULL) { + xmlSchematronVErrMemory(NULL, "allocating validation context", + NULL); + return (NULL); + } + memset(ret, 0, sizeof(xmlSchematronValidCtxt)); + ret->type = XML_STRON_CTXT_VALIDATOR; + ret->schema = schema; + ret->xctxt = xmlXPathNewContext(NULL); + ret->flags = options; + if (ret->xctxt == NULL) { + xmlSchematronPErrMemory(NULL, "allocating schema parser XPath context", + NULL); + xmlSchematronFreeValidCtxt(ret); + return (NULL); + } + for (i = 0;i < schema->nbNamespaces;i++) { + if ((schema->namespaces[2 * i] == NULL) || + (schema->namespaces[2 * i + 1] == NULL)) + break; + xmlXPathRegisterNs(ret->xctxt, schema->namespaces[2 * i + 1], + schema->namespaces[2 * i]); + } + return (ret); +} + +/** + * xmlSchematronFreeValidCtxt: + * @ctxt: the schema validation context + * + * Free the resources associated to the schema validation context + */ +void +xmlSchematronFreeValidCtxt(xmlSchematronValidCtxtPtr ctxt) +{ + if (ctxt == NULL) + return; + if (ctxt->xctxt != NULL) + xmlXPathFreeContext(ctxt->xctxt); + if (ctxt->dict != NULL) + xmlDictFree(ctxt->dict); + xmlFree(ctxt); +} + +static xmlNodePtr +xmlSchematronNextNode(xmlNodePtr cur) { + if (cur->children != NULL) { + /* + * Do not descend on entities declarations + */ + if (cur->children->type != XML_ENTITY_DECL) { + cur = cur->children; + /* + * Skip DTDs + */ + if (cur->type != XML_DTD_NODE) + return(cur); + } + } + + while (cur->next != NULL) { + cur = cur->next; + if ((cur->type != XML_ENTITY_DECL) && + (cur->type != XML_DTD_NODE)) + return(cur); + } + + do { + cur = cur->parent; + if (cur == NULL) break; + if (cur->type == XML_DOCUMENT_NODE) return(NULL); + if (cur->next != NULL) { + cur = cur->next; + return(cur); + } + } while (cur != NULL); + return(cur); +} + +/** + * xmlSchematronRunTest: + * @ctxt: the schema validation context + * @test: the current test + * @instance: the document instace tree + * @cur: the current node in the instance + * + * Validate a rule against a tree instance at a given position + * + * Returns 1 in case of success, 0 if error and -1 in case of internal error + */ +static int +xmlSchematronRunTest(xmlSchematronValidCtxtPtr ctxt, + xmlSchematronTestPtr test, xmlDocPtr instance, xmlNodePtr cur, xmlSchematronPatternPtr pattern) +{ + xmlXPathObjectPtr ret; + int failed; + + failed = 0; + ctxt->xctxt->doc = instance; + ctxt->xctxt->node = cur; + ret = xmlXPathCompiledEval(test->comp, ctxt->xctxt); + if (ret == NULL) { + failed = 1; + } else { + switch (ret->type) { + case XPATH_XSLT_TREE: + case XPATH_NODESET: + if ((ret->nodesetval == NULL) || + (ret->nodesetval->nodeNr == 0)) + failed = 1; + break; + case XPATH_BOOLEAN: + failed = !ret->boolval; + break; + case XPATH_NUMBER: + if ((xmlXPathIsNaN(ret->floatval)) || + (ret->floatval == 0.0)) + failed = 1; + break; + case XPATH_STRING: + if ((ret->stringval == NULL) || + (ret->stringval[0] == 0)) + failed = 1; + break; + case XPATH_UNDEFINED: + case XPATH_POINT: + case XPATH_RANGE: + case XPATH_LOCATIONSET: + case XPATH_USERS: + failed = 1; + break; + } + xmlXPathFreeObject(ret); + } + if ((failed) && (test->type == XML_SCHEMATRON_ASSERT)) + ctxt->nberrors++; + else if ((!failed) && (test->type == XML_SCHEMATRON_REPORT)) + ctxt->nberrors++; + + xmlSchematronReportSuccess(ctxt, test, cur, pattern, !failed); + + return(!failed); +} + +/** + * xmlSchematronValidateDoc: + * @ctxt: the schema validation context + * @instance: the document instace tree + * + * Validate a tree instance against the schematron + * + * Returns 0 in case of success, -1 in case of internal error + * and an error count otherwise. + */ +int +xmlSchematronValidateDoc(xmlSchematronValidCtxtPtr ctxt, xmlDocPtr instance) +{ + xmlNodePtr cur, root; + xmlSchematronPatternPtr pattern; + xmlSchematronRulePtr rule; + xmlSchematronTestPtr test; + + if ((ctxt == NULL) || (ctxt->schema == NULL) || + (ctxt->schema->rules == NULL) || (instance == NULL)) + return(-1); + ctxt->nberrors = 0; + root = xmlDocGetRootElement(instance); + if (root == NULL) { + TODO + ctxt->nberrors++; + return(1); + } + if ((ctxt->flags & XML_SCHEMATRON_OUT_QUIET) || + (ctxt->flags == 0)) { + /* + * we are just trying to assert the validity of the document, + * speed primes over the output, run in a single pass + */ + cur = root; + while (cur != NULL) { + rule = ctxt->schema->rules; + while (rule != NULL) { + if (xmlPatternMatch(rule->pattern, cur) == 1) { + test = rule->tests; + while (test != NULL) { + xmlSchematronRunTest(ctxt, test, instance, cur, (xmlSchematronPatternPtr)rule->pattern); + test = test->next; + } + } + rule = rule->next; + } + + cur = xmlSchematronNextNode(cur); + } + } else { + /* + * Process all contexts one at a time + */ + pattern = ctxt->schema->patterns; + + while (pattern != NULL) { + xmlSchematronReportPattern(ctxt, pattern); + + /* + * TODO convert the pattern rule to a direct XPath and + * compute directly instead of using the pattern matching + * over the full document... + * Check the exact semantic + */ + cur = root; + while (cur != NULL) { + rule = pattern->rules; + while (rule != NULL) { + if (xmlPatternMatch(rule->pattern, cur) == 1) { + test = rule->tests; + while (test != NULL) { + xmlSchematronRunTest(ctxt, test, instance, cur, pattern); + test = test->next; + } + } + rule = rule->patnext; + } + + cur = xmlSchematronNextNode(cur); + } + pattern = pattern->next; + } + } + return(ctxt->nberrors); +} + +#ifdef STANDALONE +int +main(void) +{ + int ret; + xmlDocPtr instance; + xmlSchematronParserCtxtPtr pctxt; + xmlSchematronValidCtxtPtr vctxt; + xmlSchematronPtr schema = NULL; + + pctxt = xmlSchematronNewParserCtxt("tst.sct"); + if (pctxt == NULL) { + fprintf(stderr, "failed to build schematron parser\n"); + } else { + schema = xmlSchematronParse(pctxt); + if (schema == NULL) { + fprintf(stderr, "failed to compile schematron\n"); + } + xmlSchematronFreeParserCtxt(pctxt); + } + instance = xmlReadFile("tst.sct", NULL, + XML_PARSE_NOENT | XML_PARSE_NOCDATA); + if (instance == NULL) { + fprintf(stderr, "failed to parse instance\n"); + } + if ((schema != NULL) && (instance != NULL)) { + vctxt = xmlSchematronNewValidCtxt(schema); + if (vctxt == NULL) { + fprintf(stderr, "failed to build schematron validator\n"); + } else { + ret = xmlSchematronValidateDoc(vctxt, instance); + xmlSchematronFreeValidCtxt(vctxt); + } + } + xmlSchematronFree(schema); + xmlFreeDoc(instance); + + xmlCleanupParser(); + xmlMemoryDump(); + + return (0); +} +#endif +#define bottom_schematron +#include "elfgcchack.h" +#endif /* LIBXML_SCHEMATRON_ENABLED */ diff --git a/vendors/libxml/src/threads.c b/vendors/libxml/src/threads.c new file mode 100644 index 0000000..f2f2703 --- /dev/null +++ b/vendors/libxml/src/threads.c @@ -0,0 +1,1037 @@ +/** + * threads.c: set of generic threading related routines + * + * See Copyright for the status of this software. + * + * Gary Pennington + * daniel@veillard.com + */ + +#define IN_LIBXML +#include "libxml.h" + +#include + +#include +#include + +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_PTHREAD_H +#include +#elif defined HAVE_WIN32_THREADS +#include +#ifndef HAVE_COMPILER_TLS +#include +#endif +#endif + +#ifdef HAVE_BEOS_THREADS +#include +#include +#endif + +#if defined(SOLARIS) +#include +#endif + +/* #define DEBUG_THREADS */ + +#ifdef HAVE_PTHREAD_H + +static int libxml_is_threaded = -1; +#ifdef __GNUC__ +#ifdef linux +#if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || (__GNUC__ > 3) +extern int pthread_once (pthread_once_t *__once_control, + void (*__init_routine) (void)) + __attribute((weak)); +extern void *pthread_getspecific (pthread_key_t __key) + __attribute((weak)); +extern int pthread_setspecific (pthread_key_t __key, + __const void *__pointer) + __attribute((weak)); +extern int pthread_key_create (pthread_key_t *__key, + void (*__destr_function) (void *)) + __attribute((weak)); +extern int pthread_key_delete (pthread_key_t __key) + __attribute((weak)); +extern int pthread_mutex_init () + __attribute((weak)); +extern int pthread_mutex_destroy () + __attribute((weak)); +extern int pthread_mutex_lock () + __attribute((weak)); +extern int pthread_mutex_unlock () + __attribute((weak)); +extern int pthread_cond_init () + __attribute((weak)); +extern int pthread_cond_destroy () + __attribute((weak)); +extern int pthread_cond_wait () + __attribute((weak)); +extern int pthread_equal () + __attribute((weak)); +extern pthread_t pthread_self () + __attribute((weak)); +extern int pthread_key_create () + __attribute((weak)); +extern int pthread_key_delete () + __attribute((weak)); +extern int pthread_cond_signal () + __attribute((weak)); +#endif +#endif /* linux */ +#endif /* __GNUC__ */ +#endif /* HAVE_PTHREAD_H */ + +/* + * TODO: this module still uses malloc/free and not xmlMalloc/xmlFree + * to avoid some crazyness since xmlMalloc/xmlFree may actually + * be hosted on allocated blocks needing them for the allocation ... + */ + +/* + * xmlMutex are a simple mutual exception locks + */ +struct _xmlMutex { +#ifdef HAVE_PTHREAD_H + pthread_mutex_t lock; +#elif defined HAVE_WIN32_THREADS + HANDLE mutex; +#elif defined HAVE_BEOS_THREADS + sem_id sem; + thread_id tid; +#else + int empty; +#endif +}; + +/* + * xmlRMutex are reentrant mutual exception locks + */ +struct _xmlRMutex { +#ifdef HAVE_PTHREAD_H + pthread_mutex_t lock; + unsigned int held; + unsigned int waiters; + pthread_t tid; + pthread_cond_t cv; +#elif defined HAVE_WIN32_THREADS + CRITICAL_SECTION cs; + unsigned int count; +#elif defined HAVE_BEOS_THREADS + xmlMutexPtr lock; + thread_id tid; + int32 count; +#else + int empty; +#endif +}; + +/* + * This module still has some internal static data. + * - xmlLibraryLock a global lock + * - globalkey used for per-thread data + */ + +#ifdef HAVE_PTHREAD_H +static pthread_key_t globalkey; +static pthread_t mainthread; +static pthread_once_t once_control = PTHREAD_ONCE_INIT; +static pthread_once_t once_control_init = PTHREAD_ONCE_INIT; +static pthread_mutex_t global_init_lock = PTHREAD_MUTEX_INITIALIZER; +#elif defined HAVE_WIN32_THREADS +#if defined(HAVE_COMPILER_TLS) +static __declspec(thread) xmlGlobalState tlstate; +static __declspec(thread) int tlstate_inited = 0; +#else /* HAVE_COMPILER_TLS */ +static DWORD globalkey = TLS_OUT_OF_INDEXES; +#endif /* HAVE_COMPILER_TLS */ +static DWORD mainthread; +static struct { + DWORD done; + DWORD control; +} run_once = { 0, 0}; +static volatile LPCRITICAL_SECTION global_init_lock = NULL; + +/* endif HAVE_WIN32_THREADS */ +#elif defined HAVE_BEOS_THREADS +int32 globalkey = 0; +thread_id mainthread = 0; +int32 run_once_init = 0; +static int32 global_init_lock = -1; +static vint32 global_init_count = 0; +#endif + +static xmlRMutexPtr xmlLibraryLock = NULL; + +#ifdef LIBXML_THREAD_ENABLED +static void xmlOnceInit(void); +#endif + +/** + * xmlNewMutex: + * + * xmlNewMutex() is used to allocate a libxml2 token struct for use in + * synchronizing access to data. + * + * Returns a new simple mutex pointer or NULL in case of error + */ +xmlMutexPtr +xmlNewMutex(void) +{ + xmlMutexPtr tok; + + if ((tok = malloc(sizeof(xmlMutex))) == NULL) + return (NULL); +#ifdef HAVE_PTHREAD_H + if (libxml_is_threaded != 0) + pthread_mutex_init(&tok->lock, NULL); +#elif defined HAVE_WIN32_THREADS + tok->mutex = CreateMutex(NULL, FALSE, NULL); +#elif defined HAVE_BEOS_THREADS + if ((tok->sem = create_sem(1, "xmlMutex")) < B_OK) { + free(tok); + return NULL; + } + tok->tid = -1; +#endif + return (tok); +} + +/** + * xmlFreeMutex: + * @tok: the simple mutex + * + * xmlFreeMutex() is used to reclaim resources associated with a libxml2 token + * struct. + */ +void +xmlFreeMutex(xmlMutexPtr tok) +{ + if (tok == NULL) + return; + +#ifdef HAVE_PTHREAD_H + if (libxml_is_threaded != 0) + pthread_mutex_destroy(&tok->lock); +#elif defined HAVE_WIN32_THREADS + CloseHandle(tok->mutex); +#elif defined HAVE_BEOS_THREADS + delete_sem(tok->sem); +#endif + free(tok); +} + +/** + * xmlMutexLock: + * @tok: the simple mutex + * + * xmlMutexLock() is used to lock a libxml2 token. + */ +void +xmlMutexLock(xmlMutexPtr tok) +{ + if (tok == NULL) + return; +#ifdef HAVE_PTHREAD_H + if (libxml_is_threaded != 0) + pthread_mutex_lock(&tok->lock); +#elif defined HAVE_WIN32_THREADS + WaitForSingleObject(tok->mutex, INFINITE); +#elif defined HAVE_BEOS_THREADS + if (acquire_sem(tok->sem) != B_NO_ERROR) { +#ifdef DEBUG_THREADS + xmlGenericError(xmlGenericErrorContext, + "xmlMutexLock():BeOS:Couldn't aquire semaphore\n"); +#endif + } + tok->tid = find_thread(NULL); +#endif + +} + +/** + * xmlMutexUnlock: + * @tok: the simple mutex + * + * xmlMutexUnlock() is used to unlock a libxml2 token. + */ +void +xmlMutexUnlock(xmlMutexPtr tok) +{ + if (tok == NULL) + return; +#ifdef HAVE_PTHREAD_H + if (libxml_is_threaded != 0) + pthread_mutex_unlock(&tok->lock); +#elif defined HAVE_WIN32_THREADS + ReleaseMutex(tok->mutex); +#elif defined HAVE_BEOS_THREADS + if (tok->tid == find_thread(NULL)) { + tok->tid = -1; + release_sem(tok->sem); + } +#endif +} + +/** + * xmlNewRMutex: + * + * xmlRNewMutex() is used to allocate a reentrant mutex for use in + * synchronizing access to data. token_r is a re-entrant lock and thus useful + * for synchronizing access to data structures that may be manipulated in a + * recursive fashion. + * + * Returns the new reentrant mutex pointer or NULL in case of error + */ +xmlRMutexPtr +xmlNewRMutex(void) +{ + xmlRMutexPtr tok; + + if ((tok = malloc(sizeof(xmlRMutex))) == NULL) + return (NULL); +#ifdef HAVE_PTHREAD_H + if (libxml_is_threaded != 0) { + pthread_mutex_init(&tok->lock, NULL); + tok->held = 0; + tok->waiters = 0; + pthread_cond_init(&tok->cv, NULL); + } +#elif defined HAVE_WIN32_THREADS + InitializeCriticalSection(&tok->cs); + tok->count = 0; +#elif defined HAVE_BEOS_THREADS + if ((tok->lock = xmlNewMutex()) == NULL) { + free(tok); + return NULL; + } + tok->count = 0; +#endif + return (tok); +} + +/** + * xmlFreeRMutex: + * @tok: the reentrant mutex + * + * xmlRFreeMutex() is used to reclaim resources associated with a + * reentrant mutex. + */ +void +xmlFreeRMutex(xmlRMutexPtr tok ATTRIBUTE_UNUSED) +{ + if (tok == NULL) + return; +#ifdef HAVE_PTHREAD_H + if (libxml_is_threaded != 0) { + pthread_mutex_destroy(&tok->lock); + pthread_cond_destroy(&tok->cv); + } +#elif defined HAVE_WIN32_THREADS + DeleteCriticalSection(&tok->cs); +#elif defined HAVE_BEOS_THREADS + xmlFreeMutex(tok->lock); +#endif + free(tok); +} + +/** + * xmlRMutexLock: + * @tok: the reentrant mutex + * + * xmlRMutexLock() is used to lock a libxml2 token_r. + */ +void +xmlRMutexLock(xmlRMutexPtr tok) +{ + if (tok == NULL) + return; +#ifdef HAVE_PTHREAD_H + if (libxml_is_threaded == 0) + return; + + pthread_mutex_lock(&tok->lock); + if (tok->held) { + if (pthread_equal(tok->tid, pthread_self())) { + tok->held++; + pthread_mutex_unlock(&tok->lock); + return; + } else { + tok->waiters++; + while (tok->held) + pthread_cond_wait(&tok->cv, &tok->lock); + tok->waiters--; + } + } + tok->tid = pthread_self(); + tok->held = 1; + pthread_mutex_unlock(&tok->lock); +#elif defined HAVE_WIN32_THREADS + EnterCriticalSection(&tok->cs); + ++tok->count; +#elif defined HAVE_BEOS_THREADS + if (tok->lock->tid == find_thread(NULL)) { + tok->count++; + return; + } else { + xmlMutexLock(tok->lock); + tok->count = 1; + } +#endif +} + +/** + * xmlRMutexUnlock: + * @tok: the reentrant mutex + * + * xmlRMutexUnlock() is used to unlock a libxml2 token_r. + */ +void +xmlRMutexUnlock(xmlRMutexPtr tok ATTRIBUTE_UNUSED) +{ + if (tok == NULL) + return; +#ifdef HAVE_PTHREAD_H + if (libxml_is_threaded == 0) + return; + + pthread_mutex_lock(&tok->lock); + tok->held--; + if (tok->held == 0) { + if (tok->waiters) + pthread_cond_signal(&tok->cv); + memset(&tok->tid, 0, sizeof(tok->tid)); + } + pthread_mutex_unlock(&tok->lock); +#elif defined HAVE_WIN32_THREADS + if (!--tok->count) + LeaveCriticalSection(&tok->cs); +#elif defined HAVE_BEOS_THREADS + if (tok->lock->tid == find_thread(NULL)) { + tok->count--; + if (tok->count == 0) { + xmlMutexUnlock(tok->lock); + } + return; + } +#endif +} + +/** + * xmlGlobalInitMutexLock + * + * Makes sure that the global initialization mutex is initialized and + * locks it. + */ +void +__xmlGlobalInitMutexLock(void) +{ + /* Make sure the global init lock is initialized and then lock it. */ +#ifdef HAVE_PTHREAD_H + /* The mutex is statically initialized, so we just lock it. */ + if (pthread_mutex_lock != NULL) + pthread_mutex_lock(&global_init_lock); +#elif defined HAVE_WIN32_THREADS + LPCRITICAL_SECTION cs; + + /* Create a new critical section */ + if (global_init_lock == NULL) { + cs = malloc(sizeof(CRITICAL_SECTION)); + if (cs == NULL) { + xmlGenericError(xmlGenericErrorContext, + "xmlGlobalInitMutexLock: out of memory\n"); + return; + } + InitializeCriticalSection(cs); + + /* Swap it into the global_init_lock */ +#ifdef InterlockedCompareExchangePointer + InterlockedCompareExchangePointer(&global_init_lock, cs, NULL); +#else /* Use older void* version */ + InterlockedCompareExchange((void **) &global_init_lock, + (void *) cs, NULL); +#endif /* InterlockedCompareExchangePointer */ + + /* If another thread successfully recorded its critical + * section in the global_init_lock then discard the one + * allocated by this thread. */ + if (global_init_lock != cs) { + DeleteCriticalSection(cs); + free(cs); + } + } + + /* Lock the chosen critical section */ + EnterCriticalSection(global_init_lock); +#elif defined HAVE_BEOS_THREADS + int32 sem; + + /* Allocate a new semaphore */ + sem = create_sem(1, "xmlGlobalinitMutex"); + + while (global_init_lock == -1) { + if (atomic_add(&global_init_count, 1) == 0) { + global_init_lock = sem; + } else { + snooze(1); + atomic_add(&global_init_count, -1); + } + } + + /* If another thread successfully recorded its critical + * section in the global_init_lock then discard the one + * allocated by this thread. */ + if (global_init_lock != sem) + delete_sem(sem); + + /* Acquire the chosen semaphore */ + if (acquire_sem(global_init_lock) != B_NO_ERROR) { +#ifdef DEBUG_THREADS + xmlGenericError(xmlGenericErrorContext, + "xmlGlobalInitMutexLock():BeOS:Couldn't acquire semaphore\n"); +#endif + } +#endif +} + +void +__xmlGlobalInitMutexUnlock(void) +{ +#ifdef HAVE_PTHREAD_H + if (pthread_mutex_unlock != NULL) + pthread_mutex_unlock(&global_init_lock); +#elif defined HAVE_WIN32_THREADS + if (global_init_lock != NULL) { + LeaveCriticalSection(global_init_lock); + } +#elif defined HAVE_BEOS_THREADS + release_sem(global_init_lock); +#endif +} + +/** + * xmlGlobalInitMutexDestroy + * + * Makes sure that the global initialization mutex is destroyed before + * application termination. + */ +void +__xmlGlobalInitMutexDestroy(void) +{ +#ifdef HAVE_PTHREAD_H +#elif defined HAVE_WIN32_THREADS + if (global_init_lock != NULL) { + DeleteCriticalSection(global_init_lock); + free(global_init_lock); + global_init_lock = NULL; + } +#endif +} + +/************************************************************************ + * * + * Per thread global state handling * + * * + ************************************************************************/ + +#ifdef LIBXML_THREAD_ENABLED +#ifdef xmlLastError +#undef xmlLastError +#endif + +/** + * xmlFreeGlobalState: + * @state: a thread global state + * + * xmlFreeGlobalState() is called when a thread terminates with a non-NULL + * global state. It is is used here to reclaim memory resources. + */ +static void +xmlFreeGlobalState(void *state) +{ + xmlGlobalState *gs = (xmlGlobalState *) state; + + /* free any memory allocated in the thread's xmlLastError */ + xmlResetError(&(gs->xmlLastError)); + free(state); +} + +/** + * xmlNewGlobalState: + * + * xmlNewGlobalState() allocates a global state. This structure is used to + * hold all data for use by a thread when supporting backwards compatibility + * of libxml2 to pre-thread-safe behaviour. + * + * Returns the newly allocated xmlGlobalStatePtr or NULL in case of error + */ +static xmlGlobalStatePtr +xmlNewGlobalState(void) +{ + xmlGlobalState *gs; + + gs = malloc(sizeof(xmlGlobalState)); + if (gs == NULL) { + xmlGenericError(xmlGenericErrorContext, + "xmlGetGlobalState: out of memory\n"); + return (NULL); + } + + memset(gs, 0, sizeof(xmlGlobalState)); + xmlInitializeGlobalState(gs); + return (gs); +} +#endif /* LIBXML_THREAD_ENABLED */ + +#ifdef HAVE_PTHREAD_H +#elif defined HAVE_WIN32_THREADS +#if !defined(HAVE_COMPILER_TLS) +#if defined(LIBXML_STATIC) && !defined(LIBXML_STATIC_FOR_DLL) +typedef struct _xmlGlobalStateCleanupHelperParams { + HANDLE thread; + void *memory; +} xmlGlobalStateCleanupHelperParams; + +static void XMLCDECL +xmlGlobalStateCleanupHelper(void *p) +{ + xmlGlobalStateCleanupHelperParams *params = + (xmlGlobalStateCleanupHelperParams *) p; + WaitForSingleObject(params->thread, INFINITE); + CloseHandle(params->thread); + xmlFreeGlobalState(params->memory); + free(params); + _endthread(); +} +#else /* LIBXML_STATIC && !LIBXML_STATIC_FOR_DLL */ + +typedef struct _xmlGlobalStateCleanupHelperParams { + void *memory; + struct _xmlGlobalStateCleanupHelperParams *prev; + struct _xmlGlobalStateCleanupHelperParams *next; +} xmlGlobalStateCleanupHelperParams; + +static xmlGlobalStateCleanupHelperParams *cleanup_helpers_head = NULL; +static CRITICAL_SECTION cleanup_helpers_cs; + +#endif /* LIBXMLSTATIC && !LIBXML_STATIC_FOR_DLL */ +#endif /* HAVE_COMPILER_TLS */ +#endif /* HAVE_WIN32_THREADS */ + +#if defined HAVE_BEOS_THREADS + +/** + * xmlGlobalStateCleanup: + * @data: unused parameter + * + * Used for Beos only + */ +void +xmlGlobalStateCleanup(void *data) +{ + void *globalval = tls_get(globalkey); + + if (globalval != NULL) + xmlFreeGlobalState(globalval); +} +#endif + +/** + * xmlGetGlobalState: + * + * xmlGetGlobalState() is called to retrieve the global state for a thread. + * + * Returns the thread global state or NULL in case of error + */ +xmlGlobalStatePtr +xmlGetGlobalState(void) +{ +#ifdef HAVE_PTHREAD_H + xmlGlobalState *globalval; + + if (libxml_is_threaded == 0) + return (NULL); + + pthread_once(&once_control, xmlOnceInit); + + if ((globalval = (xmlGlobalState *) + pthread_getspecific(globalkey)) == NULL) { + xmlGlobalState *tsd = xmlNewGlobalState(); + if (tsd == NULL) + return(NULL); + + pthread_setspecific(globalkey, tsd); + return (tsd); + } + return (globalval); +#elif defined HAVE_WIN32_THREADS +#if defined(HAVE_COMPILER_TLS) + if (!tlstate_inited) { + tlstate_inited = 1; + xmlInitializeGlobalState(&tlstate); + } + return &tlstate; +#else /* HAVE_COMPILER_TLS */ + xmlGlobalState *globalval; + xmlGlobalStateCleanupHelperParams *p; + + xmlOnceInit(); +#if defined(LIBXML_STATIC) && !defined(LIBXML_STATIC_FOR_DLL) + globalval = (xmlGlobalState *) TlsGetValue(globalkey); +#else + p = (xmlGlobalStateCleanupHelperParams *) TlsGetValue(globalkey); + globalval = (xmlGlobalState *) (p ? p->memory : NULL); +#endif + if (globalval == NULL) { + xmlGlobalState *tsd = xmlNewGlobalState(); + + if (tsd == NULL) + return(NULL); + p = (xmlGlobalStateCleanupHelperParams *) + malloc(sizeof(xmlGlobalStateCleanupHelperParams)); + if (p == NULL) { + xmlGenericError(xmlGenericErrorContext, + "xmlGetGlobalState: out of memory\n"); + xmlFreeGlobalState(tsd); + return(NULL); + } + p->memory = tsd; +#if defined(LIBXML_STATIC) && !defined(LIBXML_STATIC_FOR_DLL) + DuplicateHandle(GetCurrentProcess(), GetCurrentThread(), + GetCurrentProcess(), &p->thread, 0, TRUE, + DUPLICATE_SAME_ACCESS); + TlsSetValue(globalkey, tsd); + _beginthread(xmlGlobalStateCleanupHelper, 0, p); +#else + EnterCriticalSection(&cleanup_helpers_cs); + if (cleanup_helpers_head != NULL) { + cleanup_helpers_head->prev = p; + } + p->next = cleanup_helpers_head; + p->prev = NULL; + cleanup_helpers_head = p; + TlsSetValue(globalkey, p); + LeaveCriticalSection(&cleanup_helpers_cs); +#endif + + return (tsd); + } + return (globalval); +#endif /* HAVE_COMPILER_TLS */ +#elif defined HAVE_BEOS_THREADS + xmlGlobalState *globalval; + + xmlOnceInit(); + + if ((globalval = (xmlGlobalState *) tls_get(globalkey)) == NULL) { + xmlGlobalState *tsd = xmlNewGlobalState(); + if (tsd == NULL) + return (NULL); + + tls_set(globalkey, tsd); + on_exit_thread(xmlGlobalStateCleanup, NULL); + return (tsd); + } + return (globalval); +#else + return (NULL); +#endif +} + +/************************************************************************ + * * + * Library wide thread interfaces * + * * + ************************************************************************/ + +/** + * xmlGetThreadId: + * + * xmlGetThreadId() find the current thread ID number + * Note that this is likely to be broken on some platforms using pthreads + * as the specification doesn't mandate pthread_t to be an integer type + * + * Returns the current thread ID number + */ +int +xmlGetThreadId(void) +{ +#ifdef HAVE_PTHREAD_H + pthread_t id; + int ret; + + if (libxml_is_threaded == 0) + return (0); + id = pthread_self(); + /* horrible but preserves compat, see warning above */ + memcpy(&ret, &id, sizeof(ret)); + return (ret); +#elif defined HAVE_WIN32_THREADS + return GetCurrentThreadId(); +#elif defined HAVE_BEOS_THREADS + return find_thread(NULL); +#else + return ((int) 0); +#endif +} + +/** + * xmlIsMainThread: + * + * xmlIsMainThread() check whether the current thread is the main thread. + * + * Returns 1 if the current thread is the main thread, 0 otherwise + */ +int +xmlIsMainThread(void) +{ +#ifdef HAVE_PTHREAD_H + if (libxml_is_threaded == -1) + xmlInitThreads(); + if (libxml_is_threaded == 0) + return (1); + pthread_once(&once_control, xmlOnceInit); +#elif defined HAVE_WIN32_THREADS + xmlOnceInit(); +#elif defined HAVE_BEOS_THREADS + xmlOnceInit(); +#endif + +#ifdef DEBUG_THREADS + xmlGenericError(xmlGenericErrorContext, "xmlIsMainThread()\n"); +#endif +#ifdef HAVE_PTHREAD_H + return (pthread_equal(mainthread,pthread_self())); +#elif defined HAVE_WIN32_THREADS + return (mainthread == GetCurrentThreadId()); +#elif defined HAVE_BEOS_THREADS + return (mainthread == find_thread(NULL)); +#else + return (1); +#endif +} + +/** + * xmlLockLibrary: + * + * xmlLockLibrary() is used to take out a re-entrant lock on the libxml2 + * library. + */ +void +xmlLockLibrary(void) +{ +#ifdef DEBUG_THREADS + xmlGenericError(xmlGenericErrorContext, "xmlLockLibrary()\n"); +#endif + xmlRMutexLock(xmlLibraryLock); +} + +/** + * xmlUnlockLibrary: + * + * xmlUnlockLibrary() is used to release a re-entrant lock on the libxml2 + * library. + */ +void +xmlUnlockLibrary(void) +{ +#ifdef DEBUG_THREADS + xmlGenericError(xmlGenericErrorContext, "xmlUnlockLibrary()\n"); +#endif + xmlRMutexUnlock(xmlLibraryLock); +} + +/** + * xmlInitThreads: + * + * xmlInitThreads() is used to to initialize all the thread related + * data of the libxml2 library. + */ +void +xmlInitThreads(void) +{ +#ifdef HAVE_PTHREAD_H + if (libxml_is_threaded == -1) { + if ((pthread_once != NULL) && + (pthread_getspecific != NULL) && + (pthread_setspecific != NULL) && + (pthread_key_create != NULL) && + (pthread_key_delete != NULL) && + (pthread_mutex_init != NULL) && + (pthread_mutex_destroy != NULL) && + (pthread_mutex_lock != NULL) && + (pthread_mutex_unlock != NULL) && + (pthread_cond_init != NULL) && + (pthread_cond_destroy != NULL) && + (pthread_cond_wait != NULL) && + (pthread_equal != NULL) && + (pthread_self != NULL) && + (pthread_cond_signal != NULL)) { + libxml_is_threaded = 1; + +/* fprintf(stderr, "Running multithreaded\n"); */ + } else { + +/* fprintf(stderr, "Running without multithread\n"); */ + libxml_is_threaded = 0; + } + } +#elif defined(HAVE_WIN32_THREADS) && !defined(HAVE_COMPILER_TLS) && (!defined(LIBXML_STATIC) || defined(LIBXML_STATIC_FOR_DLL)) + InitializeCriticalSection(&cleanup_helpers_cs); +#endif +} + +/** + * xmlCleanupThreads: + * + * xmlCleanupThreads() is used to to cleanup all the thread related + * data of the libxml2 library once processing has ended. + * + * WARNING: if your application is multithreaded or has plugin support + * calling this may crash the application if another thread or + * a plugin is still using libxml2. It's sometimes very hard to + * guess if libxml2 is in use in the application, some libraries + * or plugins may use it without notice. In case of doubt abstain + * from calling this function or do it just before calling exit() + * to avoid leak reports from valgrind ! + */ +void +xmlCleanupThreads(void) +{ +#ifdef DEBUG_THREADS + xmlGenericError(xmlGenericErrorContext, "xmlCleanupThreads()\n"); +#endif +#ifdef HAVE_PTHREAD_H + if ((libxml_is_threaded) && (pthread_key_delete != NULL)) + pthread_key_delete(globalkey); + once_control = once_control_init; +#elif defined(HAVE_WIN32_THREADS) && !defined(HAVE_COMPILER_TLS) && (!defined(LIBXML_STATIC) || defined(LIBXML_STATIC_FOR_DLL)) + if (globalkey != TLS_OUT_OF_INDEXES) { + xmlGlobalStateCleanupHelperParams *p; + + EnterCriticalSection(&cleanup_helpers_cs); + p = cleanup_helpers_head; + while (p != NULL) { + xmlGlobalStateCleanupHelperParams *temp = p; + + p = p->next; + xmlFreeGlobalState(temp->memory); + free(temp); + } + cleanup_helpers_head = 0; + LeaveCriticalSection(&cleanup_helpers_cs); + TlsFree(globalkey); + globalkey = TLS_OUT_OF_INDEXES; + } + DeleteCriticalSection(&cleanup_helpers_cs); +#endif +} + +#ifdef LIBXML_THREAD_ENABLED + +/** + * xmlOnceInit + * + * xmlOnceInit() is used to initialize the value of mainthread for use + * in other routines. This function should only be called using + * pthread_once() in association with the once_control variable to ensure + * that the function is only called once. See man pthread_once for more + * details. + */ +static void +xmlOnceInit(void) +{ +#ifdef HAVE_PTHREAD_H + (void) pthread_key_create(&globalkey, xmlFreeGlobalState); + mainthread = pthread_self(); + __xmlInitializeDict(); +#elif defined(HAVE_WIN32_THREADS) + if (!run_once.done) { + if (InterlockedIncrement(&run_once.control) == 1) { +#if !defined(HAVE_COMPILER_TLS) + globalkey = TlsAlloc(); +#endif + mainthread = GetCurrentThreadId(); + __xmlInitializeDict(); + run_once.done = 1; + } else { + /* Another thread is working; give up our slice and + * wait until they're done. */ + while (!run_once.done) + Sleep(0); + } + } +#elif defined HAVE_BEOS_THREADS + if (atomic_add(&run_once_init, 1) == 0) { + globalkey = tls_allocate(); + tls_set(globalkey, NULL); + mainthread = find_thread(NULL); + __xmlInitializeDict(); + } else + atomic_add(&run_once_init, -1); +#endif +} +#endif + +/** + * DllMain: + * @hinstDLL: handle to DLL instance + * @fdwReason: Reason code for entry + * @lpvReserved: generic pointer (depends upon reason code) + * + * Entry point for Windows library. It is being used to free thread-specific + * storage. + * + * Returns TRUE always + */ +#ifdef HAVE_PTHREAD_H +#elif defined(HAVE_WIN32_THREADS) && !defined(HAVE_COMPILER_TLS) && (!defined(LIBXML_STATIC) || defined(LIBXML_STATIC_FOR_DLL)) +#if defined(LIBXML_STATIC_FOR_DLL) +BOOL XMLCALL +xmlDllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +#else +BOOL WINAPI +DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +#endif +{ + switch (fdwReason) { + case DLL_THREAD_DETACH: + if (globalkey != TLS_OUT_OF_INDEXES) { + xmlGlobalState *globalval = NULL; + xmlGlobalStateCleanupHelperParams *p = + (xmlGlobalStateCleanupHelperParams *) + TlsGetValue(globalkey); + globalval = (xmlGlobalState *) (p ? p->memory : NULL); + if (globalval) { + xmlFreeGlobalState(globalval); + TlsSetValue(globalkey, NULL); + } + if (p) { + EnterCriticalSection(&cleanup_helpers_cs); + if (p == cleanup_helpers_head) + cleanup_helpers_head = p->next; + else + p->prev->next = p->next; + if (p->next != NULL) + p->next->prev = p->prev; + LeaveCriticalSection(&cleanup_helpers_cs); + free(p); + } + } + break; + } + return TRUE; +} +#endif +#define bottom_threads +#include "elfgcchack.h" diff --git a/vendors/libxml/src/timsort.h b/vendors/libxml/src/timsort.h new file mode 100644 index 0000000..99697a0 --- /dev/null +++ b/vendors/libxml/src/timsort.h @@ -0,0 +1,514 @@ +/* + * taken from https://github.com/swenson/sort + * Kept as is for the moment to be able to apply upstream patches for that + * code, currently used only to speed up XPath node sorting, see xpath.c + */ + +/* + * All code in this header, unless otherwise specified, is hereby licensed under the MIT Public License: + +Copyright (c) 2010 Christopher Swenson + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#include +#include +#include +#ifdef HAVE_STDINT_H +#include +#else +#ifdef HAVE_INTTYPES_H +#include +#elif defined(WIN32) +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; +#endif +#endif + +#ifndef MK_UINT64 +#if defined(WIN32) && defined(_MSC_VER) && _MSC_VER < 1300 +#define MK_UINT64(x) ((uint64_t)(x)) +#else +#define MK_UINT64(x) x##ULL +#endif +#endif + +#ifndef MAX +#define MAX(x,y) (((x) > (y) ? (x) : (y))) +#endif +#ifndef MIN +#define MIN(x,y) (((x) < (y) ? (x) : (y))) +#endif + +int compute_minrun(uint64_t); + +#ifndef CLZ +#if defined(__GNUC__) && ((__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ > 3)) +#define CLZ __builtin_clzll +#else + +int clzll(uint64_t); + +/* adapted from Hacker's Delight */ +int clzll(uint64_t x) /* {{{ */ +{ + int n; + + if (x == 0) return(64); + n = 0; + if (x <= 0x00000000FFFFFFFFL) {n = n + 32; x = x << 32;} + if (x <= 0x0000FFFFFFFFFFFFL) {n = n + 16; x = x << 16;} + if (x <= 0x00FFFFFFFFFFFFFFL) {n = n + 8; x = x << 8;} + if (x <= 0x0FFFFFFFFFFFFFFFL) {n = n + 4; x = x << 4;} + if (x <= 0x3FFFFFFFFFFFFFFFL) {n = n + 2; x = x << 2;} + if (x <= 0x7FFFFFFFFFFFFFFFL) {n = n + 1;} + return n; +} +/* }}} */ + +#define CLZ clzll +#endif +#endif + +int compute_minrun(uint64_t size) /* {{{ */ +{ + const int top_bit = 64 - CLZ(size); + const int shift = MAX(top_bit, 6) - 6; + const int minrun = size >> shift; + const uint64_t mask = (MK_UINT64(1) << shift) - 1; + if (mask & size) return minrun + 1; + return minrun; +} +/* }}} */ + +#ifndef SORT_NAME +#error "Must declare SORT_NAME" +#endif + +#ifndef SORT_TYPE +#error "Must declare SORT_TYPE" +#endif + +#ifndef SORT_CMP +#define SORT_CMP(x, y) ((x) < (y) ? -1 : ((x) == (y) ? 0 : 1)) +#endif + + +#define SORT_SWAP(x,y) {SORT_TYPE __SORT_SWAP_t = (x); (x) = (y); (y) = __SORT_SWAP_t;} + +#define SORT_CONCAT(x, y) x ## _ ## y +#define SORT_MAKE_STR1(x, y) SORT_CONCAT(x,y) +#define SORT_MAKE_STR(x) SORT_MAKE_STR1(SORT_NAME,x) + +#define BINARY_INSERTION_FIND SORT_MAKE_STR(binary_insertion_find) +#define BINARY_INSERTION_SORT_START SORT_MAKE_STR(binary_insertion_sort_start) +#define BINARY_INSERTION_SORT SORT_MAKE_STR(binary_insertion_sort) +#define REVERSE_ELEMENTS SORT_MAKE_STR(reverse_elements) +#define COUNT_RUN SORT_MAKE_STR(count_run) +#define CHECK_INVARIANT SORT_MAKE_STR(check_invariant) +#define TIM_SORT SORT_MAKE_STR(tim_sort) +#define TIM_SORT_RESIZE SORT_MAKE_STR(tim_sort_resize) +#define TIM_SORT_MERGE SORT_MAKE_STR(tim_sort_merge) +#define TIM_SORT_COLLAPSE SORT_MAKE_STR(tim_sort_collapse) + +#define TIM_SORT_RUN_T SORT_MAKE_STR(tim_sort_run_t) +#define TEMP_STORAGE_T SORT_MAKE_STR(temp_storage_t) + +typedef struct { + int64_t start; + int64_t length; +} TIM_SORT_RUN_T; + +void BINARY_INSERTION_SORT(SORT_TYPE *dst, const size_t size); +void TIM_SORT(SORT_TYPE *dst, const size_t size); + +/* Function used to do a binary search for binary insertion sort */ +static int64_t BINARY_INSERTION_FIND(SORT_TYPE *dst, const SORT_TYPE x, const size_t size) +{ + int64_t l, c, r; + SORT_TYPE lx; + SORT_TYPE cx; + l = 0; + r = size - 1; + c = r >> 1; + lx = dst[l]; + + /* check for beginning conditions */ + if (SORT_CMP(x, lx) < 0) + return 0; + else if (SORT_CMP(x, lx) == 0) + { + int64_t i = 1; + while (SORT_CMP(x, dst[i]) == 0) i++; + return i; + } + + cx = dst[c]; + while (1) + { + const int val = SORT_CMP(x, cx); + if (val < 0) + { + if (c - l <= 1) return c; + r = c; + } + else if (val > 0) + { + if (r - c <= 1) return c + 1; + l = c; + lx = cx; + } + else + { + do + { + cx = dst[++c]; + } while (SORT_CMP(x, cx) == 0); + return c; + } + c = l + ((r - l) >> 1); + cx = dst[c]; + } +} + +/* Binary insertion sort, but knowing that the first "start" entries are sorted. Used in timsort. */ +static void BINARY_INSERTION_SORT_START(SORT_TYPE *dst, const size_t start, const size_t size) +{ + int64_t i; + for (i = start; i < (int64_t) size; i++) + { + int64_t j; + SORT_TYPE x; + int64_t location; + /* If this entry is already correct, just move along */ + if (SORT_CMP(dst[i - 1], dst[i]) <= 0) continue; + + /* Else we need to find the right place, shift everything over, and squeeze in */ + x = dst[i]; + location = BINARY_INSERTION_FIND(dst, x, i); + for (j = i - 1; j >= location; j--) + { + dst[j + 1] = dst[j]; + } + dst[location] = x; + } +} + +/* Binary insertion sort */ +void BINARY_INSERTION_SORT(SORT_TYPE *dst, const size_t size) +{ + BINARY_INSERTION_SORT_START(dst, 1, size); +} + +/* timsort implementation, based on timsort.txt */ + +static void REVERSE_ELEMENTS(SORT_TYPE *dst, int64_t start, int64_t end) +{ + while (1) + { + if (start >= end) return; + SORT_SWAP(dst[start], dst[end]); + start++; + end--; + } +} + +static int64_t COUNT_RUN(SORT_TYPE *dst, const int64_t start, const size_t size) +{ + int64_t curr; + if (size - start == 1) return 1; + if (start >= (int64_t) size - 2) + { + if (SORT_CMP(dst[size - 2], dst[size - 1]) > 0) + SORT_SWAP(dst[size - 2], dst[size - 1]); + return 2; + } + + curr = start + 2; + + if (SORT_CMP(dst[start], dst[start + 1]) <= 0) + { + /* increasing run */ + while (1) + { + if (curr == (int64_t) size - 1) break; + if (SORT_CMP(dst[curr - 1], dst[curr]) > 0) break; + curr++; + } + return curr - start; + } + else + { + /* decreasing run */ + while (1) + { + if (curr == (int64_t) size - 1) break; + if (SORT_CMP(dst[curr - 1], dst[curr]) <= 0) break; + curr++; + } + /* reverse in-place */ + REVERSE_ELEMENTS(dst, start, curr - 1); + return curr - start; + } +} + +#define PUSH_NEXT() do {\ +len = COUNT_RUN(dst, curr, size);\ +run = minrun;\ +if (run < minrun) run = minrun;\ +if (run > (int64_t) size - curr) run = size - curr;\ +if (run > len)\ +{\ + BINARY_INSERTION_SORT_START(&dst[curr], len, run);\ + len = run;\ +}\ +{\ +run_stack[stack_curr].start = curr;\ +run_stack[stack_curr].length = len;\ +stack_curr++;\ +}\ +curr += len;\ +if (curr == (int64_t) size)\ +{\ + /* finish up */ \ + while (stack_curr > 1) \ + { \ + TIM_SORT_MERGE(dst, run_stack, stack_curr, store); \ + run_stack[stack_curr - 2].length += run_stack[stack_curr - 1].length; \ + stack_curr--; \ + } \ + if (store->storage != NULL)\ + {\ + free(store->storage);\ + store->storage = NULL;\ + }\ + return;\ +}\ +}\ +while (0) + +static int CHECK_INVARIANT(TIM_SORT_RUN_T *stack, const int stack_curr) +{ + int64_t A, B, C; + if (stack_curr < 2) return 1; + if (stack_curr == 2) + { + const int64_t A1 = stack[stack_curr - 2].length; + const int64_t B1 = stack[stack_curr - 1].length; + if (A1 <= B1) return 0; + return 1; + } + A = stack[stack_curr - 3].length; + B = stack[stack_curr - 2].length; + C = stack[stack_curr - 1].length; + if ((A <= B + C) || (B <= C)) return 0; + return 1; +} + +typedef struct { + size_t alloc; + SORT_TYPE *storage; +} TEMP_STORAGE_T; + + +static void TIM_SORT_RESIZE(TEMP_STORAGE_T *store, const size_t new_size) +{ + if (store->alloc < new_size) + { + SORT_TYPE *tempstore = (SORT_TYPE *)realloc(store->storage, new_size * sizeof(SORT_TYPE)); + if (tempstore == NULL) + { + fprintf(stderr, "Error allocating temporary storage for tim sort: need %lu bytes", sizeof(SORT_TYPE) * new_size); + exit(1); + } + store->storage = tempstore; + store->alloc = new_size; + } +} + +static void TIM_SORT_MERGE(SORT_TYPE *dst, const TIM_SORT_RUN_T *stack, const int stack_curr, TEMP_STORAGE_T *store) +{ + const int64_t A = stack[stack_curr - 2].length; + const int64_t B = stack[stack_curr - 1].length; + const int64_t curr = stack[stack_curr - 2].start; + SORT_TYPE *storage; + int64_t i, j, k; + + TIM_SORT_RESIZE(store, MIN(A, B)); + storage = store->storage; + + /* left merge */ + if (A < B) + { + memcpy(storage, &dst[curr], A * sizeof(SORT_TYPE)); + i = 0; + j = curr + A; + + for (k = curr; k < curr + A + B; k++) + { + if ((i < A) && (j < curr + A + B)) + { + if (SORT_CMP(storage[i], dst[j]) <= 0) + dst[k] = storage[i++]; + else + dst[k] = dst[j++]; + } + else if (i < A) + { + dst[k] = storage[i++]; + } + else + dst[k] = dst[j++]; + } + } + /* right merge */ + else + { + memcpy(storage, &dst[curr + A], B * sizeof(SORT_TYPE)); + i = B - 1; + j = curr + A - 1; + + for (k = curr + A + B - 1; k >= curr; k--) + { + if ((i >= 0) && (j >= curr)) + { + if (SORT_CMP(dst[j], storage[i]) > 0) + dst[k] = dst[j--]; + else + dst[k] = storage[i--]; + } + else if (i >= 0) + dst[k] = storage[i--]; + else + dst[k] = dst[j--]; + } + } +} + +static int TIM_SORT_COLLAPSE(SORT_TYPE *dst, TIM_SORT_RUN_T *stack, int stack_curr, TEMP_STORAGE_T *store, const size_t size) +{ + while (1) + { + int64_t A, B, C; + /* if the stack only has one thing on it, we are done with the collapse */ + if (stack_curr <= 1) break; + /* if this is the last merge, just do it */ + if ((stack_curr == 2) && + (stack[0].length + stack[1].length == (int64_t) size)) + { + TIM_SORT_MERGE(dst, stack, stack_curr, store); + stack[0].length += stack[1].length; + stack_curr--; + break; + } + /* check if the invariant is off for a stack of 2 elements */ + else if ((stack_curr == 2) && (stack[0].length <= stack[1].length)) + { + TIM_SORT_MERGE(dst, stack, stack_curr, store); + stack[0].length += stack[1].length; + stack_curr--; + break; + } + else if (stack_curr == 2) + break; + + A = stack[stack_curr - 3].length; + B = stack[stack_curr - 2].length; + C = stack[stack_curr - 1].length; + + /* check first invariant */ + if (A <= B + C) + { + if (A < C) + { + TIM_SORT_MERGE(dst, stack, stack_curr - 1, store); + stack[stack_curr - 3].length += stack[stack_curr - 2].length; + stack[stack_curr - 2] = stack[stack_curr - 1]; + stack_curr--; + } + else + { + TIM_SORT_MERGE(dst, stack, stack_curr, store); + stack[stack_curr - 2].length += stack[stack_curr - 1].length; + stack_curr--; + } + } + /* check second invariant */ + else if (B <= C) + { + TIM_SORT_MERGE(dst, stack, stack_curr, store); + stack[stack_curr - 2].length += stack[stack_curr - 1].length; + stack_curr--; + } + else + break; + } + return stack_curr; +} + +void TIM_SORT(SORT_TYPE *dst, const size_t size) +{ + int minrun; + TEMP_STORAGE_T _store, *store; + TIM_SORT_RUN_T run_stack[128]; + int stack_curr = 0; + int64_t len, run; + int64_t curr = 0; + + if (size < 64) + { + BINARY_INSERTION_SORT(dst, size); + return; + } + + /* compute the minimum run length */ + minrun = compute_minrun(size); + + /* temporary storage for merges */ + store = &_store; + store->alloc = 0; + store->storage = NULL; + + PUSH_NEXT(); + PUSH_NEXT(); + PUSH_NEXT(); + + while (1) + { + if (!CHECK_INVARIANT(run_stack, stack_curr)) + { + stack_curr = TIM_SORT_COLLAPSE(dst, run_stack, stack_curr, store, size); + continue; + } + PUSH_NEXT(); + } +} + +#undef SORT_CONCAT +#undef SORT_MAKE_STR1 +#undef SORT_MAKE_STR +#undef SORT_NAME +#undef SORT_TYPE +#undef SORT_CMP +#undef TEMP_STORAGE_T +#undef TIM_SORT_RUN_T +#undef PUSH_NEXT +#undef SORT_SWAP +#undef SORT_CONCAT +#undef SORT_MAKE_STR1 +#undef SORT_MAKE_STR +#undef BINARY_INSERTION_FIND +#undef BINARY_INSERTION_SORT_START +#undef BINARY_INSERTION_SORT +#undef REVERSE_ELEMENTS +#undef COUNT_RUN +#undef TIM_SORT +#undef TIM_SORT_RESIZE +#undef TIM_SORT_COLLAPSE +#undef TIM_SORT_RUN_T +#undef TEMP_STORAGE_T diff --git a/vendors/libxml/src/tree.c b/vendors/libxml/src/tree.c new file mode 100644 index 0000000..7e5af26 --- /dev/null +++ b/vendors/libxml/src/tree.c @@ -0,0 +1,10083 @@ +/* + * tree.c : implementation of access function for an XML tree. + * + * References: + * XHTML 1.0 W3C REC: http://www.w3.org/TR/2002/REC-xhtml1-20020801/ + * + * See Copyright for the status of this software. + * + * daniel@veillard.com + * + */ + +#define IN_LIBXML +#include "libxml.h" + +#include /* for memset() only ! */ +#include +#ifdef HAVE_CTYPE_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_ZLIB_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef LIBXML_HTML_ENABLED +#include +#endif +#ifdef LIBXML_DEBUG_ENABLED +#include +#endif + +#include "buf.h" +#include "save.h" + +int __xmlRegisterCallbacks = 0; + +/************************************************************************ + * * + * Forward declarations * + * * + ************************************************************************/ + +static xmlNsPtr +xmlNewReconciliedNs(xmlDocPtr doc, xmlNodePtr tree, xmlNsPtr ns); + +static xmlChar* xmlGetPropNodeValueInternal(xmlAttrPtr prop); + +/************************************************************************ + * * + * Tree memory error handler * + * * + ************************************************************************/ +/** + * xmlTreeErrMemory: + * @extra: extra informations + * + * Handle an out of memory condition + */ +static void +xmlTreeErrMemory(const char *extra) +{ + __xmlSimpleError(XML_FROM_TREE, XML_ERR_NO_MEMORY, NULL, NULL, extra); +} + +/** + * xmlTreeErr: + * @code: the error number + * @extra: extra informations + * + * Handle an out of memory condition + */ +static void +xmlTreeErr(int code, xmlNodePtr node, const char *extra) +{ + const char *msg = NULL; + + switch(code) { + case XML_TREE_INVALID_HEX: + msg = "invalid hexadecimal character value\n"; + break; + case XML_TREE_INVALID_DEC: + msg = "invalid decimal character value\n"; + break; + case XML_TREE_UNTERMINATED_ENTITY: + msg = "unterminated entity reference %15s\n"; + break; + case XML_TREE_NOT_UTF8: + msg = "string is not in UTF-8\n"; + break; + default: + msg = "unexpected error number\n"; + } + __xmlSimpleError(XML_FROM_TREE, code, node, msg, extra); +} + +/************************************************************************ + * * + * A few static variables and macros * + * * + ************************************************************************/ +/* #undef xmlStringText */ +const xmlChar xmlStringText[] = { 't', 'e', 'x', 't', 0 }; +/* #undef xmlStringTextNoenc */ +const xmlChar xmlStringTextNoenc[] = + { 't', 'e', 'x', 't', 'n', 'o', 'e', 'n', 'c', 0 }; +/* #undef xmlStringComment */ +const xmlChar xmlStringComment[] = { 'c', 'o', 'm', 'm', 'e', 'n', 't', 0 }; + +static int xmlCompressMode = 0; +static int xmlCheckDTD = 1; + +#define UPDATE_LAST_CHILD_AND_PARENT(n) if ((n) != NULL) { \ + xmlNodePtr ulccur = (n)->children; \ + if (ulccur == NULL) { \ + (n)->last = NULL; \ + } else { \ + while (ulccur->next != NULL) { \ + ulccur->parent = (n); \ + ulccur = ulccur->next; \ + } \ + ulccur->parent = (n); \ + (n)->last = ulccur; \ +}} + +#define IS_STR_XML(str) ((str != NULL) && (str[0] == 'x') && \ + (str[1] == 'm') && (str[2] == 'l') && (str[3] == 0)) + +/* #define DEBUG_BUFFER */ +/* #define DEBUG_TREE */ + +/************************************************************************ + * * + * Functions to move to entities.c once the * + * API freeze is smoothen and they can be made public. * + * * + ************************************************************************/ +#include + +#ifdef LIBXML_TREE_ENABLED +/** + * xmlGetEntityFromDtd: + * @dtd: A pointer to the DTD to search + * @name: The entity name + * + * Do an entity lookup in the DTD entity hash table and + * return the corresponding entity, if found. + * + * Returns A pointer to the entity structure or NULL if not found. + */ +static xmlEntityPtr +xmlGetEntityFromDtd(xmlDtdPtr dtd, const xmlChar *name) { + xmlEntitiesTablePtr table; + + if((dtd != NULL) && (dtd->entities != NULL)) { + table = (xmlEntitiesTablePtr) dtd->entities; + return((xmlEntityPtr) xmlHashLookup(table, name)); + /* return(xmlGetEntityFromTable(table, name)); */ + } + return(NULL); +} +/** + * xmlGetParameterEntityFromDtd: + * @dtd: A pointer to the DTD to search + * @name: The entity name + * + * Do an entity lookup in the DTD pararmeter entity hash table and + * return the corresponding entity, if found. + * + * Returns A pointer to the entity structure or NULL if not found. + */ +static xmlEntityPtr +xmlGetParameterEntityFromDtd(xmlDtdPtr dtd, const xmlChar *name) { + xmlEntitiesTablePtr table; + + if ((dtd != NULL) && (dtd->pentities != NULL)) { + table = (xmlEntitiesTablePtr) dtd->pentities; + return((xmlEntityPtr) xmlHashLookup(table, name)); + /* return(xmlGetEntityFromTable(table, name)); */ + } + return(NULL); +} +#endif /* LIBXML_TREE_ENABLED */ + +/************************************************************************ + * * + * QName handling helper * + * * + ************************************************************************/ + +/** + * xmlBuildQName: + * @ncname: the Name + * @prefix: the prefix + * @memory: preallocated memory + * @len: preallocated memory length + * + * Builds the QName @prefix:@ncname in @memory if there is enough space + * and prefix is not NULL nor empty, otherwise allocate a new string. + * If prefix is NULL or empty it returns ncname. + * + * Returns the new string which must be freed by the caller if different from + * @memory and @ncname or NULL in case of error + */ +xmlChar * +xmlBuildQName(const xmlChar *ncname, const xmlChar *prefix, + xmlChar *memory, int len) { + int lenn, lenp; + xmlChar *ret; + + if (ncname == NULL) return(NULL); + if (prefix == NULL) return((xmlChar *) ncname); + + lenn = strlen((char *) ncname); + lenp = strlen((char *) prefix); + + if ((memory == NULL) || (len < lenn + lenp + 2)) { + ret = (xmlChar *) xmlMallocAtomic(lenn + lenp + 2); + if (ret == NULL) { + xmlTreeErrMemory("building QName"); + return(NULL); + } + } else { + ret = memory; + } + memcpy(&ret[0], prefix, lenp); + ret[lenp] = ':'; + memcpy(&ret[lenp + 1], ncname, lenn); + ret[lenn + lenp + 1] = 0; + return(ret); +} + +/** + * xmlSplitQName2: + * @name: the full QName + * @prefix: a xmlChar ** + * + * parse an XML qualified name string + * + * [NS 5] QName ::= (Prefix ':')? LocalPart + * + * [NS 6] Prefix ::= NCName + * + * [NS 7] LocalPart ::= NCName + * + * Returns NULL if not a QName, otherwise the local part, and prefix + * is updated to get the Prefix if any. + */ + +xmlChar * +xmlSplitQName2(const xmlChar *name, xmlChar **prefix) { + int len = 0; + xmlChar *ret = NULL; + + if (prefix == NULL) return(NULL); + *prefix = NULL; + if (name == NULL) return(NULL); + +#ifndef XML_XML_NAMESPACE + /* xml: prefix is not really a namespace */ + if ((name[0] == 'x') && (name[1] == 'm') && + (name[2] == 'l') && (name[3] == ':')) + return(NULL); +#endif + + /* nasty but valid */ + if (name[0] == ':') + return(NULL); + + /* + * we are not trying to validate but just to cut, and yes it will + * work even if this is as set of UTF-8 encoded chars + */ + while ((name[len] != 0) && (name[len] != ':')) + len++; + + if (name[len] == 0) + return(NULL); + + *prefix = xmlStrndup(name, len); + if (*prefix == NULL) { + xmlTreeErrMemory("QName split"); + return(NULL); + } + ret = xmlStrdup(&name[len + 1]); + if (ret == NULL) { + xmlTreeErrMemory("QName split"); + if (*prefix != NULL) { + xmlFree(*prefix); + *prefix = NULL; + } + return(NULL); + } + + return(ret); +} + +/** + * xmlSplitQName3: + * @name: the full QName + * @len: an int * + * + * parse an XML qualified name string,i + * + * returns NULL if it is not a Qualified Name, otherwise, update len + * with the length in byte of the prefix and return a pointer + * to the start of the name without the prefix + */ + +const xmlChar * +xmlSplitQName3(const xmlChar *name, int *len) { + int l = 0; + + if (name == NULL) return(NULL); + if (len == NULL) return(NULL); + + /* nasty but valid */ + if (name[0] == ':') + return(NULL); + + /* + * we are not trying to validate but just to cut, and yes it will + * work even if this is as set of UTF-8 encoded chars + */ + while ((name[l] != 0) && (name[l] != ':')) + l++; + + if (name[l] == 0) + return(NULL); + + *len = l; + + return(&name[l+1]); +} + +/************************************************************************ + * * + * Check Name, NCName and QName strings * + * * + ************************************************************************/ + +#define CUR_SCHAR(s, l) xmlStringCurrentChar(NULL, s, &l) + +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_DEBUG_ENABLED) || defined (LIBXML_HTML_ENABLED) || defined(LIBXML_SAX1_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBXML_WRITER_ENABLED) || defined(LIBXML_DOCB_ENABLED) +/** + * xmlValidateNCName: + * @value: the value to check + * @space: allow spaces in front and end of the string + * + * Check that a value conforms to the lexical space of NCName + * + * Returns 0 if this validates, a positive error code number otherwise + * and -1 in case of internal or API error. + */ +int +xmlValidateNCName(const xmlChar *value, int space) { + const xmlChar *cur = value; + int c,l; + + if (value == NULL) + return(-1); + + /* + * First quick algorithm for ASCII range + */ + if (space) + while (IS_BLANK_CH(*cur)) cur++; + if (((*cur >= 'a') && (*cur <= 'z')) || ((*cur >= 'A') && (*cur <= 'Z')) || + (*cur == '_')) + cur++; + else + goto try_complex; + while (((*cur >= 'a') && (*cur <= 'z')) || + ((*cur >= 'A') && (*cur <= 'Z')) || + ((*cur >= '0') && (*cur <= '9')) || + (*cur == '_') || (*cur == '-') || (*cur == '.')) + cur++; + if (space) + while (IS_BLANK_CH(*cur)) cur++; + if (*cur == 0) + return(0); + +try_complex: + /* + * Second check for chars outside the ASCII range + */ + cur = value; + c = CUR_SCHAR(cur, l); + if (space) { + while (IS_BLANK(c)) { + cur += l; + c = CUR_SCHAR(cur, l); + } + } + if ((!IS_LETTER(c)) && (c != '_')) + return(1); + cur += l; + c = CUR_SCHAR(cur, l); + while (IS_LETTER(c) || IS_DIGIT(c) || (c == '.') || + (c == '-') || (c == '_') || IS_COMBINING(c) || + IS_EXTENDER(c)) { + cur += l; + c = CUR_SCHAR(cur, l); + } + if (space) { + while (IS_BLANK(c)) { + cur += l; + c = CUR_SCHAR(cur, l); + } + } + if (c != 0) + return(1); + + return(0); +} +#endif + +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) +/** + * xmlValidateQName: + * @value: the value to check + * @space: allow spaces in front and end of the string + * + * Check that a value conforms to the lexical space of QName + * + * Returns 0 if this validates, a positive error code number otherwise + * and -1 in case of internal or API error. + */ +int +xmlValidateQName(const xmlChar *value, int space) { + const xmlChar *cur = value; + int c,l; + + if (value == NULL) + return(-1); + /* + * First quick algorithm for ASCII range + */ + if (space) + while (IS_BLANK_CH(*cur)) cur++; + if (((*cur >= 'a') && (*cur <= 'z')) || ((*cur >= 'A') && (*cur <= 'Z')) || + (*cur == '_')) + cur++; + else + goto try_complex; + while (((*cur >= 'a') && (*cur <= 'z')) || + ((*cur >= 'A') && (*cur <= 'Z')) || + ((*cur >= '0') && (*cur <= '9')) || + (*cur == '_') || (*cur == '-') || (*cur == '.')) + cur++; + if (*cur == ':') { + cur++; + if (((*cur >= 'a') && (*cur <= 'z')) || + ((*cur >= 'A') && (*cur <= 'Z')) || + (*cur == '_')) + cur++; + else + goto try_complex; + while (((*cur >= 'a') && (*cur <= 'z')) || + ((*cur >= 'A') && (*cur <= 'Z')) || + ((*cur >= '0') && (*cur <= '9')) || + (*cur == '_') || (*cur == '-') || (*cur == '.')) + cur++; + } + if (space) + while (IS_BLANK_CH(*cur)) cur++; + if (*cur == 0) + return(0); + +try_complex: + /* + * Second check for chars outside the ASCII range + */ + cur = value; + c = CUR_SCHAR(cur, l); + if (space) { + while (IS_BLANK(c)) { + cur += l; + c = CUR_SCHAR(cur, l); + } + } + if ((!IS_LETTER(c)) && (c != '_')) + return(1); + cur += l; + c = CUR_SCHAR(cur, l); + while (IS_LETTER(c) || IS_DIGIT(c) || (c == '.') || + (c == '-') || (c == '_') || IS_COMBINING(c) || + IS_EXTENDER(c)) { + cur += l; + c = CUR_SCHAR(cur, l); + } + if (c == ':') { + cur += l; + c = CUR_SCHAR(cur, l); + if ((!IS_LETTER(c)) && (c != '_')) + return(1); + cur += l; + c = CUR_SCHAR(cur, l); + while (IS_LETTER(c) || IS_DIGIT(c) || (c == '.') || + (c == '-') || (c == '_') || IS_COMBINING(c) || + IS_EXTENDER(c)) { + cur += l; + c = CUR_SCHAR(cur, l); + } + } + if (space) { + while (IS_BLANK(c)) { + cur += l; + c = CUR_SCHAR(cur, l); + } + } + if (c != 0) + return(1); + return(0); +} + +/** + * xmlValidateName: + * @value: the value to check + * @space: allow spaces in front and end of the string + * + * Check that a value conforms to the lexical space of Name + * + * Returns 0 if this validates, a positive error code number otherwise + * and -1 in case of internal or API error. + */ +int +xmlValidateName(const xmlChar *value, int space) { + const xmlChar *cur = value; + int c,l; + + if (value == NULL) + return(-1); + /* + * First quick algorithm for ASCII range + */ + if (space) + while (IS_BLANK_CH(*cur)) cur++; + if (((*cur >= 'a') && (*cur <= 'z')) || ((*cur >= 'A') && (*cur <= 'Z')) || + (*cur == '_') || (*cur == ':')) + cur++; + else + goto try_complex; + while (((*cur >= 'a') && (*cur <= 'z')) || + ((*cur >= 'A') && (*cur <= 'Z')) || + ((*cur >= '0') && (*cur <= '9')) || + (*cur == '_') || (*cur == '-') || (*cur == '.') || (*cur == ':')) + cur++; + if (space) + while (IS_BLANK_CH(*cur)) cur++; + if (*cur == 0) + return(0); + +try_complex: + /* + * Second check for chars outside the ASCII range + */ + cur = value; + c = CUR_SCHAR(cur, l); + if (space) { + while (IS_BLANK(c)) { + cur += l; + c = CUR_SCHAR(cur, l); + } + } + if ((!IS_LETTER(c)) && (c != '_') && (c != ':')) + return(1); + cur += l; + c = CUR_SCHAR(cur, l); + while (IS_LETTER(c) || IS_DIGIT(c) || (c == '.') || (c == ':') || + (c == '-') || (c == '_') || IS_COMBINING(c) || IS_EXTENDER(c)) { + cur += l; + c = CUR_SCHAR(cur, l); + } + if (space) { + while (IS_BLANK(c)) { + cur += l; + c = CUR_SCHAR(cur, l); + } + } + if (c != 0) + return(1); + return(0); +} + +/** + * xmlValidateNMToken: + * @value: the value to check + * @space: allow spaces in front and end of the string + * + * Check that a value conforms to the lexical space of NMToken + * + * Returns 0 if this validates, a positive error code number otherwise + * and -1 in case of internal or API error. + */ +int +xmlValidateNMToken(const xmlChar *value, int space) { + const xmlChar *cur = value; + int c,l; + + if (value == NULL) + return(-1); + /* + * First quick algorithm for ASCII range + */ + if (space) + while (IS_BLANK_CH(*cur)) cur++; + if (((*cur >= 'a') && (*cur <= 'z')) || + ((*cur >= 'A') && (*cur <= 'Z')) || + ((*cur >= '0') && (*cur <= '9')) || + (*cur == '_') || (*cur == '-') || (*cur == '.') || (*cur == ':')) + cur++; + else + goto try_complex; + while (((*cur >= 'a') && (*cur <= 'z')) || + ((*cur >= 'A') && (*cur <= 'Z')) || + ((*cur >= '0') && (*cur <= '9')) || + (*cur == '_') || (*cur == '-') || (*cur == '.') || (*cur == ':')) + cur++; + if (space) + while (IS_BLANK_CH(*cur)) cur++; + if (*cur == 0) + return(0); + +try_complex: + /* + * Second check for chars outside the ASCII range + */ + cur = value; + c = CUR_SCHAR(cur, l); + if (space) { + while (IS_BLANK(c)) { + cur += l; + c = CUR_SCHAR(cur, l); + } + } + if (!(IS_LETTER(c) || IS_DIGIT(c) || (c == '.') || (c == ':') || + (c == '-') || (c == '_') || IS_COMBINING(c) || IS_EXTENDER(c))) + return(1); + cur += l; + c = CUR_SCHAR(cur, l); + while (IS_LETTER(c) || IS_DIGIT(c) || (c == '.') || (c == ':') || + (c == '-') || (c == '_') || IS_COMBINING(c) || IS_EXTENDER(c)) { + cur += l; + c = CUR_SCHAR(cur, l); + } + if (space) { + while (IS_BLANK(c)) { + cur += l; + c = CUR_SCHAR(cur, l); + } + } + if (c != 0) + return(1); + return(0); +} +#endif /* LIBXML_TREE_ENABLED */ + +/************************************************************************ + * * + * Allocation and deallocation of basic structures * + * * + ************************************************************************/ + +/** + * xmlSetBufferAllocationScheme: + * @scheme: allocation method to use + * + * Set the buffer allocation method. Types are + * XML_BUFFER_ALLOC_EXACT - use exact sizes, keeps memory usage down + * XML_BUFFER_ALLOC_DOUBLEIT - double buffer when extra needed, + * improves performance + */ +void +xmlSetBufferAllocationScheme(xmlBufferAllocationScheme scheme) { + if ((scheme == XML_BUFFER_ALLOC_EXACT) || + (scheme == XML_BUFFER_ALLOC_DOUBLEIT) || + (scheme == XML_BUFFER_ALLOC_HYBRID)) + xmlBufferAllocScheme = scheme; +} + +/** + * xmlGetBufferAllocationScheme: + * + * Types are + * XML_BUFFER_ALLOC_EXACT - use exact sizes, keeps memory usage down + * XML_BUFFER_ALLOC_DOUBLEIT - double buffer when extra needed, + * improves performance + * XML_BUFFER_ALLOC_HYBRID - use exact sizes on small strings to keep memory usage tight + * in normal usage, and doubleit on large strings to avoid + * pathological performance. + * + * Returns the current allocation scheme + */ +xmlBufferAllocationScheme +xmlGetBufferAllocationScheme(void) { + return(xmlBufferAllocScheme); +} + +/** + * xmlNewNs: + * @node: the element carrying the namespace + * @href: the URI associated + * @prefix: the prefix for the namespace + * + * Creation of a new Namespace. This function will refuse to create + * a namespace with a similar prefix than an existing one present on this + * node. + * We use href==NULL in the case of an element creation where the namespace + * was not defined. + * Returns a new namespace pointer or NULL + */ +xmlNsPtr +xmlNewNs(xmlNodePtr node, const xmlChar *href, const xmlChar *prefix) { + xmlNsPtr cur; + + if ((node != NULL) && (node->type != XML_ELEMENT_NODE)) + return(NULL); + + if ((prefix != NULL) && (xmlStrEqual(prefix, BAD_CAST "xml"))) { + /* xml namespace is predefined, no need to add it */ + if (xmlStrEqual(href, XML_XML_NAMESPACE)) + return(NULL); + + /* + * Problem, this is an attempt to bind xml prefix to a wrong + * namespace, which breaks + * Namespace constraint: Reserved Prefixes and Namespace Names + * from XML namespace. But documents authors may not care in + * their context so let's proceed. + */ + } + + /* + * Allocate a new Namespace and fill the fields. + */ + cur = (xmlNsPtr) xmlMalloc(sizeof(xmlNs)); + if (cur == NULL) { + xmlTreeErrMemory("building namespace"); + return(NULL); + } + memset(cur, 0, sizeof(xmlNs)); + cur->type = XML_LOCAL_NAMESPACE; + + if (href != NULL) + cur->href = xmlStrdup(href); + if (prefix != NULL) + cur->prefix = xmlStrdup(prefix); + + /* + * Add it at the end to preserve parsing order ... + * and checks for existing use of the prefix + */ + if (node != NULL) { + if (node->nsDef == NULL) { + node->nsDef = cur; + } else { + xmlNsPtr prev = node->nsDef; + + if (((prev->prefix == NULL) && (cur->prefix == NULL)) || + (xmlStrEqual(prev->prefix, cur->prefix))) { + xmlFreeNs(cur); + return(NULL); + } + while (prev->next != NULL) { + prev = prev->next; + if (((prev->prefix == NULL) && (cur->prefix == NULL)) || + (xmlStrEqual(prev->prefix, cur->prefix))) { + xmlFreeNs(cur); + return(NULL); + } + } + prev->next = cur; + } + } + return(cur); +} + +/** + * xmlSetNs: + * @node: a node in the document + * @ns: a namespace pointer + * + * Associate a namespace to a node, a posteriori. + */ +void +xmlSetNs(xmlNodePtr node, xmlNsPtr ns) { + if (node == NULL) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlSetNs: node == NULL\n"); +#endif + return; + } + node->ns = ns; +} + +/** + * xmlFreeNs: + * @cur: the namespace pointer + * + * Free up the structures associated to a namespace + */ +void +xmlFreeNs(xmlNsPtr cur) { + if (cur == NULL) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlFreeNs : ns == NULL\n"); +#endif + return; + } + if (cur->href != NULL) xmlFree((char *) cur->href); + if (cur->prefix != NULL) xmlFree((char *) cur->prefix); + xmlFree(cur); +} + +/** + * xmlFreeNsList: + * @cur: the first namespace pointer + * + * Free up all the structures associated to the chained namespaces. + */ +void +xmlFreeNsList(xmlNsPtr cur) { + xmlNsPtr next; + if (cur == NULL) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlFreeNsList : ns == NULL\n"); +#endif + return; + } + while (cur != NULL) { + next = cur->next; + xmlFreeNs(cur); + cur = next; + } +} + +/** + * xmlNewDtd: + * @doc: the document pointer + * @name: the DTD name + * @ExternalID: the external ID + * @SystemID: the system ID + * + * Creation of a new DTD for the external subset. To create an + * internal subset, use xmlCreateIntSubset(). + * + * Returns a pointer to the new DTD structure + */ +xmlDtdPtr +xmlNewDtd(xmlDocPtr doc, const xmlChar *name, + const xmlChar *ExternalID, const xmlChar *SystemID) { + xmlDtdPtr cur; + + if ((doc != NULL) && (doc->extSubset != NULL)) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlNewDtd(%s): document %s already have a DTD %s\n", + /* !!! */ (char *) name, doc->name, + /* !!! */ (char *)doc->extSubset->name); +#endif + return(NULL); + } + + /* + * Allocate a new DTD and fill the fields. + */ + cur = (xmlDtdPtr) xmlMalloc(sizeof(xmlDtd)); + if (cur == NULL) { + xmlTreeErrMemory("building DTD"); + return(NULL); + } + memset(cur, 0 , sizeof(xmlDtd)); + cur->type = XML_DTD_NODE; + + if (name != NULL) + cur->name = xmlStrdup(name); + if (ExternalID != NULL) + cur->ExternalID = xmlStrdup(ExternalID); + if (SystemID != NULL) + cur->SystemID = xmlStrdup(SystemID); + if (doc != NULL) + doc->extSubset = cur; + cur->doc = doc; + + if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) + xmlRegisterNodeDefaultValue((xmlNodePtr)cur); + return(cur); +} + +/** + * xmlGetIntSubset: + * @doc: the document pointer + * + * Get the internal subset of a document + * Returns a pointer to the DTD structure or NULL if not found + */ + +xmlDtdPtr +xmlGetIntSubset(xmlDocPtr doc) { + xmlNodePtr cur; + + if (doc == NULL) + return(NULL); + cur = doc->children; + while (cur != NULL) { + if (cur->type == XML_DTD_NODE) + return((xmlDtdPtr) cur); + cur = cur->next; + } + return((xmlDtdPtr) doc->intSubset); +} + +/** + * xmlCreateIntSubset: + * @doc: the document pointer + * @name: the DTD name + * @ExternalID: the external (PUBLIC) ID + * @SystemID: the system ID + * + * Create the internal subset of a document + * Returns a pointer to the new DTD structure + */ +xmlDtdPtr +xmlCreateIntSubset(xmlDocPtr doc, const xmlChar *name, + const xmlChar *ExternalID, const xmlChar *SystemID) { + xmlDtdPtr cur; + + if ((doc != NULL) && (xmlGetIntSubset(doc) != NULL)) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + + "xmlCreateIntSubset(): document %s already have an internal subset\n", + doc->name); +#endif + return(NULL); + } + + /* + * Allocate a new DTD and fill the fields. + */ + cur = (xmlDtdPtr) xmlMalloc(sizeof(xmlDtd)); + if (cur == NULL) { + xmlTreeErrMemory("building internal subset"); + return(NULL); + } + memset(cur, 0, sizeof(xmlDtd)); + cur->type = XML_DTD_NODE; + + if (name != NULL) { + cur->name = xmlStrdup(name); + if (cur->name == NULL) { + xmlTreeErrMemory("building internal subset"); + xmlFree(cur); + return(NULL); + } + } + if (ExternalID != NULL) { + cur->ExternalID = xmlStrdup(ExternalID); + if (cur->ExternalID == NULL) { + xmlTreeErrMemory("building internal subset"); + if (cur->name != NULL) + xmlFree((char *)cur->name); + xmlFree(cur); + return(NULL); + } + } + if (SystemID != NULL) { + cur->SystemID = xmlStrdup(SystemID); + if (cur->SystemID == NULL) { + xmlTreeErrMemory("building internal subset"); + if (cur->name != NULL) + xmlFree((char *)cur->name); + if (cur->ExternalID != NULL) + xmlFree((char *)cur->ExternalID); + xmlFree(cur); + return(NULL); + } + } + if (doc != NULL) { + doc->intSubset = cur; + cur->parent = doc; + cur->doc = doc; + if (doc->children == NULL) { + doc->children = (xmlNodePtr) cur; + doc->last = (xmlNodePtr) cur; + } else { + if (doc->type == XML_HTML_DOCUMENT_NODE) { + xmlNodePtr prev; + + prev = doc->children; + prev->prev = (xmlNodePtr) cur; + cur->next = prev; + doc->children = (xmlNodePtr) cur; + } else { + xmlNodePtr next; + + next = doc->children; + while ((next != NULL) && (next->type != XML_ELEMENT_NODE)) + next = next->next; + if (next == NULL) { + cur->prev = doc->last; + cur->prev->next = (xmlNodePtr) cur; + cur->next = NULL; + doc->last = (xmlNodePtr) cur; + } else { + cur->next = next; + cur->prev = next->prev; + if (cur->prev == NULL) + doc->children = (xmlNodePtr) cur; + else + cur->prev->next = (xmlNodePtr) cur; + next->prev = (xmlNodePtr) cur; + } + } + } + } + + if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) + xmlRegisterNodeDefaultValue((xmlNodePtr)cur); + return(cur); +} + +/** + * DICT_FREE: + * @str: a string + * + * Free a string if it is not owned by the "dict" dictionnary in the + * current scope + */ +#define DICT_FREE(str) \ + if ((str) && ((!dict) || \ + (xmlDictOwns(dict, (const xmlChar *)(str)) == 0))) \ + xmlFree((char *)(str)); + + +/** + * DICT_COPY: + * @str: a string + * + * Copy a string using a "dict" dictionnary in the current scope, + * if availabe. + */ +#define DICT_COPY(str, cpy) \ + if (str) { \ + if (dict) { \ + if (xmlDictOwns(dict, (const xmlChar *)(str))) \ + cpy = (xmlChar *) (str); \ + else \ + cpy = (xmlChar *) xmlDictLookup((dict), (const xmlChar *)(str), -1); \ + } else \ + cpy = xmlStrdup((const xmlChar *)(str)); } + +/** + * DICT_CONST_COPY: + * @str: a string + * + * Copy a string using a "dict" dictionnary in the current scope, + * if availabe. + */ +#define DICT_CONST_COPY(str, cpy) \ + if (str) { \ + if (dict) { \ + if (xmlDictOwns(dict, (const xmlChar *)(str))) \ + cpy = (const xmlChar *) (str); \ + else \ + cpy = xmlDictLookup((dict), (const xmlChar *)(str), -1); \ + } else \ + cpy = (const xmlChar *) xmlStrdup((const xmlChar *)(str)); } + + +/** + * xmlFreeDtd: + * @cur: the DTD structure to free up + * + * Free a DTD structure. + */ +void +xmlFreeDtd(xmlDtdPtr cur) { + xmlDictPtr dict = NULL; + + if (cur == NULL) { + return; + } + if (cur->doc != NULL) dict = cur->doc->dict; + + if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue)) + xmlDeregisterNodeDefaultValue((xmlNodePtr)cur); + + if (cur->children != NULL) { + xmlNodePtr next, c = cur->children; + + /* + * Cleanup all nodes which are not part of the specific lists + * of notations, elements, attributes and entities. + */ + while (c != NULL) { + next = c->next; + if ((c->type != XML_NOTATION_NODE) && + (c->type != XML_ELEMENT_DECL) && + (c->type != XML_ATTRIBUTE_DECL) && + (c->type != XML_ENTITY_DECL)) { + xmlUnlinkNode(c); + xmlFreeNode(c); + } + c = next; + } + } + DICT_FREE(cur->name) + DICT_FREE(cur->SystemID) + DICT_FREE(cur->ExternalID) + /* TODO !!! */ + if (cur->notations != NULL) + xmlFreeNotationTable((xmlNotationTablePtr) cur->notations); + + if (cur->elements != NULL) + xmlFreeElementTable((xmlElementTablePtr) cur->elements); + if (cur->attributes != NULL) + xmlFreeAttributeTable((xmlAttributeTablePtr) cur->attributes); + if (cur->entities != NULL) + xmlFreeEntitiesTable((xmlEntitiesTablePtr) cur->entities); + if (cur->pentities != NULL) + xmlFreeEntitiesTable((xmlEntitiesTablePtr) cur->pentities); + + xmlFree(cur); +} + +/** + * xmlNewDoc: + * @version: xmlChar string giving the version of XML "1.0" + * + * Creates a new XML document + * + * Returns a new document + */ +xmlDocPtr +xmlNewDoc(const xmlChar *version) { + xmlDocPtr cur; + + if (version == NULL) + version = (const xmlChar *) "1.0"; + + /* + * Allocate a new document and fill the fields. + */ + cur = (xmlDocPtr) xmlMalloc(sizeof(xmlDoc)); + if (cur == NULL) { + xmlTreeErrMemory("building doc"); + return(NULL); + } + memset(cur, 0, sizeof(xmlDoc)); + cur->type = XML_DOCUMENT_NODE; + + cur->version = xmlStrdup(version); + if (cur->version == NULL) { + xmlTreeErrMemory("building doc"); + xmlFree(cur); + return(NULL); + } + cur->standalone = -1; + cur->compression = -1; /* not initialized */ + cur->doc = cur; + cur->parseFlags = 0; + cur->properties = XML_DOC_USERBUILT; + /* + * The in memory encoding is always UTF8 + * This field will never change and would + * be obsolete if not for binary compatibility. + */ + cur->charset = XML_CHAR_ENCODING_UTF8; + + if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) + xmlRegisterNodeDefaultValue((xmlNodePtr)cur); + return(cur); +} + +/** + * xmlFreeDoc: + * @cur: pointer to the document + * + * Free up all the structures used by a document, tree included. + */ +void +xmlFreeDoc(xmlDocPtr cur) { + xmlDtdPtr extSubset, intSubset; + xmlDictPtr dict = NULL; + + if (cur == NULL) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlFreeDoc : document == NULL\n"); +#endif + return; + } +#ifdef LIBXML_DEBUG_RUNTIME +#ifdef LIBXML_DEBUG_ENABLED + xmlDebugCheckDocument(stderr, cur); +#endif +#endif + + if (cur != NULL) dict = cur->dict; + + if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue)) + xmlDeregisterNodeDefaultValue((xmlNodePtr)cur); + + /* + * Do this before freeing the children list to avoid ID lookups + */ + if (cur->ids != NULL) xmlFreeIDTable((xmlIDTablePtr) cur->ids); + cur->ids = NULL; + if (cur->refs != NULL) xmlFreeRefTable((xmlRefTablePtr) cur->refs); + cur->refs = NULL; + extSubset = cur->extSubset; + intSubset = cur->intSubset; + if (intSubset == extSubset) + extSubset = NULL; + if (extSubset != NULL) { + xmlUnlinkNode((xmlNodePtr) cur->extSubset); + cur->extSubset = NULL; + xmlFreeDtd(extSubset); + } + if (intSubset != NULL) { + xmlUnlinkNode((xmlNodePtr) cur->intSubset); + cur->intSubset = NULL; + xmlFreeDtd(intSubset); + } + + if (cur->children != NULL) xmlFreeNodeList(cur->children); + if (cur->oldNs != NULL) xmlFreeNsList(cur->oldNs); + + DICT_FREE(cur->version) + DICT_FREE(cur->name) + DICT_FREE(cur->encoding) + DICT_FREE(cur->URL) + xmlFree(cur); + if (dict) xmlDictFree(dict); +} + +/** + * xmlStringLenGetNodeList: + * @doc: the document + * @value: the value of the text + * @len: the length of the string value + * + * Parse the value string and build the node list associated. Should + * produce a flat tree with only TEXTs and ENTITY_REFs. + * Returns a pointer to the first child + */ +xmlNodePtr +xmlStringLenGetNodeList(xmlDocPtr doc, const xmlChar *value, int len) { + xmlNodePtr ret = NULL, last = NULL; + xmlNodePtr node; + xmlChar *val; + const xmlChar *cur = value, *end = cur + len; + const xmlChar *q; + xmlEntityPtr ent; + xmlBufPtr buf; + + if (value == NULL) return(NULL); + + buf = xmlBufCreateSize(0); + if (buf == NULL) return(NULL); + xmlBufSetAllocationScheme(buf, XML_BUFFER_ALLOC_HYBRID); + + q = cur; + while ((cur < end) && (*cur != 0)) { + if (cur[0] == '&') { + int charval = 0; + xmlChar tmp; + + /* + * Save the current text. + */ + if (cur != q) { + if (xmlBufAdd(buf, q, cur - q)) + goto out; + } + q = cur; + if ((cur + 2 < end) && (cur[1] == '#') && (cur[2] == 'x')) { + cur += 3; + if (cur < end) + tmp = *cur; + else + tmp = 0; + while (tmp != ';') { /* Non input consuming loop */ + if ((tmp >= '0') && (tmp <= '9')) + charval = charval * 16 + (tmp - '0'); + else if ((tmp >= 'a') && (tmp <= 'f')) + charval = charval * 16 + (tmp - 'a') + 10; + else if ((tmp >= 'A') && (tmp <= 'F')) + charval = charval * 16 + (tmp - 'A') + 10; + else { + xmlTreeErr(XML_TREE_INVALID_HEX, (xmlNodePtr) doc, + NULL); + charval = 0; + break; + } + cur++; + if (cur < end) + tmp = *cur; + else + tmp = 0; + } + if (tmp == ';') + cur++; + q = cur; + } else if ((cur + 1 < end) && (cur[1] == '#')) { + cur += 2; + if (cur < end) + tmp = *cur; + else + tmp = 0; + while (tmp != ';') { /* Non input consuming loops */ + if ((tmp >= '0') && (tmp <= '9')) + charval = charval * 10 + (tmp - '0'); + else { + xmlTreeErr(XML_TREE_INVALID_DEC, (xmlNodePtr) doc, + NULL); + charval = 0; + break; + } + cur++; + if (cur < end) + tmp = *cur; + else + tmp = 0; + } + if (tmp == ';') + cur++; + q = cur; + } else { + /* + * Read the entity string + */ + cur++; + q = cur; + while ((cur < end) && (*cur != 0) && (*cur != ';')) cur++; + if ((cur >= end) || (*cur == 0)) { + xmlTreeErr(XML_TREE_UNTERMINATED_ENTITY, (xmlNodePtr) doc, + (const char *) q); + goto out; + } + if (cur != q) { + /* + * Predefined entities don't generate nodes + */ + val = xmlStrndup(q, cur - q); + ent = xmlGetDocEntity(doc, val); + if ((ent != NULL) && + (ent->etype == XML_INTERNAL_PREDEFINED_ENTITY)) { + + if (xmlBufCat(buf, ent->content)) + goto out; + + } else { + /* + * Flush buffer so far + */ + if (!xmlBufIsEmpty(buf)) { + node = xmlNewDocText(doc, NULL); + if (node == NULL) { + if (val != NULL) xmlFree(val); + goto out; + } + node->content = xmlBufDetach(buf); + + if (last == NULL) { + last = ret = node; + } else { + last = xmlAddNextSibling(last, node); + } + } + + /* + * Create a new REFERENCE_REF node + */ + node = xmlNewReference(doc, val); + if (node == NULL) { + if (val != NULL) xmlFree(val); + goto out; + } + else if ((ent != NULL) && (ent->children == NULL)) { + xmlNodePtr temp; + + ent->children = xmlStringGetNodeList(doc, + (const xmlChar*)node->content); + ent->owner = 1; + temp = ent->children; + while (temp) { + temp->parent = (xmlNodePtr)ent; + ent->last = temp; + temp = temp->next; + } + } + if (last == NULL) { + last = ret = node; + } else { + last = xmlAddNextSibling(last, node); + } + } + xmlFree(val); + } + cur++; + q = cur; + } + if (charval != 0) { + xmlChar buffer[10]; + int l; + + l = xmlCopyCharMultiByte(buffer, charval); + buffer[l] = 0; + + if (xmlBufCat(buf, buffer)) + goto out; + charval = 0; + } + } else + cur++; + } + + if (cur != q) { + /* + * Handle the last piece of text. + */ + if (xmlBufAdd(buf, q, cur - q)) + goto out; + } + + if (!xmlBufIsEmpty(buf)) { + node = xmlNewDocText(doc, NULL); + if (node == NULL) goto out; + node->content = xmlBufDetach(buf); + + if (last == NULL) { + last = ret = node; + } else { + last = xmlAddNextSibling(last, node); + } + } else if (ret == NULL) { + ret = xmlNewDocText(doc, BAD_CAST ""); + } + +out: + xmlBufFree(buf); + return(ret); +} + +/** + * xmlStringGetNodeList: + * @doc: the document + * @value: the value of the attribute + * + * Parse the value string and build the node list associated. Should + * produce a flat tree with only TEXTs and ENTITY_REFs. + * Returns a pointer to the first child + */ +xmlNodePtr +xmlStringGetNodeList(xmlDocPtr doc, const xmlChar *value) { + xmlNodePtr ret = NULL, last = NULL; + xmlNodePtr node; + xmlChar *val; + const xmlChar *cur = value; + const xmlChar *q; + xmlEntityPtr ent; + xmlBufPtr buf; + + if (value == NULL) return(NULL); + + buf = xmlBufCreateSize(0); + if (buf == NULL) return(NULL); + xmlBufSetAllocationScheme(buf, XML_BUFFER_ALLOC_HYBRID); + + q = cur; + while (*cur != 0) { + if (cur[0] == '&') { + int charval = 0; + xmlChar tmp; + + /* + * Save the current text. + */ + if (cur != q) { + if (xmlBufAdd(buf, q, cur - q)) + goto out; + } + q = cur; + if ((cur[1] == '#') && (cur[2] == 'x')) { + cur += 3; + tmp = *cur; + while (tmp != ';') { /* Non input consuming loop */ + if ((tmp >= '0') && (tmp <= '9')) + charval = charval * 16 + (tmp - '0'); + else if ((tmp >= 'a') && (tmp <= 'f')) + charval = charval * 16 + (tmp - 'a') + 10; + else if ((tmp >= 'A') && (tmp <= 'F')) + charval = charval * 16 + (tmp - 'A') + 10; + else { + xmlTreeErr(XML_TREE_INVALID_HEX, (xmlNodePtr) doc, + NULL); + charval = 0; + break; + } + cur++; + tmp = *cur; + } + if (tmp == ';') + cur++; + q = cur; + } else if (cur[1] == '#') { + cur += 2; + tmp = *cur; + while (tmp != ';') { /* Non input consuming loops */ + if ((tmp >= '0') && (tmp <= '9')) + charval = charval * 10 + (tmp - '0'); + else { + xmlTreeErr(XML_TREE_INVALID_DEC, (xmlNodePtr) doc, + NULL); + charval = 0; + break; + } + cur++; + tmp = *cur; + } + if (tmp == ';') + cur++; + q = cur; + } else { + /* + * Read the entity string + */ + cur++; + q = cur; + while ((*cur != 0) && (*cur != ';')) cur++; + if (*cur == 0) { + xmlTreeErr(XML_TREE_UNTERMINATED_ENTITY, + (xmlNodePtr) doc, (const char *) q); + goto out; + } + if (cur != q) { + /* + * Predefined entities don't generate nodes + */ + val = xmlStrndup(q, cur - q); + ent = xmlGetDocEntity(doc, val); + if ((ent != NULL) && + (ent->etype == XML_INTERNAL_PREDEFINED_ENTITY)) { + + if (xmlBufCat(buf, ent->content)) + goto out; + + } else { + /* + * Flush buffer so far + */ + if (!xmlBufIsEmpty(buf)) { + node = xmlNewDocText(doc, NULL); + node->content = xmlBufDetach(buf); + + if (last == NULL) { + last = ret = node; + } else { + last = xmlAddNextSibling(last, node); + } + } + + /* + * Create a new REFERENCE_REF node + */ + node = xmlNewReference(doc, val); + if (node == NULL) { + if (val != NULL) xmlFree(val); + goto out; + } + else if ((ent != NULL) && (ent->children == NULL)) { + xmlNodePtr temp; + + ent->children = xmlStringGetNodeList(doc, + (const xmlChar*)node->content); + ent->owner = 1; + temp = ent->children; + while (temp) { + temp->parent = (xmlNodePtr)ent; + temp = temp->next; + } + } + if (last == NULL) { + last = ret = node; + } else { + last = xmlAddNextSibling(last, node); + } + } + xmlFree(val); + } + cur++; + q = cur; + } + if (charval != 0) { + xmlChar buffer[10]; + int len; + + len = xmlCopyCharMultiByte(buffer, charval); + buffer[len] = 0; + + if (xmlBufCat(buf, buffer)) + goto out; + charval = 0; + } + } else + cur++; + } + if ((cur != q) || (ret == NULL)) { + /* + * Handle the last piece of text. + */ + xmlBufAdd(buf, q, cur - q); + } + + if (!xmlBufIsEmpty(buf)) { + node = xmlNewDocText(doc, NULL); + node->content = xmlBufDetach(buf); + + if (last == NULL) { + last = ret = node; + } else { + last = xmlAddNextSibling(last, node); + } + } + +out: + xmlBufFree(buf); + return(ret); +} + +/** + * xmlNodeListGetString: + * @doc: the document + * @list: a Node list + * @inLine: should we replace entity contents or show their external form + * + * Build the string equivalent to the text contained in the Node list + * made of TEXTs and ENTITY_REFs + * + * Returns a pointer to the string copy, the caller must free it with xmlFree(). + */ +xmlChar * +xmlNodeListGetString(xmlDocPtr doc, xmlNodePtr list, int inLine) +{ + xmlNodePtr node = list; + xmlChar *ret = NULL; + xmlEntityPtr ent; + int attr; + + if (list == NULL) + return (NULL); + if ((list->parent != NULL) && (list->parent->type == XML_ATTRIBUTE_NODE)) + attr = 1; + else + attr = 0; + + while (node != NULL) { + if ((node->type == XML_TEXT_NODE) || + (node->type == XML_CDATA_SECTION_NODE)) { + if (inLine) { + ret = xmlStrcat(ret, node->content); + } else { + xmlChar *buffer; + + if (attr) + buffer = xmlEncodeAttributeEntities(doc, node->content); + else + buffer = xmlEncodeEntitiesReentrant(doc, node->content); + if (buffer != NULL) { + ret = xmlStrcat(ret, buffer); + xmlFree(buffer); + } + } + } else if (node->type == XML_ENTITY_REF_NODE) { + if (inLine) { + ent = xmlGetDocEntity(doc, node->name); + if (ent != NULL) { + xmlChar *buffer; + + /* an entity content can be any "well balanced chunk", + * i.e. the result of the content [43] production: + * http://www.w3.org/TR/REC-xml#NT-content. + * So it can contain text, CDATA section or nested + * entity reference nodes (among others). + * -> we recursive call xmlNodeListGetString() + * which handles these types */ + buffer = xmlNodeListGetString(doc, ent->children, 1); + if (buffer != NULL) { + ret = xmlStrcat(ret, buffer); + xmlFree(buffer); + } + } else { + ret = xmlStrcat(ret, node->content); + } + } else { + xmlChar buf[2]; + + buf[0] = '&'; + buf[1] = 0; + ret = xmlStrncat(ret, buf, 1); + ret = xmlStrcat(ret, node->name); + buf[0] = ';'; + buf[1] = 0; + ret = xmlStrncat(ret, buf, 1); + } + } +#if 0 + else { + xmlGenericError(xmlGenericErrorContext, + "xmlGetNodeListString : invalid node type %d\n", + node->type); + } +#endif + node = node->next; + } + return (ret); +} + +#ifdef LIBXML_TREE_ENABLED +/** + * xmlNodeListGetRawString: + * @doc: the document + * @list: a Node list + * @inLine: should we replace entity contents or show their external form + * + * Builds the string equivalent to the text contained in the Node list + * made of TEXTs and ENTITY_REFs, contrary to xmlNodeListGetString() + * this function doesn't do any character encoding handling. + * + * Returns a pointer to the string copy, the caller must free it with xmlFree(). + */ +xmlChar * +xmlNodeListGetRawString(xmlDocPtr doc, xmlNodePtr list, int inLine) +{ + xmlNodePtr node = list; + xmlChar *ret = NULL; + xmlEntityPtr ent; + + if (list == NULL) + return (NULL); + + while (node != NULL) { + if ((node->type == XML_TEXT_NODE) || + (node->type == XML_CDATA_SECTION_NODE)) { + if (inLine) { + ret = xmlStrcat(ret, node->content); + } else { + xmlChar *buffer; + + buffer = xmlEncodeSpecialChars(doc, node->content); + if (buffer != NULL) { + ret = xmlStrcat(ret, buffer); + xmlFree(buffer); + } + } + } else if (node->type == XML_ENTITY_REF_NODE) { + if (inLine) { + ent = xmlGetDocEntity(doc, node->name); + if (ent != NULL) { + xmlChar *buffer; + + /* an entity content can be any "well balanced chunk", + * i.e. the result of the content [43] production: + * http://www.w3.org/TR/REC-xml#NT-content. + * So it can contain text, CDATA section or nested + * entity reference nodes (among others). + * -> we recursive call xmlNodeListGetRawString() + * which handles these types */ + buffer = + xmlNodeListGetRawString(doc, ent->children, 1); + if (buffer != NULL) { + ret = xmlStrcat(ret, buffer); + xmlFree(buffer); + } + } else { + ret = xmlStrcat(ret, node->content); + } + } else { + xmlChar buf[2]; + + buf[0] = '&'; + buf[1] = 0; + ret = xmlStrncat(ret, buf, 1); + ret = xmlStrcat(ret, node->name); + buf[0] = ';'; + buf[1] = 0; + ret = xmlStrncat(ret, buf, 1); + } + } +#if 0 + else { + xmlGenericError(xmlGenericErrorContext, + "xmlGetNodeListString : invalid node type %d\n", + node->type); + } +#endif + node = node->next; + } + return (ret); +} +#endif /* LIBXML_TREE_ENABLED */ + +static xmlAttrPtr +xmlNewPropInternal(xmlNodePtr node, xmlNsPtr ns, + const xmlChar * name, const xmlChar * value, + int eatname) +{ + xmlAttrPtr cur; + xmlDocPtr doc = NULL; + + if ((node != NULL) && (node->type != XML_ELEMENT_NODE)) { + if ((eatname == 1) && + ((node->doc == NULL) || + (!(xmlDictOwns(node->doc->dict, name))))) + xmlFree((xmlChar *) name); + return (NULL); + } + + /* + * Allocate a new property and fill the fields. + */ + cur = (xmlAttrPtr) xmlMalloc(sizeof(xmlAttr)); + if (cur == NULL) { + if ((eatname == 1) && + ((node == NULL) || (node->doc == NULL) || + (!(xmlDictOwns(node->doc->dict, name))))) + xmlFree((xmlChar *) name); + xmlTreeErrMemory("building attribute"); + return (NULL); + } + memset(cur, 0, sizeof(xmlAttr)); + cur->type = XML_ATTRIBUTE_NODE; + + cur->parent = node; + if (node != NULL) { + doc = node->doc; + cur->doc = doc; + } + cur->ns = ns; + + if (eatname == 0) { + if ((doc != NULL) && (doc->dict != NULL)) + cur->name = (xmlChar *) xmlDictLookup(doc->dict, name, -1); + else + cur->name = xmlStrdup(name); + } else + cur->name = name; + + if (value != NULL) { + xmlNodePtr tmp; + + if(!xmlCheckUTF8(value)) { + xmlTreeErr(XML_TREE_NOT_UTF8, (xmlNodePtr) doc, + NULL); + if (doc != NULL) + doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1"); + } + cur->children = xmlNewDocText(doc, value); + cur->last = NULL; + tmp = cur->children; + while (tmp != NULL) { + tmp->parent = (xmlNodePtr) cur; + if (tmp->next == NULL) + cur->last = tmp; + tmp = tmp->next; + } + } + + /* + * Add it at the end to preserve parsing order ... + */ + if (node != NULL) { + if (node->properties == NULL) { + node->properties = cur; + } else { + xmlAttrPtr prev = node->properties; + + while (prev->next != NULL) + prev = prev->next; + prev->next = cur; + cur->prev = prev; + } + } + + if ((value != NULL) && (node != NULL) && + (xmlIsID(node->doc, node, cur) == 1)) + xmlAddID(NULL, node->doc, value, cur); + + if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) + xmlRegisterNodeDefaultValue((xmlNodePtr) cur); + return (cur); +} + +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_HTML_ENABLED) || \ + defined(LIBXML_SCHEMAS_ENABLED) +/** + * xmlNewProp: + * @node: the holding node + * @name: the name of the attribute + * @value: the value of the attribute + * + * Create a new property carried by a node. + * Returns a pointer to the attribute + */ +xmlAttrPtr +xmlNewProp(xmlNodePtr node, const xmlChar *name, const xmlChar *value) { + + if (name == NULL) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlNewProp : name == NULL\n"); +#endif + return(NULL); + } + + return xmlNewPropInternal(node, NULL, name, value, 0); +} +#endif /* LIBXML_TREE_ENABLED */ + +/** + * xmlNewNsProp: + * @node: the holding node + * @ns: the namespace + * @name: the name of the attribute + * @value: the value of the attribute + * + * Create a new property tagged with a namespace and carried by a node. + * Returns a pointer to the attribute + */ +xmlAttrPtr +xmlNewNsProp(xmlNodePtr node, xmlNsPtr ns, const xmlChar *name, + const xmlChar *value) { + + if (name == NULL) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlNewNsProp : name == NULL\n"); +#endif + return(NULL); + } + + return xmlNewPropInternal(node, ns, name, value, 0); +} + +/** + * xmlNewNsPropEatName: + * @node: the holding node + * @ns: the namespace + * @name: the name of the attribute + * @value: the value of the attribute + * + * Create a new property tagged with a namespace and carried by a node. + * Returns a pointer to the attribute + */ +xmlAttrPtr +xmlNewNsPropEatName(xmlNodePtr node, xmlNsPtr ns, xmlChar *name, + const xmlChar *value) { + + if (name == NULL) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlNewNsPropEatName : name == NULL\n"); +#endif + return(NULL); + } + + return xmlNewPropInternal(node, ns, name, value, 1); +} + +/** + * xmlNewDocProp: + * @doc: the document + * @name: the name of the attribute + * @value: the value of the attribute + * + * Create a new property carried by a document. + * Returns a pointer to the attribute + */ +xmlAttrPtr +xmlNewDocProp(xmlDocPtr doc, const xmlChar *name, const xmlChar *value) { + xmlAttrPtr cur; + + if (name == NULL) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlNewDocProp : name == NULL\n"); +#endif + return(NULL); + } + + /* + * Allocate a new property and fill the fields. + */ + cur = (xmlAttrPtr) xmlMalloc(sizeof(xmlAttr)); + if (cur == NULL) { + xmlTreeErrMemory("building attribute"); + return(NULL); + } + memset(cur, 0, sizeof(xmlAttr)); + cur->type = XML_ATTRIBUTE_NODE; + + if ((doc != NULL) && (doc->dict != NULL)) + cur->name = xmlDictLookup(doc->dict, name, -1); + else + cur->name = xmlStrdup(name); + cur->doc = doc; + if (value != NULL) { + xmlNodePtr tmp; + + cur->children = xmlStringGetNodeList(doc, value); + cur->last = NULL; + + tmp = cur->children; + while (tmp != NULL) { + tmp->parent = (xmlNodePtr) cur; + if (tmp->next == NULL) + cur->last = tmp; + tmp = tmp->next; + } + } + + if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) + xmlRegisterNodeDefaultValue((xmlNodePtr)cur); + return(cur); +} + +/** + * xmlFreePropList: + * @cur: the first property in the list + * + * Free a property and all its siblings, all the children are freed too. + */ +void +xmlFreePropList(xmlAttrPtr cur) { + xmlAttrPtr next; + if (cur == NULL) return; + while (cur != NULL) { + next = cur->next; + xmlFreeProp(cur); + cur = next; + } +} + +/** + * xmlFreeProp: + * @cur: an attribute + * + * Free one attribute, all the content is freed too + */ +void +xmlFreeProp(xmlAttrPtr cur) { + xmlDictPtr dict = NULL; + if (cur == NULL) return; + + if (cur->doc != NULL) dict = cur->doc->dict; + + if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue)) + xmlDeregisterNodeDefaultValue((xmlNodePtr)cur); + + /* Check for ID removal -> leading to invalid references ! */ + if ((cur->doc != NULL) && (cur->atype == XML_ATTRIBUTE_ID)) { + xmlRemoveID(cur->doc, cur); + } + if (cur->children != NULL) xmlFreeNodeList(cur->children); + DICT_FREE(cur->name) + xmlFree(cur); +} + +/** + * xmlRemoveProp: + * @cur: an attribute + * + * Unlink and free one attribute, all the content is freed too + * Note this doesn't work for namespace definition attributes + * + * Returns 0 if success and -1 in case of error. + */ +int +xmlRemoveProp(xmlAttrPtr cur) { + xmlAttrPtr tmp; + if (cur == NULL) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlRemoveProp : cur == NULL\n"); +#endif + return(-1); + } + if (cur->parent == NULL) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlRemoveProp : cur->parent == NULL\n"); +#endif + return(-1); + } + tmp = cur->parent->properties; + if (tmp == cur) { + cur->parent->properties = cur->next; + if (cur->next != NULL) + cur->next->prev = NULL; + xmlFreeProp(cur); + return(0); + } + while (tmp != NULL) { + if (tmp->next == cur) { + tmp->next = cur->next; + if (tmp->next != NULL) + tmp->next->prev = tmp; + xmlFreeProp(cur); + return(0); + } + tmp = tmp->next; + } +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlRemoveProp : attribute not owned by its node\n"); +#endif + return(-1); +} + +/** + * xmlNewDocPI: + * @doc: the target document + * @name: the processing instruction name + * @content: the PI content + * + * Creation of a processing instruction element. + * Returns a pointer to the new node object. + */ +xmlNodePtr +xmlNewDocPI(xmlDocPtr doc, const xmlChar *name, const xmlChar *content) { + xmlNodePtr cur; + + if (name == NULL) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlNewPI : name == NULL\n"); +#endif + return(NULL); + } + + /* + * Allocate a new node and fill the fields. + */ + cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode)); + if (cur == NULL) { + xmlTreeErrMemory("building PI"); + return(NULL); + } + memset(cur, 0, sizeof(xmlNode)); + cur->type = XML_PI_NODE; + + if ((doc != NULL) && (doc->dict != NULL)) + cur->name = xmlDictLookup(doc->dict, name, -1); + else + cur->name = xmlStrdup(name); + if (content != NULL) { + cur->content = xmlStrdup(content); + } + cur->doc = doc; + + if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) + xmlRegisterNodeDefaultValue((xmlNodePtr)cur); + return(cur); +} + +/** + * xmlNewPI: + * @name: the processing instruction name + * @content: the PI content + * + * Creation of a processing instruction element. + * Use xmlDocNewPI preferably to get string interning + * + * Returns a pointer to the new node object. + */ +xmlNodePtr +xmlNewPI(const xmlChar *name, const xmlChar *content) { + return(xmlNewDocPI(NULL, name, content)); +} + +/** + * xmlNewNode: + * @ns: namespace if any + * @name: the node name + * + * Creation of a new node element. @ns is optional (NULL). + * + * Returns a pointer to the new node object. Uses xmlStrdup() to make + * copy of @name. + */ +xmlNodePtr +xmlNewNode(xmlNsPtr ns, const xmlChar *name) { + xmlNodePtr cur; + + if (name == NULL) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlNewNode : name == NULL\n"); +#endif + return(NULL); + } + + /* + * Allocate a new node and fill the fields. + */ + cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode)); + if (cur == NULL) { + xmlTreeErrMemory("building node"); + return(NULL); + } + memset(cur, 0, sizeof(xmlNode)); + cur->type = XML_ELEMENT_NODE; + + cur->name = xmlStrdup(name); + cur->ns = ns; + + if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) + xmlRegisterNodeDefaultValue(cur); + return(cur); +} + +/** + * xmlNewNodeEatName: + * @ns: namespace if any + * @name: the node name + * + * Creation of a new node element. @ns is optional (NULL). + * + * Returns a pointer to the new node object, with pointer @name as + * new node's name. Use xmlNewNode() if a copy of @name string is + * is needed as new node's name. + */ +xmlNodePtr +xmlNewNodeEatName(xmlNsPtr ns, xmlChar *name) { + xmlNodePtr cur; + + if (name == NULL) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlNewNode : name == NULL\n"); +#endif + return(NULL); + } + + /* + * Allocate a new node and fill the fields. + */ + cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode)); + if (cur == NULL) { + xmlTreeErrMemory("building node"); + /* we can't check here that name comes from the doc dictionnary */ + return(NULL); + } + memset(cur, 0, sizeof(xmlNode)); + cur->type = XML_ELEMENT_NODE; + + cur->name = name; + cur->ns = ns; + + if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) + xmlRegisterNodeDefaultValue((xmlNodePtr)cur); + return(cur); +} + +/** + * xmlNewDocNode: + * @doc: the document + * @ns: namespace if any + * @name: the node name + * @content: the XML text content if any + * + * Creation of a new node element within a document. @ns and @content + * are optional (NULL). + * NOTE: @content is supposed to be a piece of XML CDATA, so it allow entities + * references, but XML special chars need to be escaped first by using + * xmlEncodeEntitiesReentrant(). Use xmlNewDocRawNode() if you don't + * need entities support. + * + * Returns a pointer to the new node object. + */ +xmlNodePtr +xmlNewDocNode(xmlDocPtr doc, xmlNsPtr ns, + const xmlChar *name, const xmlChar *content) { + xmlNodePtr cur; + + if ((doc != NULL) && (doc->dict != NULL)) + cur = xmlNewNodeEatName(ns, (xmlChar *) + xmlDictLookup(doc->dict, name, -1)); + else + cur = xmlNewNode(ns, name); + if (cur != NULL) { + cur->doc = doc; + if (content != NULL) { + cur->children = xmlStringGetNodeList(doc, content); + UPDATE_LAST_CHILD_AND_PARENT(cur) + } + } + + return(cur); +} + +/** + * xmlNewDocNodeEatName: + * @doc: the document + * @ns: namespace if any + * @name: the node name + * @content: the XML text content if any + * + * Creation of a new node element within a document. @ns and @content + * are optional (NULL). + * NOTE: @content is supposed to be a piece of XML CDATA, so it allow entities + * references, but XML special chars need to be escaped first by using + * xmlEncodeEntitiesReentrant(). Use xmlNewDocRawNode() if you don't + * need entities support. + * + * Returns a pointer to the new node object. + */ +xmlNodePtr +xmlNewDocNodeEatName(xmlDocPtr doc, xmlNsPtr ns, + xmlChar *name, const xmlChar *content) { + xmlNodePtr cur; + + cur = xmlNewNodeEatName(ns, name); + if (cur != NULL) { + cur->doc = doc; + if (content != NULL) { + cur->children = xmlStringGetNodeList(doc, content); + UPDATE_LAST_CHILD_AND_PARENT(cur) + } + } else { + /* if name don't come from the doc dictionnary free it here */ + if ((name != NULL) && (doc != NULL) && + (!(xmlDictOwns(doc->dict, name)))) + xmlFree(name); + } + return(cur); +} + +#ifdef LIBXML_TREE_ENABLED +/** + * xmlNewDocRawNode: + * @doc: the document + * @ns: namespace if any + * @name: the node name + * @content: the text content if any + * + * Creation of a new node element within a document. @ns and @content + * are optional (NULL). + * + * Returns a pointer to the new node object. + */ +xmlNodePtr +xmlNewDocRawNode(xmlDocPtr doc, xmlNsPtr ns, + const xmlChar *name, const xmlChar *content) { + xmlNodePtr cur; + + cur = xmlNewDocNode(doc, ns, name, NULL); + if (cur != NULL) { + cur->doc = doc; + if (content != NULL) { + cur->children = xmlNewDocText(doc, content); + UPDATE_LAST_CHILD_AND_PARENT(cur) + } + } + return(cur); +} + +/** + * xmlNewDocFragment: + * @doc: the document owning the fragment + * + * Creation of a new Fragment node. + * Returns a pointer to the new node object. + */ +xmlNodePtr +xmlNewDocFragment(xmlDocPtr doc) { + xmlNodePtr cur; + + /* + * Allocate a new DocumentFragment node and fill the fields. + */ + cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode)); + if (cur == NULL) { + xmlTreeErrMemory("building fragment"); + return(NULL); + } + memset(cur, 0, sizeof(xmlNode)); + cur->type = XML_DOCUMENT_FRAG_NODE; + + cur->doc = doc; + + if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) + xmlRegisterNodeDefaultValue(cur); + return(cur); +} +#endif /* LIBXML_TREE_ENABLED */ + +/** + * xmlNewText: + * @content: the text content + * + * Creation of a new text node. + * Returns a pointer to the new node object. + */ +xmlNodePtr +xmlNewText(const xmlChar *content) { + xmlNodePtr cur; + + /* + * Allocate a new node and fill the fields. + */ + cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode)); + if (cur == NULL) { + xmlTreeErrMemory("building text"); + return(NULL); + } + memset(cur, 0, sizeof(xmlNode)); + cur->type = XML_TEXT_NODE; + + cur->name = xmlStringText; + if (content != NULL) { + cur->content = xmlStrdup(content); + } + + if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) + xmlRegisterNodeDefaultValue(cur); + return(cur); +} + +#ifdef LIBXML_TREE_ENABLED +/** + * xmlNewTextChild: + * @parent: the parent node + * @ns: a namespace if any + * @name: the name of the child + * @content: the text content of the child if any. + * + * Creation of a new child element, added at the end of @parent children list. + * @ns and @content parameters are optional (NULL). If @ns is NULL, the newly + * created element inherits the namespace of @parent. If @content is non NULL, + * a child TEXT node will be created containing the string @content. + * NOTE: Use xmlNewChild() if @content will contain entities that need to be + * preserved. Use this function, xmlNewTextChild(), if you need to ensure that + * reserved XML chars that might appear in @content, such as the ampersand, + * greater-than or less-than signs, are automatically replaced by their XML + * escaped entity representations. + * + * Returns a pointer to the new node object. + */ +xmlNodePtr +xmlNewTextChild(xmlNodePtr parent, xmlNsPtr ns, + const xmlChar *name, const xmlChar *content) { + xmlNodePtr cur, prev; + + if (parent == NULL) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlNewTextChild : parent == NULL\n"); +#endif + return(NULL); + } + + if (name == NULL) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlNewTextChild : name == NULL\n"); +#endif + return(NULL); + } + + /* + * Allocate a new node + */ + if (parent->type == XML_ELEMENT_NODE) { + if (ns == NULL) + cur = xmlNewDocRawNode(parent->doc, parent->ns, name, content); + else + cur = xmlNewDocRawNode(parent->doc, ns, name, content); + } else if ((parent->type == XML_DOCUMENT_NODE) || + (parent->type == XML_HTML_DOCUMENT_NODE)) { + if (ns == NULL) + cur = xmlNewDocRawNode((xmlDocPtr) parent, NULL, name, content); + else + cur = xmlNewDocRawNode((xmlDocPtr) parent, ns, name, content); + } else if (parent->type == XML_DOCUMENT_FRAG_NODE) { + cur = xmlNewDocRawNode( parent->doc, ns, name, content); + } else { + return(NULL); + } + if (cur == NULL) return(NULL); + + /* + * add the new element at the end of the children list. + */ + cur->type = XML_ELEMENT_NODE; + cur->parent = parent; + cur->doc = parent->doc; + if (parent->children == NULL) { + parent->children = cur; + parent->last = cur; + } else { + prev = parent->last; + prev->next = cur; + cur->prev = prev; + parent->last = cur; + } + + return(cur); +} +#endif /* LIBXML_TREE_ENABLED */ + +/** + * xmlNewCharRef: + * @doc: the document + * @name: the char ref string, starting with # or "&# ... ;" + * + * Creation of a new character reference node. + * Returns a pointer to the new node object. + */ +xmlNodePtr +xmlNewCharRef(xmlDocPtr doc, const xmlChar *name) { + xmlNodePtr cur; + + if (name == NULL) + return(NULL); + + /* + * Allocate a new node and fill the fields. + */ + cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode)); + if (cur == NULL) { + xmlTreeErrMemory("building character reference"); + return(NULL); + } + memset(cur, 0, sizeof(xmlNode)); + cur->type = XML_ENTITY_REF_NODE; + + cur->doc = doc; + if (name[0] == '&') { + int len; + name++; + len = xmlStrlen(name); + if (name[len - 1] == ';') + cur->name = xmlStrndup(name, len - 1); + else + cur->name = xmlStrndup(name, len); + } else + cur->name = xmlStrdup(name); + + if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) + xmlRegisterNodeDefaultValue(cur); + return(cur); +} + +/** + * xmlNewReference: + * @doc: the document + * @name: the reference name, or the reference string with & and ; + * + * Creation of a new reference node. + * Returns a pointer to the new node object. + */ +xmlNodePtr +xmlNewReference(xmlDocPtr doc, const xmlChar *name) { + xmlNodePtr cur; + xmlEntityPtr ent; + + if (name == NULL) + return(NULL); + + /* + * Allocate a new node and fill the fields. + */ + cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode)); + if (cur == NULL) { + xmlTreeErrMemory("building reference"); + return(NULL); + } + memset(cur, 0, sizeof(xmlNode)); + cur->type = XML_ENTITY_REF_NODE; + + cur->doc = doc; + if (name[0] == '&') { + int len; + name++; + len = xmlStrlen(name); + if (name[len - 1] == ';') + cur->name = xmlStrndup(name, len - 1); + else + cur->name = xmlStrndup(name, len); + } else + cur->name = xmlStrdup(name); + + ent = xmlGetDocEntity(doc, cur->name); + if (ent != NULL) { + cur->content = ent->content; + /* + * The parent pointer in entity is a DTD pointer and thus is NOT + * updated. Not sure if this is 100% correct. + * -George + */ + cur->children = (xmlNodePtr) ent; + cur->last = (xmlNodePtr) ent; + } + + if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) + xmlRegisterNodeDefaultValue(cur); + return(cur); +} + +/** + * xmlNewDocText: + * @doc: the document + * @content: the text content + * + * Creation of a new text node within a document. + * Returns a pointer to the new node object. + */ +xmlNodePtr +xmlNewDocText(xmlDocPtr doc, const xmlChar *content) { + xmlNodePtr cur; + + cur = xmlNewText(content); + if (cur != NULL) cur->doc = doc; + return(cur); +} + +/** + * xmlNewTextLen: + * @content: the text content + * @len: the text len. + * + * Creation of a new text node with an extra parameter for the content's length + * Returns a pointer to the new node object. + */ +xmlNodePtr +xmlNewTextLen(const xmlChar *content, int len) { + xmlNodePtr cur; + + /* + * Allocate a new node and fill the fields. + */ + cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode)); + if (cur == NULL) { + xmlTreeErrMemory("building text"); + return(NULL); + } + memset(cur, 0, sizeof(xmlNode)); + cur->type = XML_TEXT_NODE; + + cur->name = xmlStringText; + if (content != NULL) { + cur->content = xmlStrndup(content, len); + } + + if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) + xmlRegisterNodeDefaultValue(cur); + return(cur); +} + +/** + * xmlNewDocTextLen: + * @doc: the document + * @content: the text content + * @len: the text len. + * + * Creation of a new text node with an extra content length parameter. The + * text node pertain to a given document. + * Returns a pointer to the new node object. + */ +xmlNodePtr +xmlNewDocTextLen(xmlDocPtr doc, const xmlChar *content, int len) { + xmlNodePtr cur; + + cur = xmlNewTextLen(content, len); + if (cur != NULL) cur->doc = doc; + return(cur); +} + +/** + * xmlNewComment: + * @content: the comment content + * + * Creation of a new node containing a comment. + * Returns a pointer to the new node object. + */ +xmlNodePtr +xmlNewComment(const xmlChar *content) { + xmlNodePtr cur; + + /* + * Allocate a new node and fill the fields. + */ + cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode)); + if (cur == NULL) { + xmlTreeErrMemory("building comment"); + return(NULL); + } + memset(cur, 0, sizeof(xmlNode)); + cur->type = XML_COMMENT_NODE; + + cur->name = xmlStringComment; + if (content != NULL) { + cur->content = xmlStrdup(content); + } + + if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) + xmlRegisterNodeDefaultValue(cur); + return(cur); +} + +/** + * xmlNewCDataBlock: + * @doc: the document + * @content: the CDATA block content content + * @len: the length of the block + * + * Creation of a new node containing a CDATA block. + * Returns a pointer to the new node object. + */ +xmlNodePtr +xmlNewCDataBlock(xmlDocPtr doc, const xmlChar *content, int len) { + xmlNodePtr cur; + + /* + * Allocate a new node and fill the fields. + */ + cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode)); + if (cur == NULL) { + xmlTreeErrMemory("building CDATA"); + return(NULL); + } + memset(cur, 0, sizeof(xmlNode)); + cur->type = XML_CDATA_SECTION_NODE; + cur->doc = doc; + + if (content != NULL) { + cur->content = xmlStrndup(content, len); + } + + if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) + xmlRegisterNodeDefaultValue(cur); + return(cur); +} + +/** + * xmlNewDocComment: + * @doc: the document + * @content: the comment content + * + * Creation of a new node containing a comment within a document. + * Returns a pointer to the new node object. + */ +xmlNodePtr +xmlNewDocComment(xmlDocPtr doc, const xmlChar *content) { + xmlNodePtr cur; + + cur = xmlNewComment(content); + if (cur != NULL) cur->doc = doc; + return(cur); +} + +/** + * xmlSetTreeDoc: + * @tree: the top element + * @doc: the document + * + * update all nodes under the tree to point to the right document + */ +void +xmlSetTreeDoc(xmlNodePtr tree, xmlDocPtr doc) { + xmlAttrPtr prop; + + if ((tree == NULL) || (tree->type == XML_NAMESPACE_DECL)) + return; + if (tree->doc != doc) { + if(tree->type == XML_ELEMENT_NODE) { + prop = tree->properties; + while (prop != NULL) { + prop->doc = doc; + xmlSetListDoc(prop->children, doc); + prop = prop->next; + } + } + if (tree->children != NULL) + xmlSetListDoc(tree->children, doc); + tree->doc = doc; + } +} + +/** + * xmlSetListDoc: + * @list: the first element + * @doc: the document + * + * update all nodes in the list to point to the right document + */ +void +xmlSetListDoc(xmlNodePtr list, xmlDocPtr doc) { + xmlNodePtr cur; + + if ((list == NULL) || (list->type == XML_NAMESPACE_DECL)) + return; + cur = list; + while (cur != NULL) { + if (cur->doc != doc) + xmlSetTreeDoc(cur, doc); + cur = cur->next; + } +} + +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) +/** + * xmlNewChild: + * @parent: the parent node + * @ns: a namespace if any + * @name: the name of the child + * @content: the XML content of the child if any. + * + * Creation of a new child element, added at the end of @parent children list. + * @ns and @content parameters are optional (NULL). If @ns is NULL, the newly + * created element inherits the namespace of @parent. If @content is non NULL, + * a child list containing the TEXTs and ENTITY_REFs node will be created. + * NOTE: @content is supposed to be a piece of XML CDATA, so it allows entity + * references. XML special chars must be escaped first by using + * xmlEncodeEntitiesReentrant(), or xmlNewTextChild() should be used. + * + * Returns a pointer to the new node object. + */ +xmlNodePtr +xmlNewChild(xmlNodePtr parent, xmlNsPtr ns, + const xmlChar *name, const xmlChar *content) { + xmlNodePtr cur, prev; + + if (parent == NULL) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlNewChild : parent == NULL\n"); +#endif + return(NULL); + } + + if (name == NULL) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlNewChild : name == NULL\n"); +#endif + return(NULL); + } + + /* + * Allocate a new node + */ + if (parent->type == XML_ELEMENT_NODE) { + if (ns == NULL) + cur = xmlNewDocNode(parent->doc, parent->ns, name, content); + else + cur = xmlNewDocNode(parent->doc, ns, name, content); + } else if ((parent->type == XML_DOCUMENT_NODE) || + (parent->type == XML_HTML_DOCUMENT_NODE)) { + if (ns == NULL) + cur = xmlNewDocNode((xmlDocPtr) parent, NULL, name, content); + else + cur = xmlNewDocNode((xmlDocPtr) parent, ns, name, content); + } else if (parent->type == XML_DOCUMENT_FRAG_NODE) { + cur = xmlNewDocNode( parent->doc, ns, name, content); + } else { + return(NULL); + } + if (cur == NULL) return(NULL); + + /* + * add the new element at the end of the children list. + */ + cur->type = XML_ELEMENT_NODE; + cur->parent = parent; + cur->doc = parent->doc; + if (parent->children == NULL) { + parent->children = cur; + parent->last = cur; + } else { + prev = parent->last; + prev->next = cur; + cur->prev = prev; + parent->last = cur; + } + + return(cur); +} +#endif /* LIBXML_TREE_ENABLED */ + +/** + * xmlAddPropSibling: + * @prev: the attribute to which @prop is added after + * @cur: the base attribute passed to calling function + * @prop: the new attribute + * + * Add a new attribute after @prev using @cur as base attribute. + * When inserting before @cur, @prev is passed as @cur->prev. + * When inserting after @cur, @prev is passed as @cur. + * If an existing attribute is found it is detroyed prior to adding @prop. + * + * Returns the attribute being inserted or NULL in case of error. + */ +static xmlNodePtr +xmlAddPropSibling(xmlNodePtr prev, xmlNodePtr cur, xmlNodePtr prop) { + xmlAttrPtr attr; + + if ((cur == NULL) || (cur->type != XML_ATTRIBUTE_NODE) || + (prop == NULL) || (prop->type != XML_ATTRIBUTE_NODE) || + ((prev != NULL) && (prev->type != XML_ATTRIBUTE_NODE))) + return(NULL); + + /* check if an attribute with the same name exists */ + if (prop->ns == NULL) + attr = xmlHasNsProp(cur->parent, prop->name, NULL); + else + attr = xmlHasNsProp(cur->parent, prop->name, prop->ns->href); + + if (prop->doc != cur->doc) { + xmlSetTreeDoc(prop, cur->doc); + } + prop->parent = cur->parent; + prop->prev = prev; + if (prev != NULL) { + prop->next = prev->next; + prev->next = prop; + if (prop->next) + prop->next->prev = prop; + } else { + prop->next = cur; + cur->prev = prop; + } + if (prop->prev == NULL && prop->parent != NULL) + prop->parent->properties = (xmlAttrPtr) prop; + if ((attr != NULL) && (attr->type != XML_ATTRIBUTE_DECL)) { + /* different instance, destroy it (attributes must be unique) */ + xmlRemoveProp((xmlAttrPtr) attr); + } + return prop; +} + +/** + * xmlAddNextSibling: + * @cur: the child node + * @elem: the new node + * + * Add a new node @elem as the next sibling of @cur + * If the new node was already inserted in a document it is + * first unlinked from its existing context. + * As a result of text merging @elem may be freed. + * If the new node is ATTRIBUTE, it is added into properties instead of children. + * If there is an attribute with equal name, it is first destroyed. + * + * Returns the new node or NULL in case of error. + */ +xmlNodePtr +xmlAddNextSibling(xmlNodePtr cur, xmlNodePtr elem) { + if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL)) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlAddNextSibling : cur == NULL\n"); +#endif + return(NULL); + } + if ((elem == NULL) || (elem->type == XML_NAMESPACE_DECL)) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlAddNextSibling : elem == NULL\n"); +#endif + return(NULL); + } + + if (cur == elem) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlAddNextSibling : cur == elem\n"); +#endif + return(NULL); + } + + xmlUnlinkNode(elem); + + if (elem->type == XML_TEXT_NODE) { + if (cur->type == XML_TEXT_NODE) { + xmlNodeAddContent(cur, elem->content); + xmlFreeNode(elem); + return(cur); + } + if ((cur->next != NULL) && (cur->next->type == XML_TEXT_NODE) && + (cur->name == cur->next->name)) { + xmlChar *tmp; + + tmp = xmlStrdup(elem->content); + tmp = xmlStrcat(tmp, cur->next->content); + xmlNodeSetContent(cur->next, tmp); + xmlFree(tmp); + xmlFreeNode(elem); + return(cur->next); + } + } else if (elem->type == XML_ATTRIBUTE_NODE) { + return xmlAddPropSibling(cur, cur, elem); + } + + if (elem->doc != cur->doc) { + xmlSetTreeDoc(elem, cur->doc); + } + elem->parent = cur->parent; + elem->prev = cur; + elem->next = cur->next; + cur->next = elem; + if (elem->next != NULL) + elem->next->prev = elem; + if ((elem->parent != NULL) && (elem->parent->last == cur)) + elem->parent->last = elem; + return(elem); +} + +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_HTML_ENABLED) || \ + defined(LIBXML_SCHEMAS_ENABLED) +/** + * xmlAddPrevSibling: + * @cur: the child node + * @elem: the new node + * + * Add a new node @elem as the previous sibling of @cur + * merging adjacent TEXT nodes (@elem may be freed) + * If the new node was already inserted in a document it is + * first unlinked from its existing context. + * If the new node is ATTRIBUTE, it is added into properties instead of children. + * If there is an attribute with equal name, it is first destroyed. + * + * Returns the new node or NULL in case of error. + */ +xmlNodePtr +xmlAddPrevSibling(xmlNodePtr cur, xmlNodePtr elem) { + if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL)) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlAddPrevSibling : cur == NULL\n"); +#endif + return(NULL); + } + if ((elem == NULL) || (elem->type == XML_NAMESPACE_DECL)) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlAddPrevSibling : elem == NULL\n"); +#endif + return(NULL); + } + + if (cur == elem) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlAddPrevSibling : cur == elem\n"); +#endif + return(NULL); + } + + xmlUnlinkNode(elem); + + if (elem->type == XML_TEXT_NODE) { + if (cur->type == XML_TEXT_NODE) { + xmlChar *tmp; + + tmp = xmlStrdup(elem->content); + tmp = xmlStrcat(tmp, cur->content); + xmlNodeSetContent(cur, tmp); + xmlFree(tmp); + xmlFreeNode(elem); + return(cur); + } + if ((cur->prev != NULL) && (cur->prev->type == XML_TEXT_NODE) && + (cur->name == cur->prev->name)) { + xmlNodeAddContent(cur->prev, elem->content); + xmlFreeNode(elem); + return(cur->prev); + } + } else if (elem->type == XML_ATTRIBUTE_NODE) { + return xmlAddPropSibling(cur->prev, cur, elem); + } + + if (elem->doc != cur->doc) { + xmlSetTreeDoc(elem, cur->doc); + } + elem->parent = cur->parent; + elem->next = cur; + elem->prev = cur->prev; + cur->prev = elem; + if (elem->prev != NULL) + elem->prev->next = elem; + if ((elem->parent != NULL) && (elem->parent->children == cur)) { + elem->parent->children = elem; + } + return(elem); +} +#endif /* LIBXML_TREE_ENABLED */ + +/** + * xmlAddSibling: + * @cur: the child node + * @elem: the new node + * + * Add a new element @elem to the list of siblings of @cur + * merging adjacent TEXT nodes (@elem may be freed) + * If the new element was already inserted in a document it is + * first unlinked from its existing context. + * + * Returns the new element or NULL in case of error. + */ +xmlNodePtr +xmlAddSibling(xmlNodePtr cur, xmlNodePtr elem) { + xmlNodePtr parent; + + if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL)) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlAddSibling : cur == NULL\n"); +#endif + return(NULL); + } + + if ((elem == NULL) || (elem->type == XML_NAMESPACE_DECL)) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlAddSibling : elem == NULL\n"); +#endif + return(NULL); + } + + if (cur == elem) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlAddSibling : cur == elem\n"); +#endif + return(NULL); + } + + /* + * Constant time is we can rely on the ->parent->last to find + * the last sibling. + */ + if ((cur->type != XML_ATTRIBUTE_NODE) && (cur->parent != NULL) && + (cur->parent->children != NULL) && + (cur->parent->last != NULL) && + (cur->parent->last->next == NULL)) { + cur = cur->parent->last; + } else { + while (cur->next != NULL) cur = cur->next; + } + + xmlUnlinkNode(elem); + + if ((cur->type == XML_TEXT_NODE) && (elem->type == XML_TEXT_NODE) && + (cur->name == elem->name)) { + xmlNodeAddContent(cur, elem->content); + xmlFreeNode(elem); + return(cur); + } else if (elem->type == XML_ATTRIBUTE_NODE) { + return xmlAddPropSibling(cur, cur, elem); + } + + if (elem->doc != cur->doc) { + xmlSetTreeDoc(elem, cur->doc); + } + parent = cur->parent; + elem->prev = cur; + elem->next = NULL; + elem->parent = parent; + cur->next = elem; + if (parent != NULL) + parent->last = elem; + + return(elem); +} + +/** + * xmlAddChildList: + * @parent: the parent node + * @cur: the first node in the list + * + * Add a list of node at the end of the child list of the parent + * merging adjacent TEXT nodes (@cur may be freed) + * + * Returns the last child or NULL in case of error. + */ +xmlNodePtr +xmlAddChildList(xmlNodePtr parent, xmlNodePtr cur) { + xmlNodePtr prev; + + if ((parent == NULL) || (parent->type == XML_NAMESPACE_DECL)) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlAddChildList : parent == NULL\n"); +#endif + return(NULL); + } + + if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL)) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlAddChildList : child == NULL\n"); +#endif + return(NULL); + } + + if ((cur->doc != NULL) && (parent->doc != NULL) && + (cur->doc != parent->doc)) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "Elements moved to a different document\n"); +#endif + } + + /* + * add the first element at the end of the children list. + */ + + if (parent->children == NULL) { + parent->children = cur; + } else { + /* + * If cur and parent->last both are TEXT nodes, then merge them. + */ + if ((cur->type == XML_TEXT_NODE) && + (parent->last->type == XML_TEXT_NODE) && + (cur->name == parent->last->name)) { + xmlNodeAddContent(parent->last, cur->content); + /* + * if it's the only child, nothing more to be done. + */ + if (cur->next == NULL) { + xmlFreeNode(cur); + return(parent->last); + } + prev = cur; + cur = cur->next; + xmlFreeNode(prev); + } + prev = parent->last; + prev->next = cur; + cur->prev = prev; + } + while (cur->next != NULL) { + cur->parent = parent; + if (cur->doc != parent->doc) { + xmlSetTreeDoc(cur, parent->doc); + } + cur = cur->next; + } + cur->parent = parent; + /* the parent may not be linked to a doc ! */ + if (cur->doc != parent->doc) { + xmlSetTreeDoc(cur, parent->doc); + } + parent->last = cur; + + return(cur); +} + +/** + * xmlAddChild: + * @parent: the parent node + * @cur: the child node + * + * Add a new node to @parent, at the end of the child (or property) list + * merging adjacent TEXT nodes (in which case @cur is freed) + * If the new node is ATTRIBUTE, it is added into properties instead of children. + * If there is an attribute with equal name, it is first destroyed. + * + * Returns the child or NULL in case of error. + */ +xmlNodePtr +xmlAddChild(xmlNodePtr parent, xmlNodePtr cur) { + xmlNodePtr prev; + + if ((parent == NULL) || (parent->type == XML_NAMESPACE_DECL)) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlAddChild : parent == NULL\n"); +#endif + return(NULL); + } + + if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL)) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlAddChild : child == NULL\n"); +#endif + return(NULL); + } + + if (parent == cur) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlAddChild : parent == cur\n"); +#endif + return(NULL); + } + /* + * If cur is a TEXT node, merge its content with adjacent TEXT nodes + * cur is then freed. + */ + if (cur->type == XML_TEXT_NODE) { + if ((parent->type == XML_TEXT_NODE) && + (parent->content != NULL) && + (parent->name == cur->name)) { + xmlNodeAddContent(parent, cur->content); + xmlFreeNode(cur); + return(parent); + } + if ((parent->last != NULL) && (parent->last->type == XML_TEXT_NODE) && + (parent->last->name == cur->name) && + (parent->last != cur)) { + xmlNodeAddContent(parent->last, cur->content); + xmlFreeNode(cur); + return(parent->last); + } + } + + /* + * add the new element at the end of the children list. + */ + prev = cur->parent; + cur->parent = parent; + if (cur->doc != parent->doc) { + xmlSetTreeDoc(cur, parent->doc); + } + /* this check prevents a loop on tree-traversions if a developer + * tries to add a node to its parent multiple times + */ + if (prev == parent) + return(cur); + + /* + * Coalescing + */ + if ((parent->type == XML_TEXT_NODE) && + (parent->content != NULL) && + (parent != cur)) { + xmlNodeAddContent(parent, cur->content); + xmlFreeNode(cur); + return(parent); + } + if (cur->type == XML_ATTRIBUTE_NODE) { + if (parent->type != XML_ELEMENT_NODE) + return(NULL); + if (parent->properties != NULL) { + /* check if an attribute with the same name exists */ + xmlAttrPtr lastattr; + + if (cur->ns == NULL) + lastattr = xmlHasNsProp(parent, cur->name, NULL); + else + lastattr = xmlHasNsProp(parent, cur->name, cur->ns->href); + if ((lastattr != NULL) && (lastattr != (xmlAttrPtr) cur) && (lastattr->type != XML_ATTRIBUTE_DECL)) { + /* different instance, destroy it (attributes must be unique) */ + xmlUnlinkNode((xmlNodePtr) lastattr); + xmlFreeProp(lastattr); + } + if (lastattr == (xmlAttrPtr) cur) + return(cur); + + } + if (parent->properties == NULL) { + parent->properties = (xmlAttrPtr) cur; + } else { + /* find the end */ + xmlAttrPtr lastattr = parent->properties; + while (lastattr->next != NULL) { + lastattr = lastattr->next; + } + lastattr->next = (xmlAttrPtr) cur; + ((xmlAttrPtr) cur)->prev = lastattr; + } + } else { + if (parent->children == NULL) { + parent->children = cur; + parent->last = cur; + } else { + prev = parent->last; + prev->next = cur; + cur->prev = prev; + parent->last = cur; + } + } + return(cur); +} + +/** + * xmlGetLastChild: + * @parent: the parent node + * + * Search the last child of a node. + * Returns the last child or NULL if none. + */ +xmlNodePtr +xmlGetLastChild(xmlNodePtr parent) { + if ((parent == NULL) || (parent->type == XML_NAMESPACE_DECL)) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlGetLastChild : parent == NULL\n"); +#endif + return(NULL); + } + return(parent->last); +} + +#ifdef LIBXML_TREE_ENABLED +/* + * 5 interfaces from DOM ElementTraversal + */ + +/** + * xmlChildElementCount: + * @parent: the parent node + * + * Finds the current number of child nodes of that element which are + * element nodes. + * Note the handling of entities references is different than in + * the W3C DOM element traversal spec since we don't have back reference + * from entities content to entities references. + * + * Returns the count of element child or 0 if not available + */ +unsigned long +xmlChildElementCount(xmlNodePtr parent) { + unsigned long ret = 0; + xmlNodePtr cur = NULL; + + if (parent == NULL) + return(0); + switch (parent->type) { + case XML_ELEMENT_NODE: + case XML_ENTITY_NODE: + case XML_DOCUMENT_NODE: + case XML_HTML_DOCUMENT_NODE: + cur = parent->children; + break; + default: + return(0); + } + while (cur != NULL) { + if (cur->type == XML_ELEMENT_NODE) + ret++; + cur = cur->next; + } + return(ret); +} + +/** + * xmlFirstElementChild: + * @parent: the parent node + * + * Finds the first child node of that element which is a Element node + * Note the handling of entities references is different than in + * the W3C DOM element traversal spec since we don't have back reference + * from entities content to entities references. + * + * Returns the first element child or NULL if not available + */ +xmlNodePtr +xmlFirstElementChild(xmlNodePtr parent) { + xmlNodePtr cur = NULL; + + if (parent == NULL) + return(NULL); + switch (parent->type) { + case XML_ELEMENT_NODE: + case XML_ENTITY_NODE: + case XML_DOCUMENT_NODE: + case XML_HTML_DOCUMENT_NODE: + cur = parent->children; + break; + default: + return(NULL); + } + while (cur != NULL) { + if (cur->type == XML_ELEMENT_NODE) + return(cur); + cur = cur->next; + } + return(NULL); +} + +/** + * xmlLastElementChild: + * @parent: the parent node + * + * Finds the last child node of that element which is a Element node + * Note the handling of entities references is different than in + * the W3C DOM element traversal spec since we don't have back reference + * from entities content to entities references. + * + * Returns the last element child or NULL if not available + */ +xmlNodePtr +xmlLastElementChild(xmlNodePtr parent) { + xmlNodePtr cur = NULL; + + if (parent == NULL) + return(NULL); + switch (parent->type) { + case XML_ELEMENT_NODE: + case XML_ENTITY_NODE: + case XML_DOCUMENT_NODE: + case XML_HTML_DOCUMENT_NODE: + cur = parent->last; + break; + default: + return(NULL); + } + while (cur != NULL) { + if (cur->type == XML_ELEMENT_NODE) + return(cur); + cur = cur->prev; + } + return(NULL); +} + +/** + * xmlPreviousElementSibling: + * @node: the current node + * + * Finds the first closest previous sibling of the node which is an + * element node. + * Note the handling of entities references is different than in + * the W3C DOM element traversal spec since we don't have back reference + * from entities content to entities references. + * + * Returns the previous element sibling or NULL if not available + */ +xmlNodePtr +xmlPreviousElementSibling(xmlNodePtr node) { + if (node == NULL) + return(NULL); + switch (node->type) { + case XML_ELEMENT_NODE: + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + case XML_ENTITY_REF_NODE: + case XML_ENTITY_NODE: + case XML_PI_NODE: + case XML_COMMENT_NODE: + case XML_XINCLUDE_START: + case XML_XINCLUDE_END: + node = node->prev; + break; + default: + return(NULL); + } + while (node != NULL) { + if (node->type == XML_ELEMENT_NODE) + return(node); + node = node->prev; + } + return(NULL); +} + +/** + * xmlNextElementSibling: + * @node: the current node + * + * Finds the first closest next sibling of the node which is an + * element node. + * Note the handling of entities references is different than in + * the W3C DOM element traversal spec since we don't have back reference + * from entities content to entities references. + * + * Returns the next element sibling or NULL if not available + */ +xmlNodePtr +xmlNextElementSibling(xmlNodePtr node) { + if (node == NULL) + return(NULL); + switch (node->type) { + case XML_ELEMENT_NODE: + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + case XML_ENTITY_REF_NODE: + case XML_ENTITY_NODE: + case XML_PI_NODE: + case XML_COMMENT_NODE: + case XML_DTD_NODE: + case XML_XINCLUDE_START: + case XML_XINCLUDE_END: + node = node->next; + break; + default: + return(NULL); + } + while (node != NULL) { + if (node->type == XML_ELEMENT_NODE) + return(node); + node = node->next; + } + return(NULL); +} + +#endif /* LIBXML_TREE_ENABLED */ + +/** + * xmlFreeNodeList: + * @cur: the first node in the list + * + * Free a node and all its siblings, this is a recursive behaviour, all + * the children are freed too. + */ +void +xmlFreeNodeList(xmlNodePtr cur) { + xmlNodePtr next; + xmlDictPtr dict = NULL; + + if (cur == NULL) return; + if (cur->type == XML_NAMESPACE_DECL) { + xmlFreeNsList((xmlNsPtr) cur); + return; + } + if ((cur->type == XML_DOCUMENT_NODE) || +#ifdef LIBXML_DOCB_ENABLED + (cur->type == XML_DOCB_DOCUMENT_NODE) || +#endif + (cur->type == XML_HTML_DOCUMENT_NODE)) { + xmlFreeDoc((xmlDocPtr) cur); + return; + } + if (cur->doc != NULL) dict = cur->doc->dict; + while (cur != NULL) { + next = cur->next; + if (cur->type != XML_DTD_NODE) { + + if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue)) + xmlDeregisterNodeDefaultValue(cur); + + if ((cur->children != NULL) && + (cur->type != XML_ENTITY_REF_NODE)) + xmlFreeNodeList(cur->children); + if (((cur->type == XML_ELEMENT_NODE) || + (cur->type == XML_XINCLUDE_START) || + (cur->type == XML_XINCLUDE_END)) && + (cur->properties != NULL)) + xmlFreePropList(cur->properties); + if ((cur->type != XML_ELEMENT_NODE) && + (cur->type != XML_XINCLUDE_START) && + (cur->type != XML_XINCLUDE_END) && + (cur->type != XML_ENTITY_REF_NODE) && + (cur->content != (xmlChar *) &(cur->properties))) { + DICT_FREE(cur->content) + } + if (((cur->type == XML_ELEMENT_NODE) || + (cur->type == XML_XINCLUDE_START) || + (cur->type == XML_XINCLUDE_END)) && + (cur->nsDef != NULL)) + xmlFreeNsList(cur->nsDef); + + /* + * When a node is a text node or a comment, it uses a global static + * variable for the name of the node. + * Otherwise the node name might come from the document's + * dictionnary + */ + if ((cur->name != NULL) && + (cur->type != XML_TEXT_NODE) && + (cur->type != XML_COMMENT_NODE)) + DICT_FREE(cur->name) + xmlFree(cur); + } + cur = next; + } +} + +/** + * xmlFreeNode: + * @cur: the node + * + * Free a node, this is a recursive behaviour, all the children are freed too. + * This doesn't unlink the child from the list, use xmlUnlinkNode() first. + */ +void +xmlFreeNode(xmlNodePtr cur) { + xmlDictPtr dict = NULL; + + if (cur == NULL) return; + + /* use xmlFreeDtd for DTD nodes */ + if (cur->type == XML_DTD_NODE) { + xmlFreeDtd((xmlDtdPtr) cur); + return; + } + if (cur->type == XML_NAMESPACE_DECL) { + xmlFreeNs((xmlNsPtr) cur); + return; + } + if (cur->type == XML_ATTRIBUTE_NODE) { + xmlFreeProp((xmlAttrPtr) cur); + return; + } + + if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue)) + xmlDeregisterNodeDefaultValue(cur); + + if (cur->doc != NULL) dict = cur->doc->dict; + + if (cur->type == XML_ENTITY_DECL) { + xmlEntityPtr ent = (xmlEntityPtr) cur; + DICT_FREE(ent->SystemID); + DICT_FREE(ent->ExternalID); + } + if ((cur->children != NULL) && + (cur->type != XML_ENTITY_REF_NODE)) + xmlFreeNodeList(cur->children); + if (((cur->type == XML_ELEMENT_NODE) || + (cur->type == XML_XINCLUDE_START) || + (cur->type == XML_XINCLUDE_END)) && + (cur->properties != NULL)) + xmlFreePropList(cur->properties); + if ((cur->type != XML_ELEMENT_NODE) && + (cur->content != NULL) && + (cur->type != XML_ENTITY_REF_NODE) && + (cur->type != XML_XINCLUDE_END) && + (cur->type != XML_XINCLUDE_START) && + (cur->content != (xmlChar *) &(cur->properties))) { + DICT_FREE(cur->content) + } + + /* + * When a node is a text node or a comment, it uses a global static + * variable for the name of the node. + * Otherwise the node name might come from the document's dictionnary + */ + if ((cur->name != NULL) && + (cur->type != XML_TEXT_NODE) && + (cur->type != XML_COMMENT_NODE)) + DICT_FREE(cur->name) + + if (((cur->type == XML_ELEMENT_NODE) || + (cur->type == XML_XINCLUDE_START) || + (cur->type == XML_XINCLUDE_END)) && + (cur->nsDef != NULL)) + xmlFreeNsList(cur->nsDef); + xmlFree(cur); +} + +/** + * xmlUnlinkNode: + * @cur: the node + * + * Unlink a node from it's current context, the node is not freed + * If one need to free the node, use xmlFreeNode() routine after the + * unlink to discard it. + * Note that namespace nodes can't be unlinked as they do not have + * pointer to their parent. + */ +void +xmlUnlinkNode(xmlNodePtr cur) { + if (cur == NULL) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlUnlinkNode : node == NULL\n"); +#endif + return; + } + if (cur->type == XML_NAMESPACE_DECL) + return; + if (cur->type == XML_DTD_NODE) { + xmlDocPtr doc; + doc = cur->doc; + if (doc != NULL) { + if (doc->intSubset == (xmlDtdPtr) cur) + doc->intSubset = NULL; + if (doc->extSubset == (xmlDtdPtr) cur) + doc->extSubset = NULL; + } + } + if (cur->type == XML_ENTITY_DECL) { + xmlDocPtr doc; + doc = cur->doc; + if (doc != NULL) { + if (doc->intSubset != NULL) { + if (xmlHashLookup(doc->intSubset->entities, cur->name) == cur) + xmlHashRemoveEntry(doc->intSubset->entities, cur->name, + NULL); + if (xmlHashLookup(doc->intSubset->pentities, cur->name) == cur) + xmlHashRemoveEntry(doc->intSubset->pentities, cur->name, + NULL); + } + if (doc->extSubset != NULL) { + if (xmlHashLookup(doc->extSubset->entities, cur->name) == cur) + xmlHashRemoveEntry(doc->extSubset->entities, cur->name, + NULL); + if (xmlHashLookup(doc->extSubset->pentities, cur->name) == cur) + xmlHashRemoveEntry(doc->extSubset->pentities, cur->name, + NULL); + } + } + } + if (cur->parent != NULL) { + xmlNodePtr parent; + parent = cur->parent; + if (cur->type == XML_ATTRIBUTE_NODE) { + if (parent->properties == (xmlAttrPtr) cur) + parent->properties = ((xmlAttrPtr) cur)->next; + } else { + if (parent->children == cur) + parent->children = cur->next; + if (parent->last == cur) + parent->last = cur->prev; + } + cur->parent = NULL; + } + if (cur->next != NULL) + cur->next->prev = cur->prev; + if (cur->prev != NULL) + cur->prev->next = cur->next; + cur->next = cur->prev = NULL; +} + +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_WRITER_ENABLED) +/** + * xmlReplaceNode: + * @old: the old node + * @cur: the node + * + * Unlink the old node from its current context, prune the new one + * at the same place. If @cur was already inserted in a document it is + * first unlinked from its existing context. + * + * Returns the @old node + */ +xmlNodePtr +xmlReplaceNode(xmlNodePtr old, xmlNodePtr cur) { + if (old == cur) return(NULL); + if ((old == NULL) || (old->type == XML_NAMESPACE_DECL) || + (old->parent == NULL)) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlReplaceNode : old == NULL or without parent\n"); +#endif + return(NULL); + } + if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL)) { + xmlUnlinkNode(old); + return(old); + } + if (cur == old) { + return(old); + } + if ((old->type==XML_ATTRIBUTE_NODE) && (cur->type!=XML_ATTRIBUTE_NODE)) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlReplaceNode : Trying to replace attribute node with other node type\n"); +#endif + return(old); + } + if ((cur->type==XML_ATTRIBUTE_NODE) && (old->type!=XML_ATTRIBUTE_NODE)) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlReplaceNode : Trying to replace a non-attribute node with attribute node\n"); +#endif + return(old); + } + xmlUnlinkNode(cur); + xmlSetTreeDoc(cur, old->doc); + cur->parent = old->parent; + cur->next = old->next; + if (cur->next != NULL) + cur->next->prev = cur; + cur->prev = old->prev; + if (cur->prev != NULL) + cur->prev->next = cur; + if (cur->parent != NULL) { + if (cur->type == XML_ATTRIBUTE_NODE) { + if (cur->parent->properties == (xmlAttrPtr)old) + cur->parent->properties = ((xmlAttrPtr) cur); + } else { + if (cur->parent->children == old) + cur->parent->children = cur; + if (cur->parent->last == old) + cur->parent->last = cur; + } + } + old->next = old->prev = NULL; + old->parent = NULL; + return(old); +} +#endif /* LIBXML_TREE_ENABLED */ + +/************************************************************************ + * * + * Copy operations * + * * + ************************************************************************/ + +/** + * xmlCopyNamespace: + * @cur: the namespace + * + * Do a copy of the namespace. + * + * Returns: a new #xmlNsPtr, or NULL in case of error. + */ +xmlNsPtr +xmlCopyNamespace(xmlNsPtr cur) { + xmlNsPtr ret; + + if (cur == NULL) return(NULL); + switch (cur->type) { + case XML_LOCAL_NAMESPACE: + ret = xmlNewNs(NULL, cur->href, cur->prefix); + break; + default: +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlCopyNamespace: invalid type %d\n", cur->type); +#endif + return(NULL); + } + return(ret); +} + +/** + * xmlCopyNamespaceList: + * @cur: the first namespace + * + * Do a copy of an namespace list. + * + * Returns: a new #xmlNsPtr, or NULL in case of error. + */ +xmlNsPtr +xmlCopyNamespaceList(xmlNsPtr cur) { + xmlNsPtr ret = NULL; + xmlNsPtr p = NULL,q; + + while (cur != NULL) { + q = xmlCopyNamespace(cur); + if (p == NULL) { + ret = p = q; + } else { + p->next = q; + p = q; + } + cur = cur->next; + } + return(ret); +} + +static xmlNodePtr +xmlStaticCopyNodeList(xmlNodePtr node, xmlDocPtr doc, xmlNodePtr parent); + +static xmlAttrPtr +xmlCopyPropInternal(xmlDocPtr doc, xmlNodePtr target, xmlAttrPtr cur) { + xmlAttrPtr ret; + + if (cur == NULL) return(NULL); + if ((target != NULL) && (target->type != XML_ELEMENT_NODE)) + return(NULL); + if (target != NULL) + ret = xmlNewDocProp(target->doc, cur->name, NULL); + else if (doc != NULL) + ret = xmlNewDocProp(doc, cur->name, NULL); + else if (cur->parent != NULL) + ret = xmlNewDocProp(cur->parent->doc, cur->name, NULL); + else if (cur->children != NULL) + ret = xmlNewDocProp(cur->children->doc, cur->name, NULL); + else + ret = xmlNewDocProp(NULL, cur->name, NULL); + if (ret == NULL) return(NULL); + ret->parent = target; + + if ((cur->ns != NULL) && (target != NULL)) { + xmlNsPtr ns; + + ns = xmlSearchNs(target->doc, target, cur->ns->prefix); + if (ns == NULL) { + /* + * Humm, we are copying an element whose namespace is defined + * out of the new tree scope. Search it in the original tree + * and add it at the top of the new tree + */ + ns = xmlSearchNs(cur->doc, cur->parent, cur->ns->prefix); + if (ns != NULL) { + xmlNodePtr root = target; + xmlNodePtr pred = NULL; + + while (root->parent != NULL) { + pred = root; + root = root->parent; + } + if (root == (xmlNodePtr) target->doc) { + /* correct possibly cycling above the document elt */ + root = pred; + } + ret->ns = xmlNewNs(root, ns->href, ns->prefix); + } + } else { + /* + * we have to find something appropriate here since + * we cant be sure, that the namespce we found is identified + * by the prefix + */ + if (xmlStrEqual(ns->href, cur->ns->href)) { + /* this is the nice case */ + ret->ns = ns; + } else { + /* + * we are in trouble: we need a new reconcilied namespace. + * This is expensive + */ + ret->ns = xmlNewReconciliedNs(target->doc, target, cur->ns); + } + } + + } else + ret->ns = NULL; + + if (cur->children != NULL) { + xmlNodePtr tmp; + + ret->children = xmlStaticCopyNodeList(cur->children, ret->doc, (xmlNodePtr) ret); + ret->last = NULL; + tmp = ret->children; + while (tmp != NULL) { + /* tmp->parent = (xmlNodePtr)ret; */ + if (tmp->next == NULL) + ret->last = tmp; + tmp = tmp->next; + } + } + /* + * Try to handle IDs + */ + if ((target!= NULL) && (cur!= NULL) && + (target->doc != NULL) && (cur->doc != NULL) && + (cur->doc->ids != NULL) && (cur->parent != NULL)) { + if (xmlIsID(cur->doc, cur->parent, cur)) { + xmlChar *id; + + id = xmlNodeListGetString(cur->doc, cur->children, 1); + if (id != NULL) { + xmlAddID(NULL, target->doc, id, ret); + xmlFree(id); + } + } + } + return(ret); +} + +/** + * xmlCopyProp: + * @target: the element where the attribute will be grafted + * @cur: the attribute + * + * Do a copy of the attribute. + * + * Returns: a new #xmlAttrPtr, or NULL in case of error. + */ +xmlAttrPtr +xmlCopyProp(xmlNodePtr target, xmlAttrPtr cur) { + return xmlCopyPropInternal(NULL, target, cur); +} + +/** + * xmlCopyPropList: + * @target: the element where the attributes will be grafted + * @cur: the first attribute + * + * Do a copy of an attribute list. + * + * Returns: a new #xmlAttrPtr, or NULL in case of error. + */ +xmlAttrPtr +xmlCopyPropList(xmlNodePtr target, xmlAttrPtr cur) { + xmlAttrPtr ret = NULL; + xmlAttrPtr p = NULL,q; + + if ((target != NULL) && (target->type != XML_ELEMENT_NODE)) + return(NULL); + while (cur != NULL) { + q = xmlCopyProp(target, cur); + if (q == NULL) + return(NULL); + if (p == NULL) { + ret = p = q; + } else { + p->next = q; + q->prev = p; + p = q; + } + cur = cur->next; + } + return(ret); +} + +/* + * NOTE about the CopyNode operations ! + * + * They are split into external and internal parts for one + * tricky reason: namespaces. Doing a direct copy of a node + * say RPM:Copyright without changing the namespace pointer to + * something else can produce stale links. One way to do it is + * to keep a reference counter but this doesn't work as soon + * as one move the element or the subtree out of the scope of + * the existing namespace. The actual solution seems to add + * a copy of the namespace at the top of the copied tree if + * not available in the subtree. + * Hence two functions, the public front-end call the inner ones + * The argument "recursive" normally indicates a recursive copy + * of the node with values 0 (no) and 1 (yes). For XInclude, + * however, we allow a value of 2 to indicate copy properties and + * namespace info, but don't recurse on children. + */ + +static xmlNodePtr +xmlStaticCopyNode(const xmlNodePtr node, xmlDocPtr doc, xmlNodePtr parent, + int extended) { + xmlNodePtr ret; + + if (node == NULL) return(NULL); + switch (node->type) { + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + case XML_ELEMENT_NODE: + case XML_DOCUMENT_FRAG_NODE: + case XML_ENTITY_REF_NODE: + case XML_ENTITY_NODE: + case XML_PI_NODE: + case XML_COMMENT_NODE: + case XML_XINCLUDE_START: + case XML_XINCLUDE_END: + break; + case XML_ATTRIBUTE_NODE: + return((xmlNodePtr) xmlCopyPropInternal(doc, parent, (xmlAttrPtr) node)); + case XML_NAMESPACE_DECL: + return((xmlNodePtr) xmlCopyNamespaceList((xmlNsPtr) node)); + + case XML_DOCUMENT_NODE: + case XML_HTML_DOCUMENT_NODE: +#ifdef LIBXML_DOCB_ENABLED + case XML_DOCB_DOCUMENT_NODE: +#endif +#ifdef LIBXML_TREE_ENABLED + return((xmlNodePtr) xmlCopyDoc((xmlDocPtr) node, extended)); +#endif /* LIBXML_TREE_ENABLED */ + case XML_DOCUMENT_TYPE_NODE: + case XML_NOTATION_NODE: + case XML_DTD_NODE: + case XML_ELEMENT_DECL: + case XML_ATTRIBUTE_DECL: + case XML_ENTITY_DECL: + return(NULL); + } + + /* + * Allocate a new node and fill the fields. + */ + ret = (xmlNodePtr) xmlMalloc(sizeof(xmlNode)); + if (ret == NULL) { + xmlTreeErrMemory("copying node"); + return(NULL); + } + memset(ret, 0, sizeof(xmlNode)); + ret->type = node->type; + + ret->doc = doc; + ret->parent = parent; + if (node->name == xmlStringText) + ret->name = xmlStringText; + else if (node->name == xmlStringTextNoenc) + ret->name = xmlStringTextNoenc; + else if (node->name == xmlStringComment) + ret->name = xmlStringComment; + else if (node->name != NULL) { + if ((doc != NULL) && (doc->dict != NULL)) + ret->name = xmlDictLookup(doc->dict, node->name, -1); + else + ret->name = xmlStrdup(node->name); + } + if ((node->type != XML_ELEMENT_NODE) && + (node->content != NULL) && + (node->type != XML_ENTITY_REF_NODE) && + (node->type != XML_XINCLUDE_END) && + (node->type != XML_XINCLUDE_START)) { + ret->content = xmlStrdup(node->content); + }else{ + if (node->type == XML_ELEMENT_NODE) + ret->line = node->line; + } + if (parent != NULL) { + xmlNodePtr tmp; + + /* + * this is a tricky part for the node register thing: + * in case ret does get coalesced in xmlAddChild + * the deregister-node callback is called; so we register ret now already + */ + if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) + xmlRegisterNodeDefaultValue((xmlNodePtr)ret); + + tmp = xmlAddChild(parent, ret); + /* node could have coalesced */ + if (tmp != ret) + return(tmp); + } + + if (!extended) + goto out; + if (((node->type == XML_ELEMENT_NODE) || + (node->type == XML_XINCLUDE_START)) && (node->nsDef != NULL)) + ret->nsDef = xmlCopyNamespaceList(node->nsDef); + + if (node->ns != NULL) { + xmlNsPtr ns; + + ns = xmlSearchNs(doc, ret, node->ns->prefix); + if (ns == NULL) { + /* + * Humm, we are copying an element whose namespace is defined + * out of the new tree scope. Search it in the original tree + * and add it at the top of the new tree + */ + ns = xmlSearchNs(node->doc, node, node->ns->prefix); + if (ns != NULL) { + xmlNodePtr root = ret; + + while (root->parent != NULL) root = root->parent; + ret->ns = xmlNewNs(root, ns->href, ns->prefix); + } else { + ret->ns = xmlNewReconciliedNs(doc, ret, node->ns); + } + } else { + /* + * reference the existing namespace definition in our own tree. + */ + ret->ns = ns; + } + } + if (((node->type == XML_ELEMENT_NODE) || + (node->type == XML_XINCLUDE_START)) && (node->properties != NULL)) + ret->properties = xmlCopyPropList(ret, node->properties); + if (node->type == XML_ENTITY_REF_NODE) { + if ((doc == NULL) || (node->doc != doc)) { + /* + * The copied node will go into a separate document, so + * to avoid dangling references to the ENTITY_DECL node + * we cannot keep the reference. Try to find it in the + * target document. + */ + ret->children = (xmlNodePtr) xmlGetDocEntity(doc, ret->name); + } else { + ret->children = node->children; + } + ret->last = ret->children; + } else if ((node->children != NULL) && (extended != 2)) { + ret->children = xmlStaticCopyNodeList(node->children, doc, ret); + UPDATE_LAST_CHILD_AND_PARENT(ret) + } + +out: + /* if parent != NULL we already registered the node above */ + if ((parent == NULL) && + ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))) + xmlRegisterNodeDefaultValue((xmlNodePtr)ret); + return(ret); +} + +static xmlNodePtr +xmlStaticCopyNodeList(xmlNodePtr node, xmlDocPtr doc, xmlNodePtr parent) { + xmlNodePtr ret = NULL; + xmlNodePtr p = NULL,q; + + while (node != NULL) { +#ifdef LIBXML_TREE_ENABLED + if (node->type == XML_DTD_NODE ) { + if (doc == NULL) { + node = node->next; + continue; + } + if (doc->intSubset == NULL) { + q = (xmlNodePtr) xmlCopyDtd( (xmlDtdPtr) node ); + q->doc = doc; + q->parent = parent; + doc->intSubset = (xmlDtdPtr) q; + xmlAddChild(parent, q); + } else { + q = (xmlNodePtr) doc->intSubset; + xmlAddChild(parent, q); + } + } else +#endif /* LIBXML_TREE_ENABLED */ + q = xmlStaticCopyNode(node, doc, parent, 1); + if (ret == NULL) { + q->prev = NULL; + ret = p = q; + } else if (p != q) { + /* the test is required if xmlStaticCopyNode coalesced 2 text nodes */ + p->next = q; + q->prev = p; + p = q; + } + node = node->next; + } + return(ret); +} + +/** + * xmlCopyNode: + * @node: the node + * @extended: if 1 do a recursive copy (properties, namespaces and children + * when applicable) + * if 2 copy properties and namespaces (when applicable) + * + * Do a copy of the node. + * + * Returns: a new #xmlNodePtr, or NULL in case of error. + */ +xmlNodePtr +xmlCopyNode(const xmlNodePtr node, int extended) { + xmlNodePtr ret; + + ret = xmlStaticCopyNode(node, NULL, NULL, extended); + return(ret); +} + +/** + * xmlDocCopyNode: + * @node: the node + * @doc: the document + * @extended: if 1 do a recursive copy (properties, namespaces and children + * when applicable) + * if 2 copy properties and namespaces (when applicable) + * + * Do a copy of the node to a given document. + * + * Returns: a new #xmlNodePtr, or NULL in case of error. + */ +xmlNodePtr +xmlDocCopyNode(const xmlNodePtr node, xmlDocPtr doc, int extended) { + xmlNodePtr ret; + + ret = xmlStaticCopyNode(node, doc, NULL, extended); + return(ret); +} + +/** + * xmlDocCopyNodeList: + * @doc: the target document + * @node: the first node in the list. + * + * Do a recursive copy of the node list. + * + * Returns: a new #xmlNodePtr, or NULL in case of error. + */ +xmlNodePtr xmlDocCopyNodeList(xmlDocPtr doc, const xmlNodePtr node) { + xmlNodePtr ret = xmlStaticCopyNodeList(node, doc, NULL); + return(ret); +} + +/** + * xmlCopyNodeList: + * @node: the first node in the list. + * + * Do a recursive copy of the node list. + * Use xmlDocCopyNodeList() if possible to ensure string interning. + * + * Returns: a new #xmlNodePtr, or NULL in case of error. + */ +xmlNodePtr xmlCopyNodeList(const xmlNodePtr node) { + xmlNodePtr ret = xmlStaticCopyNodeList(node, NULL, NULL); + return(ret); +} + +#if defined(LIBXML_TREE_ENABLED) +/** + * xmlCopyDtd: + * @dtd: the dtd + * + * Do a copy of the dtd. + * + * Returns: a new #xmlDtdPtr, or NULL in case of error. + */ +xmlDtdPtr +xmlCopyDtd(xmlDtdPtr dtd) { + xmlDtdPtr ret; + xmlNodePtr cur, p = NULL, q; + + if (dtd == NULL) return(NULL); + ret = xmlNewDtd(NULL, dtd->name, dtd->ExternalID, dtd->SystemID); + if (ret == NULL) return(NULL); + if (dtd->entities != NULL) + ret->entities = (void *) xmlCopyEntitiesTable( + (xmlEntitiesTablePtr) dtd->entities); + if (dtd->notations != NULL) + ret->notations = (void *) xmlCopyNotationTable( + (xmlNotationTablePtr) dtd->notations); + if (dtd->elements != NULL) + ret->elements = (void *) xmlCopyElementTable( + (xmlElementTablePtr) dtd->elements); + if (dtd->attributes != NULL) + ret->attributes = (void *) xmlCopyAttributeTable( + (xmlAttributeTablePtr) dtd->attributes); + if (dtd->pentities != NULL) + ret->pentities = (void *) xmlCopyEntitiesTable( + (xmlEntitiesTablePtr) dtd->pentities); + + cur = dtd->children; + while (cur != NULL) { + q = NULL; + + if (cur->type == XML_ENTITY_DECL) { + xmlEntityPtr tmp = (xmlEntityPtr) cur; + switch (tmp->etype) { + case XML_INTERNAL_GENERAL_ENTITY: + case XML_EXTERNAL_GENERAL_PARSED_ENTITY: + case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: + q = (xmlNodePtr) xmlGetEntityFromDtd(ret, tmp->name); + break; + case XML_INTERNAL_PARAMETER_ENTITY: + case XML_EXTERNAL_PARAMETER_ENTITY: + q = (xmlNodePtr) + xmlGetParameterEntityFromDtd(ret, tmp->name); + break; + case XML_INTERNAL_PREDEFINED_ENTITY: + break; + } + } else if (cur->type == XML_ELEMENT_DECL) { + xmlElementPtr tmp = (xmlElementPtr) cur; + q = (xmlNodePtr) + xmlGetDtdQElementDesc(ret, tmp->name, tmp->prefix); + } else if (cur->type == XML_ATTRIBUTE_DECL) { + xmlAttributePtr tmp = (xmlAttributePtr) cur; + q = (xmlNodePtr) + xmlGetDtdQAttrDesc(ret, tmp->elem, tmp->name, tmp->prefix); + } else if (cur->type == XML_COMMENT_NODE) { + q = xmlCopyNode(cur, 0); + } + + if (q == NULL) { + cur = cur->next; + continue; + } + + if (p == NULL) + ret->children = q; + else + p->next = q; + + q->prev = p; + q->parent = (xmlNodePtr) ret; + q->next = NULL; + ret->last = q; + p = q; + cur = cur->next; + } + + return(ret); +} +#endif + +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) +/** + * xmlCopyDoc: + * @doc: the document + * @recursive: if not zero do a recursive copy. + * + * Do a copy of the document info. If recursive, the content tree will + * be copied too as well as DTD, namespaces and entities. + * + * Returns: a new #xmlDocPtr, or NULL in case of error. + */ +xmlDocPtr +xmlCopyDoc(xmlDocPtr doc, int recursive) { + xmlDocPtr ret; + + if (doc == NULL) return(NULL); + ret = xmlNewDoc(doc->version); + if (ret == NULL) return(NULL); + if (doc->name != NULL) + ret->name = xmlMemStrdup(doc->name); + if (doc->encoding != NULL) + ret->encoding = xmlStrdup(doc->encoding); + if (doc->URL != NULL) + ret->URL = xmlStrdup(doc->URL); + ret->charset = doc->charset; + ret->compression = doc->compression; + ret->standalone = doc->standalone; + if (!recursive) return(ret); + + ret->last = NULL; + ret->children = NULL; +#ifdef LIBXML_TREE_ENABLED + if (doc->intSubset != NULL) { + ret->intSubset = xmlCopyDtd(doc->intSubset); + xmlSetTreeDoc((xmlNodePtr)ret->intSubset, ret); + ret->intSubset->parent = ret; + } +#endif + if (doc->oldNs != NULL) + ret->oldNs = xmlCopyNamespaceList(doc->oldNs); + if (doc->children != NULL) { + xmlNodePtr tmp; + + ret->children = xmlStaticCopyNodeList(doc->children, ret, + (xmlNodePtr)ret); + ret->last = NULL; + tmp = ret->children; + while (tmp != NULL) { + if (tmp->next == NULL) + ret->last = tmp; + tmp = tmp->next; + } + } + return(ret); +} +#endif /* LIBXML_TREE_ENABLED */ + +/************************************************************************ + * * + * Content access functions * + * * + ************************************************************************/ + +/** + * xmlGetLineNoInternal: + * @node: valid node + * @depth: used to limit any risk of recursion + * + * Get line number of @node. + * Try to override the limitation of lines being store in 16 bits ints + * + * Returns the line number if successful, -1 otherwise + */ +static long +xmlGetLineNoInternal(xmlNodePtr node, int depth) +{ + long result = -1; + + if (depth >= 5) + return(-1); + + if (!node) + return result; + if ((node->type == XML_ELEMENT_NODE) || + (node->type == XML_TEXT_NODE) || + (node->type == XML_COMMENT_NODE) || + (node->type == XML_PI_NODE)) { + if (node->line == 65535) { + if ((node->type == XML_TEXT_NODE) && (node->psvi != NULL)) + result = (long) node->psvi; + else if ((node->type == XML_ELEMENT_NODE) && + (node->children != NULL)) + result = xmlGetLineNoInternal(node->children, depth + 1); + else if (node->next != NULL) + result = xmlGetLineNoInternal(node->next, depth + 1); + else if (node->prev != NULL) + result = xmlGetLineNoInternal(node->prev, depth + 1); + } + if ((result == -1) || (result == 65535)) + result = (long) node->line; + } else if ((node->prev != NULL) && + ((node->prev->type == XML_ELEMENT_NODE) || + (node->prev->type == XML_TEXT_NODE) || + (node->prev->type == XML_COMMENT_NODE) || + (node->prev->type == XML_PI_NODE))) + result = xmlGetLineNoInternal(node->prev, depth + 1); + else if ((node->parent != NULL) && + (node->parent->type == XML_ELEMENT_NODE)) + result = xmlGetLineNoInternal(node->parent, depth + 1); + + return result; +} + +/** + * xmlGetLineNo: + * @node: valid node + * + * Get line number of @node. + * Try to override the limitation of lines being store in 16 bits ints + * if XML_PARSE_BIG_LINES parser option was used + * + * Returns the line number if successful, -1 otherwise + */ +long +xmlGetLineNo(xmlNodePtr node) +{ + return(xmlGetLineNoInternal(node, 0)); +} + +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_DEBUG_ENABLED) +/** + * xmlGetNodePath: + * @node: a node + * + * Build a structure based Path for the given node + * + * Returns the new path or NULL in case of error. The caller must free + * the returned string + */ +xmlChar * +xmlGetNodePath(xmlNodePtr node) +{ + xmlNodePtr cur, tmp, next; + xmlChar *buffer = NULL, *temp; + size_t buf_len; + xmlChar *buf; + const char *sep; + const char *name; + char nametemp[100]; + int occur = 0, generic; + + if ((node == NULL) || (node->type == XML_NAMESPACE_DECL)) + return (NULL); + + buf_len = 500; + buffer = (xmlChar *) xmlMallocAtomic(buf_len * sizeof(xmlChar)); + if (buffer == NULL) { + xmlTreeErrMemory("getting node path"); + return (NULL); + } + buf = (xmlChar *) xmlMallocAtomic(buf_len * sizeof(xmlChar)); + if (buf == NULL) { + xmlTreeErrMemory("getting node path"); + xmlFree(buffer); + return (NULL); + } + + buffer[0] = 0; + cur = node; + do { + name = ""; + sep = "?"; + occur = 0; + if ((cur->type == XML_DOCUMENT_NODE) || + (cur->type == XML_HTML_DOCUMENT_NODE)) { + if (buffer[0] == '/') + break; + sep = "/"; + next = NULL; + } else if (cur->type == XML_ELEMENT_NODE) { + generic = 0; + sep = "/"; + name = (const char *) cur->name; + if (cur->ns) { + if (cur->ns->prefix != NULL) { + snprintf(nametemp, sizeof(nametemp) - 1, "%s:%s", + (char *)cur->ns->prefix, (char *)cur->name); + nametemp[sizeof(nametemp) - 1] = 0; + name = nametemp; + } else { + /* + * We cannot express named elements in the default + * namespace, so use "*". + */ + generic = 1; + name = "*"; + } + } + next = cur->parent; + + /* + * Thumbler index computation + * TODO: the ocurence test seems bogus for namespaced names + */ + tmp = cur->prev; + while (tmp != NULL) { + if ((tmp->type == XML_ELEMENT_NODE) && + (generic || + (xmlStrEqual(cur->name, tmp->name) && + ((tmp->ns == cur->ns) || + ((tmp->ns != NULL) && (cur->ns != NULL) && + (xmlStrEqual(cur->ns->prefix, tmp->ns->prefix))))))) + occur++; + tmp = tmp->prev; + } + if (occur == 0) { + tmp = cur->next; + while (tmp != NULL && occur == 0) { + if ((tmp->type == XML_ELEMENT_NODE) && + (generic || + (xmlStrEqual(cur->name, tmp->name) && + ((tmp->ns == cur->ns) || + ((tmp->ns != NULL) && (cur->ns != NULL) && + (xmlStrEqual(cur->ns->prefix, tmp->ns->prefix))))))) + occur++; + tmp = tmp->next; + } + if (occur != 0) + occur = 1; + } else + occur++; + } else if (cur->type == XML_COMMENT_NODE) { + sep = "/"; + name = "comment()"; + next = cur->parent; + + /* + * Thumbler index computation + */ + tmp = cur->prev; + while (tmp != NULL) { + if (tmp->type == XML_COMMENT_NODE) + occur++; + tmp = tmp->prev; + } + if (occur == 0) { + tmp = cur->next; + while (tmp != NULL && occur == 0) { + if (tmp->type == XML_COMMENT_NODE) + occur++; + tmp = tmp->next; + } + if (occur != 0) + occur = 1; + } else + occur++; + } else if ((cur->type == XML_TEXT_NODE) || + (cur->type == XML_CDATA_SECTION_NODE)) { + sep = "/"; + name = "text()"; + next = cur->parent; + + /* + * Thumbler index computation + */ + tmp = cur->prev; + while (tmp != NULL) { + if ((tmp->type == XML_TEXT_NODE) || + (tmp->type == XML_CDATA_SECTION_NODE)) + occur++; + tmp = tmp->prev; + } + /* + * Evaluate if this is the only text- or CDATA-section-node; + * if yes, then we'll get "text()", otherwise "text()[1]". + */ + if (occur == 0) { + tmp = cur->next; + while (tmp != NULL) { + if ((tmp->type == XML_TEXT_NODE) || + (tmp->type == XML_CDATA_SECTION_NODE)) + { + occur = 1; + break; + } + tmp = tmp->next; + } + } else + occur++; + } else if (cur->type == XML_PI_NODE) { + sep = "/"; + snprintf(nametemp, sizeof(nametemp) - 1, + "processing-instruction('%s')", (char *)cur->name); + nametemp[sizeof(nametemp) - 1] = 0; + name = nametemp; + + next = cur->parent; + + /* + * Thumbler index computation + */ + tmp = cur->prev; + while (tmp != NULL) { + if ((tmp->type == XML_PI_NODE) && + (xmlStrEqual(cur->name, tmp->name))) + occur++; + tmp = tmp->prev; + } + if (occur == 0) { + tmp = cur->next; + while (tmp != NULL && occur == 0) { + if ((tmp->type == XML_PI_NODE) && + (xmlStrEqual(cur->name, tmp->name))) + occur++; + tmp = tmp->next; + } + if (occur != 0) + occur = 1; + } else + occur++; + + } else if (cur->type == XML_ATTRIBUTE_NODE) { + sep = "/@"; + name = (const char *) (((xmlAttrPtr) cur)->name); + if (cur->ns) { + if (cur->ns->prefix != NULL) + snprintf(nametemp, sizeof(nametemp) - 1, "%s:%s", + (char *)cur->ns->prefix, (char *)cur->name); + else + snprintf(nametemp, sizeof(nametemp) - 1, "%s", + (char *)cur->name); + nametemp[sizeof(nametemp) - 1] = 0; + name = nametemp; + } + next = ((xmlAttrPtr) cur)->parent; + } else { + next = cur->parent; + } + + /* + * Make sure there is enough room + */ + if (xmlStrlen(buffer) + sizeof(nametemp) + 20 > buf_len) { + buf_len = + 2 * buf_len + xmlStrlen(buffer) + sizeof(nametemp) + 20; + temp = (xmlChar *) xmlRealloc(buffer, buf_len); + if (temp == NULL) { + xmlTreeErrMemory("getting node path"); + xmlFree(buf); + xmlFree(buffer); + return (NULL); + } + buffer = temp; + temp = (xmlChar *) xmlRealloc(buf, buf_len); + if (temp == NULL) { + xmlTreeErrMemory("getting node path"); + xmlFree(buf); + xmlFree(buffer); + return (NULL); + } + buf = temp; + } + if (occur == 0) + snprintf((char *) buf, buf_len, "%s%s%s", + sep, name, (char *) buffer); + else + snprintf((char *) buf, buf_len, "%s%s[%d]%s", + sep, name, occur, (char *) buffer); + snprintf((char *) buffer, buf_len, "%s", (char *)buf); + cur = next; + } while (cur != NULL); + xmlFree(buf); + return (buffer); +} +#endif /* LIBXML_TREE_ENABLED */ + +/** + * xmlDocGetRootElement: + * @doc: the document + * + * Get the root element of the document (doc->children is a list + * containing possibly comments, PIs, etc ...). + * + * Returns the #xmlNodePtr for the root or NULL + */ +xmlNodePtr +xmlDocGetRootElement(xmlDocPtr doc) { + xmlNodePtr ret; + + if (doc == NULL) return(NULL); + ret = doc->children; + while (ret != NULL) { + if (ret->type == XML_ELEMENT_NODE) + return(ret); + ret = ret->next; + } + return(ret); +} + +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_WRITER_ENABLED) +/** + * xmlDocSetRootElement: + * @doc: the document + * @root: the new document root element, if root is NULL no action is taken, + * to remove a node from a document use xmlUnlinkNode(root) instead. + * + * Set the root element of the document (doc->children is a list + * containing possibly comments, PIs, etc ...). + * + * Returns the old root element if any was found, NULL if root was NULL + */ +xmlNodePtr +xmlDocSetRootElement(xmlDocPtr doc, xmlNodePtr root) { + xmlNodePtr old = NULL; + + if (doc == NULL) return(NULL); + if ((root == NULL) || (root->type == XML_NAMESPACE_DECL)) + return(NULL); + xmlUnlinkNode(root); + xmlSetTreeDoc(root, doc); + root->parent = (xmlNodePtr) doc; + old = doc->children; + while (old != NULL) { + if (old->type == XML_ELEMENT_NODE) + break; + old = old->next; + } + if (old == NULL) { + if (doc->children == NULL) { + doc->children = root; + doc->last = root; + } else { + xmlAddSibling(doc->children, root); + } + } else { + xmlReplaceNode(old, root); + } + return(old); +} +#endif + +#if defined(LIBXML_TREE_ENABLED) +/** + * xmlNodeSetLang: + * @cur: the node being changed + * @lang: the language description + * + * Set the language of a node, i.e. the values of the xml:lang + * attribute. + */ +void +xmlNodeSetLang(xmlNodePtr cur, const xmlChar *lang) { + xmlNsPtr ns; + + if (cur == NULL) return; + switch(cur->type) { + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + case XML_COMMENT_NODE: + case XML_DOCUMENT_NODE: + case XML_DOCUMENT_TYPE_NODE: + case XML_DOCUMENT_FRAG_NODE: + case XML_NOTATION_NODE: + case XML_HTML_DOCUMENT_NODE: + case XML_DTD_NODE: + case XML_ELEMENT_DECL: + case XML_ATTRIBUTE_DECL: + case XML_ENTITY_DECL: + case XML_PI_NODE: + case XML_ENTITY_REF_NODE: + case XML_ENTITY_NODE: + case XML_NAMESPACE_DECL: +#ifdef LIBXML_DOCB_ENABLED + case XML_DOCB_DOCUMENT_NODE: +#endif + case XML_XINCLUDE_START: + case XML_XINCLUDE_END: + return; + case XML_ELEMENT_NODE: + case XML_ATTRIBUTE_NODE: + break; + } + ns = xmlSearchNsByHref(cur->doc, cur, XML_XML_NAMESPACE); + if (ns == NULL) + return; + xmlSetNsProp(cur, ns, BAD_CAST "lang", lang); +} +#endif /* LIBXML_TREE_ENABLED */ + +/** + * xmlNodeGetLang: + * @cur: the node being checked + * + * Searches the language of a node, i.e. the values of the xml:lang + * attribute or the one carried by the nearest ancestor. + * + * Returns a pointer to the lang value, or NULL if not found + * It's up to the caller to free the memory with xmlFree(). + */ +xmlChar * +xmlNodeGetLang(xmlNodePtr cur) { + xmlChar *lang; + + if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL)) + return(NULL); + while (cur != NULL) { + lang = xmlGetNsProp(cur, BAD_CAST "lang", XML_XML_NAMESPACE); + if (lang != NULL) + return(lang); + cur = cur->parent; + } + return(NULL); +} + + +#ifdef LIBXML_TREE_ENABLED +/** + * xmlNodeSetSpacePreserve: + * @cur: the node being changed + * @val: the xml:space value ("0": default, 1: "preserve") + * + * Set (or reset) the space preserving behaviour of a node, i.e. the + * value of the xml:space attribute. + */ +void +xmlNodeSetSpacePreserve(xmlNodePtr cur, int val) { + xmlNsPtr ns; + + if (cur == NULL) return; + switch(cur->type) { + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + case XML_COMMENT_NODE: + case XML_DOCUMENT_NODE: + case XML_DOCUMENT_TYPE_NODE: + case XML_DOCUMENT_FRAG_NODE: + case XML_NOTATION_NODE: + case XML_HTML_DOCUMENT_NODE: + case XML_DTD_NODE: + case XML_ELEMENT_DECL: + case XML_ATTRIBUTE_DECL: + case XML_ENTITY_DECL: + case XML_PI_NODE: + case XML_ENTITY_REF_NODE: + case XML_ENTITY_NODE: + case XML_NAMESPACE_DECL: + case XML_XINCLUDE_START: + case XML_XINCLUDE_END: +#ifdef LIBXML_DOCB_ENABLED + case XML_DOCB_DOCUMENT_NODE: +#endif + return; + case XML_ELEMENT_NODE: + case XML_ATTRIBUTE_NODE: + break; + } + ns = xmlSearchNsByHref(cur->doc, cur, XML_XML_NAMESPACE); + if (ns == NULL) + return; + switch (val) { + case 0: + xmlSetNsProp(cur, ns, BAD_CAST "space", BAD_CAST "default"); + break; + case 1: + xmlSetNsProp(cur, ns, BAD_CAST "space", BAD_CAST "preserve"); + break; + } +} +#endif /* LIBXML_TREE_ENABLED */ + +/** + * xmlNodeGetSpacePreserve: + * @cur: the node being checked + * + * Searches the space preserving behaviour of a node, i.e. the values + * of the xml:space attribute or the one carried by the nearest + * ancestor. + * + * Returns -1 if xml:space is not inherited, 0 if "default", 1 if "preserve" + */ +int +xmlNodeGetSpacePreserve(xmlNodePtr cur) { + xmlChar *space; + + if ((cur == NULL) || (cur->type != XML_ELEMENT_NODE)) + return(-1); + while (cur != NULL) { + space = xmlGetNsProp(cur, BAD_CAST "space", XML_XML_NAMESPACE); + if (space != NULL) { + if (xmlStrEqual(space, BAD_CAST "preserve")) { + xmlFree(space); + return(1); + } + if (xmlStrEqual(space, BAD_CAST "default")) { + xmlFree(space); + return(0); + } + xmlFree(space); + } + cur = cur->parent; + } + return(-1); +} + +#ifdef LIBXML_TREE_ENABLED +/** + * xmlNodeSetName: + * @cur: the node being changed + * @name: the new tag name + * + * Set (or reset) the name of a node. + */ +void +xmlNodeSetName(xmlNodePtr cur, const xmlChar *name) { + xmlDocPtr doc; + xmlDictPtr dict; + + if (cur == NULL) return; + if (name == NULL) return; + switch(cur->type) { + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + case XML_COMMENT_NODE: + case XML_DOCUMENT_TYPE_NODE: + case XML_DOCUMENT_FRAG_NODE: + case XML_NOTATION_NODE: + case XML_HTML_DOCUMENT_NODE: + case XML_NAMESPACE_DECL: + case XML_XINCLUDE_START: + case XML_XINCLUDE_END: +#ifdef LIBXML_DOCB_ENABLED + case XML_DOCB_DOCUMENT_NODE: +#endif + return; + case XML_ELEMENT_NODE: + case XML_ATTRIBUTE_NODE: + case XML_PI_NODE: + case XML_ENTITY_REF_NODE: + case XML_ENTITY_NODE: + case XML_DTD_NODE: + case XML_DOCUMENT_NODE: + case XML_ELEMENT_DECL: + case XML_ATTRIBUTE_DECL: + case XML_ENTITY_DECL: + break; + } + doc = cur->doc; + if (doc != NULL) + dict = doc->dict; + else + dict = NULL; + if (dict != NULL) { + if ((cur->name != NULL) && (!xmlDictOwns(dict, cur->name))) + xmlFree((xmlChar *) cur->name); + cur->name = xmlDictLookup(dict, name, -1); + } else { + if (cur->name != NULL) xmlFree((xmlChar *) cur->name); + cur->name = xmlStrdup(name); + } +} +#endif + +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) +/** + * xmlNodeSetBase: + * @cur: the node being changed + * @uri: the new base URI + * + * Set (or reset) the base URI of a node, i.e. the value of the + * xml:base attribute. + */ +void +xmlNodeSetBase(xmlNodePtr cur, const xmlChar* uri) { + xmlNsPtr ns; + xmlChar* fixed; + + if (cur == NULL) return; + switch(cur->type) { + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + case XML_COMMENT_NODE: + case XML_DOCUMENT_TYPE_NODE: + case XML_DOCUMENT_FRAG_NODE: + case XML_NOTATION_NODE: + case XML_DTD_NODE: + case XML_ELEMENT_DECL: + case XML_ATTRIBUTE_DECL: + case XML_ENTITY_DECL: + case XML_PI_NODE: + case XML_ENTITY_REF_NODE: + case XML_ENTITY_NODE: + case XML_NAMESPACE_DECL: + case XML_XINCLUDE_START: + case XML_XINCLUDE_END: + return; + case XML_ELEMENT_NODE: + case XML_ATTRIBUTE_NODE: + break; + case XML_DOCUMENT_NODE: +#ifdef LIBXML_DOCB_ENABLED + case XML_DOCB_DOCUMENT_NODE: +#endif + case XML_HTML_DOCUMENT_NODE: { + xmlDocPtr doc = (xmlDocPtr) cur; + + if (doc->URL != NULL) + xmlFree((xmlChar *) doc->URL); + if (uri == NULL) + doc->URL = NULL; + else + doc->URL = xmlPathToURI(uri); + return; + } + } + + ns = xmlSearchNsByHref(cur->doc, cur, XML_XML_NAMESPACE); + if (ns == NULL) + return; + fixed = xmlPathToURI(uri); + if (fixed != NULL) { + xmlSetNsProp(cur, ns, BAD_CAST "base", fixed); + xmlFree(fixed); + } else { + xmlSetNsProp(cur, ns, BAD_CAST "base", uri); + } +} +#endif /* LIBXML_TREE_ENABLED */ + +/** + * xmlNodeGetBase: + * @doc: the document the node pertains to + * @cur: the node being checked + * + * Searches for the BASE URL. The code should work on both XML + * and HTML document even if base mechanisms are completely different. + * It returns the base as defined in RFC 2396 sections + * 5.1.1. Base URI within Document Content + * and + * 5.1.2. Base URI from the Encapsulating Entity + * However it does not return the document base (5.1.3), use + * doc->URL in this case + * + * Returns a pointer to the base URL, or NULL if not found + * It's up to the caller to free the memory with xmlFree(). + */ +xmlChar * +xmlNodeGetBase(xmlDocPtr doc, xmlNodePtr cur) { + xmlChar *oldbase = NULL; + xmlChar *base, *newbase; + + if ((cur == NULL) && (doc == NULL)) + return(NULL); + if ((cur != NULL) && (cur->type == XML_NAMESPACE_DECL)) + return(NULL); + if (doc == NULL) doc = cur->doc; + if ((doc != NULL) && (doc->type == XML_HTML_DOCUMENT_NODE)) { + cur = doc->children; + while ((cur != NULL) && (cur->name != NULL)) { + if (cur->type != XML_ELEMENT_NODE) { + cur = cur->next; + continue; + } + if (!xmlStrcasecmp(cur->name, BAD_CAST "html")) { + cur = cur->children; + continue; + } + if (!xmlStrcasecmp(cur->name, BAD_CAST "head")) { + cur = cur->children; + continue; + } + if (!xmlStrcasecmp(cur->name, BAD_CAST "base")) { + return(xmlGetProp(cur, BAD_CAST "href")); + } + cur = cur->next; + } + return(NULL); + } + while (cur != NULL) { + if (cur->type == XML_ENTITY_DECL) { + xmlEntityPtr ent = (xmlEntityPtr) cur; + return(xmlStrdup(ent->URI)); + } + if (cur->type == XML_ELEMENT_NODE) { + base = xmlGetNsProp(cur, BAD_CAST "base", XML_XML_NAMESPACE); + if (base != NULL) { + if (oldbase != NULL) { + newbase = xmlBuildURI(oldbase, base); + if (newbase != NULL) { + xmlFree(oldbase); + xmlFree(base); + oldbase = newbase; + } else { + xmlFree(oldbase); + xmlFree(base); + return(NULL); + } + } else { + oldbase = base; + } + if ((!xmlStrncmp(oldbase, BAD_CAST "http://", 7)) || + (!xmlStrncmp(oldbase, BAD_CAST "ftp://", 6)) || + (!xmlStrncmp(oldbase, BAD_CAST "urn:", 4))) + return(oldbase); + } + } + cur = cur->parent; + } + if ((doc != NULL) && (doc->URL != NULL)) { + if (oldbase == NULL) + return(xmlStrdup(doc->URL)); + newbase = xmlBuildURI(oldbase, doc->URL); + xmlFree(oldbase); + return(newbase); + } + return(oldbase); +} + +/** + * xmlNodeBufGetContent: + * @buffer: a buffer + * @cur: the node being read + * + * Read the value of a node @cur, this can be either the text carried + * directly by this node if it's a TEXT node or the aggregate string + * of the values carried by this node child's (TEXT and ENTITY_REF). + * Entity references are substituted. + * Fills up the buffer @buffer with this value + * + * Returns 0 in case of success and -1 in case of error. + */ +int +xmlNodeBufGetContent(xmlBufferPtr buffer, xmlNodePtr cur) +{ + xmlBufPtr buf; + int ret; + + if ((cur == NULL) || (buffer == NULL)) return(-1); + buf = xmlBufFromBuffer(buffer); + ret = xmlBufGetNodeContent(buf, cur); + buffer = xmlBufBackToBuffer(buf); + if ((ret < 0) || (buffer == NULL)) + return(-1); + return(0); +} + +/** + * xmlBufGetNodeContent: + * @buf: a buffer xmlBufPtr + * @cur: the node being read + * + * Read the value of a node @cur, this can be either the text carried + * directly by this node if it's a TEXT node or the aggregate string + * of the values carried by this node child's (TEXT and ENTITY_REF). + * Entity references are substituted. + * Fills up the buffer @buffer with this value + * + * Returns 0 in case of success and -1 in case of error. + */ +int +xmlBufGetNodeContent(xmlBufPtr buf, xmlNodePtr cur) +{ + if ((cur == NULL) || (buf == NULL)) return(-1); + switch (cur->type) { + case XML_CDATA_SECTION_NODE: + case XML_TEXT_NODE: + xmlBufCat(buf, cur->content); + break; + case XML_DOCUMENT_FRAG_NODE: + case XML_ELEMENT_NODE:{ + xmlNodePtr tmp = cur; + + while (tmp != NULL) { + switch (tmp->type) { + case XML_CDATA_SECTION_NODE: + case XML_TEXT_NODE: + if (tmp->content != NULL) + xmlBufCat(buf, tmp->content); + break; + case XML_ENTITY_REF_NODE: + xmlBufGetNodeContent(buf, tmp); + break; + default: + break; + } + /* + * Skip to next node + */ + if (tmp->children != NULL) { + if (tmp->children->type != XML_ENTITY_DECL) { + tmp = tmp->children; + continue; + } + } + if (tmp == cur) + break; + + if (tmp->next != NULL) { + tmp = tmp->next; + continue; + } + + do { + tmp = tmp->parent; + if (tmp == NULL) + break; + if (tmp == cur) { + tmp = NULL; + break; + } + if (tmp->next != NULL) { + tmp = tmp->next; + break; + } + } while (tmp != NULL); + } + break; + } + case XML_ATTRIBUTE_NODE:{ + xmlAttrPtr attr = (xmlAttrPtr) cur; + xmlNodePtr tmp = attr->children; + + while (tmp != NULL) { + if (tmp->type == XML_TEXT_NODE) + xmlBufCat(buf, tmp->content); + else + xmlBufGetNodeContent(buf, tmp); + tmp = tmp->next; + } + break; + } + case XML_COMMENT_NODE: + case XML_PI_NODE: + xmlBufCat(buf, cur->content); + break; + case XML_ENTITY_REF_NODE:{ + xmlEntityPtr ent; + xmlNodePtr tmp; + + /* lookup entity declaration */ + ent = xmlGetDocEntity(cur->doc, cur->name); + if (ent == NULL) + return(-1); + + /* an entity content can be any "well balanced chunk", + * i.e. the result of the content [43] production: + * http://www.w3.org/TR/REC-xml#NT-content + * -> we iterate through child nodes and recursive call + * xmlNodeGetContent() which handles all possible node types */ + tmp = ent->children; + while (tmp) { + xmlBufGetNodeContent(buf, tmp); + tmp = tmp->next; + } + break; + } + case XML_ENTITY_NODE: + case XML_DOCUMENT_TYPE_NODE: + case XML_NOTATION_NODE: + case XML_DTD_NODE: + case XML_XINCLUDE_START: + case XML_XINCLUDE_END: + break; + case XML_DOCUMENT_NODE: +#ifdef LIBXML_DOCB_ENABLED + case XML_DOCB_DOCUMENT_NODE: +#endif + case XML_HTML_DOCUMENT_NODE: + cur = cur->children; + while (cur!= NULL) { + if ((cur->type == XML_ELEMENT_NODE) || + (cur->type == XML_TEXT_NODE) || + (cur->type == XML_CDATA_SECTION_NODE)) { + xmlBufGetNodeContent(buf, cur); + } + cur = cur->next; + } + break; + case XML_NAMESPACE_DECL: + xmlBufCat(buf, ((xmlNsPtr) cur)->href); + break; + case XML_ELEMENT_DECL: + case XML_ATTRIBUTE_DECL: + case XML_ENTITY_DECL: + break; + } + return(0); +} + +/** + * xmlNodeGetContent: + * @cur: the node being read + * + * Read the value of a node, this can be either the text carried + * directly by this node if it's a TEXT node or the aggregate string + * of the values carried by this node child's (TEXT and ENTITY_REF). + * Entity references are substituted. + * Returns a new #xmlChar * or NULL if no content is available. + * It's up to the caller to free the memory with xmlFree(). + */ +xmlChar * +xmlNodeGetContent(xmlNodePtr cur) +{ + if (cur == NULL) + return (NULL); + switch (cur->type) { + case XML_DOCUMENT_FRAG_NODE: + case XML_ELEMENT_NODE:{ + xmlBufPtr buf; + xmlChar *ret; + + buf = xmlBufCreateSize(64); + if (buf == NULL) + return (NULL); + xmlBufGetNodeContent(buf, cur); + ret = xmlBufDetach(buf); + xmlBufFree(buf); + return (ret); + } + case XML_ATTRIBUTE_NODE: + return(xmlGetPropNodeValueInternal((xmlAttrPtr) cur)); + case XML_COMMENT_NODE: + case XML_PI_NODE: + if (cur->content != NULL) + return (xmlStrdup(cur->content)); + return (NULL); + case XML_ENTITY_REF_NODE:{ + xmlEntityPtr ent; + xmlBufPtr buf; + xmlChar *ret; + + /* lookup entity declaration */ + ent = xmlGetDocEntity(cur->doc, cur->name); + if (ent == NULL) + return (NULL); + + buf = xmlBufCreate(); + if (buf == NULL) + return (NULL); + + xmlBufGetNodeContent(buf, cur); + + ret = xmlBufDetach(buf); + xmlBufFree(buf); + return (ret); + } + case XML_ENTITY_NODE: + case XML_DOCUMENT_TYPE_NODE: + case XML_NOTATION_NODE: + case XML_DTD_NODE: + case XML_XINCLUDE_START: + case XML_XINCLUDE_END: + return (NULL); + case XML_DOCUMENT_NODE: +#ifdef LIBXML_DOCB_ENABLED + case XML_DOCB_DOCUMENT_NODE: +#endif + case XML_HTML_DOCUMENT_NODE: { + xmlBufPtr buf; + xmlChar *ret; + + buf = xmlBufCreate(); + if (buf == NULL) + return (NULL); + + xmlBufGetNodeContent(buf, (xmlNodePtr) cur); + + ret = xmlBufDetach(buf); + xmlBufFree(buf); + return (ret); + } + case XML_NAMESPACE_DECL: { + xmlChar *tmp; + + tmp = xmlStrdup(((xmlNsPtr) cur)->href); + return (tmp); + } + case XML_ELEMENT_DECL: + /* TODO !!! */ + return (NULL); + case XML_ATTRIBUTE_DECL: + /* TODO !!! */ + return (NULL); + case XML_ENTITY_DECL: + /* TODO !!! */ + return (NULL); + case XML_CDATA_SECTION_NODE: + case XML_TEXT_NODE: + if (cur->content != NULL) + return (xmlStrdup(cur->content)); + return (NULL); + } + return (NULL); +} + +/** + * xmlNodeSetContent: + * @cur: the node being modified + * @content: the new value of the content + * + * Replace the content of a node. + * NOTE: @content is supposed to be a piece of XML CDATA, so it allows entity + * references, but XML special chars need to be escaped first by using + * xmlEncodeEntitiesReentrant() resp. xmlEncodeSpecialChars(). + */ +void +xmlNodeSetContent(xmlNodePtr cur, const xmlChar *content) { + if (cur == NULL) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlNodeSetContent : node == NULL\n"); +#endif + return; + } + switch (cur->type) { + case XML_DOCUMENT_FRAG_NODE: + case XML_ELEMENT_NODE: + case XML_ATTRIBUTE_NODE: + if (cur->children != NULL) xmlFreeNodeList(cur->children); + cur->children = xmlStringGetNodeList(cur->doc, content); + UPDATE_LAST_CHILD_AND_PARENT(cur) + break; + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + case XML_ENTITY_REF_NODE: + case XML_ENTITY_NODE: + case XML_PI_NODE: + case XML_COMMENT_NODE: + if ((cur->content != NULL) && + (cur->content != (xmlChar *) &(cur->properties))) { + if (!((cur->doc != NULL) && (cur->doc->dict != NULL) && + (xmlDictOwns(cur->doc->dict, cur->content)))) + xmlFree(cur->content); + } + if (cur->children != NULL) xmlFreeNodeList(cur->children); + cur->last = cur->children = NULL; + if (content != NULL) { + cur->content = xmlStrdup(content); + } else + cur->content = NULL; + cur->properties = NULL; + cur->nsDef = NULL; + break; + case XML_DOCUMENT_NODE: + case XML_HTML_DOCUMENT_NODE: + case XML_DOCUMENT_TYPE_NODE: + case XML_XINCLUDE_START: + case XML_XINCLUDE_END: +#ifdef LIBXML_DOCB_ENABLED + case XML_DOCB_DOCUMENT_NODE: +#endif + break; + case XML_NOTATION_NODE: + break; + case XML_DTD_NODE: + break; + case XML_NAMESPACE_DECL: + break; + case XML_ELEMENT_DECL: + /* TODO !!! */ + break; + case XML_ATTRIBUTE_DECL: + /* TODO !!! */ + break; + case XML_ENTITY_DECL: + /* TODO !!! */ + break; + } +} + +#ifdef LIBXML_TREE_ENABLED +/** + * xmlNodeSetContentLen: + * @cur: the node being modified + * @content: the new value of the content + * @len: the size of @content + * + * Replace the content of a node. + * NOTE: @content is supposed to be a piece of XML CDATA, so it allows entity + * references, but XML special chars need to be escaped first by using + * xmlEncodeEntitiesReentrant() resp. xmlEncodeSpecialChars(). + */ +void +xmlNodeSetContentLen(xmlNodePtr cur, const xmlChar *content, int len) { + if (cur == NULL) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlNodeSetContentLen : node == NULL\n"); +#endif + return; + } + switch (cur->type) { + case XML_DOCUMENT_FRAG_NODE: + case XML_ELEMENT_NODE: + case XML_ATTRIBUTE_NODE: + if (cur->children != NULL) xmlFreeNodeList(cur->children); + cur->children = xmlStringLenGetNodeList(cur->doc, content, len); + UPDATE_LAST_CHILD_AND_PARENT(cur) + break; + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + case XML_ENTITY_REF_NODE: + case XML_ENTITY_NODE: + case XML_PI_NODE: + case XML_COMMENT_NODE: + case XML_NOTATION_NODE: + if ((cur->content != NULL) && + (cur->content != (xmlChar *) &(cur->properties))) { + if (!((cur->doc != NULL) && (cur->doc->dict != NULL) && + (xmlDictOwns(cur->doc->dict, cur->content)))) + xmlFree(cur->content); + } + if (cur->children != NULL) xmlFreeNodeList(cur->children); + cur->children = cur->last = NULL; + if (content != NULL) { + cur->content = xmlStrndup(content, len); + } else + cur->content = NULL; + cur->properties = NULL; + cur->nsDef = NULL; + break; + case XML_DOCUMENT_NODE: + case XML_DTD_NODE: + case XML_HTML_DOCUMENT_NODE: + case XML_DOCUMENT_TYPE_NODE: + case XML_NAMESPACE_DECL: + case XML_XINCLUDE_START: + case XML_XINCLUDE_END: +#ifdef LIBXML_DOCB_ENABLED + case XML_DOCB_DOCUMENT_NODE: +#endif + break; + case XML_ELEMENT_DECL: + /* TODO !!! */ + break; + case XML_ATTRIBUTE_DECL: + /* TODO !!! */ + break; + case XML_ENTITY_DECL: + /* TODO !!! */ + break; + } +} +#endif /* LIBXML_TREE_ENABLED */ + +/** + * xmlNodeAddContentLen: + * @cur: the node being modified + * @content: extra content + * @len: the size of @content + * + * Append the extra substring to the node content. + * NOTE: In contrast to xmlNodeSetContentLen(), @content is supposed to be + * raw text, so unescaped XML special chars are allowed, entity + * references are not supported. + */ +void +xmlNodeAddContentLen(xmlNodePtr cur, const xmlChar *content, int len) { + if (cur == NULL) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlNodeAddContentLen : node == NULL\n"); +#endif + return; + } + if (len <= 0) return; + switch (cur->type) { + case XML_DOCUMENT_FRAG_NODE: + case XML_ELEMENT_NODE: { + xmlNodePtr last, newNode, tmp; + + last = cur->last; + newNode = xmlNewTextLen(content, len); + if (newNode != NULL) { + tmp = xmlAddChild(cur, newNode); + if (tmp != newNode) + return; + if ((last != NULL) && (last->next == newNode)) { + xmlTextMerge(last, newNode); + } + } + break; + } + case XML_ATTRIBUTE_NODE: + break; + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + case XML_ENTITY_REF_NODE: + case XML_ENTITY_NODE: + case XML_PI_NODE: + case XML_COMMENT_NODE: + case XML_NOTATION_NODE: + if (content != NULL) { + if ((cur->content == (xmlChar *) &(cur->properties)) || + ((cur->doc != NULL) && (cur->doc->dict != NULL) && + xmlDictOwns(cur->doc->dict, cur->content))) { + cur->content = xmlStrncatNew(cur->content, content, len); + cur->properties = NULL; + cur->nsDef = NULL; + break; + } + cur->content = xmlStrncat(cur->content, content, len); + } + case XML_DOCUMENT_NODE: + case XML_DTD_NODE: + case XML_HTML_DOCUMENT_NODE: + case XML_DOCUMENT_TYPE_NODE: + case XML_NAMESPACE_DECL: + case XML_XINCLUDE_START: + case XML_XINCLUDE_END: +#ifdef LIBXML_DOCB_ENABLED + case XML_DOCB_DOCUMENT_NODE: +#endif + break; + case XML_ELEMENT_DECL: + case XML_ATTRIBUTE_DECL: + case XML_ENTITY_DECL: + break; + } +} + +/** + * xmlNodeAddContent: + * @cur: the node being modified + * @content: extra content + * + * Append the extra substring to the node content. + * NOTE: In contrast to xmlNodeSetContent(), @content is supposed to be + * raw text, so unescaped XML special chars are allowed, entity + * references are not supported. + */ +void +xmlNodeAddContent(xmlNodePtr cur, const xmlChar *content) { + int len; + + if (cur == NULL) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlNodeAddContent : node == NULL\n"); +#endif + return; + } + if (content == NULL) return; + len = xmlStrlen(content); + xmlNodeAddContentLen(cur, content, len); +} + +/** + * xmlTextMerge: + * @first: the first text node + * @second: the second text node being merged + * + * Merge two text nodes into one + * Returns the first text node augmented + */ +xmlNodePtr +xmlTextMerge(xmlNodePtr first, xmlNodePtr second) { + if (first == NULL) return(second); + if (second == NULL) return(first); + if (first->type != XML_TEXT_NODE) return(first); + if (second->type != XML_TEXT_NODE) return(first); + if (second->name != first->name) + return(first); + xmlNodeAddContent(first, second->content); + xmlUnlinkNode(second); + xmlFreeNode(second); + return(first); +} + +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) +/** + * xmlGetNsList: + * @doc: the document + * @node: the current node + * + * Search all the namespace applying to a given element. + * Returns an NULL terminated array of all the #xmlNsPtr found + * that need to be freed by the caller or NULL if no + * namespace if defined + */ +xmlNsPtr * +xmlGetNsList(xmlDocPtr doc ATTRIBUTE_UNUSED, xmlNodePtr node) +{ + xmlNsPtr cur; + xmlNsPtr *ret = NULL; + int nbns = 0; + int maxns = 10; + int i; + + if ((node == NULL) || (node->type == XML_NAMESPACE_DECL)) + return(NULL); + + while (node != NULL) { + if (node->type == XML_ELEMENT_NODE) { + cur = node->nsDef; + while (cur != NULL) { + if (ret == NULL) { + ret = + (xmlNsPtr *) xmlMalloc((maxns + 1) * + sizeof(xmlNsPtr)); + if (ret == NULL) { + xmlTreeErrMemory("getting namespace list"); + return (NULL); + } + ret[nbns] = NULL; + } + for (i = 0; i < nbns; i++) { + if ((cur->prefix == ret[i]->prefix) || + (xmlStrEqual(cur->prefix, ret[i]->prefix))) + break; + } + if (i >= nbns) { + if (nbns >= maxns) { + maxns *= 2; + ret = (xmlNsPtr *) xmlRealloc(ret, + (maxns + + 1) * + sizeof(xmlNsPtr)); + if (ret == NULL) { + xmlTreeErrMemory("getting namespace list"); + return (NULL); + } + } + ret[nbns++] = cur; + ret[nbns] = NULL; + } + + cur = cur->next; + } + } + node = node->parent; + } + return (ret); +} +#endif /* LIBXML_TREE_ENABLED */ + +/* +* xmlTreeEnsureXMLDecl: +* @doc: the doc +* +* Ensures that there is an XML namespace declaration on the doc. +* +* Returns the XML ns-struct or NULL on API and internal errors. +*/ +static xmlNsPtr +xmlTreeEnsureXMLDecl(xmlDocPtr doc) +{ + if (doc == NULL) + return (NULL); + if (doc->oldNs != NULL) + return (doc->oldNs); + { + xmlNsPtr ns; + ns = (xmlNsPtr) xmlMalloc(sizeof(xmlNs)); + if (ns == NULL) { + xmlTreeErrMemory( + "allocating the XML namespace"); + return (NULL); + } + memset(ns, 0, sizeof(xmlNs)); + ns->type = XML_LOCAL_NAMESPACE; + ns->href = xmlStrdup(XML_XML_NAMESPACE); + ns->prefix = xmlStrdup((const xmlChar *)"xml"); + doc->oldNs = ns; + return (ns); + } +} + +/** + * xmlSearchNs: + * @doc: the document + * @node: the current node + * @nameSpace: the namespace prefix + * + * Search a Ns registered under a given name space for a document. + * recurse on the parents until it finds the defined namespace + * or return NULL otherwise. + * @nameSpace can be NULL, this is a search for the default namespace. + * We don't allow to cross entities boundaries. If you don't declare + * the namespace within those you will be in troubles !!! A warning + * is generated to cover this case. + * + * Returns the namespace pointer or NULL. + */ +xmlNsPtr +xmlSearchNs(xmlDocPtr doc, xmlNodePtr node, const xmlChar *nameSpace) { + + xmlNsPtr cur; + xmlNodePtr orig = node; + + if ((node == NULL) || (node->type == XML_NAMESPACE_DECL)) return(NULL); + if ((nameSpace != NULL) && + (xmlStrEqual(nameSpace, (const xmlChar *)"xml"))) { + if ((doc == NULL) && (node->type == XML_ELEMENT_NODE)) { + /* + * The XML-1.0 namespace is normally held on the root + * element. In this case exceptionally create it on the + * node element. + */ + cur = (xmlNsPtr) xmlMalloc(sizeof(xmlNs)); + if (cur == NULL) { + xmlTreeErrMemory("searching namespace"); + return(NULL); + } + memset(cur, 0, sizeof(xmlNs)); + cur->type = XML_LOCAL_NAMESPACE; + cur->href = xmlStrdup(XML_XML_NAMESPACE); + cur->prefix = xmlStrdup((const xmlChar *)"xml"); + cur->next = node->nsDef; + node->nsDef = cur; + return(cur); + } + if (doc == NULL) { + doc = node->doc; + if (doc == NULL) + return(NULL); + } + /* + * Return the XML namespace declaration held by the doc. + */ + if (doc->oldNs == NULL) + return(xmlTreeEnsureXMLDecl(doc)); + else + return(doc->oldNs); + } + while (node != NULL) { + if ((node->type == XML_ENTITY_REF_NODE) || + (node->type == XML_ENTITY_NODE) || + (node->type == XML_ENTITY_DECL)) + return(NULL); + if (node->type == XML_ELEMENT_NODE) { + cur = node->nsDef; + while (cur != NULL) { + if ((cur->prefix == NULL) && (nameSpace == NULL) && + (cur->href != NULL)) + return(cur); + if ((cur->prefix != NULL) && (nameSpace != NULL) && + (cur->href != NULL) && + (xmlStrEqual(cur->prefix, nameSpace))) + return(cur); + cur = cur->next; + } + if (orig != node) { + cur = node->ns; + if (cur != NULL) { + if ((cur->prefix == NULL) && (nameSpace == NULL) && + (cur->href != NULL)) + return(cur); + if ((cur->prefix != NULL) && (nameSpace != NULL) && + (cur->href != NULL) && + (xmlStrEqual(cur->prefix, nameSpace))) + return(cur); + } + } + } + node = node->parent; + } + return(NULL); +} + +/** + * xmlNsInScope: + * @doc: the document + * @node: the current node + * @ancestor: the ancestor carrying the namespace + * @prefix: the namespace prefix + * + * Verify that the given namespace held on @ancestor is still in scope + * on node. + * + * Returns 1 if true, 0 if false and -1 in case of error. + */ +static int +xmlNsInScope(xmlDocPtr doc ATTRIBUTE_UNUSED, xmlNodePtr node, + xmlNodePtr ancestor, const xmlChar * prefix) +{ + xmlNsPtr tst; + + while ((node != NULL) && (node != ancestor)) { + if ((node->type == XML_ENTITY_REF_NODE) || + (node->type == XML_ENTITY_NODE) || + (node->type == XML_ENTITY_DECL)) + return (-1); + if (node->type == XML_ELEMENT_NODE) { + tst = node->nsDef; + while (tst != NULL) { + if ((tst->prefix == NULL) + && (prefix == NULL)) + return (0); + if ((tst->prefix != NULL) + && (prefix != NULL) + && (xmlStrEqual(tst->prefix, prefix))) + return (0); + tst = tst->next; + } + } + node = node->parent; + } + if (node != ancestor) + return (-1); + return (1); +} + +/** + * xmlSearchNsByHref: + * @doc: the document + * @node: the current node + * @href: the namespace value + * + * Search a Ns aliasing a given URI. Recurse on the parents until it finds + * the defined namespace or return NULL otherwise. + * Returns the namespace pointer or NULL. + */ +xmlNsPtr +xmlSearchNsByHref(xmlDocPtr doc, xmlNodePtr node, const xmlChar * href) +{ + xmlNsPtr cur; + xmlNodePtr orig = node; + int is_attr; + + if ((node == NULL) || (node->type == XML_NAMESPACE_DECL) || (href == NULL)) + return (NULL); + if (xmlStrEqual(href, XML_XML_NAMESPACE)) { + /* + * Only the document can hold the XML spec namespace. + */ + if ((doc == NULL) && (node->type == XML_ELEMENT_NODE)) { + /* + * The XML-1.0 namespace is normally held on the root + * element. In this case exceptionally create it on the + * node element. + */ + cur = (xmlNsPtr) xmlMalloc(sizeof(xmlNs)); + if (cur == NULL) { + xmlTreeErrMemory("searching namespace"); + return (NULL); + } + memset(cur, 0, sizeof(xmlNs)); + cur->type = XML_LOCAL_NAMESPACE; + cur->href = xmlStrdup(XML_XML_NAMESPACE); + cur->prefix = xmlStrdup((const xmlChar *) "xml"); + cur->next = node->nsDef; + node->nsDef = cur; + return (cur); + } + if (doc == NULL) { + doc = node->doc; + if (doc == NULL) + return(NULL); + } + /* + * Return the XML namespace declaration held by the doc. + */ + if (doc->oldNs == NULL) + return(xmlTreeEnsureXMLDecl(doc)); + else + return(doc->oldNs); + } + is_attr = (node->type == XML_ATTRIBUTE_NODE); + while (node != NULL) { + if ((node->type == XML_ENTITY_REF_NODE) || + (node->type == XML_ENTITY_NODE) || + (node->type == XML_ENTITY_DECL)) + return (NULL); + if (node->type == XML_ELEMENT_NODE) { + cur = node->nsDef; + while (cur != NULL) { + if ((cur->href != NULL) && (href != NULL) && + (xmlStrEqual(cur->href, href))) { + if (((!is_attr) || (cur->prefix != NULL)) && + (xmlNsInScope(doc, orig, node, cur->prefix) == 1)) + return (cur); + } + cur = cur->next; + } + if (orig != node) { + cur = node->ns; + if (cur != NULL) { + if ((cur->href != NULL) && (href != NULL) && + (xmlStrEqual(cur->href, href))) { + if (((!is_attr) || (cur->prefix != NULL)) && + (xmlNsInScope(doc, orig, node, cur->prefix) == 1)) + return (cur); + } + } + } + } + node = node->parent; + } + return (NULL); +} + +/** + * xmlNewReconciliedNs: + * @doc: the document + * @tree: a node expected to hold the new namespace + * @ns: the original namespace + * + * This function tries to locate a namespace definition in a tree + * ancestors, or create a new namespace definition node similar to + * @ns trying to reuse the same prefix. However if the given prefix is + * null (default namespace) or reused within the subtree defined by + * @tree or on one of its ancestors then a new prefix is generated. + * Returns the (new) namespace definition or NULL in case of error + */ +static xmlNsPtr +xmlNewReconciliedNs(xmlDocPtr doc, xmlNodePtr tree, xmlNsPtr ns) { + xmlNsPtr def; + xmlChar prefix[50]; + int counter = 1; + + if ((tree == NULL) || (tree->type != XML_ELEMENT_NODE)) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlNewReconciliedNs : tree == NULL\n"); +#endif + return(NULL); + } + if ((ns == NULL) || (ns->type != XML_NAMESPACE_DECL)) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlNewReconciliedNs : ns == NULL\n"); +#endif + return(NULL); + } + /* + * Search an existing namespace definition inherited. + */ + def = xmlSearchNsByHref(doc, tree, ns->href); + if (def != NULL) + return(def); + + /* + * Find a close prefix which is not already in use. + * Let's strip namespace prefixes longer than 20 chars ! + */ + if (ns->prefix == NULL) + snprintf((char *) prefix, sizeof(prefix), "default"); + else + snprintf((char *) prefix, sizeof(prefix), "%.20s", (char *)ns->prefix); + + def = xmlSearchNs(doc, tree, prefix); + while (def != NULL) { + if (counter > 1000) return(NULL); + if (ns->prefix == NULL) + snprintf((char *) prefix, sizeof(prefix), "default%d", counter++); + else + snprintf((char *) prefix, sizeof(prefix), "%.20s%d", + (char *)ns->prefix, counter++); + def = xmlSearchNs(doc, tree, prefix); + } + + /* + * OK, now we are ready to create a new one. + */ + def = xmlNewNs(tree, ns->href, prefix); + return(def); +} + +#ifdef LIBXML_TREE_ENABLED +/** + * xmlReconciliateNs: + * @doc: the document + * @tree: a node defining the subtree to reconciliate + * + * This function checks that all the namespaces declared within the given + * tree are properly declared. This is needed for example after Copy or Cut + * and then paste operations. The subtree may still hold pointers to + * namespace declarations outside the subtree or invalid/masked. As much + * as possible the function try to reuse the existing namespaces found in + * the new environment. If not possible the new namespaces are redeclared + * on @tree at the top of the given subtree. + * Returns the number of namespace declarations created or -1 in case of error. + */ +int +xmlReconciliateNs(xmlDocPtr doc, xmlNodePtr tree) { + xmlNsPtr *oldNs = NULL; + xmlNsPtr *newNs = NULL; + int sizeCache = 0; + int nbCache = 0; + + xmlNsPtr n; + xmlNodePtr node = tree; + xmlAttrPtr attr; + int ret = 0, i; + + if ((node == NULL) || (node->type != XML_ELEMENT_NODE)) return(-1); + if ((doc == NULL) || (doc->type != XML_DOCUMENT_NODE)) return(-1); + if (node->doc != doc) return(-1); + while (node != NULL) { + /* + * Reconciliate the node namespace + */ + if (node->ns != NULL) { + /* + * initialize the cache if needed + */ + if (sizeCache == 0) { + sizeCache = 10; + oldNs = (xmlNsPtr *) xmlMalloc(sizeCache * + sizeof(xmlNsPtr)); + if (oldNs == NULL) { + xmlTreeErrMemory("fixing namespaces"); + return(-1); + } + newNs = (xmlNsPtr *) xmlMalloc(sizeCache * + sizeof(xmlNsPtr)); + if (newNs == NULL) { + xmlTreeErrMemory("fixing namespaces"); + xmlFree(oldNs); + return(-1); + } + } + for (i = 0;i < nbCache;i++) { + if (oldNs[i] == node->ns) { + node->ns = newNs[i]; + break; + } + } + if (i == nbCache) { + /* + * OK we need to recreate a new namespace definition + */ + n = xmlNewReconciliedNs(doc, tree, node->ns); + if (n != NULL) { /* :-( what if else ??? */ + /* + * check if we need to grow the cache buffers. + */ + if (sizeCache <= nbCache) { + sizeCache *= 2; + oldNs = (xmlNsPtr *) xmlRealloc(oldNs, sizeCache * + sizeof(xmlNsPtr)); + if (oldNs == NULL) { + xmlTreeErrMemory("fixing namespaces"); + xmlFree(newNs); + return(-1); + } + newNs = (xmlNsPtr *) xmlRealloc(newNs, sizeCache * + sizeof(xmlNsPtr)); + if (newNs == NULL) { + xmlTreeErrMemory("fixing namespaces"); + xmlFree(oldNs); + return(-1); + } + } + newNs[nbCache] = n; + oldNs[nbCache++] = node->ns; + node->ns = n; + } + } + } + /* + * now check for namespace hold by attributes on the node. + */ + if (node->type == XML_ELEMENT_NODE) { + attr = node->properties; + while (attr != NULL) { + if (attr->ns != NULL) { + /* + * initialize the cache if needed + */ + if (sizeCache == 0) { + sizeCache = 10; + oldNs = (xmlNsPtr *) xmlMalloc(sizeCache * + sizeof(xmlNsPtr)); + if (oldNs == NULL) { + xmlTreeErrMemory("fixing namespaces"); + return(-1); + } + newNs = (xmlNsPtr *) xmlMalloc(sizeCache * + sizeof(xmlNsPtr)); + if (newNs == NULL) { + xmlTreeErrMemory("fixing namespaces"); + xmlFree(oldNs); + return(-1); + } + } + for (i = 0;i < nbCache;i++) { + if (oldNs[i] == attr->ns) { + attr->ns = newNs[i]; + break; + } + } + if (i == nbCache) { + /* + * OK we need to recreate a new namespace definition + */ + n = xmlNewReconciliedNs(doc, tree, attr->ns); + if (n != NULL) { /* :-( what if else ??? */ + /* + * check if we need to grow the cache buffers. + */ + if (sizeCache <= nbCache) { + sizeCache *= 2; + oldNs = (xmlNsPtr *) xmlRealloc(oldNs, + sizeCache * sizeof(xmlNsPtr)); + if (oldNs == NULL) { + xmlTreeErrMemory("fixing namespaces"); + xmlFree(newNs); + return(-1); + } + newNs = (xmlNsPtr *) xmlRealloc(newNs, + sizeCache * sizeof(xmlNsPtr)); + if (newNs == NULL) { + xmlTreeErrMemory("fixing namespaces"); + xmlFree(oldNs); + return(-1); + } + } + newNs[nbCache] = n; + oldNs[nbCache++] = attr->ns; + attr->ns = n; + } + } + } + attr = attr->next; + } + } + + /* + * Browse the full subtree, deep first + */ + if ((node->children != NULL) && (node->type != XML_ENTITY_REF_NODE)) { + /* deep first */ + node = node->children; + } else if ((node != tree) && (node->next != NULL)) { + /* then siblings */ + node = node->next; + } else if (node != tree) { + /* go up to parents->next if needed */ + while (node != tree) { + if (node->parent != NULL) + node = node->parent; + if ((node != tree) && (node->next != NULL)) { + node = node->next; + break; + } + if (node->parent == NULL) { + node = NULL; + break; + } + } + /* exit condition */ + if (node == tree) + node = NULL; + } else + break; + } + if (oldNs != NULL) + xmlFree(oldNs); + if (newNs != NULL) + xmlFree(newNs); + return(ret); +} +#endif /* LIBXML_TREE_ENABLED */ + +static xmlAttrPtr +xmlGetPropNodeInternal(xmlNodePtr node, const xmlChar *name, + const xmlChar *nsName, int useDTD) +{ + xmlAttrPtr prop; + + if ((node == NULL) || (node->type != XML_ELEMENT_NODE) || (name == NULL)) + return(NULL); + + if (node->properties != NULL) { + prop = node->properties; + if (nsName == NULL) { + /* + * We want the attr to be in no namespace. + */ + do { + if ((prop->ns == NULL) && xmlStrEqual(prop->name, name)) { + return(prop); + } + prop = prop->next; + } while (prop != NULL); + } else { + /* + * We want the attr to be in the specified namespace. + */ + do { + if ((prop->ns != NULL) && xmlStrEqual(prop->name, name) && + ((prop->ns->href == nsName) || + xmlStrEqual(prop->ns->href, nsName))) + { + return(prop); + } + prop = prop->next; + } while (prop != NULL); + } + } + +#ifdef LIBXML_TREE_ENABLED + if (! useDTD) + return(NULL); + /* + * Check if there is a default/fixed attribute declaration in + * the internal or external subset. + */ + if ((node->doc != NULL) && (node->doc->intSubset != NULL)) { + xmlDocPtr doc = node->doc; + xmlAttributePtr attrDecl = NULL; + xmlChar *elemQName, *tmpstr = NULL; + + /* + * We need the QName of the element for the DTD-lookup. + */ + if ((node->ns != NULL) && (node->ns->prefix != NULL)) { + tmpstr = xmlStrdup(node->ns->prefix); + tmpstr = xmlStrcat(tmpstr, BAD_CAST ":"); + tmpstr = xmlStrcat(tmpstr, node->name); + if (tmpstr == NULL) + return(NULL); + elemQName = tmpstr; + } else + elemQName = (xmlChar *) node->name; + if (nsName == NULL) { + /* + * The common and nice case: Attr in no namespace. + */ + attrDecl = xmlGetDtdQAttrDesc(doc->intSubset, + elemQName, name, NULL); + if ((attrDecl == NULL) && (doc->extSubset != NULL)) { + attrDecl = xmlGetDtdQAttrDesc(doc->extSubset, + elemQName, name, NULL); + } + } else { + xmlNsPtr *nsList, *cur; + + /* + * The ugly case: Search using the prefixes of in-scope + * ns-decls corresponding to @nsName. + */ + nsList = xmlGetNsList(node->doc, node); + if (nsList == NULL) { + if (tmpstr != NULL) + xmlFree(tmpstr); + return(NULL); + } + cur = nsList; + while (*cur != NULL) { + if (xmlStrEqual((*cur)->href, nsName)) { + attrDecl = xmlGetDtdQAttrDesc(doc->intSubset, elemQName, + name, (*cur)->prefix); + if (attrDecl) + break; + if (doc->extSubset != NULL) { + attrDecl = xmlGetDtdQAttrDesc(doc->extSubset, elemQName, + name, (*cur)->prefix); + if (attrDecl) + break; + } + } + cur++; + } + xmlFree(nsList); + } + if (tmpstr != NULL) + xmlFree(tmpstr); + /* + * Only default/fixed attrs are relevant. + */ + if ((attrDecl != NULL) && (attrDecl->defaultValue != NULL)) + return((xmlAttrPtr) attrDecl); + } +#endif /* LIBXML_TREE_ENABLED */ + return(NULL); +} + +static xmlChar* +xmlGetPropNodeValueInternal(xmlAttrPtr prop) +{ + if (prop == NULL) + return(NULL); + if (prop->type == XML_ATTRIBUTE_NODE) { + /* + * Note that we return at least the empty string. + * TODO: Do we really always want that? + */ + if (prop->children != NULL) { + if ((prop->children->next == NULL) && + ((prop->children->type == XML_TEXT_NODE) || + (prop->children->type == XML_CDATA_SECTION_NODE))) + { + /* + * Optimization for the common case: only 1 text node. + */ + return(xmlStrdup(prop->children->content)); + } else { + xmlChar *ret; + + ret = xmlNodeListGetString(prop->doc, prop->children, 1); + if (ret != NULL) + return(ret); + } + } + return(xmlStrdup((xmlChar *)"")); + } else if (prop->type == XML_ATTRIBUTE_DECL) { + return(xmlStrdup(((xmlAttributePtr)prop)->defaultValue)); + } + return(NULL); +} + +/** + * xmlHasProp: + * @node: the node + * @name: the attribute name + * + * Search an attribute associated to a node + * This function also looks in DTD attribute declaration for #FIXED or + * default declaration values unless DTD use has been turned off. + * + * Returns the attribute or the attribute declaration or NULL if + * neither was found. + */ +xmlAttrPtr +xmlHasProp(xmlNodePtr node, const xmlChar *name) { + xmlAttrPtr prop; + xmlDocPtr doc; + + if ((node == NULL) || (node->type != XML_ELEMENT_NODE) || (name == NULL)) + return(NULL); + /* + * Check on the properties attached to the node + */ + prop = node->properties; + while (prop != NULL) { + if (xmlStrEqual(prop->name, name)) { + return(prop); + } + prop = prop->next; + } + if (!xmlCheckDTD) return(NULL); + + /* + * Check if there is a default declaration in the internal + * or external subsets + */ + doc = node->doc; + if (doc != NULL) { + xmlAttributePtr attrDecl; + if (doc->intSubset != NULL) { + attrDecl = xmlGetDtdAttrDesc(doc->intSubset, node->name, name); + if ((attrDecl == NULL) && (doc->extSubset != NULL)) + attrDecl = xmlGetDtdAttrDesc(doc->extSubset, node->name, name); + if ((attrDecl != NULL) && (attrDecl->defaultValue != NULL)) + /* return attribute declaration only if a default value is given + (that includes #FIXED declarations) */ + return((xmlAttrPtr) attrDecl); + } + } + return(NULL); +} + +/** + * xmlHasNsProp: + * @node: the node + * @name: the attribute name + * @nameSpace: the URI of the namespace + * + * Search for an attribute associated to a node + * This attribute has to be anchored in the namespace specified. + * This does the entity substitution. + * This function looks in DTD attribute declaration for #FIXED or + * default declaration values unless DTD use has been turned off. + * Note that a namespace of NULL indicates to use the default namespace. + * + * Returns the attribute or the attribute declaration or NULL + * if neither was found. + */ +xmlAttrPtr +xmlHasNsProp(xmlNodePtr node, const xmlChar *name, const xmlChar *nameSpace) { + + return(xmlGetPropNodeInternal(node, name, nameSpace, xmlCheckDTD)); +} + +/** + * xmlGetProp: + * @node: the node + * @name: the attribute name + * + * Search and get the value of an attribute associated to a node + * This does the entity substitution. + * This function looks in DTD attribute declaration for #FIXED or + * default declaration values unless DTD use has been turned off. + * NOTE: this function acts independently of namespaces associated + * to the attribute. Use xmlGetNsProp() or xmlGetNoNsProp() + * for namespace aware processing. + * + * Returns the attribute value or NULL if not found. + * It's up to the caller to free the memory with xmlFree(). + */ +xmlChar * +xmlGetProp(xmlNodePtr node, const xmlChar *name) { + xmlAttrPtr prop; + + prop = xmlHasProp(node, name); + if (prop == NULL) + return(NULL); + return(xmlGetPropNodeValueInternal(prop)); +} + +/** + * xmlGetNoNsProp: + * @node: the node + * @name: the attribute name + * + * Search and get the value of an attribute associated to a node + * This does the entity substitution. + * This function looks in DTD attribute declaration for #FIXED or + * default declaration values unless DTD use has been turned off. + * This function is similar to xmlGetProp except it will accept only + * an attribute in no namespace. + * + * Returns the attribute value or NULL if not found. + * It's up to the caller to free the memory with xmlFree(). + */ +xmlChar * +xmlGetNoNsProp(xmlNodePtr node, const xmlChar *name) { + xmlAttrPtr prop; + + prop = xmlGetPropNodeInternal(node, name, NULL, xmlCheckDTD); + if (prop == NULL) + return(NULL); + return(xmlGetPropNodeValueInternal(prop)); +} + +/** + * xmlGetNsProp: + * @node: the node + * @name: the attribute name + * @nameSpace: the URI of the namespace + * + * Search and get the value of an attribute associated to a node + * This attribute has to be anchored in the namespace specified. + * This does the entity substitution. + * This function looks in DTD attribute declaration for #FIXED or + * default declaration values unless DTD use has been turned off. + * + * Returns the attribute value or NULL if not found. + * It's up to the caller to free the memory with xmlFree(). + */ +xmlChar * +xmlGetNsProp(xmlNodePtr node, const xmlChar *name, const xmlChar *nameSpace) { + xmlAttrPtr prop; + + prop = xmlGetPropNodeInternal(node, name, nameSpace, xmlCheckDTD); + if (prop == NULL) + return(NULL); + return(xmlGetPropNodeValueInternal(prop)); +} + +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) +/** + * xmlUnsetProp: + * @node: the node + * @name: the attribute name + * + * Remove an attribute carried by a node. + * This handles only attributes in no namespace. + * Returns 0 if successful, -1 if not found + */ +int +xmlUnsetProp(xmlNodePtr node, const xmlChar *name) { + xmlAttrPtr prop; + + prop = xmlGetPropNodeInternal(node, name, NULL, 0); + if (prop == NULL) + return(-1); + xmlUnlinkNode((xmlNodePtr) prop); + xmlFreeProp(prop); + return(0); +} + +/** + * xmlUnsetNsProp: + * @node: the node + * @ns: the namespace definition + * @name: the attribute name + * + * Remove an attribute carried by a node. + * Returns 0 if successful, -1 if not found + */ +int +xmlUnsetNsProp(xmlNodePtr node, xmlNsPtr ns, const xmlChar *name) { + xmlAttrPtr prop; + + prop = xmlGetPropNodeInternal(node, name, (ns != NULL) ? ns->href : NULL, 0); + if (prop == NULL) + return(-1); + xmlUnlinkNode((xmlNodePtr) prop); + xmlFreeProp(prop); + return(0); +} +#endif + +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_HTML_ENABLED) +/** + * xmlSetProp: + * @node: the node + * @name: the attribute name (a QName) + * @value: the attribute value + * + * Set (or reset) an attribute carried by a node. + * If @name has a prefix, then the corresponding + * namespace-binding will be used, if in scope; it is an + * error it there's no such ns-binding for the prefix in + * scope. + * Returns the attribute pointer. + * + */ +xmlAttrPtr +xmlSetProp(xmlNodePtr node, const xmlChar *name, const xmlChar *value) { + int len; + const xmlChar *nqname; + + if ((node == NULL) || (name == NULL) || (node->type != XML_ELEMENT_NODE)) + return(NULL); + + /* + * handle QNames + */ + nqname = xmlSplitQName3(name, &len); + if (nqname != NULL) { + xmlNsPtr ns; + xmlChar *prefix = xmlStrndup(name, len); + ns = xmlSearchNs(node->doc, node, prefix); + if (prefix != NULL) + xmlFree(prefix); + if (ns != NULL) + return(xmlSetNsProp(node, ns, nqname, value)); + } + return(xmlSetNsProp(node, NULL, name, value)); +} + +/** + * xmlSetNsProp: + * @node: the node + * @ns: the namespace definition + * @name: the attribute name + * @value: the attribute value + * + * Set (or reset) an attribute carried by a node. + * The ns structure must be in scope, this is not checked + * + * Returns the attribute pointer. + */ +xmlAttrPtr +xmlSetNsProp(xmlNodePtr node, xmlNsPtr ns, const xmlChar *name, + const xmlChar *value) +{ + xmlAttrPtr prop; + + if (ns && (ns->href == NULL)) + return(NULL); + prop = xmlGetPropNodeInternal(node, name, (ns != NULL) ? ns->href : NULL, 0); + if (prop != NULL) { + /* + * Modify the attribute's value. + */ + if (prop->atype == XML_ATTRIBUTE_ID) { + xmlRemoveID(node->doc, prop); + prop->atype = XML_ATTRIBUTE_ID; + } + if (prop->children != NULL) + xmlFreeNodeList(prop->children); + prop->children = NULL; + prop->last = NULL; + prop->ns = ns; + if (value != NULL) { + xmlNodePtr tmp; + + if(!xmlCheckUTF8(value)) { + xmlTreeErr(XML_TREE_NOT_UTF8, (xmlNodePtr) node->doc, + NULL); + if (node->doc != NULL) + node->doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1"); + } + prop->children = xmlNewDocText(node->doc, value); + prop->last = NULL; + tmp = prop->children; + while (tmp != NULL) { + tmp->parent = (xmlNodePtr) prop; + if (tmp->next == NULL) + prop->last = tmp; + tmp = tmp->next; + } + } + if (prop->atype == XML_ATTRIBUTE_ID) + xmlAddID(NULL, node->doc, value, prop); + return(prop); + } + /* + * No equal attr found; create a new one. + */ + return(xmlNewPropInternal(node, ns, name, value, 0)); +} + +#endif /* LIBXML_TREE_ENABLED */ + +/** + * xmlNodeIsText: + * @node: the node + * + * Is this node a Text node ? + * Returns 1 yes, 0 no + */ +int +xmlNodeIsText(xmlNodePtr node) { + if (node == NULL) return(0); + + if (node->type == XML_TEXT_NODE) return(1); + return(0); +} + +/** + * xmlIsBlankNode: + * @node: the node + * + * Checks whether this node is an empty or whitespace only + * (and possibly ignorable) text-node. + * + * Returns 1 yes, 0 no + */ +int +xmlIsBlankNode(xmlNodePtr node) { + const xmlChar *cur; + if (node == NULL) return(0); + + if ((node->type != XML_TEXT_NODE) && + (node->type != XML_CDATA_SECTION_NODE)) + return(0); + if (node->content == NULL) return(1); + cur = node->content; + while (*cur != 0) { + if (!IS_BLANK_CH(*cur)) return(0); + cur++; + } + + return(1); +} + +/** + * xmlTextConcat: + * @node: the node + * @content: the content + * @len: @content length + * + * Concat the given string at the end of the existing node content + * + * Returns -1 in case of error, 0 otherwise + */ + +int +xmlTextConcat(xmlNodePtr node, const xmlChar *content, int len) { + if (node == NULL) return(-1); + + if ((node->type != XML_TEXT_NODE) && + (node->type != XML_CDATA_SECTION_NODE) && + (node->type != XML_COMMENT_NODE) && + (node->type != XML_PI_NODE)) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlTextConcat: node is not text nor CDATA\n"); +#endif + return(-1); + } + /* need to check if content is currently in the dictionary */ + if ((node->content == (xmlChar *) &(node->properties)) || + ((node->doc != NULL) && (node->doc->dict != NULL) && + xmlDictOwns(node->doc->dict, node->content))) { + node->content = xmlStrncatNew(node->content, content, len); + } else { + node->content = xmlStrncat(node->content, content, len); + } + node->properties = NULL; + if (node->content == NULL) + return(-1); + return(0); +} + +/************************************************************************ + * * + * Output : to a FILE or in memory * + * * + ************************************************************************/ + +/** + * xmlBufferCreate: + * + * routine to create an XML buffer. + * returns the new structure. + */ +xmlBufferPtr +xmlBufferCreate(void) { + xmlBufferPtr ret; + + ret = (xmlBufferPtr) xmlMalloc(sizeof(xmlBuffer)); + if (ret == NULL) { + xmlTreeErrMemory("creating buffer"); + return(NULL); + } + ret->use = 0; + ret->size = xmlDefaultBufferSize; + ret->alloc = xmlBufferAllocScheme; + ret->content = (xmlChar *) xmlMallocAtomic(ret->size * sizeof(xmlChar)); + if (ret->content == NULL) { + xmlTreeErrMemory("creating buffer"); + xmlFree(ret); + return(NULL); + } + ret->content[0] = 0; + ret->contentIO = NULL; + return(ret); +} + +/** + * xmlBufferCreateSize: + * @size: initial size of buffer + * + * routine to create an XML buffer. + * returns the new structure. + */ +xmlBufferPtr +xmlBufferCreateSize(size_t size) { + xmlBufferPtr ret; + + ret = (xmlBufferPtr) xmlMalloc(sizeof(xmlBuffer)); + if (ret == NULL) { + xmlTreeErrMemory("creating buffer"); + return(NULL); + } + ret->use = 0; + ret->alloc = xmlBufferAllocScheme; + ret->size = (size ? size+2 : 0); /* +1 for ending null */ + if (ret->size){ + ret->content = (xmlChar *) xmlMallocAtomic(ret->size * sizeof(xmlChar)); + if (ret->content == NULL) { + xmlTreeErrMemory("creating buffer"); + xmlFree(ret); + return(NULL); + } + ret->content[0] = 0; + } else + ret->content = NULL; + ret->contentIO = NULL; + return(ret); +} + +/** + * xmlBufferDetach: + * @buf: the buffer + * + * Remove the string contained in a buffer and gie it back to the + * caller. The buffer is reset to an empty content. + * This doesn't work with immutable buffers as they can't be reset. + * + * Returns the previous string contained by the buffer. + */ +xmlChar * +xmlBufferDetach(xmlBufferPtr buf) { + xmlChar *ret; + + if (buf == NULL) + return(NULL); + if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) + return(NULL); + + ret = buf->content; + buf->content = NULL; + buf->size = 0; + buf->use = 0; + + return ret; +} + + +/** + * xmlBufferCreateStatic: + * @mem: the memory area + * @size: the size in byte + * + * routine to create an XML buffer from an immutable memory area. + * The area won't be modified nor copied, and is expected to be + * present until the end of the buffer lifetime. + * + * returns the new structure. + */ +xmlBufferPtr +xmlBufferCreateStatic(void *mem, size_t size) { + xmlBufferPtr ret; + + if ((mem == NULL) || (size == 0)) + return(NULL); + + ret = (xmlBufferPtr) xmlMalloc(sizeof(xmlBuffer)); + if (ret == NULL) { + xmlTreeErrMemory("creating buffer"); + return(NULL); + } + ret->use = size; + ret->size = size; + ret->alloc = XML_BUFFER_ALLOC_IMMUTABLE; + ret->content = (xmlChar *) mem; + return(ret); +} + +/** + * xmlBufferSetAllocationScheme: + * @buf: the buffer to tune + * @scheme: allocation scheme to use + * + * Sets the allocation scheme for this buffer + */ +void +xmlBufferSetAllocationScheme(xmlBufferPtr buf, + xmlBufferAllocationScheme scheme) { + if (buf == NULL) { +#ifdef DEBUG_BUFFER + xmlGenericError(xmlGenericErrorContext, + "xmlBufferSetAllocationScheme: buf == NULL\n"); +#endif + return; + } + if ((buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) || + (buf->alloc == XML_BUFFER_ALLOC_IO)) return; + if ((scheme == XML_BUFFER_ALLOC_DOUBLEIT) || + (scheme == XML_BUFFER_ALLOC_EXACT) || + (scheme == XML_BUFFER_ALLOC_HYBRID) || + (scheme == XML_BUFFER_ALLOC_IMMUTABLE)) + buf->alloc = scheme; +} + +/** + * xmlBufferFree: + * @buf: the buffer to free + * + * Frees an XML buffer. It frees both the content and the structure which + * encapsulate it. + */ +void +xmlBufferFree(xmlBufferPtr buf) { + if (buf == NULL) { +#ifdef DEBUG_BUFFER + xmlGenericError(xmlGenericErrorContext, + "xmlBufferFree: buf == NULL\n"); +#endif + return; + } + + if ((buf->alloc == XML_BUFFER_ALLOC_IO) && + (buf->contentIO != NULL)) { + xmlFree(buf->contentIO); + } else if ((buf->content != NULL) && + (buf->alloc != XML_BUFFER_ALLOC_IMMUTABLE)) { + xmlFree(buf->content); + } + xmlFree(buf); +} + +/** + * xmlBufferEmpty: + * @buf: the buffer + * + * empty a buffer. + */ +void +xmlBufferEmpty(xmlBufferPtr buf) { + if (buf == NULL) return; + if (buf->content == NULL) return; + buf->use = 0; + if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) { + buf->content = BAD_CAST ""; + } else if ((buf->alloc == XML_BUFFER_ALLOC_IO) && + (buf->contentIO != NULL)) { + size_t start_buf = buf->content - buf->contentIO; + + buf->size += start_buf; + buf->content = buf->contentIO; + buf->content[0] = 0; + } else { + buf->content[0] = 0; + } +} + +/** + * xmlBufferShrink: + * @buf: the buffer to dump + * @len: the number of xmlChar to remove + * + * Remove the beginning of an XML buffer. + * + * Returns the number of #xmlChar removed, or -1 in case of failure. + */ +int +xmlBufferShrink(xmlBufferPtr buf, unsigned int len) { + if (buf == NULL) return(-1); + if (len == 0) return(0); + if (len > buf->use) return(-1); + + buf->use -= len; + if ((buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) || + ((buf->alloc == XML_BUFFER_ALLOC_IO) && (buf->contentIO != NULL))) { + /* + * we just move the content pointer, but also make sure + * the perceived buffer size has shrinked accordingly + */ + buf->content += len; + buf->size -= len; + + /* + * sometimes though it maybe be better to really shrink + * on IO buffers + */ + if ((buf->alloc == XML_BUFFER_ALLOC_IO) && (buf->contentIO != NULL)) { + size_t start_buf = buf->content - buf->contentIO; + if (start_buf >= buf->size) { + memmove(buf->contentIO, &buf->content[0], buf->use); + buf->content = buf->contentIO; + buf->content[buf->use] = 0; + buf->size += start_buf; + } + } + } else { + memmove(buf->content, &buf->content[len], buf->use); + buf->content[buf->use] = 0; + } + return(len); +} + +/** + * xmlBufferGrow: + * @buf: the buffer + * @len: the minimum free size to allocate + * + * Grow the available space of an XML buffer. + * + * Returns the new available space or -1 in case of error + */ +int +xmlBufferGrow(xmlBufferPtr buf, unsigned int len) { + int size; + xmlChar *newbuf; + + if (buf == NULL) return(-1); + + if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return(0); + if (len + buf->use < buf->size) return(0); + + /* + * Windows has a BIG problem on realloc timing, so we try to double + * the buffer size (if that's enough) (bug 146697) + * Apparently BSD too, and it's probably best for linux too + * On an embedded system this may be something to change + */ +#if 1 + if (buf->size > len) + size = buf->size * 2; + else + size = buf->use + len + 100; +#else + size = buf->use + len + 100; +#endif + + if ((buf->alloc == XML_BUFFER_ALLOC_IO) && (buf->contentIO != NULL)) { + size_t start_buf = buf->content - buf->contentIO; + + newbuf = (xmlChar *) xmlRealloc(buf->contentIO, start_buf + size); + if (newbuf == NULL) { + xmlTreeErrMemory("growing buffer"); + return(-1); + } + buf->contentIO = newbuf; + buf->content = newbuf + start_buf; + } else { + newbuf = (xmlChar *) xmlRealloc(buf->content, size); + if (newbuf == NULL) { + xmlTreeErrMemory("growing buffer"); + return(-1); + } + buf->content = newbuf; + } + buf->size = size; + return(buf->size - buf->use); +} + +/** + * xmlBufferDump: + * @file: the file output + * @buf: the buffer to dump + * + * Dumps an XML buffer to a FILE *. + * Returns the number of #xmlChar written + */ +int +xmlBufferDump(FILE *file, xmlBufferPtr buf) { + int ret; + + if (buf == NULL) { +#ifdef DEBUG_BUFFER + xmlGenericError(xmlGenericErrorContext, + "xmlBufferDump: buf == NULL\n"); +#endif + return(0); + } + if (buf->content == NULL) { +#ifdef DEBUG_BUFFER + xmlGenericError(xmlGenericErrorContext, + "xmlBufferDump: buf->content == NULL\n"); +#endif + return(0); + } + if (file == NULL) + file = stdout; + ret = fwrite(buf->content, sizeof(xmlChar), buf->use, file); + return(ret); +} + +/** + * xmlBufferContent: + * @buf: the buffer + * + * Function to extract the content of a buffer + * + * Returns the internal content + */ + +const xmlChar * +xmlBufferContent(const xmlBufferPtr buf) +{ + if(!buf) + return NULL; + + return buf->content; +} + +/** + * xmlBufferLength: + * @buf: the buffer + * + * Function to get the length of a buffer + * + * Returns the length of data in the internal content + */ + +int +xmlBufferLength(const xmlBufferPtr buf) +{ + if(!buf) + return 0; + + return buf->use; +} + +/** + * xmlBufferResize: + * @buf: the buffer to resize + * @size: the desired size + * + * Resize a buffer to accommodate minimum size of @size. + * + * Returns 0 in case of problems, 1 otherwise + */ +int +xmlBufferResize(xmlBufferPtr buf, unsigned int size) +{ + unsigned int newSize; + xmlChar* rebuf = NULL; + size_t start_buf; + + if (buf == NULL) + return(0); + + if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return(0); + + /* Don't resize if we don't have to */ + if (size < buf->size) + return 1; + + /* figure out new size */ + switch (buf->alloc){ + case XML_BUFFER_ALLOC_IO: + case XML_BUFFER_ALLOC_DOUBLEIT: + /*take care of empty case*/ + newSize = (buf->size ? buf->size*2 : size + 10); + while (size > newSize) { + if (newSize > UINT_MAX / 2) { + xmlTreeErrMemory("growing buffer"); + return 0; + } + newSize *= 2; + } + break; + case XML_BUFFER_ALLOC_EXACT: + newSize = size+10; + break; + case XML_BUFFER_ALLOC_HYBRID: + if (buf->use < BASE_BUFFER_SIZE) + newSize = size; + else { + newSize = buf->size * 2; + while (size > newSize) { + if (newSize > UINT_MAX / 2) { + xmlTreeErrMemory("growing buffer"); + return 0; + } + newSize *= 2; + } + } + break; + + default: + newSize = size+10; + break; + } + + if ((buf->alloc == XML_BUFFER_ALLOC_IO) && (buf->contentIO != NULL)) { + start_buf = buf->content - buf->contentIO; + + if (start_buf > newSize) { + /* move data back to start */ + memmove(buf->contentIO, buf->content, buf->use); + buf->content = buf->contentIO; + buf->content[buf->use] = 0; + buf->size += start_buf; + } else { + rebuf = (xmlChar *) xmlRealloc(buf->contentIO, start_buf + newSize); + if (rebuf == NULL) { + xmlTreeErrMemory("growing buffer"); + return 0; + } + buf->contentIO = rebuf; + buf->content = rebuf + start_buf; + } + } else { + if (buf->content == NULL) { + rebuf = (xmlChar *) xmlMallocAtomic(newSize); + } else if (buf->size - buf->use < 100) { + rebuf = (xmlChar *) xmlRealloc(buf->content, newSize); + } else { + /* + * if we are reallocating a buffer far from being full, it's + * better to make a new allocation and copy only the used range + * and free the old one. + */ + rebuf = (xmlChar *) xmlMallocAtomic(newSize); + if (rebuf != NULL) { + memcpy(rebuf, buf->content, buf->use); + xmlFree(buf->content); + rebuf[buf->use] = 0; + } + } + if (rebuf == NULL) { + xmlTreeErrMemory("growing buffer"); + return 0; + } + buf->content = rebuf; + } + buf->size = newSize; + + return 1; +} + +/** + * xmlBufferAdd: + * @buf: the buffer to dump + * @str: the #xmlChar string + * @len: the number of #xmlChar to add + * + * Add a string range to an XML buffer. if len == -1, the length of + * str is recomputed. + * + * Returns 0 successful, a positive error code number otherwise + * and -1 in case of internal or API error. + */ +int +xmlBufferAdd(xmlBufferPtr buf, const xmlChar *str, int len) { + unsigned int needSize; + + if ((str == NULL) || (buf == NULL)) { + return -1; + } + if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return -1; + if (len < -1) { +#ifdef DEBUG_BUFFER + xmlGenericError(xmlGenericErrorContext, + "xmlBufferAdd: len < 0\n"); +#endif + return -1; + } + if (len == 0) return 0; + + if (len < 0) + len = xmlStrlen(str); + + if (len < 0) return -1; + if (len == 0) return 0; + + needSize = buf->use + len + 2; + if (needSize > buf->size){ + if (!xmlBufferResize(buf, needSize)){ + xmlTreeErrMemory("growing buffer"); + return XML_ERR_NO_MEMORY; + } + } + + memmove(&buf->content[buf->use], str, len*sizeof(xmlChar)); + buf->use += len; + buf->content[buf->use] = 0; + return 0; +} + +/** + * xmlBufferAddHead: + * @buf: the buffer + * @str: the #xmlChar string + * @len: the number of #xmlChar to add + * + * Add a string range to the beginning of an XML buffer. + * if len == -1, the length of @str is recomputed. + * + * Returns 0 successful, a positive error code number otherwise + * and -1 in case of internal or API error. + */ +int +xmlBufferAddHead(xmlBufferPtr buf, const xmlChar *str, int len) { + unsigned int needSize; + + if (buf == NULL) + return(-1); + if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return -1; + if (str == NULL) { +#ifdef DEBUG_BUFFER + xmlGenericError(xmlGenericErrorContext, + "xmlBufferAddHead: str == NULL\n"); +#endif + return -1; + } + if (len < -1) { +#ifdef DEBUG_BUFFER + xmlGenericError(xmlGenericErrorContext, + "xmlBufferAddHead: len < 0\n"); +#endif + return -1; + } + if (len == 0) return 0; + + if (len < 0) + len = xmlStrlen(str); + + if (len <= 0) return -1; + + if ((buf->alloc == XML_BUFFER_ALLOC_IO) && (buf->contentIO != NULL)) { + size_t start_buf = buf->content - buf->contentIO; + + if (start_buf > (unsigned int) len) { + /* + * We can add it in the space previously shrinked + */ + buf->content -= len; + memmove(&buf->content[0], str, len); + buf->use += len; + buf->size += len; + return(0); + } + } + needSize = buf->use + len + 2; + if (needSize > buf->size){ + if (!xmlBufferResize(buf, needSize)){ + xmlTreeErrMemory("growing buffer"); + return XML_ERR_NO_MEMORY; + } + } + + memmove(&buf->content[len], &buf->content[0], buf->use); + memmove(&buf->content[0], str, len); + buf->use += len; + buf->content[buf->use] = 0; + return 0; +} + +/** + * xmlBufferCat: + * @buf: the buffer to add to + * @str: the #xmlChar string + * + * Append a zero terminated string to an XML buffer. + * + * Returns 0 successful, a positive error code number otherwise + * and -1 in case of internal or API error. + */ +int +xmlBufferCat(xmlBufferPtr buf, const xmlChar *str) { + if (buf == NULL) + return(-1); + if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return -1; + if (str == NULL) return -1; + return xmlBufferAdd(buf, str, -1); +} + +/** + * xmlBufferCCat: + * @buf: the buffer to dump + * @str: the C char string + * + * Append a zero terminated C string to an XML buffer. + * + * Returns 0 successful, a positive error code number otherwise + * and -1 in case of internal or API error. + */ +int +xmlBufferCCat(xmlBufferPtr buf, const char *str) { + const char *cur; + + if (buf == NULL) + return(-1); + if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return -1; + if (str == NULL) { +#ifdef DEBUG_BUFFER + xmlGenericError(xmlGenericErrorContext, + "xmlBufferCCat: str == NULL\n"); +#endif + return -1; + } + for (cur = str;*cur != 0;cur++) { + if (buf->use + 10 >= buf->size) { + if (!xmlBufferResize(buf, buf->use+10)){ + xmlTreeErrMemory("growing buffer"); + return XML_ERR_NO_MEMORY; + } + } + buf->content[buf->use++] = *cur; + } + buf->content[buf->use] = 0; + return 0; +} + +/** + * xmlBufferWriteCHAR: + * @buf: the XML buffer + * @string: the string to add + * + * routine which manages and grows an output buffer. This one adds + * xmlChars at the end of the buffer. + */ +void +xmlBufferWriteCHAR(xmlBufferPtr buf, const xmlChar *string) { + if (buf == NULL) + return; + if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return; + xmlBufferCat(buf, string); +} + +/** + * xmlBufferWriteChar: + * @buf: the XML buffer output + * @string: the string to add + * + * routine which manage and grows an output buffer. This one add + * C chars at the end of the array. + */ +void +xmlBufferWriteChar(xmlBufferPtr buf, const char *string) { + if (buf == NULL) + return; + if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return; + xmlBufferCCat(buf, string); +} + + +/** + * xmlBufferWriteQuotedString: + * @buf: the XML buffer output + * @string: the string to add + * + * routine which manage and grows an output buffer. This one writes + * a quoted or double quoted #xmlChar string, checking first if it holds + * quote or double-quotes internally + */ +void +xmlBufferWriteQuotedString(xmlBufferPtr buf, const xmlChar *string) { + const xmlChar *cur, *base; + if (buf == NULL) + return; + if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return; + if (xmlStrchr(string, '\"')) { + if (xmlStrchr(string, '\'')) { +#ifdef DEBUG_BUFFER + xmlGenericError(xmlGenericErrorContext, + "xmlBufferWriteQuotedString: string contains quote and double-quotes !\n"); +#endif + xmlBufferCCat(buf, "\""); + base = cur = string; + while(*cur != 0){ + if(*cur == '"'){ + if (base != cur) + xmlBufferAdd(buf, base, cur - base); + xmlBufferAdd(buf, BAD_CAST """, 6); + cur++; + base = cur; + } + else { + cur++; + } + } + if (base != cur) + xmlBufferAdd(buf, base, cur - base); + xmlBufferCCat(buf, "\""); + } + else{ + xmlBufferCCat(buf, "\'"); + xmlBufferCat(buf, string); + xmlBufferCCat(buf, "\'"); + } + } else { + xmlBufferCCat(buf, "\""); + xmlBufferCat(buf, string); + xmlBufferCCat(buf, "\""); + } +} + + +/** + * xmlGetDocCompressMode: + * @doc: the document + * + * get the compression ratio for a document, ZLIB based + * Returns 0 (uncompressed) to 9 (max compression) + */ +int +xmlGetDocCompressMode (xmlDocPtr doc) { + if (doc == NULL) return(-1); + return(doc->compression); +} + +/** + * xmlSetDocCompressMode: + * @doc: the document + * @mode: the compression ratio + * + * set the compression ratio for a document, ZLIB based + * Correct values: 0 (uncompressed) to 9 (max compression) + */ +void +xmlSetDocCompressMode (xmlDocPtr doc, int mode) { + if (doc == NULL) return; + if (mode < 0) doc->compression = 0; + else if (mode > 9) doc->compression = 9; + else doc->compression = mode; +} + +/** + * xmlGetCompressMode: + * + * get the default compression mode used, ZLIB based. + * Returns 0 (uncompressed) to 9 (max compression) + */ +int +xmlGetCompressMode(void) +{ + return (xmlCompressMode); +} + +/** + * xmlSetCompressMode: + * @mode: the compression ratio + * + * set the default compression mode used, ZLIB based + * Correct values: 0 (uncompressed) to 9 (max compression) + */ +void +xmlSetCompressMode(int mode) { + if (mode < 0) xmlCompressMode = 0; + else if (mode > 9) xmlCompressMode = 9; + else xmlCompressMode = mode; +} + +#define XML_TREE_NSMAP_PARENT -1 +#define XML_TREE_NSMAP_XML -2 +#define XML_TREE_NSMAP_DOC -3 +#define XML_TREE_NSMAP_CUSTOM -4 + +typedef struct xmlNsMapItem *xmlNsMapItemPtr; +struct xmlNsMapItem { + xmlNsMapItemPtr next; + xmlNsMapItemPtr prev; + xmlNsPtr oldNs; /* old ns decl reference */ + xmlNsPtr newNs; /* new ns decl reference */ + int shadowDepth; /* Shadowed at this depth */ + /* + * depth: + * >= 0 == @node's ns-decls + * -1 == @parent's ns-decls + * -2 == the doc->oldNs XML ns-decl + * -3 == the doc->oldNs storage ns-decls + * -4 == ns-decls provided via custom ns-handling + */ + int depth; +}; + +typedef struct xmlNsMap *xmlNsMapPtr; +struct xmlNsMap { + xmlNsMapItemPtr first; + xmlNsMapItemPtr last; + xmlNsMapItemPtr pool; +}; + +#define XML_NSMAP_NOTEMPTY(m) (((m) != NULL) && ((m)->first != NULL)) +#define XML_NSMAP_FOREACH(m, i) for (i = (m)->first; i != NULL; i = (i)->next) +#define XML_NSMAP_POP(m, i) \ + i = (m)->last; \ + (m)->last = (i)->prev; \ + if ((m)->last == NULL) \ + (m)->first = NULL; \ + else \ + (m)->last->next = NULL; \ + (i)->next = (m)->pool; \ + (m)->pool = i; + +/* +* xmlDOMWrapNsMapFree: +* @map: the ns-map +* +* Frees the ns-map +*/ +static void +xmlDOMWrapNsMapFree(xmlNsMapPtr nsmap) +{ + xmlNsMapItemPtr cur, tmp; + + if (nsmap == NULL) + return; + cur = nsmap->pool; + while (cur != NULL) { + tmp = cur; + cur = cur->next; + xmlFree(tmp); + } + cur = nsmap->first; + while (cur != NULL) { + tmp = cur; + cur = cur->next; + xmlFree(tmp); + } + xmlFree(nsmap); +} + +/* +* xmlDOMWrapNsMapAddItem: +* @map: the ns-map +* @oldNs: the old ns-struct +* @newNs: the new ns-struct +* @depth: depth and ns-kind information +* +* Adds an ns-mapping item. +*/ +static xmlNsMapItemPtr +xmlDOMWrapNsMapAddItem(xmlNsMapPtr *nsmap, int position, + xmlNsPtr oldNs, xmlNsPtr newNs, int depth) +{ + xmlNsMapItemPtr ret; + xmlNsMapPtr map; + + if (nsmap == NULL) + return(NULL); + if ((position != -1) && (position != 0)) + return(NULL); + map = *nsmap; + + if (map == NULL) { + /* + * Create the ns-map. + */ + map = (xmlNsMapPtr) xmlMalloc(sizeof(struct xmlNsMap)); + if (map == NULL) { + xmlTreeErrMemory("allocating namespace map"); + return (NULL); + } + memset(map, 0, sizeof(struct xmlNsMap)); + *nsmap = map; + } + + if (map->pool != NULL) { + /* + * Reuse an item from the pool. + */ + ret = map->pool; + map->pool = ret->next; + memset(ret, 0, sizeof(struct xmlNsMapItem)); + } else { + /* + * Create a new item. + */ + ret = (xmlNsMapItemPtr) xmlMalloc(sizeof(struct xmlNsMapItem)); + if (ret == NULL) { + xmlTreeErrMemory("allocating namespace map item"); + return (NULL); + } + memset(ret, 0, sizeof(struct xmlNsMapItem)); + } + + if (map->first == NULL) { + /* + * First ever. + */ + map->first = ret; + map->last = ret; + } else if (position == -1) { + /* + * Append. + */ + ret->prev = map->last; + map->last->next = ret; + map->last = ret; + } else if (position == 0) { + /* + * Set on first position. + */ + map->first->prev = ret; + ret->next = map->first; + map->first = ret; + } else + return(NULL); + + ret->oldNs = oldNs; + ret->newNs = newNs; + ret->shadowDepth = -1; + ret->depth = depth; + return (ret); +} + +/* +* xmlDOMWrapStoreNs: +* @doc: the doc +* @nsName: the namespace name +* @prefix: the prefix +* +* Creates or reuses an xmlNs struct on doc->oldNs with +* the given prefix and namespace name. +* +* Returns the aquired ns struct or NULL in case of an API +* or internal error. +*/ +static xmlNsPtr +xmlDOMWrapStoreNs(xmlDocPtr doc, + const xmlChar *nsName, + const xmlChar *prefix) +{ + xmlNsPtr ns; + + if (doc == NULL) + return (NULL); + ns = xmlTreeEnsureXMLDecl(doc); + if (ns == NULL) + return (NULL); + if (ns->next != NULL) { + /* Reuse. */ + ns = ns->next; + while (ns != NULL) { + if (((ns->prefix == prefix) || + xmlStrEqual(ns->prefix, prefix)) && + xmlStrEqual(ns->href, nsName)) { + return (ns); + } + if (ns->next == NULL) + break; + ns = ns->next; + } + } + /* Create. */ + if (ns != NULL) { + ns->next = xmlNewNs(NULL, nsName, prefix); + return (ns->next); + } + return(NULL); +} + +/* +* xmlDOMWrapNewCtxt: +* +* Allocates and initializes a new DOM-wrapper context. +* +* Returns the xmlDOMWrapCtxtPtr or NULL in case of an internal errror. +*/ +xmlDOMWrapCtxtPtr +xmlDOMWrapNewCtxt(void) +{ + xmlDOMWrapCtxtPtr ret; + + ret = xmlMalloc(sizeof(xmlDOMWrapCtxt)); + if (ret == NULL) { + xmlTreeErrMemory("allocating DOM-wrapper context"); + return (NULL); + } + memset(ret, 0, sizeof(xmlDOMWrapCtxt)); + return (ret); +} + +/* +* xmlDOMWrapFreeCtxt: +* @ctxt: the DOM-wrapper context +* +* Frees the DOM-wrapper context. +*/ +void +xmlDOMWrapFreeCtxt(xmlDOMWrapCtxtPtr ctxt) +{ + if (ctxt == NULL) + return; + if (ctxt->namespaceMap != NULL) + xmlDOMWrapNsMapFree((xmlNsMapPtr) ctxt->namespaceMap); + /* + * TODO: Store the namespace map in the context. + */ + xmlFree(ctxt); +} + +/* +* xmlTreeLookupNsListByPrefix: +* @nsList: a list of ns-structs +* @prefix: the searched prefix +* +* Searches for a ns-decl with the given prefix in @nsList. +* +* Returns the ns-decl if found, NULL if not found and on +* API errors. +*/ +static xmlNsPtr +xmlTreeNSListLookupByPrefix(xmlNsPtr nsList, const xmlChar *prefix) +{ + if (nsList == NULL) + return (NULL); + { + xmlNsPtr ns; + ns = nsList; + do { + if ((prefix == ns->prefix) || + xmlStrEqual(prefix, ns->prefix)) { + return (ns); + } + ns = ns->next; + } while (ns != NULL); + } + return (NULL); +} + +/* +* +* xmlDOMWrapNSNormGatherInScopeNs: +* @map: the namespace map +* @node: the node to start with +* +* Puts in-scope namespaces into the ns-map. +* +* Returns 0 on success, -1 on API or internal errors. +*/ +static int +xmlDOMWrapNSNormGatherInScopeNs(xmlNsMapPtr *map, + xmlNodePtr node) +{ + xmlNodePtr cur; + xmlNsPtr ns; + xmlNsMapItemPtr mi; + int shadowed; + + if ((map == NULL) || (*map != NULL)) + return (-1); + if ((node == NULL) || (node->type == XML_NAMESPACE_DECL)) + return (-1); + /* + * Get in-scope ns-decls of @parent. + */ + cur = node; + while ((cur != NULL) && (cur != (xmlNodePtr) cur->doc)) { + if (cur->type == XML_ELEMENT_NODE) { + if (cur->nsDef != NULL) { + ns = cur->nsDef; + do { + shadowed = 0; + if (XML_NSMAP_NOTEMPTY(*map)) { + /* + * Skip shadowed prefixes. + */ + XML_NSMAP_FOREACH(*map, mi) { + if ((ns->prefix == mi->newNs->prefix) || + xmlStrEqual(ns->prefix, mi->newNs->prefix)) { + shadowed = 1; + break; + } + } + } + /* + * Insert mapping. + */ + mi = xmlDOMWrapNsMapAddItem(map, 0, NULL, + ns, XML_TREE_NSMAP_PARENT); + if (mi == NULL) + return (-1); + if (shadowed) + mi->shadowDepth = 0; + ns = ns->next; + } while (ns != NULL); + } + } + cur = cur->parent; + } + return (0); +} + +/* +* XML_TREE_ADOPT_STR: If we have a dest-dict, put @str in the dict; +* otherwise copy it, when it was in the source-dict. +*/ +#define XML_TREE_ADOPT_STR(str) \ + if (adoptStr && (str != NULL)) { \ + if (destDoc->dict) { \ + const xmlChar *old = str; \ + str = xmlDictLookup(destDoc->dict, str, -1); \ + if ((sourceDoc == NULL) || (sourceDoc->dict == NULL) || \ + (!xmlDictOwns(sourceDoc->dict, old))) \ + xmlFree((char *)old); \ + } else if ((sourceDoc) && (sourceDoc->dict) && \ + xmlDictOwns(sourceDoc->dict, str)) { \ + str = BAD_CAST xmlStrdup(str); \ + } \ + } + +/* +* XML_TREE_ADOPT_STR_2: If @str was in the source-dict, then +* put it in dest-dict or copy it. +*/ +#define XML_TREE_ADOPT_STR_2(str) \ + if (adoptStr && (str != NULL) && (sourceDoc != NULL) && \ + (sourceDoc->dict != NULL) && \ + xmlDictOwns(sourceDoc->dict, cur->content)) { \ + if (destDoc->dict) \ + cur->content = (xmlChar *) \ + xmlDictLookup(destDoc->dict, cur->content, -1); \ + else \ + cur->content = xmlStrdup(BAD_CAST cur->content); \ + } + +/* +* xmlDOMWrapNSNormAddNsMapItem2: +* +* For internal use. Adds a ns-decl mapping. +* +* Returns 0 on success, -1 on internal errors. +*/ +static int +xmlDOMWrapNSNormAddNsMapItem2(xmlNsPtr **list, int *size, int *number, + xmlNsPtr oldNs, xmlNsPtr newNs) +{ + if (*list == NULL) { + *list = (xmlNsPtr *) xmlMalloc(6 * sizeof(xmlNsPtr)); + if (*list == NULL) { + xmlTreeErrMemory("alloc ns map item"); + return(-1); + } + *size = 3; + *number = 0; + } else if ((*number) >= (*size)) { + *size *= 2; + *list = (xmlNsPtr *) xmlRealloc(*list, + (*size) * 2 * sizeof(xmlNsPtr)); + if (*list == NULL) { + xmlTreeErrMemory("realloc ns map item"); + return(-1); + } + } + (*list)[2 * (*number)] = oldNs; + (*list)[2 * (*number) +1] = newNs; + (*number)++; + return (0); +} + +/* +* xmlDOMWrapRemoveNode: +* @ctxt: a DOM wrapper context +* @doc: the doc +* @node: the node to be removed. +* @options: set of options, unused at the moment +* +* Unlinks the given node from its owner. +* This will substitute ns-references to node->nsDef for +* ns-references to doc->oldNs, thus ensuring the removed +* branch to be autark wrt ns-references. +* +* NOTE: This function was not intensively tested. +* +* Returns 0 on success, 1 if the node is not supported, +* -1 on API and internal errors. +*/ +int +xmlDOMWrapRemoveNode(xmlDOMWrapCtxtPtr ctxt, xmlDocPtr doc, + xmlNodePtr node, int options ATTRIBUTE_UNUSED) +{ + xmlNsPtr *list = NULL; + int sizeList, nbList, i, j; + xmlNsPtr ns; + + if ((node == NULL) || (doc == NULL) || (node->doc != doc)) + return (-1); + + /* TODO: 0 or -1 ? */ + if (node->parent == NULL) + return (0); + + switch (node->type) { + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + case XML_ENTITY_REF_NODE: + case XML_PI_NODE: + case XML_COMMENT_NODE: + xmlUnlinkNode(node); + return (0); + case XML_ELEMENT_NODE: + case XML_ATTRIBUTE_NODE: + break; + default: + return (1); + } + xmlUnlinkNode(node); + /* + * Save out-of-scope ns-references in doc->oldNs. + */ + do { + switch (node->type) { + case XML_ELEMENT_NODE: + if ((ctxt == NULL) && (node->nsDef != NULL)) { + ns = node->nsDef; + do { + if (xmlDOMWrapNSNormAddNsMapItem2(&list, &sizeList, + &nbList, ns, ns) == -1) + goto internal_error; + ns = ns->next; + } while (ns != NULL); + } + /* No break on purpose. */ + case XML_ATTRIBUTE_NODE: + if (node->ns != NULL) { + /* + * Find a mapping. + */ + if (list != NULL) { + for (i = 0, j = 0; i < nbList; i++, j += 2) { + if (node->ns == list[j]) { + node->ns = list[++j]; + goto next_node; + } + } + } + ns = NULL; + if (ctxt != NULL) { + /* + * User defined. + */ + } else { + /* + * Add to doc's oldNs. + */ + ns = xmlDOMWrapStoreNs(doc, node->ns->href, + node->ns->prefix); + if (ns == NULL) + goto internal_error; + } + if (ns != NULL) { + /* + * Add mapping. + */ + if (xmlDOMWrapNSNormAddNsMapItem2(&list, &sizeList, + &nbList, node->ns, ns) == -1) + goto internal_error; + } + node->ns = ns; + } + if ((node->type == XML_ELEMENT_NODE) && + (node->properties != NULL)) { + node = (xmlNodePtr) node->properties; + continue; + } + break; + default: + goto next_sibling; + } +next_node: + if ((node->type == XML_ELEMENT_NODE) && + (node->children != NULL)) { + node = node->children; + continue; + } +next_sibling: + if (node == NULL) + break; + if (node->next != NULL) + node = node->next; + else { + node = node->parent; + goto next_sibling; + } + } while (node != NULL); + + if (list != NULL) + xmlFree(list); + return (0); + +internal_error: + if (list != NULL) + xmlFree(list); + return (-1); +} + +/* +* xmlSearchNsByNamespaceStrict: +* @doc: the document +* @node: the start node +* @nsName: the searched namespace name +* @retNs: the resulting ns-decl +* @prefixed: if the found ns-decl must have a prefix (for attributes) +* +* Dynamically searches for a ns-declaration which matches +* the given @nsName in the ancestor-or-self axis of @node. +* +* Returns 1 if a ns-decl was found, 0 if not and -1 on API +* and internal errors. +*/ +static int +xmlSearchNsByNamespaceStrict(xmlDocPtr doc, xmlNodePtr node, + const xmlChar* nsName, + xmlNsPtr *retNs, int prefixed) +{ + xmlNodePtr cur, prev = NULL, out = NULL; + xmlNsPtr ns, prevns; + + if ((doc == NULL) || (nsName == NULL) || (retNs == NULL)) + return (-1); + if ((node == NULL) || (node->type == XML_NAMESPACE_DECL)) + return(-1); + + *retNs = NULL; + if (xmlStrEqual(nsName, XML_XML_NAMESPACE)) { + *retNs = xmlTreeEnsureXMLDecl(doc); + if (*retNs == NULL) + return (-1); + return (1); + } + cur = node; + do { + if (cur->type == XML_ELEMENT_NODE) { + if (cur->nsDef != NULL) { + for (ns = cur->nsDef; ns != NULL; ns = ns->next) { + if (prefixed && (ns->prefix == NULL)) + continue; + if (prev != NULL) { + /* + * Check the last level of ns-decls for a + * shadowing prefix. + */ + prevns = prev->nsDef; + do { + if ((prevns->prefix == ns->prefix) || + ((prevns->prefix != NULL) && + (ns->prefix != NULL) && + xmlStrEqual(prevns->prefix, ns->prefix))) { + /* + * Shadowed. + */ + break; + } + prevns = prevns->next; + } while (prevns != NULL); + if (prevns != NULL) + continue; + } + /* + * Ns-name comparison. + */ + if ((nsName == ns->href) || + xmlStrEqual(nsName, ns->href)) { + /* + * At this point the prefix can only be shadowed, + * if we are the the (at least) 3rd level of + * ns-decls. + */ + if (out) { + int ret; + + ret = xmlNsInScope(doc, node, prev, ns->prefix); + if (ret < 0) + return (-1); + /* + * TODO: Should we try to find a matching ns-name + * only once? This here keeps on searching. + * I think we should try further since, there might + * be an other matching ns-decl with an unshadowed + * prefix. + */ + if (! ret) + continue; + } + *retNs = ns; + return (1); + } + } + out = prev; + prev = cur; + } + } else if ((cur->type == XML_ENTITY_NODE) || + (cur->type == XML_ENTITY_DECL)) + return (0); + cur = cur->parent; + } while ((cur != NULL) && (cur->doc != (xmlDocPtr) cur)); + return (0); +} + +/* +* xmlSearchNsByPrefixStrict: +* @doc: the document +* @node: the start node +* @prefix: the searched namespace prefix +* @retNs: the resulting ns-decl +* +* Dynamically searches for a ns-declaration which matches +* the given @nsName in the ancestor-or-self axis of @node. +* +* Returns 1 if a ns-decl was found, 0 if not and -1 on API +* and internal errors. +*/ +static int +xmlSearchNsByPrefixStrict(xmlDocPtr doc, xmlNodePtr node, + const xmlChar* prefix, + xmlNsPtr *retNs) +{ + xmlNodePtr cur; + xmlNsPtr ns; + + if ((doc == NULL) || (node == NULL) || (node->type == XML_NAMESPACE_DECL)) + return(-1); + + if (retNs) + *retNs = NULL; + if (IS_STR_XML(prefix)) { + if (retNs) { + *retNs = xmlTreeEnsureXMLDecl(doc); + if (*retNs == NULL) + return (-1); + } + return (1); + } + cur = node; + do { + if (cur->type == XML_ELEMENT_NODE) { + if (cur->nsDef != NULL) { + ns = cur->nsDef; + do { + if ((prefix == ns->prefix) || + xmlStrEqual(prefix, ns->prefix)) + { + /* + * Disabled namespaces, e.g. xmlns:abc="". + */ + if (ns->href == NULL) + return(0); + if (retNs) + *retNs = ns; + return (1); + } + ns = ns->next; + } while (ns != NULL); + } + } else if ((cur->type == XML_ENTITY_NODE) || + (cur->type == XML_ENTITY_DECL)) + return (0); + cur = cur->parent; + } while ((cur != NULL) && (cur->doc != (xmlDocPtr) cur)); + return (0); +} + +/* +* xmlDOMWrapNSNormDeclareNsForced: +* @doc: the doc +* @elem: the element-node to declare on +* @nsName: the namespace-name of the ns-decl +* @prefix: the preferred prefix of the ns-decl +* @checkShadow: ensure that the new ns-decl doesn't shadow ancestor ns-decls +* +* Declares a new namespace on @elem. It tries to use the +* given @prefix; if a ns-decl with the given prefix is already existent +* on @elem, it will generate an other prefix. +* +* Returns 1 if a ns-decl was found, 0 if not and -1 on API +* and internal errors. +*/ +static xmlNsPtr +xmlDOMWrapNSNormDeclareNsForced(xmlDocPtr doc, + xmlNodePtr elem, + const xmlChar *nsName, + const xmlChar *prefix, + int checkShadow) +{ + + xmlNsPtr ret; + char buf[50]; + const xmlChar *pref; + int counter = 0; + + if ((doc == NULL) || (elem == NULL) || (elem->type != XML_ELEMENT_NODE)) + return(NULL); + /* + * Create a ns-decl on @anchor. + */ + pref = prefix; + while (1) { + /* + * Lookup whether the prefix is unused in elem's ns-decls. + */ + if ((elem->nsDef != NULL) && + (xmlTreeNSListLookupByPrefix(elem->nsDef, pref) != NULL)) + goto ns_next_prefix; + if (checkShadow && elem->parent && + ((xmlNodePtr) elem->parent->doc != elem->parent)) { + /* + * Does it shadow ancestor ns-decls? + */ + if (xmlSearchNsByPrefixStrict(doc, elem->parent, pref, NULL) == 1) + goto ns_next_prefix; + } + ret = xmlNewNs(NULL, nsName, pref); + if (ret == NULL) + return (NULL); + if (elem->nsDef == NULL) + elem->nsDef = ret; + else { + xmlNsPtr ns2 = elem->nsDef; + while (ns2->next != NULL) + ns2 = ns2->next; + ns2->next = ret; + } + return (ret); +ns_next_prefix: + counter++; + if (counter > 1000) + return (NULL); + if (prefix == NULL) { + snprintf((char *) buf, sizeof(buf), + "ns_%d", counter); + } else + snprintf((char *) buf, sizeof(buf), + "%.30s_%d", (char *)prefix, counter); + pref = BAD_CAST buf; + } +} + +/* +* xmlDOMWrapNSNormAquireNormalizedNs: +* @doc: the doc +* @elem: the element-node to declare namespaces on +* @ns: the ns-struct to use for the search +* @retNs: the found/created ns-struct +* @nsMap: the ns-map +* @depth: the current tree depth +* @ancestorsOnly: search in ancestor ns-decls only +* @prefixed: if the searched ns-decl must have a prefix (for attributes) +* +* Searches for a matching ns-name in the ns-decls of @nsMap, if not +* found it will either declare it on @elem, or store it in doc->oldNs. +* If a new ns-decl needs to be declared on @elem, it tries to use the +* @ns->prefix for it, if this prefix is already in use on @elem, it will +* change the prefix or the new ns-decl. +* +* Returns 0 if succeeded, -1 otherwise and on API/internal errors. +*/ +static int +xmlDOMWrapNSNormAquireNormalizedNs(xmlDocPtr doc, + xmlNodePtr elem, + xmlNsPtr ns, + xmlNsPtr *retNs, + xmlNsMapPtr *nsMap, + + int depth, + int ancestorsOnly, + int prefixed) +{ + xmlNsMapItemPtr mi; + + if ((doc == NULL) || (ns == NULL) || (retNs == NULL) || + (nsMap == NULL)) + return (-1); + + *retNs = NULL; + /* + * Handle XML namespace. + */ + if (IS_STR_XML(ns->prefix)) { + /* + * Insert XML namespace mapping. + */ + *retNs = xmlTreeEnsureXMLDecl(doc); + if (*retNs == NULL) + return (-1); + return (0); + } + /* + * If the search should be done in ancestors only and no + * @elem (the first ancestor) was specified, then skip the search. + */ + if ((XML_NSMAP_NOTEMPTY(*nsMap)) && + (! (ancestorsOnly && (elem == NULL)))) + { + /* + * Try to find an equal ns-name in in-scope ns-decls. + */ + XML_NSMAP_FOREACH(*nsMap, mi) { + if ((mi->depth >= XML_TREE_NSMAP_PARENT) && + /* + * ancestorsOnly: This should be turned on to gain speed, + * if one knows that the branch itself was already + * ns-wellformed and no stale references existed. + * I.e. it searches in the ancestor axis only. + */ + ((! ancestorsOnly) || (mi->depth == XML_TREE_NSMAP_PARENT)) && + /* Skip shadowed prefixes. */ + (mi->shadowDepth == -1) && + /* Skip xmlns="" or xmlns:foo="". */ + ((mi->newNs->href != NULL) && + (mi->newNs->href[0] != 0)) && + /* Ensure a prefix if wanted. */ + ((! prefixed) || (mi->newNs->prefix != NULL)) && + /* Equal ns name */ + ((mi->newNs->href == ns->href) || + xmlStrEqual(mi->newNs->href, ns->href))) { + /* Set the mapping. */ + mi->oldNs = ns; + *retNs = mi->newNs; + return (0); + } + } + } + /* + * No luck, the namespace is out of scope or shadowed. + */ + if (elem == NULL) { + xmlNsPtr tmpns; + + /* + * Store ns-decls in "oldNs" of the document-node. + */ + tmpns = xmlDOMWrapStoreNs(doc, ns->href, ns->prefix); + if (tmpns == NULL) + return (-1); + /* + * Insert mapping. + */ + if (xmlDOMWrapNsMapAddItem(nsMap, -1, ns, + tmpns, XML_TREE_NSMAP_DOC) == NULL) { + xmlFreeNs(tmpns); + return (-1); + } + *retNs = tmpns; + } else { + xmlNsPtr tmpns; + + tmpns = xmlDOMWrapNSNormDeclareNsForced(doc, elem, ns->href, + ns->prefix, 0); + if (tmpns == NULL) + return (-1); + + if (*nsMap != NULL) { + /* + * Does it shadow ancestor ns-decls? + */ + XML_NSMAP_FOREACH(*nsMap, mi) { + if ((mi->depth < depth) && + (mi->shadowDepth == -1) && + ((ns->prefix == mi->newNs->prefix) || + xmlStrEqual(ns->prefix, mi->newNs->prefix))) { + /* + * Shadows. + */ + mi->shadowDepth = depth; + break; + } + } + } + if (xmlDOMWrapNsMapAddItem(nsMap, -1, ns, tmpns, depth) == NULL) { + xmlFreeNs(tmpns); + return (-1); + } + *retNs = tmpns; + } + return (0); +} + +typedef enum { + XML_DOM_RECONNS_REMOVEREDUND = 1<<0 +} xmlDOMReconcileNSOptions; + +/* +* xmlDOMWrapReconcileNamespaces: +* @ctxt: DOM wrapper context, unused at the moment +* @elem: the element-node +* @options: option flags +* +* Ensures that ns-references point to ns-decls hold on element-nodes. +* Ensures that the tree is namespace wellformed by creating additional +* ns-decls where needed. Note that, since prefixes of already existent +* ns-decls can be shadowed by this process, it could break QNames in +* attribute values or element content. +* +* NOTE: This function was not intensively tested. +* +* Returns 0 if succeeded, -1 otherwise and on API/internal errors. +*/ + +int +xmlDOMWrapReconcileNamespaces(xmlDOMWrapCtxtPtr ctxt ATTRIBUTE_UNUSED, + xmlNodePtr elem, + int options) +{ + int depth = -1, adoptns = 0, parnsdone = 0; + xmlNsPtr ns, prevns; + xmlDocPtr doc; + xmlNodePtr cur, curElem = NULL; + xmlNsMapPtr nsMap = NULL; + xmlNsMapItemPtr /* topmi = NULL, */ mi; + /* @ancestorsOnly should be set by an option flag. */ + int ancestorsOnly = 0; + int optRemoveRedundantNS = + ((xmlDOMReconcileNSOptions) options & XML_DOM_RECONNS_REMOVEREDUND) ? 1 : 0; + xmlNsPtr *listRedund = NULL; + int sizeRedund = 0, nbRedund = 0, ret, i, j; + + if ((elem == NULL) || (elem->doc == NULL) || + (elem->type != XML_ELEMENT_NODE)) + return (-1); + + doc = elem->doc; + cur = elem; + do { + switch (cur->type) { + case XML_ELEMENT_NODE: + adoptns = 1; + curElem = cur; + depth++; + /* + * Namespace declarations. + */ + if (cur->nsDef != NULL) { + prevns = NULL; + ns = cur->nsDef; + while (ns != NULL) { + if (! parnsdone) { + if ((elem->parent) && + ((xmlNodePtr) elem->parent->doc != elem->parent)) { + /* + * Gather ancestor in-scope ns-decls. + */ + if (xmlDOMWrapNSNormGatherInScopeNs(&nsMap, + elem->parent) == -1) + goto internal_error; + } + parnsdone = 1; + } + + /* + * Lookup the ns ancestor-axis for equal ns-decls in scope. + */ + if (optRemoveRedundantNS && XML_NSMAP_NOTEMPTY(nsMap)) { + XML_NSMAP_FOREACH(nsMap, mi) { + if ((mi->depth >= XML_TREE_NSMAP_PARENT) && + (mi->shadowDepth == -1) && + ((ns->prefix == mi->newNs->prefix) || + xmlStrEqual(ns->prefix, mi->newNs->prefix)) && + ((ns->href == mi->newNs->href) || + xmlStrEqual(ns->href, mi->newNs->href))) + { + /* + * A redundant ns-decl was found. + * Add it to the list of redundant ns-decls. + */ + if (xmlDOMWrapNSNormAddNsMapItem2(&listRedund, + &sizeRedund, &nbRedund, ns, mi->newNs) == -1) + goto internal_error; + /* + * Remove the ns-decl from the element-node. + */ + if (prevns) + prevns->next = ns->next; + else + cur->nsDef = ns->next; + goto next_ns_decl; + } + } + } + + /* + * Skip ns-references handling if the referenced + * ns-decl is declared on the same element. + */ + if ((cur->ns != NULL) && adoptns && (cur->ns == ns)) + adoptns = 0; + /* + * Does it shadow any ns-decl? + */ + if (XML_NSMAP_NOTEMPTY(nsMap)) { + XML_NSMAP_FOREACH(nsMap, mi) { + if ((mi->depth >= XML_TREE_NSMAP_PARENT) && + (mi->shadowDepth == -1) && + ((ns->prefix == mi->newNs->prefix) || + xmlStrEqual(ns->prefix, mi->newNs->prefix))) { + + mi->shadowDepth = depth; + } + } + } + /* + * Push mapping. + */ + if (xmlDOMWrapNsMapAddItem(&nsMap, -1, ns, ns, + depth) == NULL) + goto internal_error; + + prevns = ns; +next_ns_decl: + ns = ns->next; + } + } + if (! adoptns) + goto ns_end; + /* No break on purpose. */ + case XML_ATTRIBUTE_NODE: + /* No ns, no fun. */ + if (cur->ns == NULL) + goto ns_end; + + if (! parnsdone) { + if ((elem->parent) && + ((xmlNodePtr) elem->parent->doc != elem->parent)) { + if (xmlDOMWrapNSNormGatherInScopeNs(&nsMap, + elem->parent) == -1) + goto internal_error; + } + parnsdone = 1; + } + /* + * Adjust the reference if this was a redundant ns-decl. + */ + if (listRedund) { + for (i = 0, j = 0; i < nbRedund; i++, j += 2) { + if (cur->ns == listRedund[j]) { + cur->ns = listRedund[++j]; + break; + } + } + } + /* + * Adopt ns-references. + */ + if (XML_NSMAP_NOTEMPTY(nsMap)) { + /* + * Search for a mapping. + */ + XML_NSMAP_FOREACH(nsMap, mi) { + if ((mi->shadowDepth == -1) && + (cur->ns == mi->oldNs)) { + + cur->ns = mi->newNs; + goto ns_end; + } + } + } + /* + * Aquire a normalized ns-decl and add it to the map. + */ + if (xmlDOMWrapNSNormAquireNormalizedNs(doc, curElem, + cur->ns, &ns, + &nsMap, depth, + ancestorsOnly, + (cur->type == XML_ATTRIBUTE_NODE) ? 1 : 0) == -1) + goto internal_error; + cur->ns = ns; + +ns_end: + if ((cur->type == XML_ELEMENT_NODE) && + (cur->properties != NULL)) { + /* + * Process attributes. + */ + cur = (xmlNodePtr) cur->properties; + continue; + } + break; + default: + goto next_sibling; + } +into_content: + if ((cur->type == XML_ELEMENT_NODE) && + (cur->children != NULL)) { + /* + * Process content of element-nodes only. + */ + cur = cur->children; + continue; + } +next_sibling: + if (cur == elem) + break; + if (cur->type == XML_ELEMENT_NODE) { + if (XML_NSMAP_NOTEMPTY(nsMap)) { + /* + * Pop mappings. + */ + while ((nsMap->last != NULL) && + (nsMap->last->depth >= depth)) + { + XML_NSMAP_POP(nsMap, mi) + } + /* + * Unshadow. + */ + XML_NSMAP_FOREACH(nsMap, mi) { + if (mi->shadowDepth >= depth) + mi->shadowDepth = -1; + } + } + depth--; + } + if (cur->next != NULL) + cur = cur->next; + else { + if (cur->type == XML_ATTRIBUTE_NODE) { + cur = cur->parent; + goto into_content; + } + cur = cur->parent; + goto next_sibling; + } + } while (cur != NULL); + + ret = 0; + goto exit; +internal_error: + ret = -1; +exit: + if (listRedund) { + for (i = 0, j = 0; i < nbRedund; i++, j += 2) { + xmlFreeNs(listRedund[j]); + } + xmlFree(listRedund); + } + if (nsMap != NULL) + xmlDOMWrapNsMapFree(nsMap); + return (ret); +} + +/* +* xmlDOMWrapAdoptBranch: +* @ctxt: the optional context for custom processing +* @sourceDoc: the optional sourceDoc +* @node: the element-node to start with +* @destDoc: the destination doc for adoption +* @destParent: the optional new parent of @node in @destDoc +* @options: option flags +* +* Ensures that ns-references point to @destDoc: either to +* elements->nsDef entries if @destParent is given, or to +* @destDoc->oldNs otherwise. +* If @destParent is given, it ensures that the tree is namespace +* wellformed by creating additional ns-decls where needed. +* Note that, since prefixes of already existent ns-decls can be +* shadowed by this process, it could break QNames in attribute +* values or element content. +* +* NOTE: This function was not intensively tested. +* +* Returns 0 if succeeded, -1 otherwise and on API/internal errors. +*/ +static int +xmlDOMWrapAdoptBranch(xmlDOMWrapCtxtPtr ctxt, + xmlDocPtr sourceDoc, + xmlNodePtr node, + xmlDocPtr destDoc, + xmlNodePtr destParent, + int options ATTRIBUTE_UNUSED) +{ + int ret = 0; + xmlNodePtr cur, curElem = NULL; + xmlNsMapPtr nsMap = NULL; + xmlNsMapItemPtr mi; + xmlNsPtr ns = NULL; + int depth = -1, adoptStr = 1; + /* gather @parent's ns-decls. */ + int parnsdone; + /* @ancestorsOnly should be set per option. */ + int ancestorsOnly = 0; + + /* + * Optimize string adoption for equal or none dicts. + */ + if ((sourceDoc != NULL) && + (sourceDoc->dict == destDoc->dict)) + adoptStr = 0; + else + adoptStr = 1; + + /* + * Get the ns-map from the context if available. + */ + if (ctxt) + nsMap = (xmlNsMapPtr) ctxt->namespaceMap; + /* + * Disable search for ns-decls in the parent-axis of the + * desination element, if: + * 1) there's no destination parent + * 2) custom ns-reference handling is used + */ + if ((destParent == NULL) || + (ctxt && ctxt->getNsForNodeFunc)) + { + parnsdone = 1; + } else + parnsdone = 0; + + cur = node; + if ((cur != NULL) && (cur->type == XML_NAMESPACE_DECL)) + goto internal_error; + + while (cur != NULL) { + /* + * Paranoid source-doc sanity check. + */ + if (cur->doc != sourceDoc) { + /* + * We'll assume XIncluded nodes if the doc differs. + * TODO: Do we need to reconciliate XIncluded nodes? + * This here skips XIncluded nodes and tries to handle + * broken sequences. + */ + if (cur->next == NULL) + goto leave_node; + do { + cur = cur->next; + if ((cur->type == XML_XINCLUDE_END) || + (cur->doc == node->doc)) + break; + } while (cur->next != NULL); + + if (cur->doc != node->doc) + goto leave_node; + } + cur->doc = destDoc; + switch (cur->type) { + case XML_XINCLUDE_START: + case XML_XINCLUDE_END: + /* + * TODO + */ + return (-1); + case XML_ELEMENT_NODE: + curElem = cur; + depth++; + /* + * Namespace declarations. + * - ns->href and ns->prefix are never in the dict, so + * we need not move the values over to the destination dict. + * - Note that for custom handling of ns-references, + * the ns-decls need not be stored in the ns-map, + * since they won't be referenced by node->ns. + */ + if ((cur->nsDef) && + ((ctxt == NULL) || (ctxt->getNsForNodeFunc == NULL))) + { + if (! parnsdone) { + /* + * Gather @parent's in-scope ns-decls. + */ + if (xmlDOMWrapNSNormGatherInScopeNs(&nsMap, + destParent) == -1) + goto internal_error; + parnsdone = 1; + } + for (ns = cur->nsDef; ns != NULL; ns = ns->next) { + /* + * NOTE: ns->prefix and ns->href are never in the dict. + * XML_TREE_ADOPT_STR(ns->prefix) + * XML_TREE_ADOPT_STR(ns->href) + */ + /* + * Does it shadow any ns-decl? + */ + if (XML_NSMAP_NOTEMPTY(nsMap)) { + XML_NSMAP_FOREACH(nsMap, mi) { + if ((mi->depth >= XML_TREE_NSMAP_PARENT) && + (mi->shadowDepth == -1) && + ((ns->prefix == mi->newNs->prefix) || + xmlStrEqual(ns->prefix, + mi->newNs->prefix))) { + + mi->shadowDepth = depth; + } + } + } + /* + * Push mapping. + */ + if (xmlDOMWrapNsMapAddItem(&nsMap, -1, + ns, ns, depth) == NULL) + goto internal_error; + } + } + /* No break on purpose. */ + case XML_ATTRIBUTE_NODE: + /* No namespace, no fun. */ + if (cur->ns == NULL) + goto ns_end; + + if (! parnsdone) { + if (xmlDOMWrapNSNormGatherInScopeNs(&nsMap, + destParent) == -1) + goto internal_error; + parnsdone = 1; + } + /* + * Adopt ns-references. + */ + if (XML_NSMAP_NOTEMPTY(nsMap)) { + /* + * Search for a mapping. + */ + XML_NSMAP_FOREACH(nsMap, mi) { + if ((mi->shadowDepth == -1) && + (cur->ns == mi->oldNs)) { + + cur->ns = mi->newNs; + goto ns_end; + } + } + } + /* + * No matching namespace in scope. We need a new one. + */ + if ((ctxt) && (ctxt->getNsForNodeFunc)) { + /* + * User-defined behaviour. + */ + ns = ctxt->getNsForNodeFunc(ctxt, cur, + cur->ns->href, cur->ns->prefix); + /* + * Insert mapping if ns is available; it's the users fault + * if not. + */ + if (xmlDOMWrapNsMapAddItem(&nsMap, -1, + cur->ns, ns, XML_TREE_NSMAP_CUSTOM) == NULL) + goto internal_error; + cur->ns = ns; + } else { + /* + * Aquire a normalized ns-decl and add it to the map. + */ + if (xmlDOMWrapNSNormAquireNormalizedNs(destDoc, + /* ns-decls on curElem or on destDoc->oldNs */ + destParent ? curElem : NULL, + cur->ns, &ns, + &nsMap, depth, + ancestorsOnly, + /* ns-decls must be prefixed for attributes. */ + (cur->type == XML_ATTRIBUTE_NODE) ? 1 : 0) == -1) + goto internal_error; + cur->ns = ns; + } +ns_end: + /* + * Further node properties. + * TODO: Is this all? + */ + XML_TREE_ADOPT_STR(cur->name) + if (cur->type == XML_ELEMENT_NODE) { + cur->psvi = NULL; + cur->line = 0; + cur->extra = 0; + /* + * Walk attributes. + */ + if (cur->properties != NULL) { + /* + * Process first attribute node. + */ + cur = (xmlNodePtr) cur->properties; + continue; + } + } else { + /* + * Attributes. + */ + if ((sourceDoc != NULL) && + (((xmlAttrPtr) cur)->atype == XML_ATTRIBUTE_ID)) + { + xmlRemoveID(sourceDoc, (xmlAttrPtr) cur); + } + ((xmlAttrPtr) cur)->atype = 0; + ((xmlAttrPtr) cur)->psvi = NULL; + } + break; + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + /* + * This puts the content in the dest dict, only if + * it was previously in the source dict. + */ + XML_TREE_ADOPT_STR_2(cur->content) + goto leave_node; + case XML_ENTITY_REF_NODE: + /* + * Remove reference to the entitity-node. + */ + cur->content = NULL; + cur->children = NULL; + cur->last = NULL; + if ((destDoc->intSubset) || (destDoc->extSubset)) { + xmlEntityPtr ent; + /* + * Assign new entity-node if available. + */ + ent = xmlGetDocEntity(destDoc, cur->name); + if (ent != NULL) { + cur->content = ent->content; + cur->children = (xmlNodePtr) ent; + cur->last = (xmlNodePtr) ent; + } + } + goto leave_node; + case XML_PI_NODE: + XML_TREE_ADOPT_STR(cur->name) + XML_TREE_ADOPT_STR_2(cur->content) + break; + case XML_COMMENT_NODE: + break; + default: + goto internal_error; + } + /* + * Walk the tree. + */ + if (cur->children != NULL) { + cur = cur->children; + continue; + } + +leave_node: + if (cur == node) + break; + if ((cur->type == XML_ELEMENT_NODE) || + (cur->type == XML_XINCLUDE_START) || + (cur->type == XML_XINCLUDE_END)) + { + /* + * TODO: Do we expect nsDefs on XML_XINCLUDE_START? + */ + if (XML_NSMAP_NOTEMPTY(nsMap)) { + /* + * Pop mappings. + */ + while ((nsMap->last != NULL) && + (nsMap->last->depth >= depth)) + { + XML_NSMAP_POP(nsMap, mi) + } + /* + * Unshadow. + */ + XML_NSMAP_FOREACH(nsMap, mi) { + if (mi->shadowDepth >= depth) + mi->shadowDepth = -1; + } + } + depth--; + } + if (cur->next != NULL) + cur = cur->next; + else if ((cur->type == XML_ATTRIBUTE_NODE) && + (cur->parent->children != NULL)) + { + cur = cur->parent->children; + } else { + cur = cur->parent; + goto leave_node; + } + } + + goto exit; + +internal_error: + ret = -1; + +exit: + /* + * Cleanup. + */ + if (nsMap != NULL) { + if ((ctxt) && (ctxt->namespaceMap == nsMap)) { + /* + * Just cleanup the map but don't free. + */ + if (nsMap->first) { + if (nsMap->pool) + nsMap->last->next = nsMap->pool; + nsMap->pool = nsMap->first; + nsMap->first = NULL; + } + } else + xmlDOMWrapNsMapFree(nsMap); + } + return(ret); +} + +/* +* xmlDOMWrapCloneNode: +* @ctxt: the optional context for custom processing +* @sourceDoc: the optional sourceDoc +* @node: the node to start with +* @resNode: the clone of the given @node +* @destDoc: the destination doc +* @destParent: the optional new parent of @node in @destDoc +* @deep: descend into child if set +* @options: option flags +* +* References of out-of scope ns-decls are remapped to point to @destDoc: +* 1) If @destParent is given, then nsDef entries on element-nodes are used +* 2) If *no* @destParent is given, then @destDoc->oldNs entries are used. +* This is the case when you don't know already where the cloned branch +* will be added to. +* +* If @destParent is given, it ensures that the tree is namespace +* wellformed by creating additional ns-decls where needed. +* Note that, since prefixes of already existent ns-decls can be +* shadowed by this process, it could break QNames in attribute +* values or element content. +* TODO: +* 1) What to do with XInclude? Currently this returns an error for XInclude. +* +* Returns 0 if the operation succeeded, +* 1 if a node of unsupported (or not yet supported) type was given, +* -1 on API/internal errors. +*/ + +int +xmlDOMWrapCloneNode(xmlDOMWrapCtxtPtr ctxt, + xmlDocPtr sourceDoc, + xmlNodePtr node, + xmlNodePtr *resNode, + xmlDocPtr destDoc, + xmlNodePtr destParent, + int deep, + int options ATTRIBUTE_UNUSED) +{ + int ret = 0; + xmlNodePtr cur, curElem = NULL; + xmlNsMapPtr nsMap = NULL; + xmlNsMapItemPtr mi; + xmlNsPtr ns; + int depth = -1; + /* int adoptStr = 1; */ + /* gather @parent's ns-decls. */ + int parnsdone = 0; + /* + * @ancestorsOnly: + * TODO: @ancestorsOnly should be set per option. + * + */ + int ancestorsOnly = 0; + xmlNodePtr resultClone = NULL, clone = NULL, parentClone = NULL, prevClone = NULL; + xmlNsPtr cloneNs = NULL, *cloneNsDefSlot = NULL; + xmlDictPtr dict; /* The destination dict */ + + if ((node == NULL) || (resNode == NULL) || (destDoc == NULL)) + return(-1); + /* + * TODO: Initially we support only element-nodes. + */ + if (node->type != XML_ELEMENT_NODE) + return(1); + /* + * Check node->doc sanity. + */ + if ((node->doc != NULL) && (sourceDoc != NULL) && + (node->doc != sourceDoc)) { + /* + * Might be an XIncluded node. + */ + return (-1); + } + if (sourceDoc == NULL) + sourceDoc = node->doc; + if (sourceDoc == NULL) + return (-1); + + dict = destDoc->dict; + /* + * Reuse the namespace map of the context. + */ + if (ctxt) + nsMap = (xmlNsMapPtr) ctxt->namespaceMap; + + *resNode = NULL; + + cur = node; + if ((cur != NULL) && (cur->type == XML_NAMESPACE_DECL)) + return(-1); + + while (cur != NULL) { + if (cur->doc != sourceDoc) { + /* + * We'll assume XIncluded nodes if the doc differs. + * TODO: Do we need to reconciliate XIncluded nodes? + * TODO: This here returns -1 in this case. + */ + goto internal_error; + } + /* + * Create a new node. + */ + switch (cur->type) { + case XML_XINCLUDE_START: + case XML_XINCLUDE_END: + /* + * TODO: What to do with XInclude? + */ + goto internal_error; + break; + case XML_ELEMENT_NODE: + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + case XML_COMMENT_NODE: + case XML_PI_NODE: + case XML_DOCUMENT_FRAG_NODE: + case XML_ENTITY_REF_NODE: + case XML_ENTITY_NODE: + /* + * Nodes of xmlNode structure. + */ + clone = (xmlNodePtr) xmlMalloc(sizeof(xmlNode)); + if (clone == NULL) { + xmlTreeErrMemory("xmlDOMWrapCloneNode(): allocating a node"); + goto internal_error; + } + memset(clone, 0, sizeof(xmlNode)); + /* + * Set hierachical links. + */ + if (resultClone != NULL) { + clone->parent = parentClone; + if (prevClone) { + prevClone->next = clone; + clone->prev = prevClone; + } else + parentClone->children = clone; + } else + resultClone = clone; + + break; + case XML_ATTRIBUTE_NODE: + /* + * Attributes (xmlAttr). + */ + clone = (xmlNodePtr) xmlMalloc(sizeof(xmlAttr)); + if (clone == NULL) { + xmlTreeErrMemory("xmlDOMWrapCloneNode(): allocating an attr-node"); + goto internal_error; + } + memset(clone, 0, sizeof(xmlAttr)); + /* + * Set hierachical links. + * TODO: Change this to add to the end of attributes. + */ + if (resultClone != NULL) { + clone->parent = parentClone; + if (prevClone) { + prevClone->next = clone; + clone->prev = prevClone; + } else + parentClone->properties = (xmlAttrPtr) clone; + } else + resultClone = clone; + break; + default: + /* + * TODO QUESTION: Any other nodes expected? + */ + goto internal_error; + } + + clone->type = cur->type; + clone->doc = destDoc; + + /* + * Clone the name of the node if any. + */ + if (cur->name == xmlStringText) + clone->name = xmlStringText; + else if (cur->name == xmlStringTextNoenc) + /* + * NOTE: Although xmlStringTextNoenc is never assigned to a node + * in tree.c, it might be set in Libxslt via + * "xsl:disable-output-escaping". + */ + clone->name = xmlStringTextNoenc; + else if (cur->name == xmlStringComment) + clone->name = xmlStringComment; + else if (cur->name != NULL) { + DICT_CONST_COPY(cur->name, clone->name); + } + + switch (cur->type) { + case XML_XINCLUDE_START: + case XML_XINCLUDE_END: + /* + * TODO + */ + return (-1); + case XML_ELEMENT_NODE: + curElem = cur; + depth++; + /* + * Namespace declarations. + */ + if (cur->nsDef != NULL) { + if (! parnsdone) { + if (destParent && (ctxt == NULL)) { + /* + * Gather @parent's in-scope ns-decls. + */ + if (xmlDOMWrapNSNormGatherInScopeNs(&nsMap, + destParent) == -1) + goto internal_error; + } + parnsdone = 1; + } + /* + * Clone namespace declarations. + */ + cloneNsDefSlot = &(clone->nsDef); + for (ns = cur->nsDef; ns != NULL; ns = ns->next) { + /* + * Create a new xmlNs. + */ + cloneNs = (xmlNsPtr) xmlMalloc(sizeof(xmlNs)); + if (cloneNs == NULL) { + xmlTreeErrMemory("xmlDOMWrapCloneNode(): " + "allocating namespace"); + return(-1); + } + memset(cloneNs, 0, sizeof(xmlNs)); + cloneNs->type = XML_LOCAL_NAMESPACE; + + if (ns->href != NULL) + cloneNs->href = xmlStrdup(ns->href); + if (ns->prefix != NULL) + cloneNs->prefix = xmlStrdup(ns->prefix); + + *cloneNsDefSlot = cloneNs; + cloneNsDefSlot = &(cloneNs->next); + + /* + * Note that for custom handling of ns-references, + * the ns-decls need not be stored in the ns-map, + * since they won't be referenced by node->ns. + */ + if ((ctxt == NULL) || + (ctxt->getNsForNodeFunc == NULL)) + { + /* + * Does it shadow any ns-decl? + */ + if (XML_NSMAP_NOTEMPTY(nsMap)) { + XML_NSMAP_FOREACH(nsMap, mi) { + if ((mi->depth >= XML_TREE_NSMAP_PARENT) && + (mi->shadowDepth == -1) && + ((ns->prefix == mi->newNs->prefix) || + xmlStrEqual(ns->prefix, + mi->newNs->prefix))) { + /* + * Mark as shadowed at the current + * depth. + */ + mi->shadowDepth = depth; + } + } + } + /* + * Push mapping. + */ + if (xmlDOMWrapNsMapAddItem(&nsMap, -1, + ns, cloneNs, depth) == NULL) + goto internal_error; + } + } + } + /* cur->ns will be processed further down. */ + break; + case XML_ATTRIBUTE_NODE: + /* IDs will be processed further down. */ + /* cur->ns will be processed further down. */ + break; + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + /* + * Note that this will also cover the values of attributes. + */ + DICT_COPY(cur->content, clone->content); + goto leave_node; + case XML_ENTITY_NODE: + /* TODO: What to do here? */ + goto leave_node; + case XML_ENTITY_REF_NODE: + if (sourceDoc != destDoc) { + if ((destDoc->intSubset) || (destDoc->extSubset)) { + xmlEntityPtr ent; + /* + * Different doc: Assign new entity-node if available. + */ + ent = xmlGetDocEntity(destDoc, cur->name); + if (ent != NULL) { + clone->content = ent->content; + clone->children = (xmlNodePtr) ent; + clone->last = (xmlNodePtr) ent; + } + } + } else { + /* + * Same doc: Use the current node's entity declaration + * and value. + */ + clone->content = cur->content; + clone->children = cur->children; + clone->last = cur->last; + } + goto leave_node; + case XML_PI_NODE: + DICT_COPY(cur->content, clone->content); + goto leave_node; + case XML_COMMENT_NODE: + DICT_COPY(cur->content, clone->content); + goto leave_node; + default: + goto internal_error; + } + + if (cur->ns == NULL) + goto end_ns_reference; + +/* handle_ns_reference: */ + /* + ** The following will take care of references to ns-decls ******** + ** and is intended only for element- and attribute-nodes. + ** + */ + if (! parnsdone) { + if (destParent && (ctxt == NULL)) { + if (xmlDOMWrapNSNormGatherInScopeNs(&nsMap, destParent) == -1) + goto internal_error; + } + parnsdone = 1; + } + /* + * Adopt ns-references. + */ + if (XML_NSMAP_NOTEMPTY(nsMap)) { + /* + * Search for a mapping. + */ + XML_NSMAP_FOREACH(nsMap, mi) { + if ((mi->shadowDepth == -1) && + (cur->ns == mi->oldNs)) { + /* + * This is the nice case: a mapping was found. + */ + clone->ns = mi->newNs; + goto end_ns_reference; + } + } + } + /* + * No matching namespace in scope. We need a new one. + */ + if ((ctxt != NULL) && (ctxt->getNsForNodeFunc != NULL)) { + /* + * User-defined behaviour. + */ + ns = ctxt->getNsForNodeFunc(ctxt, cur, + cur->ns->href, cur->ns->prefix); + /* + * Add user's mapping. + */ + if (xmlDOMWrapNsMapAddItem(&nsMap, -1, + cur->ns, ns, XML_TREE_NSMAP_CUSTOM) == NULL) + goto internal_error; + clone->ns = ns; + } else { + /* + * Aquire a normalized ns-decl and add it to the map. + */ + if (xmlDOMWrapNSNormAquireNormalizedNs(destDoc, + /* ns-decls on curElem or on destDoc->oldNs */ + destParent ? curElem : NULL, + cur->ns, &ns, + &nsMap, depth, + /* if we need to search only in the ancestor-axis */ + ancestorsOnly, + /* ns-decls must be prefixed for attributes. */ + (cur->type == XML_ATTRIBUTE_NODE) ? 1 : 0) == -1) + goto internal_error; + clone->ns = ns; + } + +end_ns_reference: + + /* + * Some post-processing. + * + * Handle ID attributes. + */ + if ((clone->type == XML_ATTRIBUTE_NODE) && + (clone->parent != NULL)) + { + if (xmlIsID(destDoc, clone->parent, (xmlAttrPtr) clone)) { + + xmlChar *idVal; + + idVal = xmlNodeListGetString(cur->doc, cur->children, 1); + if (idVal != NULL) { + if (xmlAddID(NULL, destDoc, idVal, (xmlAttrPtr) cur) == NULL) { + /* TODO: error message. */ + xmlFree(idVal); + goto internal_error; + } + xmlFree(idVal); + } + } + } + /* + ** + ** The following will traverse the tree ************************** + ** + * + * Walk the element's attributes before descending into child-nodes. + */ + if ((cur->type == XML_ELEMENT_NODE) && (cur->properties != NULL)) { + prevClone = NULL; + parentClone = clone; + cur = (xmlNodePtr) cur->properties; + continue; + } +into_content: + /* + * Descend into child-nodes. + */ + if (cur->children != NULL) { + if (deep || (cur->type == XML_ATTRIBUTE_NODE)) { + prevClone = NULL; + parentClone = clone; + cur = cur->children; + continue; + } + } + +leave_node: + /* + * At this point we are done with the node, its content + * and an element-nodes's attribute-nodes. + */ + if (cur == node) + break; + if ((cur->type == XML_ELEMENT_NODE) || + (cur->type == XML_XINCLUDE_START) || + (cur->type == XML_XINCLUDE_END)) { + /* + * TODO: Do we expect nsDefs on XML_XINCLUDE_START? + */ + if (XML_NSMAP_NOTEMPTY(nsMap)) { + /* + * Pop mappings. + */ + while ((nsMap->last != NULL) && + (nsMap->last->depth >= depth)) + { + XML_NSMAP_POP(nsMap, mi) + } + /* + * Unshadow. + */ + XML_NSMAP_FOREACH(nsMap, mi) { + if (mi->shadowDepth >= depth) + mi->shadowDepth = -1; + } + } + depth--; + } + if (cur->next != NULL) { + prevClone = clone; + cur = cur->next; + } else if (cur->type != XML_ATTRIBUTE_NODE) { + /* + * Set clone->last. + */ + if (clone->parent != NULL) + clone->parent->last = clone; + clone = clone->parent; + parentClone = clone->parent; + /* + * Process parent --> next; + */ + cur = cur->parent; + goto leave_node; + } else { + /* This is for attributes only. */ + clone = clone->parent; + parentClone = clone->parent; + /* + * Process parent-element --> children. + */ + cur = cur->parent; + goto into_content; + } + } + goto exit; + +internal_error: + ret = -1; + +exit: + /* + * Cleanup. + */ + if (nsMap != NULL) { + if ((ctxt) && (ctxt->namespaceMap == nsMap)) { + /* + * Just cleanup the map but don't free. + */ + if (nsMap->first) { + if (nsMap->pool) + nsMap->last->next = nsMap->pool; + nsMap->pool = nsMap->first; + nsMap->first = NULL; + } + } else + xmlDOMWrapNsMapFree(nsMap); + } + /* + * TODO: Should we try a cleanup of the cloned node in case of a + * fatal error? + */ + *resNode = resultClone; + return (ret); +} + +/* +* xmlDOMWrapAdoptAttr: +* @ctxt: the optional context for custom processing +* @sourceDoc: the optional source document of attr +* @attr: the attribute-node to be adopted +* @destDoc: the destination doc for adoption +* @destParent: the optional new parent of @attr in @destDoc +* @options: option flags +* +* @attr is adopted by @destDoc. +* Ensures that ns-references point to @destDoc: either to +* elements->nsDef entries if @destParent is given, or to +* @destDoc->oldNs otherwise. +* +* Returns 0 if succeeded, -1 otherwise and on API/internal errors. +*/ +static int +xmlDOMWrapAdoptAttr(xmlDOMWrapCtxtPtr ctxt, + xmlDocPtr sourceDoc, + xmlAttrPtr attr, + xmlDocPtr destDoc, + xmlNodePtr destParent, + int options ATTRIBUTE_UNUSED) +{ + xmlNodePtr cur; + int adoptStr = 1; + + if ((attr == NULL) || (destDoc == NULL)) + return (-1); + + attr->doc = destDoc; + if (attr->ns != NULL) { + xmlNsPtr ns = NULL; + + if (ctxt != NULL) { + /* TODO: User defined. */ + } + /* XML Namespace. */ + if (IS_STR_XML(attr->ns->prefix)) { + ns = xmlTreeEnsureXMLDecl(destDoc); + } else if (destParent == NULL) { + /* + * Store in @destDoc->oldNs. + */ + ns = xmlDOMWrapStoreNs(destDoc, attr->ns->href, attr->ns->prefix); + } else { + /* + * Declare on @destParent. + */ + if (xmlSearchNsByNamespaceStrict(destDoc, destParent, attr->ns->href, + &ns, 1) == -1) + goto internal_error; + if (ns == NULL) { + ns = xmlDOMWrapNSNormDeclareNsForced(destDoc, destParent, + attr->ns->href, attr->ns->prefix, 1); + } + } + if (ns == NULL) + goto internal_error; + attr->ns = ns; + } + + XML_TREE_ADOPT_STR(attr->name); + attr->atype = 0; + attr->psvi = NULL; + /* + * Walk content. + */ + if (attr->children == NULL) + return (0); + cur = attr->children; + if ((cur != NULL) && (cur->type == XML_NAMESPACE_DECL)) + goto internal_error; + while (cur != NULL) { + cur->doc = destDoc; + switch (cur->type) { + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + XML_TREE_ADOPT_STR_2(cur->content) + break; + case XML_ENTITY_REF_NODE: + /* + * Remove reference to the entitity-node. + */ + cur->content = NULL; + cur->children = NULL; + cur->last = NULL; + if ((destDoc->intSubset) || (destDoc->extSubset)) { + xmlEntityPtr ent; + /* + * Assign new entity-node if available. + */ + ent = xmlGetDocEntity(destDoc, cur->name); + if (ent != NULL) { + cur->content = ent->content; + cur->children = (xmlNodePtr) ent; + cur->last = (xmlNodePtr) ent; + } + } + break; + default: + break; + } + if (cur->children != NULL) { + cur = cur->children; + continue; + } +next_sibling: + if (cur == (xmlNodePtr) attr) + break; + if (cur->next != NULL) + cur = cur->next; + else { + cur = cur->parent; + goto next_sibling; + } + } + return (0); +internal_error: + return (-1); +} + +/* +* xmlDOMWrapAdoptNode: +* @ctxt: the optional context for custom processing +* @sourceDoc: the optional sourceDoc +* @node: the node to start with +* @destDoc: the destination doc +* @destParent: the optional new parent of @node in @destDoc +* @options: option flags +* +* References of out-of scope ns-decls are remapped to point to @destDoc: +* 1) If @destParent is given, then nsDef entries on element-nodes are used +* 2) If *no* @destParent is given, then @destDoc->oldNs entries are used +* This is the case when you have an unliked node and just want to move it +* to the context of +* +* If @destParent is given, it ensures that the tree is namespace +* wellformed by creating additional ns-decls where needed. +* Note that, since prefixes of already existent ns-decls can be +* shadowed by this process, it could break QNames in attribute +* values or element content. +* NOTE: This function was not intensively tested. +* +* Returns 0 if the operation succeeded, +* 1 if a node of unsupported type was given, +* 2 if a node of not yet supported type was given and +* -1 on API/internal errors. +*/ +int +xmlDOMWrapAdoptNode(xmlDOMWrapCtxtPtr ctxt, + xmlDocPtr sourceDoc, + xmlNodePtr node, + xmlDocPtr destDoc, + xmlNodePtr destParent, + int options) +{ + if ((node == NULL) || (node->type == XML_NAMESPACE_DECL) || + (destDoc == NULL) || + ((destParent != NULL) && (destParent->doc != destDoc))) + return(-1); + /* + * Check node->doc sanity. + */ + if ((node->doc != NULL) && (sourceDoc != NULL) && + (node->doc != sourceDoc)) { + /* + * Might be an XIncluded node. + */ + return (-1); + } + if (sourceDoc == NULL) + sourceDoc = node->doc; + if (sourceDoc == destDoc) + return (-1); + switch (node->type) { + case XML_ELEMENT_NODE: + case XML_ATTRIBUTE_NODE: + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + case XML_ENTITY_REF_NODE: + case XML_PI_NODE: + case XML_COMMENT_NODE: + break; + case XML_DOCUMENT_FRAG_NODE: + /* TODO: Support document-fragment-nodes. */ + return (2); + default: + return (1); + } + /* + * Unlink only if @node was not already added to @destParent. + */ + if ((node->parent != NULL) && (destParent != node->parent)) + xmlUnlinkNode(node); + + if (node->type == XML_ELEMENT_NODE) { + return (xmlDOMWrapAdoptBranch(ctxt, sourceDoc, node, + destDoc, destParent, options)); + } else if (node->type == XML_ATTRIBUTE_NODE) { + return (xmlDOMWrapAdoptAttr(ctxt, sourceDoc, + (xmlAttrPtr) node, destDoc, destParent, options)); + } else { + xmlNodePtr cur = node; + int adoptStr = 1; + + cur->doc = destDoc; + /* + * Optimize string adoption. + */ + if ((sourceDoc != NULL) && + (sourceDoc->dict == destDoc->dict)) + adoptStr = 0; + switch (node->type) { + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + XML_TREE_ADOPT_STR_2(node->content) + break; + case XML_ENTITY_REF_NODE: + /* + * Remove reference to the entitity-node. + */ + node->content = NULL; + node->children = NULL; + node->last = NULL; + if ((destDoc->intSubset) || (destDoc->extSubset)) { + xmlEntityPtr ent; + /* + * Assign new entity-node if available. + */ + ent = xmlGetDocEntity(destDoc, node->name); + if (ent != NULL) { + node->content = ent->content; + node->children = (xmlNodePtr) ent; + node->last = (xmlNodePtr) ent; + } + } + XML_TREE_ADOPT_STR(node->name) + break; + case XML_PI_NODE: { + XML_TREE_ADOPT_STR(node->name) + XML_TREE_ADOPT_STR_2(node->content) + break; + } + default: + break; + } + } + return (0); +} + +#define bottom_tree +#include "elfgcchack.h" diff --git a/vendors/libxml/src/trio.c b/vendors/libxml/src/trio.c new file mode 100644 index 0000000..b116ccc --- /dev/null +++ b/vendors/libxml/src/trio.c @@ -0,0 +1,6869 @@ +/************************************************************************* + * + * $Id$ + * + * Copyright (C) 1998 Bjorn Reese and Daniel Stenberg. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF + * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND + * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. + * + ************************************************************************* + * + * A note to trio contributors: + * + * Avoid heap allocation at all costs to ensure that the trio functions + * are async-safe. The exceptions are the printf/fprintf functions, which + * uses fputc, and the asprintf functions and the modifier, which + * by design are required to allocate form the heap. + * + ************************************************************************/ + +/* + * TODO: + * - Scan is probably too permissive about its modifiers. + * - C escapes in %#[] ? + * - Multibyte characters (done for format parsing, except scan groups) + * - Complex numbers? (C99 _Complex) + * - Boolean values? (C99 _Bool) + * - C99 NaN(n-char-sequence) missing. The n-char-sequence can be used + * to print the mantissa, e.g. NaN(0xc000000000000000) + * - Should we support the GNU %a alloc modifier? GNU has an ugly hack + * for %a, because C99 used %a for other purposes. If specified as + * %as or %a[ it is interpreted as the alloc modifier, otherwise as + * the C99 hex-float. This means that you cannot scan %as as a hex-float + * immediately followed by an 's'. + * - Scanning of collating symbols. + */ + +/************************************************************************* + * Trio include files + */ +#include "triodef.h" +#include "trio.h" +#include "triop.h" +#include "trionan.h" +#if !defined(TRIO_MINIMAL) +# include "triostr.h" +#endif + +/************************************************************************** + * + * Definitions + * + *************************************************************************/ + +#include +#include +#include + +#if (defined(__STDC_ISO_10646__) || defined(MB_LEN_MAX) \ + || defined(USE_MULTIBYTE) || TRIO_WIDECHAR) \ + && !defined(_WIN32_WCE) +# define TRIO_COMPILER_SUPPORTS_MULTIBYTE +# if !defined(MB_LEN_MAX) +# define MB_LEN_MAX 6 +# endif +#endif + +#if (defined(TRIO_COMPILER_MSVC) && (_MSC_VER >= 1100)) || defined(TRIO_COMPILER_BCB) +# define TRIO_COMPILER_SUPPORTS_MSVC_INT +#endif + +#if defined(_WIN32_WCE) +#include +#endif + +/************************************************************************* + * Generic definitions + */ + +#if !(defined(DEBUG) || defined(NDEBUG)) +# define NDEBUG +#endif + +#include +#include +#if !defined(TRIO_COMPILER_SUPPORTS_C99) +# define isblank(x) (((x)==32) || ((x)==9)) +#endif +#if defined(TRIO_COMPILER_ANCIENT) +# include +#else +# include +#endif +#include + +#ifdef HAVE_ERRNO_H +#include +#endif + +#ifndef NULL +# define NULL 0 +#endif +#define NIL ((char)0) +#ifndef FALSE +# define FALSE (1 == 0) +# define TRUE (! FALSE) +#endif +#define BOOLEAN_T int + +/* mincore() can be used for debugging purposes */ +#define VALID(x) (NULL != (x)) + +#if TRIO_ERRORS + /* + * Encode the error code and the position. This is decoded + * with TRIO_ERROR_CODE and TRIO_ERROR_POSITION. + */ +# define TRIO_ERROR_RETURN(x,y) (- ((x) + ((y) << 8))) +#else +# define TRIO_ERROR_RETURN(x,y) (-1) +#endif + +typedef unsigned long trio_flags_t; + + +/************************************************************************* + * Platform specific definitions + */ +#if defined(TRIO_PLATFORM_UNIX) +# include +# include +# include +# define USE_LOCALE +#endif /* TRIO_PLATFORM_UNIX */ +#if defined(TRIO_PLATFORM_VMS) +# include +#endif +#if defined(TRIO_PLATFORM_WIN32) +# if defined(_WIN32_WCE) +# include +# else +# include +# define read _read +# define write _write +# endif +#endif /* TRIO_PLATFORM_WIN32 */ + +#if TRIO_WIDECHAR +# if defined(TRIO_COMPILER_SUPPORTS_ISO94) +# include +# include +typedef wchar_t trio_wchar_t; +typedef wint_t trio_wint_t; +# else +typedef char trio_wchar_t; +typedef int trio_wint_t; +# define WCONST(x) L ## x +# define WEOF EOF +# define iswalnum(x) isalnum(x) +# define iswalpha(x) isalpha(x) +# define iswblank(x) isblank(x) +# define iswcntrl(x) iscntrl(x) +# define iswdigit(x) isdigit(x) +# define iswgraph(x) isgraph(x) +# define iswlower(x) islower(x) +# define iswprint(x) isprint(x) +# define iswpunct(x) ispunct(x) +# define iswspace(x) isspace(x) +# define iswupper(x) isupper(x) +# define iswxdigit(x) isxdigit(x) +# endif +#endif + + +/************************************************************************* + * Compiler dependent definitions + */ + +/* Support for long long */ +#ifndef __cplusplus +# if !defined(USE_LONGLONG) +# if defined(TRIO_COMPILER_GCC) && !defined(__STRICT_ANSI__) +# define USE_LONGLONG +# elif defined(TRIO_COMPILER_SUNPRO) +# define USE_LONGLONG +# elif defined(_LONG_LONG) || defined(_LONGLONG) +# define USE_LONGLONG +# endif +# endif +#endif + +/* The extra long numbers */ +#if defined(USE_LONGLONG) +typedef signed long long int trio_longlong_t; +typedef unsigned long long int trio_ulonglong_t; +#elif defined(TRIO_COMPILER_SUPPORTS_MSVC_INT) +typedef signed __int64 trio_longlong_t; +typedef unsigned __int64 trio_ulonglong_t; +#else +typedef TRIO_SIGNED long int trio_longlong_t; +typedef unsigned long int trio_ulonglong_t; +#endif + +/* Maximal and fixed integer types */ +#if defined(TRIO_COMPILER_SUPPORTS_C99) +# include +typedef intmax_t trio_intmax_t; +typedef uintmax_t trio_uintmax_t; +typedef int8_t trio_int8_t; +typedef int16_t trio_int16_t; +typedef int32_t trio_int32_t; +typedef int64_t trio_int64_t; +#elif defined(TRIO_COMPILER_SUPPORTS_UNIX98) +# include +typedef intmax_t trio_intmax_t; +typedef uintmax_t trio_uintmax_t; +typedef int8_t trio_int8_t; +typedef int16_t trio_int16_t; +typedef int32_t trio_int32_t; +typedef int64_t trio_int64_t; +#elif defined(TRIO_COMPILER_SUPPORTS_MSVC_INT) +typedef trio_longlong_t trio_intmax_t; +typedef trio_ulonglong_t trio_uintmax_t; +typedef __int8 trio_int8_t; +typedef __int16 trio_int16_t; +typedef __int32 trio_int32_t; +typedef __int64 trio_int64_t; +#else +typedef trio_longlong_t trio_intmax_t; +typedef trio_ulonglong_t trio_uintmax_t; +# if defined(TRIO_INT8_T) +typedef TRIO_INT8_T trio_int8_t; +# else +typedef TRIO_SIGNED char trio_int8_t; +# endif +# if defined(TRIO_INT16_T) +typedef TRIO_INT16_T trio_int16_t; +# else +typedef TRIO_SIGNED short trio_int16_t; +# endif +# if defined(TRIO_INT32_T) +typedef TRIO_INT32_T trio_int32_t; +# else +typedef TRIO_SIGNED int trio_int32_t; +# endif +# if defined(TRIO_INT64_T) +typedef TRIO_INT64_T trio_int64_t; +# else +typedef trio_longlong_t trio_int64_t; +# endif +#endif + +#if (!(defined(TRIO_COMPILER_SUPPORTS_C99) \ + || defined(TRIO_COMPILER_SUPPORTS_UNIX01))) \ + && !defined(_WIN32_WCE) +# define floorl(x) floor((double)(x)) +# define fmodl(x,y) fmod((double)(x),(double)(y)) +# define powl(x,y) pow((double)(x),(double)(y)) +#endif + +#define TRIO_FABS(x) (((x) < 0.0) ? -(x) : (x)) + +/************************************************************************* + * Internal Definitions + */ + +#ifndef DECIMAL_DIG +# define DECIMAL_DIG DBL_DIG +#endif + +/* Long double sizes */ +#ifdef LDBL_DIG +# define MAX_MANTISSA_DIGITS LDBL_DIG +# define MAX_EXPONENT_DIGITS 4 +# define MAX_DOUBLE_DIGITS LDBL_MAX_10_EXP +#else +# define MAX_MANTISSA_DIGITS DECIMAL_DIG +# define MAX_EXPONENT_DIGITS 3 +# define MAX_DOUBLE_DIGITS DBL_MAX_10_EXP +#endif + +#if defined(TRIO_COMPILER_ANCIENT) || !defined(LDBL_DIG) +# undef LDBL_DIG +# undef LDBL_MANT_DIG +# undef LDBL_EPSILON +# define LDBL_DIG DBL_DIG +# define LDBL_MANT_DIG DBL_MANT_DIG +# define LDBL_EPSILON DBL_EPSILON +#endif + +/* The maximal number of digits is for base 2 */ +#define MAX_CHARS_IN(x) (sizeof(x) * CHAR_BIT) +/* The width of a pointer. The number of bits in a hex digit is 4 */ +#define POINTER_WIDTH ((sizeof("0x") - 1) + sizeof(trio_pointer_t) * CHAR_BIT / 4) + +/* Infinite and Not-A-Number for floating-point */ +#define INFINITE_LOWER "inf" +#define INFINITE_UPPER "INF" +#define LONG_INFINITE_LOWER "infinite" +#define LONG_INFINITE_UPPER "INFINITE" +#define NAN_LOWER "nan" +#define NAN_UPPER "NAN" + +/* Various constants */ +enum { + TYPE_PRINT = 1, + TYPE_SCAN = 2, + + /* Flags. FLAGS_LAST must be less than ULONG_MAX */ + FLAGS_NEW = 0, + FLAGS_STICKY = 1, + FLAGS_SPACE = 2 * FLAGS_STICKY, + FLAGS_SHOWSIGN = 2 * FLAGS_SPACE, + FLAGS_LEFTADJUST = 2 * FLAGS_SHOWSIGN, + FLAGS_ALTERNATIVE = 2 * FLAGS_LEFTADJUST, + FLAGS_SHORT = 2 * FLAGS_ALTERNATIVE, + FLAGS_SHORTSHORT = 2 * FLAGS_SHORT, + FLAGS_LONG = 2 * FLAGS_SHORTSHORT, + FLAGS_QUAD = 2 * FLAGS_LONG, + FLAGS_LONGDOUBLE = 2 * FLAGS_QUAD, + FLAGS_SIZE_T = 2 * FLAGS_LONGDOUBLE, + FLAGS_PTRDIFF_T = 2 * FLAGS_SIZE_T, + FLAGS_INTMAX_T = 2 * FLAGS_PTRDIFF_T, + FLAGS_NILPADDING = 2 * FLAGS_INTMAX_T, + FLAGS_UNSIGNED = 2 * FLAGS_NILPADDING, + FLAGS_UPPER = 2 * FLAGS_UNSIGNED, + FLAGS_WIDTH = 2 * FLAGS_UPPER, + FLAGS_WIDTH_PARAMETER = 2 * FLAGS_WIDTH, + FLAGS_PRECISION = 2 * FLAGS_WIDTH_PARAMETER, + FLAGS_PRECISION_PARAMETER = 2 * FLAGS_PRECISION, + FLAGS_BASE = 2 * FLAGS_PRECISION_PARAMETER, + FLAGS_BASE_PARAMETER = 2 * FLAGS_BASE, + FLAGS_FLOAT_E = 2 * FLAGS_BASE_PARAMETER, + FLAGS_FLOAT_G = 2 * FLAGS_FLOAT_E, + FLAGS_QUOTE = 2 * FLAGS_FLOAT_G, + FLAGS_WIDECHAR = 2 * FLAGS_QUOTE, + FLAGS_ALLOC = 2 * FLAGS_WIDECHAR, + FLAGS_IGNORE = 2 * FLAGS_ALLOC, + FLAGS_IGNORE_PARAMETER = 2 * FLAGS_IGNORE, + FLAGS_VARSIZE_PARAMETER = 2 * FLAGS_IGNORE_PARAMETER, + FLAGS_FIXED_SIZE = 2 * FLAGS_VARSIZE_PARAMETER, + FLAGS_LAST = FLAGS_FIXED_SIZE, + /* Reused flags */ + FLAGS_EXCLUDE = FLAGS_SHORT, + FLAGS_USER_DEFINED = FLAGS_IGNORE, + FLAGS_ROUNDING = FLAGS_INTMAX_T, + /* Compounded flags */ + FLAGS_ALL_VARSIZES = FLAGS_LONG | FLAGS_QUAD | FLAGS_INTMAX_T | FLAGS_PTRDIFF_T | FLAGS_SIZE_T, + FLAGS_ALL_SIZES = FLAGS_ALL_VARSIZES | FLAGS_SHORTSHORT | FLAGS_SHORT, + + NO_POSITION = -1, + NO_WIDTH = 0, + NO_PRECISION = -1, + NO_SIZE = -1, + + /* Do not change these */ + NO_BASE = -1, + MIN_BASE = 2, + MAX_BASE = 36, + BASE_BINARY = 2, + BASE_OCTAL = 8, + BASE_DECIMAL = 10, + BASE_HEX = 16, + + /* Maximal number of allowed parameters */ + MAX_PARAMETERS = 64, + /* Maximal number of characters in class */ + MAX_CHARACTER_CLASS = UCHAR_MAX + 1, + + /* Maximal string lengths for user-defined specifiers */ + MAX_USER_NAME = 64, + MAX_USER_DATA = 256, + + /* Maximal length of locale separator strings */ + MAX_LOCALE_SEPARATOR_LENGTH = MB_LEN_MAX, + /* Maximal number of integers in grouping */ + MAX_LOCALE_GROUPS = 64, + + /* Initial size of asprintf buffer */ + DYNAMIC_START_SIZE = 32 +}; + +#define NO_GROUPING ((int)CHAR_MAX) + +/* Fundamental formatting parameter types */ +#define FORMAT_UNKNOWN 0 +#define FORMAT_INT 1 +#define FORMAT_DOUBLE 2 +#define FORMAT_CHAR 3 +#define FORMAT_STRING 4 +#define FORMAT_POINTER 5 +#define FORMAT_COUNT 6 +#define FORMAT_PARAMETER 7 +#define FORMAT_GROUP 8 +#if TRIO_GNU +# define FORMAT_ERRNO 9 +#endif +#if TRIO_EXTENSION +# define FORMAT_USER_DEFINED 10 +#endif + +/* Character constants */ +#define CHAR_IDENTIFIER '%' +#define CHAR_BACKSLASH '\\' +#define CHAR_QUOTE '\"' +#define CHAR_ADJUST ' ' + +/* Character class expressions */ +#define CLASS_ALNUM "[:alnum:]" +#define CLASS_ALPHA "[:alpha:]" +#define CLASS_BLANK "[:blank:]" +#define CLASS_CNTRL "[:cntrl:]" +#define CLASS_DIGIT "[:digit:]" +#define CLASS_GRAPH "[:graph:]" +#define CLASS_LOWER "[:lower:]" +#define CLASS_PRINT "[:print:]" +#define CLASS_PUNCT "[:punct:]" +#define CLASS_SPACE "[:space:]" +#define CLASS_UPPER "[:upper:]" +#define CLASS_XDIGIT "[:xdigit:]" + +/* + * SPECIFIERS: + * + * + * a Hex-float + * A Hex-float + * c Character + * C Widechar character (wint_t) + * d Decimal + * e Float + * E Float + * F Float + * F Float + * g Float + * G Float + * i Integer + * m Error message + * n Count + * o Octal + * p Pointer + * s String + * S Widechar string (wchar_t *) + * u Unsigned + * x Hex + * X Hex + * [] Group + * <> User-defined + * + * Reserved: + * + * D Binary Coded Decimal %D(length,precision) (OS/390) + */ +#define SPECIFIER_CHAR 'c' +#define SPECIFIER_STRING 's' +#define SPECIFIER_DECIMAL 'd' +#define SPECIFIER_INTEGER 'i' +#define SPECIFIER_UNSIGNED 'u' +#define SPECIFIER_OCTAL 'o' +#define SPECIFIER_HEX 'x' +#define SPECIFIER_HEX_UPPER 'X' +#define SPECIFIER_FLOAT_E 'e' +#define SPECIFIER_FLOAT_E_UPPER 'E' +#define SPECIFIER_FLOAT_F 'f' +#define SPECIFIER_FLOAT_F_UPPER 'F' +#define SPECIFIER_FLOAT_G 'g' +#define SPECIFIER_FLOAT_G_UPPER 'G' +#define SPECIFIER_POINTER 'p' +#define SPECIFIER_GROUP '[' +#define SPECIFIER_UNGROUP ']' +#define SPECIFIER_COUNT 'n' +#if TRIO_UNIX98 +# define SPECIFIER_CHAR_UPPER 'C' +# define SPECIFIER_STRING_UPPER 'S' +#endif +#if TRIO_C99 +# define SPECIFIER_HEXFLOAT 'a' +# define SPECIFIER_HEXFLOAT_UPPER 'A' +#endif +#if TRIO_GNU +# define SPECIFIER_ERRNO 'm' +#endif +#if TRIO_EXTENSION +# define SPECIFIER_BINARY 'b' +# define SPECIFIER_BINARY_UPPER 'B' +# define SPECIFIER_USER_DEFINED_BEGIN '<' +# define SPECIFIER_USER_DEFINED_END '>' +# define SPECIFIER_USER_DEFINED_SEPARATOR ':' +#endif + +/* + * QUALIFIERS: + * + * + * Numbers = d,i,o,u,x,X + * Float = a,A,e,E,f,F,g,G + * String = s + * Char = c + * + * + * 9$ Position + * Use the 9th parameter. 9 can be any number between 1 and + * the maximal argument + * + * 9 Width + * Set width to 9. 9 can be any number, but must not be postfixed + * by '$' + * + * h Short + * Numbers: + * (unsigned) short int + * + * hh Short short + * Numbers: + * (unsigned) char + * + * l Long + * Numbers: + * (unsigned) long int + * String: + * as the S specifier + * Char: + * as the C specifier + * + * ll Long Long + * Numbers: + * (unsigned) long long int + * + * L Long Double + * Float + * long double + * + * # Alternative + * Float: + * Decimal-point is always present + * String: + * non-printable characters are handled as \number + * + * Spacing + * + * + Sign + * + * - Alignment + * + * . Precision + * + * * Parameter + * print: use parameter + * scan: no parameter (ignore) + * + * q Quad + * + * Z size_t + * + * w Widechar + * + * ' Thousands/quote + * Numbers: + * Integer part grouped in thousands + * Binary numbers: + * Number grouped in nibbles (4 bits) + * String: + * Quoted string + * + * j intmax_t + * t prtdiff_t + * z size_t + * + * ! Sticky + * @ Parameter (for both print and scan) + * + * I n-bit Integer + * Numbers: + * The following options exists + * I8 = 8-bit integer + * I16 = 16-bit integer + * I32 = 32-bit integer + * I64 = 64-bit integer + */ +#define QUALIFIER_POSITION '$' +#define QUALIFIER_SHORT 'h' +#define QUALIFIER_LONG 'l' +#define QUALIFIER_LONG_UPPER 'L' +#define QUALIFIER_ALTERNATIVE '#' +#define QUALIFIER_SPACE ' ' +#define QUALIFIER_PLUS '+' +#define QUALIFIER_MINUS '-' +#define QUALIFIER_DOT '.' +#define QUALIFIER_STAR '*' +#define QUALIFIER_CIRCUMFLEX '^' /* For scanlists */ +#if TRIO_C99 +# define QUALIFIER_SIZE_T 'z' +# define QUALIFIER_PTRDIFF_T 't' +# define QUALIFIER_INTMAX_T 'j' +#endif +#if TRIO_BSD || TRIO_GNU +# define QUALIFIER_QUAD 'q' +#endif +#if TRIO_GNU +# define QUALIFIER_SIZE_T_UPPER 'Z' +#endif +#if TRIO_MISC +# define QUALIFIER_WIDECHAR 'w' +#endif +#if TRIO_MICROSOFT +# define QUALIFIER_FIXED_SIZE 'I' +#endif +#if TRIO_EXTENSION +# define QUALIFIER_QUOTE '\'' +# define QUALIFIER_STICKY '!' +# define QUALIFIER_VARSIZE '&' /* This should remain undocumented */ +# define QUALIFIER_PARAM '@' /* Experimental */ +# define QUALIFIER_COLON ':' /* For scanlists */ +# define QUALIFIER_EQUAL '=' /* For scanlists */ +# define QUALIFIER_ROUNDING_UPPER 'R' +#endif + + +/************************************************************************* + * + * Internal Structures + * + *************************************************************************/ + +/* Parameters */ +typedef struct { + /* An indication of which entry in the data union is used */ + int type; + /* The flags */ + trio_flags_t flags; + /* The width qualifier */ + int width; + /* The precision qualifier */ + int precision; + /* The base qualifier */ + int base; + /* The size for the variable size qualifier */ + int varsize; + /* The marker of the end of the specifier */ + int indexAfterSpecifier; + /* The data from the argument list */ + union { + char *string; +#if TRIO_WIDECHAR + trio_wchar_t *wstring; +#endif + trio_pointer_t pointer; + union { + trio_intmax_t as_signed; + trio_uintmax_t as_unsigned; + } number; + double doubleNumber; + double *doublePointer; + trio_long_double_t longdoubleNumber; + trio_long_double_t *longdoublePointer; + int errorNumber; + } data; + /* For the user-defined specifier */ + char user_name[MAX_USER_NAME]; + char user_data[MAX_USER_DATA]; +} trio_parameter_t; + +/* Container for customized functions */ +typedef struct { + union { + trio_outstream_t out; + trio_instream_t in; + } stream; + trio_pointer_t closure; +} trio_custom_t; + +/* General trio "class" */ +typedef struct _trio_class_t { + /* + * The function to write characters to a stream. + */ + void (*OutStream) TRIO_PROTO((struct _trio_class_t *, int)); + /* + * The function to read characters from a stream. + */ + void (*InStream) TRIO_PROTO((struct _trio_class_t *, int *)); + /* + * The current location in the stream. + */ + trio_pointer_t location; + /* + * The character currently being processed. + */ + int current; + /* + * The number of characters that would have been written/read + * if there had been sufficient space. + */ + int processed; + /* + * The number of characters that are actually written/read. + * Processed and committed will only differ for the *nprintf + * and *nscanf functions. + */ + int committed; + /* + * The upper limit of characters that may be written/read. + */ + int max; + /* + * The last output error that was detected. + */ + int error; +} trio_class_t; + +/* References (for user-defined callbacks) */ +typedef struct _trio_reference_t { + trio_class_t *data; + trio_parameter_t *parameter; +} trio_reference_t; + +/* Registered entries (for user-defined callbacks) */ +typedef struct _trio_userdef_t { + struct _trio_userdef_t *next; + trio_callback_t callback; + char *name; +} trio_userdef_t; + +/************************************************************************* + * + * Internal Variables + * + *************************************************************************/ + +static TRIO_CONST char rcsid[] = "@(#)$Id$"; + +/* + * Need this to workaround a parser bug in HP C/iX compiler that fails + * to resolves macro definitions that includes type 'long double', + * e.g: va_arg(arg_ptr, long double) + */ +#if defined(TRIO_PLATFORM_MPEIX) +static TRIO_CONST trio_long_double_t ___dummy_long_double = 0; +#endif + +static TRIO_CONST char internalNullString[] = "(nil)"; + +#if defined(USE_LOCALE) +static struct lconv *internalLocaleValues = NULL; +#endif + +/* + * UNIX98 says "in a locale where the radix character is not defined, + * the radix character defaults to a period (.)" + */ +static int internalDecimalPointLength = 1; +static int internalThousandSeparatorLength = 1; +static char internalDecimalPoint = '.'; +static char internalDecimalPointString[MAX_LOCALE_SEPARATOR_LENGTH + 1] = "."; +static char internalThousandSeparator[MAX_LOCALE_SEPARATOR_LENGTH + 1] = ","; +static char internalGrouping[MAX_LOCALE_GROUPS] = { (char)NO_GROUPING }; + +static TRIO_CONST char internalDigitsLower[] = "0123456789abcdefghijklmnopqrstuvwxyz"; +static TRIO_CONST char internalDigitsUpper[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; +static BOOLEAN_T internalDigitsUnconverted = TRUE; +static int internalDigitArray[128]; +#if TRIO_EXTENSION +static BOOLEAN_T internalCollationUnconverted = TRUE; +static char internalCollationArray[MAX_CHARACTER_CLASS][MAX_CHARACTER_CLASS]; +#endif + +#if TRIO_EXTENSION +static TRIO_VOLATILE trio_callback_t internalEnterCriticalRegion = NULL; +static TRIO_VOLATILE trio_callback_t internalLeaveCriticalRegion = NULL; +static trio_userdef_t *internalUserDef = NULL; +#endif + + +/************************************************************************* + * + * Internal Functions + * + ************************************************************************/ + +#if defined(TRIO_MINIMAL) +# define TRIO_STRING_PUBLIC static +# include "triostr.c" +#endif /* defined(TRIO_MINIMAL) */ + +/************************************************************************* + * TrioIsQualifier + * + * Description: + * Remember to add all new qualifiers to this function. + * QUALIFIER_POSITION must not be added. + */ +TRIO_PRIVATE BOOLEAN_T +TrioIsQualifier +TRIO_ARGS1((character), + TRIO_CONST char character) +{ + /* QUALIFIER_POSITION is not included */ + switch (character) + { + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + case QUALIFIER_PLUS: + case QUALIFIER_MINUS: + case QUALIFIER_SPACE: + case QUALIFIER_DOT: + case QUALIFIER_STAR: + case QUALIFIER_ALTERNATIVE: + case QUALIFIER_SHORT: + case QUALIFIER_LONG: + case QUALIFIER_LONG_UPPER: + case QUALIFIER_CIRCUMFLEX: +#if defined(QUALIFIER_SIZE_T) + case QUALIFIER_SIZE_T: +#endif +#if defined(QUALIFIER_PTRDIFF_T) + case QUALIFIER_PTRDIFF_T: +#endif +#if defined(QUALIFIER_INTMAX_T) + case QUALIFIER_INTMAX_T: +#endif +#if defined(QUALIFIER_QUAD) + case QUALIFIER_QUAD: +#endif +#if defined(QUALIFIER_SIZE_T_UPPER) + case QUALIFIER_SIZE_T_UPPER: +#endif +#if defined(QUALIFIER_WIDECHAR) + case QUALIFIER_WIDECHAR: +#endif +#if defined(QUALIFIER_QUOTE) + case QUALIFIER_QUOTE: +#endif +#if defined(QUALIFIER_STICKY) + case QUALIFIER_STICKY: +#endif +#if defined(QUALIFIER_VARSIZE) + case QUALIFIER_VARSIZE: +#endif +#if defined(QUALIFIER_PARAM) + case QUALIFIER_PARAM: +#endif +#if defined(QUALIFIER_FIXED_SIZE) + case QUALIFIER_FIXED_SIZE: +#endif +#if defined(QUALIFIER_ROUNDING_UPPER) + case QUALIFIER_ROUNDING_UPPER: +#endif + return TRUE; + default: + return FALSE; + } +} + +/************************************************************************* + * TrioSetLocale + */ +#if defined(USE_LOCALE) +TRIO_PRIVATE void +TrioSetLocale(TRIO_NOARGS) +{ + internalLocaleValues = (struct lconv *)localeconv(); + if (internalLocaleValues) + { + if ((internalLocaleValues->decimal_point) && + (internalLocaleValues->decimal_point[0] != NIL)) + { + internalDecimalPointLength = trio_length(internalLocaleValues->decimal_point); + if (internalDecimalPointLength == 1) + { + internalDecimalPoint = internalLocaleValues->decimal_point[0]; + } + else + { + internalDecimalPoint = NIL; + trio_copy_max(internalDecimalPointString, + sizeof(internalDecimalPointString), + internalLocaleValues->decimal_point); + } + } + if ((internalLocaleValues->thousands_sep) && + (internalLocaleValues->thousands_sep[0] != NIL)) + { + trio_copy_max(internalThousandSeparator, + sizeof(internalThousandSeparator), + internalLocaleValues->thousands_sep); + internalThousandSeparatorLength = trio_length(internalThousandSeparator); + } + if ((internalLocaleValues->grouping) && + (internalLocaleValues->grouping[0] != NIL)) + { + trio_copy_max(internalGrouping, + sizeof(internalGrouping), + internalLocaleValues->grouping); + } + } +} +#endif /* defined(USE_LOCALE) */ + +TRIO_PRIVATE int +TrioCalcThousandSeparatorLength +TRIO_ARGS1((digits), + int digits) +{ +#if TRIO_EXTENSION + int count = 0; + int step = NO_GROUPING; + char *groupingPointer = internalGrouping; + + while (digits > 0) + { + if (*groupingPointer == CHAR_MAX) + { + /* Disable grouping */ + break; /* while */ + } + else if (*groupingPointer == 0) + { + /* Repeat last group */ + if (step == NO_GROUPING) + { + /* Error in locale */ + break; /* while */ + } + } + else + { + step = *groupingPointer++; + } + if (digits > step) + count += internalThousandSeparatorLength; + digits -= step; + } + return count; +#else + return 0; +#endif +} + +TRIO_PRIVATE BOOLEAN_T +TrioFollowedBySeparator +TRIO_ARGS1((position), + int position) +{ +#if TRIO_EXTENSION + int step = 0; + char *groupingPointer = internalGrouping; + + position--; + if (position == 0) + return FALSE; + while (position > 0) + { + if (*groupingPointer == CHAR_MAX) + { + /* Disable grouping */ + break; /* while */ + } + else if (*groupingPointer != 0) + { + step = *groupingPointer++; + } + if (step == 0) + break; + position -= step; + } + return (position == 0); +#else + return FALSE; +#endif +} + +/************************************************************************* + * TrioGetPosition + * + * Get the %n$ position. + */ +TRIO_PRIVATE int +TrioGetPosition +TRIO_ARGS2((format, indexPointer), + TRIO_CONST char *format, + int *indexPointer) +{ +#if TRIO_UNIX98 + char *tmpformat; + int number = 0; + int index = *indexPointer; + + number = (int)trio_to_long(&format[index], &tmpformat, BASE_DECIMAL); + index = (int)(tmpformat - format); + if ((number != 0) && (QUALIFIER_POSITION == format[index++])) + { + *indexPointer = index; + /* + * number is decreased by 1, because n$ starts from 1, whereas + * the array it is indexing starts from 0. + */ + return number - 1; + } +#endif + return NO_POSITION; +} + +#if TRIO_EXTENSION +/************************************************************************* + * TrioFindNamespace + * + * Find registered user-defined specifier. + * The prev argument is used for optimization only. + */ +TRIO_PRIVATE trio_userdef_t * +TrioFindNamespace +TRIO_ARGS2((name, prev), + TRIO_CONST char *name, + trio_userdef_t **prev) +{ + trio_userdef_t *def; + + if (internalEnterCriticalRegion) + (void)internalEnterCriticalRegion(NULL); + + for (def = internalUserDef; def; def = def->next) + { + /* Case-sensitive string comparison */ + if (trio_equal_case(def->name, name)) + break; + + if (prev) + *prev = def; + } + + if (internalLeaveCriticalRegion) + (void)internalLeaveCriticalRegion(NULL); + + return def; +} +#endif + +/************************************************************************* + * TrioPower + * + * Description: + * Calculate pow(base, exponent), where number and exponent are integers. + */ +TRIO_PRIVATE trio_long_double_t +TrioPower +TRIO_ARGS2((number, exponent), + int number, + int exponent) +{ + trio_long_double_t result; + + if (number == 10) + { + switch (exponent) + { + /* Speed up calculation of common cases */ + case 0: + result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E-1); + break; + case 1: + result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+0); + break; + case 2: + result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+1); + break; + case 3: + result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+2); + break; + case 4: + result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+3); + break; + case 5: + result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+4); + break; + case 6: + result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+5); + break; + case 7: + result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+6); + break; + case 8: + result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+7); + break; + case 9: + result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+8); + break; + default: + result = powl((trio_long_double_t)number, + (trio_long_double_t)exponent); + break; + } + } + else + { + return powl((trio_long_double_t)number, (trio_long_double_t)exponent); + } + return result; +} + +/************************************************************************* + * TrioLogarithm + */ +TRIO_PRIVATE double +TrioLogarithm +TRIO_ARGS2((number, base), + double number, + int base) +{ + double result; + + if (number <= 0.0) + { + /* xlC crashes on log(0) */ + result = (number == 0.0) ? trio_ninf() : trio_nan(); + } + else + { + if (base == 10) + { + result = log10(number); + } + else + { + result = log10(number) / log10((double)base); + } + } + return result; +} + +/************************************************************************* + * TrioLogarithmBase + */ +TRIO_PRIVATE double +TrioLogarithmBase +TRIO_ARGS1((base), + int base) +{ + switch (base) + { + case BASE_BINARY : return 1.0; + case BASE_OCTAL : return 3.0; + case BASE_DECIMAL: return 3.321928094887362345; + case BASE_HEX : return 4.0; + default : return TrioLogarithm((double)base, 2); + } +} + +/************************************************************************* + * TrioParse + * + * Description: + * Parse the format string + */ +TRIO_PRIVATE int +TrioParse +TRIO_ARGS5((type, format, parameters, arglist, argarray), + int type, + TRIO_CONST char *format, + trio_parameter_t *parameters, + va_list *arglist, + trio_pointer_t *argarray) +{ + /* Count the number of times a parameter is referenced */ + unsigned short usedEntries[MAX_PARAMETERS]; + /* Parameter counters */ + int parameterPosition; + int currentParam; + int maxParam = -1; + /* Utility variables */ + trio_flags_t flags; + int width; + int precision; + int varsize; + int base; + int index; /* Index into formatting string */ + int dots; /* Count number of dots in modifier part */ + BOOLEAN_T positional; /* Does the specifier have a positional? */ + BOOLEAN_T gotSticky = FALSE; /* Are there any sticky modifiers at all? */ + /* + * indices specifies the order in which the parameters must be + * read from the va_args (this is necessary to handle positionals) + */ + int indices[MAX_PARAMETERS]; + int pos = 0; + /* Various variables */ + char ch; +#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) + int charlen; +#endif + int save_errno; + int i = -1; + int num; + char *tmpformat; + + /* One and only one of arglist and argarray must be used */ + assert((arglist != NULL) ^ (argarray != NULL)); + + /* + * The 'parameters' array is not initialized, but we need to + * know which entries we have used. + */ + memset(usedEntries, 0, sizeof(usedEntries)); + + save_errno = errno; + index = 0; + parameterPosition = 0; +#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) + (void)mblen(NULL, 0); +#endif + + while (format[index]) + { +#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) + if (! isascii(format[index])) + { + /* + * Multibyte characters cannot be legal specifiers or + * modifiers, so we skip over them. + */ + charlen = mblen(&format[index], MB_LEN_MAX); + index += (charlen > 0) ? charlen : 1; + continue; /* while */ + } +#endif /* TRIO_COMPILER_SUPPORTS_MULTIBYTE */ + if (CHAR_IDENTIFIER == format[index++]) + { + if (CHAR_IDENTIFIER == format[index]) + { + index++; + continue; /* while */ + } + + flags = FLAGS_NEW; + dots = 0; + currentParam = TrioGetPosition(format, &index); + positional = (NO_POSITION != currentParam); + if (!positional) + { + /* We have no positional, get the next counter */ + currentParam = parameterPosition; + } + if(currentParam >= MAX_PARAMETERS) + { + /* Bail out completely to make the error more obvious */ + return TRIO_ERROR_RETURN(TRIO_ETOOMANY, index); + } + + if (currentParam > maxParam) + maxParam = currentParam; + + /* Default values */ + width = NO_WIDTH; + precision = NO_PRECISION; + base = NO_BASE; + varsize = NO_SIZE; + + while (TrioIsQualifier(format[index])) + { + ch = format[index++]; + + switch (ch) + { + case QUALIFIER_SPACE: + flags |= FLAGS_SPACE; + break; + + case QUALIFIER_PLUS: + flags |= FLAGS_SHOWSIGN; + break; + + case QUALIFIER_MINUS: + flags |= FLAGS_LEFTADJUST; + flags &= ~FLAGS_NILPADDING; + break; + + case QUALIFIER_ALTERNATIVE: + flags |= FLAGS_ALTERNATIVE; + break; + + case QUALIFIER_DOT: + if (dots == 0) /* Precision */ + { + dots++; + + /* Skip if no precision */ + if (QUALIFIER_DOT == format[index]) + break; + + /* After the first dot we have the precision */ + flags |= FLAGS_PRECISION; + if ((QUALIFIER_STAR == format[index]) +#if defined(QUALIFIER_PARAM) + || (QUALIFIER_PARAM == format[index]) +#endif + ) + { + index++; + flags |= FLAGS_PRECISION_PARAMETER; + + precision = TrioGetPosition(format, &index); + if (precision == NO_POSITION) + { + parameterPosition++; + if (positional) + precision = parameterPosition; + else + { + precision = currentParam; + currentParam = precision + 1; + } + } + else + { + if (! positional) + currentParam = precision + 1; + if (width > maxParam) + maxParam = precision; + } + if (currentParam > maxParam) + maxParam = currentParam; + } + else + { + precision = trio_to_long(&format[index], + &tmpformat, + BASE_DECIMAL); + index = (int)(tmpformat - format); + } + } + else if (dots == 1) /* Base */ + { + dots++; + + /* After the second dot we have the base */ + flags |= FLAGS_BASE; + if ((QUALIFIER_STAR == format[index]) +#if defined(QUALIFIER_PARAM) + || (QUALIFIER_PARAM == format[index]) +#endif + ) + { + index++; + flags |= FLAGS_BASE_PARAMETER; + base = TrioGetPosition(format, &index); + if (base == NO_POSITION) + { + parameterPosition++; + if (positional) + base = parameterPosition; + else + { + base = currentParam; + currentParam = base + 1; + } + } + else + { + if (! positional) + currentParam = base + 1; + if (base > maxParam) + maxParam = base; + } + if (currentParam > maxParam) + maxParam = currentParam; + } + else + { + base = trio_to_long(&format[index], + &tmpformat, + BASE_DECIMAL); + if (base > MAX_BASE) + return TRIO_ERROR_RETURN(TRIO_EINVAL, index); + index = (int)(tmpformat - format); + } + } + else + { + return TRIO_ERROR_RETURN(TRIO_EINVAL, index); + } + break; /* QUALIFIER_DOT */ + +#if defined(QUALIFIER_PARAM) + case QUALIFIER_PARAM: + type = TYPE_PRINT; + /* FALLTHROUGH */ +#endif + case QUALIFIER_STAR: + /* This has different meanings for print and scan */ + if (TYPE_PRINT == type) + { + /* Read with from parameter */ + flags |= (FLAGS_WIDTH | FLAGS_WIDTH_PARAMETER); + width = TrioGetPosition(format, &index); + if (width == NO_POSITION) + { + parameterPosition++; + if (positional) + width = parameterPosition; + else + { + width = currentParam; + currentParam = width + 1; + } + } + else + { + if (! positional) + currentParam = width + 1; + if (width > maxParam) + maxParam = width; + } + if (currentParam > maxParam) + maxParam = currentParam; + } + else + { + /* Scan, but do not store result */ + flags |= FLAGS_IGNORE; + } + + break; /* QUALIFIER_STAR */ + + case '0': + if (! (flags & FLAGS_LEFTADJUST)) + flags |= FLAGS_NILPADDING; + /* FALLTHROUGH */ + case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + flags |= FLAGS_WIDTH; + /* &format[index - 1] is used to "rewind" the read + * character from format + */ + width = trio_to_long(&format[index - 1], + &tmpformat, + BASE_DECIMAL); + index = (int)(tmpformat - format); + break; + + case QUALIFIER_SHORT: + if (flags & FLAGS_SHORTSHORT) + return TRIO_ERROR_RETURN(TRIO_EINVAL, index); + else if (flags & FLAGS_SHORT) + flags |= FLAGS_SHORTSHORT; + else + flags |= FLAGS_SHORT; + break; + + case QUALIFIER_LONG: + if (flags & FLAGS_QUAD) + return TRIO_ERROR_RETURN(TRIO_EINVAL, index); + else if (flags & FLAGS_LONG) + flags |= FLAGS_QUAD; + else + flags |= FLAGS_LONG; + break; + + case QUALIFIER_LONG_UPPER: + flags |= FLAGS_LONGDOUBLE; + break; + +#if defined(QUALIFIER_SIZE_T) + case QUALIFIER_SIZE_T: + flags |= FLAGS_SIZE_T; + /* Modify flags for later truncation of number */ + if (sizeof(size_t) == sizeof(trio_ulonglong_t)) + flags |= FLAGS_QUAD; + else if (sizeof(size_t) == sizeof(long)) + flags |= FLAGS_LONG; + break; +#endif + +#if defined(QUALIFIER_PTRDIFF_T) + case QUALIFIER_PTRDIFF_T: + flags |= FLAGS_PTRDIFF_T; + if (sizeof(ptrdiff_t) == sizeof(trio_ulonglong_t)) + flags |= FLAGS_QUAD; + else if (sizeof(ptrdiff_t) == sizeof(long)) + flags |= FLAGS_LONG; + break; +#endif + +#if defined(QUALIFIER_INTMAX_T) + case QUALIFIER_INTMAX_T: + flags |= FLAGS_INTMAX_T; + if (sizeof(trio_intmax_t) == sizeof(trio_ulonglong_t)) + flags |= FLAGS_QUAD; + else if (sizeof(trio_intmax_t) == sizeof(long)) + flags |= FLAGS_LONG; + break; +#endif + +#if defined(QUALIFIER_QUAD) + case QUALIFIER_QUAD: + flags |= FLAGS_QUAD; + break; +#endif + +#if defined(QUALIFIER_FIXED_SIZE) + case QUALIFIER_FIXED_SIZE: + if (flags & FLAGS_FIXED_SIZE) + return TRIO_ERROR_RETURN(TRIO_EINVAL, index); + + if (flags & (FLAGS_ALL_SIZES | FLAGS_LONGDOUBLE | + FLAGS_WIDECHAR | FLAGS_VARSIZE_PARAMETER)) + return TRIO_ERROR_RETURN(TRIO_EINVAL, index); + + if ((format[index] == '6') && + (format[index + 1] == '4')) + { + varsize = sizeof(trio_int64_t); + index += 2; + } + else if ((format[index] == '3') && + (format[index + 1] == '2')) + { + varsize = sizeof(trio_int32_t); + index += 2; + } + else if ((format[index] == '1') && + (format[index + 1] == '6')) + { + varsize = sizeof(trio_int16_t); + index += 2; + } + else if (format[index] == '8') + { + varsize = sizeof(trio_int8_t); + index++; + } + else + return TRIO_ERROR_RETURN(TRIO_EINVAL, index); + + flags |= FLAGS_FIXED_SIZE; + break; +#endif + +#if defined(QUALIFIER_WIDECHAR) + case QUALIFIER_WIDECHAR: + flags |= FLAGS_WIDECHAR; + break; +#endif + +#if defined(QUALIFIER_SIZE_T_UPPER) + case QUALIFIER_SIZE_T_UPPER: + break; +#endif + +#if defined(QUALIFIER_QUOTE) + case QUALIFIER_QUOTE: + flags |= FLAGS_QUOTE; + break; +#endif + +#if defined(QUALIFIER_STICKY) + case QUALIFIER_STICKY: + flags |= FLAGS_STICKY; + gotSticky = TRUE; + break; +#endif + +#if defined(QUALIFIER_VARSIZE) + case QUALIFIER_VARSIZE: + flags |= FLAGS_VARSIZE_PARAMETER; + parameterPosition++; + if (positional) + varsize = parameterPosition; + else + { + varsize = currentParam; + currentParam = varsize + 1; + } + if (currentParam > maxParam) + maxParam = currentParam; + break; +#endif + +#if defined(QUALIFIER_ROUNDING_UPPER) + case QUALIFIER_ROUNDING_UPPER: + flags |= FLAGS_ROUNDING; + break; +#endif + + default: + /* Bail out completely to make the error more obvious */ + return TRIO_ERROR_RETURN(TRIO_EINVAL, index); + } + } /* while qualifier */ + + /* + * Parameters only need the type and value. The value is + * read later. + */ + if (flags & FLAGS_WIDTH_PARAMETER) + { + usedEntries[width] += 1; + parameters[pos].type = FORMAT_PARAMETER; + parameters[pos].flags = 0; + indices[width] = pos; + width = pos++; + } + if (flags & FLAGS_PRECISION_PARAMETER) + { + usedEntries[precision] += 1; + parameters[pos].type = FORMAT_PARAMETER; + parameters[pos].flags = 0; + indices[precision] = pos; + precision = pos++; + } + if (flags & FLAGS_BASE_PARAMETER) + { + usedEntries[base] += 1; + parameters[pos].type = FORMAT_PARAMETER; + parameters[pos].flags = 0; + indices[base] = pos; + base = pos++; + } + if (flags & FLAGS_VARSIZE_PARAMETER) + { + usedEntries[varsize] += 1; + parameters[pos].type = FORMAT_PARAMETER; + parameters[pos].flags = 0; + indices[varsize] = pos; + varsize = pos++; + } + + indices[currentParam] = pos; + + switch (format[index++]) + { +#if defined(SPECIFIER_CHAR_UPPER) + case SPECIFIER_CHAR_UPPER: + flags |= FLAGS_WIDECHAR; + /* FALLTHROUGH */ +#endif + case SPECIFIER_CHAR: + if (flags & FLAGS_LONG) + flags |= FLAGS_WIDECHAR; + else if (flags & FLAGS_SHORT) + flags &= ~FLAGS_WIDECHAR; + parameters[pos].type = FORMAT_CHAR; + break; + +#if defined(SPECIFIER_STRING_UPPER) + case SPECIFIER_STRING_UPPER: + flags |= FLAGS_WIDECHAR; + /* FALLTHROUGH */ +#endif + case SPECIFIER_STRING: + if (flags & FLAGS_LONG) + flags |= FLAGS_WIDECHAR; + else if (flags & FLAGS_SHORT) + flags &= ~FLAGS_WIDECHAR; + parameters[pos].type = FORMAT_STRING; + break; + + case SPECIFIER_GROUP: + if (TYPE_SCAN == type) + { + int depth = 1; + parameters[pos].type = FORMAT_GROUP; + if (format[index] == QUALIFIER_CIRCUMFLEX) + index++; + if (format[index] == SPECIFIER_UNGROUP) + index++; + if (format[index] == QUALIFIER_MINUS) + index++; + /* Skip nested brackets */ + while (format[index] != NIL) + { + if (format[index] == SPECIFIER_GROUP) + { + depth++; + } + else if (format[index] == SPECIFIER_UNGROUP) + { + if (--depth <= 0) + { + index++; + break; + } + } + index++; + } + } + break; + + case SPECIFIER_INTEGER: + parameters[pos].type = FORMAT_INT; + break; + + case SPECIFIER_UNSIGNED: + flags |= FLAGS_UNSIGNED; + parameters[pos].type = FORMAT_INT; + break; + + case SPECIFIER_DECIMAL: + /* Disable base modifier */ + flags &= ~FLAGS_BASE_PARAMETER; + base = BASE_DECIMAL; + parameters[pos].type = FORMAT_INT; + break; + + case SPECIFIER_OCTAL: + flags |= FLAGS_UNSIGNED; + flags &= ~FLAGS_BASE_PARAMETER; + base = BASE_OCTAL; + parameters[pos].type = FORMAT_INT; + break; + +#if defined(SPECIFIER_BINARY) + case SPECIFIER_BINARY_UPPER: + flags |= FLAGS_UPPER; + /* FALLTHROUGH */ + case SPECIFIER_BINARY: + flags |= FLAGS_NILPADDING; + flags &= ~FLAGS_BASE_PARAMETER; + base = BASE_BINARY; + parameters[pos].type = FORMAT_INT; + break; +#endif + + case SPECIFIER_HEX_UPPER: + flags |= FLAGS_UPPER; + /* FALLTHROUGH */ + case SPECIFIER_HEX: + flags |= FLAGS_UNSIGNED; + flags &= ~FLAGS_BASE_PARAMETER; + base = BASE_HEX; + parameters[pos].type = FORMAT_INT; + break; + + case SPECIFIER_FLOAT_E_UPPER: + flags |= FLAGS_UPPER; + /* FALLTHROUGH */ + case SPECIFIER_FLOAT_E: + flags |= FLAGS_FLOAT_E; + parameters[pos].type = FORMAT_DOUBLE; + break; + + case SPECIFIER_FLOAT_G_UPPER: + flags |= FLAGS_UPPER; + /* FALLTHROUGH */ + case SPECIFIER_FLOAT_G: + flags |= FLAGS_FLOAT_G; + parameters[pos].type = FORMAT_DOUBLE; + break; + + case SPECIFIER_FLOAT_F_UPPER: + flags |= FLAGS_UPPER; + /* FALLTHROUGH */ + case SPECIFIER_FLOAT_F: + parameters[pos].type = FORMAT_DOUBLE; + break; + + case SPECIFIER_POINTER: + if (sizeof(trio_pointer_t) == sizeof(trio_ulonglong_t)) + flags |= FLAGS_QUAD; + else if (sizeof(trio_pointer_t) == sizeof(long)) + flags |= FLAGS_LONG; + parameters[pos].type = FORMAT_POINTER; + break; + + case SPECIFIER_COUNT: + parameters[pos].type = FORMAT_COUNT; + break; + +#if defined(SPECIFIER_HEXFLOAT) +# if defined(SPECIFIER_HEXFLOAT_UPPER) + case SPECIFIER_HEXFLOAT_UPPER: + flags |= FLAGS_UPPER; + /* FALLTHROUGH */ +# endif + case SPECIFIER_HEXFLOAT: + base = BASE_HEX; + parameters[pos].type = FORMAT_DOUBLE; + break; +#endif + +#if defined(FORMAT_ERRNO) + case SPECIFIER_ERRNO: + parameters[pos].type = FORMAT_ERRNO; + break; +#endif + +#if defined(SPECIFIER_USER_DEFINED_BEGIN) + case SPECIFIER_USER_DEFINED_BEGIN: + { + unsigned int max; + int without_namespace = TRUE; + + parameters[pos].type = FORMAT_USER_DEFINED; + parameters[pos].user_name[0] = NIL; + tmpformat = (char *)&format[index]; + + while ((ch = format[index])) + { + index++; + if (ch == SPECIFIER_USER_DEFINED_END) + { + if (without_namespace) + { + /* We must get the handle first */ + parameters[pos].type = FORMAT_PARAMETER; + parameters[pos].indexAfterSpecifier = index; + parameters[pos].flags = FLAGS_USER_DEFINED; + /* Adjust parameters for insertion of new one */ + pos++; + usedEntries[currentParam] += 1; + parameters[pos].type = FORMAT_USER_DEFINED; + currentParam++; + indices[currentParam] = pos; + if (currentParam > maxParam) + maxParam = currentParam; + } + /* Copy the user data */ + max = (unsigned int)(&format[index] - tmpformat); + if (max > MAX_USER_DATA) + max = MAX_USER_DATA; + trio_copy_max(parameters[pos].user_data, + max, + tmpformat); + break; /* while */ + } + if (ch == SPECIFIER_USER_DEFINED_SEPARATOR) + { + without_namespace = FALSE; + /* Copy the namespace for later looking-up */ + max = (int)(&format[index] - tmpformat); + if (max > MAX_USER_NAME) + max = MAX_USER_NAME; + trio_copy_max(parameters[pos].user_name, + max, + tmpformat); + tmpformat = (char *)&format[index]; + } + } + if (ch != SPECIFIER_USER_DEFINED_END) + return TRIO_ERROR_RETURN(TRIO_EINVAL, index); + } + break; +#endif /* defined(SPECIFIER_USER_DEFINED_BEGIN) */ + + default: + /* Bail out completely to make the error more obvious */ + return TRIO_ERROR_RETURN(TRIO_EINVAL, index); + } + + /* Count the number of times this entry has been used */ + usedEntries[currentParam] += 1; + + /* Find last sticky parameters */ + if (gotSticky && !(flags & FLAGS_STICKY)) + { + for (i = pos - 1; i >= 0; i--) + { + if (parameters[i].type == FORMAT_PARAMETER) + continue; + if ((parameters[i].flags & FLAGS_STICKY) && + (parameters[i].type == parameters[pos].type)) + { + /* Do not overwrite current qualifiers */ + flags |= (parameters[i].flags & (unsigned long)~FLAGS_STICKY); + if (width == NO_WIDTH) + width = parameters[i].width; + if (precision == NO_PRECISION) + precision = parameters[i].precision; + if (base == NO_BASE) + base = parameters[i].base; + break; + } + } + } + + parameters[pos].indexAfterSpecifier = index; + parameters[pos].flags = flags; + parameters[pos].width = width; + parameters[pos].precision = precision; + parameters[pos].base = (base == NO_BASE) ? BASE_DECIMAL : base; + parameters[pos].varsize = varsize; + pos++; + + if (! positional) + parameterPosition++; + + } /* if identifier */ + + } /* while format characters left */ + + for (num = 0; num <= maxParam; num++) + { + if (usedEntries[num] != 1) + { + if (usedEntries[num] == 0) /* gap detected */ + return TRIO_ERROR_RETURN(TRIO_EGAP, num); + else /* double references detected */ + return TRIO_ERROR_RETURN(TRIO_EDBLREF, num); + } + + i = indices[num]; + + /* + * FORMAT_PARAMETERS are only present if they must be read, + * so it makes no sense to check the ignore flag (besides, + * the flags variable is not set for that particular type) + */ + if ((parameters[i].type != FORMAT_PARAMETER) && + (parameters[i].flags & FLAGS_IGNORE)) + continue; /* for all arguments */ + + /* + * The stack arguments are read according to ANSI C89 + * default argument promotions: + * + * char = int + * short = int + * unsigned char = unsigned int + * unsigned short = unsigned int + * float = double + * + * In addition to the ANSI C89 these types are read (the + * default argument promotions of C99 has not been + * considered yet) + * + * long long + * long double + * size_t + * ptrdiff_t + * intmax_t + */ + switch (parameters[i].type) + { + case FORMAT_GROUP: + case FORMAT_STRING: +#if TRIO_WIDECHAR + if (flags & FLAGS_WIDECHAR) + { + parameters[i].data.wstring = (argarray == NULL) + ? va_arg(*arglist, trio_wchar_t *) + : (trio_wchar_t *)(argarray[num]); + } + else +#endif + { + parameters[i].data.string = (argarray == NULL) + ? va_arg(*arglist, char *) + : (char *)(argarray[num]); + } + break; + +#if defined(FORMAT_USER_DEFINED) + case FORMAT_USER_DEFINED: +#endif + case FORMAT_POINTER: + case FORMAT_COUNT: + case FORMAT_UNKNOWN: + parameters[i].data.pointer = (argarray == NULL) + ? va_arg(*arglist, trio_pointer_t ) + : argarray[num]; + break; + + case FORMAT_CHAR: + case FORMAT_INT: + if (TYPE_SCAN == type) + { + if (argarray == NULL) + parameters[i].data.pointer = + (trio_pointer_t)va_arg(*arglist, trio_pointer_t); + else + { + if (parameters[i].type == FORMAT_CHAR) + parameters[i].data.pointer = + (trio_pointer_t)((char *)argarray[num]); + else if (parameters[i].flags & FLAGS_SHORT) + parameters[i].data.pointer = + (trio_pointer_t)((short *)argarray[num]); + else + parameters[i].data.pointer = + (trio_pointer_t)((int *)argarray[num]); + } + } + else + { +#if defined(QUALIFIER_VARSIZE) || defined(QUALIFIER_FIXED_SIZE) + if (parameters[i].flags + & (FLAGS_VARSIZE_PARAMETER | FLAGS_FIXED_SIZE)) + { + if (parameters[i].flags & FLAGS_VARSIZE_PARAMETER) + { + /* + * Variable sizes are mapped onto the fixed sizes, in + * accordance with integer promotion. + * + * Please note that this may not be portable, as we + * only guess the size, not the layout of the numbers. + * For example, if int is little-endian, and long is + * big-endian, then this will fail. + */ + varsize = (int)parameters[parameters[i].varsize].data.number.as_unsigned; + } + else + { + /* Used for the I modifiers */ + varsize = parameters[i].varsize; + } + parameters[i].flags &= ~FLAGS_ALL_VARSIZES; + + if (varsize <= (int)sizeof(int)) + ; + else if (varsize <= (int)sizeof(long)) + parameters[i].flags |= FLAGS_LONG; +#if defined(QUALIFIER_INTMAX_T) + else if (varsize <= (int)sizeof(trio_longlong_t)) + parameters[i].flags |= FLAGS_QUAD; + else + parameters[i].flags |= FLAGS_INTMAX_T; +#else + else + parameters[i].flags |= FLAGS_QUAD; +#endif + } +#endif /* defined(QUALIFIER_VARSIZE) */ +#if defined(QUALIFIER_SIZE_T) || defined(QUALIFIER_SIZE_T_UPPER) + if (parameters[i].flags & FLAGS_SIZE_T) + parameters[i].data.number.as_unsigned = (argarray == NULL) + ? (trio_uintmax_t)va_arg(*arglist, size_t) + : (trio_uintmax_t)(*((size_t *)argarray[num])); + else +#endif +#if defined(QUALIFIER_PTRDIFF_T) + if (parameters[i].flags & FLAGS_PTRDIFF_T) + parameters[i].data.number.as_unsigned = (argarray == NULL) + ? (trio_uintmax_t)va_arg(*arglist, ptrdiff_t) + : (trio_uintmax_t)(*((ptrdiff_t *)argarray[num])); + else +#endif +#if defined(QUALIFIER_INTMAX_T) + if (parameters[i].flags & FLAGS_INTMAX_T) + parameters[i].data.number.as_unsigned = (argarray == NULL) + ? (trio_uintmax_t)va_arg(*arglist, trio_intmax_t) + : (trio_uintmax_t)(*((trio_intmax_t *)argarray[num])); + else +#endif + if (parameters[i].flags & FLAGS_QUAD) + parameters[i].data.number.as_unsigned = (argarray == NULL) + ? (trio_uintmax_t)va_arg(*arglist, trio_ulonglong_t) + : (trio_uintmax_t)(*((trio_ulonglong_t *)argarray[num])); + else if (parameters[i].flags & FLAGS_LONG) + parameters[i].data.number.as_unsigned = (argarray == NULL) + ? (trio_uintmax_t)va_arg(*arglist, long) + : (trio_uintmax_t)(*((long *)argarray[num])); + else + { + if (argarray == NULL) + parameters[i].data.number.as_unsigned = (trio_uintmax_t)va_arg(*arglist, int); + else + { + if (parameters[i].type == FORMAT_CHAR) + parameters[i].data.number.as_unsigned = (trio_uintmax_t)(*((char *)argarray[num])); + else if (parameters[i].flags & FLAGS_SHORT) + parameters[i].data.number.as_unsigned = (trio_uintmax_t)(*((short *)argarray[num])); + else + parameters[i].data.number.as_unsigned = (trio_uintmax_t)(*((int *)argarray[num])); + } + } + } + break; + + case FORMAT_PARAMETER: + /* + * The parameter for the user-defined specifier is a pointer, + * whereas the rest (width, precision, base) uses an integer. + */ + if (parameters[i].flags & FLAGS_USER_DEFINED) + parameters[i].data.pointer = (argarray == NULL) + ? va_arg(*arglist, trio_pointer_t ) + : argarray[num]; + else + parameters[i].data.number.as_unsigned = (argarray == NULL) + ? (trio_uintmax_t)va_arg(*arglist, int) + : (trio_uintmax_t)(*((int *)argarray[num])); + break; + + case FORMAT_DOUBLE: + if (TYPE_SCAN == type) + { + if (parameters[i].flags & FLAGS_LONGDOUBLE) + parameters[i].data.longdoublePointer = (argarray == NULL) + ? va_arg(*arglist, trio_long_double_t *) + : (trio_long_double_t *)argarray[num]; + else + { + if (parameters[i].flags & FLAGS_LONG) + parameters[i].data.doublePointer = (argarray == NULL) + ? va_arg(*arglist, double *) + : (double *)argarray[num]; + else + parameters[i].data.doublePointer = (argarray == NULL) + ? (double *)va_arg(*arglist, float *) + : (double *)((float *)argarray[num]); + } + } + else + { + if (parameters[i].flags & FLAGS_LONGDOUBLE) + parameters[i].data.longdoubleNumber = (argarray == NULL) + ? va_arg(*arglist, trio_long_double_t) + : (trio_long_double_t)(*((trio_long_double_t *)argarray[num])); + else + { + if (argarray == NULL) + parameters[i].data.longdoubleNumber = + (trio_long_double_t)va_arg(*arglist, double); + else + { + if (parameters[i].flags & FLAGS_SHORT) + parameters[i].data.longdoubleNumber = + (trio_long_double_t)(*((float *)argarray[num])); + else + parameters[i].data.longdoubleNumber = + (trio_long_double_t)(*((double *)argarray[num])); + } + } + } + break; + +#if defined(FORMAT_ERRNO) + case FORMAT_ERRNO: + parameters[i].data.errorNumber = save_errno; + break; +#endif + + default: + break; + } + } /* for all specifiers */ + return num; +} + + +/************************************************************************* + * + * FORMATTING + * + ************************************************************************/ + + +/************************************************************************* + * TrioWriteNumber + * + * Description: + * Output a number. + * The complexity of this function is a result of the complexity + * of the dependencies of the flags. + */ +TRIO_PRIVATE void +TrioWriteNumber +TRIO_ARGS6((self, number, flags, width, precision, base), + trio_class_t *self, + trio_uintmax_t number, + trio_flags_t flags, + int width, + int precision, + int base) +{ + BOOLEAN_T isNegative; + BOOLEAN_T isNumberZero; + BOOLEAN_T isPrecisionZero; + BOOLEAN_T ignoreNumber; + char buffer[MAX_CHARS_IN(trio_uintmax_t) * (1 + MAX_LOCALE_SEPARATOR_LENGTH) + 1]; + char *bufferend; + char *pointer; + TRIO_CONST char *digits; + int i; + int length; + char *p; + int count; + + assert(VALID(self)); + assert(VALID(self->OutStream)); + assert(((base >= MIN_BASE) && (base <= MAX_BASE)) || (base == NO_BASE)); + + digits = (flags & FLAGS_UPPER) ? internalDigitsUpper : internalDigitsLower; + if (base == NO_BASE) + base = BASE_DECIMAL; + + isNumberZero = (number == 0); + isPrecisionZero = (precision == 0); + ignoreNumber = (isNumberZero + && isPrecisionZero + && !((flags & FLAGS_ALTERNATIVE) && (base == BASE_OCTAL))); + + if (flags & FLAGS_UNSIGNED) + { + isNegative = FALSE; + flags &= ~FLAGS_SHOWSIGN; + } + else + { + isNegative = ((trio_intmax_t)number < 0); + if (isNegative) + number = -((trio_intmax_t)number); + } + + if (flags & FLAGS_QUAD) + number &= (trio_ulonglong_t)-1; + else if (flags & FLAGS_LONG) + number &= (unsigned long)-1; + else + number &= (unsigned int)-1; + + /* Build number */ + pointer = bufferend = &buffer[sizeof(buffer) - 1]; + *pointer-- = NIL; + for (i = 1; i < (int)sizeof(buffer); i++) + { + *pointer-- = digits[number % base]; + number /= base; + if (number == 0) + break; + + if ((flags & FLAGS_QUOTE) && TrioFollowedBySeparator(i + 1)) + { + /* + * We are building the number from the least significant + * to the most significant digit, so we have to copy the + * thousand separator backwards + */ + length = internalThousandSeparatorLength; + if (((int)(pointer - buffer) - length) > 0) + { + p = &internalThousandSeparator[length - 1]; + while (length-- > 0) + *pointer-- = *p--; + } + } + } + + if (! ignoreNumber) + { + /* Adjust width */ + width -= (bufferend - pointer) - 1; + } + + /* Adjust precision */ + if (NO_PRECISION != precision) + { + precision -= (bufferend - pointer) - 1; + if (precision < 0) + precision = 0; + flags |= FLAGS_NILPADDING; + } + + /* Calculate padding */ + count = (! ((flags & FLAGS_LEFTADJUST) || (precision == NO_PRECISION))) + ? precision + : 0; + + /* Adjust width further */ + if (isNegative || (flags & FLAGS_SHOWSIGN) || (flags & FLAGS_SPACE)) + width--; + if ((flags & FLAGS_ALTERNATIVE) && !isNumberZero) + { + switch (base) + { + case BASE_BINARY: + case BASE_HEX: + width -= 2; + break; + case BASE_OCTAL: + if (!(flags & FLAGS_NILPADDING) || (count == 0)) + width--; + break; + default: + break; + } + } + + /* Output prefixes spaces if needed */ + if (! ((flags & FLAGS_LEFTADJUST) || + ((flags & FLAGS_NILPADDING) && (precision == NO_PRECISION)))) + { + while (width-- > count) + self->OutStream(self, CHAR_ADJUST); + } + + /* width has been adjusted for signs and alternatives */ + if (isNegative) + self->OutStream(self, '-'); + else if (flags & FLAGS_SHOWSIGN) + self->OutStream(self, '+'); + else if (flags & FLAGS_SPACE) + self->OutStream(self, ' '); + + /* Prefix is not written when the value is zero */ + if ((flags & FLAGS_ALTERNATIVE) && !isNumberZero) + { + switch (base) + { + case BASE_BINARY: + self->OutStream(self, '0'); + self->OutStream(self, (flags & FLAGS_UPPER) ? 'B' : 'b'); + break; + + case BASE_OCTAL: + if (!(flags & FLAGS_NILPADDING) || (count == 0)) + self->OutStream(self, '0'); + break; + + case BASE_HEX: + self->OutStream(self, '0'); + self->OutStream(self, (flags & FLAGS_UPPER) ? 'X' : 'x'); + break; + + default: + break; + } /* switch base */ + } + + /* Output prefixed zero padding if needed */ + if (flags & FLAGS_NILPADDING) + { + if (precision == NO_PRECISION) + precision = width; + while (precision-- > 0) + { + self->OutStream(self, '0'); + width--; + } + } + + if (! ignoreNumber) + { + /* Output the number itself */ + while (*(++pointer)) + { + self->OutStream(self, *pointer); + } + } + + /* Output trailing spaces if needed */ + if (flags & FLAGS_LEFTADJUST) + { + while (width-- > 0) + self->OutStream(self, CHAR_ADJUST); + } +} + +/************************************************************************* + * TrioWriteStringCharacter + * + * Description: + * Output a single character of a string + */ +TRIO_PRIVATE void +TrioWriteStringCharacter +TRIO_ARGS3((self, ch, flags), + trio_class_t *self, + int ch, + trio_flags_t flags) +{ + if (flags & FLAGS_ALTERNATIVE) + { + if (! isprint(ch)) + { + /* + * Non-printable characters are converted to C escapes or + * \number, if no C escape exists. + */ + self->OutStream(self, CHAR_BACKSLASH); + switch (ch) + { + case '\007': self->OutStream(self, 'a'); break; + case '\b': self->OutStream(self, 'b'); break; + case '\f': self->OutStream(self, 'f'); break; + case '\n': self->OutStream(self, 'n'); break; + case '\r': self->OutStream(self, 'r'); break; + case '\t': self->OutStream(self, 't'); break; + case '\v': self->OutStream(self, 'v'); break; + case '\\': self->OutStream(self, '\\'); break; + default: + self->OutStream(self, 'x'); + TrioWriteNumber(self, (trio_uintmax_t)ch, + FLAGS_UNSIGNED | FLAGS_NILPADDING, + 2, 2, BASE_HEX); + break; + } + } + else if (ch == CHAR_BACKSLASH) + { + self->OutStream(self, CHAR_BACKSLASH); + self->OutStream(self, CHAR_BACKSLASH); + } + else + { + self->OutStream(self, ch); + } + } + else + { + self->OutStream(self, ch); + } +} + +/************************************************************************* + * TrioWriteString + * + * Description: + * Output a string + */ +TRIO_PRIVATE void +TrioWriteString +TRIO_ARGS5((self, string, flags, width, precision), + trio_class_t *self, + TRIO_CONST char *string, + trio_flags_t flags, + int width, + int precision) +{ + int length; + int ch; + + assert(VALID(self)); + assert(VALID(self->OutStream)); + + if (string == NULL) + { + string = internalNullString; + length = sizeof(internalNullString) - 1; + /* Disable quoting for the null pointer */ + flags &= (~FLAGS_QUOTE); + width = 0; + } + else + { + length = trio_length(string); + } + if ((NO_PRECISION != precision) && + (precision < length)) + { + length = precision; + } + width -= length; + + if (flags & FLAGS_QUOTE) + self->OutStream(self, CHAR_QUOTE); + + if (! (flags & FLAGS_LEFTADJUST)) + { + while (width-- > 0) + self->OutStream(self, CHAR_ADJUST); + } + + while (length-- > 0) + { + /* The ctype parameters must be an unsigned char (or EOF) */ + ch = (int)((unsigned char)(*string++)); + TrioWriteStringCharacter(self, ch, flags); + } + + if (flags & FLAGS_LEFTADJUST) + { + while (width-- > 0) + self->OutStream(self, CHAR_ADJUST); + } + if (flags & FLAGS_QUOTE) + self->OutStream(self, CHAR_QUOTE); +} + +/************************************************************************* + * TrioWriteWideStringCharacter + * + * Description: + * Output a wide string as a multi-byte sequence + */ +#if TRIO_WIDECHAR +TRIO_PRIVATE int +TrioWriteWideStringCharacter +TRIO_ARGS4((self, wch, flags, width), + trio_class_t *self, + trio_wchar_t wch, + trio_flags_t flags, + int width) +{ + int size; + int i; + int ch; + char *string; + char buffer[MB_LEN_MAX + 1]; + + if (width == NO_WIDTH) + width = sizeof(buffer); + + size = wctomb(buffer, wch); + if ((size <= 0) || (size > width) || (buffer[0] == NIL)) + return 0; + + string = buffer; + i = size; + while ((width >= i) && (width-- > 0) && (i-- > 0)) + { + /* The ctype parameters must be an unsigned char (or EOF) */ + ch = (int)((unsigned char)(*string++)); + TrioWriteStringCharacter(self, ch, flags); + } + return size; +} +#endif /* TRIO_WIDECHAR */ + +/************************************************************************* + * TrioWriteWideString + * + * Description: + * Output a wide character string as a multi-byte string + */ +#if TRIO_WIDECHAR +TRIO_PRIVATE void +TrioWriteWideString +TRIO_ARGS5((self, wstring, flags, width, precision), + trio_class_t *self, + TRIO_CONST trio_wchar_t *wstring, + trio_flags_t flags, + int width, + int precision) +{ + int length; + int size; + + assert(VALID(self)); + assert(VALID(self->OutStream)); + +#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) + (void)mblen(NULL, 0); +#endif + + if (wstring == NULL) + { + TrioWriteString(self, NULL, flags, width, precision); + return; + } + + if (NO_PRECISION == precision) + { + length = INT_MAX; + } + else + { + length = precision; + width -= length; + } + + if (flags & FLAGS_QUOTE) + self->OutStream(self, CHAR_QUOTE); + + if (! (flags & FLAGS_LEFTADJUST)) + { + while (width-- > 0) + self->OutStream(self, CHAR_ADJUST); + } + + while (length > 0) + { + size = TrioWriteWideStringCharacter(self, *wstring++, flags, length); + if (size == 0) + break; /* while */ + length -= size; + } + + if (flags & FLAGS_LEFTADJUST) + { + while (width-- > 0) + self->OutStream(self, CHAR_ADJUST); + } + if (flags & FLAGS_QUOTE) + self->OutStream(self, CHAR_QUOTE); +} +#endif /* TRIO_WIDECHAR */ + +/************************************************************************* + * TrioWriteDouble + * + * http://wwwold.dkuug.dk/JTC1/SC22/WG14/www/docs/dr_211.htm + * + * "5.2.4.2.2 paragraph #4 + * + * The accuracy [...] is implementation defined, as is the accuracy + * of the conversion between floating-point internal representations + * and string representations performed by the libray routine in + * " + */ +/* FIXME: handle all instances of constant long-double number (L) + * and *l() math functions. + */ +TRIO_PRIVATE void +TrioWriteDouble +TRIO_ARGS6((self, number, flags, width, precision, base), + trio_class_t *self, + trio_long_double_t number, + trio_flags_t flags, + int width, + int precision, + int base) +{ + trio_long_double_t integerNumber; + trio_long_double_t fractionNumber; + trio_long_double_t workNumber; + int integerDigits; + int fractionDigits; + int exponentDigits; + int baseDigits; + int integerThreshold; + int fractionThreshold; + int expectedWidth; + int exponent = 0; + unsigned int uExponent = 0; + int exponentBase; + trio_long_double_t dblBase; + trio_long_double_t dblIntegerBase; + trio_long_double_t dblFractionBase; + trio_long_double_t integerAdjust; + trio_long_double_t fractionAdjust; + BOOLEAN_T isNegative; + BOOLEAN_T isExponentNegative = FALSE; + BOOLEAN_T requireTwoDigitExponent; + BOOLEAN_T isHex; + TRIO_CONST char *digits; + char *groupingPointer; + int i; + int index; + BOOLEAN_T hasOnlyZeroes; + int zeroes = 0; + register int trailingZeroes; + BOOLEAN_T keepTrailingZeroes; + BOOLEAN_T keepDecimalPoint; + trio_long_double_t epsilon; + + assert(VALID(self)); + assert(VALID(self->OutStream)); + assert(((base >= MIN_BASE) && (base <= MAX_BASE)) || (base == NO_BASE)); + + /* Determine sign and look for special quantities */ + switch (trio_fpclassify_and_signbit(number, &isNegative)) + { + case TRIO_FP_NAN: + TrioWriteString(self, + (flags & FLAGS_UPPER) + ? NAN_UPPER + : NAN_LOWER, + flags, width, precision); + return; + + case TRIO_FP_INFINITE: + if (isNegative) + { + /* Negative infinity */ + TrioWriteString(self, + (flags & FLAGS_UPPER) + ? "-" INFINITE_UPPER + : "-" INFINITE_LOWER, + flags, width, precision); + return; + } + else + { + /* Positive infinity */ + TrioWriteString(self, + (flags & FLAGS_UPPER) + ? INFINITE_UPPER + : INFINITE_LOWER, + flags, width, precision); + return; + } + + default: + /* Finitude */ + break; + } + + /* Normal numbers */ + if (flags & FLAGS_LONGDOUBLE) + { + baseDigits = (base == 10) + ? LDBL_DIG + : (int)floor(LDBL_MANT_DIG / TrioLogarithmBase(base)); + epsilon = LDBL_EPSILON; + } + else if (flags & FLAGS_SHORT) + { + baseDigits = (base == BASE_DECIMAL) + ? FLT_DIG + : (int)floor(FLT_MANT_DIG / TrioLogarithmBase(base)); + epsilon = FLT_EPSILON; + } + else + { + baseDigits = (base == BASE_DECIMAL) + ? DBL_DIG + : (int)floor(DBL_MANT_DIG / TrioLogarithmBase(base)); + epsilon = DBL_EPSILON; + } + + digits = (flags & FLAGS_UPPER) ? internalDigitsUpper : internalDigitsLower; + isHex = (base == BASE_HEX); + if (base == NO_BASE) + base = BASE_DECIMAL; + dblBase = (trio_long_double_t)base; + keepTrailingZeroes = !( (flags & FLAGS_ROUNDING) || + ( (flags & FLAGS_FLOAT_G) && + !(flags & FLAGS_ALTERNATIVE) ) ); + + if (flags & FLAGS_ROUNDING) + precision = baseDigits; + + if (precision == NO_PRECISION) + { + if (isHex) + { + keepTrailingZeroes = FALSE; + precision = FLT_MANT_DIG; + } + else + { + precision = FLT_DIG; + } + } + + if (isNegative) + number = -number; + + if (isHex) + flags |= FLAGS_FLOAT_E; + + if (flags & FLAGS_FLOAT_G) + { + if (precision == 0) + precision = 1; + + if ((number < 1.0E-4) || (number > powl(base, + (trio_long_double_t)precision))) + { + /* Use scientific notation */ + flags |= FLAGS_FLOAT_E; + } + else if (number < 1.0) + { + /* + * Use normal notation. If the integer part of the number is + * zero, then adjust the precision to include leading fractional + * zeros. + */ + workNumber = TrioLogarithm(number, base); + workNumber = TRIO_FABS(workNumber); + if (workNumber - floorl(workNumber) < 0.001) + workNumber--; + zeroes = (int)floorl(workNumber); + } + } + + if (flags & FLAGS_FLOAT_E) + { + /* Scale the number */ + workNumber = TrioLogarithm(number, base); + if (trio_isinf(workNumber) == -1) + { + exponent = 0; + /* Undo setting */ + if (flags & FLAGS_FLOAT_G) + flags &= ~FLAGS_FLOAT_E; + } + else + { + exponent = (int)floorl(workNumber); + number /= powl(dblBase, (trio_long_double_t)exponent); + isExponentNegative = (exponent < 0); + uExponent = (isExponentNegative) ? -exponent : exponent; + if (isHex) + uExponent *= 4; /* log16(2) */ + /* No thousand separators */ + flags &= ~FLAGS_QUOTE; + } + } + + integerNumber = floorl(number); + fractionNumber = number - integerNumber; + + /* + * Truncated number. + * + * Precision is number of significant digits for FLOAT_G + * and number of fractional digits for others. + */ + integerDigits = (integerNumber > epsilon) + ? 1 + (int)TrioLogarithm(integerNumber, base) + : 1; + fractionDigits = ((flags & FLAGS_FLOAT_G) && (zeroes == 0)) + ? precision - integerDigits + : zeroes + precision; + + dblFractionBase = TrioPower(base, fractionDigits); + + workNumber = number + 0.5 / dblFractionBase; + if (floorl(number) != floorl(workNumber)) + { + if (flags & FLAGS_FLOAT_E) + { + /* Adjust if number was rounded up one digit (ie. 0.99 to 1.00) */ + exponent++; + isExponentNegative = (exponent < 0); + uExponent = (isExponentNegative) ? -exponent : exponent; + if (isHex) + uExponent *= 4; /* log16(2) */ + workNumber = (number + 0.5 / dblFractionBase) / dblBase; + integerNumber = floorl(workNumber); + fractionNumber = workNumber - integerNumber; + } + else + { + /* Adjust if number was rounded up one digit (ie. 99 to 100) */ + integerNumber = floorl(number + 0.5); + fractionNumber = 0.0; + integerDigits = (integerNumber > epsilon) + ? 1 + (int)TrioLogarithm(integerNumber, base) + : 1; + } + } + + /* Estimate accuracy */ + integerAdjust = fractionAdjust = 0.5; + if (flags & FLAGS_ROUNDING) + { + if (integerDigits > baseDigits) + { + integerThreshold = baseDigits; + fractionDigits = 0; + dblFractionBase = 1.0; + fractionThreshold = 0; + precision = 0; /* Disable decimal-point */ + integerAdjust = TrioPower(base, integerDigits - integerThreshold - 1); + fractionAdjust = 0.0; + } + else + { + integerThreshold = integerDigits; + fractionThreshold = fractionDigits - integerThreshold; + fractionAdjust = 1.0; + } + } + else + { + integerThreshold = INT_MAX; + fractionThreshold = INT_MAX; + } + + /* + * Calculate expected width. + * sign + integer part + thousands separators + decimal point + * + fraction + exponent + */ + fractionAdjust /= dblFractionBase; + hasOnlyZeroes = (floorl((fractionNumber + fractionAdjust) * dblFractionBase) < epsilon); + keepDecimalPoint = ( (flags & FLAGS_ALTERNATIVE) || + !((precision == 0) || + (!keepTrailingZeroes && hasOnlyZeroes)) ); + if (flags & FLAGS_FLOAT_E) + { + exponentDigits = (uExponent == 0) + ? 1 + : (int)ceil(TrioLogarithm((double)(uExponent + 1), + (isHex) ? 10.0 : base)); + } + else + exponentDigits = 0; + requireTwoDigitExponent = ((base == BASE_DECIMAL) && (exponentDigits == 1)); + + expectedWidth = integerDigits + fractionDigits + + (keepDecimalPoint + ? internalDecimalPointLength + : 0) + + ((flags & FLAGS_QUOTE) + ? TrioCalcThousandSeparatorLength(integerDigits) + : 0); + if (isNegative || (flags & FLAGS_SHOWSIGN) || (flags & FLAGS_SPACE)) + expectedWidth += sizeof("-") - 1; + if (exponentDigits > 0) + expectedWidth += exponentDigits + + ((requireTwoDigitExponent ? sizeof("E+0") : sizeof("E+")) - 1); + if (isHex) + expectedWidth += sizeof("0X") - 1; + + /* Output prefixing */ + if (flags & FLAGS_NILPADDING) + { + /* Leading zeros must be after sign */ + if (isNegative) + self->OutStream(self, '-'); + else if (flags & FLAGS_SHOWSIGN) + self->OutStream(self, '+'); + else if (flags & FLAGS_SPACE) + self->OutStream(self, ' '); + if (isHex) + { + self->OutStream(self, '0'); + self->OutStream(self, (flags & FLAGS_UPPER) ? 'X' : 'x'); + } + if (!(flags & FLAGS_LEFTADJUST)) + { + for (i = expectedWidth; i < width; i++) + { + self->OutStream(self, '0'); + } + } + } + else + { + /* Leading spaces must be before sign */ + if (!(flags & FLAGS_LEFTADJUST)) + { + for (i = expectedWidth; i < width; i++) + { + self->OutStream(self, CHAR_ADJUST); + } + } + if (isNegative) + self->OutStream(self, '-'); + else if (flags & FLAGS_SHOWSIGN) + self->OutStream(self, '+'); + else if (flags & FLAGS_SPACE) + self->OutStream(self, ' '); + if (isHex) + { + self->OutStream(self, '0'); + self->OutStream(self, (flags & FLAGS_UPPER) ? 'X' : 'x'); + } + } + + /* Output the integer part and thousand separators */ + dblIntegerBase = 1.0 / TrioPower(base, integerDigits - 1); + for (i = 0; i < integerDigits; i++) + { + workNumber = floorl(((integerNumber + integerAdjust) * dblIntegerBase)); + if (i > integerThreshold) + { + /* Beyond accuracy */ + self->OutStream(self, digits[0]); + } + else + { + self->OutStream(self, digits[(int)fmodl(workNumber, dblBase)]); + } + dblIntegerBase *= dblBase; + + if (((flags & (FLAGS_FLOAT_E | FLAGS_QUOTE)) == FLAGS_QUOTE) + && TrioFollowedBySeparator(integerDigits - i)) + { + for (groupingPointer = internalThousandSeparator; + *groupingPointer != NIL; + groupingPointer++) + { + self->OutStream(self, *groupingPointer); + } + } + } + + /* Insert decimal point and build the fraction part */ + trailingZeroes = 0; + + if (keepDecimalPoint) + { + if (internalDecimalPoint) + { + self->OutStream(self, internalDecimalPoint); + } + else + { + for (i = 0; i < internalDecimalPointLength; i++) + { + self->OutStream(self, internalDecimalPointString[i]); + } + } + } + + for (i = 0; i < fractionDigits; i++) + { + if ((integerDigits > integerThreshold) || (i > fractionThreshold)) + { + /* Beyond accuracy */ + trailingZeroes++; + } + else + { + fractionNumber *= dblBase; + fractionAdjust *= dblBase; + workNumber = floorl(fractionNumber + fractionAdjust); + fractionNumber -= workNumber; + index = (int)fmodl(workNumber, dblBase); + if (index == 0) + { + trailingZeroes++; + } + else + { + while (trailingZeroes > 0) + { + /* Not trailing zeroes after all */ + self->OutStream(self, digits[0]); + trailingZeroes--; + } + self->OutStream(self, digits[index]); + } + } + } + + if (keepTrailingZeroes) + { + while (trailingZeroes > 0) + { + self->OutStream(self, digits[0]); + trailingZeroes--; + } + } + + /* Output exponent */ + if (exponentDigits > 0) + { + self->OutStream(self, + isHex + ? ((flags & FLAGS_UPPER) ? 'P' : 'p') + : ((flags & FLAGS_UPPER) ? 'E' : 'e')); + self->OutStream(self, (isExponentNegative) ? '-' : '+'); + + /* The exponent must contain at least two digits */ + if (requireTwoDigitExponent) + self->OutStream(self, '0'); + + if (isHex) + base = 10.0; + exponentBase = (int)TrioPower(base, exponentDigits - 1); + for (i = 0; i < exponentDigits; i++) + { + self->OutStream(self, digits[(uExponent / exponentBase) % base]); + exponentBase /= base; + } + } + /* Output trailing spaces */ + if (flags & FLAGS_LEFTADJUST) + { + for (i = expectedWidth; i < width; i++) + { + self->OutStream(self, CHAR_ADJUST); + } + } +} + +/************************************************************************* + * TrioFormatProcess + * + * Description: + * This is the main engine for formatting output + */ +TRIO_PRIVATE int +TrioFormatProcess +TRIO_ARGS3((data, format, parameters), + trio_class_t *data, + TRIO_CONST char *format, + trio_parameter_t *parameters) +{ +#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) + int charlen; +#endif + int i; + TRIO_CONST char *string; + trio_pointer_t pointer; + trio_flags_t flags; + int width; + int precision; + int base; + int index; + + index = 0; + i = 0; +#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) + (void)mblen(NULL, 0); +#endif + + while (format[index]) + { +#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) + if (! isascii(format[index])) + { + charlen = mblen(&format[index], MB_LEN_MAX); + /* + * Only valid multibyte characters are handled here. Invalid + * multibyte characters (charlen == -1) are handled as normal + * characters. + */ + if (charlen != -1) + { + while (charlen-- > 0) + { + data->OutStream(data, format[index++]); + } + continue; /* while characters left in formatting string */ + } + } +#endif /* TRIO_COMPILER_SUPPORTS_MULTIBYTE */ + if (CHAR_IDENTIFIER == format[index]) + { + if (CHAR_IDENTIFIER == format[index + 1]) + { + data->OutStream(data, CHAR_IDENTIFIER); + index += 2; + } + else + { + /* Skip the parameter entries */ + while (parameters[i].type == FORMAT_PARAMETER) + i++; + + flags = parameters[i].flags; + + /* Find width */ + width = parameters[i].width; + if (flags & FLAGS_WIDTH_PARAMETER) + { + /* Get width from parameter list */ + width = (int)parameters[width].data.number.as_signed; + if (width < 0) + { + /* + * A negative width is the same as the - flag and + * a positive width. + */ + flags |= FLAGS_LEFTADJUST; + flags &= ~FLAGS_NILPADDING; + width = -width; + } + } + + /* Find precision */ + if (flags & FLAGS_PRECISION) + { + precision = parameters[i].precision; + if (flags & FLAGS_PRECISION_PARAMETER) + { + /* Get precision from parameter list */ + precision = (int)parameters[precision].data.number.as_signed; + if (precision < 0) + { + /* + * A negative precision is the same as no + * precision + */ + precision = NO_PRECISION; + } + } + } + else + { + precision = NO_PRECISION; + } + + /* Find base */ + base = parameters[i].base; + if (flags & FLAGS_BASE_PARAMETER) + { + /* Get base from parameter list */ + base = (int)parameters[base].data.number.as_signed; + } + + switch (parameters[i].type) + { + case FORMAT_CHAR: + if (flags & FLAGS_QUOTE) + data->OutStream(data, CHAR_QUOTE); + if (! (flags & FLAGS_LEFTADJUST)) + { + while (--width > 0) + data->OutStream(data, CHAR_ADJUST); + } +#if TRIO_WIDECHAR + if (flags & FLAGS_WIDECHAR) + { + TrioWriteWideStringCharacter(data, + (trio_wchar_t)parameters[i].data.number.as_signed, + flags, + NO_WIDTH); + } + else +#endif + { + TrioWriteStringCharacter(data, + (int)parameters[i].data.number.as_signed, + flags); + } + + if (flags & FLAGS_LEFTADJUST) + { + while(--width > 0) + data->OutStream(data, CHAR_ADJUST); + } + if (flags & FLAGS_QUOTE) + data->OutStream(data, CHAR_QUOTE); + + break; /* FORMAT_CHAR */ + + case FORMAT_INT: + TrioWriteNumber(data, + parameters[i].data.number.as_unsigned, + flags, + width, + precision, + base); + + break; /* FORMAT_INT */ + + case FORMAT_DOUBLE: + TrioWriteDouble(data, + parameters[i].data.longdoubleNumber, + flags, + width, + precision, + base); + break; /* FORMAT_DOUBLE */ + + case FORMAT_STRING: +#if TRIO_WIDECHAR + if (flags & FLAGS_WIDECHAR) + { + TrioWriteWideString(data, + parameters[i].data.wstring, + flags, + width, + precision); + } + else +#endif + { + TrioWriteString(data, + parameters[i].data.string, + flags, + width, + precision); + } + break; /* FORMAT_STRING */ + + case FORMAT_POINTER: + { + trio_reference_t reference; + + reference.data = data; + reference.parameter = ¶meters[i]; + trio_print_pointer(&reference, parameters[i].data.pointer); + } + break; /* FORMAT_POINTER */ + + case FORMAT_COUNT: + pointer = parameters[i].data.pointer; + if (NULL != pointer) + { + /* + * C99 paragraph 7.19.6.1.8 says "the number of + * characters written to the output stream so far by + * this call", which is data->committed + */ +#if defined(QUALIFIER_SIZE_T) || defined(QUALIFIER_SIZE_T_UPPER) + if (flags & FLAGS_SIZE_T) + *(size_t *)pointer = (size_t)data->committed; + else +#endif +#if defined(QUALIFIER_PTRDIFF_T) + if (flags & FLAGS_PTRDIFF_T) + *(ptrdiff_t *)pointer = (ptrdiff_t)data->committed; + else +#endif +#if defined(QUALIFIER_INTMAX_T) + if (flags & FLAGS_INTMAX_T) + *(trio_intmax_t *)pointer = (trio_intmax_t)data->committed; + else +#endif + if (flags & FLAGS_QUAD) + { + *(trio_ulonglong_t *)pointer = (trio_ulonglong_t)data->committed; + } + else if (flags & FLAGS_LONG) + { + *(long int *)pointer = (long int)data->committed; + } + else if (flags & FLAGS_SHORT) + { + *(short int *)pointer = (short int)data->committed; + } + else + { + *(int *)pointer = (int)data->committed; + } + } + break; /* FORMAT_COUNT */ + + case FORMAT_PARAMETER: + break; /* FORMAT_PARAMETER */ + +#if defined(FORMAT_ERRNO) + case FORMAT_ERRNO: + string = trio_error(parameters[i].data.errorNumber); + if (string) + { + TrioWriteString(data, + string, + flags, + width, + precision); + } + else + { + data->OutStream(data, '#'); + TrioWriteNumber(data, + (trio_uintmax_t)parameters[i].data.errorNumber, + flags, + width, + precision, + BASE_DECIMAL); + } + break; /* FORMAT_ERRNO */ +#endif /* defined(FORMAT_ERRNO) */ + +#if defined(FORMAT_USER_DEFINED) + case FORMAT_USER_DEFINED: + { + trio_reference_t reference; + trio_userdef_t *def = NULL; + + if (parameters[i].user_name[0] == NIL) + { + /* Use handle */ + if ((i > 0) || + (parameters[i - 1].type == FORMAT_PARAMETER)) + def = (trio_userdef_t *)parameters[i - 1].data.pointer; + } + else + { + /* Look up namespace */ + def = TrioFindNamespace(parameters[i].user_name, NULL); + } + if (def) { + reference.data = data; + reference.parameter = ¶meters[i]; + def->callback(&reference); + } + } + break; +#endif /* defined(FORMAT_USER_DEFINED) */ + + default: + break; + } /* switch parameter type */ + + /* Prepare for next */ + index = parameters[i].indexAfterSpecifier; + i++; + } + } + else /* not identifier */ + { + data->OutStream(data, format[index++]); + } + } + return data->processed; +} + +/************************************************************************* + * TrioFormatRef + */ +TRIO_PRIVATE int +TrioFormatRef +TRIO_ARGS4((reference, format, arglist, argarray), + trio_reference_t *reference, + TRIO_CONST char *format, + va_list *arglist, + trio_pointer_t *argarray) +{ + int status; + trio_parameter_t parameters[MAX_PARAMETERS]; + + status = TrioParse(TYPE_PRINT, format, parameters, arglist, argarray); + if (status < 0) + return status; + + status = TrioFormatProcess(reference->data, format, parameters); + if (reference->data->error != 0) + { + status = reference->data->error; + } + return status; +} + +/************************************************************************* + * TrioFormat + */ +TRIO_PRIVATE int +TrioFormat +TRIO_ARGS6((destination, destinationSize, OutStream, format, arglist, argarray), + trio_pointer_t destination, + size_t destinationSize, + void (*OutStream) TRIO_PROTO((trio_class_t *, int)), + TRIO_CONST char *format, + va_list *arglist, + trio_pointer_t *argarray) +{ + int status; + trio_class_t data; + trio_parameter_t parameters[MAX_PARAMETERS]; + + assert(VALID(OutStream)); + assert(VALID(format)); + + memset(&data, 0, sizeof(data)); + data.OutStream = OutStream; + data.location = destination; + data.max = destinationSize; + data.error = 0; + +#if defined(USE_LOCALE) + if (NULL == internalLocaleValues) + { + TrioSetLocale(); + } +#endif + + status = TrioParse(TYPE_PRINT, format, parameters, arglist, argarray); + if (status < 0) + return status; + + status = TrioFormatProcess(&data, format, parameters); + if (data.error != 0) + { + status = data.error; + } + return status; +} + +/************************************************************************* + * TrioOutStreamFile + */ +TRIO_PRIVATE void +TrioOutStreamFile +TRIO_ARGS2((self, output), + trio_class_t *self, + int output) +{ + FILE *file; + + assert(VALID(self)); + assert(VALID(self->location)); + + file = (FILE *)self->location; + self->processed++; + if (fputc(output, file) == EOF) + { + self->error = TRIO_ERROR_RETURN(TRIO_EOF, 0); + } + else + { + self->committed++; + } +} + +/************************************************************************* + * TrioOutStreamFileDescriptor + */ +TRIO_PRIVATE void +TrioOutStreamFileDescriptor +TRIO_ARGS2((self, output), + trio_class_t *self, + int output) +{ + int fd; + char ch; + + assert(VALID(self)); + + fd = *((int *)self->location); + ch = (char)output; + self->processed++; + if (write(fd, &ch, sizeof(char)) == -1) + { + self->error = TRIO_ERROR_RETURN(TRIO_ERRNO, 0); + } + else + { + self->committed++; + } +} + +/************************************************************************* + * TrioOutStreamCustom + */ +TRIO_PRIVATE void +TrioOutStreamCustom +TRIO_ARGS2((self, output), + trio_class_t *self, + int output) +{ + int status; + trio_custom_t *data; + + assert(VALID(self)); + assert(VALID(self->location)); + + data = (trio_custom_t *)self->location; + if (data->stream.out) + { + status = (data->stream.out)(data->closure, output); + if (status >= 0) + { + self->committed++; + } + else + { + if (self->error == 0) + { + self->error = TRIO_ERROR_RETURN(TRIO_ECUSTOM, -status); + } + } + } + self->processed++; +} + +/************************************************************************* + * TrioOutStreamString + */ +TRIO_PRIVATE void +TrioOutStreamString +TRIO_ARGS2((self, output), + trio_class_t *self, + int output) +{ + char **buffer; + + assert(VALID(self)); + assert(VALID(self->location)); + + buffer = (char **)self->location; + **buffer = (char)output; + (*buffer)++; + self->processed++; + self->committed++; +} + +/************************************************************************* + * TrioOutStreamStringMax + */ +TRIO_PRIVATE void +TrioOutStreamStringMax +TRIO_ARGS2((self, output), + trio_class_t *self, + int output) +{ + char **buffer; + + assert(VALID(self)); + assert(VALID(self->location)); + + buffer = (char **)self->location; + + if (self->processed < self->max) + { + **buffer = (char)output; + (*buffer)++; + self->committed++; + } + self->processed++; +} + +/************************************************************************* + * TrioOutStreamStringDynamic + */ +TRIO_PRIVATE void +TrioOutStreamStringDynamic +TRIO_ARGS2((self, output), + trio_class_t *self, + int output) +{ + assert(VALID(self)); + assert(VALID(self->location)); + + if (self->error == 0) + { + trio_xstring_append_char((trio_string_t *)self->location, + (char)output); + self->committed++; + } + /* The processed variable must always be increased */ + self->processed++; +} + +/************************************************************************* + * + * Formatted printing functions + * + ************************************************************************/ + +#if defined(TRIO_DOCUMENTATION) +# include "doc/doc_printf.h" +#endif +/** @addtogroup Printf + @{ +*/ + +/************************************************************************* + * printf + */ + +/** + Print to standard output stream. + + @param format Formatting string. + @param ... Arguments. + @return Number of printed characters. + */ +TRIO_PUBLIC int +trio_printf +TRIO_VARGS2((format, va_alist), + TRIO_CONST char *format, + TRIO_VA_DECL) +{ + int status; + va_list args; + + assert(VALID(format)); + + TRIO_VA_START(args, format); + status = TrioFormat(stdout, 0, TrioOutStreamFile, format, &args, NULL); + TRIO_VA_END(args); + return status; +} + +/** + Print to standard output stream. + + @param format Formatting string. + @param args Arguments. + @return Number of printed characters. + */ +TRIO_PUBLIC int +trio_vprintf +TRIO_ARGS2((format, args), + TRIO_CONST char *format, + va_list args) +{ + assert(VALID(format)); + + return TrioFormat(stdout, 0, TrioOutStreamFile, format, &args, NULL); +} + +/** + Print to standard output stream. + + @param format Formatting string. + @param args Arguments. + @return Number of printed characters. + */ +TRIO_PUBLIC int +trio_printfv +TRIO_ARGS2((format, args), + TRIO_CONST char *format, + trio_pointer_t * args) +{ + assert(VALID(format)); + + return TrioFormat(stdout, 0, TrioOutStreamFile, format, NULL, args); +} + +/************************************************************************* + * fprintf + */ + +/** + Print to file. + + @param file File pointer. + @param format Formatting string. + @param ... Arguments. + @return Number of printed characters. + */ +TRIO_PUBLIC int +trio_fprintf +TRIO_VARGS3((file, format, va_alist), + FILE *file, + TRIO_CONST char *format, + TRIO_VA_DECL) +{ + int status; + va_list args; + + assert(VALID(file)); + assert(VALID(format)); + + TRIO_VA_START(args, format); + status = TrioFormat(file, 0, TrioOutStreamFile, format, &args, NULL); + TRIO_VA_END(args); + return status; +} + +/** + Print to file. + + @param file File pointer. + @param format Formatting string. + @param args Arguments. + @return Number of printed characters. + */ +TRIO_PUBLIC int +trio_vfprintf +TRIO_ARGS3((file, format, args), + FILE *file, + TRIO_CONST char *format, + va_list args) +{ + assert(VALID(file)); + assert(VALID(format)); + + return TrioFormat(file, 0, TrioOutStreamFile, format, &args, NULL); +} + +/** + Print to file. + + @param file File pointer. + @param format Formatting string. + @param args Arguments. + @return Number of printed characters. + */ +TRIO_PUBLIC int +trio_fprintfv +TRIO_ARGS3((file, format, args), + FILE *file, + TRIO_CONST char *format, + trio_pointer_t * args) +{ + assert(VALID(file)); + assert(VALID(format)); + + return TrioFormat(file, 0, TrioOutStreamFile, format, NULL, args); +} + +/************************************************************************* + * dprintf + */ + +/** + Print to file descriptor. + + @param fd File descriptor. + @param format Formatting string. + @param ... Arguments. + @return Number of printed characters. + */ +TRIO_PUBLIC int +trio_dprintf +TRIO_VARGS3((fd, format, va_alist), + int fd, + TRIO_CONST char *format, + TRIO_VA_DECL) +{ + int status; + va_list args; + + assert(VALID(format)); + + TRIO_VA_START(args, format); + status = TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, &args, NULL); + TRIO_VA_END(args); + return status; +} + +/** + Print to file descriptor. + + @param fd File descriptor. + @param format Formatting string. + @param args Arguments. + @return Number of printed characters. + */ +TRIO_PUBLIC int +trio_vdprintf +TRIO_ARGS3((fd, format, args), + int fd, + TRIO_CONST char *format, + va_list args) +{ + assert(VALID(format)); + + return TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, &args, NULL); +} + +/** + Print to file descriptor. + + @param fd File descriptor. + @param format Formatting string. + @param args Arguments. + @return Number of printed characters. + */ +TRIO_PUBLIC int +trio_dprintfv +TRIO_ARGS3((fd, format, args), + int fd, + TRIO_CONST char *format, + trio_pointer_t *args) +{ + assert(VALID(format)); + + return TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, NULL, args); +} + +/************************************************************************* + * cprintf + */ +TRIO_PUBLIC int +trio_cprintf +TRIO_VARGS4((stream, closure, format, va_alist), + trio_outstream_t stream, + trio_pointer_t closure, + TRIO_CONST char *format, + TRIO_VA_DECL) +{ + int status; + va_list args; + trio_custom_t data; + + assert(VALID(stream)); + assert(VALID(format)); + + TRIO_VA_START(args, format); + data.stream.out = stream; + data.closure = closure; + status = TrioFormat(&data, 0, TrioOutStreamCustom, format, &args, NULL); + TRIO_VA_END(args); + return status; +} + +TRIO_PUBLIC int +trio_vcprintf +TRIO_ARGS4((stream, closure, format, args), + trio_outstream_t stream, + trio_pointer_t closure, + TRIO_CONST char *format, + va_list args) +{ + trio_custom_t data; + + assert(VALID(stream)); + assert(VALID(format)); + + data.stream.out = stream; + data.closure = closure; + return TrioFormat(&data, 0, TrioOutStreamCustom, format, &args, NULL); +} + +TRIO_PUBLIC int +trio_cprintfv +TRIO_ARGS4((stream, closure, format, args), + trio_outstream_t stream, + trio_pointer_t closure, + TRIO_CONST char *format, + void **args) +{ + trio_custom_t data; + + assert(VALID(stream)); + assert(VALID(format)); + + data.stream.out = stream; + data.closure = closure; + return TrioFormat(&data, 0, TrioOutStreamCustom, format, NULL, args); +} + +/************************************************************************* + * sprintf + */ + +/** + Print to string. + + @param buffer Output string. + @param format Formatting string. + @param ... Arguments. + @return Number of printed characters. + */ +TRIO_PUBLIC int +trio_sprintf +TRIO_VARGS3((buffer, format, va_alist), + char *buffer, + TRIO_CONST char *format, + TRIO_VA_DECL) +{ + int status; + va_list args; + + assert(VALID(buffer)); + assert(VALID(format)); + + TRIO_VA_START(args, format); + status = TrioFormat(&buffer, 0, TrioOutStreamString, format, &args, NULL); + *buffer = NIL; /* Terminate with NIL character */ + TRIO_VA_END(args); + return status; +} + +/** + Print to string. + + @param buffer Output string. + @param format Formatting string. + @param args Arguments. + @return Number of printed characters. + */ +TRIO_PUBLIC int +trio_vsprintf +TRIO_ARGS3((buffer, format, args), + char *buffer, + TRIO_CONST char *format, + va_list args) +{ + int status; + + assert(VALID(buffer)); + assert(VALID(format)); + + status = TrioFormat(&buffer, 0, TrioOutStreamString, format, &args, NULL); + *buffer = NIL; + return status; +} + +/** + Print to string. + + @param buffer Output string. + @param format Formatting string. + @param args Arguments. + @return Number of printed characters. + */ +TRIO_PUBLIC int +trio_sprintfv +TRIO_ARGS3((buffer, format, args), + char *buffer, + TRIO_CONST char *format, + trio_pointer_t *args) +{ + int status; + + assert(VALID(buffer)); + assert(VALID(format)); + + status = TrioFormat(&buffer, 0, TrioOutStreamString, format, NULL, args); + *buffer = NIL; + return status; +} + +/************************************************************************* + * snprintf + */ + +/** + Print at most @p max characters to string. + + @param buffer Output string. + @param max Maximum number of characters to print. + @param format Formatting string. + @param ... Arguments. + @return Number of printed characters. + */ +TRIO_PUBLIC int +trio_snprintf +TRIO_VARGS4((buffer, max, format, va_alist), + char *buffer, + size_t max, + TRIO_CONST char *format, + TRIO_VA_DECL) +{ + int status; + va_list args; + + assert(VALID(buffer)); + assert(VALID(format)); + + TRIO_VA_START(args, format); + status = TrioFormat(&buffer, max > 0 ? max - 1 : 0, + TrioOutStreamStringMax, format, &args, NULL); + if (max > 0) + *buffer = NIL; + TRIO_VA_END(args); + return status; +} + +/** + Print at most @p max characters to string. + + @param buffer Output string. + @param max Maximum number of characters to print. + @param format Formatting string. + @param args Arguments. + @return Number of printed characters. + */ +TRIO_PUBLIC int +trio_vsnprintf +TRIO_ARGS4((buffer, max, format, args), + char *buffer, + size_t max, + TRIO_CONST char *format, + va_list args) +{ + int status; + + assert(VALID(buffer)); + assert(VALID(format)); + + status = TrioFormat(&buffer, max > 0 ? max - 1 : 0, + TrioOutStreamStringMax, format, &args, NULL); + if (max > 0) + *buffer = NIL; + return status; +} + +/** + Print at most @p max characters to string. + + @param buffer Output string. + @param max Maximum number of characters to print. + @param format Formatting string. + @param args Arguments. + @return Number of printed characters. + */ +TRIO_PUBLIC int +trio_snprintfv +TRIO_ARGS4((buffer, max, format, args), + char *buffer, + size_t max, + TRIO_CONST char *format, + trio_pointer_t *args) +{ + int status; + + assert(VALID(buffer)); + assert(VALID(format)); + + status = TrioFormat(&buffer, max > 0 ? max - 1 : 0, + TrioOutStreamStringMax, format, NULL, args); + if (max > 0) + *buffer = NIL; + return status; +} + +/************************************************************************* + * snprintfcat + * Appends the new string to the buffer string overwriting the '\0' + * character at the end of buffer. + */ +TRIO_PUBLIC int +trio_snprintfcat +TRIO_VARGS4((buffer, max, format, va_alist), + char *buffer, + size_t max, + TRIO_CONST char *format, + TRIO_VA_DECL) +{ + int status; + va_list args; + size_t buf_len; + + TRIO_VA_START(args, format); + + assert(VALID(buffer)); + assert(VALID(format)); + + buf_len = trio_length(buffer); + buffer = &buffer[buf_len]; + + status = TrioFormat(&buffer, max - 1 - buf_len, + TrioOutStreamStringMax, format, &args, NULL); + TRIO_VA_END(args); + *buffer = NIL; + return status; +} + +TRIO_PUBLIC int +trio_vsnprintfcat +TRIO_ARGS4((buffer, max, format, args), + char *buffer, + size_t max, + TRIO_CONST char *format, + va_list args) +{ + int status; + size_t buf_len; + + assert(VALID(buffer)); + assert(VALID(format)); + + buf_len = trio_length(buffer); + buffer = &buffer[buf_len]; + status = TrioFormat(&buffer, max - 1 - buf_len, + TrioOutStreamStringMax, format, &args, NULL); + *buffer = NIL; + return status; +} + +/************************************************************************* + * trio_aprintf + */ + +/* Deprecated */ +TRIO_PUBLIC char * +trio_aprintf +TRIO_VARGS2((format, va_alist), + TRIO_CONST char *format, + TRIO_VA_DECL) +{ + va_list args; + trio_string_t *info; + char *result = NULL; + + assert(VALID(format)); + + info = trio_xstring_duplicate(""); + if (info) + { + TRIO_VA_START(args, format); + (void)TrioFormat(info, 0, TrioOutStreamStringDynamic, + format, &args, NULL); + TRIO_VA_END(args); + + trio_string_terminate(info); + result = trio_string_extract(info); + trio_string_destroy(info); + } + return result; +} + +/* Deprecated */ +TRIO_PUBLIC char * +trio_vaprintf +TRIO_ARGS2((format, args), + TRIO_CONST char *format, + va_list args) +{ + trio_string_t *info; + char *result = NULL; + + assert(VALID(format)); + + info = trio_xstring_duplicate(""); + if (info) + { + (void)TrioFormat(info, 0, TrioOutStreamStringDynamic, + format, &args, NULL); + trio_string_terminate(info); + result = trio_string_extract(info); + trio_string_destroy(info); + } + return result; +} + +TRIO_PUBLIC int +trio_asprintf +TRIO_VARGS3((result, format, va_alist), + char **result, + TRIO_CONST char *format, + TRIO_VA_DECL) +{ + va_list args; + int status; + trio_string_t *info; + + assert(VALID(format)); + + *result = NULL; + + info = trio_xstring_duplicate(""); + if (info == NULL) + { + status = TRIO_ERROR_RETURN(TRIO_ENOMEM, 0); + } + else + { + TRIO_VA_START(args, format); + status = TrioFormat(info, 0, TrioOutStreamStringDynamic, + format, &args, NULL); + TRIO_VA_END(args); + if (status >= 0) + { + trio_string_terminate(info); + *result = trio_string_extract(info); + } + trio_string_destroy(info); + } + return status; +} + +TRIO_PUBLIC int +trio_vasprintf +TRIO_ARGS3((result, format, args), + char **result, + TRIO_CONST char *format, + va_list args) +{ + int status; + trio_string_t *info; + + assert(VALID(format)); + + *result = NULL; + + info = trio_xstring_duplicate(""); + if (info == NULL) + { + status = TRIO_ERROR_RETURN(TRIO_ENOMEM, 0); + } + else + { + status = TrioFormat(info, 0, TrioOutStreamStringDynamic, + format, &args, NULL); + if (status >= 0) + { + trio_string_terminate(info); + *result = trio_string_extract(info); + } + trio_string_destroy(info); + } + return status; +} + +/** @} End of Printf documentation module */ + +/************************************************************************* + * + * CALLBACK + * + ************************************************************************/ + +#if defined(TRIO_DOCUMENTATION) +# include "doc/doc_register.h" +#endif +/** + @addtogroup UserDefined + @{ +*/ + +#if TRIO_EXTENSION + +/************************************************************************* + * trio_register + */ + +/** + Register new user-defined specifier. + + @param callback + @param name + @return Handle. + */ +TRIO_PUBLIC trio_pointer_t +trio_register +TRIO_ARGS2((callback, name), + trio_callback_t callback, + TRIO_CONST char *name) +{ + trio_userdef_t *def; + trio_userdef_t *prev = NULL; + + if (callback == NULL) + return NULL; + + if (name) + { + /* Handle built-in namespaces */ + if (name[0] == ':') + { + if (trio_equal(name, ":enter")) + { + internalEnterCriticalRegion = callback; + } + else if (trio_equal(name, ":leave")) + { + internalLeaveCriticalRegion = callback; + } + return NULL; + } + + /* Bail out if namespace is too long */ + if (trio_length(name) >= MAX_USER_NAME) + return NULL; + + /* Bail out if namespace already is registered */ + def = TrioFindNamespace(name, &prev); + if (def) + return NULL; + } + + def = (trio_userdef_t *)TRIO_MALLOC(sizeof(trio_userdef_t)); + if (def) + { + if (internalEnterCriticalRegion) + (void)internalEnterCriticalRegion(NULL); + + if (name) + { + /* Link into internal list */ + if (prev == NULL) + internalUserDef = def; + else + prev->next = def; + } + /* Initialize */ + def->callback = callback; + def->name = (name == NULL) + ? NULL + : trio_duplicate(name); + def->next = NULL; + + if (internalLeaveCriticalRegion) + (void)internalLeaveCriticalRegion(NULL); + } + return (trio_pointer_t)def; +} + +/** + Unregister an existing user-defined specifier. + + @param handle + */ +void +trio_unregister +TRIO_ARGS1((handle), + trio_pointer_t handle) +{ + trio_userdef_t *self = (trio_userdef_t *)handle; + trio_userdef_t *def; + trio_userdef_t *prev = NULL; + + assert(VALID(self)); + + if (self->name) + { + def = TrioFindNamespace(self->name, &prev); + if (def) + { + if (internalEnterCriticalRegion) + (void)internalEnterCriticalRegion(NULL); + + if (prev == NULL) + internalUserDef = NULL; + else + prev->next = def->next; + + if (internalLeaveCriticalRegion) + (void)internalLeaveCriticalRegion(NULL); + } + trio_destroy(self->name); + } + TRIO_FREE(self); +} + +/************************************************************************* + * trio_get_format [public] + */ +TRIO_CONST char * +trio_get_format +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ +#if defined(FORMAT_USER_DEFINED) + assert(((trio_reference_t *)ref)->parameter->type == FORMAT_USER_DEFINED); +#endif + + return (((trio_reference_t *)ref)->parameter->user_data); +} + +/************************************************************************* + * trio_get_argument [public] + */ +trio_pointer_t +trio_get_argument +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ +#if defined(FORMAT_USER_DEFINED) + assert(((trio_reference_t *)ref)->parameter->type == FORMAT_USER_DEFINED); +#endif + + return ((trio_reference_t *)ref)->parameter->data.pointer; +} + +/************************************************************************* + * trio_get_width / trio_set_width [public] + */ +int +trio_get_width +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ + return ((trio_reference_t *)ref)->parameter->width; +} + +void +trio_set_width +TRIO_ARGS2((ref, width), + trio_pointer_t ref, + int width) +{ + ((trio_reference_t *)ref)->parameter->width = width; +} + +/************************************************************************* + * trio_get_precision / trio_set_precision [public] + */ +int +trio_get_precision +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ + return (((trio_reference_t *)ref)->parameter->precision); +} + +void +trio_set_precision +TRIO_ARGS2((ref, precision), + trio_pointer_t ref, + int precision) +{ + ((trio_reference_t *)ref)->parameter->precision = precision; +} + +/************************************************************************* + * trio_get_base / trio_set_base [public] + */ +int +trio_get_base +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ + return (((trio_reference_t *)ref)->parameter->base); +} + +void +trio_set_base +TRIO_ARGS2((ref, base), + trio_pointer_t ref, + int base) +{ + ((trio_reference_t *)ref)->parameter->base = base; +} + +/************************************************************************* + * trio_get_long / trio_set_long [public] + */ +int +trio_get_long +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ + return (((trio_reference_t *)ref)->parameter->flags & FLAGS_LONG) + ? TRUE + : FALSE; +} + +void +trio_set_long +TRIO_ARGS2((ref, is_long), + trio_pointer_t ref, + int is_long) +{ + if (is_long) + ((trio_reference_t *)ref)->parameter->flags |= FLAGS_LONG; + else + ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_LONG; +} + +/************************************************************************* + * trio_get_longlong / trio_set_longlong [public] + */ +int +trio_get_longlong +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ + return (((trio_reference_t *)ref)->parameter->flags & FLAGS_QUAD) + ? TRUE + : FALSE; +} + +void +trio_set_longlong +TRIO_ARGS2((ref, is_longlong), + trio_pointer_t ref, + int is_longlong) +{ + if (is_longlong) + ((trio_reference_t *)ref)->parameter->flags |= FLAGS_QUAD; + else + ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_QUAD; +} + +/************************************************************************* + * trio_get_longdouble / trio_set_longdouble [public] + */ +int +trio_get_longdouble +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ + return (((trio_reference_t *)ref)->parameter->flags & FLAGS_LONGDOUBLE) + ? TRUE + : FALSE; +} + +void +trio_set_longdouble +TRIO_ARGS2((ref, is_longdouble), + trio_pointer_t ref, + int is_longdouble) +{ + if (is_longdouble) + ((trio_reference_t *)ref)->parameter->flags |= FLAGS_LONGDOUBLE; + else + ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_LONGDOUBLE; +} + +/************************************************************************* + * trio_get_short / trio_set_short [public] + */ +int +trio_get_short +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ + return (((trio_reference_t *)ref)->parameter->flags & FLAGS_SHORT) + ? TRUE + : FALSE; +} + +void +trio_set_short +TRIO_ARGS2((ref, is_short), + trio_pointer_t ref, + int is_short) +{ + if (is_short) + ((trio_reference_t *)ref)->parameter->flags |= FLAGS_SHORT; + else + ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_SHORT; +} + +/************************************************************************* + * trio_get_shortshort / trio_set_shortshort [public] + */ +int +trio_get_shortshort +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ + return (((trio_reference_t *)ref)->parameter->flags & FLAGS_SHORTSHORT) + ? TRUE + : FALSE; +} + +void +trio_set_shortshort +TRIO_ARGS2((ref, is_shortshort), + trio_pointer_t ref, + int is_shortshort) +{ + if (is_shortshort) + ((trio_reference_t *)ref)->parameter->flags |= FLAGS_SHORTSHORT; + else + ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_SHORTSHORT; +} + +/************************************************************************* + * trio_get_alternative / trio_set_alternative [public] + */ +int +trio_get_alternative +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ + return (((trio_reference_t *)ref)->parameter->flags & FLAGS_ALTERNATIVE) + ? TRUE + : FALSE; +} + +void +trio_set_alternative +TRIO_ARGS2((ref, is_alternative), + trio_pointer_t ref, + int is_alternative) +{ + if (is_alternative) + ((trio_reference_t *)ref)->parameter->flags |= FLAGS_ALTERNATIVE; + else + ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_ALTERNATIVE; +} + +/************************************************************************* + * trio_get_alignment / trio_set_alignment [public] + */ +int +trio_get_alignment +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ + return (((trio_reference_t *)ref)->parameter->flags & FLAGS_LEFTADJUST) + ? TRUE + : FALSE; +} + +void +trio_set_alignment +TRIO_ARGS2((ref, is_leftaligned), + trio_pointer_t ref, + int is_leftaligned) +{ + if (is_leftaligned) + ((trio_reference_t *)ref)->parameter->flags |= FLAGS_LEFTADJUST; + else + ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_LEFTADJUST; +} + +/************************************************************************* + * trio_get_spacing /trio_set_spacing [public] + */ +int +trio_get_spacing +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ + return (((trio_reference_t *)ref)->parameter->flags & FLAGS_SPACE) + ? TRUE + : FALSE; +} + +void +trio_set_spacing +TRIO_ARGS2((ref, is_space), + trio_pointer_t ref, + int is_space) +{ + if (is_space) + ((trio_reference_t *)ref)->parameter->flags |= FLAGS_SPACE; + else + ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_SPACE; +} + +/************************************************************************* + * trio_get_sign / trio_set_sign [public] + */ +int +trio_get_sign +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ + return (((trio_reference_t *)ref)->parameter->flags & FLAGS_SHOWSIGN) + ? TRUE + : FALSE; +} + +void +trio_set_sign +TRIO_ARGS2((ref, is_sign), + trio_pointer_t ref, + int is_sign) +{ + if (is_sign) + ((trio_reference_t *)ref)->parameter->flags |= FLAGS_SHOWSIGN; + else + ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_SHOWSIGN; +} + +/************************************************************************* + * trio_get_padding / trio_set_padding [public] + */ +int +trio_get_padding +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ + return (((trio_reference_t *)ref)->parameter->flags & FLAGS_NILPADDING) + ? TRUE + : FALSE; +} + +void +trio_set_padding +TRIO_ARGS2((ref, is_padding), + trio_pointer_t ref, + int is_padding) +{ + if (is_padding) + ((trio_reference_t *)ref)->parameter->flags |= FLAGS_NILPADDING; + else + ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_NILPADDING; +} + +/************************************************************************* + * trio_get_quote / trio_set_quote [public] + */ +int +trio_get_quote +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ + return (((trio_reference_t *)ref)->parameter->flags & FLAGS_QUOTE) + ? TRUE + : FALSE; +} + +void +trio_set_quote +TRIO_ARGS2((ref, is_quote), + trio_pointer_t ref, + int is_quote) +{ + if (is_quote) + ((trio_reference_t *)ref)->parameter->flags |= FLAGS_QUOTE; + else + ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_QUOTE; +} + +/************************************************************************* + * trio_get_upper / trio_set_upper [public] + */ +int +trio_get_upper +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ + return (((trio_reference_t *)ref)->parameter->flags & FLAGS_UPPER) + ? TRUE + : FALSE; +} + +void +trio_set_upper +TRIO_ARGS2((ref, is_upper), + trio_pointer_t ref, + int is_upper) +{ + if (is_upper) + ((trio_reference_t *)ref)->parameter->flags |= FLAGS_UPPER; + else + ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_UPPER; +} + +/************************************************************************* + * trio_get_largest / trio_set_largest [public] + */ +#if TRIO_C99 +int +trio_get_largest +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ + return (((trio_reference_t *)ref)->parameter->flags & FLAGS_INTMAX_T) + ? TRUE + : FALSE; +} + +void +trio_set_largest +TRIO_ARGS2((ref, is_largest), + trio_pointer_t ref, + int is_largest) +{ + if (is_largest) + ((trio_reference_t *)ref)->parameter->flags |= FLAGS_INTMAX_T; + else + ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_INTMAX_T; +} +#endif + +/************************************************************************* + * trio_get_ptrdiff / trio_set_ptrdiff [public] + */ +int +trio_get_ptrdiff +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ + return (((trio_reference_t *)ref)->parameter->flags & FLAGS_PTRDIFF_T) + ? TRUE + : FALSE; +} + +void +trio_set_ptrdiff +TRIO_ARGS2((ref, is_ptrdiff), + trio_pointer_t ref, + int is_ptrdiff) +{ + if (is_ptrdiff) + ((trio_reference_t *)ref)->parameter->flags |= FLAGS_PTRDIFF_T; + else + ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_PTRDIFF_T; +} + +/************************************************************************* + * trio_get_size / trio_set_size [public] + */ +#if TRIO_C99 +int +trio_get_size +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ + return (((trio_reference_t *)ref)->parameter->flags & FLAGS_SIZE_T) + ? TRUE + : FALSE; +} + +void +trio_set_size +TRIO_ARGS2((ref, is_size), + trio_pointer_t ref, + int is_size) +{ + if (is_size) + ((trio_reference_t *)ref)->parameter->flags |= FLAGS_SIZE_T; + else + ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_SIZE_T; +} +#endif + +/************************************************************************* + * trio_print_int [public] + */ +void +trio_print_int +TRIO_ARGS2((ref, number), + trio_pointer_t ref, + int number) +{ + trio_reference_t *self = (trio_reference_t *)ref; + + TrioWriteNumber(self->data, + (trio_uintmax_t)number, + self->parameter->flags, + self->parameter->width, + self->parameter->precision, + self->parameter->base); +} + +/************************************************************************* + * trio_print_uint [public] + */ +void +trio_print_uint +TRIO_ARGS2((ref, number), + trio_pointer_t ref, + unsigned int number) +{ + trio_reference_t *self = (trio_reference_t *)ref; + + TrioWriteNumber(self->data, + (trio_uintmax_t)number, + self->parameter->flags | FLAGS_UNSIGNED, + self->parameter->width, + self->parameter->precision, + self->parameter->base); +} + +/************************************************************************* + * trio_print_double [public] + */ +void +trio_print_double +TRIO_ARGS2((ref, number), + trio_pointer_t ref, + double number) +{ + trio_reference_t *self = (trio_reference_t *)ref; + + TrioWriteDouble(self->data, + number, + self->parameter->flags, + self->parameter->width, + self->parameter->precision, + self->parameter->base); +} + +/************************************************************************* + * trio_print_string [public] + */ +void +trio_print_string +TRIO_ARGS2((ref, string), + trio_pointer_t ref, + char *string) +{ + trio_reference_t *self = (trio_reference_t *)ref; + + TrioWriteString(self->data, + string, + self->parameter->flags, + self->parameter->width, + self->parameter->precision); +} + +/************************************************************************* + * trio_print_ref [public] + */ +int +trio_print_ref +TRIO_VARGS3((ref, format, va_alist), + trio_pointer_t ref, + TRIO_CONST char *format, + TRIO_VA_DECL) +{ + int status; + va_list arglist; + + assert(VALID(format)); + + TRIO_VA_START(arglist, format); + status = TrioFormatRef((trio_reference_t *)ref, format, &arglist, NULL); + TRIO_VA_END(arglist); + return status; +} + +/************************************************************************* + * trio_vprint_ref [public] + */ +int +trio_vprint_ref +TRIO_ARGS3((ref, format, arglist), + trio_pointer_t ref, + TRIO_CONST char *format, + va_list arglist) +{ + assert(VALID(format)); + + return TrioFormatRef((trio_reference_t *)ref, format, &arglist, NULL); +} + +/************************************************************************* + * trio_printv_ref [public] + */ +int +trio_printv_ref +TRIO_ARGS3((ref, format, argarray), + trio_pointer_t ref, + TRIO_CONST char *format, + trio_pointer_t *argarray) +{ + assert(VALID(format)); + + return TrioFormatRef((trio_reference_t *)ref, format, NULL, argarray); +} + +#endif /* TRIO_EXTENSION */ + +/************************************************************************* + * trio_print_pointer [public] + */ +void +trio_print_pointer +TRIO_ARGS2((ref, pointer), + trio_pointer_t ref, + trio_pointer_t pointer) +{ + trio_reference_t *self = (trio_reference_t *)ref; + trio_flags_t flags; + trio_uintmax_t number; + + if (NULL == pointer) + { + TRIO_CONST char *string = internalNullString; + while (*string) + self->data->OutStream(self->data, *string++); + } + else + { + /* + * The subtraction of the null pointer is a workaround + * to avoid a compiler warning. The performance overhead + * is negligible (and likely to be removed by an + * optimizing compiler). The (char *) casting is done + * to please ANSI C++. + */ + number = (trio_uintmax_t)((char *)pointer - (char *)0); + /* Shrink to size of pointer */ + number &= (trio_uintmax_t)-1; + flags = self->parameter->flags; + flags |= (FLAGS_UNSIGNED | FLAGS_ALTERNATIVE | + FLAGS_NILPADDING); + TrioWriteNumber(self->data, + number, + flags, + POINTER_WIDTH, + NO_PRECISION, + BASE_HEX); + } +} + +/** @} End of UserDefined documentation module */ + +/************************************************************************* + * + * LOCALES + * + ************************************************************************/ + +/************************************************************************* + * trio_locale_set_decimal_point + * + * Decimal point can only be one character. The input argument is a + * string to enable multibyte characters. At most MB_LEN_MAX characters + * will be used. + */ +TRIO_PUBLIC void +trio_locale_set_decimal_point +TRIO_ARGS1((decimalPoint), + char *decimalPoint) +{ +#if defined(USE_LOCALE) + if (NULL == internalLocaleValues) + { + TrioSetLocale(); + } +#endif + internalDecimalPointLength = trio_length(decimalPoint); + if (internalDecimalPointLength == 1) + { + internalDecimalPoint = *decimalPoint; + } + else + { + internalDecimalPoint = NIL; + trio_copy_max(internalDecimalPointString, + sizeof(internalDecimalPointString), + decimalPoint); + } +} + +/************************************************************************* + * trio_locale_set_thousand_separator + * + * See trio_locale_set_decimal_point + */ +TRIO_PUBLIC void +trio_locale_set_thousand_separator +TRIO_ARGS1((thousandSeparator), + char *thousandSeparator) +{ +#if defined(USE_LOCALE) + if (NULL == internalLocaleValues) + { + TrioSetLocale(); + } +#endif + trio_copy_max(internalThousandSeparator, + sizeof(internalThousandSeparator), + thousandSeparator); + internalThousandSeparatorLength = trio_length(internalThousandSeparator); +} + +/************************************************************************* + * trio_locale_set_grouping + * + * Array of bytes. Reversed order. + * + * CHAR_MAX : No further grouping + * 0 : Repeat last group for the remaining digits (not necessary + * as C strings are zero-terminated) + * n : Set current group to n + * + * Same order as the grouping attribute in LC_NUMERIC. + */ +TRIO_PUBLIC void +trio_locale_set_grouping +TRIO_ARGS1((grouping), + char *grouping) +{ +#if defined(USE_LOCALE) + if (NULL == internalLocaleValues) + { + TrioSetLocale(); + } +#endif + trio_copy_max(internalGrouping, + sizeof(internalGrouping), + grouping); +} + + +/************************************************************************* + * + * SCANNING + * + ************************************************************************/ + +/************************************************************************* + * TrioSkipWhitespaces + */ +TRIO_PRIVATE int +TrioSkipWhitespaces +TRIO_ARGS1((self), + trio_class_t *self) +{ + int ch; + + ch = self->current; + while (isspace(ch)) + { + self->InStream(self, &ch); + } + return ch; +} + +/************************************************************************* + * TrioGetCollation + */ +#if TRIO_EXTENSION +TRIO_PRIVATE void +TrioGetCollation(TRIO_NOARGS) +{ + int i; + int j; + int k; + char first[2]; + char second[2]; + + /* This is computationally expensive */ + first[1] = NIL; + second[1] = NIL; + for (i = 0; i < MAX_CHARACTER_CLASS; i++) + { + k = 0; + first[0] = (char)i; + for (j = 0; j < MAX_CHARACTER_CLASS; j++) + { + second[0] = (char)j; + if (trio_equal_locale(first, second)) + internalCollationArray[i][k++] = (char)j; + } + internalCollationArray[i][k] = NIL; + } +} +#endif + +/************************************************************************* + * TrioGetCharacterClass + * + * FIXME: + * multibyte + */ +TRIO_PRIVATE int +TrioGetCharacterClass +TRIO_ARGS4((format, indexPointer, flagsPointer, characterclass), + TRIO_CONST char *format, + int *indexPointer, + trio_flags_t *flagsPointer, + int *characterclass) +{ + int index = *indexPointer; + int i; + char ch; + char range_begin; + char range_end; + + *flagsPointer &= ~FLAGS_EXCLUDE; + + if (format[index] == QUALIFIER_CIRCUMFLEX) + { + *flagsPointer |= FLAGS_EXCLUDE; + index++; + } + /* + * If the ungroup character is at the beginning of the scanlist, + * it will be part of the class, and a second ungroup character + * must follow to end the group. + */ + if (format[index] == SPECIFIER_UNGROUP) + { + characterclass[(int)SPECIFIER_UNGROUP]++; + index++; + } + /* + * Minus is used to specify ranges. To include minus in the class, + * it must be at the beginning of the list + */ + if (format[index] == QUALIFIER_MINUS) + { + characterclass[(int)QUALIFIER_MINUS]++; + index++; + } + /* Collect characters */ + for (ch = format[index]; + (ch != SPECIFIER_UNGROUP) && (ch != NIL); + ch = format[++index]) + { + switch (ch) + { + case QUALIFIER_MINUS: /* Scanlist ranges */ + + /* + * Both C99 and UNIX98 describes ranges as implementation- + * defined. + * + * We support the following behaviour (although this may + * change as we become wiser) + * - only increasing ranges, ie. [a-b] but not [b-a] + * - transitive ranges, ie. [a-b-c] == [a-c] + * - trailing minus, ie. [a-] is interpreted as an 'a' + * and a '-' + * - duplicates (although we can easily convert these + * into errors) + */ + range_begin = format[index - 1]; + range_end = format[++index]; + if (range_end == SPECIFIER_UNGROUP) + { + /* Trailing minus is included */ + characterclass[(int)ch]++; + ch = range_end; + break; /* for */ + } + if (range_end == NIL) + return TRIO_ERROR_RETURN(TRIO_EINVAL, index); + if (range_begin > range_end) + return TRIO_ERROR_RETURN(TRIO_ERANGE, index); + + for (i = (int)range_begin; i <= (int)range_end; i++) + characterclass[i]++; + + ch = range_end; + break; + +#if TRIO_EXTENSION + + case SPECIFIER_GROUP: + + switch (format[index + 1]) + { + case QUALIFIER_DOT: /* Collating symbol */ + /* + * FIXME: This will be easier to implement when multibyte + * characters have been implemented. Until now, we ignore + * this feature. + */ + for (i = index + 2; ; i++) + { + if (format[i] == NIL) + /* Error in syntax */ + return -1; + else if (format[i] == QUALIFIER_DOT) + break; /* for */ + } + if (format[++i] != SPECIFIER_UNGROUP) + return -1; + + index = i; + break; + + case QUALIFIER_EQUAL: /* Equivalence class expressions */ + { + unsigned int j; + unsigned int k; + + if (internalCollationUnconverted) + { + /* Lazy evaluation of collation array */ + TrioGetCollation(); + internalCollationUnconverted = FALSE; + } + for (i = index + 2; ; i++) + { + if (format[i] == NIL) + /* Error in syntax */ + return -1; + else if (format[i] == QUALIFIER_EQUAL) + break; /* for */ + else + { + /* Mark any equivalent character */ + k = (unsigned int)format[i]; + for (j = 0; internalCollationArray[k][j] != NIL; j++) + characterclass[(int)internalCollationArray[k][j]]++; + } + } + if (format[++i] != SPECIFIER_UNGROUP) + return -1; + + index = i; + } + break; + + case QUALIFIER_COLON: /* Character class expressions */ + + if (trio_equal_max(CLASS_ALNUM, sizeof(CLASS_ALNUM) - 1, + &format[index])) + { + for (i = 0; i < MAX_CHARACTER_CLASS; i++) + if (isalnum(i)) + characterclass[i]++; + index += sizeof(CLASS_ALNUM) - 1; + } + else if (trio_equal_max(CLASS_ALPHA, sizeof(CLASS_ALPHA) - 1, + &format[index])) + { + for (i = 0; i < MAX_CHARACTER_CLASS; i++) + if (isalpha(i)) + characterclass[i]++; + index += sizeof(CLASS_ALPHA) - 1; + } + else if (trio_equal_max(CLASS_CNTRL, sizeof(CLASS_CNTRL) - 1, + &format[index])) + { + for (i = 0; i < MAX_CHARACTER_CLASS; i++) + if (iscntrl(i)) + characterclass[i]++; + index += sizeof(CLASS_CNTRL) - 1; + } + else if (trio_equal_max(CLASS_DIGIT, sizeof(CLASS_DIGIT) - 1, + &format[index])) + { + for (i = 0; i < MAX_CHARACTER_CLASS; i++) + if (isdigit(i)) + characterclass[i]++; + index += sizeof(CLASS_DIGIT) - 1; + } + else if (trio_equal_max(CLASS_GRAPH, sizeof(CLASS_GRAPH) - 1, + &format[index])) + { + for (i = 0; i < MAX_CHARACTER_CLASS; i++) + if (isgraph(i)) + characterclass[i]++; + index += sizeof(CLASS_GRAPH) - 1; + } + else if (trio_equal_max(CLASS_LOWER, sizeof(CLASS_LOWER) - 1, + &format[index])) + { + for (i = 0; i < MAX_CHARACTER_CLASS; i++) + if (islower(i)) + characterclass[i]++; + index += sizeof(CLASS_LOWER) - 1; + } + else if (trio_equal_max(CLASS_PRINT, sizeof(CLASS_PRINT) - 1, + &format[index])) + { + for (i = 0; i < MAX_CHARACTER_CLASS; i++) + if (isprint(i)) + characterclass[i]++; + index += sizeof(CLASS_PRINT) - 1; + } + else if (trio_equal_max(CLASS_PUNCT, sizeof(CLASS_PUNCT) - 1, + &format[index])) + { + for (i = 0; i < MAX_CHARACTER_CLASS; i++) + if (ispunct(i)) + characterclass[i]++; + index += sizeof(CLASS_PUNCT) - 1; + } + else if (trio_equal_max(CLASS_SPACE, sizeof(CLASS_SPACE) - 1, + &format[index])) + { + for (i = 0; i < MAX_CHARACTER_CLASS; i++) + if (isspace(i)) + characterclass[i]++; + index += sizeof(CLASS_SPACE) - 1; + } + else if (trio_equal_max(CLASS_UPPER, sizeof(CLASS_UPPER) - 1, + &format[index])) + { + for (i = 0; i < MAX_CHARACTER_CLASS; i++) + if (isupper(i)) + characterclass[i]++; + index += sizeof(CLASS_UPPER) - 1; + } + else if (trio_equal_max(CLASS_XDIGIT, sizeof(CLASS_XDIGIT) - 1, + &format[index])) + { + for (i = 0; i < MAX_CHARACTER_CLASS; i++) + if (isxdigit(i)) + characterclass[i]++; + index += sizeof(CLASS_XDIGIT) - 1; + } + else + { + characterclass[(int)ch]++; + } + break; + + default: + characterclass[(int)ch]++; + break; + } + break; + +#endif /* TRIO_EXTENSION */ + + default: + characterclass[(int)ch]++; + break; + } + } + return 0; +} + +/************************************************************************* + * TrioReadNumber + * + * We implement our own number conversion in preference of strtol and + * strtoul, because we must handle 'long long' and thousand separators. + */ +TRIO_PRIVATE BOOLEAN_T +TrioReadNumber +TRIO_ARGS5((self, target, flags, width, base), + trio_class_t *self, + trio_uintmax_t *target, + trio_flags_t flags, + int width, + int base) +{ + trio_uintmax_t number = 0; + int digit; + int count; + BOOLEAN_T isNegative = FALSE; + BOOLEAN_T gotNumber = FALSE; + int j; + + assert(VALID(self)); + assert(VALID(self->InStream)); + assert((base >= MIN_BASE && base <= MAX_BASE) || (base == NO_BASE)); + + if (internalDigitsUnconverted) + { + /* Lazy evaluation of digits array */ + memset(internalDigitArray, -1, sizeof(internalDigitArray)); + for (j = 0; j < (int)sizeof(internalDigitsLower) - 1; j++) + { + internalDigitArray[(int)internalDigitsLower[j]] = j; + internalDigitArray[(int)internalDigitsUpper[j]] = j; + } + internalDigitsUnconverted = FALSE; + } + + TrioSkipWhitespaces(self); + + if (!(flags & FLAGS_UNSIGNED)) + { + /* Leading sign */ + if (self->current == '+') + { + self->InStream(self, NULL); + } + else if (self->current == '-') + { + self->InStream(self, NULL); + isNegative = TRUE; + } + } + + count = self->processed; + + if (flags & FLAGS_ALTERNATIVE) + { + switch (base) + { + case NO_BASE: + case BASE_OCTAL: + case BASE_HEX: + case BASE_BINARY: + if (self->current == '0') + { + self->InStream(self, NULL); + if (self->current) + { + if ((base == BASE_HEX) && + (trio_to_upper(self->current) == 'X')) + { + self->InStream(self, NULL); + } + else if ((base == BASE_BINARY) && + (trio_to_upper(self->current) == 'B')) + { + self->InStream(self, NULL); + } + } + } + else + return FALSE; + break; + default: + break; + } + } + + while (((width == NO_WIDTH) || (self->processed - count < width)) && + (! ((self->current == EOF) || isspace(self->current)))) + { + if (isascii(self->current)) + { + digit = internalDigitArray[self->current]; + /* Abort if digit is not allowed in the specified base */ + if ((digit == -1) || (digit >= base)) + break; + } + else if (flags & FLAGS_QUOTE) + { + /* Compare with thousands separator */ + for (j = 0; internalThousandSeparator[j] && self->current; j++) + { + if (internalThousandSeparator[j] != self->current) + break; + + self->InStream(self, NULL); + } + if (internalThousandSeparator[j]) + break; /* Mismatch */ + else + continue; /* Match */ + } + else + break; + + number *= base; + number += digit; + gotNumber = TRUE; /* we need at least one digit */ + + self->InStream(self, NULL); + } + + /* Was anything read at all? */ + if (!gotNumber) + return FALSE; + + if (target) + *target = (isNegative) ? -((trio_intmax_t)number) : number; + return TRUE; +} + +/************************************************************************* + * TrioReadChar + */ +TRIO_PRIVATE int +TrioReadChar +TRIO_ARGS4((self, target, flags, width), + trio_class_t *self, + char *target, + trio_flags_t flags, + int width) +{ + int i; + char ch; + trio_uintmax_t number; + + assert(VALID(self)); + assert(VALID(self->InStream)); + + for (i = 0; + (self->current != EOF) && (i < width); + i++) + { + ch = (char)self->current; + self->InStream(self, NULL); + if ((flags & FLAGS_ALTERNATIVE) && (ch == CHAR_BACKSLASH)) + { + switch (self->current) + { + case '\\': ch = '\\'; break; + case 'a': ch = '\007'; break; + case 'b': ch = '\b'; break; + case 'f': ch = '\f'; break; + case 'n': ch = '\n'; break; + case 'r': ch = '\r'; break; + case 't': ch = '\t'; break; + case 'v': ch = '\v'; break; + default: + if (isdigit(self->current)) + { + /* Read octal number */ + if (!TrioReadNumber(self, &number, 0, 3, BASE_OCTAL)) + return 0; + ch = (char)number; + } + else if (trio_to_upper(self->current) == 'X') + { + /* Read hexadecimal number */ + self->InStream(self, NULL); + if (!TrioReadNumber(self, &number, 0, 2, BASE_HEX)) + return 0; + ch = (char)number; + } + else + { + ch = (char)self->current; + } + break; + } + } + + if (target) + target[i] = ch; + } + return i + 1; +} + +/************************************************************************* + * TrioReadString + */ +TRIO_PRIVATE BOOLEAN_T +TrioReadString +TRIO_ARGS4((self, target, flags, width), + trio_class_t *self, + char *target, + trio_flags_t flags, + int width) +{ + int i; + + assert(VALID(self)); + assert(VALID(self->InStream)); + + TrioSkipWhitespaces(self); + + /* + * Continue until end of string is reached, a whitespace is encountered, + * or width is exceeded + */ + for (i = 0; + ((width == NO_WIDTH) || (i < width)) && + (! ((self->current == EOF) || isspace(self->current))); + i++) + { + if (TrioReadChar(self, (target ? &target[i] : 0), flags, 1) == 0) + break; /* for */ + } + if (target) + target[i] = NIL; + return TRUE; +} + +/************************************************************************* + * TrioReadWideChar + */ +#if TRIO_WIDECHAR +TRIO_PRIVATE int +TrioReadWideChar +TRIO_ARGS4((self, target, flags, width), + trio_class_t *self, + trio_wchar_t *target, + trio_flags_t flags, + int width) +{ + int i; + int j; + int size; + int amount = 0; + trio_wchar_t wch; + char buffer[MB_LEN_MAX + 1]; + + assert(VALID(self)); + assert(VALID(self->InStream)); + + for (i = 0; + (self->current != EOF) && (i < width); + i++) + { + if (isascii(self->current)) + { + if (TrioReadChar(self, buffer, flags, 1) == 0) + return 0; + buffer[1] = NIL; + } + else + { + /* + * Collect a multibyte character, by enlarging buffer until + * it contains a fully legal multibyte character, or the + * buffer is full. + */ + j = 0; + do + { + buffer[j++] = (char)self->current; + buffer[j] = NIL; + self->InStream(self, NULL); + } + while ((j < (int)sizeof(buffer)) && (mblen(buffer, (size_t)j) != j)); + } + if (target) + { + size = mbtowc(&wch, buffer, sizeof(buffer)); + if (size > 0) + target[i] = wch; + } + amount += size; + self->InStream(self, NULL); + } + return amount; +} +#endif /* TRIO_WIDECHAR */ + +/************************************************************************* + * TrioReadWideString + */ +#if TRIO_WIDECHAR +TRIO_PRIVATE BOOLEAN_T +TrioReadWideString +TRIO_ARGS4((self, target, flags, width), + trio_class_t *self, + trio_wchar_t *target, + trio_flags_t flags, + int width) +{ + int i; + int size; + + assert(VALID(self)); + assert(VALID(self->InStream)); + + TrioSkipWhitespaces(self); + +#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) + (void)mblen(NULL, 0); +#endif + + /* + * Continue until end of string is reached, a whitespace is encountered, + * or width is exceeded + */ + for (i = 0; + ((width == NO_WIDTH) || (i < width)) && + (! ((self->current == EOF) || isspace(self->current))); + ) + { + size = TrioReadWideChar(self, &target[i], flags, 1); + if (size == 0) + break; /* for */ + + i += size; + } + if (target) + target[i] = WCONST('\0'); + return TRUE; +} +#endif /* TRIO_WIDECHAR */ + +/************************************************************************* + * TrioReadGroup + * + * FIXME: characterclass does not work with multibyte characters + */ +TRIO_PRIVATE BOOLEAN_T +TrioReadGroup +TRIO_ARGS5((self, target, characterclass, flags, width), + trio_class_t *self, + char *target, + int *characterclass, + trio_flags_t flags, + int width) +{ + int ch; + int i; + + assert(VALID(self)); + assert(VALID(self->InStream)); + + ch = self->current; + for (i = 0; + ((width == NO_WIDTH) || (i < width)) && + (! ((ch == EOF) || + (((flags & FLAGS_EXCLUDE) != 0) ^ (characterclass[ch] == 0)))); + i++) + { + if (target) + target[i] = (char)ch; + self->InStream(self, &ch); + } + + if (target) + target[i] = NIL; + return TRUE; +} + +/************************************************************************* + * TrioReadDouble + * + * FIXME: + * add long double + * handle base + */ +TRIO_PRIVATE BOOLEAN_T +TrioReadDouble +TRIO_ARGS4((self, target, flags, width), + trio_class_t *self, + trio_pointer_t target, + trio_flags_t flags, + int width) +{ + int ch; + char doubleString[512]; + int index = 0; + int start; + int j; + BOOLEAN_T isHex = FALSE; + + doubleString[0] = 0; + + if ((width == NO_WIDTH) || (width > (int)sizeof(doubleString) - 1)) + width = sizeof(doubleString) - 1; + + TrioSkipWhitespaces(self); + + /* + * Read entire double number from stream. trio_to_double requires + * a string as input, but InStream can be anything, so we have to + * collect all characters. + */ + ch = self->current; + if ((ch == '+') || (ch == '-')) + { + doubleString[index++] = (char)ch; + self->InStream(self, &ch); + width--; + } + + start = index; + switch (ch) + { + case 'n': + case 'N': + /* Not-a-number */ + if (index != 0) + break; + /* FALLTHROUGH */ + case 'i': + case 'I': + /* Infinity */ + while (isalpha(ch) && (index - start < width)) + { + doubleString[index++] = (char)ch; + self->InStream(self, &ch); + } + doubleString[index] = NIL; + + /* Case insensitive string comparison */ + if (trio_equal(&doubleString[start], INFINITE_UPPER) || + trio_equal(&doubleString[start], LONG_INFINITE_UPPER)) + { + if (flags & FLAGS_LONGDOUBLE) + { + if ((start == 1) && (doubleString[0] == '-')) + { + *((trio_long_double_t *)target) = trio_ninf(); + } + else + { + *((trio_long_double_t *)target) = trio_pinf(); + } + } + else + { + if ((start == 1) && (doubleString[0] == '-')) + { + *((double *)target) = trio_ninf(); + } + else + { + *((double *)target) = trio_pinf(); + } + } + return TRUE; + } + if (trio_equal(doubleString, NAN_UPPER)) + { + /* NaN must not have a preceeding + nor - */ + if (flags & FLAGS_LONGDOUBLE) + { + *((trio_long_double_t *)target) = trio_nan(); + } + else + { + *((double *)target) = trio_nan(); + } + return TRUE; + } + return FALSE; + + case '0': + doubleString[index++] = (char)ch; + self->InStream(self, &ch); + if (trio_to_upper(ch) == 'X') + { + isHex = TRUE; + doubleString[index++] = (char)ch; + self->InStream(self, &ch); + } + break; + + default: + break; + } + + while ((ch != EOF) && (index - start < width)) + { + /* Integer part */ + if (isHex ? isxdigit(ch) : isdigit(ch)) + { + doubleString[index++] = (char)ch; + self->InStream(self, &ch); + } + else if (flags & FLAGS_QUOTE) + { + /* Compare with thousands separator */ + for (j = 0; internalThousandSeparator[j] && self->current; j++) + { + if (internalThousandSeparator[j] != self->current) + break; + + self->InStream(self, &ch); + } + if (internalThousandSeparator[j]) + break; /* Mismatch */ + else + continue; /* Match */ + } + else + break; /* while */ + } + if (ch == '.') + { + /* Decimal part */ + doubleString[index++] = (char)ch; + self->InStream(self, &ch); + while ((isHex ? isxdigit(ch) : isdigit(ch)) && + (index - start < width)) + { + doubleString[index++] = (char)ch; + self->InStream(self, &ch); + } + if (isHex ? (trio_to_upper(ch) == 'P') : (trio_to_upper(ch) == 'E')) + { + /* Exponent */ + doubleString[index++] = (char)ch; + self->InStream(self, &ch); + if ((ch == '+') || (ch == '-')) + { + doubleString[index++] = (char)ch; + self->InStream(self, &ch); + } + while (isdigit(ch) && (index - start < width)) + { + doubleString[index++] = (char)ch; + self->InStream(self, &ch); + } + } + } + + if ((index == start) || (*doubleString == NIL)) + return FALSE; + + doubleString[index] = 0; + + if (flags & FLAGS_LONGDOUBLE) + { + *((trio_long_double_t *)target) = trio_to_long_double(doubleString, NULL); + } + else + { + *((double *)target) = trio_to_double(doubleString, NULL); + } + return TRUE; +} + +/************************************************************************* + * TrioReadPointer + */ +TRIO_PRIVATE BOOLEAN_T +TrioReadPointer +TRIO_ARGS3((self, target, flags), + trio_class_t *self, + trio_pointer_t *target, + trio_flags_t flags) +{ + trio_uintmax_t number; + char buffer[sizeof(internalNullString)]; + + flags |= (FLAGS_UNSIGNED | FLAGS_ALTERNATIVE | FLAGS_NILPADDING); + + if (TrioReadNumber(self, + &number, + flags, + POINTER_WIDTH, + BASE_HEX)) + { + /* + * The strange assignment of number is a workaround for a compiler + * warning + */ + if (target) + *target = (char *)0 + number; + return TRUE; + } + else if (TrioReadString(self, + (flags & FLAGS_IGNORE) + ? NULL + : buffer, + 0, + sizeof(internalNullString) - 1)) + { + if (trio_equal_case(buffer, internalNullString)) + { + if (target) + *target = NULL; + return TRUE; + } + } + return FALSE; +} + +/************************************************************************* + * TrioScanProcess + */ +TRIO_PRIVATE int +TrioScanProcess +TRIO_ARGS3((data, format, parameters), + trio_class_t *data, + TRIO_CONST char *format, + trio_parameter_t *parameters) +{ +#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) + int charlen; + int cnt; +#endif + int assignment; + int ch; + int index; /* Index of format string */ + int i; /* Index of current parameter */ + trio_flags_t flags; + int width; + int base; + trio_pointer_t pointer; + + assignment = 0; + i = 0; + index = 0; + data->InStream(data, &ch); + +#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) + (void)mblen(NULL, 0); +#endif + + while (format[index]) + { +#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) + if (! isascii(format[index])) + { + charlen = mblen(&format[index], MB_LEN_MAX); + if (charlen != -1) + { + /* Compare multibyte characters in format string */ + for (cnt = 0; cnt < charlen - 1; cnt++) + { + if (ch != format[index + cnt]) + { + return TRIO_ERROR_RETURN(TRIO_EINVAL, index); + } + data->InStream(data, &ch); + } + continue; /* while characters left in formatting string */ + } + } +#endif /* TRIO_COMPILER_SUPPORTS_MULTIBYTE */ + + if ((EOF == ch) && (parameters[i].type != FORMAT_COUNT)) + { + return (assignment > 0) ? assignment : EOF; + } + + if (CHAR_IDENTIFIER == format[index]) + { + if (CHAR_IDENTIFIER == format[index + 1]) + { + /* Two % in format matches one % in input stream */ + if (CHAR_IDENTIFIER == ch) + { + data->InStream(data, &ch); + index += 2; + continue; /* while format chars left */ + } + else + return TRIO_ERROR_RETURN(TRIO_EINVAL, index); + } + + /* Skip the parameter entries */ + while (parameters[i].type == FORMAT_PARAMETER) + i++; + + flags = parameters[i].flags; + /* Find width */ + width = parameters[i].width; + if (flags & FLAGS_WIDTH_PARAMETER) + { + /* Get width from parameter list */ + width = (int)parameters[width].data.number.as_signed; + } + /* Find base */ + base = parameters[i].base; + if (flags & FLAGS_BASE_PARAMETER) + { + /* Get base from parameter list */ + base = (int)parameters[base].data.number.as_signed; + } + + switch (parameters[i].type) + { + case FORMAT_INT: + { + trio_uintmax_t number; + + if (0 == base) + base = BASE_DECIMAL; + + if (!TrioReadNumber(data, + &number, + flags, + width, + base)) + return assignment; + + if (!(flags & FLAGS_IGNORE)) + { + assignment++; + + pointer = parameters[i].data.pointer; +#if defined(QUALIFIER_SIZE_T) || defined(QUALIFIER_SIZE_T_UPPER) + if (flags & FLAGS_SIZE_T) + *(size_t *)pointer = (size_t)number; + else +#endif +#if defined(QUALIFIER_PTRDIFF_T) + if (flags & FLAGS_PTRDIFF_T) + *(ptrdiff_t *)pointer = (ptrdiff_t)number; + else +#endif +#if defined(QUALIFIER_INTMAX_T) + if (flags & FLAGS_INTMAX_T) + *(trio_intmax_t *)pointer = (trio_intmax_t)number; + else +#endif + if (flags & FLAGS_QUAD) + *(trio_ulonglong_t *)pointer = (trio_ulonglong_t)number; + else if (flags & FLAGS_LONG) + *(long int *)pointer = (long int)number; + else if (flags & FLAGS_SHORT) + *(short int *)pointer = (short int)number; + else + *(int *)pointer = (int)number; + } + } + break; /* FORMAT_INT */ + + case FORMAT_STRING: +#if TRIO_WIDECHAR + if (flags & FLAGS_WIDECHAR) + { + if (!TrioReadWideString(data, + (flags & FLAGS_IGNORE) + ? NULL + : parameters[i].data.wstring, + flags, + width)) + return assignment; + } + else +#endif + { + if (!TrioReadString(data, + (flags & FLAGS_IGNORE) + ? NULL + : parameters[i].data.string, + flags, + width)) + return assignment; + } + if (!(flags & FLAGS_IGNORE)) + assignment++; + break; /* FORMAT_STRING */ + + case FORMAT_DOUBLE: + { + trio_pointer_t pointer; + + if (flags & FLAGS_IGNORE) + { + pointer = NULL; + } + else + { + pointer = (flags & FLAGS_LONGDOUBLE) + ? (trio_pointer_t)parameters[i].data.longdoublePointer + : (trio_pointer_t)parameters[i].data.doublePointer; + } + if (!TrioReadDouble(data, pointer, flags, width)) + { + return assignment; + } + if (!(flags & FLAGS_IGNORE)) + { + assignment++; + } + break; /* FORMAT_DOUBLE */ + } + case FORMAT_GROUP: + { + int characterclass[MAX_CHARACTER_CLASS + 1]; + int rc; + + /* Skip over modifiers */ + while (format[index] != SPECIFIER_GROUP) + { + index++; + } + /* Skip over group specifier */ + index++; + + memset(characterclass, 0, sizeof(characterclass)); + rc = TrioGetCharacterClass(format, + &index, + &flags, + characterclass); + if (rc < 0) + return rc; + + if (!TrioReadGroup(data, + (flags & FLAGS_IGNORE) + ? NULL + : parameters[i].data.string, + characterclass, + flags, + parameters[i].width)) + return assignment; + if (!(flags & FLAGS_IGNORE)) + assignment++; + } + break; /* FORMAT_GROUP */ + + case FORMAT_COUNT: + pointer = parameters[i].data.pointer; + if (NULL != pointer) + { + int count = data->committed; + if (ch != EOF) + count--; /* a character is read, but is not consumed yet */ +#if defined(QUALIFIER_SIZE_T) || defined(QUALIFIER_SIZE_T_UPPER) + if (flags & FLAGS_SIZE_T) + *(size_t *)pointer = (size_t)count; + else +#endif +#if defined(QUALIFIER_PTRDIFF_T) + if (flags & FLAGS_PTRDIFF_T) + *(ptrdiff_t *)pointer = (ptrdiff_t)count; + else +#endif +#if defined(QUALIFIER_INTMAX_T) + if (flags & FLAGS_INTMAX_T) + *(trio_intmax_t *)pointer = (trio_intmax_t)count; + else +#endif + if (flags & FLAGS_QUAD) + { + *(trio_ulonglong_t *)pointer = (trio_ulonglong_t)count; + } + else if (flags & FLAGS_LONG) + { + *(long int *)pointer = (long int)count; + } + else if (flags & FLAGS_SHORT) + { + *(short int *)pointer = (short int)count; + } + else + { + *(int *)pointer = (int)count; + } + } + break; /* FORMAT_COUNT */ + + case FORMAT_CHAR: +#if TRIO_WIDECHAR + if (flags & FLAGS_WIDECHAR) + { + if (TrioReadWideChar(data, + (flags & FLAGS_IGNORE) + ? NULL + : parameters[i].data.wstring, + flags, + (width == NO_WIDTH) ? 1 : width) == 0) + return assignment; + } + else +#endif + { + if (TrioReadChar(data, + (flags & FLAGS_IGNORE) + ? NULL + : parameters[i].data.string, + flags, + (width == NO_WIDTH) ? 1 : width) == 0) + return assignment; + } + if (!(flags & FLAGS_IGNORE)) + assignment++; + break; /* FORMAT_CHAR */ + + case FORMAT_POINTER: + if (!TrioReadPointer(data, + (flags & FLAGS_IGNORE) + ? NULL + : (trio_pointer_t *)parameters[i].data.pointer, + flags)) + return assignment; + if (!(flags & FLAGS_IGNORE)) + assignment++; + break; /* FORMAT_POINTER */ + + case FORMAT_PARAMETER: + break; /* FORMAT_PARAMETER */ + + default: + return TRIO_ERROR_RETURN(TRIO_EINVAL, index); + } + ch = data->current; + index = parameters[i].indexAfterSpecifier; + i++; + } + else /* Not an % identifier */ + { + if (isspace((int)format[index])) + { + /* Whitespaces may match any amount of whitespaces */ + ch = TrioSkipWhitespaces(data); + } + else if (ch == format[index]) + { + data->InStream(data, &ch); + } + else + return assignment; + + index++; + } + } + return assignment; +} + +/************************************************************************* + * TrioScan + */ +TRIO_PRIVATE int +TrioScan +TRIO_ARGS6((source, sourceSize, InStream, format, arglist, argarray), + trio_pointer_t source, + size_t sourceSize, + void (*InStream) TRIO_PROTO((trio_class_t *, int *)), + TRIO_CONST char *format, + va_list *arglist, + trio_pointer_t *argarray) +{ + int status; + trio_parameter_t parameters[MAX_PARAMETERS]; + trio_class_t data; + + assert(VALID(InStream)); + assert(VALID(format)); + + memset(&data, 0, sizeof(data)); + data.InStream = InStream; + data.location = (trio_pointer_t)source; + data.max = sourceSize; + data.error = 0; + +#if defined(USE_LOCALE) + if (NULL == internalLocaleValues) + { + TrioSetLocale(); + } +#endif + + status = TrioParse(TYPE_SCAN, format, parameters, arglist, argarray); + if (status < 0) + return status; + + status = TrioScanProcess(&data, format, parameters); + if (data.error != 0) + { + status = data.error; + } + return status; +} + +/************************************************************************* + * TrioInStreamFile + */ +TRIO_PRIVATE void +TrioInStreamFile +TRIO_ARGS2((self, intPointer), + trio_class_t *self, + int *intPointer) +{ + FILE *file = (FILE *)self->location; + + assert(VALID(self)); + assert(VALID(file)); + + self->current = fgetc(file); + if (self->current == EOF) + { + self->error = (ferror(file)) + ? TRIO_ERROR_RETURN(TRIO_ERRNO, 0) + : TRIO_ERROR_RETURN(TRIO_EOF, 0); + } + else + { + self->processed++; + self->committed++; + } + + if (VALID(intPointer)) + { + *intPointer = self->current; + } +} + +/************************************************************************* + * TrioInStreamFileDescriptor + */ +TRIO_PRIVATE void +TrioInStreamFileDescriptor +TRIO_ARGS2((self, intPointer), + trio_class_t *self, + int *intPointer) +{ + int fd = *((int *)self->location); + int size; + unsigned char input; + + assert(VALID(self)); + + size = read(fd, &input, sizeof(char)); + if (size == -1) + { + self->error = TRIO_ERROR_RETURN(TRIO_ERRNO, 0); + self->current = EOF; + } + else + { + self->current = (size == 0) ? EOF : input; + } + if (self->current != EOF) + { + self->committed++; + self->processed++; + } + + if (VALID(intPointer)) + { + *intPointer = self->current; + } +} + +/************************************************************************* + * TrioInStreamCustom + */ +TRIO_PRIVATE void +TrioInStreamCustom +TRIO_ARGS2((self, intPointer), + trio_class_t *self, + int *intPointer) +{ + trio_custom_t *data; + + assert(VALID(self)); + assert(VALID(self->location)); + + data = (trio_custom_t *)self->location; + + self->current = (data->stream.in == NULL) + ? NIL + : (data->stream.in)(data->closure); + + if (self->current == NIL) + { + self->current = EOF; + } + else + { + self->processed++; + self->committed++; + } + + if (VALID(intPointer)) + { + *intPointer = self->current; + } +} + +/************************************************************************* + * TrioInStreamString + */ +TRIO_PRIVATE void +TrioInStreamString +TRIO_ARGS2((self, intPointer), + trio_class_t *self, + int *intPointer) +{ + unsigned char **buffer; + + assert(VALID(self)); + assert(VALID(self->location)); + + buffer = (unsigned char **)self->location; + self->current = (*buffer)[0]; + if (self->current == NIL) + { + self->current = EOF; + } + else + { + (*buffer)++; + self->processed++; + self->committed++; + } + + if (VALID(intPointer)) + { + *intPointer = self->current; + } +} + +/************************************************************************* + * + * Formatted scanning functions + * + ************************************************************************/ + +#if defined(TRIO_DOCUMENTATION) +# include "doc/doc_scanf.h" +#endif +/** @addtogroup Scanf + @{ +*/ + +/************************************************************************* + * scanf + */ + +/** + Scan characters from standard input stream. + + @param format Formatting string. + @param ... Arguments. + @return Number of scanned characters. + */ +TRIO_PUBLIC int +trio_scanf +TRIO_VARGS2((format, va_alist), + TRIO_CONST char *format, + TRIO_VA_DECL) +{ + int status; + va_list args; + + assert(VALID(format)); + + TRIO_VA_START(args, format); + status = TrioScan((trio_pointer_t)stdin, 0, + TrioInStreamFile, + format, &args, NULL); + TRIO_VA_END(args); + return status; +} + +TRIO_PUBLIC int +trio_vscanf +TRIO_ARGS2((format, args), + TRIO_CONST char *format, + va_list args) +{ + assert(VALID(format)); + + return TrioScan((trio_pointer_t)stdin, 0, + TrioInStreamFile, + format, &args, NULL); +} + +TRIO_PUBLIC int +trio_scanfv +TRIO_ARGS2((format, args), + TRIO_CONST char *format, + trio_pointer_t *args) +{ + assert(VALID(format)); + + return TrioScan((trio_pointer_t)stdin, 0, + TrioInStreamFile, + format, NULL, args); +} + +/************************************************************************* + * fscanf + */ +TRIO_PUBLIC int +trio_fscanf +TRIO_VARGS3((file, format, va_alist), + FILE *file, + TRIO_CONST char *format, + TRIO_VA_DECL) +{ + int status; + va_list args; + + assert(VALID(file)); + assert(VALID(format)); + + TRIO_VA_START(args, format); + status = TrioScan((trio_pointer_t)file, 0, + TrioInStreamFile, + format, &args, NULL); + TRIO_VA_END(args); + return status; +} + +TRIO_PUBLIC int +trio_vfscanf +TRIO_ARGS3((file, format, args), + FILE *file, + TRIO_CONST char *format, + va_list args) +{ + assert(VALID(file)); + assert(VALID(format)); + + return TrioScan((trio_pointer_t)file, 0, + TrioInStreamFile, + format, &args, NULL); +} + +TRIO_PUBLIC int +trio_fscanfv +TRIO_ARGS3((file, format, args), + FILE *file, + TRIO_CONST char *format, + trio_pointer_t *args) +{ + assert(VALID(file)); + assert(VALID(format)); + + return TrioScan((trio_pointer_t)file, 0, + TrioInStreamFile, + format, NULL, args); +} + +/************************************************************************* + * dscanf + */ +TRIO_PUBLIC int +trio_dscanf +TRIO_VARGS3((fd, format, va_alist), + int fd, + TRIO_CONST char *format, + TRIO_VA_DECL) +{ + int status; + va_list args; + + assert(VALID(format)); + + TRIO_VA_START(args, format); + status = TrioScan((trio_pointer_t)&fd, 0, + TrioInStreamFileDescriptor, + format, &args, NULL); + TRIO_VA_END(args); + return status; +} + +TRIO_PUBLIC int +trio_vdscanf +TRIO_ARGS3((fd, format, args), + int fd, + TRIO_CONST char *format, + va_list args) +{ + assert(VALID(format)); + + return TrioScan((trio_pointer_t)&fd, 0, + TrioInStreamFileDescriptor, + format, &args, NULL); +} + +TRIO_PUBLIC int +trio_dscanfv +TRIO_ARGS3((fd, format, args), + int fd, + TRIO_CONST char *format, + trio_pointer_t *args) +{ + assert(VALID(format)); + + return TrioScan((trio_pointer_t)&fd, 0, + TrioInStreamFileDescriptor, + format, NULL, args); +} + +/************************************************************************* + * cscanf + */ +TRIO_PUBLIC int +trio_cscanf +TRIO_VARGS4((stream, closure, format, va_alist), + trio_instream_t stream, + trio_pointer_t closure, + TRIO_CONST char *format, + TRIO_VA_DECL) +{ + int status; + va_list args; + trio_custom_t data; + + assert(VALID(stream)); + assert(VALID(format)); + + TRIO_VA_START(args, format); + data.stream.in = stream; + data.closure = closure; + status = TrioScan(&data, 0, TrioInStreamCustom, format, &args, NULL); + TRIO_VA_END(args); + return status; +} + +TRIO_PUBLIC int +trio_vcscanf +TRIO_ARGS4((stream, closure, format, args), + trio_instream_t stream, + trio_pointer_t closure, + TRIO_CONST char *format, + va_list args) +{ + trio_custom_t data; + + assert(VALID(stream)); + assert(VALID(format)); + + data.stream.in = stream; + data.closure = closure; + return TrioScan(&data, 0, TrioInStreamCustom, format, &args, NULL); +} + +TRIO_PUBLIC int +trio_cscanfv +TRIO_ARGS4((stream, closure, format, args), + trio_instream_t stream, + trio_pointer_t closure, + TRIO_CONST char *format, + trio_pointer_t *args) +{ + trio_custom_t data; + + assert(VALID(stream)); + assert(VALID(format)); + + data.stream.in = stream; + data.closure = closure; + return TrioScan(&data, 0, TrioInStreamCustom, format, NULL, args); +} + +/************************************************************************* + * sscanf + */ +TRIO_PUBLIC int +trio_sscanf +TRIO_VARGS3((buffer, format, va_alist), + TRIO_CONST char *buffer, + TRIO_CONST char *format, + TRIO_VA_DECL) +{ + int status; + va_list args; + + assert(VALID(buffer)); + assert(VALID(format)); + + TRIO_VA_START(args, format); + status = TrioScan((trio_pointer_t)&buffer, 0, + TrioInStreamString, + format, &args, NULL); + TRIO_VA_END(args); + return status; +} + +TRIO_PUBLIC int +trio_vsscanf +TRIO_ARGS3((buffer, format, args), + TRIO_CONST char *buffer, + TRIO_CONST char *format, + va_list args) +{ + assert(VALID(buffer)); + assert(VALID(format)); + + return TrioScan((trio_pointer_t)&buffer, 0, + TrioInStreamString, + format, &args, NULL); +} + +TRIO_PUBLIC int +trio_sscanfv +TRIO_ARGS3((buffer, format, args), + TRIO_CONST char *buffer, + TRIO_CONST char *format, + trio_pointer_t *args) +{ + assert(VALID(buffer)); + assert(VALID(format)); + + return TrioScan((trio_pointer_t)&buffer, 0, + TrioInStreamString, + format, NULL, args); +} + +/** @} End of Scanf documentation module */ + +/************************************************************************* + * trio_strerror + */ +TRIO_PUBLIC TRIO_CONST char * +trio_strerror +TRIO_ARGS1((errorcode), + int errorcode) +{ + /* Textual versions of the error codes */ + switch (TRIO_ERROR_CODE(errorcode)) + { + case TRIO_EOF: + return "End of file"; + case TRIO_EINVAL: + return "Invalid argument"; + case TRIO_ETOOMANY: + return "Too many arguments"; + case TRIO_EDBLREF: + return "Double reference"; + case TRIO_EGAP: + return "Reference gap"; + case TRIO_ENOMEM: + return "Out of memory"; + case TRIO_ERANGE: + return "Invalid range"; + case TRIO_ECUSTOM: + return "Custom error"; + default: + return "Unknown"; + } +} diff --git a/vendors/libxml/src/trio.h b/vendors/libxml/src/trio.h new file mode 100644 index 0000000..108a709 --- /dev/null +++ b/vendors/libxml/src/trio.h @@ -0,0 +1,216 @@ +/************************************************************************* + * + * $Id$ + * + * Copyright (C) 1998 Bjorn Reese and Daniel Stenberg. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF + * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND + * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. + * + ************************************************************************* + * + * http://ctrio.sourceforge.net/ + * + ************************************************************************/ + +#ifndef TRIO_TRIO_H +#define TRIO_TRIO_H + +#if !defined(WITHOUT_TRIO) + +/* + * Use autoconf defines if present. Packages using trio must define + * HAVE_CONFIG_H as a compiler option themselves. + */ +#if defined(TRIO_HAVE_CONFIG_H) +# include "config.h" +#endif + +#include "triodef.h" + +#include +#include +#if defined(TRIO_COMPILER_ANCIENT) +# include +#else +# include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Error codes. + * + * Remember to add a textual description to trio_strerror. + */ +enum { + TRIO_EOF = 1, + TRIO_EINVAL = 2, + TRIO_ETOOMANY = 3, + TRIO_EDBLREF = 4, + TRIO_EGAP = 5, + TRIO_ENOMEM = 6, + TRIO_ERANGE = 7, + TRIO_ERRNO = 8, + TRIO_ECUSTOM = 9 +}; + +/* Error macros */ +#define TRIO_ERROR_CODE(x) ((-(x)) & 0x00FF) +#define TRIO_ERROR_POSITION(x) ((-(x)) >> 8) +#define TRIO_ERROR_NAME(x) trio_strerror(x) + +typedef int (*trio_outstream_t) TRIO_PROTO((trio_pointer_t, int)); +typedef int (*trio_instream_t) TRIO_PROTO((trio_pointer_t)); + +TRIO_CONST char *trio_strerror TRIO_PROTO((int)); + +/************************************************************************* + * Print Functions + */ + +int trio_printf TRIO_PROTO((TRIO_CONST char *format, ...)); +int trio_vprintf TRIO_PROTO((TRIO_CONST char *format, va_list args)); +int trio_printfv TRIO_PROTO((TRIO_CONST char *format, void **args)); + +int trio_fprintf TRIO_PROTO((FILE *file, TRIO_CONST char *format, ...)); +int trio_vfprintf TRIO_PROTO((FILE *file, TRIO_CONST char *format, va_list args)); +int trio_fprintfv TRIO_PROTO((FILE *file, TRIO_CONST char *format, void **args)); + +int trio_dprintf TRIO_PROTO((int fd, TRIO_CONST char *format, ...)); +int trio_vdprintf TRIO_PROTO((int fd, TRIO_CONST char *format, va_list args)); +int trio_dprintfv TRIO_PROTO((int fd, TRIO_CONST char *format, void **args)); + +int trio_cprintf TRIO_PROTO((trio_outstream_t stream, trio_pointer_t closure, + TRIO_CONST char *format, ...)); +int trio_vcprintf TRIO_PROTO((trio_outstream_t stream, trio_pointer_t closure, + TRIO_CONST char *format, va_list args)); +int trio_cprintfv TRIO_PROTO((trio_outstream_t stream, trio_pointer_t closure, + TRIO_CONST char *format, void **args)); + +int trio_sprintf TRIO_PROTO((char *buffer, TRIO_CONST char *format, ...)); +int trio_vsprintf TRIO_PROTO((char *buffer, TRIO_CONST char *format, va_list args)); +int trio_sprintfv TRIO_PROTO((char *buffer, TRIO_CONST char *format, void **args)); + +int trio_snprintf TRIO_PROTO((char *buffer, size_t max, TRIO_CONST char *format, ...)); +int trio_vsnprintf TRIO_PROTO((char *buffer, size_t bufferSize, TRIO_CONST char *format, + va_list args)); +int trio_snprintfv TRIO_PROTO((char *buffer, size_t bufferSize, TRIO_CONST char *format, + void **args)); + +int trio_snprintfcat TRIO_PROTO((char *buffer, size_t max, TRIO_CONST char *format, ...)); +int trio_vsnprintfcat TRIO_PROTO((char *buffer, size_t bufferSize, TRIO_CONST char *format, + va_list args)); + +char *trio_aprintf TRIO_PROTO((TRIO_CONST char *format, ...)); +char *trio_vaprintf TRIO_PROTO((TRIO_CONST char *format, va_list args)); + +int trio_asprintf TRIO_PROTO((char **ret, TRIO_CONST char *format, ...)); +int trio_vasprintf TRIO_PROTO((char **ret, TRIO_CONST char *format, va_list args)); + +/************************************************************************* + * Scan Functions + */ +int trio_scanf TRIO_PROTO((TRIO_CONST char *format, ...)); +int trio_vscanf TRIO_PROTO((TRIO_CONST char *format, va_list args)); +int trio_scanfv TRIO_PROTO((TRIO_CONST char *format, void **args)); + +int trio_fscanf TRIO_PROTO((FILE *file, TRIO_CONST char *format, ...)); +int trio_vfscanf TRIO_PROTO((FILE *file, TRIO_CONST char *format, va_list args)); +int trio_fscanfv TRIO_PROTO((FILE *file, TRIO_CONST char *format, void **args)); + +int trio_dscanf TRIO_PROTO((int fd, TRIO_CONST char *format, ...)); +int trio_vdscanf TRIO_PROTO((int fd, TRIO_CONST char *format, va_list args)); +int trio_dscanfv TRIO_PROTO((int fd, TRIO_CONST char *format, void **args)); + +int trio_cscanf TRIO_PROTO((trio_instream_t stream, trio_pointer_t closure, + TRIO_CONST char *format, ...)); +int trio_vcscanf TRIO_PROTO((trio_instream_t stream, trio_pointer_t closure, + TRIO_CONST char *format, va_list args)); +int trio_cscanfv TRIO_PROTO((trio_instream_t stream, trio_pointer_t closure, + TRIO_CONST char *format, void **args)); + +int trio_sscanf TRIO_PROTO((TRIO_CONST char *buffer, TRIO_CONST char *format, ...)); +int trio_vsscanf TRIO_PROTO((TRIO_CONST char *buffer, TRIO_CONST char *format, va_list args)); +int trio_sscanfv TRIO_PROTO((TRIO_CONST char *buffer, TRIO_CONST char *format, void **args)); + +/************************************************************************* + * Locale Functions + */ +void trio_locale_set_decimal_point TRIO_PROTO((char *decimalPoint)); +void trio_locale_set_thousand_separator TRIO_PROTO((char *thousandSeparator)); +void trio_locale_set_grouping TRIO_PROTO((char *grouping)); + +/************************************************************************* + * Renaming + */ +#ifdef TRIO_REPLACE_STDIO +/* Replace the functions */ +#ifndef HAVE_PRINTF +# define printf trio_printf +#endif +#ifndef HAVE_VPRINTF +# define vprintf trio_vprintf +#endif +#ifndef HAVE_FPRINTF +# define fprintf trio_fprintf +#endif +#ifndef HAVE_VFPRINTF +# define vfprintf trio_vfprintf +#endif +#ifndef HAVE_SPRINTF +# define sprintf trio_sprintf +#endif +#ifndef HAVE_VSPRINTF +# define vsprintf trio_vsprintf +#endif +#ifndef HAVE_SNPRINTF +# define snprintf trio_snprintf +#endif +#ifndef HAVE_VSNPRINTF +# define vsnprintf trio_vsnprintf +#endif +#ifndef HAVE_SCANF +# define scanf trio_scanf +#endif +#ifndef HAVE_VSCANF +# define vscanf trio_vscanf +#endif +#ifndef HAVE_FSCANF +# define fscanf trio_fscanf +#endif +#ifndef HAVE_VFSCANF +# define vfscanf trio_vfscanf +#endif +#ifndef HAVE_SSCANF +# define sscanf trio_sscanf +#endif +#ifndef HAVE_VSSCANF +# define vsscanf trio_vsscanf +#endif +/* These aren't stdio functions, but we make them look similar */ +#define dprintf trio_dprintf +#define vdprintf trio_vdprintf +#define aprintf trio_aprintf +#define vaprintf trio_vaprintf +#define asprintf trio_asprintf +#define vasprintf trio_vasprintf +#define dscanf trio_dscanf +#define vdscanf trio_vdscanf +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* WITHOUT_TRIO */ + +#endif /* TRIO_TRIO_H */ diff --git a/vendors/libxml/src/triodef.h b/vendors/libxml/src/triodef.h new file mode 100644 index 0000000..fa89416 --- /dev/null +++ b/vendors/libxml/src/triodef.h @@ -0,0 +1,222 @@ +/************************************************************************* + * + * $Id$ + * + * Copyright (C) 2001 Bjorn Reese + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF + * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND + * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. + * + ************************************************************************/ + +#ifndef TRIO_TRIODEF_H +#define TRIO_TRIODEF_H + +/************************************************************************* + * Platform and compiler support detection + */ +#if defined(__GNUC__) +# define TRIO_COMPILER_GCC +#elif defined(__SUNPRO_C) +# define TRIO_COMPILER_SUNPRO +#elif defined(__SUNPRO_CC) +# define TRIO_COMPILER_SUNPRO +# define __SUNPRO_C __SUNPRO_CC +#elif defined(__xlC__) || defined(__IBMC__) || defined(__IBMCPP__) +# define TRIO_COMPILER_XLC +#elif defined(_AIX) && !defined(__GNUC__) +# define TRIO_COMPILER_XLC /* Workaround for old xlc */ +#elif defined(__DECC) || defined(__DECCXX) +# define TRIO_COMPILER_DECC +#elif defined(__osf__) && defined(__LANGUAGE_C__) +# define TRIO_COMPILER_DECC /* Workaround for old DEC C compilers */ +#elif defined(_MSC_VER) +# define TRIO_COMPILER_MSVC +#elif defined(__BORLANDC__) +# define TRIO_COMPILER_BCB +#endif + +#if defined(VMS) || defined(__VMS) +/* + * VMS is placed first to avoid identifying the platform as Unix + * based on the DECC compiler later on. + */ +# define TRIO_PLATFORM_VMS +#elif defined(unix) || defined(__unix) || defined(__unix__) +# define TRIO_PLATFORM_UNIX +#elif defined(TRIO_COMPILER_XLC) || defined(_AIX) +# define TRIO_PLATFORM_UNIX +#elif defined(TRIO_COMPILER_DECC) || defined(__osf___) +# define TRIO_PLATFORM_UNIX +#elif defined(__NetBSD__) +# define TRIO_PLATFORM_UNIX +#elif defined(__Lynx__) +# define TRIO_PLATFORM_UNIX +#elif defined(__QNX__) +# define TRIO_PLATFORM_UNIX +# define TRIO_PLATFORM_QNX +#elif defined(__CYGWIN__) +# define TRIO_PLATFORM_UNIX +#elif defined(AMIGA) && defined(TRIO_COMPILER_GCC) +# define TRIO_PLATFORM_UNIX +#elif defined(TRIO_COMPILER_MSVC) || defined(WIN32) || defined(_WIN32) +# define TRIO_PLATFORM_WIN32 +#elif defined(mpeix) || defined(__mpexl) +# define TRIO_PLATFORM_MPEIX +#endif + +#if defined(_AIX) +# define TRIO_PLATFORM_AIX +#elif defined(__hpux) +# define TRIO_PLATFORM_HPUX +#elif defined(sun) || defined(__sun__) +# if defined(__SVR4) || defined(__svr4__) +# define TRIO_PLATFORM_SOLARIS +# else +# define TRIO_PLATFORM_SUNOS +# endif +#endif + +#if defined(__STDC__) || defined(TRIO_COMPILER_MSVC) || defined(TRIO_COMPILER_BCB) +# define TRIO_COMPILER_SUPPORTS_C89 +# if defined(__STDC_VERSION__) +# define TRIO_COMPILER_SUPPORTS_C90 +# if (__STDC_VERSION__ >= 199409L) +# define TRIO_COMPILER_SUPPORTS_C94 +# endif +# if (__STDC_VERSION__ >= 199901L) +# define TRIO_COMPILER_SUPPORTS_C99 +# endif +# elif defined(TRIO_COMPILER_SUNPRO) +# if (__SUNPRO_C >= 0x420) +# define TRIO_COMPILER_SUPPORTS_C94 +# endif +# endif +#endif + +#if defined(_XOPEN_SOURCE) +# if defined(_XOPEN_SOURCE_EXTENDED) +# define TRIO_COMPILER_SUPPORTS_UNIX95 +# endif +# if (_XOPEN_VERSION >= 500) +# define TRIO_COMPILER_SUPPORTS_UNIX98 +# endif +# if (_XOPEN_VERSION >= 600) +# define TRIO_COMPILER_SUPPORTS_UNIX01 +# endif +#endif + +/************************************************************************* + * Generic defines + */ + +#if !defined(TRIO_PUBLIC) +# define TRIO_PUBLIC +#endif +#if !defined(TRIO_PRIVATE) +# define TRIO_PRIVATE static +#endif + +#if !(defined(TRIO_COMPILER_SUPPORTS_C89) || defined(__cplusplus)) +# define TRIO_COMPILER_ANCIENT +#endif + +#if defined(TRIO_COMPILER_ANCIENT) +# define TRIO_CONST +# define TRIO_VOLATILE +# define TRIO_SIGNED +typedef double trio_long_double_t; +typedef char * trio_pointer_t; +# define TRIO_SUFFIX_LONG(x) x +# define TRIO_PROTO(x) () +# define TRIO_NOARGS +# define TRIO_ARGS1(list,a1) list a1; +# define TRIO_ARGS2(list,a1,a2) list a1; a2; +# define TRIO_ARGS3(list,a1,a2,a3) list a1; a2; a3; +# define TRIO_ARGS4(list,a1,a2,a3,a4) list a1; a2; a3; a4; +# define TRIO_ARGS5(list,a1,a2,a3,a4,a5) list a1; a2; a3; a4; a5; +# define TRIO_ARGS6(list,a1,a2,a3,a4,a5,a6) list a1; a2; a3; a4; a5; a6; +# define TRIO_VARGS2(list,a1,a2) list a1; a2 +# define TRIO_VARGS3(list,a1,a2,a3) list a1; a2; a3 +# define TRIO_VARGS4(list,a1,a2,a3,a4) list a1; a2; a3; a4 +# define TRIO_VARGS5(list,a1,a2,a3,a4,a5) list a1; a2; a3; a4; a5 +# define TRIO_VA_DECL va_dcl +# define TRIO_VA_START(x,y) va_start(x) +# define TRIO_VA_END(x) va_end(x) +#else /* ANSI C */ +# define TRIO_CONST const +# define TRIO_VOLATILE volatile +# define TRIO_SIGNED signed +typedef long double trio_long_double_t; +typedef void * trio_pointer_t; +# define TRIO_SUFFIX_LONG(x) x ## L +# define TRIO_PROTO(x) x +# define TRIO_NOARGS void +# define TRIO_ARGS1(list,a1) (a1) +# define TRIO_ARGS2(list,a1,a2) (a1,a2) +# define TRIO_ARGS3(list,a1,a2,a3) (a1,a2,a3) +# define TRIO_ARGS4(list,a1,a2,a3,a4) (a1,a2,a3,a4) +# define TRIO_ARGS5(list,a1,a2,a3,a4,a5) (a1,a2,a3,a4,a5) +# define TRIO_ARGS6(list,a1,a2,a3,a4,a5,a6) (a1,a2,a3,a4,a5,a6) +# define TRIO_VARGS2 TRIO_ARGS2 +# define TRIO_VARGS3 TRIO_ARGS3 +# define TRIO_VARGS4 TRIO_ARGS4 +# define TRIO_VARGS5 TRIO_ARGS5 +# define TRIO_VA_DECL ... +# define TRIO_VA_START(x,y) va_start(x,y) +# define TRIO_VA_END(x) va_end(x) +#endif + +#if defined(TRIO_COMPILER_SUPPORTS_C99) || defined(__cplusplus) +# define TRIO_INLINE inline +#elif defined(TRIO_COMPILER_GCC) +# define TRIO_INLINE __inline__ +#elif defined(TRIO_COMPILER_MSVC) +# define TRIO_INLINE _inline +#elif defined(TRIO_COMPILER_BCB) +# define TRIO_INLINE __inline +#else +# define TRIO_INLINE +#endif + +/************************************************************************* + * Workarounds + */ + +#if defined(TRIO_PLATFORM_VMS) +/* + * Computations done with constants at compile time can trigger these + * even when compiling with IEEE enabled. + */ +# pragma message disable (UNDERFLOW, FLOATOVERFL) + +# if (__CRTL_VER < 80000000) +/* + * Although the compiler supports C99 language constructs, the C + * run-time library does not contain all C99 functions. + * + * This was the case for 70300022. Update the 80000000 value when + * it has been accurately determined what version of the library + * supports C99. + */ +# if defined(TRIO_COMPILER_SUPPORTS_C99) +# undef TRIO_COMPILER_SUPPORTS_C99 +# endif +# endif +#endif + +/* + * Not all preprocessors supports the LL token. + */ +#if defined(TRIO_COMPILER_BCB) +#else +# define TRIO_COMPILER_SUPPORTS_LL +#endif + +#endif /* TRIO_TRIODEF_H */ diff --git a/vendors/libxml/src/trionan.c b/vendors/libxml/src/trionan.c new file mode 100644 index 0000000..95baae1 --- /dev/null +++ b/vendors/libxml/src/trionan.c @@ -0,0 +1,914 @@ +/************************************************************************* + * + * $Id$ + * + * Copyright (C) 2001 Bjorn Reese + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF + * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND + * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. + * + ************************************************************************ + * + * Functions to handle special quantities in floating-point numbers + * (that is, NaNs and infinity). They provide the capability to detect + * and fabricate special quantities. + * + * Although written to be as portable as possible, it can never be + * guaranteed to work on all platforms, as not all hardware supports + * special quantities. + * + * The approach used here (approximately) is to: + * + * 1. Use C99 functionality when available. + * 2. Use IEEE 754 bit-patterns if possible. + * 3. Use platform-specific techniques. + * + ************************************************************************/ + +/* + * TODO: + * o Put all the magic into trio_fpclassify_and_signbit(), and use this from + * trio_isnan() etc. + */ + +/************************************************************************* + * Include files + */ +#include "triodef.h" +#include "trionan.h" + +#include +#include +#include +#include +#if defined(TRIO_PLATFORM_UNIX) +# include +#endif +#if defined(TRIO_COMPILER_DECC) +# if defined(__linux__) +# include +# else +# include +# endif +#endif +#include + +#if defined(TRIO_DOCUMENTATION) +# include "doc/doc_nan.h" +#endif +/** @addtogroup SpecialQuantities + @{ +*/ + +/************************************************************************* + * Definitions + */ + +#define TRIO_TRUE (1 == 1) +#define TRIO_FALSE (0 == 1) + +/* + * We must enable IEEE floating-point on Alpha + */ +#if defined(__alpha) && !defined(_IEEE_FP) +# if defined(TRIO_COMPILER_DECC) +# if defined(TRIO_PLATFORM_VMS) +# error "Must be compiled with option /IEEE_MODE=UNDERFLOW_TO_ZERO/FLOAT=IEEE" +# else +# if !defined(_CFE) +# error "Must be compiled with option -ieee" +# endif +# endif +# elif defined(TRIO_COMPILER_GCC) && (defined(__osf__) || defined(__linux__)) +# error "Must be compiled with option -mieee" +# endif +#endif /* __alpha && ! _IEEE_FP */ + +/* + * In ANSI/IEEE 754-1985 64-bits double format numbers have the + * following properties (amoungst others) + * + * o FLT_RADIX == 2: binary encoding + * o DBL_MAX_EXP == 1024: 11 bits exponent, where one bit is used + * to indicate special numbers (e.g. NaN and Infinity), so the + * maximum exponent is 10 bits wide (2^10 == 1024). + * o DBL_MANT_DIG == 53: The mantissa is 52 bits wide, but because + * numbers are normalized the initial binary 1 is represented + * implicitly (the so-called "hidden bit"), which leaves us with + * the ability to represent 53 bits wide mantissa. + */ +#if (FLT_RADIX == 2) && (DBL_MAX_EXP == 1024) && (DBL_MANT_DIG == 53) +# define USE_IEEE_754 +#endif + + +/************************************************************************* + * Constants + */ + +static TRIO_CONST char rcsid[] = "@(#)$Id$"; + +#if defined(USE_IEEE_754) + +/* + * Endian-agnostic indexing macro. + * + * The value of internalEndianMagic, when converted into a 64-bit + * integer, becomes 0x0706050403020100 (we could have used a 64-bit + * integer value instead of a double, but not all platforms supports + * that type). The value is automatically encoded with the correct + * endianess by the compiler, which means that we can support any + * kind of endianess. The individual bytes are then used as an index + * for the IEEE 754 bit-patterns and masks. + */ +#define TRIO_DOUBLE_INDEX(x) (((unsigned char *)&internalEndianMagic)[7-(x)]) + +#if (defined(__BORLANDC__) && __BORLANDC__ >= 0x0590) +static TRIO_CONST double internalEndianMagic = 7.949928895127362e-275; +#else +static TRIO_CONST double internalEndianMagic = 7.949928895127363e-275; +#endif + +/* Mask for the exponent */ +static TRIO_CONST unsigned char ieee_754_exponent_mask[] = { + 0x7F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +/* Mask for the mantissa */ +static TRIO_CONST unsigned char ieee_754_mantissa_mask[] = { + 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF +}; + +/* Mask for the sign bit */ +static TRIO_CONST unsigned char ieee_754_sign_mask[] = { + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +/* Bit-pattern for negative zero */ +static TRIO_CONST unsigned char ieee_754_negzero_array[] = { + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +/* Bit-pattern for infinity */ +static TRIO_CONST unsigned char ieee_754_infinity_array[] = { + 0x7F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +/* Bit-pattern for quiet NaN */ +static TRIO_CONST unsigned char ieee_754_qnan_array[] = { + 0x7F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + + +/************************************************************************* + * Functions + */ + +/* + * trio_make_double + */ +TRIO_PRIVATE double +trio_make_double +TRIO_ARGS1((values), + TRIO_CONST unsigned char *values) +{ + TRIO_VOLATILE double result; + int i; + + for (i = 0; i < (int)sizeof(double); i++) { + ((TRIO_VOLATILE unsigned char *)&result)[TRIO_DOUBLE_INDEX(i)] = values[i]; + } + return result; +} + +/* + * trio_is_special_quantity + */ +TRIO_PRIVATE int +trio_is_special_quantity +TRIO_ARGS2((number, has_mantissa), + double number, + int *has_mantissa) +{ + unsigned int i; + unsigned char current; + int is_special_quantity = TRIO_TRUE; + + *has_mantissa = 0; + + for (i = 0; i < (unsigned int)sizeof(double); i++) { + current = ((unsigned char *)&number)[TRIO_DOUBLE_INDEX(i)]; + is_special_quantity + &= ((current & ieee_754_exponent_mask[i]) == ieee_754_exponent_mask[i]); + *has_mantissa |= (current & ieee_754_mantissa_mask[i]); + } + return is_special_quantity; +} + +/* + * trio_is_negative + */ +TRIO_PRIVATE int +trio_is_negative +TRIO_ARGS1((number), + double number) +{ + unsigned int i; + int is_negative = TRIO_FALSE; + + for (i = 0; i < (unsigned int)sizeof(double); i++) { + is_negative |= (((unsigned char *)&number)[TRIO_DOUBLE_INDEX(i)] + & ieee_754_sign_mask[i]); + } + return is_negative; +} + +#endif /* USE_IEEE_754 */ + + +/** + Generate negative zero. + + @return Floating-point representation of negative zero. +*/ +TRIO_PUBLIC double +trio_nzero(TRIO_NOARGS) +{ +#if defined(USE_IEEE_754) + return trio_make_double(ieee_754_negzero_array); +#else + TRIO_VOLATILE double zero = 0.0; + + return -zero; +#endif +} + +/** + Generate positive infinity. + + @return Floating-point representation of positive infinity. +*/ +TRIO_PUBLIC double +trio_pinf(TRIO_NOARGS) +{ + /* Cache the result */ + static double result = 0.0; + + if (result == 0.0) { + +#if defined(INFINITY) && defined(__STDC_IEC_559__) + result = (double)INFINITY; + +#elif defined(USE_IEEE_754) + result = trio_make_double(ieee_754_infinity_array); + +#else + /* + * If HUGE_VAL is different from DBL_MAX, then HUGE_VAL is used + * as infinity. Otherwise we have to resort to an overflow + * operation to generate infinity. + */ +# if defined(TRIO_PLATFORM_UNIX) + void (*signal_handler)(int) = signal(SIGFPE, SIG_IGN); +# endif + + result = HUGE_VAL; + if (HUGE_VAL == DBL_MAX) { + /* Force overflow */ + result += HUGE_VAL; + } + +# if defined(TRIO_PLATFORM_UNIX) + signal(SIGFPE, signal_handler); +# endif + +#endif + } + return result; +} + +/** + Generate negative infinity. + + @return Floating-point value of negative infinity. +*/ +TRIO_PUBLIC double +trio_ninf(TRIO_NOARGS) +{ + static double result = 0.0; + + if (result == 0.0) { + /* + * Negative infinity is calculated by negating positive infinity, + * which can be done because it is legal to do calculations on + * infinity (for example, 1 / infinity == 0). + */ + result = -trio_pinf(); + } + return result; +} + +/** + Generate NaN. + + @return Floating-point representation of NaN. +*/ +TRIO_PUBLIC double +trio_nan(TRIO_NOARGS) +{ + /* Cache the result */ + static double result = 0.0; + + if (result == 0.0) { + +#if defined(TRIO_COMPILER_SUPPORTS_C99) + result = nan(""); + +#elif defined(NAN) && defined(__STDC_IEC_559__) + result = (double)NAN; + +#elif defined(USE_IEEE_754) + result = trio_make_double(ieee_754_qnan_array); + +#else + /* + * There are several ways to generate NaN. The one used here is + * to divide infinity by infinity. I would have preferred to add + * negative infinity to positive infinity, but that yields wrong + * result (infinity) on FreeBSD. + * + * This may fail if the hardware does not support NaN, or if + * the Invalid Operation floating-point exception is unmasked. + */ +# if defined(TRIO_PLATFORM_UNIX) + void (*signal_handler)(int) = signal(SIGFPE, SIG_IGN); +# endif + + result = trio_pinf() / trio_pinf(); + +# if defined(TRIO_PLATFORM_UNIX) + signal(SIGFPE, signal_handler); +# endif + +#endif + } + return result; +} + +/** + Check for NaN. + + @param number An arbitrary floating-point number. + @return Boolean value indicating whether or not the number is a NaN. +*/ +TRIO_PUBLIC int +trio_isnan +TRIO_ARGS1((number), + double number) +{ +#if (defined(TRIO_COMPILER_SUPPORTS_C99) && defined(isnan)) \ + || defined(TRIO_COMPILER_SUPPORTS_UNIX95) + /* + * C99 defines isnan() as a macro. UNIX95 defines isnan() as a + * function. This function was already present in XPG4, but this + * is a bit tricky to detect with compiler defines, so we choose + * the conservative approach and only use it for UNIX95. + */ + return isnan(number); + +#elif defined(TRIO_COMPILER_MSVC) || defined(TRIO_COMPILER_BCB) + /* + * Microsoft Visual C++ and Borland C++ Builder have an _isnan() + * function. + */ + return _isnan(number) ? TRIO_TRUE : TRIO_FALSE; + +#elif defined(USE_IEEE_754) + /* + * Examine IEEE 754 bit-pattern. A NaN must have a special exponent + * pattern, and a non-empty mantissa. + */ + int has_mantissa; + int is_special_quantity; + + is_special_quantity = trio_is_special_quantity(number, &has_mantissa); + + return (is_special_quantity && has_mantissa); + +#else + /* + * Fallback solution + */ + int status; + double integral, fraction; + +# if defined(TRIO_PLATFORM_UNIX) + void (*signal_handler)(int) = signal(SIGFPE, SIG_IGN); +# endif + + status = (/* + * NaN is the only number which does not compare to itself + */ + ((TRIO_VOLATILE double)number != (TRIO_VOLATILE double)number) || + /* + * Fallback solution if NaN compares to NaN + */ + ((number != 0.0) && + (fraction = modf(number, &integral), + integral == fraction))); + +# if defined(TRIO_PLATFORM_UNIX) + signal(SIGFPE, signal_handler); +# endif + + return status; + +#endif +} + +/** + Check for infinity. + + @param number An arbitrary floating-point number. + @return 1 if positive infinity, -1 if negative infinity, 0 otherwise. +*/ +TRIO_PUBLIC int +trio_isinf +TRIO_ARGS1((number), + double number) +{ +#if defined(TRIO_COMPILER_DECC) && !defined(__linux__) + /* + * DECC has an isinf() macro, but it works differently than that + * of C99, so we use the fp_class() function instead. + */ + return ((fp_class(number) == FP_POS_INF) + ? 1 + : ((fp_class(number) == FP_NEG_INF) ? -1 : 0)); + +#elif defined(isinf) + /* + * C99 defines isinf() as a macro. + */ + return isinf(number) + ? ((number > 0.0) ? 1 : -1) + : 0; + +#elif defined(TRIO_COMPILER_MSVC) || defined(TRIO_COMPILER_BCB) + /* + * Microsoft Visual C++ and Borland C++ Builder have an _fpclass() + * function that can be used to detect infinity. + */ + return ((_fpclass(number) == _FPCLASS_PINF) + ? 1 + : ((_fpclass(number) == _FPCLASS_NINF) ? -1 : 0)); + +#elif defined(USE_IEEE_754) + /* + * Examine IEEE 754 bit-pattern. Infinity must have a special exponent + * pattern, and an empty mantissa. + */ + int has_mantissa; + int is_special_quantity; + + is_special_quantity = trio_is_special_quantity(number, &has_mantissa); + + return (is_special_quantity && !has_mantissa) + ? ((number < 0.0) ? -1 : 1) + : 0; + +#else + /* + * Fallback solution. + */ + int status; + +# if defined(TRIO_PLATFORM_UNIX) + void (*signal_handler)(int) = signal(SIGFPE, SIG_IGN); +# endif + + double infinity = trio_pinf(); + + status = ((number == infinity) + ? 1 + : ((number == -infinity) ? -1 : 0)); + +# if defined(TRIO_PLATFORM_UNIX) + signal(SIGFPE, signal_handler); +# endif + + return status; + +#endif +} + +#if 0 + /* Temporary fix - this routine is not used anywhere */ +/** + Check for finity. + + @param number An arbitrary floating-point number. + @return Boolean value indicating whether or not the number is a finite. +*/ +TRIO_PUBLIC int +trio_isfinite +TRIO_ARGS1((number), + double number) +{ +#if defined(TRIO_COMPILER_SUPPORTS_C99) && defined(isfinite) + /* + * C99 defines isfinite() as a macro. + */ + return isfinite(number); + +#elif defined(TRIO_COMPILER_MSVC) || defined(TRIO_COMPILER_BCB) + /* + * Microsoft Visual C++ and Borland C++ Builder use _finite(). + */ + return _finite(number); + +#elif defined(USE_IEEE_754) + /* + * Examine IEEE 754 bit-pattern. For finity we do not care about the + * mantissa. + */ + int dummy; + + return (! trio_is_special_quantity(number, &dummy)); + +#else + /* + * Fallback solution. + */ + return ((trio_isinf(number) == 0) && (trio_isnan(number) == 0)); + +#endif +} + +#endif + +/* + * The sign of NaN is always false + */ +TRIO_PUBLIC int +trio_fpclassify_and_signbit +TRIO_ARGS2((number, is_negative), + double number, + int *is_negative) +{ +#if defined(fpclassify) && defined(signbit) + /* + * C99 defines fpclassify() and signbit() as a macros + */ + *is_negative = signbit(number); + switch (fpclassify(number)) { + case FP_NAN: + return TRIO_FP_NAN; + case FP_INFINITE: + return TRIO_FP_INFINITE; + case FP_SUBNORMAL: + return TRIO_FP_SUBNORMAL; + case FP_ZERO: + return TRIO_FP_ZERO; + default: + return TRIO_FP_NORMAL; + } + +#else +# if defined(TRIO_COMPILER_DECC) + /* + * DECC has an fp_class() function. + */ +# define TRIO_FPCLASSIFY(n) fp_class(n) +# define TRIO_QUIET_NAN FP_QNAN +# define TRIO_SIGNALLING_NAN FP_SNAN +# define TRIO_POSITIVE_INFINITY FP_POS_INF +# define TRIO_NEGATIVE_INFINITY FP_NEG_INF +# define TRIO_POSITIVE_SUBNORMAL FP_POS_DENORM +# define TRIO_NEGATIVE_SUBNORMAL FP_NEG_DENORM +# define TRIO_POSITIVE_ZERO FP_POS_ZERO +# define TRIO_NEGATIVE_ZERO FP_NEG_ZERO +# define TRIO_POSITIVE_NORMAL FP_POS_NORM +# define TRIO_NEGATIVE_NORMAL FP_NEG_NORM + +# elif defined(TRIO_COMPILER_MSVC) || defined(TRIO_COMPILER_BCB) + /* + * Microsoft Visual C++ and Borland C++ Builder have an _fpclass() + * function. + */ +# define TRIO_FPCLASSIFY(n) _fpclass(n) +# define TRIO_QUIET_NAN _FPCLASS_QNAN +# define TRIO_SIGNALLING_NAN _FPCLASS_SNAN +# define TRIO_POSITIVE_INFINITY _FPCLASS_PINF +# define TRIO_NEGATIVE_INFINITY _FPCLASS_NINF +# define TRIO_POSITIVE_SUBNORMAL _FPCLASS_PD +# define TRIO_NEGATIVE_SUBNORMAL _FPCLASS_ND +# define TRIO_POSITIVE_ZERO _FPCLASS_PZ +# define TRIO_NEGATIVE_ZERO _FPCLASS_NZ +# define TRIO_POSITIVE_NORMAL _FPCLASS_PN +# define TRIO_NEGATIVE_NORMAL _FPCLASS_NN + +# elif defined(FP_PLUS_NORM) + /* + * HP-UX 9.x and 10.x have an fpclassify() function, that is different + * from the C99 fpclassify() macro supported on HP-UX 11.x. + * + * AIX has class() for C, and _class() for C++, which returns the + * same values as the HP-UX fpclassify() function. + */ +# if defined(TRIO_PLATFORM_AIX) +# if defined(__cplusplus) +# define TRIO_FPCLASSIFY(n) _class(n) +# else +# define TRIO_FPCLASSIFY(n) class(n) +# endif +# else +# define TRIO_FPCLASSIFY(n) fpclassify(n) +# endif +# define TRIO_QUIET_NAN FP_QNAN +# define TRIO_SIGNALLING_NAN FP_SNAN +# define TRIO_POSITIVE_INFINITY FP_PLUS_INF +# define TRIO_NEGATIVE_INFINITY FP_MINUS_INF +# define TRIO_POSITIVE_SUBNORMAL FP_PLUS_DENORM +# define TRIO_NEGATIVE_SUBNORMAL FP_MINUS_DENORM +# define TRIO_POSITIVE_ZERO FP_PLUS_ZERO +# define TRIO_NEGATIVE_ZERO FP_MINUS_ZERO +# define TRIO_POSITIVE_NORMAL FP_PLUS_NORM +# define TRIO_NEGATIVE_NORMAL FP_MINUS_NORM +# endif + +# if defined(TRIO_FPCLASSIFY) + switch (TRIO_FPCLASSIFY(number)) { + case TRIO_QUIET_NAN: + case TRIO_SIGNALLING_NAN: + *is_negative = TRIO_FALSE; /* NaN has no sign */ + return TRIO_FP_NAN; + case TRIO_POSITIVE_INFINITY: + *is_negative = TRIO_FALSE; + return TRIO_FP_INFINITE; + case TRIO_NEGATIVE_INFINITY: + *is_negative = TRIO_TRUE; + return TRIO_FP_INFINITE; + case TRIO_POSITIVE_SUBNORMAL: + *is_negative = TRIO_FALSE; + return TRIO_FP_SUBNORMAL; + case TRIO_NEGATIVE_SUBNORMAL: + *is_negative = TRIO_TRUE; + return TRIO_FP_SUBNORMAL; + case TRIO_POSITIVE_ZERO: + *is_negative = TRIO_FALSE; + return TRIO_FP_ZERO; + case TRIO_NEGATIVE_ZERO: + *is_negative = TRIO_TRUE; + return TRIO_FP_ZERO; + case TRIO_POSITIVE_NORMAL: + *is_negative = TRIO_FALSE; + return TRIO_FP_NORMAL; + case TRIO_NEGATIVE_NORMAL: + *is_negative = TRIO_TRUE; + return TRIO_FP_NORMAL; + default: + /* Just in case... */ + *is_negative = (number < 0.0); + return TRIO_FP_NORMAL; + } + +# else + /* + * Fallback solution. + */ + int rc; + + if (number == 0.0) { + /* + * In IEEE 754 the sign of zero is ignored in comparisons, so we + * have to handle this as a special case by examining the sign bit + * directly. + */ +# if defined(USE_IEEE_754) + *is_negative = trio_is_negative(number); +# else + *is_negative = TRIO_FALSE; /* FIXME */ +# endif + return TRIO_FP_ZERO; + } + if (trio_isnan(number)) { + *is_negative = TRIO_FALSE; + return TRIO_FP_NAN; + } + if ((rc = trio_isinf(number))) { + *is_negative = (rc == -1); + return TRIO_FP_INFINITE; + } + if ((number > 0.0) && (number < DBL_MIN)) { + *is_negative = TRIO_FALSE; + return TRIO_FP_SUBNORMAL; + } + if ((number < 0.0) && (number > -DBL_MIN)) { + *is_negative = TRIO_TRUE; + return TRIO_FP_SUBNORMAL; + } + *is_negative = (number < 0.0); + return TRIO_FP_NORMAL; + +# endif +#endif +} + +/** + Examine the sign of a number. + + @param number An arbitrary floating-point number. + @return Boolean value indicating whether or not the number has the + sign bit set (i.e. is negative). +*/ +TRIO_PUBLIC int +trio_signbit +TRIO_ARGS1((number), + double number) +{ + int is_negative; + + (void)trio_fpclassify_and_signbit(number, &is_negative); + return is_negative; +} + +#if 0 + /* Temporary fix - this routine is not used in libxml */ +/** + Examine the class of a number. + + @param number An arbitrary floating-point number. + @return Enumerable value indicating the class of @p number +*/ +TRIO_PUBLIC int +trio_fpclassify +TRIO_ARGS1((number), + double number) +{ + int dummy; + + return trio_fpclassify_and_signbit(number, &dummy); +} + +#endif + +/** @} SpecialQuantities */ + +/************************************************************************* + * For test purposes. + * + * Add the following compiler option to include this test code. + * + * Unix : -DSTANDALONE + * VMS : /DEFINE=(STANDALONE) + */ +#if defined(STANDALONE) +# include + +static TRIO_CONST char * +getClassification +TRIO_ARGS1((type), + int type) +{ + switch (type) { + case TRIO_FP_INFINITE: + return "FP_INFINITE"; + case TRIO_FP_NAN: + return "FP_NAN"; + case TRIO_FP_NORMAL: + return "FP_NORMAL"; + case TRIO_FP_SUBNORMAL: + return "FP_SUBNORMAL"; + case TRIO_FP_ZERO: + return "FP_ZERO"; + default: + return "FP_UNKNOWN"; + } +} + +static void +print_class +TRIO_ARGS2((prefix, number), + TRIO_CONST char *prefix, + double number) +{ + printf("%-6s: %s %-15s %g\n", + prefix, + trio_signbit(number) ? "-" : "+", + getClassification(TRIO_FPCLASSIFY(number)), + number); +} + +int main(TRIO_NOARGS) +{ + double my_nan; + double my_pinf; + double my_ninf; +# if defined(TRIO_PLATFORM_UNIX) + void (*signal_handler) TRIO_PROTO((int)); +# endif + + my_nan = trio_nan(); + my_pinf = trio_pinf(); + my_ninf = trio_ninf(); + + print_class("Nan", my_nan); + print_class("PInf", my_pinf); + print_class("NInf", my_ninf); + print_class("PZero", 0.0); + print_class("NZero", -0.0); + print_class("PNorm", 1.0); + print_class("NNorm", -1.0); + print_class("PSub", 1.01e-307 - 1.00e-307); + print_class("NSub", 1.00e-307 - 1.01e-307); + + printf("NaN : %4g 0x%02x%02x%02x%02x%02x%02x%02x%02x (%2d, %2d)\n", + my_nan, + ((unsigned char *)&my_nan)[0], + ((unsigned char *)&my_nan)[1], + ((unsigned char *)&my_nan)[2], + ((unsigned char *)&my_nan)[3], + ((unsigned char *)&my_nan)[4], + ((unsigned char *)&my_nan)[5], + ((unsigned char *)&my_nan)[6], + ((unsigned char *)&my_nan)[7], + trio_isnan(my_nan), trio_isinf(my_nan)); + printf("PInf: %4g 0x%02x%02x%02x%02x%02x%02x%02x%02x (%2d, %2d)\n", + my_pinf, + ((unsigned char *)&my_pinf)[0], + ((unsigned char *)&my_pinf)[1], + ((unsigned char *)&my_pinf)[2], + ((unsigned char *)&my_pinf)[3], + ((unsigned char *)&my_pinf)[4], + ((unsigned char *)&my_pinf)[5], + ((unsigned char *)&my_pinf)[6], + ((unsigned char *)&my_pinf)[7], + trio_isnan(my_pinf), trio_isinf(my_pinf)); + printf("NInf: %4g 0x%02x%02x%02x%02x%02x%02x%02x%02x (%2d, %2d)\n", + my_ninf, + ((unsigned char *)&my_ninf)[0], + ((unsigned char *)&my_ninf)[1], + ((unsigned char *)&my_ninf)[2], + ((unsigned char *)&my_ninf)[3], + ((unsigned char *)&my_ninf)[4], + ((unsigned char *)&my_ninf)[5], + ((unsigned char *)&my_ninf)[6], + ((unsigned char *)&my_ninf)[7], + trio_isnan(my_ninf), trio_isinf(my_ninf)); + +# if defined(TRIO_PLATFORM_UNIX) + signal_handler = signal(SIGFPE, SIG_IGN); +# endif + + my_pinf = DBL_MAX + DBL_MAX; + my_ninf = -my_pinf; + my_nan = my_pinf / my_pinf; + +# if defined(TRIO_PLATFORM_UNIX) + signal(SIGFPE, signal_handler); +# endif + + printf("NaN : %4g 0x%02x%02x%02x%02x%02x%02x%02x%02x (%2d, %2d)\n", + my_nan, + ((unsigned char *)&my_nan)[0], + ((unsigned char *)&my_nan)[1], + ((unsigned char *)&my_nan)[2], + ((unsigned char *)&my_nan)[3], + ((unsigned char *)&my_nan)[4], + ((unsigned char *)&my_nan)[5], + ((unsigned char *)&my_nan)[6], + ((unsigned char *)&my_nan)[7], + trio_isnan(my_nan), trio_isinf(my_nan)); + printf("PInf: %4g 0x%02x%02x%02x%02x%02x%02x%02x%02x (%2d, %2d)\n", + my_pinf, + ((unsigned char *)&my_pinf)[0], + ((unsigned char *)&my_pinf)[1], + ((unsigned char *)&my_pinf)[2], + ((unsigned char *)&my_pinf)[3], + ((unsigned char *)&my_pinf)[4], + ((unsigned char *)&my_pinf)[5], + ((unsigned char *)&my_pinf)[6], + ((unsigned char *)&my_pinf)[7], + trio_isnan(my_pinf), trio_isinf(my_pinf)); + printf("NInf: %4g 0x%02x%02x%02x%02x%02x%02x%02x%02x (%2d, %2d)\n", + my_ninf, + ((unsigned char *)&my_ninf)[0], + ((unsigned char *)&my_ninf)[1], + ((unsigned char *)&my_ninf)[2], + ((unsigned char *)&my_ninf)[3], + ((unsigned char *)&my_ninf)[4], + ((unsigned char *)&my_ninf)[5], + ((unsigned char *)&my_ninf)[6], + ((unsigned char *)&my_ninf)[7], + trio_isnan(my_ninf), trio_isinf(my_ninf)); + + return 0; +} +#endif diff --git a/vendors/libxml/src/trionan.h b/vendors/libxml/src/trionan.h new file mode 100644 index 0000000..be6e718 --- /dev/null +++ b/vendors/libxml/src/trionan.h @@ -0,0 +1,84 @@ +/************************************************************************* + * + * $Id$ + * + * Copyright (C) 2001 Bjorn Reese + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF + * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND + * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. + * + ************************************************************************/ + +#ifndef TRIO_NAN_H +#define TRIO_NAN_H + +#include "triodef.h" + +#ifdef __cplusplus +extern "C" { +#endif + +enum { + TRIO_FP_INFINITE, + TRIO_FP_NAN, + TRIO_FP_NORMAL, + TRIO_FP_SUBNORMAL, + TRIO_FP_ZERO +}; + +/* + * Return NaN (Not-a-Number). + */ +TRIO_PUBLIC double trio_nan TRIO_PROTO((void)); + +/* + * Return positive infinity. + */ +TRIO_PUBLIC double trio_pinf TRIO_PROTO((void)); + +/* + * Return negative infinity. + */ +TRIO_PUBLIC double trio_ninf TRIO_PROTO((void)); + +/* + * Return negative zero. + */ +TRIO_PUBLIC double trio_nzero TRIO_PROTO((TRIO_NOARGS)); + +/* + * If number is a NaN return non-zero, otherwise return zero. + */ +TRIO_PUBLIC int trio_isnan TRIO_PROTO((double number)); + +/* + * If number is positive infinity return 1, if number is negative + * infinity return -1, otherwise return 0. + */ +TRIO_PUBLIC int trio_isinf TRIO_PROTO((double number)); + +/* + * If number is finite return non-zero, otherwise return zero. + */ +#if 0 + /* Temporary fix - these 2 routines not used in libxml */ +TRIO_PUBLIC int trio_isfinite TRIO_PROTO((double number)); + +TRIO_PUBLIC int trio_fpclassify TRIO_PROTO((double number)); +#endif + +TRIO_PUBLIC int trio_signbit TRIO_PROTO((double number)); + +TRIO_PUBLIC int trio_fpclassify_and_signbit TRIO_PROTO((double number, int *is_negative)); + +#ifdef __cplusplus +} +#endif + +#endif /* TRIO_NAN_H */ diff --git a/vendors/libxml/src/triop.h b/vendors/libxml/src/triop.h new file mode 100644 index 0000000..8462c56 --- /dev/null +++ b/vendors/libxml/src/triop.h @@ -0,0 +1,150 @@ +/************************************************************************* + * + * $Id$ + * + * Copyright (C) 2000 Bjorn Reese and Daniel Stenberg. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF + * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND + * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. + * + ************************************************************************ + * + * Private functions, types, etc. used for callback functions. + * + * The ref pointer is an opaque type and should remain as such. + * Private data must only be accessible through the getter and + * setter functions. + * + ************************************************************************/ + +#ifndef TRIO_TRIOP_H +#define TRIO_TRIOP_H + +#include "triodef.h" + +#include +#if defined(TRIO_COMPILER_ANCIENT) +# include +#else +# include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef TRIO_C99 +# define TRIO_C99 1 +#endif +#ifndef TRIO_BSD +# define TRIO_BSD 1 +#endif +#ifndef TRIO_GNU +# define TRIO_GNU 1 +#endif +#ifndef TRIO_MISC +# define TRIO_MISC 1 +#endif +#ifndef TRIO_UNIX98 +# define TRIO_UNIX98 1 +#endif +#ifndef TRIO_MICROSOFT +# define TRIO_MICROSOFT 1 +#endif +#ifndef TRIO_EXTENSION +# define TRIO_EXTENSION 1 +#endif +#ifndef TRIO_WIDECHAR /* Does not work yet. Do not enable */ +# define TRIO_WIDECHAR 0 +#endif +#ifndef TRIO_ERRORS +# define TRIO_ERRORS 1 +#endif + +#ifndef TRIO_MALLOC +# define TRIO_MALLOC(n) malloc(n) +#endif +#ifndef TRIO_REALLOC +# define TRIO_REALLOC(x,n) realloc((x),(n)) +#endif +#ifndef TRIO_FREE +# define TRIO_FREE(x) free(x) +#endif + + +/************************************************************************* + * User-defined specifiers + */ + +typedef int (*trio_callback_t) TRIO_PROTO((trio_pointer_t)); + +trio_pointer_t trio_register TRIO_PROTO((trio_callback_t callback, const char *name)); +void trio_unregister TRIO_PROTO((trio_pointer_t handle)); + +TRIO_CONST char *trio_get_format TRIO_PROTO((trio_pointer_t ref)); +trio_pointer_t trio_get_argument TRIO_PROTO((trio_pointer_t ref)); + +/* Modifiers */ +int trio_get_width TRIO_PROTO((trio_pointer_t ref)); +void trio_set_width TRIO_PROTO((trio_pointer_t ref, int width)); +int trio_get_precision TRIO_PROTO((trio_pointer_t ref)); +void trio_set_precision TRIO_PROTO((trio_pointer_t ref, int precision)); +int trio_get_base TRIO_PROTO((trio_pointer_t ref)); +void trio_set_base TRIO_PROTO((trio_pointer_t ref, int base)); +int trio_get_padding TRIO_PROTO((trio_pointer_t ref)); +void trio_set_padding TRIO_PROTO((trio_pointer_t ref, int is_padding)); +int trio_get_short TRIO_PROTO((trio_pointer_t ref)); /* h */ +void trio_set_shortshort TRIO_PROTO((trio_pointer_t ref, int is_shortshort)); +int trio_get_shortshort TRIO_PROTO((trio_pointer_t ref)); /* hh */ +void trio_set_short TRIO_PROTO((trio_pointer_t ref, int is_short)); +int trio_get_long TRIO_PROTO((trio_pointer_t ref)); /* l */ +void trio_set_long TRIO_PROTO((trio_pointer_t ref, int is_long)); +int trio_get_longlong TRIO_PROTO((trio_pointer_t ref)); /* ll */ +void trio_set_longlong TRIO_PROTO((trio_pointer_t ref, int is_longlong)); +int trio_get_longdouble TRIO_PROTO((trio_pointer_t ref)); /* L */ +void trio_set_longdouble TRIO_PROTO((trio_pointer_t ref, int is_longdouble)); +int trio_get_alternative TRIO_PROTO((trio_pointer_t ref)); /* # */ +void trio_set_alternative TRIO_PROTO((trio_pointer_t ref, int is_alternative)); +int trio_get_alignment TRIO_PROTO((trio_pointer_t ref)); /* - */ +void trio_set_alignment TRIO_PROTO((trio_pointer_t ref, int is_leftaligned)); +int trio_get_spacing TRIO_PROTO((trio_pointer_t ref)); /* TRIO_PROTO((space) */ +void trio_set_spacing TRIO_PROTO((trio_pointer_t ref, int is_space)); +int trio_get_sign TRIO_PROTO((trio_pointer_t ref)); /* + */ +void trio_set_sign TRIO_PROTO((trio_pointer_t ref, int is_showsign)); +int trio_get_quote TRIO_PROTO((trio_pointer_t ref)); /* ' */ +void trio_set_quote TRIO_PROTO((trio_pointer_t ref, int is_quote)); +int trio_get_upper TRIO_PROTO((trio_pointer_t ref)); +void trio_set_upper TRIO_PROTO((trio_pointer_t ref, int is_upper)); +#if TRIO_C99 +int trio_get_largest TRIO_PROTO((trio_pointer_t ref)); /* j */ +void trio_set_largest TRIO_PROTO((trio_pointer_t ref, int is_largest)); +int trio_get_ptrdiff TRIO_PROTO((trio_pointer_t ref)); /* t */ +void trio_set_ptrdiff TRIO_PROTO((trio_pointer_t ref, int is_ptrdiff)); +int trio_get_size TRIO_PROTO((trio_pointer_t ref)); /* z / Z */ +void trio_set_size TRIO_PROTO((trio_pointer_t ref, int is_size)); +#endif + +/* Printing */ +int trio_print_ref TRIO_PROTO((trio_pointer_t ref, const char *format, ...)); +int trio_vprint_ref TRIO_PROTO((trio_pointer_t ref, const char *format, va_list args)); +int trio_printv_ref TRIO_PROTO((trio_pointer_t ref, const char *format, trio_pointer_t *args)); + +void trio_print_int TRIO_PROTO((trio_pointer_t ref, int number)); +void trio_print_uint TRIO_PROTO((trio_pointer_t ref, unsigned int number)); +/* void trio_print_long TRIO_PROTO((trio_pointer_t ref, long number)); */ +/* void trio_print_ulong TRIO_PROTO((trio_pointer_t ref, unsigned long number)); */ +void trio_print_double TRIO_PROTO((trio_pointer_t ref, double number)); +void trio_print_string TRIO_PROTO((trio_pointer_t ref, char *string)); +void trio_print_pointer TRIO_PROTO((trio_pointer_t ref, trio_pointer_t pointer)); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* TRIO_TRIOP_H */ diff --git a/vendors/libxml/src/triostr.c b/vendors/libxml/src/triostr.c new file mode 100644 index 0000000..30d13ac --- /dev/null +++ b/vendors/libxml/src/triostr.c @@ -0,0 +1,2106 @@ +/************************************************************************* + * + * $Id$ + * + * Copyright (C) 2001 Bjorn Reese and Daniel Stenberg. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF + * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND + * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. + * + ************************************************************************/ + +/************************************************************************* + * Include files + */ + +#include +#include +#include +#include +#include +#include "triodef.h" +#include "triostr.h" + +/************************************************************************* + * Definitions + */ + +#if !defined(TRIO_STRING_PUBLIC) +# define TRIO_STRING_PUBLIC TRIO_PUBLIC +#endif +#if !defined(TRIO_STRING_PRIVATE) +# define TRIO_STRING_PRIVATE TRIO_PRIVATE +#endif + +#if !defined(NULL) +# define NULL 0 +#endif +#if !defined(NIL) +# define NIL ((char)0) +#endif +#if !defined(FALSE) +# define FALSE (1 == 0) +# define TRUE (! FALSE) +#endif +#if !defined(BOOLEAN_T) +# define BOOLEAN_T int +#endif + +#if defined(TRIO_COMPILER_SUPPORTS_C99) +# define USE_STRTOD +# define USE_STRTOF +#elif defined(TRIO_COMPILER_MSVC) +# define USE_STRTOD +#endif + +#if defined(TRIO_PLATFORM_UNIX) +# define USE_STRCASECMP +# define USE_STRNCASECMP +# if defined(TRIO_PLATFORM_SUNOS) +# define USE_SYS_ERRLIST +# else +# define USE_STRERROR +# endif +# if defined(TRIO_PLATFORM_QNX) +# define strcasecmp(x,y) stricmp(x,y) +# define strncasecmp(x,y,n) strnicmp(x,y,n) +# endif +#elif defined(TRIO_PLATFORM_WIN32) +# define USE_STRCASECMP +# if defined(_WIN32_WCE) +# define strcasecmp(x,y) _stricmp(x,y) +# else +# define strcasecmp(x,y) strcmpi(x,y) +# endif +#endif + +#if !(defined(TRIO_PLATFORM_SUNOS)) +# define USE_TOLOWER +# define USE_TOUPPER +#endif + +/************************************************************************* + * Structures + */ + +struct _trio_string_t +{ + char *content; + size_t length; + size_t allocated; +}; + +/************************************************************************* + * Constants + */ + +#if !defined(TRIO_MINIMAL) +static TRIO_CONST char rcsid[] = "@(#)$Id$"; +#endif + +/************************************************************************* + * Static String Functions + */ + +#if defined(TRIO_DOCUMENTATION) +# include "doc/doc_static.h" +#endif +/** @addtogroup StaticStrings + @{ +*/ + +/** + Create new string. + + @param size Size of new string. + @return Pointer to string, or NULL if allocation failed. +*/ +TRIO_STRING_PUBLIC char * +trio_create +TRIO_ARGS1((size), + size_t size) +{ + return (char *)TRIO_MALLOC(size); +} + + +/** + Destroy string. + + @param string String to be freed. +*/ +TRIO_STRING_PUBLIC void +trio_destroy +TRIO_ARGS1((string), + char *string) +{ + if (string) + { + TRIO_FREE(string); + } +} + + +/** + Count the number of characters in a string. + + @param string String to measure. + @return Number of characters in @string. +*/ +TRIO_STRING_PUBLIC size_t +trio_length +TRIO_ARGS1((string), + TRIO_CONST char *string) +{ + return strlen(string); +} + + +#if !defined(TRIO_MINIMAL) +/** + Append @p source at the end of @p target. + + @param target Target string. + @param source Source string. + @return Boolean value indicating success or failure. + + @pre @p target must point to a memory chunk with sufficient room to + contain the @p target string and @p source string. + @pre No boundary checking is performed, so insufficient memory will + result in a buffer overrun. + @post @p target will be zero terminated. +*/ +TRIO_STRING_PUBLIC int +trio_append +TRIO_ARGS2((target, source), + char *target, + TRIO_CONST char *source) +{ + assert(target); + assert(source); + + return (strcat(target, source) != NULL); +} +#endif /* !defined(TRIO_MINIMAL) */ + +#if !defined(TRIO_MINIMAL) +/** + Append at most @p max characters from @p source to @p target. + + @param target Target string. + @param max Maximum number of characters to append. + @param source Source string. + @return Boolean value indicating success or failure. + + @pre @p target must point to a memory chuck with sufficient room to + contain the @p target string and the @p source string (at most @p max + characters). + @pre No boundary checking is performed, so insufficient memory will + result in a buffer overrun. + @post @p target will be zero terminated. +*/ +TRIO_STRING_PUBLIC int +trio_append_max +TRIO_ARGS3((target, max, source), + char *target, + size_t max, + TRIO_CONST char *source) +{ + size_t length; + + assert(target); + assert(source); + + length = trio_length(target); + + if (max > length) + { + strncat(target, source, max - length - 1); + } + return TRUE; +} +#endif /* !defined(TRIO_MINIMAL) */ + + +#if !defined(TRIO_MINIMAL) +/** + Determine if a string contains a substring. + + @param string String to be searched. + @param substring String to be found. + @return Boolean value indicating success or failure. +*/ +TRIO_STRING_PUBLIC int +trio_contains +TRIO_ARGS2((string, substring), + TRIO_CONST char *string, + TRIO_CONST char *substring) +{ + assert(string); + assert(substring); + + return (0 != strstr(string, substring)); +} +#endif /* !defined(TRIO_MINIMAL) */ + + +#if !defined(TRIO_MINIMAL) +/** + Copy @p source to @p target. + + @param target Target string. + @param source Source string. + @return Boolean value indicating success or failure. + + @pre @p target must point to a memory chunk with sufficient room to + contain the @p source string. + @pre No boundary checking is performed, so insufficient memory will + result in a buffer overrun. + @post @p target will be zero terminated. +*/ +TRIO_STRING_PUBLIC int +trio_copy +TRIO_ARGS2((target, source), + char *target, + TRIO_CONST char *source) +{ + assert(target); + assert(source); + + (void)strcpy(target, source); + return TRUE; +} +#endif /* !defined(TRIO_MINIMAL) */ + + +/** + Copy at most @p max characters from @p source to @p target. + + @param target Target string. + @param max Maximum number of characters to append. + @param source Source string. + @return Boolean value indicating success or failure. + + @pre @p target must point to a memory chunk with sufficient room to + contain the @p source string (at most @p max characters). + @pre No boundary checking is performed, so insufficient memory will + result in a buffer overrun. + @post @p target will be zero terminated. +*/ +TRIO_STRING_PUBLIC int +trio_copy_max +TRIO_ARGS3((target, max, source), + char *target, + size_t max, + TRIO_CONST char *source) +{ + assert(target); + assert(source); + assert(max > 0); /* Includes != 0 */ + + (void)strncpy(target, source, max - 1); + target[max - 1] = (char)0; + return TRUE; +} + + +/* + * TrioDuplicateMax + */ +TRIO_STRING_PRIVATE char * +TrioDuplicateMax +TRIO_ARGS2((source, size), + TRIO_CONST char *source, + size_t size) +{ + char *target; + + assert(source); + + /* Make room for string plus a terminating zero */ + size++; + target = trio_create(size); + if (target) + { + trio_copy_max(target, size, source); + } + return target; +} + + +/** + Duplicate @p source. + + @param source Source string. + @return A copy of the @p source string. + + @post @p target will be zero terminated. +*/ +TRIO_STRING_PUBLIC char * +trio_duplicate +TRIO_ARGS1((source), + TRIO_CONST char *source) +{ + return TrioDuplicateMax(source, trio_length(source)); +} + + +#if !defined(TRIO_MINIMAL) +/** + Duplicate at most @p max characters of @p source. + + @param source Source string. + @param max Maximum number of characters to duplicate. + @return A copy of the @p source string. + + @post @p target will be zero terminated. +*/ +TRIO_STRING_PUBLIC char * +trio_duplicate_max TRIO_ARGS2((source, max), + TRIO_CONST char *source, + size_t max) +{ + size_t length; + + assert(source); + assert(max > 0); + + length = trio_length(source); + if (length > max) + { + length = max; + } + return TrioDuplicateMax(source, length); +} +#endif /* !defined(TRIO_MINIMAL) */ + + +/** + Compare if two strings are equal. + + @param first First string. + @param second Second string. + @return Boolean indicating whether the two strings are equal or not. + + Case-insensitive comparison. +*/ +TRIO_STRING_PUBLIC int +trio_equal +TRIO_ARGS2((first, second), + TRIO_CONST char *first, + TRIO_CONST char *second) +{ + assert(first); + assert(second); + + if ((first != NULL) && (second != NULL)) + { +#if defined(USE_STRCASECMP) + return (0 == strcasecmp(first, second)); +#else + while ((*first != NIL) && (*second != NIL)) + { + if (trio_to_upper(*first) != trio_to_upper(*second)) + { + break; + } + first++; + second++; + } + return ((*first == NIL) && (*second == NIL)); +#endif + } + return FALSE; +} + + +/** + Compare if two strings are equal. + + @param first First string. + @param second Second string. + @return Boolean indicating whether the two strings are equal or not. + + Case-sensitive comparison. +*/ +TRIO_STRING_PUBLIC int +trio_equal_case +TRIO_ARGS2((first, second), + TRIO_CONST char *first, + TRIO_CONST char *second) +{ + assert(first); + assert(second); + + if ((first != NULL) && (second != NULL)) + { + return (0 == strcmp(first, second)); + } + return FALSE; +} + + +#if !defined(TRIO_MINIMAL) +/** + Compare if two strings up until the first @p max characters are equal. + + @param first First string. + @param max Maximum number of characters to compare. + @param second Second string. + @return Boolean indicating whether the two strings are equal or not. + + Case-sensitive comparison. +*/ +TRIO_STRING_PUBLIC int +trio_equal_case_max +TRIO_ARGS3((first, max, second), + TRIO_CONST char *first, + size_t max, + TRIO_CONST char *second) +{ + assert(first); + assert(second); + + if ((first != NULL) && (second != NULL)) + { + return (0 == strncmp(first, second, max)); + } + return FALSE; +} +#endif /* !defined(TRIO_MINIMAL) */ + + +/** + Compare if two strings are equal. + + @param first First string. + @param second Second string. + @return Boolean indicating whether the two strings are equal or not. + + Collating characters are considered equal. +*/ +TRIO_STRING_PUBLIC int +trio_equal_locale +TRIO_ARGS2((first, second), + TRIO_CONST char *first, + TRIO_CONST char *second) +{ + assert(first); + assert(second); + +#if defined(LC_COLLATE) + return (strcoll(first, second) == 0); +#else + return trio_equal(first, second); +#endif +} + + +/** + Compare if two strings up until the first @p max characters are equal. + + @param first First string. + @param max Maximum number of characters to compare. + @param second Second string. + @return Boolean indicating whether the two strings are equal or not. + + Case-insensitive comparison. +*/ +TRIO_STRING_PUBLIC int +trio_equal_max +TRIO_ARGS3((first, max, second), + TRIO_CONST char *first, + size_t max, + TRIO_CONST char *second) +{ + assert(first); + assert(second); + + if ((first != NULL) && (second != NULL)) + { +#if defined(USE_STRNCASECMP) + return (0 == strncasecmp(first, second, max)); +#else + /* Not adequately tested yet */ + size_t cnt = 0; + while ((*first != NIL) && (*second != NIL) && (cnt <= max)) + { + if (trio_to_upper(*first) != trio_to_upper(*second)) + { + break; + } + first++; + second++; + cnt++; + } + return ((cnt == max) || ((*first == NIL) && (*second == NIL))); +#endif + } + return FALSE; +} + + +/** + Provide a textual description of an error code (errno). + + @param error_number Error number. + @return Textual description of @p error_number. +*/ +TRIO_STRING_PUBLIC TRIO_CONST char * +trio_error +TRIO_ARGS1((error_number), + int error_number) +{ +#if defined(USE_STRERROR) + + return strerror(error_number); + +#elif defined(USE_SYS_ERRLIST) + + extern char *sys_errlist[]; + extern int sys_nerr; + + return ((error_number < 0) || (error_number >= sys_nerr)) + ? "unknown" + : sys_errlist[error_number]; + +#else + + return "unknown"; + +#endif +} + + +#if !defined(TRIO_MINIMAL) && !defined(_WIN32_WCE) +/** + Format the date/time according to @p format. + + @param target Target string. + @param max Maximum number of characters to format. + @param format Formatting string. + @param datetime Date/time structure. + @return Number of formatted characters. + + The formatting string accepts the same specifiers as the standard C + function strftime. +*/ +TRIO_STRING_PUBLIC size_t +trio_format_date_max +TRIO_ARGS4((target, max, format, datetime), + char *target, + size_t max, + TRIO_CONST char *format, + TRIO_CONST struct tm *datetime) +{ + assert(target); + assert(format); + assert(datetime); + assert(max > 0); + + return strftime(target, max, format, datetime); +} +#endif /* !defined(TRIO_MINIMAL) */ + + +#if !defined(TRIO_MINIMAL) +/** + Calculate a hash value for a string. + + @param string String to be calculated on. + @param type Hash function. + @return Calculated hash value. + + @p type can be one of the following + @li @c TRIO_HASH_PLAIN Plain hash function. +*/ +TRIO_STRING_PUBLIC unsigned long +trio_hash +TRIO_ARGS2((string, type), + TRIO_CONST char *string, + int type) +{ + unsigned long value = 0L; + char ch; + + assert(string); + + switch (type) + { + case TRIO_HASH_PLAIN: + while ( (ch = *string++) != NIL ) + { + value *= 31; + value += (unsigned long)ch; + } + break; + default: + assert(FALSE); + break; + } + return value; +} +#endif /* !defined(TRIO_MINIMAL) */ + + +#if !defined(TRIO_MINIMAL) +/** + Find first occurrence of a character in a string. + + @param string String to be searched. + @param character Character to be found. + @param A pointer to the found character, or NULL if character was not found. + */ +TRIO_STRING_PUBLIC char * +trio_index +TRIO_ARGS2((string, character), + TRIO_CONST char *string, + int character) +{ + assert(string); + + return strchr(string, character); +} +#endif /* !defined(TRIO_MINIMAL) */ + + +#if !defined(TRIO_MINIMAL) +/** + Find last occurrence of a character in a string. + + @param string String to be searched. + @param character Character to be found. + @param A pointer to the found character, or NULL if character was not found. + */ +TRIO_STRING_PUBLIC char * +trio_index_last +TRIO_ARGS2((string, character), + TRIO_CONST char *string, + int character) +{ + assert(string); + + return strchr(string, character); +} +#endif /* !defined(TRIO_MINIMAL) */ + + +#if !defined(TRIO_MINIMAL) +/** + Convert the alphabetic letters in the string to lower-case. + + @param target String to be converted. + @return Number of processed characters (converted or not). +*/ +TRIO_STRING_PUBLIC int +trio_lower +TRIO_ARGS1((target), + char *target) +{ + assert(target); + + return trio_span_function(target, target, trio_to_lower); +} +#endif /* !defined(TRIO_MINIMAL) */ + + +#if !defined(TRIO_MINIMAL) +/** + Compare two strings using wildcards. + + @param string String to be searched. + @param pattern Pattern, including wildcards, to search for. + @return Boolean value indicating success or failure. + + Case-insensitive comparison. + + The following wildcards can be used + @li @c * Match any number of characters. + @li @c ? Match a single character. +*/ +TRIO_STRING_PUBLIC int +trio_match +TRIO_ARGS2((string, pattern), + TRIO_CONST char *string, + TRIO_CONST char *pattern) +{ + assert(string); + assert(pattern); + + for (; ('*' != *pattern); ++pattern, ++string) + { + if (NIL == *string) + { + return (NIL == *pattern); + } + if ((trio_to_upper((int)*string) != trio_to_upper((int)*pattern)) + && ('?' != *pattern)) + { + return FALSE; + } + } + /* two-line patch to prevent *too* much recursiveness: */ + while ('*' == pattern[1]) + pattern++; + + do + { + if ( trio_match(string, &pattern[1]) ) + { + return TRUE; + } + } + while (*string++); + + return FALSE; +} +#endif /* !defined(TRIO_MINIMAL) */ + + +#if !defined(TRIO_MINIMAL) +/** + Compare two strings using wildcards. + + @param string String to be searched. + @param pattern Pattern, including wildcards, to search for. + @return Boolean value indicating success or failure. + + Case-sensitive comparison. + + The following wildcards can be used + @li @c * Match any number of characters. + @li @c ? Match a single character. +*/ +TRIO_STRING_PUBLIC int +trio_match_case +TRIO_ARGS2((string, pattern), + TRIO_CONST char *string, + TRIO_CONST char *pattern) +{ + assert(string); + assert(pattern); + + for (; ('*' != *pattern); ++pattern, ++string) + { + if (NIL == *string) + { + return (NIL == *pattern); + } + if ((*string != *pattern) + && ('?' != *pattern)) + { + return FALSE; + } + } + /* two-line patch to prevent *too* much recursiveness: */ + while ('*' == pattern[1]) + pattern++; + + do + { + if ( trio_match_case(string, &pattern[1]) ) + { + return TRUE; + } + } + while (*string++); + + return FALSE; +} +#endif /* !defined(TRIO_MINIMAL) */ + + +#if !defined(TRIO_MINIMAL) +/** + Execute a function on each character in string. + + @param target Target string. + @param source Source string. + @param Function Function to be executed. + @return Number of processed characters. +*/ +TRIO_STRING_PUBLIC size_t +trio_span_function +TRIO_ARGS3((target, source, Function), + char *target, + TRIO_CONST char *source, + int (*Function) TRIO_PROTO((int))) +{ + size_t count = 0; + + assert(target); + assert(source); + assert(Function); + + while (*source != NIL) + { + *target++ = Function(*source++); + count++; + } + return count; +} +#endif /* !defined(TRIO_MINIMAL) */ + + +#if !defined(TRIO_MINIMAL) +/** + Search for a substring in a string. + + @param string String to be searched. + @param substring String to be found. + @return Pointer to first occurrence of @p substring in @p string, or NULL + if no match was found. +*/ +TRIO_STRING_PUBLIC char * +trio_substring +TRIO_ARGS2((string, substring), + TRIO_CONST char *string, + TRIO_CONST char *substring) +{ + assert(string); + assert(substring); + + return strstr(string, substring); +} +#endif /* !defined(TRIO_MINIMAL) */ + + +#if !defined(TRIO_MINIMAL) +/** + Search for a substring in the first @p max characters of a string. + + @param string String to be searched. + @param max Maximum characters to be searched. + @param substring String to be found. + @return Pointer to first occurrence of @p substring in @p string, or NULL + if no match was found. +*/ +TRIO_STRING_PUBLIC char * +trio_substring_max +TRIO_ARGS3((string, max, substring), + TRIO_CONST char *string, + size_t max, + TRIO_CONST char *substring) +{ + size_t count; + size_t size; + char *result = NULL; + + assert(string); + assert(substring); + + size = trio_length(substring); + if (size <= max) + { + for (count = 0; count <= max - size; count++) + { + if (trio_equal_max(substring, size, &string[count])) + { + result = (char *)&string[count]; + break; + } + } + } + return result; +} +#endif /* !defined(TRIO_MINIMAL) */ + + +#if !defined(TRIO_MINIMAL) +/** + Tokenize string. + + @param string String to be tokenized. + @param tokens String containing list of delimiting characters. + @return Start of new token. + + @warning @p string will be destroyed. +*/ +TRIO_STRING_PUBLIC char * +trio_tokenize +TRIO_ARGS2((string, delimiters), + char *string, + TRIO_CONST char *delimiters) +{ + assert(delimiters); + + return strtok(string, delimiters); +} +#endif /* !defined(TRIO_MINIMAL) */ + + +/** + Convert string to floating-point number. + + @param source String to be converted. + @param endp Pointer to end of the converted string. + @return A floating-point number. + + The following Extended Backus-Naur form is used + @verbatim + double ::= [ ] + ( | + | + ) + [ [ ] ] + number ::= 1*( ) + digit ::= ( '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' ) + exponential ::= ( 'e' | 'E' ) + sign ::= ( '-' | '+' ) + decimal_point ::= '.' + @endverbatim +*/ +/* FIXME: Add EBNF for hex-floats */ +TRIO_STRING_PUBLIC trio_long_double_t +trio_to_long_double +TRIO_ARGS2((source, endp), + TRIO_CONST char *source, + char **endp) +{ +#if defined(USE_STRTOLD) + return strtold(source, endp); +#else + int isNegative = FALSE; + int isExponentNegative = FALSE; + trio_long_double_t integer = 0.0; + trio_long_double_t fraction = 0.0; + unsigned long exponent = 0; + trio_long_double_t base; + trio_long_double_t fracdiv = 1.0; + trio_long_double_t value = 0.0; + + /* First try hex-floats */ + if ((source[0] == '0') && ((source[1] == 'x') || (source[1] == 'X'))) + { + base = 16.0; + source += 2; + while (isxdigit((int)*source)) + { + integer *= base; + integer += (isdigit((int)*source) + ? (*source - '0') + : 10 + (trio_to_upper((int)*source) - 'A')); + source++; + } + if (*source == '.') + { + source++; + while (isxdigit((int)*source)) + { + fracdiv /= base; + fraction += fracdiv * (isdigit((int)*source) + ? (*source - '0') + : 10 + (trio_to_upper((int)*source) - 'A')); + source++; + } + if ((*source == 'p') || (*source == 'P')) + { + source++; + if ((*source == '+') || (*source == '-')) + { + isExponentNegative = (*source == '-'); + source++; + } + while (isdigit((int)*source)) + { + exponent *= 10; + exponent += (*source - '0'); + source++; + } + } + } + /* For later use with exponent */ + base = 2.0; + } + else /* Then try normal decimal floats */ + { + base = 10.0; + isNegative = (*source == '-'); + /* Skip sign */ + if ((*source == '+') || (*source == '-')) + source++; + + /* Integer part */ + while (isdigit((int)*source)) + { + integer *= base; + integer += (*source - '0'); + source++; + } + + if (*source == '.') + { + source++; /* skip decimal point */ + while (isdigit((int)*source)) + { + fracdiv /= base; + fraction += (*source - '0') * fracdiv; + source++; + } + } + if ((*source == 'e') + || (*source == 'E') +#if TRIO_MICROSOFT + || (*source == 'd') + || (*source == 'D') +#endif + ) + { + source++; /* Skip exponential indicator */ + isExponentNegative = (*source == '-'); + if ((*source == '+') || (*source == '-')) + source++; + while (isdigit((int)*source)) + { + exponent *= (int)base; + exponent += (*source - '0'); + source++; + } + } + } + + value = integer + fraction; + if (exponent != 0) + { + if (isExponentNegative) + value /= pow(base, (double)exponent); + else + value *= pow(base, (double)exponent); + } + if (isNegative) + value = -value; + + if (endp) + *endp = (char *)source; + return value; +#endif +} + + +/** + Convert string to floating-point number. + + @param source String to be converted. + @param endp Pointer to end of the converted string. + @return A floating-point number. + + See @ref trio_to_long_double. +*/ +TRIO_STRING_PUBLIC double +trio_to_double +TRIO_ARGS2((source, endp), + TRIO_CONST char *source, + char **endp) +{ +#if defined(USE_STRTOD) + return strtod(source, endp); +#else + return (double)trio_to_long_double(source, endp); +#endif +} + +#if !defined(TRIO_MINIMAL) +/** + Convert string to floating-point number. + + @param source String to be converted. + @param endp Pointer to end of the converted string. + @return A floating-point number. + + See @ref trio_to_long_double. +*/ +TRIO_STRING_PUBLIC float +trio_to_float +TRIO_ARGS2((source, endp), + TRIO_CONST char *source, + char **endp) +{ +#if defined(USE_STRTOF) + return strtof(source, endp); +#else + return (float)trio_to_long_double(source, endp); +#endif +} +#endif /* !defined(TRIO_MINIMAL) */ + + +/** + Convert string to signed integer. + + @param string String to be converted. + @param endp Pointer to end of converted string. + @param base Radix number of number. +*/ +TRIO_STRING_PUBLIC long +trio_to_long +TRIO_ARGS3((string, endp, base), + TRIO_CONST char *string, + char **endp, + int base) +{ + assert(string); + assert((base >= 2) && (base <= 36)); + + return strtol(string, endp, base); +} + + +#if !defined(TRIO_MINIMAL) +/** + Convert one alphabetic letter to lower-case. + + @param source The letter to be converted. + @return The converted letter. +*/ +TRIO_STRING_PUBLIC int +trio_to_lower +TRIO_ARGS1((source), + int source) +{ +#if defined(USE_TOLOWER) + + return tolower(source); + +#else + + /* Does not handle locales or non-contiguous alphabetic characters */ + return ((source >= (int)'A') && (source <= (int)'Z')) + ? source - 'A' + 'a' + : source; + +#endif +} +#endif /* !defined(TRIO_MINIMAL) */ + +#if !defined(TRIO_MINIMAL) +/** + Convert string to unsigned integer. + + @param string String to be converted. + @param endp Pointer to end of converted string. + @param base Radix number of number. +*/ +TRIO_STRING_PUBLIC unsigned long +trio_to_unsigned_long +TRIO_ARGS3((string, endp, base), + TRIO_CONST char *string, + char **endp, + int base) +{ + assert(string); + assert((base >= 2) && (base <= 36)); + + return strtoul(string, endp, base); +} +#endif /* !defined(TRIO_MINIMAL) */ + + +/** + Convert one alphabetic letter to upper-case. + + @param source The letter to be converted. + @return The converted letter. +*/ +TRIO_STRING_PUBLIC int +trio_to_upper +TRIO_ARGS1((source), + int source) +{ +#if defined(USE_TOUPPER) + + return toupper(source); + +#else + + /* Does not handle locales or non-contiguous alphabetic characters */ + return ((source >= (int)'a') && (source <= (int)'z')) + ? source - 'a' + 'A' + : source; + +#endif +} + +#if !defined(TRIO_MINIMAL) +/** + Convert the alphabetic letters in the string to upper-case. + + @param target The string to be converted. + @return The number of processed characters (converted or not). +*/ +TRIO_STRING_PUBLIC int +trio_upper +TRIO_ARGS1((target), + char *target) +{ + assert(target); + + return trio_span_function(target, target, trio_to_upper); +} +#endif /* !defined(TRIO_MINIMAL) */ + + +/** @} End of StaticStrings */ + + +/************************************************************************* + * Dynamic String Functions + */ + +#if defined(TRIO_DOCUMENTATION) +# include "doc/doc_dynamic.h" +#endif +/** @addtogroup DynamicStrings + @{ +*/ + +/* + * TrioStringAlloc + */ +TRIO_STRING_PRIVATE trio_string_t * +TrioStringAlloc(TRIO_NOARGS) +{ + trio_string_t *self; + + self = (trio_string_t *)TRIO_MALLOC(sizeof(trio_string_t)); + if (self) + { + self->content = NULL; + self->length = 0; + self->allocated = 0; + } + return self; +} + + +/* + * TrioStringGrow + * + * The size of the string will be increased by 'delta' characters. If + * 'delta' is zero, the size will be doubled. + */ +TRIO_STRING_PRIVATE BOOLEAN_T +TrioStringGrow +TRIO_ARGS2((self, delta), + trio_string_t *self, + size_t delta) +{ + BOOLEAN_T status = FALSE; + char *new_content; + size_t new_size; + + new_size = (delta == 0) + ? ( (self->allocated == 0) ? 1 : self->allocated * 2 ) + : self->allocated + delta; + + new_content = (char *)TRIO_REALLOC(self->content, new_size); + if (new_content) + { + self->content = new_content; + self->allocated = new_size; + status = TRUE; + } + return status; +} + + +#if !defined(TRIO_MINIMAL) +/* + * TrioStringGrowTo + * + * The size of the string will be increased to 'length' plus one characters. + * If 'length' is less than the original size, the original size will be + * used (that is, the size of the string is never decreased). + */ +TRIO_STRING_PRIVATE BOOLEAN_T +TrioStringGrowTo +TRIO_ARGS2((self, length), + trio_string_t *self, + size_t length) +{ + length++; /* Room for terminating zero */ + return (self->allocated < length) + ? TrioStringGrow(self, length - self->allocated) + : TRUE; +} +#endif /* !defined(TRIO_MINIMAL) */ + + +#if !defined(TRIO_MINIMAL) +/** + Create a new dynamic string. + + @param initial_size Initial size of the buffer. + @return Newly allocated dynamic string, or NULL if memory allocation failed. +*/ +TRIO_STRING_PUBLIC trio_string_t * +trio_string_create +TRIO_ARGS1((initial_size), + int initial_size) +{ + trio_string_t *self; + + self = TrioStringAlloc(); + if (self) + { + if (TrioStringGrow(self, + (size_t)((initial_size > 0) ? initial_size : 1))) + { + self->content[0] = (char)0; + self->allocated = initial_size; + } + else + { + trio_string_destroy(self); + self = NULL; + } + } + return self; +} +#endif /* !defined(TRIO_MINIMAL) */ + + +/** + Deallocate the dynamic string and its contents. + + @param self Dynamic string +*/ +TRIO_STRING_PUBLIC void +trio_string_destroy +TRIO_ARGS1((self), + trio_string_t *self) +{ + assert(self); + + if (self) + { + trio_destroy(self->content); + TRIO_FREE(self); + } +} + + +#if !defined(TRIO_MINIMAL) +/** + Get a pointer to the content. + + @param self Dynamic string. + @param offset Offset into content. + @return Pointer to the content. + + @p Offset can be zero, positive, or negative. If @p offset is zero, + then the start of the content will be returned. If @p offset is positive, + then a pointer to @p offset number of characters from the beginning of the + content is returned. If @p offset is negative, then a pointer to @p offset + number of characters from the ending of the string, starting at the + terminating zero, is returned. +*/ +TRIO_STRING_PUBLIC char * +trio_string_get +TRIO_ARGS2((self, offset), + trio_string_t *self, + int offset) +{ + char *result = NULL; + + assert(self); + + if (self->content != NULL) + { + if (self->length == 0) + { + (void)trio_string_length(self); + } + if (offset >= 0) + { + if (offset > (int)self->length) + { + offset = self->length; + } + } + else + { + offset += self->length + 1; + if (offset < 0) + { + offset = 0; + } + } + result = &(self->content[offset]); + } + return result; +} +#endif /* !defined(TRIO_MINIMAL) */ + + +/** + Extract the content. + + @param self Dynamic String + @return Content of dynamic string. + + The content is removed from the dynamic string. This enables destruction + of the dynamic string without deallocation of the content. +*/ +TRIO_STRING_PUBLIC char * +trio_string_extract +TRIO_ARGS1((self), + trio_string_t *self) +{ + char *result; + + assert(self); + + result = self->content; + /* FIXME: Allocate new empty buffer? */ + self->content = NULL; + self->length = self->allocated = 0; + return result; +} + + +#if !defined(TRIO_MINIMAL) +/** + Set the content of the dynamic string. + + @param self Dynamic String + @param buffer The new content. + + Sets the content of the dynamic string to a copy @p buffer. + An existing content will be deallocated first, if necessary. + + @remark + This function will make a copy of @p buffer. + You are responsible for deallocating @p buffer yourself. +*/ +TRIO_STRING_PUBLIC void +trio_xstring_set +TRIO_ARGS2((self, buffer), + trio_string_t *self, + char *buffer) +{ + assert(self); + + trio_destroy(self->content); + self->content = trio_duplicate(buffer); +} +#endif /* !defined(TRIO_MINIMAL) */ + + +/* + * trio_string_size + */ +TRIO_STRING_PUBLIC int +trio_string_size +TRIO_ARGS1((self), + trio_string_t *self) +{ + assert(self); + + return self->allocated; +} + + +/* + * trio_string_terminate + */ +TRIO_STRING_PUBLIC void +trio_string_terminate +TRIO_ARGS1((self), + trio_string_t *self) +{ + trio_xstring_append_char(self, 0); +} + + +#if !defined(TRIO_MINIMAL) +/** + Append the second string to the first. + + @param self Dynamic string to be modified. + @param other Dynamic string to copy from. + @return Boolean value indicating success or failure. +*/ +TRIO_STRING_PUBLIC int +trio_string_append +TRIO_ARGS2((self, other), + trio_string_t *self, + trio_string_t *other) +{ + size_t length; + + assert(self); + assert(other); + + length = self->length + other->length; + if (!TrioStringGrowTo(self, length)) + goto error; + trio_copy(&self->content[self->length], other->content); + self->length = length; + return TRUE; + + error: + return FALSE; +} +#endif /* !defined(TRIO_MINIMAL) */ + + +#if !defined(TRIO_MINIMAL) +/* + * trio_xstring_append + */ +TRIO_STRING_PUBLIC int +trio_xstring_append +TRIO_ARGS2((self, other), + trio_string_t *self, + TRIO_CONST char *other) +{ + size_t length; + + assert(self); + assert(other); + + length = self->length + trio_length(other); + if (!TrioStringGrowTo(self, length)) + goto error; + trio_copy(&self->content[self->length], other); + self->length = length; + return TRUE; + + error: + return FALSE; +} +#endif /* !defined(TRIO_MINIMAL) */ + + +/* + * trio_xstring_append_char + */ +TRIO_STRING_PUBLIC int +trio_xstring_append_char +TRIO_ARGS2((self, character), + trio_string_t *self, + char character) +{ + assert(self); + + if ((int)self->length >= trio_string_size(self)) + { + if (!TrioStringGrow(self, 0)) + goto error; + } + self->content[self->length] = character; + self->length++; + return TRUE; + + error: + return FALSE; +} + + +#if !defined(TRIO_MINIMAL) +/** + Search for the first occurrence of second parameter in the first. + + @param self Dynamic string to be modified. + @param other Dynamic string to copy from. + @return Boolean value indicating success or failure. +*/ +TRIO_STRING_PUBLIC int +trio_string_contains +TRIO_ARGS2((self, other), + trio_string_t *self, + trio_string_t *other) +{ + assert(self); + assert(other); + + return trio_contains(self->content, other->content); +} +#endif /* !defined(TRIO_MINIMAL) */ + + +#if !defined(TRIO_MINIMAL) +/* + * trio_xstring_contains + */ +TRIO_STRING_PUBLIC int +trio_xstring_contains +TRIO_ARGS2((self, other), + trio_string_t *self, + TRIO_CONST char *other) +{ + assert(self); + assert(other); + + return trio_contains(self->content, other); +} +#endif /* !defined(TRIO_MINIMAL) */ + + +#if !defined(TRIO_MINIMAL) +/* + * trio_string_copy + */ +TRIO_STRING_PUBLIC int +trio_string_copy +TRIO_ARGS2((self, other), + trio_string_t *self, + trio_string_t *other) +{ + assert(self); + assert(other); + + self->length = 0; + return trio_string_append(self, other); +} +#endif /* !defined(TRIO_MINIMAL) */ + + +#if !defined(TRIO_MINIMAL) +/* + * trio_xstring_copy + */ +TRIO_STRING_PUBLIC int +trio_xstring_copy +TRIO_ARGS2((self, other), + trio_string_t *self, + TRIO_CONST char *other) +{ + assert(self); + assert(other); + + self->length = 0; + return trio_xstring_append(self, other); +} +#endif /* !defined(TRIO_MINIMAL) */ + + +#if !defined(TRIO_MINIMAL) +/* + * trio_string_duplicate + */ +TRIO_STRING_PUBLIC trio_string_t * +trio_string_duplicate +TRIO_ARGS1((other), + trio_string_t *other) +{ + trio_string_t *self; + + assert(other); + + self = TrioStringAlloc(); + if (self) + { + self->content = TrioDuplicateMax(other->content, other->length); + if (self->content) + { + self->length = other->length; + self->allocated = self->length + 1; + } + else + { + self->length = self->allocated = 0; + } + } + return self; +} +#endif /* !defined(TRIO_MINIMAL) */ + + +/* + * trio_xstring_duplicate + */ +TRIO_STRING_PUBLIC trio_string_t * +trio_xstring_duplicate +TRIO_ARGS1((other), + TRIO_CONST char *other) +{ + trio_string_t *self; + + assert(other); + + self = TrioStringAlloc(); + if (self) + { + self->content = TrioDuplicateMax(other, trio_length(other)); + if (self->content) + { + self->length = trio_length(self->content); + self->allocated = self->length + 1; + } + else + { + self->length = self->allocated = 0; + } + } + return self; +} + + +#if !defined(TRIO_MINIMAL) +/* + * trio_string_equal + */ +TRIO_STRING_PUBLIC int +trio_string_equal +TRIO_ARGS2((self, other), + trio_string_t *self, + trio_string_t *other) +{ + assert(self); + assert(other); + + return trio_equal(self->content, other->content); +} +#endif /* !defined(TRIO_MINIMAL) */ + + +#if !defined(TRIO_MINIMAL) +/* + * trio_xstring_equal + */ +TRIO_STRING_PUBLIC int +trio_xstring_equal +TRIO_ARGS2((self, other), + trio_string_t *self, + TRIO_CONST char *other) +{ + assert(self); + assert(other); + + return trio_equal(self->content, other); +} +#endif /* !defined(TRIO_MINIMAL) */ + + +#if !defined(TRIO_MINIMAL) +/* + * trio_string_equal_max + */ +TRIO_STRING_PUBLIC int +trio_string_equal_max +TRIO_ARGS3((self, max, other), + trio_string_t *self, + size_t max, + trio_string_t *other) +{ + assert(self); + assert(other); + + return trio_equal_max(self->content, max, other->content); +} +#endif /* !defined(TRIO_MINIMAL) */ + + +#if !defined(TRIO_MINIMAL) +/* + * trio_xstring_equal_max + */ +TRIO_STRING_PUBLIC int +trio_xstring_equal_max +TRIO_ARGS3((self, max, other), + trio_string_t *self, + size_t max, + TRIO_CONST char *other) +{ + assert(self); + assert(other); + + return trio_equal_max(self->content, max, other); +} +#endif /* !defined(TRIO_MINIMAL) */ + + +#if !defined(TRIO_MINIMAL) +/* + * trio_string_equal_case + */ +TRIO_STRING_PUBLIC int +trio_string_equal_case +TRIO_ARGS2((self, other), + trio_string_t *self, + trio_string_t *other) +{ + assert(self); + assert(other); + + return trio_equal_case(self->content, other->content); +} +#endif /* !defined(TRIO_MINIMAL) */ + + +#if !defined(TRIO_MINIMAL) +/* + * trio_xstring_equal_case + */ +TRIO_STRING_PUBLIC int +trio_xstring_equal_case +TRIO_ARGS2((self, other), + trio_string_t *self, + TRIO_CONST char *other) +{ + assert(self); + assert(other); + + return trio_equal_case(self->content, other); +} +#endif /* !defined(TRIO_MINIMAL) */ + + +#if !defined(TRIO_MINIMAL) +/* + * trio_string_equal_case_max + */ +TRIO_STRING_PUBLIC int +trio_string_equal_case_max +TRIO_ARGS3((self, max, other), + trio_string_t *self, + size_t max, + trio_string_t *other) +{ + assert(self); + assert(other); + + return trio_equal_case_max(self->content, max, other->content); +} +#endif /* !defined(TRIO_MINIMAL) */ + + +#if !defined(TRIO_MINIMAL) +/* + * trio_xstring_equal_case_max + */ +TRIO_STRING_PUBLIC int +trio_xstring_equal_case_max +TRIO_ARGS3((self, max, other), + trio_string_t *self, + size_t max, + TRIO_CONST char *other) +{ + assert(self); + assert(other); + + return trio_equal_case_max(self->content, max, other); +} +#endif /* !defined(TRIO_MINIMAL) */ + + +#if !defined(TRIO_MINIMAL) && !defined(_WIN32_WCE) +/* + * trio_string_format_data_max + */ +TRIO_STRING_PUBLIC size_t +trio_string_format_date_max +TRIO_ARGS4((self, max, format, datetime), + trio_string_t *self, + size_t max, + TRIO_CONST char *format, + TRIO_CONST struct tm *datetime) +{ + assert(self); + + return trio_format_date_max(self->content, max, format, datetime); +} +#endif /* !defined(TRIO_MINIMAL) */ + + +#if !defined(TRIO_MINIMAL) +/* + * trio_string_index + */ +TRIO_STRING_PUBLIC char * +trio_string_index +TRIO_ARGS2((self, character), + trio_string_t *self, + int character) +{ + assert(self); + + return trio_index(self->content, character); +} +#endif /* !defined(TRIO_MINIMAL) */ + + +#if !defined(TRIO_MINIMAL) +/* + * trio_string_index_last + */ +TRIO_STRING_PUBLIC char * +trio_string_index_last +TRIO_ARGS2((self, character), + trio_string_t *self, + int character) +{ + assert(self); + + return trio_index_last(self->content, character); +} +#endif /* !defined(TRIO_MINIMAL) */ + + +#if !defined(TRIO_MINIMAL) +/* + * trio_string_length + */ +TRIO_STRING_PUBLIC int +trio_string_length +TRIO_ARGS1((self), + trio_string_t *self) +{ + assert(self); + + if (self->length == 0) + { + self->length = trio_length(self->content); + } + return self->length; +} +#endif /* !defined(TRIO_MINIMAL) */ + + +#if !defined(TRIO_MINIMAL) +/* + * trio_string_lower + */ +TRIO_STRING_PUBLIC int +trio_string_lower +TRIO_ARGS1((self), + trio_string_t *self) +{ + assert(self); + + return trio_lower(self->content); +} +#endif /* !defined(TRIO_MINIMAL) */ + + +#if !defined(TRIO_MINIMAL) +/* + * trio_string_match + */ +TRIO_STRING_PUBLIC int +trio_string_match +TRIO_ARGS2((self, other), + trio_string_t *self, + trio_string_t *other) +{ + assert(self); + assert(other); + + return trio_match(self->content, other->content); +} +#endif /* !defined(TRIO_MINIMAL) */ + + +#if !defined(TRIO_MINIMAL) +/* + * trio_xstring_match + */ +TRIO_STRING_PUBLIC int +trio_xstring_match +TRIO_ARGS2((self, other), + trio_string_t *self, + TRIO_CONST char *other) +{ + assert(self); + assert(other); + + return trio_match(self->content, other); +} +#endif /* !defined(TRIO_MINIMAL) */ + + +#if !defined(TRIO_MINIMAL) +/* + * trio_string_match_case + */ +TRIO_STRING_PUBLIC int +trio_string_match_case +TRIO_ARGS2((self, other), + trio_string_t *self, + trio_string_t *other) +{ + assert(self); + assert(other); + + return trio_match_case(self->content, other->content); +} +#endif /* !defined(TRIO_MINIMAL) */ + + +#if !defined(TRIO_MINIMAL) +/* + * trio_xstring_match_case + */ +TRIO_STRING_PUBLIC int +trio_xstring_match_case +TRIO_ARGS2((self, other), + trio_string_t *self, + TRIO_CONST char *other) +{ + assert(self); + assert(other); + + return trio_match_case(self->content, other); +} +#endif /* !defined(TRIO_MINIMAL) */ + + +#if !defined(TRIO_MINIMAL) +/* + * trio_string_substring + */ +TRIO_STRING_PUBLIC char * +trio_string_substring +TRIO_ARGS2((self, other), + trio_string_t *self, + trio_string_t *other) +{ + assert(self); + assert(other); + + return trio_substring(self->content, other->content); +} +#endif /* !defined(TRIO_MINIMAL) */ + + +#if !defined(TRIO_MINIMAL) +/* + * trio_xstring_substring + */ +TRIO_STRING_PUBLIC char * +trio_xstring_substring +TRIO_ARGS2((self, other), + trio_string_t *self, + TRIO_CONST char *other) +{ + assert(self); + assert(other); + + return trio_substring(self->content, other); +} +#endif /* !defined(TRIO_MINIMAL) */ + + +#if !defined(TRIO_MINIMAL) +/* + * trio_string_upper + */ +TRIO_STRING_PUBLIC int +trio_string_upper +TRIO_ARGS1((self), + trio_string_t *self) +{ + assert(self); + + return trio_upper(self->content); +} +#endif /* !defined(TRIO_MINIMAL) */ + +/** @} End of DynamicStrings */ diff --git a/vendors/libxml/src/triostr.h b/vendors/libxml/src/triostr.h new file mode 100644 index 0000000..27f4ace --- /dev/null +++ b/vendors/libxml/src/triostr.h @@ -0,0 +1,144 @@ +/************************************************************************* + * + * $Id$ + * + * Copyright (C) 2001 Bjorn Reese and Daniel Stenberg. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF + * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND + * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. + * + ************************************************************************/ + +#ifndef TRIO_TRIOSTR_H +#define TRIO_TRIOSTR_H + +#include +#include +#include +#include +#include "triodef.h" +#include "triop.h" + +enum { + TRIO_HASH_NONE = 0, + TRIO_HASH_PLAIN, + TRIO_HASH_TWOSIGNED +}; + +#if !defined(TRIO_STRING_PUBLIC) +# if !defined(TRIO_PUBLIC) +# define TRIO_PUBLIC +# endif +# define TRIO_STRING_PUBLIC TRIO_PUBLIC +#endif + +/************************************************************************* + * String functions + */ + +TRIO_STRING_PUBLIC int trio_copy_max TRIO_PROTO((char *target, size_t max, const char *source)); +TRIO_STRING_PUBLIC char *trio_create TRIO_PROTO((size_t size)); +TRIO_STRING_PUBLIC void trio_destroy TRIO_PROTO((char *string)); +TRIO_STRING_PUBLIC char *trio_duplicate TRIO_PROTO((const char *source)); +TRIO_STRING_PUBLIC int trio_equal TRIO_PROTO((const char *first, const char *second)); +TRIO_STRING_PUBLIC int trio_equal_case TRIO_PROTO((const char *first, const char *second)); +TRIO_STRING_PUBLIC int trio_equal_locale TRIO_PROTO((const char *first, const char *second)); +TRIO_STRING_PUBLIC int trio_equal_max TRIO_PROTO((const char *first, size_t max, const char *second)); +TRIO_STRING_PUBLIC TRIO_CONST char *trio_error TRIO_PROTO((int)); +TRIO_STRING_PUBLIC size_t trio_length TRIO_PROTO((const char *string)); +TRIO_STRING_PUBLIC double trio_to_double TRIO_PROTO((const char *source, char **endp)); +TRIO_STRING_PUBLIC long trio_to_long TRIO_PROTO((const char *source, char **endp, int base)); +TRIO_STRING_PUBLIC trio_long_double_t trio_to_long_double TRIO_PROTO((const char *source, char **endp)); +TRIO_STRING_PUBLIC int trio_to_upper TRIO_PROTO((int source)); + +#if !defined(TRIO_MINIMAL) + +TRIO_STRING_PUBLIC int trio_append TRIO_PROTO((char *target, const char *source)); +TRIO_STRING_PUBLIC int trio_append_max TRIO_PROTO((char *target, size_t max, const char *source)); +TRIO_STRING_PUBLIC int trio_contains TRIO_PROTO((const char *string, const char *substring)); +TRIO_STRING_PUBLIC int trio_copy TRIO_PROTO((char *target, const char *source)); +TRIO_STRING_PUBLIC char *trio_duplicate_max TRIO_PROTO((const char *source, size_t max)); +TRIO_STRING_PUBLIC int trio_equal_case_max TRIO_PROTO((const char *first, size_t max, const char *second)); +#if !defined(_WIN32_WCE) +TRIO_STRING_PUBLIC size_t trio_format_date_max TRIO_PROTO((char *target, size_t max, const char *format, const struct tm *datetime)); +#endif +TRIO_STRING_PUBLIC unsigned long trio_hash TRIO_PROTO((const char *string, int type)); +TRIO_STRING_PUBLIC char *trio_index TRIO_PROTO((const char *string, int character)); +TRIO_STRING_PUBLIC char *trio_index_last TRIO_PROTO((const char *string, int character)); +TRIO_STRING_PUBLIC int trio_lower TRIO_PROTO((char *target)); +TRIO_STRING_PUBLIC int trio_match TRIO_PROTO((const char *string, const char *pattern)); +TRIO_STRING_PUBLIC int trio_match_case TRIO_PROTO((const char *string, const char *pattern)); +TRIO_STRING_PUBLIC size_t trio_span_function TRIO_PROTO((char *target, const char *source, int (*Function) TRIO_PROTO((int)))); +TRIO_STRING_PUBLIC char *trio_substring TRIO_PROTO((const char *string, const char *substring)); +TRIO_STRING_PUBLIC char *trio_substring_max TRIO_PROTO((const char *string, size_t max, const char *substring)); +TRIO_STRING_PUBLIC float trio_to_float TRIO_PROTO((const char *source, char **endp)); +TRIO_STRING_PUBLIC int trio_to_lower TRIO_PROTO((int source)); +TRIO_STRING_PUBLIC unsigned long trio_to_unsigned_long TRIO_PROTO((const char *source, char **endp, int base)); +TRIO_STRING_PUBLIC char *trio_tokenize TRIO_PROTO((char *string, const char *delimiters)); +TRIO_STRING_PUBLIC int trio_upper TRIO_PROTO((char *target)); + +#endif /* !defined(TRIO_MINIMAL) */ + +/************************************************************************* + * Dynamic string functions + */ + +/* + * Opaque type for dynamic strings + */ + +typedef struct _trio_string_t trio_string_t; + +TRIO_STRING_PUBLIC void trio_string_destroy TRIO_PROTO((trio_string_t *self)); +TRIO_STRING_PUBLIC char *trio_string_extract TRIO_PROTO((trio_string_t *self)); +TRIO_STRING_PUBLIC int trio_string_size TRIO_PROTO((trio_string_t *self)); +TRIO_STRING_PUBLIC void trio_string_terminate TRIO_PROTO((trio_string_t *self)); +TRIO_STRING_PUBLIC int trio_xstring_append_char TRIO_PROTO((trio_string_t *self, char character)); +TRIO_STRING_PUBLIC trio_string_t *trio_xstring_duplicate TRIO_PROTO((const char *other)); + +#if !defined(TRIO_MINIMAL) + +TRIO_STRING_PUBLIC trio_string_t *trio_string_create TRIO_PROTO((int initial_size)); +TRIO_STRING_PUBLIC char *trio_string_get TRIO_PROTO((trio_string_t *self, int offset)); +TRIO_STRING_PUBLIC void trio_xstring_set TRIO_PROTO((trio_string_t *self, char *buffer)); + +TRIO_STRING_PUBLIC int trio_string_append TRIO_PROTO((trio_string_t *self, trio_string_t *other)); +TRIO_STRING_PUBLIC int trio_string_contains TRIO_PROTO((trio_string_t *self, trio_string_t *other)); +TRIO_STRING_PUBLIC int trio_string_copy TRIO_PROTO((trio_string_t *self, trio_string_t *other)); +TRIO_STRING_PUBLIC trio_string_t *trio_string_duplicate TRIO_PROTO((trio_string_t *other)); +TRIO_STRING_PUBLIC int trio_string_equal TRIO_PROTO((trio_string_t *self, trio_string_t *other)); +TRIO_STRING_PUBLIC int trio_string_equal_max TRIO_PROTO((trio_string_t *self, size_t max, trio_string_t *second)); +TRIO_STRING_PUBLIC int trio_string_equal_case TRIO_PROTO((trio_string_t *self, trio_string_t *other)); +TRIO_STRING_PUBLIC int trio_string_equal_case_max TRIO_PROTO((trio_string_t *self, size_t max, trio_string_t *other)); +#if !defined(_WIN32_WCE) +TRIO_STRING_PUBLIC size_t trio_string_format_date_max TRIO_PROTO((trio_string_t *self, size_t max, const char *format, const struct tm *datetime)); +#endif +TRIO_STRING_PUBLIC char *trio_string_index TRIO_PROTO((trio_string_t *self, int character)); +TRIO_STRING_PUBLIC char *trio_string_index_last TRIO_PROTO((trio_string_t *self, int character)); +TRIO_STRING_PUBLIC int trio_string_length TRIO_PROTO((trio_string_t *self)); +TRIO_STRING_PUBLIC int trio_string_lower TRIO_PROTO((trio_string_t *self)); +TRIO_STRING_PUBLIC int trio_string_match TRIO_PROTO((trio_string_t *self, trio_string_t *other)); +TRIO_STRING_PUBLIC int trio_string_match_case TRIO_PROTO((trio_string_t *self, trio_string_t *other)); +TRIO_STRING_PUBLIC char *trio_string_substring TRIO_PROTO((trio_string_t *self, trio_string_t *other)); +TRIO_STRING_PUBLIC int trio_string_upper TRIO_PROTO((trio_string_t *self)); + +TRIO_STRING_PUBLIC int trio_xstring_append TRIO_PROTO((trio_string_t *self, const char *other)); +TRIO_STRING_PUBLIC int trio_xstring_contains TRIO_PROTO((trio_string_t *self, const char *other)); +TRIO_STRING_PUBLIC int trio_xstring_copy TRIO_PROTO((trio_string_t *self, const char *other)); +TRIO_STRING_PUBLIC int trio_xstring_equal TRIO_PROTO((trio_string_t *self, const char *other)); +TRIO_STRING_PUBLIC int trio_xstring_equal_max TRIO_PROTO((trio_string_t *self, size_t max, const char *other)); +TRIO_STRING_PUBLIC int trio_xstring_equal_case TRIO_PROTO((trio_string_t *self, const char *other)); +TRIO_STRING_PUBLIC int trio_xstring_equal_case_max TRIO_PROTO((trio_string_t *self, size_t max, const char *other)); +TRIO_STRING_PUBLIC int trio_xstring_match TRIO_PROTO((trio_string_t *self, const char *other)); +TRIO_STRING_PUBLIC int trio_xstring_match_case TRIO_PROTO((trio_string_t *self, const char *other)); +TRIO_STRING_PUBLIC char *trio_xstring_substring TRIO_PROTO((trio_string_t *self, const char *other)); + +#endif /* !defined(TRIO_MINIMAL) */ + +#endif /* TRIO_TRIOSTR_H */ diff --git a/vendors/libxml/src/uri.c b/vendors/libxml/src/uri.c new file mode 100644 index 0000000..4ab0ce2 --- /dev/null +++ b/vendors/libxml/src/uri.c @@ -0,0 +1,2564 @@ +/** + * uri.c: set of generic URI related routines + * + * Reference: RFCs 3986, 2732 and 2373 + * + * See Copyright for the status of this software. + * + * daniel@veillard.com + */ + +#define IN_LIBXML +#include "libxml.h" + +#include + +#include +#include +#include +#include + +/** + * MAX_URI_LENGTH: + * + * The definition of the URI regexp in the above RFC has no size limit + * In practice they are usually relativey short except for the + * data URI scheme as defined in RFC 2397. Even for data URI the usual + * maximum size before hitting random practical limits is around 64 KB + * and 4KB is usually a maximum admitted limit for proper operations. + * The value below is more a security limit than anything else and + * really should never be hit by 'normal' operations + * Set to 1 MByte in 2012, this is only enforced on output + */ +#define MAX_URI_LENGTH 1024 * 1024 + +static void +xmlURIErrMemory(const char *extra) +{ + if (extra) + __xmlRaiseError(NULL, NULL, NULL, + NULL, NULL, XML_FROM_URI, + XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, + extra, NULL, NULL, 0, 0, + "Memory allocation failed : %s\n", extra); + else + __xmlRaiseError(NULL, NULL, NULL, + NULL, NULL, XML_FROM_URI, + XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, + NULL, NULL, NULL, 0, 0, + "Memory allocation failed\n"); +} + +static void xmlCleanURI(xmlURIPtr uri); + +/* + * Old rule from 2396 used in legacy handling code + * alpha = lowalpha | upalpha + */ +#define IS_ALPHA(x) (IS_LOWALPHA(x) || IS_UPALPHA(x)) + + +/* + * lowalpha = "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" | + * "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" | "s" | "t" | + * "u" | "v" | "w" | "x" | "y" | "z" + */ + +#define IS_LOWALPHA(x) (((x) >= 'a') && ((x) <= 'z')) + +/* + * upalpha = "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" | + * "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | "T" | + * "U" | "V" | "W" | "X" | "Y" | "Z" + */ +#define IS_UPALPHA(x) (((x) >= 'A') && ((x) <= 'Z')) + +#ifdef IS_DIGIT +#undef IS_DIGIT +#endif +/* + * digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" + */ +#define IS_DIGIT(x) (((x) >= '0') && ((x) <= '9')) + +/* + * alphanum = alpha | digit + */ + +#define IS_ALPHANUM(x) (IS_ALPHA(x) || IS_DIGIT(x)) + +/* + * mark = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")" + */ + +#define IS_MARK(x) (((x) == '-') || ((x) == '_') || ((x) == '.') || \ + ((x) == '!') || ((x) == '~') || ((x) == '*') || ((x) == '\'') || \ + ((x) == '(') || ((x) == ')')) + +/* + * unwise = "{" | "}" | "|" | "\" | "^" | "`" + */ + +#define IS_UNWISE(p) \ + (((*(p) == '{')) || ((*(p) == '}')) || ((*(p) == '|')) || \ + ((*(p) == '\\')) || ((*(p) == '^')) || ((*(p) == '[')) || \ + ((*(p) == ']')) || ((*(p) == '`'))) +/* + * reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | "," | + * "[" | "]" + */ + +#define IS_RESERVED(x) (((x) == ';') || ((x) == '/') || ((x) == '?') || \ + ((x) == ':') || ((x) == '@') || ((x) == '&') || ((x) == '=') || \ + ((x) == '+') || ((x) == '$') || ((x) == ',') || ((x) == '[') || \ + ((x) == ']')) + +/* + * unreserved = alphanum | mark + */ + +#define IS_UNRESERVED(x) (IS_ALPHANUM(x) || IS_MARK(x)) + +/* + * Skip to next pointer char, handle escaped sequences + */ + +#define NEXT(p) ((*p == '%')? p += 3 : p++) + +/* + * Productions from the spec. + * + * authority = server | reg_name + * reg_name = 1*( unreserved | escaped | "$" | "," | + * ";" | ":" | "@" | "&" | "=" | "+" ) + * + * path = [ abs_path | opaque_part ] + */ + +#define STRNDUP(s, n) (char *) xmlStrndup((const xmlChar *)(s), (n)) + +/************************************************************************ + * * + * RFC 3986 parser * + * * + ************************************************************************/ + +#define ISA_DIGIT(p) ((*(p) >= '0') && (*(p) <= '9')) +#define ISA_ALPHA(p) (((*(p) >= 'a') && (*(p) <= 'z')) || \ + ((*(p) >= 'A') && (*(p) <= 'Z'))) +#define ISA_HEXDIG(p) \ + (ISA_DIGIT(p) || ((*(p) >= 'a') && (*(p) <= 'f')) || \ + ((*(p) >= 'A') && (*(p) <= 'F'))) + +/* + * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" + * / "*" / "+" / "," / ";" / "=" + */ +#define ISA_SUB_DELIM(p) \ + (((*(p) == '!')) || ((*(p) == '$')) || ((*(p) == '&')) || \ + ((*(p) == '(')) || ((*(p) == ')')) || ((*(p) == '*')) || \ + ((*(p) == '+')) || ((*(p) == ',')) || ((*(p) == ';')) || \ + ((*(p) == '=')) || ((*(p) == '\''))) + +/* + * gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@" + */ +#define ISA_GEN_DELIM(p) \ + (((*(p) == ':')) || ((*(p) == '/')) || ((*(p) == '?')) || \ + ((*(p) == '#')) || ((*(p) == '[')) || ((*(p) == ']')) || \ + ((*(p) == '@'))) + +/* + * reserved = gen-delims / sub-delims + */ +#define ISA_RESERVED(p) (ISA_GEN_DELIM(p) || (ISA_SUB_DELIM(p))) + +/* + * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" + */ +#define ISA_UNRESERVED(p) \ + ((ISA_ALPHA(p)) || (ISA_DIGIT(p)) || ((*(p) == '-')) || \ + ((*(p) == '.')) || ((*(p) == '_')) || ((*(p) == '~'))) + +/* + * pct-encoded = "%" HEXDIG HEXDIG + */ +#define ISA_PCT_ENCODED(p) \ + ((*(p) == '%') && (ISA_HEXDIG(p + 1)) && (ISA_HEXDIG(p + 2))) + +/* + * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" + */ +#define ISA_PCHAR(p) \ + (ISA_UNRESERVED(p) || ISA_PCT_ENCODED(p) || ISA_SUB_DELIM(p) || \ + ((*(p) == ':')) || ((*(p) == '@'))) + +/** + * xmlParse3986Scheme: + * @uri: pointer to an URI structure + * @str: pointer to the string to analyze + * + * Parse an URI scheme + * + * ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) + * + * Returns 0 or the error code + */ +static int +xmlParse3986Scheme(xmlURIPtr uri, const char **str) { + const char *cur; + + if (str == NULL) + return(-1); + + cur = *str; + if (!ISA_ALPHA(cur)) + return(2); + cur++; + while (ISA_ALPHA(cur) || ISA_DIGIT(cur) || + (*cur == '+') || (*cur == '-') || (*cur == '.')) cur++; + if (uri != NULL) { + if (uri->scheme != NULL) xmlFree(uri->scheme); + uri->scheme = STRNDUP(*str, cur - *str); + } + *str = cur; + return(0); +} + +/** + * xmlParse3986Fragment: + * @uri: pointer to an URI structure + * @str: pointer to the string to analyze + * + * Parse the query part of an URI + * + * fragment = *( pchar / "/" / "?" ) + * NOTE: the strict syntax as defined by 3986 does not allow '[' and ']' + * in the fragment identifier but this is used very broadly for + * xpointer scheme selection, so we are allowing it here to not break + * for example all the DocBook processing chains. + * + * Returns 0 or the error code + */ +static int +xmlParse3986Fragment(xmlURIPtr uri, const char **str) +{ + const char *cur; + + if (str == NULL) + return (-1); + + cur = *str; + + while ((ISA_PCHAR(cur)) || (*cur == '/') || (*cur == '?') || + (*cur == '[') || (*cur == ']') || + ((uri != NULL) && (uri->cleanup & 1) && (IS_UNWISE(cur)))) + NEXT(cur); + if (uri != NULL) { + if (uri->fragment != NULL) + xmlFree(uri->fragment); + if (uri->cleanup & 2) + uri->fragment = STRNDUP(*str, cur - *str); + else + uri->fragment = xmlURIUnescapeString(*str, cur - *str, NULL); + } + *str = cur; + return (0); +} + +/** + * xmlParse3986Query: + * @uri: pointer to an URI structure + * @str: pointer to the string to analyze + * + * Parse the query part of an URI + * + * query = *uric + * + * Returns 0 or the error code + */ +static int +xmlParse3986Query(xmlURIPtr uri, const char **str) +{ + const char *cur; + + if (str == NULL) + return (-1); + + cur = *str; + + while ((ISA_PCHAR(cur)) || (*cur == '/') || (*cur == '?') || + ((uri != NULL) && (uri->cleanup & 1) && (IS_UNWISE(cur)))) + NEXT(cur); + if (uri != NULL) { + if (uri->query != NULL) + xmlFree(uri->query); + if (uri->cleanup & 2) + uri->query = STRNDUP(*str, cur - *str); + else + uri->query = xmlURIUnescapeString(*str, cur - *str, NULL); + + /* Save the raw bytes of the query as well. + * See: http://mail.gnome.org/archives/xml/2007-April/thread.html#00114 + */ + if (uri->query_raw != NULL) + xmlFree (uri->query_raw); + uri->query_raw = STRNDUP (*str, cur - *str); + } + *str = cur; + return (0); +} + +/** + * xmlParse3986Port: + * @uri: pointer to an URI structure + * @str: the string to analyze + * + * Parse a port part and fills in the appropriate fields + * of the @uri structure + * + * port = *DIGIT + * + * Returns 0 or the error code + */ +static int +xmlParse3986Port(xmlURIPtr uri, const char **str) +{ + const char *cur = *str; + + if (ISA_DIGIT(cur)) { + if (uri != NULL) + uri->port = 0; + while (ISA_DIGIT(cur)) { + if (uri != NULL) + uri->port = uri->port * 10 + (*cur - '0'); + cur++; + } + *str = cur; + return(0); + } + return(1); +} + +/** + * xmlParse3986Userinfo: + * @uri: pointer to an URI structure + * @str: the string to analyze + * + * Parse an user informations part and fills in the appropriate fields + * of the @uri structure + * + * userinfo = *( unreserved / pct-encoded / sub-delims / ":" ) + * + * Returns 0 or the error code + */ +static int +xmlParse3986Userinfo(xmlURIPtr uri, const char **str) +{ + const char *cur; + + cur = *str; + while (ISA_UNRESERVED(cur) || ISA_PCT_ENCODED(cur) || + ISA_SUB_DELIM(cur) || (*cur == ':')) + NEXT(cur); + if (*cur == '@') { + if (uri != NULL) { + if (uri->user != NULL) xmlFree(uri->user); + if (uri->cleanup & 2) + uri->user = STRNDUP(*str, cur - *str); + else + uri->user = xmlURIUnescapeString(*str, cur - *str, NULL); + } + *str = cur; + return(0); + } + return(1); +} + +/** + * xmlParse3986DecOctet: + * @str: the string to analyze + * + * dec-octet = DIGIT ; 0-9 + * / %x31-39 DIGIT ; 10-99 + * / "1" 2DIGIT ; 100-199 + * / "2" %x30-34 DIGIT ; 200-249 + * / "25" %x30-35 ; 250-255 + * + * Skip a dec-octet. + * + * Returns 0 if found and skipped, 1 otherwise + */ +static int +xmlParse3986DecOctet(const char **str) { + const char *cur = *str; + + if (!(ISA_DIGIT(cur))) + return(1); + if (!ISA_DIGIT(cur+1)) + cur++; + else if ((*cur != '0') && (ISA_DIGIT(cur + 1)) && (!ISA_DIGIT(cur+2))) + cur += 2; + else if ((*cur == '1') && (ISA_DIGIT(cur + 1)) && (ISA_DIGIT(cur + 2))) + cur += 3; + else if ((*cur == '2') && (*(cur + 1) >= '0') && + (*(cur + 1) <= '4') && (ISA_DIGIT(cur + 2))) + cur += 3; + else if ((*cur == '2') && (*(cur + 1) == '5') && + (*(cur + 2) >= '0') && (*(cur + 1) <= '5')) + cur += 3; + else + return(1); + *str = cur; + return(0); +} +/** + * xmlParse3986Host: + * @uri: pointer to an URI structure + * @str: the string to analyze + * + * Parse an host part and fills in the appropriate fields + * of the @uri structure + * + * host = IP-literal / IPv4address / reg-name + * IP-literal = "[" ( IPv6address / IPvFuture ) "]" + * IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet + * reg-name = *( unreserved / pct-encoded / sub-delims ) + * + * Returns 0 or the error code + */ +static int +xmlParse3986Host(xmlURIPtr uri, const char **str) +{ + const char *cur = *str; + const char *host; + + host = cur; + /* + * IPv6 and future adressing scheme are enclosed between brackets + */ + if (*cur == '[') { + cur++; + while ((*cur != ']') && (*cur != 0)) + cur++; + if (*cur != ']') + return(1); + cur++; + goto found; + } + /* + * try to parse an IPv4 + */ + if (ISA_DIGIT(cur)) { + if (xmlParse3986DecOctet(&cur) != 0) + goto not_ipv4; + if (*cur != '.') + goto not_ipv4; + cur++; + if (xmlParse3986DecOctet(&cur) != 0) + goto not_ipv4; + if (*cur != '.') + goto not_ipv4; + if (xmlParse3986DecOctet(&cur) != 0) + goto not_ipv4; + if (*cur != '.') + goto not_ipv4; + if (xmlParse3986DecOctet(&cur) != 0) + goto not_ipv4; + goto found; +not_ipv4: + cur = *str; + } + /* + * then this should be a hostname which can be empty + */ + while (ISA_UNRESERVED(cur) || ISA_PCT_ENCODED(cur) || ISA_SUB_DELIM(cur)) + NEXT(cur); +found: + if (uri != NULL) { + if (uri->authority != NULL) xmlFree(uri->authority); + uri->authority = NULL; + if (uri->server != NULL) xmlFree(uri->server); + if (cur != host) { + if (uri->cleanup & 2) + uri->server = STRNDUP(host, cur - host); + else + uri->server = xmlURIUnescapeString(host, cur - host, NULL); + } else + uri->server = NULL; + } + *str = cur; + return(0); +} + +/** + * xmlParse3986Authority: + * @uri: pointer to an URI structure + * @str: the string to analyze + * + * Parse an authority part and fills in the appropriate fields + * of the @uri structure + * + * authority = [ userinfo "@" ] host [ ":" port ] + * + * Returns 0 or the error code + */ +static int +xmlParse3986Authority(xmlURIPtr uri, const char **str) +{ + const char *cur; + int ret; + + cur = *str; + /* + * try to parse an userinfo and check for the trailing @ + */ + ret = xmlParse3986Userinfo(uri, &cur); + if ((ret != 0) || (*cur != '@')) + cur = *str; + else + cur++; + ret = xmlParse3986Host(uri, &cur); + if (ret != 0) return(ret); + if (*cur == ':') { + cur++; + ret = xmlParse3986Port(uri, &cur); + if (ret != 0) return(ret); + } + *str = cur; + return(0); +} + +/** + * xmlParse3986Segment: + * @str: the string to analyze + * @forbid: an optional forbidden character + * @empty: allow an empty segment + * + * Parse a segment and fills in the appropriate fields + * of the @uri structure + * + * segment = *pchar + * segment-nz = 1*pchar + * segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" ) + * ; non-zero-length segment without any colon ":" + * + * Returns 0 or the error code + */ +static int +xmlParse3986Segment(const char **str, char forbid, int empty) +{ + const char *cur; + + cur = *str; + if (!ISA_PCHAR(cur)) { + if (empty) + return(0); + return(1); + } + while (ISA_PCHAR(cur) && (*cur != forbid)) + NEXT(cur); + *str = cur; + return (0); +} + +/** + * xmlParse3986PathAbEmpty: + * @uri: pointer to an URI structure + * @str: the string to analyze + * + * Parse an path absolute or empty and fills in the appropriate fields + * of the @uri structure + * + * path-abempty = *( "/" segment ) + * + * Returns 0 or the error code + */ +static int +xmlParse3986PathAbEmpty(xmlURIPtr uri, const char **str) +{ + const char *cur; + int ret; + + cur = *str; + + while (*cur == '/') { + cur++; + ret = xmlParse3986Segment(&cur, 0, 1); + if (ret != 0) return(ret); + } + if (uri != NULL) { + if (uri->path != NULL) xmlFree(uri->path); + if (*str != cur) { + if (uri->cleanup & 2) + uri->path = STRNDUP(*str, cur - *str); + else + uri->path = xmlURIUnescapeString(*str, cur - *str, NULL); + } else { + uri->path = NULL; + } + } + *str = cur; + return (0); +} + +/** + * xmlParse3986PathAbsolute: + * @uri: pointer to an URI structure + * @str: the string to analyze + * + * Parse an path absolute and fills in the appropriate fields + * of the @uri structure + * + * path-absolute = "/" [ segment-nz *( "/" segment ) ] + * + * Returns 0 or the error code + */ +static int +xmlParse3986PathAbsolute(xmlURIPtr uri, const char **str) +{ + const char *cur; + int ret; + + cur = *str; + + if (*cur != '/') + return(1); + cur++; + ret = xmlParse3986Segment(&cur, 0, 0); + if (ret == 0) { + while (*cur == '/') { + cur++; + ret = xmlParse3986Segment(&cur, 0, 1); + if (ret != 0) return(ret); + } + } + if (uri != NULL) { + if (uri->path != NULL) xmlFree(uri->path); + if (cur != *str) { + if (uri->cleanup & 2) + uri->path = STRNDUP(*str, cur - *str); + else + uri->path = xmlURIUnescapeString(*str, cur - *str, NULL); + } else { + uri->path = NULL; + } + } + *str = cur; + return (0); +} + +/** + * xmlParse3986PathRootless: + * @uri: pointer to an URI structure + * @str: the string to analyze + * + * Parse an path without root and fills in the appropriate fields + * of the @uri structure + * + * path-rootless = segment-nz *( "/" segment ) + * + * Returns 0 or the error code + */ +static int +xmlParse3986PathRootless(xmlURIPtr uri, const char **str) +{ + const char *cur; + int ret; + + cur = *str; + + ret = xmlParse3986Segment(&cur, 0, 0); + if (ret != 0) return(ret); + while (*cur == '/') { + cur++; + ret = xmlParse3986Segment(&cur, 0, 1); + if (ret != 0) return(ret); + } + if (uri != NULL) { + if (uri->path != NULL) xmlFree(uri->path); + if (cur != *str) { + if (uri->cleanup & 2) + uri->path = STRNDUP(*str, cur - *str); + else + uri->path = xmlURIUnescapeString(*str, cur - *str, NULL); + } else { + uri->path = NULL; + } + } + *str = cur; + return (0); +} + +/** + * xmlParse3986PathNoScheme: + * @uri: pointer to an URI structure + * @str: the string to analyze + * + * Parse an path which is not a scheme and fills in the appropriate fields + * of the @uri structure + * + * path-noscheme = segment-nz-nc *( "/" segment ) + * + * Returns 0 or the error code + */ +static int +xmlParse3986PathNoScheme(xmlURIPtr uri, const char **str) +{ + const char *cur; + int ret; + + cur = *str; + + ret = xmlParse3986Segment(&cur, ':', 0); + if (ret != 0) return(ret); + while (*cur == '/') { + cur++; + ret = xmlParse3986Segment(&cur, 0, 1); + if (ret != 0) return(ret); + } + if (uri != NULL) { + if (uri->path != NULL) xmlFree(uri->path); + if (cur != *str) { + if (uri->cleanup & 2) + uri->path = STRNDUP(*str, cur - *str); + else + uri->path = xmlURIUnescapeString(*str, cur - *str, NULL); + } else { + uri->path = NULL; + } + } + *str = cur; + return (0); +} + +/** + * xmlParse3986HierPart: + * @uri: pointer to an URI structure + * @str: the string to analyze + * + * Parse an hierarchical part and fills in the appropriate fields + * of the @uri structure + * + * hier-part = "//" authority path-abempty + * / path-absolute + * / path-rootless + * / path-empty + * + * Returns 0 or the error code + */ +static int +xmlParse3986HierPart(xmlURIPtr uri, const char **str) +{ + const char *cur; + int ret; + + cur = *str; + + if ((*cur == '/') && (*(cur + 1) == '/')) { + cur += 2; + ret = xmlParse3986Authority(uri, &cur); + if (ret != 0) return(ret); + ret = xmlParse3986PathAbEmpty(uri, &cur); + if (ret != 0) return(ret); + *str = cur; + return(0); + } else if (*cur == '/') { + ret = xmlParse3986PathAbsolute(uri, &cur); + if (ret != 0) return(ret); + } else if (ISA_PCHAR(cur)) { + ret = xmlParse3986PathRootless(uri, &cur); + if (ret != 0) return(ret); + } else { + /* path-empty is effectively empty */ + if (uri != NULL) { + if (uri->path != NULL) xmlFree(uri->path); + uri->path = NULL; + } + } + *str = cur; + return (0); +} + +/** + * xmlParse3986RelativeRef: + * @uri: pointer to an URI structure + * @str: the string to analyze + * + * Parse an URI string and fills in the appropriate fields + * of the @uri structure + * + * relative-ref = relative-part [ "?" query ] [ "#" fragment ] + * relative-part = "//" authority path-abempty + * / path-absolute + * / path-noscheme + * / path-empty + * + * Returns 0 or the error code + */ +static int +xmlParse3986RelativeRef(xmlURIPtr uri, const char *str) { + int ret; + + if ((*str == '/') && (*(str + 1) == '/')) { + str += 2; + ret = xmlParse3986Authority(uri, &str); + if (ret != 0) return(ret); + ret = xmlParse3986PathAbEmpty(uri, &str); + if (ret != 0) return(ret); + } else if (*str == '/') { + ret = xmlParse3986PathAbsolute(uri, &str); + if (ret != 0) return(ret); + } else if (ISA_PCHAR(str)) { + ret = xmlParse3986PathNoScheme(uri, &str); + if (ret != 0) return(ret); + } else { + /* path-empty is effectively empty */ + if (uri != NULL) { + if (uri->path != NULL) xmlFree(uri->path); + uri->path = NULL; + } + } + + if (*str == '?') { + str++; + ret = xmlParse3986Query(uri, &str); + if (ret != 0) return(ret); + } + if (*str == '#') { + str++; + ret = xmlParse3986Fragment(uri, &str); + if (ret != 0) return(ret); + } + if (*str != 0) { + xmlCleanURI(uri); + return(1); + } + return(0); +} + + +/** + * xmlParse3986URI: + * @uri: pointer to an URI structure + * @str: the string to analyze + * + * Parse an URI string and fills in the appropriate fields + * of the @uri structure + * + * scheme ":" hier-part [ "?" query ] [ "#" fragment ] + * + * Returns 0 or the error code + */ +static int +xmlParse3986URI(xmlURIPtr uri, const char *str) { + int ret; + + ret = xmlParse3986Scheme(uri, &str); + if (ret != 0) return(ret); + if (*str != ':') { + return(1); + } + str++; + ret = xmlParse3986HierPart(uri, &str); + if (ret != 0) return(ret); + if (*str == '?') { + str++; + ret = xmlParse3986Query(uri, &str); + if (ret != 0) return(ret); + } + if (*str == '#') { + str++; + ret = xmlParse3986Fragment(uri, &str); + if (ret != 0) return(ret); + } + if (*str != 0) { + xmlCleanURI(uri); + return(1); + } + return(0); +} + +/** + * xmlParse3986URIReference: + * @uri: pointer to an URI structure + * @str: the string to analyze + * + * Parse an URI reference string and fills in the appropriate fields + * of the @uri structure + * + * URI-reference = URI / relative-ref + * + * Returns 0 or the error code + */ +static int +xmlParse3986URIReference(xmlURIPtr uri, const char *str) { + int ret; + + if (str == NULL) + return(-1); + xmlCleanURI(uri); + + /* + * Try first to parse absolute refs, then fallback to relative if + * it fails. + */ + ret = xmlParse3986URI(uri, str); + if (ret != 0) { + xmlCleanURI(uri); + ret = xmlParse3986RelativeRef(uri, str); + if (ret != 0) { + xmlCleanURI(uri); + return(ret); + } + } + return(0); +} + +/** + * xmlParseURI: + * @str: the URI string to analyze + * + * Parse an URI based on RFC 3986 + * + * URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ] + * + * Returns a newly built xmlURIPtr or NULL in case of error + */ +xmlURIPtr +xmlParseURI(const char *str) { + xmlURIPtr uri; + int ret; + + if (str == NULL) + return(NULL); + uri = xmlCreateURI(); + if (uri != NULL) { + ret = xmlParse3986URIReference(uri, str); + if (ret) { + xmlFreeURI(uri); + return(NULL); + } + } + return(uri); +} + +/** + * xmlParseURIReference: + * @uri: pointer to an URI structure + * @str: the string to analyze + * + * Parse an URI reference string based on RFC 3986 and fills in the + * appropriate fields of the @uri structure + * + * URI-reference = URI / relative-ref + * + * Returns 0 or the error code + */ +int +xmlParseURIReference(xmlURIPtr uri, const char *str) { + return(xmlParse3986URIReference(uri, str)); +} + +/** + * xmlParseURIRaw: + * @str: the URI string to analyze + * @raw: if 1 unescaping of URI pieces are disabled + * + * Parse an URI but allows to keep intact the original fragments. + * + * URI-reference = URI / relative-ref + * + * Returns a newly built xmlURIPtr or NULL in case of error + */ +xmlURIPtr +xmlParseURIRaw(const char *str, int raw) { + xmlURIPtr uri; + int ret; + + if (str == NULL) + return(NULL); + uri = xmlCreateURI(); + if (uri != NULL) { + if (raw) { + uri->cleanup |= 2; + } + ret = xmlParseURIReference(uri, str); + if (ret) { + xmlFreeURI(uri); + return(NULL); + } + } + return(uri); +} + +/************************************************************************ + * * + * Generic URI structure functions * + * * + ************************************************************************/ + +/** + * xmlCreateURI: + * + * Simply creates an empty xmlURI + * + * Returns the new structure or NULL in case of error + */ +xmlURIPtr +xmlCreateURI(void) { + xmlURIPtr ret; + + ret = (xmlURIPtr) xmlMalloc(sizeof(xmlURI)); + if (ret == NULL) { + xmlURIErrMemory("creating URI structure\n"); + return(NULL); + } + memset(ret, 0, sizeof(xmlURI)); + return(ret); +} + +/** + * xmlSaveUriRealloc: + * + * Function to handle properly a reallocation when saving an URI + * Also imposes some limit on the length of an URI string output + */ +static xmlChar * +xmlSaveUriRealloc(xmlChar *ret, int *max) { + xmlChar *temp; + int tmp; + + if (*max > MAX_URI_LENGTH) { + xmlURIErrMemory("reaching arbitrary MAX_URI_LENGTH limit\n"); + return(NULL); + } + tmp = *max * 2; + temp = (xmlChar *) xmlRealloc(ret, (tmp + 1)); + if (temp == NULL) { + xmlURIErrMemory("saving URI\n"); + return(NULL); + } + *max = tmp; + return(temp); +} + +/** + * xmlSaveUri: + * @uri: pointer to an xmlURI + * + * Save the URI as an escaped string + * + * Returns a new string (to be deallocated by caller) + */ +xmlChar * +xmlSaveUri(xmlURIPtr uri) { + xmlChar *ret = NULL; + xmlChar *temp; + const char *p; + int len; + int max; + + if (uri == NULL) return(NULL); + + + max = 80; + ret = (xmlChar *) xmlMallocAtomic((max + 1) * sizeof(xmlChar)); + if (ret == NULL) { + xmlURIErrMemory("saving URI\n"); + return(NULL); + } + len = 0; + + if (uri->scheme != NULL) { + p = uri->scheme; + while (*p != 0) { + if (len >= max) { + temp = xmlSaveUriRealloc(ret, &max); + if (temp == NULL) goto mem_error; + ret = temp; + } + ret[len++] = *p++; + } + if (len >= max) { + temp = xmlSaveUriRealloc(ret, &max); + if (temp == NULL) goto mem_error; + ret = temp; + } + ret[len++] = ':'; + } + if (uri->opaque != NULL) { + p = uri->opaque; + while (*p != 0) { + if (len + 3 >= max) { + temp = xmlSaveUriRealloc(ret, &max); + if (temp == NULL) goto mem_error; + ret = temp; + } + if (IS_RESERVED(*(p)) || IS_UNRESERVED(*(p))) + ret[len++] = *p++; + else { + int val = *(unsigned char *)p++; + int hi = val / 0x10, lo = val % 0x10; + ret[len++] = '%'; + ret[len++] = hi + (hi > 9? 'A'-10 : '0'); + ret[len++] = lo + (lo > 9? 'A'-10 : '0'); + } + } + } else { + if (uri->server != NULL) { + if (len + 3 >= max) { + temp = xmlSaveUriRealloc(ret, &max); + if (temp == NULL) goto mem_error; + ret = temp; + } + ret[len++] = '/'; + ret[len++] = '/'; + if (uri->user != NULL) { + p = uri->user; + while (*p != 0) { + if (len + 3 >= max) { + temp = xmlSaveUriRealloc(ret, &max); + if (temp == NULL) goto mem_error; + ret = temp; + } + if ((IS_UNRESERVED(*(p))) || + ((*(p) == ';')) || ((*(p) == ':')) || + ((*(p) == '&')) || ((*(p) == '=')) || + ((*(p) == '+')) || ((*(p) == '$')) || + ((*(p) == ','))) + ret[len++] = *p++; + else { + int val = *(unsigned char *)p++; + int hi = val / 0x10, lo = val % 0x10; + ret[len++] = '%'; + ret[len++] = hi + (hi > 9? 'A'-10 : '0'); + ret[len++] = lo + (lo > 9? 'A'-10 : '0'); + } + } + if (len + 3 >= max) { + temp = xmlSaveUriRealloc(ret, &max); + if (temp == NULL) goto mem_error; + ret = temp; + } + ret[len++] = '@'; + } + p = uri->server; + while (*p != 0) { + if (len >= max) { + temp = xmlSaveUriRealloc(ret, &max); + if (temp == NULL) goto mem_error; + ret = temp; + } + ret[len++] = *p++; + } + if (uri->port > 0) { + if (len + 10 >= max) { + temp = xmlSaveUriRealloc(ret, &max); + if (temp == NULL) goto mem_error; + ret = temp; + } + len += snprintf((char *) &ret[len], max - len, ":%d", uri->port); + } + } else if (uri->authority != NULL) { + if (len + 3 >= max) { + temp = xmlSaveUriRealloc(ret, &max); + if (temp == NULL) goto mem_error; + ret = temp; + } + ret[len++] = '/'; + ret[len++] = '/'; + p = uri->authority; + while (*p != 0) { + if (len + 3 >= max) { + temp = xmlSaveUriRealloc(ret, &max); + if (temp == NULL) goto mem_error; + ret = temp; + } + if ((IS_UNRESERVED(*(p))) || + ((*(p) == '$')) || ((*(p) == ',')) || ((*(p) == ';')) || + ((*(p) == ':')) || ((*(p) == '@')) || ((*(p) == '&')) || + ((*(p) == '=')) || ((*(p) == '+'))) + ret[len++] = *p++; + else { + int val = *(unsigned char *)p++; + int hi = val / 0x10, lo = val % 0x10; + ret[len++] = '%'; + ret[len++] = hi + (hi > 9? 'A'-10 : '0'); + ret[len++] = lo + (lo > 9? 'A'-10 : '0'); + } + } + } else if (uri->scheme != NULL) { + if (len + 3 >= max) { + temp = xmlSaveUriRealloc(ret, &max); + if (temp == NULL) goto mem_error; + ret = temp; + } + ret[len++] = '/'; + ret[len++] = '/'; + } + if (uri->path != NULL) { + p = uri->path; + /* + * the colon in file:///d: should not be escaped or + * Windows accesses fail later. + */ + if ((uri->scheme != NULL) && + (p[0] == '/') && + (((p[1] >= 'a') && (p[1] <= 'z')) || + ((p[1] >= 'A') && (p[1] <= 'Z'))) && + (p[2] == ':') && + (xmlStrEqual(BAD_CAST uri->scheme, BAD_CAST "file"))) { + if (len + 3 >= max) { + temp = xmlSaveUriRealloc(ret, &max); + if (temp == NULL) goto mem_error; + ret = temp; + } + ret[len++] = *p++; + ret[len++] = *p++; + ret[len++] = *p++; + } + while (*p != 0) { + if (len + 3 >= max) { + temp = xmlSaveUriRealloc(ret, &max); + if (temp == NULL) goto mem_error; + ret = temp; + } + if ((IS_UNRESERVED(*(p))) || ((*(p) == '/')) || + ((*(p) == ';')) || ((*(p) == '@')) || ((*(p) == '&')) || + ((*(p) == '=')) || ((*(p) == '+')) || ((*(p) == '$')) || + ((*(p) == ','))) + ret[len++] = *p++; + else { + int val = *(unsigned char *)p++; + int hi = val / 0x10, lo = val % 0x10; + ret[len++] = '%'; + ret[len++] = hi + (hi > 9? 'A'-10 : '0'); + ret[len++] = lo + (lo > 9? 'A'-10 : '0'); + } + } + } + if (uri->query_raw != NULL) { + if (len + 1 >= max) { + temp = xmlSaveUriRealloc(ret, &max); + if (temp == NULL) goto mem_error; + ret = temp; + } + ret[len++] = '?'; + p = uri->query_raw; + while (*p != 0) { + if (len + 1 >= max) { + temp = xmlSaveUriRealloc(ret, &max); + if (temp == NULL) goto mem_error; + ret = temp; + } + ret[len++] = *p++; + } + } else if (uri->query != NULL) { + if (len + 3 >= max) { + temp = xmlSaveUriRealloc(ret, &max); + if (temp == NULL) goto mem_error; + ret = temp; + } + ret[len++] = '?'; + p = uri->query; + while (*p != 0) { + if (len + 3 >= max) { + temp = xmlSaveUriRealloc(ret, &max); + if (temp == NULL) goto mem_error; + ret = temp; + } + if ((IS_UNRESERVED(*(p))) || (IS_RESERVED(*(p)))) + ret[len++] = *p++; + else { + int val = *(unsigned char *)p++; + int hi = val / 0x10, lo = val % 0x10; + ret[len++] = '%'; + ret[len++] = hi + (hi > 9? 'A'-10 : '0'); + ret[len++] = lo + (lo > 9? 'A'-10 : '0'); + } + } + } + } + if (uri->fragment != NULL) { + if (len + 3 >= max) { + temp = xmlSaveUriRealloc(ret, &max); + if (temp == NULL) goto mem_error; + ret = temp; + } + ret[len++] = '#'; + p = uri->fragment; + while (*p != 0) { + if (len + 3 >= max) { + temp = xmlSaveUriRealloc(ret, &max); + if (temp == NULL) goto mem_error; + ret = temp; + } + if ((IS_UNRESERVED(*(p))) || (IS_RESERVED(*(p)))) + ret[len++] = *p++; + else { + int val = *(unsigned char *)p++; + int hi = val / 0x10, lo = val % 0x10; + ret[len++] = '%'; + ret[len++] = hi + (hi > 9? 'A'-10 : '0'); + ret[len++] = lo + (lo > 9? 'A'-10 : '0'); + } + } + } + if (len >= max) { + temp = xmlSaveUriRealloc(ret, &max); + if (temp == NULL) goto mem_error; + ret = temp; + } + ret[len] = 0; + return(ret); + +mem_error: + xmlFree(ret); + return(NULL); +} + +/** + * xmlPrintURI: + * @stream: a FILE* for the output + * @uri: pointer to an xmlURI + * + * Prints the URI in the stream @stream. + */ +void +xmlPrintURI(FILE *stream, xmlURIPtr uri) { + xmlChar *out; + + out = xmlSaveUri(uri); + if (out != NULL) { + fprintf(stream, "%s", (char *) out); + xmlFree(out); + } +} + +/** + * xmlCleanURI: + * @uri: pointer to an xmlURI + * + * Make sure the xmlURI struct is free of content + */ +static void +xmlCleanURI(xmlURIPtr uri) { + if (uri == NULL) return; + + if (uri->scheme != NULL) xmlFree(uri->scheme); + uri->scheme = NULL; + if (uri->server != NULL) xmlFree(uri->server); + uri->server = NULL; + if (uri->user != NULL) xmlFree(uri->user); + uri->user = NULL; + if (uri->path != NULL) xmlFree(uri->path); + uri->path = NULL; + if (uri->fragment != NULL) xmlFree(uri->fragment); + uri->fragment = NULL; + if (uri->opaque != NULL) xmlFree(uri->opaque); + uri->opaque = NULL; + if (uri->authority != NULL) xmlFree(uri->authority); + uri->authority = NULL; + if (uri->query != NULL) xmlFree(uri->query); + uri->query = NULL; + if (uri->query_raw != NULL) xmlFree(uri->query_raw); + uri->query_raw = NULL; +} + +/** + * xmlFreeURI: + * @uri: pointer to an xmlURI + * + * Free up the xmlURI struct + */ +void +xmlFreeURI(xmlURIPtr uri) { + if (uri == NULL) return; + + if (uri->scheme != NULL) xmlFree(uri->scheme); + if (uri->server != NULL) xmlFree(uri->server); + if (uri->user != NULL) xmlFree(uri->user); + if (uri->path != NULL) xmlFree(uri->path); + if (uri->fragment != NULL) xmlFree(uri->fragment); + if (uri->opaque != NULL) xmlFree(uri->opaque); + if (uri->authority != NULL) xmlFree(uri->authority); + if (uri->query != NULL) xmlFree(uri->query); + if (uri->query_raw != NULL) xmlFree(uri->query_raw); + xmlFree(uri); +} + +/************************************************************************ + * * + * Helper functions * + * * + ************************************************************************/ + +/** + * xmlNormalizeURIPath: + * @path: pointer to the path string + * + * Applies the 5 normalization steps to a path string--that is, RFC 2396 + * Section 5.2, steps 6.c through 6.g. + * + * Normalization occurs directly on the string, no new allocation is done + * + * Returns 0 or an error code + */ +int +xmlNormalizeURIPath(char *path) { + char *cur, *out; + + if (path == NULL) + return(-1); + + /* Skip all initial "/" chars. We want to get to the beginning of the + * first non-empty segment. + */ + cur = path; + while (cur[0] == '/') + ++cur; + if (cur[0] == '\0') + return(0); + + /* Keep everything we've seen so far. */ + out = cur; + + /* + * Analyze each segment in sequence for cases (c) and (d). + */ + while (cur[0] != '\0') { + /* + * c) All occurrences of "./", where "." is a complete path segment, + * are removed from the buffer string. + */ + if ((cur[0] == '.') && (cur[1] == '/')) { + cur += 2; + /* '//' normalization should be done at this point too */ + while (cur[0] == '/') + cur++; + continue; + } + + /* + * d) If the buffer string ends with "." as a complete path segment, + * that "." is removed. + */ + if ((cur[0] == '.') && (cur[1] == '\0')) + break; + + /* Otherwise keep the segment. */ + while (cur[0] != '/') { + if (cur[0] == '\0') + goto done_cd; + (out++)[0] = (cur++)[0]; + } + /* nomalize // */ + while ((cur[0] == '/') && (cur[1] == '/')) + cur++; + + (out++)[0] = (cur++)[0]; + } + done_cd: + out[0] = '\0'; + + /* Reset to the beginning of the first segment for the next sequence. */ + cur = path; + while (cur[0] == '/') + ++cur; + if (cur[0] == '\0') + return(0); + + /* + * Analyze each segment in sequence for cases (e) and (f). + * + * e) All occurrences of "/../", where is a + * complete path segment not equal to "..", are removed from the + * buffer string. Removal of these path segments is performed + * iteratively, removing the leftmost matching pattern on each + * iteration, until no matching pattern remains. + * + * f) If the buffer string ends with "/..", where + * is a complete path segment not equal to "..", that + * "/.." is removed. + * + * To satisfy the "iterative" clause in (e), we need to collapse the + * string every time we find something that needs to be removed. Thus, + * we don't need to keep two pointers into the string: we only need a + * "current position" pointer. + */ + while (1) { + char *segp, *tmp; + + /* At the beginning of each iteration of this loop, "cur" points to + * the first character of the segment we want to examine. + */ + + /* Find the end of the current segment. */ + segp = cur; + while ((segp[0] != '/') && (segp[0] != '\0')) + ++segp; + + /* If this is the last segment, we're done (we need at least two + * segments to meet the criteria for the (e) and (f) cases). + */ + if (segp[0] == '\0') + break; + + /* If the first segment is "..", or if the next segment _isn't_ "..", + * keep this segment and try the next one. + */ + ++segp; + if (((cur[0] == '.') && (cur[1] == '.') && (segp == cur+3)) + || ((segp[0] != '.') || (segp[1] != '.') + || ((segp[2] != '/') && (segp[2] != '\0')))) { + cur = segp; + continue; + } + + /* If we get here, remove this segment and the next one and back up + * to the previous segment (if there is one), to implement the + * "iteratively" clause. It's pretty much impossible to back up + * while maintaining two pointers into the buffer, so just compact + * the whole buffer now. + */ + + /* If this is the end of the buffer, we're done. */ + if (segp[2] == '\0') { + cur[0] = '\0'; + break; + } + /* Valgrind complained, strcpy(cur, segp + 3); */ + /* string will overlap, do not use strcpy */ + tmp = cur; + segp += 3; + while ((*tmp++ = *segp++) != 0) + ; + + /* If there are no previous segments, then keep going from here. */ + segp = cur; + while ((segp > path) && ((--segp)[0] == '/')) + ; + if (segp == path) + continue; + + /* "segp" is pointing to the end of a previous segment; find it's + * start. We need to back up to the previous segment and start + * over with that to handle things like "foo/bar/../..". If we + * don't do this, then on the first pass we'll remove the "bar/..", + * but be pointing at the second ".." so we won't realize we can also + * remove the "foo/..". + */ + cur = segp; + while ((cur > path) && (cur[-1] != '/')) + --cur; + } + out[0] = '\0'; + + /* + * g) If the resulting buffer string still begins with one or more + * complete path segments of "..", then the reference is + * considered to be in error. Implementations may handle this + * error by retaining these components in the resolved path (i.e., + * treating them as part of the final URI), by removing them from + * the resolved path (i.e., discarding relative levels above the + * root), or by avoiding traversal of the reference. + * + * We discard them from the final path. + */ + if (path[0] == '/') { + cur = path; + while ((cur[0] == '/') && (cur[1] == '.') && (cur[2] == '.') + && ((cur[3] == '/') || (cur[3] == '\0'))) + cur += 3; + + if (cur != path) { + out = path; + while (cur[0] != '\0') + (out++)[0] = (cur++)[0]; + out[0] = 0; + } + } + + return(0); +} + +static int is_hex(char c) { + if (((c >= '0') && (c <= '9')) || + ((c >= 'a') && (c <= 'f')) || + ((c >= 'A') && (c <= 'F'))) + return(1); + return(0); +} + +/** + * xmlURIUnescapeString: + * @str: the string to unescape + * @len: the length in bytes to unescape (or <= 0 to indicate full string) + * @target: optional destination buffer + * + * Unescaping routine, but does not check that the string is an URI. The + * output is a direct unsigned char translation of %XX values (no encoding) + * Note that the length of the result can only be smaller or same size as + * the input string. + * + * Returns a copy of the string, but unescaped, will return NULL only in case + * of error + */ +char * +xmlURIUnescapeString(const char *str, int len, char *target) { + char *ret, *out; + const char *in; + + if (str == NULL) + return(NULL); + if (len <= 0) len = strlen(str); + if (len < 0) return(NULL); + + if (target == NULL) { + ret = (char *) xmlMallocAtomic(len + 1); + if (ret == NULL) { + xmlURIErrMemory("unescaping URI value\n"); + return(NULL); + } + } else + ret = target; + in = str; + out = ret; + while(len > 0) { + if ((len > 2) && (*in == '%') && (is_hex(in[1])) && (is_hex(in[2]))) { + in++; + if ((*in >= '0') && (*in <= '9')) + *out = (*in - '0'); + else if ((*in >= 'a') && (*in <= 'f')) + *out = (*in - 'a') + 10; + else if ((*in >= 'A') && (*in <= 'F')) + *out = (*in - 'A') + 10; + in++; + if ((*in >= '0') && (*in <= '9')) + *out = *out * 16 + (*in - '0'); + else if ((*in >= 'a') && (*in <= 'f')) + *out = *out * 16 + (*in - 'a') + 10; + else if ((*in >= 'A') && (*in <= 'F')) + *out = *out * 16 + (*in - 'A') + 10; + in++; + len -= 3; + out++; + } else { + *out++ = *in++; + len--; + } + } + *out = 0; + return(ret); +} + +/** + * xmlURIEscapeStr: + * @str: string to escape + * @list: exception list string of chars not to escape + * + * This routine escapes a string to hex, ignoring reserved characters (a-z) + * and the characters in the exception list. + * + * Returns a new escaped string or NULL in case of error. + */ +xmlChar * +xmlURIEscapeStr(const xmlChar *str, const xmlChar *list) { + xmlChar *ret, ch; + xmlChar *temp; + const xmlChar *in; + int len, out; + + if (str == NULL) + return(NULL); + if (str[0] == 0) + return(xmlStrdup(str)); + len = xmlStrlen(str); + if (!(len > 0)) return(NULL); + + len += 20; + ret = (xmlChar *) xmlMallocAtomic(len); + if (ret == NULL) { + xmlURIErrMemory("escaping URI value\n"); + return(NULL); + } + in = (const xmlChar *) str; + out = 0; + while(*in != 0) { + if (len - out <= 3) { + temp = xmlSaveUriRealloc(ret, &len); + if (temp == NULL) { + xmlURIErrMemory("escaping URI value\n"); + xmlFree(ret); + return(NULL); + } + ret = temp; + } + + ch = *in; + + if ((ch != '@') && (!IS_UNRESERVED(ch)) && (!xmlStrchr(list, ch))) { + unsigned char val; + ret[out++] = '%'; + val = ch >> 4; + if (val <= 9) + ret[out++] = '0' + val; + else + ret[out++] = 'A' + val - 0xA; + val = ch & 0xF; + if (val <= 9) + ret[out++] = '0' + val; + else + ret[out++] = 'A' + val - 0xA; + in++; + } else { + ret[out++] = *in++; + } + + } + ret[out] = 0; + return(ret); +} + +/** + * xmlURIEscape: + * @str: the string of the URI to escape + * + * Escaping routine, does not do validity checks ! + * It will try to escape the chars needing this, but this is heuristic + * based it's impossible to be sure. + * + * Returns an copy of the string, but escaped + * + * 25 May 2001 + * Uses xmlParseURI and xmlURIEscapeStr to try to escape correctly + * according to RFC2396. + * - Carl Douglas + */ +xmlChar * +xmlURIEscape(const xmlChar * str) +{ + xmlChar *ret, *segment = NULL; + xmlURIPtr uri; + int ret2; + +#define NULLCHK(p) if(!p) { \ + xmlURIErrMemory("escaping URI value\n"); \ + xmlFreeURI(uri); \ + return NULL; } \ + + if (str == NULL) + return (NULL); + + uri = xmlCreateURI(); + if (uri != NULL) { + /* + * Allow escaping errors in the unescaped form + */ + uri->cleanup = 1; + ret2 = xmlParseURIReference(uri, (const char *)str); + if (ret2) { + xmlFreeURI(uri); + return (NULL); + } + } + + if (!uri) + return NULL; + + ret = NULL; + + if (uri->scheme) { + segment = xmlURIEscapeStr(BAD_CAST uri->scheme, BAD_CAST "+-."); + NULLCHK(segment) + ret = xmlStrcat(ret, segment); + ret = xmlStrcat(ret, BAD_CAST ":"); + xmlFree(segment); + } + + if (uri->authority) { + segment = + xmlURIEscapeStr(BAD_CAST uri->authority, BAD_CAST "/?;:@"); + NULLCHK(segment) + ret = xmlStrcat(ret, BAD_CAST "//"); + ret = xmlStrcat(ret, segment); + xmlFree(segment); + } + + if (uri->user) { + segment = xmlURIEscapeStr(BAD_CAST uri->user, BAD_CAST ";:&=+$,"); + NULLCHK(segment) + ret = xmlStrcat(ret,BAD_CAST "//"); + ret = xmlStrcat(ret, segment); + ret = xmlStrcat(ret, BAD_CAST "@"); + xmlFree(segment); + } + + if (uri->server) { + segment = xmlURIEscapeStr(BAD_CAST uri->server, BAD_CAST "/?;:@"); + NULLCHK(segment) + if (uri->user == NULL) + ret = xmlStrcat(ret, BAD_CAST "//"); + ret = xmlStrcat(ret, segment); + xmlFree(segment); + } + + if (uri->port) { + xmlChar port[10]; + + snprintf((char *) port, 10, "%d", uri->port); + ret = xmlStrcat(ret, BAD_CAST ":"); + ret = xmlStrcat(ret, port); + } + + if (uri->path) { + segment = + xmlURIEscapeStr(BAD_CAST uri->path, BAD_CAST ":@&=+$,/?;"); + NULLCHK(segment) + ret = xmlStrcat(ret, segment); + xmlFree(segment); + } + + if (uri->query_raw) { + ret = xmlStrcat(ret, BAD_CAST "?"); + ret = xmlStrcat(ret, BAD_CAST uri->query_raw); + } + else if (uri->query) { + segment = + xmlURIEscapeStr(BAD_CAST uri->query, BAD_CAST ";/?:@&=+,$"); + NULLCHK(segment) + ret = xmlStrcat(ret, BAD_CAST "?"); + ret = xmlStrcat(ret, segment); + xmlFree(segment); + } + + if (uri->opaque) { + segment = xmlURIEscapeStr(BAD_CAST uri->opaque, BAD_CAST ""); + NULLCHK(segment) + ret = xmlStrcat(ret, segment); + xmlFree(segment); + } + + if (uri->fragment) { + segment = xmlURIEscapeStr(BAD_CAST uri->fragment, BAD_CAST "#"); + NULLCHK(segment) + ret = xmlStrcat(ret, BAD_CAST "#"); + ret = xmlStrcat(ret, segment); + xmlFree(segment); + } + + xmlFreeURI(uri); +#undef NULLCHK + + return (ret); +} + +/************************************************************************ + * * + * Public functions * + * * + ************************************************************************/ + +/** + * xmlBuildURI: + * @URI: the URI instance found in the document + * @base: the base value + * + * Computes he final URI of the reference done by checking that + * the given URI is valid, and building the final URI using the + * base URI. This is processed according to section 5.2 of the + * RFC 2396 + * + * 5.2. Resolving Relative References to Absolute Form + * + * Returns a new URI string (to be freed by the caller) or NULL in case + * of error. + */ +xmlChar * +xmlBuildURI(const xmlChar *URI, const xmlChar *base) { + xmlChar *val = NULL; + int ret, len, indx, cur, out; + xmlURIPtr ref = NULL; + xmlURIPtr bas = NULL; + xmlURIPtr res = NULL; + + /* + * 1) The URI reference is parsed into the potential four components and + * fragment identifier, as described in Section 4.3. + * + * NOTE that a completely empty URI is treated by modern browsers + * as a reference to "." rather than as a synonym for the current + * URI. Should we do that here? + */ + if (URI == NULL) + ret = -1; + else { + if (*URI) { + ref = xmlCreateURI(); + if (ref == NULL) + goto done; + ret = xmlParseURIReference(ref, (const char *) URI); + } + else + ret = 0; + } + if (ret != 0) + goto done; + if ((ref != NULL) && (ref->scheme != NULL)) { + /* + * The URI is absolute don't modify. + */ + val = xmlStrdup(URI); + goto done; + } + if (base == NULL) + ret = -1; + else { + bas = xmlCreateURI(); + if (bas == NULL) + goto done; + ret = xmlParseURIReference(bas, (const char *) base); + } + if (ret != 0) { + if (ref) + val = xmlSaveUri(ref); + goto done; + } + if (ref == NULL) { + /* + * the base fragment must be ignored + */ + if (bas->fragment != NULL) { + xmlFree(bas->fragment); + bas->fragment = NULL; + } + val = xmlSaveUri(bas); + goto done; + } + + /* + * 2) If the path component is empty and the scheme, authority, and + * query components are undefined, then it is a reference to the + * current document and we are done. Otherwise, the reference URI's + * query and fragment components are defined as found (or not found) + * within the URI reference and not inherited from the base URI. + * + * NOTE that in modern browsers, the parsing differs from the above + * in the following aspect: the query component is allowed to be + * defined while still treating this as a reference to the current + * document. + */ + res = xmlCreateURI(); + if (res == NULL) + goto done; + if ((ref->scheme == NULL) && (ref->path == NULL) && + ((ref->authority == NULL) && (ref->server == NULL))) { + if (bas->scheme != NULL) + res->scheme = xmlMemStrdup(bas->scheme); + if (bas->authority != NULL) + res->authority = xmlMemStrdup(bas->authority); + else if (bas->server != NULL) { + res->server = xmlMemStrdup(bas->server); + if (bas->user != NULL) + res->user = xmlMemStrdup(bas->user); + res->port = bas->port; + } + if (bas->path != NULL) + res->path = xmlMemStrdup(bas->path); + if (ref->query_raw != NULL) + res->query_raw = xmlMemStrdup (ref->query_raw); + else if (ref->query != NULL) + res->query = xmlMemStrdup(ref->query); + else if (bas->query_raw != NULL) + res->query_raw = xmlMemStrdup(bas->query_raw); + else if (bas->query != NULL) + res->query = xmlMemStrdup(bas->query); + if (ref->fragment != NULL) + res->fragment = xmlMemStrdup(ref->fragment); + goto step_7; + } + + /* + * 3) If the scheme component is defined, indicating that the reference + * starts with a scheme name, then the reference is interpreted as an + * absolute URI and we are done. Otherwise, the reference URI's + * scheme is inherited from the base URI's scheme component. + */ + if (ref->scheme != NULL) { + val = xmlSaveUri(ref); + goto done; + } + if (bas->scheme != NULL) + res->scheme = xmlMemStrdup(bas->scheme); + + if (ref->query_raw != NULL) + res->query_raw = xmlMemStrdup(ref->query_raw); + else if (ref->query != NULL) + res->query = xmlMemStrdup(ref->query); + if (ref->fragment != NULL) + res->fragment = xmlMemStrdup(ref->fragment); + + /* + * 4) If the authority component is defined, then the reference is a + * network-path and we skip to step 7. Otherwise, the reference + * URI's authority is inherited from the base URI's authority + * component, which will also be undefined if the URI scheme does not + * use an authority component. + */ + if ((ref->authority != NULL) || (ref->server != NULL)) { + if (ref->authority != NULL) + res->authority = xmlMemStrdup(ref->authority); + else { + res->server = xmlMemStrdup(ref->server); + if (ref->user != NULL) + res->user = xmlMemStrdup(ref->user); + res->port = ref->port; + } + if (ref->path != NULL) + res->path = xmlMemStrdup(ref->path); + goto step_7; + } + if (bas->authority != NULL) + res->authority = xmlMemStrdup(bas->authority); + else if (bas->server != NULL) { + res->server = xmlMemStrdup(bas->server); + if (bas->user != NULL) + res->user = xmlMemStrdup(bas->user); + res->port = bas->port; + } + + /* + * 5) If the path component begins with a slash character ("/"), then + * the reference is an absolute-path and we skip to step 7. + */ + if ((ref->path != NULL) && (ref->path[0] == '/')) { + res->path = xmlMemStrdup(ref->path); + goto step_7; + } + + + /* + * 6) If this step is reached, then we are resolving a relative-path + * reference. The relative path needs to be merged with the base + * URI's path. Although there are many ways to do this, we will + * describe a simple method using a separate string buffer. + * + * Allocate a buffer large enough for the result string. + */ + len = 2; /* extra / and 0 */ + if (ref->path != NULL) + len += strlen(ref->path); + if (bas->path != NULL) + len += strlen(bas->path); + res->path = (char *) xmlMallocAtomic(len); + if (res->path == NULL) { + xmlURIErrMemory("resolving URI against base\n"); + goto done; + } + res->path[0] = 0; + + /* + * a) All but the last segment of the base URI's path component is + * copied to the buffer. In other words, any characters after the + * last (right-most) slash character, if any, are excluded. + */ + cur = 0; + out = 0; + if (bas->path != NULL) { + while (bas->path[cur] != 0) { + while ((bas->path[cur] != 0) && (bas->path[cur] != '/')) + cur++; + if (bas->path[cur] == 0) + break; + + cur++; + while (out < cur) { + res->path[out] = bas->path[out]; + out++; + } + } + } + res->path[out] = 0; + + /* + * b) The reference's path component is appended to the buffer + * string. + */ + if (ref->path != NULL && ref->path[0] != 0) { + indx = 0; + /* + * Ensure the path includes a '/' + */ + if ((out == 0) && (bas->server != NULL)) + res->path[out++] = '/'; + while (ref->path[indx] != 0) { + res->path[out++] = ref->path[indx++]; + } + } + res->path[out] = 0; + + /* + * Steps c) to h) are really path normalization steps + */ + xmlNormalizeURIPath(res->path); + +step_7: + + /* + * 7) The resulting URI components, including any inherited from the + * base URI, are recombined to give the absolute form of the URI + * reference. + */ + val = xmlSaveUri(res); + +done: + if (ref != NULL) + xmlFreeURI(ref); + if (bas != NULL) + xmlFreeURI(bas); + if (res != NULL) + xmlFreeURI(res); + return(val); +} + +/** + * xmlBuildRelativeURI: + * @URI: the URI reference under consideration + * @base: the base value + * + * Expresses the URI of the reference in terms relative to the + * base. Some examples of this operation include: + * base = "http://site1.com/docs/book1.html" + * URI input URI returned + * docs/pic1.gif pic1.gif + * docs/img/pic1.gif img/pic1.gif + * img/pic1.gif ../img/pic1.gif + * http://site1.com/docs/pic1.gif pic1.gif + * http://site2.com/docs/pic1.gif http://site2.com/docs/pic1.gif + * + * base = "docs/book1.html" + * URI input URI returned + * docs/pic1.gif pic1.gif + * docs/img/pic1.gif img/pic1.gif + * img/pic1.gif ../img/pic1.gif + * http://site1.com/docs/pic1.gif http://site1.com/docs/pic1.gif + * + * + * Note: if the URI reference is really wierd or complicated, it may be + * worthwhile to first convert it into a "nice" one by calling + * xmlBuildURI (using 'base') before calling this routine, + * since this routine (for reasonable efficiency) assumes URI has + * already been through some validation. + * + * Returns a new URI string (to be freed by the caller) or NULL in case + * error. + */ +xmlChar * +xmlBuildRelativeURI (const xmlChar * URI, const xmlChar * base) +{ + xmlChar *val = NULL; + int ret; + int ix; + int pos = 0; + int nbslash = 0; + int len; + xmlURIPtr ref = NULL; + xmlURIPtr bas = NULL; + xmlChar *bptr, *uptr, *vptr; + int remove_path = 0; + + if ((URI == NULL) || (*URI == 0)) + return NULL; + + /* + * First parse URI into a standard form + */ + ref = xmlCreateURI (); + if (ref == NULL) + return NULL; + /* If URI not already in "relative" form */ + if (URI[0] != '.') { + ret = xmlParseURIReference (ref, (const char *) URI); + if (ret != 0) + goto done; /* Error in URI, return NULL */ + } else + ref->path = (char *)xmlStrdup(URI); + + /* + * Next parse base into the same standard form + */ + if ((base == NULL) || (*base == 0)) { + val = xmlStrdup (URI); + goto done; + } + bas = xmlCreateURI (); + if (bas == NULL) + goto done; + if (base[0] != '.') { + ret = xmlParseURIReference (bas, (const char *) base); + if (ret != 0) + goto done; /* Error in base, return NULL */ + } else + bas->path = (char *)xmlStrdup(base); + + /* + * If the scheme / server on the URI differs from the base, + * just return the URI + */ + if ((ref->scheme != NULL) && + ((bas->scheme == NULL) || + (xmlStrcmp ((xmlChar *)bas->scheme, (xmlChar *)ref->scheme)) || + (xmlStrcmp ((xmlChar *)bas->server, (xmlChar *)ref->server)))) { + val = xmlStrdup (URI); + goto done; + } + if (xmlStrEqual((xmlChar *)bas->path, (xmlChar *)ref->path)) { + val = xmlStrdup(BAD_CAST ""); + goto done; + } + if (bas->path == NULL) { + val = xmlStrdup((xmlChar *)ref->path); + goto done; + } + if (ref->path == NULL) { + ref->path = (char *) "/"; + remove_path = 1; + } + + /* + * At this point (at last!) we can compare the two paths + * + * First we take care of the special case where either of the + * two path components may be missing (bug 316224) + */ + if (bas->path == NULL) { + if (ref->path != NULL) { + uptr = (xmlChar *) ref->path; + if (*uptr == '/') + uptr++; + /* exception characters from xmlSaveUri */ + val = xmlURIEscapeStr(uptr, BAD_CAST "/;&=+$,"); + } + goto done; + } + bptr = (xmlChar *)bas->path; + if (ref->path == NULL) { + for (ix = 0; bptr[ix] != 0; ix++) { + if (bptr[ix] == '/') + nbslash++; + } + uptr = NULL; + len = 1; /* this is for a string terminator only */ + } else { + /* + * Next we compare the two strings and find where they first differ + */ + if ((ref->path[pos] == '.') && (ref->path[pos+1] == '/')) + pos += 2; + if ((*bptr == '.') && (bptr[1] == '/')) + bptr += 2; + else if ((*bptr == '/') && (ref->path[pos] != '/')) + bptr++; + while ((bptr[pos] == ref->path[pos]) && (bptr[pos] != 0)) + pos++; + + if (bptr[pos] == ref->path[pos]) { + val = xmlStrdup(BAD_CAST ""); + goto done; /* (I can't imagine why anyone would do this) */ + } + + /* + * In URI, "back up" to the last '/' encountered. This will be the + * beginning of the "unique" suffix of URI + */ + ix = pos; + if ((ref->path[ix] == '/') && (ix > 0)) + ix--; + else if ((ref->path[ix] == 0) && (ix > 1) && (ref->path[ix - 1] == '/')) + ix -= 2; + for (; ix > 0; ix--) { + if (ref->path[ix] == '/') + break; + } + if (ix == 0) { + uptr = (xmlChar *)ref->path; + } else { + ix++; + uptr = (xmlChar *)&ref->path[ix]; + } + + /* + * In base, count the number of '/' from the differing point + */ + if (bptr[pos] != ref->path[pos]) {/* check for trivial URI == base */ + for (; bptr[ix] != 0; ix++) { + if (bptr[ix] == '/') + nbslash++; + } + } + len = xmlStrlen (uptr) + 1; + } + + if (nbslash == 0) { + if (uptr != NULL) + /* exception characters from xmlSaveUri */ + val = xmlURIEscapeStr(uptr, BAD_CAST "/;&=+$,"); + goto done; + } + + /* + * Allocate just enough space for the returned string - + * length of the remainder of the URI, plus enough space + * for the "../" groups, plus one for the terminator + */ + val = (xmlChar *) xmlMalloc (len + 3 * nbslash); + if (val == NULL) { + xmlURIErrMemory("building relative URI\n"); + goto done; + } + vptr = val; + /* + * Put in as many "../" as needed + */ + for (; nbslash>0; nbslash--) { + *vptr++ = '.'; + *vptr++ = '.'; + *vptr++ = '/'; + } + /* + * Finish up with the end of the URI + */ + if (uptr != NULL) { + if ((vptr > val) && (len > 0) && + (uptr[0] == '/') && (vptr[-1] == '/')) { + memcpy (vptr, uptr + 1, len - 1); + vptr[len - 2] = 0; + } else { + memcpy (vptr, uptr, len); + vptr[len - 1] = 0; + } + } else { + vptr[len - 1] = 0; + } + + /* escape the freshly-built path */ + vptr = val; + /* exception characters from xmlSaveUri */ + val = xmlURIEscapeStr(vptr, BAD_CAST "/;&=+$,"); + xmlFree(vptr); + +done: + /* + * Free the working variables + */ + if (remove_path != 0) + ref->path = NULL; + if (ref != NULL) + xmlFreeURI (ref); + if (bas != NULL) + xmlFreeURI (bas); + + return val; +} + +/** + * xmlCanonicPath: + * @path: the resource locator in a filesystem notation + * + * Constructs a canonic path from the specified path. + * + * Returns a new canonic path, or a duplicate of the path parameter if the + * construction fails. The caller is responsible for freeing the memory occupied + * by the returned string. If there is insufficient memory available, or the + * argument is NULL, the function returns NULL. + */ +#define IS_WINDOWS_PATH(p) \ + ((p != NULL) && \ + (((p[0] >= 'a') && (p[0] <= 'z')) || \ + ((p[0] >= 'A') && (p[0] <= 'Z'))) && \ + (p[1] == ':') && ((p[2] == '/') || (p[2] == '\\'))) +xmlChar * +xmlCanonicPath(const xmlChar *path) +{ +/* + * For Windows implementations, additional work needs to be done to + * replace backslashes in pathnames with "forward slashes" + */ +#if defined(_WIN32) && !defined(__CYGWIN__) + int len = 0; + int i = 0; + xmlChar *p = NULL; +#endif + xmlURIPtr uri; + xmlChar *ret; + const xmlChar *absuri; + + if (path == NULL) + return(NULL); + +#if defined(_WIN32) + /* + * We must not change the backslashes to slashes if the the path + * starts with \\?\ + * Those paths can be up to 32k characters long. + * Was added specifically for OpenOffice, those paths can't be converted + * to URIs anyway. + */ + if ((path[0] == '\\') && (path[1] == '\\') && (path[2] == '?') && + (path[3] == '\\') ) + return xmlStrdup((const xmlChar *) path); +#endif + + /* sanitize filename starting with // so it can be used as URI */ + if ((path[0] == '/') && (path[1] == '/') && (path[2] != '/')) + path++; + + if ((uri = xmlParseURI((const char *) path)) != NULL) { + xmlFreeURI(uri); + return xmlStrdup(path); + } + + /* Check if this is an "absolute uri" */ + absuri = xmlStrstr(path, BAD_CAST "://"); + if (absuri != NULL) { + int l, j; + unsigned char c; + xmlChar *escURI; + + /* + * this looks like an URI where some parts have not been + * escaped leading to a parsing problem. Check that the first + * part matches a protocol. + */ + l = absuri - path; + /* Bypass if first part (part before the '://') is > 20 chars */ + if ((l <= 0) || (l > 20)) + goto path_processing; + /* Bypass if any non-alpha characters are present in first part */ + for (j = 0;j < l;j++) { + c = path[j]; + if (!(((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')))) + goto path_processing; + } + + /* Escape all except the characters specified in the supplied path */ + escURI = xmlURIEscapeStr(path, BAD_CAST ":/?_.#&;="); + if (escURI != NULL) { + /* Try parsing the escaped path */ + uri = xmlParseURI((const char *) escURI); + /* If successful, return the escaped string */ + if (uri != NULL) { + xmlFreeURI(uri); + return escURI; + } + } + } + +path_processing: +/* For Windows implementations, replace backslashes with 'forward slashes' */ +#if defined(_WIN32) && !defined(__CYGWIN__) + /* + * Create a URI structure + */ + uri = xmlCreateURI(); + if (uri == NULL) { /* Guard against 'out of memory' */ + return(NULL); + } + + len = xmlStrlen(path); + if ((len > 2) && IS_WINDOWS_PATH(path)) { + /* make the scheme 'file' */ + uri->scheme = xmlStrdup(BAD_CAST "file"); + /* allocate space for leading '/' + path + string terminator */ + uri->path = xmlMallocAtomic(len + 2); + if (uri->path == NULL) { + xmlFreeURI(uri); /* Guard agains 'out of memory' */ + return(NULL); + } + /* Put in leading '/' plus path */ + uri->path[0] = '/'; + p = uri->path + 1; + strncpy(p, path, len + 1); + } else { + uri->path = xmlStrdup(path); + if (uri->path == NULL) { + xmlFreeURI(uri); + return(NULL); + } + p = uri->path; + } + /* Now change all occurences of '\' to '/' */ + while (*p != '\0') { + if (*p == '\\') + *p = '/'; + p++; + } + + if (uri->scheme == NULL) { + ret = xmlStrdup((const xmlChar *) uri->path); + } else { + ret = xmlSaveUri(uri); + } + + xmlFreeURI(uri); +#else + ret = xmlStrdup((const xmlChar *) path); +#endif + return(ret); +} + +/** + * xmlPathToURI: + * @path: the resource locator in a filesystem notation + * + * Constructs an URI expressing the existing path + * + * Returns a new URI, or a duplicate of the path parameter if the + * construction fails. The caller is responsible for freeing the memory + * occupied by the returned string. If there is insufficient memory available, + * or the argument is NULL, the function returns NULL. + */ +xmlChar * +xmlPathToURI(const xmlChar *path) +{ + xmlURIPtr uri; + xmlURI temp; + xmlChar *ret, *cal; + + if (path == NULL) + return(NULL); + + if ((uri = xmlParseURI((const char *) path)) != NULL) { + xmlFreeURI(uri); + return xmlStrdup(path); + } + cal = xmlCanonicPath(path); + if (cal == NULL) + return(NULL); +#if defined(_WIN32) && !defined(__CYGWIN__) + /* xmlCanonicPath can return an URI on Windows (is that the intended behaviour?) + If 'cal' is a valid URI allready then we are done here, as continuing would make + it invalid. */ + if ((uri = xmlParseURI((const char *) cal)) != NULL) { + xmlFreeURI(uri); + return cal; + } + /* 'cal' can contain a relative path with backslashes. If that is processed + by xmlSaveURI, they will be escaped and the external entity loader machinery + will fail. So convert them to slashes. Misuse 'ret' for walking. */ + ret = cal; + while (*ret != '\0') { + if (*ret == '\\') + *ret = '/'; + ret++; + } +#endif + memset(&temp, 0, sizeof(temp)); + temp.path = (char *) cal; + ret = xmlSaveUri(&temp); + xmlFree(cal); + return(ret); +} +#define bottom_uri +#include "elfgcchack.h" diff --git a/vendors/libxml/src/valid.c b/vendors/libxml/src/valid.c new file mode 100644 index 0000000..6e53a76 --- /dev/null +++ b/vendors/libxml/src/valid.c @@ -0,0 +1,7050 @@ +/* + * valid.c : part of the code use to do the DTD handling and the validity + * checking + * + * See Copyright for the status of this software. + * + * daniel@veillard.com + */ + +#define IN_LIBXML +#include "libxml.h" + +#include + +#ifdef HAVE_STDLIB_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static xmlElementPtr xmlGetDtdElementDesc2(xmlDtdPtr dtd, const xmlChar *name, + int create); +/* #define DEBUG_VALID_ALGO */ +/* #define DEBUG_REGEXP_ALGO */ + +#define TODO \ + xmlGenericError(xmlGenericErrorContext, \ + "Unimplemented block at %s:%d\n", \ + __FILE__, __LINE__); + +#ifdef LIBXML_VALID_ENABLED +static int +xmlValidateAttributeValueInternal(xmlDocPtr doc, xmlAttributeType type, + const xmlChar *value); +#endif +/************************************************************************ + * * + * Error handling routines * + * * + ************************************************************************/ + +/** + * xmlVErrMemory: + * @ctxt: an XML validation parser context + * @extra: extra informations + * + * Handle an out of memory error + */ +static void +xmlVErrMemory(xmlValidCtxtPtr ctxt, const char *extra) +{ + xmlGenericErrorFunc channel = NULL; + xmlParserCtxtPtr pctxt = NULL; + void *data = NULL; + + if (ctxt != NULL) { + channel = ctxt->error; + data = ctxt->userData; + /* Use the special values to detect if it is part of a parsing + context */ + if ((ctxt->finishDtd == XML_CTXT_FINISH_DTD_0) || + (ctxt->finishDtd == XML_CTXT_FINISH_DTD_1)) { + long delta = (char *) ctxt - (char *) ctxt->userData; + if ((delta > 0) && (delta < 250)) + pctxt = ctxt->userData; + } + } + if (extra) + __xmlRaiseError(NULL, channel, data, + pctxt, NULL, XML_FROM_VALID, XML_ERR_NO_MEMORY, + XML_ERR_FATAL, NULL, 0, extra, NULL, NULL, 0, 0, + "Memory allocation failed : %s\n", extra); + else + __xmlRaiseError(NULL, channel, data, + pctxt, NULL, XML_FROM_VALID, XML_ERR_NO_MEMORY, + XML_ERR_FATAL, NULL, 0, NULL, NULL, NULL, 0, 0, + "Memory allocation failed\n"); +} + +/** + * xmlErrValid: + * @ctxt: an XML validation parser context + * @error: the error number + * @extra: extra informations + * + * Handle a validation error + */ +static void +xmlErrValid(xmlValidCtxtPtr ctxt, xmlParserErrors error, + const char *msg, const char *extra) +{ + xmlGenericErrorFunc channel = NULL; + xmlParserCtxtPtr pctxt = NULL; + void *data = NULL; + + if (ctxt != NULL) { + channel = ctxt->error; + data = ctxt->userData; + /* Use the special values to detect if it is part of a parsing + context */ + if ((ctxt->finishDtd == XML_CTXT_FINISH_DTD_0) || + (ctxt->finishDtd == XML_CTXT_FINISH_DTD_1)) { + long delta = (char *) ctxt - (char *) ctxt->userData; + if ((delta > 0) && (delta < 250)) + pctxt = ctxt->userData; + } + } + if (extra) + __xmlRaiseError(NULL, channel, data, + pctxt, NULL, XML_FROM_VALID, error, + XML_ERR_ERROR, NULL, 0, extra, NULL, NULL, 0, 0, + msg, extra); + else + __xmlRaiseError(NULL, channel, data, + pctxt, NULL, XML_FROM_VALID, error, + XML_ERR_ERROR, NULL, 0, NULL, NULL, NULL, 0, 0, + "%s", msg); +} + +#if defined(LIBXML_VALID_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) +/** + * xmlErrValidNode: + * @ctxt: an XML validation parser context + * @node: the node raising the error + * @error: the error number + * @str1: extra informations + * @str2: extra informations + * @str3: extra informations + * + * Handle a validation error, provide contextual informations + */ +static void +xmlErrValidNode(xmlValidCtxtPtr ctxt, + xmlNodePtr node, xmlParserErrors error, + const char *msg, const xmlChar * str1, + const xmlChar * str2, const xmlChar * str3) +{ + xmlStructuredErrorFunc schannel = NULL; + xmlGenericErrorFunc channel = NULL; + xmlParserCtxtPtr pctxt = NULL; + void *data = NULL; + + if (ctxt != NULL) { + channel = ctxt->error; + data = ctxt->userData; + /* Use the special values to detect if it is part of a parsing + context */ + if ((ctxt->finishDtd == XML_CTXT_FINISH_DTD_0) || + (ctxt->finishDtd == XML_CTXT_FINISH_DTD_1)) { + long delta = (char *) ctxt - (char *) ctxt->userData; + if ((delta > 0) && (delta < 250)) + pctxt = ctxt->userData; + } + } + __xmlRaiseError(schannel, channel, data, pctxt, node, XML_FROM_VALID, error, + XML_ERR_ERROR, NULL, 0, + (const char *) str1, + (const char *) str1, + (const char *) str3, 0, 0, msg, str1, str2, str3); +} +#endif /* LIBXML_VALID_ENABLED or LIBXML_SCHEMAS_ENABLED */ + +#ifdef LIBXML_VALID_ENABLED +/** + * xmlErrValidNodeNr: + * @ctxt: an XML validation parser context + * @node: the node raising the error + * @error: the error number + * @str1: extra informations + * @int2: extra informations + * @str3: extra informations + * + * Handle a validation error, provide contextual informations + */ +static void +xmlErrValidNodeNr(xmlValidCtxtPtr ctxt, + xmlNodePtr node, xmlParserErrors error, + const char *msg, const xmlChar * str1, + int int2, const xmlChar * str3) +{ + xmlStructuredErrorFunc schannel = NULL; + xmlGenericErrorFunc channel = NULL; + xmlParserCtxtPtr pctxt = NULL; + void *data = NULL; + + if (ctxt != NULL) { + channel = ctxt->error; + data = ctxt->userData; + /* Use the special values to detect if it is part of a parsing + context */ + if ((ctxt->finishDtd == XML_CTXT_FINISH_DTD_0) || + (ctxt->finishDtd == XML_CTXT_FINISH_DTD_1)) { + long delta = (char *) ctxt - (char *) ctxt->userData; + if ((delta > 0) && (delta < 250)) + pctxt = ctxt->userData; + } + } + __xmlRaiseError(schannel, channel, data, pctxt, node, XML_FROM_VALID, error, + XML_ERR_ERROR, NULL, 0, + (const char *) str1, + (const char *) str3, + NULL, int2, 0, msg, str1, int2, str3); +} + +/** + * xmlErrValidWarning: + * @ctxt: an XML validation parser context + * @node: the node raising the error + * @error: the error number + * @str1: extra information + * @str2: extra information + * @str3: extra information + * + * Handle a validation error, provide contextual information + */ +static void +xmlErrValidWarning(xmlValidCtxtPtr ctxt, + xmlNodePtr node, xmlParserErrors error, + const char *msg, const xmlChar * str1, + const xmlChar * str2, const xmlChar * str3) +{ + xmlStructuredErrorFunc schannel = NULL; + xmlGenericErrorFunc channel = NULL; + xmlParserCtxtPtr pctxt = NULL; + void *data = NULL; + + if (ctxt != NULL) { + channel = ctxt->warning; + data = ctxt->userData; + /* Use the special values to detect if it is part of a parsing + context */ + if ((ctxt->finishDtd == XML_CTXT_FINISH_DTD_0) || + (ctxt->finishDtd == XML_CTXT_FINISH_DTD_1)) { + long delta = (char *) ctxt - (char *) ctxt->userData; + if ((delta > 0) && (delta < 250)) + pctxt = ctxt->userData; + } + } + __xmlRaiseError(schannel, channel, data, pctxt, node, XML_FROM_VALID, error, + XML_ERR_WARNING, NULL, 0, + (const char *) str1, + (const char *) str1, + (const char *) str3, 0, 0, msg, str1, str2, str3); +} + + + +#ifdef LIBXML_REGEXP_ENABLED +/* + * If regexp are enabled we can do continuous validation without the + * need of a tree to validate the content model. this is done in each + * callbacks. + * Each xmlValidState represent the validation state associated to the + * set of nodes currently open from the document root to the current element. + */ + + +typedef struct _xmlValidState { + xmlElementPtr elemDecl; /* pointer to the content model */ + xmlNodePtr node; /* pointer to the current node */ + xmlRegExecCtxtPtr exec; /* regexp runtime */ +} _xmlValidState; + + +static int +vstateVPush(xmlValidCtxtPtr ctxt, xmlElementPtr elemDecl, xmlNodePtr node) { + if ((ctxt->vstateMax == 0) || (ctxt->vstateTab == NULL)) { + ctxt->vstateMax = 10; + ctxt->vstateTab = (xmlValidState *) xmlMalloc(ctxt->vstateMax * + sizeof(ctxt->vstateTab[0])); + if (ctxt->vstateTab == NULL) { + xmlVErrMemory(ctxt, "malloc failed"); + return(-1); + } + } + + if (ctxt->vstateNr >= ctxt->vstateMax) { + xmlValidState *tmp; + + tmp = (xmlValidState *) xmlRealloc(ctxt->vstateTab, + 2 * ctxt->vstateMax * sizeof(ctxt->vstateTab[0])); + if (tmp == NULL) { + xmlVErrMemory(ctxt, "realloc failed"); + return(-1); + } + ctxt->vstateMax *= 2; + ctxt->vstateTab = tmp; + } + ctxt->vstate = &ctxt->vstateTab[ctxt->vstateNr]; + ctxt->vstateTab[ctxt->vstateNr].elemDecl = elemDecl; + ctxt->vstateTab[ctxt->vstateNr].node = node; + if ((elemDecl != NULL) && (elemDecl->etype == XML_ELEMENT_TYPE_ELEMENT)) { + if (elemDecl->contModel == NULL) + xmlValidBuildContentModel(ctxt, elemDecl); + if (elemDecl->contModel != NULL) { + ctxt->vstateTab[ctxt->vstateNr].exec = + xmlRegNewExecCtxt(elemDecl->contModel, NULL, NULL); + } else { + ctxt->vstateTab[ctxt->vstateNr].exec = NULL; + xmlErrValidNode(ctxt, (xmlNodePtr) elemDecl, + XML_ERR_INTERNAL_ERROR, + "Failed to build content model regexp for %s\n", + node->name, NULL, NULL); + } + } + return(ctxt->vstateNr++); +} + +static int +vstateVPop(xmlValidCtxtPtr ctxt) { + xmlElementPtr elemDecl; + + if (ctxt->vstateNr < 1) return(-1); + ctxt->vstateNr--; + elemDecl = ctxt->vstateTab[ctxt->vstateNr].elemDecl; + ctxt->vstateTab[ctxt->vstateNr].elemDecl = NULL; + ctxt->vstateTab[ctxt->vstateNr].node = NULL; + if ((elemDecl != NULL) && (elemDecl->etype == XML_ELEMENT_TYPE_ELEMENT)) { + xmlRegFreeExecCtxt(ctxt->vstateTab[ctxt->vstateNr].exec); + } + ctxt->vstateTab[ctxt->vstateNr].exec = NULL; + if (ctxt->vstateNr >= 1) + ctxt->vstate = &ctxt->vstateTab[ctxt->vstateNr - 1]; + else + ctxt->vstate = NULL; + return(ctxt->vstateNr); +} + +#else /* not LIBXML_REGEXP_ENABLED */ +/* + * If regexp are not enabled, it uses a home made algorithm less + * complex and easier to + * debug/maintain than a generic NFA -> DFA state based algo. The + * only restriction is on the deepness of the tree limited by the + * size of the occurs bitfield + * + * this is the content of a saved state for rollbacks + */ + +#define ROLLBACK_OR 0 +#define ROLLBACK_PARENT 1 + +typedef struct _xmlValidState { + xmlElementContentPtr cont; /* pointer to the content model subtree */ + xmlNodePtr node; /* pointer to the current node in the list */ + long occurs;/* bitfield for multiple occurrences */ + unsigned char depth; /* current depth in the overall tree */ + unsigned char state; /* ROLLBACK_XXX */ +} _xmlValidState; + +#define MAX_RECURSE 25000 +#define MAX_DEPTH ((sizeof(_xmlValidState.occurs)) * 8) +#define CONT ctxt->vstate->cont +#define NODE ctxt->vstate->node +#define DEPTH ctxt->vstate->depth +#define OCCURS ctxt->vstate->occurs +#define STATE ctxt->vstate->state + +#define OCCURRENCE (ctxt->vstate->occurs & (1 << DEPTH)) +#define PARENT_OCCURRENCE (ctxt->vstate->occurs & ((1 << DEPTH) - 1)) + +#define SET_OCCURRENCE ctxt->vstate->occurs |= (1 << DEPTH) +#define RESET_OCCURRENCE ctxt->vstate->occurs &= ((1 << DEPTH) - 1) + +static int +vstateVPush(xmlValidCtxtPtr ctxt, xmlElementContentPtr cont, + xmlNodePtr node, unsigned char depth, long occurs, + unsigned char state) { + int i = ctxt->vstateNr - 1; + + if (ctxt->vstateNr > MAX_RECURSE) { + return(-1); + } + if (ctxt->vstateTab == NULL) { + ctxt->vstateMax = 8; + ctxt->vstateTab = (xmlValidState *) xmlMalloc( + ctxt->vstateMax * sizeof(ctxt->vstateTab[0])); + if (ctxt->vstateTab == NULL) { + xmlVErrMemory(ctxt, "malloc failed"); + return(-1); + } + } + if (ctxt->vstateNr >= ctxt->vstateMax) { + xmlValidState *tmp; + + tmp = (xmlValidState *) xmlRealloc(ctxt->vstateTab, + 2 * ctxt->vstateMax * sizeof(ctxt->vstateTab[0])); + if (tmp == NULL) { + xmlVErrMemory(ctxt, "malloc failed"); + return(-1); + } + ctxt->vstateMax *= 2; + ctxt->vstateTab = tmp; + ctxt->vstate = &ctxt->vstateTab[0]; + } + /* + * Don't push on the stack a state already here + */ + if ((i >= 0) && (ctxt->vstateTab[i].cont == cont) && + (ctxt->vstateTab[i].node == node) && + (ctxt->vstateTab[i].depth == depth) && + (ctxt->vstateTab[i].occurs == occurs) && + (ctxt->vstateTab[i].state == state)) + return(ctxt->vstateNr); + ctxt->vstateTab[ctxt->vstateNr].cont = cont; + ctxt->vstateTab[ctxt->vstateNr].node = node; + ctxt->vstateTab[ctxt->vstateNr].depth = depth; + ctxt->vstateTab[ctxt->vstateNr].occurs = occurs; + ctxt->vstateTab[ctxt->vstateNr].state = state; + return(ctxt->vstateNr++); +} + +static int +vstateVPop(xmlValidCtxtPtr ctxt) { + if (ctxt->vstateNr <= 1) return(-1); + ctxt->vstateNr--; + ctxt->vstate = &ctxt->vstateTab[0]; + ctxt->vstate->cont = ctxt->vstateTab[ctxt->vstateNr].cont; + ctxt->vstate->node = ctxt->vstateTab[ctxt->vstateNr].node; + ctxt->vstate->depth = ctxt->vstateTab[ctxt->vstateNr].depth; + ctxt->vstate->occurs = ctxt->vstateTab[ctxt->vstateNr].occurs; + ctxt->vstate->state = ctxt->vstateTab[ctxt->vstateNr].state; + return(ctxt->vstateNr); +} + +#endif /* LIBXML_REGEXP_ENABLED */ + +static int +nodeVPush(xmlValidCtxtPtr ctxt, xmlNodePtr value) +{ + if (ctxt->nodeMax <= 0) { + ctxt->nodeMax = 4; + ctxt->nodeTab = + (xmlNodePtr *) xmlMalloc(ctxt->nodeMax * + sizeof(ctxt->nodeTab[0])); + if (ctxt->nodeTab == NULL) { + xmlVErrMemory(ctxt, "malloc failed"); + ctxt->nodeMax = 0; + return (0); + } + } + if (ctxt->nodeNr >= ctxt->nodeMax) { + xmlNodePtr *tmp; + tmp = (xmlNodePtr *) xmlRealloc(ctxt->nodeTab, + ctxt->nodeMax * 2 * sizeof(ctxt->nodeTab[0])); + if (tmp == NULL) { + xmlVErrMemory(ctxt, "realloc failed"); + return (0); + } + ctxt->nodeMax *= 2; + ctxt->nodeTab = tmp; + } + ctxt->nodeTab[ctxt->nodeNr] = value; + ctxt->node = value; + return (ctxt->nodeNr++); +} +static xmlNodePtr +nodeVPop(xmlValidCtxtPtr ctxt) +{ + xmlNodePtr ret; + + if (ctxt->nodeNr <= 0) + return (NULL); + ctxt->nodeNr--; + if (ctxt->nodeNr > 0) + ctxt->node = ctxt->nodeTab[ctxt->nodeNr - 1]; + else + ctxt->node = NULL; + ret = ctxt->nodeTab[ctxt->nodeNr]; + ctxt->nodeTab[ctxt->nodeNr] = NULL; + return (ret); +} + +#ifdef DEBUG_VALID_ALGO +static void +xmlValidPrintNode(xmlNodePtr cur) { + if (cur == NULL) { + xmlGenericError(xmlGenericErrorContext, "null"); + return; + } + switch (cur->type) { + case XML_ELEMENT_NODE: + xmlGenericError(xmlGenericErrorContext, "%s ", cur->name); + break; + case XML_TEXT_NODE: + xmlGenericError(xmlGenericErrorContext, "text "); + break; + case XML_CDATA_SECTION_NODE: + xmlGenericError(xmlGenericErrorContext, "cdata "); + break; + case XML_ENTITY_REF_NODE: + xmlGenericError(xmlGenericErrorContext, "&%s; ", cur->name); + break; + case XML_PI_NODE: + xmlGenericError(xmlGenericErrorContext, "pi(%s) ", cur->name); + break; + case XML_COMMENT_NODE: + xmlGenericError(xmlGenericErrorContext, "comment "); + break; + case XML_ATTRIBUTE_NODE: + xmlGenericError(xmlGenericErrorContext, "?attr? "); + break; + case XML_ENTITY_NODE: + xmlGenericError(xmlGenericErrorContext, "?ent? "); + break; + case XML_DOCUMENT_NODE: + xmlGenericError(xmlGenericErrorContext, "?doc? "); + break; + case XML_DOCUMENT_TYPE_NODE: + xmlGenericError(xmlGenericErrorContext, "?doctype? "); + break; + case XML_DOCUMENT_FRAG_NODE: + xmlGenericError(xmlGenericErrorContext, "?frag? "); + break; + case XML_NOTATION_NODE: + xmlGenericError(xmlGenericErrorContext, "?nota? "); + break; + case XML_HTML_DOCUMENT_NODE: + xmlGenericError(xmlGenericErrorContext, "?html? "); + break; +#ifdef LIBXML_DOCB_ENABLED + case XML_DOCB_DOCUMENT_NODE: + xmlGenericError(xmlGenericErrorContext, "?docb? "); + break; +#endif + case XML_DTD_NODE: + xmlGenericError(xmlGenericErrorContext, "?dtd? "); + break; + case XML_ELEMENT_DECL: + xmlGenericError(xmlGenericErrorContext, "?edecl? "); + break; + case XML_ATTRIBUTE_DECL: + xmlGenericError(xmlGenericErrorContext, "?adecl? "); + break; + case XML_ENTITY_DECL: + xmlGenericError(xmlGenericErrorContext, "?entdecl? "); + break; + case XML_NAMESPACE_DECL: + xmlGenericError(xmlGenericErrorContext, "?nsdecl? "); + break; + case XML_XINCLUDE_START: + xmlGenericError(xmlGenericErrorContext, "incstart "); + break; + case XML_XINCLUDE_END: + xmlGenericError(xmlGenericErrorContext, "incend "); + break; + } +} + +static void +xmlValidPrintNodeList(xmlNodePtr cur) { + if (cur == NULL) + xmlGenericError(xmlGenericErrorContext, "null "); + while (cur != NULL) { + xmlValidPrintNode(cur); + cur = cur->next; + } +} + +static void +xmlValidDebug(xmlNodePtr cur, xmlElementContentPtr cont) { + char expr[5000]; + + expr[0] = 0; + xmlGenericError(xmlGenericErrorContext, "valid: "); + xmlValidPrintNodeList(cur); + xmlGenericError(xmlGenericErrorContext, "against "); + xmlSnprintfElementContent(expr, 5000, cont, 1); + xmlGenericError(xmlGenericErrorContext, "%s\n", expr); +} + +static void +xmlValidDebugState(xmlValidStatePtr state) { + xmlGenericError(xmlGenericErrorContext, "("); + if (state->cont == NULL) + xmlGenericError(xmlGenericErrorContext, "null,"); + else + switch (state->cont->type) { + case XML_ELEMENT_CONTENT_PCDATA: + xmlGenericError(xmlGenericErrorContext, "pcdata,"); + break; + case XML_ELEMENT_CONTENT_ELEMENT: + xmlGenericError(xmlGenericErrorContext, "%s,", + state->cont->name); + break; + case XML_ELEMENT_CONTENT_SEQ: + xmlGenericError(xmlGenericErrorContext, "seq,"); + break; + case XML_ELEMENT_CONTENT_OR: + xmlGenericError(xmlGenericErrorContext, "or,"); + break; + } + xmlValidPrintNode(state->node); + xmlGenericError(xmlGenericErrorContext, ",%d,%X,%d)", + state->depth, state->occurs, state->state); +} + +static void +xmlValidStateDebug(xmlValidCtxtPtr ctxt) { + int i, j; + + xmlGenericError(xmlGenericErrorContext, "state: "); + xmlValidDebugState(ctxt->vstate); + xmlGenericError(xmlGenericErrorContext, " stack: %d ", + ctxt->vstateNr - 1); + for (i = 0, j = ctxt->vstateNr - 1;(i < 3) && (j > 0);i++,j--) + xmlValidDebugState(&ctxt->vstateTab[j]); + xmlGenericError(xmlGenericErrorContext, "\n"); +} + +/***** +#define DEBUG_VALID_STATE(n,c) xmlValidDebug(n,c); + *****/ + +#define DEBUG_VALID_STATE(n,c) xmlValidStateDebug(ctxt); +#define DEBUG_VALID_MSG(m) \ + xmlGenericError(xmlGenericErrorContext, "%s\n", m); + +#else +#define DEBUG_VALID_STATE(n,c) +#define DEBUG_VALID_MSG(m) +#endif + +/* TODO: use hash table for accesses to elem and attribute definitions */ + + +#define CHECK_DTD \ + if (doc == NULL) return(0); \ + else if ((doc->intSubset == NULL) && \ + (doc->extSubset == NULL)) return(0) + +#ifdef LIBXML_REGEXP_ENABLED + +/************************************************************************ + * * + * Content model validation based on the regexps * + * * + ************************************************************************/ + +/** + * xmlValidBuildAContentModel: + * @content: the content model + * @ctxt: the schema parser context + * @name: the element name whose content is being built + * + * Generate the automata sequence needed for that type + * + * Returns 1 if successful or 0 in case of error. + */ +static int +xmlValidBuildAContentModel(xmlElementContentPtr content, + xmlValidCtxtPtr ctxt, + const xmlChar *name) { + if (content == NULL) { + xmlErrValidNode(ctxt, NULL, XML_ERR_INTERNAL_ERROR, + "Found NULL content in content model of %s\n", + name, NULL, NULL); + return(0); + } + switch (content->type) { + case XML_ELEMENT_CONTENT_PCDATA: + xmlErrValidNode(ctxt, NULL, XML_ERR_INTERNAL_ERROR, + "Found PCDATA in content model of %s\n", + name, NULL, NULL); + return(0); + break; + case XML_ELEMENT_CONTENT_ELEMENT: { + xmlAutomataStatePtr oldstate = ctxt->state; + xmlChar fn[50]; + xmlChar *fullname; + + fullname = xmlBuildQName(content->name, content->prefix, fn, 50); + if (fullname == NULL) { + xmlVErrMemory(ctxt, "Building content model"); + return(0); + } + + switch (content->ocur) { + case XML_ELEMENT_CONTENT_ONCE: + ctxt->state = xmlAutomataNewTransition(ctxt->am, + ctxt->state, NULL, fullname, NULL); + break; + case XML_ELEMENT_CONTENT_OPT: + ctxt->state = xmlAutomataNewTransition(ctxt->am, + ctxt->state, NULL, fullname, NULL); + xmlAutomataNewEpsilon(ctxt->am, oldstate, ctxt->state); + break; + case XML_ELEMENT_CONTENT_PLUS: + ctxt->state = xmlAutomataNewTransition(ctxt->am, + ctxt->state, NULL, fullname, NULL); + xmlAutomataNewTransition(ctxt->am, ctxt->state, + ctxt->state, fullname, NULL); + break; + case XML_ELEMENT_CONTENT_MULT: + ctxt->state = xmlAutomataNewEpsilon(ctxt->am, + ctxt->state, NULL); + xmlAutomataNewTransition(ctxt->am, + ctxt->state, ctxt->state, fullname, NULL); + break; + } + if ((fullname != fn) && (fullname != content->name)) + xmlFree(fullname); + break; + } + case XML_ELEMENT_CONTENT_SEQ: { + xmlAutomataStatePtr oldstate, oldend; + xmlElementContentOccur ocur; + + /* + * Simply iterate over the content + */ + oldstate = ctxt->state; + ocur = content->ocur; + if (ocur != XML_ELEMENT_CONTENT_ONCE) { + ctxt->state = xmlAutomataNewEpsilon(ctxt->am, oldstate, NULL); + oldstate = ctxt->state; + } + do { + xmlValidBuildAContentModel(content->c1, ctxt, name); + content = content->c2; + } while ((content->type == XML_ELEMENT_CONTENT_SEQ) && + (content->ocur == XML_ELEMENT_CONTENT_ONCE)); + xmlValidBuildAContentModel(content, ctxt, name); + oldend = ctxt->state; + ctxt->state = xmlAutomataNewEpsilon(ctxt->am, oldend, NULL); + switch (ocur) { + case XML_ELEMENT_CONTENT_ONCE: + break; + case XML_ELEMENT_CONTENT_OPT: + xmlAutomataNewEpsilon(ctxt->am, oldstate, ctxt->state); + break; + case XML_ELEMENT_CONTENT_MULT: + xmlAutomataNewEpsilon(ctxt->am, oldstate, ctxt->state); + xmlAutomataNewEpsilon(ctxt->am, oldend, oldstate); + break; + case XML_ELEMENT_CONTENT_PLUS: + xmlAutomataNewEpsilon(ctxt->am, oldend, oldstate); + break; + } + break; + } + case XML_ELEMENT_CONTENT_OR: { + xmlAutomataStatePtr oldstate, oldend; + xmlElementContentOccur ocur; + + ocur = content->ocur; + if ((ocur == XML_ELEMENT_CONTENT_PLUS) || + (ocur == XML_ELEMENT_CONTENT_MULT)) { + ctxt->state = xmlAutomataNewEpsilon(ctxt->am, + ctxt->state, NULL); + } + oldstate = ctxt->state; + oldend = xmlAutomataNewState(ctxt->am); + + /* + * iterate over the subtypes and remerge the end with an + * epsilon transition + */ + do { + ctxt->state = oldstate; + xmlValidBuildAContentModel(content->c1, ctxt, name); + xmlAutomataNewEpsilon(ctxt->am, ctxt->state, oldend); + content = content->c2; + } while ((content->type == XML_ELEMENT_CONTENT_OR) && + (content->ocur == XML_ELEMENT_CONTENT_ONCE)); + ctxt->state = oldstate; + xmlValidBuildAContentModel(content, ctxt, name); + xmlAutomataNewEpsilon(ctxt->am, ctxt->state, oldend); + ctxt->state = xmlAutomataNewEpsilon(ctxt->am, oldend, NULL); + switch (ocur) { + case XML_ELEMENT_CONTENT_ONCE: + break; + case XML_ELEMENT_CONTENT_OPT: + xmlAutomataNewEpsilon(ctxt->am, oldstate, ctxt->state); + break; + case XML_ELEMENT_CONTENT_MULT: + xmlAutomataNewEpsilon(ctxt->am, oldstate, ctxt->state); + xmlAutomataNewEpsilon(ctxt->am, oldend, oldstate); + break; + case XML_ELEMENT_CONTENT_PLUS: + xmlAutomataNewEpsilon(ctxt->am, oldend, oldstate); + break; + } + break; + } + default: + xmlErrValid(ctxt, XML_ERR_INTERNAL_ERROR, + "ContentModel broken for element %s\n", + (const char *) name); + return(0); + } + return(1); +} +/** + * xmlValidBuildContentModel: + * @ctxt: a validation context + * @elem: an element declaration node + * + * (Re)Build the automata associated to the content model of this + * element + * + * Returns 1 in case of success, 0 in case of error + */ +int +xmlValidBuildContentModel(xmlValidCtxtPtr ctxt, xmlElementPtr elem) { + + if ((ctxt == NULL) || (elem == NULL)) + return(0); + if (elem->type != XML_ELEMENT_DECL) + return(0); + if (elem->etype != XML_ELEMENT_TYPE_ELEMENT) + return(1); + /* TODO: should we rebuild in this case ? */ + if (elem->contModel != NULL) { + if (!xmlRegexpIsDeterminist(elem->contModel)) { + ctxt->valid = 0; + return(0); + } + return(1); + } + + ctxt->am = xmlNewAutomata(); + if (ctxt->am == NULL) { + xmlErrValidNode(ctxt, (xmlNodePtr) elem, + XML_ERR_INTERNAL_ERROR, + "Cannot create automata for element %s\n", + elem->name, NULL, NULL); + return(0); + } + ctxt->state = xmlAutomataGetInitState(ctxt->am); + xmlValidBuildAContentModel(elem->content, ctxt, elem->name); + xmlAutomataSetFinalState(ctxt->am, ctxt->state); + elem->contModel = xmlAutomataCompile(ctxt->am); + if (xmlRegexpIsDeterminist(elem->contModel) != 1) { + char expr[5000]; + expr[0] = 0; + xmlSnprintfElementContent(expr, 5000, elem->content, 1); + xmlErrValidNode(ctxt, (xmlNodePtr) elem, + XML_DTD_CONTENT_NOT_DETERMINIST, + "Content model of %s is not determinist: %s\n", + elem->name, BAD_CAST expr, NULL); +#ifdef DEBUG_REGEXP_ALGO + xmlRegexpPrint(stderr, elem->contModel); +#endif + ctxt->valid = 0; + ctxt->state = NULL; + xmlFreeAutomata(ctxt->am); + ctxt->am = NULL; + return(0); + } + ctxt->state = NULL; + xmlFreeAutomata(ctxt->am); + ctxt->am = NULL; + return(1); +} + +#endif /* LIBXML_REGEXP_ENABLED */ + +/**************************************************************** + * * + * Util functions for data allocation/deallocation * + * * + ****************************************************************/ + +/** + * xmlNewValidCtxt: + * + * Allocate a validation context structure. + * + * Returns NULL if not, otherwise the new validation context structure + */ +xmlValidCtxtPtr xmlNewValidCtxt(void) { + xmlValidCtxtPtr ret; + + if ((ret = xmlMalloc(sizeof (xmlValidCtxt))) == NULL) { + xmlVErrMemory(NULL, "malloc failed"); + return (NULL); + } + + (void) memset(ret, 0, sizeof (xmlValidCtxt)); + + return (ret); +} + +/** + * xmlFreeValidCtxt: + * @cur: the validation context to free + * + * Free a validation context structure. + */ +void +xmlFreeValidCtxt(xmlValidCtxtPtr cur) { + if (cur->vstateTab != NULL) + xmlFree(cur->vstateTab); + if (cur->nodeTab != NULL) + xmlFree(cur->nodeTab); + xmlFree(cur); +} + +#endif /* LIBXML_VALID_ENABLED */ + +/** + * xmlNewDocElementContent: + * @doc: the document + * @name: the subelement name or NULL + * @type: the type of element content decl + * + * Allocate an element content structure for the document. + * + * Returns NULL if not, otherwise the new element content structure + */ +xmlElementContentPtr +xmlNewDocElementContent(xmlDocPtr doc, const xmlChar *name, + xmlElementContentType type) { + xmlElementContentPtr ret; + xmlDictPtr dict = NULL; + + if (doc != NULL) + dict = doc->dict; + + switch(type) { + case XML_ELEMENT_CONTENT_ELEMENT: + if (name == NULL) { + xmlErrValid(NULL, XML_ERR_INTERNAL_ERROR, + "xmlNewElementContent : name == NULL !\n", + NULL); + } + break; + case XML_ELEMENT_CONTENT_PCDATA: + case XML_ELEMENT_CONTENT_SEQ: + case XML_ELEMENT_CONTENT_OR: + if (name != NULL) { + xmlErrValid(NULL, XML_ERR_INTERNAL_ERROR, + "xmlNewElementContent : name != NULL !\n", + NULL); + } + break; + default: + xmlErrValid(NULL, XML_ERR_INTERNAL_ERROR, + "Internal: ELEMENT content corrupted invalid type\n", + NULL); + return(NULL); + } + ret = (xmlElementContentPtr) xmlMalloc(sizeof(xmlElementContent)); + if (ret == NULL) { + xmlVErrMemory(NULL, "malloc failed"); + return(NULL); + } + memset(ret, 0, sizeof(xmlElementContent)); + ret->type = type; + ret->ocur = XML_ELEMENT_CONTENT_ONCE; + if (name != NULL) { + int l; + const xmlChar *tmp; + + tmp = xmlSplitQName3(name, &l); + if (tmp == NULL) { + if (dict == NULL) + ret->name = xmlStrdup(name); + else + ret->name = xmlDictLookup(dict, name, -1); + } else { + if (dict == NULL) { + ret->prefix = xmlStrndup(name, l); + ret->name = xmlStrdup(tmp); + } else { + ret->prefix = xmlDictLookup(dict, name, l); + ret->name = xmlDictLookup(dict, tmp, -1); + } + } + } + return(ret); +} + +/** + * xmlNewElementContent: + * @name: the subelement name or NULL + * @type: the type of element content decl + * + * Allocate an element content structure. + * Deprecated in favor of xmlNewDocElementContent + * + * Returns NULL if not, otherwise the new element content structure + */ +xmlElementContentPtr +xmlNewElementContent(const xmlChar *name, xmlElementContentType type) { + return(xmlNewDocElementContent(NULL, name, type)); +} + +/** + * xmlCopyDocElementContent: + * @doc: the document owning the element declaration + * @cur: An element content pointer. + * + * Build a copy of an element content description. + * + * Returns the new xmlElementContentPtr or NULL in case of error. + */ +xmlElementContentPtr +xmlCopyDocElementContent(xmlDocPtr doc, xmlElementContentPtr cur) { + xmlElementContentPtr ret = NULL, prev = NULL, tmp; + xmlDictPtr dict = NULL; + + if (cur == NULL) return(NULL); + + if (doc != NULL) + dict = doc->dict; + + ret = (xmlElementContentPtr) xmlMalloc(sizeof(xmlElementContent)); + if (ret == NULL) { + xmlVErrMemory(NULL, "malloc failed"); + return(NULL); + } + memset(ret, 0, sizeof(xmlElementContent)); + ret->type = cur->type; + ret->ocur = cur->ocur; + if (cur->name != NULL) { + if (dict) + ret->name = xmlDictLookup(dict, cur->name, -1); + else + ret->name = xmlStrdup(cur->name); + } + + if (cur->prefix != NULL) { + if (dict) + ret->prefix = xmlDictLookup(dict, cur->prefix, -1); + else + ret->prefix = xmlStrdup(cur->prefix); + } + if (cur->c1 != NULL) + ret->c1 = xmlCopyDocElementContent(doc, cur->c1); + if (ret->c1 != NULL) + ret->c1->parent = ret; + if (cur->c2 != NULL) { + prev = ret; + cur = cur->c2; + while (cur != NULL) { + tmp = (xmlElementContentPtr) xmlMalloc(sizeof(xmlElementContent)); + if (tmp == NULL) { + xmlVErrMemory(NULL, "malloc failed"); + return(ret); + } + memset(tmp, 0, sizeof(xmlElementContent)); + tmp->type = cur->type; + tmp->ocur = cur->ocur; + prev->c2 = tmp; + if (cur->name != NULL) { + if (dict) + tmp->name = xmlDictLookup(dict, cur->name, -1); + else + tmp->name = xmlStrdup(cur->name); + } + + if (cur->prefix != NULL) { + if (dict) + tmp->prefix = xmlDictLookup(dict, cur->prefix, -1); + else + tmp->prefix = xmlStrdup(cur->prefix); + } + if (cur->c1 != NULL) + tmp->c1 = xmlCopyDocElementContent(doc,cur->c1); + if (tmp->c1 != NULL) + tmp->c1->parent = ret; + prev = tmp; + cur = cur->c2; + } + } + return(ret); +} + +/** + * xmlCopyElementContent: + * @cur: An element content pointer. + * + * Build a copy of an element content description. + * Deprecated, use xmlCopyDocElementContent instead + * + * Returns the new xmlElementContentPtr or NULL in case of error. + */ +xmlElementContentPtr +xmlCopyElementContent(xmlElementContentPtr cur) { + return(xmlCopyDocElementContent(NULL, cur)); +} + +/** + * xmlFreeDocElementContent: + * @doc: the document owning the element declaration + * @cur: the element content tree to free + * + * Free an element content structure. The whole subtree is removed. + */ +void +xmlFreeDocElementContent(xmlDocPtr doc, xmlElementContentPtr cur) { + xmlElementContentPtr next; + xmlDictPtr dict = NULL; + + if (doc != NULL) + dict = doc->dict; + + while (cur != NULL) { + next = cur->c2; + switch (cur->type) { + case XML_ELEMENT_CONTENT_PCDATA: + case XML_ELEMENT_CONTENT_ELEMENT: + case XML_ELEMENT_CONTENT_SEQ: + case XML_ELEMENT_CONTENT_OR: + break; + default: + xmlErrValid(NULL, XML_ERR_INTERNAL_ERROR, + "Internal: ELEMENT content corrupted invalid type\n", + NULL); + return; + } + if (cur->c1 != NULL) xmlFreeDocElementContent(doc, cur->c1); + if (dict) { + if ((cur->name != NULL) && (!xmlDictOwns(dict, cur->name))) + xmlFree((xmlChar *) cur->name); + if ((cur->prefix != NULL) && (!xmlDictOwns(dict, cur->prefix))) + xmlFree((xmlChar *) cur->prefix); + } else { + if (cur->name != NULL) xmlFree((xmlChar *) cur->name); + if (cur->prefix != NULL) xmlFree((xmlChar *) cur->prefix); + } + xmlFree(cur); + cur = next; + } +} + +/** + * xmlFreeElementContent: + * @cur: the element content tree to free + * + * Free an element content structure. The whole subtree is removed. + * Deprecated, use xmlFreeDocElementContent instead + */ +void +xmlFreeElementContent(xmlElementContentPtr cur) { + xmlFreeDocElementContent(NULL, cur); +} + +#ifdef LIBXML_OUTPUT_ENABLED +/** + * xmlDumpElementContent: + * @buf: An XML buffer + * @content: An element table + * @glob: 1 if one must print the englobing parenthesis, 0 otherwise + * + * This will dump the content of the element table as an XML DTD definition + */ +static void +xmlDumpElementContent(xmlBufferPtr buf, xmlElementContentPtr content, int glob) { + if (content == NULL) return; + + if (glob) xmlBufferWriteChar(buf, "("); + switch (content->type) { + case XML_ELEMENT_CONTENT_PCDATA: + xmlBufferWriteChar(buf, "#PCDATA"); + break; + case XML_ELEMENT_CONTENT_ELEMENT: + if (content->prefix != NULL) { + xmlBufferWriteCHAR(buf, content->prefix); + xmlBufferWriteChar(buf, ":"); + } + xmlBufferWriteCHAR(buf, content->name); + break; + case XML_ELEMENT_CONTENT_SEQ: + if ((content->c1->type == XML_ELEMENT_CONTENT_OR) || + (content->c1->type == XML_ELEMENT_CONTENT_SEQ)) + xmlDumpElementContent(buf, content->c1, 1); + else + xmlDumpElementContent(buf, content->c1, 0); + xmlBufferWriteChar(buf, " , "); + if ((content->c2->type == XML_ELEMENT_CONTENT_OR) || + ((content->c2->type == XML_ELEMENT_CONTENT_SEQ) && + (content->c2->ocur != XML_ELEMENT_CONTENT_ONCE))) + xmlDumpElementContent(buf, content->c2, 1); + else + xmlDumpElementContent(buf, content->c2, 0); + break; + case XML_ELEMENT_CONTENT_OR: + if ((content->c1->type == XML_ELEMENT_CONTENT_OR) || + (content->c1->type == XML_ELEMENT_CONTENT_SEQ)) + xmlDumpElementContent(buf, content->c1, 1); + else + xmlDumpElementContent(buf, content->c1, 0); + xmlBufferWriteChar(buf, " | "); + if ((content->c2->type == XML_ELEMENT_CONTENT_SEQ) || + ((content->c2->type == XML_ELEMENT_CONTENT_OR) && + (content->c2->ocur != XML_ELEMENT_CONTENT_ONCE))) + xmlDumpElementContent(buf, content->c2, 1); + else + xmlDumpElementContent(buf, content->c2, 0); + break; + default: + xmlErrValid(NULL, XML_ERR_INTERNAL_ERROR, + "Internal: ELEMENT content corrupted invalid type\n", + NULL); + } + if (glob) + xmlBufferWriteChar(buf, ")"); + switch (content->ocur) { + case XML_ELEMENT_CONTENT_ONCE: + break; + case XML_ELEMENT_CONTENT_OPT: + xmlBufferWriteChar(buf, "?"); + break; + case XML_ELEMENT_CONTENT_MULT: + xmlBufferWriteChar(buf, "*"); + break; + case XML_ELEMENT_CONTENT_PLUS: + xmlBufferWriteChar(buf, "+"); + break; + } +} + +/** + * xmlSprintfElementContent: + * @buf: an output buffer + * @content: An element table + * @englob: 1 if one must print the englobing parenthesis, 0 otherwise + * + * Deprecated, unsafe, use xmlSnprintfElementContent + */ +void +xmlSprintfElementContent(char *buf ATTRIBUTE_UNUSED, + xmlElementContentPtr content ATTRIBUTE_UNUSED, + int englob ATTRIBUTE_UNUSED) { +} +#endif /* LIBXML_OUTPUT_ENABLED */ + +/** + * xmlSnprintfElementContent: + * @buf: an output buffer + * @size: the buffer size + * @content: An element table + * @englob: 1 if one must print the englobing parenthesis, 0 otherwise + * + * This will dump the content of the element content definition + * Intended just for the debug routine + */ +void +xmlSnprintfElementContent(char *buf, int size, xmlElementContentPtr content, int englob) { + int len; + + if (content == NULL) return; + len = strlen(buf); + if (size - len < 50) { + if ((size - len > 4) && (buf[len - 1] != '.')) + strcat(buf, " ..."); + return; + } + if (englob) strcat(buf, "("); + switch (content->type) { + case XML_ELEMENT_CONTENT_PCDATA: + strcat(buf, "#PCDATA"); + break; + case XML_ELEMENT_CONTENT_ELEMENT: + if (content->prefix != NULL) { + if (size - len < xmlStrlen(content->prefix) + 10) { + strcat(buf, " ..."); + return; + } + strcat(buf, (char *) content->prefix); + strcat(buf, ":"); + } + if (size - len < xmlStrlen(content->name) + 10) { + strcat(buf, " ..."); + return; + } + if (content->name != NULL) + strcat(buf, (char *) content->name); + break; + case XML_ELEMENT_CONTENT_SEQ: + if ((content->c1->type == XML_ELEMENT_CONTENT_OR) || + (content->c1->type == XML_ELEMENT_CONTENT_SEQ)) + xmlSnprintfElementContent(buf, size, content->c1, 1); + else + xmlSnprintfElementContent(buf, size, content->c1, 0); + len = strlen(buf); + if (size - len < 50) { + if ((size - len > 4) && (buf[len - 1] != '.')) + strcat(buf, " ..."); + return; + } + strcat(buf, " , "); + if (((content->c2->type == XML_ELEMENT_CONTENT_OR) || + (content->c2->ocur != XML_ELEMENT_CONTENT_ONCE)) && + (content->c2->type != XML_ELEMENT_CONTENT_ELEMENT)) + xmlSnprintfElementContent(buf, size, content->c2, 1); + else + xmlSnprintfElementContent(buf, size, content->c2, 0); + break; + case XML_ELEMENT_CONTENT_OR: + if ((content->c1->type == XML_ELEMENT_CONTENT_OR) || + (content->c1->type == XML_ELEMENT_CONTENT_SEQ)) + xmlSnprintfElementContent(buf, size, content->c1, 1); + else + xmlSnprintfElementContent(buf, size, content->c1, 0); + len = strlen(buf); + if (size - len < 50) { + if ((size - len > 4) && (buf[len - 1] != '.')) + strcat(buf, " ..."); + return; + } + strcat(buf, " | "); + if (((content->c2->type == XML_ELEMENT_CONTENT_SEQ) || + (content->c2->ocur != XML_ELEMENT_CONTENT_ONCE)) && + (content->c2->type != XML_ELEMENT_CONTENT_ELEMENT)) + xmlSnprintfElementContent(buf, size, content->c2, 1); + else + xmlSnprintfElementContent(buf, size, content->c2, 0); + break; + } + if (englob) + strcat(buf, ")"); + switch (content->ocur) { + case XML_ELEMENT_CONTENT_ONCE: + break; + case XML_ELEMENT_CONTENT_OPT: + strcat(buf, "?"); + break; + case XML_ELEMENT_CONTENT_MULT: + strcat(buf, "*"); + break; + case XML_ELEMENT_CONTENT_PLUS: + strcat(buf, "+"); + break; + } +} + +/**************************************************************** + * * + * Registration of DTD declarations * + * * + ****************************************************************/ + +/** + * xmlFreeElement: + * @elem: An element + * + * Deallocate the memory used by an element definition + */ +static void +xmlFreeElement(xmlElementPtr elem) { + if (elem == NULL) return; + xmlUnlinkNode((xmlNodePtr) elem); + xmlFreeDocElementContent(elem->doc, elem->content); + if (elem->name != NULL) + xmlFree((xmlChar *) elem->name); + if (elem->prefix != NULL) + xmlFree((xmlChar *) elem->prefix); +#ifdef LIBXML_REGEXP_ENABLED + if (elem->contModel != NULL) + xmlRegFreeRegexp(elem->contModel); +#endif + xmlFree(elem); +} + + +/** + * xmlAddElementDecl: + * @ctxt: the validation context + * @dtd: pointer to the DTD + * @name: the entity name + * @type: the element type + * @content: the element content tree or NULL + * + * Register a new element declaration + * + * Returns NULL if not, otherwise the entity + */ +xmlElementPtr +xmlAddElementDecl(xmlValidCtxtPtr ctxt, + xmlDtdPtr dtd, const xmlChar *name, + xmlElementTypeVal type, + xmlElementContentPtr content) { + xmlElementPtr ret; + xmlElementTablePtr table; + xmlAttributePtr oldAttributes = NULL; + xmlChar *ns, *uqname; + + if (dtd == NULL) { + return(NULL); + } + if (name == NULL) { + return(NULL); + } + + switch (type) { + case XML_ELEMENT_TYPE_EMPTY: + if (content != NULL) { + xmlErrValid(ctxt, XML_ERR_INTERNAL_ERROR, + "xmlAddElementDecl: content != NULL for EMPTY\n", + NULL); + return(NULL); + } + break; + case XML_ELEMENT_TYPE_ANY: + if (content != NULL) { + xmlErrValid(ctxt, XML_ERR_INTERNAL_ERROR, + "xmlAddElementDecl: content != NULL for ANY\n", + NULL); + return(NULL); + } + break; + case XML_ELEMENT_TYPE_MIXED: + if (content == NULL) { + xmlErrValid(ctxt, XML_ERR_INTERNAL_ERROR, + "xmlAddElementDecl: content == NULL for MIXED\n", + NULL); + return(NULL); + } + break; + case XML_ELEMENT_TYPE_ELEMENT: + if (content == NULL) { + xmlErrValid(ctxt, XML_ERR_INTERNAL_ERROR, + "xmlAddElementDecl: content == NULL for ELEMENT\n", + NULL); + return(NULL); + } + break; + default: + xmlErrValid(ctxt, XML_ERR_INTERNAL_ERROR, + "Internal: ELEMENT decl corrupted invalid type\n", + NULL); + return(NULL); + } + + /* + * check if name is a QName + */ + uqname = xmlSplitQName2(name, &ns); + if (uqname != NULL) + name = uqname; + + /* + * Create the Element table if needed. + */ + table = (xmlElementTablePtr) dtd->elements; + if (table == NULL) { + xmlDictPtr dict = NULL; + + if (dtd->doc != NULL) + dict = dtd->doc->dict; + table = xmlHashCreateDict(0, dict); + dtd->elements = (void *) table; + } + if (table == NULL) { + xmlVErrMemory(ctxt, + "xmlAddElementDecl: Table creation failed!\n"); + if (uqname != NULL) + xmlFree(uqname); + if (ns != NULL) + xmlFree(ns); + return(NULL); + } + + /* + * lookup old attributes inserted on an undefined element in the + * internal subset. + */ + if ((dtd->doc != NULL) && (dtd->doc->intSubset != NULL)) { + ret = xmlHashLookup2(dtd->doc->intSubset->elements, name, ns); + if ((ret != NULL) && (ret->etype == XML_ELEMENT_TYPE_UNDEFINED)) { + oldAttributes = ret->attributes; + ret->attributes = NULL; + xmlHashRemoveEntry2(dtd->doc->intSubset->elements, name, ns, NULL); + xmlFreeElement(ret); + } + } + + /* + * The element may already be present if one of its attribute + * was registered first + */ + ret = xmlHashLookup2(table, name, ns); + if (ret != NULL) { + if (ret->etype != XML_ELEMENT_TYPE_UNDEFINED) { +#ifdef LIBXML_VALID_ENABLED + /* + * The element is already defined in this DTD. + */ + xmlErrValidNode(ctxt, (xmlNodePtr) dtd, XML_DTD_ELEM_REDEFINED, + "Redefinition of element %s\n", + name, NULL, NULL); +#endif /* LIBXML_VALID_ENABLED */ + if (uqname != NULL) + xmlFree(uqname); + if (ns != NULL) + xmlFree(ns); + return(NULL); + } + if (ns != NULL) { + xmlFree(ns); + ns = NULL; + } + } else { + ret = (xmlElementPtr) xmlMalloc(sizeof(xmlElement)); + if (ret == NULL) { + xmlVErrMemory(ctxt, "malloc failed"); + if (uqname != NULL) + xmlFree(uqname); + if (ns != NULL) + xmlFree(ns); + return(NULL); + } + memset(ret, 0, sizeof(xmlElement)); + ret->type = XML_ELEMENT_DECL; + + /* + * fill the structure. + */ + ret->name = xmlStrdup(name); + if (ret->name == NULL) { + xmlVErrMemory(ctxt, "malloc failed"); + if (uqname != NULL) + xmlFree(uqname); + if (ns != NULL) + xmlFree(ns); + xmlFree(ret); + return(NULL); + } + ret->prefix = ns; + + /* + * Validity Check: + * Insertion must not fail + */ + if (xmlHashAddEntry2(table, name, ns, ret)) { +#ifdef LIBXML_VALID_ENABLED + /* + * The element is already defined in this DTD. + */ + xmlErrValidNode(ctxt, (xmlNodePtr) dtd, XML_DTD_ELEM_REDEFINED, + "Redefinition of element %s\n", + name, NULL, NULL); +#endif /* LIBXML_VALID_ENABLED */ + xmlFreeElement(ret); + if (uqname != NULL) + xmlFree(uqname); + return(NULL); + } + /* + * For new element, may have attributes from earlier + * definition in internal subset + */ + ret->attributes = oldAttributes; + } + + /* + * Finish to fill the structure. + */ + ret->etype = type; + /* + * Avoid a stupid copy when called by the parser + * and flag it by setting a special parent value + * so the parser doesn't unallocate it. + */ + if ((ctxt != NULL) && + ((ctxt->finishDtd == XML_CTXT_FINISH_DTD_0) || + (ctxt->finishDtd == XML_CTXT_FINISH_DTD_1))) { + ret->content = content; + if (content != NULL) + content->parent = (xmlElementContentPtr) 1; + } else { + ret->content = xmlCopyDocElementContent(dtd->doc, content); + } + + /* + * Link it to the DTD + */ + ret->parent = dtd; + ret->doc = dtd->doc; + if (dtd->last == NULL) { + dtd->children = dtd->last = (xmlNodePtr) ret; + } else { + dtd->last->next = (xmlNodePtr) ret; + ret->prev = dtd->last; + dtd->last = (xmlNodePtr) ret; + } + if (uqname != NULL) + xmlFree(uqname); + return(ret); +} + +/** + * xmlFreeElementTable: + * @table: An element table + * + * Deallocate the memory used by an element hash table. + */ +void +xmlFreeElementTable(xmlElementTablePtr table) { + xmlHashFree(table, (xmlHashDeallocator) xmlFreeElement); +} + +#ifdef LIBXML_TREE_ENABLED +/** + * xmlCopyElement: + * @elem: An element + * + * Build a copy of an element. + * + * Returns the new xmlElementPtr or NULL in case of error. + */ +static xmlElementPtr +xmlCopyElement(xmlElementPtr elem) { + xmlElementPtr cur; + + cur = (xmlElementPtr) xmlMalloc(sizeof(xmlElement)); + if (cur == NULL) { + xmlVErrMemory(NULL, "malloc failed"); + return(NULL); + } + memset(cur, 0, sizeof(xmlElement)); + cur->type = XML_ELEMENT_DECL; + cur->etype = elem->etype; + if (elem->name != NULL) + cur->name = xmlStrdup(elem->name); + else + cur->name = NULL; + if (elem->prefix != NULL) + cur->prefix = xmlStrdup(elem->prefix); + else + cur->prefix = NULL; + cur->content = xmlCopyElementContent(elem->content); + /* TODO : rebuild the attribute list on the copy */ + cur->attributes = NULL; + return(cur); +} + +/** + * xmlCopyElementTable: + * @table: An element table + * + * Build a copy of an element table. + * + * Returns the new xmlElementTablePtr or NULL in case of error. + */ +xmlElementTablePtr +xmlCopyElementTable(xmlElementTablePtr table) { + return((xmlElementTablePtr) xmlHashCopy(table, + (xmlHashCopier) xmlCopyElement)); +} +#endif /* LIBXML_TREE_ENABLED */ + +#ifdef LIBXML_OUTPUT_ENABLED +/** + * xmlDumpElementDecl: + * @buf: the XML buffer output + * @elem: An element table + * + * This will dump the content of the element declaration as an XML + * DTD definition + */ +void +xmlDumpElementDecl(xmlBufferPtr buf, xmlElementPtr elem) { + if ((buf == NULL) || (elem == NULL)) + return; + switch (elem->etype) { + case XML_ELEMENT_TYPE_EMPTY: + xmlBufferWriteChar(buf, "prefix != NULL) { + xmlBufferWriteCHAR(buf, elem->prefix); + xmlBufferWriteChar(buf, ":"); + } + xmlBufferWriteCHAR(buf, elem->name); + xmlBufferWriteChar(buf, " EMPTY>\n"); + break; + case XML_ELEMENT_TYPE_ANY: + xmlBufferWriteChar(buf, "prefix != NULL) { + xmlBufferWriteCHAR(buf, elem->prefix); + xmlBufferWriteChar(buf, ":"); + } + xmlBufferWriteCHAR(buf, elem->name); + xmlBufferWriteChar(buf, " ANY>\n"); + break; + case XML_ELEMENT_TYPE_MIXED: + xmlBufferWriteChar(buf, "prefix != NULL) { + xmlBufferWriteCHAR(buf, elem->prefix); + xmlBufferWriteChar(buf, ":"); + } + xmlBufferWriteCHAR(buf, elem->name); + xmlBufferWriteChar(buf, " "); + xmlDumpElementContent(buf, elem->content, 1); + xmlBufferWriteChar(buf, ">\n"); + break; + case XML_ELEMENT_TYPE_ELEMENT: + xmlBufferWriteChar(buf, "prefix != NULL) { + xmlBufferWriteCHAR(buf, elem->prefix); + xmlBufferWriteChar(buf, ":"); + } + xmlBufferWriteCHAR(buf, elem->name); + xmlBufferWriteChar(buf, " "); + xmlDumpElementContent(buf, elem->content, 1); + xmlBufferWriteChar(buf, ">\n"); + break; + default: + xmlErrValid(NULL, XML_ERR_INTERNAL_ERROR, + "Internal: ELEMENT struct corrupted invalid type\n", + NULL); + } +} + +/** + * xmlDumpElementDeclScan: + * @elem: An element table + * @buf: the XML buffer output + * + * This routine is used by the hash scan function. It just reverses + * the arguments. + */ +static void +xmlDumpElementDeclScan(xmlElementPtr elem, xmlBufferPtr buf) { + xmlDumpElementDecl(buf, elem); +} + +/** + * xmlDumpElementTable: + * @buf: the XML buffer output + * @table: An element table + * + * This will dump the content of the element table as an XML DTD definition + */ +void +xmlDumpElementTable(xmlBufferPtr buf, xmlElementTablePtr table) { + if ((buf == NULL) || (table == NULL)) + return; + xmlHashScan(table, (xmlHashScanner) xmlDumpElementDeclScan, buf); +} +#endif /* LIBXML_OUTPUT_ENABLED */ + +/** + * xmlCreateEnumeration: + * @name: the enumeration name or NULL + * + * create and initialize an enumeration attribute node. + * + * Returns the xmlEnumerationPtr just created or NULL in case + * of error. + */ +xmlEnumerationPtr +xmlCreateEnumeration(const xmlChar *name) { + xmlEnumerationPtr ret; + + ret = (xmlEnumerationPtr) xmlMalloc(sizeof(xmlEnumeration)); + if (ret == NULL) { + xmlVErrMemory(NULL, "malloc failed"); + return(NULL); + } + memset(ret, 0, sizeof(xmlEnumeration)); + + if (name != NULL) + ret->name = xmlStrdup(name); + return(ret); +} + +/** + * xmlFreeEnumeration: + * @cur: the tree to free. + * + * free an enumeration attribute node (recursive). + */ +void +xmlFreeEnumeration(xmlEnumerationPtr cur) { + if (cur == NULL) return; + + if (cur->next != NULL) xmlFreeEnumeration(cur->next); + + if (cur->name != NULL) xmlFree((xmlChar *) cur->name); + xmlFree(cur); +} + +#ifdef LIBXML_TREE_ENABLED +/** + * xmlCopyEnumeration: + * @cur: the tree to copy. + * + * Copy an enumeration attribute node (recursive). + * + * Returns the xmlEnumerationPtr just created or NULL in case + * of error. + */ +xmlEnumerationPtr +xmlCopyEnumeration(xmlEnumerationPtr cur) { + xmlEnumerationPtr ret; + + if (cur == NULL) return(NULL); + ret = xmlCreateEnumeration((xmlChar *) cur->name); + + if (cur->next != NULL) ret->next = xmlCopyEnumeration(cur->next); + else ret->next = NULL; + + return(ret); +} +#endif /* LIBXML_TREE_ENABLED */ + +#ifdef LIBXML_OUTPUT_ENABLED +/** + * xmlDumpEnumeration: + * @buf: the XML buffer output + * @enum: An enumeration + * + * This will dump the content of the enumeration + */ +static void +xmlDumpEnumeration(xmlBufferPtr buf, xmlEnumerationPtr cur) { + if ((buf == NULL) || (cur == NULL)) + return; + + xmlBufferWriteCHAR(buf, cur->name); + if (cur->next == NULL) + xmlBufferWriteChar(buf, ")"); + else { + xmlBufferWriteChar(buf, " | "); + xmlDumpEnumeration(buf, cur->next); + } +} +#endif /* LIBXML_OUTPUT_ENABLED */ + +#ifdef LIBXML_VALID_ENABLED +/** + * xmlScanIDAttributeDecl: + * @ctxt: the validation context + * @elem: the element name + * @err: whether to raise errors here + * + * Verify that the element don't have too many ID attributes + * declared. + * + * Returns the number of ID attributes found. + */ +static int +xmlScanIDAttributeDecl(xmlValidCtxtPtr ctxt, xmlElementPtr elem, int err) { + xmlAttributePtr cur; + int ret = 0; + + if (elem == NULL) return(0); + cur = elem->attributes; + while (cur != NULL) { + if (cur->atype == XML_ATTRIBUTE_ID) { + ret ++; + if ((ret > 1) && (err)) + xmlErrValidNode(ctxt, (xmlNodePtr) elem, XML_DTD_MULTIPLE_ID, + "Element %s has too many ID attributes defined : %s\n", + elem->name, cur->name, NULL); + } + cur = cur->nexth; + } + return(ret); +} +#endif /* LIBXML_VALID_ENABLED */ + +/** + * xmlFreeAttribute: + * @elem: An attribute + * + * Deallocate the memory used by an attribute definition + */ +static void +xmlFreeAttribute(xmlAttributePtr attr) { + xmlDictPtr dict; + + if (attr == NULL) return; + if (attr->doc != NULL) + dict = attr->doc->dict; + else + dict = NULL; + xmlUnlinkNode((xmlNodePtr) attr); + if (attr->tree != NULL) + xmlFreeEnumeration(attr->tree); + if (dict) { + if ((attr->elem != NULL) && (!xmlDictOwns(dict, attr->elem))) + xmlFree((xmlChar *) attr->elem); + if ((attr->name != NULL) && (!xmlDictOwns(dict, attr->name))) + xmlFree((xmlChar *) attr->name); + if ((attr->prefix != NULL) && (!xmlDictOwns(dict, attr->prefix))) + xmlFree((xmlChar *) attr->prefix); + if ((attr->defaultValue != NULL) && + (!xmlDictOwns(dict, attr->defaultValue))) + xmlFree((xmlChar *) attr->defaultValue); + } else { + if (attr->elem != NULL) + xmlFree((xmlChar *) attr->elem); + if (attr->name != NULL) + xmlFree((xmlChar *) attr->name); + if (attr->defaultValue != NULL) + xmlFree((xmlChar *) attr->defaultValue); + if (attr->prefix != NULL) + xmlFree((xmlChar *) attr->prefix); + } + xmlFree(attr); +} + + +/** + * xmlAddAttributeDecl: + * @ctxt: the validation context + * @dtd: pointer to the DTD + * @elem: the element name + * @name: the attribute name + * @ns: the attribute namespace prefix + * @type: the attribute type + * @def: the attribute default type + * @defaultValue: the attribute default value + * @tree: if it's an enumeration, the associated list + * + * Register a new attribute declaration + * Note that @tree becomes the ownership of the DTD + * + * Returns NULL if not new, otherwise the attribute decl + */ +xmlAttributePtr +xmlAddAttributeDecl(xmlValidCtxtPtr ctxt, + xmlDtdPtr dtd, const xmlChar *elem, + const xmlChar *name, const xmlChar *ns, + xmlAttributeType type, xmlAttributeDefault def, + const xmlChar *defaultValue, xmlEnumerationPtr tree) { + xmlAttributePtr ret; + xmlAttributeTablePtr table; + xmlElementPtr elemDef; + xmlDictPtr dict = NULL; + + if (dtd == NULL) { + xmlFreeEnumeration(tree); + return(NULL); + } + if (name == NULL) { + xmlFreeEnumeration(tree); + return(NULL); + } + if (elem == NULL) { + xmlFreeEnumeration(tree); + return(NULL); + } + if (dtd->doc != NULL) + dict = dtd->doc->dict; + +#ifdef LIBXML_VALID_ENABLED + /* + * Check the type and possibly the default value. + */ + switch (type) { + case XML_ATTRIBUTE_CDATA: + break; + case XML_ATTRIBUTE_ID: + break; + case XML_ATTRIBUTE_IDREF: + break; + case XML_ATTRIBUTE_IDREFS: + break; + case XML_ATTRIBUTE_ENTITY: + break; + case XML_ATTRIBUTE_ENTITIES: + break; + case XML_ATTRIBUTE_NMTOKEN: + break; + case XML_ATTRIBUTE_NMTOKENS: + break; + case XML_ATTRIBUTE_ENUMERATION: + break; + case XML_ATTRIBUTE_NOTATION: + break; + default: + xmlErrValid(ctxt, XML_ERR_INTERNAL_ERROR, + "Internal: ATTRIBUTE struct corrupted invalid type\n", + NULL); + xmlFreeEnumeration(tree); + return(NULL); + } + if ((defaultValue != NULL) && + (!xmlValidateAttributeValueInternal(dtd->doc, type, defaultValue))) { + xmlErrValidNode(ctxt, (xmlNodePtr) dtd, XML_DTD_ATTRIBUTE_DEFAULT, + "Attribute %s of %s: invalid default value\n", + elem, name, defaultValue); + defaultValue = NULL; + if (ctxt != NULL) + ctxt->valid = 0; + } +#endif /* LIBXML_VALID_ENABLED */ + + /* + * Check first that an attribute defined in the external subset wasn't + * already defined in the internal subset + */ + if ((dtd->doc != NULL) && (dtd->doc->extSubset == dtd) && + (dtd->doc->intSubset != NULL) && + (dtd->doc->intSubset->attributes != NULL)) { + ret = xmlHashLookup3(dtd->doc->intSubset->attributes, name, ns, elem); + if (ret != NULL) { + xmlFreeEnumeration(tree); + return(NULL); + } + } + + /* + * Create the Attribute table if needed. + */ + table = (xmlAttributeTablePtr) dtd->attributes; + if (table == NULL) { + table = xmlHashCreateDict(0, dict); + dtd->attributes = (void *) table; + } + if (table == NULL) { + xmlVErrMemory(ctxt, + "xmlAddAttributeDecl: Table creation failed!\n"); + xmlFreeEnumeration(tree); + return(NULL); + } + + + ret = (xmlAttributePtr) xmlMalloc(sizeof(xmlAttribute)); + if (ret == NULL) { + xmlVErrMemory(ctxt, "malloc failed"); + xmlFreeEnumeration(tree); + return(NULL); + } + memset(ret, 0, sizeof(xmlAttribute)); + ret->type = XML_ATTRIBUTE_DECL; + + /* + * fill the structure. + */ + ret->atype = type; + /* + * doc must be set before possible error causes call + * to xmlFreeAttribute (because it's used to check on + * dict use) + */ + ret->doc = dtd->doc; + if (dict) { + ret->name = xmlDictLookup(dict, name, -1); + ret->prefix = xmlDictLookup(dict, ns, -1); + ret->elem = xmlDictLookup(dict, elem, -1); + } else { + ret->name = xmlStrdup(name); + ret->prefix = xmlStrdup(ns); + ret->elem = xmlStrdup(elem); + } + ret->def = def; + ret->tree = tree; + if (defaultValue != NULL) { + if (dict) + ret->defaultValue = xmlDictLookup(dict, defaultValue, -1); + else + ret->defaultValue = xmlStrdup(defaultValue); + } + + /* + * Validity Check: + * Search the DTD for previous declarations of the ATTLIST + */ + if (xmlHashAddEntry3(table, ret->name, ret->prefix, ret->elem, ret) < 0) { +#ifdef LIBXML_VALID_ENABLED + /* + * The attribute is already defined in this DTD. + */ + xmlErrValidWarning(ctxt, (xmlNodePtr) dtd, XML_DTD_ATTRIBUTE_REDEFINED, + "Attribute %s of element %s: already defined\n", + name, elem, NULL); +#endif /* LIBXML_VALID_ENABLED */ + xmlFreeAttribute(ret); + return(NULL); + } + + /* + * Validity Check: + * Multiple ID per element + */ + elemDef = xmlGetDtdElementDesc2(dtd, elem, 1); + if (elemDef != NULL) { + +#ifdef LIBXML_VALID_ENABLED + if ((type == XML_ATTRIBUTE_ID) && + (xmlScanIDAttributeDecl(NULL, elemDef, 1) != 0)) { + xmlErrValidNode(ctxt, (xmlNodePtr) dtd, XML_DTD_MULTIPLE_ID, + "Element %s has too may ID attributes defined : %s\n", + elem, name, NULL); + if (ctxt != NULL) + ctxt->valid = 0; + } +#endif /* LIBXML_VALID_ENABLED */ + + /* + * Insert namespace default def first they need to be + * processed first. + */ + if ((xmlStrEqual(ret->name, BAD_CAST "xmlns")) || + ((ret->prefix != NULL && + (xmlStrEqual(ret->prefix, BAD_CAST "xmlns"))))) { + ret->nexth = elemDef->attributes; + elemDef->attributes = ret; + } else { + xmlAttributePtr tmp = elemDef->attributes; + + while ((tmp != NULL) && + ((xmlStrEqual(tmp->name, BAD_CAST "xmlns")) || + ((ret->prefix != NULL && + (xmlStrEqual(ret->prefix, BAD_CAST "xmlns")))))) { + if (tmp->nexth == NULL) + break; + tmp = tmp->nexth; + } + if (tmp != NULL) { + ret->nexth = tmp->nexth; + tmp->nexth = ret; + } else { + ret->nexth = elemDef->attributes; + elemDef->attributes = ret; + } + } + } + + /* + * Link it to the DTD + */ + ret->parent = dtd; + if (dtd->last == NULL) { + dtd->children = dtd->last = (xmlNodePtr) ret; + } else { + dtd->last->next = (xmlNodePtr) ret; + ret->prev = dtd->last; + dtd->last = (xmlNodePtr) ret; + } + return(ret); +} + +/** + * xmlFreeAttributeTable: + * @table: An attribute table + * + * Deallocate the memory used by an entities hash table. + */ +void +xmlFreeAttributeTable(xmlAttributeTablePtr table) { + xmlHashFree(table, (xmlHashDeallocator) xmlFreeAttribute); +} + +#ifdef LIBXML_TREE_ENABLED +/** + * xmlCopyAttribute: + * @attr: An attribute + * + * Build a copy of an attribute. + * + * Returns the new xmlAttributePtr or NULL in case of error. + */ +static xmlAttributePtr +xmlCopyAttribute(xmlAttributePtr attr) { + xmlAttributePtr cur; + + cur = (xmlAttributePtr) xmlMalloc(sizeof(xmlAttribute)); + if (cur == NULL) { + xmlVErrMemory(NULL, "malloc failed"); + return(NULL); + } + memset(cur, 0, sizeof(xmlAttribute)); + cur->type = XML_ATTRIBUTE_DECL; + cur->atype = attr->atype; + cur->def = attr->def; + cur->tree = xmlCopyEnumeration(attr->tree); + if (attr->elem != NULL) + cur->elem = xmlStrdup(attr->elem); + if (attr->name != NULL) + cur->name = xmlStrdup(attr->name); + if (attr->prefix != NULL) + cur->prefix = xmlStrdup(attr->prefix); + if (attr->defaultValue != NULL) + cur->defaultValue = xmlStrdup(attr->defaultValue); + return(cur); +} + +/** + * xmlCopyAttributeTable: + * @table: An attribute table + * + * Build a copy of an attribute table. + * + * Returns the new xmlAttributeTablePtr or NULL in case of error. + */ +xmlAttributeTablePtr +xmlCopyAttributeTable(xmlAttributeTablePtr table) { + return((xmlAttributeTablePtr) xmlHashCopy(table, + (xmlHashCopier) xmlCopyAttribute)); +} +#endif /* LIBXML_TREE_ENABLED */ + +#ifdef LIBXML_OUTPUT_ENABLED +/** + * xmlDumpAttributeDecl: + * @buf: the XML buffer output + * @attr: An attribute declaration + * + * This will dump the content of the attribute declaration as an XML + * DTD definition + */ +void +xmlDumpAttributeDecl(xmlBufferPtr buf, xmlAttributePtr attr) { + if ((buf == NULL) || (attr == NULL)) + return; + xmlBufferWriteChar(buf, "elem); + xmlBufferWriteChar(buf, " "); + if (attr->prefix != NULL) { + xmlBufferWriteCHAR(buf, attr->prefix); + xmlBufferWriteChar(buf, ":"); + } + xmlBufferWriteCHAR(buf, attr->name); + switch (attr->atype) { + case XML_ATTRIBUTE_CDATA: + xmlBufferWriteChar(buf, " CDATA"); + break; + case XML_ATTRIBUTE_ID: + xmlBufferWriteChar(buf, " ID"); + break; + case XML_ATTRIBUTE_IDREF: + xmlBufferWriteChar(buf, " IDREF"); + break; + case XML_ATTRIBUTE_IDREFS: + xmlBufferWriteChar(buf, " IDREFS"); + break; + case XML_ATTRIBUTE_ENTITY: + xmlBufferWriteChar(buf, " ENTITY"); + break; + case XML_ATTRIBUTE_ENTITIES: + xmlBufferWriteChar(buf, " ENTITIES"); + break; + case XML_ATTRIBUTE_NMTOKEN: + xmlBufferWriteChar(buf, " NMTOKEN"); + break; + case XML_ATTRIBUTE_NMTOKENS: + xmlBufferWriteChar(buf, " NMTOKENS"); + break; + case XML_ATTRIBUTE_ENUMERATION: + xmlBufferWriteChar(buf, " ("); + xmlDumpEnumeration(buf, attr->tree); + break; + case XML_ATTRIBUTE_NOTATION: + xmlBufferWriteChar(buf, " NOTATION ("); + xmlDumpEnumeration(buf, attr->tree); + break; + default: + xmlErrValid(NULL, XML_ERR_INTERNAL_ERROR, + "Internal: ATTRIBUTE struct corrupted invalid type\n", + NULL); + } + switch (attr->def) { + case XML_ATTRIBUTE_NONE: + break; + case XML_ATTRIBUTE_REQUIRED: + xmlBufferWriteChar(buf, " #REQUIRED"); + break; + case XML_ATTRIBUTE_IMPLIED: + xmlBufferWriteChar(buf, " #IMPLIED"); + break; + case XML_ATTRIBUTE_FIXED: + xmlBufferWriteChar(buf, " #FIXED"); + break; + default: + xmlErrValid(NULL, XML_ERR_INTERNAL_ERROR, + "Internal: ATTRIBUTE struct corrupted invalid def\n", + NULL); + } + if (attr->defaultValue != NULL) { + xmlBufferWriteChar(buf, " "); + xmlBufferWriteQuotedString(buf, attr->defaultValue); + } + xmlBufferWriteChar(buf, ">\n"); +} + +/** + * xmlDumpAttributeDeclScan: + * @attr: An attribute declaration + * @buf: the XML buffer output + * + * This is used with the hash scan function - just reverses arguments + */ +static void +xmlDumpAttributeDeclScan(xmlAttributePtr attr, xmlBufferPtr buf) { + xmlDumpAttributeDecl(buf, attr); +} + +/** + * xmlDumpAttributeTable: + * @buf: the XML buffer output + * @table: An attribute table + * + * This will dump the content of the attribute table as an XML DTD definition + */ +void +xmlDumpAttributeTable(xmlBufferPtr buf, xmlAttributeTablePtr table) { + if ((buf == NULL) || (table == NULL)) + return; + xmlHashScan(table, (xmlHashScanner) xmlDumpAttributeDeclScan, buf); +} +#endif /* LIBXML_OUTPUT_ENABLED */ + +/************************************************************************ + * * + * NOTATIONs * + * * + ************************************************************************/ +/** + * xmlFreeNotation: + * @not: A notation + * + * Deallocate the memory used by an notation definition + */ +static void +xmlFreeNotation(xmlNotationPtr nota) { + if (nota == NULL) return; + if (nota->name != NULL) + xmlFree((xmlChar *) nota->name); + if (nota->PublicID != NULL) + xmlFree((xmlChar *) nota->PublicID); + if (nota->SystemID != NULL) + xmlFree((xmlChar *) nota->SystemID); + xmlFree(nota); +} + + +/** + * xmlAddNotationDecl: + * @dtd: pointer to the DTD + * @ctxt: the validation context + * @name: the entity name + * @PublicID: the public identifier or NULL + * @SystemID: the system identifier or NULL + * + * Register a new notation declaration + * + * Returns NULL if not, otherwise the entity + */ +xmlNotationPtr +xmlAddNotationDecl(xmlValidCtxtPtr ctxt, xmlDtdPtr dtd, + const xmlChar *name, + const xmlChar *PublicID, const xmlChar *SystemID) { + xmlNotationPtr ret; + xmlNotationTablePtr table; + + if (dtd == NULL) { + return(NULL); + } + if (name == NULL) { + return(NULL); + } + if ((PublicID == NULL) && (SystemID == NULL)) { + return(NULL); + } + + /* + * Create the Notation table if needed. + */ + table = (xmlNotationTablePtr) dtd->notations; + if (table == NULL) { + xmlDictPtr dict = NULL; + if (dtd->doc != NULL) + dict = dtd->doc->dict; + + dtd->notations = table = xmlHashCreateDict(0, dict); + } + if (table == NULL) { + xmlVErrMemory(ctxt, + "xmlAddNotationDecl: Table creation failed!\n"); + return(NULL); + } + + ret = (xmlNotationPtr) xmlMalloc(sizeof(xmlNotation)); + if (ret == NULL) { + xmlVErrMemory(ctxt, "malloc failed"); + return(NULL); + } + memset(ret, 0, sizeof(xmlNotation)); + + /* + * fill the structure. + */ + ret->name = xmlStrdup(name); + if (SystemID != NULL) + ret->SystemID = xmlStrdup(SystemID); + if (PublicID != NULL) + ret->PublicID = xmlStrdup(PublicID); + + /* + * Validity Check: + * Check the DTD for previous declarations of the ATTLIST + */ + if (xmlHashAddEntry(table, name, ret)) { +#ifdef LIBXML_VALID_ENABLED + xmlErrValid(NULL, XML_DTD_NOTATION_REDEFINED, + "xmlAddNotationDecl: %s already defined\n", + (const char *) name); +#endif /* LIBXML_VALID_ENABLED */ + xmlFreeNotation(ret); + return(NULL); + } + return(ret); +} + +/** + * xmlFreeNotationTable: + * @table: An notation table + * + * Deallocate the memory used by an entities hash table. + */ +void +xmlFreeNotationTable(xmlNotationTablePtr table) { + xmlHashFree(table, (xmlHashDeallocator) xmlFreeNotation); +} + +#ifdef LIBXML_TREE_ENABLED +/** + * xmlCopyNotation: + * @nota: A notation + * + * Build a copy of a notation. + * + * Returns the new xmlNotationPtr or NULL in case of error. + */ +static xmlNotationPtr +xmlCopyNotation(xmlNotationPtr nota) { + xmlNotationPtr cur; + + cur = (xmlNotationPtr) xmlMalloc(sizeof(xmlNotation)); + if (cur == NULL) { + xmlVErrMemory(NULL, "malloc failed"); + return(NULL); + } + if (nota->name != NULL) + cur->name = xmlStrdup(nota->name); + else + cur->name = NULL; + if (nota->PublicID != NULL) + cur->PublicID = xmlStrdup(nota->PublicID); + else + cur->PublicID = NULL; + if (nota->SystemID != NULL) + cur->SystemID = xmlStrdup(nota->SystemID); + else + cur->SystemID = NULL; + return(cur); +} + +/** + * xmlCopyNotationTable: + * @table: A notation table + * + * Build a copy of a notation table. + * + * Returns the new xmlNotationTablePtr or NULL in case of error. + */ +xmlNotationTablePtr +xmlCopyNotationTable(xmlNotationTablePtr table) { + return((xmlNotationTablePtr) xmlHashCopy(table, + (xmlHashCopier) xmlCopyNotation)); +} +#endif /* LIBXML_TREE_ENABLED */ + +#ifdef LIBXML_OUTPUT_ENABLED +/** + * xmlDumpNotationDecl: + * @buf: the XML buffer output + * @nota: A notation declaration + * + * This will dump the content the notation declaration as an XML DTD definition + */ +void +xmlDumpNotationDecl(xmlBufferPtr buf, xmlNotationPtr nota) { + if ((buf == NULL) || (nota == NULL)) + return; + xmlBufferWriteChar(buf, "name); + if (nota->PublicID != NULL) { + xmlBufferWriteChar(buf, " PUBLIC "); + xmlBufferWriteQuotedString(buf, nota->PublicID); + if (nota->SystemID != NULL) { + xmlBufferWriteChar(buf, " "); + xmlBufferWriteQuotedString(buf, nota->SystemID); + } + } else { + xmlBufferWriteChar(buf, " SYSTEM "); + xmlBufferWriteQuotedString(buf, nota->SystemID); + } + xmlBufferWriteChar(buf, " >\n"); +} + +/** + * xmlDumpNotationDeclScan: + * @nota: A notation declaration + * @buf: the XML buffer output + * + * This is called with the hash scan function, and just reverses args + */ +static void +xmlDumpNotationDeclScan(xmlNotationPtr nota, xmlBufferPtr buf) { + xmlDumpNotationDecl(buf, nota); +} + +/** + * xmlDumpNotationTable: + * @buf: the XML buffer output + * @table: A notation table + * + * This will dump the content of the notation table as an XML DTD definition + */ +void +xmlDumpNotationTable(xmlBufferPtr buf, xmlNotationTablePtr table) { + if ((buf == NULL) || (table == NULL)) + return; + xmlHashScan(table, (xmlHashScanner) xmlDumpNotationDeclScan, buf); +} +#endif /* LIBXML_OUTPUT_ENABLED */ + +/************************************************************************ + * * + * IDs * + * * + ************************************************************************/ +/** + * DICT_FREE: + * @str: a string + * + * Free a string if it is not owned by the "dict" dictionnary in the + * current scope + */ +#define DICT_FREE(str) \ + if ((str) && ((!dict) || \ + (xmlDictOwns(dict, (const xmlChar *)(str)) == 0))) \ + xmlFree((char *)(str)); + +/** + * xmlFreeID: + * @not: A id + * + * Deallocate the memory used by an id definition + */ +static void +xmlFreeID(xmlIDPtr id) { + xmlDictPtr dict = NULL; + + if (id == NULL) return; + + if (id->doc != NULL) + dict = id->doc->dict; + + if (id->value != NULL) + DICT_FREE(id->value) + if (id->name != NULL) + DICT_FREE(id->name) + xmlFree(id); +} + + +/** + * xmlAddID: + * @ctxt: the validation context + * @doc: pointer to the document + * @value: the value name + * @attr: the attribute holding the ID + * + * Register a new id declaration + * + * Returns NULL if not, otherwise the new xmlIDPtr + */ +xmlIDPtr +xmlAddID(xmlValidCtxtPtr ctxt, xmlDocPtr doc, const xmlChar *value, + xmlAttrPtr attr) { + xmlIDPtr ret; + xmlIDTablePtr table; + + if (doc == NULL) { + return(NULL); + } + if (value == NULL) { + return(NULL); + } + if (attr == NULL) { + return(NULL); + } + + /* + * Create the ID table if needed. + */ + table = (xmlIDTablePtr) doc->ids; + if (table == NULL) { + doc->ids = table = xmlHashCreateDict(0, doc->dict); + } + if (table == NULL) { + xmlVErrMemory(ctxt, + "xmlAddID: Table creation failed!\n"); + return(NULL); + } + + ret = (xmlIDPtr) xmlMalloc(sizeof(xmlID)); + if (ret == NULL) { + xmlVErrMemory(ctxt, "malloc failed"); + return(NULL); + } + + /* + * fill the structure. + */ + ret->value = xmlStrdup(value); + ret->doc = doc; + if ((ctxt != NULL) && (ctxt->vstateNr != 0)) { + /* + * Operating in streaming mode, attr is gonna disapear + */ + if (doc->dict != NULL) + ret->name = xmlDictLookup(doc->dict, attr->name, -1); + else + ret->name = xmlStrdup(attr->name); + ret->attr = NULL; + } else { + ret->attr = attr; + ret->name = NULL; + } + ret->lineno = xmlGetLineNo(attr->parent); + + if (xmlHashAddEntry(table, value, ret) < 0) { +#ifdef LIBXML_VALID_ENABLED + /* + * The id is already defined in this DTD. + */ + if ((ctxt != NULL) && (ctxt->error != NULL)) { + xmlErrValidNode(ctxt, attr->parent, XML_DTD_ID_REDEFINED, + "ID %s already defined\n", + value, NULL, NULL); + } +#endif /* LIBXML_VALID_ENABLED */ + xmlFreeID(ret); + return(NULL); + } + if (attr != NULL) + attr->atype = XML_ATTRIBUTE_ID; + return(ret); +} + +/** + * xmlFreeIDTable: + * @table: An id table + * + * Deallocate the memory used by an ID hash table. + */ +void +xmlFreeIDTable(xmlIDTablePtr table) { + xmlHashFree(table, (xmlHashDeallocator) xmlFreeID); +} + +/** + * xmlIsID: + * @doc: the document + * @elem: the element carrying the attribute + * @attr: the attribute + * + * Determine whether an attribute is of type ID. In case we have DTD(s) + * then this is done if DTD loading has been requested. In the case + * of HTML documents parsed with the HTML parser, then ID detection is + * done systematically. + * + * Returns 0 or 1 depending on the lookup result + */ +int +xmlIsID(xmlDocPtr doc, xmlNodePtr elem, xmlAttrPtr attr) { + if ((attr == NULL) || (attr->name == NULL)) return(0); + if ((attr->ns != NULL) && (attr->ns->prefix != NULL) && + (!strcmp((char *) attr->name, "id")) && + (!strcmp((char *) attr->ns->prefix, "xml"))) + return(1); + if (doc == NULL) return(0); + if ((doc->intSubset == NULL) && (doc->extSubset == NULL) && + (doc->type != XML_HTML_DOCUMENT_NODE)) { + return(0); + } else if (doc->type == XML_HTML_DOCUMENT_NODE) { + if ((xmlStrEqual(BAD_CAST "id", attr->name)) || + ((xmlStrEqual(BAD_CAST "name", attr->name)) && + ((elem == NULL) || (xmlStrEqual(elem->name, BAD_CAST "a"))))) + return(1); + return(0); + } else if (elem == NULL) { + return(0); + } else { + xmlAttributePtr attrDecl = NULL; + + xmlChar felem[50], fattr[50]; + xmlChar *fullelemname, *fullattrname; + + fullelemname = (elem->ns != NULL && elem->ns->prefix != NULL) ? + xmlBuildQName(elem->name, elem->ns->prefix, felem, 50) : + (xmlChar *)elem->name; + + fullattrname = (attr->ns != NULL && attr->ns->prefix != NULL) ? + xmlBuildQName(attr->name, attr->ns->prefix, fattr, 50) : + (xmlChar *)attr->name; + + if (fullelemname != NULL && fullattrname != NULL) { + attrDecl = xmlGetDtdAttrDesc(doc->intSubset, fullelemname, + fullattrname); + if ((attrDecl == NULL) && (doc->extSubset != NULL)) + attrDecl = xmlGetDtdAttrDesc(doc->extSubset, fullelemname, + fullattrname); + } + + if ((fullattrname != fattr) && (fullattrname != attr->name)) + xmlFree(fullattrname); + if ((fullelemname != felem) && (fullelemname != elem->name)) + xmlFree(fullelemname); + + if ((attrDecl != NULL) && (attrDecl->atype == XML_ATTRIBUTE_ID)) + return(1); + } + return(0); +} + +/** + * xmlRemoveID: + * @doc: the document + * @attr: the attribute + * + * Remove the given attribute from the ID table maintained internally. + * + * Returns -1 if the lookup failed and 0 otherwise + */ +int +xmlRemoveID(xmlDocPtr doc, xmlAttrPtr attr) { + xmlIDTablePtr table; + xmlIDPtr id; + xmlChar *ID; + + if (doc == NULL) return(-1); + if (attr == NULL) return(-1); + table = (xmlIDTablePtr) doc->ids; + if (table == NULL) + return(-1); + + if (attr == NULL) + return(-1); + ID = xmlNodeListGetString(doc, attr->children, 1); + if (ID == NULL) + return(-1); + id = xmlHashLookup(table, ID); + if (id == NULL || id->attr != attr) { + xmlFree(ID); + return(-1); + } + xmlHashRemoveEntry(table, ID, (xmlHashDeallocator) xmlFreeID); + xmlFree(ID); + attr->atype = 0; + return(0); +} + +/** + * xmlGetID: + * @doc: pointer to the document + * @ID: the ID value + * + * Search the attribute declaring the given ID + * + * Returns NULL if not found, otherwise the xmlAttrPtr defining the ID + */ +xmlAttrPtr +xmlGetID(xmlDocPtr doc, const xmlChar *ID) { + xmlIDTablePtr table; + xmlIDPtr id; + + if (doc == NULL) { + return(NULL); + } + + if (ID == NULL) { + return(NULL); + } + + table = (xmlIDTablePtr) doc->ids; + if (table == NULL) + return(NULL); + + id = xmlHashLookup(table, ID); + if (id == NULL) + return(NULL); + if (id->attr == NULL) { + /* + * We are operating on a stream, return a well known reference + * since the attribute node doesn't exist anymore + */ + return((xmlAttrPtr) doc); + } + return(id->attr); +} + +/************************************************************************ + * * + * Refs * + * * + ************************************************************************/ +typedef struct xmlRemoveMemo_t +{ + xmlListPtr l; + xmlAttrPtr ap; +} xmlRemoveMemo; + +typedef xmlRemoveMemo *xmlRemoveMemoPtr; + +typedef struct xmlValidateMemo_t +{ + xmlValidCtxtPtr ctxt; + const xmlChar *name; +} xmlValidateMemo; + +typedef xmlValidateMemo *xmlValidateMemoPtr; + +/** + * xmlFreeRef: + * @lk: A list link + * + * Deallocate the memory used by a ref definition + */ +static void +xmlFreeRef(xmlLinkPtr lk) { + xmlRefPtr ref = (xmlRefPtr)xmlLinkGetData(lk); + if (ref == NULL) return; + if (ref->value != NULL) + xmlFree((xmlChar *)ref->value); + if (ref->name != NULL) + xmlFree((xmlChar *)ref->name); + xmlFree(ref); +} + +/** + * xmlFreeRefList: + * @list_ref: A list of references. + * + * Deallocate the memory used by a list of references + */ +static void +xmlFreeRefList(xmlListPtr list_ref) { + if (list_ref == NULL) return; + xmlListDelete(list_ref); +} + +/** + * xmlWalkRemoveRef: + * @data: Contents of current link + * @user: Value supplied by the user + * + * Returns 0 to abort the walk or 1 to continue + */ +static int +xmlWalkRemoveRef(const void *data, const void *user) +{ + xmlAttrPtr attr0 = ((xmlRefPtr)data)->attr; + xmlAttrPtr attr1 = ((xmlRemoveMemoPtr)user)->ap; + xmlListPtr ref_list = ((xmlRemoveMemoPtr)user)->l; + + if (attr0 == attr1) { /* Matched: remove and terminate walk */ + xmlListRemoveFirst(ref_list, (void *)data); + return 0; + } + return 1; +} + +/** + * xmlDummyCompare + * @data0: Value supplied by the user + * @data1: Value supplied by the user + * + * Do nothing, return 0. Used to create unordered lists. + */ +static int +xmlDummyCompare(const void *data0 ATTRIBUTE_UNUSED, + const void *data1 ATTRIBUTE_UNUSED) +{ + return (0); +} + +/** + * xmlAddRef: + * @ctxt: the validation context + * @doc: pointer to the document + * @value: the value name + * @attr: the attribute holding the Ref + * + * Register a new ref declaration + * + * Returns NULL if not, otherwise the new xmlRefPtr + */ +xmlRefPtr +xmlAddRef(xmlValidCtxtPtr ctxt, xmlDocPtr doc, const xmlChar *value, + xmlAttrPtr attr) { + xmlRefPtr ret; + xmlRefTablePtr table; + xmlListPtr ref_list; + + if (doc == NULL) { + return(NULL); + } + if (value == NULL) { + return(NULL); + } + if (attr == NULL) { + return(NULL); + } + + /* + * Create the Ref table if needed. + */ + table = (xmlRefTablePtr) doc->refs; + if (table == NULL) { + doc->refs = table = xmlHashCreateDict(0, doc->dict); + } + if (table == NULL) { + xmlVErrMemory(ctxt, + "xmlAddRef: Table creation failed!\n"); + return(NULL); + } + + ret = (xmlRefPtr) xmlMalloc(sizeof(xmlRef)); + if (ret == NULL) { + xmlVErrMemory(ctxt, "malloc failed"); + return(NULL); + } + + /* + * fill the structure. + */ + ret->value = xmlStrdup(value); + if ((ctxt != NULL) && (ctxt->vstateNr != 0)) { + /* + * Operating in streaming mode, attr is gonna disapear + */ + ret->name = xmlStrdup(attr->name); + ret->attr = NULL; + } else { + ret->name = NULL; + ret->attr = attr; + } + ret->lineno = xmlGetLineNo(attr->parent); + + /* To add a reference :- + * References are maintained as a list of references, + * Lookup the entry, if no entry create new nodelist + * Add the owning node to the NodeList + * Return the ref + */ + + if (NULL == (ref_list = xmlHashLookup(table, value))) { + if (NULL == (ref_list = xmlListCreate(xmlFreeRef, xmlDummyCompare))) { + xmlErrValid(NULL, XML_ERR_INTERNAL_ERROR, + "xmlAddRef: Reference list creation failed!\n", + NULL); + goto failed; + } + if (xmlHashAddEntry(table, value, ref_list) < 0) { + xmlListDelete(ref_list); + xmlErrValid(NULL, XML_ERR_INTERNAL_ERROR, + "xmlAddRef: Reference list insertion failed!\n", + NULL); + goto failed; + } + } + if (xmlListAppend(ref_list, ret) != 0) { + xmlErrValid(NULL, XML_ERR_INTERNAL_ERROR, + "xmlAddRef: Reference list insertion failed!\n", + NULL); + goto failed; + } + return(ret); +failed: + if (ret != NULL) { + if (ret->value != NULL) + xmlFree((char *)ret->value); + if (ret->name != NULL) + xmlFree((char *)ret->name); + xmlFree(ret); + } + return(NULL); +} + +/** + * xmlFreeRefTable: + * @table: An ref table + * + * Deallocate the memory used by an Ref hash table. + */ +void +xmlFreeRefTable(xmlRefTablePtr table) { + xmlHashFree(table, (xmlHashDeallocator) xmlFreeRefList); +} + +/** + * xmlIsRef: + * @doc: the document + * @elem: the element carrying the attribute + * @attr: the attribute + * + * Determine whether an attribute is of type Ref. In case we have DTD(s) + * then this is simple, otherwise we use an heuristic: name Ref (upper + * or lowercase). + * + * Returns 0 or 1 depending on the lookup result + */ +int +xmlIsRef(xmlDocPtr doc, xmlNodePtr elem, xmlAttrPtr attr) { + if (attr == NULL) + return(0); + if (doc == NULL) { + doc = attr->doc; + if (doc == NULL) return(0); + } + + if ((doc->intSubset == NULL) && (doc->extSubset == NULL)) { + return(0); + } else if (doc->type == XML_HTML_DOCUMENT_NODE) { + /* TODO @@@ */ + return(0); + } else { + xmlAttributePtr attrDecl; + + if (elem == NULL) return(0); + attrDecl = xmlGetDtdAttrDesc(doc->intSubset, elem->name, attr->name); + if ((attrDecl == NULL) && (doc->extSubset != NULL)) + attrDecl = xmlGetDtdAttrDesc(doc->extSubset, + elem->name, attr->name); + + if ((attrDecl != NULL) && + (attrDecl->atype == XML_ATTRIBUTE_IDREF || + attrDecl->atype == XML_ATTRIBUTE_IDREFS)) + return(1); + } + return(0); +} + +/** + * xmlRemoveRef: + * @doc: the document + * @attr: the attribute + * + * Remove the given attribute from the Ref table maintained internally. + * + * Returns -1 if the lookup failed and 0 otherwise + */ +int +xmlRemoveRef(xmlDocPtr doc, xmlAttrPtr attr) { + xmlListPtr ref_list; + xmlRefTablePtr table; + xmlChar *ID; + xmlRemoveMemo target; + + if (doc == NULL) return(-1); + if (attr == NULL) return(-1); + table = (xmlRefTablePtr) doc->refs; + if (table == NULL) + return(-1); + + if (attr == NULL) + return(-1); + ID = xmlNodeListGetString(doc, attr->children, 1); + if (ID == NULL) + return(-1); + ref_list = xmlHashLookup(table, ID); + + if(ref_list == NULL) { + xmlFree(ID); + return (-1); + } + /* At this point, ref_list refers to a list of references which + * have the same key as the supplied attr. Our list of references + * is ordered by reference address and we don't have that information + * here to use when removing. We'll have to walk the list and + * check for a matching attribute, when we find one stop the walk + * and remove the entry. + * The list is ordered by reference, so that means we don't have the + * key. Passing the list and the reference to the walker means we + * will have enough data to be able to remove the entry. + */ + target.l = ref_list; + target.ap = attr; + + /* Remove the supplied attr from our list */ + xmlListWalk(ref_list, xmlWalkRemoveRef, &target); + + /*If the list is empty then remove the list entry in the hash */ + if (xmlListEmpty(ref_list)) + xmlHashUpdateEntry(table, ID, NULL, (xmlHashDeallocator) + xmlFreeRefList); + xmlFree(ID); + return(0); +} + +/** + * xmlGetRefs: + * @doc: pointer to the document + * @ID: the ID value + * + * Find the set of references for the supplied ID. + * + * Returns NULL if not found, otherwise node set for the ID. + */ +xmlListPtr +xmlGetRefs(xmlDocPtr doc, const xmlChar *ID) { + xmlRefTablePtr table; + + if (doc == NULL) { + return(NULL); + } + + if (ID == NULL) { + return(NULL); + } + + table = (xmlRefTablePtr) doc->refs; + if (table == NULL) + return(NULL); + + return (xmlHashLookup(table, ID)); +} + +/************************************************************************ + * * + * Routines for validity checking * + * * + ************************************************************************/ + +/** + * xmlGetDtdElementDesc: + * @dtd: a pointer to the DtD to search + * @name: the element name + * + * Search the DTD for the description of this element + * + * returns the xmlElementPtr if found or NULL + */ + +xmlElementPtr +xmlGetDtdElementDesc(xmlDtdPtr dtd, const xmlChar *name) { + xmlElementTablePtr table; + xmlElementPtr cur; + xmlChar *uqname = NULL, *prefix = NULL; + + if ((dtd == NULL) || (name == NULL)) return(NULL); + if (dtd->elements == NULL) + return(NULL); + table = (xmlElementTablePtr) dtd->elements; + + uqname = xmlSplitQName2(name, &prefix); + if (uqname != NULL) + name = uqname; + cur = xmlHashLookup2(table, name, prefix); + if (prefix != NULL) xmlFree(prefix); + if (uqname != NULL) xmlFree(uqname); + return(cur); +} +/** + * xmlGetDtdElementDesc2: + * @dtd: a pointer to the DtD to search + * @name: the element name + * @create: create an empty description if not found + * + * Search the DTD for the description of this element + * + * returns the xmlElementPtr if found or NULL + */ + +static xmlElementPtr +xmlGetDtdElementDesc2(xmlDtdPtr dtd, const xmlChar *name, int create) { + xmlElementTablePtr table; + xmlElementPtr cur; + xmlChar *uqname = NULL, *prefix = NULL; + + if (dtd == NULL) return(NULL); + if (dtd->elements == NULL) { + xmlDictPtr dict = NULL; + + if (dtd->doc != NULL) + dict = dtd->doc->dict; + + if (!create) + return(NULL); + /* + * Create the Element table if needed. + */ + table = (xmlElementTablePtr) dtd->elements; + if (table == NULL) { + table = xmlHashCreateDict(0, dict); + dtd->elements = (void *) table; + } + if (table == NULL) { + xmlVErrMemory(NULL, "element table allocation failed"); + return(NULL); + } + } + table = (xmlElementTablePtr) dtd->elements; + + uqname = xmlSplitQName2(name, &prefix); + if (uqname != NULL) + name = uqname; + cur = xmlHashLookup2(table, name, prefix); + if ((cur == NULL) && (create)) { + cur = (xmlElementPtr) xmlMalloc(sizeof(xmlElement)); + if (cur == NULL) { + xmlVErrMemory(NULL, "malloc failed"); + return(NULL); + } + memset(cur, 0, sizeof(xmlElement)); + cur->type = XML_ELEMENT_DECL; + + /* + * fill the structure. + */ + cur->name = xmlStrdup(name); + cur->prefix = xmlStrdup(prefix); + cur->etype = XML_ELEMENT_TYPE_UNDEFINED; + + xmlHashAddEntry2(table, name, prefix, cur); + } + if (prefix != NULL) xmlFree(prefix); + if (uqname != NULL) xmlFree(uqname); + return(cur); +} + +/** + * xmlGetDtdQElementDesc: + * @dtd: a pointer to the DtD to search + * @name: the element name + * @prefix: the element namespace prefix + * + * Search the DTD for the description of this element + * + * returns the xmlElementPtr if found or NULL + */ + +xmlElementPtr +xmlGetDtdQElementDesc(xmlDtdPtr dtd, const xmlChar *name, + const xmlChar *prefix) { + xmlElementTablePtr table; + + if (dtd == NULL) return(NULL); + if (dtd->elements == NULL) return(NULL); + table = (xmlElementTablePtr) dtd->elements; + + return(xmlHashLookup2(table, name, prefix)); +} + +/** + * xmlGetDtdAttrDesc: + * @dtd: a pointer to the DtD to search + * @elem: the element name + * @name: the attribute name + * + * Search the DTD for the description of this attribute on + * this element. + * + * returns the xmlAttributePtr if found or NULL + */ + +xmlAttributePtr +xmlGetDtdAttrDesc(xmlDtdPtr dtd, const xmlChar *elem, const xmlChar *name) { + xmlAttributeTablePtr table; + xmlAttributePtr cur; + xmlChar *uqname = NULL, *prefix = NULL; + + if (dtd == NULL) return(NULL); + if (dtd->attributes == NULL) return(NULL); + + table = (xmlAttributeTablePtr) dtd->attributes; + if (table == NULL) + return(NULL); + + uqname = xmlSplitQName2(name, &prefix); + + if (uqname != NULL) { + cur = xmlHashLookup3(table, uqname, prefix, elem); + if (prefix != NULL) xmlFree(prefix); + if (uqname != NULL) xmlFree(uqname); + } else + cur = xmlHashLookup3(table, name, NULL, elem); + return(cur); +} + +/** + * xmlGetDtdQAttrDesc: + * @dtd: a pointer to the DtD to search + * @elem: the element name + * @name: the attribute name + * @prefix: the attribute namespace prefix + * + * Search the DTD for the description of this qualified attribute on + * this element. + * + * returns the xmlAttributePtr if found or NULL + */ + +xmlAttributePtr +xmlGetDtdQAttrDesc(xmlDtdPtr dtd, const xmlChar *elem, const xmlChar *name, + const xmlChar *prefix) { + xmlAttributeTablePtr table; + + if (dtd == NULL) return(NULL); + if (dtd->attributes == NULL) return(NULL); + table = (xmlAttributeTablePtr) dtd->attributes; + + return(xmlHashLookup3(table, name, prefix, elem)); +} + +/** + * xmlGetDtdNotationDesc: + * @dtd: a pointer to the DtD to search + * @name: the notation name + * + * Search the DTD for the description of this notation + * + * returns the xmlNotationPtr if found or NULL + */ + +xmlNotationPtr +xmlGetDtdNotationDesc(xmlDtdPtr dtd, const xmlChar *name) { + xmlNotationTablePtr table; + + if (dtd == NULL) return(NULL); + if (dtd->notations == NULL) return(NULL); + table = (xmlNotationTablePtr) dtd->notations; + + return(xmlHashLookup(table, name)); +} + +#if defined(LIBXML_VALID_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) +/** + * xmlValidateNotationUse: + * @ctxt: the validation context + * @doc: the document + * @notationName: the notation name to check + * + * Validate that the given name match a notation declaration. + * - [ VC: Notation Declared ] + * + * returns 1 if valid or 0 otherwise + */ + +int +xmlValidateNotationUse(xmlValidCtxtPtr ctxt, xmlDocPtr doc, + const xmlChar *notationName) { + xmlNotationPtr notaDecl; + if ((doc == NULL) || (doc->intSubset == NULL) || + (notationName == NULL)) return(-1); + + notaDecl = xmlGetDtdNotationDesc(doc->intSubset, notationName); + if ((notaDecl == NULL) && (doc->extSubset != NULL)) + notaDecl = xmlGetDtdNotationDesc(doc->extSubset, notationName); + + if ((notaDecl == NULL) && (ctxt != NULL)) { + xmlErrValidNode(ctxt, (xmlNodePtr) doc, XML_DTD_UNKNOWN_NOTATION, + "NOTATION %s is not declared\n", + notationName, NULL, NULL); + return(0); + } + return(1); +} +#endif /* LIBXML_VALID_ENABLED or LIBXML_SCHEMAS_ENABLED */ + +/** + * xmlIsMixedElement: + * @doc: the document + * @name: the element name + * + * Search in the DtDs whether an element accept Mixed content (or ANY) + * basically if it is supposed to accept text childs + * + * returns 0 if no, 1 if yes, and -1 if no element description is available + */ + +int +xmlIsMixedElement(xmlDocPtr doc, const xmlChar *name) { + xmlElementPtr elemDecl; + + if ((doc == NULL) || (doc->intSubset == NULL)) return(-1); + + elemDecl = xmlGetDtdElementDesc(doc->intSubset, name); + if ((elemDecl == NULL) && (doc->extSubset != NULL)) + elemDecl = xmlGetDtdElementDesc(doc->extSubset, name); + if (elemDecl == NULL) return(-1); + switch (elemDecl->etype) { + case XML_ELEMENT_TYPE_UNDEFINED: + return(-1); + case XML_ELEMENT_TYPE_ELEMENT: + return(0); + case XML_ELEMENT_TYPE_EMPTY: + /* + * return 1 for EMPTY since we want VC error to pop up + * on for example + */ + case XML_ELEMENT_TYPE_ANY: + case XML_ELEMENT_TYPE_MIXED: + return(1); + } + return(1); +} + +#ifdef LIBXML_VALID_ENABLED + +static int +xmlIsDocNameStartChar(xmlDocPtr doc, int c) { + if ((doc == NULL) || (doc->properties & XML_DOC_OLD10) == 0) { + /* + * Use the new checks of production [4] [4a] amd [5] of the + * Update 5 of XML-1.0 + */ + if (((c >= 'a') && (c <= 'z')) || + ((c >= 'A') && (c <= 'Z')) || + (c == '_') || (c == ':') || + ((c >= 0xC0) && (c <= 0xD6)) || + ((c >= 0xD8) && (c <= 0xF6)) || + ((c >= 0xF8) && (c <= 0x2FF)) || + ((c >= 0x370) && (c <= 0x37D)) || + ((c >= 0x37F) && (c <= 0x1FFF)) || + ((c >= 0x200C) && (c <= 0x200D)) || + ((c >= 0x2070) && (c <= 0x218F)) || + ((c >= 0x2C00) && (c <= 0x2FEF)) || + ((c >= 0x3001) && (c <= 0xD7FF)) || + ((c >= 0xF900) && (c <= 0xFDCF)) || + ((c >= 0xFDF0) && (c <= 0xFFFD)) || + ((c >= 0x10000) && (c <= 0xEFFFF))) + return(1); + } else { + if (IS_LETTER(c) || (c == '_') || (c == ':')) + return(1); + } + return(0); +} + +static int +xmlIsDocNameChar(xmlDocPtr doc, int c) { + if ((doc == NULL) || (doc->properties & XML_DOC_OLD10) == 0) { + /* + * Use the new checks of production [4] [4a] amd [5] of the + * Update 5 of XML-1.0 + */ + if (((c >= 'a') && (c <= 'z')) || + ((c >= 'A') && (c <= 'Z')) || + ((c >= '0') && (c <= '9')) || /* !start */ + (c == '_') || (c == ':') || + (c == '-') || (c == '.') || (c == 0xB7) || /* !start */ + ((c >= 0xC0) && (c <= 0xD6)) || + ((c >= 0xD8) && (c <= 0xF6)) || + ((c >= 0xF8) && (c <= 0x2FF)) || + ((c >= 0x300) && (c <= 0x36F)) || /* !start */ + ((c >= 0x370) && (c <= 0x37D)) || + ((c >= 0x37F) && (c <= 0x1FFF)) || + ((c >= 0x200C) && (c <= 0x200D)) || + ((c >= 0x203F) && (c <= 0x2040)) || /* !start */ + ((c >= 0x2070) && (c <= 0x218F)) || + ((c >= 0x2C00) && (c <= 0x2FEF)) || + ((c >= 0x3001) && (c <= 0xD7FF)) || + ((c >= 0xF900) && (c <= 0xFDCF)) || + ((c >= 0xFDF0) && (c <= 0xFFFD)) || + ((c >= 0x10000) && (c <= 0xEFFFF))) + return(1); + } else { + if ((IS_LETTER(c)) || (IS_DIGIT(c)) || + (c == '.') || (c == '-') || + (c == '_') || (c == ':') || + (IS_COMBINING(c)) || + (IS_EXTENDER(c))) + return(1); + } + return(0); +} + +/** + * xmlValidateNameValue: + * @doc: pointer to the document or NULL + * @value: an Name value + * + * Validate that the given value match Name production + * + * returns 1 if valid or 0 otherwise + */ + +static int +xmlValidateNameValueInternal(xmlDocPtr doc, const xmlChar *value) { + const xmlChar *cur; + int val, len; + + if (value == NULL) return(0); + cur = value; + val = xmlStringCurrentChar(NULL, cur, &len); + cur += len; + if (!xmlIsDocNameStartChar(doc, val)) + return(0); + + val = xmlStringCurrentChar(NULL, cur, &len); + cur += len; + while (xmlIsDocNameChar(doc, val)) { + val = xmlStringCurrentChar(NULL, cur, &len); + cur += len; + } + + if (val != 0) return(0); + + return(1); +} + +/** + * xmlValidateNameValue: + * @value: an Name value + * + * Validate that the given value match Name production + * + * returns 1 if valid or 0 otherwise + */ + +int +xmlValidateNameValue(const xmlChar *value) { + return(xmlValidateNameValueInternal(NULL, value)); +} + +/** + * xmlValidateNamesValueInternal: + * @doc: pointer to the document or NULL + * @value: an Names value + * + * Validate that the given value match Names production + * + * returns 1 if valid or 0 otherwise + */ + +static int +xmlValidateNamesValueInternal(xmlDocPtr doc, const xmlChar *value) { + const xmlChar *cur; + int val, len; + + if (value == NULL) return(0); + cur = value; + val = xmlStringCurrentChar(NULL, cur, &len); + cur += len; + + if (!xmlIsDocNameStartChar(doc, val)) + return(0); + + val = xmlStringCurrentChar(NULL, cur, &len); + cur += len; + while (xmlIsDocNameChar(doc, val)) { + val = xmlStringCurrentChar(NULL, cur, &len); + cur += len; + } + + /* Should not test IS_BLANK(val) here -- see erratum E20*/ + while (val == 0x20) { + while (val == 0x20) { + val = xmlStringCurrentChar(NULL, cur, &len); + cur += len; + } + + if (!xmlIsDocNameStartChar(doc, val)) + return(0); + + val = xmlStringCurrentChar(NULL, cur, &len); + cur += len; + + while (xmlIsDocNameChar(doc, val)) { + val = xmlStringCurrentChar(NULL, cur, &len); + cur += len; + } + } + + if (val != 0) return(0); + + return(1); +} + +/** + * xmlValidateNamesValue: + * @value: an Names value + * + * Validate that the given value match Names production + * + * returns 1 if valid or 0 otherwise + */ + +int +xmlValidateNamesValue(const xmlChar *value) { + return(xmlValidateNamesValueInternal(NULL, value)); +} + +/** + * xmlValidateNmtokenValueInternal: + * @doc: pointer to the document or NULL + * @value: an Nmtoken value + * + * Validate that the given value match Nmtoken production + * + * [ VC: Name Token ] + * + * returns 1 if valid or 0 otherwise + */ + +static int +xmlValidateNmtokenValueInternal(xmlDocPtr doc, const xmlChar *value) { + const xmlChar *cur; + int val, len; + + if (value == NULL) return(0); + cur = value; + val = xmlStringCurrentChar(NULL, cur, &len); + cur += len; + + if (!xmlIsDocNameChar(doc, val)) + return(0); + + val = xmlStringCurrentChar(NULL, cur, &len); + cur += len; + while (xmlIsDocNameChar(doc, val)) { + val = xmlStringCurrentChar(NULL, cur, &len); + cur += len; + } + + if (val != 0) return(0); + + return(1); +} + +/** + * xmlValidateNmtokenValue: + * @value: an Nmtoken value + * + * Validate that the given value match Nmtoken production + * + * [ VC: Name Token ] + * + * returns 1 if valid or 0 otherwise + */ + +int +xmlValidateNmtokenValue(const xmlChar *value) { + return(xmlValidateNmtokenValueInternal(NULL, value)); +} + +/** + * xmlValidateNmtokensValueInternal: + * @doc: pointer to the document or NULL + * @value: an Nmtokens value + * + * Validate that the given value match Nmtokens production + * + * [ VC: Name Token ] + * + * returns 1 if valid or 0 otherwise + */ + +static int +xmlValidateNmtokensValueInternal(xmlDocPtr doc, const xmlChar *value) { + const xmlChar *cur; + int val, len; + + if (value == NULL) return(0); + cur = value; + val = xmlStringCurrentChar(NULL, cur, &len); + cur += len; + + while (IS_BLANK(val)) { + val = xmlStringCurrentChar(NULL, cur, &len); + cur += len; + } + + if (!xmlIsDocNameChar(doc, val)) + return(0); + + while (xmlIsDocNameChar(doc, val)) { + val = xmlStringCurrentChar(NULL, cur, &len); + cur += len; + } + + /* Should not test IS_BLANK(val) here -- see erratum E20*/ + while (val == 0x20) { + while (val == 0x20) { + val = xmlStringCurrentChar(NULL, cur, &len); + cur += len; + } + if (val == 0) return(1); + + if (!xmlIsDocNameChar(doc, val)) + return(0); + + val = xmlStringCurrentChar(NULL, cur, &len); + cur += len; + + while (xmlIsDocNameChar(doc, val)) { + val = xmlStringCurrentChar(NULL, cur, &len); + cur += len; + } + } + + if (val != 0) return(0); + + return(1); +} + +/** + * xmlValidateNmtokensValue: + * @value: an Nmtokens value + * + * Validate that the given value match Nmtokens production + * + * [ VC: Name Token ] + * + * returns 1 if valid or 0 otherwise + */ + +int +xmlValidateNmtokensValue(const xmlChar *value) { + return(xmlValidateNmtokensValueInternal(NULL, value)); +} + +/** + * xmlValidateNotationDecl: + * @ctxt: the validation context + * @doc: a document instance + * @nota: a notation definition + * + * Try to validate a single notation definition + * basically it does the following checks as described by the + * XML-1.0 recommendation: + * - it seems that no validity constraint exists on notation declarations + * But this function get called anyway ... + * + * returns 1 if valid or 0 otherwise + */ + +int +xmlValidateNotationDecl(xmlValidCtxtPtr ctxt ATTRIBUTE_UNUSED, xmlDocPtr doc ATTRIBUTE_UNUSED, + xmlNotationPtr nota ATTRIBUTE_UNUSED) { + int ret = 1; + + return(ret); +} + +/** + * xmlValidateAttributeValueInternal: + * @doc: the document + * @type: an attribute type + * @value: an attribute value + * + * Validate that the given attribute value match the proper production + * + * returns 1 if valid or 0 otherwise + */ + +static int +xmlValidateAttributeValueInternal(xmlDocPtr doc, xmlAttributeType type, + const xmlChar *value) { + switch (type) { + case XML_ATTRIBUTE_ENTITIES: + case XML_ATTRIBUTE_IDREFS: + return(xmlValidateNamesValueInternal(doc, value)); + case XML_ATTRIBUTE_ENTITY: + case XML_ATTRIBUTE_IDREF: + case XML_ATTRIBUTE_ID: + case XML_ATTRIBUTE_NOTATION: + return(xmlValidateNameValueInternal(doc, value)); + case XML_ATTRIBUTE_NMTOKENS: + case XML_ATTRIBUTE_ENUMERATION: + return(xmlValidateNmtokensValueInternal(doc, value)); + case XML_ATTRIBUTE_NMTOKEN: + return(xmlValidateNmtokenValueInternal(doc, value)); + case XML_ATTRIBUTE_CDATA: + break; + } + return(1); +} + +/** + * xmlValidateAttributeValue: + * @type: an attribute type + * @value: an attribute value + * + * Validate that the given attribute value match the proper production + * + * [ VC: ID ] + * Values of type ID must match the Name production.... + * + * [ VC: IDREF ] + * Values of type IDREF must match the Name production, and values + * of type IDREFS must match Names ... + * + * [ VC: Entity Name ] + * Values of type ENTITY must match the Name production, values + * of type ENTITIES must match Names ... + * + * [ VC: Name Token ] + * Values of type NMTOKEN must match the Nmtoken production; values + * of type NMTOKENS must match Nmtokens. + * + * returns 1 if valid or 0 otherwise + */ +int +xmlValidateAttributeValue(xmlAttributeType type, const xmlChar *value) { + return(xmlValidateAttributeValueInternal(NULL, type, value)); +} + +/** + * xmlValidateAttributeValue2: + * @ctxt: the validation context + * @doc: the document + * @name: the attribute name (used for error reporting only) + * @type: the attribute type + * @value: the attribute value + * + * Validate that the given attribute value match a given type. + * This typically cannot be done before having finished parsing + * the subsets. + * + * [ VC: IDREF ] + * Values of type IDREF must match one of the declared IDs + * Values of type IDREFS must match a sequence of the declared IDs + * each Name must match the value of an ID attribute on some element + * in the XML document; i.e. IDREF values must match the value of + * some ID attribute + * + * [ VC: Entity Name ] + * Values of type ENTITY must match one declared entity + * Values of type ENTITIES must match a sequence of declared entities + * + * [ VC: Notation Attributes ] + * all notation names in the declaration must be declared. + * + * returns 1 if valid or 0 otherwise + */ + +static int +xmlValidateAttributeValue2(xmlValidCtxtPtr ctxt, xmlDocPtr doc, + const xmlChar *name, xmlAttributeType type, const xmlChar *value) { + int ret = 1; + switch (type) { + case XML_ATTRIBUTE_IDREFS: + case XML_ATTRIBUTE_IDREF: + case XML_ATTRIBUTE_ID: + case XML_ATTRIBUTE_NMTOKENS: + case XML_ATTRIBUTE_ENUMERATION: + case XML_ATTRIBUTE_NMTOKEN: + case XML_ATTRIBUTE_CDATA: + break; + case XML_ATTRIBUTE_ENTITY: { + xmlEntityPtr ent; + + ent = xmlGetDocEntity(doc, value); + /* yeah it's a bit messy... */ + if ((ent == NULL) && (doc->standalone == 1)) { + doc->standalone = 0; + ent = xmlGetDocEntity(doc, value); + } + if (ent == NULL) { + xmlErrValidNode(ctxt, (xmlNodePtr) doc, + XML_DTD_UNKNOWN_ENTITY, + "ENTITY attribute %s reference an unknown entity \"%s\"\n", + name, value, NULL); + ret = 0; + } else if (ent->etype != XML_EXTERNAL_GENERAL_UNPARSED_ENTITY) { + xmlErrValidNode(ctxt, (xmlNodePtr) doc, + XML_DTD_ENTITY_TYPE, + "ENTITY attribute %s reference an entity \"%s\" of wrong type\n", + name, value, NULL); + ret = 0; + } + break; + } + case XML_ATTRIBUTE_ENTITIES: { + xmlChar *dup, *nam = NULL, *cur, save; + xmlEntityPtr ent; + + dup = xmlStrdup(value); + if (dup == NULL) + return(0); + cur = dup; + while (*cur != 0) { + nam = cur; + while ((*cur != 0) && (!IS_BLANK_CH(*cur))) cur++; + save = *cur; + *cur = 0; + ent = xmlGetDocEntity(doc, nam); + if (ent == NULL) { + xmlErrValidNode(ctxt, (xmlNodePtr) doc, + XML_DTD_UNKNOWN_ENTITY, + "ENTITIES attribute %s reference an unknown entity \"%s\"\n", + name, nam, NULL); + ret = 0; + } else if (ent->etype != XML_EXTERNAL_GENERAL_UNPARSED_ENTITY) { + xmlErrValidNode(ctxt, (xmlNodePtr) doc, + XML_DTD_ENTITY_TYPE, + "ENTITIES attribute %s reference an entity \"%s\" of wrong type\n", + name, nam, NULL); + ret = 0; + } + if (save == 0) + break; + *cur = save; + while (IS_BLANK_CH(*cur)) cur++; + } + xmlFree(dup); + break; + } + case XML_ATTRIBUTE_NOTATION: { + xmlNotationPtr nota; + + nota = xmlGetDtdNotationDesc(doc->intSubset, value); + if ((nota == NULL) && (doc->extSubset != NULL)) + nota = xmlGetDtdNotationDesc(doc->extSubset, value); + + if (nota == NULL) { + xmlErrValidNode(ctxt, (xmlNodePtr) doc, + XML_DTD_UNKNOWN_NOTATION, + "NOTATION attribute %s reference an unknown notation \"%s\"\n", + name, value, NULL); + ret = 0; + } + break; + } + } + return(ret); +} + +/** + * xmlValidCtxtNormalizeAttributeValue: + * @ctxt: the validation context + * @doc: the document + * @elem: the parent + * @name: the attribute name + * @value: the attribute value + * @ctxt: the validation context or NULL + * + * Does the validation related extra step of the normalization of attribute + * values: + * + * If the declared value is not CDATA, then the XML processor must further + * process the normalized attribute value by discarding any leading and + * trailing space (#x20) characters, and by replacing sequences of space + * (#x20) characters by single space (#x20) character. + * + * Also check VC: Standalone Document Declaration in P32, and update + * ctxt->valid accordingly + * + * returns a new normalized string if normalization is needed, NULL otherwise + * the caller must free the returned value. + */ + +xmlChar * +xmlValidCtxtNormalizeAttributeValue(xmlValidCtxtPtr ctxt, xmlDocPtr doc, + xmlNodePtr elem, const xmlChar *name, const xmlChar *value) { + xmlChar *ret, *dst; + const xmlChar *src; + xmlAttributePtr attrDecl = NULL; + int extsubset = 0; + + if (doc == NULL) return(NULL); + if (elem == NULL) return(NULL); + if (name == NULL) return(NULL); + if (value == NULL) return(NULL); + + if ((elem->ns != NULL) && (elem->ns->prefix != NULL)) { + xmlChar fn[50]; + xmlChar *fullname; + + fullname = xmlBuildQName(elem->name, elem->ns->prefix, fn, 50); + if (fullname == NULL) + return(NULL); + attrDecl = xmlGetDtdAttrDesc(doc->intSubset, fullname, name); + if ((attrDecl == NULL) && (doc->extSubset != NULL)) { + attrDecl = xmlGetDtdAttrDesc(doc->extSubset, fullname, name); + if (attrDecl != NULL) + extsubset = 1; + } + if ((fullname != fn) && (fullname != elem->name)) + xmlFree(fullname); + } + if ((attrDecl == NULL) && (doc->intSubset != NULL)) + attrDecl = xmlGetDtdAttrDesc(doc->intSubset, elem->name, name); + if ((attrDecl == NULL) && (doc->extSubset != NULL)) { + attrDecl = xmlGetDtdAttrDesc(doc->extSubset, elem->name, name); + if (attrDecl != NULL) + extsubset = 1; + } + + if (attrDecl == NULL) + return(NULL); + if (attrDecl->atype == XML_ATTRIBUTE_CDATA) + return(NULL); + + ret = xmlStrdup(value); + if (ret == NULL) + return(NULL); + src = value; + dst = ret; + while (*src == 0x20) src++; + while (*src != 0) { + if (*src == 0x20) { + while (*src == 0x20) src++; + if (*src != 0) + *dst++ = 0x20; + } else { + *dst++ = *src++; + } + } + *dst = 0; + if ((doc->standalone) && (extsubset == 1) && (!xmlStrEqual(value, ret))) { + xmlErrValidNode(ctxt, elem, XML_DTD_NOT_STANDALONE, +"standalone: %s on %s value had to be normalized based on external subset declaration\n", + name, elem->name, NULL); + ctxt->valid = 0; + } + return(ret); +} + +/** + * xmlValidNormalizeAttributeValue: + * @doc: the document + * @elem: the parent + * @name: the attribute name + * @value: the attribute value + * + * Does the validation related extra step of the normalization of attribute + * values: + * + * If the declared value is not CDATA, then the XML processor must further + * process the normalized attribute value by discarding any leading and + * trailing space (#x20) characters, and by replacing sequences of space + * (#x20) characters by single space (#x20) character. + * + * Returns a new normalized string if normalization is needed, NULL otherwise + * the caller must free the returned value. + */ + +xmlChar * +xmlValidNormalizeAttributeValue(xmlDocPtr doc, xmlNodePtr elem, + const xmlChar *name, const xmlChar *value) { + xmlChar *ret, *dst; + const xmlChar *src; + xmlAttributePtr attrDecl = NULL; + + if (doc == NULL) return(NULL); + if (elem == NULL) return(NULL); + if (name == NULL) return(NULL); + if (value == NULL) return(NULL); + + if ((elem->ns != NULL) && (elem->ns->prefix != NULL)) { + xmlChar fn[50]; + xmlChar *fullname; + + fullname = xmlBuildQName(elem->name, elem->ns->prefix, fn, 50); + if (fullname == NULL) + return(NULL); + if ((fullname != fn) && (fullname != elem->name)) + xmlFree(fullname); + } + attrDecl = xmlGetDtdAttrDesc(doc->intSubset, elem->name, name); + if ((attrDecl == NULL) && (doc->extSubset != NULL)) + attrDecl = xmlGetDtdAttrDesc(doc->extSubset, elem->name, name); + + if (attrDecl == NULL) + return(NULL); + if (attrDecl->atype == XML_ATTRIBUTE_CDATA) + return(NULL); + + ret = xmlStrdup(value); + if (ret == NULL) + return(NULL); + src = value; + dst = ret; + while (*src == 0x20) src++; + while (*src != 0) { + if (*src == 0x20) { + while (*src == 0x20) src++; + if (*src != 0) + *dst++ = 0x20; + } else { + *dst++ = *src++; + } + } + *dst = 0; + return(ret); +} + +static void +xmlValidateAttributeIdCallback(xmlAttributePtr attr, int *count, + const xmlChar* name ATTRIBUTE_UNUSED) { + if (attr->atype == XML_ATTRIBUTE_ID) (*count)++; +} + +/** + * xmlValidateAttributeDecl: + * @ctxt: the validation context + * @doc: a document instance + * @attr: an attribute definition + * + * Try to validate a single attribute definition + * basically it does the following checks as described by the + * XML-1.0 recommendation: + * - [ VC: Attribute Default Legal ] + * - [ VC: Enumeration ] + * - [ VC: ID Attribute Default ] + * + * The ID/IDREF uniqueness and matching are done separately + * + * returns 1 if valid or 0 otherwise + */ + +int +xmlValidateAttributeDecl(xmlValidCtxtPtr ctxt, xmlDocPtr doc, + xmlAttributePtr attr) { + int ret = 1; + int val; + CHECK_DTD; + if(attr == NULL) return(1); + + /* Attribute Default Legal */ + /* Enumeration */ + if (attr->defaultValue != NULL) { + val = xmlValidateAttributeValueInternal(doc, attr->atype, + attr->defaultValue); + if (val == 0) { + xmlErrValidNode(ctxt, (xmlNodePtr) attr, XML_DTD_ATTRIBUTE_DEFAULT, + "Syntax of default value for attribute %s of %s is not valid\n", + attr->name, attr->elem, NULL); + } + ret &= val; + } + + /* ID Attribute Default */ + if ((attr->atype == XML_ATTRIBUTE_ID)&& + (attr->def != XML_ATTRIBUTE_IMPLIED) && + (attr->def != XML_ATTRIBUTE_REQUIRED)) { + xmlErrValidNode(ctxt, (xmlNodePtr) attr, XML_DTD_ID_FIXED, + "ID attribute %s of %s is not valid must be #IMPLIED or #REQUIRED\n", + attr->name, attr->elem, NULL); + ret = 0; + } + + /* One ID per Element Type */ + if (attr->atype == XML_ATTRIBUTE_ID) { + int nbId; + + /* the trick is that we parse DtD as their own internal subset */ + xmlElementPtr elem = xmlGetDtdElementDesc(doc->intSubset, + attr->elem); + if (elem != NULL) { + nbId = xmlScanIDAttributeDecl(NULL, elem, 0); + } else { + xmlAttributeTablePtr table; + + /* + * The attribute may be declared in the internal subset and the + * element in the external subset. + */ + nbId = 0; + if (doc->intSubset != NULL) { + table = (xmlAttributeTablePtr) doc->intSubset->attributes; + xmlHashScan3(table, NULL, NULL, attr->elem, (xmlHashScanner) + xmlValidateAttributeIdCallback, &nbId); + } + } + if (nbId > 1) { + + xmlErrValidNodeNr(ctxt, (xmlNodePtr) attr, XML_DTD_ID_SUBSET, + "Element %s has %d ID attribute defined in the internal subset : %s\n", + attr->elem, nbId, attr->name); + } else if (doc->extSubset != NULL) { + int extId = 0; + elem = xmlGetDtdElementDesc(doc->extSubset, attr->elem); + if (elem != NULL) { + extId = xmlScanIDAttributeDecl(NULL, elem, 0); + } + if (extId > 1) { + xmlErrValidNodeNr(ctxt, (xmlNodePtr) attr, XML_DTD_ID_SUBSET, + "Element %s has %d ID attribute defined in the external subset : %s\n", + attr->elem, extId, attr->name); + } else if (extId + nbId > 1) { + xmlErrValidNode(ctxt, (xmlNodePtr) attr, XML_DTD_ID_SUBSET, +"Element %s has ID attributes defined in the internal and external subset : %s\n", + attr->elem, attr->name, NULL); + } + } + } + + /* Validity Constraint: Enumeration */ + if ((attr->defaultValue != NULL) && (attr->tree != NULL)) { + xmlEnumerationPtr tree = attr->tree; + while (tree != NULL) { + if (xmlStrEqual(tree->name, attr->defaultValue)) break; + tree = tree->next; + } + if (tree == NULL) { + xmlErrValidNode(ctxt, (xmlNodePtr) attr, XML_DTD_ATTRIBUTE_VALUE, +"Default value \"%s\" for attribute %s of %s is not among the enumerated set\n", + attr->defaultValue, attr->name, attr->elem); + ret = 0; + } + } + + return(ret); +} + +/** + * xmlValidateElementDecl: + * @ctxt: the validation context + * @doc: a document instance + * @elem: an element definition + * + * Try to validate a single element definition + * basically it does the following checks as described by the + * XML-1.0 recommendation: + * - [ VC: One ID per Element Type ] + * - [ VC: No Duplicate Types ] + * - [ VC: Unique Element Type Declaration ] + * + * returns 1 if valid or 0 otherwise + */ + +int +xmlValidateElementDecl(xmlValidCtxtPtr ctxt, xmlDocPtr doc, + xmlElementPtr elem) { + int ret = 1; + xmlElementPtr tst; + + CHECK_DTD; + + if (elem == NULL) return(1); + +#if 0 +#ifdef LIBXML_REGEXP_ENABLED + /* Build the regexp associated to the content model */ + ret = xmlValidBuildContentModel(ctxt, elem); +#endif +#endif + + /* No Duplicate Types */ + if (elem->etype == XML_ELEMENT_TYPE_MIXED) { + xmlElementContentPtr cur, next; + const xmlChar *name; + + cur = elem->content; + while (cur != NULL) { + if (cur->type != XML_ELEMENT_CONTENT_OR) break; + if (cur->c1 == NULL) break; + if (cur->c1->type == XML_ELEMENT_CONTENT_ELEMENT) { + name = cur->c1->name; + next = cur->c2; + while (next != NULL) { + if (next->type == XML_ELEMENT_CONTENT_ELEMENT) { + if ((xmlStrEqual(next->name, name)) && + (xmlStrEqual(next->prefix, cur->c1->prefix))) { + if (cur->c1->prefix == NULL) { + xmlErrValidNode(ctxt, (xmlNodePtr) elem, XML_DTD_CONTENT_ERROR, + "Definition of %s has duplicate references of %s\n", + elem->name, name, NULL); + } else { + xmlErrValidNode(ctxt, (xmlNodePtr) elem, XML_DTD_CONTENT_ERROR, + "Definition of %s has duplicate references of %s:%s\n", + elem->name, cur->c1->prefix, name); + } + ret = 0; + } + break; + } + if (next->c1 == NULL) break; + if (next->c1->type != XML_ELEMENT_CONTENT_ELEMENT) break; + if ((xmlStrEqual(next->c1->name, name)) && + (xmlStrEqual(next->c1->prefix, cur->c1->prefix))) { + if (cur->c1->prefix == NULL) { + xmlErrValidNode(ctxt, (xmlNodePtr) elem, XML_DTD_CONTENT_ERROR, + "Definition of %s has duplicate references to %s\n", + elem->name, name, NULL); + } else { + xmlErrValidNode(ctxt, (xmlNodePtr) elem, XML_DTD_CONTENT_ERROR, + "Definition of %s has duplicate references to %s:%s\n", + elem->name, cur->c1->prefix, name); + } + ret = 0; + } + next = next->c2; + } + } + cur = cur->c2; + } + } + + /* VC: Unique Element Type Declaration */ + tst = xmlGetDtdElementDesc(doc->intSubset, elem->name); + if ((tst != NULL ) && (tst != elem) && + ((tst->prefix == elem->prefix) || + (xmlStrEqual(tst->prefix, elem->prefix))) && + (tst->etype != XML_ELEMENT_TYPE_UNDEFINED)) { + xmlErrValidNode(ctxt, (xmlNodePtr) elem, XML_DTD_ELEM_REDEFINED, + "Redefinition of element %s\n", + elem->name, NULL, NULL); + ret = 0; + } + tst = xmlGetDtdElementDesc(doc->extSubset, elem->name); + if ((tst != NULL ) && (tst != elem) && + ((tst->prefix == elem->prefix) || + (xmlStrEqual(tst->prefix, elem->prefix))) && + (tst->etype != XML_ELEMENT_TYPE_UNDEFINED)) { + xmlErrValidNode(ctxt, (xmlNodePtr) elem, XML_DTD_ELEM_REDEFINED, + "Redefinition of element %s\n", + elem->name, NULL, NULL); + ret = 0; + } + /* One ID per Element Type + * already done when registering the attribute + if (xmlScanIDAttributeDecl(ctxt, elem) > 1) { + ret = 0; + } */ + return(ret); +} + +/** + * xmlValidateOneAttribute: + * @ctxt: the validation context + * @doc: a document instance + * @elem: an element instance + * @attr: an attribute instance + * @value: the attribute value (without entities processing) + * + * Try to validate a single attribute for an element + * basically it does the following checks as described by the + * XML-1.0 recommendation: + * - [ VC: Attribute Value Type ] + * - [ VC: Fixed Attribute Default ] + * - [ VC: Entity Name ] + * - [ VC: Name Token ] + * - [ VC: ID ] + * - [ VC: IDREF ] + * - [ VC: Entity Name ] + * - [ VC: Notation Attributes ] + * + * The ID/IDREF uniqueness and matching are done separately + * + * returns 1 if valid or 0 otherwise + */ + +int +xmlValidateOneAttribute(xmlValidCtxtPtr ctxt, xmlDocPtr doc, + xmlNodePtr elem, xmlAttrPtr attr, const xmlChar *value) +{ + xmlAttributePtr attrDecl = NULL; + int val; + int ret = 1; + + CHECK_DTD; + if ((elem == NULL) || (elem->name == NULL)) return(0); + if ((attr == NULL) || (attr->name == NULL)) return(0); + + if ((elem->ns != NULL) && (elem->ns->prefix != NULL)) { + xmlChar fn[50]; + xmlChar *fullname; + + fullname = xmlBuildQName(elem->name, elem->ns->prefix, fn, 50); + if (fullname == NULL) + return(0); + if (attr->ns != NULL) { + attrDecl = xmlGetDtdQAttrDesc(doc->intSubset, fullname, + attr->name, attr->ns->prefix); + if ((attrDecl == NULL) && (doc->extSubset != NULL)) + attrDecl = xmlGetDtdQAttrDesc(doc->extSubset, fullname, + attr->name, attr->ns->prefix); + } else { + attrDecl = xmlGetDtdAttrDesc(doc->intSubset, fullname, attr->name); + if ((attrDecl == NULL) && (doc->extSubset != NULL)) + attrDecl = xmlGetDtdAttrDesc(doc->extSubset, + fullname, attr->name); + } + if ((fullname != fn) && (fullname != elem->name)) + xmlFree(fullname); + } + if (attrDecl == NULL) { + if (attr->ns != NULL) { + attrDecl = xmlGetDtdQAttrDesc(doc->intSubset, elem->name, + attr->name, attr->ns->prefix); + if ((attrDecl == NULL) && (doc->extSubset != NULL)) + attrDecl = xmlGetDtdQAttrDesc(doc->extSubset, elem->name, + attr->name, attr->ns->prefix); + } else { + attrDecl = xmlGetDtdAttrDesc(doc->intSubset, + elem->name, attr->name); + if ((attrDecl == NULL) && (doc->extSubset != NULL)) + attrDecl = xmlGetDtdAttrDesc(doc->extSubset, + elem->name, attr->name); + } + } + + + /* Validity Constraint: Attribute Value Type */ + if (attrDecl == NULL) { + xmlErrValidNode(ctxt, elem, XML_DTD_UNKNOWN_ATTRIBUTE, + "No declaration for attribute %s of element %s\n", + attr->name, elem->name, NULL); + return(0); + } + attr->atype = attrDecl->atype; + + val = xmlValidateAttributeValueInternal(doc, attrDecl->atype, value); + if (val == 0) { + xmlErrValidNode(ctxt, elem, XML_DTD_ATTRIBUTE_VALUE, + "Syntax of value for attribute %s of %s is not valid\n", + attr->name, elem->name, NULL); + ret = 0; + } + + /* Validity constraint: Fixed Attribute Default */ + if (attrDecl->def == XML_ATTRIBUTE_FIXED) { + if (!xmlStrEqual(value, attrDecl->defaultValue)) { + xmlErrValidNode(ctxt, elem, XML_DTD_ATTRIBUTE_DEFAULT, + "Value for attribute %s of %s is different from default \"%s\"\n", + attr->name, elem->name, attrDecl->defaultValue); + ret = 0; + } + } + + /* Validity Constraint: ID uniqueness */ + if (attrDecl->atype == XML_ATTRIBUTE_ID) { + if (xmlAddID(ctxt, doc, value, attr) == NULL) + ret = 0; + } + + if ((attrDecl->atype == XML_ATTRIBUTE_IDREF) || + (attrDecl->atype == XML_ATTRIBUTE_IDREFS)) { + if (xmlAddRef(ctxt, doc, value, attr) == NULL) + ret = 0; + } + + /* Validity Constraint: Notation Attributes */ + if (attrDecl->atype == XML_ATTRIBUTE_NOTATION) { + xmlEnumerationPtr tree = attrDecl->tree; + xmlNotationPtr nota; + + /* First check that the given NOTATION was declared */ + nota = xmlGetDtdNotationDesc(doc->intSubset, value); + if (nota == NULL) + nota = xmlGetDtdNotationDesc(doc->extSubset, value); + + if (nota == NULL) { + xmlErrValidNode(ctxt, elem, XML_DTD_UNKNOWN_NOTATION, + "Value \"%s\" for attribute %s of %s is not a declared Notation\n", + value, attr->name, elem->name); + ret = 0; + } + + /* Second, verify that it's among the list */ + while (tree != NULL) { + if (xmlStrEqual(tree->name, value)) break; + tree = tree->next; + } + if (tree == NULL) { + xmlErrValidNode(ctxt, elem, XML_DTD_NOTATION_VALUE, +"Value \"%s\" for attribute %s of %s is not among the enumerated notations\n", + value, attr->name, elem->name); + ret = 0; + } + } + + /* Validity Constraint: Enumeration */ + if (attrDecl->atype == XML_ATTRIBUTE_ENUMERATION) { + xmlEnumerationPtr tree = attrDecl->tree; + while (tree != NULL) { + if (xmlStrEqual(tree->name, value)) break; + tree = tree->next; + } + if (tree == NULL) { + xmlErrValidNode(ctxt, elem, XML_DTD_ATTRIBUTE_VALUE, + "Value \"%s\" for attribute %s of %s is not among the enumerated set\n", + value, attr->name, elem->name); + ret = 0; + } + } + + /* Fixed Attribute Default */ + if ((attrDecl->def == XML_ATTRIBUTE_FIXED) && + (!xmlStrEqual(attrDecl->defaultValue, value))) { + xmlErrValidNode(ctxt, elem, XML_DTD_ATTRIBUTE_VALUE, + "Value for attribute %s of %s must be \"%s\"\n", + attr->name, elem->name, attrDecl->defaultValue); + ret = 0; + } + + /* Extra check for the attribute value */ + ret &= xmlValidateAttributeValue2(ctxt, doc, attr->name, + attrDecl->atype, value); + + return(ret); +} + +/** + * xmlValidateOneNamespace: + * @ctxt: the validation context + * @doc: a document instance + * @elem: an element instance + * @prefix: the namespace prefix + * @ns: an namespace declaration instance + * @value: the attribute value (without entities processing) + * + * Try to validate a single namespace declaration for an element + * basically it does the following checks as described by the + * XML-1.0 recommendation: + * - [ VC: Attribute Value Type ] + * - [ VC: Fixed Attribute Default ] + * - [ VC: Entity Name ] + * - [ VC: Name Token ] + * - [ VC: ID ] + * - [ VC: IDREF ] + * - [ VC: Entity Name ] + * - [ VC: Notation Attributes ] + * + * The ID/IDREF uniqueness and matching are done separately + * + * returns 1 if valid or 0 otherwise + */ + +int +xmlValidateOneNamespace(xmlValidCtxtPtr ctxt, xmlDocPtr doc, +xmlNodePtr elem, const xmlChar *prefix, xmlNsPtr ns, const xmlChar *value) { + /* xmlElementPtr elemDecl; */ + xmlAttributePtr attrDecl = NULL; + int val; + int ret = 1; + + CHECK_DTD; + if ((elem == NULL) || (elem->name == NULL)) return(0); + if ((ns == NULL) || (ns->href == NULL)) return(0); + + if (prefix != NULL) { + xmlChar fn[50]; + xmlChar *fullname; + + fullname = xmlBuildQName(elem->name, prefix, fn, 50); + if (fullname == NULL) { + xmlVErrMemory(ctxt, "Validating namespace"); + return(0); + } + if (ns->prefix != NULL) { + attrDecl = xmlGetDtdQAttrDesc(doc->intSubset, fullname, + ns->prefix, BAD_CAST "xmlns"); + if ((attrDecl == NULL) && (doc->extSubset != NULL)) + attrDecl = xmlGetDtdQAttrDesc(doc->extSubset, fullname, + ns->prefix, BAD_CAST "xmlns"); + } else { + attrDecl = xmlGetDtdAttrDesc(doc->intSubset, fullname, + BAD_CAST "xmlns"); + if ((attrDecl == NULL) && (doc->extSubset != NULL)) + attrDecl = xmlGetDtdAttrDesc(doc->extSubset, fullname, + BAD_CAST "xmlns"); + } + if ((fullname != fn) && (fullname != elem->name)) + xmlFree(fullname); + } + if (attrDecl == NULL) { + if (ns->prefix != NULL) { + attrDecl = xmlGetDtdQAttrDesc(doc->intSubset, elem->name, + ns->prefix, BAD_CAST "xmlns"); + if ((attrDecl == NULL) && (doc->extSubset != NULL)) + attrDecl = xmlGetDtdQAttrDesc(doc->extSubset, elem->name, + ns->prefix, BAD_CAST "xmlns"); + } else { + attrDecl = xmlGetDtdAttrDesc(doc->intSubset, + elem->name, BAD_CAST "xmlns"); + if ((attrDecl == NULL) && (doc->extSubset != NULL)) + attrDecl = xmlGetDtdAttrDesc(doc->extSubset, + elem->name, BAD_CAST "xmlns"); + } + } + + + /* Validity Constraint: Attribute Value Type */ + if (attrDecl == NULL) { + if (ns->prefix != NULL) { + xmlErrValidNode(ctxt, elem, XML_DTD_UNKNOWN_ATTRIBUTE, + "No declaration for attribute xmlns:%s of element %s\n", + ns->prefix, elem->name, NULL); + } else { + xmlErrValidNode(ctxt, elem, XML_DTD_UNKNOWN_ATTRIBUTE, + "No declaration for attribute xmlns of element %s\n", + elem->name, NULL, NULL); + } + return(0); + } + + val = xmlValidateAttributeValueInternal(doc, attrDecl->atype, value); + if (val == 0) { + if (ns->prefix != NULL) { + xmlErrValidNode(ctxt, elem, XML_DTD_INVALID_DEFAULT, + "Syntax of value for attribute xmlns:%s of %s is not valid\n", + ns->prefix, elem->name, NULL); + } else { + xmlErrValidNode(ctxt, elem, XML_DTD_INVALID_DEFAULT, + "Syntax of value for attribute xmlns of %s is not valid\n", + elem->name, NULL, NULL); + } + ret = 0; + } + + /* Validity constraint: Fixed Attribute Default */ + if (attrDecl->def == XML_ATTRIBUTE_FIXED) { + if (!xmlStrEqual(value, attrDecl->defaultValue)) { + if (ns->prefix != NULL) { + xmlErrValidNode(ctxt, elem, XML_DTD_ATTRIBUTE_DEFAULT, + "Value for attribute xmlns:%s of %s is different from default \"%s\"\n", + ns->prefix, elem->name, attrDecl->defaultValue); + } else { + xmlErrValidNode(ctxt, elem, XML_DTD_ATTRIBUTE_DEFAULT, + "Value for attribute xmlns of %s is different from default \"%s\"\n", + elem->name, attrDecl->defaultValue, NULL); + } + ret = 0; + } + } + + /* Validity Constraint: ID uniqueness */ + if (attrDecl->atype == XML_ATTRIBUTE_ID) { + if (xmlAddID(ctxt, doc, value, (xmlAttrPtr) ns) == NULL) + ret = 0; + } + + if ((attrDecl->atype == XML_ATTRIBUTE_IDREF) || + (attrDecl->atype == XML_ATTRIBUTE_IDREFS)) { + if (xmlAddRef(ctxt, doc, value, (xmlAttrPtr) ns) == NULL) + ret = 0; + } + + /* Validity Constraint: Notation Attributes */ + if (attrDecl->atype == XML_ATTRIBUTE_NOTATION) { + xmlEnumerationPtr tree = attrDecl->tree; + xmlNotationPtr nota; + + /* First check that the given NOTATION was declared */ + nota = xmlGetDtdNotationDesc(doc->intSubset, value); + if (nota == NULL) + nota = xmlGetDtdNotationDesc(doc->extSubset, value); + + if (nota == NULL) { + if (ns->prefix != NULL) { + xmlErrValidNode(ctxt, elem, XML_DTD_UNKNOWN_NOTATION, + "Value \"%s\" for attribute xmlns:%s of %s is not a declared Notation\n", + value, ns->prefix, elem->name); + } else { + xmlErrValidNode(ctxt, elem, XML_DTD_UNKNOWN_NOTATION, + "Value \"%s\" for attribute xmlns of %s is not a declared Notation\n", + value, elem->name, NULL); + } + ret = 0; + } + + /* Second, verify that it's among the list */ + while (tree != NULL) { + if (xmlStrEqual(tree->name, value)) break; + tree = tree->next; + } + if (tree == NULL) { + if (ns->prefix != NULL) { + xmlErrValidNode(ctxt, elem, XML_DTD_NOTATION_VALUE, +"Value \"%s\" for attribute xmlns:%s of %s is not among the enumerated notations\n", + value, ns->prefix, elem->name); + } else { + xmlErrValidNode(ctxt, elem, XML_DTD_NOTATION_VALUE, +"Value \"%s\" for attribute xmlns of %s is not among the enumerated notations\n", + value, elem->name, NULL); + } + ret = 0; + } + } + + /* Validity Constraint: Enumeration */ + if (attrDecl->atype == XML_ATTRIBUTE_ENUMERATION) { + xmlEnumerationPtr tree = attrDecl->tree; + while (tree != NULL) { + if (xmlStrEqual(tree->name, value)) break; + tree = tree->next; + } + if (tree == NULL) { + if (ns->prefix != NULL) { + xmlErrValidNode(ctxt, elem, XML_DTD_ATTRIBUTE_VALUE, +"Value \"%s\" for attribute xmlns:%s of %s is not among the enumerated set\n", + value, ns->prefix, elem->name); + } else { + xmlErrValidNode(ctxt, elem, XML_DTD_ATTRIBUTE_VALUE, +"Value \"%s\" for attribute xmlns of %s is not among the enumerated set\n", + value, elem->name, NULL); + } + ret = 0; + } + } + + /* Fixed Attribute Default */ + if ((attrDecl->def == XML_ATTRIBUTE_FIXED) && + (!xmlStrEqual(attrDecl->defaultValue, value))) { + if (ns->prefix != NULL) { + xmlErrValidNode(ctxt, elem, XML_DTD_ELEM_NAMESPACE, + "Value for attribute xmlns:%s of %s must be \"%s\"\n", + ns->prefix, elem->name, attrDecl->defaultValue); + } else { + xmlErrValidNode(ctxt, elem, XML_DTD_ELEM_NAMESPACE, + "Value for attribute xmlns of %s must be \"%s\"\n", + elem->name, attrDecl->defaultValue, NULL); + } + ret = 0; + } + + /* Extra check for the attribute value */ + if (ns->prefix != NULL) { + ret &= xmlValidateAttributeValue2(ctxt, doc, ns->prefix, + attrDecl->atype, value); + } else { + ret &= xmlValidateAttributeValue2(ctxt, doc, BAD_CAST "xmlns", + attrDecl->atype, value); + } + + return(ret); +} + +#ifndef LIBXML_REGEXP_ENABLED +/** + * xmlValidateSkipIgnorable: + * @ctxt: the validation context + * @child: the child list + * + * Skip ignorable elements w.r.t. the validation process + * + * returns the first element to consider for validation of the content model + */ + +static xmlNodePtr +xmlValidateSkipIgnorable(xmlNodePtr child) { + while (child != NULL) { + switch (child->type) { + /* These things are ignored (skipped) during validation. */ + case XML_PI_NODE: + case XML_COMMENT_NODE: + case XML_XINCLUDE_START: + case XML_XINCLUDE_END: + child = child->next; + break; + case XML_TEXT_NODE: + if (xmlIsBlankNode(child)) + child = child->next; + else + return(child); + break; + /* keep current node */ + default: + return(child); + } + } + return(child); +} + +/** + * xmlValidateElementType: + * @ctxt: the validation context + * + * Try to validate the content model of an element internal function + * + * returns 1 if valid or 0 ,-1 in case of error, -2 if an entity + * reference is found and -3 if the validation succeeded but + * the content model is not determinist. + */ + +static int +xmlValidateElementType(xmlValidCtxtPtr ctxt) { + int ret = -1; + int determinist = 1; + + NODE = xmlValidateSkipIgnorable(NODE); + if ((NODE == NULL) && (CONT == NULL)) + return(1); + if ((NODE == NULL) && + ((CONT->ocur == XML_ELEMENT_CONTENT_MULT) || + (CONT->ocur == XML_ELEMENT_CONTENT_OPT))) { + return(1); + } + if (CONT == NULL) return(-1); + if ((NODE != NULL) && (NODE->type == XML_ENTITY_REF_NODE)) + return(-2); + + /* + * We arrive here when more states need to be examined + */ +cont: + + /* + * We just recovered from a rollback generated by a possible + * epsilon transition, go directly to the analysis phase + */ + if (STATE == ROLLBACK_PARENT) { + DEBUG_VALID_MSG("restored parent branch"); + DEBUG_VALID_STATE(NODE, CONT) + ret = 1; + goto analyze; + } + + DEBUG_VALID_STATE(NODE, CONT) + /* + * we may have to save a backup state here. This is the equivalent + * of handling epsilon transition in NFAs. + */ + if ((CONT != NULL) && + ((CONT->parent == NULL) || + (CONT->parent->type != XML_ELEMENT_CONTENT_OR)) && + ((CONT->ocur == XML_ELEMENT_CONTENT_MULT) || + (CONT->ocur == XML_ELEMENT_CONTENT_OPT) || + ((CONT->ocur == XML_ELEMENT_CONTENT_PLUS) && (OCCURRENCE)))) { + DEBUG_VALID_MSG("saving parent branch"); + if (vstateVPush(ctxt, CONT, NODE, DEPTH, OCCURS, ROLLBACK_PARENT) < 0) + return(0); + } + + + /* + * Check first if the content matches + */ + switch (CONT->type) { + case XML_ELEMENT_CONTENT_PCDATA: + if (NODE == NULL) { + DEBUG_VALID_MSG("pcdata failed no node"); + ret = 0; + break; + } + if (NODE->type == XML_TEXT_NODE) { + DEBUG_VALID_MSG("pcdata found, skip to next"); + /* + * go to next element in the content model + * skipping ignorable elems + */ + do { + NODE = NODE->next; + NODE = xmlValidateSkipIgnorable(NODE); + if ((NODE != NULL) && + (NODE->type == XML_ENTITY_REF_NODE)) + return(-2); + } while ((NODE != NULL) && + ((NODE->type != XML_ELEMENT_NODE) && + (NODE->type != XML_TEXT_NODE) && + (NODE->type != XML_CDATA_SECTION_NODE))); + ret = 1; + break; + } else { + DEBUG_VALID_MSG("pcdata failed"); + ret = 0; + break; + } + break; + case XML_ELEMENT_CONTENT_ELEMENT: + if (NODE == NULL) { + DEBUG_VALID_MSG("element failed no node"); + ret = 0; + break; + } + ret = ((NODE->type == XML_ELEMENT_NODE) && + (xmlStrEqual(NODE->name, CONT->name))); + if (ret == 1) { + if ((NODE->ns == NULL) || (NODE->ns->prefix == NULL)) { + ret = (CONT->prefix == NULL); + } else if (CONT->prefix == NULL) { + ret = 0; + } else { + ret = xmlStrEqual(NODE->ns->prefix, CONT->prefix); + } + } + if (ret == 1) { + DEBUG_VALID_MSG("element found, skip to next"); + /* + * go to next element in the content model + * skipping ignorable elems + */ + do { + NODE = NODE->next; + NODE = xmlValidateSkipIgnorable(NODE); + if ((NODE != NULL) && + (NODE->type == XML_ENTITY_REF_NODE)) + return(-2); + } while ((NODE != NULL) && + ((NODE->type != XML_ELEMENT_NODE) && + (NODE->type != XML_TEXT_NODE) && + (NODE->type != XML_CDATA_SECTION_NODE))); + } else { + DEBUG_VALID_MSG("element failed"); + ret = 0; + break; + } + break; + case XML_ELEMENT_CONTENT_OR: + /* + * Small optimization. + */ + if (CONT->c1->type == XML_ELEMENT_CONTENT_ELEMENT) { + if ((NODE == NULL) || + (!xmlStrEqual(NODE->name, CONT->c1->name))) { + DEPTH++; + CONT = CONT->c2; + goto cont; + } + if ((NODE->ns == NULL) || (NODE->ns->prefix == NULL)) { + ret = (CONT->c1->prefix == NULL); + } else if (CONT->c1->prefix == NULL) { + ret = 0; + } else { + ret = xmlStrEqual(NODE->ns->prefix, CONT->c1->prefix); + } + if (ret == 0) { + DEPTH++; + CONT = CONT->c2; + goto cont; + } + } + + /* + * save the second branch 'or' branch + */ + DEBUG_VALID_MSG("saving 'or' branch"); + if (vstateVPush(ctxt, CONT->c2, NODE, (unsigned char)(DEPTH + 1), + OCCURS, ROLLBACK_OR) < 0) + return(-1); + DEPTH++; + CONT = CONT->c1; + goto cont; + case XML_ELEMENT_CONTENT_SEQ: + /* + * Small optimization. + */ + if ((CONT->c1->type == XML_ELEMENT_CONTENT_ELEMENT) && + ((CONT->c1->ocur == XML_ELEMENT_CONTENT_OPT) || + (CONT->c1->ocur == XML_ELEMENT_CONTENT_MULT))) { + if ((NODE == NULL) || + (!xmlStrEqual(NODE->name, CONT->c1->name))) { + DEPTH++; + CONT = CONT->c2; + goto cont; + } + if ((NODE->ns == NULL) || (NODE->ns->prefix == NULL)) { + ret = (CONT->c1->prefix == NULL); + } else if (CONT->c1->prefix == NULL) { + ret = 0; + } else { + ret = xmlStrEqual(NODE->ns->prefix, CONT->c1->prefix); + } + if (ret == 0) { + DEPTH++; + CONT = CONT->c2; + goto cont; + } + } + DEPTH++; + CONT = CONT->c1; + goto cont; + } + + /* + * At this point handle going up in the tree + */ + if (ret == -1) { + DEBUG_VALID_MSG("error found returning"); + return(ret); + } +analyze: + while (CONT != NULL) { + /* + * First do the analysis depending on the occurrence model at + * this level. + */ + if (ret == 0) { + switch (CONT->ocur) { + xmlNodePtr cur; + + case XML_ELEMENT_CONTENT_ONCE: + cur = ctxt->vstate->node; + DEBUG_VALID_MSG("Once branch failed, rollback"); + if (vstateVPop(ctxt) < 0 ) { + DEBUG_VALID_MSG("exhaustion, failed"); + return(0); + } + if (cur != ctxt->vstate->node) + determinist = -3; + goto cont; + case XML_ELEMENT_CONTENT_PLUS: + if (OCCURRENCE == 0) { + cur = ctxt->vstate->node; + DEBUG_VALID_MSG("Plus branch failed, rollback"); + if (vstateVPop(ctxt) < 0 ) { + DEBUG_VALID_MSG("exhaustion, failed"); + return(0); + } + if (cur != ctxt->vstate->node) + determinist = -3; + goto cont; + } + DEBUG_VALID_MSG("Plus branch found"); + ret = 1; + break; + case XML_ELEMENT_CONTENT_MULT: +#ifdef DEBUG_VALID_ALGO + if (OCCURRENCE == 0) { + DEBUG_VALID_MSG("Mult branch failed"); + } else { + DEBUG_VALID_MSG("Mult branch found"); + } +#endif + ret = 1; + break; + case XML_ELEMENT_CONTENT_OPT: + DEBUG_VALID_MSG("Option branch failed"); + ret = 1; + break; + } + } else { + switch (CONT->ocur) { + case XML_ELEMENT_CONTENT_OPT: + DEBUG_VALID_MSG("Option branch succeeded"); + ret = 1; + break; + case XML_ELEMENT_CONTENT_ONCE: + DEBUG_VALID_MSG("Once branch succeeded"); + ret = 1; + break; + case XML_ELEMENT_CONTENT_PLUS: + if (STATE == ROLLBACK_PARENT) { + DEBUG_VALID_MSG("Plus branch rollback"); + ret = 1; + break; + } + if (NODE == NULL) { + DEBUG_VALID_MSG("Plus branch exhausted"); + ret = 1; + break; + } + DEBUG_VALID_MSG("Plus branch succeeded, continuing"); + SET_OCCURRENCE; + goto cont; + case XML_ELEMENT_CONTENT_MULT: + if (STATE == ROLLBACK_PARENT) { + DEBUG_VALID_MSG("Mult branch rollback"); + ret = 1; + break; + } + if (NODE == NULL) { + DEBUG_VALID_MSG("Mult branch exhausted"); + ret = 1; + break; + } + DEBUG_VALID_MSG("Mult branch succeeded, continuing"); + /* SET_OCCURRENCE; */ + goto cont; + } + } + STATE = 0; + + /* + * Then act accordingly at the parent level + */ + RESET_OCCURRENCE; + if (CONT->parent == NULL) + break; + + switch (CONT->parent->type) { + case XML_ELEMENT_CONTENT_PCDATA: + DEBUG_VALID_MSG("Error: parent pcdata"); + return(-1); + case XML_ELEMENT_CONTENT_ELEMENT: + DEBUG_VALID_MSG("Error: parent element"); + return(-1); + case XML_ELEMENT_CONTENT_OR: + if (ret == 1) { + DEBUG_VALID_MSG("Or succeeded"); + CONT = CONT->parent; + DEPTH--; + } else { + DEBUG_VALID_MSG("Or failed"); + CONT = CONT->parent; + DEPTH--; + } + break; + case XML_ELEMENT_CONTENT_SEQ: + if (ret == 0) { + DEBUG_VALID_MSG("Sequence failed"); + CONT = CONT->parent; + DEPTH--; + } else if (CONT == CONT->parent->c1) { + DEBUG_VALID_MSG("Sequence testing 2nd branch"); + CONT = CONT->parent->c2; + goto cont; + } else { + DEBUG_VALID_MSG("Sequence succeeded"); + CONT = CONT->parent; + DEPTH--; + } + } + } + if (NODE != NULL) { + xmlNodePtr cur; + + cur = ctxt->vstate->node; + DEBUG_VALID_MSG("Failed, remaining input, rollback"); + if (vstateVPop(ctxt) < 0 ) { + DEBUG_VALID_MSG("exhaustion, failed"); + return(0); + } + if (cur != ctxt->vstate->node) + determinist = -3; + goto cont; + } + if (ret == 0) { + xmlNodePtr cur; + + cur = ctxt->vstate->node; + DEBUG_VALID_MSG("Failure, rollback"); + if (vstateVPop(ctxt) < 0 ) { + DEBUG_VALID_MSG("exhaustion, failed"); + return(0); + } + if (cur != ctxt->vstate->node) + determinist = -3; + goto cont; + } + return(determinist); +} +#endif + +/** + * xmlSnprintfElements: + * @buf: an output buffer + * @size: the size of the buffer + * @content: An element + * @glob: 1 if one must print the englobing parenthesis, 0 otherwise + * + * This will dump the list of elements to the buffer + * Intended just for the debug routine + */ +static void +xmlSnprintfElements(char *buf, int size, xmlNodePtr node, int glob) { + xmlNodePtr cur; + int len; + + if (node == NULL) return; + if (glob) strcat(buf, "("); + cur = node; + while (cur != NULL) { + len = strlen(buf); + if (size - len < 50) { + if ((size - len > 4) && (buf[len - 1] != '.')) + strcat(buf, " ..."); + return; + } + switch (cur->type) { + case XML_ELEMENT_NODE: + if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) { + if (size - len < xmlStrlen(cur->ns->prefix) + 10) { + if ((size - len > 4) && (buf[len - 1] != '.')) + strcat(buf, " ..."); + return; + } + strcat(buf, (char *) cur->ns->prefix); + strcat(buf, ":"); + } + if (size - len < xmlStrlen(cur->name) + 10) { + if ((size - len > 4) && (buf[len - 1] != '.')) + strcat(buf, " ..."); + return; + } + strcat(buf, (char *) cur->name); + if (cur->next != NULL) + strcat(buf, " "); + break; + case XML_TEXT_NODE: + if (xmlIsBlankNode(cur)) + break; + case XML_CDATA_SECTION_NODE: + case XML_ENTITY_REF_NODE: + strcat(buf, "CDATA"); + if (cur->next != NULL) + strcat(buf, " "); + break; + case XML_ATTRIBUTE_NODE: + case XML_DOCUMENT_NODE: +#ifdef LIBXML_DOCB_ENABLED + case XML_DOCB_DOCUMENT_NODE: +#endif + case XML_HTML_DOCUMENT_NODE: + case XML_DOCUMENT_TYPE_NODE: + case XML_DOCUMENT_FRAG_NODE: + case XML_NOTATION_NODE: + case XML_NAMESPACE_DECL: + strcat(buf, "???"); + if (cur->next != NULL) + strcat(buf, " "); + break; + case XML_ENTITY_NODE: + case XML_PI_NODE: + case XML_DTD_NODE: + case XML_COMMENT_NODE: + case XML_ELEMENT_DECL: + case XML_ATTRIBUTE_DECL: + case XML_ENTITY_DECL: + case XML_XINCLUDE_START: + case XML_XINCLUDE_END: + break; + } + cur = cur->next; + } + if (glob) strcat(buf, ")"); +} + +/** + * xmlValidateElementContent: + * @ctxt: the validation context + * @child: the child list + * @elemDecl: pointer to the element declaration + * @warn: emit the error message + * @parent: the parent element (for error reporting) + * + * Try to validate the content model of an element + * + * returns 1 if valid or 0 if not and -1 in case of error + */ + +static int +xmlValidateElementContent(xmlValidCtxtPtr ctxt, xmlNodePtr child, + xmlElementPtr elemDecl, int warn, xmlNodePtr parent) { + int ret = 1; +#ifndef LIBXML_REGEXP_ENABLED + xmlNodePtr repl = NULL, last = NULL, tmp; +#endif + xmlNodePtr cur; + xmlElementContentPtr cont; + const xmlChar *name; + + if ((elemDecl == NULL) || (parent == NULL)) + return(-1); + cont = elemDecl->content; + name = elemDecl->name; + +#ifdef LIBXML_REGEXP_ENABLED + /* Build the regexp associated to the content model */ + if (elemDecl->contModel == NULL) + ret = xmlValidBuildContentModel(ctxt, elemDecl); + if (elemDecl->contModel == NULL) { + return(-1); + } else { + xmlRegExecCtxtPtr exec; + + if (!xmlRegexpIsDeterminist(elemDecl->contModel)) { + return(-1); + } + ctxt->nodeMax = 0; + ctxt->nodeNr = 0; + ctxt->nodeTab = NULL; + exec = xmlRegNewExecCtxt(elemDecl->contModel, NULL, NULL); + if (exec != NULL) { + cur = child; + while (cur != NULL) { + switch (cur->type) { + case XML_ENTITY_REF_NODE: + /* + * Push the current node to be able to roll back + * and process within the entity + */ + if ((cur->children != NULL) && + (cur->children->children != NULL)) { + nodeVPush(ctxt, cur); + cur = cur->children->children; + continue; + } + break; + case XML_TEXT_NODE: + if (xmlIsBlankNode(cur)) + break; + ret = 0; + goto fail; + case XML_CDATA_SECTION_NODE: + /* TODO */ + ret = 0; + goto fail; + case XML_ELEMENT_NODE: + if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) { + xmlChar fn[50]; + xmlChar *fullname; + + fullname = xmlBuildQName(cur->name, + cur->ns->prefix, fn, 50); + if (fullname == NULL) { + ret = -1; + goto fail; + } + ret = xmlRegExecPushString(exec, fullname, NULL); + if ((fullname != fn) && (fullname != cur->name)) + xmlFree(fullname); + } else { + ret = xmlRegExecPushString(exec, cur->name, NULL); + } + break; + default: + break; + } + /* + * Switch to next element + */ + cur = cur->next; + while (cur == NULL) { + cur = nodeVPop(ctxt); + if (cur == NULL) + break; + cur = cur->next; + } + } + ret = xmlRegExecPushString(exec, NULL, NULL); +fail: + xmlRegFreeExecCtxt(exec); + } + } +#else /* LIBXML_REGEXP_ENABLED */ + /* + * Allocate the stack + */ + ctxt->vstateMax = 8; + ctxt->vstateTab = (xmlValidState *) xmlMalloc( + ctxt->vstateMax * sizeof(ctxt->vstateTab[0])); + if (ctxt->vstateTab == NULL) { + xmlVErrMemory(ctxt, "malloc failed"); + return(-1); + } + /* + * The first entry in the stack is reserved to the current state + */ + ctxt->nodeMax = 0; + ctxt->nodeNr = 0; + ctxt->nodeTab = NULL; + ctxt->vstate = &ctxt->vstateTab[0]; + ctxt->vstateNr = 1; + CONT = cont; + NODE = child; + DEPTH = 0; + OCCURS = 0; + STATE = 0; + ret = xmlValidateElementType(ctxt); + if ((ret == -3) && (warn)) { + xmlErrValidWarning(ctxt, child, XML_DTD_CONTENT_NOT_DETERMINIST, + "Content model for Element %s is ambiguous\n", + name, NULL, NULL); + } else if (ret == -2) { + /* + * An entities reference appeared at this level. + * Buid a minimal representation of this node content + * sufficient to run the validation process on it + */ + DEBUG_VALID_MSG("Found an entity reference, linearizing"); + cur = child; + while (cur != NULL) { + switch (cur->type) { + case XML_ENTITY_REF_NODE: + /* + * Push the current node to be able to roll back + * and process within the entity + */ + if ((cur->children != NULL) && + (cur->children->children != NULL)) { + nodeVPush(ctxt, cur); + cur = cur->children->children; + continue; + } + break; + case XML_TEXT_NODE: + if (xmlIsBlankNode(cur)) + break; + /* no break on purpose */ + case XML_CDATA_SECTION_NODE: + /* no break on purpose */ + case XML_ELEMENT_NODE: + /* + * Allocate a new node and minimally fills in + * what's required + */ + tmp = (xmlNodePtr) xmlMalloc(sizeof(xmlNode)); + if (tmp == NULL) { + xmlVErrMemory(ctxt, "malloc failed"); + xmlFreeNodeList(repl); + ret = -1; + goto done; + } + tmp->type = cur->type; + tmp->name = cur->name; + tmp->ns = cur->ns; + tmp->next = NULL; + tmp->content = NULL; + if (repl == NULL) + repl = last = tmp; + else { + last->next = tmp; + last = tmp; + } + if (cur->type == XML_CDATA_SECTION_NODE) { + /* + * E59 spaces in CDATA does not match the + * nonterminal S + */ + tmp->content = xmlStrdup(BAD_CAST "CDATA"); + } + break; + default: + break; + } + /* + * Switch to next element + */ + cur = cur->next; + while (cur == NULL) { + cur = nodeVPop(ctxt); + if (cur == NULL) + break; + cur = cur->next; + } + } + + /* + * Relaunch the validation + */ + ctxt->vstate = &ctxt->vstateTab[0]; + ctxt->vstateNr = 1; + CONT = cont; + NODE = repl; + DEPTH = 0; + OCCURS = 0; + STATE = 0; + ret = xmlValidateElementType(ctxt); + } +#endif /* LIBXML_REGEXP_ENABLED */ + if ((warn) && ((ret != 1) && (ret != -3))) { + if (ctxt != NULL) { + char expr[5000]; + char list[5000]; + + expr[0] = 0; + xmlSnprintfElementContent(&expr[0], 5000, cont, 1); + list[0] = 0; +#ifndef LIBXML_REGEXP_ENABLED + if (repl != NULL) + xmlSnprintfElements(&list[0], 5000, repl, 1); + else +#endif /* LIBXML_REGEXP_ENABLED */ + xmlSnprintfElements(&list[0], 5000, child, 1); + + if (name != NULL) { + xmlErrValidNode(ctxt, parent, XML_DTD_CONTENT_MODEL, + "Element %s content does not follow the DTD, expecting %s, got %s\n", + name, BAD_CAST expr, BAD_CAST list); + } else { + xmlErrValidNode(ctxt, parent, XML_DTD_CONTENT_MODEL, + "Element content does not follow the DTD, expecting %s, got %s\n", + BAD_CAST expr, BAD_CAST list, NULL); + } + } else { + if (name != NULL) { + xmlErrValidNode(ctxt, parent, XML_DTD_CONTENT_MODEL, + "Element %s content does not follow the DTD\n", + name, NULL, NULL); + } else { + xmlErrValidNode(ctxt, parent, XML_DTD_CONTENT_MODEL, + "Element content does not follow the DTD\n", + NULL, NULL, NULL); + } + } + ret = 0; + } + if (ret == -3) + ret = 1; + +#ifndef LIBXML_REGEXP_ENABLED +done: + /* + * Deallocate the copy if done, and free up the validation stack + */ + while (repl != NULL) { + tmp = repl->next; + xmlFree(repl); + repl = tmp; + } + ctxt->vstateMax = 0; + if (ctxt->vstateTab != NULL) { + xmlFree(ctxt->vstateTab); + ctxt->vstateTab = NULL; + } +#endif + ctxt->nodeMax = 0; + ctxt->nodeNr = 0; + if (ctxt->nodeTab != NULL) { + xmlFree(ctxt->nodeTab); + ctxt->nodeTab = NULL; + } + return(ret); + +} + +/** + * xmlValidateCdataElement: + * @ctxt: the validation context + * @doc: a document instance + * @elem: an element instance + * + * Check that an element follows #CDATA + * + * returns 1 if valid or 0 otherwise + */ +static int +xmlValidateOneCdataElement(xmlValidCtxtPtr ctxt, xmlDocPtr doc, + xmlNodePtr elem) { + int ret = 1; + xmlNodePtr cur, child; + + if ((ctxt == NULL) || (doc == NULL) || (elem == NULL) || + (elem->type != XML_ELEMENT_NODE)) + return(0); + + child = elem->children; + + cur = child; + while (cur != NULL) { + switch (cur->type) { + case XML_ENTITY_REF_NODE: + /* + * Push the current node to be able to roll back + * and process within the entity + */ + if ((cur->children != NULL) && + (cur->children->children != NULL)) { + nodeVPush(ctxt, cur); + cur = cur->children->children; + continue; + } + break; + case XML_COMMENT_NODE: + case XML_PI_NODE: + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + break; + default: + ret = 0; + goto done; + } + /* + * Switch to next element + */ + cur = cur->next; + while (cur == NULL) { + cur = nodeVPop(ctxt); + if (cur == NULL) + break; + cur = cur->next; + } + } +done: + ctxt->nodeMax = 0; + ctxt->nodeNr = 0; + if (ctxt->nodeTab != NULL) { + xmlFree(ctxt->nodeTab); + ctxt->nodeTab = NULL; + } + return(ret); +} + +/** + * xmlValidateCheckMixed: + * @ctxt: the validation context + * @cont: the mixed content model + * @qname: the qualified name as appearing in the serialization + * + * Check if the given node is part of the content model. + * + * Returns 1 if yes, 0 if no, -1 in case of error + */ +static int +xmlValidateCheckMixed(xmlValidCtxtPtr ctxt, + xmlElementContentPtr cont, const xmlChar *qname) { + const xmlChar *name; + int plen; + name = xmlSplitQName3(qname, &plen); + + if (name == NULL) { + while (cont != NULL) { + if (cont->type == XML_ELEMENT_CONTENT_ELEMENT) { + if ((cont->prefix == NULL) && (xmlStrEqual(cont->name, qname))) + return(1); + } else if ((cont->type == XML_ELEMENT_CONTENT_OR) && + (cont->c1 != NULL) && + (cont->c1->type == XML_ELEMENT_CONTENT_ELEMENT)){ + if ((cont->c1->prefix == NULL) && + (xmlStrEqual(cont->c1->name, qname))) + return(1); + } else if ((cont->type != XML_ELEMENT_CONTENT_OR) || + (cont->c1 == NULL) || + (cont->c1->type != XML_ELEMENT_CONTENT_PCDATA)){ + xmlErrValid(NULL, XML_DTD_MIXED_CORRUPT, + "Internal: MIXED struct corrupted\n", + NULL); + break; + } + cont = cont->c2; + } + } else { + while (cont != NULL) { + if (cont->type == XML_ELEMENT_CONTENT_ELEMENT) { + if ((cont->prefix != NULL) && + (xmlStrncmp(cont->prefix, qname, plen) == 0) && + (xmlStrEqual(cont->name, name))) + return(1); + } else if ((cont->type == XML_ELEMENT_CONTENT_OR) && + (cont->c1 != NULL) && + (cont->c1->type == XML_ELEMENT_CONTENT_ELEMENT)){ + if ((cont->c1->prefix != NULL) && + (xmlStrncmp(cont->c1->prefix, qname, plen) == 0) && + (xmlStrEqual(cont->c1->name, name))) + return(1); + } else if ((cont->type != XML_ELEMENT_CONTENT_OR) || + (cont->c1 == NULL) || + (cont->c1->type != XML_ELEMENT_CONTENT_PCDATA)){ + xmlErrValid(ctxt, XML_DTD_MIXED_CORRUPT, + "Internal: MIXED struct corrupted\n", + NULL); + break; + } + cont = cont->c2; + } + } + return(0); +} + +/** + * xmlValidGetElemDecl: + * @ctxt: the validation context + * @doc: a document instance + * @elem: an element instance + * @extsubset: pointer, (out) indicate if the declaration was found + * in the external subset. + * + * Finds a declaration associated to an element in the document. + * + * returns the pointer to the declaration or NULL if not found. + */ +static xmlElementPtr +xmlValidGetElemDecl(xmlValidCtxtPtr ctxt, xmlDocPtr doc, + xmlNodePtr elem, int *extsubset) { + xmlElementPtr elemDecl = NULL; + const xmlChar *prefix = NULL; + + if ((ctxt == NULL) || (doc == NULL) || + (elem == NULL) || (elem->name == NULL)) + return(NULL); + if (extsubset != NULL) + *extsubset = 0; + + /* + * Fetch the declaration for the qualified name + */ + if ((elem->ns != NULL) && (elem->ns->prefix != NULL)) + prefix = elem->ns->prefix; + + if (prefix != NULL) { + elemDecl = xmlGetDtdQElementDesc(doc->intSubset, + elem->name, prefix); + if ((elemDecl == NULL) && (doc->extSubset != NULL)) { + elemDecl = xmlGetDtdQElementDesc(doc->extSubset, + elem->name, prefix); + if ((elemDecl != NULL) && (extsubset != NULL)) + *extsubset = 1; + } + } + + /* + * Fetch the declaration for the non qualified name + * This is "non-strict" validation should be done on the + * full QName but in that case being flexible makes sense. + */ + if (elemDecl == NULL) { + elemDecl = xmlGetDtdElementDesc(doc->intSubset, elem->name); + if ((elemDecl == NULL) && (doc->extSubset != NULL)) { + elemDecl = xmlGetDtdElementDesc(doc->extSubset, elem->name); + if ((elemDecl != NULL) && (extsubset != NULL)) + *extsubset = 1; + } + } + if (elemDecl == NULL) { + xmlErrValidNode(ctxt, elem, + XML_DTD_UNKNOWN_ELEM, + "No declaration for element %s\n", + elem->name, NULL, NULL); + } + return(elemDecl); +} + +#ifdef LIBXML_REGEXP_ENABLED +/** + * xmlValidatePushElement: + * @ctxt: the validation context + * @doc: a document instance + * @elem: an element instance + * @qname: the qualified name as appearing in the serialization + * + * Push a new element start on the validation stack. + * + * returns 1 if no validation problem was found or 0 otherwise + */ +int +xmlValidatePushElement(xmlValidCtxtPtr ctxt, xmlDocPtr doc, + xmlNodePtr elem, const xmlChar *qname) { + int ret = 1; + xmlElementPtr eDecl; + int extsubset = 0; + + if (ctxt == NULL) + return(0); +/* printf("PushElem %s\n", qname); */ + if ((ctxt->vstateNr > 0) && (ctxt->vstate != NULL)) { + xmlValidStatePtr state = ctxt->vstate; + xmlElementPtr elemDecl; + + /* + * Check the new element agaisnt the content model of the new elem. + */ + if (state->elemDecl != NULL) { + elemDecl = state->elemDecl; + + switch(elemDecl->etype) { + case XML_ELEMENT_TYPE_UNDEFINED: + ret = 0; + break; + case XML_ELEMENT_TYPE_EMPTY: + xmlErrValidNode(ctxt, state->node, + XML_DTD_NOT_EMPTY, + "Element %s was declared EMPTY this one has content\n", + state->node->name, NULL, NULL); + ret = 0; + break; + case XML_ELEMENT_TYPE_ANY: + /* I don't think anything is required then */ + break; + case XML_ELEMENT_TYPE_MIXED: + /* simple case of declared as #PCDATA */ + if ((elemDecl->content != NULL) && + (elemDecl->content->type == + XML_ELEMENT_CONTENT_PCDATA)) { + xmlErrValidNode(ctxt, state->node, + XML_DTD_NOT_PCDATA, + "Element %s was declared #PCDATA but contains non text nodes\n", + state->node->name, NULL, NULL); + ret = 0; + } else { + ret = xmlValidateCheckMixed(ctxt, elemDecl->content, + qname); + if (ret != 1) { + xmlErrValidNode(ctxt, state->node, + XML_DTD_INVALID_CHILD, + "Element %s is not declared in %s list of possible children\n", + qname, state->node->name, NULL); + } + } + break; + case XML_ELEMENT_TYPE_ELEMENT: + /* + * TODO: + * VC: Standalone Document Declaration + * - element types with element content, if white space + * occurs directly within any instance of those types. + */ + if (state->exec != NULL) { + ret = xmlRegExecPushString(state->exec, qname, NULL); + if (ret < 0) { + xmlErrValidNode(ctxt, state->node, + XML_DTD_CONTENT_MODEL, + "Element %s content does not follow the DTD, Misplaced %s\n", + state->node->name, qname, NULL); + ret = 0; + } else { + ret = 1; + } + } + break; + } + } + } + eDecl = xmlValidGetElemDecl(ctxt, doc, elem, &extsubset); + vstateVPush(ctxt, eDecl, elem); + return(ret); +} + +/** + * xmlValidatePushCData: + * @ctxt: the validation context + * @data: some character data read + * @len: the length of the data + * + * check the CData parsed for validation in the current stack + * + * returns 1 if no validation problem was found or 0 otherwise + */ +int +xmlValidatePushCData(xmlValidCtxtPtr ctxt, const xmlChar *data, int len) { + int ret = 1; + +/* printf("CDATA %s %d\n", data, len); */ + if (ctxt == NULL) + return(0); + if (len <= 0) + return(ret); + if ((ctxt->vstateNr > 0) && (ctxt->vstate != NULL)) { + xmlValidStatePtr state = ctxt->vstate; + xmlElementPtr elemDecl; + + /* + * Check the new element agaisnt the content model of the new elem. + */ + if (state->elemDecl != NULL) { + elemDecl = state->elemDecl; + + switch(elemDecl->etype) { + case XML_ELEMENT_TYPE_UNDEFINED: + ret = 0; + break; + case XML_ELEMENT_TYPE_EMPTY: + xmlErrValidNode(ctxt, state->node, + XML_DTD_NOT_EMPTY, + "Element %s was declared EMPTY this one has content\n", + state->node->name, NULL, NULL); + ret = 0; + break; + case XML_ELEMENT_TYPE_ANY: + break; + case XML_ELEMENT_TYPE_MIXED: + break; + case XML_ELEMENT_TYPE_ELEMENT: + if (len > 0) { + int i; + + for (i = 0;i < len;i++) { + if (!IS_BLANK_CH(data[i])) { + xmlErrValidNode(ctxt, state->node, + XML_DTD_CONTENT_MODEL, + "Element %s content does not follow the DTD, Text not allowed\n", + state->node->name, NULL, NULL); + ret = 0; + goto done; + } + } + /* + * TODO: + * VC: Standalone Document Declaration + * element types with element content, if white space + * occurs directly within any instance of those types. + */ + } + break; + } + } + } +done: + return(ret); +} + +/** + * xmlValidatePopElement: + * @ctxt: the validation context + * @doc: a document instance + * @elem: an element instance + * @qname: the qualified name as appearing in the serialization + * + * Pop the element end from the validation stack. + * + * returns 1 if no validation problem was found or 0 otherwise + */ +int +xmlValidatePopElement(xmlValidCtxtPtr ctxt, xmlDocPtr doc ATTRIBUTE_UNUSED, + xmlNodePtr elem ATTRIBUTE_UNUSED, + const xmlChar *qname ATTRIBUTE_UNUSED) { + int ret = 1; + + if (ctxt == NULL) + return(0); +/* printf("PopElem %s\n", qname); */ + if ((ctxt->vstateNr > 0) && (ctxt->vstate != NULL)) { + xmlValidStatePtr state = ctxt->vstate; + xmlElementPtr elemDecl; + + /* + * Check the new element agaisnt the content model of the new elem. + */ + if (state->elemDecl != NULL) { + elemDecl = state->elemDecl; + + if (elemDecl->etype == XML_ELEMENT_TYPE_ELEMENT) { + if (state->exec != NULL) { + ret = xmlRegExecPushString(state->exec, NULL, NULL); + if (ret == 0) { + xmlErrValidNode(ctxt, state->node, + XML_DTD_CONTENT_MODEL, + "Element %s content does not follow the DTD, Expecting more child\n", + state->node->name, NULL,NULL); + } else { + /* + * previous validation errors should not generate + * a new one here + */ + ret = 1; + } + } + } + } + vstateVPop(ctxt); + } + return(ret); +} +#endif /* LIBXML_REGEXP_ENABLED */ + +/** + * xmlValidateOneElement: + * @ctxt: the validation context + * @doc: a document instance + * @elem: an element instance + * + * Try to validate a single element and it's attributes, + * basically it does the following checks as described by the + * XML-1.0 recommendation: + * - [ VC: Element Valid ] + * - [ VC: Required Attribute ] + * Then call xmlValidateOneAttribute() for each attribute present. + * + * The ID/IDREF checkings are done separately + * + * returns 1 if valid or 0 otherwise + */ + +int +xmlValidateOneElement(xmlValidCtxtPtr ctxt, xmlDocPtr doc, + xmlNodePtr elem) { + xmlElementPtr elemDecl = NULL; + xmlElementContentPtr cont; + xmlAttributePtr attr; + xmlNodePtr child; + int ret = 1, tmp; + const xmlChar *name; + int extsubset = 0; + + CHECK_DTD; + + if (elem == NULL) return(0); + switch (elem->type) { + case XML_ATTRIBUTE_NODE: + xmlErrValidNode(ctxt, elem, XML_ERR_INTERNAL_ERROR, + "Attribute element not expected\n", NULL, NULL ,NULL); + return(0); + case XML_TEXT_NODE: + if (elem->children != NULL) { + xmlErrValidNode(ctxt, elem, XML_ERR_INTERNAL_ERROR, + "Text element has children !\n", + NULL,NULL,NULL); + return(0); + } + if (elem->ns != NULL) { + xmlErrValidNode(ctxt, elem, XML_ERR_INTERNAL_ERROR, + "Text element has namespace !\n", + NULL,NULL,NULL); + return(0); + } + if (elem->content == NULL) { + xmlErrValidNode(ctxt, elem, XML_ERR_INTERNAL_ERROR, + "Text element has no content !\n", + NULL,NULL,NULL); + return(0); + } + return(1); + case XML_XINCLUDE_START: + case XML_XINCLUDE_END: + return(1); + case XML_CDATA_SECTION_NODE: + case XML_ENTITY_REF_NODE: + case XML_PI_NODE: + case XML_COMMENT_NODE: + return(1); + case XML_ENTITY_NODE: + xmlErrValidNode(ctxt, elem, XML_ERR_INTERNAL_ERROR, + "Entity element not expected\n", NULL, NULL ,NULL); + return(0); + case XML_NOTATION_NODE: + xmlErrValidNode(ctxt, elem, XML_ERR_INTERNAL_ERROR, + "Notation element not expected\n", NULL, NULL ,NULL); + return(0); + case XML_DOCUMENT_NODE: + case XML_DOCUMENT_TYPE_NODE: + case XML_DOCUMENT_FRAG_NODE: + xmlErrValidNode(ctxt, elem, XML_ERR_INTERNAL_ERROR, + "Document element not expected\n", NULL, NULL ,NULL); + return(0); + case XML_HTML_DOCUMENT_NODE: + xmlErrValidNode(ctxt, elem, XML_ERR_INTERNAL_ERROR, + "HTML Document not expected\n", NULL, NULL ,NULL); + return(0); + case XML_ELEMENT_NODE: + break; + default: + xmlErrValidNode(ctxt, elem, XML_ERR_INTERNAL_ERROR, + "unknown element type\n", NULL, NULL ,NULL); + return(0); + } + + /* + * Fetch the declaration + */ + elemDecl = xmlValidGetElemDecl(ctxt, doc, elem, &extsubset); + if (elemDecl == NULL) + return(0); + + /* + * If vstateNr is not zero that means continuous validation is + * activated, do not try to check the content model at that level. + */ + if (ctxt->vstateNr == 0) { + /* Check that the element content matches the definition */ + switch (elemDecl->etype) { + case XML_ELEMENT_TYPE_UNDEFINED: + xmlErrValidNode(ctxt, elem, XML_DTD_UNKNOWN_ELEM, + "No declaration for element %s\n", + elem->name, NULL, NULL); + return(0); + case XML_ELEMENT_TYPE_EMPTY: + if (elem->children != NULL) { + xmlErrValidNode(ctxt, elem, XML_DTD_NOT_EMPTY, + "Element %s was declared EMPTY this one has content\n", + elem->name, NULL, NULL); + ret = 0; + } + break; + case XML_ELEMENT_TYPE_ANY: + /* I don't think anything is required then */ + break; + case XML_ELEMENT_TYPE_MIXED: + + /* simple case of declared as #PCDATA */ + if ((elemDecl->content != NULL) && + (elemDecl->content->type == XML_ELEMENT_CONTENT_PCDATA)) { + ret = xmlValidateOneCdataElement(ctxt, doc, elem); + if (!ret) { + xmlErrValidNode(ctxt, elem, XML_DTD_NOT_PCDATA, + "Element %s was declared #PCDATA but contains non text nodes\n", + elem->name, NULL, NULL); + } + break; + } + child = elem->children; + /* Hum, this start to get messy */ + while (child != NULL) { + if (child->type == XML_ELEMENT_NODE) { + name = child->name; + if ((child->ns != NULL) && (child->ns->prefix != NULL)) { + xmlChar fn[50]; + xmlChar *fullname; + + fullname = xmlBuildQName(child->name, child->ns->prefix, + fn, 50); + if (fullname == NULL) + return(0); + cont = elemDecl->content; + while (cont != NULL) { + if (cont->type == XML_ELEMENT_CONTENT_ELEMENT) { + if (xmlStrEqual(cont->name, fullname)) + break; + } else if ((cont->type == XML_ELEMENT_CONTENT_OR) && + (cont->c1 != NULL) && + (cont->c1->type == XML_ELEMENT_CONTENT_ELEMENT)){ + if (xmlStrEqual(cont->c1->name, fullname)) + break; + } else if ((cont->type != XML_ELEMENT_CONTENT_OR) || + (cont->c1 == NULL) || + (cont->c1->type != XML_ELEMENT_CONTENT_PCDATA)){ + xmlErrValid(NULL, XML_DTD_MIXED_CORRUPT, + "Internal: MIXED struct corrupted\n", + NULL); + break; + } + cont = cont->c2; + } + if ((fullname != fn) && (fullname != child->name)) + xmlFree(fullname); + if (cont != NULL) + goto child_ok; + } + cont = elemDecl->content; + while (cont != NULL) { + if (cont->type == XML_ELEMENT_CONTENT_ELEMENT) { + if (xmlStrEqual(cont->name, name)) break; + } else if ((cont->type == XML_ELEMENT_CONTENT_OR) && + (cont->c1 != NULL) && + (cont->c1->type == XML_ELEMENT_CONTENT_ELEMENT)) { + if (xmlStrEqual(cont->c1->name, name)) break; + } else if ((cont->type != XML_ELEMENT_CONTENT_OR) || + (cont->c1 == NULL) || + (cont->c1->type != XML_ELEMENT_CONTENT_PCDATA)) { + xmlErrValid(ctxt, XML_DTD_MIXED_CORRUPT, + "Internal: MIXED struct corrupted\n", + NULL); + break; + } + cont = cont->c2; + } + if (cont == NULL) { + xmlErrValidNode(ctxt, elem, XML_DTD_INVALID_CHILD, + "Element %s is not declared in %s list of possible children\n", + name, elem->name, NULL); + ret = 0; + } + } +child_ok: + child = child->next; + } + break; + case XML_ELEMENT_TYPE_ELEMENT: + if ((doc->standalone == 1) && (extsubset == 1)) { + /* + * VC: Standalone Document Declaration + * - element types with element content, if white space + * occurs directly within any instance of those types. + */ + child = elem->children; + while (child != NULL) { + if (child->type == XML_TEXT_NODE) { + const xmlChar *content = child->content; + + while (IS_BLANK_CH(*content)) + content++; + if (*content == 0) { + xmlErrValidNode(ctxt, elem, + XML_DTD_STANDALONE_WHITE_SPACE, +"standalone: %s declared in the external subset contains white spaces nodes\n", + elem->name, NULL, NULL); + ret = 0; + break; + } + } + child =child->next; + } + } + child = elem->children; + cont = elemDecl->content; + tmp = xmlValidateElementContent(ctxt, child, elemDecl, 1, elem); + if (tmp <= 0) + ret = tmp; + break; + } + } /* not continuous */ + + /* [ VC: Required Attribute ] */ + attr = elemDecl->attributes; + while (attr != NULL) { + if (attr->def == XML_ATTRIBUTE_REQUIRED) { + int qualified = -1; + + if ((attr->prefix == NULL) && + (xmlStrEqual(attr->name, BAD_CAST "xmlns"))) { + xmlNsPtr ns; + + ns = elem->nsDef; + while (ns != NULL) { + if (ns->prefix == NULL) + goto found; + ns = ns->next; + } + } else if (xmlStrEqual(attr->prefix, BAD_CAST "xmlns")) { + xmlNsPtr ns; + + ns = elem->nsDef; + while (ns != NULL) { + if (xmlStrEqual(attr->name, ns->prefix)) + goto found; + ns = ns->next; + } + } else { + xmlAttrPtr attrib; + + attrib = elem->properties; + while (attrib != NULL) { + if (xmlStrEqual(attrib->name, attr->name)) { + if (attr->prefix != NULL) { + xmlNsPtr nameSpace = attrib->ns; + + if (nameSpace == NULL) + nameSpace = elem->ns; + /* + * qualified names handling is problematic, having a + * different prefix should be possible but DTDs don't + * allow to define the URI instead of the prefix :-( + */ + if (nameSpace == NULL) { + if (qualified < 0) + qualified = 0; + } else if (!xmlStrEqual(nameSpace->prefix, + attr->prefix)) { + if (qualified < 1) + qualified = 1; + } else + goto found; + } else { + /* + * We should allow applications to define namespaces + * for their application even if the DTD doesn't + * carry one, otherwise, basically we would always + * break. + */ + goto found; + } + } + attrib = attrib->next; + } + } + if (qualified == -1) { + if (attr->prefix == NULL) { + xmlErrValidNode(ctxt, elem, XML_DTD_MISSING_ATTRIBUTE, + "Element %s does not carry attribute %s\n", + elem->name, attr->name, NULL); + ret = 0; + } else { + xmlErrValidNode(ctxt, elem, XML_DTD_MISSING_ATTRIBUTE, + "Element %s does not carry attribute %s:%s\n", + elem->name, attr->prefix,attr->name); + ret = 0; + } + } else if (qualified == 0) { + xmlErrValidWarning(ctxt, elem, XML_DTD_NO_PREFIX, + "Element %s required attribute %s:%s has no prefix\n", + elem->name, attr->prefix, attr->name); + } else if (qualified == 1) { + xmlErrValidWarning(ctxt, elem, XML_DTD_DIFFERENT_PREFIX, + "Element %s required attribute %s:%s has different prefix\n", + elem->name, attr->prefix, attr->name); + } + } else if (attr->def == XML_ATTRIBUTE_FIXED) { + /* + * Special tests checking #FIXED namespace declarations + * have the right value since this is not done as an + * attribute checking + */ + if ((attr->prefix == NULL) && + (xmlStrEqual(attr->name, BAD_CAST "xmlns"))) { + xmlNsPtr ns; + + ns = elem->nsDef; + while (ns != NULL) { + if (ns->prefix == NULL) { + if (!xmlStrEqual(attr->defaultValue, ns->href)) { + xmlErrValidNode(ctxt, elem, + XML_DTD_ELEM_DEFAULT_NAMESPACE, + "Element %s namespace name for default namespace does not match the DTD\n", + elem->name, NULL, NULL); + ret = 0; + } + goto found; + } + ns = ns->next; + } + } else if (xmlStrEqual(attr->prefix, BAD_CAST "xmlns")) { + xmlNsPtr ns; + + ns = elem->nsDef; + while (ns != NULL) { + if (xmlStrEqual(attr->name, ns->prefix)) { + if (!xmlStrEqual(attr->defaultValue, ns->href)) { + xmlErrValidNode(ctxt, elem, XML_DTD_ELEM_NAMESPACE, + "Element %s namespace name for %s does not match the DTD\n", + elem->name, ns->prefix, NULL); + ret = 0; + } + goto found; + } + ns = ns->next; + } + } + } +found: + attr = attr->nexth; + } + return(ret); +} + +/** + * xmlValidateRoot: + * @ctxt: the validation context + * @doc: a document instance + * + * Try to validate a the root element + * basically it does the following check as described by the + * XML-1.0 recommendation: + * - [ VC: Root Element Type ] + * it doesn't try to recurse or apply other check to the element + * + * returns 1 if valid or 0 otherwise + */ + +int +xmlValidateRoot(xmlValidCtxtPtr ctxt, xmlDocPtr doc) { + xmlNodePtr root; + int ret; + + if (doc == NULL) return(0); + + root = xmlDocGetRootElement(doc); + if ((root == NULL) || (root->name == NULL)) { + xmlErrValid(ctxt, XML_DTD_NO_ROOT, + "no root element\n", NULL); + return(0); + } + + /* + * When doing post validation against a separate DTD, those may + * no internal subset has been generated + */ + if ((doc->intSubset != NULL) && + (doc->intSubset->name != NULL)) { + /* + * Check first the document root against the NQName + */ + if (!xmlStrEqual(doc->intSubset->name, root->name)) { + if ((root->ns != NULL) && (root->ns->prefix != NULL)) { + xmlChar fn[50]; + xmlChar *fullname; + + fullname = xmlBuildQName(root->name, root->ns->prefix, fn, 50); + if (fullname == NULL) { + xmlVErrMemory(ctxt, NULL); + return(0); + } + ret = xmlStrEqual(doc->intSubset->name, fullname); + if ((fullname != fn) && (fullname != root->name)) + xmlFree(fullname); + if (ret == 1) + goto name_ok; + } + if ((xmlStrEqual(doc->intSubset->name, BAD_CAST "HTML")) && + (xmlStrEqual(root->name, BAD_CAST "html"))) + goto name_ok; + xmlErrValidNode(ctxt, root, XML_DTD_ROOT_NAME, + "root and DTD name do not match '%s' and '%s'\n", + root->name, doc->intSubset->name, NULL); + return(0); + } + } +name_ok: + return(1); +} + + +/** + * xmlValidateElement: + * @ctxt: the validation context + * @doc: a document instance + * @elem: an element instance + * + * Try to validate the subtree under an element + * + * returns 1 if valid or 0 otherwise + */ + +int +xmlValidateElement(xmlValidCtxtPtr ctxt, xmlDocPtr doc, xmlNodePtr elem) { + xmlNodePtr child; + xmlAttrPtr attr; + xmlNsPtr ns; + const xmlChar *value; + int ret = 1; + + if (elem == NULL) return(0); + + /* + * XInclude elements were added after parsing in the infoset, + * they don't really mean anything validation wise. + */ + if ((elem->type == XML_XINCLUDE_START) || + (elem->type == XML_XINCLUDE_END) || + (elem->type == XML_NAMESPACE_DECL)) + return(1); + + CHECK_DTD; + + /* + * Entities references have to be handled separately + */ + if (elem->type == XML_ENTITY_REF_NODE) { + return(1); + } + + ret &= xmlValidateOneElement(ctxt, doc, elem); + if (elem->type == XML_ELEMENT_NODE) { + attr = elem->properties; + while (attr != NULL) { + value = xmlNodeListGetString(doc, attr->children, 0); + ret &= xmlValidateOneAttribute(ctxt, doc, elem, attr, value); + if (value != NULL) + xmlFree((char *)value); + attr= attr->next; + } + ns = elem->nsDef; + while (ns != NULL) { + if (elem->ns == NULL) + ret &= xmlValidateOneNamespace(ctxt, doc, elem, NULL, + ns, ns->href); + else + ret &= xmlValidateOneNamespace(ctxt, doc, elem, + elem->ns->prefix, ns, ns->href); + ns = ns->next; + } + } + child = elem->children; + while (child != NULL) { + ret &= xmlValidateElement(ctxt, doc, child); + child = child->next; + } + + return(ret); +} + +/** + * xmlValidateRef: + * @ref: A reference to be validated + * @ctxt: Validation context + * @name: Name of ID we are searching for + * + */ +static void +xmlValidateRef(xmlRefPtr ref, xmlValidCtxtPtr ctxt, + const xmlChar *name) { + xmlAttrPtr id; + xmlAttrPtr attr; + + if (ref == NULL) + return; + if ((ref->attr == NULL) && (ref->name == NULL)) + return; + attr = ref->attr; + if (attr == NULL) { + xmlChar *dup, *str = NULL, *cur, save; + + dup = xmlStrdup(name); + if (dup == NULL) { + ctxt->valid = 0; + return; + } + cur = dup; + while (*cur != 0) { + str = cur; + while ((*cur != 0) && (!IS_BLANK_CH(*cur))) cur++; + save = *cur; + *cur = 0; + id = xmlGetID(ctxt->doc, str); + if (id == NULL) { + xmlErrValidNodeNr(ctxt, NULL, XML_DTD_UNKNOWN_ID, + "attribute %s line %d references an unknown ID \"%s\"\n", + ref->name, ref->lineno, str); + ctxt->valid = 0; + } + if (save == 0) + break; + *cur = save; + while (IS_BLANK_CH(*cur)) cur++; + } + xmlFree(dup); + } else if (attr->atype == XML_ATTRIBUTE_IDREF) { + id = xmlGetID(ctxt->doc, name); + if (id == NULL) { + xmlErrValidNode(ctxt, attr->parent, XML_DTD_UNKNOWN_ID, + "IDREF attribute %s references an unknown ID \"%s\"\n", + attr->name, name, NULL); + ctxt->valid = 0; + } + } else if (attr->atype == XML_ATTRIBUTE_IDREFS) { + xmlChar *dup, *str = NULL, *cur, save; + + dup = xmlStrdup(name); + if (dup == NULL) { + xmlVErrMemory(ctxt, "IDREFS split"); + ctxt->valid = 0; + return; + } + cur = dup; + while (*cur != 0) { + str = cur; + while ((*cur != 0) && (!IS_BLANK_CH(*cur))) cur++; + save = *cur; + *cur = 0; + id = xmlGetID(ctxt->doc, str); + if (id == NULL) { + xmlErrValidNode(ctxt, attr->parent, XML_DTD_UNKNOWN_ID, + "IDREFS attribute %s references an unknown ID \"%s\"\n", + attr->name, str, NULL); + ctxt->valid = 0; + } + if (save == 0) + break; + *cur = save; + while (IS_BLANK_CH(*cur)) cur++; + } + xmlFree(dup); + } +} + +/** + * xmlWalkValidateList: + * @data: Contents of current link + * @user: Value supplied by the user + * + * Returns 0 to abort the walk or 1 to continue + */ +static int +xmlWalkValidateList(const void *data, const void *user) +{ + xmlValidateMemoPtr memo = (xmlValidateMemoPtr)user; + xmlValidateRef((xmlRefPtr)data, memo->ctxt, memo->name); + return 1; +} + +/** + * xmlValidateCheckRefCallback: + * @ref_list: List of references + * @ctxt: Validation context + * @name: Name of ID we are searching for + * + */ +static void +xmlValidateCheckRefCallback(xmlListPtr ref_list, xmlValidCtxtPtr ctxt, + const xmlChar *name) { + xmlValidateMemo memo; + + if (ref_list == NULL) + return; + memo.ctxt = ctxt; + memo.name = name; + + xmlListWalk(ref_list, xmlWalkValidateList, &memo); + +} + +/** + * xmlValidateDocumentFinal: + * @ctxt: the validation context + * @doc: a document instance + * + * Does the final step for the document validation once all the + * incremental validation steps have been completed + * + * basically it does the following checks described by the XML Rec + * + * Check all the IDREF/IDREFS attributes definition for validity + * + * returns 1 if valid or 0 otherwise + */ + +int +xmlValidateDocumentFinal(xmlValidCtxtPtr ctxt, xmlDocPtr doc) { + xmlRefTablePtr table; + unsigned int save; + + if (ctxt == NULL) + return(0); + if (doc == NULL) { + xmlErrValid(ctxt, XML_DTD_NO_DOC, + "xmlValidateDocumentFinal: doc == NULL\n", NULL); + return(0); + } + + /* trick to get correct line id report */ + save = ctxt->finishDtd; + ctxt->finishDtd = 0; + + /* + * Check all the NOTATION/NOTATIONS attributes + */ + /* + * Check all the ENTITY/ENTITIES attributes definition for validity + */ + /* + * Check all the IDREF/IDREFS attributes definition for validity + */ + table = (xmlRefTablePtr) doc->refs; + ctxt->doc = doc; + ctxt->valid = 1; + xmlHashScan(table, (xmlHashScanner) xmlValidateCheckRefCallback, ctxt); + + ctxt->finishDtd = save; + return(ctxt->valid); +} + +/** + * xmlValidateDtd: + * @ctxt: the validation context + * @doc: a document instance + * @dtd: a dtd instance + * + * Try to validate the document against the dtd instance + * + * Basically it does check all the definitions in the DtD. + * Note the the internal subset (if present) is de-coupled + * (i.e. not used), which could give problems if ID or IDREF + * is present. + * + * returns 1 if valid or 0 otherwise + */ + +int +xmlValidateDtd(xmlValidCtxtPtr ctxt, xmlDocPtr doc, xmlDtdPtr dtd) { + int ret; + xmlDtdPtr oldExt, oldInt; + xmlNodePtr root; + + if (dtd == NULL) return(0); + if (doc == NULL) return(0); + oldExt = doc->extSubset; + oldInt = doc->intSubset; + doc->extSubset = dtd; + doc->intSubset = NULL; + ret = xmlValidateRoot(ctxt, doc); + if (ret == 0) { + doc->extSubset = oldExt; + doc->intSubset = oldInt; + return(ret); + } + if (doc->ids != NULL) { + xmlFreeIDTable(doc->ids); + doc->ids = NULL; + } + if (doc->refs != NULL) { + xmlFreeRefTable(doc->refs); + doc->refs = NULL; + } + root = xmlDocGetRootElement(doc); + ret = xmlValidateElement(ctxt, doc, root); + ret &= xmlValidateDocumentFinal(ctxt, doc); + doc->extSubset = oldExt; + doc->intSubset = oldInt; + return(ret); +} + +static void +xmlValidateNotationCallback(xmlEntityPtr cur, xmlValidCtxtPtr ctxt, + const xmlChar *name ATTRIBUTE_UNUSED) { + if (cur == NULL) + return; + if (cur->etype == XML_EXTERNAL_GENERAL_UNPARSED_ENTITY) { + xmlChar *notation = cur->content; + + if (notation != NULL) { + int ret; + + ret = xmlValidateNotationUse(ctxt, cur->doc, notation); + if (ret != 1) { + ctxt->valid = 0; + } + } + } +} + +static void +xmlValidateAttributeCallback(xmlAttributePtr cur, xmlValidCtxtPtr ctxt, + const xmlChar *name ATTRIBUTE_UNUSED) { + int ret; + xmlDocPtr doc; + xmlElementPtr elem = NULL; + + if (cur == NULL) + return; + switch (cur->atype) { + case XML_ATTRIBUTE_CDATA: + case XML_ATTRIBUTE_ID: + case XML_ATTRIBUTE_IDREF : + case XML_ATTRIBUTE_IDREFS: + case XML_ATTRIBUTE_NMTOKEN: + case XML_ATTRIBUTE_NMTOKENS: + case XML_ATTRIBUTE_ENUMERATION: + break; + case XML_ATTRIBUTE_ENTITY: + case XML_ATTRIBUTE_ENTITIES: + case XML_ATTRIBUTE_NOTATION: + if (cur->defaultValue != NULL) { + + ret = xmlValidateAttributeValue2(ctxt, ctxt->doc, cur->name, + cur->atype, cur->defaultValue); + if ((ret == 0) && (ctxt->valid == 1)) + ctxt->valid = 0; + } + if (cur->tree != NULL) { + xmlEnumerationPtr tree = cur->tree; + while (tree != NULL) { + ret = xmlValidateAttributeValue2(ctxt, ctxt->doc, + cur->name, cur->atype, tree->name); + if ((ret == 0) && (ctxt->valid == 1)) + ctxt->valid = 0; + tree = tree->next; + } + } + } + if (cur->atype == XML_ATTRIBUTE_NOTATION) { + doc = cur->doc; + if (cur->elem == NULL) { + xmlErrValid(ctxt, XML_ERR_INTERNAL_ERROR, + "xmlValidateAttributeCallback(%s): internal error\n", + (const char *) cur->name); + return; + } + + if (doc != NULL) + elem = xmlGetDtdElementDesc(doc->intSubset, cur->elem); + if ((elem == NULL) && (doc != NULL)) + elem = xmlGetDtdElementDesc(doc->extSubset, cur->elem); + if ((elem == NULL) && (cur->parent != NULL) && + (cur->parent->type == XML_DTD_NODE)) + elem = xmlGetDtdElementDesc((xmlDtdPtr) cur->parent, cur->elem); + if (elem == NULL) { + xmlErrValidNode(ctxt, NULL, XML_DTD_UNKNOWN_ELEM, + "attribute %s: could not find decl for element %s\n", + cur->name, cur->elem, NULL); + return; + } + if (elem->etype == XML_ELEMENT_TYPE_EMPTY) { + xmlErrValidNode(ctxt, NULL, XML_DTD_EMPTY_NOTATION, + "NOTATION attribute %s declared for EMPTY element %s\n", + cur->name, cur->elem, NULL); + ctxt->valid = 0; + } + } +} + +/** + * xmlValidateDtdFinal: + * @ctxt: the validation context + * @doc: a document instance + * + * Does the final step for the dtds validation once all the + * subsets have been parsed + * + * basically it does the following checks described by the XML Rec + * - check that ENTITY and ENTITIES type attributes default or + * possible values matches one of the defined entities. + * - check that NOTATION type attributes default or + * possible values matches one of the defined notations. + * + * returns 1 if valid or 0 if invalid and -1 if not well-formed + */ + +int +xmlValidateDtdFinal(xmlValidCtxtPtr ctxt, xmlDocPtr doc) { + xmlDtdPtr dtd; + xmlAttributeTablePtr table; + xmlEntitiesTablePtr entities; + + if ((doc == NULL) || (ctxt == NULL)) return(0); + if ((doc->intSubset == NULL) && (doc->extSubset == NULL)) + return(0); + ctxt->doc = doc; + ctxt->valid = 1; + dtd = doc->intSubset; + if ((dtd != NULL) && (dtd->attributes != NULL)) { + table = (xmlAttributeTablePtr) dtd->attributes; + xmlHashScan(table, (xmlHashScanner) xmlValidateAttributeCallback, ctxt); + } + if ((dtd != NULL) && (dtd->entities != NULL)) { + entities = (xmlEntitiesTablePtr) dtd->entities; + xmlHashScan(entities, (xmlHashScanner) xmlValidateNotationCallback, + ctxt); + } + dtd = doc->extSubset; + if ((dtd != NULL) && (dtd->attributes != NULL)) { + table = (xmlAttributeTablePtr) dtd->attributes; + xmlHashScan(table, (xmlHashScanner) xmlValidateAttributeCallback, ctxt); + } + if ((dtd != NULL) && (dtd->entities != NULL)) { + entities = (xmlEntitiesTablePtr) dtd->entities; + xmlHashScan(entities, (xmlHashScanner) xmlValidateNotationCallback, + ctxt); + } + return(ctxt->valid); +} + +/** + * xmlValidateDocument: + * @ctxt: the validation context + * @doc: a document instance + * + * Try to validate the document instance + * + * basically it does the all the checks described by the XML Rec + * i.e. validates the internal and external subset (if present) + * and validate the document tree. + * + * returns 1 if valid or 0 otherwise + */ + +int +xmlValidateDocument(xmlValidCtxtPtr ctxt, xmlDocPtr doc) { + int ret; + xmlNodePtr root; + + if (doc == NULL) + return(0); + if ((doc->intSubset == NULL) && (doc->extSubset == NULL)) { + xmlErrValid(ctxt, XML_DTD_NO_DTD, + "no DTD found!\n", NULL); + return(0); + } + if ((doc->intSubset != NULL) && ((doc->intSubset->SystemID != NULL) || + (doc->intSubset->ExternalID != NULL)) && (doc->extSubset == NULL)) { + xmlChar *sysID; + if (doc->intSubset->SystemID != NULL) { + sysID = xmlBuildURI(doc->intSubset->SystemID, + doc->URL); + if (sysID == NULL) { + xmlErrValid(ctxt, XML_DTD_LOAD_ERROR, + "Could not build URI for external subset \"%s\"\n", + (const char *) doc->intSubset->SystemID); + return 0; + } + } else + sysID = NULL; + doc->extSubset = xmlParseDTD(doc->intSubset->ExternalID, + (const xmlChar *)sysID); + if (sysID != NULL) + xmlFree(sysID); + if (doc->extSubset == NULL) { + if (doc->intSubset->SystemID != NULL) { + xmlErrValid(ctxt, XML_DTD_LOAD_ERROR, + "Could not load the external subset \"%s\"\n", + (const char *) doc->intSubset->SystemID); + } else { + xmlErrValid(ctxt, XML_DTD_LOAD_ERROR, + "Could not load the external subset \"%s\"\n", + (const char *) doc->intSubset->ExternalID); + } + return(0); + } + } + + if (doc->ids != NULL) { + xmlFreeIDTable(doc->ids); + doc->ids = NULL; + } + if (doc->refs != NULL) { + xmlFreeRefTable(doc->refs); + doc->refs = NULL; + } + ret = xmlValidateDtdFinal(ctxt, doc); + if (!xmlValidateRoot(ctxt, doc)) return(0); + + root = xmlDocGetRootElement(doc); + ret &= xmlValidateElement(ctxt, doc, root); + ret &= xmlValidateDocumentFinal(ctxt, doc); + return(ret); +} + +/************************************************************************ + * * + * Routines for dynamic validation editing * + * * + ************************************************************************/ + +/** + * xmlValidGetPotentialChildren: + * @ctree: an element content tree + * @names: an array to store the list of child names + * @len: a pointer to the number of element in the list + * @max: the size of the array + * + * Build/extend a list of potential children allowed by the content tree + * + * returns the number of element in the list, or -1 in case of error. + */ + +int +xmlValidGetPotentialChildren(xmlElementContent *ctree, + const xmlChar **names, + int *len, int max) { + int i; + + if ((ctree == NULL) || (names == NULL) || (len == NULL)) + return(-1); + if (*len >= max) return(*len); + + switch (ctree->type) { + case XML_ELEMENT_CONTENT_PCDATA: + for (i = 0; i < *len;i++) + if (xmlStrEqual(BAD_CAST "#PCDATA", names[i])) return(*len); + names[(*len)++] = BAD_CAST "#PCDATA"; + break; + case XML_ELEMENT_CONTENT_ELEMENT: + for (i = 0; i < *len;i++) + if (xmlStrEqual(ctree->name, names[i])) return(*len); + names[(*len)++] = ctree->name; + break; + case XML_ELEMENT_CONTENT_SEQ: + xmlValidGetPotentialChildren(ctree->c1, names, len, max); + xmlValidGetPotentialChildren(ctree->c2, names, len, max); + break; + case XML_ELEMENT_CONTENT_OR: + xmlValidGetPotentialChildren(ctree->c1, names, len, max); + xmlValidGetPotentialChildren(ctree->c2, names, len, max); + break; + } + + return(*len); +} + +/* + * Dummy function to suppress messages while we try out valid elements + */ +static void XMLCDECL xmlNoValidityErr(void *ctx ATTRIBUTE_UNUSED, + const char *msg ATTRIBUTE_UNUSED, ...) { + return; +} + +/** + * xmlValidGetValidElements: + * @prev: an element to insert after + * @next: an element to insert next + * @names: an array to store the list of child names + * @max: the size of the array + * + * This function returns the list of authorized children to insert + * within an existing tree while respecting the validity constraints + * forced by the Dtd. The insertion point is defined using @prev and + * @next in the following ways: + * to insert before 'node': xmlValidGetValidElements(node->prev, node, ... + * to insert next 'node': xmlValidGetValidElements(node, node->next, ... + * to replace 'node': xmlValidGetValidElements(node->prev, node->next, ... + * to prepend a child to 'node': xmlValidGetValidElements(NULL, node->childs, + * to append a child to 'node': xmlValidGetValidElements(node->last, NULL, ... + * + * pointers to the element names are inserted at the beginning of the array + * and do not need to be freed. + * + * returns the number of element in the list, or -1 in case of error. If + * the function returns the value @max the caller is invited to grow the + * receiving array and retry. + */ + +int +xmlValidGetValidElements(xmlNode *prev, xmlNode *next, const xmlChar **names, + int max) { + xmlValidCtxt vctxt; + int nb_valid_elements = 0; + const xmlChar *elements[256]; + int nb_elements = 0, i; + const xmlChar *name; + + xmlNode *ref_node; + xmlNode *parent; + xmlNode *test_node; + + xmlNode *prev_next; + xmlNode *next_prev; + xmlNode *parent_childs; + xmlNode *parent_last; + + xmlElement *element_desc; + + if (prev == NULL && next == NULL) + return(-1); + + if (names == NULL) return(-1); + if (max <= 0) return(-1); + + memset(&vctxt, 0, sizeof (xmlValidCtxt)); + vctxt.error = xmlNoValidityErr; /* this suppresses err/warn output */ + + nb_valid_elements = 0; + ref_node = prev ? prev : next; + parent = ref_node->parent; + + /* + * Retrieves the parent element declaration + */ + element_desc = xmlGetDtdElementDesc(parent->doc->intSubset, + parent->name); + if ((element_desc == NULL) && (parent->doc->extSubset != NULL)) + element_desc = xmlGetDtdElementDesc(parent->doc->extSubset, + parent->name); + if (element_desc == NULL) return(-1); + + /* + * Do a backup of the current tree structure + */ + prev_next = prev ? prev->next : NULL; + next_prev = next ? next->prev : NULL; + parent_childs = parent->children; + parent_last = parent->last; + + /* + * Creates a dummy node and insert it into the tree + */ + test_node = xmlNewDocNode (ref_node->doc, NULL, BAD_CAST "", NULL); + test_node->parent = parent; + test_node->prev = prev; + test_node->next = next; + name = test_node->name; + + if (prev) prev->next = test_node; + else parent->children = test_node; + + if (next) next->prev = test_node; + else parent->last = test_node; + + /* + * Insert each potential child node and check if the parent is + * still valid + */ + nb_elements = xmlValidGetPotentialChildren(element_desc->content, + elements, &nb_elements, 256); + + for (i = 0;i < nb_elements;i++) { + test_node->name = elements[i]; + if (xmlValidateOneElement(&vctxt, parent->doc, parent)) { + int j; + + for (j = 0; j < nb_valid_elements;j++) + if (xmlStrEqual(elements[i], names[j])) break; + names[nb_valid_elements++] = elements[i]; + if (nb_valid_elements >= max) break; + } + } + + /* + * Restore the tree structure + */ + if (prev) prev->next = prev_next; + if (next) next->prev = next_prev; + parent->children = parent_childs; + parent->last = parent_last; + + /* + * Free up the dummy node + */ + test_node->name = name; + xmlFreeNode(test_node); + + return(nb_valid_elements); +} +#endif /* LIBXML_VALID_ENABLED */ + +#define bottom_valid +#include "elfgcchack.h" diff --git a/vendors/libxml/src/win32config.h b/vendors/libxml/src/win32config.h new file mode 100644 index 0000000..3fc9be5 --- /dev/null +++ b/vendors/libxml/src/win32config.h @@ -0,0 +1,124 @@ +#ifndef __LIBXML_WIN32_CONFIG__ +#define __LIBXML_WIN32_CONFIG__ + +#define HAVE_CTYPE_H +#define HAVE_STDARG_H +#define HAVE_MALLOC_H +#define HAVE_ERRNO_H + +#if defined(_WIN32_WCE) +#undef HAVE_ERRNO_H +#include +#include "wincecompat.h" +#else +#define HAVE_SYS_STAT_H +#define HAVE__STAT +#define HAVE_STAT +#define HAVE_STDLIB_H +#define HAVE_TIME_H +#define HAVE_FCNTL_H +#include +#include +#endif + +#include + +#ifndef ICONV_CONST +#define ICONV_CONST const +#endif + +#ifdef NEED_SOCKETS +#include +#endif + +/* + * Windows platforms may define except + */ +#undef except + +#define HAVE_ISINF +#define HAVE_ISNAN +#include +#if defined(_MSC_VER) || defined(__BORLANDC__) +/* MS C-runtime has functions which can be used in order to determine if + a given floating-point variable contains NaN, (+-)INF. These are + preferred, because floating-point technology is considered propriatary + by MS and we can assume that their functions know more about their + oddities than we do. */ +#include +/* Bjorn Reese figured a quite nice construct for isinf() using the _fpclass + function. */ +#ifndef isinf +#define isinf(d) ((_fpclass(d) == _FPCLASS_PINF) ? 1 \ + : ((_fpclass(d) == _FPCLASS_NINF) ? -1 : 0)) +#endif +/* _isnan(x) returns nonzero if (x == NaN) and zero otherwise. */ +#ifndef isnan +#define isnan(d) (_isnan(d)) +#endif +#else /* _MSC_VER */ +#ifndef isinf +static int isinf (double d) { + int expon = 0; + double val = frexp (d, &expon); + if (expon == 1025) { + if (val == 0.5) { + return 1; + } else if (val == -0.5) { + return -1; + } else { + return 0; + } + } else { + return 0; + } +} +#endif +#ifndef isnan +static int isnan (double d) { + int expon = 0; + double val = frexp (d, &expon); + if (expon == 1025) { + if (val == 0.5) { + return 0; + } else if (val == -0.5) { + return 0; + } else { + return 1; + } + } else { + return 0; + } +} +#endif +#endif /* _MSC_VER */ + +#if defined(_MSC_VER) +#define mkdir(p,m) _mkdir(p) +#define snprintf _snprintf +#if _MSC_VER < 1500 +#define vsnprintf(b,c,f,a) _vsnprintf(b,c,f,a) +#endif +#elif defined(__MINGW32__) +#define mkdir(p,m) _mkdir(p) +#endif + +/* Threading API to use should be specified here for compatibility reasons. + This is however best specified on the compiler's command-line. */ +#if defined(LIBXML_THREAD_ENABLED) +#if !defined(HAVE_PTHREAD_H) && !defined(HAVE_WIN32_THREADS) && !defined(_WIN32_WCE) +#define HAVE_WIN32_THREADS +#endif +#endif + +/* Some third-party libraries far from our control assume the following + is defined, which it is not if we don't include windows.h. */ +#if !defined(FALSE) +#define FALSE 0 +#endif +#if !defined(TRUE) +#define TRUE (!(FALSE)) +#endif + +#endif /* __LIBXML_WIN32_CONFIG__ */ + diff --git a/vendors/libxml/src/wsockcompat.h b/vendors/libxml/src/wsockcompat.h new file mode 100644 index 0000000..e6a1a99 --- /dev/null +++ b/vendors/libxml/src/wsockcompat.h @@ -0,0 +1,86 @@ +/* include/wsockcompat.h + * Windows -> Berkeley Sockets compatibility things. + */ + +#if !defined __XML_WSOCKCOMPAT_H__ +#define __XML_WSOCKCOMPAT_H__ + +#ifdef _WIN32_WCE +#include +#else +#undef HAVE_ERRNO_H +#include + +/* the following is a workaround a problem for 'inline' keyword in said + header when compiled with Borland C++ 6 */ +#if defined(__BORLANDC__) && !defined(__cplusplus) +#define inline __inline +#define _inline __inline +#endif + +#include + +/* Check if ws2tcpip.h is a recent version which provides getaddrinfo() */ +#if defined(GetAddrInfo) +#include +#define HAVE_GETADDRINFO +#endif +#endif + +#if defined( __MINGW32__ ) || defined( _MSC_VER ) +/* Include here to ensure that it doesn't get included later + * (e.g. by iconv.h) and overwrites the definition of EWOULDBLOCK. */ +#include +#undef EWOULDBLOCK +#endif + +#if !defined SOCKLEN_T +#define SOCKLEN_T int +#endif + +#define EWOULDBLOCK WSAEWOULDBLOCK +#define ESHUTDOWN WSAESHUTDOWN + +#if (!defined(_MSC_VER) || (_MSC_VER < 1600)) +#define EINPROGRESS WSAEINPROGRESS +#define EALREADY WSAEALREADY +#define ENOTSOCK WSAENOTSOCK +#define EDESTADDRREQ WSAEDESTADDRREQ +#define EMSGSIZE WSAEMSGSIZE +#define EPROTOTYPE WSAEPROTOTYPE +#define ENOPROTOOPT WSAENOPROTOOPT +#define EPROTONOSUPPORT WSAEPROTONOSUPPORT +#define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT +#define EOPNOTSUPP WSAEOPNOTSUPP +#define EPFNOSUPPORT WSAEPFNOSUPPORT +#define EAFNOSUPPORT WSAEAFNOSUPPORT +#define EADDRINUSE WSAEADDRINUSE +#define EADDRNOTAVAIL WSAEADDRNOTAVAIL +#define ENETDOWN WSAENETDOWN +#define ENETUNREACH WSAENETUNREACH +#define ENETRESET WSAENETRESET +#define ECONNABORTED WSAECONNABORTED +#define ECONNRESET WSAECONNRESET +#define ENOBUFS WSAENOBUFS +#define EISCONN WSAEISCONN +#define ENOTCONN WSAENOTCONN +#define ETOOMANYREFS WSAETOOMANYREFS +#define ETIMEDOUT WSAETIMEDOUT +#define ECONNREFUSED WSAECONNREFUSED +#define ELOOP WSAELOOP +#define EHOSTDOWN WSAEHOSTDOWN +#define EHOSTUNREACH WSAEHOSTUNREACH +#define EPROCLIM WSAEPROCLIM +#define EUSERS WSAEUSERS +#define EDQUOT WSAEDQUOT +#define ESTALE WSAESTALE +#define EREMOTE WSAEREMOTE +/* These cause conflicts with the codes from errno.h. Since they are + not used in the relevant code (nanoftp, nanohttp), we can leave + them disabled. +#define ENAMETOOLONG WSAENAMETOOLONG +#define ENOTEMPTY WSAENOTEMPTY +*/ +#endif /* _MSC_VER */ + +#endif /* __XML_WSOCKCOMPAT_H__ */ diff --git a/vendors/libxml/src/xinclude.c b/vendors/libxml/src/xinclude.c new file mode 100644 index 0000000..ace005b --- /dev/null +++ b/vendors/libxml/src/xinclude.c @@ -0,0 +1,2623 @@ +/* + * xinclude.c : Code to implement XInclude processing + * + * World Wide Web Consortium W3C Last Call Working Draft 10 November 2003 + * http://www.w3.org/TR/2003/WD-xinclude-20031110 + * + * See Copyright for the status of this software. + * + * daniel@veillard.com + */ + +#define IN_LIBXML +#include "libxml.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef LIBXML_XINCLUDE_ENABLED +#include + +#include "buf.h" + +#define XINCLUDE_MAX_DEPTH 40 + +/* #define DEBUG_XINCLUDE */ +#ifdef DEBUG_XINCLUDE +#ifdef LIBXML_DEBUG_ENABLED +#include +#endif +#endif + +/************************************************************************ + * * + * XInclude context handling * + * * + ************************************************************************/ + +/* + * An XInclude context + */ +typedef xmlChar *xmlURL; + +typedef struct _xmlXIncludeRef xmlXIncludeRef; +typedef xmlXIncludeRef *xmlXIncludeRefPtr; +struct _xmlXIncludeRef { + xmlChar *URI; /* the fully resolved resource URL */ + xmlChar *fragment; /* the fragment in the URI */ + xmlDocPtr doc; /* the parsed document */ + xmlNodePtr ref; /* the node making the reference in the source */ + xmlNodePtr inc; /* the included copy */ + int xml; /* xml or txt */ + int count; /* how many refs use that specific doc */ + xmlXPathObjectPtr xptr; /* the xpointer if needed */ + int emptyFb; /* flag to show fallback empty */ +}; + +struct _xmlXIncludeCtxt { + xmlDocPtr doc; /* the source document */ + int incBase; /* the first include for this document */ + int incNr; /* number of includes */ + int incMax; /* size of includes tab */ + xmlXIncludeRefPtr *incTab; /* array of included references */ + + int txtNr; /* number of unparsed documents */ + int txtMax; /* size of unparsed documents tab */ + xmlNodePtr *txtTab; /* array of unparsed text nodes */ + xmlURL *txturlTab; /* array of unparsed text URLs */ + + xmlChar * url; /* the current URL processed */ + int urlNr; /* number of URLs stacked */ + int urlMax; /* size of URL stack */ + xmlChar * *urlTab; /* URL stack */ + + int nbErrors; /* the number of errors detected */ + int legacy; /* using XINCLUDE_OLD_NS */ + int parseFlags; /* the flags used for parsing XML documents */ + xmlChar * base; /* the current xml:base */ + + void *_private; /* application data */ +}; + +static int +xmlXIncludeDoProcess(xmlXIncludeCtxtPtr ctxt, xmlDocPtr doc, xmlNodePtr tree); + + +/************************************************************************ + * * + * XInclude error handler * + * * + ************************************************************************/ + +/** + * xmlXIncludeErrMemory: + * @extra: extra information + * + * Handle an out of memory condition + */ +static void +xmlXIncludeErrMemory(xmlXIncludeCtxtPtr ctxt, xmlNodePtr node, + const char *extra) +{ + if (ctxt != NULL) + ctxt->nbErrors++; + __xmlRaiseError(NULL, NULL, NULL, ctxt, node, XML_FROM_XINCLUDE, + XML_ERR_NO_MEMORY, XML_ERR_ERROR, NULL, 0, + extra, NULL, NULL, 0, 0, + "Memory allocation failed : %s\n", extra); +} + +/** + * xmlXIncludeErr: + * @ctxt: the XInclude context + * @node: the context node + * @msg: the error message + * @extra: extra information + * + * Handle an XInclude error + */ +static void +xmlXIncludeErr(xmlXIncludeCtxtPtr ctxt, xmlNodePtr node, int error, + const char *msg, const xmlChar *extra) +{ + if (ctxt != NULL) + ctxt->nbErrors++; + __xmlRaiseError(NULL, NULL, NULL, ctxt, node, XML_FROM_XINCLUDE, + error, XML_ERR_ERROR, NULL, 0, + (const char *) extra, NULL, NULL, 0, 0, + msg, (const char *) extra); +} + +#if 0 +/** + * xmlXIncludeWarn: + * @ctxt: the XInclude context + * @node: the context node + * @msg: the error message + * @extra: extra information + * + * Emit an XInclude warning. + */ +static void +xmlXIncludeWarn(xmlXIncludeCtxtPtr ctxt, xmlNodePtr node, int error, + const char *msg, const xmlChar *extra) +{ + __xmlRaiseError(NULL, NULL, NULL, ctxt, node, XML_FROM_XINCLUDE, + error, XML_ERR_WARNING, NULL, 0, + (const char *) extra, NULL, NULL, 0, 0, + msg, (const char *) extra); +} +#endif + +/** + * xmlXIncludeGetProp: + * @ctxt: the XInclude context + * @cur: the node + * @name: the attribute name + * + * Get an XInclude attribute + * + * Returns the value (to be freed) or NULL if not found + */ +static xmlChar * +xmlXIncludeGetProp(xmlXIncludeCtxtPtr ctxt, xmlNodePtr cur, + const xmlChar *name) { + xmlChar *ret; + + ret = xmlGetNsProp(cur, XINCLUDE_NS, name); + if (ret != NULL) + return(ret); + if (ctxt->legacy != 0) { + ret = xmlGetNsProp(cur, XINCLUDE_OLD_NS, name); + if (ret != NULL) + return(ret); + } + ret = xmlGetProp(cur, name); + return(ret); +} +/** + * xmlXIncludeFreeRef: + * @ref: the XInclude reference + * + * Free an XInclude reference + */ +static void +xmlXIncludeFreeRef(xmlXIncludeRefPtr ref) { + if (ref == NULL) + return; +#ifdef DEBUG_XINCLUDE + xmlGenericError(xmlGenericErrorContext, "Freeing ref\n"); +#endif + if (ref->doc != NULL) { +#ifdef DEBUG_XINCLUDE + xmlGenericError(xmlGenericErrorContext, "Freeing doc %s\n", ref->URI); +#endif + xmlFreeDoc(ref->doc); + } + if (ref->URI != NULL) + xmlFree(ref->URI); + if (ref->fragment != NULL) + xmlFree(ref->fragment); + if (ref->xptr != NULL) + xmlXPathFreeObject(ref->xptr); + xmlFree(ref); +} + +/** + * xmlXIncludeNewRef: + * @ctxt: the XInclude context + * @URI: the resource URI + * + * Creates a new reference within an XInclude context + * + * Returns the new set + */ +static xmlXIncludeRefPtr +xmlXIncludeNewRef(xmlXIncludeCtxtPtr ctxt, const xmlChar *URI, + xmlNodePtr ref) { + xmlXIncludeRefPtr ret; + +#ifdef DEBUG_XINCLUDE + xmlGenericError(xmlGenericErrorContext, "New ref %s\n", URI); +#endif + ret = (xmlXIncludeRefPtr) xmlMalloc(sizeof(xmlXIncludeRef)); + if (ret == NULL) { + xmlXIncludeErrMemory(ctxt, ref, "growing XInclude context"); + return(NULL); + } + memset(ret, 0, sizeof(xmlXIncludeRef)); + if (URI == NULL) + ret->URI = NULL; + else + ret->URI = xmlStrdup(URI); + ret->fragment = NULL; + ret->ref = ref; + ret->doc = NULL; + ret->count = 0; + ret->xml = 0; + ret->inc = NULL; + if (ctxt->incMax == 0) { + ctxt->incMax = 4; + ctxt->incTab = (xmlXIncludeRefPtr *) xmlMalloc(ctxt->incMax * + sizeof(ctxt->incTab[0])); + if (ctxt->incTab == NULL) { + xmlXIncludeErrMemory(ctxt, ref, "growing XInclude context"); + xmlXIncludeFreeRef(ret); + return(NULL); + } + } + if (ctxt->incNr >= ctxt->incMax) { + ctxt->incMax *= 2; + ctxt->incTab = (xmlXIncludeRefPtr *) xmlRealloc(ctxt->incTab, + ctxt->incMax * sizeof(ctxt->incTab[0])); + if (ctxt->incTab == NULL) { + xmlXIncludeErrMemory(ctxt, ref, "growing XInclude context"); + xmlXIncludeFreeRef(ret); + return(NULL); + } + } + ctxt->incTab[ctxt->incNr++] = ret; + return(ret); +} + +/** + * xmlXIncludeNewContext: + * @doc: an XML Document + * + * Creates a new XInclude context + * + * Returns the new set + */ +xmlXIncludeCtxtPtr +xmlXIncludeNewContext(xmlDocPtr doc) { + xmlXIncludeCtxtPtr ret; + +#ifdef DEBUG_XINCLUDE + xmlGenericError(xmlGenericErrorContext, "New context\n"); +#endif + if (doc == NULL) + return(NULL); + ret = (xmlXIncludeCtxtPtr) xmlMalloc(sizeof(xmlXIncludeCtxt)); + if (ret == NULL) { + xmlXIncludeErrMemory(NULL, (xmlNodePtr) doc, + "creating XInclude context"); + return(NULL); + } + memset(ret, 0, sizeof(xmlXIncludeCtxt)); + ret->doc = doc; + ret->incNr = 0; + ret->incBase = 0; + ret->incMax = 0; + ret->incTab = NULL; + ret->nbErrors = 0; + return(ret); +} + +/** + * xmlXIncludeURLPush: + * @ctxt: the parser context + * @value: the url + * + * Pushes a new url on top of the url stack + * + * Returns -1 in case of error, the index in the stack otherwise + */ +static int +xmlXIncludeURLPush(xmlXIncludeCtxtPtr ctxt, + const xmlChar *value) +{ + if (ctxt->urlNr > XINCLUDE_MAX_DEPTH) { + xmlXIncludeErr(ctxt, NULL, XML_XINCLUDE_RECURSION, + "detected a recursion in %s\n", value); + return(-1); + } + if (ctxt->urlTab == NULL) { + ctxt->urlMax = 4; + ctxt->urlNr = 0; + ctxt->urlTab = (xmlChar * *) xmlMalloc( + ctxt->urlMax * sizeof(ctxt->urlTab[0])); + if (ctxt->urlTab == NULL) { + xmlXIncludeErrMemory(ctxt, NULL, "adding URL"); + return (-1); + } + } + if (ctxt->urlNr >= ctxt->urlMax) { + ctxt->urlMax *= 2; + ctxt->urlTab = + (xmlChar * *) xmlRealloc(ctxt->urlTab, + ctxt->urlMax * + sizeof(ctxt->urlTab[0])); + if (ctxt->urlTab == NULL) { + xmlXIncludeErrMemory(ctxt, NULL, "adding URL"); + return (-1); + } + } + ctxt->url = ctxt->urlTab[ctxt->urlNr] = xmlStrdup(value); + return (ctxt->urlNr++); +} + +/** + * xmlXIncludeURLPop: + * @ctxt: the parser context + * + * Pops the top URL from the URL stack + */ +static void +xmlXIncludeURLPop(xmlXIncludeCtxtPtr ctxt) +{ + xmlChar * ret; + + if (ctxt->urlNr <= 0) + return; + ctxt->urlNr--; + if (ctxt->urlNr > 0) + ctxt->url = ctxt->urlTab[ctxt->urlNr - 1]; + else + ctxt->url = NULL; + ret = ctxt->urlTab[ctxt->urlNr]; + ctxt->urlTab[ctxt->urlNr] = NULL; + if (ret != NULL) + xmlFree(ret); +} + +/** + * xmlXIncludeFreeContext: + * @ctxt: the XInclude context + * + * Free an XInclude context + */ +void +xmlXIncludeFreeContext(xmlXIncludeCtxtPtr ctxt) { + int i; + +#ifdef DEBUG_XINCLUDE + xmlGenericError(xmlGenericErrorContext, "Freeing context\n"); +#endif + if (ctxt == NULL) + return; + while (ctxt->urlNr > 0) + xmlXIncludeURLPop(ctxt); + if (ctxt->urlTab != NULL) + xmlFree(ctxt->urlTab); + for (i = 0;i < ctxt->incNr;i++) { + if (ctxt->incTab[i] != NULL) + xmlXIncludeFreeRef(ctxt->incTab[i]); + } + if (ctxt->txturlTab != NULL) { + for (i = 0;i < ctxt->txtNr;i++) { + if (ctxt->txturlTab[i] != NULL) + xmlFree(ctxt->txturlTab[i]); + } + } + if (ctxt->incTab != NULL) + xmlFree(ctxt->incTab); + if (ctxt->txtTab != NULL) + xmlFree(ctxt->txtTab); + if (ctxt->txturlTab != NULL) + xmlFree(ctxt->txturlTab); + if (ctxt->base != NULL) { + xmlFree(ctxt->base); + } + xmlFree(ctxt); +} + +/** + * xmlXIncludeParseFile: + * @ctxt: the XInclude context + * @URL: the URL or file path + * + * parse a document for XInclude + */ +static xmlDocPtr +xmlXIncludeParseFile(xmlXIncludeCtxtPtr ctxt, const char *URL) { + xmlDocPtr ret; + xmlParserCtxtPtr pctxt; + xmlParserInputPtr inputStream; + + xmlInitParser(); + + pctxt = xmlNewParserCtxt(); + if (pctxt == NULL) { + xmlXIncludeErrMemory(ctxt, NULL, "cannot allocate parser context"); + return(NULL); + } + + /* + * pass in the application data to the parser context. + */ + pctxt->_private = ctxt->_private; + + /* + * try to ensure that new documents included are actually + * built with the same dictionary as the including document. + */ + if ((ctxt->doc != NULL) && (ctxt->doc->dict != NULL)) { + if (pctxt->dict != NULL) + xmlDictFree(pctxt->dict); + pctxt->dict = ctxt->doc->dict; + xmlDictReference(pctxt->dict); + } + + xmlCtxtUseOptions(pctxt, ctxt->parseFlags | XML_PARSE_DTDLOAD); + + inputStream = xmlLoadExternalEntity(URL, NULL, pctxt); + if (inputStream == NULL) { + xmlFreeParserCtxt(pctxt); + return(NULL); + } + + inputPush(pctxt, inputStream); + + if (pctxt->directory == NULL) + pctxt->directory = xmlParserGetDirectory(URL); + + pctxt->loadsubset |= XML_DETECT_IDS; + + xmlParseDocument(pctxt); + + if (pctxt->wellFormed) { + ret = pctxt->myDoc; + } + else { + ret = NULL; + if (pctxt->myDoc != NULL) + xmlFreeDoc(pctxt->myDoc); + pctxt->myDoc = NULL; + } + xmlFreeParserCtxt(pctxt); + + return(ret); +} + +/** + * xmlXIncludeAddNode: + * @ctxt: the XInclude context + * @cur: the new node + * + * Add a new node to process to an XInclude context + */ +static int +xmlXIncludeAddNode(xmlXIncludeCtxtPtr ctxt, xmlNodePtr cur) { + xmlXIncludeRefPtr ref; + xmlURIPtr uri; + xmlChar *URL; + xmlChar *fragment = NULL; + xmlChar *href; + xmlChar *parse; + xmlChar *base; + xmlChar *URI; + int xml = 1, i; /* default Issue 64 */ + int local = 0; + + + if (ctxt == NULL) + return(-1); + if (cur == NULL) + return(-1); + +#ifdef DEBUG_XINCLUDE + xmlGenericError(xmlGenericErrorContext, "Add node\n"); +#endif + /* + * read the attributes + */ + href = xmlXIncludeGetProp(ctxt, cur, XINCLUDE_HREF); + if (href == NULL) { + href = xmlStrdup(BAD_CAST ""); /* @@@@ href is now optional */ + if (href == NULL) + return(-1); + } + if ((href[0] == '#') || (href[0] == 0)) + local = 1; + parse = xmlXIncludeGetProp(ctxt, cur, XINCLUDE_PARSE); + if (parse != NULL) { + if (xmlStrEqual(parse, XINCLUDE_PARSE_XML)) + xml = 1; + else if (xmlStrEqual(parse, XINCLUDE_PARSE_TEXT)) + xml = 0; + else { + xmlXIncludeErr(ctxt, cur, XML_XINCLUDE_PARSE_VALUE, + "invalid value %s for 'parse'\n", parse); + if (href != NULL) + xmlFree(href); + if (parse != NULL) + xmlFree(parse); + return(-1); + } + } + + /* + * compute the URI + */ + base = xmlNodeGetBase(ctxt->doc, cur); + if (base == NULL) { + URI = xmlBuildURI(href, ctxt->doc->URL); + } else { + URI = xmlBuildURI(href, base); + } + if (URI == NULL) { + xmlChar *escbase; + xmlChar *eschref; + /* + * Some escaping may be needed + */ + escbase = xmlURIEscape(base); + eschref = xmlURIEscape(href); + URI = xmlBuildURI(eschref, escbase); + if (escbase != NULL) + xmlFree(escbase); + if (eschref != NULL) + xmlFree(eschref); + } + if (parse != NULL) + xmlFree(parse); + if (href != NULL) + xmlFree(href); + if (base != NULL) + xmlFree(base); + if (URI == NULL) { + xmlXIncludeErr(ctxt, cur, XML_XINCLUDE_HREF_URI, + "failed build URL\n", NULL); + return(-1); + } + fragment = xmlXIncludeGetProp(ctxt, cur, XINCLUDE_PARSE_XPOINTER); + + /* + * Check the URL and remove any fragment identifier + */ + uri = xmlParseURI((const char *)URI); + if (uri == NULL) { + xmlXIncludeErr(ctxt, cur, XML_XINCLUDE_HREF_URI, + "invalid value URI %s\n", URI); + if (fragment != NULL) + xmlFree(fragment); + xmlFree(URI); + return(-1); + } + + if (uri->fragment != NULL) { + if (ctxt->legacy != 0) { + if (fragment == NULL) { + fragment = (xmlChar *) uri->fragment; + } else { + xmlFree(uri->fragment); + } + } else { + xmlXIncludeErr(ctxt, cur, XML_XINCLUDE_FRAGMENT_ID, + "Invalid fragment identifier in URI %s use the xpointer attribute\n", + URI); + if (fragment != NULL) + xmlFree(fragment); + xmlFreeURI(uri); + xmlFree(URI); + return(-1); + } + uri->fragment = NULL; + } + URL = xmlSaveUri(uri); + xmlFreeURI(uri); + xmlFree(URI); + if (URL == NULL) { + xmlXIncludeErr(ctxt, cur, XML_XINCLUDE_HREF_URI, + "invalid value URI %s\n", URI); + if (fragment != NULL) + xmlFree(fragment); + return(-1); + } + + /* + * If local and xml then we need a fragment + */ + if ((local == 1) && (xml == 1) && + ((fragment == NULL) || (fragment[0] == 0))) { + xmlXIncludeErr(ctxt, cur, XML_XINCLUDE_RECURSION, + "detected a local recursion with no xpointer in %s\n", + URL); + if (fragment != NULL) + xmlFree(fragment); + return(-1); + } + + /* + * Check the URL against the stack for recursions + */ + if ((!local) && (xml == 1)) { + for (i = 0;i < ctxt->urlNr;i++) { + if (xmlStrEqual(URL, ctxt->urlTab[i])) { + xmlXIncludeErr(ctxt, cur, XML_XINCLUDE_RECURSION, + "detected a recursion in %s\n", URL); + return(-1); + } + } + } + + ref = xmlXIncludeNewRef(ctxt, URL, cur); + if (ref == NULL) { + return(-1); + } + ref->fragment = fragment; + ref->doc = NULL; + ref->xml = xml; + ref->count = 1; + xmlFree(URL); + return(0); +} + +/** + * xmlXIncludeRecurseDoc: + * @ctxt: the XInclude context + * @doc: the new document + * @url: the associated URL + * + * The XInclude recursive nature is handled at this point. + */ +static void +xmlXIncludeRecurseDoc(xmlXIncludeCtxtPtr ctxt, xmlDocPtr doc, + const xmlURL url ATTRIBUTE_UNUSED) { + xmlXIncludeCtxtPtr newctxt; + int i; + + /* + * Avoid recursion in already substitued resources + for (i = 0;i < ctxt->urlNr;i++) { + if (xmlStrEqual(doc->URL, ctxt->urlTab[i])) + return; + } + */ + +#ifdef DEBUG_XINCLUDE + xmlGenericError(xmlGenericErrorContext, "Recursing in doc %s\n", doc->URL); +#endif + /* + * Handle recursion here. + */ + + newctxt = xmlXIncludeNewContext(doc); + if (newctxt != NULL) { + /* + * Copy the private user data + */ + newctxt->_private = ctxt->_private; + /* + * Copy the existing document set + */ + newctxt->incMax = ctxt->incMax; + newctxt->incNr = ctxt->incNr; + newctxt->incTab = (xmlXIncludeRefPtr *) xmlMalloc(newctxt->incMax * + sizeof(newctxt->incTab[0])); + if (newctxt->incTab == NULL) { + xmlXIncludeErrMemory(ctxt, (xmlNodePtr) doc, "processing doc"); + xmlFree(newctxt); + return; + } + /* + * copy the urlTab + */ + newctxt->urlMax = ctxt->urlMax; + newctxt->urlNr = ctxt->urlNr; + newctxt->urlTab = ctxt->urlTab; + + /* + * Inherit the existing base + */ + newctxt->base = xmlStrdup(ctxt->base); + + /* + * Inherit the documents already in use by other includes + */ + newctxt->incBase = ctxt->incNr; + for (i = 0;i < ctxt->incNr;i++) { + newctxt->incTab[i] = ctxt->incTab[i]; + newctxt->incTab[i]->count++; /* prevent the recursion from + freeing it */ + } + /* + * The new context should also inherit the Parse Flags + * (bug 132597) + */ + newctxt->parseFlags = ctxt->parseFlags; + xmlXIncludeDoProcess(newctxt, doc, xmlDocGetRootElement(doc)); + for (i = 0;i < ctxt->incNr;i++) { + newctxt->incTab[i]->count--; + newctxt->incTab[i] = NULL; + } + + /* urlTab may have been reallocated */ + ctxt->urlTab = newctxt->urlTab; + ctxt->urlMax = newctxt->urlMax; + + newctxt->urlMax = 0; + newctxt->urlNr = 0; + newctxt->urlTab = NULL; + + xmlXIncludeFreeContext(newctxt); + } +#ifdef DEBUG_XINCLUDE + xmlGenericError(xmlGenericErrorContext, "Done recursing in doc %s\n", url); +#endif +} + +/** + * xmlXIncludeAddTxt: + * @ctxt: the XInclude context + * @txt: the new text node + * @url: the associated URL + * + * Add a new txtument to the list + */ +static void +xmlXIncludeAddTxt(xmlXIncludeCtxtPtr ctxt, xmlNodePtr txt, const xmlURL url) { +#ifdef DEBUG_XINCLUDE + xmlGenericError(xmlGenericErrorContext, "Adding text %s\n", url); +#endif + if (ctxt->txtMax == 0) { + ctxt->txtMax = 4; + ctxt->txtTab = (xmlNodePtr *) xmlMalloc(ctxt->txtMax * + sizeof(ctxt->txtTab[0])); + if (ctxt->txtTab == NULL) { + xmlXIncludeErrMemory(ctxt, NULL, "processing text"); + return; + } + ctxt->txturlTab = (xmlURL *) xmlMalloc(ctxt->txtMax * + sizeof(ctxt->txturlTab[0])); + if (ctxt->txturlTab == NULL) { + xmlXIncludeErrMemory(ctxt, NULL, "processing text"); + return; + } + } + if (ctxt->txtNr >= ctxt->txtMax) { + ctxt->txtMax *= 2; + ctxt->txtTab = (xmlNodePtr *) xmlRealloc(ctxt->txtTab, + ctxt->txtMax * sizeof(ctxt->txtTab[0])); + if (ctxt->txtTab == NULL) { + xmlXIncludeErrMemory(ctxt, NULL, "processing text"); + return; + } + ctxt->txturlTab = (xmlURL *) xmlRealloc(ctxt->txturlTab, + ctxt->txtMax * sizeof(ctxt->txturlTab[0])); + if (ctxt->txturlTab == NULL) { + xmlXIncludeErrMemory(ctxt, NULL, "processing text"); + return; + } + } + ctxt->txtTab[ctxt->txtNr] = txt; + ctxt->txturlTab[ctxt->txtNr] = xmlStrdup(url); + ctxt->txtNr++; +} + +/************************************************************************ + * * + * Node copy with specific semantic * + * * + ************************************************************************/ + +static xmlNodePtr +xmlXIncludeCopyNodeList(xmlXIncludeCtxtPtr ctxt, xmlDocPtr target, + xmlDocPtr source, xmlNodePtr elem); + +/** + * xmlXIncludeCopyNode: + * @ctxt: the XInclude context + * @target: the document target + * @source: the document source + * @elem: the element + * + * Make a copy of the node while preserving the XInclude semantic + * of the Infoset copy + */ +static xmlNodePtr +xmlXIncludeCopyNode(xmlXIncludeCtxtPtr ctxt, xmlDocPtr target, + xmlDocPtr source, xmlNodePtr elem) { + xmlNodePtr result = NULL; + + if ((ctxt == NULL) || (target == NULL) || (source == NULL) || + (elem == NULL)) + return(NULL); + if (elem->type == XML_DTD_NODE) + return(NULL); + if (elem->type == XML_DOCUMENT_NODE) + result = xmlXIncludeCopyNodeList(ctxt, target, source, elem->children); + else + result = xmlDocCopyNode(elem, target, 1); + return(result); +} + +/** + * xmlXIncludeCopyNodeList: + * @ctxt: the XInclude context + * @target: the document target + * @source: the document source + * @elem: the element list + * + * Make a copy of the node list while preserving the XInclude semantic + * of the Infoset copy + */ +static xmlNodePtr +xmlXIncludeCopyNodeList(xmlXIncludeCtxtPtr ctxt, xmlDocPtr target, + xmlDocPtr source, xmlNodePtr elem) { + xmlNodePtr cur, res, result = NULL, last = NULL; + + if ((ctxt == NULL) || (target == NULL) || (source == NULL) || + (elem == NULL)) + return(NULL); + cur = elem; + while (cur != NULL) { + res = xmlXIncludeCopyNode(ctxt, target, source, cur); + if (res != NULL) { + if (result == NULL) { + result = last = res; + } else { + last->next = res; + res->prev = last; + last = res; + } + } + cur = cur->next; + } + return(result); +} + +/** + * xmlXIncludeGetNthChild: + * @cur: the node + * @no: the child number + * + * Returns the @n'th element child of @cur or NULL + */ +static xmlNodePtr +xmlXIncludeGetNthChild(xmlNodePtr cur, int no) { + int i; + if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL)) + return(NULL); + cur = cur->children; + for (i = 0;i <= no;cur = cur->next) { + if (cur == NULL) + return(cur); + if ((cur->type == XML_ELEMENT_NODE) || + (cur->type == XML_DOCUMENT_NODE) || + (cur->type == XML_HTML_DOCUMENT_NODE)) { + i++; + if (i == no) + break; + } + } + return(cur); +} + +xmlNodePtr xmlXPtrAdvanceNode(xmlNodePtr cur, int *level); /* in xpointer.c */ +/** + * xmlXIncludeCopyRange: + * @ctxt: the XInclude context + * @target: the document target + * @source: the document source + * @obj: the XPointer result from the evaluation. + * + * Build a node list tree copy of the XPointer result. + * + * Returns an xmlNodePtr list or NULL. + * The caller has to free the node tree. + */ +static xmlNodePtr +xmlXIncludeCopyRange(xmlXIncludeCtxtPtr ctxt, xmlDocPtr target, + xmlDocPtr source, xmlXPathObjectPtr range) { + /* pointers to generated nodes */ + xmlNodePtr list = NULL, last = NULL, listParent = NULL; + xmlNodePtr tmp, tmp2; + /* pointers to traversal nodes */ + xmlNodePtr start, cur, end; + int index1, index2; + int level = 0, lastLevel = 0, endLevel = 0, endFlag = 0; + + if ((ctxt == NULL) || (target == NULL) || (source == NULL) || + (range == NULL)) + return(NULL); + if (range->type != XPATH_RANGE) + return(NULL); + start = (xmlNodePtr) range->user; + + if ((start == NULL) || (start->type == XML_NAMESPACE_DECL)) + return(NULL); + end = range->user2; + if (end == NULL) + return(xmlDocCopyNode(start, target, 1)); + if (end->type == XML_NAMESPACE_DECL) + return(NULL); + + cur = start; + index1 = range->index; + index2 = range->index2; + /* + * level is depth of the current node under consideration + * list is the pointer to the root of the output tree + * listParent is a pointer to the parent of output tree (within + the included file) in case we need to add another level + * last is a pointer to the last node added to the output tree + * lastLevel is the depth of last (relative to the root) + */ + while (cur != NULL) { + /* + * Check if our output tree needs a parent + */ + if (level < 0) { + while (level < 0) { + /* copy must include namespaces and properties */ + tmp2 = xmlDocCopyNode(listParent, target, 2); + xmlAddChild(tmp2, list); + list = tmp2; + listParent = listParent->parent; + level++; + } + last = list; + lastLevel = 0; + } + /* + * Check whether we need to change our insertion point + */ + while (level < lastLevel) { + last = last->parent; + lastLevel --; + } + if (cur == end) { /* Are we at the end of the range? */ + if (cur->type == XML_TEXT_NODE) { + const xmlChar *content = cur->content; + int len; + + if (content == NULL) { + tmp = xmlNewTextLen(NULL, 0); + } else { + len = index2; + if ((cur == start) && (index1 > 1)) { + content += (index1 - 1); + len -= (index1 - 1); + } else { + len = index2; + } + tmp = xmlNewTextLen(content, len); + } + /* single sub text node selection */ + if (list == NULL) + return(tmp); + /* prune and return full set */ + if (level == lastLevel) + xmlAddNextSibling(last, tmp); + else + xmlAddChild(last, tmp); + return(list); + } else { /* ending node not a text node */ + endLevel = level; /* remember the level of the end node */ + endFlag = 1; + /* last node - need to take care of properties + namespaces */ + tmp = xmlDocCopyNode(cur, target, 2); + if (list == NULL) { + list = tmp; + listParent = cur->parent; + } else { + if (level == lastLevel) + xmlAddNextSibling(last, tmp); + else { + xmlAddChild(last, tmp); + lastLevel = level; + } + } + last = tmp; + + if (index2 > 1) { + end = xmlXIncludeGetNthChild(cur, index2 - 1); + index2 = 0; + } + if ((cur == start) && (index1 > 1)) { + cur = xmlXIncludeGetNthChild(cur, index1 - 1); + index1 = 0; + } else { + cur = cur->children; + } + level++; /* increment level to show change */ + /* + * Now gather the remaining nodes from cur to end + */ + continue; /* while */ + } + } else if (cur == start) { /* Not at the end, are we at start? */ + if ((cur->type == XML_TEXT_NODE) || + (cur->type == XML_CDATA_SECTION_NODE)) { + const xmlChar *content = cur->content; + + if (content == NULL) { + tmp = xmlNewTextLen(NULL, 0); + } else { + if (index1 > 1) { + content += (index1 - 1); + index1 = 0; + } + tmp = xmlNewText(content); + } + last = list = tmp; + listParent = cur->parent; + } else { /* Not text node */ + /* + * start of the range - need to take care of + * properties and namespaces + */ + tmp = xmlDocCopyNode(cur, target, 2); + list = last = tmp; + listParent = cur->parent; + if (index1 > 1) { /* Do we need to position? */ + cur = xmlXIncludeGetNthChild(cur, index1 - 1); + level = lastLevel = 1; + index1 = 0; + /* + * Now gather the remaining nodes from cur to end + */ + continue; /* while */ + } + } + } else { + tmp = NULL; + switch (cur->type) { + case XML_DTD_NODE: + case XML_ELEMENT_DECL: + case XML_ATTRIBUTE_DECL: + case XML_ENTITY_NODE: + /* Do not copy DTD informations */ + break; + case XML_ENTITY_DECL: + /* handle crossing entities -> stack needed */ + break; + case XML_XINCLUDE_START: + case XML_XINCLUDE_END: + /* don't consider it part of the tree content */ + break; + case XML_ATTRIBUTE_NODE: + /* Humm, should not happen ! */ + break; + default: + /* + * Middle of the range - need to take care of + * properties and namespaces + */ + tmp = xmlDocCopyNode(cur, target, 2); + break; + } + if (tmp != NULL) { + if (level == lastLevel) + xmlAddNextSibling(last, tmp); + else { + xmlAddChild(last, tmp); + lastLevel = level; + } + last = tmp; + } + } + /* + * Skip to next node in document order + */ + cur = xmlXPtrAdvanceNode(cur, &level); + if (endFlag && (level >= endLevel)) + break; + } + return(list); +} + +/** + * xmlXIncludeBuildNodeList: + * @ctxt: the XInclude context + * @target: the document target + * @source: the document source + * @obj: the XPointer result from the evaluation. + * + * Build a node list tree copy of the XPointer result. + * This will drop Attributes and Namespace declarations. + * + * Returns an xmlNodePtr list or NULL. + * the caller has to free the node tree. + */ +static xmlNodePtr +xmlXIncludeCopyXPointer(xmlXIncludeCtxtPtr ctxt, xmlDocPtr target, + xmlDocPtr source, xmlXPathObjectPtr obj) { + xmlNodePtr list = NULL, last = NULL; + int i; + + if (source == NULL) + source = ctxt->doc; + if ((ctxt == NULL) || (target == NULL) || (source == NULL) || + (obj == NULL)) + return(NULL); + switch (obj->type) { + case XPATH_NODESET: { + xmlNodeSetPtr set = obj->nodesetval; + if (set == NULL) + return(NULL); + for (i = 0;i < set->nodeNr;i++) { + if (set->nodeTab[i] == NULL) + continue; + switch (set->nodeTab[i]->type) { + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + case XML_ELEMENT_NODE: + case XML_ENTITY_REF_NODE: + case XML_ENTITY_NODE: + case XML_PI_NODE: + case XML_COMMENT_NODE: + case XML_DOCUMENT_NODE: + case XML_HTML_DOCUMENT_NODE: +#ifdef LIBXML_DOCB_ENABLED + case XML_DOCB_DOCUMENT_NODE: +#endif + case XML_XINCLUDE_END: + break; + case XML_XINCLUDE_START: { + xmlNodePtr tmp, cur = set->nodeTab[i]; + + cur = cur->next; + while (cur != NULL) { + switch(cur->type) { + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + case XML_ELEMENT_NODE: + case XML_ENTITY_REF_NODE: + case XML_ENTITY_NODE: + case XML_PI_NODE: + case XML_COMMENT_NODE: + tmp = xmlXIncludeCopyNode(ctxt, target, + source, cur); + if (last == NULL) { + list = last = tmp; + } else { + xmlAddNextSibling(last, tmp); + last = tmp; + } + cur = cur->next; + continue; + default: + break; + } + break; + } + continue; + } + case XML_ATTRIBUTE_NODE: + case XML_NAMESPACE_DECL: + case XML_DOCUMENT_TYPE_NODE: + case XML_DOCUMENT_FRAG_NODE: + case XML_NOTATION_NODE: + case XML_DTD_NODE: + case XML_ELEMENT_DECL: + case XML_ATTRIBUTE_DECL: + case XML_ENTITY_DECL: + continue; /* for */ + } + if (last == NULL) + list = last = xmlXIncludeCopyNode(ctxt, target, source, + set->nodeTab[i]); + else { + xmlAddNextSibling(last, + xmlXIncludeCopyNode(ctxt, target, source, + set->nodeTab[i])); + if (last->next != NULL) + last = last->next; + } + } + break; + } + case XPATH_LOCATIONSET: { + xmlLocationSetPtr set = (xmlLocationSetPtr) obj->user; + if (set == NULL) + return(NULL); + for (i = 0;i < set->locNr;i++) { + if (last == NULL) + list = last = xmlXIncludeCopyXPointer(ctxt, target, source, + set->locTab[i]); + else + xmlAddNextSibling(last, + xmlXIncludeCopyXPointer(ctxt, target, source, + set->locTab[i])); + if (last != NULL) { + while (last->next != NULL) + last = last->next; + } + } + break; + } +#ifdef LIBXML_XPTR_ENABLED + case XPATH_RANGE: + return(xmlXIncludeCopyRange(ctxt, target, source, obj)); +#endif + case XPATH_POINT: + /* points are ignored in XInclude */ + break; + default: + break; + } + return(list); +} +/************************************************************************ + * * + * XInclude I/O handling * + * * + ************************************************************************/ + +typedef struct _xmlXIncludeMergeData xmlXIncludeMergeData; +typedef xmlXIncludeMergeData *xmlXIncludeMergeDataPtr; +struct _xmlXIncludeMergeData { + xmlDocPtr doc; + xmlXIncludeCtxtPtr ctxt; +}; + +/** + * xmlXIncludeMergeOneEntity: + * @ent: the entity + * @doc: the including doc + * @nr: the entity name + * + * Inplements the merge of one entity + */ +static void +xmlXIncludeMergeEntity(xmlEntityPtr ent, xmlXIncludeMergeDataPtr data, + xmlChar *name ATTRIBUTE_UNUSED) { + xmlEntityPtr ret, prev; + xmlDocPtr doc; + xmlXIncludeCtxtPtr ctxt; + + if ((ent == NULL) || (data == NULL)) + return; + ctxt = data->ctxt; + doc = data->doc; + if ((ctxt == NULL) || (doc == NULL)) + return; + switch (ent->etype) { + case XML_INTERNAL_PARAMETER_ENTITY: + case XML_EXTERNAL_PARAMETER_ENTITY: + case XML_INTERNAL_PREDEFINED_ENTITY: + return; + case XML_INTERNAL_GENERAL_ENTITY: + case XML_EXTERNAL_GENERAL_PARSED_ENTITY: + case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: + break; + } + ret = xmlAddDocEntity(doc, ent->name, ent->etype, ent->ExternalID, + ent->SystemID, ent->content); + if (ret != NULL) { + if (ent->URI != NULL) + ret->URI = xmlStrdup(ent->URI); + } else { + prev = xmlGetDocEntity(doc, ent->name); + if (prev != NULL) { + if (ent->etype != prev->etype) + goto error; + + if ((ent->SystemID != NULL) && (prev->SystemID != NULL)) { + if (!xmlStrEqual(ent->SystemID, prev->SystemID)) + goto error; + } else if ((ent->ExternalID != NULL) && + (prev->ExternalID != NULL)) { + if (!xmlStrEqual(ent->ExternalID, prev->ExternalID)) + goto error; + } else if ((ent->content != NULL) && (prev->content != NULL)) { + if (!xmlStrEqual(ent->content, prev->content)) + goto error; + } else { + goto error; + } + + } + } + return; +error: + switch (ent->etype) { + case XML_INTERNAL_PARAMETER_ENTITY: + case XML_EXTERNAL_PARAMETER_ENTITY: + case XML_INTERNAL_PREDEFINED_ENTITY: + case XML_INTERNAL_GENERAL_ENTITY: + case XML_EXTERNAL_GENERAL_PARSED_ENTITY: + return; + case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: + break; + } + xmlXIncludeErr(ctxt, (xmlNodePtr) ent, XML_XINCLUDE_ENTITY_DEF_MISMATCH, + "mismatch in redefinition of entity %s\n", + ent->name); +} + +/** + * xmlXIncludeMergeEntities: + * @ctxt: an XInclude context + * @doc: the including doc + * @from: the included doc + * + * Inplements the entity merge + * + * Returns 0 if merge succeeded, -1 if some processing failed + */ +static int +xmlXIncludeMergeEntities(xmlXIncludeCtxtPtr ctxt, xmlDocPtr doc, + xmlDocPtr from) { + xmlNodePtr cur; + xmlDtdPtr target, source; + + if (ctxt == NULL) + return(-1); + + if ((from == NULL) || (from->intSubset == NULL)) + return(0); + + target = doc->intSubset; + if (target == NULL) { + cur = xmlDocGetRootElement(doc); + if (cur == NULL) + return(-1); + target = xmlCreateIntSubset(doc, cur->name, NULL, NULL); + if (target == NULL) + return(-1); + } + + source = from->intSubset; + if ((source != NULL) && (source->entities != NULL)) { + xmlXIncludeMergeData data; + + data.ctxt = ctxt; + data.doc = doc; + + xmlHashScan((xmlHashTablePtr) source->entities, + (xmlHashScanner) xmlXIncludeMergeEntity, &data); + } + source = from->extSubset; + if ((source != NULL) && (source->entities != NULL)) { + xmlXIncludeMergeData data; + + data.ctxt = ctxt; + data.doc = doc; + + /* + * don't duplicate existing stuff when external subsets are the same + */ + if ((!xmlStrEqual(target->ExternalID, source->ExternalID)) && + (!xmlStrEqual(target->SystemID, source->SystemID))) { + xmlHashScan((xmlHashTablePtr) source->entities, + (xmlHashScanner) xmlXIncludeMergeEntity, &data); + } + } + return(0); +} + +/** + * xmlXIncludeLoadDoc: + * @ctxt: the XInclude context + * @url: the associated URL + * @nr: the xinclude node number + * + * Load the document, and store the result in the XInclude context + * + * Returns 0 in case of success, -1 in case of failure + */ +static int +xmlXIncludeLoadDoc(xmlXIncludeCtxtPtr ctxt, const xmlChar *url, int nr) { + xmlDocPtr doc; + xmlURIPtr uri; + xmlChar *URL; + xmlChar *fragment = NULL; + int i = 0; +#ifdef LIBXML_XPTR_ENABLED + int saveFlags; +#endif + +#ifdef DEBUG_XINCLUDE + xmlGenericError(xmlGenericErrorContext, "Loading doc %s:%d\n", url, nr); +#endif + /* + * Check the URL and remove any fragment identifier + */ + uri = xmlParseURI((const char *)url); + if (uri == NULL) { + xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, + XML_XINCLUDE_HREF_URI, + "invalid value URI %s\n", url); + return(-1); + } + if (uri->fragment != NULL) { + fragment = (xmlChar *) uri->fragment; + uri->fragment = NULL; + } + if ((ctxt->incTab != NULL) && (ctxt->incTab[nr] != NULL) && + (ctxt->incTab[nr]->fragment != NULL)) { + if (fragment != NULL) xmlFree(fragment); + fragment = xmlStrdup(ctxt->incTab[nr]->fragment); + } + URL = xmlSaveUri(uri); + xmlFreeURI(uri); + if (URL == NULL) { + if (ctxt->incTab != NULL) + xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, + XML_XINCLUDE_HREF_URI, + "invalid value URI %s\n", url); + else + xmlXIncludeErr(ctxt, NULL, + XML_XINCLUDE_HREF_URI, + "invalid value URI %s\n", url); + if (fragment != NULL) + xmlFree(fragment); + return(-1); + } + + /* + * Handling of references to the local document are done + * directly through ctxt->doc. + */ + if ((URL[0] == 0) || (URL[0] == '#') || + ((ctxt->doc != NULL) && (xmlStrEqual(URL, ctxt->doc->URL)))) { + doc = NULL; + goto loaded; + } + + /* + * Prevent reloading twice the document. + */ + for (i = 0; i < ctxt->incNr; i++) { + if ((xmlStrEqual(URL, ctxt->incTab[i]->URI)) && + (ctxt->incTab[i]->doc != NULL)) { + doc = ctxt->incTab[i]->doc; +#ifdef DEBUG_XINCLUDE + printf("Already loaded %s\n", URL); +#endif + goto loaded; + } + } + + /* + * Load it. + */ +#ifdef DEBUG_XINCLUDE + printf("loading %s\n", URL); +#endif +#ifdef LIBXML_XPTR_ENABLED + /* + * If this is an XPointer evaluation, we want to assure that + * all entities have been resolved prior to processing the + * referenced document + */ + saveFlags = ctxt->parseFlags; + if (fragment != NULL) { /* if this is an XPointer eval */ + ctxt->parseFlags |= XML_PARSE_NOENT; + } +#endif + + doc = xmlXIncludeParseFile(ctxt, (const char *)URL); +#ifdef LIBXML_XPTR_ENABLED + ctxt->parseFlags = saveFlags; +#endif + if (doc == NULL) { + xmlFree(URL); + if (fragment != NULL) + xmlFree(fragment); + return(-1); + } + ctxt->incTab[nr]->doc = doc; + /* + * It's possible that the requested URL has been mapped to a + * completely different location (e.g. through a catalog entry). + * To check for this, we compare the URL with that of the doc + * and change it if they disagree (bug 146988). + */ + if (!xmlStrEqual(URL, doc->URL)) { + xmlFree(URL); + URL = xmlStrdup(doc->URL); + } + for (i = nr + 1; i < ctxt->incNr; i++) { + if (xmlStrEqual(URL, ctxt->incTab[i]->URI)) { + ctxt->incTab[nr]->count++; +#ifdef DEBUG_XINCLUDE + printf("Increasing %s count since reused\n", URL); +#endif + break; + } + } + + /* + * Make sure we have all entities fixed up + */ + xmlXIncludeMergeEntities(ctxt, ctxt->doc, doc); + + /* + * We don't need the DTD anymore, free up space + if (doc->intSubset != NULL) { + xmlUnlinkNode((xmlNodePtr) doc->intSubset); + xmlFreeNode((xmlNodePtr) doc->intSubset); + doc->intSubset = NULL; + } + if (doc->extSubset != NULL) { + xmlUnlinkNode((xmlNodePtr) doc->extSubset); + xmlFreeNode((xmlNodePtr) doc->extSubset); + doc->extSubset = NULL; + } + */ + xmlXIncludeRecurseDoc(ctxt, doc, URL); + +loaded: + if (fragment == NULL) { + /* + * Add the top children list as the replacement copy. + */ + if (doc == NULL) + { + /* Hopefully a DTD declaration won't be copied from + * the same document */ + ctxt->incTab[nr]->inc = xmlCopyNodeList(ctxt->doc->children); + } else { + ctxt->incTab[nr]->inc = xmlXIncludeCopyNodeList(ctxt, ctxt->doc, + doc, doc->children); + } + } +#ifdef LIBXML_XPTR_ENABLED + else { + /* + * Computes the XPointer expression and make a copy used + * as the replacement copy. + */ + xmlXPathObjectPtr xptr; + xmlXPathContextPtr xptrctxt; + xmlNodeSetPtr set; + + if (doc == NULL) { + xptrctxt = xmlXPtrNewContext(ctxt->doc, ctxt->incTab[nr]->ref, + NULL); + } else { + xptrctxt = xmlXPtrNewContext(doc, NULL, NULL); + } + if (xptrctxt == NULL) { + xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, + XML_XINCLUDE_XPTR_FAILED, + "could not create XPointer context\n", NULL); + xmlFree(URL); + xmlFree(fragment); + return(-1); + } + xptr = xmlXPtrEval(fragment, xptrctxt); + if (xptr == NULL) { + xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, + XML_XINCLUDE_XPTR_FAILED, + "XPointer evaluation failed: #%s\n", + fragment); + xmlXPathFreeContext(xptrctxt); + xmlFree(URL); + xmlFree(fragment); + return(-1); + } + switch (xptr->type) { + case XPATH_UNDEFINED: + case XPATH_BOOLEAN: + case XPATH_NUMBER: + case XPATH_STRING: + case XPATH_POINT: + case XPATH_USERS: + case XPATH_XSLT_TREE: + xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, + XML_XINCLUDE_XPTR_RESULT, + "XPointer is not a range: #%s\n", + fragment); + xmlXPathFreeContext(xptrctxt); + xmlFree(URL); + xmlFree(fragment); + return(-1); + case XPATH_NODESET: + if ((xptr->nodesetval == NULL) || + (xptr->nodesetval->nodeNr <= 0)) { + xmlXPathFreeContext(xptrctxt); + xmlFree(URL); + xmlFree(fragment); + return(-1); + } + + case XPATH_RANGE: + case XPATH_LOCATIONSET: + break; + } + set = xptr->nodesetval; + if (set != NULL) { + for (i = 0;i < set->nodeNr;i++) { + if (set->nodeTab[i] == NULL) + continue; + switch (set->nodeTab[i]->type) { + case XML_ELEMENT_NODE: + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + case XML_ENTITY_REF_NODE: + case XML_ENTITY_NODE: + case XML_PI_NODE: + case XML_COMMENT_NODE: + case XML_DOCUMENT_NODE: + case XML_HTML_DOCUMENT_NODE: +#ifdef LIBXML_DOCB_ENABLED + case XML_DOCB_DOCUMENT_NODE: +#endif + continue; + + case XML_ATTRIBUTE_NODE: + xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, + XML_XINCLUDE_XPTR_RESULT, + "XPointer selects an attribute: #%s\n", + fragment); + set->nodeTab[i] = NULL; + continue; + case XML_NAMESPACE_DECL: + xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, + XML_XINCLUDE_XPTR_RESULT, + "XPointer selects a namespace: #%s\n", + fragment); + set->nodeTab[i] = NULL; + continue; + case XML_DOCUMENT_TYPE_NODE: + case XML_DOCUMENT_FRAG_NODE: + case XML_NOTATION_NODE: + case XML_DTD_NODE: + case XML_ELEMENT_DECL: + case XML_ATTRIBUTE_DECL: + case XML_ENTITY_DECL: + case XML_XINCLUDE_START: + case XML_XINCLUDE_END: + xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, + XML_XINCLUDE_XPTR_RESULT, + "XPointer selects unexpected nodes: #%s\n", + fragment); + set->nodeTab[i] = NULL; + set->nodeTab[i] = NULL; + continue; /* for */ + } + } + } + if (doc == NULL) { + ctxt->incTab[nr]->xptr = xptr; + ctxt->incTab[nr]->inc = NULL; + } else { + ctxt->incTab[nr]->inc = + xmlXIncludeCopyXPointer(ctxt, ctxt->doc, doc, xptr); + xmlXPathFreeObject(xptr); + } + xmlXPathFreeContext(xptrctxt); + xmlFree(fragment); + } +#endif + + /* + * Do the xml:base fixup if needed + */ + if ((doc != NULL) && (URL != NULL) && (xmlStrchr(URL, (xmlChar) '/')) && + (!(ctxt->parseFlags & XML_PARSE_NOBASEFIX)) && + (!(doc->parseFlags & XML_PARSE_NOBASEFIX))) { + xmlNodePtr node; + xmlChar *base; + xmlChar *curBase; + + /* + * The base is only adjusted if "necessary", i.e. if the xinclude node + * has a base specified, or the URL is relative + */ + base = xmlGetNsProp(ctxt->incTab[nr]->ref, BAD_CAST "base", + XML_XML_NAMESPACE); + if (base == NULL) { + /* + * No xml:base on the xinclude node, so we check whether the + * URI base is different than (relative to) the context base + */ + curBase = xmlBuildRelativeURI(URL, ctxt->base); + if (curBase == NULL) { /* Error return */ + xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, + XML_XINCLUDE_HREF_URI, + "trying to build relative URI from %s\n", URL); + } else { + /* If the URI doesn't contain a slash, it's not relative */ + if (!xmlStrchr(curBase, (xmlChar) '/')) + xmlFree(curBase); + else + base = curBase; + } + } + if (base != NULL) { /* Adjustment may be needed */ + node = ctxt->incTab[nr]->inc; + while (node != NULL) { + /* Only work on element nodes */ + if (node->type == XML_ELEMENT_NODE) { + curBase = xmlNodeGetBase(node->doc, node); + /* If no current base, set it */ + if (curBase == NULL) { + xmlNodeSetBase(node, base); + } else { + /* + * If the current base is the same as the + * URL of the document, then reset it to be + * the specified xml:base or the relative URI + */ + if (xmlStrEqual(curBase, node->doc->URL)) { + xmlNodeSetBase(node, base); + } else { + /* + * If the element already has an xml:base + * set, then relativise it if necessary + */ + xmlChar *xmlBase; + xmlBase = xmlGetNsProp(node, + BAD_CAST "base", + XML_XML_NAMESPACE); + if (xmlBase != NULL) { + xmlChar *relBase; + relBase = xmlBuildURI(xmlBase, base); + if (relBase == NULL) { /* error */ + xmlXIncludeErr(ctxt, + ctxt->incTab[nr]->ref, + XML_XINCLUDE_HREF_URI, + "trying to rebuild base from %s\n", + xmlBase); + } else { + xmlNodeSetBase(node, relBase); + xmlFree(relBase); + } + xmlFree(xmlBase); + } + } + xmlFree(curBase); + } + } + node = node->next; + } + xmlFree(base); + } + } + if ((nr < ctxt->incNr) && (ctxt->incTab[nr]->doc != NULL) && + (ctxt->incTab[nr]->count <= 1)) { +#ifdef DEBUG_XINCLUDE + printf("freeing %s\n", ctxt->incTab[nr]->doc->URL); +#endif + xmlFreeDoc(ctxt->incTab[nr]->doc); + ctxt->incTab[nr]->doc = NULL; + } + xmlFree(URL); + return(0); +} + +/** + * xmlXIncludeLoadTxt: + * @ctxt: the XInclude context + * @url: the associated URL + * @nr: the xinclude node number + * + * Load the content, and store the result in the XInclude context + * + * Returns 0 in case of success, -1 in case of failure + */ +static int +xmlXIncludeLoadTxt(xmlXIncludeCtxtPtr ctxt, const xmlChar *url, int nr) { + xmlParserInputBufferPtr buf; + xmlNodePtr node; + xmlURIPtr uri; + xmlChar *URL; + int i; + xmlChar *encoding = NULL; + xmlCharEncoding enc = (xmlCharEncoding) 0; + xmlParserCtxtPtr pctxt; + xmlParserInputPtr inputStream; + int xinclude_multibyte_fallback_used = 0; + + /* + * Check the URL and remove any fragment identifier + */ + uri = xmlParseURI((const char *)url); + if (uri == NULL) { + xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, XML_XINCLUDE_HREF_URI, + "invalid value URI %s\n", url); + return(-1); + } + if (uri->fragment != NULL) { + xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, XML_XINCLUDE_TEXT_FRAGMENT, + "fragment identifier forbidden for text: %s\n", + (const xmlChar *) uri->fragment); + xmlFreeURI(uri); + return(-1); + } + URL = xmlSaveUri(uri); + xmlFreeURI(uri); + if (URL == NULL) { + xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, XML_XINCLUDE_HREF_URI, + "invalid value URI %s\n", url); + return(-1); + } + + /* + * Handling of references to the local document are done + * directly through ctxt->doc. + */ + if (URL[0] == 0) { + xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, + XML_XINCLUDE_TEXT_DOCUMENT, + "text serialization of document not available\n", NULL); + xmlFree(URL); + return(-1); + } + + /* + * Prevent reloading twice the document. + */ + for (i = 0; i < ctxt->txtNr; i++) { + if (xmlStrEqual(URL, ctxt->txturlTab[i])) { + node = xmlCopyNode(ctxt->txtTab[i], 1); + goto loaded; + } + } + /* + * Try to get the encoding if available + */ + if ((ctxt->incTab[nr] != NULL) && (ctxt->incTab[nr]->ref != NULL)) { + encoding = xmlGetProp(ctxt->incTab[nr]->ref, XINCLUDE_PARSE_ENCODING); + } + if (encoding != NULL) { + /* + * TODO: we should not have to remap to the xmlCharEncoding + * predefined set, a better interface than + * xmlParserInputBufferCreateFilename should allow any + * encoding supported by iconv + */ + enc = xmlParseCharEncoding((const char *) encoding); + if (enc == XML_CHAR_ENCODING_ERROR) { + xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, + XML_XINCLUDE_UNKNOWN_ENCODING, + "encoding %s not supported\n", encoding); + xmlFree(encoding); + xmlFree(URL); + return(-1); + } + xmlFree(encoding); + } + + /* + * Load it. + */ + pctxt = xmlNewParserCtxt(); + inputStream = xmlLoadExternalEntity((const char*)URL, NULL, pctxt); + if(inputStream == NULL) { + xmlFreeParserCtxt(pctxt); + xmlFree(URL); + return(-1); + } + buf = inputStream->buf; + if (buf == NULL) { + xmlFreeInputStream (inputStream); + xmlFreeParserCtxt(pctxt); + xmlFree(URL); + return(-1); + } + if (buf->encoder) + xmlCharEncCloseFunc(buf->encoder); + buf->encoder = xmlGetCharEncodingHandler(enc); + node = xmlNewText(NULL); + + /* + * Scan all chars from the resource and add the to the node + */ +xinclude_multibyte_fallback: + while (xmlParserInputBufferRead(buf, 128) > 0) { + int len; + const xmlChar *content; + + content = xmlBufContent(buf->buffer); + len = xmlBufLength(buf->buffer); + for (i = 0;i < len;) { + int cur; + int l; + + cur = xmlStringCurrentChar(NULL, &content[i], &l); + if (!IS_CHAR(cur)) { + /* Handle splitted multibyte char at buffer boundary */ + if (((len - i) < 4) && (!xinclude_multibyte_fallback_used)) { + xinclude_multibyte_fallback_used = 1; + xmlBufShrink(buf->buffer, i); + goto xinclude_multibyte_fallback; + } else { + xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, + XML_XINCLUDE_INVALID_CHAR, + "%s contains invalid char\n", URL); + xmlFreeParserInputBuffer(buf); + xmlFree(URL); + return(-1); + } + } else { + xinclude_multibyte_fallback_used = 0; + xmlNodeAddContentLen(node, &content[i], l); + } + i += l; + } + xmlBufShrink(buf->buffer, len); + } + xmlFreeParserCtxt(pctxt); + xmlXIncludeAddTxt(ctxt, node, URL); + xmlFreeInputStream(inputStream); + +loaded: + /* + * Add the element as the replacement copy. + */ + ctxt->incTab[nr]->inc = node; + xmlFree(URL); + return(0); +} + +/** + * xmlXIncludeLoadFallback: + * @ctxt: the XInclude context + * @fallback: the fallback node + * @nr: the xinclude node number + * + * Load the content of the fallback node, and store the result + * in the XInclude context + * + * Returns 0 in case of success, -1 in case of failure + */ +static int +xmlXIncludeLoadFallback(xmlXIncludeCtxtPtr ctxt, xmlNodePtr fallback, int nr) { + xmlXIncludeCtxtPtr newctxt; + int ret = 0; + + if ((fallback == NULL) || (fallback->type == XML_NAMESPACE_DECL) || + (ctxt == NULL)) + return(-1); + if (fallback->children != NULL) { + /* + * It's possible that the fallback also has 'includes' + * (Bug 129969), so we re-process the fallback just in case + */ + newctxt = xmlXIncludeNewContext(ctxt->doc); + if (newctxt == NULL) + return (-1); + newctxt->_private = ctxt->_private; + newctxt->base = xmlStrdup(ctxt->base); /* Inherit the base from the existing context */ + xmlXIncludeSetFlags(newctxt, ctxt->parseFlags); + ret = xmlXIncludeDoProcess(newctxt, ctxt->doc, fallback->children); + if (ctxt->nbErrors > 0) + ret = -1; + else if (ret > 0) + ret = 0; /* xmlXIncludeDoProcess can return +ve number */ + xmlXIncludeFreeContext(newctxt); + + ctxt->incTab[nr]->inc = xmlDocCopyNodeList(ctxt->doc, + fallback->children); + } else { + ctxt->incTab[nr]->inc = NULL; + ctxt->incTab[nr]->emptyFb = 1; /* flag empty callback */ + } + return(ret); +} + +/************************************************************************ + * * + * XInclude Processing * + * * + ************************************************************************/ + +/** + * xmlXIncludePreProcessNode: + * @ctxt: an XInclude context + * @node: an XInclude node + * + * Implement the XInclude preprocessing, currently just adding the element + * for further processing. + * + * Returns the result list or NULL in case of error + */ +static xmlNodePtr +xmlXIncludePreProcessNode(xmlXIncludeCtxtPtr ctxt, xmlNodePtr node) { + xmlXIncludeAddNode(ctxt, node); + return(NULL); +} + +/** + * xmlXIncludeLoadNode: + * @ctxt: an XInclude context + * @nr: the node number + * + * Find and load the infoset replacement for the given node. + * + * Returns 0 if substitution succeeded, -1 if some processing failed + */ +static int +xmlXIncludeLoadNode(xmlXIncludeCtxtPtr ctxt, int nr) { + xmlNodePtr cur; + xmlChar *href; + xmlChar *parse; + xmlChar *base; + xmlChar *oldBase; + xmlChar *URI; + int xml = 1; /* default Issue 64 */ + int ret; + + if (ctxt == NULL) + return(-1); + if ((nr < 0) || (nr >= ctxt->incNr)) + return(-1); + cur = ctxt->incTab[nr]->ref; + if (cur == NULL) + return(-1); + + /* + * read the attributes + */ + href = xmlXIncludeGetProp(ctxt, cur, XINCLUDE_HREF); + if (href == NULL) { + href = xmlStrdup(BAD_CAST ""); /* @@@@ href is now optional */ + if (href == NULL) + return(-1); + } + parse = xmlXIncludeGetProp(ctxt, cur, XINCLUDE_PARSE); + if (parse != NULL) { + if (xmlStrEqual(parse, XINCLUDE_PARSE_XML)) + xml = 1; + else if (xmlStrEqual(parse, XINCLUDE_PARSE_TEXT)) + xml = 0; + else { + xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, + XML_XINCLUDE_PARSE_VALUE, + "invalid value %s for 'parse'\n", parse); + if (href != NULL) + xmlFree(href); + if (parse != NULL) + xmlFree(parse); + return(-1); + } + } + + /* + * compute the URI + */ + base = xmlNodeGetBase(ctxt->doc, cur); + if (base == NULL) { + URI = xmlBuildURI(href, ctxt->doc->URL); + } else { + URI = xmlBuildURI(href, base); + } + if (URI == NULL) { + xmlChar *escbase; + xmlChar *eschref; + /* + * Some escaping may be needed + */ + escbase = xmlURIEscape(base); + eschref = xmlURIEscape(href); + URI = xmlBuildURI(eschref, escbase); + if (escbase != NULL) + xmlFree(escbase); + if (eschref != NULL) + xmlFree(eschref); + } + if (URI == NULL) { + xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, + XML_XINCLUDE_HREF_URI, "failed build URL\n", NULL); + if (parse != NULL) + xmlFree(parse); + if (href != NULL) + xmlFree(href); + if (base != NULL) + xmlFree(base); + return(-1); + } +#ifdef DEBUG_XINCLUDE + xmlGenericError(xmlGenericErrorContext, "parse: %s\n", + xml ? "xml": "text"); + xmlGenericError(xmlGenericErrorContext, "URI: %s\n", URI); +#endif + + /* + * Save the base for this include (saving the current one) + */ + oldBase = ctxt->base; + ctxt->base = base; + + if (xml) { + ret = xmlXIncludeLoadDoc(ctxt, URI, nr); + /* xmlXIncludeGetFragment(ctxt, cur, URI); */ + } else { + ret = xmlXIncludeLoadTxt(ctxt, URI, nr); + } + + /* + * Restore the original base before checking for fallback + */ + ctxt->base = oldBase; + + if (ret < 0) { + xmlNodePtr children; + + /* + * Time to try a fallback if availble + */ +#ifdef DEBUG_XINCLUDE + xmlGenericError(xmlGenericErrorContext, "error looking for fallback\n"); +#endif + children = cur->children; + while (children != NULL) { + if ((children->type == XML_ELEMENT_NODE) && + (children->ns != NULL) && + (xmlStrEqual(children->name, XINCLUDE_FALLBACK)) && + ((xmlStrEqual(children->ns->href, XINCLUDE_NS)) || + (xmlStrEqual(children->ns->href, XINCLUDE_OLD_NS)))) { + ret = xmlXIncludeLoadFallback(ctxt, children, nr); + if (ret == 0) + break; + } + children = children->next; + } + } + if (ret < 0) { + xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, + XML_XINCLUDE_NO_FALLBACK, + "could not load %s, and no fallback was found\n", + URI); + } + + /* + * Cleanup + */ + if (URI != NULL) + xmlFree(URI); + if (parse != NULL) + xmlFree(parse); + if (href != NULL) + xmlFree(href); + if (base != NULL) + xmlFree(base); + return(0); +} + +/** + * xmlXIncludeIncludeNode: + * @ctxt: an XInclude context + * @nr: the node number + * + * Inplement the infoset replacement for the given node + * + * Returns 0 if substitution succeeded, -1 if some processing failed + */ +static int +xmlXIncludeIncludeNode(xmlXIncludeCtxtPtr ctxt, int nr) { + xmlNodePtr cur, end, list, tmp; + + if (ctxt == NULL) + return(-1); + if ((nr < 0) || (nr >= ctxt->incNr)) + return(-1); + cur = ctxt->incTab[nr]->ref; + if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL)) + return(-1); + + /* + * If we stored an XPointer a late computation may be needed + */ + if ((ctxt->incTab[nr]->inc == NULL) && + (ctxt->incTab[nr]->xptr != NULL)) { + ctxt->incTab[nr]->inc = + xmlXIncludeCopyXPointer(ctxt, ctxt->doc, ctxt->doc, + ctxt->incTab[nr]->xptr); + xmlXPathFreeObject(ctxt->incTab[nr]->xptr); + ctxt->incTab[nr]->xptr = NULL; + } + list = ctxt->incTab[nr]->inc; + ctxt->incTab[nr]->inc = NULL; + + /* + * Check against the risk of generating a multi-rooted document + */ + if ((cur->parent != NULL) && + (cur->parent->type != XML_ELEMENT_NODE)) { + int nb_elem = 0; + + tmp = list; + while (tmp != NULL) { + if (tmp->type == XML_ELEMENT_NODE) + nb_elem++; + tmp = tmp->next; + } + if (nb_elem > 1) { + xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, + XML_XINCLUDE_MULTIPLE_ROOT, + "XInclude error: would result in multiple root nodes\n", + NULL); + return(-1); + } + } + + if (ctxt->parseFlags & XML_PARSE_NOXINCNODE) { + /* + * Add the list of nodes + */ + while (list != NULL) { + end = list; + list = list->next; + + xmlAddPrevSibling(cur, end); + } + xmlUnlinkNode(cur); + xmlFreeNode(cur); + } else { + /* + * Change the current node as an XInclude start one, and add an + * XInclude end one + */ + cur->type = XML_XINCLUDE_START; + end = xmlNewDocNode(cur->doc, cur->ns, cur->name, NULL); + if (end == NULL) { + xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, + XML_XINCLUDE_BUILD_FAILED, + "failed to build node\n", NULL); + return(-1); + } + end->type = XML_XINCLUDE_END; + xmlAddNextSibling(cur, end); + + /* + * Add the list of nodes + */ + while (list != NULL) { + cur = list; + list = list->next; + + xmlAddPrevSibling(end, cur); + } + } + + + return(0); +} + +/** + * xmlXIncludeTestNode: + * @ctxt: the XInclude processing context + * @node: an XInclude node + * + * test if the node is an XInclude node + * + * Returns 1 true, 0 otherwise + */ +static int +xmlXIncludeTestNode(xmlXIncludeCtxtPtr ctxt, xmlNodePtr node) { + if (node == NULL) + return(0); + if (node->type != XML_ELEMENT_NODE) + return(0); + if (node->ns == NULL) + return(0); + if ((xmlStrEqual(node->ns->href, XINCLUDE_NS)) || + (xmlStrEqual(node->ns->href, XINCLUDE_OLD_NS))) { + if (xmlStrEqual(node->ns->href, XINCLUDE_OLD_NS)) { + if (ctxt->legacy == 0) { +#if 0 /* wait for the XML Core Working Group to get something stable ! */ + xmlXIncludeWarn(ctxt, node, XML_XINCLUDE_DEPRECATED_NS, + "Deprecated XInclude namespace found, use %s", + XINCLUDE_NS); +#endif + ctxt->legacy = 1; + } + } + if (xmlStrEqual(node->name, XINCLUDE_NODE)) { + xmlNodePtr child = node->children; + int nb_fallback = 0; + + while (child != NULL) { + if ((child->type == XML_ELEMENT_NODE) && + (child->ns != NULL) && + ((xmlStrEqual(child->ns->href, XINCLUDE_NS)) || + (xmlStrEqual(child->ns->href, XINCLUDE_OLD_NS)))) { + if (xmlStrEqual(child->name, XINCLUDE_NODE)) { + xmlXIncludeErr(ctxt, node, + XML_XINCLUDE_INCLUDE_IN_INCLUDE, + "%s has an 'include' child\n", + XINCLUDE_NODE); + return(0); + } + if (xmlStrEqual(child->name, XINCLUDE_FALLBACK)) { + nb_fallback++; + } + } + child = child->next; + } + if (nb_fallback > 1) { + xmlXIncludeErr(ctxt, node, XML_XINCLUDE_FALLBACKS_IN_INCLUDE, + "%s has multiple fallback children\n", + XINCLUDE_NODE); + return(0); + } + return(1); + } + if (xmlStrEqual(node->name, XINCLUDE_FALLBACK)) { + if ((node->parent == NULL) || + (node->parent->type != XML_ELEMENT_NODE) || + (node->parent->ns == NULL) || + ((!xmlStrEqual(node->parent->ns->href, XINCLUDE_NS)) && + (!xmlStrEqual(node->parent->ns->href, XINCLUDE_OLD_NS))) || + (!xmlStrEqual(node->parent->name, XINCLUDE_NODE))) { + xmlXIncludeErr(ctxt, node, + XML_XINCLUDE_FALLBACK_NOT_IN_INCLUDE, + "%s is not the child of an 'include'\n", + XINCLUDE_FALLBACK); + } + } + } + return(0); +} + +/** + * xmlXIncludeDoProcess: + * @ctxt: the XInclude processing context + * @doc: an XML document + * @tree: the top of the tree to process + * + * Implement the XInclude substitution on the XML document @doc + * + * Returns 0 if no substitution were done, -1 if some processing failed + * or the number of substitutions done. + */ +static int +xmlXIncludeDoProcess(xmlXIncludeCtxtPtr ctxt, xmlDocPtr doc, xmlNodePtr tree) { + xmlNodePtr cur; + int ret = 0; + int i, start; + + if ((doc == NULL) || (tree == NULL) || (tree->type == XML_NAMESPACE_DECL)) + return(-1); + if (ctxt == NULL) + return(-1); + + if (doc->URL != NULL) { + ret = xmlXIncludeURLPush(ctxt, doc->URL); + if (ret < 0) + return(-1); + } + start = ctxt->incNr; + + /* + * First phase: lookup the elements in the document + */ + cur = tree; + if (xmlXIncludeTestNode(ctxt, cur) == 1) + xmlXIncludePreProcessNode(ctxt, cur); + while ((cur != NULL) && (cur != tree->parent)) { + /* TODO: need to work on entities -> stack */ + if ((cur->children != NULL) && + (cur->children->type != XML_ENTITY_DECL) && + (cur->children->type != XML_XINCLUDE_START) && + (cur->children->type != XML_XINCLUDE_END)) { + cur = cur->children; + if (xmlXIncludeTestNode(ctxt, cur)) + xmlXIncludePreProcessNode(ctxt, cur); + } else if (cur->next != NULL) { + cur = cur->next; + if (xmlXIncludeTestNode(ctxt, cur)) + xmlXIncludePreProcessNode(ctxt, cur); + } else { + if (cur == tree) + break; + do { + cur = cur->parent; + if ((cur == NULL) || (cur == tree->parent)) + break; /* do */ + if (cur->next != NULL) { + cur = cur->next; + if (xmlXIncludeTestNode(ctxt, cur)) + xmlXIncludePreProcessNode(ctxt, cur); + break; /* do */ + } + } while (cur != NULL); + } + } + + /* + * Second Phase : collect the infosets fragments + */ + for (i = start;i < ctxt->incNr; i++) { + xmlXIncludeLoadNode(ctxt, i); + ret++; + } + + /* + * Third phase: extend the original document infoset. + * + * Originally we bypassed the inclusion if there were any errors + * encountered on any of the XIncludes. A bug was raised (bug + * 132588) requesting that we output the XIncludes without error, + * so the check for inc!=NULL || xptr!=NULL was put in. This may + * give some other problems in the future, but for now it seems to + * work ok. + * + */ + for (i = ctxt->incBase;i < ctxt->incNr; i++) { + if ((ctxt->incTab[i]->inc != NULL) || + (ctxt->incTab[i]->xptr != NULL) || + (ctxt->incTab[i]->emptyFb != 0)) /* (empty fallback) */ + xmlXIncludeIncludeNode(ctxt, i); + } + + if (doc->URL != NULL) + xmlXIncludeURLPop(ctxt); + return(ret); +} + +/** + * xmlXIncludeSetFlags: + * @ctxt: an XInclude processing context + * @flags: a set of xmlParserOption used for parsing XML includes + * + * Set the flags used for further processing of XML resources. + * + * Returns 0 in case of success and -1 in case of error. + */ +int +xmlXIncludeSetFlags(xmlXIncludeCtxtPtr ctxt, int flags) { + if (ctxt == NULL) + return(-1); + ctxt->parseFlags = flags; + return(0); +} + +/** + * xmlXIncludeProcessTreeFlagsData: + * @tree: an XML node + * @flags: a set of xmlParserOption used for parsing XML includes + * @data: application data that will be passed to the parser context + * in the _private field of the parser context(s) + * + * Implement the XInclude substitution on the XML node @tree + * + * Returns 0 if no substitution were done, -1 if some processing failed + * or the number of substitutions done. + */ + +int +xmlXIncludeProcessTreeFlagsData(xmlNodePtr tree, int flags, void *data) { + xmlXIncludeCtxtPtr ctxt; + int ret = 0; + + if ((tree == NULL) || (tree->type == XML_NAMESPACE_DECL) || + (tree->doc == NULL)) + return(-1); + + ctxt = xmlXIncludeNewContext(tree->doc); + if (ctxt == NULL) + return(-1); + ctxt->_private = data; + ctxt->base = xmlStrdup((xmlChar *)tree->doc->URL); + xmlXIncludeSetFlags(ctxt, flags); + ret = xmlXIncludeDoProcess(ctxt, tree->doc, tree); + if ((ret >= 0) && (ctxt->nbErrors > 0)) + ret = -1; + + xmlXIncludeFreeContext(ctxt); + return(ret); +} + +/** + * xmlXIncludeProcessFlagsData: + * @doc: an XML document + * @flags: a set of xmlParserOption used for parsing XML includes + * @data: application data that will be passed to the parser context + * in the _private field of the parser context(s) + * + * Implement the XInclude substitution on the XML document @doc + * + * Returns 0 if no substitution were done, -1 if some processing failed + * or the number of substitutions done. + */ +int +xmlXIncludeProcessFlagsData(xmlDocPtr doc, int flags, void *data) { + xmlNodePtr tree; + + if (doc == NULL) + return(-1); + tree = xmlDocGetRootElement(doc); + if (tree == NULL) + return(-1); + return(xmlXIncludeProcessTreeFlagsData(tree, flags, data)); +} + +/** + * xmlXIncludeProcessFlags: + * @doc: an XML document + * @flags: a set of xmlParserOption used for parsing XML includes + * + * Implement the XInclude substitution on the XML document @doc + * + * Returns 0 if no substitution were done, -1 if some processing failed + * or the number of substitutions done. + */ +int +xmlXIncludeProcessFlags(xmlDocPtr doc, int flags) { + return xmlXIncludeProcessFlagsData(doc, flags, NULL); +} + +/** + * xmlXIncludeProcess: + * @doc: an XML document + * + * Implement the XInclude substitution on the XML document @doc + * + * Returns 0 if no substitution were done, -1 if some processing failed + * or the number of substitutions done. + */ +int +xmlXIncludeProcess(xmlDocPtr doc) { + return(xmlXIncludeProcessFlags(doc, 0)); +} + +/** + * xmlXIncludeProcessTreeFlags: + * @tree: a node in an XML document + * @flags: a set of xmlParserOption used for parsing XML includes + * + * Implement the XInclude substitution for the given subtree + * + * Returns 0 if no substitution were done, -1 if some processing failed + * or the number of substitutions done. + */ +int +xmlXIncludeProcessTreeFlags(xmlNodePtr tree, int flags) { + xmlXIncludeCtxtPtr ctxt; + int ret = 0; + + if ((tree == NULL) || (tree->type == XML_NAMESPACE_DECL) || + (tree->doc == NULL)) + return(-1); + ctxt = xmlXIncludeNewContext(tree->doc); + if (ctxt == NULL) + return(-1); + ctxt->base = xmlNodeGetBase(tree->doc, tree); + xmlXIncludeSetFlags(ctxt, flags); + ret = xmlXIncludeDoProcess(ctxt, tree->doc, tree); + if ((ret >= 0) && (ctxt->nbErrors > 0)) + ret = -1; + + xmlXIncludeFreeContext(ctxt); + return(ret); +} + +/** + * xmlXIncludeProcessTree: + * @tree: a node in an XML document + * + * Implement the XInclude substitution for the given subtree + * + * Returns 0 if no substitution were done, -1 if some processing failed + * or the number of substitutions done. + */ +int +xmlXIncludeProcessTree(xmlNodePtr tree) { + return(xmlXIncludeProcessTreeFlags(tree, 0)); +} + +/** + * xmlXIncludeProcessNode: + * @ctxt: an existing XInclude context + * @node: a node in an XML document + * + * Implement the XInclude substitution for the given subtree reusing + * the informations and data coming from the given context. + * + * Returns 0 if no substitution were done, -1 if some processing failed + * or the number of substitutions done. + */ +int +xmlXIncludeProcessNode(xmlXIncludeCtxtPtr ctxt, xmlNodePtr node) { + int ret = 0; + + if ((node == NULL) || (node->type == XML_NAMESPACE_DECL) || + (node->doc == NULL) || (ctxt == NULL)) + return(-1); + ret = xmlXIncludeDoProcess(ctxt, node->doc, node); + if ((ret >= 0) && (ctxt->nbErrors > 0)) + ret = -1; + return(ret); +} + +#else /* !LIBXML_XINCLUDE_ENABLED */ +#endif +#define bottom_xinclude +#include "elfgcchack.h" diff --git a/vendors/libxml/src/xlink.c b/vendors/libxml/src/xlink.c new file mode 100644 index 0000000..3566e06 --- /dev/null +++ b/vendors/libxml/src/xlink.c @@ -0,0 +1,183 @@ +/* + * xlink.c : implementation of the hyperlinks detection module + * This version supports both XML XLinks and HTML simple links + * + * See Copyright for the status of this software. + * + * daniel@veillard.com + */ + + +#define IN_LIBXML +#include "libxml.h" + +#ifdef LIBXML_XPTR_ENABLED +#include /* for memset() only */ +#ifdef HAVE_CTYPE_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_FCNTL_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_ZLIB_H +#include +#endif + +#include +#include +#include +#include +#include +#include + +#define XLINK_NAMESPACE (BAD_CAST "http://www.w3.org/1999/xlink/namespace/") +#define XHTML_NAMESPACE (BAD_CAST "http://www.w3.org/1999/xhtml/") + +/**************************************************************** + * * + * Default setting and related functions * + * * + ****************************************************************/ + +static xlinkHandlerPtr xlinkDefaultHandler = NULL; +static xlinkNodeDetectFunc xlinkDefaultDetect = NULL; + +/** + * xlinkGetDefaultHandler: + * + * Get the default xlink handler. + * + * Returns the current xlinkHandlerPtr value. + */ +xlinkHandlerPtr +xlinkGetDefaultHandler(void) { + return(xlinkDefaultHandler); +} + + +/** + * xlinkSetDefaultHandler: + * @handler: the new value for the xlink handler block + * + * Set the default xlink handlers + */ +void +xlinkSetDefaultHandler(xlinkHandlerPtr handler) { + xlinkDefaultHandler = handler; +} + +/** + * xlinkGetDefaultDetect: + * + * Get the default xlink detection routine + * + * Returns the current function or NULL; + */ +xlinkNodeDetectFunc +xlinkGetDefaultDetect (void) { + return(xlinkDefaultDetect); +} + +/** + * xlinkSetDefaultDetect: + * @func: pointer to the new detection routine. + * + * Set the default xlink detection routine + */ +void +xlinkSetDefaultDetect (xlinkNodeDetectFunc func) { + xlinkDefaultDetect = func; +} + +/**************************************************************** + * * + * The detection routines * + * * + ****************************************************************/ + + +/** + * xlinkIsLink: + * @doc: the document containing the node + * @node: the node pointer itself + * + * Check whether the given node carries the attributes needed + * to be a link element (or is one of the linking elements issued + * from the (X)HTML DtDs). + * This routine don't try to do full checking of the link validity + * but tries to detect and return the appropriate link type. + * + * Returns the xlinkType of the node (XLINK_TYPE_NONE if there is no + * link detected. + */ +xlinkType +xlinkIsLink (xmlDocPtr doc, xmlNodePtr node) { + xmlChar *type = NULL, *role = NULL; + xlinkType ret = XLINK_TYPE_NONE; + + if (node == NULL) return(XLINK_TYPE_NONE); + if (doc == NULL) doc = node->doc; + if ((doc != NULL) && (doc->type == XML_HTML_DOCUMENT_NODE)) { + /* + * This is an HTML document. + */ + } else if ((node->ns != NULL) && + (xmlStrEqual(node->ns->href, XHTML_NAMESPACE))) { + /* + * !!!! We really need an IS_XHTML_ELEMENT function from HTMLtree.h @@@ + */ + /* + * This is an XHTML element within an XML document + * Check whether it's one of the element able to carry links + * and in that case if it holds the attributes. + */ + } + + /* + * We don't prevent a-priori having XML Linking constructs on + * XHTML elements + */ + type = xmlGetNsProp(node, BAD_CAST"type", XLINK_NAMESPACE); + if (type != NULL) { + if (xmlStrEqual(type, BAD_CAST "simple")) { + ret = XLINK_TYPE_SIMPLE; + } if (xmlStrEqual(type, BAD_CAST "extended")) { + role = xmlGetNsProp(node, BAD_CAST "role", XLINK_NAMESPACE); + if (role != NULL) { + xmlNsPtr xlink; + xlink = xmlSearchNs(doc, node, XLINK_NAMESPACE); + if (xlink == NULL) { + /* Humm, fallback method */ + if (xmlStrEqual(role, BAD_CAST"xlink:external-linkset")) + ret = XLINK_TYPE_EXTENDED_SET; + } else { + xmlChar buf[200]; + snprintf((char *) buf, sizeof(buf), "%s:external-linkset", + (char *) xlink->prefix); + buf[sizeof(buf) - 1] = 0; + if (xmlStrEqual(role, buf)) + ret = XLINK_TYPE_EXTENDED_SET; + + } + + } + ret = XLINK_TYPE_EXTENDED; + } + } + + if (type != NULL) xmlFree(type); + if (role != NULL) xmlFree(role); + return(ret); +} +#endif /* LIBXML_XPTR_ENABLED */ +#define bottom_xlink +#include "elfgcchack.h" diff --git a/vendors/libxml/src/xmlIO.c b/vendors/libxml/src/xmlIO.c new file mode 100644 index 0000000..847cb7e --- /dev/null +++ b/vendors/libxml/src/xmlIO.c @@ -0,0 +1,4155 @@ +/* + * xmlIO.c : implementation of the I/O interfaces used by the parser + * + * See Copyright for the status of this software. + * + * daniel@veillard.com + * + * 14 Nov 2000 ht - for VMS, truncated name of long functions to under 32 char + */ + +#define IN_LIBXML +#include "libxml.h" + +#include +#ifdef HAVE_ERRNO_H +#include +#endif + + +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_FCNTL_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_ZLIB_H +#include +#endif +#ifdef HAVE_LZMA_H +#include +#endif + +#if defined(WIN32) || defined(_WIN32) +#include +#endif + +#if defined(_WIN32_WCE) +#include /* for CP_UTF8 */ +#endif + +/* Figure a portable way to know if a file is a directory. */ +#ifndef HAVE_STAT +# ifdef HAVE__STAT + /* MS C library seems to define stat and _stat. The definition + is identical. Still, mapping them to each other causes a warning. */ +# ifndef _MSC_VER +# define stat(x,y) _stat(x,y) +# endif +# define HAVE_STAT +# endif +#else +# ifdef HAVE__STAT +# if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) +# define stat _stat +# endif +# endif +#endif +#ifdef HAVE_STAT +# ifndef S_ISDIR +# ifdef _S_ISDIR +# define S_ISDIR(x) _S_ISDIR(x) +# else +# ifdef S_IFDIR +# ifndef S_IFMT +# ifdef _S_IFMT +# define S_IFMT _S_IFMT +# endif +# endif +# ifdef S_IFMT +# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) +# endif +# endif +# endif +# endif +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef LIBXML_CATALOG_ENABLED +#include +#endif +#include + +#include "buf.h" +#include "enc.h" + +/* #define VERBOSE_FAILURE */ +/* #define DEBUG_EXTERNAL_ENTITIES */ +/* #define DEBUG_INPUT */ + +#ifdef DEBUG_INPUT +#define MINLEN 40 +#else +#define MINLEN 4000 +#endif + +/* + * Input I/O callback sets + */ +typedef struct _xmlInputCallback { + xmlInputMatchCallback matchcallback; + xmlInputOpenCallback opencallback; + xmlInputReadCallback readcallback; + xmlInputCloseCallback closecallback; +} xmlInputCallback; + +#define MAX_INPUT_CALLBACK 15 + +static xmlInputCallback xmlInputCallbackTable[MAX_INPUT_CALLBACK]; +static int xmlInputCallbackNr = 0; +static int xmlInputCallbackInitialized = 0; + +#ifdef LIBXML_OUTPUT_ENABLED +/* + * Output I/O callback sets + */ +typedef struct _xmlOutputCallback { + xmlOutputMatchCallback matchcallback; + xmlOutputOpenCallback opencallback; + xmlOutputWriteCallback writecallback; + xmlOutputCloseCallback closecallback; +} xmlOutputCallback; + +#define MAX_OUTPUT_CALLBACK 15 + +static xmlOutputCallback xmlOutputCallbackTable[MAX_OUTPUT_CALLBACK]; +static int xmlOutputCallbackNr = 0; +static int xmlOutputCallbackInitialized = 0; + +xmlOutputBufferPtr +xmlAllocOutputBufferInternal(xmlCharEncodingHandlerPtr encoder); +#endif /* LIBXML_OUTPUT_ENABLED */ + +/************************************************************************ + * * + * Tree memory error handler * + * * + ************************************************************************/ + +static const char *IOerr[] = { + "Unknown IO error", /* UNKNOWN */ + "Permission denied", /* EACCES */ + "Resource temporarily unavailable",/* EAGAIN */ + "Bad file descriptor", /* EBADF */ + "Bad message", /* EBADMSG */ + "Resource busy", /* EBUSY */ + "Operation canceled", /* ECANCELED */ + "No child processes", /* ECHILD */ + "Resource deadlock avoided",/* EDEADLK */ + "Domain error", /* EDOM */ + "File exists", /* EEXIST */ + "Bad address", /* EFAULT */ + "File too large", /* EFBIG */ + "Operation in progress", /* EINPROGRESS */ + "Interrupted function call",/* EINTR */ + "Invalid argument", /* EINVAL */ + "Input/output error", /* EIO */ + "Is a directory", /* EISDIR */ + "Too many open files", /* EMFILE */ + "Too many links", /* EMLINK */ + "Inappropriate message buffer length",/* EMSGSIZE */ + "Filename too long", /* ENAMETOOLONG */ + "Too many open files in system",/* ENFILE */ + "No such device", /* ENODEV */ + "No such file or directory",/* ENOENT */ + "Exec format error", /* ENOEXEC */ + "No locks available", /* ENOLCK */ + "Not enough space", /* ENOMEM */ + "No space left on device", /* ENOSPC */ + "Function not implemented", /* ENOSYS */ + "Not a directory", /* ENOTDIR */ + "Directory not empty", /* ENOTEMPTY */ + "Not supported", /* ENOTSUP */ + "Inappropriate I/O control operation",/* ENOTTY */ + "No such device or address",/* ENXIO */ + "Operation not permitted", /* EPERM */ + "Broken pipe", /* EPIPE */ + "Result too large", /* ERANGE */ + "Read-only file system", /* EROFS */ + "Invalid seek", /* ESPIPE */ + "No such process", /* ESRCH */ + "Operation timed out", /* ETIMEDOUT */ + "Improper link", /* EXDEV */ + "Attempt to load network entity %s", /* XML_IO_NETWORK_ATTEMPT */ + "encoder error", /* XML_IO_ENCODER */ + "flush error", + "write error", + "no input", + "buffer full", + "loading error", + "not a socket", /* ENOTSOCK */ + "already connected", /* EISCONN */ + "connection refused", /* ECONNREFUSED */ + "unreachable network", /* ENETUNREACH */ + "adddress in use", /* EADDRINUSE */ + "already in use", /* EALREADY */ + "unknown address familly", /* EAFNOSUPPORT */ +}; + +#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) +/** + * __xmlIOWin32UTF8ToWChar: + * @u8String: uft-8 string + * + * Convert a string from utf-8 to wchar (WINDOWS ONLY!) + */ +static wchar_t * +__xmlIOWin32UTF8ToWChar(const char *u8String) +{ + wchar_t *wString = NULL; + + if (u8String) { + int wLen = + MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, u8String, + -1, NULL, 0); + if (wLen) { + wString = xmlMalloc(wLen * sizeof(wchar_t)); + if (wString) { + if (MultiByteToWideChar + (CP_UTF8, 0, u8String, -1, wString, wLen) == 0) { + xmlFree(wString); + wString = NULL; + } + } + } + } + + return wString; +} +#endif + +/** + * xmlIOErrMemory: + * @extra: extra informations + * + * Handle an out of memory condition + */ +static void +xmlIOErrMemory(const char *extra) +{ + __xmlSimpleError(XML_FROM_IO, XML_ERR_NO_MEMORY, NULL, NULL, extra); +} + +/** + * __xmlIOErr: + * @code: the error number + * @ + * @extra: extra informations + * + * Handle an I/O error + */ +void +__xmlIOErr(int domain, int code, const char *extra) +{ + unsigned int idx; + + if (code == 0) { +#ifdef HAVE_ERRNO_H + if (errno == 0) code = 0; +#ifdef EACCES + else if (errno == EACCES) code = XML_IO_EACCES; +#endif +#ifdef EAGAIN + else if (errno == EAGAIN) code = XML_IO_EAGAIN; +#endif +#ifdef EBADF + else if (errno == EBADF) code = XML_IO_EBADF; +#endif +#ifdef EBADMSG + else if (errno == EBADMSG) code = XML_IO_EBADMSG; +#endif +#ifdef EBUSY + else if (errno == EBUSY) code = XML_IO_EBUSY; +#endif +#ifdef ECANCELED + else if (errno == ECANCELED) code = XML_IO_ECANCELED; +#endif +#ifdef ECHILD + else if (errno == ECHILD) code = XML_IO_ECHILD; +#endif +#ifdef EDEADLK + else if (errno == EDEADLK) code = XML_IO_EDEADLK; +#endif +#ifdef EDOM + else if (errno == EDOM) code = XML_IO_EDOM; +#endif +#ifdef EEXIST + else if (errno == EEXIST) code = XML_IO_EEXIST; +#endif +#ifdef EFAULT + else if (errno == EFAULT) code = XML_IO_EFAULT; +#endif +#ifdef EFBIG + else if (errno == EFBIG) code = XML_IO_EFBIG; +#endif +#ifdef EINPROGRESS + else if (errno == EINPROGRESS) code = XML_IO_EINPROGRESS; +#endif +#ifdef EINTR + else if (errno == EINTR) code = XML_IO_EINTR; +#endif +#ifdef EINVAL + else if (errno == EINVAL) code = XML_IO_EINVAL; +#endif +#ifdef EIO + else if (errno == EIO) code = XML_IO_EIO; +#endif +#ifdef EISDIR + else if (errno == EISDIR) code = XML_IO_EISDIR; +#endif +#ifdef EMFILE + else if (errno == EMFILE) code = XML_IO_EMFILE; +#endif +#ifdef EMLINK + else if (errno == EMLINK) code = XML_IO_EMLINK; +#endif +#ifdef EMSGSIZE + else if (errno == EMSGSIZE) code = XML_IO_EMSGSIZE; +#endif +#ifdef ENAMETOOLONG + else if (errno == ENAMETOOLONG) code = XML_IO_ENAMETOOLONG; +#endif +#ifdef ENFILE + else if (errno == ENFILE) code = XML_IO_ENFILE; +#endif +#ifdef ENODEV + else if (errno == ENODEV) code = XML_IO_ENODEV; +#endif +#ifdef ENOENT + else if (errno == ENOENT) code = XML_IO_ENOENT; +#endif +#ifdef ENOEXEC + else if (errno == ENOEXEC) code = XML_IO_ENOEXEC; +#endif +#ifdef ENOLCK + else if (errno == ENOLCK) code = XML_IO_ENOLCK; +#endif +#ifdef ENOMEM + else if (errno == ENOMEM) code = XML_IO_ENOMEM; +#endif +#ifdef ENOSPC + else if (errno == ENOSPC) code = XML_IO_ENOSPC; +#endif +#ifdef ENOSYS + else if (errno == ENOSYS) code = XML_IO_ENOSYS; +#endif +#ifdef ENOTDIR + else if (errno == ENOTDIR) code = XML_IO_ENOTDIR; +#endif +#ifdef ENOTEMPTY + else if (errno == ENOTEMPTY) code = XML_IO_ENOTEMPTY; +#endif +#ifdef ENOTSUP + else if (errno == ENOTSUP) code = XML_IO_ENOTSUP; +#endif +#ifdef ENOTTY + else if (errno == ENOTTY) code = XML_IO_ENOTTY; +#endif +#ifdef ENXIO + else if (errno == ENXIO) code = XML_IO_ENXIO; +#endif +#ifdef EPERM + else if (errno == EPERM) code = XML_IO_EPERM; +#endif +#ifdef EPIPE + else if (errno == EPIPE) code = XML_IO_EPIPE; +#endif +#ifdef ERANGE + else if (errno == ERANGE) code = XML_IO_ERANGE; +#endif +#ifdef EROFS + else if (errno == EROFS) code = XML_IO_EROFS; +#endif +#ifdef ESPIPE + else if (errno == ESPIPE) code = XML_IO_ESPIPE; +#endif +#ifdef ESRCH + else if (errno == ESRCH) code = XML_IO_ESRCH; +#endif +#ifdef ETIMEDOUT + else if (errno == ETIMEDOUT) code = XML_IO_ETIMEDOUT; +#endif +#ifdef EXDEV + else if (errno == EXDEV) code = XML_IO_EXDEV; +#endif +#ifdef ENOTSOCK + else if (errno == ENOTSOCK) code = XML_IO_ENOTSOCK; +#endif +#ifdef EISCONN + else if (errno == EISCONN) code = XML_IO_EISCONN; +#endif +#ifdef ECONNREFUSED + else if (errno == ECONNREFUSED) code = XML_IO_ECONNREFUSED; +#endif +#ifdef ETIMEDOUT + else if (errno == ETIMEDOUT) code = XML_IO_ETIMEDOUT; +#endif +#ifdef ENETUNREACH + else if (errno == ENETUNREACH) code = XML_IO_ENETUNREACH; +#endif +#ifdef EADDRINUSE + else if (errno == EADDRINUSE) code = XML_IO_EADDRINUSE; +#endif +#ifdef EINPROGRESS + else if (errno == EINPROGRESS) code = XML_IO_EINPROGRESS; +#endif +#ifdef EALREADY + else if (errno == EALREADY) code = XML_IO_EALREADY; +#endif +#ifdef EAFNOSUPPORT + else if (errno == EAFNOSUPPORT) code = XML_IO_EAFNOSUPPORT; +#endif + else code = XML_IO_UNKNOWN; +#endif /* HAVE_ERRNO_H */ + } + idx = 0; + if (code >= XML_IO_UNKNOWN) idx = code - XML_IO_UNKNOWN; + if (idx >= (sizeof(IOerr) / sizeof(IOerr[0]))) idx = 0; + + __xmlSimpleError(domain, code, NULL, IOerr[idx], extra); +} + +/** + * xmlIOErr: + * @code: the error number + * @extra: extra informations + * + * Handle an I/O error + */ +static void +xmlIOErr(int code, const char *extra) +{ + __xmlIOErr(XML_FROM_IO, code, extra); +} + +/** + * __xmlLoaderErr: + * @ctx: the parser context + * @extra: extra informations + * + * Handle a resource access error + */ +void +__xmlLoaderErr(void *ctx, const char *msg, const char *filename) +{ + xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; + xmlStructuredErrorFunc schannel = NULL; + xmlGenericErrorFunc channel = NULL; + void *data = NULL; + xmlErrorLevel level = XML_ERR_ERROR; + + if ((ctxt != NULL) && (ctxt->disableSAX != 0) && + (ctxt->instate == XML_PARSER_EOF)) + return; + if ((ctxt != NULL) && (ctxt->sax != NULL)) { + if (ctxt->validate) { + channel = ctxt->sax->error; + level = XML_ERR_ERROR; + } else { + channel = ctxt->sax->warning; + level = XML_ERR_WARNING; + } + if (ctxt->sax->initialized == XML_SAX2_MAGIC) + schannel = ctxt->sax->serror; + data = ctxt->userData; + } + __xmlRaiseError(schannel, channel, data, ctxt, NULL, XML_FROM_IO, + XML_IO_LOAD_ERROR, level, NULL, 0, + filename, NULL, NULL, 0, 0, + msg, filename); + +} + +/************************************************************************ + * * + * Tree memory error handler * + * * + ************************************************************************/ +/** + * xmlNormalizeWindowsPath: + * @path: the input file path + * + * This function is obsolete. Please see xmlURIFromPath in uri.c for + * a better solution. + * + * Returns a canonicalized version of the path + */ +xmlChar * +xmlNormalizeWindowsPath(const xmlChar *path) +{ + return xmlCanonicPath(path); +} + +/** + * xmlCleanupInputCallbacks: + * + * clears the entire input callback table. this includes the + * compiled-in I/O. + */ +void +xmlCleanupInputCallbacks(void) +{ + int i; + + if (!xmlInputCallbackInitialized) + return; + + for (i = xmlInputCallbackNr - 1; i >= 0; i--) { + xmlInputCallbackTable[i].matchcallback = NULL; + xmlInputCallbackTable[i].opencallback = NULL; + xmlInputCallbackTable[i].readcallback = NULL; + xmlInputCallbackTable[i].closecallback = NULL; + } + + xmlInputCallbackNr = 0; + xmlInputCallbackInitialized = 0; +} + +/** + * xmlPopInputCallbacks: + * + * Clear the top input callback from the input stack. this includes the + * compiled-in I/O. + * + * Returns the number of input callback registered or -1 in case of error. + */ +int +xmlPopInputCallbacks(void) +{ + if (!xmlInputCallbackInitialized) + return(-1); + + if (xmlInputCallbackNr <= 0) + return(-1); + + xmlInputCallbackNr--; + xmlInputCallbackTable[xmlInputCallbackNr].matchcallback = NULL; + xmlInputCallbackTable[xmlInputCallbackNr].opencallback = NULL; + xmlInputCallbackTable[xmlInputCallbackNr].readcallback = NULL; + xmlInputCallbackTable[xmlInputCallbackNr].closecallback = NULL; + + return(xmlInputCallbackNr); +} + +#ifdef LIBXML_OUTPUT_ENABLED +/** + * xmlCleanupOutputCallbacks: + * + * clears the entire output callback table. this includes the + * compiled-in I/O callbacks. + */ +void +xmlCleanupOutputCallbacks(void) +{ + int i; + + if (!xmlOutputCallbackInitialized) + return; + + for (i = xmlOutputCallbackNr - 1; i >= 0; i--) { + xmlOutputCallbackTable[i].matchcallback = NULL; + xmlOutputCallbackTable[i].opencallback = NULL; + xmlOutputCallbackTable[i].writecallback = NULL; + xmlOutputCallbackTable[i].closecallback = NULL; + } + + xmlOutputCallbackNr = 0; + xmlOutputCallbackInitialized = 0; +} +#endif /* LIBXML_OUTPUT_ENABLED */ + +/************************************************************************ + * * + * Standard I/O for file accesses * + * * + ************************************************************************/ + +#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) + +/** + * xmlWrapOpenUtf8: + * @path: the path in utf-8 encoding + * @mode: type of access (0 - read, 1 - write) + * + * function opens the file specified by @path + * + */ +static FILE* +xmlWrapOpenUtf8(const char *path,int mode) +{ + FILE *fd = NULL; + wchar_t *wPath; + + wPath = __xmlIOWin32UTF8ToWChar(path); + if(wPath) + { + fd = _wfopen(wPath, mode ? L"wb" : L"rb"); + xmlFree(wPath); + } + /* maybe path in native encoding */ + if(fd == NULL) + fd = fopen(path, mode ? "wb" : "rb"); + + return fd; +} + +#ifdef HAVE_ZLIB_H +static gzFile +xmlWrapGzOpenUtf8(const char *path, const char *mode) +{ + gzFile fd; + wchar_t *wPath; + + fd = gzopen (path, mode); + if (fd) + return fd; + + wPath = __xmlIOWin32UTF8ToWChar(path); + if(wPath) + { + int d, m = (strstr(mode, "r") ? O_RDONLY : O_RDWR); +#ifdef _O_BINARY + m |= (strstr(mode, "b") ? _O_BINARY : 0); +#endif + d = _wopen(wPath, m); + if (d >= 0) + fd = gzdopen(d, mode); + xmlFree(wPath); + } + + return fd; +} +#endif + +/** + * xmlWrapStatUtf8: + * @path: the path in utf-8 encoding + * @info: structure that stores results + * + * function obtains information about the file or directory + * + */ +static int +xmlWrapStatUtf8(const char *path,struct stat *info) +{ +#ifdef HAVE_STAT + int retval = -1; + wchar_t *wPath; + + wPath = __xmlIOWin32UTF8ToWChar(path); + if (wPath) + { + retval = _wstat(wPath,info); + xmlFree(wPath); + } + /* maybe path in native encoding */ + if(retval < 0) + retval = stat(path,info); + return retval; +#else + return -1; +#endif +} + +/** + * xmlWrapOpenNative: + * @path: the path + * @mode: type of access (0 - read, 1 - write) + * + * function opens the file specified by @path + * + */ +static FILE* +xmlWrapOpenNative(const char *path,int mode) +{ + return fopen(path,mode ? "wb" : "rb"); +} + +/** + * xmlWrapStatNative: + * @path: the path + * @info: structure that stores results + * + * function obtains information about the file or directory + * + */ +static int +xmlWrapStatNative(const char *path,struct stat *info) +{ +#ifdef HAVE_STAT + return stat(path,info); +#else + return -1; +#endif +} + +typedef int (* xmlWrapStatFunc) (const char *f, struct stat *s); +static xmlWrapStatFunc xmlWrapStat = xmlWrapStatNative; +typedef FILE* (* xmlWrapOpenFunc)(const char *f,int mode); +static xmlWrapOpenFunc xmlWrapOpen = xmlWrapOpenNative; +#ifdef HAVE_ZLIB_H +typedef gzFile (* xmlWrapGzOpenFunc) (const char *f, const char *mode); +static xmlWrapGzOpenFunc xmlWrapGzOpen = gzopen; +#endif +/** + * xmlInitPlatformSpecificIo: + * + * Initialize platform specific features. + */ +static void +xmlInitPlatformSpecificIo(void) +{ + static int xmlPlatformIoInitialized = 0; + OSVERSIONINFO osvi; + + if(xmlPlatformIoInitialized) + return; + + osvi.dwOSVersionInfoSize = sizeof(osvi); + + if(GetVersionEx(&osvi) && (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)) { + xmlWrapStat = xmlWrapStatUtf8; + xmlWrapOpen = xmlWrapOpenUtf8; +#ifdef HAVE_ZLIB_H + xmlWrapGzOpen = xmlWrapGzOpenUtf8; +#endif + } else { + xmlWrapStat = xmlWrapStatNative; + xmlWrapOpen = xmlWrapOpenNative; +#ifdef HAVE_ZLIB_H + xmlWrapGzOpen = gzopen; +#endif + } + + xmlPlatformIoInitialized = 1; + return; +} + +#endif + +/** + * xmlCheckFilename: + * @path: the path to check + * + * function checks to see if @path is a valid source + * (file, socket...) for XML. + * + * if stat is not available on the target machine, + * returns 1. if stat fails, returns 0 (if calling + * stat on the filename fails, it can't be right). + * if stat succeeds and the file is a directory, + * returns 2. otherwise returns 1. + */ + +int +xmlCheckFilename (const char *path) +{ +#ifdef HAVE_STAT + struct stat stat_buffer; +#endif + if (path == NULL) + return(0); + +#ifdef HAVE_STAT +#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) + /* + * On Windows stat and wstat do not work with long pathname, + * which start with '\\?\' + */ + if ((path[0] == '\\') && (path[1] == '\\') && (path[2] == '?') && + (path[3] == '\\') ) + return 1; + + if (xmlWrapStat(path, &stat_buffer) == -1) + return 0; +#else + if (stat(path, &stat_buffer) == -1) + return 0; +#endif +#ifdef S_ISDIR + if (S_ISDIR(stat_buffer.st_mode)) + return 2; +#endif +#endif /* HAVE_STAT */ + return 1; +} + +int +xmlNop(void) { + return(0); +} + +/** + * xmlFdRead: + * @context: the I/O context + * @buffer: where to drop data + * @len: number of bytes to read + * + * Read @len bytes to @buffer from the I/O channel. + * + * Returns the number of bytes written + */ +static int +xmlFdRead (void * context, char * buffer, int len) { + int ret; + + ret = read((int) (long) context, &buffer[0], len); + if (ret < 0) xmlIOErr(0, "read()"); + return(ret); +} + +#ifdef LIBXML_OUTPUT_ENABLED +/** + * xmlFdWrite: + * @context: the I/O context + * @buffer: where to get data + * @len: number of bytes to write + * + * Write @len bytes from @buffer to the I/O channel. + * + * Returns the number of bytes written + */ +static int +xmlFdWrite (void * context, const char * buffer, int len) { + int ret = 0; + + if (len > 0) { + ret = write((int) (long) context, &buffer[0], len); + if (ret < 0) xmlIOErr(0, "write()"); + } + return(ret); +} +#endif /* LIBXML_OUTPUT_ENABLED */ + +/** + * xmlFdClose: + * @context: the I/O context + * + * Close an I/O channel + * + * Returns 0 in case of success and error code otherwise + */ +static int +xmlFdClose (void * context) { + int ret; + ret = close((int) (long) context); + if (ret < 0) xmlIOErr(0, "close()"); + return(ret); +} + +/** + * xmlFileMatch: + * @filename: the URI for matching + * + * input from FILE * + * + * Returns 1 if matches, 0 otherwise + */ +int +xmlFileMatch (const char *filename ATTRIBUTE_UNUSED) { + return(1); +} + +/** + * xmlFileOpen_real: + * @filename: the URI for matching + * + * input from FILE *, supports compressed input + * if @filename is " " then the standard input is used + * + * Returns an I/O context or NULL in case of error + */ +static void * +xmlFileOpen_real (const char *filename) { + const char *path = NULL; + FILE *fd; + + if (filename == NULL) + return(NULL); + + if (!strcmp(filename, "-")) { + fd = stdin; + return((void *) fd); + } + + if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17)) { +#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__) + path = &filename[17]; +#else + path = &filename[16]; +#endif + } else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) { +#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__) + path = &filename[8]; +#else + path = &filename[7]; +#endif + } else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:/", 6)) { + /* lots of generators seems to lazy to read RFC 1738 */ +#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__) + path = &filename[6]; +#else + path = &filename[5]; +#endif + } else + path = filename; + + if (path == NULL) + return(NULL); + if (!xmlCheckFilename(path)) + return(NULL); + +#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) + fd = xmlWrapOpen(path, 0); +#else + fd = fopen(path, "r"); +#endif /* WIN32 */ + if (fd == NULL) xmlIOErr(0, path); + return((void *) fd); +} + +/** + * xmlFileOpen: + * @filename: the URI for matching + * + * Wrapper around xmlFileOpen_real that try it with an unescaped + * version of @filename, if this fails fallback to @filename + * + * Returns a handler or NULL in case or failure + */ +void * +xmlFileOpen (const char *filename) { + char *unescaped; + void *retval; + + retval = xmlFileOpen_real(filename); + if (retval == NULL) { + unescaped = xmlURIUnescapeString(filename, 0, NULL); + if (unescaped != NULL) { + retval = xmlFileOpen_real(unescaped); + xmlFree(unescaped); + } + } + + return retval; +} + +#ifdef LIBXML_OUTPUT_ENABLED +/** + * xmlFileOpenW: + * @filename: the URI for matching + * + * output to from FILE *, + * if @filename is "-" then the standard output is used + * + * Returns an I/O context or NULL in case of error + */ +static void * +xmlFileOpenW (const char *filename) { + const char *path = NULL; + FILE *fd; + + if (!strcmp(filename, "-")) { + fd = stdout; + return((void *) fd); + } + + if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17)) +#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__) + path = &filename[17]; +#else + path = &filename[16]; +#endif + else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) { +#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__) + path = &filename[8]; +#else + path = &filename[7]; +#endif + } else + path = filename; + + if (path == NULL) + return(NULL); + +#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) + fd = xmlWrapOpen(path, 1); +#else + fd = fopen(path, "wb"); +#endif /* WIN32 */ + + if (fd == NULL) xmlIOErr(0, path); + return((void *) fd); +} +#endif /* LIBXML_OUTPUT_ENABLED */ + +/** + * xmlFileRead: + * @context: the I/O context + * @buffer: where to drop data + * @len: number of bytes to write + * + * Read @len bytes to @buffer from the I/O channel. + * + * Returns the number of bytes written or < 0 in case of failure + */ +int +xmlFileRead (void * context, char * buffer, int len) { + int ret; + if ((context == NULL) || (buffer == NULL)) + return(-1); + ret = fread(&buffer[0], 1, len, (FILE *) context); + if (ret < 0) xmlIOErr(0, "fread()"); + return(ret); +} + +#ifdef LIBXML_OUTPUT_ENABLED +/** + * xmlFileWrite: + * @context: the I/O context + * @buffer: where to drop data + * @len: number of bytes to write + * + * Write @len bytes from @buffer to the I/O channel. + * + * Returns the number of bytes written + */ +static int +xmlFileWrite (void * context, const char * buffer, int len) { + int items; + + if ((context == NULL) || (buffer == NULL)) + return(-1); + items = fwrite(&buffer[0], len, 1, (FILE *) context); + if ((items == 0) && (ferror((FILE *) context))) { + xmlIOErr(0, "fwrite()"); + return(-1); + } + return(items * len); +} +#endif /* LIBXML_OUTPUT_ENABLED */ + +/** + * xmlFileClose: + * @context: the I/O context + * + * Close an I/O channel + * + * Returns 0 or -1 in case of error + */ +int +xmlFileClose (void * context) { + FILE *fil; + int ret; + + if (context == NULL) + return(-1); + fil = (FILE *) context; + if ((fil == stdout) || (fil == stderr)) { + ret = fflush(fil); + if (ret < 0) + xmlIOErr(0, "fflush()"); + return(0); + } + if (fil == stdin) + return(0); + ret = ( fclose((FILE *) context) == EOF ) ? -1 : 0; + if (ret < 0) + xmlIOErr(0, "fclose()"); + return(ret); +} + +/** + * xmlFileFlush: + * @context: the I/O context + * + * Flush an I/O channel + */ +static int +xmlFileFlush (void * context) { + int ret; + + if (context == NULL) + return(-1); + ret = ( fflush((FILE *) context) == EOF ) ? -1 : 0; + if (ret < 0) + xmlIOErr(0, "fflush()"); + return(ret); +} + +#ifdef LIBXML_OUTPUT_ENABLED +/** + * xmlBufferWrite: + * @context: the xmlBuffer + * @buffer: the data to write + * @len: number of bytes to write + * + * Write @len bytes from @buffer to the xml buffer + * + * Returns the number of bytes written + */ +static int +xmlBufferWrite (void * context, const char * buffer, int len) { + int ret; + + ret = xmlBufferAdd((xmlBufferPtr) context, (const xmlChar *) buffer, len); + if (ret != 0) + return(-1); + return(len); +} +#endif + +#ifdef HAVE_ZLIB_H +/************************************************************************ + * * + * I/O for compressed file accesses * + * * + ************************************************************************/ +/** + * xmlGzfileMatch: + * @filename: the URI for matching + * + * input from compressed file test + * + * Returns 1 if matches, 0 otherwise + */ +static int +xmlGzfileMatch (const char *filename ATTRIBUTE_UNUSED) { + return(1); +} + +/** + * xmlGzfileOpen_real: + * @filename: the URI for matching + * + * input from compressed file open + * if @filename is " " then the standard input is used + * + * Returns an I/O context or NULL in case of error + */ +static void * +xmlGzfileOpen_real (const char *filename) { + const char *path = NULL; + gzFile fd; + + if (!strcmp(filename, "-")) { + fd = gzdopen(dup(0), "rb"); + return((void *) fd); + } + + if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17)) +#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__) + path = &filename[17]; +#else + path = &filename[16]; +#endif + else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) { +#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__) + path = &filename[8]; +#else + path = &filename[7]; +#endif + } else + path = filename; + + if (path == NULL) + return(NULL); + if (!xmlCheckFilename(path)) + return(NULL); + +#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) + fd = xmlWrapGzOpen(path, "rb"); +#else + fd = gzopen(path, "rb"); +#endif + return((void *) fd); +} + +/** + * xmlGzfileOpen: + * @filename: the URI for matching + * + * Wrapper around xmlGzfileOpen if the open fais, it will + * try to unescape @filename + */ +static void * +xmlGzfileOpen (const char *filename) { + char *unescaped; + void *retval; + + retval = xmlGzfileOpen_real(filename); + if (retval == NULL) { + unescaped = xmlURIUnescapeString(filename, 0, NULL); + if (unescaped != NULL) { + retval = xmlGzfileOpen_real(unescaped); + } + xmlFree(unescaped); + } + return retval; +} + +#ifdef LIBXML_OUTPUT_ENABLED +/** + * xmlGzfileOpenW: + * @filename: the URI for matching + * @compression: the compression factor (0 - 9 included) + * + * input from compressed file open + * if @filename is " " then the standard input is used + * + * Returns an I/O context or NULL in case of error + */ +static void * +xmlGzfileOpenW (const char *filename, int compression) { + const char *path = NULL; + char mode[15]; + gzFile fd; + + snprintf(mode, sizeof(mode), "wb%d", compression); + if (!strcmp(filename, "-")) { + fd = gzdopen(dup(1), mode); + return((void *) fd); + } + + if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17)) +#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__) + path = &filename[17]; +#else + path = &filename[16]; +#endif + else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) { +#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__) + path = &filename[8]; +#else + path = &filename[7]; +#endif + } else + path = filename; + + if (path == NULL) + return(NULL); + +#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) + fd = xmlWrapGzOpen(path, mode); +#else + fd = gzopen(path, mode); +#endif + return((void *) fd); +} +#endif /* LIBXML_OUTPUT_ENABLED */ + +/** + * xmlGzfileRead: + * @context: the I/O context + * @buffer: where to drop data + * @len: number of bytes to write + * + * Read @len bytes to @buffer from the compressed I/O channel. + * + * Returns the number of bytes written + */ +static int +xmlGzfileRead (void * context, char * buffer, int len) { + int ret; + + ret = gzread((gzFile) context, &buffer[0], len); + if (ret < 0) xmlIOErr(0, "gzread()"); + return(ret); +} + +#ifdef LIBXML_OUTPUT_ENABLED +/** + * xmlGzfileWrite: + * @context: the I/O context + * @buffer: where to drop data + * @len: number of bytes to write + * + * Write @len bytes from @buffer to the compressed I/O channel. + * + * Returns the number of bytes written + */ +static int +xmlGzfileWrite (void * context, const char * buffer, int len) { + int ret; + + ret = gzwrite((gzFile) context, (char *) &buffer[0], len); + if (ret < 0) xmlIOErr(0, "gzwrite()"); + return(ret); +} +#endif /* LIBXML_OUTPUT_ENABLED */ + +/** + * xmlGzfileClose: + * @context: the I/O context + * + * Close a compressed I/O channel + */ +static int +xmlGzfileClose (void * context) { + int ret; + + ret = (gzclose((gzFile) context) == Z_OK ) ? 0 : -1; + if (ret < 0) xmlIOErr(0, "gzclose()"); + return(ret); +} +#endif /* HAVE_ZLIB_H */ + +#ifdef HAVE_LZMA_H +/************************************************************************ + * * + * I/O for compressed file accesses * + * * + ************************************************************************/ +#include "xzlib.h" +/** + * xmlXzfileMatch: + * @filename: the URI for matching + * + * input from compressed file test + * + * Returns 1 if matches, 0 otherwise + */ +static int +xmlXzfileMatch (const char *filename ATTRIBUTE_UNUSED) { + return(1); +} + +/** + * xmlXzFileOpen_real: + * @filename: the URI for matching + * + * input from compressed file open + * if @filename is " " then the standard input is used + * + * Returns an I/O context or NULL in case of error + */ +static void * +xmlXzfileOpen_real (const char *filename) { + const char *path = NULL; + xzFile fd; + + if (!strcmp(filename, "-")) { + fd = __libxml2_xzdopen(dup(0), "rb"); + return((void *) fd); + } + + if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17)) { + path = &filename[16]; + } else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) { + path = &filename[7]; + } else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:/", 6)) { + /* lots of generators seems to lazy to read RFC 1738 */ + path = &filename[5]; + } else + path = filename; + + if (path == NULL) + return(NULL); + if (!xmlCheckFilename(path)) + return(NULL); + + fd = __libxml2_xzopen(path, "rb"); + return((void *) fd); +} + +/** + * xmlXzfileOpen: + * @filename: the URI for matching + * + * Wrapper around xmlXzfileOpen_real that try it with an unescaped + * version of @filename, if this fails fallback to @filename + * + * Returns a handler or NULL in case or failure + */ +static void * +xmlXzfileOpen (const char *filename) { + char *unescaped; + void *retval; + + retval = xmlXzfileOpen_real(filename); + if (retval == NULL) { + unescaped = xmlURIUnescapeString(filename, 0, NULL); + if (unescaped != NULL) { + retval = xmlXzfileOpen_real(unescaped); + } + xmlFree(unescaped); + } + + return retval; +} + +/** + * xmlXzfileRead: + * @context: the I/O context + * @buffer: where to drop data + * @len: number of bytes to write + * + * Read @len bytes to @buffer from the compressed I/O channel. + * + * Returns the number of bytes written + */ +static int +xmlXzfileRead (void * context, char * buffer, int len) { + int ret; + + ret = __libxml2_xzread((xzFile) context, &buffer[0], len); + if (ret < 0) xmlIOErr(0, "xzread()"); + return(ret); +} + +/** + * xmlXzfileClose: + * @context: the I/O context + * + * Close a compressed I/O channel + */ +static int +xmlXzfileClose (void * context) { + int ret; + + ret = (__libxml2_xzclose((xzFile) context) == LZMA_OK ) ? 0 : -1; + if (ret < 0) xmlIOErr(0, "xzclose()"); + return(ret); +} +#endif /* HAVE_LZMA_H */ + +#ifdef LIBXML_HTTP_ENABLED +/************************************************************************ + * * + * I/O for HTTP file accesses * + * * + ************************************************************************/ + +#ifdef LIBXML_OUTPUT_ENABLED +typedef struct xmlIOHTTPWriteCtxt_ +{ + int compression; + + char * uri; + + void * doc_buff; + +} xmlIOHTTPWriteCtxt, *xmlIOHTTPWriteCtxtPtr; + +#ifdef HAVE_ZLIB_H + +#define DFLT_WBITS ( -15 ) +#define DFLT_MEM_LVL ( 8 ) +#define GZ_MAGIC1 ( 0x1f ) +#define GZ_MAGIC2 ( 0x8b ) +#define LXML_ZLIB_OS_CODE ( 0x03 ) +#define INIT_HTTP_BUFF_SIZE ( 32768 ) +#define DFLT_ZLIB_RATIO ( 5 ) + +/* +** Data structure and functions to work with sending compressed data +** via HTTP. +*/ + +typedef struct xmlZMemBuff_ +{ + unsigned long size; + unsigned long crc; + + unsigned char * zbuff; + z_stream zctrl; + +} xmlZMemBuff, *xmlZMemBuffPtr; + +/** + * append_reverse_ulong + * @buff: Compressed memory buffer + * @data: Unsigned long to append + * + * Append a unsigned long in reverse byte order to the end of the + * memory buffer. + */ +static void +append_reverse_ulong( xmlZMemBuff * buff, unsigned long data ) { + + int idx; + + if ( buff == NULL ) + return; + + /* + ** This is plagiarized from putLong in gzio.c (zlib source) where + ** the number "4" is hardcoded. If zlib is ever patched to + ** support 64 bit file sizes, this code would need to be patched + ** as well. + */ + + for ( idx = 0; idx < 4; idx++ ) { + *buff->zctrl.next_out = ( data & 0xff ); + data >>= 8; + buff->zctrl.next_out++; + } + + return; +} + +/** + * + * xmlFreeZMemBuff + * @buff: The memory buffer context to clear + * + * Release all the resources associated with the compressed memory buffer. + */ +static void +xmlFreeZMemBuff( xmlZMemBuffPtr buff ) { + +#ifdef DEBUG_HTTP + int z_err; +#endif + + if ( buff == NULL ) + return; + + xmlFree( buff->zbuff ); +#ifdef DEBUG_HTTP + z_err = deflateEnd( &buff->zctrl ); + if ( z_err != Z_OK ) + xmlGenericError( xmlGenericErrorContext, + "xmlFreeZMemBuff: Error releasing zlib context: %d\n", + z_err ); +#else + deflateEnd( &buff->zctrl ); +#endif + + xmlFree( buff ); + return; +} + +/** + * xmlCreateZMemBuff + *@compression: Compression value to use + * + * Create a memory buffer to hold the compressed XML document. The + * compressed document in memory will end up being identical to what + * would be created if gzopen/gzwrite/gzclose were being used to + * write the document to disk. The code for the header/trailer data to + * the compression is plagiarized from the zlib source files. + */ +static void * +xmlCreateZMemBuff( int compression ) { + + int z_err; + int hdr_lgth; + xmlZMemBuffPtr buff = NULL; + + if ( ( compression < 1 ) || ( compression > 9 ) ) + return ( NULL ); + + /* Create the control and data areas */ + + buff = xmlMalloc( sizeof( xmlZMemBuff ) ); + if ( buff == NULL ) { + xmlIOErrMemory("creating buffer context"); + return ( NULL ); + } + + (void)memset( buff, 0, sizeof( xmlZMemBuff ) ); + buff->size = INIT_HTTP_BUFF_SIZE; + buff->zbuff = xmlMalloc( buff->size ); + if ( buff->zbuff == NULL ) { + xmlFreeZMemBuff( buff ); + xmlIOErrMemory("creating buffer"); + return ( NULL ); + } + + z_err = deflateInit2( &buff->zctrl, compression, Z_DEFLATED, + DFLT_WBITS, DFLT_MEM_LVL, Z_DEFAULT_STRATEGY ); + if ( z_err != Z_OK ) { + xmlChar msg[500]; + xmlFreeZMemBuff( buff ); + buff = NULL; + xmlStrPrintf(msg, 500, + (const xmlChar *) "xmlCreateZMemBuff: %s %d\n", + "Error initializing compression context. ZLIB error:", + z_err ); + xmlIOErr(XML_IO_WRITE, (const char *) msg); + return ( NULL ); + } + + /* Set the header data. The CRC will be needed for the trailer */ + buff->crc = crc32( 0L, NULL, 0 ); + hdr_lgth = snprintf( (char *)buff->zbuff, buff->size, + "%c%c%c%c%c%c%c%c%c%c", + GZ_MAGIC1, GZ_MAGIC2, Z_DEFLATED, + 0, 0, 0, 0, 0, 0, LXML_ZLIB_OS_CODE ); + buff->zctrl.next_out = buff->zbuff + hdr_lgth; + buff->zctrl.avail_out = buff->size - hdr_lgth; + + return ( buff ); +} + +/** + * xmlZMemBuffExtend + * @buff: Buffer used to compress and consolidate data. + * @ext_amt: Number of bytes to extend the buffer. + * + * Extend the internal buffer used to store the compressed data by the + * specified amount. + * + * Returns 0 on success or -1 on failure to extend the buffer. On failure + * the original buffer still exists at the original size. + */ +static int +xmlZMemBuffExtend( xmlZMemBuffPtr buff, size_t ext_amt ) { + + int rc = -1; + size_t new_size; + size_t cur_used; + + unsigned char * tmp_ptr = NULL; + + if ( buff == NULL ) + return ( -1 ); + + else if ( ext_amt == 0 ) + return ( 0 ); + + cur_used = buff->zctrl.next_out - buff->zbuff; + new_size = buff->size + ext_amt; + +#ifdef DEBUG_HTTP + if ( cur_used > new_size ) + xmlGenericError( xmlGenericErrorContext, + "xmlZMemBuffExtend: %s\n%s %d bytes.\n", + "Buffer overwrite detected during compressed memory", + "buffer extension. Overflowed by", + (cur_used - new_size ) ); +#endif + + tmp_ptr = xmlRealloc( buff->zbuff, new_size ); + if ( tmp_ptr != NULL ) { + rc = 0; + buff->size = new_size; + buff->zbuff = tmp_ptr; + buff->zctrl.next_out = tmp_ptr + cur_used; + buff->zctrl.avail_out = new_size - cur_used; + } + else { + xmlChar msg[500]; + xmlStrPrintf(msg, 500, + (const xmlChar *) "xmlZMemBuffExtend: %s %lu bytes.\n", + "Allocation failure extending output buffer to", + new_size ); + xmlIOErr(XML_IO_WRITE, (const char *) msg); + } + + return ( rc ); +} + +/** + * xmlZMemBuffAppend + * @buff: Buffer used to compress and consolidate data + * @src: Uncompressed source content to append to buffer + * @len: Length of source data to append to buffer + * + * Compress and append data to the internal buffer. The data buffer + * will be expanded if needed to store the additional data. + * + * Returns the number of bytes appended to the buffer or -1 on error. + */ +static int +xmlZMemBuffAppend( xmlZMemBuffPtr buff, const char * src, int len ) { + + int z_err; + size_t min_accept; + + if ( ( buff == NULL ) || ( src == NULL ) ) + return ( -1 ); + + buff->zctrl.avail_in = len; + buff->zctrl.next_in = (unsigned char *)src; + while ( buff->zctrl.avail_in > 0 ) { + /* + ** Extend the buffer prior to deflate call if a reasonable amount + ** of output buffer space is not available. + */ + min_accept = buff->zctrl.avail_in / DFLT_ZLIB_RATIO; + if ( buff->zctrl.avail_out <= min_accept ) { + if ( xmlZMemBuffExtend( buff, buff->size ) == -1 ) + return ( -1 ); + } + + z_err = deflate( &buff->zctrl, Z_NO_FLUSH ); + if ( z_err != Z_OK ) { + xmlChar msg[500]; + xmlStrPrintf(msg, 500, + (const xmlChar *) "xmlZMemBuffAppend: %s %d %s - %d", + "Compression error while appending", + len, "bytes to buffer. ZLIB error", z_err ); + xmlIOErr(XML_IO_WRITE, (const char *) msg); + return ( -1 ); + } + } + + buff->crc = crc32( buff->crc, (unsigned char *)src, len ); + + return ( len ); +} + +/** + * xmlZMemBuffGetContent + * @buff: Compressed memory content buffer + * @data_ref: Pointer reference to point to compressed content + * + * Flushes the compression buffers, appends gzip file trailers and + * returns the compressed content and length of the compressed data. + * NOTE: The gzip trailer code here is plagiarized from zlib source. + * + * Returns the length of the compressed data or -1 on error. + */ +static int +xmlZMemBuffGetContent( xmlZMemBuffPtr buff, char ** data_ref ) { + + int zlgth = -1; + int z_err; + + if ( ( buff == NULL ) || ( data_ref == NULL ) ) + return ( -1 ); + + /* Need to loop until compression output buffers are flushed */ + + do + { + z_err = deflate( &buff->zctrl, Z_FINISH ); + if ( z_err == Z_OK ) { + /* In this case Z_OK means more buffer space needed */ + + if ( xmlZMemBuffExtend( buff, buff->size ) == -1 ) + return ( -1 ); + } + } + while ( z_err == Z_OK ); + + /* If the compression state is not Z_STREAM_END, some error occurred */ + + if ( z_err == Z_STREAM_END ) { + + /* Need to append the gzip data trailer */ + + if ( buff->zctrl.avail_out < ( 2 * sizeof( unsigned long ) ) ) { + if ( xmlZMemBuffExtend(buff, (2 * sizeof(unsigned long))) == -1 ) + return ( -1 ); + } + + /* + ** For whatever reason, the CRC and length data are pushed out + ** in reverse byte order. So a memcpy can't be used here. + */ + + append_reverse_ulong( buff, buff->crc ); + append_reverse_ulong( buff, buff->zctrl.total_in ); + + zlgth = buff->zctrl.next_out - buff->zbuff; + *data_ref = (char *)buff->zbuff; + } + + else { + xmlChar msg[500]; + xmlStrPrintf(msg, 500, + (const xmlChar *) "xmlZMemBuffGetContent: %s - %d\n", + "Error flushing zlib buffers. Error code", z_err ); + xmlIOErr(XML_IO_WRITE, (const char *) msg); + } + + return ( zlgth ); +} +#endif /* LIBXML_OUTPUT_ENABLED */ +#endif /* HAVE_ZLIB_H */ + +#ifdef LIBXML_OUTPUT_ENABLED +/** + * xmlFreeHTTPWriteCtxt + * @ctxt: Context to cleanup + * + * Free allocated memory and reclaim system resources. + * + * No return value. + */ +static void +xmlFreeHTTPWriteCtxt( xmlIOHTTPWriteCtxtPtr ctxt ) +{ + if ( ctxt->uri != NULL ) + xmlFree( ctxt->uri ); + + if ( ctxt->doc_buff != NULL ) { + +#ifdef HAVE_ZLIB_H + if ( ctxt->compression > 0 ) { + xmlFreeZMemBuff( ctxt->doc_buff ); + } + else +#endif + { + xmlOutputBufferClose( ctxt->doc_buff ); + } + } + + xmlFree( ctxt ); + return; +} +#endif /* LIBXML_OUTPUT_ENABLED */ + + +/** + * xmlIOHTTPMatch: + * @filename: the URI for matching + * + * check if the URI matches an HTTP one + * + * Returns 1 if matches, 0 otherwise + */ +int +xmlIOHTTPMatch (const char *filename) { + if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "http://", 7)) + return(1); + return(0); +} + +/** + * xmlIOHTTPOpen: + * @filename: the URI for matching + * + * open an HTTP I/O channel + * + * Returns an I/O context or NULL in case of error + */ +void * +xmlIOHTTPOpen (const char *filename) { + return(xmlNanoHTTPOpen(filename, NULL)); +} + +#ifdef LIBXML_OUTPUT_ENABLED +/** + * xmlIOHTTPOpenW: + * @post_uri: The destination URI for the document + * @compression: The compression desired for the document. + * + * Open a temporary buffer to collect the document for a subsequent HTTP POST + * request. Non-static as is called from the output buffer creation routine. + * + * Returns an I/O context or NULL in case of error. + */ + +void * +xmlIOHTTPOpenW(const char *post_uri, int compression) +{ + + xmlIOHTTPWriteCtxtPtr ctxt = NULL; + + if (post_uri == NULL) + return (NULL); + + ctxt = xmlMalloc(sizeof(xmlIOHTTPWriteCtxt)); + if (ctxt == NULL) { + xmlIOErrMemory("creating HTTP output context"); + return (NULL); + } + + (void) memset(ctxt, 0, sizeof(xmlIOHTTPWriteCtxt)); + + ctxt->uri = (char *) xmlStrdup((const xmlChar *)post_uri); + if (ctxt->uri == NULL) { + xmlIOErrMemory("copying URI"); + xmlFreeHTTPWriteCtxt(ctxt); + return (NULL); + } + + /* + * ** Since the document length is required for an HTTP post, + * ** need to put the document into a buffer. A memory buffer + * ** is being used to avoid pushing the data to disk and back. + */ + +#ifdef HAVE_ZLIB_H + if ((compression > 0) && (compression <= 9)) { + + ctxt->compression = compression; + ctxt->doc_buff = xmlCreateZMemBuff(compression); + } else +#endif + { + /* Any character conversions should have been done before this */ + + ctxt->doc_buff = xmlAllocOutputBufferInternal(NULL); + } + + if (ctxt->doc_buff == NULL) { + xmlFreeHTTPWriteCtxt(ctxt); + ctxt = NULL; + } + + return (ctxt); +} +#endif /* LIBXML_OUTPUT_ENABLED */ + +#ifdef LIBXML_OUTPUT_ENABLED +/** + * xmlIOHTTPDfltOpenW + * @post_uri: The destination URI for this document. + * + * Calls xmlIOHTTPOpenW with no compression to set up for a subsequent + * HTTP post command. This function should generally not be used as + * the open callback is short circuited in xmlOutputBufferCreateFile. + * + * Returns a pointer to the new IO context. + */ +static void * +xmlIOHTTPDfltOpenW( const char * post_uri ) { + return ( xmlIOHTTPOpenW( post_uri, 0 ) ); +} +#endif /* LIBXML_OUTPUT_ENABLED */ + +/** + * xmlIOHTTPRead: + * @context: the I/O context + * @buffer: where to drop data + * @len: number of bytes to write + * + * Read @len bytes to @buffer from the I/O channel. + * + * Returns the number of bytes written + */ +int +xmlIOHTTPRead(void * context, char * buffer, int len) { + if ((buffer == NULL) || (len < 0)) return(-1); + return(xmlNanoHTTPRead(context, &buffer[0], len)); +} + +#ifdef LIBXML_OUTPUT_ENABLED +/** + * xmlIOHTTPWrite + * @context: previously opened writing context + * @buffer: data to output to temporary buffer + * @len: bytes to output + * + * Collect data from memory buffer into a temporary file for later + * processing. + * + * Returns number of bytes written. + */ + +static int +xmlIOHTTPWrite( void * context, const char * buffer, int len ) { + + xmlIOHTTPWriteCtxtPtr ctxt = context; + + if ( ( ctxt == NULL ) || ( ctxt->doc_buff == NULL ) || ( buffer == NULL ) ) + return ( -1 ); + + if ( len > 0 ) { + + /* Use gzwrite or fwrite as previously setup in the open call */ + +#ifdef HAVE_ZLIB_H + if ( ctxt->compression > 0 ) + len = xmlZMemBuffAppend( ctxt->doc_buff, buffer, len ); + + else +#endif + len = xmlOutputBufferWrite( ctxt->doc_buff, len, buffer ); + + if ( len < 0 ) { + xmlChar msg[500]; + xmlStrPrintf(msg, 500, + (const xmlChar *) "xmlIOHTTPWrite: %s\n%s '%s'.\n", + "Error appending to internal buffer.", + "Error sending document to URI", + ctxt->uri ); + xmlIOErr(XML_IO_WRITE, (const char *) msg); + } + } + + return ( len ); +} +#endif /* LIBXML_OUTPUT_ENABLED */ + + +/** + * xmlIOHTTPClose: + * @context: the I/O context + * + * Close an HTTP I/O channel + * + * Returns 0 + */ +int +xmlIOHTTPClose (void * context) { + xmlNanoHTTPClose(context); + return 0; +} + +#ifdef LIBXML_OUTPUT_ENABLED +/** + * xmlIOHTTCloseWrite + * @context: The I/O context + * @http_mthd: The HTTP method to be used when sending the data + * + * Close the transmit HTTP I/O channel and actually send the data. + */ +static int +xmlIOHTTPCloseWrite( void * context, const char * http_mthd ) { + + int close_rc = -1; + int http_rtn = 0; + int content_lgth = 0; + xmlIOHTTPWriteCtxtPtr ctxt = context; + + char * http_content = NULL; + char * content_encoding = NULL; + char * content_type = (char *) "text/xml"; + void * http_ctxt = NULL; + + if ( ( ctxt == NULL ) || ( http_mthd == NULL ) ) + return ( -1 ); + + /* Retrieve the content from the appropriate buffer */ + +#ifdef HAVE_ZLIB_H + + if ( ctxt->compression > 0 ) { + content_lgth = xmlZMemBuffGetContent( ctxt->doc_buff, &http_content ); + content_encoding = (char *) "Content-Encoding: gzip"; + } + else +#endif + { + /* Pull the data out of the memory output buffer */ + + xmlOutputBufferPtr dctxt = ctxt->doc_buff; + http_content = (char *) xmlBufContent(dctxt->buffer); + content_lgth = xmlBufUse(dctxt->buffer); + } + + if ( http_content == NULL ) { + xmlChar msg[500]; + xmlStrPrintf(msg, 500, + (const xmlChar *) "xmlIOHTTPCloseWrite: %s '%s' %s '%s'.\n", + "Error retrieving content.\nUnable to", + http_mthd, "data to URI", ctxt->uri ); + xmlIOErr(XML_IO_WRITE, (const char *) msg); + } + + else { + + http_ctxt = xmlNanoHTTPMethod( ctxt->uri, http_mthd, http_content, + &content_type, content_encoding, + content_lgth ); + + if ( http_ctxt != NULL ) { +#ifdef DEBUG_HTTP + /* If testing/debugging - dump reply with request content */ + + FILE * tst_file = NULL; + char buffer[ 4096 ]; + char * dump_name = NULL; + int avail; + + xmlGenericError( xmlGenericErrorContext, + "xmlNanoHTTPCloseWrite: HTTP %s to\n%s returned %d.\n", + http_mthd, ctxt->uri, + xmlNanoHTTPReturnCode( http_ctxt ) ); + + /* + ** Since either content or reply may be gzipped, + ** dump them to separate files instead of the + ** standard error context. + */ + + dump_name = tempnam( NULL, "lxml" ); + if ( dump_name != NULL ) { + (void)snprintf( buffer, sizeof(buffer), "%s.content", dump_name ); + + tst_file = fopen( buffer, "wb" ); + if ( tst_file != NULL ) { + xmlGenericError( xmlGenericErrorContext, + "Transmitted content saved in file: %s\n", buffer ); + + fwrite( http_content, sizeof( char ), + content_lgth, tst_file ); + fclose( tst_file ); + } + + (void)snprintf( buffer, sizeof(buffer), "%s.reply", dump_name ); + tst_file = fopen( buffer, "wb" ); + if ( tst_file != NULL ) { + xmlGenericError( xmlGenericErrorContext, + "Reply content saved in file: %s\n", buffer ); + + + while ( (avail = xmlNanoHTTPRead( http_ctxt, + buffer, sizeof( buffer ) )) > 0 ) { + + fwrite( buffer, sizeof( char ), avail, tst_file ); + } + + fclose( tst_file ); + } + + free( dump_name ); + } +#endif /* DEBUG_HTTP */ + + http_rtn = xmlNanoHTTPReturnCode( http_ctxt ); + if ( ( http_rtn >= 200 ) && ( http_rtn < 300 ) ) + close_rc = 0; + else { + xmlChar msg[500]; + xmlStrPrintf(msg, 500, + (const xmlChar *) "xmlIOHTTPCloseWrite: HTTP '%s' of %d %s\n'%s' %s %d\n", + http_mthd, content_lgth, + "bytes to URI", ctxt->uri, + "failed. HTTP return code:", http_rtn ); + xmlIOErr(XML_IO_WRITE, (const char *) msg); + } + + xmlNanoHTTPClose( http_ctxt ); + xmlFree( content_type ); + } + } + + /* Final cleanups */ + + xmlFreeHTTPWriteCtxt( ctxt ); + + return ( close_rc ); +} + +/** + * xmlIOHTTPClosePut + * + * @context: The I/O context + * + * Close the transmit HTTP I/O channel and actually send data using a PUT + * HTTP method. + */ +static int +xmlIOHTTPClosePut( void * ctxt ) { + return ( xmlIOHTTPCloseWrite( ctxt, "PUT" ) ); +} + + +/** + * xmlIOHTTPClosePost + * + * @context: The I/O context + * + * Close the transmit HTTP I/O channel and actually send data using a POST + * HTTP method. + */ +static int +xmlIOHTTPClosePost( void * ctxt ) { + return ( xmlIOHTTPCloseWrite( ctxt, "POST" ) ); +} +#endif /* LIBXML_OUTPUT_ENABLED */ + +#endif /* LIBXML_HTTP_ENABLED */ + +#ifdef LIBXML_FTP_ENABLED +/************************************************************************ + * * + * I/O for FTP file accesses * + * * + ************************************************************************/ +/** + * xmlIOFTPMatch: + * @filename: the URI for matching + * + * check if the URI matches an FTP one + * + * Returns 1 if matches, 0 otherwise + */ +int +xmlIOFTPMatch (const char *filename) { + if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "ftp://", 6)) + return(1); + return(0); +} + +/** + * xmlIOFTPOpen: + * @filename: the URI for matching + * + * open an FTP I/O channel + * + * Returns an I/O context or NULL in case of error + */ +void * +xmlIOFTPOpen (const char *filename) { + return(xmlNanoFTPOpen(filename)); +} + +/** + * xmlIOFTPRead: + * @context: the I/O context + * @buffer: where to drop data + * @len: number of bytes to write + * + * Read @len bytes to @buffer from the I/O channel. + * + * Returns the number of bytes written + */ +int +xmlIOFTPRead(void * context, char * buffer, int len) { + if ((buffer == NULL) || (len < 0)) return(-1); + return(xmlNanoFTPRead(context, &buffer[0], len)); +} + +/** + * xmlIOFTPClose: + * @context: the I/O context + * + * Close an FTP I/O channel + * + * Returns 0 + */ +int +xmlIOFTPClose (void * context) { + return ( xmlNanoFTPClose(context) ); +} +#endif /* LIBXML_FTP_ENABLED */ + + +/** + * xmlRegisterInputCallbacks: + * @matchFunc: the xmlInputMatchCallback + * @openFunc: the xmlInputOpenCallback + * @readFunc: the xmlInputReadCallback + * @closeFunc: the xmlInputCloseCallback + * + * Register a new set of I/O callback for handling parser input. + * + * Returns the registered handler number or -1 in case of error + */ +int +xmlRegisterInputCallbacks(xmlInputMatchCallback matchFunc, + xmlInputOpenCallback openFunc, xmlInputReadCallback readFunc, + xmlInputCloseCallback closeFunc) { + if (xmlInputCallbackNr >= MAX_INPUT_CALLBACK) { + return(-1); + } + xmlInputCallbackTable[xmlInputCallbackNr].matchcallback = matchFunc; + xmlInputCallbackTable[xmlInputCallbackNr].opencallback = openFunc; + xmlInputCallbackTable[xmlInputCallbackNr].readcallback = readFunc; + xmlInputCallbackTable[xmlInputCallbackNr].closecallback = closeFunc; + xmlInputCallbackInitialized = 1; + return(xmlInputCallbackNr++); +} + +#ifdef LIBXML_OUTPUT_ENABLED +/** + * xmlRegisterOutputCallbacks: + * @matchFunc: the xmlOutputMatchCallback + * @openFunc: the xmlOutputOpenCallback + * @writeFunc: the xmlOutputWriteCallback + * @closeFunc: the xmlOutputCloseCallback + * + * Register a new set of I/O callback for handling output. + * + * Returns the registered handler number or -1 in case of error + */ +int +xmlRegisterOutputCallbacks(xmlOutputMatchCallback matchFunc, + xmlOutputOpenCallback openFunc, xmlOutputWriteCallback writeFunc, + xmlOutputCloseCallback closeFunc) { + if (xmlOutputCallbackNr >= MAX_OUTPUT_CALLBACK) { + return(-1); + } + xmlOutputCallbackTable[xmlOutputCallbackNr].matchcallback = matchFunc; + xmlOutputCallbackTable[xmlOutputCallbackNr].opencallback = openFunc; + xmlOutputCallbackTable[xmlOutputCallbackNr].writecallback = writeFunc; + xmlOutputCallbackTable[xmlOutputCallbackNr].closecallback = closeFunc; + xmlOutputCallbackInitialized = 1; + return(xmlOutputCallbackNr++); +} +#endif /* LIBXML_OUTPUT_ENABLED */ + +/** + * xmlRegisterDefaultInputCallbacks: + * + * Registers the default compiled-in I/O handlers. + */ +void +xmlRegisterDefaultInputCallbacks(void) { + if (xmlInputCallbackInitialized) + return; + +#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) + xmlInitPlatformSpecificIo(); +#endif + + xmlRegisterInputCallbacks(xmlFileMatch, xmlFileOpen, + xmlFileRead, xmlFileClose); +#ifdef HAVE_ZLIB_H + xmlRegisterInputCallbacks(xmlGzfileMatch, xmlGzfileOpen, + xmlGzfileRead, xmlGzfileClose); +#endif /* HAVE_ZLIB_H */ +#ifdef HAVE_LZMA_H + xmlRegisterInputCallbacks(xmlXzfileMatch, xmlXzfileOpen, + xmlXzfileRead, xmlXzfileClose); +#endif /* HAVE_ZLIB_H */ + +#ifdef LIBXML_HTTP_ENABLED + xmlRegisterInputCallbacks(xmlIOHTTPMatch, xmlIOHTTPOpen, + xmlIOHTTPRead, xmlIOHTTPClose); +#endif /* LIBXML_HTTP_ENABLED */ + +#ifdef LIBXML_FTP_ENABLED + xmlRegisterInputCallbacks(xmlIOFTPMatch, xmlIOFTPOpen, + xmlIOFTPRead, xmlIOFTPClose); +#endif /* LIBXML_FTP_ENABLED */ + xmlInputCallbackInitialized = 1; +} + +#ifdef LIBXML_OUTPUT_ENABLED +/** + * xmlRegisterDefaultOutputCallbacks: + * + * Registers the default compiled-in I/O handlers. + */ +void +xmlRegisterDefaultOutputCallbacks (void) { + if (xmlOutputCallbackInitialized) + return; + +#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) + xmlInitPlatformSpecificIo(); +#endif + + xmlRegisterOutputCallbacks(xmlFileMatch, xmlFileOpenW, + xmlFileWrite, xmlFileClose); + +#ifdef LIBXML_HTTP_ENABLED + xmlRegisterOutputCallbacks(xmlIOHTTPMatch, xmlIOHTTPDfltOpenW, + xmlIOHTTPWrite, xmlIOHTTPClosePut); +#endif + +/********************************* + No way a-priori to distinguish between gzipped files from + uncompressed ones except opening if existing then closing + and saving with same compression ratio ... a pain. + +#ifdef HAVE_ZLIB_H + xmlRegisterOutputCallbacks(xmlGzfileMatch, xmlGzfileOpen, + xmlGzfileWrite, xmlGzfileClose); +#endif + + Nor FTP PUT .... +#ifdef LIBXML_FTP_ENABLED + xmlRegisterOutputCallbacks(xmlIOFTPMatch, xmlIOFTPOpen, + xmlIOFTPWrite, xmlIOFTPClose); +#endif + **********************************/ + xmlOutputCallbackInitialized = 1; +} + +#ifdef LIBXML_HTTP_ENABLED +/** + * xmlRegisterHTTPPostCallbacks: + * + * By default, libxml submits HTTP output requests using the "PUT" method. + * Calling this method changes the HTTP output method to use the "POST" + * method instead. + * + */ +void +xmlRegisterHTTPPostCallbacks( void ) { + + /* Register defaults if not done previously */ + + if ( xmlOutputCallbackInitialized == 0 ) + xmlRegisterDefaultOutputCallbacks( ); + + xmlRegisterOutputCallbacks(xmlIOHTTPMatch, xmlIOHTTPDfltOpenW, + xmlIOHTTPWrite, xmlIOHTTPClosePost); + return; +} +#endif +#endif /* LIBXML_OUTPUT_ENABLED */ + +/** + * xmlAllocParserInputBuffer: + * @enc: the charset encoding if known + * + * Create a buffered parser input for progressive parsing + * + * Returns the new parser input or NULL + */ +xmlParserInputBufferPtr +xmlAllocParserInputBuffer(xmlCharEncoding enc) { + xmlParserInputBufferPtr ret; + + ret = (xmlParserInputBufferPtr) xmlMalloc(sizeof(xmlParserInputBuffer)); + if (ret == NULL) { + xmlIOErrMemory("creating input buffer"); + return(NULL); + } + memset(ret, 0, (size_t) sizeof(xmlParserInputBuffer)); + ret->buffer = xmlBufCreateSize(2 * xmlDefaultBufferSize); + if (ret->buffer == NULL) { + xmlFree(ret); + return(NULL); + } + xmlBufSetAllocationScheme(ret->buffer, XML_BUFFER_ALLOC_DOUBLEIT); + ret->encoder = xmlGetCharEncodingHandler(enc); + if (ret->encoder != NULL) + ret->raw = xmlBufCreateSize(2 * xmlDefaultBufferSize); + else + ret->raw = NULL; + ret->readcallback = NULL; + ret->closecallback = NULL; + ret->context = NULL; + ret->compressed = -1; + ret->rawconsumed = 0; + + return(ret); +} + +#ifdef LIBXML_OUTPUT_ENABLED +/** + * xmlAllocOutputBuffer: + * @encoder: the encoding converter or NULL + * + * Create a buffered parser output + * + * Returns the new parser output or NULL + */ +xmlOutputBufferPtr +xmlAllocOutputBuffer(xmlCharEncodingHandlerPtr encoder) { + xmlOutputBufferPtr ret; + + ret = (xmlOutputBufferPtr) xmlMalloc(sizeof(xmlOutputBuffer)); + if (ret == NULL) { + xmlIOErrMemory("creating output buffer"); + return(NULL); + } + memset(ret, 0, (size_t) sizeof(xmlOutputBuffer)); + ret->buffer = xmlBufCreate(); + if (ret->buffer == NULL) { + xmlFree(ret); + return(NULL); + } + + /* try to avoid a performance problem with Windows realloc() */ + if (xmlBufGetAllocationScheme(ret->buffer) == XML_BUFFER_ALLOC_EXACT) + xmlBufSetAllocationScheme(ret->buffer, XML_BUFFER_ALLOC_DOUBLEIT); + + ret->encoder = encoder; + if (encoder != NULL) { + ret->conv = xmlBufCreateSize(4000); + if (ret->conv == NULL) { + xmlFree(ret); + return(NULL); + } + + /* + * This call is designed to initiate the encoder state + */ + xmlCharEncOutput(ret, 1); + } else + ret->conv = NULL; + ret->writecallback = NULL; + ret->closecallback = NULL; + ret->context = NULL; + ret->written = 0; + + return(ret); +} + +/** + * xmlAllocOutputBufferInternal: + * @encoder: the encoding converter or NULL + * + * Create a buffered parser output + * + * Returns the new parser output or NULL + */ +xmlOutputBufferPtr +xmlAllocOutputBufferInternal(xmlCharEncodingHandlerPtr encoder) { + xmlOutputBufferPtr ret; + + ret = (xmlOutputBufferPtr) xmlMalloc(sizeof(xmlOutputBuffer)); + if (ret == NULL) { + xmlIOErrMemory("creating output buffer"); + return(NULL); + } + memset(ret, 0, (size_t) sizeof(xmlOutputBuffer)); + ret->buffer = xmlBufCreate(); + if (ret->buffer == NULL) { + xmlFree(ret); + return(NULL); + } + + + /* + * For conversion buffers we use the special IO handling + */ + xmlBufSetAllocationScheme(ret->buffer, XML_BUFFER_ALLOC_IO); + + ret->encoder = encoder; + if (encoder != NULL) { + ret->conv = xmlBufCreateSize(4000); + if (ret->conv == NULL) { + xmlFree(ret); + return(NULL); + } + + /* + * This call is designed to initiate the encoder state + */ + xmlCharEncOutput(ret, 1); + } else + ret->conv = NULL; + ret->writecallback = NULL; + ret->closecallback = NULL; + ret->context = NULL; + ret->written = 0; + + return(ret); +} + +#endif /* LIBXML_OUTPUT_ENABLED */ + +/** + * xmlFreeParserInputBuffer: + * @in: a buffered parser input + * + * Free up the memory used by a buffered parser input + */ +void +xmlFreeParserInputBuffer(xmlParserInputBufferPtr in) { + if (in == NULL) return; + + if (in->raw) { + xmlBufFree(in->raw); + in->raw = NULL; + } + if (in->encoder != NULL) { + xmlCharEncCloseFunc(in->encoder); + } + if (in->closecallback != NULL) { + in->closecallback(in->context); + } + if (in->buffer != NULL) { + xmlBufFree(in->buffer); + in->buffer = NULL; + } + + xmlFree(in); +} + +#ifdef LIBXML_OUTPUT_ENABLED +/** + * xmlOutputBufferClose: + * @out: a buffered output + * + * flushes and close the output I/O channel + * and free up all the associated resources + * + * Returns the number of byte written or -1 in case of error. + */ +int +xmlOutputBufferClose(xmlOutputBufferPtr out) +{ + int written; + int err_rc = 0; + + if (out == NULL) + return (-1); + if (out->writecallback != NULL) + xmlOutputBufferFlush(out); + if (out->closecallback != NULL) { + err_rc = out->closecallback(out->context); + } + written = out->written; + if (out->conv) { + xmlBufFree(out->conv); + out->conv = NULL; + } + if (out->encoder != NULL) { + xmlCharEncCloseFunc(out->encoder); + } + if (out->buffer != NULL) { + xmlBufFree(out->buffer); + out->buffer = NULL; + } + + if (out->error) + err_rc = -1; + xmlFree(out); + return ((err_rc == 0) ? written : err_rc); +} +#endif /* LIBXML_OUTPUT_ENABLED */ + +xmlParserInputBufferPtr +__xmlParserInputBufferCreateFilename(const char *URI, xmlCharEncoding enc) { + xmlParserInputBufferPtr ret; + int i = 0; + void *context = NULL; + + if (xmlInputCallbackInitialized == 0) + xmlRegisterDefaultInputCallbacks(); + + if (URI == NULL) return(NULL); + + /* + * Try to find one of the input accept method accepting that scheme + * Go in reverse to give precedence to user defined handlers. + */ + if (context == NULL) { + for (i = xmlInputCallbackNr - 1;i >= 0;i--) { + if ((xmlInputCallbackTable[i].matchcallback != NULL) && + (xmlInputCallbackTable[i].matchcallback(URI) != 0)) { + context = xmlInputCallbackTable[i].opencallback(URI); + if (context != NULL) { + break; + } + } + } + } + if (context == NULL) { + return(NULL); + } + + /* + * Allocate the Input buffer front-end. + */ + ret = xmlAllocParserInputBuffer(enc); + if (ret != NULL) { + ret->context = context; + ret->readcallback = xmlInputCallbackTable[i].readcallback; + ret->closecallback = xmlInputCallbackTable[i].closecallback; +#ifdef HAVE_ZLIB_H + if ((xmlInputCallbackTable[i].opencallback == xmlGzfileOpen) && + (strcmp(URI, "-") != 0)) { +#if defined(ZLIB_VERNUM) && ZLIB_VERNUM >= 0x1230 + ret->compressed = !gzdirect(context); +#else + if (((z_stream *)context)->avail_in > 4) { + char *cptr, buff4[4]; + cptr = (char *) ((z_stream *)context)->next_in; + if (gzread(context, buff4, 4) == 4) { + if (strncmp(buff4, cptr, 4) == 0) + ret->compressed = 0; + else + ret->compressed = 1; + gzrewind(context); + } + } +#endif + } +#endif + } + else + xmlInputCallbackTable[i].closecallback (context); + + return(ret); +} + +/** + * xmlParserInputBufferCreateFilename: + * @URI: a C string containing the URI or filename + * @enc: the charset encoding if known + * + * Create a buffered parser input for the progressive parsing of a file + * If filename is "-' then we use stdin as the input. + * Automatic support for ZLIB/Compress compressed document is provided + * by default if found at compile-time. + * Do an encoding check if enc == XML_CHAR_ENCODING_NONE + * + * Returns the new parser input or NULL + */ +xmlParserInputBufferPtr +xmlParserInputBufferCreateFilename(const char *URI, xmlCharEncoding enc) { + if ((xmlParserInputBufferCreateFilenameValue)) { + return xmlParserInputBufferCreateFilenameValue(URI, enc); + } + return __xmlParserInputBufferCreateFilename(URI, enc); +} + +#ifdef LIBXML_OUTPUT_ENABLED +xmlOutputBufferPtr +__xmlOutputBufferCreateFilename(const char *URI, + xmlCharEncodingHandlerPtr encoder, + int compression ATTRIBUTE_UNUSED) { + xmlOutputBufferPtr ret; + xmlURIPtr puri; + int i = 0; + void *context = NULL; + char *unescaped = NULL; +#ifdef HAVE_ZLIB_H + int is_file_uri = 1; +#endif + + if (xmlOutputCallbackInitialized == 0) + xmlRegisterDefaultOutputCallbacks(); + + if (URI == NULL) return(NULL); + + puri = xmlParseURI(URI); + if (puri != NULL) { +#ifdef HAVE_ZLIB_H + if ((puri->scheme != NULL) && + (!xmlStrEqual(BAD_CAST puri->scheme, BAD_CAST "file"))) + is_file_uri = 0; +#endif + /* + * try to limit the damages of the URI unescaping code. + */ + if ((puri->scheme == NULL) || + (xmlStrEqual(BAD_CAST puri->scheme, BAD_CAST "file"))) + unescaped = xmlURIUnescapeString(URI, 0, NULL); + xmlFreeURI(puri); + } + + /* + * Try to find one of the output accept method accepting that scheme + * Go in reverse to give precedence to user defined handlers. + * try with an unescaped version of the URI + */ + if (unescaped != NULL) { +#ifdef HAVE_ZLIB_H + if ((compression > 0) && (compression <= 9) && (is_file_uri == 1)) { + context = xmlGzfileOpenW(unescaped, compression); + if (context != NULL) { + ret = xmlAllocOutputBufferInternal(encoder); + if (ret != NULL) { + ret->context = context; + ret->writecallback = xmlGzfileWrite; + ret->closecallback = xmlGzfileClose; + } + xmlFree(unescaped); + return(ret); + } + } +#endif + for (i = xmlOutputCallbackNr - 1;i >= 0;i--) { + if ((xmlOutputCallbackTable[i].matchcallback != NULL) && + (xmlOutputCallbackTable[i].matchcallback(unescaped) != 0)) { +#if defined(LIBXML_HTTP_ENABLED) && defined(HAVE_ZLIB_H) + /* Need to pass compression parameter into HTTP open calls */ + if (xmlOutputCallbackTable[i].matchcallback == xmlIOHTTPMatch) + context = xmlIOHTTPOpenW(unescaped, compression); + else +#endif + context = xmlOutputCallbackTable[i].opencallback(unescaped); + if (context != NULL) + break; + } + } + xmlFree(unescaped); + } + + /* + * If this failed try with a non-escaped URI this may be a strange + * filename + */ + if (context == NULL) { +#ifdef HAVE_ZLIB_H + if ((compression > 0) && (compression <= 9) && (is_file_uri == 1)) { + context = xmlGzfileOpenW(URI, compression); + if (context != NULL) { + ret = xmlAllocOutputBufferInternal(encoder); + if (ret != NULL) { + ret->context = context; + ret->writecallback = xmlGzfileWrite; + ret->closecallback = xmlGzfileClose; + } + return(ret); + } + } +#endif + for (i = xmlOutputCallbackNr - 1;i >= 0;i--) { + if ((xmlOutputCallbackTable[i].matchcallback != NULL) && + (xmlOutputCallbackTable[i].matchcallback(URI) != 0)) { +#if defined(LIBXML_HTTP_ENABLED) && defined(HAVE_ZLIB_H) + /* Need to pass compression parameter into HTTP open calls */ + if (xmlOutputCallbackTable[i].matchcallback == xmlIOHTTPMatch) + context = xmlIOHTTPOpenW(URI, compression); + else +#endif + context = xmlOutputCallbackTable[i].opencallback(URI); + if (context != NULL) + break; + } + } + } + + if (context == NULL) { + return(NULL); + } + + /* + * Allocate the Output buffer front-end. + */ + ret = xmlAllocOutputBufferInternal(encoder); + if (ret != NULL) { + ret->context = context; + ret->writecallback = xmlOutputCallbackTable[i].writecallback; + ret->closecallback = xmlOutputCallbackTable[i].closecallback; + } + return(ret); +} + +/** + * xmlOutputBufferCreateFilename: + * @URI: a C string containing the URI or filename + * @encoder: the encoding converter or NULL + * @compression: the compression ration (0 none, 9 max). + * + * Create a buffered output for the progressive saving of a file + * If filename is "-' then we use stdout as the output. + * Automatic support for ZLIB/Compress compressed document is provided + * by default if found at compile-time. + * TODO: currently if compression is set, the library only support + * writing to a local file. + * + * Returns the new output or NULL + */ +xmlOutputBufferPtr +xmlOutputBufferCreateFilename(const char *URI, + xmlCharEncodingHandlerPtr encoder, + int compression ATTRIBUTE_UNUSED) { + if ((xmlOutputBufferCreateFilenameValue)) { + return xmlOutputBufferCreateFilenameValue(URI, encoder, compression); + } + return __xmlOutputBufferCreateFilename(URI, encoder, compression); +} +#endif /* LIBXML_OUTPUT_ENABLED */ + +/** + * xmlParserInputBufferCreateFile: + * @file: a FILE* + * @enc: the charset encoding if known + * + * Create a buffered parser input for the progressive parsing of a FILE * + * buffered C I/O + * + * Returns the new parser input or NULL + */ +xmlParserInputBufferPtr +xmlParserInputBufferCreateFile(FILE *file, xmlCharEncoding enc) { + xmlParserInputBufferPtr ret; + + if (xmlInputCallbackInitialized == 0) + xmlRegisterDefaultInputCallbacks(); + + if (file == NULL) return(NULL); + + ret = xmlAllocParserInputBuffer(enc); + if (ret != NULL) { + ret->context = file; + ret->readcallback = xmlFileRead; + ret->closecallback = xmlFileFlush; + } + + return(ret); +} + +#ifdef LIBXML_OUTPUT_ENABLED +/** + * xmlOutputBufferCreateFile: + * @file: a FILE* + * @encoder: the encoding converter or NULL + * + * Create a buffered output for the progressive saving to a FILE * + * buffered C I/O + * + * Returns the new parser output or NULL + */ +xmlOutputBufferPtr +xmlOutputBufferCreateFile(FILE *file, xmlCharEncodingHandlerPtr encoder) { + xmlOutputBufferPtr ret; + + if (xmlOutputCallbackInitialized == 0) + xmlRegisterDefaultOutputCallbacks(); + + if (file == NULL) return(NULL); + + ret = xmlAllocOutputBufferInternal(encoder); + if (ret != NULL) { + ret->context = file; + ret->writecallback = xmlFileWrite; + ret->closecallback = xmlFileFlush; + } + + return(ret); +} + +/** + * xmlOutputBufferCreateBuffer: + * @buffer: a xmlBufferPtr + * @encoder: the encoding converter or NULL + * + * Create a buffered output for the progressive saving to a xmlBuffer + * + * Returns the new parser output or NULL + */ +xmlOutputBufferPtr +xmlOutputBufferCreateBuffer(xmlBufferPtr buffer, + xmlCharEncodingHandlerPtr encoder) { + xmlOutputBufferPtr ret; + + if (buffer == NULL) return(NULL); + + ret = xmlOutputBufferCreateIO((xmlOutputWriteCallback) + xmlBufferWrite, + (xmlOutputCloseCallback) + NULL, (void *) buffer, encoder); + + return(ret); +} + +/** + * xmlOutputBufferGetContent: + * @out: an xmlOutputBufferPtr + * + * Gives a pointer to the data currently held in the output buffer + * + * Returns a pointer to the data or NULL in case of error + */ +const xmlChar * +xmlOutputBufferGetContent(xmlOutputBufferPtr out) { + if ((out == NULL) || (out->buffer == NULL)) + return(NULL); + + return(xmlBufContent(out->buffer)); +} + +/** + * xmlOutputBufferGetSize: + * @out: an xmlOutputBufferPtr + * + * Gives the length of the data currently held in the output buffer + * + * Returns 0 in case or error or no data is held, the size otherwise + */ +size_t +xmlOutputBufferGetSize(xmlOutputBufferPtr out) { + if ((out == NULL) || (out->buffer == NULL)) + return(0); + + return(xmlBufUse(out->buffer)); +} + + +#endif /* LIBXML_OUTPUT_ENABLED */ + +/** + * xmlParserInputBufferCreateFd: + * @fd: a file descriptor number + * @enc: the charset encoding if known + * + * Create a buffered parser input for the progressive parsing for the input + * from a file descriptor + * + * Returns the new parser input or NULL + */ +xmlParserInputBufferPtr +xmlParserInputBufferCreateFd(int fd, xmlCharEncoding enc) { + xmlParserInputBufferPtr ret; + + if (fd < 0) return(NULL); + + ret = xmlAllocParserInputBuffer(enc); + if (ret != NULL) { + ret->context = (void *) (long) fd; + ret->readcallback = xmlFdRead; + ret->closecallback = xmlFdClose; + } + + return(ret); +} + +/** + * xmlParserInputBufferCreateMem: + * @mem: the memory input + * @size: the length of the memory block + * @enc: the charset encoding if known + * + * Create a buffered parser input for the progressive parsing for the input + * from a memory area. + * + * Returns the new parser input or NULL + */ +xmlParserInputBufferPtr +xmlParserInputBufferCreateMem(const char *mem, int size, xmlCharEncoding enc) { + xmlParserInputBufferPtr ret; + int errcode; + + if (size <= 0) return(NULL); + if (mem == NULL) return(NULL); + + ret = xmlAllocParserInputBuffer(enc); + if (ret != NULL) { + ret->context = (void *) mem; + ret->readcallback = (xmlInputReadCallback) xmlNop; + ret->closecallback = NULL; + errcode = xmlBufAdd(ret->buffer, (const xmlChar *) mem, size); + if (errcode != 0) { + xmlFree(ret); + return(NULL); + } + } + + return(ret); +} + +/** + * xmlParserInputBufferCreateStatic: + * @mem: the memory input + * @size: the length of the memory block + * @enc: the charset encoding if known + * + * Create a buffered parser input for the progressive parsing for the input + * from an immutable memory area. This will not copy the memory area to + * the buffer, but the memory is expected to be available until the end of + * the parsing, this is useful for example when using mmap'ed file. + * + * Returns the new parser input or NULL + */ +xmlParserInputBufferPtr +xmlParserInputBufferCreateStatic(const char *mem, int size, + xmlCharEncoding enc) { + xmlParserInputBufferPtr ret; + + if (size <= 0) return(NULL); + if (mem == NULL) return(NULL); + + ret = (xmlParserInputBufferPtr) xmlMalloc(sizeof(xmlParserInputBuffer)); + if (ret == NULL) { + xmlIOErrMemory("creating input buffer"); + return(NULL); + } + memset(ret, 0, (size_t) sizeof(xmlParserInputBuffer)); + ret->buffer = xmlBufCreateStatic((void *)mem, (size_t) size); + if (ret->buffer == NULL) { + xmlFree(ret); + return(NULL); + } + ret->encoder = xmlGetCharEncodingHandler(enc); + if (ret->encoder != NULL) + ret->raw = xmlBufCreateSize(2 * xmlDefaultBufferSize); + else + ret->raw = NULL; + ret->compressed = -1; + ret->context = (void *) mem; + ret->readcallback = NULL; + ret->closecallback = NULL; + + return(ret); +} + +#ifdef LIBXML_OUTPUT_ENABLED +/** + * xmlOutputBufferCreateFd: + * @fd: a file descriptor number + * @encoder: the encoding converter or NULL + * + * Create a buffered output for the progressive saving + * to a file descriptor + * + * Returns the new parser output or NULL + */ +xmlOutputBufferPtr +xmlOutputBufferCreateFd(int fd, xmlCharEncodingHandlerPtr encoder) { + xmlOutputBufferPtr ret; + + if (fd < 0) return(NULL); + + ret = xmlAllocOutputBufferInternal(encoder); + if (ret != NULL) { + ret->context = (void *) (long) fd; + ret->writecallback = xmlFdWrite; + ret->closecallback = NULL; + } + + return(ret); +} +#endif /* LIBXML_OUTPUT_ENABLED */ + +/** + * xmlParserInputBufferCreateIO: + * @ioread: an I/O read function + * @ioclose: an I/O close function + * @ioctx: an I/O handler + * @enc: the charset encoding if known + * + * Create a buffered parser input for the progressive parsing for the input + * from an I/O handler + * + * Returns the new parser input or NULL + */ +xmlParserInputBufferPtr +xmlParserInputBufferCreateIO(xmlInputReadCallback ioread, + xmlInputCloseCallback ioclose, void *ioctx, xmlCharEncoding enc) { + xmlParserInputBufferPtr ret; + + if (ioread == NULL) return(NULL); + + ret = xmlAllocParserInputBuffer(enc); + if (ret != NULL) { + ret->context = (void *) ioctx; + ret->readcallback = ioread; + ret->closecallback = ioclose; + } + + return(ret); +} + +#ifdef LIBXML_OUTPUT_ENABLED +/** + * xmlOutputBufferCreateIO: + * @iowrite: an I/O write function + * @ioclose: an I/O close function + * @ioctx: an I/O handler + * @encoder: the charset encoding if known + * + * Create a buffered output for the progressive saving + * to an I/O handler + * + * Returns the new parser output or NULL + */ +xmlOutputBufferPtr +xmlOutputBufferCreateIO(xmlOutputWriteCallback iowrite, + xmlOutputCloseCallback ioclose, void *ioctx, + xmlCharEncodingHandlerPtr encoder) { + xmlOutputBufferPtr ret; + + if (iowrite == NULL) return(NULL); + + ret = xmlAllocOutputBufferInternal(encoder); + if (ret != NULL) { + ret->context = (void *) ioctx; + ret->writecallback = iowrite; + ret->closecallback = ioclose; + } + + return(ret); +} +#endif /* LIBXML_OUTPUT_ENABLED */ + +/** + * xmlParserInputBufferCreateFilenameDefault: + * @func: function pointer to the new ParserInputBufferCreateFilenameFunc + * + * Registers a callback for URI input file handling + * + * Returns the old value of the registration function + */ +xmlParserInputBufferCreateFilenameFunc +xmlParserInputBufferCreateFilenameDefault(xmlParserInputBufferCreateFilenameFunc func) +{ + xmlParserInputBufferCreateFilenameFunc old = xmlParserInputBufferCreateFilenameValue; + if (old == NULL) { + old = __xmlParserInputBufferCreateFilename; + } + + xmlParserInputBufferCreateFilenameValue = func; + return(old); +} + +/** + * xmlOutputBufferCreateFilenameDefault: + * @func: function pointer to the new OutputBufferCreateFilenameFunc + * + * Registers a callback for URI output file handling + * + * Returns the old value of the registration function + */ +xmlOutputBufferCreateFilenameFunc +xmlOutputBufferCreateFilenameDefault(xmlOutputBufferCreateFilenameFunc func) +{ + xmlOutputBufferCreateFilenameFunc old = xmlOutputBufferCreateFilenameValue; +#ifdef LIBXML_OUTPUT_ENABLED + if (old == NULL) { + old = __xmlOutputBufferCreateFilename; + } +#endif + xmlOutputBufferCreateFilenameValue = func; + return(old); +} + +/** + * xmlParserInputBufferPush: + * @in: a buffered parser input + * @len: the size in bytes of the array. + * @buf: an char array + * + * Push the content of the arry in the input buffer + * This routine handle the I18N transcoding to internal UTF-8 + * This is used when operating the parser in progressive (push) mode. + * + * Returns the number of chars read and stored in the buffer, or -1 + * in case of error. + */ +int +xmlParserInputBufferPush(xmlParserInputBufferPtr in, + int len, const char *buf) { + int nbchars = 0; + int ret; + + if (len < 0) return(0); + if ((in == NULL) || (in->error)) return(-1); + if (in->encoder != NULL) { + unsigned int use; + + /* + * Store the data in the incoming raw buffer + */ + if (in->raw == NULL) { + in->raw = xmlBufCreate(); + } + ret = xmlBufAdd(in->raw, (const xmlChar *) buf, len); + if (ret != 0) + return(-1); + + /* + * convert as much as possible to the parser reading buffer. + */ + use = xmlBufUse(in->raw); + nbchars = xmlCharEncInput(in, 1); + if (nbchars < 0) { + xmlIOErr(XML_IO_ENCODER, NULL); + in->error = XML_IO_ENCODER; + return(-1); + } + in->rawconsumed += (use - xmlBufUse(in->raw)); + } else { + nbchars = len; + ret = xmlBufAdd(in->buffer, (xmlChar *) buf, nbchars); + if (ret != 0) + return(-1); + } +#ifdef DEBUG_INPUT + xmlGenericError(xmlGenericErrorContext, + "I/O: pushed %d chars, buffer %d/%d\n", + nbchars, xmlBufUse(in->buffer), xmlBufLength(in->buffer)); +#endif + return(nbchars); +} + +/** + * endOfInput: + * + * When reading from an Input channel indicated end of file or error + * don't reread from it again. + */ +static int +endOfInput (void * context ATTRIBUTE_UNUSED, + char * buffer ATTRIBUTE_UNUSED, + int len ATTRIBUTE_UNUSED) { + return(0); +} + +/** + * xmlParserInputBufferGrow: + * @in: a buffered parser input + * @len: indicative value of the amount of chars to read + * + * Grow up the content of the input buffer, the old data are preserved + * This routine handle the I18N transcoding to internal UTF-8 + * This routine is used when operating the parser in normal (pull) mode + * + * TODO: one should be able to remove one extra copy by copying directly + * onto in->buffer or in->raw + * + * Returns the number of chars read and stored in the buffer, or -1 + * in case of error. + */ +int +xmlParserInputBufferGrow(xmlParserInputBufferPtr in, int len) { + char *buffer = NULL; + int res = 0; + int nbchars = 0; + + if ((in == NULL) || (in->error)) return(-1); + if ((len <= MINLEN) && (len != 4)) + len = MINLEN; + + if (xmlBufAvail(in->buffer) <= 0) { + xmlIOErr(XML_IO_BUFFER_FULL, NULL); + in->error = XML_IO_BUFFER_FULL; + return(-1); + } + + if (xmlBufGrow(in->buffer, len + 1) < 0) { + xmlIOErrMemory("growing input buffer"); + in->error = XML_ERR_NO_MEMORY; + return(-1); + } + buffer = (char *)xmlBufEnd(in->buffer); + + /* + * Call the read method for this I/O type. + */ + if (in->readcallback != NULL) { + res = in->readcallback(in->context, &buffer[0], len); + if (res <= 0) + in->readcallback = endOfInput; + } else { + xmlIOErr(XML_IO_NO_INPUT, NULL); + in->error = XML_IO_NO_INPUT; + return(-1); + } + if (res < 0) { + return(-1); + } + len = res; + if (in->encoder != NULL) { + unsigned int use; + + /* + * Store the data in the incoming raw buffer + */ + if (in->raw == NULL) { + in->raw = xmlBufCreate(); + } + res = xmlBufAdd(in->raw, (const xmlChar *) buffer, len); + if (res != 0) + return(-1); + + /* + * convert as much as possible to the parser reading buffer. + */ + use = xmlBufUse(in->raw); + nbchars = xmlCharEncInput(in, 1); + if (nbchars < 0) { + xmlIOErr(XML_IO_ENCODER, NULL); + in->error = XML_IO_ENCODER; + return(-1); + } + in->rawconsumed += (use - xmlBufUse(in->raw)); + } else { + nbchars = len; + xmlBufAddLen(in->buffer, nbchars); + } +#ifdef DEBUG_INPUT + xmlGenericError(xmlGenericErrorContext, + "I/O: read %d chars, buffer %d\n", + nbchars, xmlBufUse(in->buffer)); +#endif + return(nbchars); +} + +/** + * xmlParserInputBufferRead: + * @in: a buffered parser input + * @len: indicative value of the amount of chars to read + * + * Refresh the content of the input buffer, the old data are considered + * consumed + * This routine handle the I18N transcoding to internal UTF-8 + * + * Returns the number of chars read and stored in the buffer, or -1 + * in case of error. + */ +int +xmlParserInputBufferRead(xmlParserInputBufferPtr in, int len) { + if ((in == NULL) || (in->error)) return(-1); + if (in->readcallback != NULL) + return(xmlParserInputBufferGrow(in, len)); + else if (xmlBufGetAllocationScheme(in->buffer) == XML_BUFFER_ALLOC_IMMUTABLE) + return(0); + else + return(-1); +} + +#ifdef LIBXML_OUTPUT_ENABLED +/** + * xmlOutputBufferWrite: + * @out: a buffered parser output + * @len: the size in bytes of the array. + * @buf: an char array + * + * Write the content of the array in the output I/O buffer + * This routine handle the I18N transcoding from internal UTF-8 + * The buffer is lossless, i.e. will store in case of partial + * or delayed writes. + * + * Returns the number of chars immediately written, or -1 + * in case of error. + */ +int +xmlOutputBufferWrite(xmlOutputBufferPtr out, int len, const char *buf) { + int nbchars = 0; /* number of chars to output to I/O */ + int ret; /* return from function call */ + int written = 0; /* number of char written to I/O so far */ + int chunk; /* number of byte curreent processed from buf */ + + if ((out == NULL) || (out->error)) return(-1); + if (len < 0) return(0); + if (out->error) return(-1); + + do { + chunk = len; + if (chunk > 4 * MINLEN) + chunk = 4 * MINLEN; + + /* + * first handle encoding stuff. + */ + if (out->encoder != NULL) { + /* + * Store the data in the incoming raw buffer + */ + if (out->conv == NULL) { + out->conv = xmlBufCreate(); + } + ret = xmlBufAdd(out->buffer, (const xmlChar *) buf, chunk); + if (ret != 0) + return(-1); + + if ((xmlBufUse(out->buffer) < MINLEN) && (chunk == len)) + goto done; + + /* + * convert as much as possible to the parser reading buffer. + */ + ret = xmlCharEncOutput(out, 0); + if ((ret < 0) && (ret != -3)) { + xmlIOErr(XML_IO_ENCODER, NULL); + out->error = XML_IO_ENCODER; + return(-1); + } + nbchars = xmlBufUse(out->conv); + } else { + ret = xmlBufAdd(out->buffer, (const xmlChar *) buf, chunk); + if (ret != 0) + return(-1); + nbchars = xmlBufUse(out->buffer); + } + buf += chunk; + len -= chunk; + + if ((nbchars < MINLEN) && (len <= 0)) + goto done; + + if (out->writecallback) { + /* + * second write the stuff to the I/O channel + */ + if (out->encoder != NULL) { + ret = out->writecallback(out->context, + (const char *)xmlBufContent(out->conv), nbchars); + if (ret >= 0) + xmlBufShrink(out->conv, ret); + } else { + ret = out->writecallback(out->context, + (const char *)xmlBufContent(out->buffer), nbchars); + if (ret >= 0) + xmlBufShrink(out->buffer, ret); + } + if (ret < 0) { + xmlIOErr(XML_IO_WRITE, NULL); + out->error = XML_IO_WRITE; + return(ret); + } + out->written += ret; + } + written += nbchars; + } while (len > 0); + +done: +#ifdef DEBUG_INPUT + xmlGenericError(xmlGenericErrorContext, + "I/O: wrote %d chars\n", written); +#endif + return(written); +} + +/** + * xmlEscapeContent: + * @out: a pointer to an array of bytes to store the result + * @outlen: the length of @out + * @in: a pointer to an array of unescaped UTF-8 bytes + * @inlen: the length of @in + * + * Take a block of UTF-8 chars in and escape them. + * Returns 0 if success, or -1 otherwise + * The value of @inlen after return is the number of octets consumed + * if the return value is positive, else unpredictable. + * The value of @outlen after return is the number of octets consumed. + */ +static int +xmlEscapeContent(unsigned char* out, int *outlen, + const xmlChar* in, int *inlen) { + unsigned char* outstart = out; + const unsigned char* base = in; + unsigned char* outend = out + *outlen; + const unsigned char* inend; + + inend = in + (*inlen); + + while ((in < inend) && (out < outend)) { + if (*in == '<') { + if (outend - out < 4) break; + *out++ = '&'; + *out++ = 'l'; + *out++ = 't'; + *out++ = ';'; + } else if (*in == '>') { + if (outend - out < 4) break; + *out++ = '&'; + *out++ = 'g'; + *out++ = 't'; + *out++ = ';'; + } else if (*in == '&') { + if (outend - out < 5) break; + *out++ = '&'; + *out++ = 'a'; + *out++ = 'm'; + *out++ = 'p'; + *out++ = ';'; + } else if (*in == '\r') { + if (outend - out < 5) break; + *out++ = '&'; + *out++ = '#'; + *out++ = '1'; + *out++ = '3'; + *out++ = ';'; + } else { + *out++ = (unsigned char) *in; + } + ++in; + } + *outlen = out - outstart; + *inlen = in - base; + return(0); +} + +/** + * xmlOutputBufferWriteEscape: + * @out: a buffered parser output + * @str: a zero terminated UTF-8 string + * @escaping: an optional escaping function (or NULL) + * + * Write the content of the string in the output I/O buffer + * This routine escapes the caracters and then handle the I18N + * transcoding from internal UTF-8 + * The buffer is lossless, i.e. will store in case of partial + * or delayed writes. + * + * Returns the number of chars immediately written, or -1 + * in case of error. + */ +int +xmlOutputBufferWriteEscape(xmlOutputBufferPtr out, const xmlChar *str, + xmlCharEncodingOutputFunc escaping) { + int nbchars = 0; /* number of chars to output to I/O */ + int ret; /* return from function call */ + int written = 0; /* number of char written to I/O so far */ + int oldwritten=0;/* loop guard */ + int chunk; /* number of byte currently processed from str */ + int len; /* number of bytes in str */ + int cons; /* byte from str consumed */ + + if ((out == NULL) || (out->error) || (str == NULL) || + (out->buffer == NULL) || + (xmlBufGetAllocationScheme(out->buffer) == XML_BUFFER_ALLOC_IMMUTABLE)) + return(-1); + len = strlen((const char *)str); + if (len < 0) return(0); + if (out->error) return(-1); + if (escaping == NULL) escaping = xmlEscapeContent; + + do { + oldwritten = written; + + /* + * how many bytes to consume and how many bytes to store. + */ + cons = len; + chunk = xmlBufAvail(out->buffer) - 1; + + /* + * make sure we have enough room to save first, if this is + * not the case force a flush, but make sure we stay in the loop + */ + if (chunk < 40) { + if (xmlBufGrow(out->buffer, 100) < 0) + return(-1); + oldwritten = -1; + continue; + } + + /* + * first handle encoding stuff. + */ + if (out->encoder != NULL) { + /* + * Store the data in the incoming raw buffer + */ + if (out->conv == NULL) { + out->conv = xmlBufCreate(); + } + ret = escaping(xmlBufEnd(out->buffer) , + &chunk, str, &cons); + if ((ret < 0) || (chunk == 0)) /* chunk==0 => nothing done */ + return(-1); + xmlBufAddLen(out->buffer, chunk); + + if ((xmlBufUse(out->buffer) < MINLEN) && (cons == len)) + goto done; + + /* + * convert as much as possible to the output buffer. + */ + ret = xmlCharEncOutput(out, 0); + if ((ret < 0) && (ret != -3)) { + xmlIOErr(XML_IO_ENCODER, NULL); + out->error = XML_IO_ENCODER; + return(-1); + } + nbchars = xmlBufUse(out->conv); + } else { + ret = escaping(xmlBufEnd(out->buffer), &chunk, str, &cons); + if ((ret < 0) || (chunk == 0)) /* chunk==0 => nothing done */ + return(-1); + xmlBufAddLen(out->buffer, chunk); + nbchars = xmlBufUse(out->buffer); + } + str += cons; + len -= cons; + + if ((nbchars < MINLEN) && (len <= 0)) + goto done; + + if (out->writecallback) { + /* + * second write the stuff to the I/O channel + */ + if (out->encoder != NULL) { + ret = out->writecallback(out->context, + (const char *)xmlBufContent(out->conv), nbchars); + if (ret >= 0) + xmlBufShrink(out->conv, ret); + } else { + ret = out->writecallback(out->context, + (const char *)xmlBufContent(out->buffer), nbchars); + if (ret >= 0) + xmlBufShrink(out->buffer, ret); + } + if (ret < 0) { + xmlIOErr(XML_IO_WRITE, NULL); + out->error = XML_IO_WRITE; + return(ret); + } + out->written += ret; + } else if (xmlBufAvail(out->buffer) < MINLEN) { + xmlBufGrow(out->buffer, MINLEN); + } + written += nbchars; + } while ((len > 0) && (oldwritten != written)); + +done: +#ifdef DEBUG_INPUT + xmlGenericError(xmlGenericErrorContext, + "I/O: wrote %d chars\n", written); +#endif + return(written); +} + +/** + * xmlOutputBufferWriteString: + * @out: a buffered parser output + * @str: a zero terminated C string + * + * Write the content of the string in the output I/O buffer + * This routine handle the I18N transcoding from internal UTF-8 + * The buffer is lossless, i.e. will store in case of partial + * or delayed writes. + * + * Returns the number of chars immediately written, or -1 + * in case of error. + */ +int +xmlOutputBufferWriteString(xmlOutputBufferPtr out, const char *str) { + int len; + + if ((out == NULL) || (out->error)) return(-1); + if (str == NULL) + return(-1); + len = strlen(str); + + if (len > 0) + return(xmlOutputBufferWrite(out, len, str)); + return(len); +} + +/** + * xmlOutputBufferFlush: + * @out: a buffered output + * + * flushes the output I/O channel + * + * Returns the number of byte written or -1 in case of error. + */ +int +xmlOutputBufferFlush(xmlOutputBufferPtr out) { + int nbchars = 0, ret = 0; + + if ((out == NULL) || (out->error)) return(-1); + /* + * first handle encoding stuff. + */ + if ((out->conv != NULL) && (out->encoder != NULL)) { + /* + * convert as much as possible to the parser output buffer. + */ + do { + nbchars = xmlCharEncOutput(out, 0); + if (nbchars < 0) { + xmlIOErr(XML_IO_ENCODER, NULL); + out->error = XML_IO_ENCODER; + return(-1); + } + } while (nbchars); + } + + /* + * second flush the stuff to the I/O channel + */ + if ((out->conv != NULL) && (out->encoder != NULL) && + (out->writecallback != NULL)) { + ret = out->writecallback(out->context, + (const char *)xmlBufContent(out->conv), + xmlBufUse(out->conv)); + if (ret >= 0) + xmlBufShrink(out->conv, ret); + } else if (out->writecallback != NULL) { + ret = out->writecallback(out->context, + (const char *)xmlBufContent(out->buffer), + xmlBufUse(out->buffer)); + if (ret >= 0) + xmlBufShrink(out->buffer, ret); + } + if (ret < 0) { + xmlIOErr(XML_IO_FLUSH, NULL); + out->error = XML_IO_FLUSH; + return(ret); + } + out->written += ret; + +#ifdef DEBUG_INPUT + xmlGenericError(xmlGenericErrorContext, + "I/O: flushed %d chars\n", ret); +#endif + return(ret); +} +#endif /* LIBXML_OUTPUT_ENABLED */ + +/** + * xmlParserGetDirectory: + * @filename: the path to a file + * + * lookup the directory for that file + * + * Returns a new allocated string containing the directory, or NULL. + */ +char * +xmlParserGetDirectory(const char *filename) { + char *ret = NULL; + char dir[1024]; + char *cur; + +#ifdef _WIN32_WCE /* easy way by now ... wince does not have dirs! */ + return NULL; +#endif + + if (xmlInputCallbackInitialized == 0) + xmlRegisterDefaultInputCallbacks(); + + if (filename == NULL) return(NULL); + +#if defined(WIN32) && !defined(__CYGWIN__) +# define IS_XMLPGD_SEP(ch) ((ch=='/')||(ch=='\\')) +#else +# define IS_XMLPGD_SEP(ch) (ch=='/') +#endif + + strncpy(dir, filename, 1023); + dir[1023] = 0; + cur = &dir[strlen(dir)]; + while (cur > dir) { + if (IS_XMLPGD_SEP(*cur)) break; + cur --; + } + if (IS_XMLPGD_SEP(*cur)) { + if (cur == dir) dir[1] = 0; + else *cur = 0; + ret = xmlMemStrdup(dir); + } else { + if (getcwd(dir, 1024) != NULL) { + dir[1023] = 0; + ret = xmlMemStrdup(dir); + } + } + return(ret); +#undef IS_XMLPGD_SEP +} + +/**************************************************************** + * * + * External entities loading * + * * + ****************************************************************/ + +/** + * xmlCheckHTTPInput: + * @ctxt: an XML parser context + * @ret: an XML parser input + * + * Check an input in case it was created from an HTTP stream, in that + * case it will handle encoding and update of the base URL in case of + * redirection. It also checks for HTTP errors in which case the input + * is cleanly freed up and an appropriate error is raised in context + * + * Returns the input or NULL in case of HTTP error. + */ +xmlParserInputPtr +xmlCheckHTTPInput(xmlParserCtxtPtr ctxt, xmlParserInputPtr ret) { +#ifdef LIBXML_HTTP_ENABLED + if ((ret != NULL) && (ret->buf != NULL) && + (ret->buf->readcallback == xmlIOHTTPRead) && + (ret->buf->context != NULL)) { + const char *encoding; + const char *redir; + const char *mime; + int code; + + code = xmlNanoHTTPReturnCode(ret->buf->context); + if (code >= 400) { + /* fatal error */ + if (ret->filename != NULL) + __xmlLoaderErr(ctxt, "failed to load HTTP resource \"%s\"\n", + (const char *) ret->filename); + else + __xmlLoaderErr(ctxt, "failed to load HTTP resource\n", NULL); + xmlFreeInputStream(ret); + ret = NULL; + } else { + + mime = xmlNanoHTTPMimeType(ret->buf->context); + if ((xmlStrstr(BAD_CAST mime, BAD_CAST "/xml")) || + (xmlStrstr(BAD_CAST mime, BAD_CAST "+xml"))) { + encoding = xmlNanoHTTPEncoding(ret->buf->context); + if (encoding != NULL) { + xmlCharEncodingHandlerPtr handler; + + handler = xmlFindCharEncodingHandler(encoding); + if (handler != NULL) { + xmlSwitchInputEncoding(ctxt, ret, handler); + } else { + __xmlErrEncoding(ctxt, XML_ERR_UNKNOWN_ENCODING, + "Unknown encoding %s", + BAD_CAST encoding, NULL); + } + if (ret->encoding == NULL) + ret->encoding = xmlStrdup(BAD_CAST encoding); + } +#if 0 + } else if (xmlStrstr(BAD_CAST mime, BAD_CAST "html")) { +#endif + } + redir = xmlNanoHTTPRedir(ret->buf->context); + if (redir != NULL) { + if (ret->filename != NULL) + xmlFree((xmlChar *) ret->filename); + if (ret->directory != NULL) { + xmlFree((xmlChar *) ret->directory); + ret->directory = NULL; + } + ret->filename = + (char *) xmlStrdup((const xmlChar *) redir); + } + } + } +#endif + return(ret); +} + +static int xmlNoNetExists(const char *URL) { + const char *path; + + if (URL == NULL) + return(0); + + if (!xmlStrncasecmp(BAD_CAST URL, BAD_CAST "file://localhost/", 17)) +#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__) + path = &URL[17]; +#else + path = &URL[16]; +#endif + else if (!xmlStrncasecmp(BAD_CAST URL, BAD_CAST "file:///", 8)) { +#if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__) + path = &URL[8]; +#else + path = &URL[7]; +#endif + } else + path = URL; + + return xmlCheckFilename(path); +} + +#ifdef LIBXML_CATALOG_ENABLED + +/** + * xmlResolveResourceFromCatalog: + * @URL: the URL for the entity to load + * @ID: the System ID for the entity to load + * @ctxt: the context in which the entity is called or NULL + * + * Resolves the URL and ID against the appropriate catalog. + * This function is used by xmlDefaultExternalEntityLoader and + * xmlNoNetExternalEntityLoader. + * + * Returns a new allocated URL, or NULL. + */ +static xmlChar * +xmlResolveResourceFromCatalog(const char *URL, const char *ID, + xmlParserCtxtPtr ctxt) { + xmlChar *resource = NULL; + xmlCatalogAllow pref; + + /* + * If the resource doesn't exists as a file, + * try to load it from the resource pointed in the catalogs + */ + pref = xmlCatalogGetDefaults(); + + if ((pref != XML_CATA_ALLOW_NONE) && (!xmlNoNetExists(URL))) { + /* + * Do a local lookup + */ + if ((ctxt != NULL) && (ctxt->catalogs != NULL) && + ((pref == XML_CATA_ALLOW_ALL) || + (pref == XML_CATA_ALLOW_DOCUMENT))) { + resource = xmlCatalogLocalResolve(ctxt->catalogs, + (const xmlChar *)ID, + (const xmlChar *)URL); + } + /* + * Try a global lookup + */ + if ((resource == NULL) && + ((pref == XML_CATA_ALLOW_ALL) || + (pref == XML_CATA_ALLOW_GLOBAL))) { + resource = xmlCatalogResolve((const xmlChar *)ID, + (const xmlChar *)URL); + } + if ((resource == NULL) && (URL != NULL)) + resource = xmlStrdup((const xmlChar *) URL); + + /* + * TODO: do an URI lookup on the reference + */ + if ((resource != NULL) && (!xmlNoNetExists((const char *)resource))) { + xmlChar *tmp = NULL; + + if ((ctxt != NULL) && (ctxt->catalogs != NULL) && + ((pref == XML_CATA_ALLOW_ALL) || + (pref == XML_CATA_ALLOW_DOCUMENT))) { + tmp = xmlCatalogLocalResolveURI(ctxt->catalogs, resource); + } + if ((tmp == NULL) && + ((pref == XML_CATA_ALLOW_ALL) || + (pref == XML_CATA_ALLOW_GLOBAL))) { + tmp = xmlCatalogResolveURI(resource); + } + + if (tmp != NULL) { + xmlFree(resource); + resource = tmp; + } + } + } + + return resource; +} + +#endif + +/** + * xmlDefaultExternalEntityLoader: + * @URL: the URL for the entity to load + * @ID: the System ID for the entity to load + * @ctxt: the context in which the entity is called or NULL + * + * By default we don't load external entitites, yet. + * + * Returns a new allocated xmlParserInputPtr, or NULL. + */ +static xmlParserInputPtr +xmlDefaultExternalEntityLoader(const char *URL, const char *ID, + xmlParserCtxtPtr ctxt) +{ + xmlParserInputPtr ret = NULL; + xmlChar *resource = NULL; + +#ifdef DEBUG_EXTERNAL_ENTITIES + xmlGenericError(xmlGenericErrorContext, + "xmlDefaultExternalEntityLoader(%s, xxx)\n", URL); +#endif + if ((ctxt != NULL) && (ctxt->options & XML_PARSE_NONET)) { + int options = ctxt->options; + + ctxt->options -= XML_PARSE_NONET; + ret = xmlNoNetExternalEntityLoader(URL, ID, ctxt); + ctxt->options = options; + return(ret); + } +#ifdef LIBXML_CATALOG_ENABLED + resource = xmlResolveResourceFromCatalog(URL, ID, ctxt); +#endif + + if (resource == NULL) + resource = (xmlChar *) URL; + + if (resource == NULL) { + if (ID == NULL) + ID = "NULL"; + __xmlLoaderErr(ctxt, "failed to load external entity \"%s\"\n", ID); + return (NULL); + } + ret = xmlNewInputFromFile(ctxt, (const char *) resource); + if ((resource != NULL) && (resource != (xmlChar *) URL)) + xmlFree(resource); + return (ret); +} + +static xmlExternalEntityLoader xmlCurrentExternalEntityLoader = + xmlDefaultExternalEntityLoader; + +/** + * xmlSetExternalEntityLoader: + * @f: the new entity resolver function + * + * Changes the defaultexternal entity resolver function for the application + */ +void +xmlSetExternalEntityLoader(xmlExternalEntityLoader f) { + xmlCurrentExternalEntityLoader = f; +} + +/** + * xmlGetExternalEntityLoader: + * + * Get the default external entity resolver function for the application + * + * Returns the xmlExternalEntityLoader function pointer + */ +xmlExternalEntityLoader +xmlGetExternalEntityLoader(void) { + return(xmlCurrentExternalEntityLoader); +} + +/** + * xmlLoadExternalEntity: + * @URL: the URL for the entity to load + * @ID: the Public ID for the entity to load + * @ctxt: the context in which the entity is called or NULL + * + * Load an external entity, note that the use of this function for + * unparsed entities may generate problems + * + * Returns the xmlParserInputPtr or NULL + */ +xmlParserInputPtr +xmlLoadExternalEntity(const char *URL, const char *ID, + xmlParserCtxtPtr ctxt) { + if ((URL != NULL) && (xmlNoNetExists(URL) == 0)) { + char *canonicFilename; + xmlParserInputPtr ret; + + canonicFilename = (char *) xmlCanonicPath((const xmlChar *) URL); + if (canonicFilename == NULL) { + xmlIOErrMemory("building canonical path\n"); + return(NULL); + } + + ret = xmlCurrentExternalEntityLoader(canonicFilename, ID, ctxt); + xmlFree(canonicFilename); + return(ret); + } + return(xmlCurrentExternalEntityLoader(URL, ID, ctxt)); +} + +/************************************************************************ + * * + * Disabling Network access * + * * + ************************************************************************/ + +/** + * xmlNoNetExternalEntityLoader: + * @URL: the URL for the entity to load + * @ID: the System ID for the entity to load + * @ctxt: the context in which the entity is called or NULL + * + * A specific entity loader disabling network accesses, though still + * allowing local catalog accesses for resolution. + * + * Returns a new allocated xmlParserInputPtr, or NULL. + */ +xmlParserInputPtr +xmlNoNetExternalEntityLoader(const char *URL, const char *ID, + xmlParserCtxtPtr ctxt) { + xmlParserInputPtr input = NULL; + xmlChar *resource = NULL; + +#ifdef LIBXML_CATALOG_ENABLED + resource = xmlResolveResourceFromCatalog(URL, ID, ctxt); +#endif + + if (resource == NULL) + resource = (xmlChar *) URL; + + if (resource != NULL) { + if ((!xmlStrncasecmp(BAD_CAST resource, BAD_CAST "ftp://", 6)) || + (!xmlStrncasecmp(BAD_CAST resource, BAD_CAST "http://", 7))) { + xmlIOErr(XML_IO_NETWORK_ATTEMPT, (const char *) resource); + if (resource != (xmlChar *) URL) + xmlFree(resource); + return(NULL); + } + } + input = xmlDefaultExternalEntityLoader((const char *) resource, ID, ctxt); + if (resource != (xmlChar *) URL) + xmlFree(resource); + return(input); +} + +#define bottom_xmlIO +#include "elfgcchack.h" diff --git a/vendors/libxml/src/xmlcatalog.c b/vendors/libxml/src/xmlcatalog.c new file mode 100644 index 0000000..43f455a --- /dev/null +++ b/vendors/libxml/src/xmlcatalog.c @@ -0,0 +1,614 @@ +/* + * xmlcatalog.c : a small utility program to handle XML catalogs + * + * See Copyright for the status of this software. + * + * daniel@veillard.com + */ + +#include "libxml.h" + +#include +#include +#include + +#ifdef HAVE_STDLIB_H +#include +#endif + +#ifdef HAVE_LIBREADLINE +#include +#ifdef HAVE_LIBHISTORY +#include +#endif +#endif + +#include +#include +#include +#include +#include + +#if defined(LIBXML_CATALOG_ENABLED) && defined(LIBXML_OUTPUT_ENABLED) +static int shell = 0; +static int sgml = 0; +static int noout = 0; +static int create = 0; +static int add = 0; +static int del = 0; +static int convert = 0; +static int no_super_update = 0; +static int verbose = 0; +static char *filename = NULL; + + +#ifndef XML_SGML_DEFAULT_CATALOG +#define XML_SGML_DEFAULT_CATALOG "/etc/sgml/catalog" +#endif + +/************************************************************************ + * * + * Shell Interface * + * * + ************************************************************************/ +/** + * xmlShellReadline: + * @prompt: the prompt value + * + * Read a string + * + * Returns a pointer to it or NULL on EOF the caller is expected to + * free the returned string. + */ +static char * +xmlShellReadline(const char *prompt) { +#ifdef HAVE_LIBREADLINE + char *line_read; + + /* Get a line from the user. */ + line_read = readline (prompt); + + /* If the line has any text in it, save it on the history. */ + if (line_read && *line_read) + add_history (line_read); + + return (line_read); +#else + char line_read[501]; + char *ret; + int len; + + if (prompt != NULL) + fprintf(stdout, "%s", prompt); + if (!fgets(line_read, 500, stdin)) + return(NULL); + line_read[500] = 0; + len = strlen(line_read); + ret = (char *) malloc(len + 1); + if (ret != NULL) { + memcpy (ret, line_read, len + 1); + } + return(ret); +#endif +} + +static void usershell(void) { + char *cmdline = NULL, *cur; + int nbargs; + char command[100]; + char arg[400]; + char *argv[20]; + int i, ret; + xmlChar *ans; + + while (1) { + cmdline = xmlShellReadline("> "); + if (cmdline == NULL) + return; + + /* + * Parse the command itself + */ + cur = cmdline; + nbargs = 0; + while ((*cur == ' ') || (*cur == '\t')) cur++; + i = 0; + while ((*cur != ' ') && (*cur != '\t') && + (*cur != '\n') && (*cur != '\r')) { + if (*cur == 0) + break; + command[i++] = *cur++; + } + command[i] = 0; + if (i == 0) { + free(cmdline); + continue; + } + + /* + * Parse the argument string + */ + memset(arg, 0, sizeof(arg)); + while ((*cur == ' ') || (*cur == '\t')) cur++; + i = 0; + while ((*cur != '\n') && (*cur != '\r') && (*cur != 0)) { + if (*cur == 0) + break; + arg[i++] = *cur++; + } + arg[i] = 0; + + /* + * Parse the arguments + */ + i = 0; + nbargs = 0; + cur = arg; + memset(argv, 0, sizeof(argv)); + while (*cur != 0) { + while ((*cur == ' ') || (*cur == '\t')) cur++; + if (*cur == '\'') { + cur++; + argv[i] = cur; + while ((*cur != 0) && (*cur != '\'')) cur++; + if (*cur == '\'') { + *cur = 0; + nbargs++; + i++; + cur++; + } + } else if (*cur == '"') { + cur++; + argv[i] = cur; + while ((*cur != 0) && (*cur != '"')) cur++; + if (*cur == '"') { + *cur = 0; + nbargs++; + i++; + cur++; + } + } else { + argv[i] = cur; + while ((*cur != 0) && (*cur != ' ') && (*cur != '\t')) + cur++; + *cur = 0; + nbargs++; + i++; + cur++; + } + } + + /* + * start interpreting the command + */ + if (!strcmp(command, "exit")) + break; + if (!strcmp(command, "quit")) + break; + if (!strcmp(command, "bye")) + break; + if (!strcmp(command, "public")) { + if (nbargs != 1) { + printf("public requires 1 arguments\n"); + } else { + ans = xmlCatalogResolvePublic((const xmlChar *) argv[0]); + if (ans == NULL) { + printf("No entry for PUBLIC %s\n", argv[0]); + } else { + printf("%s\n", (char *) ans); + xmlFree(ans); + } + } + } else if (!strcmp(command, "system")) { + if (nbargs != 1) { + printf("system requires 1 arguments\n"); + } else { + ans = xmlCatalogResolveSystem((const xmlChar *) argv[0]); + if (ans == NULL) { + printf("No entry for SYSTEM %s\n", argv[0]); + } else { + printf("%s\n", (char *) ans); + xmlFree(ans); + } + } + } else if (!strcmp(command, "add")) { + if (sgml) { + if ((nbargs != 3) && (nbargs != 2)) { + printf("add requires 2 or 3 arguments\n"); + } else { + if (argv[2] == NULL) + ret = xmlCatalogAdd(BAD_CAST argv[0], NULL, + BAD_CAST argv[1]); + else + ret = xmlCatalogAdd(BAD_CAST argv[0], BAD_CAST argv[1], + BAD_CAST argv[2]); + if (ret != 0) + printf("add command failed\n"); + } + } else { + if ((nbargs != 3) && (nbargs != 2)) { + printf("add requires 2 or 3 arguments\n"); + } else { + if (argv[2] == NULL) + ret = xmlCatalogAdd(BAD_CAST argv[0], NULL, + BAD_CAST argv[1]); + else + ret = xmlCatalogAdd(BAD_CAST argv[0], BAD_CAST argv[1], + BAD_CAST argv[2]); + if (ret != 0) + printf("add command failed\n"); + } + } + } else if (!strcmp(command, "del")) { + if (nbargs != 1) { + printf("del requires 1\n"); + } else { + ret = xmlCatalogRemove(BAD_CAST argv[0]); + if (ret <= 0) + printf("del command failed\n"); + + } + } else if (!strcmp(command, "resolve")) { + if (nbargs != 2) { + printf("resolve requires 2 arguments\n"); + } else { + ans = xmlCatalogResolve(BAD_CAST argv[0], + BAD_CAST argv[1]); + if (ans == NULL) { + printf("Resolver failed to find an answer\n"); + } else { + printf("%s\n", (char *) ans); + xmlFree(ans); + } + } + } else if (!strcmp(command, "dump")) { + if (nbargs != 0) { + printf("dump has no arguments\n"); + } else { + xmlCatalogDump(stdout); + } + } else if (!strcmp(command, "debug")) { + if (nbargs != 0) { + printf("debug has no arguments\n"); + } else { + verbose++; + xmlCatalogSetDebug(verbose); + } + } else if (!strcmp(command, "quiet")) { + if (nbargs != 0) { + printf("quiet has no arguments\n"); + } else { + if (verbose > 0) + verbose--; + xmlCatalogSetDebug(verbose); + } + } else { + if (strcmp(command, "help")) { + printf("Unrecognized command %s\n", command); + } + printf("Commands available:\n"); + printf("\tpublic PublicID: make a PUBLIC identifier lookup\n"); + printf("\tsystem SystemID: make a SYSTEM identifier lookup\n"); + printf("\tresolve PublicID SystemID: do a full resolver lookup\n"); + printf("\tadd 'type' 'orig' 'replace' : add an entry\n"); + printf("\tdel 'values' : remove values\n"); + printf("\tdump: print the current catalog state\n"); + printf("\tdebug: increase the verbosity level\n"); + printf("\tquiet: decrease the verbosity level\n"); + printf("\texit: quit the shell\n"); + } + free(cmdline); /* not xmlFree here ! */ + } +} + +/************************************************************************ + * * + * Main * + * * + ************************************************************************/ +static void usage(const char *name) { + /* split into 2 printf's to avoid overly long string (gcc warning) */ + printf("\ +Usage : %s [options] catalogfile entities...\n\ +\tParse the catalog file and query it for the entities\n\ +\t--sgml : handle SGML Super catalogs for --add and --del\n\ +\t--shell : run a shell allowing interactive queries\n\ +\t--create : create a new catalog\n\ +\t--add 'type' 'orig' 'replace' : add an XML entry\n\ +\t--add 'entry' : add an SGML entry\n", name); + printf("\ +\t--del 'values' : remove values\n\ +\t--noout: avoid dumping the result on stdout\n\ +\t used with --add or --del, it saves the catalog changes\n\ +\t and with --sgml it automatically updates the super catalog\n\ +\t--no-super-update: do not update the SGML super catalog\n\ +\t-v --verbose : provide debug informations\n"); +} +int main(int argc, char **argv) { + int i; + int ret; + int exit_value = 0; + + + if (argc <= 1) { + usage(argv[0]); + return(1); + } + + LIBXML_TEST_VERSION + for (i = 1; i < argc ; i++) { + if (!strcmp(argv[i], "-")) + break; + + if (argv[i][0] != '-') + break; + if ((!strcmp(argv[i], "-verbose")) || + (!strcmp(argv[i], "-v")) || + (!strcmp(argv[i], "--verbose"))) { + verbose++; + xmlCatalogSetDebug(verbose); + } else if ((!strcmp(argv[i], "-noout")) || + (!strcmp(argv[i], "--noout"))) { + noout = 1; + } else if ((!strcmp(argv[i], "-shell")) || + (!strcmp(argv[i], "--shell"))) { + shell++; + noout = 1; + } else if ((!strcmp(argv[i], "-sgml")) || + (!strcmp(argv[i], "--sgml"))) { + sgml++; + } else if ((!strcmp(argv[i], "-create")) || + (!strcmp(argv[i], "--create"))) { + create++; + } else if ((!strcmp(argv[i], "-convert")) || + (!strcmp(argv[i], "--convert"))) { + convert++; + } else if ((!strcmp(argv[i], "-no-super-update")) || + (!strcmp(argv[i], "--no-super-update"))) { + no_super_update++; + } else if ((!strcmp(argv[i], "-add")) || + (!strcmp(argv[i], "--add"))) { + if (sgml) + i += 2; + else + i += 3; + add++; + } else if ((!strcmp(argv[i], "-del")) || + (!strcmp(argv[i], "--del"))) { + i += 1; + del++; + } else { + fprintf(stderr, "Unknown option %s\n", argv[i]); + usage(argv[0]); + return(1); + } + } + + for (i = 1; i < argc; i++) { + if ((!strcmp(argv[i], "-add")) || + (!strcmp(argv[i], "--add"))) { + if (sgml) + i += 2; + else + i += 3; + continue; + } else if ((!strcmp(argv[i], "-del")) || + (!strcmp(argv[i], "--del"))) { + i += 1; + + /* No catalog entry specified */ + if (i == argc || (sgml && i + 1 == argc)) { + fprintf(stderr, "No catalog entry specified to remove from\n"); + usage (argv[0]); + return(1); + } + + continue; + } else if (argv[i][0] == '-') + continue; + filename = argv[i]; + ret = xmlLoadCatalog(argv[i]); + if ((ret < 0) && (create)) { + xmlCatalogAdd(BAD_CAST "catalog", BAD_CAST argv[i], NULL); + } + break; + } + + if (convert) + ret = xmlCatalogConvert(); + + if ((add) || (del)) { + for (i = 1; i < argc ; i++) { + if (!strcmp(argv[i], "-")) + break; + + if (argv[i][0] != '-') + continue; + if (strcmp(argv[i], "-add") && strcmp(argv[i], "--add") && + strcmp(argv[i], "-del") && strcmp(argv[i], "--del")) + continue; + + if (sgml) { + /* + * Maintenance of SGML catalogs. + */ + xmlCatalogPtr catal = NULL; + xmlCatalogPtr super = NULL; + + catal = xmlLoadSGMLSuperCatalog(argv[i + 1]); + + if ((!strcmp(argv[i], "-add")) || + (!strcmp(argv[i], "--add"))) { + if (catal == NULL) + catal = xmlNewCatalog(1); + xmlACatalogAdd(catal, BAD_CAST "CATALOG", + BAD_CAST argv[i + 2], NULL); + + if (!no_super_update) { + super = xmlLoadSGMLSuperCatalog(XML_SGML_DEFAULT_CATALOG); + if (super == NULL) + super = xmlNewCatalog(1); + + xmlACatalogAdd(super, BAD_CAST "CATALOG", + BAD_CAST argv[i + 1], NULL); + } + } else { + if (catal != NULL) + ret = xmlACatalogRemove(catal, BAD_CAST argv[i + 2]); + else + ret = -1; + if (ret < 0) { + fprintf(stderr, "Failed to remove entry from %s\n", + argv[i + 1]); + exit_value = 1; + } + if ((!no_super_update) && (noout) && (catal != NULL) && + (xmlCatalogIsEmpty(catal))) { + super = xmlLoadSGMLSuperCatalog( + XML_SGML_DEFAULT_CATALOG); + if (super != NULL) { + ret = xmlACatalogRemove(super, + BAD_CAST argv[i + 1]); + if (ret < 0) { + fprintf(stderr, + "Failed to remove entry from %s\n", + XML_SGML_DEFAULT_CATALOG); + exit_value = 1; + } + } + } + } + if (noout) { + FILE *out; + + if (xmlCatalogIsEmpty(catal)) { + remove(argv[i + 1]); + } else { + out = fopen(argv[i + 1], "w"); + if (out == NULL) { + fprintf(stderr, "could not open %s for saving\n", + argv[i + 1]); + exit_value = 2; + noout = 0; + } else { + xmlACatalogDump(catal, out); + fclose(out); + } + } + if (!no_super_update && super != NULL) { + if (xmlCatalogIsEmpty(super)) { + remove(XML_SGML_DEFAULT_CATALOG); + } else { + out = fopen(XML_SGML_DEFAULT_CATALOG, "w"); + if (out == NULL) { + fprintf(stderr, + "could not open %s for saving\n", + XML_SGML_DEFAULT_CATALOG); + exit_value = 2; + noout = 0; + } else { + + xmlACatalogDump(super, out); + fclose(out); + } + } + } + } else { + xmlACatalogDump(catal, stdout); + } + i += 2; + } else { + if ((!strcmp(argv[i], "-add")) || + (!strcmp(argv[i], "--add"))) { + if ((argv[i + 3] == NULL) || (argv[i + 3][0] == 0)) + ret = xmlCatalogAdd(BAD_CAST argv[i + 1], NULL, + BAD_CAST argv[i + 2]); + else + ret = xmlCatalogAdd(BAD_CAST argv[i + 1], + BAD_CAST argv[i + 2], + BAD_CAST argv[i + 3]); + if (ret != 0) { + printf("add command failed\n"); + exit_value = 3; + } + i += 3; + } else if ((!strcmp(argv[i], "-del")) || + (!strcmp(argv[i], "--del"))) { + ret = xmlCatalogRemove(BAD_CAST argv[i + 1]); + if (ret < 0) { + fprintf(stderr, "Failed to remove entry %s\n", + argv[i + 1]); + exit_value = 1; + } + i += 1; + } + } + } + + } else if (shell) { + usershell(); + } else { + for (i++; i < argc; i++) { + xmlURIPtr uri; + xmlChar *ans; + + uri = xmlParseURI(argv[i]); + if (uri == NULL) { + ans = xmlCatalogResolvePublic((const xmlChar *) argv[i]); + if (ans == NULL) { + printf("No entry for PUBLIC %s\n", argv[i]); + exit_value = 4; + } else { + printf("%s\n", (char *) ans); + xmlFree(ans); + } + } else { + xmlFreeURI(uri); + ans = xmlCatalogResolveSystem((const xmlChar *) argv[i]); + if (ans == NULL) { + printf("No entry for SYSTEM %s\n", argv[i]); + ans = xmlCatalogResolveURI ((const xmlChar *) argv[i]); + if (ans == NULL) { + printf ("No entry for URI %s\n", argv[i]); + exit_value = 4; + } else { + printf("%s\n", (char *) ans); + xmlFree (ans); + } + } else { + printf("%s\n", (char *) ans); + xmlFree(ans); + } + } + } + } + if ((!sgml) && ((add) || (del) || (create) || (convert))) { + if (noout && filename && *filename) { + FILE *out; + + out = fopen(filename, "w"); + if (out == NULL) { + fprintf(stderr, "could not open %s for saving\n", filename); + exit_value = 2; + noout = 0; + } else { + xmlCatalogDump(out); + } + } else { + xmlCatalogDump(stdout); + } + } + + /* + * Cleanup and check for memory leaks + */ + xmlCleanupParser(); + xmlMemoryDump(); + return(exit_value); +} +#else +int main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) { + fprintf(stderr, "libxml was not compiled with catalog and output support\n"); + return(1); +} +#endif diff --git a/vendors/libxml/src/xmllint.c b/vendors/libxml/src/xmllint.c new file mode 100644 index 0000000..26d8db1 --- /dev/null +++ b/vendors/libxml/src/xmllint.c @@ -0,0 +1,3776 @@ +/* + * xmllint.c : a small tester program for XML input. + * + * See Copyright for the status of this software. + * + * daniel@veillard.com + */ + +#include "libxml.h" + +#include +#include +#include + +#if defined (_WIN32) && !defined(__CYGWIN__) +#if defined (_MSC_VER) || defined(__BORLANDC__) +#include +#pragma comment(lib, "ws2_32.lib") +#define gettimeofday(p1,p2) +#endif /* _MSC_VER */ +#endif /* _WIN32 */ + +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_TIME_H +#include +#endif + +#ifdef __MINGW32__ +#define _WINSOCKAPI_ +#include +#include +#undef XML_SOCKLEN_T +#define XML_SOCKLEN_T unsigned int +#endif + +#ifdef HAVE_SYS_TIMEB_H +#include +#endif + +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_FCNTL_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_SYS_MMAN_H +#include +/* seems needed for Solaris */ +#ifndef MAP_FAILED +#define MAP_FAILED ((void *) -1) +#endif +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_LIBREADLINE +#include +#ifdef HAVE_LIBHISTORY +#include +#endif +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef LIBXML_XINCLUDE_ENABLED +#include +#endif +#ifdef LIBXML_CATALOG_ENABLED +#include +#endif +#include +#include +#ifdef LIBXML_SCHEMATRON_ENABLED +#include +#endif +#ifdef LIBXML_SCHEMAS_ENABLED +#include +#include +#endif +#ifdef LIBXML_PATTERN_ENABLED +#include +#endif +#ifdef LIBXML_C14N_ENABLED +#include +#endif +#ifdef LIBXML_OUTPUT_ENABLED +#include +#endif + +#ifndef XML_XML_DEFAULT_CATALOG +#define XML_XML_DEFAULT_CATALOG "file:///etc/xml/catalog" +#endif + +typedef enum { + XMLLINT_RETURN_OK = 0, /* No error */ + XMLLINT_ERR_UNCLASS = 1, /* Unclassified */ + XMLLINT_ERR_DTD = 2, /* Error in DTD */ + XMLLINT_ERR_VALID = 3, /* Validation error */ + XMLLINT_ERR_RDFILE = 4, /* CtxtReadFile error */ + XMLLINT_ERR_SCHEMACOMP = 5, /* Schema compilation */ + XMLLINT_ERR_OUT = 6, /* Error writing output */ + XMLLINT_ERR_SCHEMAPAT = 7, /* Error in schema pattern */ + XMLLINT_ERR_RDREGIS = 8, /* Error in Reader registration */ + XMLLINT_ERR_MEM = 9, /* Out of memory error */ + XMLLINT_ERR_XPATH = 10 /* XPath evaluation error */ +} xmllintReturnCode; +#ifdef LIBXML_DEBUG_ENABLED +static int shell = 0; +static int debugent = 0; +#endif +static int debug = 0; +static int maxmem = 0; +#ifdef LIBXML_TREE_ENABLED +static int copy = 0; +#endif /* LIBXML_TREE_ENABLED */ +static int recovery = 0; +static int noent = 0; +static int noenc = 0; +static int noblanks = 0; +static int noout = 0; +static int nowrap = 0; +#ifdef LIBXML_OUTPUT_ENABLED +static int format = 0; +static const char *output = NULL; +static int compress = 0; +static int oldout = 0; +#endif /* LIBXML_OUTPUT_ENABLED */ +#ifdef LIBXML_VALID_ENABLED +static int valid = 0; +static int postvalid = 0; +static char * dtdvalid = NULL; +static char * dtdvalidfpi = NULL; +#endif +#ifdef LIBXML_SCHEMAS_ENABLED +static char * relaxng = NULL; +static xmlRelaxNGPtr relaxngschemas = NULL; +static char * schema = NULL; +static xmlSchemaPtr wxschemas = NULL; +#endif +#ifdef LIBXML_SCHEMATRON_ENABLED +static char * schematron = NULL; +static xmlSchematronPtr wxschematron = NULL; +#endif +static int repeat = 0; +static int insert = 0; +#if defined(LIBXML_HTML_ENABLED) || defined(LIBXML_VALID_ENABLED) +static int html = 0; +static int xmlout = 0; +#endif +static int htmlout = 0; +#if defined(LIBXML_HTML_ENABLED) +static int nodefdtd = 0; +#endif +#ifdef LIBXML_PUSH_ENABLED +static int push = 0; +static int pushsize = 4096; +#endif /* LIBXML_PUSH_ENABLED */ +#ifdef HAVE_MMAP +static int memory = 0; +#endif +static int testIO = 0; +static char *encoding = NULL; +#ifdef LIBXML_XINCLUDE_ENABLED +static int xinclude = 0; +#endif +static int dtdattrs = 0; +static int loaddtd = 0; +static xmllintReturnCode progresult = XMLLINT_RETURN_OK; +static int timing = 0; +static int generate = 0; +static int dropdtd = 0; +#ifdef LIBXML_CATALOG_ENABLED +static int catalogs = 0; +static int nocatalogs = 0; +#endif +#ifdef LIBXML_C14N_ENABLED +static int canonical = 0; +static int canonical_11 = 0; +static int exc_canonical = 0; +#endif +#ifdef LIBXML_READER_ENABLED +static int stream = 0; +static int walker = 0; +#endif /* LIBXML_READER_ENABLED */ +static int chkregister = 0; +static int nbregister = 0; +#ifdef LIBXML_SAX1_ENABLED +static int sax1 = 0; +#endif /* LIBXML_SAX1_ENABLED */ +#ifdef LIBXML_PATTERN_ENABLED +static const char *pattern = NULL; +static xmlPatternPtr patternc = NULL; +static xmlStreamCtxtPtr patstream = NULL; +#endif +#ifdef LIBXML_XPATH_ENABLED +static const char *xpathquery = NULL; +#endif +static int options = XML_PARSE_COMPACT | XML_PARSE_BIG_LINES; +static int sax = 0; +static int oldxml10 = 0; + +/************************************************************************ + * * + * Entity loading control and customization. * + * * + ************************************************************************/ +#define MAX_PATHS 64 +#ifdef _WIN32 +# define PATH_SEPARATOR ';' +#else +# define PATH_SEPARATOR ':' +#endif +static xmlChar *paths[MAX_PATHS + 1]; +static int nbpaths = 0; +static int load_trace = 0; + +static +void parsePath(const xmlChar *path) { + const xmlChar *cur; + + if (path == NULL) + return; + while (*path != 0) { + if (nbpaths >= MAX_PATHS) { + fprintf(stderr, "MAX_PATHS reached: too many paths\n"); + return; + } + cur = path; + while ((*cur == ' ') || (*cur == PATH_SEPARATOR)) + cur++; + path = cur; + while ((*cur != 0) && (*cur != ' ') && (*cur != PATH_SEPARATOR)) + cur++; + if (cur != path) { + paths[nbpaths] = xmlStrndup(path, cur - path); + if (paths[nbpaths] != NULL) + nbpaths++; + path = cur; + } + } +} + +static xmlExternalEntityLoader defaultEntityLoader = NULL; + +static xmlParserInputPtr +xmllintExternalEntityLoader(const char *URL, const char *ID, + xmlParserCtxtPtr ctxt) { + xmlParserInputPtr ret; + warningSAXFunc warning = NULL; + errorSAXFunc err = NULL; + + int i; + const char *lastsegment = URL; + const char *iter = URL; + + if ((nbpaths > 0) && (iter != NULL)) { + while (*iter != 0) { + if (*iter == '/') + lastsegment = iter + 1; + iter++; + } + } + + if ((ctxt != NULL) && (ctxt->sax != NULL)) { + warning = ctxt->sax->warning; + err = ctxt->sax->error; + ctxt->sax->warning = NULL; + ctxt->sax->error = NULL; + } + + if (defaultEntityLoader != NULL) { + ret = defaultEntityLoader(URL, ID, ctxt); + if (ret != NULL) { + if (warning != NULL) + ctxt->sax->warning = warning; + if (err != NULL) + ctxt->sax->error = err; + if (load_trace) { + fprintf \ + (stderr, + "Loaded URL=\"%s\" ID=\"%s\"\n", + URL ? URL : "(null)", + ID ? ID : "(null)"); + } + return(ret); + } + } + for (i = 0;i < nbpaths;i++) { + xmlChar *newURL; + + newURL = xmlStrdup((const xmlChar *) paths[i]); + newURL = xmlStrcat(newURL, (const xmlChar *) "/"); + newURL = xmlStrcat(newURL, (const xmlChar *) lastsegment); + if (newURL != NULL) { + ret = defaultEntityLoader((const char *)newURL, ID, ctxt); + if (ret != NULL) { + if (warning != NULL) + ctxt->sax->warning = warning; + if (err != NULL) + ctxt->sax->error = err; + if (load_trace) { + fprintf \ + (stderr, + "Loaded URL=\"%s\" ID=\"%s\"\n", + newURL, + ID ? ID : "(null)"); + } + xmlFree(newURL); + return(ret); + } + xmlFree(newURL); + } + } + if (err != NULL) + ctxt->sax->error = err; + if (warning != NULL) { + ctxt->sax->warning = warning; + if (URL != NULL) + warning(ctxt, "failed to load external entity \"%s\"\n", URL); + else if (ID != NULL) + warning(ctxt, "failed to load external entity \"%s\"\n", ID); + } + return(NULL); +} +/************************************************************************ + * * + * Memory allocation consumption debugging * + * * + ************************************************************************/ + +static void +OOM(void) +{ + fprintf(stderr, "Ran out of memory needs > %d bytes\n", maxmem); + progresult = XMLLINT_ERR_MEM; +} + +static void +myFreeFunc(void *mem) +{ + xmlMemFree(mem); +} +static void * +myMallocFunc(size_t size) +{ + void *ret; + + ret = xmlMemMalloc(size); + if (ret != NULL) { + if (xmlMemUsed() > maxmem) { + OOM(); + xmlMemFree(ret); + return (NULL); + } + } + return (ret); +} +static void * +myReallocFunc(void *mem, size_t size) +{ + void *ret; + + ret = xmlMemRealloc(mem, size); + if (ret != NULL) { + if (xmlMemUsed() > maxmem) { + OOM(); + xmlMemFree(ret); + return (NULL); + } + } + return (ret); +} +static char * +myStrdupFunc(const char *str) +{ + char *ret; + + ret = xmlMemoryStrdup(str); + if (ret != NULL) { + if (xmlMemUsed() > maxmem) { + OOM(); + xmlFree(ret); + return (NULL); + } + } + return (ret); +} +/************************************************************************ + * * + * Internal timing routines to remove the necessity to have * + * unix-specific function calls. * + * * + ************************************************************************/ + +#ifndef HAVE_GETTIMEOFDAY +#ifdef HAVE_SYS_TIMEB_H +#ifdef HAVE_SYS_TIME_H +#ifdef HAVE_FTIME + +static int +my_gettimeofday(struct timeval *tvp, void *tzp) +{ + struct timeb timebuffer; + + ftime(&timebuffer); + if (tvp) { + tvp->tv_sec = timebuffer.time; + tvp->tv_usec = timebuffer.millitm * 1000L; + } + return (0); +} +#define HAVE_GETTIMEOFDAY 1 +#define gettimeofday my_gettimeofday + +#endif /* HAVE_FTIME */ +#endif /* HAVE_SYS_TIME_H */ +#endif /* HAVE_SYS_TIMEB_H */ +#endif /* !HAVE_GETTIMEOFDAY */ + +#if defined(HAVE_GETTIMEOFDAY) +static struct timeval begin, end; + +/* + * startTimer: call where you want to start timing + */ +static void +startTimer(void) +{ + gettimeofday(&begin, NULL); +} + +/* + * endTimer: call where you want to stop timing and to print out a + * message about the timing performed; format is a printf + * type argument + */ +static void XMLCDECL +endTimer(const char *fmt, ...) +{ + long msec; + va_list ap; + + gettimeofday(&end, NULL); + msec = end.tv_sec - begin.tv_sec; + msec *= 1000; + msec += (end.tv_usec - begin.tv_usec) / 1000; + +#ifndef HAVE_STDARG_H +#error "endTimer required stdarg functions" +#endif + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + + fprintf(stderr, " took %ld ms\n", msec); +} +#elif defined(HAVE_TIME_H) +/* + * No gettimeofday function, so we have to make do with calling clock. + * This is obviously less accurate, but there's little we can do about + * that. + */ +#ifndef CLOCKS_PER_SEC +#define CLOCKS_PER_SEC 100 +#endif + +static clock_t begin, end; +static void +startTimer(void) +{ + begin = clock(); +} +static void XMLCDECL +endTimer(const char *fmt, ...) +{ + long msec; + va_list ap; + + end = clock(); + msec = ((end - begin) * 1000) / CLOCKS_PER_SEC; + +#ifndef HAVE_STDARG_H +#error "endTimer required stdarg functions" +#endif + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + fprintf(stderr, " took %ld ms\n", msec); +} +#else + +/* + * We don't have a gettimeofday or time.h, so we just don't do timing + */ +static void +startTimer(void) +{ + /* + * Do nothing + */ +} +static void XMLCDECL +endTimer(char *format, ...) +{ + /* + * We cannot do anything because we don't have a timing function + */ +#ifdef HAVE_STDARG_H + va_list ap; + va_start(ap, format); + vfprintf(stderr, format, ap); + va_end(ap); + fprintf(stderr, " was not timed\n"); +#else + /* We don't have gettimeofday, time or stdarg.h, what crazy world is + * this ?! + */ +#endif +} +#endif +/************************************************************************ + * * + * HTML ouput * + * * + ************************************************************************/ +static char buffer[50000]; + +static void +xmlHTMLEncodeSend(void) { + char *result; + + result = (char *) xmlEncodeEntitiesReentrant(NULL, BAD_CAST buffer); + if (result) { + xmlGenericError(xmlGenericErrorContext, "%s", result); + xmlFree(result); + } + buffer[0] = 0; +} + +/** + * xmlHTMLPrintFileInfo: + * @input: an xmlParserInputPtr input + * + * Displays the associated file and line informations for the current input + */ + +static void +xmlHTMLPrintFileInfo(xmlParserInputPtr input) { + int len; + xmlGenericError(xmlGenericErrorContext, "

    "); + + len = strlen(buffer); + if (input != NULL) { + if (input->filename) { + snprintf(&buffer[len], sizeof(buffer) - len, "%s:%d: ", input->filename, + input->line); + } else { + snprintf(&buffer[len], sizeof(buffer) - len, "Entity: line %d: ", input->line); + } + } + xmlHTMLEncodeSend(); +} + +/** + * xmlHTMLPrintFileContext: + * @input: an xmlParserInputPtr input + * + * Displays current context within the input content for error tracking + */ + +static void +xmlHTMLPrintFileContext(xmlParserInputPtr input) { + const xmlChar *cur, *base; + int len; + int n; + + if (input == NULL) return; + xmlGenericError(xmlGenericErrorContext, "

    \n");
    +    cur = input->cur;
    +    base = input->base;
    +    while ((cur > base) && ((*cur == '\n') || (*cur == '\r'))) {
    +	cur--;
    +    }
    +    n = 0;
    +    while ((n++ < 80) && (cur > base) && (*cur != '\n') && (*cur != '\r'))
    +        cur--;
    +    if ((*cur == '\n') || (*cur == '\r')) cur++;
    +    base = cur;
    +    n = 0;
    +    while ((*cur != 0) && (*cur != '\n') && (*cur != '\r') && (n < 79)) {
    +	len = strlen(buffer);
    +        snprintf(&buffer[len], sizeof(buffer) - len, "%c",
    +		    (unsigned char) *cur++);
    +	n++;
    +    }
    +    len = strlen(buffer);
    +    snprintf(&buffer[len], sizeof(buffer) - len, "\n");
    +    cur = input->cur;
    +    while ((*cur == '\n') || (*cur == '\r'))
    +	cur--;
    +    n = 0;
    +    while ((cur != base) && (n++ < 80)) {
    +	len = strlen(buffer);
    +        snprintf(&buffer[len], sizeof(buffer) - len, " ");
    +        base++;
    +    }
    +    len = strlen(buffer);
    +    snprintf(&buffer[len], sizeof(buffer) - len, "^\n");
    +    xmlHTMLEncodeSend();
    +    xmlGenericError(xmlGenericErrorContext, "
    "); +} + +/** + * xmlHTMLError: + * @ctx: an XML parser context + * @msg: the message to display/transmit + * @...: extra parameters for the message display + * + * Display and format an error messages, gives file, line, position and + * extra parameters. + */ +static void XMLCDECL +xmlHTMLError(void *ctx, const char *msg, ...) +{ + xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; + xmlParserInputPtr input; + va_list args; + int len; + + buffer[0] = 0; + input = ctxt->input; + if ((input != NULL) && (input->filename == NULL) && (ctxt->inputNr > 1)) { + input = ctxt->inputTab[ctxt->inputNr - 2]; + } + + xmlHTMLPrintFileInfo(input); + + xmlGenericError(xmlGenericErrorContext, "error: "); + va_start(args, msg); + len = strlen(buffer); + vsnprintf(&buffer[len], sizeof(buffer) - len, msg, args); + va_end(args); + xmlHTMLEncodeSend(); + xmlGenericError(xmlGenericErrorContext, "

    \n"); + + xmlHTMLPrintFileContext(input); + xmlHTMLEncodeSend(); +} + +/** + * xmlHTMLWarning: + * @ctx: an XML parser context + * @msg: the message to display/transmit + * @...: extra parameters for the message display + * + * Display and format a warning messages, gives file, line, position and + * extra parameters. + */ +static void XMLCDECL +xmlHTMLWarning(void *ctx, const char *msg, ...) +{ + xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; + xmlParserInputPtr input; + va_list args; + int len; + + buffer[0] = 0; + input = ctxt->input; + if ((input != NULL) && (input->filename == NULL) && (ctxt->inputNr > 1)) { + input = ctxt->inputTab[ctxt->inputNr - 2]; + } + + + xmlHTMLPrintFileInfo(input); + + xmlGenericError(xmlGenericErrorContext, "warning: "); + va_start(args, msg); + len = strlen(buffer); + vsnprintf(&buffer[len], sizeof(buffer) - len, msg, args); + va_end(args); + xmlHTMLEncodeSend(); + xmlGenericError(xmlGenericErrorContext, "

    \n"); + + xmlHTMLPrintFileContext(input); + xmlHTMLEncodeSend(); +} + +/** + * xmlHTMLValidityError: + * @ctx: an XML parser context + * @msg: the message to display/transmit + * @...: extra parameters for the message display + * + * Display and format an validity error messages, gives file, + * line, position and extra parameters. + */ +static void XMLCDECL +xmlHTMLValidityError(void *ctx, const char *msg, ...) +{ + xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; + xmlParserInputPtr input; + va_list args; + int len; + + buffer[0] = 0; + input = ctxt->input; + if ((input->filename == NULL) && (ctxt->inputNr > 1)) + input = ctxt->inputTab[ctxt->inputNr - 2]; + + xmlHTMLPrintFileInfo(input); + + xmlGenericError(xmlGenericErrorContext, "validity error: "); + len = strlen(buffer); + va_start(args, msg); + vsnprintf(&buffer[len], sizeof(buffer) - len, msg, args); + va_end(args); + xmlHTMLEncodeSend(); + xmlGenericError(xmlGenericErrorContext, "

    \n"); + + xmlHTMLPrintFileContext(input); + xmlHTMLEncodeSend(); + progresult = XMLLINT_ERR_VALID; +} + +/** + * xmlHTMLValidityWarning: + * @ctx: an XML parser context + * @msg: the message to display/transmit + * @...: extra parameters for the message display + * + * Display and format a validity warning messages, gives file, line, + * position and extra parameters. + */ +static void XMLCDECL +xmlHTMLValidityWarning(void *ctx, const char *msg, ...) +{ + xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; + xmlParserInputPtr input; + va_list args; + int len; + + buffer[0] = 0; + input = ctxt->input; + if ((input->filename == NULL) && (ctxt->inputNr > 1)) + input = ctxt->inputTab[ctxt->inputNr - 2]; + + xmlHTMLPrintFileInfo(input); + + xmlGenericError(xmlGenericErrorContext, "validity warning: "); + va_start(args, msg); + len = strlen(buffer); + vsnprintf(&buffer[len], sizeof(buffer) - len, msg, args); + va_end(args); + xmlHTMLEncodeSend(); + xmlGenericError(xmlGenericErrorContext, "

    \n"); + + xmlHTMLPrintFileContext(input); + xmlHTMLEncodeSend(); +} + +/************************************************************************ + * * + * Shell Interface * + * * + ************************************************************************/ +#ifdef LIBXML_DEBUG_ENABLED +#ifdef LIBXML_XPATH_ENABLED +/** + * xmlShellReadline: + * @prompt: the prompt value + * + * Read a string + * + * Returns a pointer to it or NULL on EOF the caller is expected to + * free the returned string. + */ +static char * +xmlShellReadline(char *prompt) { +#ifdef HAVE_LIBREADLINE + char *line_read; + + /* Get a line from the user. */ + line_read = readline (prompt); + + /* If the line has any text in it, save it on the history. */ + if (line_read && *line_read) + add_history (line_read); + + return (line_read); +#else + char line_read[501]; + char *ret; + int len; + + if (prompt != NULL) + fprintf(stdout, "%s", prompt); + if (!fgets(line_read, 500, stdin)) + return(NULL); + line_read[500] = 0; + len = strlen(line_read); + ret = (char *) malloc(len + 1); + if (ret != NULL) { + memcpy (ret, line_read, len + 1); + } + return(ret); +#endif +} +#endif /* LIBXML_XPATH_ENABLED */ +#endif /* LIBXML_DEBUG_ENABLED */ + +/************************************************************************ + * * + * I/O Interfaces * + * * + ************************************************************************/ + +static int myRead(FILE *f, char * buf, int len) { + return(fread(buf, 1, len, f)); +} +static void myClose(FILE *f) { + if (f != stdin) { + fclose(f); + } +} + +/************************************************************************ + * * + * SAX based tests * + * * + ************************************************************************/ + +/* + * empty SAX block + */ +static xmlSAXHandler emptySAXHandlerStruct = { + NULL, /* internalSubset */ + NULL, /* isStandalone */ + NULL, /* hasInternalSubset */ + NULL, /* hasExternalSubset */ + NULL, /* resolveEntity */ + NULL, /* getEntity */ + NULL, /* entityDecl */ + NULL, /* notationDecl */ + NULL, /* attributeDecl */ + NULL, /* elementDecl */ + NULL, /* unparsedEntityDecl */ + NULL, /* setDocumentLocator */ + NULL, /* startDocument */ + NULL, /* endDocument */ + NULL, /* startElement */ + NULL, /* endElement */ + NULL, /* reference */ + NULL, /* characters */ + NULL, /* ignorableWhitespace */ + NULL, /* processingInstruction */ + NULL, /* comment */ + NULL, /* xmlParserWarning */ + NULL, /* xmlParserError */ + NULL, /* xmlParserError */ + NULL, /* getParameterEntity */ + NULL, /* cdataBlock; */ + NULL, /* externalSubset; */ + XML_SAX2_MAGIC, + NULL, + NULL, /* startElementNs */ + NULL, /* endElementNs */ + NULL /* xmlStructuredErrorFunc */ +}; + +static xmlSAXHandlerPtr emptySAXHandler = &emptySAXHandlerStruct; +extern xmlSAXHandlerPtr debugSAXHandler; +static int callbacks; + +/** + * isStandaloneDebug: + * @ctxt: An XML parser context + * + * Is this document tagged standalone ? + * + * Returns 1 if true + */ +static int +isStandaloneDebug(void *ctx ATTRIBUTE_UNUSED) +{ + callbacks++; + if (noout) + return(0); + fprintf(stdout, "SAX.isStandalone()\n"); + return(0); +} + +/** + * hasInternalSubsetDebug: + * @ctxt: An XML parser context + * + * Does this document has an internal subset + * + * Returns 1 if true + */ +static int +hasInternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED) +{ + callbacks++; + if (noout) + return(0); + fprintf(stdout, "SAX.hasInternalSubset()\n"); + return(0); +} + +/** + * hasExternalSubsetDebug: + * @ctxt: An XML parser context + * + * Does this document has an external subset + * + * Returns 1 if true + */ +static int +hasExternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED) +{ + callbacks++; + if (noout) + return(0); + fprintf(stdout, "SAX.hasExternalSubset()\n"); + return(0); +} + +/** + * internalSubsetDebug: + * @ctxt: An XML parser context + * + * Does this document has an internal subset + */ +static void +internalSubsetDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, + const xmlChar *ExternalID, const xmlChar *SystemID) +{ + callbacks++; + if (noout) + return; + fprintf(stdout, "SAX.internalSubset(%s,", name); + if (ExternalID == NULL) + fprintf(stdout, " ,"); + else + fprintf(stdout, " %s,", ExternalID); + if (SystemID == NULL) + fprintf(stdout, " )\n"); + else + fprintf(stdout, " %s)\n", SystemID); +} + +/** + * externalSubsetDebug: + * @ctxt: An XML parser context + * + * Does this document has an external subset + */ +static void +externalSubsetDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, + const xmlChar *ExternalID, const xmlChar *SystemID) +{ + callbacks++; + if (noout) + return; + fprintf(stdout, "SAX.externalSubset(%s,", name); + if (ExternalID == NULL) + fprintf(stdout, " ,"); + else + fprintf(stdout, " %s,", ExternalID); + if (SystemID == NULL) + fprintf(stdout, " )\n"); + else + fprintf(stdout, " %s)\n", SystemID); +} + +/** + * resolveEntityDebug: + * @ctxt: An XML parser context + * @publicId: The public ID of the entity + * @systemId: The system ID of the entity + * + * Special entity resolver, better left to the parser, it has + * more context than the application layer. + * The default behaviour is to NOT resolve the entities, in that case + * the ENTITY_REF nodes are built in the structure (and the parameter + * values). + * + * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour. + */ +static xmlParserInputPtr +resolveEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *publicId, const xmlChar *systemId) +{ + callbacks++; + if (noout) + return(NULL); + /* xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; */ + + + fprintf(stdout, "SAX.resolveEntity("); + if (publicId != NULL) + fprintf(stdout, "%s", (char *)publicId); + else + fprintf(stdout, " "); + if (systemId != NULL) + fprintf(stdout, ", %s)\n", (char *)systemId); + else + fprintf(stdout, ", )\n"); + return(NULL); +} + +/** + * getEntityDebug: + * @ctxt: An XML parser context + * @name: The entity name + * + * Get an entity by name + * + * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour. + */ +static xmlEntityPtr +getEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name) +{ + callbacks++; + if (noout) + return(NULL); + fprintf(stdout, "SAX.getEntity(%s)\n", name); + return(NULL); +} + +/** + * getParameterEntityDebug: + * @ctxt: An XML parser context + * @name: The entity name + * + * Get a parameter entity by name + * + * Returns the xmlParserInputPtr + */ +static xmlEntityPtr +getParameterEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name) +{ + callbacks++; + if (noout) + return(NULL); + fprintf(stdout, "SAX.getParameterEntity(%s)\n", name); + return(NULL); +} + + +/** + * entityDeclDebug: + * @ctxt: An XML parser context + * @name: the entity name + * @type: the entity type + * @publicId: The public ID of the entity + * @systemId: The system ID of the entity + * @content: the entity value (without processing). + * + * An entity definition has been parsed + */ +static void +entityDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, int type, + const xmlChar *publicId, const xmlChar *systemId, xmlChar *content) +{ +const xmlChar *nullstr = BAD_CAST "(null)"; + /* not all libraries handle printing null pointers nicely */ + if (publicId == NULL) + publicId = nullstr; + if (systemId == NULL) + systemId = nullstr; + if (content == NULL) + content = (xmlChar *)nullstr; + callbacks++; + if (noout) + return; + fprintf(stdout, "SAX.entityDecl(%s, %d, %s, %s, %s)\n", + name, type, publicId, systemId, content); +} + +/** + * attributeDeclDebug: + * @ctxt: An XML parser context + * @name: the attribute name + * @type: the attribute type + * + * An attribute definition has been parsed + */ +static void +attributeDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar * elem, + const xmlChar * name, int type, int def, + const xmlChar * defaultValue, xmlEnumerationPtr tree) +{ + callbacks++; + if (noout) + return; + if (defaultValue == NULL) + fprintf(stdout, "SAX.attributeDecl(%s, %s, %d, %d, NULL, ...)\n", + elem, name, type, def); + else + fprintf(stdout, "SAX.attributeDecl(%s, %s, %d, %d, %s, ...)\n", + elem, name, type, def, defaultValue); + xmlFreeEnumeration(tree); +} + +/** + * elementDeclDebug: + * @ctxt: An XML parser context + * @name: the element name + * @type: the element type + * @content: the element value (without processing). + * + * An element definition has been parsed + */ +static void +elementDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, int type, + xmlElementContentPtr content ATTRIBUTE_UNUSED) +{ + callbacks++; + if (noout) + return; + fprintf(stdout, "SAX.elementDecl(%s, %d, ...)\n", + name, type); +} + +/** + * notationDeclDebug: + * @ctxt: An XML parser context + * @name: The name of the notation + * @publicId: The public ID of the entity + * @systemId: The system ID of the entity + * + * What to do when a notation declaration has been parsed. + */ +static void +notationDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, + const xmlChar *publicId, const xmlChar *systemId) +{ + callbacks++; + if (noout) + return; + fprintf(stdout, "SAX.notationDecl(%s, %s, %s)\n", + (char *) name, (char *) publicId, (char *) systemId); +} + +/** + * unparsedEntityDeclDebug: + * @ctxt: An XML parser context + * @name: The name of the entity + * @publicId: The public ID of the entity + * @systemId: The system ID of the entity + * @notationName: the name of the notation + * + * What to do when an unparsed entity declaration is parsed + */ +static void +unparsedEntityDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, + const xmlChar *publicId, const xmlChar *systemId, + const xmlChar *notationName) +{ +const xmlChar *nullstr = BAD_CAST "(null)"; + + if (publicId == NULL) + publicId = nullstr; + if (systemId == NULL) + systemId = nullstr; + if (notationName == NULL) + notationName = nullstr; + callbacks++; + if (noout) + return; + fprintf(stdout, "SAX.unparsedEntityDecl(%s, %s, %s, %s)\n", + (char *) name, (char *) publicId, (char *) systemId, + (char *) notationName); +} + +/** + * setDocumentLocatorDebug: + * @ctxt: An XML parser context + * @loc: A SAX Locator + * + * Receive the document locator at startup, actually xmlDefaultSAXLocator + * Everything is available on the context, so this is useless in our case. + */ +static void +setDocumentLocatorDebug(void *ctx ATTRIBUTE_UNUSED, xmlSAXLocatorPtr loc ATTRIBUTE_UNUSED) +{ + callbacks++; + if (noout) + return; + fprintf(stdout, "SAX.setDocumentLocator()\n"); +} + +/** + * startDocumentDebug: + * @ctxt: An XML parser context + * + * called when the document start being processed. + */ +static void +startDocumentDebug(void *ctx ATTRIBUTE_UNUSED) +{ + callbacks++; + if (noout) + return; + fprintf(stdout, "SAX.startDocument()\n"); +} + +/** + * endDocumentDebug: + * @ctxt: An XML parser context + * + * called when the document end has been detected. + */ +static void +endDocumentDebug(void *ctx ATTRIBUTE_UNUSED) +{ + callbacks++; + if (noout) + return; + fprintf(stdout, "SAX.endDocument()\n"); +} + +/** + * startElementDebug: + * @ctxt: An XML parser context + * @name: The element name + * + * called when an opening tag has been processed. + */ +static void +startElementDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, const xmlChar **atts) +{ + int i; + + callbacks++; + if (noout) + return; + fprintf(stdout, "SAX.startElement(%s", (char *) name); + if (atts != NULL) { + for (i = 0;(atts[i] != NULL);i++) { + fprintf(stdout, ", %s='", atts[i++]); + if (atts[i] != NULL) + fprintf(stdout, "%s'", atts[i]); + } + } + fprintf(stdout, ")\n"); +} + +/** + * endElementDebug: + * @ctxt: An XML parser context + * @name: The element name + * + * called when the end of an element has been detected. + */ +static void +endElementDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name) +{ + callbacks++; + if (noout) + return; + fprintf(stdout, "SAX.endElement(%s)\n", (char *) name); +} + +/** + * charactersDebug: + * @ctxt: An XML parser context + * @ch: a xmlChar string + * @len: the number of xmlChar + * + * receiving some chars from the parser. + * Question: how much at a time ??? + */ +static void +charactersDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len) +{ + char out[40]; + int i; + + callbacks++; + if (noout) + return; + for (i = 0;(i 0) { + fprintf(stderr, "%s fails to validate\n", filename); + progresult = XMLLINT_ERR_VALID; + } else { + fprintf(stderr, "%s validation generated an internal error\n", + filename); + progresult = XMLLINT_ERR_VALID; + } + } + xmlSchemaFreeValidCtxt(vctxt); + } else +#endif + { + /* + * Create the parser context amd hook the input + */ + ctxt = xmlNewParserCtxt(); + if (ctxt == NULL) { + xmlFreeParserInputBuffer(buf); + goto error; + } + old_sax = ctxt->sax; + ctxt->sax = handler; + ctxt->userData = (void *) user_data; + inputStream = xmlNewIOInputStream(ctxt, buf, XML_CHAR_ENCODING_NONE); + if (inputStream == NULL) { + xmlFreeParserInputBuffer(buf); + goto error; + } + inputPush(ctxt, inputStream); + + /* do the parsing */ + xmlParseDocument(ctxt); + + if (ctxt->myDoc != NULL) { + fprintf(stderr, "SAX generated a doc !\n"); + xmlFreeDoc(ctxt->myDoc); + ctxt->myDoc = NULL; + } + } + +error: + if (ctxt != NULL) { + ctxt->sax = old_sax; + xmlFreeParserCtxt(ctxt); + } +} + +/************************************************************************ + * * + * Stream Test processing * + * * + ************************************************************************/ +#ifdef LIBXML_READER_ENABLED +static void processNode(xmlTextReaderPtr reader) { + const xmlChar *name, *value; + int type, empty; + + type = xmlTextReaderNodeType(reader); + empty = xmlTextReaderIsEmptyElement(reader); + + if (debug) { + name = xmlTextReaderConstName(reader); + if (name == NULL) + name = BAD_CAST "--"; + + value = xmlTextReaderConstValue(reader); + + + printf("%d %d %s %d %d", + xmlTextReaderDepth(reader), + type, + name, + empty, + xmlTextReaderHasValue(reader)); + if (value == NULL) + printf("\n"); + else { + printf(" %s\n", value); + } + } +#ifdef LIBXML_PATTERN_ENABLED + if (patternc) { + xmlChar *path = NULL; + int match = -1; + + if (type == XML_READER_TYPE_ELEMENT) { + /* do the check only on element start */ + match = xmlPatternMatch(patternc, xmlTextReaderCurrentNode(reader)); + + if (match) { +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_DEBUG_ENABLED) + path = xmlGetNodePath(xmlTextReaderCurrentNode(reader)); + printf("Node %s matches pattern %s\n", path, pattern); +#else + printf("Node %s matches pattern %s\n", + xmlTextReaderConstName(reader), pattern); +#endif + } + } + if (patstream != NULL) { + int ret; + + if (type == XML_READER_TYPE_ELEMENT) { + ret = xmlStreamPush(patstream, + xmlTextReaderConstLocalName(reader), + xmlTextReaderConstNamespaceUri(reader)); + if (ret < 0) { + fprintf(stderr, "xmlStreamPush() failure\n"); + xmlFreeStreamCtxt(patstream); + patstream = NULL; + } else if (ret != match) { +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_DEBUG_ENABLED) + if (path == NULL) { + path = xmlGetNodePath( + xmlTextReaderCurrentNode(reader)); + } +#endif + fprintf(stderr, + "xmlPatternMatch and xmlStreamPush disagree\n"); + if (path != NULL) + fprintf(stderr, " pattern %s node %s\n", + pattern, path); + else + fprintf(stderr, " pattern %s node %s\n", + pattern, xmlTextReaderConstName(reader)); + } + + } + if ((type == XML_READER_TYPE_END_ELEMENT) || + ((type == XML_READER_TYPE_ELEMENT) && (empty))) { + ret = xmlStreamPop(patstream); + if (ret < 0) { + fprintf(stderr, "xmlStreamPop() failure\n"); + xmlFreeStreamCtxt(patstream); + patstream = NULL; + } + } + } + if (path != NULL) + xmlFree(path); + } +#endif +} + +static void streamFile(char *filename) { + xmlTextReaderPtr reader; + int ret; +#ifdef HAVE_MMAP + int fd = -1; + struct stat info; + const char *base = NULL; + xmlParserInputBufferPtr input = NULL; + + if (memory) { + if (stat(filename, &info) < 0) + return; + if ((fd = open(filename, O_RDONLY)) < 0) + return; + base = mmap(NULL, info.st_size, PROT_READ, MAP_SHARED, fd, 0) ; + if (base == (void *) MAP_FAILED) + return; + + reader = xmlReaderForMemory(base, info.st_size, filename, + NULL, options); + } else +#endif + reader = xmlReaderForFile(filename, NULL, options); +#ifdef LIBXML_PATTERN_ENABLED + if (pattern != NULL) { + patternc = xmlPatterncompile((const xmlChar *) pattern, NULL, 0, NULL); + if (patternc == NULL) { + xmlGenericError(xmlGenericErrorContext, + "Pattern %s failed to compile\n", pattern); + progresult = XMLLINT_ERR_SCHEMAPAT; + pattern = NULL; + } + } + if (patternc != NULL) { + patstream = xmlPatternGetStreamCtxt(patternc); + if (patstream != NULL) { + ret = xmlStreamPush(patstream, NULL, NULL); + if (ret < 0) { + fprintf(stderr, "xmlStreamPush() failure\n"); + xmlFreeStreamCtxt(patstream); + patstream = NULL; + } + } + } +#endif + + + if (reader != NULL) { +#ifdef LIBXML_VALID_ENABLED + if (valid) + xmlTextReaderSetParserProp(reader, XML_PARSER_VALIDATE, 1); + else +#endif /* LIBXML_VALID_ENABLED */ + if (loaddtd) + xmlTextReaderSetParserProp(reader, XML_PARSER_LOADDTD, 1); +#ifdef LIBXML_SCHEMAS_ENABLED + if (relaxng != NULL) { + if ((timing) && (!repeat)) { + startTimer(); + } + ret = xmlTextReaderRelaxNGValidate(reader, relaxng); + if (ret < 0) { + xmlGenericError(xmlGenericErrorContext, + "Relax-NG schema %s failed to compile\n", relaxng); + progresult = XMLLINT_ERR_SCHEMACOMP; + relaxng = NULL; + } + if ((timing) && (!repeat)) { + endTimer("Compiling the schemas"); + } + } + if (schema != NULL) { + if ((timing) && (!repeat)) { + startTimer(); + } + ret = xmlTextReaderSchemaValidate(reader, schema); + if (ret < 0) { + xmlGenericError(xmlGenericErrorContext, + "XSD schema %s failed to compile\n", schema); + progresult = XMLLINT_ERR_SCHEMACOMP; + schema = NULL; + } + if ((timing) && (!repeat)) { + endTimer("Compiling the schemas"); + } + } +#endif + + /* + * Process all nodes in sequence + */ + if ((timing) && (!repeat)) { + startTimer(); + } + ret = xmlTextReaderRead(reader); + while (ret == 1) { + if ((debug) +#ifdef LIBXML_PATTERN_ENABLED + || (patternc) +#endif + ) + processNode(reader); + ret = xmlTextReaderRead(reader); + } + if ((timing) && (!repeat)) { +#ifdef LIBXML_SCHEMAS_ENABLED + if (relaxng != NULL) + endTimer("Parsing and validating"); + else +#endif +#ifdef LIBXML_VALID_ENABLED + if (valid) + endTimer("Parsing and validating"); + else +#endif + endTimer("Parsing"); + } + +#ifdef LIBXML_VALID_ENABLED + if (valid) { + if (xmlTextReaderIsValid(reader) != 1) { + xmlGenericError(xmlGenericErrorContext, + "Document %s does not validate\n", filename); + progresult = XMLLINT_ERR_VALID; + } + } +#endif /* LIBXML_VALID_ENABLED */ +#ifdef LIBXML_SCHEMAS_ENABLED + if ((relaxng != NULL) || (schema != NULL)) { + if (xmlTextReaderIsValid(reader) != 1) { + fprintf(stderr, "%s fails to validate\n", filename); + progresult = XMLLINT_ERR_VALID; + } else { + fprintf(stderr, "%s validates\n", filename); + } + } +#endif + /* + * Done, cleanup and status + */ + xmlFreeTextReader(reader); + if (ret != 0) { + fprintf(stderr, "%s : failed to parse\n", filename); + progresult = XMLLINT_ERR_UNCLASS; + } + } else { + fprintf(stderr, "Unable to open %s\n", filename); + progresult = XMLLINT_ERR_UNCLASS; + } +#ifdef LIBXML_PATTERN_ENABLED + if (patstream != NULL) { + xmlFreeStreamCtxt(patstream); + patstream = NULL; + } +#endif +#ifdef HAVE_MMAP + if (memory) { + xmlFreeParserInputBuffer(input); + munmap((char *) base, info.st_size); + close(fd); + } +#endif +} + +static void walkDoc(xmlDocPtr doc) { + xmlTextReaderPtr reader; + int ret; + +#ifdef LIBXML_PATTERN_ENABLED + xmlNodePtr root; + const xmlChar *namespaces[22]; + int i; + xmlNsPtr ns; + + root = xmlDocGetRootElement(doc); + for (ns = root->nsDef, i = 0;ns != NULL && i < 20;ns=ns->next) { + namespaces[i++] = ns->href; + namespaces[i++] = ns->prefix; + } + namespaces[i++] = NULL; + namespaces[i] = NULL; + + if (pattern != NULL) { + patternc = xmlPatterncompile((const xmlChar *) pattern, doc->dict, + 0, &namespaces[0]); + if (patternc == NULL) { + xmlGenericError(xmlGenericErrorContext, + "Pattern %s failed to compile\n", pattern); + progresult = XMLLINT_ERR_SCHEMAPAT; + pattern = NULL; + } + } + if (patternc != NULL) { + patstream = xmlPatternGetStreamCtxt(patternc); + if (patstream != NULL) { + ret = xmlStreamPush(patstream, NULL, NULL); + if (ret < 0) { + fprintf(stderr, "xmlStreamPush() failure\n"); + xmlFreeStreamCtxt(patstream); + patstream = NULL; + } + } + } +#endif /* LIBXML_PATTERN_ENABLED */ + reader = xmlReaderWalker(doc); + if (reader != NULL) { + if ((timing) && (!repeat)) { + startTimer(); + } + ret = xmlTextReaderRead(reader); + while (ret == 1) { + if ((debug) +#ifdef LIBXML_PATTERN_ENABLED + || (patternc) +#endif + ) + processNode(reader); + ret = xmlTextReaderRead(reader); + } + if ((timing) && (!repeat)) { + endTimer("walking through the doc"); + } + xmlFreeTextReader(reader); + if (ret != 0) { + fprintf(stderr, "failed to walk through the doc\n"); + progresult = XMLLINT_ERR_UNCLASS; + } + } else { + fprintf(stderr, "Failed to crate a reader from the document\n"); + progresult = XMLLINT_ERR_UNCLASS; + } +#ifdef LIBXML_PATTERN_ENABLED + if (patstream != NULL) { + xmlFreeStreamCtxt(patstream); + patstream = NULL; + } +#endif +} +#endif /* LIBXML_READER_ENABLED */ + +#ifdef LIBXML_XPATH_ENABLED +/************************************************************************ + * * + * XPath Query * + * * + ************************************************************************/ + +static void doXPathDump(xmlXPathObjectPtr cur) { + switch(cur->type) { + case XPATH_NODESET: { + int i; + xmlNodePtr node; +#ifdef LIBXML_OUTPUT_ENABLED + xmlSaveCtxtPtr ctxt; + + if ((cur->nodesetval == NULL) || (cur->nodesetval->nodeNr <= 0)) { + fprintf(stderr, "XPath set is empty\n"); + progresult = XMLLINT_ERR_XPATH; + break; + } + ctxt = xmlSaveToFd(1, NULL, 0); + if (ctxt == NULL) { + fprintf(stderr, "Out of memory for XPath\n"); + progresult = XMLLINT_ERR_MEM; + return; + } + for (i = 0;i < cur->nodesetval->nodeNr;i++) { + node = cur->nodesetval->nodeTab[i]; + xmlSaveTree(ctxt, node); + } + xmlSaveClose(ctxt); +#else + printf("xpath returned %d nodes\n", cur->nodesetval->nodeNr); +#endif + break; + } + case XPATH_BOOLEAN: + if (cur->boolval) printf("true"); + else printf("false"); + break; + case XPATH_NUMBER: + switch (xmlXPathIsInf(cur->floatval)) { + case 1: + printf("Infinity"); + break; + case -1: + printf("-Infinity"); + break; + default: + if (xmlXPathIsNaN(cur->floatval)) { + printf("NaN"); + } else { + printf("%0g", cur->floatval); + } + } + break; + case XPATH_STRING: + printf("%s", (const char *) cur->stringval); + break; + case XPATH_UNDEFINED: + fprintf(stderr, "XPath Object is uninitialized\n"); + progresult = XMLLINT_ERR_XPATH; + break; + default: + fprintf(stderr, "XPath object of unexpected type\n"); + progresult = XMLLINT_ERR_XPATH; + break; + } +} + +static void doXPathQuery(xmlDocPtr doc, const char *query) { + xmlXPathContextPtr ctxt; + xmlXPathObjectPtr res; + + ctxt = xmlXPathNewContext(doc); + if (ctxt == NULL) { + fprintf(stderr, "Out of memory for XPath\n"); + progresult = XMLLINT_ERR_MEM; + return; + } + ctxt->node = (xmlNodePtr) doc; + res = xmlXPathEval(BAD_CAST query, ctxt); + xmlXPathFreeContext(ctxt); + + if (res == NULL) { + fprintf(stderr, "XPath evaluation failure\n"); + progresult = XMLLINT_ERR_XPATH; + return; + } + doXPathDump(res); + xmlXPathFreeObject(res); +} +#endif /* LIBXML_XPATH_ENABLED */ + +/************************************************************************ + * * + * Tree Test processing * + * * + ************************************************************************/ +static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) { + xmlDocPtr doc = NULL; +#ifdef LIBXML_TREE_ENABLED + xmlDocPtr tmp; +#endif /* LIBXML_TREE_ENABLED */ + + if ((timing) && (!repeat)) + startTimer(); + + +#ifdef LIBXML_TREE_ENABLED + if (filename == NULL) { + if (generate) { + xmlNodePtr n; + + doc = xmlNewDoc(BAD_CAST "1.0"); + n = xmlNewDocNode(doc, NULL, BAD_CAST "info", NULL); + xmlNodeSetContent(n, BAD_CAST "abc"); + xmlDocSetRootElement(doc, n); + } + } +#endif /* LIBXML_TREE_ENABLED */ +#ifdef LIBXML_HTML_ENABLED +#ifdef LIBXML_PUSH_ENABLED + else if ((html) && (push)) { + FILE *f; + +#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) + f = fopen(filename, "rb"); +#else + f = fopen(filename, "r"); +#endif + if (f != NULL) { + int res; + char chars[4096]; + htmlParserCtxtPtr ctxt; + + res = fread(chars, 1, 4, f); + if (res > 0) { + ctxt = htmlCreatePushParserCtxt(NULL, NULL, + chars, res, filename, XML_CHAR_ENCODING_NONE); + while ((res = fread(chars, 1, pushsize, f)) > 0) { + htmlParseChunk(ctxt, chars, res, 0); + } + htmlParseChunk(ctxt, chars, 0, 1); + doc = ctxt->myDoc; + htmlFreeParserCtxt(ctxt); + } + fclose(f); + } + } +#endif /* LIBXML_PUSH_ENABLED */ +#ifdef HAVE_MMAP + else if ((html) && (memory)) { + int fd; + struct stat info; + const char *base; + if (stat(filename, &info) < 0) + return; + if ((fd = open(filename, O_RDONLY)) < 0) + return; + base = mmap(NULL, info.st_size, PROT_READ, MAP_SHARED, fd, 0) ; + if (base == (void *) MAP_FAILED) + return; + + doc = htmlReadMemory((char *) base, info.st_size, filename, + NULL, options); + + munmap((char *) base, info.st_size); + close(fd); + } +#endif + else if (html) { + doc = htmlReadFile(filename, NULL, options); + } +#endif /* LIBXML_HTML_ENABLED */ + else { +#ifdef LIBXML_PUSH_ENABLED + /* + * build an XML tree from a string; + */ + if (push) { + FILE *f; + + /* '-' Usually means stdin - */ + if ((filename[0] == '-') && (filename[1] == 0)) { + f = stdin; + } else { +#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) + f = fopen(filename, "rb"); +#else + f = fopen(filename, "r"); +#endif + } + if (f != NULL) { + int ret; + int res, size = 1024; + char chars[1024]; + xmlParserCtxtPtr ctxt; + + /* if (repeat) size = 1024; */ + res = fread(chars, 1, 4, f); + if (res > 0) { + ctxt = xmlCreatePushParserCtxt(NULL, NULL, + chars, res, filename); + xmlCtxtUseOptions(ctxt, options); + while ((res = fread(chars, 1, size, f)) > 0) { + xmlParseChunk(ctxt, chars, res, 0); + } + xmlParseChunk(ctxt, chars, 0, 1); + doc = ctxt->myDoc; + ret = ctxt->wellFormed; + xmlFreeParserCtxt(ctxt); + if (!ret) { + xmlFreeDoc(doc); + doc = NULL; + } + } + if (f != stdin) + fclose(f); + } + } else +#endif /* LIBXML_PUSH_ENABLED */ + if (testIO) { + if ((filename[0] == '-') && (filename[1] == 0)) { + doc = xmlReadFd(0, NULL, NULL, options); + } else { + FILE *f; + +#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) + f = fopen(filename, "rb"); +#else + f = fopen(filename, "r"); +#endif + if (f != NULL) { + if (rectxt == NULL) + doc = xmlReadIO((xmlInputReadCallback) myRead, + (xmlInputCloseCallback) myClose, f, + filename, NULL, options); + else + doc = xmlCtxtReadIO(rectxt, + (xmlInputReadCallback) myRead, + (xmlInputCloseCallback) myClose, f, + filename, NULL, options); + } else + doc = NULL; + } + } else if (htmlout) { + xmlParserCtxtPtr ctxt; + + if (rectxt == NULL) + ctxt = xmlNewParserCtxt(); + else + ctxt = rectxt; + if (ctxt == NULL) { + doc = NULL; + } else { + ctxt->sax->error = xmlHTMLError; + ctxt->sax->warning = xmlHTMLWarning; + ctxt->vctxt.error = xmlHTMLValidityError; + ctxt->vctxt.warning = xmlHTMLValidityWarning; + + doc = xmlCtxtReadFile(ctxt, filename, NULL, options); + + if (rectxt == NULL) + xmlFreeParserCtxt(ctxt); + } +#ifdef HAVE_MMAP + } else if (memory) { + int fd; + struct stat info; + const char *base; + if (stat(filename, &info) < 0) + return; + if ((fd = open(filename, O_RDONLY)) < 0) + return; + base = mmap(NULL, info.st_size, PROT_READ, MAP_SHARED, fd, 0) ; + if (base == (void *) MAP_FAILED) + return; + + if (rectxt == NULL) + doc = xmlReadMemory((char *) base, info.st_size, + filename, NULL, options); + else + doc = xmlCtxtReadMemory(rectxt, (char *) base, info.st_size, + filename, NULL, options); + + munmap((char *) base, info.st_size); + close(fd); +#endif +#ifdef LIBXML_VALID_ENABLED + } else if (valid) { + xmlParserCtxtPtr ctxt = NULL; + + if (rectxt == NULL) + ctxt = xmlNewParserCtxt(); + else + ctxt = rectxt; + if (ctxt == NULL) { + doc = NULL; + } else { + doc = xmlCtxtReadFile(ctxt, filename, NULL, options); + + if (ctxt->valid == 0) + progresult = XMLLINT_ERR_RDFILE; + if (rectxt == NULL) + xmlFreeParserCtxt(ctxt); + } +#endif /* LIBXML_VALID_ENABLED */ + } else { + if (rectxt != NULL) + doc = xmlCtxtReadFile(rectxt, filename, NULL, options); + else { +#ifdef LIBXML_SAX1_ENABLED + if (sax1) + doc = xmlParseFile(filename); + else +#endif /* LIBXML_SAX1_ENABLED */ + doc = xmlReadFile(filename, NULL, options); + } + } + } + + /* + * If we don't have a document we might as well give up. Do we + * want an error message here? */ + if (doc == NULL) { + progresult = XMLLINT_ERR_UNCLASS; + return; + } + + if ((timing) && (!repeat)) { + endTimer("Parsing"); + } + + /* + * Remove DOCTYPE nodes + */ + if (dropdtd) { + xmlDtdPtr dtd; + + dtd = xmlGetIntSubset(doc); + if (dtd != NULL) { + xmlUnlinkNode((xmlNodePtr)dtd); + xmlFreeDtd(dtd); + } + } + +#ifdef LIBXML_XINCLUDE_ENABLED + if (xinclude) { + if ((timing) && (!repeat)) { + startTimer(); + } + if (xmlXIncludeProcessFlags(doc, options) < 0) + progresult = XMLLINT_ERR_UNCLASS; + if ((timing) && (!repeat)) { + endTimer("Xinclude processing"); + } + } +#endif + +#ifdef LIBXML_XPATH_ENABLED + if (xpathquery != NULL) { + doXPathQuery(doc, xpathquery); + } +#endif + +#ifdef LIBXML_DEBUG_ENABLED +#ifdef LIBXML_XPATH_ENABLED + /* + * shell interaction + */ + if (shell) { + xmlXPathOrderDocElems(doc); + xmlShell(doc, filename, xmlShellReadline, stdout); + } +#endif +#endif + +#ifdef LIBXML_TREE_ENABLED + /* + * test intermediate copy if needed. + */ + if (copy) { + tmp = doc; + if (timing) { + startTimer(); + } + doc = xmlCopyDoc(doc, 1); + if (timing) { + endTimer("Copying"); + } + if (timing) { + startTimer(); + } + xmlFreeDoc(tmp); + if (timing) { + endTimer("Freeing original"); + } + } +#endif /* LIBXML_TREE_ENABLED */ + +#ifdef LIBXML_VALID_ENABLED + if ((insert) && (!html)) { + const xmlChar* list[256]; + int nb, i; + xmlNodePtr node; + + if (doc->children != NULL) { + node = doc->children; + while ((node != NULL) && (node->last == NULL)) node = node->next; + if (node != NULL) { + nb = xmlValidGetValidElements(node->last, NULL, list, 256); + if (nb < 0) { + fprintf(stderr, "could not get valid list of elements\n"); + } else if (nb == 0) { + fprintf(stderr, "No element can be inserted under root\n"); + } else { + fprintf(stderr, "%d element types can be inserted under root:\n", + nb); + for (i = 0;i < nb;i++) { + fprintf(stderr, "%s\n", (char *) list[i]); + } + } + } + } + }else +#endif /* LIBXML_VALID_ENABLED */ +#ifdef LIBXML_READER_ENABLED + if (walker) { + walkDoc(doc); + } +#endif /* LIBXML_READER_ENABLED */ +#ifdef LIBXML_OUTPUT_ENABLED + if (noout == 0) { + int ret; + + /* + * print it. + */ +#ifdef LIBXML_DEBUG_ENABLED + if (!debug) { +#endif + if ((timing) && (!repeat)) { + startTimer(); + } +#ifdef LIBXML_HTML_ENABLED + if ((html) && (!xmlout)) { + if (compress) { + htmlSaveFile(output ? output : "-", doc); + } + else if (encoding != NULL) { + if (format == 1) { + htmlSaveFileFormat(output ? output : "-", doc, encoding, 1); + } + else { + htmlSaveFileFormat(output ? output : "-", doc, encoding, 0); + } + } + else if (format == 1) { + htmlSaveFileFormat(output ? output : "-", doc, NULL, 1); + } + else { + FILE *out; + if (output == NULL) + out = stdout; + else { + out = fopen(output,"wb"); + } + if (out != NULL) { + if (htmlDocDump(out, doc) < 0) + progresult = XMLLINT_ERR_OUT; + + if (output != NULL) + fclose(out); + } else { + fprintf(stderr, "failed to open %s\n", output); + progresult = XMLLINT_ERR_OUT; + } + } + if ((timing) && (!repeat)) { + endTimer("Saving"); + } + } else +#endif +#ifdef LIBXML_C14N_ENABLED + if (canonical) { + xmlChar *result = NULL; + int size; + + size = xmlC14NDocDumpMemory(doc, NULL, XML_C14N_1_0, NULL, 1, &result); + if (size >= 0) { + if (write(1, result, size) == -1) { + fprintf(stderr, "Can't write data\n"); + } + xmlFree(result); + } else { + fprintf(stderr, "Failed to canonicalize\n"); + progresult = XMLLINT_ERR_OUT; + } + } else if (canonical) { + xmlChar *result = NULL; + int size; + + size = xmlC14NDocDumpMemory(doc, NULL, XML_C14N_1_1, NULL, 1, &result); + if (size >= 0) { + if (write(1, result, size) == -1) { + fprintf(stderr, "Can't write data\n"); + } + xmlFree(result); + } else { + fprintf(stderr, "Failed to canonicalize\n"); + progresult = XMLLINT_ERR_OUT; + } + } else + if (exc_canonical) { + xmlChar *result = NULL; + int size; + + size = xmlC14NDocDumpMemory(doc, NULL, XML_C14N_EXCLUSIVE_1_0, NULL, 1, &result); + if (size >= 0) { + if (write(1, result, size) == -1) { + fprintf(stderr, "Can't write data\n"); + } + xmlFree(result); + } else { + fprintf(stderr, "Failed to canonicalize\n"); + progresult = XMLLINT_ERR_OUT; + } + } else +#endif +#ifdef HAVE_MMAP + if (memory) { + xmlChar *result; + int len; + + if (encoding != NULL) { + if (format == 1) { + xmlDocDumpFormatMemoryEnc(doc, &result, &len, encoding, 1); + } else { + xmlDocDumpMemoryEnc(doc, &result, &len, encoding); + } + } else { + if (format == 1) + xmlDocDumpFormatMemory(doc, &result, &len, 1); + else + xmlDocDumpMemory(doc, &result, &len); + } + if (result == NULL) { + fprintf(stderr, "Failed to save\n"); + progresult = XMLLINT_ERR_OUT; + } else { + if (write(1, result, len) == -1) { + fprintf(stderr, "Can't write data\n"); + } + xmlFree(result); + } + + } else +#endif /* HAVE_MMAP */ + if (compress) { + xmlSaveFile(output ? output : "-", doc); + } else if (oldout) { + if (encoding != NULL) { + if (format == 1) { + ret = xmlSaveFormatFileEnc(output ? output : "-", doc, + encoding, 1); + } + else { + ret = xmlSaveFileEnc(output ? output : "-", doc, + encoding); + } + if (ret < 0) { + fprintf(stderr, "failed save to %s\n", + output ? output : "-"); + progresult = XMLLINT_ERR_OUT; + } + } else if (format == 1) { + ret = xmlSaveFormatFile(output ? output : "-", doc, 1); + if (ret < 0) { + fprintf(stderr, "failed save to %s\n", + output ? output : "-"); + progresult = XMLLINT_ERR_OUT; + } + } else { + FILE *out; + if (output == NULL) + out = stdout; + else { + out = fopen(output,"wb"); + } + if (out != NULL) { + if (xmlDocDump(out, doc) < 0) + progresult = XMLLINT_ERR_OUT; + + if (output != NULL) + fclose(out); + } else { + fprintf(stderr, "failed to open %s\n", output); + progresult = XMLLINT_ERR_OUT; + } + } + } else { + xmlSaveCtxtPtr ctxt; + int saveOpts = 0; + + if (format == 1) + saveOpts |= XML_SAVE_FORMAT; + else if (format == 2) + saveOpts |= XML_SAVE_WSNONSIG; + +#if defined(LIBXML_HTML_ENABLED) || defined(LIBXML_VALID_ENABLED) + if (xmlout) + saveOpts |= XML_SAVE_AS_XML; +#endif + + if (output == NULL) + ctxt = xmlSaveToFd(1, encoding, saveOpts); + else + ctxt = xmlSaveToFilename(output, encoding, saveOpts); + + if (ctxt != NULL) { + if (xmlSaveDoc(ctxt, doc) < 0) { + fprintf(stderr, "failed save to %s\n", + output ? output : "-"); + progresult = XMLLINT_ERR_OUT; + } + xmlSaveClose(ctxt); + } else { + progresult = XMLLINT_ERR_OUT; + } + } + if ((timing) && (!repeat)) { + endTimer("Saving"); + } +#ifdef LIBXML_DEBUG_ENABLED + } else { + FILE *out; + if (output == NULL) + out = stdout; + else { + out = fopen(output,"wb"); + } + if (out != NULL) { + xmlDebugDumpDocument(out, doc); + + if (output != NULL) + fclose(out); + } else { + fprintf(stderr, "failed to open %s\n", output); + progresult = XMLLINT_ERR_OUT; + } + } +#endif + } +#endif /* LIBXML_OUTPUT_ENABLED */ + +#ifdef LIBXML_VALID_ENABLED + /* + * A posteriori validation test + */ + if ((dtdvalid != NULL) || (dtdvalidfpi != NULL)) { + xmlDtdPtr dtd; + + if ((timing) && (!repeat)) { + startTimer(); + } + if (dtdvalid != NULL) + dtd = xmlParseDTD(NULL, (const xmlChar *)dtdvalid); + else + dtd = xmlParseDTD((const xmlChar *)dtdvalidfpi, NULL); + if ((timing) && (!repeat)) { + endTimer("Parsing DTD"); + } + if (dtd == NULL) { + if (dtdvalid != NULL) + xmlGenericError(xmlGenericErrorContext, + "Could not parse DTD %s\n", dtdvalid); + else + xmlGenericError(xmlGenericErrorContext, + "Could not parse DTD %s\n", dtdvalidfpi); + progresult = XMLLINT_ERR_DTD; + } else { + xmlValidCtxtPtr cvp; + + if ((cvp = xmlNewValidCtxt()) == NULL) { + xmlGenericError(xmlGenericErrorContext, + "Couldn't allocate validation context\n"); + exit(-1); + } + cvp->userData = (void *) stderr; + cvp->error = (xmlValidityErrorFunc) fprintf; + cvp->warning = (xmlValidityWarningFunc) fprintf; + + if ((timing) && (!repeat)) { + startTimer(); + } + if (!xmlValidateDtd(cvp, doc, dtd)) { + if (dtdvalid != NULL) + xmlGenericError(xmlGenericErrorContext, + "Document %s does not validate against %s\n", + filename, dtdvalid); + else + xmlGenericError(xmlGenericErrorContext, + "Document %s does not validate against %s\n", + filename, dtdvalidfpi); + progresult = XMLLINT_ERR_VALID; + } + if ((timing) && (!repeat)) { + endTimer("Validating against DTD"); + } + xmlFreeValidCtxt(cvp); + xmlFreeDtd(dtd); + } + } else if (postvalid) { + xmlValidCtxtPtr cvp; + + if ((cvp = xmlNewValidCtxt()) == NULL) { + xmlGenericError(xmlGenericErrorContext, + "Couldn't allocate validation context\n"); + exit(-1); + } + + if ((timing) && (!repeat)) { + startTimer(); + } + cvp->userData = (void *) stderr; + cvp->error = (xmlValidityErrorFunc) fprintf; + cvp->warning = (xmlValidityWarningFunc) fprintf; + if (!xmlValidateDocument(cvp, doc)) { + xmlGenericError(xmlGenericErrorContext, + "Document %s does not validate\n", filename); + progresult = XMLLINT_ERR_VALID; + } + if ((timing) && (!repeat)) { + endTimer("Validating"); + } + xmlFreeValidCtxt(cvp); + } +#endif /* LIBXML_VALID_ENABLED */ +#ifdef LIBXML_SCHEMATRON_ENABLED + if (wxschematron != NULL) { + xmlSchematronValidCtxtPtr ctxt; + int ret; + int flag; + + if ((timing) && (!repeat)) { + startTimer(); + } + + if (debug) + flag = XML_SCHEMATRON_OUT_XML; + else + flag = XML_SCHEMATRON_OUT_TEXT; + if (noout) + flag |= XML_SCHEMATRON_OUT_QUIET; + ctxt = xmlSchematronNewValidCtxt(wxschematron, flag); +#if 0 + xmlSchematronSetValidErrors(ctxt, + (xmlSchematronValidityErrorFunc) fprintf, + (xmlSchematronValidityWarningFunc) fprintf, + stderr); +#endif + ret = xmlSchematronValidateDoc(ctxt, doc); + if (ret == 0) { + fprintf(stderr, "%s validates\n", filename); + } else if (ret > 0) { + fprintf(stderr, "%s fails to validate\n", filename); + progresult = XMLLINT_ERR_VALID; + } else { + fprintf(stderr, "%s validation generated an internal error\n", + filename); + progresult = XMLLINT_ERR_VALID; + } + xmlSchematronFreeValidCtxt(ctxt); + if ((timing) && (!repeat)) { + endTimer("Validating"); + } + } +#endif +#ifdef LIBXML_SCHEMAS_ENABLED + if (relaxngschemas != NULL) { + xmlRelaxNGValidCtxtPtr ctxt; + int ret; + + if ((timing) && (!repeat)) { + startTimer(); + } + + ctxt = xmlRelaxNGNewValidCtxt(relaxngschemas); + xmlRelaxNGSetValidErrors(ctxt, + (xmlRelaxNGValidityErrorFunc) fprintf, + (xmlRelaxNGValidityWarningFunc) fprintf, + stderr); + ret = xmlRelaxNGValidateDoc(ctxt, doc); + if (ret == 0) { + fprintf(stderr, "%s validates\n", filename); + } else if (ret > 0) { + fprintf(stderr, "%s fails to validate\n", filename); + progresult = XMLLINT_ERR_VALID; + } else { + fprintf(stderr, "%s validation generated an internal error\n", + filename); + progresult = XMLLINT_ERR_VALID; + } + xmlRelaxNGFreeValidCtxt(ctxt); + if ((timing) && (!repeat)) { + endTimer("Validating"); + } + } else if (wxschemas != NULL) { + xmlSchemaValidCtxtPtr ctxt; + int ret; + + if ((timing) && (!repeat)) { + startTimer(); + } + + ctxt = xmlSchemaNewValidCtxt(wxschemas); + xmlSchemaSetValidErrors(ctxt, + (xmlSchemaValidityErrorFunc) fprintf, + (xmlSchemaValidityWarningFunc) fprintf, + stderr); + ret = xmlSchemaValidateDoc(ctxt, doc); + if (ret == 0) { + fprintf(stderr, "%s validates\n", filename); + } else if (ret > 0) { + fprintf(stderr, "%s fails to validate\n", filename); + progresult = XMLLINT_ERR_VALID; + } else { + fprintf(stderr, "%s validation generated an internal error\n", + filename); + progresult = XMLLINT_ERR_VALID; + } + xmlSchemaFreeValidCtxt(ctxt); + if ((timing) && (!repeat)) { + endTimer("Validating"); + } + } +#endif + +#ifdef LIBXML_DEBUG_ENABLED +#if defined(LIBXML_HTML_ENABLED) || defined(LIBXML_VALID_ENABLED) + if ((debugent) && (!html)) + xmlDebugDumpEntities(stderr, doc); +#endif +#endif + + /* + * free it. + */ + if ((timing) && (!repeat)) { + startTimer(); + } + xmlFreeDoc(doc); + if ((timing) && (!repeat)) { + endTimer("Freeing"); + } +} + +/************************************************************************ + * * + * Usage and Main * + * * + ************************************************************************/ + +static void showVersion(const char *name) { + fprintf(stderr, "%s: using libxml version %s\n", name, xmlParserVersion); + fprintf(stderr, " compiled with: "); + if (xmlHasFeature(XML_WITH_THREAD)) fprintf(stderr, "Threads "); + if (xmlHasFeature(XML_WITH_TREE)) fprintf(stderr, "Tree "); + if (xmlHasFeature(XML_WITH_OUTPUT)) fprintf(stderr, "Output "); + if (xmlHasFeature(XML_WITH_PUSH)) fprintf(stderr, "Push "); + if (xmlHasFeature(XML_WITH_READER)) fprintf(stderr, "Reader "); + if (xmlHasFeature(XML_WITH_PATTERN)) fprintf(stderr, "Patterns "); + if (xmlHasFeature(XML_WITH_WRITER)) fprintf(stderr, "Writer "); + if (xmlHasFeature(XML_WITH_SAX1)) fprintf(stderr, "SAXv1 "); + if (xmlHasFeature(XML_WITH_FTP)) fprintf(stderr, "FTP "); + if (xmlHasFeature(XML_WITH_HTTP)) fprintf(stderr, "HTTP "); + if (xmlHasFeature(XML_WITH_VALID)) fprintf(stderr, "DTDValid "); + if (xmlHasFeature(XML_WITH_HTML)) fprintf(stderr, "HTML "); + if (xmlHasFeature(XML_WITH_LEGACY)) fprintf(stderr, "Legacy "); + if (xmlHasFeature(XML_WITH_C14N)) fprintf(stderr, "C14N "); + if (xmlHasFeature(XML_WITH_CATALOG)) fprintf(stderr, "Catalog "); + if (xmlHasFeature(XML_WITH_XPATH)) fprintf(stderr, "XPath "); + if (xmlHasFeature(XML_WITH_XPTR)) fprintf(stderr, "XPointer "); + if (xmlHasFeature(XML_WITH_XINCLUDE)) fprintf(stderr, "XInclude "); + if (xmlHasFeature(XML_WITH_ICONV)) fprintf(stderr, "Iconv "); + if (xmlHasFeature(XML_WITH_ISO8859X)) fprintf(stderr, "ISO8859X "); + if (xmlHasFeature(XML_WITH_UNICODE)) fprintf(stderr, "Unicode "); + if (xmlHasFeature(XML_WITH_REGEXP)) fprintf(stderr, "Regexps "); + if (xmlHasFeature(XML_WITH_AUTOMATA)) fprintf(stderr, "Automata "); + if (xmlHasFeature(XML_WITH_EXPR)) fprintf(stderr, "Expr "); + if (xmlHasFeature(XML_WITH_SCHEMAS)) fprintf(stderr, "Schemas "); + if (xmlHasFeature(XML_WITH_SCHEMATRON)) fprintf(stderr, "Schematron "); + if (xmlHasFeature(XML_WITH_MODULES)) fprintf(stderr, "Modules "); + if (xmlHasFeature(XML_WITH_DEBUG)) fprintf(stderr, "Debug "); + if (xmlHasFeature(XML_WITH_DEBUG_MEM)) fprintf(stderr, "MemDebug "); + if (xmlHasFeature(XML_WITH_DEBUG_RUN)) fprintf(stderr, "RunDebug "); + if (xmlHasFeature(XML_WITH_ZLIB)) fprintf(stderr, "Zlib "); + if (xmlHasFeature(XML_WITH_LZMA)) fprintf(stderr, "Lzma "); + fprintf(stderr, "\n"); +} + +static void usage(const char *name) { + printf("Usage : %s [options] XMLfiles ...\n", name); +#ifdef LIBXML_OUTPUT_ENABLED + printf("\tParse the XML files and output the result of the parsing\n"); +#else + printf("\tParse the XML files\n"); +#endif /* LIBXML_OUTPUT_ENABLED */ + printf("\t--version : display the version of the XML library used\n"); +#ifdef LIBXML_DEBUG_ENABLED + printf("\t--debug : dump a debug tree of the in-memory document\n"); + printf("\t--shell : run a navigating shell\n"); + printf("\t--debugent : debug the entities defined in the document\n"); +#else +#ifdef LIBXML_READER_ENABLED + printf("\t--debug : dump the nodes content when using --stream\n"); +#endif /* LIBXML_READER_ENABLED */ +#endif +#ifdef LIBXML_TREE_ENABLED + printf("\t--copy : used to test the internal copy implementation\n"); +#endif /* LIBXML_TREE_ENABLED */ + printf("\t--recover : output what was parsable on broken XML documents\n"); + printf("\t--huge : remove any internal arbitrary parser limits\n"); + printf("\t--noent : substitute entity references by their value\n"); + printf("\t--noenc : ignore any encoding specified inside the document\n"); + printf("\t--noout : don't output the result tree\n"); + printf("\t--path 'paths': provide a set of paths for resources\n"); + printf("\t--load-trace : print trace of all external entites loaded\n"); + printf("\t--nonet : refuse to fetch DTDs or entities over network\n"); + printf("\t--nocompact : do not generate compact text nodes\n"); + printf("\t--htmlout : output results as HTML\n"); + printf("\t--nowrap : do not put HTML doc wrapper\n"); +#ifdef LIBXML_VALID_ENABLED + printf("\t--valid : validate the document in addition to std well-formed check\n"); + printf("\t--postvalid : do a posteriori validation, i.e after parsing\n"); + printf("\t--dtdvalid URL : do a posteriori validation against a given DTD\n"); + printf("\t--dtdvalidfpi FPI : same but name the DTD with a Public Identifier\n"); +#endif /* LIBXML_VALID_ENABLED */ + printf("\t--timing : print some timings\n"); + printf("\t--output file or -o file: save to a given file\n"); + printf("\t--repeat : repeat 100 times, for timing or profiling\n"); + printf("\t--insert : ad-hoc test for valid insertions\n"); +#ifdef LIBXML_OUTPUT_ENABLED +#ifdef HAVE_ZLIB_H + printf("\t--compress : turn on gzip compression of output\n"); +#endif +#endif /* LIBXML_OUTPUT_ENABLED */ +#ifdef LIBXML_HTML_ENABLED + printf("\t--html : use the HTML parser\n"); + printf("\t--xmlout : force to use the XML serializer when using --html\n"); + printf("\t--nodefdtd : do not default HTML doctype\n"); +#endif +#ifdef LIBXML_PUSH_ENABLED + printf("\t--push : use the push mode of the parser\n"); + printf("\t--pushsmall : use the push mode of the parser using tiny increments\n"); +#endif /* LIBXML_PUSH_ENABLED */ +#ifdef HAVE_MMAP + printf("\t--memory : parse from memory\n"); +#endif + printf("\t--maxmem nbbytes : limits memory allocation to nbbytes bytes\n"); + printf("\t--nowarning : do not emit warnings from parser/validator\n"); + printf("\t--noblanks : drop (ignorable?) blanks spaces\n"); + printf("\t--nocdata : replace cdata section with text nodes\n"); +#ifdef LIBXML_OUTPUT_ENABLED + printf("\t--format : reformat/reindent the input\n"); + printf("\t--encode encoding : output in the given encoding\n"); + printf("\t--dropdtd : remove the DOCTYPE of the input docs\n"); + printf("\t--pretty STYLE : pretty-print in a particular style\n"); + printf("\t 0 Do not pretty print\n"); + printf("\t 1 Format the XML content, as --format\n"); + printf("\t 2 Add whitespace inside tags, preserving content\n"); +#endif /* LIBXML_OUTPUT_ENABLED */ + printf("\t--c14n : save in W3C canonical format v1.0 (with comments)\n"); + printf("\t--c14n11 : save in W3C canonical format v1.1 (with comments)\n"); + printf("\t--exc-c14n : save in W3C exclusive canonical format (with comments)\n"); +#ifdef LIBXML_C14N_ENABLED +#endif /* LIBXML_C14N_ENABLED */ + printf("\t--nsclean : remove redundant namespace declarations\n"); + printf("\t--testIO : test user I/O support\n"); +#ifdef LIBXML_CATALOG_ENABLED + printf("\t--catalogs : use SGML catalogs from $SGML_CATALOG_FILES\n"); + printf("\t otherwise XML Catalogs starting from \n"); + printf("\t %s are activated by default\n", XML_XML_DEFAULT_CATALOG); + printf("\t--nocatalogs: deactivate all catalogs\n"); +#endif + printf("\t--auto : generate a small doc on the fly\n"); +#ifdef LIBXML_XINCLUDE_ENABLED + printf("\t--xinclude : do XInclude processing\n"); + printf("\t--noxincludenode : same but do not generate XInclude nodes\n"); + printf("\t--nofixup-base-uris : do not fixup xml:base uris\n"); +#endif + printf("\t--loaddtd : fetch external DTD\n"); + printf("\t--dtdattr : loaddtd + populate the tree with inherited attributes \n"); +#ifdef LIBXML_READER_ENABLED + printf("\t--stream : use the streaming interface to process very large files\n"); + printf("\t--walker : create a reader and walk though the resulting doc\n"); +#endif /* LIBXML_READER_ENABLED */ +#ifdef LIBXML_PATTERN_ENABLED + printf("\t--pattern pattern_value : test the pattern support\n"); +#endif + printf("\t--chkregister : verify the node registration code\n"); +#ifdef LIBXML_SCHEMAS_ENABLED + printf("\t--relaxng schema : do RelaxNG validation against the schema\n"); + printf("\t--schema schema : do validation against the WXS schema\n"); +#endif +#ifdef LIBXML_SCHEMATRON_ENABLED + printf("\t--schematron schema : do validation against a schematron\n"); +#endif +#ifdef LIBXML_SAX1_ENABLED + printf("\t--sax1: use the old SAX1 interfaces for processing\n"); +#endif + printf("\t--sax: do not build a tree but work just at the SAX level\n"); + printf("\t--oldxml10: use XML-1.0 parsing rules before the 5th edition\n"); +#ifdef LIBXML_XPATH_ENABLED + printf("\t--xpath expr: evaluate the XPath expression, imply --noout\n"); +#endif + + printf("\nLibxml project home page: http://xmlsoft.org/\n"); + printf("To report bugs or get some help check: http://xmlsoft.org/bugs.html\n"); +} + +static void registerNode(xmlNodePtr node) +{ + node->_private = malloc(sizeof(long)); + *(long*)node->_private = (long) 0x81726354; + nbregister++; +} + +static void deregisterNode(xmlNodePtr node) +{ + assert(node->_private != NULL); + assert(*(long*)node->_private == (long) 0x81726354); + free(node->_private); + nbregister--; +} + +int +main(int argc, char **argv) { + int i, acount; + int files = 0; + int version = 0; + const char* indent; + + if (argc <= 1) { + usage(argv[0]); + return(1); + } + LIBXML_TEST_VERSION + for (i = 1; i < argc ; i++) { + if (!strcmp(argv[i], "-")) + break; + + if (argv[i][0] != '-') + continue; + if ((!strcmp(argv[i], "-debug")) || (!strcmp(argv[i], "--debug"))) + debug++; + else +#ifdef LIBXML_DEBUG_ENABLED + if ((!strcmp(argv[i], "-shell")) || + (!strcmp(argv[i], "--shell"))) { + shell++; + noout = 1; + } else +#endif +#ifdef LIBXML_TREE_ENABLED + if ((!strcmp(argv[i], "-copy")) || (!strcmp(argv[i], "--copy"))) + copy++; + else +#endif /* LIBXML_TREE_ENABLED */ + if ((!strcmp(argv[i], "-recover")) || + (!strcmp(argv[i], "--recover"))) { + recovery++; + options |= XML_PARSE_RECOVER; + } else if ((!strcmp(argv[i], "-huge")) || + (!strcmp(argv[i], "--huge"))) { + options |= XML_PARSE_HUGE; + } else if ((!strcmp(argv[i], "-noent")) || + (!strcmp(argv[i], "--noent"))) { + noent++; + options |= XML_PARSE_NOENT; + } else if ((!strcmp(argv[i], "-noenc")) || + (!strcmp(argv[i], "--noenc"))) { + noenc++; + options |= XML_PARSE_IGNORE_ENC; + } else if ((!strcmp(argv[i], "-nsclean")) || + (!strcmp(argv[i], "--nsclean"))) { + options |= XML_PARSE_NSCLEAN; + } else if ((!strcmp(argv[i], "-nocdata")) || + (!strcmp(argv[i], "--nocdata"))) { + options |= XML_PARSE_NOCDATA; + } else if ((!strcmp(argv[i], "-nodict")) || + (!strcmp(argv[i], "--nodict"))) { + options |= XML_PARSE_NODICT; + } else if ((!strcmp(argv[i], "-version")) || + (!strcmp(argv[i], "--version"))) { + showVersion(argv[0]); + version = 1; + } else if ((!strcmp(argv[i], "-noout")) || + (!strcmp(argv[i], "--noout"))) + noout++; +#ifdef LIBXML_OUTPUT_ENABLED + else if ((!strcmp(argv[i], "-o")) || + (!strcmp(argv[i], "-output")) || + (!strcmp(argv[i], "--output"))) { + i++; + output = argv[i]; + } +#endif /* LIBXML_OUTPUT_ENABLED */ + else if ((!strcmp(argv[i], "-htmlout")) || + (!strcmp(argv[i], "--htmlout"))) + htmlout++; + else if ((!strcmp(argv[i], "-nowrap")) || + (!strcmp(argv[i], "--nowrap"))) + nowrap++; +#ifdef LIBXML_HTML_ENABLED + else if ((!strcmp(argv[i], "-html")) || + (!strcmp(argv[i], "--html"))) { + html++; + } + else if ((!strcmp(argv[i], "-xmlout")) || + (!strcmp(argv[i], "--xmlout"))) { + xmlout++; + } else if ((!strcmp(argv[i], "-nodefdtd")) || + (!strcmp(argv[i], "--nodefdtd"))) { + nodefdtd++; + options |= HTML_PARSE_NODEFDTD; + } +#endif /* LIBXML_HTML_ENABLED */ + else if ((!strcmp(argv[i], "-loaddtd")) || + (!strcmp(argv[i], "--loaddtd"))) { + loaddtd++; + options |= XML_PARSE_DTDLOAD; + } else if ((!strcmp(argv[i], "-dtdattr")) || + (!strcmp(argv[i], "--dtdattr"))) { + loaddtd++; + dtdattrs++; + options |= XML_PARSE_DTDATTR; + } +#ifdef LIBXML_VALID_ENABLED + else if ((!strcmp(argv[i], "-valid")) || + (!strcmp(argv[i], "--valid"))) { + valid++; + options |= XML_PARSE_DTDVALID; + } else if ((!strcmp(argv[i], "-postvalid")) || + (!strcmp(argv[i], "--postvalid"))) { + postvalid++; + loaddtd++; + options |= XML_PARSE_DTDLOAD; + } else if ((!strcmp(argv[i], "-dtdvalid")) || + (!strcmp(argv[i], "--dtdvalid"))) { + i++; + dtdvalid = argv[i]; + loaddtd++; + options |= XML_PARSE_DTDLOAD; + } else if ((!strcmp(argv[i], "-dtdvalidfpi")) || + (!strcmp(argv[i], "--dtdvalidfpi"))) { + i++; + dtdvalidfpi = argv[i]; + loaddtd++; + options |= XML_PARSE_DTDLOAD; + } +#endif /* LIBXML_VALID_ENABLED */ + else if ((!strcmp(argv[i], "-dropdtd")) || + (!strcmp(argv[i], "--dropdtd"))) + dropdtd++; + else if ((!strcmp(argv[i], "-insert")) || + (!strcmp(argv[i], "--insert"))) + insert++; + else if ((!strcmp(argv[i], "-timing")) || + (!strcmp(argv[i], "--timing"))) + timing++; + else if ((!strcmp(argv[i], "-auto")) || + (!strcmp(argv[i], "--auto"))) + generate++; + else if ((!strcmp(argv[i], "-repeat")) || + (!strcmp(argv[i], "--repeat"))) { + if (repeat) + repeat *= 10; + else + repeat = 100; + } +#ifdef LIBXML_PUSH_ENABLED + else if ((!strcmp(argv[i], "-push")) || + (!strcmp(argv[i], "--push"))) + push++; + else if ((!strcmp(argv[i], "-pushsmall")) || + (!strcmp(argv[i], "--pushsmall"))) { + push++; + pushsize = 10; + } +#endif /* LIBXML_PUSH_ENABLED */ +#ifdef HAVE_MMAP + else if ((!strcmp(argv[i], "-memory")) || + (!strcmp(argv[i], "--memory"))) + memory++; +#endif + else if ((!strcmp(argv[i], "-testIO")) || + (!strcmp(argv[i], "--testIO"))) + testIO++; +#ifdef LIBXML_XINCLUDE_ENABLED + else if ((!strcmp(argv[i], "-xinclude")) || + (!strcmp(argv[i], "--xinclude"))) { + xinclude++; + options |= XML_PARSE_XINCLUDE; + } + else if ((!strcmp(argv[i], "-noxincludenode")) || + (!strcmp(argv[i], "--noxincludenode"))) { + xinclude++; + options |= XML_PARSE_XINCLUDE; + options |= XML_PARSE_NOXINCNODE; + } + else if ((!strcmp(argv[i], "-nofixup-base-uris")) || + (!strcmp(argv[i], "--nofixup-base-uris"))) { + xinclude++; + options |= XML_PARSE_XINCLUDE; + options |= XML_PARSE_NOBASEFIX; + } +#endif +#ifdef LIBXML_OUTPUT_ENABLED +#ifdef HAVE_ZLIB_H + else if ((!strcmp(argv[i], "-compress")) || + (!strcmp(argv[i], "--compress"))) { + compress++; + xmlSetCompressMode(9); + } +#endif +#endif /* LIBXML_OUTPUT_ENABLED */ + else if ((!strcmp(argv[i], "-nowarning")) || + (!strcmp(argv[i], "--nowarning"))) { + xmlGetWarningsDefaultValue = 0; + xmlPedanticParserDefault(0); + options |= XML_PARSE_NOWARNING; + } + else if ((!strcmp(argv[i], "-pedantic")) || + (!strcmp(argv[i], "--pedantic"))) { + xmlGetWarningsDefaultValue = 1; + xmlPedanticParserDefault(1); + options |= XML_PARSE_PEDANTIC; + } +#ifdef LIBXML_DEBUG_ENABLED + else if ((!strcmp(argv[i], "-debugent")) || + (!strcmp(argv[i], "--debugent"))) { + debugent++; + xmlParserDebugEntities = 1; + } +#endif +#ifdef LIBXML_C14N_ENABLED + else if ((!strcmp(argv[i], "-c14n")) || + (!strcmp(argv[i], "--c14n"))) { + canonical++; + options |= XML_PARSE_NOENT | XML_PARSE_DTDATTR | XML_PARSE_DTDLOAD; + } + else if ((!strcmp(argv[i], "-c14n11")) || + (!strcmp(argv[i], "--c14n11"))) { + canonical_11++; + options |= XML_PARSE_NOENT | XML_PARSE_DTDATTR | XML_PARSE_DTDLOAD; + } + else if ((!strcmp(argv[i], "-exc-c14n")) || + (!strcmp(argv[i], "--exc-c14n"))) { + exc_canonical++; + options |= XML_PARSE_NOENT | XML_PARSE_DTDATTR | XML_PARSE_DTDLOAD; + } +#endif +#ifdef LIBXML_CATALOG_ENABLED + else if ((!strcmp(argv[i], "-catalogs")) || + (!strcmp(argv[i], "--catalogs"))) { + catalogs++; + } else if ((!strcmp(argv[i], "-nocatalogs")) || + (!strcmp(argv[i], "--nocatalogs"))) { + nocatalogs++; + } +#endif + else if ((!strcmp(argv[i], "-encode")) || + (!strcmp(argv[i], "--encode"))) { + i++; + encoding = argv[i]; + /* + * OK it's for testing purposes + */ + xmlAddEncodingAlias("UTF-8", "DVEnc"); + } + else if ((!strcmp(argv[i], "-noblanks")) || + (!strcmp(argv[i], "--noblanks"))) { + noblanks++; + xmlKeepBlanksDefault(0); + options |= XML_PARSE_NOBLANKS; + } + else if ((!strcmp(argv[i], "-maxmem")) || + (!strcmp(argv[i], "--maxmem"))) { + i++; + if (sscanf(argv[i], "%d", &maxmem) == 1) { + xmlMemSetup(myFreeFunc, myMallocFunc, myReallocFunc, + myStrdupFunc); + } else { + maxmem = 0; + } + } + else if ((!strcmp(argv[i], "-format")) || + (!strcmp(argv[i], "--format"))) { + noblanks++; +#ifdef LIBXML_OUTPUT_ENABLED + format = 1; +#endif /* LIBXML_OUTPUT_ENABLED */ + xmlKeepBlanksDefault(0); + } + else if ((!strcmp(argv[i], "-pretty")) || + (!strcmp(argv[i], "--pretty"))) { + i++; +#ifdef LIBXML_OUTPUT_ENABLED + format = atoi(argv[i]); + if (format == 1) { + noblanks++; + xmlKeepBlanksDefault(0); + } +#endif /* LIBXML_OUTPUT_ENABLED */ + } +#ifdef LIBXML_READER_ENABLED + else if ((!strcmp(argv[i], "-stream")) || + (!strcmp(argv[i], "--stream"))) { + stream++; + } + else if ((!strcmp(argv[i], "-walker")) || + (!strcmp(argv[i], "--walker"))) { + walker++; + noout++; + } +#endif /* LIBXML_READER_ENABLED */ +#ifdef LIBXML_SAX1_ENABLED + else if ((!strcmp(argv[i], "-sax1")) || + (!strcmp(argv[i], "--sax1"))) { + sax1++; + options |= XML_PARSE_SAX1; + } +#endif /* LIBXML_SAX1_ENABLED */ + else if ((!strcmp(argv[i], "-sax")) || + (!strcmp(argv[i], "--sax"))) { + sax++; + } + else if ((!strcmp(argv[i], "-chkregister")) || + (!strcmp(argv[i], "--chkregister"))) { + chkregister++; +#ifdef LIBXML_SCHEMAS_ENABLED + } else if ((!strcmp(argv[i], "-relaxng")) || + (!strcmp(argv[i], "--relaxng"))) { + i++; + relaxng = argv[i]; + noent++; + options |= XML_PARSE_NOENT; + } else if ((!strcmp(argv[i], "-schema")) || + (!strcmp(argv[i], "--schema"))) { + i++; + schema = argv[i]; + noent++; +#endif +#ifdef LIBXML_SCHEMATRON_ENABLED + } else if ((!strcmp(argv[i], "-schematron")) || + (!strcmp(argv[i], "--schematron"))) { + i++; + schematron = argv[i]; + noent++; +#endif + } else if ((!strcmp(argv[i], "-nonet")) || + (!strcmp(argv[i], "--nonet"))) { + options |= XML_PARSE_NONET; + xmlSetExternalEntityLoader(xmlNoNetExternalEntityLoader); + } else if ((!strcmp(argv[i], "-nocompact")) || + (!strcmp(argv[i], "--nocompact"))) { + options &= ~XML_PARSE_COMPACT; + } else if ((!strcmp(argv[i], "-load-trace")) || + (!strcmp(argv[i], "--load-trace"))) { + load_trace++; + } else if ((!strcmp(argv[i], "-path")) || + (!strcmp(argv[i], "--path"))) { + i++; + parsePath(BAD_CAST argv[i]); +#ifdef LIBXML_PATTERN_ENABLED + } else if ((!strcmp(argv[i], "-pattern")) || + (!strcmp(argv[i], "--pattern"))) { + i++; + pattern = argv[i]; +#endif +#ifdef LIBXML_XPATH_ENABLED + } else if ((!strcmp(argv[i], "-xpath")) || + (!strcmp(argv[i], "--xpath"))) { + i++; + noout++; + xpathquery = argv[i]; +#endif + } else if ((!strcmp(argv[i], "-oldxml10")) || + (!strcmp(argv[i], "--oldxml10"))) { + oldxml10++; + options |= XML_PARSE_OLD10; + } else { + fprintf(stderr, "Unknown option %s\n", argv[i]); + usage(argv[0]); + return(1); + } + } + +#ifdef LIBXML_CATALOG_ENABLED + if (nocatalogs == 0) { + if (catalogs) { + const char *catal; + + catal = getenv("SGML_CATALOG_FILES"); + if (catal != NULL) { + xmlLoadCatalogs(catal); + } else { + fprintf(stderr, "Variable $SGML_CATALOG_FILES not set\n"); + } + } + } +#endif + +#ifdef LIBXML_SAX1_ENABLED + if (sax1) + xmlSAXDefaultVersion(1); + else + xmlSAXDefaultVersion(2); +#endif /* LIBXML_SAX1_ENABLED */ + + if (chkregister) { + xmlRegisterNodeDefault(registerNode); + xmlDeregisterNodeDefault(deregisterNode); + } + + indent = getenv("XMLLINT_INDENT"); + if(indent != NULL) { + xmlTreeIndentString = indent; + } + + + defaultEntityLoader = xmlGetExternalEntityLoader(); + xmlSetExternalEntityLoader(xmllintExternalEntityLoader); + + xmlLineNumbersDefault(1); + if (loaddtd != 0) + xmlLoadExtDtdDefaultValue |= XML_DETECT_IDS; + if (dtdattrs) + xmlLoadExtDtdDefaultValue |= XML_COMPLETE_ATTRS; + if (noent != 0) xmlSubstituteEntitiesDefault(1); +#ifdef LIBXML_VALID_ENABLED + if (valid != 0) xmlDoValidityCheckingDefaultValue = 1; +#endif /* LIBXML_VALID_ENABLED */ + if ((htmlout) && (!nowrap)) { + xmlGenericError(xmlGenericErrorContext, + "\n"); + xmlGenericError(xmlGenericErrorContext, + "%s output\n", + argv[0]); + xmlGenericError(xmlGenericErrorContext, + "

    %s output

    \n", + argv[0]); + } + +#ifdef LIBXML_SCHEMATRON_ENABLED + if ((schematron != NULL) && (sax == 0) +#ifdef LIBXML_READER_ENABLED + && (stream == 0) +#endif /* LIBXML_READER_ENABLED */ + ) { + xmlSchematronParserCtxtPtr ctxt; + + /* forces loading the DTDs */ + xmlLoadExtDtdDefaultValue |= 1; + options |= XML_PARSE_DTDLOAD; + if (timing) { + startTimer(); + } + ctxt = xmlSchematronNewParserCtxt(schematron); +#if 0 + xmlSchematronSetParserErrors(ctxt, + (xmlSchematronValidityErrorFunc) fprintf, + (xmlSchematronValidityWarningFunc) fprintf, + stderr); +#endif + wxschematron = xmlSchematronParse(ctxt); + if (wxschematron == NULL) { + xmlGenericError(xmlGenericErrorContext, + "Schematron schema %s failed to compile\n", schematron); + progresult = XMLLINT_ERR_SCHEMACOMP; + schematron = NULL; + } + xmlSchematronFreeParserCtxt(ctxt); + if (timing) { + endTimer("Compiling the schemas"); + } + } +#endif +#ifdef LIBXML_SCHEMAS_ENABLED + if ((relaxng != NULL) && (sax == 0) +#ifdef LIBXML_READER_ENABLED + && (stream == 0) +#endif /* LIBXML_READER_ENABLED */ + ) { + xmlRelaxNGParserCtxtPtr ctxt; + + /* forces loading the DTDs */ + xmlLoadExtDtdDefaultValue |= 1; + options |= XML_PARSE_DTDLOAD; + if (timing) { + startTimer(); + } + ctxt = xmlRelaxNGNewParserCtxt(relaxng); + xmlRelaxNGSetParserErrors(ctxt, + (xmlRelaxNGValidityErrorFunc) fprintf, + (xmlRelaxNGValidityWarningFunc) fprintf, + stderr); + relaxngschemas = xmlRelaxNGParse(ctxt); + if (relaxngschemas == NULL) { + xmlGenericError(xmlGenericErrorContext, + "Relax-NG schema %s failed to compile\n", relaxng); + progresult = XMLLINT_ERR_SCHEMACOMP; + relaxng = NULL; + } + xmlRelaxNGFreeParserCtxt(ctxt); + if (timing) { + endTimer("Compiling the schemas"); + } + } else if ((schema != NULL) +#ifdef LIBXML_READER_ENABLED + && (stream == 0) +#endif + ) { + xmlSchemaParserCtxtPtr ctxt; + + if (timing) { + startTimer(); + } + ctxt = xmlSchemaNewParserCtxt(schema); + xmlSchemaSetParserErrors(ctxt, + (xmlSchemaValidityErrorFunc) fprintf, + (xmlSchemaValidityWarningFunc) fprintf, + stderr); + wxschemas = xmlSchemaParse(ctxt); + if (wxschemas == NULL) { + xmlGenericError(xmlGenericErrorContext, + "WXS schema %s failed to compile\n", schema); + progresult = XMLLINT_ERR_SCHEMACOMP; + schema = NULL; + } + xmlSchemaFreeParserCtxt(ctxt); + if (timing) { + endTimer("Compiling the schemas"); + } + } +#endif /* LIBXML_SCHEMAS_ENABLED */ +#ifdef LIBXML_PATTERN_ENABLED + if ((pattern != NULL) +#ifdef LIBXML_READER_ENABLED + && (walker == 0) +#endif + ) { + patternc = xmlPatterncompile((const xmlChar *) pattern, NULL, 0, NULL); + if (patternc == NULL) { + xmlGenericError(xmlGenericErrorContext, + "Pattern %s failed to compile\n", pattern); + progresult = XMLLINT_ERR_SCHEMAPAT; + pattern = NULL; + } + } +#endif /* LIBXML_PATTERN_ENABLED */ + for (i = 1; i < argc ; i++) { + if ((!strcmp(argv[i], "-encode")) || + (!strcmp(argv[i], "--encode"))) { + i++; + continue; + } else if ((!strcmp(argv[i], "-o")) || + (!strcmp(argv[i], "-output")) || + (!strcmp(argv[i], "--output"))) { + i++; + continue; + } +#ifdef LIBXML_VALID_ENABLED + if ((!strcmp(argv[i], "-dtdvalid")) || + (!strcmp(argv[i], "--dtdvalid"))) { + i++; + continue; + } + if ((!strcmp(argv[i], "-path")) || + (!strcmp(argv[i], "--path"))) { + i++; + continue; + } + if ((!strcmp(argv[i], "-dtdvalidfpi")) || + (!strcmp(argv[i], "--dtdvalidfpi"))) { + i++; + continue; + } +#endif /* LIBXML_VALID_ENABLED */ + if ((!strcmp(argv[i], "-relaxng")) || + (!strcmp(argv[i], "--relaxng"))) { + i++; + continue; + } + if ((!strcmp(argv[i], "-maxmem")) || + (!strcmp(argv[i], "--maxmem"))) { + i++; + continue; + } + if ((!strcmp(argv[i], "-pretty")) || + (!strcmp(argv[i], "--pretty"))) { + i++; + continue; + } + if ((!strcmp(argv[i], "-schema")) || + (!strcmp(argv[i], "--schema"))) { + i++; + continue; + } + if ((!strcmp(argv[i], "-schematron")) || + (!strcmp(argv[i], "--schematron"))) { + i++; + continue; + } +#ifdef LIBXML_PATTERN_ENABLED + if ((!strcmp(argv[i], "-pattern")) || + (!strcmp(argv[i], "--pattern"))) { + i++; + continue; + } +#endif +#ifdef LIBXML_XPATH_ENABLED + if ((!strcmp(argv[i], "-xpath")) || + (!strcmp(argv[i], "--xpath"))) { + i++; + continue; + } +#endif + if ((timing) && (repeat)) + startTimer(); + /* Remember file names. "-" means stdin. */ + if ((argv[i][0] != '-') || (strcmp(argv[i], "-") == 0)) { + if (repeat) { + xmlParserCtxtPtr ctxt = NULL; + + for (acount = 0;acount < repeat;acount++) { +#ifdef LIBXML_READER_ENABLED + if (stream != 0) { + streamFile(argv[i]); + } else { +#endif /* LIBXML_READER_ENABLED */ + if (sax) { + testSAX(argv[i]); + } else { + if (ctxt == NULL) + ctxt = xmlNewParserCtxt(); + parseAndPrintFile(argv[i], ctxt); + } +#ifdef LIBXML_READER_ENABLED + } +#endif /* LIBXML_READER_ENABLED */ + } + if (ctxt != NULL) + xmlFreeParserCtxt(ctxt); + } else { + nbregister = 0; + +#ifdef LIBXML_READER_ENABLED + if (stream != 0) + streamFile(argv[i]); + else +#endif /* LIBXML_READER_ENABLED */ + if (sax) { + testSAX(argv[i]); + } else { + parseAndPrintFile(argv[i], NULL); + } + + if ((chkregister) && (nbregister != 0)) { + fprintf(stderr, "Registration count off: %d\n", nbregister); + progresult = XMLLINT_ERR_RDREGIS; + } + } + files ++; + if ((timing) && (repeat)) { + endTimer("%d iterations", repeat); + } + } + } + if (generate) + parseAndPrintFile(NULL, NULL); + if ((htmlout) && (!nowrap)) { + xmlGenericError(xmlGenericErrorContext, "\n"); + } + if ((files == 0) && (!generate) && (version == 0)) { + usage(argv[0]); + } +#ifdef LIBXML_SCHEMATRON_ENABLED + if (wxschematron != NULL) + xmlSchematronFree(wxschematron); +#endif +#ifdef LIBXML_SCHEMAS_ENABLED + if (relaxngschemas != NULL) + xmlRelaxNGFree(relaxngschemas); + if (wxschemas != NULL) + xmlSchemaFree(wxschemas); + xmlRelaxNGCleanupTypes(); +#endif +#ifdef LIBXML_PATTERN_ENABLED + if (patternc != NULL) + xmlFreePattern(patternc); +#endif + xmlCleanupParser(); + xmlMemoryDump(); + + return(progresult); +} + diff --git a/vendors/libxml/src/xmlmemory.c b/vendors/libxml/src/xmlmemory.c new file mode 100644 index 0000000..25d9318 --- /dev/null +++ b/vendors/libxml/src/xmlmemory.c @@ -0,0 +1,1123 @@ +/* + * xmlmemory.c: libxml memory allocator wrapper. + * + * daniel@veillard.com + */ + +#define IN_LIBXML +#include "libxml.h" + +#include + +#ifdef HAVE_SYS_TYPES_H +#include +#endif + +#ifdef HAVE_TIME_H +#include +#endif + +#ifdef HAVE_STDLIB_H +#include +#else +#ifdef HAVE_MALLOC_H +#include +#endif +#endif + +#ifdef HAVE_CTYPE_H +#include +#endif + +/* #define DEBUG_MEMORY */ + +/** + * MEM_LIST: + * + * keep track of all allocated blocks for error reporting + * Always build the memory list ! + */ +#ifdef DEBUG_MEMORY_LOCATION +#ifndef MEM_LIST +#define MEM_LIST /* keep a list of all the allocated memory blocks */ +#endif +#endif + +#include /* must come before xmlmemory.h */ +#include +#include +#include + +static int xmlMemInitialized = 0; +static unsigned long debugMemSize = 0; +static unsigned long debugMemBlocks = 0; +static unsigned long debugMaxMemSize = 0; +static xmlMutexPtr xmlMemMutex = NULL; + +void xmlMallocBreakpoint(void); + +/************************************************************************ + * * + * Macros, variables and associated types * + * * + ************************************************************************/ + +#if !defined(LIBXML_THREAD_ENABLED) && !defined(LIBXML_THREAD_ALLOC_ENABLED) +#ifdef xmlMalloc +#undef xmlMalloc +#endif +#ifdef xmlRealloc +#undef xmlRealloc +#endif +#ifdef xmlMemStrdup +#undef xmlMemStrdup +#endif +#endif + +/* + * Each of the blocks allocated begin with a header containing informations + */ + +#define MEMTAG 0x5aa5 + +#define MALLOC_TYPE 1 +#define REALLOC_TYPE 2 +#define STRDUP_TYPE 3 +#define MALLOC_ATOMIC_TYPE 4 +#define REALLOC_ATOMIC_TYPE 5 + +typedef struct memnod { + unsigned int mh_tag; + unsigned int mh_type; + unsigned long mh_number; + size_t mh_size; +#ifdef MEM_LIST + struct memnod *mh_next; + struct memnod *mh_prev; +#endif + const char *mh_file; + unsigned int mh_line; +} MEMHDR; + + +#ifdef SUN4 +#define ALIGN_SIZE 16 +#else +#define ALIGN_SIZE sizeof(double) +#endif +#define HDR_SIZE sizeof(MEMHDR) +#define RESERVE_SIZE (((HDR_SIZE + (ALIGN_SIZE-1)) \ + / ALIGN_SIZE ) * ALIGN_SIZE) + + +#define CLIENT_2_HDR(a) ((MEMHDR *) (((char *) (a)) - RESERVE_SIZE)) +#define HDR_2_CLIENT(a) ((void *) (((char *) (a)) + RESERVE_SIZE)) + + +static unsigned int block=0; +static unsigned int xmlMemStopAtBlock = 0; +static void *xmlMemTraceBlockAt = NULL; +#ifdef MEM_LIST +static MEMHDR *memlist = NULL; +#endif + +static void debugmem_tag_error(void *addr); +#ifdef MEM_LIST +static void debugmem_list_add(MEMHDR *); +static void debugmem_list_delete(MEMHDR *); +#endif +#define Mem_Tag_Err(a) debugmem_tag_error(a); + +#ifndef TEST_POINT +#define TEST_POINT +#endif + +/** + * xmlMallocBreakpoint: + * + * Breakpoint to use in conjunction with xmlMemStopAtBlock. When the block + * number reaches the specified value this function is called. One need to add a breakpoint + * to it to get the context in which the given block is allocated. + */ + +void +xmlMallocBreakpoint(void) { + xmlGenericError(xmlGenericErrorContext, + "xmlMallocBreakpoint reached on block %d\n", xmlMemStopAtBlock); +} + +/** + * xmlMallocLoc: + * @size: an int specifying the size in byte to allocate. + * @file: the file name or NULL + * @line: the line number + * + * a malloc() equivalent, with logging of the allocation info. + * + * Returns a pointer to the allocated area or NULL in case of lack of memory. + */ + +void * +xmlMallocLoc(size_t size, const char * file, int line) +{ + MEMHDR *p; + void *ret; + + if (!xmlMemInitialized) xmlInitMemory(); +#ifdef DEBUG_MEMORY + xmlGenericError(xmlGenericErrorContext, + "Malloc(%d)\n",size); +#endif + + TEST_POINT + + p = (MEMHDR *) malloc(RESERVE_SIZE+size); + + if (!p) { + xmlGenericError(xmlGenericErrorContext, + "xmlMallocLoc : Out of free space\n"); + xmlMemoryDump(); + return(NULL); + } + p->mh_tag = MEMTAG; + p->mh_size = size; + p->mh_type = MALLOC_TYPE; + p->mh_file = file; + p->mh_line = line; + xmlMutexLock(xmlMemMutex); + p->mh_number = ++block; + debugMemSize += size; + debugMemBlocks++; + if (debugMemSize > debugMaxMemSize) debugMaxMemSize = debugMemSize; +#ifdef MEM_LIST + debugmem_list_add(p); +#endif + xmlMutexUnlock(xmlMemMutex); + +#ifdef DEBUG_MEMORY + xmlGenericError(xmlGenericErrorContext, + "Malloc(%d) Ok\n",size); +#endif + + if (xmlMemStopAtBlock == p->mh_number) xmlMallocBreakpoint(); + + ret = HDR_2_CLIENT(p); + + if (xmlMemTraceBlockAt == ret) { + xmlGenericError(xmlGenericErrorContext, + "%p : Malloc(%lu) Ok\n", xmlMemTraceBlockAt, + (long unsigned)size); + xmlMallocBreakpoint(); + } + + TEST_POINT + + return(ret); +} + +/** + * xmlMallocAtomicLoc: + * @size: an int specifying the size in byte to allocate. + * @file: the file name or NULL + * @line: the line number + * + * a malloc() equivalent, with logging of the allocation info. + * + * Returns a pointer to the allocated area or NULL in case of lack of memory. + */ + +void * +xmlMallocAtomicLoc(size_t size, const char * file, int line) +{ + MEMHDR *p; + void *ret; + + if (!xmlMemInitialized) xmlInitMemory(); +#ifdef DEBUG_MEMORY + xmlGenericError(xmlGenericErrorContext, + "Malloc(%d)\n",size); +#endif + + TEST_POINT + + p = (MEMHDR *) malloc(RESERVE_SIZE+size); + + if (!p) { + xmlGenericError(xmlGenericErrorContext, + "xmlMallocLoc : Out of free space\n"); + xmlMemoryDump(); + return(NULL); + } + p->mh_tag = MEMTAG; + p->mh_size = size; + p->mh_type = MALLOC_ATOMIC_TYPE; + p->mh_file = file; + p->mh_line = line; + xmlMutexLock(xmlMemMutex); + p->mh_number = ++block; + debugMemSize += size; + debugMemBlocks++; + if (debugMemSize > debugMaxMemSize) debugMaxMemSize = debugMemSize; +#ifdef MEM_LIST + debugmem_list_add(p); +#endif + xmlMutexUnlock(xmlMemMutex); + +#ifdef DEBUG_MEMORY + xmlGenericError(xmlGenericErrorContext, + "Malloc(%d) Ok\n",size); +#endif + + if (xmlMemStopAtBlock == p->mh_number) xmlMallocBreakpoint(); + + ret = HDR_2_CLIENT(p); + + if (xmlMemTraceBlockAt == ret) { + xmlGenericError(xmlGenericErrorContext, + "%p : Malloc(%lu) Ok\n", xmlMemTraceBlockAt, + (long unsigned)size); + xmlMallocBreakpoint(); + } + + TEST_POINT + + return(ret); +} +/** + * xmlMemMalloc: + * @size: an int specifying the size in byte to allocate. + * + * a malloc() equivalent, with logging of the allocation info. + * + * Returns a pointer to the allocated area or NULL in case of lack of memory. + */ + +void * +xmlMemMalloc(size_t size) +{ + return(xmlMallocLoc(size, "none", 0)); +} + +/** + * xmlReallocLoc: + * @ptr: the initial memory block pointer + * @size: an int specifying the size in byte to allocate. + * @file: the file name or NULL + * @line: the line number + * + * a realloc() equivalent, with logging of the allocation info. + * + * Returns a pointer to the allocated area or NULL in case of lack of memory. + */ + +void * +xmlReallocLoc(void *ptr,size_t size, const char * file, int line) +{ + MEMHDR *p; + unsigned long number; +#ifdef DEBUG_MEMORY + size_t oldsize; +#endif + + if (ptr == NULL) + return(xmlMallocLoc(size, file, line)); + + if (!xmlMemInitialized) xmlInitMemory(); + TEST_POINT + + p = CLIENT_2_HDR(ptr); + number = p->mh_number; + if (xmlMemStopAtBlock == number) xmlMallocBreakpoint(); + if (p->mh_tag != MEMTAG) { + Mem_Tag_Err(p); + goto error; + } + p->mh_tag = ~MEMTAG; + xmlMutexLock(xmlMemMutex); + debugMemSize -= p->mh_size; + debugMemBlocks--; +#ifdef DEBUG_MEMORY + oldsize = p->mh_size; +#endif +#ifdef MEM_LIST + debugmem_list_delete(p); +#endif + xmlMutexUnlock(xmlMemMutex); + + p = (MEMHDR *) realloc(p,RESERVE_SIZE+size); + if (!p) { + goto error; + } + if (xmlMemTraceBlockAt == ptr) { + xmlGenericError(xmlGenericErrorContext, + "%p : Realloced(%lu -> %lu) Ok\n", + xmlMemTraceBlockAt, (long unsigned)p->mh_size, + (long unsigned)size); + xmlMallocBreakpoint(); + } + p->mh_tag = MEMTAG; + p->mh_number = number; + p->mh_type = REALLOC_TYPE; + p->mh_size = size; + p->mh_file = file; + p->mh_line = line; + xmlMutexLock(xmlMemMutex); + debugMemSize += size; + debugMemBlocks++; + if (debugMemSize > debugMaxMemSize) debugMaxMemSize = debugMemSize; +#ifdef MEM_LIST + debugmem_list_add(p); +#endif + xmlMutexUnlock(xmlMemMutex); + + TEST_POINT + +#ifdef DEBUG_MEMORY + xmlGenericError(xmlGenericErrorContext, + "Realloced(%d to %d) Ok\n", oldsize, size); +#endif + return(HDR_2_CLIENT(p)); + +error: + return(NULL); +} + +/** + * xmlMemRealloc: + * @ptr: the initial memory block pointer + * @size: an int specifying the size in byte to allocate. + * + * a realloc() equivalent, with logging of the allocation info. + * + * Returns a pointer to the allocated area or NULL in case of lack of memory. + */ + +void * +xmlMemRealloc(void *ptr,size_t size) { + return(xmlReallocLoc(ptr, size, "none", 0)); +} + +/** + * xmlMemFree: + * @ptr: the memory block pointer + * + * a free() equivalent, with error checking. + */ +void +xmlMemFree(void *ptr) +{ + MEMHDR *p; + char *target; +#ifdef DEBUG_MEMORY + size_t size; +#endif + + if (ptr == NULL) + return; + + if (ptr == (void *) -1) { + xmlGenericError(xmlGenericErrorContext, + "trying to free pointer from freed area\n"); + goto error; + } + + if (xmlMemTraceBlockAt == ptr) { + xmlGenericError(xmlGenericErrorContext, + "%p : Freed()\n", xmlMemTraceBlockAt); + xmlMallocBreakpoint(); + } + + TEST_POINT + + target = (char *) ptr; + + p = CLIENT_2_HDR(ptr); + if (p->mh_tag != MEMTAG) { + Mem_Tag_Err(p); + goto error; + } + if (xmlMemStopAtBlock == p->mh_number) xmlMallocBreakpoint(); + p->mh_tag = ~MEMTAG; + memset(target, -1, p->mh_size); + xmlMutexLock(xmlMemMutex); + debugMemSize -= p->mh_size; + debugMemBlocks--; +#ifdef DEBUG_MEMORY + size = p->mh_size; +#endif +#ifdef MEM_LIST + debugmem_list_delete(p); +#endif + xmlMutexUnlock(xmlMemMutex); + + free(p); + + TEST_POINT + +#ifdef DEBUG_MEMORY + xmlGenericError(xmlGenericErrorContext, + "Freed(%d) Ok\n", size); +#endif + + return; + +error: + xmlGenericError(xmlGenericErrorContext, + "xmlMemFree(%lX) error\n", (unsigned long) ptr); + xmlMallocBreakpoint(); + return; +} + +/** + * xmlMemStrdupLoc: + * @str: the initial string pointer + * @file: the file name or NULL + * @line: the line number + * + * a strdup() equivalent, with logging of the allocation info. + * + * Returns a pointer to the new string or NULL if allocation error occurred. + */ + +char * +xmlMemStrdupLoc(const char *str, const char *file, int line) +{ + char *s; + size_t size = strlen(str) + 1; + MEMHDR *p; + + if (!xmlMemInitialized) xmlInitMemory(); + TEST_POINT + + p = (MEMHDR *) malloc(RESERVE_SIZE+size); + if (!p) { + goto error; + } + p->mh_tag = MEMTAG; + p->mh_size = size; + p->mh_type = STRDUP_TYPE; + p->mh_file = file; + p->mh_line = line; + xmlMutexLock(xmlMemMutex); + p->mh_number = ++block; + debugMemSize += size; + debugMemBlocks++; + if (debugMemSize > debugMaxMemSize) debugMaxMemSize = debugMemSize; +#ifdef MEM_LIST + debugmem_list_add(p); +#endif + xmlMutexUnlock(xmlMemMutex); + + s = (char *) HDR_2_CLIENT(p); + + if (xmlMemStopAtBlock == p->mh_number) xmlMallocBreakpoint(); + + if (s != NULL) + strcpy(s,str); + else + goto error; + + TEST_POINT + + if (xmlMemTraceBlockAt == s) { + xmlGenericError(xmlGenericErrorContext, + "%p : Strdup() Ok\n", xmlMemTraceBlockAt); + xmlMallocBreakpoint(); + } + + return(s); + +error: + return(NULL); +} + +/** + * xmlMemoryStrdup: + * @str: the initial string pointer + * + * a strdup() equivalent, with logging of the allocation info. + * + * Returns a pointer to the new string or NULL if allocation error occurred. + */ + +char * +xmlMemoryStrdup(const char *str) { + return(xmlMemStrdupLoc(str, "none", 0)); +} + +/** + * xmlMemUsed: + * + * Provides the amount of memory currently allocated + * + * Returns an int representing the amount of memory allocated. + */ + +int +xmlMemUsed(void) { + return(debugMemSize); +} + +/** + * xmlMemBlocks: + * + * Provides the number of memory areas currently allocated + * + * Returns an int representing the number of blocks + */ + +int +xmlMemBlocks(void) { + return(debugMemBlocks); +} + +#ifdef MEM_LIST +/** + * xmlMemContentShow: + * @fp: a FILE descriptor used as the output file + * @p: a memory block header + * + * tries to show some content from the memory block + */ + +static void +xmlMemContentShow(FILE *fp, MEMHDR *p) +{ + int i,j,k,len = p->mh_size; + const char *buf = (const char *) HDR_2_CLIENT(p); + + if (p == NULL) { + fprintf(fp, " NULL"); + return; + } + + for (i = 0;i < len;i++) { + if (buf[i] == 0) break; + if (!isprint((unsigned char) buf[i])) break; + } + if ((i < 4) && ((buf[i] != 0) || (i == 0))) { + if (len >= 4) { + MEMHDR *q; + void *cur; + + for (j = 0;(j < len -3) && (j < 40);j += 4) { + cur = *((void **) &buf[j]); + q = CLIENT_2_HDR(cur); + p = memlist; + k = 0; + while (p != NULL) { + if (p == q) break; + p = p->mh_next; + if (k++ > 100) break; + } + if ((p != NULL) && (p == q)) { + fprintf(fp, " pointer to #%lu at index %d", + p->mh_number, j); + return; + } + } + } + } else if ((i == 0) && (buf[i] == 0)) { + fprintf(fp," null"); + } else { + if (buf[i] == 0) fprintf(fp," \"%.25s\"", buf); + else { + fprintf(fp," ["); + for (j = 0;j < i;j++) + fprintf(fp,"%c", buf[j]); + fprintf(fp,"]"); + } + } +} +#endif + +/** + * xmlMemDisplayLast: + * @fp: a FILE descriptor used as the output file, if NULL, the result is + * written to the file .memorylist + * @nbBytes: the amount of memory to dump + * + * the last nbBytes of memory allocated and not freed, useful for dumping + * the memory left allocated between two places at runtime. + */ + +void +xmlMemDisplayLast(FILE *fp, long nbBytes) +{ +#ifdef MEM_LIST + MEMHDR *p; + unsigned idx; + int nb = 0; +#endif + FILE *old_fp = fp; + + if (nbBytes <= 0) + return; + + if (fp == NULL) { + fp = fopen(".memorylist", "w"); + if (fp == NULL) + return; + } + +#ifdef MEM_LIST + fprintf(fp," Last %li MEMORY ALLOCATED : %lu, MAX was %lu\n", + nbBytes, debugMemSize, debugMaxMemSize); + fprintf(fp,"BLOCK NUMBER SIZE TYPE\n"); + idx = 0; + xmlMutexLock(xmlMemMutex); + p = memlist; + while ((p) && (nbBytes > 0)) { + fprintf(fp,"%-5u %6lu %6lu ",idx++,p->mh_number, + (unsigned long)p->mh_size); + switch (p->mh_type) { + case STRDUP_TYPE:fprintf(fp,"strdup() in ");break; + case MALLOC_TYPE:fprintf(fp,"malloc() in ");break; + case REALLOC_TYPE:fprintf(fp,"realloc() in ");break; + case MALLOC_ATOMIC_TYPE:fprintf(fp,"atomicmalloc() in ");break; + case REALLOC_ATOMIC_TYPE:fprintf(fp,"atomicrealloc() in ");break; + default: + fprintf(fp,"Unknown memory block, may be corrupted"); + xmlMutexUnlock(xmlMemMutex); + if (old_fp == NULL) + fclose(fp); + return; + } + if (p->mh_file != NULL) fprintf(fp,"%s(%u)", p->mh_file, p->mh_line); + if (p->mh_tag != MEMTAG) + fprintf(fp," INVALID"); + nb++; + if (nb < 100) + xmlMemContentShow(fp, p); + else + fprintf(fp," skip"); + + fprintf(fp,"\n"); + nbBytes -= (unsigned long)p->mh_size; + p = p->mh_next; + } + xmlMutexUnlock(xmlMemMutex); +#else + fprintf(fp,"Memory list not compiled (MEM_LIST not defined !)\n"); +#endif + if (old_fp == NULL) + fclose(fp); +} + +/** + * xmlMemDisplay: + * @fp: a FILE descriptor used as the output file, if NULL, the result is + * written to the file .memorylist + * + * show in-extenso the memory blocks allocated + */ + +void +xmlMemDisplay(FILE *fp) +{ +#ifdef MEM_LIST + MEMHDR *p; + unsigned idx; + int nb = 0; +#if defined(HAVE_LOCALTIME) && defined(HAVE_STRFTIME) + time_t currentTime; + char buf[500]; + struct tm * tstruct; +#endif +#endif + FILE *old_fp = fp; + + if (fp == NULL) { + fp = fopen(".memorylist", "w"); + if (fp == NULL) + return; + } + +#ifdef MEM_LIST +#if defined(HAVE_LOCALTIME) && defined(HAVE_STRFTIME) + currentTime = time(NULL); + tstruct = localtime(¤tTime); + strftime(buf, sizeof(buf) - 1, "%I:%M:%S %p", tstruct); + fprintf(fp," %s\n\n", buf); +#endif + + + fprintf(fp," MEMORY ALLOCATED : %lu, MAX was %lu\n", + debugMemSize, debugMaxMemSize); + fprintf(fp,"BLOCK NUMBER SIZE TYPE\n"); + idx = 0; + xmlMutexLock(xmlMemMutex); + p = memlist; + while (p) { + fprintf(fp,"%-5u %6lu %6lu ",idx++,p->mh_number, + (unsigned long)p->mh_size); + switch (p->mh_type) { + case STRDUP_TYPE:fprintf(fp,"strdup() in ");break; + case MALLOC_TYPE:fprintf(fp,"malloc() in ");break; + case REALLOC_TYPE:fprintf(fp,"realloc() in ");break; + case MALLOC_ATOMIC_TYPE:fprintf(fp,"atomicmalloc() in ");break; + case REALLOC_ATOMIC_TYPE:fprintf(fp,"atomicrealloc() in ");break; + default: + fprintf(fp,"Unknown memory block, may be corrupted"); + xmlMutexUnlock(xmlMemMutex); + if (old_fp == NULL) + fclose(fp); + return; + } + if (p->mh_file != NULL) fprintf(fp,"%s(%u)", p->mh_file, p->mh_line); + if (p->mh_tag != MEMTAG) + fprintf(fp," INVALID"); + nb++; + if (nb < 100) + xmlMemContentShow(fp, p); + else + fprintf(fp," skip"); + + fprintf(fp,"\n"); + p = p->mh_next; + } + xmlMutexUnlock(xmlMemMutex); +#else + fprintf(fp,"Memory list not compiled (MEM_LIST not defined !)\n"); +#endif + if (old_fp == NULL) + fclose(fp); +} + +#ifdef MEM_LIST + +static void debugmem_list_add(MEMHDR *p) +{ + p->mh_next = memlist; + p->mh_prev = NULL; + if (memlist) memlist->mh_prev = p; + memlist = p; +#ifdef MEM_LIST_DEBUG + if (stderr) + Mem_Display(stderr); +#endif +} + +static void debugmem_list_delete(MEMHDR *p) +{ + if (p->mh_next) + p->mh_next->mh_prev = p->mh_prev; + if (p->mh_prev) + p->mh_prev->mh_next = p->mh_next; + else memlist = p->mh_next; +#ifdef MEM_LIST_DEBUG + if (stderr) + Mem_Display(stderr); +#endif +} + +#endif + +/* + * debugmem_tag_error: + * + * internal error function. + */ + +static void debugmem_tag_error(void *p) +{ + xmlGenericError(xmlGenericErrorContext, + "Memory tag error occurs :%p \n\t bye\n", p); +#ifdef MEM_LIST + if (stderr) + xmlMemDisplay(stderr); +#endif +} + +#ifdef MEM_LIST +static FILE *xmlMemoryDumpFile = NULL; +#endif + +/** + * xmlMemShow: + * @fp: a FILE descriptor used as the output file + * @nr: number of entries to dump + * + * show a show display of the memory allocated, and dump + * the @nr last allocated areas which were not freed + */ + +void +xmlMemShow(FILE *fp, int nr ATTRIBUTE_UNUSED) +{ +#ifdef MEM_LIST + MEMHDR *p; +#endif + + if (fp != NULL) + fprintf(fp," MEMORY ALLOCATED : %lu, MAX was %lu\n", + debugMemSize, debugMaxMemSize); +#ifdef MEM_LIST + xmlMutexLock(xmlMemMutex); + if (nr > 0) { + fprintf(fp,"NUMBER SIZE TYPE WHERE\n"); + p = memlist; + while ((p) && nr > 0) { + fprintf(fp,"%6lu %6lu ",p->mh_number,(unsigned long)p->mh_size); + switch (p->mh_type) { + case STRDUP_TYPE:fprintf(fp,"strdup() in ");break; + case MALLOC_TYPE:fprintf(fp,"malloc() in ");break; + case MALLOC_ATOMIC_TYPE:fprintf(fp,"atomicmalloc() in ");break; + case REALLOC_TYPE:fprintf(fp,"realloc() in ");break; + case REALLOC_ATOMIC_TYPE:fprintf(fp,"atomicrealloc() in ");break; + default:fprintf(fp," ??? in ");break; + } + if (p->mh_file != NULL) + fprintf(fp,"%s(%u)", p->mh_file, p->mh_line); + if (p->mh_tag != MEMTAG) + fprintf(fp," INVALID"); + xmlMemContentShow(fp, p); + fprintf(fp,"\n"); + nr--; + p = p->mh_next; + } + } + xmlMutexUnlock(xmlMemMutex); +#endif /* MEM_LIST */ +} + +/** + * xmlMemoryDump: + * + * Dump in-extenso the memory blocks allocated to the file .memorylist + */ + +void +xmlMemoryDump(void) +{ +#ifdef MEM_LIST + FILE *dump; + + if (debugMaxMemSize == 0) + return; + dump = fopen(".memdump", "w"); + if (dump == NULL) + xmlMemoryDumpFile = stderr; + else xmlMemoryDumpFile = dump; + + xmlMemDisplay(xmlMemoryDumpFile); + + if (dump != NULL) fclose(dump); +#endif /* MEM_LIST */ +} + + +/**************************************************************** + * * + * Initialization Routines * + * * + ****************************************************************/ + +/** + * xmlInitMemory: + * + * Initialize the memory layer. + * + * Returns 0 on success + */ +int +xmlInitMemory(void) +{ +#ifdef HAVE_STDLIB_H + char *breakpoint; +#endif +#ifdef DEBUG_MEMORY + xmlGenericError(xmlGenericErrorContext, + "xmlInitMemory()\n"); +#endif + /* + This is really not good code (see Bug 130419). Suggestions for + improvement will be welcome! + */ + if (xmlMemInitialized) return(-1); + xmlMemInitialized = 1; + xmlMemMutex = xmlNewMutex(); + +#ifdef HAVE_STDLIB_H + breakpoint = getenv("XML_MEM_BREAKPOINT"); + if (breakpoint != NULL) { + sscanf(breakpoint, "%ud", &xmlMemStopAtBlock); + } +#endif +#ifdef HAVE_STDLIB_H + breakpoint = getenv("XML_MEM_TRACE"); + if (breakpoint != NULL) { + sscanf(breakpoint, "%p", &xmlMemTraceBlockAt); + } +#endif + +#ifdef DEBUG_MEMORY + xmlGenericError(xmlGenericErrorContext, + "xmlInitMemory() Ok\n"); +#endif + return(0); +} + +/** + * xmlCleanupMemory: + * + * Free up all the memory allocated by the library for its own + * use. This should not be called by user level code. + */ +void +xmlCleanupMemory(void) { +#ifdef DEBUG_MEMORY + xmlGenericError(xmlGenericErrorContext, + "xmlCleanupMemory()\n"); +#endif + if (xmlMemInitialized == 0) + return; + + xmlFreeMutex(xmlMemMutex); + xmlMemMutex = NULL; + xmlMemInitialized = 0; +#ifdef DEBUG_MEMORY + xmlGenericError(xmlGenericErrorContext, + "xmlCleanupMemory() Ok\n"); +#endif +} + +/** + * xmlMemSetup: + * @freeFunc: the free() function to use + * @mallocFunc: the malloc() function to use + * @reallocFunc: the realloc() function to use + * @strdupFunc: the strdup() function to use + * + * Override the default memory access functions with a new set + * This has to be called before any other libxml routines ! + * + * Should this be blocked if there was already some allocations + * done ? + * + * Returns 0 on success + */ +int +xmlMemSetup(xmlFreeFunc freeFunc, xmlMallocFunc mallocFunc, + xmlReallocFunc reallocFunc, xmlStrdupFunc strdupFunc) { +#ifdef DEBUG_MEMORY + xmlGenericError(xmlGenericErrorContext, + "xmlMemSetup()\n"); +#endif + if (freeFunc == NULL) + return(-1); + if (mallocFunc == NULL) + return(-1); + if (reallocFunc == NULL) + return(-1); + if (strdupFunc == NULL) + return(-1); + xmlFree = freeFunc; + xmlMalloc = mallocFunc; + xmlMallocAtomic = mallocFunc; + xmlRealloc = reallocFunc; + xmlMemStrdup = strdupFunc; +#ifdef DEBUG_MEMORY + xmlGenericError(xmlGenericErrorContext, + "xmlMemSetup() Ok\n"); +#endif + return(0); +} + +/** + * xmlMemGet: + * @freeFunc: place to save the free() function in use + * @mallocFunc: place to save the malloc() function in use + * @reallocFunc: place to save the realloc() function in use + * @strdupFunc: place to save the strdup() function in use + * + * Provides the memory access functions set currently in use + * + * Returns 0 on success + */ +int +xmlMemGet(xmlFreeFunc *freeFunc, xmlMallocFunc *mallocFunc, + xmlReallocFunc *reallocFunc, xmlStrdupFunc *strdupFunc) { + if (freeFunc != NULL) *freeFunc = xmlFree; + if (mallocFunc != NULL) *mallocFunc = xmlMalloc; + if (reallocFunc != NULL) *reallocFunc = xmlRealloc; + if (strdupFunc != NULL) *strdupFunc = xmlMemStrdup; + return(0); +} + +/** + * xmlGcMemSetup: + * @freeFunc: the free() function to use + * @mallocFunc: the malloc() function to use + * @mallocAtomicFunc: the malloc() function to use for atomic allocations + * @reallocFunc: the realloc() function to use + * @strdupFunc: the strdup() function to use + * + * Override the default memory access functions with a new set + * This has to be called before any other libxml routines ! + * The mallocAtomicFunc is specialized for atomic block + * allocations (i.e. of areas useful for garbage collected memory allocators + * + * Should this be blocked if there was already some allocations + * done ? + * + * Returns 0 on success + */ +int +xmlGcMemSetup(xmlFreeFunc freeFunc, xmlMallocFunc mallocFunc, + xmlMallocFunc mallocAtomicFunc, xmlReallocFunc reallocFunc, + xmlStrdupFunc strdupFunc) { +#ifdef DEBUG_MEMORY + xmlGenericError(xmlGenericErrorContext, + "xmlGcMemSetup()\n"); +#endif + if (freeFunc == NULL) + return(-1); + if (mallocFunc == NULL) + return(-1); + if (mallocAtomicFunc == NULL) + return(-1); + if (reallocFunc == NULL) + return(-1); + if (strdupFunc == NULL) + return(-1); + xmlFree = freeFunc; + xmlMalloc = mallocFunc; + xmlMallocAtomic = mallocAtomicFunc; + xmlRealloc = reallocFunc; + xmlMemStrdup = strdupFunc; +#ifdef DEBUG_MEMORY + xmlGenericError(xmlGenericErrorContext, + "xmlGcMemSetup() Ok\n"); +#endif + return(0); +} + +/** + * xmlGcMemGet: + * @freeFunc: place to save the free() function in use + * @mallocFunc: place to save the malloc() function in use + * @mallocAtomicFunc: place to save the atomic malloc() function in use + * @reallocFunc: place to save the realloc() function in use + * @strdupFunc: place to save the strdup() function in use + * + * Provides the memory access functions set currently in use + * The mallocAtomicFunc is specialized for atomic block + * allocations (i.e. of areas useful for garbage collected memory allocators + * + * Returns 0 on success + */ +int +xmlGcMemGet(xmlFreeFunc *freeFunc, xmlMallocFunc *mallocFunc, + xmlMallocFunc *mallocAtomicFunc, xmlReallocFunc *reallocFunc, + xmlStrdupFunc *strdupFunc) { + if (freeFunc != NULL) *freeFunc = xmlFree; + if (mallocFunc != NULL) *mallocFunc = xmlMalloc; + if (mallocAtomicFunc != NULL) *mallocAtomicFunc = xmlMallocAtomic; + if (reallocFunc != NULL) *reallocFunc = xmlRealloc; + if (strdupFunc != NULL) *strdupFunc = xmlMemStrdup; + return(0); +} + +#define bottom_xmlmemory +#include "elfgcchack.h" diff --git a/vendors/libxml/src/xmlmodule.c b/vendors/libxml/src/xmlmodule.c new file mode 100644 index 0000000..7fe5bc2 --- /dev/null +++ b/vendors/libxml/src/xmlmodule.c @@ -0,0 +1,460 @@ +/* + * xmlmodule.c : basic API for dynamic module loading added 2.6.17 + * + * See Copyright for the status of this software. + * + * joelwreed@comcast.net + * + * http://www.fortran-2000.com/ArnaudRecipes/sharedlib.html + */ + +#define IN_LIBXML +#include "libxml.h" + +#include +#include +#include +#include +#include + +#ifdef LIBXML_MODULES_ENABLED + +struct _xmlModule { + unsigned char *name; + void *handle; +}; + +static void *xmlModulePlatformOpen(const char *name); +static int xmlModulePlatformClose(void *handle); +static int xmlModulePlatformSymbol(void *handle, const char *name, void **result); + +/************************************************************************ + * * + * module memory error handler * + * * + ************************************************************************/ + +/** + * xmlModuleErrMemory: + * @extra: extra information + * + * Handle an out of memory condition + */ +static void +xmlModuleErrMemory(xmlModulePtr module, const char *extra) +{ + const char *name = NULL; + + if (module != NULL) { + name = (const char *) module->name; + } + + __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_MODULE, + XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, extra, + name, NULL, 0, 0, + "Memory allocation failed : %s\n", extra); +} + +/** + * xmlModuleOpen: + * @name: the module name + * @options: a set of xmlModuleOption + * + * Opens a module/shared library given its name or path + * NOTE: that due to portability issues, behaviour can only be + * guaranteed with @name using ASCII. We canot guarantee that + * an UTF-8 string would work, which is why name is a const char * + * and not a const xmlChar * . + * TODO: options are not yet implemented. + * + * Returns a handle for the module or NULL in case of error + */ +xmlModulePtr +xmlModuleOpen(const char *name, int options ATTRIBUTE_UNUSED) +{ + xmlModulePtr module; + + module = (xmlModulePtr) xmlMalloc(sizeof(xmlModule)); + if (module == NULL) { + xmlModuleErrMemory(NULL, "creating module"); + return (NULL); + } + + memset(module, 0, sizeof(xmlModule)); + + module->handle = xmlModulePlatformOpen(name); + + if (module->handle == NULL) { + xmlFree(module); + __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_MODULE, + XML_MODULE_OPEN, XML_ERR_FATAL, NULL, 0, 0, + name, NULL, 0, 0, "failed to open %s\n", name); + return(NULL); + } + + module->name = xmlStrdup((const xmlChar *) name); + return (module); +} + +/** + * xmlModuleSymbol: + * @module: the module + * @name: the name of the symbol + * @symbol: the resulting symbol address + * + * Lookup for a symbol address in the given module + * NOTE: that due to portability issues, behaviour can only be + * guaranteed with @name using ASCII. We canot guarantee that + * an UTF-8 string would work, which is why name is a const char * + * and not a const xmlChar * . + * + * Returns 0 if the symbol was found, or -1 in case of error + */ +int +xmlModuleSymbol(xmlModulePtr module, const char *name, void **symbol) +{ + int rc = -1; + + if ((NULL == module) || (symbol == NULL)) { + __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_MODULE, + XML_MODULE_OPEN, XML_ERR_FATAL, NULL, 0, 0, + NULL, NULL, 0, 0, "null parameter\n"); + return rc; + } + + rc = xmlModulePlatformSymbol(module->handle, name, symbol); + + if (rc == -1) { + __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_MODULE, + XML_MODULE_OPEN, XML_ERR_FATAL, NULL, 0, 0, + name, NULL, 0, 0, + "failed to find symbol: %s\n", + (name == NULL ? "NULL" : name)); + return rc; + } + + return rc; +} + +/** + * xmlModuleClose: + * @module: the module handle + * + * The close operations unload the associated module and free the + * data associated to the module. + * + * Returns 0 in case of success, -1 in case of argument error and -2 + * if the module could not be closed/unloaded. + */ +int +xmlModuleClose(xmlModulePtr module) +{ + int rc; + + if (NULL == module) { + __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_MODULE, + XML_MODULE_CLOSE, XML_ERR_FATAL, NULL, 0, 0, + NULL, NULL, 0, 0, "null module pointer\n"); + return -1; + } + + rc = xmlModulePlatformClose(module->handle); + + if (rc != 0) { + __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_MODULE, + XML_MODULE_CLOSE, XML_ERR_FATAL, NULL, 0, 0, + (const char *) module->name, NULL, 0, 0, + "failed to close: %s\n", module->name); + return -2; + } + + rc = xmlModuleFree(module); + return (rc); +} + +/** + * xmlModuleFree: + * @module: the module handle + * + * The free operations free the data associated to the module + * but does not unload the associated shared library which may still + * be in use. + * + * Returns 0 in case of success, -1 in case of argument error + */ +int +xmlModuleFree(xmlModulePtr module) +{ + if (NULL == module) { + __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_MODULE, + XML_MODULE_CLOSE, XML_ERR_FATAL, NULL, 0, NULL, + NULL, NULL, 0, 0, "null module pointer\n"); + return -1; + } + + xmlFree(module->name); + xmlFree(module); + + return (0); +} + +#if defined(HAVE_DLOPEN) && !defined(_WIN32) +#ifdef HAVE_DLFCN_H +#include +#endif + +#ifndef RTLD_GLOBAL /* For Tru64 UNIX 4.0 */ +#define RTLD_GLOBAL 0 +#endif + +/** + * xmlModulePlatformOpen: + * @name: path to the module + * + * returns a handle on success, and zero on error. + */ + +static void * +xmlModulePlatformOpen(const char *name) +{ + return dlopen(name, RTLD_GLOBAL | RTLD_NOW); +} + +/* + * xmlModulePlatformClose: + * @handle: handle to the module + * + * returns 0 on success, and non-zero on error. + */ + +static int +xmlModulePlatformClose(void *handle) +{ + return dlclose(handle); +} + +/* + * xmlModulePlatformSymbol: + * http://www.opengroup.org/onlinepubs/009695399/functions/dlsym.html + * returns 0 on success and the loaded symbol in result, and -1 on error. + */ + +static int +xmlModulePlatformSymbol(void *handle, const char *name, void **symbol) +{ + *symbol = dlsym(handle, name); + if (dlerror() != NULL) { + return -1; + } + return 0; +} + +#else /* ! HAVE_DLOPEN */ + +#ifdef HAVE_SHLLOAD /* HAVE_SHLLOAD */ +#ifdef HAVE_DL_H +#include +#endif +/* + * xmlModulePlatformOpen: + * returns a handle on success, and zero on error. + */ + +static void * +xmlModulePlatformOpen(const char *name) +{ + return shl_load(name, BIND_IMMEDIATE, 0L); +} + +/* + * xmlModulePlatformClose: + * returns 0 on success, and non-zero on error. + */ + +static int +xmlModulePlatformClose(void *handle) +{ + return shl_unload(handle); +} + +/* + * xmlModulePlatformSymbol: + * http://docs.hp.com/en/B2355-90683/shl_load.3X.html + * returns 0 on success and the loaded symbol in result, and -1 on error. + */ + +static int +xmlModulePlatformSymbol(void *handle, const char *name, void **symbol) +{ + int rc; + + errno = 0; + rc = shl_findsym(&handle, name, TYPE_UNDEFINED, symbol); + return rc; +} + +#endif /* HAVE_SHLLOAD */ +#endif /* ! HAVE_DLOPEN */ + +#ifdef _WIN32 + +#include + +/* + * xmlModulePlatformOpen: + * returns a handle on success, and zero on error. + */ + +static void * +xmlModulePlatformOpen(const char *name) +{ + return LoadLibraryA(name); +} + +/* + * xmlModulePlatformClose: + * returns 0 on success, and non-zero on error. + */ + +static int +xmlModulePlatformClose(void *handle) +{ + int rc; + + rc = FreeLibrary(handle); + return (0 == rc); +} + +/* + * xmlModulePlatformSymbol: + * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/getprocaddress.asp + * returns 0 on success and the loaded symbol in result, and -1 on error. + */ + +static int +xmlModulePlatformSymbol(void *handle, const char *name, void **symbol) +{ +#ifdef _WIN32_WCE + /* + * GetProcAddressA seems only available on WinCE + */ + *symbol = GetProcAddressA(handle, name); +#else + *symbol = GetProcAddress(handle, name); +#endif + return (NULL == *symbol) ? -1 : 0; +} + +#endif /* _WIN32 */ + +#ifdef HAVE_BEOS + +#include + +/* + * xmlModulePlatformOpen: + * beos api info: http://www.beunited.org/bebook/The%20Kernel%20Kit/Images.html + * returns a handle on success, and zero on error. + */ + +static void * +xmlModulePlatformOpen(const char *name) +{ + return (void *) load_add_on(name); +} + +/* + * xmlModulePlatformClose: + * beos api info: http://www.beunited.org/bebook/The%20Kernel%20Kit/Images.html + * returns 0 on success, and non-zero on error. + */ + +static int +xmlModulePlatformClose(void *handle) +{ + status_t rc; + + rc = unload_add_on((image_id) handle); + + if (rc == B_OK) + return 0; + else + return -1; +} + +/* + * xmlModulePlatformSymbol: + * beos api info: http://www.beunited.org/bebook/The%20Kernel%20Kit/Images.html + * returns 0 on success and the loaded symbol in result, and -1 on error. + */ + +static int +xmlModulePlatformSymbol(void *handle, const char *name, void **symbol) +{ + status_t rc; + + rc = get_image_symbol((image_id) handle, name, B_SYMBOL_TYPE_ANY, symbol); + + return (rc == B_OK) ? 0 : -1; +} + +#endif /* HAVE_BEOS */ + +#ifdef HAVE_OS2 + +#include + +/* + * xmlModulePlatformOpen: + * os2 api info: http://www.edm2.com/os2api/Dos/DosLoadModule.html + * returns a handle on success, and zero on error. + */ + +static void * +xmlModulePlatformOpen(const char *name) +{ + char errbuf[256]; + void *handle; + int rc; + + rc = DosLoadModule(errbuf, sizeof(errbuf) - 1, name, &handle); + + if (rc) + return 0; + else + return (handle); +} + +/* + * xmlModulePlatformClose: + * os2 api info: http://www.edm2.com/os2api/Dos/DosFreeModule.html + * returns 0 on success, and non-zero on error. + */ + +static int +xmlModulePlatformClose(void *handle) +{ + return DosFreeModule(handle); +} + +/* + * xmlModulePlatformSymbol: + * os2 api info: http://www.edm2.com/os2api/Dos/DosQueryProcAddr.html + * returns 0 on success and the loaded symbol in result, and -1 on error. + */ + +static int +xmlModulePlatformSymbol(void *handle, const char *name, void **symbol) +{ + int rc; + + rc = DosQueryProcAddr(handle, 0, name, symbol); + + return (rc == NO_ERROR) ? 0 : -1; +} + +#endif /* HAVE_OS2 */ + +#define bottom_xmlmodule +#include "elfgcchack.h" +#endif /* LIBXML_MODULES_ENABLED */ diff --git a/vendors/libxml/src/xmlreader.c b/vendors/libxml/src/xmlreader.c new file mode 100644 index 0000000..00083d0 --- /dev/null +++ b/vendors/libxml/src/xmlreader.c @@ -0,0 +1,5918 @@ +/* + * xmlreader.c: implements the xmlTextReader streaming node API + * + * NOTE: + * XmlTextReader.Normalization Property won't be supported, since + * it makes the parser non compliant to the XML recommendation + * + * See Copyright for the status of this software. + * + * daniel@veillard.com + */ + +/* + * TODOs: + * - XML Schemas validation + */ +#define IN_LIBXML +#include "libxml.h" + +#ifdef LIBXML_READER_ENABLED +#include /* for memset() only ! */ +#include + +#ifdef HAVE_CTYPE_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif + +#include +#include +#include +#include +#ifdef LIBXML_SCHEMAS_ENABLED +#include +#include +#endif +#include +#ifdef LIBXML_XINCLUDE_ENABLED +#include +#endif +#ifdef LIBXML_PATTERN_ENABLED +#include +#endif + +#include "buf.h" + +#define MAX_ERR_MSG_SIZE 64000 + +/* + * The following VA_COPY was coded following an example in + * the Samba project. It may not be sufficient for some + * esoteric implementations of va_list (i.e. it may need + * something involving a memcpy) but (hopefully) will be + * sufficient for libxml2. + */ +#ifndef VA_COPY + #ifdef HAVE_VA_COPY + #define VA_COPY(dest, src) va_copy(dest, src) + #else + #ifdef HAVE___VA_COPY + #define VA_COPY(dest,src) __va_copy(dest, src) + #else + #define VA_COPY(dest,src) (dest) = (src) + #endif + #endif +#endif + +/* #define DEBUG_CALLBACKS */ +/* #define DEBUG_READER */ + +/** + * TODO: + * + * macro to flag unimplemented blocks + */ +#define TODO \ + xmlGenericError(xmlGenericErrorContext, \ + "Unimplemented block at %s:%d\n", \ + __FILE__, __LINE__); + +#ifdef DEBUG_READER +#define DUMP_READER xmlTextReaderDebug(reader); +#else +#define DUMP_READER +#endif + +#define CHUNK_SIZE 512 +/************************************************************************ + * * + * The parser: maps the Text Reader API on top of the existing * + * parsing routines building a tree * + * * + ************************************************************************/ + +#define XML_TEXTREADER_INPUT 1 +#define XML_TEXTREADER_CTXT 2 + +typedef enum { + XML_TEXTREADER_NONE = -1, + XML_TEXTREADER_START= 0, + XML_TEXTREADER_ELEMENT= 1, + XML_TEXTREADER_END= 2, + XML_TEXTREADER_EMPTY= 3, + XML_TEXTREADER_BACKTRACK= 4, + XML_TEXTREADER_DONE= 5, + XML_TEXTREADER_ERROR= 6 +} xmlTextReaderState; + +typedef enum { + XML_TEXTREADER_NOT_VALIDATE = 0, + XML_TEXTREADER_VALIDATE_DTD = 1, + XML_TEXTREADER_VALIDATE_RNG = 2, + XML_TEXTREADER_VALIDATE_XSD = 4 +} xmlTextReaderValidate; + +struct _xmlTextReader { + int mode; /* the parsing mode */ + xmlDocPtr doc; /* when walking an existing doc */ + xmlTextReaderValidate validate;/* is there any validation */ + int allocs; /* what structure were deallocated */ + xmlTextReaderState state; + xmlParserCtxtPtr ctxt; /* the parser context */ + xmlSAXHandlerPtr sax; /* the parser SAX callbacks */ + xmlParserInputBufferPtr input; /* the input */ + startElementSAXFunc startElement;/* initial SAX callbacks */ + endElementSAXFunc endElement; /* idem */ + startElementNsSAX2Func startElementNs;/* idem */ + endElementNsSAX2Func endElementNs; /* idem */ + charactersSAXFunc characters; + cdataBlockSAXFunc cdataBlock; + unsigned int base; /* base of the segment in the input */ + unsigned int cur; /* current position in the input */ + xmlNodePtr node; /* current node */ + xmlNodePtr curnode;/* current attribute node */ + int depth; /* depth of the current node */ + xmlNodePtr faketext;/* fake xmlNs chld */ + int preserve;/* preserve the resulting document */ + xmlBufPtr buffer; /* used to return const xmlChar * */ + xmlDictPtr dict; /* the context dictionnary */ + + /* entity stack when traversing entities content */ + xmlNodePtr ent; /* Current Entity Ref Node */ + int entNr; /* Depth of the entities stack */ + int entMax; /* Max depth of the entities stack */ + xmlNodePtr *entTab; /* array of entities */ + + /* error handling */ + xmlTextReaderErrorFunc errorFunc; /* callback function */ + void *errorFuncArg; /* callback function user argument */ + +#ifdef LIBXML_SCHEMAS_ENABLED + /* Handling of RelaxNG validation */ + xmlRelaxNGPtr rngSchemas; /* The Relax NG schemas */ + xmlRelaxNGValidCtxtPtr rngValidCtxt;/* The Relax NG validation context */ + int rngPreserveCtxt; /* 1 if the context was provided by the user */ + int rngValidErrors;/* The number of errors detected */ + xmlNodePtr rngFullNode; /* the node if RNG not progressive */ + /* Handling of Schemas validation */ + xmlSchemaPtr xsdSchemas; /* The Schemas schemas */ + xmlSchemaValidCtxtPtr xsdValidCtxt;/* The Schemas validation context */ + int xsdPreserveCtxt; /* 1 if the context was provided by the user */ + int xsdValidErrors;/* The number of errors detected */ + xmlSchemaSAXPlugPtr xsdPlug; /* the schemas plug in SAX pipeline */ +#endif +#ifdef LIBXML_XINCLUDE_ENABLED + /* Handling of XInclude processing */ + int xinclude; /* is xinclude asked for */ + const xmlChar * xinclude_name; /* the xinclude name from dict */ + xmlXIncludeCtxtPtr xincctxt; /* the xinclude context */ + int in_xinclude; /* counts for xinclude */ +#endif +#ifdef LIBXML_PATTERN_ENABLED + int patternNr; /* number of preserve patterns */ + int patternMax; /* max preserve patterns */ + xmlPatternPtr *patternTab; /* array of preserve patterns */ +#endif + int preserves; /* level of preserves */ + int parserFlags; /* the set of options set */ + /* Structured error handling */ + xmlStructuredErrorFunc sErrorFunc; /* callback function */ +}; + +#define NODE_IS_EMPTY 0x1 +#define NODE_IS_PRESERVED 0x2 +#define NODE_IS_SPRESERVED 0x4 + +/** + * CONSTSTR: + * + * Macro used to return an interned string + */ +#define CONSTSTR(str) xmlDictLookup(reader->dict, (str), -1) +#define CONSTQSTR(p, str) xmlDictQLookup(reader->dict, (p), (str)) + +static int xmlTextReaderReadTree(xmlTextReaderPtr reader); +static int xmlTextReaderNextTree(xmlTextReaderPtr reader); + +/************************************************************************ + * * + * Our own version of the freeing routines as we recycle nodes * + * * + ************************************************************************/ +/** + * DICT_FREE: + * @str: a string + * + * Free a string if it is not owned by the "dict" dictionnary in the + * current scope + */ +#define DICT_FREE(str) \ + if ((str) && ((!dict) || \ + (xmlDictOwns(dict, (const xmlChar *)(str)) == 0))) \ + xmlFree((char *)(str)); + +static void xmlTextReaderFreeNode(xmlTextReaderPtr reader, xmlNodePtr cur); +static void xmlTextReaderFreeNodeList(xmlTextReaderPtr reader, xmlNodePtr cur); + +/** + * xmlFreeID: + * @not: A id + * + * Deallocate the memory used by an id definition + */ +static void +xmlFreeID(xmlIDPtr id) { + xmlDictPtr dict = NULL; + + if (id == NULL) return; + + if (id->doc != NULL) + dict = id->doc->dict; + + if (id->value != NULL) + DICT_FREE(id->value) + xmlFree(id); +} + +/** + * xmlTextReaderRemoveID: + * @doc: the document + * @attr: the attribute + * + * Remove the given attribute from the ID table maintained internally. + * + * Returns -1 if the lookup failed and 0 otherwise + */ +static int +xmlTextReaderRemoveID(xmlDocPtr doc, xmlAttrPtr attr) { + xmlIDTablePtr table; + xmlIDPtr id; + xmlChar *ID; + + if (doc == NULL) return(-1); + if (attr == NULL) return(-1); + table = (xmlIDTablePtr) doc->ids; + if (table == NULL) + return(-1); + + ID = xmlNodeListGetString(doc, attr->children, 1); + if (ID == NULL) + return(-1); + id = xmlHashLookup(table, ID); + xmlFree(ID); + if (id == NULL || id->attr != attr) { + return(-1); + } + id->name = attr->name; + id->attr = NULL; + return(0); +} + +/** + * xmlTextReaderFreeProp: + * @reader: the xmlTextReaderPtr used + * @cur: the node + * + * Free a node. + */ +static void +xmlTextReaderFreeProp(xmlTextReaderPtr reader, xmlAttrPtr cur) { + xmlDictPtr dict; + + dict = reader->ctxt->dict; + if (cur == NULL) return; + + if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue)) + xmlDeregisterNodeDefaultValue((xmlNodePtr) cur); + + /* Check for ID removal -> leading to invalid references ! */ + if ((cur->parent != NULL) && (cur->parent->doc != NULL) && + ((cur->parent->doc->intSubset != NULL) || + (cur->parent->doc->extSubset != NULL))) { + if (xmlIsID(cur->parent->doc, cur->parent, cur)) + xmlTextReaderRemoveID(cur->parent->doc, cur); + } + if (cur->children != NULL) + xmlTextReaderFreeNodeList(reader, cur->children); + + DICT_FREE(cur->name); + if ((reader != NULL) && (reader->ctxt != NULL) && + (reader->ctxt->freeAttrsNr < 100)) { + cur->next = reader->ctxt->freeAttrs; + reader->ctxt->freeAttrs = cur; + reader->ctxt->freeAttrsNr++; + } else { + xmlFree(cur); + } +} + +/** + * xmlTextReaderFreePropList: + * @reader: the xmlTextReaderPtr used + * @cur: the first property in the list + * + * Free a property and all its siblings, all the children are freed too. + */ +static void +xmlTextReaderFreePropList(xmlTextReaderPtr reader, xmlAttrPtr cur) { + xmlAttrPtr next; + if (cur == NULL) return; + while (cur != NULL) { + next = cur->next; + xmlTextReaderFreeProp(reader, cur); + cur = next; + } +} + +/** + * xmlTextReaderFreeNodeList: + * @reader: the xmlTextReaderPtr used + * @cur: the first node in the list + * + * Free a node and all its siblings, this is a recursive behaviour, all + * the children are freed too. + */ +static void +xmlTextReaderFreeNodeList(xmlTextReaderPtr reader, xmlNodePtr cur) { + xmlNodePtr next; + xmlDictPtr dict; + + dict = reader->ctxt->dict; + if (cur == NULL) return; + if (cur->type == XML_NAMESPACE_DECL) { + xmlFreeNsList((xmlNsPtr) cur); + return; + } + if ((cur->type == XML_DOCUMENT_NODE) || + (cur->type == XML_HTML_DOCUMENT_NODE)) { + xmlFreeDoc((xmlDocPtr) cur); + return; + } + while (cur != NULL) { + next = cur->next; + /* unroll to speed up freeing the document */ + if (cur->type != XML_DTD_NODE) { + + if ((cur->children != NULL) && + (cur->type != XML_ENTITY_REF_NODE)) { + if (cur->children->parent == cur) + xmlTextReaderFreeNodeList(reader, cur->children); + cur->children = NULL; + } + + if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue)) + xmlDeregisterNodeDefaultValue(cur); + + if (((cur->type == XML_ELEMENT_NODE) || + (cur->type == XML_XINCLUDE_START) || + (cur->type == XML_XINCLUDE_END)) && + (cur->properties != NULL)) + xmlTextReaderFreePropList(reader, cur->properties); + if ((cur->content != (xmlChar *) &(cur->properties)) && + (cur->type != XML_ELEMENT_NODE) && + (cur->type != XML_XINCLUDE_START) && + (cur->type != XML_XINCLUDE_END) && + (cur->type != XML_ENTITY_REF_NODE)) { + DICT_FREE(cur->content); + } + if (((cur->type == XML_ELEMENT_NODE) || + (cur->type == XML_XINCLUDE_START) || + (cur->type == XML_XINCLUDE_END)) && + (cur->nsDef != NULL)) + xmlFreeNsList(cur->nsDef); + + /* + * we don't free element names here they are interned now + */ + if ((cur->type != XML_TEXT_NODE) && + (cur->type != XML_COMMENT_NODE)) + DICT_FREE(cur->name); + if (((cur->type == XML_ELEMENT_NODE) || + (cur->type == XML_TEXT_NODE)) && + (reader != NULL) && (reader->ctxt != NULL) && + (reader->ctxt->freeElemsNr < 100)) { + cur->next = reader->ctxt->freeElems; + reader->ctxt->freeElems = cur; + reader->ctxt->freeElemsNr++; + } else { + xmlFree(cur); + } + } + cur = next; + } +} + +/** + * xmlTextReaderFreeNode: + * @reader: the xmlTextReaderPtr used + * @cur: the node + * + * Free a node, this is a recursive behaviour, all the children are freed too. + * This doesn't unlink the child from the list, use xmlUnlinkNode() first. + */ +static void +xmlTextReaderFreeNode(xmlTextReaderPtr reader, xmlNodePtr cur) { + xmlDictPtr dict; + + dict = reader->ctxt->dict; + if (cur->type == XML_DTD_NODE) { + xmlFreeDtd((xmlDtdPtr) cur); + return; + } + if (cur->type == XML_NAMESPACE_DECL) { + xmlFreeNs((xmlNsPtr) cur); + return; + } + if (cur->type == XML_ATTRIBUTE_NODE) { + xmlTextReaderFreeProp(reader, (xmlAttrPtr) cur); + return; + } + + if ((cur->children != NULL) && + (cur->type != XML_ENTITY_REF_NODE)) { + if (cur->children->parent == cur) + xmlTextReaderFreeNodeList(reader, cur->children); + cur->children = NULL; + } + + if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue)) + xmlDeregisterNodeDefaultValue(cur); + + if (((cur->type == XML_ELEMENT_NODE) || + (cur->type == XML_XINCLUDE_START) || + (cur->type == XML_XINCLUDE_END)) && + (cur->properties != NULL)) + xmlTextReaderFreePropList(reader, cur->properties); + if ((cur->content != (xmlChar *) &(cur->properties)) && + (cur->type != XML_ELEMENT_NODE) && + (cur->type != XML_XINCLUDE_START) && + (cur->type != XML_XINCLUDE_END) && + (cur->type != XML_ENTITY_REF_NODE)) { + DICT_FREE(cur->content); + } + if (((cur->type == XML_ELEMENT_NODE) || + (cur->type == XML_XINCLUDE_START) || + (cur->type == XML_XINCLUDE_END)) && + (cur->nsDef != NULL)) + xmlFreeNsList(cur->nsDef); + + /* + * we don't free names here they are interned now + */ + if ((cur->type != XML_TEXT_NODE) && + (cur->type != XML_COMMENT_NODE)) + DICT_FREE(cur->name); + + if (((cur->type == XML_ELEMENT_NODE) || + (cur->type == XML_TEXT_NODE)) && + (reader != NULL) && (reader->ctxt != NULL) && + (reader->ctxt->freeElemsNr < 100)) { + cur->next = reader->ctxt->freeElems; + reader->ctxt->freeElems = cur; + reader->ctxt->freeElemsNr++; + } else { + xmlFree(cur); + } +} + +/** + * xmlTextReaderFreeIDTable: + * @table: An id table + * + * Deallocate the memory used by an ID hash table. + */ +static void +xmlTextReaderFreeIDTable(xmlIDTablePtr table) { + xmlHashFree(table, (xmlHashDeallocator) xmlFreeID); +} + +/** + * xmlTextReaderFreeDoc: + * @reader: the xmlTextReaderPtr used + * @cur: pointer to the document + * + * Free up all the structures used by a document, tree included. + */ +static void +xmlTextReaderFreeDoc(xmlTextReaderPtr reader, xmlDocPtr cur) { + xmlDtdPtr extSubset, intSubset; + + if (cur == NULL) return; + + if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue)) + xmlDeregisterNodeDefaultValue((xmlNodePtr) cur); + + /* + * Do this before freeing the children list to avoid ID lookups + */ + if (cur->ids != NULL) xmlTextReaderFreeIDTable((xmlIDTablePtr) cur->ids); + cur->ids = NULL; + if (cur->refs != NULL) xmlFreeRefTable((xmlRefTablePtr) cur->refs); + cur->refs = NULL; + extSubset = cur->extSubset; + intSubset = cur->intSubset; + if (intSubset == extSubset) + extSubset = NULL; + if (extSubset != NULL) { + xmlUnlinkNode((xmlNodePtr) cur->extSubset); + cur->extSubset = NULL; + xmlFreeDtd(extSubset); + } + if (intSubset != NULL) { + xmlUnlinkNode((xmlNodePtr) cur->intSubset); + cur->intSubset = NULL; + xmlFreeDtd(intSubset); + } + + if (cur->children != NULL) xmlTextReaderFreeNodeList(reader, cur->children); + + if (cur->version != NULL) xmlFree((char *) cur->version); + if (cur->name != NULL) xmlFree((char *) cur->name); + if (cur->encoding != NULL) xmlFree((char *) cur->encoding); + if (cur->oldNs != NULL) xmlFreeNsList(cur->oldNs); + if (cur->URL != NULL) xmlFree((char *) cur->URL); + if (cur->dict != NULL) xmlDictFree(cur->dict); + + xmlFree(cur); +} + +/************************************************************************ + * * + * The reader core parser * + * * + ************************************************************************/ +#ifdef DEBUG_READER +static void +xmlTextReaderDebug(xmlTextReaderPtr reader) { + if ((reader == NULL) || (reader->ctxt == NULL)) { + fprintf(stderr, "xmlTextReader NULL\n"); + return; + } + fprintf(stderr, "xmlTextReader: state %d depth %d ", + reader->state, reader->depth); + if (reader->node == NULL) { + fprintf(stderr, "node = NULL\n"); + } else { + fprintf(stderr, "node %s\n", reader->node->name); + } + fprintf(stderr, " input: base %d, cur %d, depth %d: ", + reader->base, reader->cur, reader->ctxt->nodeNr); + if (reader->input->buffer == NULL) { + fprintf(stderr, "buffer is NULL\n"); + } else { +#ifdef LIBXML_DEBUG_ENABLED + xmlDebugDumpString(stderr, + &reader->input->buffer->content[reader->cur]); +#endif + fprintf(stderr, "\n"); + } +} +#endif + +/** + * xmlTextReaderEntPush: + * @reader: the xmlTextReaderPtr used + * @value: the entity reference node + * + * Pushes a new entity reference node on top of the entities stack + * + * Returns 0 in case of error, the index in the stack otherwise + */ +static int +xmlTextReaderEntPush(xmlTextReaderPtr reader, xmlNodePtr value) +{ + if (reader->entMax <= 0) { + reader->entMax = 10; + reader->entTab = (xmlNodePtr *) xmlMalloc(reader->entMax * + sizeof(reader->entTab[0])); + if (reader->entTab == NULL) { + xmlGenericError(xmlGenericErrorContext, "xmlMalloc failed !\n"); + return (0); + } + } + if (reader->entNr >= reader->entMax) { + reader->entMax *= 2; + reader->entTab = + (xmlNodePtr *) xmlRealloc(reader->entTab, + reader->entMax * + sizeof(reader->entTab[0])); + if (reader->entTab == NULL) { + xmlGenericError(xmlGenericErrorContext, "xmlRealloc failed !\n"); + return (0); + } + } + reader->entTab[reader->entNr] = value; + reader->ent = value; + return (reader->entNr++); +} + +/** + * xmlTextReaderEntPop: + * @reader: the xmlTextReaderPtr used + * + * Pops the top element entity from the entities stack + * + * Returns the entity just removed + */ +static xmlNodePtr +xmlTextReaderEntPop(xmlTextReaderPtr reader) +{ + xmlNodePtr ret; + + if (reader->entNr <= 0) + return (NULL); + reader->entNr--; + if (reader->entNr > 0) + reader->ent = reader->entTab[reader->entNr - 1]; + else + reader->ent = NULL; + ret = reader->entTab[reader->entNr]; + reader->entTab[reader->entNr] = NULL; + return (ret); +} + +/** + * xmlTextReaderStartElement: + * @ctx: the user data (XML parser context) + * @fullname: The element name, including namespace prefix + * @atts: An array of name/value attributes pairs, NULL terminated + * + * called when an opening tag has been processed. + */ +static void +xmlTextReaderStartElement(void *ctx, const xmlChar *fullname, + const xmlChar **atts) { + xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; + xmlTextReaderPtr reader = ctxt->_private; + +#ifdef DEBUG_CALLBACKS + printf("xmlTextReaderStartElement(%s)\n", fullname); +#endif + if ((reader != NULL) && (reader->startElement != NULL)) { + reader->startElement(ctx, fullname, atts); + if ((ctxt->node != NULL) && (ctxt->input != NULL) && + (ctxt->input->cur != NULL) && (ctxt->input->cur[0] == '/') && + (ctxt->input->cur[1] == '>')) + ctxt->node->extra = NODE_IS_EMPTY; + } + if (reader != NULL) + reader->state = XML_TEXTREADER_ELEMENT; +} + +/** + * xmlTextReaderEndElement: + * @ctx: the user data (XML parser context) + * @fullname: The element name, including namespace prefix + * + * called when an ending tag has been processed. + */ +static void +xmlTextReaderEndElement(void *ctx, const xmlChar *fullname) { + xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; + xmlTextReaderPtr reader = ctxt->_private; + +#ifdef DEBUG_CALLBACKS + printf("xmlTextReaderEndElement(%s)\n", fullname); +#endif + if ((reader != NULL) && (reader->endElement != NULL)) { + reader->endElement(ctx, fullname); + } +} + +/** + * xmlTextReaderStartElementNs: + * @ctx: the user data (XML parser context) + * @localname: the local name of the element + * @prefix: the element namespace prefix if available + * @URI: the element namespace name if available + * @nb_namespaces: number of namespace definitions on that node + * @namespaces: pointer to the array of prefix/URI pairs namespace definitions + * @nb_attributes: the number of attributes on that node + * nb_defaulted: the number of defaulted attributes. + * @attributes: pointer to the array of (localname/prefix/URI/value/end) + * attribute values. + * + * called when an opening tag has been processed. + */ +static void +xmlTextReaderStartElementNs(void *ctx, + const xmlChar *localname, + const xmlChar *prefix, + const xmlChar *URI, + int nb_namespaces, + const xmlChar **namespaces, + int nb_attributes, + int nb_defaulted, + const xmlChar **attributes) +{ + xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; + xmlTextReaderPtr reader = ctxt->_private; + +#ifdef DEBUG_CALLBACKS + printf("xmlTextReaderStartElementNs(%s)\n", localname); +#endif + if ((reader != NULL) && (reader->startElementNs != NULL)) { + reader->startElementNs(ctx, localname, prefix, URI, nb_namespaces, + namespaces, nb_attributes, nb_defaulted, + attributes); + if ((ctxt->node != NULL) && (ctxt->input != NULL) && + (ctxt->input->cur != NULL) && (ctxt->input->cur[0] == '/') && + (ctxt->input->cur[1] == '>')) + ctxt->node->extra = NODE_IS_EMPTY; + } + if (reader != NULL) + reader->state = XML_TEXTREADER_ELEMENT; +} + +/** + * xmlTextReaderEndElementNs: + * @ctx: the user data (XML parser context) + * @localname: the local name of the element + * @prefix: the element namespace prefix if available + * @URI: the element namespace name if available + * + * called when an ending tag has been processed. + */ +static void +xmlTextReaderEndElementNs(void *ctx, + const xmlChar * localname, + const xmlChar * prefix, + const xmlChar * URI) +{ + xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; + xmlTextReaderPtr reader = ctxt->_private; + +#ifdef DEBUG_CALLBACKS + printf("xmlTextReaderEndElementNs(%s)\n", localname); +#endif + if ((reader != NULL) && (reader->endElementNs != NULL)) { + reader->endElementNs(ctx, localname, prefix, URI); + } +} + + +/** + * xmlTextReaderCharacters: + * @ctx: the user data (XML parser context) + * @ch: a xmlChar string + * @len: the number of xmlChar + * + * receiving some chars from the parser. + */ +static void +xmlTextReaderCharacters(void *ctx, const xmlChar *ch, int len) +{ + xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; + xmlTextReaderPtr reader = ctxt->_private; + +#ifdef DEBUG_CALLBACKS + printf("xmlTextReaderCharacters()\n"); +#endif + if ((reader != NULL) && (reader->characters != NULL)) { + reader->characters(ctx, ch, len); + } +} + +/** + * xmlTextReaderCDataBlock: + * @ctx: the user data (XML parser context) + * @value: The pcdata content + * @len: the block length + * + * called when a pcdata block has been parsed + */ +static void +xmlTextReaderCDataBlock(void *ctx, const xmlChar *ch, int len) +{ + xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; + xmlTextReaderPtr reader = ctxt->_private; + +#ifdef DEBUG_CALLBACKS + printf("xmlTextReaderCDataBlock()\n"); +#endif + if ((reader != NULL) && (reader->cdataBlock != NULL)) { + reader->cdataBlock(ctx, ch, len); + } +} + +/** + * xmlTextReaderPushData: + * @reader: the xmlTextReaderPtr used + * + * Push data down the progressive parser until a significant callback + * got raised. + * + * Returns -1 in case of failure, 0 otherwise + */ +static int +xmlTextReaderPushData(xmlTextReaderPtr reader) { + xmlBufPtr inbuf; + int val, s; + xmlTextReaderState oldstate; + int alloc; + + if ((reader->input == NULL) || (reader->input->buffer == NULL)) + return(-1); + + oldstate = reader->state; + reader->state = XML_TEXTREADER_NONE; + inbuf = reader->input->buffer; + alloc = xmlBufGetAllocationScheme(inbuf); + + while (reader->state == XML_TEXTREADER_NONE) { + if (xmlBufUse(inbuf) < reader->cur + CHUNK_SIZE) { + /* + * Refill the buffer unless we are at the end of the stream + */ + if (reader->mode != XML_TEXTREADER_MODE_EOF) { + val = xmlParserInputBufferRead(reader->input, 4096); + if ((val == 0) && + (alloc == XML_BUFFER_ALLOC_IMMUTABLE)) { + if (xmlBufUse(inbuf) == reader->cur) { + reader->mode = XML_TEXTREADER_MODE_EOF; + reader->state = oldstate; + } + } else if (val < 0) { + reader->mode = XML_TEXTREADER_MODE_EOF; + reader->state = oldstate; + if ((oldstate != XML_TEXTREADER_START) || + (reader->ctxt->myDoc != NULL)) + return(val); + } else if (val == 0) { + /* mark the end of the stream and process the remains */ + reader->mode = XML_TEXTREADER_MODE_EOF; + break; + } + + } else + break; + } + /* + * parse by block of CHUNK_SIZE bytes, various tests show that + * it's the best tradeoff at least on a 1.2GH Duron + */ + if (xmlBufUse(inbuf) >= reader->cur + CHUNK_SIZE) { + val = xmlParseChunk(reader->ctxt, + (const char *) xmlBufContent(inbuf) + reader->cur, + CHUNK_SIZE, 0); + reader->cur += CHUNK_SIZE; + if (val != 0) + reader->ctxt->wellFormed = 0; + if (reader->ctxt->wellFormed == 0) + break; + } else { + s = xmlBufUse(inbuf) - reader->cur; + val = xmlParseChunk(reader->ctxt, + (const char *) xmlBufContent(inbuf) + reader->cur, + s, 0); + reader->cur += s; + if (val != 0) + reader->ctxt->wellFormed = 0; + break; + } + } + + /* + * Discard the consumed input when needed and possible + */ + if (reader->mode == XML_TEXTREADER_MODE_INTERACTIVE) { + if (alloc != XML_BUFFER_ALLOC_IMMUTABLE) { + if ((reader->cur >= 4096) && + (xmlBufUse(inbuf) - reader->cur <= CHUNK_SIZE)) { + val = xmlBufShrink(inbuf, reader->cur); + if (val >= 0) { + reader->cur -= val; + } + } + } + } + + /* + * At the end of the stream signal that the work is done to the Push + * parser. + */ + else if (reader->mode == XML_TEXTREADER_MODE_EOF) { + if (reader->state != XML_TEXTREADER_DONE) { + s = xmlBufUse(inbuf) - reader->cur; + val = xmlParseChunk(reader->ctxt, + (const char *) xmlBufContent(inbuf) + reader->cur, + s, 1); + reader->cur = xmlBufUse(inbuf); + reader->state = XML_TEXTREADER_DONE; + if (val != 0) { + if (reader->ctxt->wellFormed) + reader->ctxt->wellFormed = 0; + else + return(-1); + } + } + } + reader->state = oldstate; + if (reader->ctxt->wellFormed == 0) { + reader->mode = XML_TEXTREADER_MODE_EOF; + return(-1); + } + + return(0); +} + +#ifdef LIBXML_REGEXP_ENABLED +/** + * xmlTextReaderValidatePush: + * @reader: the xmlTextReaderPtr used + * + * Push the current node for validation + */ +static void +xmlTextReaderValidatePush(xmlTextReaderPtr reader ATTRIBUTE_UNUSED) { + xmlNodePtr node = reader->node; + +#ifdef LIBXML_VALID_ENABLED + if ((reader->validate == XML_TEXTREADER_VALIDATE_DTD) && + (reader->ctxt != NULL) && (reader->ctxt->validate == 1)) { + if ((node->ns == NULL) || (node->ns->prefix == NULL)) { + reader->ctxt->valid &= xmlValidatePushElement(&reader->ctxt->vctxt, + reader->ctxt->myDoc, node, node->name); + } else { + /* TODO use the BuildQName interface */ + xmlChar *qname; + + qname = xmlStrdup(node->ns->prefix); + qname = xmlStrcat(qname, BAD_CAST ":"); + qname = xmlStrcat(qname, node->name); + reader->ctxt->valid &= xmlValidatePushElement(&reader->ctxt->vctxt, + reader->ctxt->myDoc, node, qname); + if (qname != NULL) + xmlFree(qname); + } + } +#endif /* LIBXML_VALID_ENABLED */ +#ifdef LIBXML_SCHEMAS_ENABLED + if ((reader->validate == XML_TEXTREADER_VALIDATE_RNG) && + (reader->rngValidCtxt != NULL)) { + int ret; + + if (reader->rngFullNode != NULL) return; + ret = xmlRelaxNGValidatePushElement(reader->rngValidCtxt, + reader->ctxt->myDoc, + node); + if (ret == 0) { + /* + * this element requires a full tree + */ + node = xmlTextReaderExpand(reader); + if (node == NULL) { +printf("Expand failed !\n"); + ret = -1; + } else { + ret = xmlRelaxNGValidateFullElement(reader->rngValidCtxt, + reader->ctxt->myDoc, + node); + reader->rngFullNode = node; + } + } + if (ret != 1) + reader->rngValidErrors++; + } +#endif +} + +/** + * xmlTextReaderValidateCData: + * @reader: the xmlTextReaderPtr used + * @data: pointer to the CData + * @len: length of the CData block in bytes. + * + * Push some CData for validation + */ +static void +xmlTextReaderValidateCData(xmlTextReaderPtr reader, + const xmlChar *data, int len) { +#ifdef LIBXML_VALID_ENABLED + if ((reader->validate == XML_TEXTREADER_VALIDATE_DTD) && + (reader->ctxt != NULL) && (reader->ctxt->validate == 1)) { + reader->ctxt->valid &= xmlValidatePushCData(&reader->ctxt->vctxt, + data, len); + } +#endif /* LIBXML_VALID_ENABLED */ +#ifdef LIBXML_SCHEMAS_ENABLED + if ((reader->validate == XML_TEXTREADER_VALIDATE_RNG) && + (reader->rngValidCtxt != NULL)) { + int ret; + + if (reader->rngFullNode != NULL) return; + ret = xmlRelaxNGValidatePushCData(reader->rngValidCtxt, data, len); + if (ret != 1) + reader->rngValidErrors++; + } +#endif +} + +/** + * xmlTextReaderValidatePop: + * @reader: the xmlTextReaderPtr used + * + * Pop the current node from validation + */ +static void +xmlTextReaderValidatePop(xmlTextReaderPtr reader) { + xmlNodePtr node = reader->node; + +#ifdef LIBXML_VALID_ENABLED + if ((reader->validate == XML_TEXTREADER_VALIDATE_DTD) && + (reader->ctxt != NULL) && (reader->ctxt->validate == 1)) { + if ((node->ns == NULL) || (node->ns->prefix == NULL)) { + reader->ctxt->valid &= xmlValidatePopElement(&reader->ctxt->vctxt, + reader->ctxt->myDoc, node, node->name); + } else { + /* TODO use the BuildQName interface */ + xmlChar *qname; + + qname = xmlStrdup(node->ns->prefix); + qname = xmlStrcat(qname, BAD_CAST ":"); + qname = xmlStrcat(qname, node->name); + reader->ctxt->valid &= xmlValidatePopElement(&reader->ctxt->vctxt, + reader->ctxt->myDoc, node, qname); + if (qname != NULL) + xmlFree(qname); + } + } +#endif /* LIBXML_VALID_ENABLED */ +#ifdef LIBXML_SCHEMAS_ENABLED + if ((reader->validate == XML_TEXTREADER_VALIDATE_RNG) && + (reader->rngValidCtxt != NULL)) { + int ret; + + if (reader->rngFullNode != NULL) { + if (node == reader->rngFullNode) + reader->rngFullNode = NULL; + return; + } + ret = xmlRelaxNGValidatePopElement(reader->rngValidCtxt, + reader->ctxt->myDoc, + node); + if (ret != 1) + reader->rngValidErrors++; + } +#endif +} + +/** + * xmlTextReaderValidateEntity: + * @reader: the xmlTextReaderPtr used + * + * Handle the validation when an entity reference is encountered and + * entity substitution is not activated. As a result the parser interface + * must walk through the entity and do the validation calls + */ +static void +xmlTextReaderValidateEntity(xmlTextReaderPtr reader) { + xmlNodePtr oldnode = reader->node; + xmlNodePtr node = reader->node; + xmlParserCtxtPtr ctxt = reader->ctxt; + + do { + if (node->type == XML_ENTITY_REF_NODE) { + /* + * Case where the underlying tree is not availble, lookup the entity + * and walk it. + */ + if ((node->children == NULL) && (ctxt->sax != NULL) && + (ctxt->sax->getEntity != NULL)) { + node->children = (xmlNodePtr) + ctxt->sax->getEntity(ctxt, node->name); + } + + if ((node->children != NULL) && + (node->children->type == XML_ENTITY_DECL) && + (node->children->children != NULL)) { + xmlTextReaderEntPush(reader, node); + node = node->children->children; + continue; + } else { + /* + * The error has probably be raised already. + */ + if (node == oldnode) + break; + node = node->next; + } +#ifdef LIBXML_REGEXP_ENABLED + } else if (node->type == XML_ELEMENT_NODE) { + reader->node = node; + xmlTextReaderValidatePush(reader); + } else if ((node->type == XML_TEXT_NODE) || + (node->type == XML_CDATA_SECTION_NODE)) { + xmlTextReaderValidateCData(reader, node->content, + xmlStrlen(node->content)); +#endif + } + + /* + * go to next node + */ + if (node->children != NULL) { + node = node->children; + continue; + } else if (node->type == XML_ELEMENT_NODE) { + xmlTextReaderValidatePop(reader); + } + if (node->next != NULL) { + node = node->next; + continue; + } + do { + node = node->parent; + if (node->type == XML_ELEMENT_NODE) { + xmlNodePtr tmp; + if (reader->entNr == 0) { + while ((tmp = node->last) != NULL) { + if ((tmp->extra & NODE_IS_PRESERVED) == 0) { + xmlUnlinkNode(tmp); + xmlTextReaderFreeNode(reader, tmp); + } else + break; + } + } + reader->node = node; + xmlTextReaderValidatePop(reader); + } + if ((node->type == XML_ENTITY_DECL) && + (reader->ent != NULL) && (reader->ent->children == node)) { + node = xmlTextReaderEntPop(reader); + } + if (node == oldnode) + break; + if (node->next != NULL) { + node = node->next; + break; + } + } while ((node != NULL) && (node != oldnode)); + } while ((node != NULL) && (node != oldnode)); + reader->node = oldnode; +} +#endif /* LIBXML_REGEXP_ENABLED */ + + +/** + * xmlTextReaderGetSuccessor: + * @cur: the current node + * + * Get the successor of a node if available. + * + * Returns the successor node or NULL + */ +static xmlNodePtr +xmlTextReaderGetSuccessor(xmlNodePtr cur) { + if (cur == NULL) return(NULL) ; /* ERROR */ + if (cur->next != NULL) return(cur->next) ; + do { + cur = cur->parent; + if (cur == NULL) break; + if (cur->next != NULL) return(cur->next); + } while (cur != NULL); + return(cur); +} + +/** + * xmlTextReaderDoExpand: + * @reader: the xmlTextReaderPtr used + * + * Makes sure that the current node is fully read as well as all its + * descendant. It means the full DOM subtree must be available at the + * end of the call. + * + * Returns 1 if the node was expanded successfully, 0 if there is no more + * nodes to read, or -1 in case of error + */ +static int +xmlTextReaderDoExpand(xmlTextReaderPtr reader) { + int val; + + if ((reader == NULL) || (reader->node == NULL) || (reader->ctxt == NULL)) + return(-1); + do { + if (reader->ctxt->instate == XML_PARSER_EOF) return(1); + + if (xmlTextReaderGetSuccessor(reader->node) != NULL) + return(1); + if (reader->ctxt->nodeNr < reader->depth) + return(1); + if (reader->mode == XML_TEXTREADER_MODE_EOF) + return(1); + val = xmlTextReaderPushData(reader); + if (val < 0){ + reader->mode = XML_TEXTREADER_MODE_ERROR; + return(-1); + } + } while(reader->mode != XML_TEXTREADER_MODE_EOF); + return(1); +} + +/** + * xmlTextReaderCollectSiblings: + * @node: the first child + * + * Traverse depth-first through all sibling nodes and their children + * nodes and concatenate their content. This is an auxiliary function + * to xmlTextReaderReadString. + * + * Returns a string containing the content, or NULL in case of error. + */ +static xmlChar * +xmlTextReaderCollectSiblings(xmlNodePtr node) +{ + xmlBufferPtr buffer; + xmlChar *ret; + + if ((node == NULL) || (node->type == XML_NAMESPACE_DECL)) + return(NULL); + + buffer = xmlBufferCreate(); + if (buffer == NULL) + return NULL; + + for ( ; node != NULL; node = node->next) { + switch (node->type) { + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + xmlBufferCat(buffer, node->content); + break; + case XML_ELEMENT_NODE: { + xmlChar *tmp; + + tmp = xmlTextReaderCollectSiblings(node->children); + xmlBufferCat(buffer, tmp); + xmlFree(tmp); + break; + } + default: + break; + } + } + ret = buffer->content; + buffer->content = NULL; + xmlBufferFree(buffer); + return(ret); +} + +/** + * xmlTextReaderRead: + * @reader: the xmlTextReaderPtr used + * + * Moves the position of the current instance to the next node in + * the stream, exposing its properties. + * + * Returns 1 if the node was read successfully, 0 if there is no more + * nodes to read, or -1 in case of error + */ +int +xmlTextReaderRead(xmlTextReaderPtr reader) { + int val, olddepth = 0; + xmlTextReaderState oldstate = XML_TEXTREADER_START; + xmlNodePtr oldnode = NULL; + + + if (reader == NULL) + return(-1); + reader->curnode = NULL; + if (reader->doc != NULL) + return(xmlTextReaderReadTree(reader)); + if (reader->ctxt == NULL) + return(-1); + +#ifdef DEBUG_READER + fprintf(stderr, "\nREAD "); + DUMP_READER +#endif + if (reader->mode == XML_TEXTREADER_MODE_INITIAL) { + reader->mode = XML_TEXTREADER_MODE_INTERACTIVE; + /* + * Initial state + */ + do { + val = xmlTextReaderPushData(reader); + if (val < 0){ + reader->mode = XML_TEXTREADER_MODE_ERROR; + reader->state = XML_TEXTREADER_ERROR; + return(-1); + } + } while ((reader->ctxt->node == NULL) && + ((reader->mode != XML_TEXTREADER_MODE_EOF) && + (reader->state != XML_TEXTREADER_DONE))); + if (reader->ctxt->node == NULL) { + if (reader->ctxt->myDoc != NULL) { + reader->node = reader->ctxt->myDoc->children; + } + if (reader->node == NULL){ + reader->mode = XML_TEXTREADER_MODE_ERROR; + reader->state = XML_TEXTREADER_ERROR; + return(-1); + } + reader->state = XML_TEXTREADER_ELEMENT; + } else { + if (reader->ctxt->myDoc != NULL) { + reader->node = reader->ctxt->myDoc->children; + } + if (reader->node == NULL) + reader->node = reader->ctxt->nodeTab[0]; + reader->state = XML_TEXTREADER_ELEMENT; + } + reader->depth = 0; + reader->ctxt->parseMode = XML_PARSE_READER; + goto node_found; + } + oldstate = reader->state; + olddepth = reader->ctxt->nodeNr; + oldnode = reader->node; + +get_next_node: + if (reader->node == NULL) { + if (reader->mode == XML_TEXTREADER_MODE_EOF) + return(0); + else + return(-1); + } + + /* + * If we are not backtracking on ancestors or examined nodes, + * that the parser didn't finished or that we arent at the end + * of stream, continue processing. + */ + while ((reader->node != NULL) && (reader->node->next == NULL) && + (reader->ctxt->nodeNr == olddepth) && + ((oldstate == XML_TEXTREADER_BACKTRACK) || + (reader->node->children == NULL) || + (reader->node->type == XML_ENTITY_REF_NODE) || + ((reader->node->children != NULL) && + (reader->node->children->type == XML_TEXT_NODE) && + (reader->node->children->next == NULL)) || + (reader->node->type == XML_DTD_NODE) || + (reader->node->type == XML_DOCUMENT_NODE) || + (reader->node->type == XML_HTML_DOCUMENT_NODE)) && + ((reader->ctxt->node == NULL) || + (reader->ctxt->node == reader->node) || + (reader->ctxt->node == reader->node->parent)) && + (reader->ctxt->instate != XML_PARSER_EOF)) { + val = xmlTextReaderPushData(reader); + if (val < 0){ + reader->mode = XML_TEXTREADER_MODE_ERROR; + reader->state = XML_TEXTREADER_ERROR; + return(-1); + } + if (reader->node == NULL) + goto node_end; + } + if (oldstate != XML_TEXTREADER_BACKTRACK) { + if ((reader->node->children != NULL) && + (reader->node->type != XML_ENTITY_REF_NODE) && + (reader->node->type != XML_XINCLUDE_START) && + (reader->node->type != XML_DTD_NODE)) { + reader->node = reader->node->children; + reader->depth++; + reader->state = XML_TEXTREADER_ELEMENT; + goto node_found; + } + } + if (reader->node->next != NULL) { + if ((oldstate == XML_TEXTREADER_ELEMENT) && + (reader->node->type == XML_ELEMENT_NODE) && + (reader->node->children == NULL) && + ((reader->node->extra & NODE_IS_EMPTY) == 0) +#ifdef LIBXML_XINCLUDE_ENABLED + && (reader->in_xinclude <= 0) +#endif + ) { + reader->state = XML_TEXTREADER_END; + goto node_found; + } +#ifdef LIBXML_REGEXP_ENABLED + if ((reader->validate) && + (reader->node->type == XML_ELEMENT_NODE)) + xmlTextReaderValidatePop(reader); +#endif /* LIBXML_REGEXP_ENABLED */ + if ((reader->preserves > 0) && + (reader->node->extra & NODE_IS_SPRESERVED)) + reader->preserves--; + reader->node = reader->node->next; + reader->state = XML_TEXTREADER_ELEMENT; + + /* + * Cleanup of the old node + */ + if ((reader->preserves == 0) && +#ifdef LIBXML_XINCLUDE_ENABLED + (reader->in_xinclude == 0) && +#endif + (reader->entNr == 0) && + (reader->node->prev != NULL) && + (reader->node->prev->type != XML_DTD_NODE)) { + xmlNodePtr tmp = reader->node->prev; + if ((tmp->extra & NODE_IS_PRESERVED) == 0) { + xmlUnlinkNode(tmp); + xmlTextReaderFreeNode(reader, tmp); + } + } + + goto node_found; + } + if ((oldstate == XML_TEXTREADER_ELEMENT) && + (reader->node->type == XML_ELEMENT_NODE) && + (reader->node->children == NULL) && + ((reader->node->extra & NODE_IS_EMPTY) == 0)) {; + reader->state = XML_TEXTREADER_END; + goto node_found; + } +#ifdef LIBXML_REGEXP_ENABLED + if ((reader->validate) && (reader->node->type == XML_ELEMENT_NODE)) + xmlTextReaderValidatePop(reader); +#endif /* LIBXML_REGEXP_ENABLED */ + if ((reader->preserves > 0) && + (reader->node->extra & NODE_IS_SPRESERVED)) + reader->preserves--; + reader->node = reader->node->parent; + if ((reader->node == NULL) || + (reader->node->type == XML_DOCUMENT_NODE) || +#ifdef LIBXML_DOCB_ENABLED + (reader->node->type == XML_DOCB_DOCUMENT_NODE) || +#endif + (reader->node->type == XML_HTML_DOCUMENT_NODE)) { + if (reader->mode != XML_TEXTREADER_MODE_EOF) { + val = xmlParseChunk(reader->ctxt, "", 0, 1); + reader->state = XML_TEXTREADER_DONE; + if (val != 0) + return(-1); + } + reader->node = NULL; + reader->depth = -1; + + /* + * Cleanup of the old node + */ + if ((oldnode != NULL) && (reader->preserves == 0) && +#ifdef LIBXML_XINCLUDE_ENABLED + (reader->in_xinclude == 0) && +#endif + (reader->entNr == 0) && + (oldnode->type != XML_DTD_NODE) && + ((oldnode->extra & NODE_IS_PRESERVED) == 0)) { + xmlUnlinkNode(oldnode); + xmlTextReaderFreeNode(reader, oldnode); + } + + goto node_end; + } + if ((reader->preserves == 0) && +#ifdef LIBXML_XINCLUDE_ENABLED + (reader->in_xinclude == 0) && +#endif + (reader->entNr == 0) && + (reader->node->last != NULL) && + ((reader->node->last->extra & NODE_IS_PRESERVED) == 0)) { + xmlNodePtr tmp = reader->node->last; + xmlUnlinkNode(tmp); + xmlTextReaderFreeNode(reader, tmp); + } + reader->depth--; + reader->state = XML_TEXTREADER_BACKTRACK; + +node_found: + DUMP_READER + + /* + * If we are in the middle of a piece of CDATA make sure it's finished + */ + if ((reader->node != NULL) && + (reader->node->next == NULL) && + ((reader->node->type == XML_TEXT_NODE) || + (reader->node->type == XML_CDATA_SECTION_NODE))) { + if (xmlTextReaderExpand(reader) == NULL) + return -1; + } + +#ifdef LIBXML_XINCLUDE_ENABLED + /* + * Handle XInclude if asked for + */ + if ((reader->xinclude) && (reader->node != NULL) && + (reader->node->type == XML_ELEMENT_NODE) && + (reader->node->ns != NULL) && + ((xmlStrEqual(reader->node->ns->href, XINCLUDE_NS)) || + (xmlStrEqual(reader->node->ns->href, XINCLUDE_OLD_NS)))) { + if (reader->xincctxt == NULL) { + reader->xincctxt = xmlXIncludeNewContext(reader->ctxt->myDoc); + xmlXIncludeSetFlags(reader->xincctxt, + reader->parserFlags & (~XML_PARSE_NOXINCNODE)); + } + /* + * expand that node and process it + */ + if (xmlTextReaderExpand(reader) == NULL) + return -1; + xmlXIncludeProcessNode(reader->xincctxt, reader->node); + } + if ((reader->node != NULL) && (reader->node->type == XML_XINCLUDE_START)) { + reader->in_xinclude++; + goto get_next_node; + } + if ((reader->node != NULL) && (reader->node->type == XML_XINCLUDE_END)) { + reader->in_xinclude--; + goto get_next_node; + } +#endif + /* + * Handle entities enter and exit when in entity replacement mode + */ + if ((reader->node != NULL) && + (reader->node->type == XML_ENTITY_REF_NODE) && + (reader->ctxt != NULL) && (reader->ctxt->replaceEntities == 1)) { + /* + * Case where the underlying tree is not availble, lookup the entity + * and walk it. + */ + if ((reader->node->children == NULL) && (reader->ctxt->sax != NULL) && + (reader->ctxt->sax->getEntity != NULL)) { + reader->node->children = (xmlNodePtr) + reader->ctxt->sax->getEntity(reader->ctxt, reader->node->name); + } + + if ((reader->node->children != NULL) && + (reader->node->children->type == XML_ENTITY_DECL) && + (reader->node->children->children != NULL)) { + xmlTextReaderEntPush(reader, reader->node); + reader->node = reader->node->children->children; + } +#ifdef LIBXML_REGEXP_ENABLED + } else if ((reader->node != NULL) && + (reader->node->type == XML_ENTITY_REF_NODE) && + (reader->ctxt != NULL) && (reader->validate)) { + xmlTextReaderValidateEntity(reader); +#endif /* LIBXML_REGEXP_ENABLED */ + } + if ((reader->node != NULL) && + (reader->node->type == XML_ENTITY_DECL) && + (reader->ent != NULL) && (reader->ent->children == reader->node)) { + reader->node = xmlTextReaderEntPop(reader); + reader->depth++; + goto get_next_node; + } +#ifdef LIBXML_REGEXP_ENABLED + if ((reader->validate) && (reader->node != NULL)) { + xmlNodePtr node = reader->node; + + if ((node->type == XML_ELEMENT_NODE) && + ((reader->state != XML_TEXTREADER_END) && + (reader->state != XML_TEXTREADER_BACKTRACK))) { + xmlTextReaderValidatePush(reader); + } else if ((node->type == XML_TEXT_NODE) || + (node->type == XML_CDATA_SECTION_NODE)) { + xmlTextReaderValidateCData(reader, node->content, + xmlStrlen(node->content)); + } + } +#endif /* LIBXML_REGEXP_ENABLED */ +#ifdef LIBXML_PATTERN_ENABLED + if ((reader->patternNr > 0) && (reader->state != XML_TEXTREADER_END) && + (reader->state != XML_TEXTREADER_BACKTRACK)) { + int i; + for (i = 0;i < reader->patternNr;i++) { + if (xmlPatternMatch(reader->patternTab[i], reader->node) == 1) { + xmlTextReaderPreserve(reader); + break; + } + } + } +#endif /* LIBXML_PATTERN_ENABLED */ +#ifdef LIBXML_SCHEMAS_ENABLED + if ((reader->validate == XML_TEXTREADER_VALIDATE_XSD) && + (reader->xsdValidErrors == 0) && + (reader->xsdValidCtxt != NULL)) { + reader->xsdValidErrors = !xmlSchemaIsValid(reader->xsdValidCtxt); + } +#endif /* LIBXML_PATTERN_ENABLED */ + return(1); +node_end: + reader->state = XML_TEXTREADER_DONE; + return(0); +} + +/** + * xmlTextReaderReadState: + * @reader: the xmlTextReaderPtr used + * + * Gets the read state of the reader. + * + * Returns the state value, or -1 in case of error + */ +int +xmlTextReaderReadState(xmlTextReaderPtr reader) { + if (reader == NULL) + return(-1); + return(reader->mode); +} + +/** + * xmlTextReaderExpand: + * @reader: the xmlTextReaderPtr used + * + * Reads the contents of the current node and the full subtree. It then makes + * the subtree available until the next xmlTextReaderRead() call + * + * Returns a node pointer valid until the next xmlTextReaderRead() call + * or NULL in case of error. + */ +xmlNodePtr +xmlTextReaderExpand(xmlTextReaderPtr reader) { + if ((reader == NULL) || (reader->node == NULL)) + return(NULL); + if (reader->doc != NULL) + return(reader->node); + if (reader->ctxt == NULL) + return(NULL); + if (xmlTextReaderDoExpand(reader) < 0) + return(NULL); + return(reader->node); +} + +/** + * xmlTextReaderNext: + * @reader: the xmlTextReaderPtr used + * + * Skip to the node following the current one in document order while + * avoiding the subtree if any. + * + * Returns 1 if the node was read successfully, 0 if there is no more + * nodes to read, or -1 in case of error + */ +int +xmlTextReaderNext(xmlTextReaderPtr reader) { + int ret; + xmlNodePtr cur; + + if (reader == NULL) + return(-1); + if (reader->doc != NULL) + return(xmlTextReaderNextTree(reader)); + cur = reader->node; + if ((cur == NULL) || (cur->type != XML_ELEMENT_NODE)) + return(xmlTextReaderRead(reader)); + if (reader->state == XML_TEXTREADER_END || reader->state == XML_TEXTREADER_BACKTRACK) + return(xmlTextReaderRead(reader)); + if (cur->extra & NODE_IS_EMPTY) + return(xmlTextReaderRead(reader)); + do { + ret = xmlTextReaderRead(reader); + if (ret != 1) + return(ret); + } while (reader->node != cur); + return(xmlTextReaderRead(reader)); +} + +#ifdef LIBXML_WRITER_ENABLED +/** + * xmlTextReaderReadInnerXml: + * @reader: the xmlTextReaderPtr used + * + * Reads the contents of the current node, including child nodes and markup. + * + * Returns a string containing the XML content, or NULL if the current node + * is neither an element nor attribute, or has no child nodes. The + * string must be deallocated by the caller. + */ +xmlChar * +xmlTextReaderReadInnerXml(xmlTextReaderPtr reader ATTRIBUTE_UNUSED) +{ + xmlChar *resbuf; + xmlNodePtr node, cur_node; + xmlBufferPtr buff, buff2; + xmlDocPtr doc; + + if (xmlTextReaderExpand(reader) == NULL) { + return NULL; + } + doc = reader->doc; + buff = xmlBufferCreate(); + for (cur_node = reader->node->children; cur_node != NULL; + cur_node = cur_node->next) { + node = xmlDocCopyNode(cur_node, doc, 1); + buff2 = xmlBufferCreate(); + if (xmlNodeDump(buff2, doc, node, 0, 0) == -1) { + xmlFreeNode(node); + xmlBufferFree(buff2); + xmlBufferFree(buff); + return NULL; + } + xmlBufferCat(buff, buff2->content); + xmlFreeNode(node); + xmlBufferFree(buff2); + } + resbuf = buff->content; + buff->content = NULL; + + xmlBufferFree(buff); + return resbuf; +} +#endif + +#ifdef LIBXML_WRITER_ENABLED +/** + * xmlTextReaderReadOuterXml: + * @reader: the xmlTextReaderPtr used + * + * Reads the contents of the current node, including child nodes and markup. + * + * Returns a string containing the node and any XML content, or NULL if the + * current node cannot be serialized. The string must be deallocated + * by the caller. + */ +xmlChar * +xmlTextReaderReadOuterXml(xmlTextReaderPtr reader ATTRIBUTE_UNUSED) +{ + xmlChar *resbuf; + xmlNodePtr node; + xmlBufferPtr buff; + xmlDocPtr doc; + + node = reader->node; + doc = reader->doc; + if (xmlTextReaderExpand(reader) == NULL) { + return NULL; + } + if (node->type == XML_DTD_NODE) { + node = (xmlNodePtr) xmlCopyDtd((xmlDtdPtr) node); + } else { + node = xmlDocCopyNode(node, doc, 1); + } + buff = xmlBufferCreate(); + if (xmlNodeDump(buff, doc, node, 0, 0) == -1) { + xmlFreeNode(node); + xmlBufferFree(buff); + return NULL; + } + + resbuf = buff->content; + buff->content = NULL; + + xmlFreeNode(node); + xmlBufferFree(buff); + return resbuf; +} +#endif + +/** + * xmlTextReaderReadString: + * @reader: the xmlTextReaderPtr used + * + * Reads the contents of an element or a text node as a string. + * + * Returns a string containing the contents of the Element or Text node, + * or NULL if the reader is positioned on any other type of node. + * The string must be deallocated by the caller. + */ +xmlChar * +xmlTextReaderReadString(xmlTextReaderPtr reader) +{ + xmlNodePtr node; + + if ((reader == NULL) || (reader->node == NULL)) + return(NULL); + + node = (reader->curnode != NULL) ? reader->curnode : reader->node; + switch (node->type) { + case XML_TEXT_NODE: + if (node->content != NULL) + return(xmlStrdup(node->content)); + break; + case XML_ELEMENT_NODE: + if (xmlTextReaderDoExpand(reader) != -1) { + return xmlTextReaderCollectSiblings(node->children); + } + case XML_ATTRIBUTE_NODE: + TODO + break; + default: + break; + } + return(NULL); +} + +#if 0 +/** + * xmlTextReaderReadBase64: + * @reader: the xmlTextReaderPtr used + * @array: a byte array to store the content. + * @offset: the zero-based index into array where the method should + * begin to write. + * @len: the number of bytes to write. + * + * Reads and decodes the Base64 encoded contents of an element and + * stores the result in a byte buffer. + * + * Returns the number of bytes written to array, or zero if the current + * instance is not positioned on an element or -1 in case of error. + */ +int +xmlTextReaderReadBase64(xmlTextReaderPtr reader, + unsigned char *array ATTRIBUTE_UNUSED, + int offset ATTRIBUTE_UNUSED, + int len ATTRIBUTE_UNUSED) { + if ((reader == NULL) || (reader->ctxt == NULL)) + return(-1); + if (reader->ctxt->wellFormed != 1) + return(-1); + + if ((reader->node == NULL) || (reader->node->type == XML_ELEMENT_NODE)) + return(0); + TODO + return(0); +} + +/** + * xmlTextReaderReadBinHex: + * @reader: the xmlTextReaderPtr used + * @array: a byte array to store the content. + * @offset: the zero-based index into array where the method should + * begin to write. + * @len: the number of bytes to write. + * + * Reads and decodes the BinHex encoded contents of an element and + * stores the result in a byte buffer. + * + * Returns the number of bytes written to array, or zero if the current + * instance is not positioned on an element or -1 in case of error. + */ +int +xmlTextReaderReadBinHex(xmlTextReaderPtr reader, + unsigned char *array ATTRIBUTE_UNUSED, + int offset ATTRIBUTE_UNUSED, + int len ATTRIBUTE_UNUSED) { + if ((reader == NULL) || (reader->ctxt == NULL)) + return(-1); + if (reader->ctxt->wellFormed != 1) + return(-1); + + if ((reader->node == NULL) || (reader->node->type == XML_ELEMENT_NODE)) + return(0); + TODO + return(0); +} +#endif + +/************************************************************************ + * * + * Operating on a preparsed tree * + * * + ************************************************************************/ +static int +xmlTextReaderNextTree(xmlTextReaderPtr reader) +{ + if (reader == NULL) + return(-1); + + if (reader->state == XML_TEXTREADER_END) + return(0); + + if (reader->node == NULL) { + if (reader->doc->children == NULL) { + reader->state = XML_TEXTREADER_END; + return(0); + } + + reader->node = reader->doc->children; + reader->state = XML_TEXTREADER_START; + return(1); + } + + if (reader->state != XML_TEXTREADER_BACKTRACK) { + /* Here removed traversal to child, because we want to skip the subtree, + replace with traversal to sibling to skip subtree */ + if (reader->node->next != 0) { + /* Move to sibling if present,skipping sub-tree */ + reader->node = reader->node->next; + reader->state = XML_TEXTREADER_START; + return(1); + } + + /* if reader->node->next is NULL mean no subtree for current node, + so need to move to sibling of parent node if present */ + if ((reader->node->type == XML_ELEMENT_NODE) || + (reader->node->type == XML_ATTRIBUTE_NODE)) { + reader->state = XML_TEXTREADER_BACKTRACK; + /* This will move to parent if present */ + xmlTextReaderRead(reader); + } + } + + if (reader->node->next != 0) { + reader->node = reader->node->next; + reader->state = XML_TEXTREADER_START; + return(1); + } + + if (reader->node->parent != 0) { + if (reader->node->parent->type == XML_DOCUMENT_NODE) { + reader->state = XML_TEXTREADER_END; + return(0); + } + + reader->node = reader->node->parent; + reader->depth--; + reader->state = XML_TEXTREADER_BACKTRACK; + /* Repeat process to move to sibling of parent node if present */ + xmlTextReaderNextTree(reader); + } + + reader->state = XML_TEXTREADER_END; + + return(1); +} + +/** + * xmlTextReaderReadTree: + * @reader: the xmlTextReaderPtr used + * + * Moves the position of the current instance to the next node in + * the stream, exposing its properties. + * + * Returns 1 if the node was read successfully, 0 if there is no more + * nodes to read, or -1 in case of error + */ +static int +xmlTextReaderReadTree(xmlTextReaderPtr reader) { + if (reader->state == XML_TEXTREADER_END) + return(0); + +next_node: + if (reader->node == NULL) { + if (reader->doc->children == NULL) { + reader->state = XML_TEXTREADER_END; + return(0); + } + + reader->node = reader->doc->children; + reader->state = XML_TEXTREADER_START; + goto found_node; + } + + if ((reader->state != XML_TEXTREADER_BACKTRACK) && + (reader->node->type != XML_DTD_NODE) && + (reader->node->type != XML_XINCLUDE_START) && + (reader->node->type != XML_ENTITY_REF_NODE)) { + if (reader->node->children != NULL) { + reader->node = reader->node->children; + reader->depth++; + reader->state = XML_TEXTREADER_START; + goto found_node; + } + + if (reader->node->type == XML_ATTRIBUTE_NODE) { + reader->state = XML_TEXTREADER_BACKTRACK; + goto found_node; + } + } + + if (reader->node->next != NULL) { + reader->node = reader->node->next; + reader->state = XML_TEXTREADER_START; + goto found_node; + } + + if (reader->node->parent != NULL) { + if ((reader->node->parent->type == XML_DOCUMENT_NODE) || + (reader->node->parent->type == XML_HTML_DOCUMENT_NODE)) { + reader->state = XML_TEXTREADER_END; + return(0); + } + + reader->node = reader->node->parent; + reader->depth--; + reader->state = XML_TEXTREADER_BACKTRACK; + goto found_node; + } + + reader->state = XML_TEXTREADER_END; + +found_node: + if ((reader->node->type == XML_XINCLUDE_START) || + (reader->node->type == XML_XINCLUDE_END)) + goto next_node; + + return(1); +} + +/** + * xmlTextReaderNextSibling: + * @reader: the xmlTextReaderPtr used + * + * Skip to the node following the current one in document order while + * avoiding the subtree if any. + * Currently implemented only for Readers built on a document + * + * Returns 1 if the node was read successfully, 0 if there is no more + * nodes to read, or -1 in case of error + */ +int +xmlTextReaderNextSibling(xmlTextReaderPtr reader) { + if (reader == NULL) + return(-1); + if (reader->doc == NULL) { + /* TODO */ + return(-1); + } + + if (reader->state == XML_TEXTREADER_END) + return(0); + + if (reader->node == NULL) + return(xmlTextReaderNextTree(reader)); + + if (reader->node->next != NULL) { + reader->node = reader->node->next; + reader->state = XML_TEXTREADER_START; + return(1); + } + + return(0); +} + +/************************************************************************ + * * + * Constructor and destructors * + * * + ************************************************************************/ +/** + * xmlNewTextReader: + * @input: the xmlParserInputBufferPtr used to read data + * @URI: the URI information for the source if available + * + * Create an xmlTextReader structure fed with @input + * + * Returns the new xmlTextReaderPtr or NULL in case of error + */ +xmlTextReaderPtr +xmlNewTextReader(xmlParserInputBufferPtr input, const char *URI) { + xmlTextReaderPtr ret; + + if (input == NULL) + return(NULL); + ret = xmlMalloc(sizeof(xmlTextReader)); + if (ret == NULL) { + xmlGenericError(xmlGenericErrorContext, + "xmlNewTextReader : malloc failed\n"); + return(NULL); + } + memset(ret, 0, sizeof(xmlTextReader)); + ret->doc = NULL; + ret->entTab = NULL; + ret->entMax = 0; + ret->entNr = 0; + ret->input = input; + ret->buffer = xmlBufCreateSize(100); + if (ret->buffer == NULL) { + xmlFree(ret); + xmlGenericError(xmlGenericErrorContext, + "xmlNewTextReader : malloc failed\n"); + return(NULL); + } + ret->sax = (xmlSAXHandler *) xmlMalloc(sizeof(xmlSAXHandler)); + if (ret->sax == NULL) { + xmlBufFree(ret->buffer); + xmlFree(ret); + xmlGenericError(xmlGenericErrorContext, + "xmlNewTextReader : malloc failed\n"); + return(NULL); + } + xmlSAXVersion(ret->sax, 2); + ret->startElement = ret->sax->startElement; + ret->sax->startElement = xmlTextReaderStartElement; + ret->endElement = ret->sax->endElement; + ret->sax->endElement = xmlTextReaderEndElement; +#ifdef LIBXML_SAX1_ENABLED + if (ret->sax->initialized == XML_SAX2_MAGIC) { +#endif /* LIBXML_SAX1_ENABLED */ + ret->startElementNs = ret->sax->startElementNs; + ret->sax->startElementNs = xmlTextReaderStartElementNs; + ret->endElementNs = ret->sax->endElementNs; + ret->sax->endElementNs = xmlTextReaderEndElementNs; +#ifdef LIBXML_SAX1_ENABLED + } else { + ret->startElementNs = NULL; + ret->endElementNs = NULL; + } +#endif /* LIBXML_SAX1_ENABLED */ + ret->characters = ret->sax->characters; + ret->sax->characters = xmlTextReaderCharacters; + ret->sax->ignorableWhitespace = xmlTextReaderCharacters; + ret->cdataBlock = ret->sax->cdataBlock; + ret->sax->cdataBlock = xmlTextReaderCDataBlock; + + ret->mode = XML_TEXTREADER_MODE_INITIAL; + ret->node = NULL; + ret->curnode = NULL; + if (xmlBufUse(ret->input->buffer) < 4) { + xmlParserInputBufferRead(input, 4); + } + if (xmlBufUse(ret->input->buffer) >= 4) { + ret->ctxt = xmlCreatePushParserCtxt(ret->sax, NULL, + (const char *) xmlBufContent(ret->input->buffer), + 4, URI); + ret->base = 0; + ret->cur = 4; + } else { + ret->ctxt = xmlCreatePushParserCtxt(ret->sax, NULL, NULL, 0, URI); + ret->base = 0; + ret->cur = 0; + } + + if (ret->ctxt == NULL) { + xmlGenericError(xmlGenericErrorContext, + "xmlNewTextReader : malloc failed\n"); + xmlBufFree(ret->buffer); + xmlFree(ret->sax); + xmlFree(ret); + return(NULL); + } + ret->ctxt->parseMode = XML_PARSE_READER; + ret->ctxt->_private = ret; + ret->ctxt->linenumbers = 1; + ret->ctxt->dictNames = 1; + ret->allocs = XML_TEXTREADER_CTXT; + /* + * use the parser dictionnary to allocate all elements and attributes names + */ + ret->ctxt->docdict = 1; + ret->dict = ret->ctxt->dict; +#ifdef LIBXML_XINCLUDE_ENABLED + ret->xinclude = 0; +#endif +#ifdef LIBXML_PATTERN_ENABLED + ret->patternMax = 0; + ret->patternTab = NULL; +#endif + return(ret); +} + +/** + * xmlNewTextReaderFilename: + * @URI: the URI of the resource to process + * + * Create an xmlTextReader structure fed with the resource at @URI + * + * Returns the new xmlTextReaderPtr or NULL in case of error + */ +xmlTextReaderPtr +xmlNewTextReaderFilename(const char *URI) { + xmlParserInputBufferPtr input; + xmlTextReaderPtr ret; + char *directory = NULL; + + input = xmlParserInputBufferCreateFilename(URI, XML_CHAR_ENCODING_NONE); + if (input == NULL) + return(NULL); + ret = xmlNewTextReader(input, URI); + if (ret == NULL) { + xmlFreeParserInputBuffer(input); + return(NULL); + } + ret->allocs |= XML_TEXTREADER_INPUT; + if (ret->ctxt->directory == NULL) + directory = xmlParserGetDirectory(URI); + if ((ret->ctxt->directory == NULL) && (directory != NULL)) + ret->ctxt->directory = (char *) xmlStrdup((xmlChar *) directory); + if (directory != NULL) + xmlFree(directory); + return(ret); +} + +/** + * xmlFreeTextReader: + * @reader: the xmlTextReaderPtr + * + * Deallocate all the resources associated to the reader + */ +void +xmlFreeTextReader(xmlTextReaderPtr reader) { + if (reader == NULL) + return; +#ifdef LIBXML_SCHEMAS_ENABLED + if (reader->rngSchemas != NULL) { + xmlRelaxNGFree(reader->rngSchemas); + reader->rngSchemas = NULL; + } + if (reader->rngValidCtxt != NULL) { + if (! reader->rngPreserveCtxt) + xmlRelaxNGFreeValidCtxt(reader->rngValidCtxt); + reader->rngValidCtxt = NULL; + } + if (reader->xsdPlug != NULL) { + xmlSchemaSAXUnplug(reader->xsdPlug); + reader->xsdPlug = NULL; + } + if (reader->xsdValidCtxt != NULL) { + if (! reader->xsdPreserveCtxt) + xmlSchemaFreeValidCtxt(reader->xsdValidCtxt); + reader->xsdValidCtxt = NULL; + } + if (reader->xsdSchemas != NULL) { + xmlSchemaFree(reader->xsdSchemas); + reader->xsdSchemas = NULL; + } +#endif +#ifdef LIBXML_XINCLUDE_ENABLED + if (reader->xincctxt != NULL) + xmlXIncludeFreeContext(reader->xincctxt); +#endif +#ifdef LIBXML_PATTERN_ENABLED + if (reader->patternTab != NULL) { + int i; + for (i = 0;i < reader->patternNr;i++) { + if (reader->patternTab[i] != NULL) + xmlFreePattern(reader->patternTab[i]); + } + xmlFree(reader->patternTab); + } +#endif + if (reader->faketext != NULL) { + xmlFreeNode(reader->faketext); + } + if (reader->ctxt != NULL) { + if (reader->dict == reader->ctxt->dict) + reader->dict = NULL; + if (reader->ctxt->myDoc != NULL) { + if (reader->preserve == 0) + xmlTextReaderFreeDoc(reader, reader->ctxt->myDoc); + reader->ctxt->myDoc = NULL; + } + if ((reader->ctxt->vctxt.vstateTab != NULL) && + (reader->ctxt->vctxt.vstateMax > 0)){ + xmlFree(reader->ctxt->vctxt.vstateTab); + reader->ctxt->vctxt.vstateTab = NULL; + reader->ctxt->vctxt.vstateMax = 0; + } + if (reader->allocs & XML_TEXTREADER_CTXT) + xmlFreeParserCtxt(reader->ctxt); + } + if (reader->sax != NULL) + xmlFree(reader->sax); + if ((reader->input != NULL) && (reader->allocs & XML_TEXTREADER_INPUT)) + xmlFreeParserInputBuffer(reader->input); + if (reader->buffer != NULL) + xmlBufFree(reader->buffer); + if (reader->entTab != NULL) + xmlFree(reader->entTab); + if (reader->dict != NULL) + xmlDictFree(reader->dict); + xmlFree(reader); +} + +/************************************************************************ + * * + * Methods for XmlTextReader * + * * + ************************************************************************/ +/** + * xmlTextReaderClose: + * @reader: the xmlTextReaderPtr used + * + * This method releases any resources allocated by the current instance + * changes the state to Closed and close any underlying input. + * + * Returns 0 or -1 in case of error + */ +int +xmlTextReaderClose(xmlTextReaderPtr reader) { + if (reader == NULL) + return(-1); + reader->node = NULL; + reader->curnode = NULL; + reader->mode = XML_TEXTREADER_MODE_CLOSED; + if (reader->ctxt != NULL) { + xmlStopParser(reader->ctxt); + if (reader->ctxt->myDoc != NULL) { + if (reader->preserve == 0) + xmlTextReaderFreeDoc(reader, reader->ctxt->myDoc); + reader->ctxt->myDoc = NULL; + } + } + if ((reader->input != NULL) && (reader->allocs & XML_TEXTREADER_INPUT)) { + xmlFreeParserInputBuffer(reader->input); + reader->allocs -= XML_TEXTREADER_INPUT; + } + return(0); +} + +/** + * xmlTextReaderGetAttributeNo: + * @reader: the xmlTextReaderPtr used + * @no: the zero-based index of the attribute relative to the containing element + * + * Provides the value of the attribute with the specified index relative + * to the containing element. + * + * Returns a string containing the value of the specified attribute, or NULL + * in case of error. The string must be deallocated by the caller. + */ +xmlChar * +xmlTextReaderGetAttributeNo(xmlTextReaderPtr reader, int no) { + xmlChar *ret; + int i; + xmlAttrPtr cur; + xmlNsPtr ns; + + if (reader == NULL) + return(NULL); + if (reader->node == NULL) + return(NULL); + if (reader->curnode != NULL) + return(NULL); + /* TODO: handle the xmlDecl */ + if (reader->node->type != XML_ELEMENT_NODE) + return(NULL); + + ns = reader->node->nsDef; + for (i = 0;(i < no) && (ns != NULL);i++) { + ns = ns->next; + } + if (ns != NULL) + return(xmlStrdup(ns->href)); + + cur = reader->node->properties; + if (cur == NULL) + return(NULL); + for (;i < no;i++) { + cur = cur->next; + if (cur == NULL) + return(NULL); + } + /* TODO walk the DTD if present */ + + ret = xmlNodeListGetString(reader->node->doc, cur->children, 1); + if (ret == NULL) return(xmlStrdup((xmlChar *)"")); + return(ret); +} + +/** + * xmlTextReaderGetAttribute: + * @reader: the xmlTextReaderPtr used + * @name: the qualified name of the attribute. + * + * Provides the value of the attribute with the specified qualified name. + * + * Returns a string containing the value of the specified attribute, or NULL + * in case of error. The string must be deallocated by the caller. + */ +xmlChar * +xmlTextReaderGetAttribute(xmlTextReaderPtr reader, const xmlChar *name) { + xmlChar *prefix = NULL; + xmlChar *localname; + xmlNsPtr ns; + xmlChar *ret = NULL; + + if ((reader == NULL) || (name == NULL)) + return(NULL); + if (reader->node == NULL) + return(NULL); + if (reader->curnode != NULL) + return(NULL); + + /* TODO: handle the xmlDecl */ + if (reader->node->type != XML_ELEMENT_NODE) + return(NULL); + + localname = xmlSplitQName2(name, &prefix); + if (localname == NULL) { + /* + * Namespace default decl + */ + if (xmlStrEqual(name, BAD_CAST "xmlns")) { + ns = reader->node->nsDef; + while (ns != NULL) { + if (ns->prefix == NULL) { + return(xmlStrdup(ns->href)); + } + ns = ns->next; + } + return NULL; + } + return(xmlGetNoNsProp(reader->node, name)); + } + + /* + * Namespace default decl + */ + if (xmlStrEqual(prefix, BAD_CAST "xmlns")) { + ns = reader->node->nsDef; + while (ns != NULL) { + if ((ns->prefix != NULL) && (xmlStrEqual(ns->prefix, localname))) { + ret = xmlStrdup(ns->href); + break; + } + ns = ns->next; + } + } else { + ns = xmlSearchNs(reader->node->doc, reader->node, prefix); + if (ns != NULL) + ret = xmlGetNsProp(reader->node, localname, ns->href); + } + + xmlFree(localname); + if (prefix != NULL) + xmlFree(prefix); + return(ret); +} + + +/** + * xmlTextReaderGetAttributeNs: + * @reader: the xmlTextReaderPtr used + * @localName: the local name of the attribute. + * @namespaceURI: the namespace URI of the attribute. + * + * Provides the value of the specified attribute + * + * Returns a string containing the value of the specified attribute, or NULL + * in case of error. The string must be deallocated by the caller. + */ +xmlChar * +xmlTextReaderGetAttributeNs(xmlTextReaderPtr reader, const xmlChar *localName, + const xmlChar *namespaceURI) { + xmlChar *prefix = NULL; + xmlNsPtr ns; + + if ((reader == NULL) || (localName == NULL)) + return(NULL); + if (reader->node == NULL) + return(NULL); + if (reader->curnode != NULL) + return(NULL); + + /* TODO: handle the xmlDecl */ + if (reader->node->type != XML_ELEMENT_NODE) + return(NULL); + + if (xmlStrEqual(namespaceURI, BAD_CAST "http://www.w3.org/2000/xmlns/")) { + if (! xmlStrEqual(localName, BAD_CAST "xmlns")) { + prefix = BAD_CAST localName; + } + ns = reader->node->nsDef; + while (ns != NULL) { + if ((prefix == NULL && ns->prefix == NULL) || + ((ns->prefix != NULL) && (xmlStrEqual(ns->prefix, localName)))) { + return xmlStrdup(ns->href); + } + ns = ns->next; + } + return NULL; + } + + return(xmlGetNsProp(reader->node, localName, namespaceURI)); +} + +/** + * xmlTextReaderGetRemainder: + * @reader: the xmlTextReaderPtr used + * + * Method to get the remainder of the buffered XML. this method stops the + * parser, set its state to End Of File and return the input stream with + * what is left that the parser did not use. + * + * The implementation is not good, the parser certainly procgressed past + * what's left in reader->input, and there is an allocation problem. Best + * would be to rewrite it differently. + * + * Returns the xmlParserInputBufferPtr attached to the XML or NULL + * in case of error. + */ +xmlParserInputBufferPtr +xmlTextReaderGetRemainder(xmlTextReaderPtr reader) { + xmlParserInputBufferPtr ret = NULL; + + if (reader == NULL) + return(NULL); + if (reader->node == NULL) + return(NULL); + + reader->node = NULL; + reader->curnode = NULL; + reader->mode = XML_TEXTREADER_MODE_EOF; + if (reader->ctxt != NULL) { + xmlStopParser(reader->ctxt); + if (reader->ctxt->myDoc != NULL) { + if (reader->preserve == 0) + xmlTextReaderFreeDoc(reader, reader->ctxt->myDoc); + reader->ctxt->myDoc = NULL; + } + } + if (reader->allocs & XML_TEXTREADER_INPUT) { + ret = reader->input; + reader->input = NULL; + reader->allocs -= XML_TEXTREADER_INPUT; + } else { + /* + * Hum, one may need to duplicate the data structure because + * without reference counting the input may be freed twice: + * - by the layer which allocated it. + * - by the layer to which would have been returned to. + */ + TODO + return(NULL); + } + return(ret); +} + +/** + * xmlTextReaderLookupNamespace: + * @reader: the xmlTextReaderPtr used + * @prefix: the prefix whose namespace URI is to be resolved. To return + * the default namespace, specify NULL + * + * Resolves a namespace prefix in the scope of the current element. + * + * Returns a string containing the namespace URI to which the prefix maps + * or NULL in case of error. The string must be deallocated by the caller. + */ +xmlChar * +xmlTextReaderLookupNamespace(xmlTextReaderPtr reader, const xmlChar *prefix) { + xmlNsPtr ns; + + if (reader == NULL) + return(NULL); + if (reader->node == NULL) + return(NULL); + + ns = xmlSearchNs(reader->node->doc, reader->node, prefix); + if (ns == NULL) + return(NULL); + return(xmlStrdup(ns->href)); +} + +/** + * xmlTextReaderMoveToAttributeNo: + * @reader: the xmlTextReaderPtr used + * @no: the zero-based index of the attribute relative to the containing + * element. + * + * Moves the position of the current instance to the attribute with + * the specified index relative to the containing element. + * + * Returns 1 in case of success, -1 in case of error, 0 if not found + */ +int +xmlTextReaderMoveToAttributeNo(xmlTextReaderPtr reader, int no) { + int i; + xmlAttrPtr cur; + xmlNsPtr ns; + + if (reader == NULL) + return(-1); + if (reader->node == NULL) + return(-1); + /* TODO: handle the xmlDecl */ + if (reader->node->type != XML_ELEMENT_NODE) + return(-1); + + reader->curnode = NULL; + + ns = reader->node->nsDef; + for (i = 0;(i < no) && (ns != NULL);i++) { + ns = ns->next; + } + if (ns != NULL) { + reader->curnode = (xmlNodePtr) ns; + return(1); + } + + cur = reader->node->properties; + if (cur == NULL) + return(0); + for (;i < no;i++) { + cur = cur->next; + if (cur == NULL) + return(0); + } + /* TODO walk the DTD if present */ + + reader->curnode = (xmlNodePtr) cur; + return(1); +} + +/** + * xmlTextReaderMoveToAttribute: + * @reader: the xmlTextReaderPtr used + * @name: the qualified name of the attribute. + * + * Moves the position of the current instance to the attribute with + * the specified qualified name. + * + * Returns 1 in case of success, -1 in case of error, 0 if not found + */ +int +xmlTextReaderMoveToAttribute(xmlTextReaderPtr reader, const xmlChar *name) { + xmlChar *prefix = NULL; + xmlChar *localname; + xmlNsPtr ns; + xmlAttrPtr prop; + + if ((reader == NULL) || (name == NULL)) + return(-1); + if (reader->node == NULL) + return(-1); + + /* TODO: handle the xmlDecl */ + if (reader->node->type != XML_ELEMENT_NODE) + return(0); + + localname = xmlSplitQName2(name, &prefix); + if (localname == NULL) { + /* + * Namespace default decl + */ + if (xmlStrEqual(name, BAD_CAST "xmlns")) { + ns = reader->node->nsDef; + while (ns != NULL) { + if (ns->prefix == NULL) { + reader->curnode = (xmlNodePtr) ns; + return(1); + } + ns = ns->next; + } + return(0); + } + + prop = reader->node->properties; + while (prop != NULL) { + /* + * One need to have + * - same attribute names + * - and the attribute carrying that namespace + */ + if ((xmlStrEqual(prop->name, name)) && + ((prop->ns == NULL) || (prop->ns->prefix == NULL))) { + reader->curnode = (xmlNodePtr) prop; + return(1); + } + prop = prop->next; + } + return(0); + } + + /* + * Namespace default decl + */ + if (xmlStrEqual(prefix, BAD_CAST "xmlns")) { + ns = reader->node->nsDef; + while (ns != NULL) { + if ((ns->prefix != NULL) && (xmlStrEqual(ns->prefix, localname))) { + reader->curnode = (xmlNodePtr) ns; + goto found; + } + ns = ns->next; + } + goto not_found; + } + prop = reader->node->properties; + while (prop != NULL) { + /* + * One need to have + * - same attribute names + * - and the attribute carrying that namespace + */ + if ((xmlStrEqual(prop->name, localname)) && + (prop->ns != NULL) && (xmlStrEqual(prop->ns->prefix, prefix))) { + reader->curnode = (xmlNodePtr) prop; + goto found; + } + prop = prop->next; + } +not_found: + if (localname != NULL) + xmlFree(localname); + if (prefix != NULL) + xmlFree(prefix); + return(0); + +found: + if (localname != NULL) + xmlFree(localname); + if (prefix != NULL) + xmlFree(prefix); + return(1); +} + +/** + * xmlTextReaderMoveToAttributeNs: + * @reader: the xmlTextReaderPtr used + * @localName: the local name of the attribute. + * @namespaceURI: the namespace URI of the attribute. + * + * Moves the position of the current instance to the attribute with the + * specified local name and namespace URI. + * + * Returns 1 in case of success, -1 in case of error, 0 if not found + */ +int +xmlTextReaderMoveToAttributeNs(xmlTextReaderPtr reader, + const xmlChar *localName, const xmlChar *namespaceURI) { + xmlAttrPtr prop; + xmlNodePtr node; + xmlNsPtr ns; + xmlChar *prefix = NULL; + + if ((reader == NULL) || (localName == NULL) || (namespaceURI == NULL)) + return(-1); + if (reader->node == NULL) + return(-1); + if (reader->node->type != XML_ELEMENT_NODE) + return(0); + node = reader->node; + + if (xmlStrEqual(namespaceURI, BAD_CAST "http://www.w3.org/2000/xmlns/")) { + if (! xmlStrEqual(localName, BAD_CAST "xmlns")) { + prefix = BAD_CAST localName; + } + ns = reader->node->nsDef; + while (ns != NULL) { + if ((prefix == NULL && ns->prefix == NULL) || + ((ns->prefix != NULL) && (xmlStrEqual(ns->prefix, localName)))) { + reader->curnode = (xmlNodePtr) ns; + return(1); + } + ns = ns->next; + } + return(0); + } + + prop = node->properties; + while (prop != NULL) { + /* + * One need to have + * - same attribute names + * - and the attribute carrying that namespace + */ + if (xmlStrEqual(prop->name, localName) && + ((prop->ns != NULL) && + (xmlStrEqual(prop->ns->href, namespaceURI)))) { + reader->curnode = (xmlNodePtr) prop; + return(1); + } + prop = prop->next; + } + return(0); +} + +/** + * xmlTextReaderMoveToFirstAttribute: + * @reader: the xmlTextReaderPtr used + * + * Moves the position of the current instance to the first attribute + * associated with the current node. + * + * Returns 1 in case of success, -1 in case of error, 0 if not found + */ +int +xmlTextReaderMoveToFirstAttribute(xmlTextReaderPtr reader) { + if (reader == NULL) + return(-1); + if (reader->node == NULL) + return(-1); + if (reader->node->type != XML_ELEMENT_NODE) + return(0); + + if (reader->node->nsDef != NULL) { + reader->curnode = (xmlNodePtr) reader->node->nsDef; + return(1); + } + if (reader->node->properties != NULL) { + reader->curnode = (xmlNodePtr) reader->node->properties; + return(1); + } + return(0); +} + +/** + * xmlTextReaderMoveToNextAttribute: + * @reader: the xmlTextReaderPtr used + * + * Moves the position of the current instance to the next attribute + * associated with the current node. + * + * Returns 1 in case of success, -1 in case of error, 0 if not found + */ +int +xmlTextReaderMoveToNextAttribute(xmlTextReaderPtr reader) { + if (reader == NULL) + return(-1); + if (reader->node == NULL) + return(-1); + if (reader->node->type != XML_ELEMENT_NODE) + return(0); + if (reader->curnode == NULL) + return(xmlTextReaderMoveToFirstAttribute(reader)); + + if (reader->curnode->type == XML_NAMESPACE_DECL) { + xmlNsPtr ns = (xmlNsPtr) reader->curnode; + if (ns->next != NULL) { + reader->curnode = (xmlNodePtr) ns->next; + return(1); + } + if (reader->node->properties != NULL) { + reader->curnode = (xmlNodePtr) reader->node->properties; + return(1); + } + return(0); + } else if ((reader->curnode->type == XML_ATTRIBUTE_NODE) && + (reader->curnode->next != NULL)) { + reader->curnode = reader->curnode->next; + return(1); + } + return(0); +} + +/** + * xmlTextReaderMoveToElement: + * @reader: the xmlTextReaderPtr used + * + * Moves the position of the current instance to the node that + * contains the current Attribute node. + * + * Returns 1 in case of success, -1 in case of error, 0 if not moved + */ +int +xmlTextReaderMoveToElement(xmlTextReaderPtr reader) { + if (reader == NULL) + return(-1); + if (reader->node == NULL) + return(-1); + if (reader->node->type != XML_ELEMENT_NODE) + return(0); + if (reader->curnode != NULL) { + reader->curnode = NULL; + return(1); + } + return(0); +} + +/** + * xmlTextReaderReadAttributeValue: + * @reader: the xmlTextReaderPtr used + * + * Parses an attribute value into one or more Text and EntityReference nodes. + * + * Returns 1 in case of success, 0 if the reader was not positionned on an + * ttribute node or all the attribute values have been read, or -1 + * in case of error. + */ +int +xmlTextReaderReadAttributeValue(xmlTextReaderPtr reader) { + if (reader == NULL) + return(-1); + if (reader->node == NULL) + return(-1); + if (reader->curnode == NULL) + return(0); + if (reader->curnode->type == XML_ATTRIBUTE_NODE) { + if (reader->curnode->children == NULL) + return(0); + reader->curnode = reader->curnode->children; + } else if (reader->curnode->type == XML_NAMESPACE_DECL) { + xmlNsPtr ns = (xmlNsPtr) reader->curnode; + + if (reader->faketext == NULL) { + reader->faketext = xmlNewDocText(reader->node->doc, + ns->href); + } else { + if ((reader->faketext->content != NULL) && + (reader->faketext->content != + (xmlChar *) &(reader->faketext->properties))) + xmlFree(reader->faketext->content); + reader->faketext->content = xmlStrdup(ns->href); + } + reader->curnode = reader->faketext; + } else { + if (reader->curnode->next == NULL) + return(0); + reader->curnode = reader->curnode->next; + } + return(1); +} + +/** + * xmlTextReaderConstEncoding: + * @reader: the xmlTextReaderPtr used + * + * Determine the encoding of the document being read. + * + * Returns a string containing the encoding of the document or NULL in + * case of error. The string is deallocated with the reader. + */ +const xmlChar * +xmlTextReaderConstEncoding(xmlTextReaderPtr reader) { + xmlDocPtr doc = NULL; + if (reader == NULL) + return(NULL); + if (reader->doc != NULL) + doc = reader->doc; + else if (reader->ctxt != NULL) + doc = reader->ctxt->myDoc; + if (doc == NULL) + return(NULL); + + if (doc->encoding == NULL) + return(NULL); + else + return(CONSTSTR(doc->encoding)); +} + + +/************************************************************************ + * * + * Acces API to the current node * + * * + ************************************************************************/ +/** + * xmlTextReaderAttributeCount: + * @reader: the xmlTextReaderPtr used + * + * Provides the number of attributes of the current node + * + * Returns 0 i no attributes, -1 in case of error or the attribute count + */ +int +xmlTextReaderAttributeCount(xmlTextReaderPtr reader) { + int ret; + xmlAttrPtr attr; + xmlNsPtr ns; + xmlNodePtr node; + + if (reader == NULL) + return(-1); + if (reader->node == NULL) + return(0); + + if (reader->curnode != NULL) + node = reader->curnode; + else + node = reader->node; + + if (node->type != XML_ELEMENT_NODE) + return(0); + if ((reader->state == XML_TEXTREADER_END) || + (reader->state == XML_TEXTREADER_BACKTRACK)) + return(0); + ret = 0; + attr = node->properties; + while (attr != NULL) { + ret++; + attr = attr->next; + } + ns = node->nsDef; + while (ns != NULL) { + ret++; + ns = ns->next; + } + return(ret); +} + +/** + * xmlTextReaderNodeType: + * @reader: the xmlTextReaderPtr used + * + * Get the node type of the current node + * Reference: + * http://www.gnu.org/software/dotgnu/pnetlib-doc/System/Xml/XmlNodeType.html + * + * Returns the xmlNodeType of the current node or -1 in case of error + */ +int +xmlTextReaderNodeType(xmlTextReaderPtr reader) { + xmlNodePtr node; + + if (reader == NULL) + return(-1); + if (reader->node == NULL) + return(XML_READER_TYPE_NONE); + if (reader->curnode != NULL) + node = reader->curnode; + else + node = reader->node; + switch (node->type) { + case XML_ELEMENT_NODE: + if ((reader->state == XML_TEXTREADER_END) || + (reader->state == XML_TEXTREADER_BACKTRACK)) + return(XML_READER_TYPE_END_ELEMENT); + return(XML_READER_TYPE_ELEMENT); + case XML_NAMESPACE_DECL: + case XML_ATTRIBUTE_NODE: + return(XML_READER_TYPE_ATTRIBUTE); + case XML_TEXT_NODE: + if (xmlIsBlankNode(reader->node)) { + if (xmlNodeGetSpacePreserve(reader->node)) + return(XML_READER_TYPE_SIGNIFICANT_WHITESPACE); + else + return(XML_READER_TYPE_WHITESPACE); + } else { + return(XML_READER_TYPE_TEXT); + } + case XML_CDATA_SECTION_NODE: + return(XML_READER_TYPE_CDATA); + case XML_ENTITY_REF_NODE: + return(XML_READER_TYPE_ENTITY_REFERENCE); + case XML_ENTITY_NODE: + return(XML_READER_TYPE_ENTITY); + case XML_PI_NODE: + return(XML_READER_TYPE_PROCESSING_INSTRUCTION); + case XML_COMMENT_NODE: + return(XML_READER_TYPE_COMMENT); + case XML_DOCUMENT_NODE: + case XML_HTML_DOCUMENT_NODE: +#ifdef LIBXML_DOCB_ENABLED + case XML_DOCB_DOCUMENT_NODE: +#endif + return(XML_READER_TYPE_DOCUMENT); + case XML_DOCUMENT_FRAG_NODE: + return(XML_READER_TYPE_DOCUMENT_FRAGMENT); + case XML_NOTATION_NODE: + return(XML_READER_TYPE_NOTATION); + case XML_DOCUMENT_TYPE_NODE: + case XML_DTD_NODE: + return(XML_READER_TYPE_DOCUMENT_TYPE); + + case XML_ELEMENT_DECL: + case XML_ATTRIBUTE_DECL: + case XML_ENTITY_DECL: + case XML_XINCLUDE_START: + case XML_XINCLUDE_END: + return(XML_READER_TYPE_NONE); + } + return(-1); +} + +/** + * xmlTextReaderIsEmptyElement: + * @reader: the xmlTextReaderPtr used + * + * Check if the current node is empty + * + * Returns 1 if empty, 0 if not and -1 in case of error + */ +int +xmlTextReaderIsEmptyElement(xmlTextReaderPtr reader) { + if ((reader == NULL) || (reader->node == NULL)) + return(-1); + if (reader->node->type != XML_ELEMENT_NODE) + return(0); + if (reader->curnode != NULL) + return(0); + if (reader->node->children != NULL) + return(0); + if (reader->state == XML_TEXTREADER_END) + return(0); + if (reader->doc != NULL) + return(1); +#ifdef LIBXML_XINCLUDE_ENABLED + if (reader->in_xinclude > 0) + return(1); +#endif + return((reader->node->extra & NODE_IS_EMPTY) != 0); +} + +/** + * xmlTextReaderLocalName: + * @reader: the xmlTextReaderPtr used + * + * The local name of the node. + * + * Returns the local name or NULL if not available, + * if non NULL it need to be freed by the caller. + */ +xmlChar * +xmlTextReaderLocalName(xmlTextReaderPtr reader) { + xmlNodePtr node; + if ((reader == NULL) || (reader->node == NULL)) + return(NULL); + if (reader->curnode != NULL) + node = reader->curnode; + else + node = reader->node; + if (node->type == XML_NAMESPACE_DECL) { + xmlNsPtr ns = (xmlNsPtr) node; + if (ns->prefix == NULL) + return(xmlStrdup(BAD_CAST "xmlns")); + else + return(xmlStrdup(ns->prefix)); + } + if ((node->type != XML_ELEMENT_NODE) && + (node->type != XML_ATTRIBUTE_NODE)) + return(xmlTextReaderName(reader)); + return(xmlStrdup(node->name)); +} + +/** + * xmlTextReaderConstLocalName: + * @reader: the xmlTextReaderPtr used + * + * The local name of the node. + * + * Returns the local name or NULL if not available, the + * string will be deallocated with the reader. + */ +const xmlChar * +xmlTextReaderConstLocalName(xmlTextReaderPtr reader) { + xmlNodePtr node; + if ((reader == NULL) || (reader->node == NULL)) + return(NULL); + if (reader->curnode != NULL) + node = reader->curnode; + else + node = reader->node; + if (node->type == XML_NAMESPACE_DECL) { + xmlNsPtr ns = (xmlNsPtr) node; + if (ns->prefix == NULL) + return(CONSTSTR(BAD_CAST "xmlns")); + else + return(ns->prefix); + } + if ((node->type != XML_ELEMENT_NODE) && + (node->type != XML_ATTRIBUTE_NODE)) + return(xmlTextReaderConstName(reader)); + return(node->name); +} + +/** + * xmlTextReaderName: + * @reader: the xmlTextReaderPtr used + * + * The qualified name of the node, equal to Prefix :LocalName. + * + * Returns the local name or NULL if not available, + * if non NULL it need to be freed by the caller. + */ +xmlChar * +xmlTextReaderName(xmlTextReaderPtr reader) { + xmlNodePtr node; + xmlChar *ret; + + if ((reader == NULL) || (reader->node == NULL)) + return(NULL); + if (reader->curnode != NULL) + node = reader->curnode; + else + node = reader->node; + switch (node->type) { + case XML_ELEMENT_NODE: + case XML_ATTRIBUTE_NODE: + if ((node->ns == NULL) || + (node->ns->prefix == NULL)) + return(xmlStrdup(node->name)); + + ret = xmlStrdup(node->ns->prefix); + ret = xmlStrcat(ret, BAD_CAST ":"); + ret = xmlStrcat(ret, node->name); + return(ret); + case XML_TEXT_NODE: + return(xmlStrdup(BAD_CAST "#text")); + case XML_CDATA_SECTION_NODE: + return(xmlStrdup(BAD_CAST "#cdata-section")); + case XML_ENTITY_NODE: + case XML_ENTITY_REF_NODE: + return(xmlStrdup(node->name)); + case XML_PI_NODE: + return(xmlStrdup(node->name)); + case XML_COMMENT_NODE: + return(xmlStrdup(BAD_CAST "#comment")); + case XML_DOCUMENT_NODE: + case XML_HTML_DOCUMENT_NODE: +#ifdef LIBXML_DOCB_ENABLED + case XML_DOCB_DOCUMENT_NODE: +#endif + return(xmlStrdup(BAD_CAST "#document")); + case XML_DOCUMENT_FRAG_NODE: + return(xmlStrdup(BAD_CAST "#document-fragment")); + case XML_NOTATION_NODE: + return(xmlStrdup(node->name)); + case XML_DOCUMENT_TYPE_NODE: + case XML_DTD_NODE: + return(xmlStrdup(node->name)); + case XML_NAMESPACE_DECL: { + xmlNsPtr ns = (xmlNsPtr) node; + + ret = xmlStrdup(BAD_CAST "xmlns"); + if (ns->prefix == NULL) + return(ret); + ret = xmlStrcat(ret, BAD_CAST ":"); + ret = xmlStrcat(ret, ns->prefix); + return(ret); + } + + case XML_ELEMENT_DECL: + case XML_ATTRIBUTE_DECL: + case XML_ENTITY_DECL: + case XML_XINCLUDE_START: + case XML_XINCLUDE_END: + return(NULL); + } + return(NULL); +} + +/** + * xmlTextReaderConstName: + * @reader: the xmlTextReaderPtr used + * + * The qualified name of the node, equal to Prefix :LocalName. + * + * Returns the local name or NULL if not available, the string is + * deallocated with the reader. + */ +const xmlChar * +xmlTextReaderConstName(xmlTextReaderPtr reader) { + xmlNodePtr node; + + if ((reader == NULL) || (reader->node == NULL)) + return(NULL); + if (reader->curnode != NULL) + node = reader->curnode; + else + node = reader->node; + switch (node->type) { + case XML_ELEMENT_NODE: + case XML_ATTRIBUTE_NODE: + if ((node->ns == NULL) || + (node->ns->prefix == NULL)) + return(node->name); + return(CONSTQSTR(node->ns->prefix, node->name)); + case XML_TEXT_NODE: + return(CONSTSTR(BAD_CAST "#text")); + case XML_CDATA_SECTION_NODE: + return(CONSTSTR(BAD_CAST "#cdata-section")); + case XML_ENTITY_NODE: + case XML_ENTITY_REF_NODE: + return(CONSTSTR(node->name)); + case XML_PI_NODE: + return(CONSTSTR(node->name)); + case XML_COMMENT_NODE: + return(CONSTSTR(BAD_CAST "#comment")); + case XML_DOCUMENT_NODE: + case XML_HTML_DOCUMENT_NODE: +#ifdef LIBXML_DOCB_ENABLED + case XML_DOCB_DOCUMENT_NODE: +#endif + return(CONSTSTR(BAD_CAST "#document")); + case XML_DOCUMENT_FRAG_NODE: + return(CONSTSTR(BAD_CAST "#document-fragment")); + case XML_NOTATION_NODE: + return(CONSTSTR(node->name)); + case XML_DOCUMENT_TYPE_NODE: + case XML_DTD_NODE: + return(CONSTSTR(node->name)); + case XML_NAMESPACE_DECL: { + xmlNsPtr ns = (xmlNsPtr) node; + + if (ns->prefix == NULL) + return(CONSTSTR(BAD_CAST "xmlns")); + return(CONSTQSTR(BAD_CAST "xmlns", ns->prefix)); + } + + case XML_ELEMENT_DECL: + case XML_ATTRIBUTE_DECL: + case XML_ENTITY_DECL: + case XML_XINCLUDE_START: + case XML_XINCLUDE_END: + return(NULL); + } + return(NULL); +} + +/** + * xmlTextReaderPrefix: + * @reader: the xmlTextReaderPtr used + * + * A shorthand reference to the namespace associated with the node. + * + * Returns the prefix or NULL if not available, + * if non NULL it need to be freed by the caller. + */ +xmlChar * +xmlTextReaderPrefix(xmlTextReaderPtr reader) { + xmlNodePtr node; + if ((reader == NULL) || (reader->node == NULL)) + return(NULL); + if (reader->curnode != NULL) + node = reader->curnode; + else + node = reader->node; + if (node->type == XML_NAMESPACE_DECL) { + xmlNsPtr ns = (xmlNsPtr) node; + if (ns->prefix == NULL) + return(NULL); + return(xmlStrdup(BAD_CAST "xmlns")); + } + if ((node->type != XML_ELEMENT_NODE) && + (node->type != XML_ATTRIBUTE_NODE)) + return(NULL); + if ((node->ns != NULL) && (node->ns->prefix != NULL)) + return(xmlStrdup(node->ns->prefix)); + return(NULL); +} + +/** + * xmlTextReaderConstPrefix: + * @reader: the xmlTextReaderPtr used + * + * A shorthand reference to the namespace associated with the node. + * + * Returns the prefix or NULL if not available, the string is deallocated + * with the reader. + */ +const xmlChar * +xmlTextReaderConstPrefix(xmlTextReaderPtr reader) { + xmlNodePtr node; + if ((reader == NULL) || (reader->node == NULL)) + return(NULL); + if (reader->curnode != NULL) + node = reader->curnode; + else + node = reader->node; + if (node->type == XML_NAMESPACE_DECL) { + xmlNsPtr ns = (xmlNsPtr) node; + if (ns->prefix == NULL) + return(NULL); + return(CONSTSTR(BAD_CAST "xmlns")); + } + if ((node->type != XML_ELEMENT_NODE) && + (node->type != XML_ATTRIBUTE_NODE)) + return(NULL); + if ((node->ns != NULL) && (node->ns->prefix != NULL)) + return(CONSTSTR(node->ns->prefix)); + return(NULL); +} + +/** + * xmlTextReaderNamespaceUri: + * @reader: the xmlTextReaderPtr used + * + * The URI defining the namespace associated with the node. + * + * Returns the namespace URI or NULL if not available, + * if non NULL it need to be freed by the caller. + */ +xmlChar * +xmlTextReaderNamespaceUri(xmlTextReaderPtr reader) { + xmlNodePtr node; + if ((reader == NULL) || (reader->node == NULL)) + return(NULL); + if (reader->curnode != NULL) + node = reader->curnode; + else + node = reader->node; + if (node->type == XML_NAMESPACE_DECL) + return(xmlStrdup(BAD_CAST "http://www.w3.org/2000/xmlns/")); + if ((node->type != XML_ELEMENT_NODE) && + (node->type != XML_ATTRIBUTE_NODE)) + return(NULL); + if (node->ns != NULL) + return(xmlStrdup(node->ns->href)); + return(NULL); +} + +/** + * xmlTextReaderConstNamespaceUri: + * @reader: the xmlTextReaderPtr used + * + * The URI defining the namespace associated with the node. + * + * Returns the namespace URI or NULL if not available, the string + * will be deallocated with the reader + */ +const xmlChar * +xmlTextReaderConstNamespaceUri(xmlTextReaderPtr reader) { + xmlNodePtr node; + if ((reader == NULL) || (reader->node == NULL)) + return(NULL); + if (reader->curnode != NULL) + node = reader->curnode; + else + node = reader->node; + if (node->type == XML_NAMESPACE_DECL) + return(CONSTSTR(BAD_CAST "http://www.w3.org/2000/xmlns/")); + if ((node->type != XML_ELEMENT_NODE) && + (node->type != XML_ATTRIBUTE_NODE)) + return(NULL); + if (node->ns != NULL) + return(CONSTSTR(node->ns->href)); + return(NULL); +} + +/** + * xmlTextReaderBaseUri: + * @reader: the xmlTextReaderPtr used + * + * The base URI of the node. + * + * Returns the base URI or NULL if not available, + * if non NULL it need to be freed by the caller. + */ +xmlChar * +xmlTextReaderBaseUri(xmlTextReaderPtr reader) { + if ((reader == NULL) || (reader->node == NULL)) + return(NULL); + return(xmlNodeGetBase(NULL, reader->node)); +} + +/** + * xmlTextReaderConstBaseUri: + * @reader: the xmlTextReaderPtr used + * + * The base URI of the node. + * + * Returns the base URI or NULL if not available, the string + * will be deallocated with the reader + */ +const xmlChar * +xmlTextReaderConstBaseUri(xmlTextReaderPtr reader) { + xmlChar *tmp; + const xmlChar *ret; + + if ((reader == NULL) || (reader->node == NULL)) + return(NULL); + tmp = xmlNodeGetBase(NULL, reader->node); + if (tmp == NULL) + return(NULL); + ret = CONSTSTR(tmp); + xmlFree(tmp); + return(ret); +} + +/** + * xmlTextReaderDepth: + * @reader: the xmlTextReaderPtr used + * + * The depth of the node in the tree. + * + * Returns the depth or -1 in case of error + */ +int +xmlTextReaderDepth(xmlTextReaderPtr reader) { + if (reader == NULL) + return(-1); + if (reader->node == NULL) + return(0); + + if (reader->curnode != NULL) { + if ((reader->curnode->type == XML_ATTRIBUTE_NODE) || + (reader->curnode->type == XML_NAMESPACE_DECL)) + return(reader->depth + 1); + return(reader->depth + 2); + } + return(reader->depth); +} + +/** + * xmlTextReaderHasAttributes: + * @reader: the xmlTextReaderPtr used + * + * Whether the node has attributes. + * + * Returns 1 if true, 0 if false, and -1 in case or error + */ +int +xmlTextReaderHasAttributes(xmlTextReaderPtr reader) { + xmlNodePtr node; + if (reader == NULL) + return(-1); + if (reader->node == NULL) + return(0); + if (reader->curnode != NULL) + node = reader->curnode; + else + node = reader->node; + + if ((node->type == XML_ELEMENT_NODE) && + ((node->properties != NULL) || (node->nsDef != NULL))) + return(1); + /* TODO: handle the xmlDecl */ + return(0); +} + +/** + * xmlTextReaderHasValue: + * @reader: the xmlTextReaderPtr used + * + * Whether the node can have a text value. + * + * Returns 1 if true, 0 if false, and -1 in case or error + */ +int +xmlTextReaderHasValue(xmlTextReaderPtr reader) { + xmlNodePtr node; + if (reader == NULL) + return(-1); + if (reader->node == NULL) + return(0); + if (reader->curnode != NULL) + node = reader->curnode; + else + node = reader->node; + + switch (node->type) { + case XML_ATTRIBUTE_NODE: + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + case XML_PI_NODE: + case XML_COMMENT_NODE: + case XML_NAMESPACE_DECL: + return(1); + default: + break; + } + return(0); +} + +/** + * xmlTextReaderValue: + * @reader: the xmlTextReaderPtr used + * + * Provides the text value of the node if present + * + * Returns the string or NULL if not available. The result must be deallocated + * with xmlFree() + */ +xmlChar * +xmlTextReaderValue(xmlTextReaderPtr reader) { + xmlNodePtr node; + if (reader == NULL) + return(NULL); + if (reader->node == NULL) + return(NULL); + if (reader->curnode != NULL) + node = reader->curnode; + else + node = reader->node; + + switch (node->type) { + case XML_NAMESPACE_DECL: + return(xmlStrdup(((xmlNsPtr) node)->href)); + case XML_ATTRIBUTE_NODE:{ + xmlAttrPtr attr = (xmlAttrPtr) node; + + if (attr->parent != NULL) + return (xmlNodeListGetString + (attr->parent->doc, attr->children, 1)); + else + return (xmlNodeListGetString(NULL, attr->children, 1)); + break; + } + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + case XML_PI_NODE: + case XML_COMMENT_NODE: + if (node->content != NULL) + return (xmlStrdup(node->content)); + default: + break; + } + return(NULL); +} + +/** + * xmlTextReaderConstValue: + * @reader: the xmlTextReaderPtr used + * + * Provides the text value of the node if present + * + * Returns the string or NULL if not available. The result will be + * deallocated on the next Read() operation. + */ +const xmlChar * +xmlTextReaderConstValue(xmlTextReaderPtr reader) { + xmlNodePtr node; + if (reader == NULL) + return(NULL); + if (reader->node == NULL) + return(NULL); + if (reader->curnode != NULL) + node = reader->curnode; + else + node = reader->node; + + switch (node->type) { + case XML_NAMESPACE_DECL: + return(((xmlNsPtr) node)->href); + case XML_ATTRIBUTE_NODE:{ + xmlAttrPtr attr = (xmlAttrPtr) node; + + if ((attr->children != NULL) && + (attr->children->type == XML_TEXT_NODE) && + (attr->children->next == NULL)) + return(attr->children->content); + else { + if (reader->buffer == NULL) { + reader->buffer = xmlBufCreateSize(100); + if (reader->buffer == NULL) { + xmlGenericError(xmlGenericErrorContext, + "xmlTextReaderSetup : malloc failed\n"); + return (NULL); + } + } else + xmlBufEmpty(reader->buffer); + xmlBufGetNodeContent(reader->buffer, node); + return(xmlBufContent(reader->buffer)); + } + break; + } + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + case XML_PI_NODE: + case XML_COMMENT_NODE: + return(node->content); + default: + break; + } + return(NULL); +} + +/** + * xmlTextReaderIsDefault: + * @reader: the xmlTextReaderPtr used + * + * Whether an Attribute node was generated from the default value + * defined in the DTD or schema. + * + * Returns 0 if not defaulted, 1 if defaulted, and -1 in case of error + */ +int +xmlTextReaderIsDefault(xmlTextReaderPtr reader) { + if (reader == NULL) + return(-1); + return(0); +} + +/** + * xmlTextReaderQuoteChar: + * @reader: the xmlTextReaderPtr used + * + * The quotation mark character used to enclose the value of an attribute. + * + * Returns " or ' and -1 in case of error + */ +int +xmlTextReaderQuoteChar(xmlTextReaderPtr reader) { + if (reader == NULL) + return(-1); + /* TODO maybe lookup the attribute value for " first */ + return((int) '"'); +} + +/** + * xmlTextReaderXmlLang: + * @reader: the xmlTextReaderPtr used + * + * The xml:lang scope within which the node resides. + * + * Returns the xml:lang value or NULL if none exists., + * if non NULL it need to be freed by the caller. + */ +xmlChar * +xmlTextReaderXmlLang(xmlTextReaderPtr reader) { + if (reader == NULL) + return(NULL); + if (reader->node == NULL) + return(NULL); + return(xmlNodeGetLang(reader->node)); +} + +/** + * xmlTextReaderConstXmlLang: + * @reader: the xmlTextReaderPtr used + * + * The xml:lang scope within which the node resides. + * + * Returns the xml:lang value or NULL if none exists. + */ +const xmlChar * +xmlTextReaderConstXmlLang(xmlTextReaderPtr reader) { + xmlChar *tmp; + const xmlChar *ret; + + if (reader == NULL) + return(NULL); + if (reader->node == NULL) + return(NULL); + tmp = xmlNodeGetLang(reader->node); + if (tmp == NULL) + return(NULL); + ret = CONSTSTR(tmp); + xmlFree(tmp); + return(ret); +} + +/** + * xmlTextReaderConstString: + * @reader: the xmlTextReaderPtr used + * @str: the string to intern. + * + * Get an interned string from the reader, allows for example to + * speedup string name comparisons + * + * Returns an interned copy of the string or NULL in case of error. The + * string will be deallocated with the reader. + */ +const xmlChar * +xmlTextReaderConstString(xmlTextReaderPtr reader, const xmlChar *str) { + if (reader == NULL) + return(NULL); + return(CONSTSTR(str)); +} + +/** + * xmlTextReaderNormalization: + * @reader: the xmlTextReaderPtr used + * + * The value indicating whether to normalize white space and attribute values. + * Since attribute value and end of line normalizations are a MUST in the XML + * specification only the value true is accepted. The broken bahaviour of + * accepting out of range character entities like � is of course not + * supported either. + * + * Returns 1 or -1 in case of error. + */ +int +xmlTextReaderNormalization(xmlTextReaderPtr reader) { + if (reader == NULL) + return(-1); + return(1); +} + +/************************************************************************ + * * + * Extensions to the base APIs * + * * + ************************************************************************/ + +/** + * xmlTextReaderSetParserProp: + * @reader: the xmlTextReaderPtr used + * @prop: the xmlParserProperties to set + * @value: usually 0 or 1 to (de)activate it + * + * Change the parser processing behaviour by changing some of its internal + * properties. Note that some properties can only be changed before any + * read has been done. + * + * Returns 0 if the call was successful, or -1 in case of error + */ +int +xmlTextReaderSetParserProp(xmlTextReaderPtr reader, int prop, int value) { + xmlParserProperties p = (xmlParserProperties) prop; + xmlParserCtxtPtr ctxt; + + if ((reader == NULL) || (reader->ctxt == NULL)) + return(-1); + ctxt = reader->ctxt; + + switch (p) { + case XML_PARSER_LOADDTD: + if (value != 0) { + if (ctxt->loadsubset == 0) { + if (reader->mode != XML_TEXTREADER_MODE_INITIAL) + return(-1); + ctxt->loadsubset = XML_DETECT_IDS; + } + } else { + ctxt->loadsubset = 0; + } + return(0); + case XML_PARSER_DEFAULTATTRS: + if (value != 0) { + ctxt->loadsubset |= XML_COMPLETE_ATTRS; + } else { + if (ctxt->loadsubset & XML_COMPLETE_ATTRS) + ctxt->loadsubset -= XML_COMPLETE_ATTRS; + } + return(0); + case XML_PARSER_VALIDATE: + if (value != 0) { + ctxt->validate = 1; + reader->validate = XML_TEXTREADER_VALIDATE_DTD; + } else { + ctxt->validate = 0; + } + return(0); + case XML_PARSER_SUBST_ENTITIES: + if (value != 0) { + ctxt->replaceEntities = 1; + } else { + ctxt->replaceEntities = 0; + } + return(0); + } + return(-1); +} + +/** + * xmlTextReaderGetParserProp: + * @reader: the xmlTextReaderPtr used + * @prop: the xmlParserProperties to get + * + * Read the parser internal property. + * + * Returns the value, usually 0 or 1, or -1 in case of error. + */ +int +xmlTextReaderGetParserProp(xmlTextReaderPtr reader, int prop) { + xmlParserProperties p = (xmlParserProperties) prop; + xmlParserCtxtPtr ctxt; + + if ((reader == NULL) || (reader->ctxt == NULL)) + return(-1); + ctxt = reader->ctxt; + + switch (p) { + case XML_PARSER_LOADDTD: + if ((ctxt->loadsubset != 0) || (ctxt->validate != 0)) + return(1); + return(0); + case XML_PARSER_DEFAULTATTRS: + if (ctxt->loadsubset & XML_COMPLETE_ATTRS) + return(1); + return(0); + case XML_PARSER_VALIDATE: + return(reader->validate); + case XML_PARSER_SUBST_ENTITIES: + return(ctxt->replaceEntities); + } + return(-1); +} + + +/** + * xmlTextReaderGetParserLineNumber: + * @reader: the user data (XML reader context) + * + * Provide the line number of the current parsing point. + * + * Returns an int or 0 if not available + */ +int +xmlTextReaderGetParserLineNumber(xmlTextReaderPtr reader) +{ + if ((reader == NULL) || (reader->ctxt == NULL) || + (reader->ctxt->input == NULL)) { + return (0); + } + return (reader->ctxt->input->line); +} + +/** + * xmlTextReaderGetParserColumnNumber: + * @reader: the user data (XML reader context) + * + * Provide the column number of the current parsing point. + * + * Returns an int or 0 if not available + */ +int +xmlTextReaderGetParserColumnNumber(xmlTextReaderPtr reader) +{ + if ((reader == NULL) || (reader->ctxt == NULL) || + (reader->ctxt->input == NULL)) { + return (0); + } + return (reader->ctxt->input->col); +} + +/** + * xmlTextReaderCurrentNode: + * @reader: the xmlTextReaderPtr used + * + * Hacking interface allowing to get the xmlNodePtr correponding to the + * current node being accessed by the xmlTextReader. This is dangerous + * because the underlying node may be destroyed on the next Reads. + * + * Returns the xmlNodePtr or NULL in case of error. + */ +xmlNodePtr +xmlTextReaderCurrentNode(xmlTextReaderPtr reader) { + if (reader == NULL) + return(NULL); + + if (reader->curnode != NULL) + return(reader->curnode); + return(reader->node); +} + +/** + * xmlTextReaderPreserve: + * @reader: the xmlTextReaderPtr used + * + * This tells the XML Reader to preserve the current node. + * The caller must also use xmlTextReaderCurrentDoc() to + * keep an handle on the resulting document once parsing has finished + * + * Returns the xmlNodePtr or NULL in case of error. + */ +xmlNodePtr +xmlTextReaderPreserve(xmlTextReaderPtr reader) { + xmlNodePtr cur, parent; + + if (reader == NULL) + return(NULL); + + if (reader->curnode != NULL) + cur = reader->curnode; + else + cur = reader->node; + if (cur == NULL) + return(NULL); + + if ((cur->type != XML_DOCUMENT_NODE) && (cur->type != XML_DTD_NODE)) { + cur->extra |= NODE_IS_PRESERVED; + cur->extra |= NODE_IS_SPRESERVED; + } + reader->preserves++; + + parent = cur->parent;; + while (parent != NULL) { + if (parent->type == XML_ELEMENT_NODE) + parent->extra |= NODE_IS_PRESERVED; + parent = parent->parent; + } + return(cur); +} + +#ifdef LIBXML_PATTERN_ENABLED +/** + * xmlTextReaderPreservePattern: + * @reader: the xmlTextReaderPtr used + * @pattern: an XPath subset pattern + * @namespaces: the prefix definitions, array of [URI, prefix] or NULL + * + * This tells the XML Reader to preserve all nodes matched by the + * pattern. The caller must also use xmlTextReaderCurrentDoc() to + * keep an handle on the resulting document once parsing has finished + * + * Returns a positive number in case of success and -1 in case of error + */ +int +xmlTextReaderPreservePattern(xmlTextReaderPtr reader, const xmlChar *pattern, + const xmlChar **namespaces) +{ + xmlPatternPtr comp; + + if ((reader == NULL) || (pattern == NULL)) + return(-1); + + comp = xmlPatterncompile(pattern, reader->dict, 0, namespaces); + if (comp == NULL) + return(-1); + + if (reader->patternMax <= 0) { + reader->patternMax = 4; + reader->patternTab = (xmlPatternPtr *) xmlMalloc(reader->patternMax * + sizeof(reader->patternTab[0])); + if (reader->patternTab == NULL) { + xmlGenericError(xmlGenericErrorContext, "xmlMalloc failed !\n"); + return (-1); + } + } + if (reader->patternNr >= reader->patternMax) { + xmlPatternPtr *tmp; + reader->patternMax *= 2; + tmp = (xmlPatternPtr *) xmlRealloc(reader->patternTab, + reader->patternMax * + sizeof(reader->patternTab[0])); + if (tmp == NULL) { + xmlGenericError(xmlGenericErrorContext, "xmlRealloc failed !\n"); + reader->patternMax /= 2; + return (-1); + } + reader->patternTab = tmp; + } + reader->patternTab[reader->patternNr] = comp; + return(reader->patternNr++); +} +#endif + +/** + * xmlTextReaderCurrentDoc: + * @reader: the xmlTextReaderPtr used + * + * Hacking interface allowing to get the xmlDocPtr correponding to the + * current document being accessed by the xmlTextReader. + * NOTE: as a result of this call, the reader will not destroy the + * associated XML document and calling xmlFreeDoc() on the result + * is needed once the reader parsing has finished. + * + * Returns the xmlDocPtr or NULL in case of error. + */ +xmlDocPtr +xmlTextReaderCurrentDoc(xmlTextReaderPtr reader) { + if (reader == NULL) + return(NULL); + if (reader->doc != NULL) + return(reader->doc); + if ((reader->ctxt == NULL) || (reader->ctxt->myDoc == NULL)) + return(NULL); + + reader->preserve = 1; + return(reader->ctxt->myDoc); +} + +#ifdef LIBXML_SCHEMAS_ENABLED +static char *xmlTextReaderBuildMessage(const char *msg, va_list ap); + +static void XMLCDECL +xmlTextReaderValidityError(void *ctxt, const char *msg, ...); + +static void XMLCDECL +xmlTextReaderValidityWarning(void *ctxt, const char *msg, ...); + +static void XMLCDECL +xmlTextReaderValidityErrorRelay(void *ctx, const char *msg, ...) +{ + xmlTextReaderPtr reader = (xmlTextReaderPtr) ctx; + + char *str; + + va_list ap; + + va_start(ap, msg); + str = xmlTextReaderBuildMessage(msg, ap); + if (!reader->errorFunc) { + xmlTextReaderValidityError(ctx, "%s", str); + } else { + reader->errorFunc(reader->errorFuncArg, str, + XML_PARSER_SEVERITY_VALIDITY_ERROR, + NULL /* locator */ ); + } + if (str != NULL) + xmlFree(str); + va_end(ap); +} + +static void XMLCDECL +xmlTextReaderValidityWarningRelay(void *ctx, const char *msg, ...) +{ + xmlTextReaderPtr reader = (xmlTextReaderPtr) ctx; + + char *str; + + va_list ap; + + va_start(ap, msg); + str = xmlTextReaderBuildMessage(msg, ap); + if (!reader->errorFunc) { + xmlTextReaderValidityWarning(ctx, "%s", str); + } else { + reader->errorFunc(reader->errorFuncArg, str, + XML_PARSER_SEVERITY_VALIDITY_WARNING, + NULL /* locator */ ); + } + if (str != NULL) + xmlFree(str); + va_end(ap); +} + +static void + xmlTextReaderStructuredError(void *ctxt, xmlErrorPtr error); + +static void +xmlTextReaderValidityStructuredRelay(void *userData, xmlErrorPtr error) +{ + xmlTextReaderPtr reader = (xmlTextReaderPtr) userData; + + if (reader->sErrorFunc) { + reader->sErrorFunc(reader->errorFuncArg, error); + } else { + xmlTextReaderStructuredError(reader, error); + } +} +/** + * xmlTextReaderRelaxNGSetSchema: + * @reader: the xmlTextReaderPtr used + * @schema: a precompiled RelaxNG schema + * + * Use RelaxNG to validate the document as it is processed. + * Activation is only possible before the first Read(). + * if @schema is NULL, then RelaxNG validation is desactivated. + @ The @schema should not be freed until the reader is deallocated + * or its use has been deactivated. + * + * Returns 0 in case the RelaxNG validation could be (des)activated and + * -1 in case of error. + */ +int +xmlTextReaderRelaxNGSetSchema(xmlTextReaderPtr reader, xmlRelaxNGPtr schema) { + if (reader == NULL) + return(-1); + if (schema == NULL) { + if (reader->rngSchemas != NULL) { + xmlRelaxNGFree(reader->rngSchemas); + reader->rngSchemas = NULL; + } + if (reader->rngValidCtxt != NULL) { + if (! reader->rngPreserveCtxt) + xmlRelaxNGFreeValidCtxt(reader->rngValidCtxt); + reader->rngValidCtxt = NULL; + } + reader->rngPreserveCtxt = 0; + return(0); + } + if (reader->mode != XML_TEXTREADER_MODE_INITIAL) + return(-1); + if (reader->rngSchemas != NULL) { + xmlRelaxNGFree(reader->rngSchemas); + reader->rngSchemas = NULL; + } + if (reader->rngValidCtxt != NULL) { + if (! reader->rngPreserveCtxt) + xmlRelaxNGFreeValidCtxt(reader->rngValidCtxt); + reader->rngValidCtxt = NULL; + } + reader->rngPreserveCtxt = 0; + reader->rngValidCtxt = xmlRelaxNGNewValidCtxt(schema); + if (reader->rngValidCtxt == NULL) + return(-1); + if (reader->errorFunc != NULL) { + xmlRelaxNGSetValidErrors(reader->rngValidCtxt, + xmlTextReaderValidityErrorRelay, + xmlTextReaderValidityWarningRelay, + reader); + } + if (reader->sErrorFunc != NULL) { + xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, + xmlTextReaderValidityStructuredRelay, + reader); + } + reader->rngValidErrors = 0; + reader->rngFullNode = NULL; + reader->validate = XML_TEXTREADER_VALIDATE_RNG; + return(0); +} + +/** + * xmlTextReaderLocator: + * @ctx: the xmlTextReaderPtr used + * @file: returned file information + * @line: returned line information + * + * Internal locator function for the readers + * + * Returns 0 in case the Schema validation could be (des)activated and + * -1 in case of error. + */ +static int +xmlTextReaderLocator(void *ctx, const char **file, unsigned long *line) { + xmlTextReaderPtr reader; + + if ((ctx == NULL) || ((file == NULL) && (line == NULL))) + return(-1); + + if (file != NULL) + *file = NULL; + if (line != NULL) + *line = 0; + + reader = (xmlTextReaderPtr) ctx; + if ((reader->ctxt != NULL) && (reader->ctxt->input != NULL)) { + if (file != NULL) + *file = reader->ctxt->input->filename; + if (line != NULL) + *line = reader->ctxt->input->line; + return(0); + } + if (reader->node != NULL) { + long res; + int ret = 0; + + if (line != NULL) { + res = xmlGetLineNo(reader->node); + if (res > 0) + *line = (unsigned long) res; + else + ret = -1; + } + if (file != NULL) { + xmlDocPtr doc = reader->node->doc; + if ((doc != NULL) && (doc->URL != NULL)) + *file = (const char *) doc->URL; + else + ret = -1; + } + return(ret); + } + return(-1); +} + +/** + * xmlTextReaderSetSchema: + * @reader: the xmlTextReaderPtr used + * @schema: a precompiled Schema schema + * + * Use XSD Schema to validate the document as it is processed. + * Activation is only possible before the first Read(). + * if @schema is NULL, then Schema validation is desactivated. + @ The @schema should not be freed until the reader is deallocated + * or its use has been deactivated. + * + * Returns 0 in case the Schema validation could be (des)activated and + * -1 in case of error. + */ +int +xmlTextReaderSetSchema(xmlTextReaderPtr reader, xmlSchemaPtr schema) { + if (reader == NULL) + return(-1); + if (schema == NULL) { + if (reader->xsdPlug != NULL) { + xmlSchemaSAXUnplug(reader->xsdPlug); + reader->xsdPlug = NULL; + } + if (reader->xsdValidCtxt != NULL) { + if (! reader->xsdPreserveCtxt) + xmlSchemaFreeValidCtxt(reader->xsdValidCtxt); + reader->xsdValidCtxt = NULL; + } + reader->xsdPreserveCtxt = 0; + if (reader->xsdSchemas != NULL) { + xmlSchemaFree(reader->xsdSchemas); + reader->xsdSchemas = NULL; + } + return(0); + } + if (reader->mode != XML_TEXTREADER_MODE_INITIAL) + return(-1); + if (reader->xsdPlug != NULL) { + xmlSchemaSAXUnplug(reader->xsdPlug); + reader->xsdPlug = NULL; + } + if (reader->xsdValidCtxt != NULL) { + if (! reader->xsdPreserveCtxt) + xmlSchemaFreeValidCtxt(reader->xsdValidCtxt); + reader->xsdValidCtxt = NULL; + } + reader->xsdPreserveCtxt = 0; + if (reader->xsdSchemas != NULL) { + xmlSchemaFree(reader->xsdSchemas); + reader->xsdSchemas = NULL; + } + reader->xsdValidCtxt = xmlSchemaNewValidCtxt(schema); + if (reader->xsdValidCtxt == NULL) { + xmlSchemaFree(reader->xsdSchemas); + reader->xsdSchemas = NULL; + return(-1); + } + reader->xsdPlug = xmlSchemaSAXPlug(reader->xsdValidCtxt, + &(reader->ctxt->sax), + &(reader->ctxt->userData)); + if (reader->xsdPlug == NULL) { + xmlSchemaFree(reader->xsdSchemas); + reader->xsdSchemas = NULL; + xmlSchemaFreeValidCtxt(reader->xsdValidCtxt); + reader->xsdValidCtxt = NULL; + return(-1); + } + xmlSchemaValidateSetLocator(reader->xsdValidCtxt, + xmlTextReaderLocator, + (void *) reader); + + if (reader->errorFunc != NULL) { + xmlSchemaSetValidErrors(reader->xsdValidCtxt, + xmlTextReaderValidityErrorRelay, + xmlTextReaderValidityWarningRelay, + reader); + } + if (reader->sErrorFunc != NULL) { + xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt, + xmlTextReaderValidityStructuredRelay, + reader); + } + reader->xsdValidErrors = 0; + reader->validate = XML_TEXTREADER_VALIDATE_XSD; + return(0); +} + +/** + * xmlTextReaderRelaxNGValidateInternal: + * @reader: the xmlTextReaderPtr used + * @rng: the path to a RelaxNG schema or NULL + * @ctxt: the RelaxNG schema validation context or NULL + * @options: options (not yet used) + * + * Use RelaxNG to validate the document as it is processed. + * Activation is only possible before the first Read(). + * If both @rng and @ctxt are NULL, then RelaxNG validation is deactivated. + * + * Returns 0 in case the RelaxNG validation could be (de)activated and + * -1 in case of error. + */ +static int +xmlTextReaderRelaxNGValidateInternal(xmlTextReaderPtr reader, + const char *rng, + xmlRelaxNGValidCtxtPtr ctxt, + int options ATTRIBUTE_UNUSED) +{ + if (reader == NULL) + return(-1); + + if ((rng != NULL) && (ctxt != NULL)) + return (-1); + + if (((rng != NULL) || (ctxt != NULL)) && + ((reader->mode != XML_TEXTREADER_MODE_INITIAL) || + (reader->ctxt == NULL))) + return(-1); + + /* Cleanup previous validation stuff. */ + if (reader->rngValidCtxt != NULL) { + if ( !reader->rngPreserveCtxt) + xmlRelaxNGFreeValidCtxt(reader->rngValidCtxt); + reader->rngValidCtxt = NULL; + } + reader->rngPreserveCtxt = 0; + if (reader->rngSchemas != NULL) { + xmlRelaxNGFree(reader->rngSchemas); + reader->rngSchemas = NULL; + } + + if ((rng == NULL) && (ctxt == NULL)) { + /* We just want to deactivate the validation, so get out. */ + return(0); + } + + + if (rng != NULL) { + xmlRelaxNGParserCtxtPtr pctxt; + /* Parse the schema and create validation environment. */ + + pctxt = xmlRelaxNGNewParserCtxt(rng); + if (reader->errorFunc != NULL) { + xmlRelaxNGSetParserErrors(pctxt, + xmlTextReaderValidityErrorRelay, + xmlTextReaderValidityWarningRelay, + reader); + } + if (reader->sErrorFunc != NULL) { + xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, + xmlTextReaderValidityStructuredRelay, + reader); + } + reader->rngSchemas = xmlRelaxNGParse(pctxt); + xmlRelaxNGFreeParserCtxt(pctxt); + if (reader->rngSchemas == NULL) + return(-1); + reader->rngValidCtxt = xmlRelaxNGNewValidCtxt(reader->rngSchemas); + if (reader->rngValidCtxt == NULL) { + xmlRelaxNGFree(reader->rngSchemas); + reader->rngSchemas = NULL; + return(-1); + } + } else { + /* Use the given validation context. */ + reader->rngValidCtxt = ctxt; + reader->rngPreserveCtxt = 1; + } + /* + * Redirect the validation context's error channels to use + * the reader channels. + * TODO: In case the user provides the validation context we + * could make this redirection optional. + */ + if (reader->errorFunc != NULL) { + xmlRelaxNGSetValidErrors(reader->rngValidCtxt, + xmlTextReaderValidityErrorRelay, + xmlTextReaderValidityWarningRelay, + reader); + } + if (reader->sErrorFunc != NULL) { + xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, + xmlTextReaderValidityStructuredRelay, + reader); + } + reader->rngValidErrors = 0; + reader->rngFullNode = NULL; + reader->validate = XML_TEXTREADER_VALIDATE_RNG; + return(0); +} + +/** + * xmlTextReaderSchemaValidateInternal: + * @reader: the xmlTextReaderPtr used + * @xsd: the path to a W3C XSD schema or NULL + * @ctxt: the XML Schema validation context or NULL + * @options: options (not used yet) + * + * Validate the document as it is processed using XML Schema. + * Activation is only possible before the first Read(). + * If both @xsd and @ctxt are NULL then XML Schema validation is deactivated. + * + * Returns 0 in case the schemas validation could be (de)activated and + * -1 in case of error. + */ +static int +xmlTextReaderSchemaValidateInternal(xmlTextReaderPtr reader, + const char *xsd, + xmlSchemaValidCtxtPtr ctxt, + int options ATTRIBUTE_UNUSED) +{ + if (reader == NULL) + return(-1); + + if ((xsd != NULL) && (ctxt != NULL)) + return(-1); + + if (((xsd != NULL) || (ctxt != NULL)) && + ((reader->mode != XML_TEXTREADER_MODE_INITIAL) || + (reader->ctxt == NULL))) + return(-1); + + /* Cleanup previous validation stuff. */ + if (reader->xsdPlug != NULL) { + xmlSchemaSAXUnplug(reader->xsdPlug); + reader->xsdPlug = NULL; + } + if (reader->xsdValidCtxt != NULL) { + if (! reader->xsdPreserveCtxt) + xmlSchemaFreeValidCtxt(reader->xsdValidCtxt); + reader->xsdValidCtxt = NULL; + } + reader->xsdPreserveCtxt = 0; + if (reader->xsdSchemas != NULL) { + xmlSchemaFree(reader->xsdSchemas); + reader->xsdSchemas = NULL; + } + + if ((xsd == NULL) && (ctxt == NULL)) { + /* We just want to deactivate the validation, so get out. */ + return(0); + } + + if (xsd != NULL) { + xmlSchemaParserCtxtPtr pctxt; + /* Parse the schema and create validation environment. */ + pctxt = xmlSchemaNewParserCtxt(xsd); + if (reader->errorFunc != NULL) { + xmlSchemaSetParserErrors(pctxt, + xmlTextReaderValidityErrorRelay, + xmlTextReaderValidityWarningRelay, + reader); + } + reader->xsdSchemas = xmlSchemaParse(pctxt); + xmlSchemaFreeParserCtxt(pctxt); + if (reader->xsdSchemas == NULL) + return(-1); + reader->xsdValidCtxt = xmlSchemaNewValidCtxt(reader->xsdSchemas); + if (reader->xsdValidCtxt == NULL) { + xmlSchemaFree(reader->xsdSchemas); + reader->xsdSchemas = NULL; + return(-1); + } + reader->xsdPlug = xmlSchemaSAXPlug(reader->xsdValidCtxt, + &(reader->ctxt->sax), + &(reader->ctxt->userData)); + if (reader->xsdPlug == NULL) { + xmlSchemaFree(reader->xsdSchemas); + reader->xsdSchemas = NULL; + xmlSchemaFreeValidCtxt(reader->xsdValidCtxt); + reader->xsdValidCtxt = NULL; + return(-1); + } + } else { + /* Use the given validation context. */ + reader->xsdValidCtxt = ctxt; + reader->xsdPreserveCtxt = 1; + reader->xsdPlug = xmlSchemaSAXPlug(reader->xsdValidCtxt, + &(reader->ctxt->sax), + &(reader->ctxt->userData)); + if (reader->xsdPlug == NULL) { + reader->xsdValidCtxt = NULL; + reader->xsdPreserveCtxt = 0; + return(-1); + } + } + xmlSchemaValidateSetLocator(reader->xsdValidCtxt, + xmlTextReaderLocator, + (void *) reader); + /* + * Redirect the validation context's error channels to use + * the reader channels. + * TODO: In case the user provides the validation context we + * could make this redirection optional. + */ + if (reader->errorFunc != NULL) { + xmlSchemaSetValidErrors(reader->xsdValidCtxt, + xmlTextReaderValidityErrorRelay, + xmlTextReaderValidityWarningRelay, + reader); + } + if (reader->sErrorFunc != NULL) { + xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt, + xmlTextReaderValidityStructuredRelay, + reader); + } + reader->xsdValidErrors = 0; + reader->validate = XML_TEXTREADER_VALIDATE_XSD; + return(0); +} + +/** + * xmlTextReaderSchemaValidateCtxt: + * @reader: the xmlTextReaderPtr used + * @ctxt: the XML Schema validation context or NULL + * @options: options (not used yet) + * + * Use W3C XSD schema context to validate the document as it is processed. + * Activation is only possible before the first Read(). + * If @ctxt is NULL, then XML Schema validation is deactivated. + * + * Returns 0 in case the schemas validation could be (de)activated and + * -1 in case of error. + */ +int +xmlTextReaderSchemaValidateCtxt(xmlTextReaderPtr reader, + xmlSchemaValidCtxtPtr ctxt, + int options) +{ + return(xmlTextReaderSchemaValidateInternal(reader, NULL, ctxt, options)); +} + +/** + * xmlTextReaderSchemaValidate: + * @reader: the xmlTextReaderPtr used + * @xsd: the path to a W3C XSD schema or NULL + * + * Use W3C XSD schema to validate the document as it is processed. + * Activation is only possible before the first Read(). + * If @xsd is NULL, then XML Schema validation is deactivated. + * + * Returns 0 in case the schemas validation could be (de)activated and + * -1 in case of error. + */ +int +xmlTextReaderSchemaValidate(xmlTextReaderPtr reader, const char *xsd) +{ + return(xmlTextReaderSchemaValidateInternal(reader, xsd, NULL, 0)); +} + +/** + * xmlTextReaderRelaxNGValidateCtxt: + * @reader: the xmlTextReaderPtr used + * @ctxt: the RelaxNG schema validation context or NULL + * @options: options (not used yet) + * + * Use RelaxNG schema context to validate the document as it is processed. + * Activation is only possible before the first Read(). + * If @ctxt is NULL, then RelaxNG schema validation is deactivated. + * + * Returns 0 in case the schemas validation could be (de)activated and + * -1 in case of error. + */ +int +xmlTextReaderRelaxNGValidateCtxt(xmlTextReaderPtr reader, + xmlRelaxNGValidCtxtPtr ctxt, + int options) +{ + return(xmlTextReaderRelaxNGValidateInternal(reader, NULL, ctxt, options)); +} + +/** + * xmlTextReaderRelaxNGValidate: + * @reader: the xmlTextReaderPtr used + * @rng: the path to a RelaxNG schema or NULL + * + * Use RelaxNG schema to validate the document as it is processed. + * Activation is only possible before the first Read(). + * If @rng is NULL, then RelaxNG schema validation is deactivated. + * + * Returns 0 in case the schemas validation could be (de)activated and + * -1 in case of error. + */ +int +xmlTextReaderRelaxNGValidate(xmlTextReaderPtr reader, const char *rng) +{ + return(xmlTextReaderRelaxNGValidateInternal(reader, rng, NULL, 0)); +} + +#endif + +/** + * xmlTextReaderIsNamespaceDecl: + * @reader: the xmlTextReaderPtr used + * + * Determine whether the current node is a namespace declaration + * rather than a regular attribute. + * + * Returns 1 if the current node is a namespace declaration, 0 if it + * is a regular attribute or other type of node, or -1 in case of + * error. + */ +int +xmlTextReaderIsNamespaceDecl(xmlTextReaderPtr reader) { + xmlNodePtr node; + if (reader == NULL) + return(-1); + if (reader->node == NULL) + return(-1); + if (reader->curnode != NULL) + node = reader->curnode; + else + node = reader->node; + + if (XML_NAMESPACE_DECL == node->type) + return(1); + else + return(0); +} + +/** + * xmlTextReaderConstXmlVersion: + * @reader: the xmlTextReaderPtr used + * + * Determine the XML version of the document being read. + * + * Returns a string containing the XML version of the document or NULL + * in case of error. The string is deallocated with the reader. + */ +const xmlChar * +xmlTextReaderConstXmlVersion(xmlTextReaderPtr reader) { + xmlDocPtr doc = NULL; + if (reader == NULL) + return(NULL); + if (reader->doc != NULL) + doc = reader->doc; + else if (reader->ctxt != NULL) + doc = reader->ctxt->myDoc; + if (doc == NULL) + return(NULL); + + if (doc->version == NULL) + return(NULL); + else + return(CONSTSTR(doc->version)); +} + +/** + * xmlTextReaderStandalone: + * @reader: the xmlTextReaderPtr used + * + * Determine the standalone status of the document being read. + * + * Returns 1 if the document was declared to be standalone, 0 if it + * was declared to be not standalone, or -1 if the document did not + * specify its standalone status or in case of error. + */ +int +xmlTextReaderStandalone(xmlTextReaderPtr reader) { + xmlDocPtr doc = NULL; + if (reader == NULL) + return(-1); + if (reader->doc != NULL) + doc = reader->doc; + else if (reader->ctxt != NULL) + doc = reader->ctxt->myDoc; + if (doc == NULL) + return(-1); + + return(doc->standalone); +} + +/************************************************************************ + * * + * Error Handling Extensions * + * * + ************************************************************************/ + +/* helper to build a xmlMalloc'ed string from a format and va_list */ +static char * +xmlTextReaderBuildMessage(const char *msg, va_list ap) { + int size = 0; + int chars; + char *larger; + char *str = NULL; + va_list aq; + + while (1) { + VA_COPY(aq, ap); + chars = vsnprintf(str, size, msg, aq); + va_end(aq); + if (chars < 0) { + xmlGenericError(xmlGenericErrorContext, "vsnprintf failed !\n"); + if (str) + xmlFree(str); + return NULL; + } + if ((chars < size) || (size == MAX_ERR_MSG_SIZE)) + break; + if (chars < MAX_ERR_MSG_SIZE) + size = chars + 1; + else + size = MAX_ERR_MSG_SIZE; + if ((larger = (char *) xmlRealloc(str, size)) == NULL) { + xmlGenericError(xmlGenericErrorContext, "xmlRealloc failed !\n"); + if (str) + xmlFree(str); + return NULL; + } + str = larger; + } + + return str; +} + +/** + * xmlTextReaderLocatorLineNumber: + * @locator: the xmlTextReaderLocatorPtr used + * + * Obtain the line number for the given locator. + * + * Returns the line number or -1 in case of error. + */ +int +xmlTextReaderLocatorLineNumber(xmlTextReaderLocatorPtr locator) { + /* we know that locator is a xmlParserCtxtPtr */ + xmlParserCtxtPtr ctx = (xmlParserCtxtPtr)locator; + int ret = -1; + + if (locator == NULL) + return(-1); + if (ctx->node != NULL) { + ret = xmlGetLineNo(ctx->node); + } + else { + /* inspired from error.c */ + xmlParserInputPtr input; + input = ctx->input; + if ((input->filename == NULL) && (ctx->inputNr > 1)) + input = ctx->inputTab[ctx->inputNr - 2]; + if (input != NULL) { + ret = input->line; + } + else { + ret = -1; + } + } + + return ret; +} + +/** + * xmlTextReaderLocatorBaseURI: + * @locator: the xmlTextReaderLocatorPtr used + * + * Obtain the base URI for the given locator. + * + * Returns the base URI or NULL in case of error, + * if non NULL it need to be freed by the caller. + */ +xmlChar * +xmlTextReaderLocatorBaseURI(xmlTextReaderLocatorPtr locator) { + /* we know that locator is a xmlParserCtxtPtr */ + xmlParserCtxtPtr ctx = (xmlParserCtxtPtr)locator; + xmlChar *ret = NULL; + + if (locator == NULL) + return(NULL); + if (ctx->node != NULL) { + ret = xmlNodeGetBase(NULL,ctx->node); + } + else { + /* inspired from error.c */ + xmlParserInputPtr input; + input = ctx->input; + if ((input->filename == NULL) && (ctx->inputNr > 1)) + input = ctx->inputTab[ctx->inputNr - 2]; + if (input != NULL) { + ret = xmlStrdup(BAD_CAST input->filename); + } + else { + ret = NULL; + } + } + + return ret; +} + +static void +xmlTextReaderGenericError(void *ctxt, xmlParserSeverities severity, + char *str) +{ + xmlParserCtxtPtr ctx = (xmlParserCtxtPtr) ctxt; + + xmlTextReaderPtr reader = (xmlTextReaderPtr) ctx->_private; + + if (str != NULL) { + if (reader->errorFunc) + reader->errorFunc(reader->errorFuncArg, str, severity, + (xmlTextReaderLocatorPtr) ctx); + xmlFree(str); + } +} + +static void +xmlTextReaderStructuredError(void *ctxt, xmlErrorPtr error) +{ + xmlParserCtxtPtr ctx = (xmlParserCtxtPtr) ctxt; + + xmlTextReaderPtr reader = (xmlTextReaderPtr) ctx->_private; + + if (error && reader->sErrorFunc) { + reader->sErrorFunc(reader->errorFuncArg, (xmlErrorPtr) error); + } +} + +static void XMLCDECL +xmlTextReaderError(void *ctxt, const char *msg, ...) +{ + va_list ap; + + va_start(ap, msg); + xmlTextReaderGenericError(ctxt, + XML_PARSER_SEVERITY_ERROR, + xmlTextReaderBuildMessage(msg, ap)); + va_end(ap); + +} + +static void XMLCDECL +xmlTextReaderWarning(void *ctxt, const char *msg, ...) +{ + va_list ap; + + va_start(ap, msg); + xmlTextReaderGenericError(ctxt, + XML_PARSER_SEVERITY_WARNING, + xmlTextReaderBuildMessage(msg, ap)); + va_end(ap); +} + +static void XMLCDECL +xmlTextReaderValidityError(void *ctxt, const char *msg, ...) +{ + va_list ap; + + int len = xmlStrlen((const xmlChar *) msg); + + if ((len > 1) && (msg[len - 2] != ':')) { + /* + * some callbacks only report locator information: + * skip them (mimicking behaviour in error.c) + */ + va_start(ap, msg); + xmlTextReaderGenericError(ctxt, + XML_PARSER_SEVERITY_VALIDITY_ERROR, + xmlTextReaderBuildMessage(msg, ap)); + va_end(ap); + } +} + +static void XMLCDECL +xmlTextReaderValidityWarning(void *ctxt, const char *msg, ...) +{ + va_list ap; + + int len = xmlStrlen((const xmlChar *) msg); + + if ((len != 0) && (msg[len - 1] != ':')) { + /* + * some callbacks only report locator information: + * skip them (mimicking behaviour in error.c) + */ + va_start(ap, msg); + xmlTextReaderGenericError(ctxt, + XML_PARSER_SEVERITY_VALIDITY_WARNING, + xmlTextReaderBuildMessage(msg, ap)); + va_end(ap); + } +} + +/** + * xmlTextReaderSetErrorHandler: + * @reader: the xmlTextReaderPtr used + * @f: the callback function to call on error and warnings + * @arg: a user argument to pass to the callback function + * + * Register a callback function that will be called on error and warnings. + * + * If @f is NULL, the default error and warning handlers are restored. + */ +void +xmlTextReaderSetErrorHandler(xmlTextReaderPtr reader, + xmlTextReaderErrorFunc f, void *arg) +{ + if (f != NULL) { + reader->ctxt->sax->error = xmlTextReaderError; + reader->ctxt->sax->serror = NULL; + reader->ctxt->vctxt.error = xmlTextReaderValidityError; + reader->ctxt->sax->warning = xmlTextReaderWarning; + reader->ctxt->vctxt.warning = xmlTextReaderValidityWarning; + reader->errorFunc = f; + reader->sErrorFunc = NULL; + reader->errorFuncArg = arg; +#ifdef LIBXML_SCHEMAS_ENABLED + if (reader->rngValidCtxt) { + xmlRelaxNGSetValidErrors(reader->rngValidCtxt, + xmlTextReaderValidityErrorRelay, + xmlTextReaderValidityWarningRelay, + reader); + xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, NULL, + reader); + } + if (reader->xsdValidCtxt) { + xmlSchemaSetValidErrors(reader->xsdValidCtxt, + xmlTextReaderValidityErrorRelay, + xmlTextReaderValidityWarningRelay, + reader); + xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt, NULL, + reader); + } +#endif + } else { + /* restore defaults */ + reader->ctxt->sax->error = xmlParserError; + reader->ctxt->vctxt.error = xmlParserValidityError; + reader->ctxt->sax->warning = xmlParserWarning; + reader->ctxt->vctxt.warning = xmlParserValidityWarning; + reader->errorFunc = NULL; + reader->sErrorFunc = NULL; + reader->errorFuncArg = NULL; +#ifdef LIBXML_SCHEMAS_ENABLED + if (reader->rngValidCtxt) { + xmlRelaxNGSetValidErrors(reader->rngValidCtxt, NULL, NULL, + reader); + xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, NULL, + reader); + } + if (reader->xsdValidCtxt) { + xmlSchemaSetValidErrors(reader->xsdValidCtxt, NULL, NULL, + reader); + xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt, NULL, + reader); + } +#endif + } +} + +/** +* xmlTextReaderSetStructuredErrorHandler: + * @reader: the xmlTextReaderPtr used + * @f: the callback function to call on error and warnings + * @arg: a user argument to pass to the callback function + * + * Register a callback function that will be called on error and warnings. + * + * If @f is NULL, the default error and warning handlers are restored. + */ +void +xmlTextReaderSetStructuredErrorHandler(xmlTextReaderPtr reader, + xmlStructuredErrorFunc f, void *arg) +{ + if (f != NULL) { + reader->ctxt->sax->error = NULL; + reader->ctxt->sax->serror = xmlTextReaderStructuredError; + reader->ctxt->vctxt.error = xmlTextReaderValidityError; + reader->ctxt->sax->warning = xmlTextReaderWarning; + reader->ctxt->vctxt.warning = xmlTextReaderValidityWarning; + reader->sErrorFunc = f; + reader->errorFunc = NULL; + reader->errorFuncArg = arg; +#ifdef LIBXML_SCHEMAS_ENABLED + if (reader->rngValidCtxt) { + xmlRelaxNGSetValidErrors(reader->rngValidCtxt, NULL, NULL, + reader); + xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, + xmlTextReaderValidityStructuredRelay, + reader); + } + if (reader->xsdValidCtxt) { + xmlSchemaSetValidErrors(reader->xsdValidCtxt, NULL, NULL, + reader); + xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt, + xmlTextReaderValidityStructuredRelay, + reader); + } +#endif + } else { + /* restore defaults */ + reader->ctxt->sax->error = xmlParserError; + reader->ctxt->sax->serror = NULL; + reader->ctxt->vctxt.error = xmlParserValidityError; + reader->ctxt->sax->warning = xmlParserWarning; + reader->ctxt->vctxt.warning = xmlParserValidityWarning; + reader->errorFunc = NULL; + reader->sErrorFunc = NULL; + reader->errorFuncArg = NULL; +#ifdef LIBXML_SCHEMAS_ENABLED + if (reader->rngValidCtxt) { + xmlRelaxNGSetValidErrors(reader->rngValidCtxt, NULL, NULL, + reader); + xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, NULL, + reader); + } + if (reader->xsdValidCtxt) { + xmlSchemaSetValidErrors(reader->xsdValidCtxt, NULL, NULL, + reader); + xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt, NULL, + reader); + } +#endif + } +} + +/** + * xmlTextReaderIsValid: + * @reader: the xmlTextReaderPtr used + * + * Retrieve the validity status from the parser context + * + * Returns the flag value 1 if valid, 0 if no, and -1 in case of error + */ +int +xmlTextReaderIsValid(xmlTextReaderPtr reader) +{ + if (reader == NULL) + return (-1); +#ifdef LIBXML_SCHEMAS_ENABLED + if (reader->validate == XML_TEXTREADER_VALIDATE_RNG) + return (reader->rngValidErrors == 0); + if (reader->validate == XML_TEXTREADER_VALIDATE_XSD) + return (reader->xsdValidErrors == 0); +#endif + if ((reader->ctxt != NULL) && (reader->ctxt->validate == 1)) + return (reader->ctxt->valid); + return (0); +} + +/** + * xmlTextReaderGetErrorHandler: + * @reader: the xmlTextReaderPtr used + * @f: the callback function or NULL is no callback has been registered + * @arg: a user argument + * + * Retrieve the error callback function and user argument. + */ +void +xmlTextReaderGetErrorHandler(xmlTextReaderPtr reader, + xmlTextReaderErrorFunc * f, void **arg) +{ + if (f != NULL) + *f = reader->errorFunc; + if (arg != NULL) + *arg = reader->errorFuncArg; +} +/************************************************************************ + * * + * New set (2.6.0) of simpler and more flexible APIs * + * * + ************************************************************************/ + +/** + * xmlTextReaderSetup: + * @reader: an XML reader + * @input: xmlParserInputBufferPtr used to feed the reader, will + * be destroyed with it. + * @URL: the base URL to use for the document + * @encoding: the document encoding, or NULL + * @options: a combination of xmlParserOption + * + * Setup an XML reader with new options + * + * Returns 0 in case of success and -1 in case of error. + */ +int +xmlTextReaderSetup(xmlTextReaderPtr reader, + xmlParserInputBufferPtr input, const char *URL, + const char *encoding, int options) +{ + if (reader == NULL) { + if (input != NULL) + xmlFreeParserInputBuffer(input); + return (-1); + } + + /* + * we force the generation of compact text nodes on the reader + * since usr applications should never modify the tree + */ + options |= XML_PARSE_COMPACT; + + reader->doc = NULL; + reader->entNr = 0; + reader->parserFlags = options; + reader->validate = XML_TEXTREADER_NOT_VALIDATE; + if ((input != NULL) && (reader->input != NULL) && + (reader->allocs & XML_TEXTREADER_INPUT)) { + xmlFreeParserInputBuffer(reader->input); + reader->input = NULL; + reader->allocs -= XML_TEXTREADER_INPUT; + } + if (input != NULL) { + reader->input = input; + reader->allocs |= XML_TEXTREADER_INPUT; + } + if (reader->buffer == NULL) + reader->buffer = xmlBufCreateSize(100); + if (reader->buffer == NULL) { + xmlGenericError(xmlGenericErrorContext, + "xmlTextReaderSetup : malloc failed\n"); + return (-1); + } + if (reader->sax == NULL) + reader->sax = (xmlSAXHandler *) xmlMalloc(sizeof(xmlSAXHandler)); + if (reader->sax == NULL) { + xmlGenericError(xmlGenericErrorContext, + "xmlTextReaderSetup : malloc failed\n"); + return (-1); + } + xmlSAXVersion(reader->sax, 2); + reader->startElement = reader->sax->startElement; + reader->sax->startElement = xmlTextReaderStartElement; + reader->endElement = reader->sax->endElement; + reader->sax->endElement = xmlTextReaderEndElement; +#ifdef LIBXML_SAX1_ENABLED + if (reader->sax->initialized == XML_SAX2_MAGIC) { +#endif /* LIBXML_SAX1_ENABLED */ + reader->startElementNs = reader->sax->startElementNs; + reader->sax->startElementNs = xmlTextReaderStartElementNs; + reader->endElementNs = reader->sax->endElementNs; + reader->sax->endElementNs = xmlTextReaderEndElementNs; +#ifdef LIBXML_SAX1_ENABLED + } else { + reader->startElementNs = NULL; + reader->endElementNs = NULL; + } +#endif /* LIBXML_SAX1_ENABLED */ + reader->characters = reader->sax->characters; + reader->sax->characters = xmlTextReaderCharacters; + reader->sax->ignorableWhitespace = xmlTextReaderCharacters; + reader->cdataBlock = reader->sax->cdataBlock; + reader->sax->cdataBlock = xmlTextReaderCDataBlock; + + reader->mode = XML_TEXTREADER_MODE_INITIAL; + reader->node = NULL; + reader->curnode = NULL; + if (input != NULL) { + if (xmlBufUse(reader->input->buffer) < 4) { + xmlParserInputBufferRead(input, 4); + } + if (reader->ctxt == NULL) { + if (xmlBufUse(reader->input->buffer) >= 4) { + reader->ctxt = xmlCreatePushParserCtxt(reader->sax, NULL, + (const char *) xmlBufContent(reader->input->buffer), + 4, URL); + reader->base = 0; + reader->cur = 4; + } else { + reader->ctxt = + xmlCreatePushParserCtxt(reader->sax, NULL, NULL, 0, URL); + reader->base = 0; + reader->cur = 0; + } + } else { + xmlParserInputPtr inputStream; + xmlParserInputBufferPtr buf; + xmlCharEncoding enc = XML_CHAR_ENCODING_NONE; + + xmlCtxtReset(reader->ctxt); + buf = xmlAllocParserInputBuffer(enc); + if (buf == NULL) return(-1); + inputStream = xmlNewInputStream(reader->ctxt); + if (inputStream == NULL) { + xmlFreeParserInputBuffer(buf); + return(-1); + } + + if (URL == NULL) + inputStream->filename = NULL; + else + inputStream->filename = (char *) + xmlCanonicPath((const xmlChar *) URL); + inputStream->buf = buf; + xmlBufResetInput(buf->buffer, inputStream); + + inputPush(reader->ctxt, inputStream); + reader->cur = 0; + } + if (reader->ctxt == NULL) { + xmlGenericError(xmlGenericErrorContext, + "xmlTextReaderSetup : malloc failed\n"); + return (-1); + } + } + if (reader->dict != NULL) { + if (reader->ctxt->dict != NULL) { + if (reader->dict != reader->ctxt->dict) { + xmlDictFree(reader->dict); + reader->dict = reader->ctxt->dict; + } + } else { + reader->ctxt->dict = reader->dict; + } + } else { + if (reader->ctxt->dict == NULL) + reader->ctxt->dict = xmlDictCreate(); + reader->dict = reader->ctxt->dict; + } + reader->ctxt->_private = reader; + reader->ctxt->linenumbers = 1; + reader->ctxt->dictNames = 1; + /* + * use the parser dictionnary to allocate all elements and attributes names + */ + reader->ctxt->docdict = 1; + reader->ctxt->parseMode = XML_PARSE_READER; + +#ifdef LIBXML_XINCLUDE_ENABLED + if (reader->xincctxt != NULL) { + xmlXIncludeFreeContext(reader->xincctxt); + reader->xincctxt = NULL; + } + if (options & XML_PARSE_XINCLUDE) { + reader->xinclude = 1; + reader->xinclude_name = xmlDictLookup(reader->dict, XINCLUDE_NODE, -1); + options -= XML_PARSE_XINCLUDE; + } else + reader->xinclude = 0; + reader->in_xinclude = 0; +#endif +#ifdef LIBXML_PATTERN_ENABLED + if (reader->patternTab == NULL) { + reader->patternNr = 0; + reader->patternMax = 0; + } + while (reader->patternNr > 0) { + reader->patternNr--; + if (reader->patternTab[reader->patternNr] != NULL) { + xmlFreePattern(reader->patternTab[reader->patternNr]); + reader->patternTab[reader->patternNr] = NULL; + } + } +#endif + + if (options & XML_PARSE_DTDVALID) + reader->validate = XML_TEXTREADER_VALIDATE_DTD; + + xmlCtxtUseOptions(reader->ctxt, options); + if (encoding != NULL) { + xmlCharEncodingHandlerPtr hdlr; + + hdlr = xmlFindCharEncodingHandler(encoding); + if (hdlr != NULL) + xmlSwitchToEncoding(reader->ctxt, hdlr); + } + if ((URL != NULL) && (reader->ctxt->input != NULL) && + (reader->ctxt->input->filename == NULL)) + reader->ctxt->input->filename = (char *) + xmlStrdup((const xmlChar *) URL); + + reader->doc = NULL; + + return (0); +} + +/** + * xmlTextReaderByteConsumed: + * @reader: an XML reader + * + * This function provides the current index of the parser used + * by the reader, relative to the start of the current entity. + * This function actually just wraps a call to xmlBytesConsumed() + * for the parser context associated with the reader. + * See xmlBytesConsumed() for more information. + * + * Returns the index in bytes from the beginning of the entity or -1 + * in case the index could not be computed. + */ +long +xmlTextReaderByteConsumed(xmlTextReaderPtr reader) { + if ((reader == NULL) || (reader->ctxt == NULL)) + return(-1); + return(xmlByteConsumed(reader->ctxt)); +} + + +/** + * xmlReaderWalker: + * @doc: a preparsed document + * + * Create an xmltextReader for a preparsed document. + * + * Returns the new reader or NULL in case of error. + */ +xmlTextReaderPtr +xmlReaderWalker(xmlDocPtr doc) +{ + xmlTextReaderPtr ret; + + if (doc == NULL) + return(NULL); + + ret = xmlMalloc(sizeof(xmlTextReader)); + if (ret == NULL) { + xmlGenericError(xmlGenericErrorContext, + "xmlNewTextReader : malloc failed\n"); + return(NULL); + } + memset(ret, 0, sizeof(xmlTextReader)); + ret->entNr = 0; + ret->input = NULL; + ret->mode = XML_TEXTREADER_MODE_INITIAL; + ret->node = NULL; + ret->curnode = NULL; + ret->base = 0; + ret->cur = 0; + ret->allocs = XML_TEXTREADER_CTXT; + ret->doc = doc; + ret->state = XML_TEXTREADER_START; + ret->dict = xmlDictCreate(); + return(ret); +} + +/** + * xmlReaderForDoc: + * @cur: a pointer to a zero terminated string + * @URL: the base URL to use for the document + * @encoding: the document encoding, or NULL + * @options: a combination of xmlParserOption + * + * Create an xmltextReader for an XML in-memory document. + * The parsing flags @options are a combination of xmlParserOption. + * + * Returns the new reader or NULL in case of error. + */ +xmlTextReaderPtr +xmlReaderForDoc(const xmlChar * cur, const char *URL, const char *encoding, + int options) +{ + int len; + + if (cur == NULL) + return (NULL); + len = xmlStrlen(cur); + + return (xmlReaderForMemory + ((const char *) cur, len, URL, encoding, options)); +} + +/** + * xmlReaderForFile: + * @filename: a file or URL + * @encoding: the document encoding, or NULL + * @options: a combination of xmlParserOption + * + * parse an XML file from the filesystem or the network. + * The parsing flags @options are a combination of xmlParserOption. + * + * Returns the new reader or NULL in case of error. + */ +xmlTextReaderPtr +xmlReaderForFile(const char *filename, const char *encoding, int options) +{ + xmlTextReaderPtr reader; + + reader = xmlNewTextReaderFilename(filename); + if (reader == NULL) + return (NULL); + xmlTextReaderSetup(reader, NULL, NULL, encoding, options); + return (reader); +} + +/** + * xmlReaderForMemory: + * @buffer: a pointer to a char array + * @size: the size of the array + * @URL: the base URL to use for the document + * @encoding: the document encoding, or NULL + * @options: a combination of xmlParserOption + * + * Create an xmltextReader for an XML in-memory document. + * The parsing flags @options are a combination of xmlParserOption. + * + * Returns the new reader or NULL in case of error. + */ +xmlTextReaderPtr +xmlReaderForMemory(const char *buffer, int size, const char *URL, + const char *encoding, int options) +{ + xmlTextReaderPtr reader; + xmlParserInputBufferPtr buf; + + buf = xmlParserInputBufferCreateStatic(buffer, size, + XML_CHAR_ENCODING_NONE); + if (buf == NULL) { + return (NULL); + } + reader = xmlNewTextReader(buf, URL); + if (reader == NULL) { + xmlFreeParserInputBuffer(buf); + return (NULL); + } + reader->allocs |= XML_TEXTREADER_INPUT; + xmlTextReaderSetup(reader, NULL, URL, encoding, options); + return (reader); +} + +/** + * xmlReaderForFd: + * @fd: an open file descriptor + * @URL: the base URL to use for the document + * @encoding: the document encoding, or NULL + * @options: a combination of xmlParserOption + * + * Create an xmltextReader for an XML from a file descriptor. + * The parsing flags @options are a combination of xmlParserOption. + * NOTE that the file descriptor will not be closed when the + * reader is closed or reset. + * + * Returns the new reader or NULL in case of error. + */ +xmlTextReaderPtr +xmlReaderForFd(int fd, const char *URL, const char *encoding, int options) +{ + xmlTextReaderPtr reader; + xmlParserInputBufferPtr input; + + if (fd < 0) + return (NULL); + + input = xmlParserInputBufferCreateFd(fd, XML_CHAR_ENCODING_NONE); + if (input == NULL) + return (NULL); + input->closecallback = NULL; + reader = xmlNewTextReader(input, URL); + if (reader == NULL) { + xmlFreeParserInputBuffer(input); + return (NULL); + } + reader->allocs |= XML_TEXTREADER_INPUT; + xmlTextReaderSetup(reader, NULL, URL, encoding, options); + return (reader); +} + +/** + * xmlReaderForIO: + * @ioread: an I/O read function + * @ioclose: an I/O close function + * @ioctx: an I/O handler + * @URL: the base URL to use for the document + * @encoding: the document encoding, or NULL + * @options: a combination of xmlParserOption + * + * Create an xmltextReader for an XML document from I/O functions and source. + * The parsing flags @options are a combination of xmlParserOption. + * + * Returns the new reader or NULL in case of error. + */ +xmlTextReaderPtr +xmlReaderForIO(xmlInputReadCallback ioread, xmlInputCloseCallback ioclose, + void *ioctx, const char *URL, const char *encoding, + int options) +{ + xmlTextReaderPtr reader; + xmlParserInputBufferPtr input; + + if (ioread == NULL) + return (NULL); + + input = xmlParserInputBufferCreateIO(ioread, ioclose, ioctx, + XML_CHAR_ENCODING_NONE); + if (input == NULL) { + if (ioclose != NULL) + ioclose(ioctx); + return (NULL); + } + reader = xmlNewTextReader(input, URL); + if (reader == NULL) { + xmlFreeParserInputBuffer(input); + return (NULL); + } + reader->allocs |= XML_TEXTREADER_INPUT; + xmlTextReaderSetup(reader, NULL, URL, encoding, options); + return (reader); +} + +/** + * xmlReaderNewWalker: + * @reader: an XML reader + * @doc: a preparsed document + * + * Setup an xmltextReader to parse a preparsed XML document. + * This reuses the existing @reader xmlTextReader. + * + * Returns 0 in case of success and -1 in case of error + */ +int +xmlReaderNewWalker(xmlTextReaderPtr reader, xmlDocPtr doc) +{ + if (doc == NULL) + return (-1); + if (reader == NULL) + return (-1); + + if (reader->input != NULL) { + xmlFreeParserInputBuffer(reader->input); + } + if (reader->ctxt != NULL) { + xmlCtxtReset(reader->ctxt); + } + + reader->entNr = 0; + reader->input = NULL; + reader->mode = XML_TEXTREADER_MODE_INITIAL; + reader->node = NULL; + reader->curnode = NULL; + reader->base = 0; + reader->cur = 0; + reader->allocs = XML_TEXTREADER_CTXT; + reader->doc = doc; + reader->state = XML_TEXTREADER_START; + if (reader->dict == NULL) { + if ((reader->ctxt != NULL) && (reader->ctxt->dict != NULL)) + reader->dict = reader->ctxt->dict; + else + reader->dict = xmlDictCreate(); + } + return(0); +} + +/** + * xmlReaderNewDoc: + * @reader: an XML reader + * @cur: a pointer to a zero terminated string + * @URL: the base URL to use for the document + * @encoding: the document encoding, or NULL + * @options: a combination of xmlParserOption + * + * Setup an xmltextReader to parse an XML in-memory document. + * The parsing flags @options are a combination of xmlParserOption. + * This reuses the existing @reader xmlTextReader. + * + * Returns 0 in case of success and -1 in case of error + */ +int +xmlReaderNewDoc(xmlTextReaderPtr reader, const xmlChar * cur, + const char *URL, const char *encoding, int options) +{ + + int len; + + if (cur == NULL) + return (-1); + if (reader == NULL) + return (-1); + + len = xmlStrlen(cur); + return (xmlReaderNewMemory(reader, (const char *)cur, len, + URL, encoding, options)); +} + +/** + * xmlReaderNewFile: + * @reader: an XML reader + * @filename: a file or URL + * @encoding: the document encoding, or NULL + * @options: a combination of xmlParserOption + * + * parse an XML file from the filesystem or the network. + * The parsing flags @options are a combination of xmlParserOption. + * This reuses the existing @reader xmlTextReader. + * + * Returns 0 in case of success and -1 in case of error + */ +int +xmlReaderNewFile(xmlTextReaderPtr reader, const char *filename, + const char *encoding, int options) +{ + xmlParserInputBufferPtr input; + + if (filename == NULL) + return (-1); + if (reader == NULL) + return (-1); + + input = + xmlParserInputBufferCreateFilename(filename, + XML_CHAR_ENCODING_NONE); + if (input == NULL) + return (-1); + return (xmlTextReaderSetup(reader, input, filename, encoding, options)); +} + +/** + * xmlReaderNewMemory: + * @reader: an XML reader + * @buffer: a pointer to a char array + * @size: the size of the array + * @URL: the base URL to use for the document + * @encoding: the document encoding, or NULL + * @options: a combination of xmlParserOption + * + * Setup an xmltextReader to parse an XML in-memory document. + * The parsing flags @options are a combination of xmlParserOption. + * This reuses the existing @reader xmlTextReader. + * + * Returns 0 in case of success and -1 in case of error + */ +int +xmlReaderNewMemory(xmlTextReaderPtr reader, const char *buffer, int size, + const char *URL, const char *encoding, int options) +{ + xmlParserInputBufferPtr input; + + if (reader == NULL) + return (-1); + if (buffer == NULL) + return (-1); + + input = xmlParserInputBufferCreateStatic(buffer, size, + XML_CHAR_ENCODING_NONE); + if (input == NULL) { + return (-1); + } + return (xmlTextReaderSetup(reader, input, URL, encoding, options)); +} + +/** + * xmlReaderNewFd: + * @reader: an XML reader + * @fd: an open file descriptor + * @URL: the base URL to use for the document + * @encoding: the document encoding, or NULL + * @options: a combination of xmlParserOption + * + * Setup an xmltextReader to parse an XML from a file descriptor. + * NOTE that the file descriptor will not be closed when the + * reader is closed or reset. + * The parsing flags @options are a combination of xmlParserOption. + * This reuses the existing @reader xmlTextReader. + * + * Returns 0 in case of success and -1 in case of error + */ +int +xmlReaderNewFd(xmlTextReaderPtr reader, int fd, + const char *URL, const char *encoding, int options) +{ + xmlParserInputBufferPtr input; + + if (fd < 0) + return (-1); + if (reader == NULL) + return (-1); + + input = xmlParserInputBufferCreateFd(fd, XML_CHAR_ENCODING_NONE); + if (input == NULL) + return (-1); + input->closecallback = NULL; + return (xmlTextReaderSetup(reader, input, URL, encoding, options)); +} + +/** + * xmlReaderNewIO: + * @reader: an XML reader + * @ioread: an I/O read function + * @ioclose: an I/O close function + * @ioctx: an I/O handler + * @URL: the base URL to use for the document + * @encoding: the document encoding, or NULL + * @options: a combination of xmlParserOption + * + * Setup an xmltextReader to parse an XML document from I/O functions + * and source. + * The parsing flags @options are a combination of xmlParserOption. + * This reuses the existing @reader xmlTextReader. + * + * Returns 0 in case of success and -1 in case of error + */ +int +xmlReaderNewIO(xmlTextReaderPtr reader, xmlInputReadCallback ioread, + xmlInputCloseCallback ioclose, void *ioctx, + const char *URL, const char *encoding, int options) +{ + xmlParserInputBufferPtr input; + + if (ioread == NULL) + return (-1); + if (reader == NULL) + return (-1); + + input = xmlParserInputBufferCreateIO(ioread, ioclose, ioctx, + XML_CHAR_ENCODING_NONE); + if (input == NULL) { + if (ioclose != NULL) + ioclose(ioctx); + return (-1); + } + return (xmlTextReaderSetup(reader, input, URL, encoding, options)); +} + +/************************************************************************ + * * + * Utilities * + * * + ************************************************************************/ +#ifdef NOT_USED_YET + +/** + * xmlBase64Decode: + * @in: the input buffer + * @inlen: the size of the input (in), the size read from it (out) + * @to: the output buffer + * @tolen: the size of the output (in), the size written to (out) + * + * Base64 decoder, reads from @in and save in @to + * TODO: tell jody when this is actually exported + * + * Returns 0 if all the input was consumer, 1 if the Base64 end was reached, + * 2 if there wasn't enough space on the output or -1 in case of error. + */ +static int +xmlBase64Decode(const unsigned char *in, unsigned long *inlen, + unsigned char *to, unsigned long *tolen) +{ + unsigned long incur; /* current index in in[] */ + + unsigned long inblk; /* last block index in in[] */ + + unsigned long outcur; /* current index in out[] */ + + unsigned long inmax; /* size of in[] */ + + unsigned long outmax; /* size of out[] */ + + unsigned char cur; /* the current value read from in[] */ + + unsigned char intmp[4], outtmp[4]; /* temporary buffers for the convert */ + + int nbintmp; /* number of byte in intmp[] */ + + int is_ignore; /* cur should be ignored */ + + int is_end = 0; /* the end of the base64 was found */ + + int retval = 1; + + int i; + + if ((in == NULL) || (inlen == NULL) || (to == NULL) || (tolen == NULL)) + return (-1); + + incur = 0; + inblk = 0; + outcur = 0; + inmax = *inlen; + outmax = *tolen; + nbintmp = 0; + + while (1) { + if (incur >= inmax) + break; + cur = in[incur++]; + is_ignore = 0; + if ((cur >= 'A') && (cur <= 'Z')) + cur = cur - 'A'; + else if ((cur >= 'a') && (cur <= 'z')) + cur = cur - 'a' + 26; + else if ((cur >= '0') && (cur <= '9')) + cur = cur - '0' + 52; + else if (cur == '+') + cur = 62; + else if (cur == '/') + cur = 63; + else if (cur == '.') + cur = 0; + else if (cur == '=') /*no op , end of the base64 stream */ + is_end = 1; + else { + is_ignore = 1; + if (nbintmp == 0) + inblk = incur; + } + + if (!is_ignore) { + int nbouttmp = 3; + + int is_break = 0; + + if (is_end) { + if (nbintmp == 0) + break; + if ((nbintmp == 1) || (nbintmp == 2)) + nbouttmp = 1; + else + nbouttmp = 2; + nbintmp = 3; + is_break = 1; + } + intmp[nbintmp++] = cur; + /* + * if intmp is full, push the 4byte sequence as a 3 byte + * sequence out + */ + if (nbintmp == 4) { + nbintmp = 0; + outtmp[0] = (intmp[0] << 2) | ((intmp[1] & 0x30) >> 4); + outtmp[1] = + ((intmp[1] & 0x0F) << 4) | ((intmp[2] & 0x3C) >> 2); + outtmp[2] = ((intmp[2] & 0x03) << 6) | (intmp[3] & 0x3F); + if (outcur + 3 >= outmax) { + retval = 2; + break; + } + + for (i = 0; i < nbouttmp; i++) + to[outcur++] = outtmp[i]; + inblk = incur; + } + + if (is_break) { + retval = 0; + break; + } + } + } + + *tolen = outcur; + *inlen = inblk; + return (retval); +} + +/* + * Test routine for the xmlBase64Decode function + */ +#if 0 +int +main(int argc, char **argv) +{ + char *input = " VW4 gcGV0 \n aXQgdGVzdCAuCg== "; + + char output[100]; + + char output2[100]; + + char output3[100]; + + unsigned long inlen = strlen(input); + + unsigned long outlen = 100; + + int ret; + + unsigned long cons, tmp, tmp2, prod; + + /* + * Direct + */ + ret = xmlBase64Decode(input, &inlen, output, &outlen); + + output[outlen] = 0; + printf("ret: %d, inlen: %ld , outlen: %ld, output: '%s'\n", ret, inlen, + outlen, output)indent: Standard input:179: Error:Unmatched #endif +; + + /* + * output chunking + */ + cons = 0; + prod = 0; + while (cons < inlen) { + tmp = 5; + tmp2 = inlen - cons; + + printf("%ld %ld\n", cons, prod); + ret = xmlBase64Decode(&input[cons], &tmp2, &output2[prod], &tmp); + cons += tmp2; + prod += tmp; + printf("%ld %ld\n", cons, prod); + } + output2[outlen] = 0; + printf("ret: %d, cons: %ld , prod: %ld, output: '%s'\n", ret, cons, + prod, output2); + + /* + * input chunking + */ + cons = 0; + prod = 0; + while (cons < inlen) { + tmp = 100 - prod; + tmp2 = inlen - cons; + if (tmp2 > 5) + tmp2 = 5; + + printf("%ld %ld\n", cons, prod); + ret = xmlBase64Decode(&input[cons], &tmp2, &output3[prod], &tmp); + cons += tmp2; + prod += tmp; + printf("%ld %ld\n", cons, prod); + } + output3[outlen] = 0; + printf("ret: %d, cons: %ld , prod: %ld, output: '%s'\n", ret, cons, + prod, output3); + return (0); + +} +#endif +#endif /* NOT_USED_YET */ +#define bottom_xmlreader +#include "elfgcchack.h" +#endif /* LIBXML_READER_ENABLED */ diff --git a/vendors/libxml/src/xmlregexp.c b/vendors/libxml/src/xmlregexp.c new file mode 100644 index 0000000..1f9911c --- /dev/null +++ b/vendors/libxml/src/xmlregexp.c @@ -0,0 +1,8167 @@ +/* + * regexp.c: generic and extensible Regular Expression engine + * + * Basically designed with the purpose of compiling regexps for + * the variety of validation/shemas mechanisms now available in + * XML related specifications these include: + * - XML-1.0 DTD validation + * - XML Schemas structure part 1 + * - XML Schemas Datatypes part 2 especially Appendix F + * - RELAX-NG/TREX i.e. the counter proposal + * + * See Copyright for the status of this software. + * + * Daniel Veillard + */ + +#define IN_LIBXML +#include "libxml.h" + +#ifdef LIBXML_REGEXP_ENABLED + +/* #define DEBUG_ERR */ + +#include +#include +#ifdef HAVE_LIMITS_H +#include +#endif + +#include +#include +#include +#include +#include + +#ifndef INT_MAX +#define INT_MAX 123456789 /* easy to flag and big enough for our needs */ +#endif + +/* #define DEBUG_REGEXP_GRAPH */ +/* #define DEBUG_REGEXP_EXEC */ +/* #define DEBUG_PUSH */ +/* #define DEBUG_COMPACTION */ + +#define MAX_PUSH 10000000 + +#ifdef ERROR +#undef ERROR +#endif +#define ERROR(str) \ + ctxt->error = XML_REGEXP_COMPILE_ERROR; \ + xmlRegexpErrCompile(ctxt, str); +#define NEXT ctxt->cur++ +#define CUR (*(ctxt->cur)) +#define NXT(index) (ctxt->cur[index]) + +#define CUR_SCHAR(s, l) xmlStringCurrentChar(NULL, s, &l) +#define NEXTL(l) ctxt->cur += l; +#define XML_REG_STRING_SEPARATOR '|' +/* + * Need PREV to check on a '-' within a Character Group. May only be used + * when it's guaranteed that cur is not at the beginning of ctxt->string! + */ +#define PREV (ctxt->cur[-1]) + +/** + * TODO: + * + * macro to flag unimplemented blocks + */ +#define TODO \ + xmlGenericError(xmlGenericErrorContext, \ + "Unimplemented block at %s:%d\n", \ + __FILE__, __LINE__); + +/************************************************************************ + * * + * Datatypes and structures * + * * + ************************************************************************/ + +/* + * Note: the order of the enums below is significant, do not shuffle + */ +typedef enum { + XML_REGEXP_EPSILON = 1, + XML_REGEXP_CHARVAL, + XML_REGEXP_RANGES, + XML_REGEXP_SUBREG, /* used for () sub regexps */ + XML_REGEXP_STRING, + XML_REGEXP_ANYCHAR, /* . */ + XML_REGEXP_ANYSPACE, /* \s */ + XML_REGEXP_NOTSPACE, /* \S */ + XML_REGEXP_INITNAME, /* \l */ + XML_REGEXP_NOTINITNAME, /* \L */ + XML_REGEXP_NAMECHAR, /* \c */ + XML_REGEXP_NOTNAMECHAR, /* \C */ + XML_REGEXP_DECIMAL, /* \d */ + XML_REGEXP_NOTDECIMAL, /* \D */ + XML_REGEXP_REALCHAR, /* \w */ + XML_REGEXP_NOTREALCHAR, /* \W */ + XML_REGEXP_LETTER = 100, + XML_REGEXP_LETTER_UPPERCASE, + XML_REGEXP_LETTER_LOWERCASE, + XML_REGEXP_LETTER_TITLECASE, + XML_REGEXP_LETTER_MODIFIER, + XML_REGEXP_LETTER_OTHERS, + XML_REGEXP_MARK, + XML_REGEXP_MARK_NONSPACING, + XML_REGEXP_MARK_SPACECOMBINING, + XML_REGEXP_MARK_ENCLOSING, + XML_REGEXP_NUMBER, + XML_REGEXP_NUMBER_DECIMAL, + XML_REGEXP_NUMBER_LETTER, + XML_REGEXP_NUMBER_OTHERS, + XML_REGEXP_PUNCT, + XML_REGEXP_PUNCT_CONNECTOR, + XML_REGEXP_PUNCT_DASH, + XML_REGEXP_PUNCT_OPEN, + XML_REGEXP_PUNCT_CLOSE, + XML_REGEXP_PUNCT_INITQUOTE, + XML_REGEXP_PUNCT_FINQUOTE, + XML_REGEXP_PUNCT_OTHERS, + XML_REGEXP_SEPAR, + XML_REGEXP_SEPAR_SPACE, + XML_REGEXP_SEPAR_LINE, + XML_REGEXP_SEPAR_PARA, + XML_REGEXP_SYMBOL, + XML_REGEXP_SYMBOL_MATH, + XML_REGEXP_SYMBOL_CURRENCY, + XML_REGEXP_SYMBOL_MODIFIER, + XML_REGEXP_SYMBOL_OTHERS, + XML_REGEXP_OTHER, + XML_REGEXP_OTHER_CONTROL, + XML_REGEXP_OTHER_FORMAT, + XML_REGEXP_OTHER_PRIVATE, + XML_REGEXP_OTHER_NA, + XML_REGEXP_BLOCK_NAME +} xmlRegAtomType; + +typedef enum { + XML_REGEXP_QUANT_EPSILON = 1, + XML_REGEXP_QUANT_ONCE, + XML_REGEXP_QUANT_OPT, + XML_REGEXP_QUANT_MULT, + XML_REGEXP_QUANT_PLUS, + XML_REGEXP_QUANT_ONCEONLY, + XML_REGEXP_QUANT_ALL, + XML_REGEXP_QUANT_RANGE +} xmlRegQuantType; + +typedef enum { + XML_REGEXP_START_STATE = 1, + XML_REGEXP_FINAL_STATE, + XML_REGEXP_TRANS_STATE, + XML_REGEXP_SINK_STATE, + XML_REGEXP_UNREACH_STATE +} xmlRegStateType; + +typedef enum { + XML_REGEXP_MARK_NORMAL = 0, + XML_REGEXP_MARK_START, + XML_REGEXP_MARK_VISITED +} xmlRegMarkedType; + +typedef struct _xmlRegRange xmlRegRange; +typedef xmlRegRange *xmlRegRangePtr; + +struct _xmlRegRange { + int neg; /* 0 normal, 1 not, 2 exclude */ + xmlRegAtomType type; + int start; + int end; + xmlChar *blockName; +}; + +typedef struct _xmlRegAtom xmlRegAtom; +typedef xmlRegAtom *xmlRegAtomPtr; + +typedef struct _xmlAutomataState xmlRegState; +typedef xmlRegState *xmlRegStatePtr; + +struct _xmlRegAtom { + int no; + xmlRegAtomType type; + xmlRegQuantType quant; + int min; + int max; + + void *valuep; + void *valuep2; + int neg; + int codepoint; + xmlRegStatePtr start; + xmlRegStatePtr start0; + xmlRegStatePtr stop; + int maxRanges; + int nbRanges; + xmlRegRangePtr *ranges; + void *data; +}; + +typedef struct _xmlRegCounter xmlRegCounter; +typedef xmlRegCounter *xmlRegCounterPtr; + +struct _xmlRegCounter { + int min; + int max; +}; + +typedef struct _xmlRegTrans xmlRegTrans; +typedef xmlRegTrans *xmlRegTransPtr; + +struct _xmlRegTrans { + xmlRegAtomPtr atom; + int to; + int counter; + int count; + int nd; +}; + +struct _xmlAutomataState { + xmlRegStateType type; + xmlRegMarkedType mark; + xmlRegMarkedType markd; + xmlRegMarkedType reached; + int no; + int maxTrans; + int nbTrans; + xmlRegTrans *trans; + /* knowing states ponting to us can speed things up */ + int maxTransTo; + int nbTransTo; + int *transTo; +}; + +typedef struct _xmlAutomata xmlRegParserCtxt; +typedef xmlRegParserCtxt *xmlRegParserCtxtPtr; + +#define AM_AUTOMATA_RNG 1 + +struct _xmlAutomata { + xmlChar *string; + xmlChar *cur; + + int error; + int neg; + + xmlRegStatePtr start; + xmlRegStatePtr end; + xmlRegStatePtr state; + + xmlRegAtomPtr atom; + + int maxAtoms; + int nbAtoms; + xmlRegAtomPtr *atoms; + + int maxStates; + int nbStates; + xmlRegStatePtr *states; + + int maxCounters; + int nbCounters; + xmlRegCounter *counters; + + int determinist; + int negs; + int flags; +}; + +struct _xmlRegexp { + xmlChar *string; + int nbStates; + xmlRegStatePtr *states; + int nbAtoms; + xmlRegAtomPtr *atoms; + int nbCounters; + xmlRegCounter *counters; + int determinist; + int flags; + /* + * That's the compact form for determinists automatas + */ + int nbstates; + int *compact; + void **transdata; + int nbstrings; + xmlChar **stringMap; +}; + +typedef struct _xmlRegExecRollback xmlRegExecRollback; +typedef xmlRegExecRollback *xmlRegExecRollbackPtr; + +struct _xmlRegExecRollback { + xmlRegStatePtr state;/* the current state */ + int index; /* the index in the input stack */ + int nextbranch; /* the next transition to explore in that state */ + int *counts; /* save the automata state if it has some */ +}; + +typedef struct _xmlRegInputToken xmlRegInputToken; +typedef xmlRegInputToken *xmlRegInputTokenPtr; + +struct _xmlRegInputToken { + xmlChar *value; + void *data; +}; + +struct _xmlRegExecCtxt { + int status; /* execution status != 0 indicate an error */ + int determinist; /* did we find an indeterministic behaviour */ + xmlRegexpPtr comp; /* the compiled regexp */ + xmlRegExecCallbacks callback; + void *data; + + xmlRegStatePtr state;/* the current state */ + int transno; /* the current transition on that state */ + int transcount; /* the number of chars in char counted transitions */ + + /* + * A stack of rollback states + */ + int maxRollbacks; + int nbRollbacks; + xmlRegExecRollback *rollbacks; + + /* + * The state of the automata if any + */ + int *counts; + + /* + * The input stack + */ + int inputStackMax; + int inputStackNr; + int index; + int *charStack; + const xmlChar *inputString; /* when operating on characters */ + xmlRegInputTokenPtr inputStack;/* when operating on strings */ + + /* + * error handling + */ + int errStateNo; /* the error state number */ + xmlRegStatePtr errState; /* the error state */ + xmlChar *errString; /* the string raising the error */ + int *errCounts; /* counters at the error state */ + int nbPush; +}; + +#define REGEXP_ALL_COUNTER 0x123456 +#define REGEXP_ALL_LAX_COUNTER 0x123457 + +static void xmlFAParseRegExp(xmlRegParserCtxtPtr ctxt, int top); +static void xmlRegFreeState(xmlRegStatePtr state); +static void xmlRegFreeAtom(xmlRegAtomPtr atom); +static int xmlRegStrEqualWildcard(const xmlChar *expStr, const xmlChar *valStr); +static int xmlRegCheckCharacter(xmlRegAtomPtr atom, int codepoint); +static int xmlRegCheckCharacterRange(xmlRegAtomType type, int codepoint, + int neg, int start, int end, const xmlChar *blockName); + +void xmlAutomataSetFlags(xmlAutomataPtr am, int flags); + +/************************************************************************ + * * + * Regexp memory error handler * + * * + ************************************************************************/ +/** + * xmlRegexpErrMemory: + * @extra: extra information + * + * Handle an out of memory condition + */ +static void +xmlRegexpErrMemory(xmlRegParserCtxtPtr ctxt, const char *extra) +{ + const char *regexp = NULL; + if (ctxt != NULL) { + regexp = (const char *) ctxt->string; + ctxt->error = XML_ERR_NO_MEMORY; + } + __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_REGEXP, + XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, extra, + regexp, NULL, 0, 0, + "Memory allocation failed : %s\n", extra); +} + +/** + * xmlRegexpErrCompile: + * @extra: extra information + * + * Handle a compilation failure + */ +static void +xmlRegexpErrCompile(xmlRegParserCtxtPtr ctxt, const char *extra) +{ + const char *regexp = NULL; + int idx = 0; + + if (ctxt != NULL) { + regexp = (const char *) ctxt->string; + idx = ctxt->cur - ctxt->string; + ctxt->error = XML_REGEXP_COMPILE_ERROR; + } + __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_REGEXP, + XML_REGEXP_COMPILE_ERROR, XML_ERR_FATAL, NULL, 0, extra, + regexp, NULL, idx, 0, + "failed to compile: %s\n", extra); +} + +/************************************************************************ + * * + * Allocation/Deallocation * + * * + ************************************************************************/ + +static int xmlFAComputesDeterminism(xmlRegParserCtxtPtr ctxt); +/** + * xmlRegEpxFromParse: + * @ctxt: the parser context used to build it + * + * Allocate a new regexp and fill it with the result from the parser + * + * Returns the new regexp or NULL in case of error + */ +static xmlRegexpPtr +xmlRegEpxFromParse(xmlRegParserCtxtPtr ctxt) { + xmlRegexpPtr ret; + + ret = (xmlRegexpPtr) xmlMalloc(sizeof(xmlRegexp)); + if (ret == NULL) { + xmlRegexpErrMemory(ctxt, "compiling regexp"); + return(NULL); + } + memset(ret, 0, sizeof(xmlRegexp)); + ret->string = ctxt->string; + ret->nbStates = ctxt->nbStates; + ret->states = ctxt->states; + ret->nbAtoms = ctxt->nbAtoms; + ret->atoms = ctxt->atoms; + ret->nbCounters = ctxt->nbCounters; + ret->counters = ctxt->counters; + ret->determinist = ctxt->determinist; + ret->flags = ctxt->flags; + if (ret->determinist == -1) { + xmlRegexpIsDeterminist(ret); + } + + if ((ret->determinist != 0) && + (ret->nbCounters == 0) && + (ctxt->negs == 0) && + (ret->atoms != NULL) && + (ret->atoms[0] != NULL) && + (ret->atoms[0]->type == XML_REGEXP_STRING)) { + int i, j, nbstates = 0, nbatoms = 0; + int *stateRemap; + int *stringRemap; + int *transitions; + void **transdata; + xmlChar **stringMap; + xmlChar *value; + + /* + * Switch to a compact representation + * 1/ counting the effective number of states left + * 2/ counting the unique number of atoms, and check that + * they are all of the string type + * 3/ build a table state x atom for the transitions + */ + + stateRemap = xmlMalloc(ret->nbStates * sizeof(int)); + if (stateRemap == NULL) { + xmlRegexpErrMemory(ctxt, "compiling regexp"); + xmlFree(ret); + return(NULL); + } + for (i = 0;i < ret->nbStates;i++) { + if (ret->states[i] != NULL) { + stateRemap[i] = nbstates; + nbstates++; + } else { + stateRemap[i] = -1; + } + } +#ifdef DEBUG_COMPACTION + printf("Final: %d states\n", nbstates); +#endif + stringMap = xmlMalloc(ret->nbAtoms * sizeof(char *)); + if (stringMap == NULL) { + xmlRegexpErrMemory(ctxt, "compiling regexp"); + xmlFree(stateRemap); + xmlFree(ret); + return(NULL); + } + stringRemap = xmlMalloc(ret->nbAtoms * sizeof(int)); + if (stringRemap == NULL) { + xmlRegexpErrMemory(ctxt, "compiling regexp"); + xmlFree(stringMap); + xmlFree(stateRemap); + xmlFree(ret); + return(NULL); + } + for (i = 0;i < ret->nbAtoms;i++) { + if ((ret->atoms[i]->type == XML_REGEXP_STRING) && + (ret->atoms[i]->quant == XML_REGEXP_QUANT_ONCE)) { + value = ret->atoms[i]->valuep; + for (j = 0;j < nbatoms;j++) { + if (xmlStrEqual(stringMap[j], value)) { + stringRemap[i] = j; + break; + } + } + if (j >= nbatoms) { + stringRemap[i] = nbatoms; + stringMap[nbatoms] = xmlStrdup(value); + if (stringMap[nbatoms] == NULL) { + for (i = 0;i < nbatoms;i++) + xmlFree(stringMap[i]); + xmlFree(stringRemap); + xmlFree(stringMap); + xmlFree(stateRemap); + xmlFree(ret); + return(NULL); + } + nbatoms++; + } + } else { + xmlFree(stateRemap); + xmlFree(stringRemap); + for (i = 0;i < nbatoms;i++) + xmlFree(stringMap[i]); + xmlFree(stringMap); + xmlFree(ret); + return(NULL); + } + } +#ifdef DEBUG_COMPACTION + printf("Final: %d atoms\n", nbatoms); +#endif + transitions = (int *) xmlMalloc((nbstates + 1) * + (nbatoms + 1) * sizeof(int)); + if (transitions == NULL) { + xmlFree(stateRemap); + xmlFree(stringRemap); + xmlFree(stringMap); + xmlFree(ret); + return(NULL); + } + memset(transitions, 0, (nbstates + 1) * (nbatoms + 1) * sizeof(int)); + + /* + * Allocate the transition table. The first entry for each + * state corresponds to the state type. + */ + transdata = NULL; + + for (i = 0;i < ret->nbStates;i++) { + int stateno, atomno, targetno, prev; + xmlRegStatePtr state; + xmlRegTransPtr trans; + + stateno = stateRemap[i]; + if (stateno == -1) + continue; + state = ret->states[i]; + + transitions[stateno * (nbatoms + 1)] = state->type; + + for (j = 0;j < state->nbTrans;j++) { + trans = &(state->trans[j]); + if ((trans->to == -1) || (trans->atom == NULL)) + continue; + atomno = stringRemap[trans->atom->no]; + if ((trans->atom->data != NULL) && (transdata == NULL)) { + transdata = (void **) xmlMalloc(nbstates * nbatoms * + sizeof(void *)); + if (transdata != NULL) + memset(transdata, 0, + nbstates * nbatoms * sizeof(void *)); + else { + xmlRegexpErrMemory(ctxt, "compiling regexp"); + break; + } + } + targetno = stateRemap[trans->to]; + /* + * if the same atom can generate transitions to 2 different + * states then it means the automata is not determinist and + * the compact form can't be used ! + */ + prev = transitions[stateno * (nbatoms + 1) + atomno + 1]; + if (prev != 0) { + if (prev != targetno + 1) { + ret->determinist = 0; +#ifdef DEBUG_COMPACTION + printf("Indet: state %d trans %d, atom %d to %d : %d to %d\n", + i, j, trans->atom->no, trans->to, atomno, targetno); + printf(" previous to is %d\n", prev); +#endif + if (transdata != NULL) + xmlFree(transdata); + xmlFree(transitions); + xmlFree(stateRemap); + xmlFree(stringRemap); + for (i = 0;i < nbatoms;i++) + xmlFree(stringMap[i]); + xmlFree(stringMap); + goto not_determ; + } + } else { +#if 0 + printf("State %d trans %d: atom %d to %d : %d to %d\n", + i, j, trans->atom->no, trans->to, atomno, targetno); +#endif + transitions[stateno * (nbatoms + 1) + atomno + 1] = + targetno + 1; /* to avoid 0 */ + if (transdata != NULL) + transdata[stateno * nbatoms + atomno] = + trans->atom->data; + } + } + } + ret->determinist = 1; +#ifdef DEBUG_COMPACTION + /* + * Debug + */ + for (i = 0;i < nbstates;i++) { + for (j = 0;j < nbatoms + 1;j++) { + printf("%02d ", transitions[i * (nbatoms + 1) + j]); + } + printf("\n"); + } + printf("\n"); +#endif + /* + * Cleanup of the old data + */ + if (ret->states != NULL) { + for (i = 0;i < ret->nbStates;i++) + xmlRegFreeState(ret->states[i]); + xmlFree(ret->states); + } + ret->states = NULL; + ret->nbStates = 0; + if (ret->atoms != NULL) { + for (i = 0;i < ret->nbAtoms;i++) + xmlRegFreeAtom(ret->atoms[i]); + xmlFree(ret->atoms); + } + ret->atoms = NULL; + ret->nbAtoms = 0; + + ret->compact = transitions; + ret->transdata = transdata; + ret->stringMap = stringMap; + ret->nbstrings = nbatoms; + ret->nbstates = nbstates; + xmlFree(stateRemap); + xmlFree(stringRemap); + } +not_determ: + ctxt->string = NULL; + ctxt->nbStates = 0; + ctxt->states = NULL; + ctxt->nbAtoms = 0; + ctxt->atoms = NULL; + ctxt->nbCounters = 0; + ctxt->counters = NULL; + return(ret); +} + +/** + * xmlRegNewParserCtxt: + * @string: the string to parse + * + * Allocate a new regexp parser context + * + * Returns the new context or NULL in case of error + */ +static xmlRegParserCtxtPtr +xmlRegNewParserCtxt(const xmlChar *string) { + xmlRegParserCtxtPtr ret; + + ret = (xmlRegParserCtxtPtr) xmlMalloc(sizeof(xmlRegParserCtxt)); + if (ret == NULL) + return(NULL); + memset(ret, 0, sizeof(xmlRegParserCtxt)); + if (string != NULL) + ret->string = xmlStrdup(string); + ret->cur = ret->string; + ret->neg = 0; + ret->negs = 0; + ret->error = 0; + ret->determinist = -1; + return(ret); +} + +/** + * xmlRegNewRange: + * @ctxt: the regexp parser context + * @neg: is that negative + * @type: the type of range + * @start: the start codepoint + * @end: the end codepoint + * + * Allocate a new regexp range + * + * Returns the new range or NULL in case of error + */ +static xmlRegRangePtr +xmlRegNewRange(xmlRegParserCtxtPtr ctxt, + int neg, xmlRegAtomType type, int start, int end) { + xmlRegRangePtr ret; + + ret = (xmlRegRangePtr) xmlMalloc(sizeof(xmlRegRange)); + if (ret == NULL) { + xmlRegexpErrMemory(ctxt, "allocating range"); + return(NULL); + } + ret->neg = neg; + ret->type = type; + ret->start = start; + ret->end = end; + return(ret); +} + +/** + * xmlRegFreeRange: + * @range: the regexp range + * + * Free a regexp range + */ +static void +xmlRegFreeRange(xmlRegRangePtr range) { + if (range == NULL) + return; + + if (range->blockName != NULL) + xmlFree(range->blockName); + xmlFree(range); +} + +/** + * xmlRegCopyRange: + * @range: the regexp range + * + * Copy a regexp range + * + * Returns the new copy or NULL in case of error. + */ +static xmlRegRangePtr +xmlRegCopyRange(xmlRegParserCtxtPtr ctxt, xmlRegRangePtr range) { + xmlRegRangePtr ret; + + if (range == NULL) + return(NULL); + + ret = xmlRegNewRange(ctxt, range->neg, range->type, range->start, + range->end); + if (ret == NULL) + return(NULL); + if (range->blockName != NULL) { + ret->blockName = xmlStrdup(range->blockName); + if (ret->blockName == NULL) { + xmlRegexpErrMemory(ctxt, "allocating range"); + xmlRegFreeRange(ret); + return(NULL); + } + } + return(ret); +} + +/** + * xmlRegNewAtom: + * @ctxt: the regexp parser context + * @type: the type of atom + * + * Allocate a new atom + * + * Returns the new atom or NULL in case of error + */ +static xmlRegAtomPtr +xmlRegNewAtom(xmlRegParserCtxtPtr ctxt, xmlRegAtomType type) { + xmlRegAtomPtr ret; + + ret = (xmlRegAtomPtr) xmlMalloc(sizeof(xmlRegAtom)); + if (ret == NULL) { + xmlRegexpErrMemory(ctxt, "allocating atom"); + return(NULL); + } + memset(ret, 0, sizeof(xmlRegAtom)); + ret->type = type; + ret->quant = XML_REGEXP_QUANT_ONCE; + ret->min = 0; + ret->max = 0; + return(ret); +} + +/** + * xmlRegFreeAtom: + * @atom: the regexp atom + * + * Free a regexp atom + */ +static void +xmlRegFreeAtom(xmlRegAtomPtr atom) { + int i; + + if (atom == NULL) + return; + + for (i = 0;i < atom->nbRanges;i++) + xmlRegFreeRange(atom->ranges[i]); + if (atom->ranges != NULL) + xmlFree(atom->ranges); + if ((atom->type == XML_REGEXP_STRING) && (atom->valuep != NULL)) + xmlFree(atom->valuep); + if ((atom->type == XML_REGEXP_STRING) && (atom->valuep2 != NULL)) + xmlFree(atom->valuep2); + if ((atom->type == XML_REGEXP_BLOCK_NAME) && (atom->valuep != NULL)) + xmlFree(atom->valuep); + xmlFree(atom); +} + +/** + * xmlRegCopyAtom: + * @ctxt: the regexp parser context + * @atom: the oiginal atom + * + * Allocate a new regexp range + * + * Returns the new atom or NULL in case of error + */ +static xmlRegAtomPtr +xmlRegCopyAtom(xmlRegParserCtxtPtr ctxt, xmlRegAtomPtr atom) { + xmlRegAtomPtr ret; + + ret = (xmlRegAtomPtr) xmlMalloc(sizeof(xmlRegAtom)); + if (ret == NULL) { + xmlRegexpErrMemory(ctxt, "copying atom"); + return(NULL); + } + memset(ret, 0, sizeof(xmlRegAtom)); + ret->type = atom->type; + ret->quant = atom->quant; + ret->min = atom->min; + ret->max = atom->max; + if (atom->nbRanges > 0) { + int i; + + ret->ranges = (xmlRegRangePtr *) xmlMalloc(sizeof(xmlRegRangePtr) * + atom->nbRanges); + if (ret->ranges == NULL) { + xmlRegexpErrMemory(ctxt, "copying atom"); + goto error; + } + for (i = 0;i < atom->nbRanges;i++) { + ret->ranges[i] = xmlRegCopyRange(ctxt, atom->ranges[i]); + if (ret->ranges[i] == NULL) + goto error; + ret->nbRanges = i + 1; + } + } + return(ret); + +error: + xmlRegFreeAtom(ret); + return(NULL); +} + +static xmlRegStatePtr +xmlRegNewState(xmlRegParserCtxtPtr ctxt) { + xmlRegStatePtr ret; + + ret = (xmlRegStatePtr) xmlMalloc(sizeof(xmlRegState)); + if (ret == NULL) { + xmlRegexpErrMemory(ctxt, "allocating state"); + return(NULL); + } + memset(ret, 0, sizeof(xmlRegState)); + ret->type = XML_REGEXP_TRANS_STATE; + ret->mark = XML_REGEXP_MARK_NORMAL; + return(ret); +} + +/** + * xmlRegFreeState: + * @state: the regexp state + * + * Free a regexp state + */ +static void +xmlRegFreeState(xmlRegStatePtr state) { + if (state == NULL) + return; + + if (state->trans != NULL) + xmlFree(state->trans); + if (state->transTo != NULL) + xmlFree(state->transTo); + xmlFree(state); +} + +/** + * xmlRegFreeParserCtxt: + * @ctxt: the regexp parser context + * + * Free a regexp parser context + */ +static void +xmlRegFreeParserCtxt(xmlRegParserCtxtPtr ctxt) { + int i; + if (ctxt == NULL) + return; + + if (ctxt->string != NULL) + xmlFree(ctxt->string); + if (ctxt->states != NULL) { + for (i = 0;i < ctxt->nbStates;i++) + xmlRegFreeState(ctxt->states[i]); + xmlFree(ctxt->states); + } + if (ctxt->atoms != NULL) { + for (i = 0;i < ctxt->nbAtoms;i++) + xmlRegFreeAtom(ctxt->atoms[i]); + xmlFree(ctxt->atoms); + } + if (ctxt->counters != NULL) + xmlFree(ctxt->counters); + xmlFree(ctxt); +} + +/************************************************************************ + * * + * Display of Data structures * + * * + ************************************************************************/ + +static void +xmlRegPrintAtomType(FILE *output, xmlRegAtomType type) { + switch (type) { + case XML_REGEXP_EPSILON: + fprintf(output, "epsilon "); break; + case XML_REGEXP_CHARVAL: + fprintf(output, "charval "); break; + case XML_REGEXP_RANGES: + fprintf(output, "ranges "); break; + case XML_REGEXP_SUBREG: + fprintf(output, "subexpr "); break; + case XML_REGEXP_STRING: + fprintf(output, "string "); break; + case XML_REGEXP_ANYCHAR: + fprintf(output, "anychar "); break; + case XML_REGEXP_ANYSPACE: + fprintf(output, "anyspace "); break; + case XML_REGEXP_NOTSPACE: + fprintf(output, "notspace "); break; + case XML_REGEXP_INITNAME: + fprintf(output, "initname "); break; + case XML_REGEXP_NOTINITNAME: + fprintf(output, "notinitname "); break; + case XML_REGEXP_NAMECHAR: + fprintf(output, "namechar "); break; + case XML_REGEXP_NOTNAMECHAR: + fprintf(output, "notnamechar "); break; + case XML_REGEXP_DECIMAL: + fprintf(output, "decimal "); break; + case XML_REGEXP_NOTDECIMAL: + fprintf(output, "notdecimal "); break; + case XML_REGEXP_REALCHAR: + fprintf(output, "realchar "); break; + case XML_REGEXP_NOTREALCHAR: + fprintf(output, "notrealchar "); break; + case XML_REGEXP_LETTER: + fprintf(output, "LETTER "); break; + case XML_REGEXP_LETTER_UPPERCASE: + fprintf(output, "LETTER_UPPERCASE "); break; + case XML_REGEXP_LETTER_LOWERCASE: + fprintf(output, "LETTER_LOWERCASE "); break; + case XML_REGEXP_LETTER_TITLECASE: + fprintf(output, "LETTER_TITLECASE "); break; + case XML_REGEXP_LETTER_MODIFIER: + fprintf(output, "LETTER_MODIFIER "); break; + case XML_REGEXP_LETTER_OTHERS: + fprintf(output, "LETTER_OTHERS "); break; + case XML_REGEXP_MARK: + fprintf(output, "MARK "); break; + case XML_REGEXP_MARK_NONSPACING: + fprintf(output, "MARK_NONSPACING "); break; + case XML_REGEXP_MARK_SPACECOMBINING: + fprintf(output, "MARK_SPACECOMBINING "); break; + case XML_REGEXP_MARK_ENCLOSING: + fprintf(output, "MARK_ENCLOSING "); break; + case XML_REGEXP_NUMBER: + fprintf(output, "NUMBER "); break; + case XML_REGEXP_NUMBER_DECIMAL: + fprintf(output, "NUMBER_DECIMAL "); break; + case XML_REGEXP_NUMBER_LETTER: + fprintf(output, "NUMBER_LETTER "); break; + case XML_REGEXP_NUMBER_OTHERS: + fprintf(output, "NUMBER_OTHERS "); break; + case XML_REGEXP_PUNCT: + fprintf(output, "PUNCT "); break; + case XML_REGEXP_PUNCT_CONNECTOR: + fprintf(output, "PUNCT_CONNECTOR "); break; + case XML_REGEXP_PUNCT_DASH: + fprintf(output, "PUNCT_DASH "); break; + case XML_REGEXP_PUNCT_OPEN: + fprintf(output, "PUNCT_OPEN "); break; + case XML_REGEXP_PUNCT_CLOSE: + fprintf(output, "PUNCT_CLOSE "); break; + case XML_REGEXP_PUNCT_INITQUOTE: + fprintf(output, "PUNCT_INITQUOTE "); break; + case XML_REGEXP_PUNCT_FINQUOTE: + fprintf(output, "PUNCT_FINQUOTE "); break; + case XML_REGEXP_PUNCT_OTHERS: + fprintf(output, "PUNCT_OTHERS "); break; + case XML_REGEXP_SEPAR: + fprintf(output, "SEPAR "); break; + case XML_REGEXP_SEPAR_SPACE: + fprintf(output, "SEPAR_SPACE "); break; + case XML_REGEXP_SEPAR_LINE: + fprintf(output, "SEPAR_LINE "); break; + case XML_REGEXP_SEPAR_PARA: + fprintf(output, "SEPAR_PARA "); break; + case XML_REGEXP_SYMBOL: + fprintf(output, "SYMBOL "); break; + case XML_REGEXP_SYMBOL_MATH: + fprintf(output, "SYMBOL_MATH "); break; + case XML_REGEXP_SYMBOL_CURRENCY: + fprintf(output, "SYMBOL_CURRENCY "); break; + case XML_REGEXP_SYMBOL_MODIFIER: + fprintf(output, "SYMBOL_MODIFIER "); break; + case XML_REGEXP_SYMBOL_OTHERS: + fprintf(output, "SYMBOL_OTHERS "); break; + case XML_REGEXP_OTHER: + fprintf(output, "OTHER "); break; + case XML_REGEXP_OTHER_CONTROL: + fprintf(output, "OTHER_CONTROL "); break; + case XML_REGEXP_OTHER_FORMAT: + fprintf(output, "OTHER_FORMAT "); break; + case XML_REGEXP_OTHER_PRIVATE: + fprintf(output, "OTHER_PRIVATE "); break; + case XML_REGEXP_OTHER_NA: + fprintf(output, "OTHER_NA "); break; + case XML_REGEXP_BLOCK_NAME: + fprintf(output, "BLOCK "); break; + } +} + +static void +xmlRegPrintQuantType(FILE *output, xmlRegQuantType type) { + switch (type) { + case XML_REGEXP_QUANT_EPSILON: + fprintf(output, "epsilon "); break; + case XML_REGEXP_QUANT_ONCE: + fprintf(output, "once "); break; + case XML_REGEXP_QUANT_OPT: + fprintf(output, "? "); break; + case XML_REGEXP_QUANT_MULT: + fprintf(output, "* "); break; + case XML_REGEXP_QUANT_PLUS: + fprintf(output, "+ "); break; + case XML_REGEXP_QUANT_RANGE: + fprintf(output, "range "); break; + case XML_REGEXP_QUANT_ONCEONLY: + fprintf(output, "onceonly "); break; + case XML_REGEXP_QUANT_ALL: + fprintf(output, "all "); break; + } +} +static void +xmlRegPrintRange(FILE *output, xmlRegRangePtr range) { + fprintf(output, " range: "); + if (range->neg) + fprintf(output, "negative "); + xmlRegPrintAtomType(output, range->type); + fprintf(output, "%c - %c\n", range->start, range->end); +} + +static void +xmlRegPrintAtom(FILE *output, xmlRegAtomPtr atom) { + fprintf(output, " atom: "); + if (atom == NULL) { + fprintf(output, "NULL\n"); + return; + } + if (atom->neg) + fprintf(output, "not "); + xmlRegPrintAtomType(output, atom->type); + xmlRegPrintQuantType(output, atom->quant); + if (atom->quant == XML_REGEXP_QUANT_RANGE) + fprintf(output, "%d-%d ", atom->min, atom->max); + if (atom->type == XML_REGEXP_STRING) + fprintf(output, "'%s' ", (char *) atom->valuep); + if (atom->type == XML_REGEXP_CHARVAL) + fprintf(output, "char %c\n", atom->codepoint); + else if (atom->type == XML_REGEXP_RANGES) { + int i; + fprintf(output, "%d entries\n", atom->nbRanges); + for (i = 0; i < atom->nbRanges;i++) + xmlRegPrintRange(output, atom->ranges[i]); + } else if (atom->type == XML_REGEXP_SUBREG) { + fprintf(output, "start %d end %d\n", atom->start->no, atom->stop->no); + } else { + fprintf(output, "\n"); + } +} + +static void +xmlRegPrintTrans(FILE *output, xmlRegTransPtr trans) { + fprintf(output, " trans: "); + if (trans == NULL) { + fprintf(output, "NULL\n"); + return; + } + if (trans->to < 0) { + fprintf(output, "removed\n"); + return; + } + if (trans->nd != 0) { + if (trans->nd == 2) + fprintf(output, "last not determinist, "); + else + fprintf(output, "not determinist, "); + } + if (trans->counter >= 0) { + fprintf(output, "counted %d, ", trans->counter); + } + if (trans->count == REGEXP_ALL_COUNTER) { + fprintf(output, "all transition, "); + } else if (trans->count >= 0) { + fprintf(output, "count based %d, ", trans->count); + } + if (trans->atom == NULL) { + fprintf(output, "epsilon to %d\n", trans->to); + return; + } + if (trans->atom->type == XML_REGEXP_CHARVAL) + fprintf(output, "char %c ", trans->atom->codepoint); + fprintf(output, "atom %d, to %d\n", trans->atom->no, trans->to); +} + +static void +xmlRegPrintState(FILE *output, xmlRegStatePtr state) { + int i; + + fprintf(output, " state: "); + if (state == NULL) { + fprintf(output, "NULL\n"); + return; + } + if (state->type == XML_REGEXP_START_STATE) + fprintf(output, "START "); + if (state->type == XML_REGEXP_FINAL_STATE) + fprintf(output, "FINAL "); + + fprintf(output, "%d, %d transitions:\n", state->no, state->nbTrans); + for (i = 0;i < state->nbTrans; i++) { + xmlRegPrintTrans(output, &(state->trans[i])); + } +} + +#ifdef DEBUG_REGEXP_GRAPH +static void +xmlRegPrintCtxt(FILE *output, xmlRegParserCtxtPtr ctxt) { + int i; + + fprintf(output, " ctxt: "); + if (ctxt == NULL) { + fprintf(output, "NULL\n"); + return; + } + fprintf(output, "'%s' ", ctxt->string); + if (ctxt->error) + fprintf(output, "error "); + if (ctxt->neg) + fprintf(output, "neg "); + fprintf(output, "\n"); + fprintf(output, "%d atoms:\n", ctxt->nbAtoms); + for (i = 0;i < ctxt->nbAtoms; i++) { + fprintf(output, " %02d ", i); + xmlRegPrintAtom(output, ctxt->atoms[i]); + } + if (ctxt->atom != NULL) { + fprintf(output, "current atom:\n"); + xmlRegPrintAtom(output, ctxt->atom); + } + fprintf(output, "%d states:", ctxt->nbStates); + if (ctxt->start != NULL) + fprintf(output, " start: %d", ctxt->start->no); + if (ctxt->end != NULL) + fprintf(output, " end: %d", ctxt->end->no); + fprintf(output, "\n"); + for (i = 0;i < ctxt->nbStates; i++) { + xmlRegPrintState(output, ctxt->states[i]); + } + fprintf(output, "%d counters:\n", ctxt->nbCounters); + for (i = 0;i < ctxt->nbCounters; i++) { + fprintf(output, " %d: min %d max %d\n", i, ctxt->counters[i].min, + ctxt->counters[i].max); + } +} +#endif + +/************************************************************************ + * * + * Finite Automata structures manipulations * + * * + ************************************************************************/ + +static void +xmlRegAtomAddRange(xmlRegParserCtxtPtr ctxt, xmlRegAtomPtr atom, + int neg, xmlRegAtomType type, int start, int end, + xmlChar *blockName) { + xmlRegRangePtr range; + + if (atom == NULL) { + ERROR("add range: atom is NULL"); + return; + } + if (atom->type != XML_REGEXP_RANGES) { + ERROR("add range: atom is not ranges"); + return; + } + if (atom->maxRanges == 0) { + atom->maxRanges = 4; + atom->ranges = (xmlRegRangePtr *) xmlMalloc(atom->maxRanges * + sizeof(xmlRegRangePtr)); + if (atom->ranges == NULL) { + xmlRegexpErrMemory(ctxt, "adding ranges"); + atom->maxRanges = 0; + return; + } + } else if (atom->nbRanges >= atom->maxRanges) { + xmlRegRangePtr *tmp; + atom->maxRanges *= 2; + tmp = (xmlRegRangePtr *) xmlRealloc(atom->ranges, atom->maxRanges * + sizeof(xmlRegRangePtr)); + if (tmp == NULL) { + xmlRegexpErrMemory(ctxt, "adding ranges"); + atom->maxRanges /= 2; + return; + } + atom->ranges = tmp; + } + range = xmlRegNewRange(ctxt, neg, type, start, end); + if (range == NULL) + return; + range->blockName = blockName; + atom->ranges[atom->nbRanges++] = range; + +} + +static int +xmlRegGetCounter(xmlRegParserCtxtPtr ctxt) { + if (ctxt->maxCounters == 0) { + ctxt->maxCounters = 4; + ctxt->counters = (xmlRegCounter *) xmlMalloc(ctxt->maxCounters * + sizeof(xmlRegCounter)); + if (ctxt->counters == NULL) { + xmlRegexpErrMemory(ctxt, "allocating counter"); + ctxt->maxCounters = 0; + return(-1); + } + } else if (ctxt->nbCounters >= ctxt->maxCounters) { + xmlRegCounter *tmp; + ctxt->maxCounters *= 2; + tmp = (xmlRegCounter *) xmlRealloc(ctxt->counters, ctxt->maxCounters * + sizeof(xmlRegCounter)); + if (tmp == NULL) { + xmlRegexpErrMemory(ctxt, "allocating counter"); + ctxt->maxCounters /= 2; + return(-1); + } + ctxt->counters = tmp; + } + ctxt->counters[ctxt->nbCounters].min = -1; + ctxt->counters[ctxt->nbCounters].max = -1; + return(ctxt->nbCounters++); +} + +static int +xmlRegAtomPush(xmlRegParserCtxtPtr ctxt, xmlRegAtomPtr atom) { + if (atom == NULL) { + ERROR("atom push: atom is NULL"); + return(-1); + } + if (ctxt->maxAtoms == 0) { + ctxt->maxAtoms = 4; + ctxt->atoms = (xmlRegAtomPtr *) xmlMalloc(ctxt->maxAtoms * + sizeof(xmlRegAtomPtr)); + if (ctxt->atoms == NULL) { + xmlRegexpErrMemory(ctxt, "pushing atom"); + ctxt->maxAtoms = 0; + return(-1); + } + } else if (ctxt->nbAtoms >= ctxt->maxAtoms) { + xmlRegAtomPtr *tmp; + ctxt->maxAtoms *= 2; + tmp = (xmlRegAtomPtr *) xmlRealloc(ctxt->atoms, ctxt->maxAtoms * + sizeof(xmlRegAtomPtr)); + if (tmp == NULL) { + xmlRegexpErrMemory(ctxt, "allocating counter"); + ctxt->maxAtoms /= 2; + return(-1); + } + ctxt->atoms = tmp; + } + atom->no = ctxt->nbAtoms; + ctxt->atoms[ctxt->nbAtoms++] = atom; + return(0); +} + +static void +xmlRegStateAddTransTo(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr target, + int from) { + if (target->maxTransTo == 0) { + target->maxTransTo = 8; + target->transTo = (int *) xmlMalloc(target->maxTransTo * + sizeof(int)); + if (target->transTo == NULL) { + xmlRegexpErrMemory(ctxt, "adding transition"); + target->maxTransTo = 0; + return; + } + } else if (target->nbTransTo >= target->maxTransTo) { + int *tmp; + target->maxTransTo *= 2; + tmp = (int *) xmlRealloc(target->transTo, target->maxTransTo * + sizeof(int)); + if (tmp == NULL) { + xmlRegexpErrMemory(ctxt, "adding transition"); + target->maxTransTo /= 2; + return; + } + target->transTo = tmp; + } + target->transTo[target->nbTransTo] = from; + target->nbTransTo++; +} + +static void +xmlRegStateAddTrans(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr state, + xmlRegAtomPtr atom, xmlRegStatePtr target, + int counter, int count) { + + int nrtrans; + + if (state == NULL) { + ERROR("add state: state is NULL"); + return; + } + if (target == NULL) { + ERROR("add state: target is NULL"); + return; + } + /* + * Other routines follow the philosophy 'When in doubt, add a transition' + * so we check here whether such a transition is already present and, if + * so, silently ignore this request. + */ + + for (nrtrans = state->nbTrans - 1; nrtrans >= 0; nrtrans--) { + xmlRegTransPtr trans = &(state->trans[nrtrans]); + if ((trans->atom == atom) && + (trans->to == target->no) && + (trans->counter == counter) && + (trans->count == count)) { +#ifdef DEBUG_REGEXP_GRAPH + printf("Ignoring duplicate transition from %d to %d\n", + state->no, target->no); +#endif + return; + } + } + + if (state->maxTrans == 0) { + state->maxTrans = 8; + state->trans = (xmlRegTrans *) xmlMalloc(state->maxTrans * + sizeof(xmlRegTrans)); + if (state->trans == NULL) { + xmlRegexpErrMemory(ctxt, "adding transition"); + state->maxTrans = 0; + return; + } + } else if (state->nbTrans >= state->maxTrans) { + xmlRegTrans *tmp; + state->maxTrans *= 2; + tmp = (xmlRegTrans *) xmlRealloc(state->trans, state->maxTrans * + sizeof(xmlRegTrans)); + if (tmp == NULL) { + xmlRegexpErrMemory(ctxt, "adding transition"); + state->maxTrans /= 2; + return; + } + state->trans = tmp; + } +#ifdef DEBUG_REGEXP_GRAPH + printf("Add trans from %d to %d ", state->no, target->no); + if (count == REGEXP_ALL_COUNTER) + printf("all transition\n"); + else if (count >= 0) + printf("count based %d\n", count); + else if (counter >= 0) + printf("counted %d\n", counter); + else if (atom == NULL) + printf("epsilon transition\n"); + else if (atom != NULL) + xmlRegPrintAtom(stdout, atom); +#endif + + state->trans[state->nbTrans].atom = atom; + state->trans[state->nbTrans].to = target->no; + state->trans[state->nbTrans].counter = counter; + state->trans[state->nbTrans].count = count; + state->trans[state->nbTrans].nd = 0; + state->nbTrans++; + xmlRegStateAddTransTo(ctxt, target, state->no); +} + +static int +xmlRegStatePush(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr state) { + if (state == NULL) return(-1); + if (ctxt->maxStates == 0) { + ctxt->maxStates = 4; + ctxt->states = (xmlRegStatePtr *) xmlMalloc(ctxt->maxStates * + sizeof(xmlRegStatePtr)); + if (ctxt->states == NULL) { + xmlRegexpErrMemory(ctxt, "adding state"); + ctxt->maxStates = 0; + return(-1); + } + } else if (ctxt->nbStates >= ctxt->maxStates) { + xmlRegStatePtr *tmp; + ctxt->maxStates *= 2; + tmp = (xmlRegStatePtr *) xmlRealloc(ctxt->states, ctxt->maxStates * + sizeof(xmlRegStatePtr)); + if (tmp == NULL) { + xmlRegexpErrMemory(ctxt, "adding state"); + ctxt->maxStates /= 2; + return(-1); + } + ctxt->states = tmp; + } + state->no = ctxt->nbStates; + ctxt->states[ctxt->nbStates++] = state; + return(0); +} + +/** + * xmlFAGenerateAllTransition: + * @ctxt: a regexp parser context + * @from: the from state + * @to: the target state or NULL for building a new one + * @lax: + * + */ +static void +xmlFAGenerateAllTransition(xmlRegParserCtxtPtr ctxt, + xmlRegStatePtr from, xmlRegStatePtr to, + int lax) { + if (to == NULL) { + to = xmlRegNewState(ctxt); + xmlRegStatePush(ctxt, to); + ctxt->state = to; + } + if (lax) + xmlRegStateAddTrans(ctxt, from, NULL, to, -1, REGEXP_ALL_LAX_COUNTER); + else + xmlRegStateAddTrans(ctxt, from, NULL, to, -1, REGEXP_ALL_COUNTER); +} + +/** + * xmlFAGenerateEpsilonTransition: + * @ctxt: a regexp parser context + * @from: the from state + * @to: the target state or NULL for building a new one + * + */ +static void +xmlFAGenerateEpsilonTransition(xmlRegParserCtxtPtr ctxt, + xmlRegStatePtr from, xmlRegStatePtr to) { + if (to == NULL) { + to = xmlRegNewState(ctxt); + xmlRegStatePush(ctxt, to); + ctxt->state = to; + } + xmlRegStateAddTrans(ctxt, from, NULL, to, -1, -1); +} + +/** + * xmlFAGenerateCountedEpsilonTransition: + * @ctxt: a regexp parser context + * @from: the from state + * @to: the target state or NULL for building a new one + * counter: the counter for that transition + * + */ +static void +xmlFAGenerateCountedEpsilonTransition(xmlRegParserCtxtPtr ctxt, + xmlRegStatePtr from, xmlRegStatePtr to, int counter) { + if (to == NULL) { + to = xmlRegNewState(ctxt); + xmlRegStatePush(ctxt, to); + ctxt->state = to; + } + xmlRegStateAddTrans(ctxt, from, NULL, to, counter, -1); +} + +/** + * xmlFAGenerateCountedTransition: + * @ctxt: a regexp parser context + * @from: the from state + * @to: the target state or NULL for building a new one + * counter: the counter for that transition + * + */ +static void +xmlFAGenerateCountedTransition(xmlRegParserCtxtPtr ctxt, + xmlRegStatePtr from, xmlRegStatePtr to, int counter) { + if (to == NULL) { + to = xmlRegNewState(ctxt); + xmlRegStatePush(ctxt, to); + ctxt->state = to; + } + xmlRegStateAddTrans(ctxt, from, NULL, to, -1, counter); +} + +/** + * xmlFAGenerateTransitions: + * @ctxt: a regexp parser context + * @from: the from state + * @to: the target state or NULL for building a new one + * @atom: the atom generating the transition + * + * Returns 0 if success and -1 in case of error. + */ +static int +xmlFAGenerateTransitions(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr from, + xmlRegStatePtr to, xmlRegAtomPtr atom) { + xmlRegStatePtr end; + + if (atom == NULL) { + ERROR("genrate transition: atom == NULL"); + return(-1); + } + if (atom->type == XML_REGEXP_SUBREG) { + /* + * this is a subexpression handling one should not need to + * create a new node except for XML_REGEXP_QUANT_RANGE. + */ + if (xmlRegAtomPush(ctxt, atom) < 0) { + return(-1); + } + if ((to != NULL) && (atom->stop != to) && + (atom->quant != XML_REGEXP_QUANT_RANGE)) { + /* + * Generate an epsilon transition to link to the target + */ + xmlFAGenerateEpsilonTransition(ctxt, atom->stop, to); +#ifdef DV + } else if ((to == NULL) && (atom->quant != XML_REGEXP_QUANT_RANGE) && + (atom->quant != XML_REGEXP_QUANT_ONCE)) { + to = xmlRegNewState(ctxt); + xmlRegStatePush(ctxt, to); + ctxt->state = to; + xmlFAGenerateEpsilonTransition(ctxt, atom->stop, to); +#endif + } + switch (atom->quant) { + case XML_REGEXP_QUANT_OPT: + atom->quant = XML_REGEXP_QUANT_ONCE; + /* + * transition done to the state after end of atom. + * 1. set transition from atom start to new state + * 2. set transition from atom end to this state. + */ + if (to == NULL) { + xmlFAGenerateEpsilonTransition(ctxt, atom->start, 0); + xmlFAGenerateEpsilonTransition(ctxt, atom->stop, + ctxt->state); + } else { + xmlFAGenerateEpsilonTransition(ctxt, atom->start, to); + } + break; + case XML_REGEXP_QUANT_MULT: + atom->quant = XML_REGEXP_QUANT_ONCE; + xmlFAGenerateEpsilonTransition(ctxt, atom->start, atom->stop); + xmlFAGenerateEpsilonTransition(ctxt, atom->stop, atom->start); + break; + case XML_REGEXP_QUANT_PLUS: + atom->quant = XML_REGEXP_QUANT_ONCE; + xmlFAGenerateEpsilonTransition(ctxt, atom->stop, atom->start); + break; + case XML_REGEXP_QUANT_RANGE: { + int counter; + xmlRegStatePtr inter, newstate; + + /* + * create the final state now if needed + */ + if (to != NULL) { + newstate = to; + } else { + newstate = xmlRegNewState(ctxt); + xmlRegStatePush(ctxt, newstate); + } + + /* + * The principle here is to use counted transition + * to avoid explosion in the number of states in the + * graph. This is clearly more complex but should not + * be exploitable at runtime. + */ + if ((atom->min == 0) && (atom->start0 == NULL)) { + xmlRegAtomPtr copy; + /* + * duplicate a transition based on atom to count next + * occurences after 1. We cannot loop to atom->start + * directly because we need an epsilon transition to + * newstate. + */ + /* ???? For some reason it seems we never reach that + case, I suppose this got optimized out before when + building the automata */ + copy = xmlRegCopyAtom(ctxt, atom); + if (copy == NULL) + return(-1); + copy->quant = XML_REGEXP_QUANT_ONCE; + copy->min = 0; + copy->max = 0; + + if (xmlFAGenerateTransitions(ctxt, atom->start, NULL, copy) + < 0) + return(-1); + inter = ctxt->state; + counter = xmlRegGetCounter(ctxt); + ctxt->counters[counter].min = atom->min - 1; + ctxt->counters[counter].max = atom->max - 1; + /* count the number of times we see it again */ + xmlFAGenerateCountedEpsilonTransition(ctxt, inter, + atom->stop, counter); + /* allow a way out based on the count */ + xmlFAGenerateCountedTransition(ctxt, inter, + newstate, counter); + /* and also allow a direct exit for 0 */ + xmlFAGenerateEpsilonTransition(ctxt, atom->start, + newstate); + } else { + /* + * either we need the atom at least once or there + * is an atom->start0 allowing to easilly plug the + * epsilon transition. + */ + counter = xmlRegGetCounter(ctxt); + ctxt->counters[counter].min = atom->min - 1; + ctxt->counters[counter].max = atom->max - 1; + /* count the number of times we see it again */ + xmlFAGenerateCountedEpsilonTransition(ctxt, atom->stop, + atom->start, counter); + /* allow a way out based on the count */ + xmlFAGenerateCountedTransition(ctxt, atom->stop, + newstate, counter); + /* and if needed allow a direct exit for 0 */ + if (atom->min == 0) + xmlFAGenerateEpsilonTransition(ctxt, atom->start0, + newstate); + + } + atom->min = 0; + atom->max = 0; + atom->quant = XML_REGEXP_QUANT_ONCE; + ctxt->state = newstate; + } + default: + break; + } + return(0); + } + if ((atom->min == 0) && (atom->max == 0) && + (atom->quant == XML_REGEXP_QUANT_RANGE)) { + /* + * we can discard the atom and generate an epsilon transition instead + */ + if (to == NULL) { + to = xmlRegNewState(ctxt); + if (to != NULL) + xmlRegStatePush(ctxt, to); + else { + return(-1); + } + } + xmlFAGenerateEpsilonTransition(ctxt, from, to); + ctxt->state = to; + xmlRegFreeAtom(atom); + return(0); + } + if (to == NULL) { + to = xmlRegNewState(ctxt); + if (to != NULL) + xmlRegStatePush(ctxt, to); + else { + return(-1); + } + } + end = to; + if ((atom->quant == XML_REGEXP_QUANT_MULT) || + (atom->quant == XML_REGEXP_QUANT_PLUS)) { + /* + * Do not pollute the target state by adding transitions from + * it as it is likely to be the shared target of multiple branches. + * So isolate with an epsilon transition. + */ + xmlRegStatePtr tmp; + + tmp = xmlRegNewState(ctxt); + if (tmp != NULL) + xmlRegStatePush(ctxt, tmp); + else { + return(-1); + } + xmlFAGenerateEpsilonTransition(ctxt, tmp, to); + to = tmp; + } + if (xmlRegAtomPush(ctxt, atom) < 0) { + return(-1); + } + xmlRegStateAddTrans(ctxt, from, atom, to, -1, -1); + ctxt->state = end; + switch (atom->quant) { + case XML_REGEXP_QUANT_OPT: + atom->quant = XML_REGEXP_QUANT_ONCE; + xmlFAGenerateEpsilonTransition(ctxt, from, to); + break; + case XML_REGEXP_QUANT_MULT: + atom->quant = XML_REGEXP_QUANT_ONCE; + xmlFAGenerateEpsilonTransition(ctxt, from, to); + xmlRegStateAddTrans(ctxt, to, atom, to, -1, -1); + break; + case XML_REGEXP_QUANT_PLUS: + atom->quant = XML_REGEXP_QUANT_ONCE; + xmlRegStateAddTrans(ctxt, to, atom, to, -1, -1); + break; + case XML_REGEXP_QUANT_RANGE: +#if DV_test + if (atom->min == 0) { + xmlFAGenerateEpsilonTransition(ctxt, from, to); + } +#endif + break; + default: + break; + } + return(0); +} + +/** + * xmlFAReduceEpsilonTransitions: + * @ctxt: a regexp parser context + * @fromnr: the from state + * @tonr: the to state + * @counter: should that transition be associated to a counted + * + */ +static void +xmlFAReduceEpsilonTransitions(xmlRegParserCtxtPtr ctxt, int fromnr, + int tonr, int counter) { + int transnr; + xmlRegStatePtr from; + xmlRegStatePtr to; + +#ifdef DEBUG_REGEXP_GRAPH + printf("xmlFAReduceEpsilonTransitions(%d, %d)\n", fromnr, tonr); +#endif + from = ctxt->states[fromnr]; + if (from == NULL) + return; + to = ctxt->states[tonr]; + if (to == NULL) + return; + if ((to->mark == XML_REGEXP_MARK_START) || + (to->mark == XML_REGEXP_MARK_VISITED)) + return; + + to->mark = XML_REGEXP_MARK_VISITED; + if (to->type == XML_REGEXP_FINAL_STATE) { +#ifdef DEBUG_REGEXP_GRAPH + printf("State %d is final, so %d becomes final\n", tonr, fromnr); +#endif + from->type = XML_REGEXP_FINAL_STATE; + } + for (transnr = 0;transnr < to->nbTrans;transnr++) { + if (to->trans[transnr].to < 0) + continue; + if (to->trans[transnr].atom == NULL) { + /* + * Don't remove counted transitions + * Don't loop either + */ + if (to->trans[transnr].to != fromnr) { + if (to->trans[transnr].count >= 0) { + int newto = to->trans[transnr].to; + + xmlRegStateAddTrans(ctxt, from, NULL, + ctxt->states[newto], + -1, to->trans[transnr].count); + } else { +#ifdef DEBUG_REGEXP_GRAPH + printf("Found epsilon trans %d from %d to %d\n", + transnr, tonr, to->trans[transnr].to); +#endif + if (to->trans[transnr].counter >= 0) { + xmlFAReduceEpsilonTransitions(ctxt, fromnr, + to->trans[transnr].to, + to->trans[transnr].counter); + } else { + xmlFAReduceEpsilonTransitions(ctxt, fromnr, + to->trans[transnr].to, + counter); + } + } + } + } else { + int newto = to->trans[transnr].to; + + if (to->trans[transnr].counter >= 0) { + xmlRegStateAddTrans(ctxt, from, to->trans[transnr].atom, + ctxt->states[newto], + to->trans[transnr].counter, -1); + } else { + xmlRegStateAddTrans(ctxt, from, to->trans[transnr].atom, + ctxt->states[newto], counter, -1); + } + } + } + to->mark = XML_REGEXP_MARK_NORMAL; +} + +/** + * xmlFAEliminateSimpleEpsilonTransitions: + * @ctxt: a regexp parser context + * + * Eliminating general epsilon transitions can get costly in the general + * algorithm due to the large amount of generated new transitions and + * associated comparisons. However for simple epsilon transition used just + * to separate building blocks when generating the automata this can be + * reduced to state elimination: + * - if there exists an epsilon from X to Y + * - if there is no other transition from X + * then X and Y are semantically equivalent and X can be eliminated + * If X is the start state then make Y the start state, else replace the + * target of all transitions to X by transitions to Y. + */ +static void +xmlFAEliminateSimpleEpsilonTransitions(xmlRegParserCtxtPtr ctxt) { + int statenr, i, j, newto; + xmlRegStatePtr state, tmp; + + for (statenr = 0;statenr < ctxt->nbStates;statenr++) { + state = ctxt->states[statenr]; + if (state == NULL) + continue; + if (state->nbTrans != 1) + continue; + if (state->type == XML_REGEXP_UNREACH_STATE) + continue; + /* is the only transition out a basic transition */ + if ((state->trans[0].atom == NULL) && + (state->trans[0].to >= 0) && + (state->trans[0].to != statenr) && + (state->trans[0].counter < 0) && + (state->trans[0].count < 0)) { + newto = state->trans[0].to; + + if (state->type == XML_REGEXP_START_STATE) { +#ifdef DEBUG_REGEXP_GRAPH + printf("Found simple epsilon trans from start %d to %d\n", + statenr, newto); +#endif + } else { +#ifdef DEBUG_REGEXP_GRAPH + printf("Found simple epsilon trans from %d to %d\n", + statenr, newto); +#endif + for (i = 0;i < state->nbTransTo;i++) { + tmp = ctxt->states[state->transTo[i]]; + for (j = 0;j < tmp->nbTrans;j++) { + if (tmp->trans[j].to == statenr) { +#ifdef DEBUG_REGEXP_GRAPH + printf("Changed transition %d on %d to go to %d\n", + j, tmp->no, newto); +#endif + tmp->trans[j].to = -1; + xmlRegStateAddTrans(ctxt, tmp, tmp->trans[j].atom, + ctxt->states[newto], + tmp->trans[j].counter, + tmp->trans[j].count); + } + } + } + if (state->type == XML_REGEXP_FINAL_STATE) + ctxt->states[newto]->type = XML_REGEXP_FINAL_STATE; + /* eliminate the transition completely */ + state->nbTrans = 0; + + state->type = XML_REGEXP_UNREACH_STATE; + + } + + } + } +} +/** + * xmlFAEliminateEpsilonTransitions: + * @ctxt: a regexp parser context + * + */ +static void +xmlFAEliminateEpsilonTransitions(xmlRegParserCtxtPtr ctxt) { + int statenr, transnr; + xmlRegStatePtr state; + int has_epsilon; + + if (ctxt->states == NULL) return; + + /* + * Eliminate simple epsilon transition and the associated unreachable + * states. + */ + xmlFAEliminateSimpleEpsilonTransitions(ctxt); + for (statenr = 0;statenr < ctxt->nbStates;statenr++) { + state = ctxt->states[statenr]; + if ((state != NULL) && (state->type == XML_REGEXP_UNREACH_STATE)) { +#ifdef DEBUG_REGEXP_GRAPH + printf("Removed unreachable state %d\n", statenr); +#endif + xmlRegFreeState(state); + ctxt->states[statenr] = NULL; + } + } + + has_epsilon = 0; + + /* + * Build the completed transitions bypassing the epsilons + * Use a marking algorithm to avoid loops + * Mark sink states too. + * Process from the latests states backward to the start when + * there is long cascading epsilon chains this minimize the + * recursions and transition compares when adding the new ones + */ + for (statenr = ctxt->nbStates - 1;statenr >= 0;statenr--) { + state = ctxt->states[statenr]; + if (state == NULL) + continue; + if ((state->nbTrans == 0) && + (state->type != XML_REGEXP_FINAL_STATE)) { + state->type = XML_REGEXP_SINK_STATE; + } + for (transnr = 0;transnr < state->nbTrans;transnr++) { + if ((state->trans[transnr].atom == NULL) && + (state->trans[transnr].to >= 0)) { + if (state->trans[transnr].to == statenr) { + state->trans[transnr].to = -1; +#ifdef DEBUG_REGEXP_GRAPH + printf("Removed loopback epsilon trans %d on %d\n", + transnr, statenr); +#endif + } else if (state->trans[transnr].count < 0) { + int newto = state->trans[transnr].to; + +#ifdef DEBUG_REGEXP_GRAPH + printf("Found epsilon trans %d from %d to %d\n", + transnr, statenr, newto); +#endif + has_epsilon = 1; + state->trans[transnr].to = -2; + state->mark = XML_REGEXP_MARK_START; + xmlFAReduceEpsilonTransitions(ctxt, statenr, + newto, state->trans[transnr].counter); + state->mark = XML_REGEXP_MARK_NORMAL; +#ifdef DEBUG_REGEXP_GRAPH + } else { + printf("Found counted transition %d on %d\n", + transnr, statenr); +#endif + } + } + } + } + /* + * Eliminate the epsilon transitions + */ + if (has_epsilon) { + for (statenr = 0;statenr < ctxt->nbStates;statenr++) { + state = ctxt->states[statenr]; + if (state == NULL) + continue; + for (transnr = 0;transnr < state->nbTrans;transnr++) { + xmlRegTransPtr trans = &(state->trans[transnr]); + if ((trans->atom == NULL) && + (trans->count < 0) && + (trans->to >= 0)) { + trans->to = -1; + } + } + } + } + + /* + * Use this pass to detect unreachable states too + */ + for (statenr = 0;statenr < ctxt->nbStates;statenr++) { + state = ctxt->states[statenr]; + if (state != NULL) + state->reached = XML_REGEXP_MARK_NORMAL; + } + state = ctxt->states[0]; + if (state != NULL) + state->reached = XML_REGEXP_MARK_START; + while (state != NULL) { + xmlRegStatePtr target = NULL; + state->reached = XML_REGEXP_MARK_VISITED; + /* + * Mark all states reachable from the current reachable state + */ + for (transnr = 0;transnr < state->nbTrans;transnr++) { + if ((state->trans[transnr].to >= 0) && + ((state->trans[transnr].atom != NULL) || + (state->trans[transnr].count >= 0))) { + int newto = state->trans[transnr].to; + + if (ctxt->states[newto] == NULL) + continue; + if (ctxt->states[newto]->reached == XML_REGEXP_MARK_NORMAL) { + ctxt->states[newto]->reached = XML_REGEXP_MARK_START; + target = ctxt->states[newto]; + } + } + } + + /* + * find the next accessible state not explored + */ + if (target == NULL) { + for (statenr = 1;statenr < ctxt->nbStates;statenr++) { + state = ctxt->states[statenr]; + if ((state != NULL) && (state->reached == + XML_REGEXP_MARK_START)) { + target = state; + break; + } + } + } + state = target; + } + for (statenr = 0;statenr < ctxt->nbStates;statenr++) { + state = ctxt->states[statenr]; + if ((state != NULL) && (state->reached == XML_REGEXP_MARK_NORMAL)) { +#ifdef DEBUG_REGEXP_GRAPH + printf("Removed unreachable state %d\n", statenr); +#endif + xmlRegFreeState(state); + ctxt->states[statenr] = NULL; + } + } + +} + +static int +xmlFACompareRanges(xmlRegRangePtr range1, xmlRegRangePtr range2) { + int ret = 0; + + if ((range1->type == XML_REGEXP_RANGES) || + (range2->type == XML_REGEXP_RANGES) || + (range2->type == XML_REGEXP_SUBREG) || + (range1->type == XML_REGEXP_SUBREG) || + (range1->type == XML_REGEXP_STRING) || + (range2->type == XML_REGEXP_STRING)) + return(-1); + + /* put them in order */ + if (range1->type > range2->type) { + xmlRegRangePtr tmp; + + tmp = range1; + range1 = range2; + range2 = tmp; + } + if ((range1->type == XML_REGEXP_ANYCHAR) || + (range2->type == XML_REGEXP_ANYCHAR)) { + ret = 1; + } else if ((range1->type == XML_REGEXP_EPSILON) || + (range2->type == XML_REGEXP_EPSILON)) { + return(0); + } else if (range1->type == range2->type) { + if (range1->type != XML_REGEXP_CHARVAL) + ret = 1; + else if ((range1->end < range2->start) || + (range2->end < range1->start)) + ret = 0; + else + ret = 1; + } else if (range1->type == XML_REGEXP_CHARVAL) { + int codepoint; + int neg = 0; + + /* + * just check all codepoints in the range for acceptance, + * this is usually way cheaper since done only once at + * compilation than testing over and over at runtime or + * pushing too many states when evaluating. + */ + if (((range1->neg == 0) && (range2->neg != 0)) || + ((range1->neg != 0) && (range2->neg == 0))) + neg = 1; + + for (codepoint = range1->start;codepoint <= range1->end ;codepoint++) { + ret = xmlRegCheckCharacterRange(range2->type, codepoint, + 0, range2->start, range2->end, + range2->blockName); + if (ret < 0) + return(-1); + if (((neg == 1) && (ret == 0)) || + ((neg == 0) && (ret == 1))) + return(1); + } + return(0); + } else if ((range1->type == XML_REGEXP_BLOCK_NAME) || + (range2->type == XML_REGEXP_BLOCK_NAME)) { + if (range1->type == range2->type) { + ret = xmlStrEqual(range1->blockName, range2->blockName); + } else { + /* + * comparing a block range with anything else is way + * too costly, and maintining the table is like too much + * memory too, so let's force the automata to save state + * here. + */ + return(1); + } + } else if ((range1->type < XML_REGEXP_LETTER) || + (range2->type < XML_REGEXP_LETTER)) { + if ((range1->type == XML_REGEXP_ANYSPACE) && + (range2->type == XML_REGEXP_NOTSPACE)) + ret = 0; + else if ((range1->type == XML_REGEXP_INITNAME) && + (range2->type == XML_REGEXP_NOTINITNAME)) + ret = 0; + else if ((range1->type == XML_REGEXP_NAMECHAR) && + (range2->type == XML_REGEXP_NOTNAMECHAR)) + ret = 0; + else if ((range1->type == XML_REGEXP_DECIMAL) && + (range2->type == XML_REGEXP_NOTDECIMAL)) + ret = 0; + else if ((range1->type == XML_REGEXP_REALCHAR) && + (range2->type == XML_REGEXP_NOTREALCHAR)) + ret = 0; + else { + /* same thing to limit complexity */ + return(1); + } + } else { + ret = 0; + /* range1->type < range2->type here */ + switch (range1->type) { + case XML_REGEXP_LETTER: + /* all disjoint except in the subgroups */ + if ((range2->type == XML_REGEXP_LETTER_UPPERCASE) || + (range2->type == XML_REGEXP_LETTER_LOWERCASE) || + (range2->type == XML_REGEXP_LETTER_TITLECASE) || + (range2->type == XML_REGEXP_LETTER_MODIFIER) || + (range2->type == XML_REGEXP_LETTER_OTHERS)) + ret = 1; + break; + case XML_REGEXP_MARK: + if ((range2->type == XML_REGEXP_MARK_NONSPACING) || + (range2->type == XML_REGEXP_MARK_SPACECOMBINING) || + (range2->type == XML_REGEXP_MARK_ENCLOSING)) + ret = 1; + break; + case XML_REGEXP_NUMBER: + if ((range2->type == XML_REGEXP_NUMBER_DECIMAL) || + (range2->type == XML_REGEXP_NUMBER_LETTER) || + (range2->type == XML_REGEXP_NUMBER_OTHERS)) + ret = 1; + break; + case XML_REGEXP_PUNCT: + if ((range2->type == XML_REGEXP_PUNCT_CONNECTOR) || + (range2->type == XML_REGEXP_PUNCT_DASH) || + (range2->type == XML_REGEXP_PUNCT_OPEN) || + (range2->type == XML_REGEXP_PUNCT_CLOSE) || + (range2->type == XML_REGEXP_PUNCT_INITQUOTE) || + (range2->type == XML_REGEXP_PUNCT_FINQUOTE) || + (range2->type == XML_REGEXP_PUNCT_OTHERS)) + ret = 1; + break; + case XML_REGEXP_SEPAR: + if ((range2->type == XML_REGEXP_SEPAR_SPACE) || + (range2->type == XML_REGEXP_SEPAR_LINE) || + (range2->type == XML_REGEXP_SEPAR_PARA)) + ret = 1; + break; + case XML_REGEXP_SYMBOL: + if ((range2->type == XML_REGEXP_SYMBOL_MATH) || + (range2->type == XML_REGEXP_SYMBOL_CURRENCY) || + (range2->type == XML_REGEXP_SYMBOL_MODIFIER) || + (range2->type == XML_REGEXP_SYMBOL_OTHERS)) + ret = 1; + break; + case XML_REGEXP_OTHER: + if ((range2->type == XML_REGEXP_OTHER_CONTROL) || + (range2->type == XML_REGEXP_OTHER_FORMAT) || + (range2->type == XML_REGEXP_OTHER_PRIVATE)) + ret = 1; + break; + default: + if ((range2->type >= XML_REGEXP_LETTER) && + (range2->type < XML_REGEXP_BLOCK_NAME)) + ret = 0; + else { + /* safety net ! */ + return(1); + } + } + } + if (((range1->neg == 0) && (range2->neg != 0)) || + ((range1->neg != 0) && (range2->neg == 0))) + ret = !ret; + return(ret); +} + +/** + * xmlFACompareAtomTypes: + * @type1: an atom type + * @type2: an atom type + * + * Compares two atoms type to check whether they intersect in some ways, + * this is used by xmlFACompareAtoms only + * + * Returns 1 if they may intersect and 0 otherwise + */ +static int +xmlFACompareAtomTypes(xmlRegAtomType type1, xmlRegAtomType type2) { + if ((type1 == XML_REGEXP_EPSILON) || + (type1 == XML_REGEXP_CHARVAL) || + (type1 == XML_REGEXP_RANGES) || + (type1 == XML_REGEXP_SUBREG) || + (type1 == XML_REGEXP_STRING) || + (type1 == XML_REGEXP_ANYCHAR)) + return(1); + if ((type2 == XML_REGEXP_EPSILON) || + (type2 == XML_REGEXP_CHARVAL) || + (type2 == XML_REGEXP_RANGES) || + (type2 == XML_REGEXP_SUBREG) || + (type2 == XML_REGEXP_STRING) || + (type2 == XML_REGEXP_ANYCHAR)) + return(1); + + if (type1 == type2) return(1); + + /* simplify subsequent compares by making sure type1 < type2 */ + if (type1 > type2) { + xmlRegAtomType tmp = type1; + type1 = type2; + type2 = tmp; + } + switch (type1) { + case XML_REGEXP_ANYSPACE: /* \s */ + /* can't be a letter, number, mark, pontuation, symbol */ + if ((type2 == XML_REGEXP_NOTSPACE) || + ((type2 >= XML_REGEXP_LETTER) && + (type2 <= XML_REGEXP_LETTER_OTHERS)) || + ((type2 >= XML_REGEXP_NUMBER) && + (type2 <= XML_REGEXP_NUMBER_OTHERS)) || + ((type2 >= XML_REGEXP_MARK) && + (type2 <= XML_REGEXP_MARK_ENCLOSING)) || + ((type2 >= XML_REGEXP_PUNCT) && + (type2 <= XML_REGEXP_PUNCT_OTHERS)) || + ((type2 >= XML_REGEXP_SYMBOL) && + (type2 <= XML_REGEXP_SYMBOL_OTHERS)) + ) return(0); + break; + case XML_REGEXP_NOTSPACE: /* \S */ + break; + case XML_REGEXP_INITNAME: /* \l */ + /* can't be a number, mark, separator, pontuation, symbol or other */ + if ((type2 == XML_REGEXP_NOTINITNAME) || + ((type2 >= XML_REGEXP_NUMBER) && + (type2 <= XML_REGEXP_NUMBER_OTHERS)) || + ((type2 >= XML_REGEXP_MARK) && + (type2 <= XML_REGEXP_MARK_ENCLOSING)) || + ((type2 >= XML_REGEXP_SEPAR) && + (type2 <= XML_REGEXP_SEPAR_PARA)) || + ((type2 >= XML_REGEXP_PUNCT) && + (type2 <= XML_REGEXP_PUNCT_OTHERS)) || + ((type2 >= XML_REGEXP_SYMBOL) && + (type2 <= XML_REGEXP_SYMBOL_OTHERS)) || + ((type2 >= XML_REGEXP_OTHER) && + (type2 <= XML_REGEXP_OTHER_NA)) + ) return(0); + break; + case XML_REGEXP_NOTINITNAME: /* \L */ + break; + case XML_REGEXP_NAMECHAR: /* \c */ + /* can't be a mark, separator, pontuation, symbol or other */ + if ((type2 == XML_REGEXP_NOTNAMECHAR) || + ((type2 >= XML_REGEXP_MARK) && + (type2 <= XML_REGEXP_MARK_ENCLOSING)) || + ((type2 >= XML_REGEXP_PUNCT) && + (type2 <= XML_REGEXP_PUNCT_OTHERS)) || + ((type2 >= XML_REGEXP_SEPAR) && + (type2 <= XML_REGEXP_SEPAR_PARA)) || + ((type2 >= XML_REGEXP_SYMBOL) && + (type2 <= XML_REGEXP_SYMBOL_OTHERS)) || + ((type2 >= XML_REGEXP_OTHER) && + (type2 <= XML_REGEXP_OTHER_NA)) + ) return(0); + break; + case XML_REGEXP_NOTNAMECHAR: /* \C */ + break; + case XML_REGEXP_DECIMAL: /* \d */ + /* can't be a letter, mark, separator, pontuation, symbol or other */ + if ((type2 == XML_REGEXP_NOTDECIMAL) || + (type2 == XML_REGEXP_REALCHAR) || + ((type2 >= XML_REGEXP_LETTER) && + (type2 <= XML_REGEXP_LETTER_OTHERS)) || + ((type2 >= XML_REGEXP_MARK) && + (type2 <= XML_REGEXP_MARK_ENCLOSING)) || + ((type2 >= XML_REGEXP_PUNCT) && + (type2 <= XML_REGEXP_PUNCT_OTHERS)) || + ((type2 >= XML_REGEXP_SEPAR) && + (type2 <= XML_REGEXP_SEPAR_PARA)) || + ((type2 >= XML_REGEXP_SYMBOL) && + (type2 <= XML_REGEXP_SYMBOL_OTHERS)) || + ((type2 >= XML_REGEXP_OTHER) && + (type2 <= XML_REGEXP_OTHER_NA)) + )return(0); + break; + case XML_REGEXP_NOTDECIMAL: /* \D */ + break; + case XML_REGEXP_REALCHAR: /* \w */ + /* can't be a mark, separator, pontuation, symbol or other */ + if ((type2 == XML_REGEXP_NOTDECIMAL) || + ((type2 >= XML_REGEXP_MARK) && + (type2 <= XML_REGEXP_MARK_ENCLOSING)) || + ((type2 >= XML_REGEXP_PUNCT) && + (type2 <= XML_REGEXP_PUNCT_OTHERS)) || + ((type2 >= XML_REGEXP_SEPAR) && + (type2 <= XML_REGEXP_SEPAR_PARA)) || + ((type2 >= XML_REGEXP_SYMBOL) && + (type2 <= XML_REGEXP_SYMBOL_OTHERS)) || + ((type2 >= XML_REGEXP_OTHER) && + (type2 <= XML_REGEXP_OTHER_NA)) + )return(0); + break; + case XML_REGEXP_NOTREALCHAR: /* \W */ + break; + /* + * at that point we know both type 1 and type2 are from + * character categories are ordered and are different, + * it becomes simple because this is a partition + */ + case XML_REGEXP_LETTER: + if (type2 <= XML_REGEXP_LETTER_OTHERS) + return(1); + return(0); + case XML_REGEXP_LETTER_UPPERCASE: + case XML_REGEXP_LETTER_LOWERCASE: + case XML_REGEXP_LETTER_TITLECASE: + case XML_REGEXP_LETTER_MODIFIER: + case XML_REGEXP_LETTER_OTHERS: + return(0); + case XML_REGEXP_MARK: + if (type2 <= XML_REGEXP_MARK_ENCLOSING) + return(1); + return(0); + case XML_REGEXP_MARK_NONSPACING: + case XML_REGEXP_MARK_SPACECOMBINING: + case XML_REGEXP_MARK_ENCLOSING: + return(0); + case XML_REGEXP_NUMBER: + if (type2 <= XML_REGEXP_NUMBER_OTHERS) + return(1); + return(0); + case XML_REGEXP_NUMBER_DECIMAL: + case XML_REGEXP_NUMBER_LETTER: + case XML_REGEXP_NUMBER_OTHERS: + return(0); + case XML_REGEXP_PUNCT: + if (type2 <= XML_REGEXP_PUNCT_OTHERS) + return(1); + return(0); + case XML_REGEXP_PUNCT_CONNECTOR: + case XML_REGEXP_PUNCT_DASH: + case XML_REGEXP_PUNCT_OPEN: + case XML_REGEXP_PUNCT_CLOSE: + case XML_REGEXP_PUNCT_INITQUOTE: + case XML_REGEXP_PUNCT_FINQUOTE: + case XML_REGEXP_PUNCT_OTHERS: + return(0); + case XML_REGEXP_SEPAR: + if (type2 <= XML_REGEXP_SEPAR_PARA) + return(1); + return(0); + case XML_REGEXP_SEPAR_SPACE: + case XML_REGEXP_SEPAR_LINE: + case XML_REGEXP_SEPAR_PARA: + return(0); + case XML_REGEXP_SYMBOL: + if (type2 <= XML_REGEXP_SYMBOL_OTHERS) + return(1); + return(0); + case XML_REGEXP_SYMBOL_MATH: + case XML_REGEXP_SYMBOL_CURRENCY: + case XML_REGEXP_SYMBOL_MODIFIER: + case XML_REGEXP_SYMBOL_OTHERS: + return(0); + case XML_REGEXP_OTHER: + if (type2 <= XML_REGEXP_OTHER_NA) + return(1); + return(0); + case XML_REGEXP_OTHER_CONTROL: + case XML_REGEXP_OTHER_FORMAT: + case XML_REGEXP_OTHER_PRIVATE: + case XML_REGEXP_OTHER_NA: + return(0); + default: + break; + } + return(1); +} + +/** + * xmlFAEqualAtoms: + * @atom1: an atom + * @atom2: an atom + * @deep: if not set only compare string pointers + * + * Compares two atoms to check whether they are the same exactly + * this is used to remove equivalent transitions + * + * Returns 1 if same and 0 otherwise + */ +static int +xmlFAEqualAtoms(xmlRegAtomPtr atom1, xmlRegAtomPtr atom2, int deep) { + int ret = 0; + + if (atom1 == atom2) + return(1); + if ((atom1 == NULL) || (atom2 == NULL)) + return(0); + + if (atom1->type != atom2->type) + return(0); + switch (atom1->type) { + case XML_REGEXP_EPSILON: + ret = 0; + break; + case XML_REGEXP_STRING: + if (!deep) + ret = (atom1->valuep == atom2->valuep); + else + ret = xmlStrEqual((xmlChar *)atom1->valuep, + (xmlChar *)atom2->valuep); + break; + case XML_REGEXP_CHARVAL: + ret = (atom1->codepoint == atom2->codepoint); + break; + case XML_REGEXP_RANGES: + /* too hard to do in the general case */ + ret = 0; + default: + break; + } + return(ret); +} + +/** + * xmlFACompareAtoms: + * @atom1: an atom + * @atom2: an atom + * @deep: if not set only compare string pointers + * + * Compares two atoms to check whether they intersect in some ways, + * this is used by xmlFAComputesDeterminism and xmlFARecurseDeterminism only + * + * Returns 1 if yes and 0 otherwise + */ +static int +xmlFACompareAtoms(xmlRegAtomPtr atom1, xmlRegAtomPtr atom2, int deep) { + int ret = 1; + + if (atom1 == atom2) + return(1); + if ((atom1 == NULL) || (atom2 == NULL)) + return(0); + + if ((atom1->type == XML_REGEXP_ANYCHAR) || + (atom2->type == XML_REGEXP_ANYCHAR)) + return(1); + + if (atom1->type > atom2->type) { + xmlRegAtomPtr tmp; + tmp = atom1; + atom1 = atom2; + atom2 = tmp; + } + if (atom1->type != atom2->type) { + ret = xmlFACompareAtomTypes(atom1->type, atom2->type); + /* if they can't intersect at the type level break now */ + if (ret == 0) + return(0); + } + switch (atom1->type) { + case XML_REGEXP_STRING: + if (!deep) + ret = (atom1->valuep != atom2->valuep); + else + ret = xmlRegStrEqualWildcard((xmlChar *)atom1->valuep, + (xmlChar *)atom2->valuep); + break; + case XML_REGEXP_EPSILON: + goto not_determinist; + case XML_REGEXP_CHARVAL: + if (atom2->type == XML_REGEXP_CHARVAL) { + ret = (atom1->codepoint == atom2->codepoint); + } else { + ret = xmlRegCheckCharacter(atom2, atom1->codepoint); + if (ret < 0) + ret = 1; + } + break; + case XML_REGEXP_RANGES: + if (atom2->type == XML_REGEXP_RANGES) { + int i, j, res; + xmlRegRangePtr r1, r2; + + /* + * need to check that none of the ranges eventually matches + */ + for (i = 0;i < atom1->nbRanges;i++) { + for (j = 0;j < atom2->nbRanges;j++) { + r1 = atom1->ranges[i]; + r2 = atom2->ranges[j]; + res = xmlFACompareRanges(r1, r2); + if (res == 1) { + ret = 1; + goto done; + } + } + } + ret = 0; + } + break; + default: + goto not_determinist; + } +done: + if (atom1->neg != atom2->neg) { + ret = !ret; + } + if (ret == 0) + return(0); +not_determinist: + return(1); +} + +/** + * xmlFARecurseDeterminism: + * @ctxt: a regexp parser context + * + * Check whether the associated regexp is determinist, + * should be called after xmlFAEliminateEpsilonTransitions() + * + */ +static int +xmlFARecurseDeterminism(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr state, + int to, xmlRegAtomPtr atom) { + int ret = 1; + int res; + int transnr, nbTrans; + xmlRegTransPtr t1; + int deep = 1; + + if (state == NULL) + return(ret); + if (state->markd == XML_REGEXP_MARK_VISITED) + return(ret); + + if (ctxt->flags & AM_AUTOMATA_RNG) + deep = 0; + + /* + * don't recurse on transitions potentially added in the course of + * the elimination. + */ + nbTrans = state->nbTrans; + for (transnr = 0;transnr < nbTrans;transnr++) { + t1 = &(state->trans[transnr]); + /* + * check transitions conflicting with the one looked at + */ + if (t1->atom == NULL) { + if (t1->to < 0) + continue; + state->markd = XML_REGEXP_MARK_VISITED; + res = xmlFARecurseDeterminism(ctxt, ctxt->states[t1->to], + to, atom); + state->markd = 0; + if (res == 0) { + ret = 0; + /* t1->nd = 1; */ + } + continue; + } + if (t1->to != to) + continue; + if (xmlFACompareAtoms(t1->atom, atom, deep)) { + ret = 0; + /* mark the transition as non-deterministic */ + t1->nd = 1; + } + } + return(ret); +} + +/** + * xmlFAComputesDeterminism: + * @ctxt: a regexp parser context + * + * Check whether the associated regexp is determinist, + * should be called after xmlFAEliminateEpsilonTransitions() + * + */ +static int +xmlFAComputesDeterminism(xmlRegParserCtxtPtr ctxt) { + int statenr, transnr; + xmlRegStatePtr state; + xmlRegTransPtr t1, t2, last; + int i; + int ret = 1; + int deep = 1; + +#ifdef DEBUG_REGEXP_GRAPH + printf("xmlFAComputesDeterminism\n"); + xmlRegPrintCtxt(stdout, ctxt); +#endif + if (ctxt->determinist != -1) + return(ctxt->determinist); + + if (ctxt->flags & AM_AUTOMATA_RNG) + deep = 0; + + /* + * First cleanup the automata removing cancelled transitions + */ + for (statenr = 0;statenr < ctxt->nbStates;statenr++) { + state = ctxt->states[statenr]; + if (state == NULL) + continue; + if (state->nbTrans < 2) + continue; + for (transnr = 0;transnr < state->nbTrans;transnr++) { + t1 = &(state->trans[transnr]); + /* + * Determinism checks in case of counted or all transitions + * will have to be handled separately + */ + if (t1->atom == NULL) { + /* t1->nd = 1; */ + continue; + } + if (t1->to == -1) /* eliminated */ + continue; + for (i = 0;i < transnr;i++) { + t2 = &(state->trans[i]); + if (t2->to == -1) /* eliminated */ + continue; + if (t2->atom != NULL) { + if (t1->to == t2->to) { + /* + * Here we use deep because we want to keep the + * transitions which indicate a conflict + */ + if (xmlFAEqualAtoms(t1->atom, t2->atom, deep) && + (t1->counter == t2->counter) && + (t1->count == t2->count)) + t2->to = -1; /* eliminated */ + } + } + } + } + } + + /* + * Check for all states that there aren't 2 transitions + * with the same atom and a different target. + */ + for (statenr = 0;statenr < ctxt->nbStates;statenr++) { + state = ctxt->states[statenr]; + if (state == NULL) + continue; + if (state->nbTrans < 2) + continue; + last = NULL; + for (transnr = 0;transnr < state->nbTrans;transnr++) { + t1 = &(state->trans[transnr]); + /* + * Determinism checks in case of counted or all transitions + * will have to be handled separately + */ + if (t1->atom == NULL) { + continue; + } + if (t1->to == -1) /* eliminated */ + continue; + for (i = 0;i < transnr;i++) { + t2 = &(state->trans[i]); + if (t2->to == -1) /* eliminated */ + continue; + if (t2->atom != NULL) { + /* + * But here we don't use deep because we want to + * find transitions which indicate a conflict + */ + if (xmlFACompareAtoms(t1->atom, t2->atom, 1)) { + ret = 0; + /* mark the transitions as non-deterministic ones */ + t1->nd = 1; + t2->nd = 1; + last = t1; + } + } else if (t1->to != -1) { + /* + * do the closure in case of remaining specific + * epsilon transitions like choices or all + */ + ret = xmlFARecurseDeterminism(ctxt, ctxt->states[t1->to], + t2->to, t2->atom); + /* don't shortcut the computation so all non deterministic + transition get marked down + if (ret == 0) + return(0); + */ + if (ret == 0) { + t1->nd = 1; + /* t2->nd = 1; */ + last = t1; + } + } + } + /* don't shortcut the computation so all non deterministic + transition get marked down + if (ret == 0) + break; */ + } + + /* + * mark specifically the last non-deterministic transition + * from a state since there is no need to set-up rollback + * from it + */ + if (last != NULL) { + last->nd = 2; + } + + /* don't shortcut the computation so all non deterministic + transition get marked down + if (ret == 0) + break; */ + } + + ctxt->determinist = ret; + return(ret); +} + +/************************************************************************ + * * + * Routines to check input against transition atoms * + * * + ************************************************************************/ + +static int +xmlRegCheckCharacterRange(xmlRegAtomType type, int codepoint, int neg, + int start, int end, const xmlChar *blockName) { + int ret = 0; + + switch (type) { + case XML_REGEXP_STRING: + case XML_REGEXP_SUBREG: + case XML_REGEXP_RANGES: + case XML_REGEXP_EPSILON: + return(-1); + case XML_REGEXP_ANYCHAR: + ret = ((codepoint != '\n') && (codepoint != '\r')); + break; + case XML_REGEXP_CHARVAL: + ret = ((codepoint >= start) && (codepoint <= end)); + break; + case XML_REGEXP_NOTSPACE: + neg = !neg; + case XML_REGEXP_ANYSPACE: + ret = ((codepoint == '\n') || (codepoint == '\r') || + (codepoint == '\t') || (codepoint == ' ')); + break; + case XML_REGEXP_NOTINITNAME: + neg = !neg; + case XML_REGEXP_INITNAME: + ret = (IS_LETTER(codepoint) || + (codepoint == '_') || (codepoint == ':')); + break; + case XML_REGEXP_NOTNAMECHAR: + neg = !neg; + case XML_REGEXP_NAMECHAR: + ret = (IS_LETTER(codepoint) || IS_DIGIT(codepoint) || + (codepoint == '.') || (codepoint == '-') || + (codepoint == '_') || (codepoint == ':') || + IS_COMBINING(codepoint) || IS_EXTENDER(codepoint)); + break; + case XML_REGEXP_NOTDECIMAL: + neg = !neg; + case XML_REGEXP_DECIMAL: + ret = xmlUCSIsCatNd(codepoint); + break; + case XML_REGEXP_REALCHAR: + neg = !neg; + case XML_REGEXP_NOTREALCHAR: + ret = xmlUCSIsCatP(codepoint); + if (ret == 0) + ret = xmlUCSIsCatZ(codepoint); + if (ret == 0) + ret = xmlUCSIsCatC(codepoint); + break; + case XML_REGEXP_LETTER: + ret = xmlUCSIsCatL(codepoint); + break; + case XML_REGEXP_LETTER_UPPERCASE: + ret = xmlUCSIsCatLu(codepoint); + break; + case XML_REGEXP_LETTER_LOWERCASE: + ret = xmlUCSIsCatLl(codepoint); + break; + case XML_REGEXP_LETTER_TITLECASE: + ret = xmlUCSIsCatLt(codepoint); + break; + case XML_REGEXP_LETTER_MODIFIER: + ret = xmlUCSIsCatLm(codepoint); + break; + case XML_REGEXP_LETTER_OTHERS: + ret = xmlUCSIsCatLo(codepoint); + break; + case XML_REGEXP_MARK: + ret = xmlUCSIsCatM(codepoint); + break; + case XML_REGEXP_MARK_NONSPACING: + ret = xmlUCSIsCatMn(codepoint); + break; + case XML_REGEXP_MARK_SPACECOMBINING: + ret = xmlUCSIsCatMc(codepoint); + break; + case XML_REGEXP_MARK_ENCLOSING: + ret = xmlUCSIsCatMe(codepoint); + break; + case XML_REGEXP_NUMBER: + ret = xmlUCSIsCatN(codepoint); + break; + case XML_REGEXP_NUMBER_DECIMAL: + ret = xmlUCSIsCatNd(codepoint); + break; + case XML_REGEXP_NUMBER_LETTER: + ret = xmlUCSIsCatNl(codepoint); + break; + case XML_REGEXP_NUMBER_OTHERS: + ret = xmlUCSIsCatNo(codepoint); + break; + case XML_REGEXP_PUNCT: + ret = xmlUCSIsCatP(codepoint); + break; + case XML_REGEXP_PUNCT_CONNECTOR: + ret = xmlUCSIsCatPc(codepoint); + break; + case XML_REGEXP_PUNCT_DASH: + ret = xmlUCSIsCatPd(codepoint); + break; + case XML_REGEXP_PUNCT_OPEN: + ret = xmlUCSIsCatPs(codepoint); + break; + case XML_REGEXP_PUNCT_CLOSE: + ret = xmlUCSIsCatPe(codepoint); + break; + case XML_REGEXP_PUNCT_INITQUOTE: + ret = xmlUCSIsCatPi(codepoint); + break; + case XML_REGEXP_PUNCT_FINQUOTE: + ret = xmlUCSIsCatPf(codepoint); + break; + case XML_REGEXP_PUNCT_OTHERS: + ret = xmlUCSIsCatPo(codepoint); + break; + case XML_REGEXP_SEPAR: + ret = xmlUCSIsCatZ(codepoint); + break; + case XML_REGEXP_SEPAR_SPACE: + ret = xmlUCSIsCatZs(codepoint); + break; + case XML_REGEXP_SEPAR_LINE: + ret = xmlUCSIsCatZl(codepoint); + break; + case XML_REGEXP_SEPAR_PARA: + ret = xmlUCSIsCatZp(codepoint); + break; + case XML_REGEXP_SYMBOL: + ret = xmlUCSIsCatS(codepoint); + break; + case XML_REGEXP_SYMBOL_MATH: + ret = xmlUCSIsCatSm(codepoint); + break; + case XML_REGEXP_SYMBOL_CURRENCY: + ret = xmlUCSIsCatSc(codepoint); + break; + case XML_REGEXP_SYMBOL_MODIFIER: + ret = xmlUCSIsCatSk(codepoint); + break; + case XML_REGEXP_SYMBOL_OTHERS: + ret = xmlUCSIsCatSo(codepoint); + break; + case XML_REGEXP_OTHER: + ret = xmlUCSIsCatC(codepoint); + break; + case XML_REGEXP_OTHER_CONTROL: + ret = xmlUCSIsCatCc(codepoint); + break; + case XML_REGEXP_OTHER_FORMAT: + ret = xmlUCSIsCatCf(codepoint); + break; + case XML_REGEXP_OTHER_PRIVATE: + ret = xmlUCSIsCatCo(codepoint); + break; + case XML_REGEXP_OTHER_NA: + /* ret = xmlUCSIsCatCn(codepoint); */ + /* Seems it doesn't exist anymore in recent Unicode releases */ + ret = 0; + break; + case XML_REGEXP_BLOCK_NAME: + ret = xmlUCSIsBlock(codepoint, (const char *) blockName); + break; + } + if (neg) + return(!ret); + return(ret); +} + +static int +xmlRegCheckCharacter(xmlRegAtomPtr atom, int codepoint) { + int i, ret = 0; + xmlRegRangePtr range; + + if ((atom == NULL) || (!IS_CHAR(codepoint))) + return(-1); + + switch (atom->type) { + case XML_REGEXP_SUBREG: + case XML_REGEXP_EPSILON: + return(-1); + case XML_REGEXP_CHARVAL: + return(codepoint == atom->codepoint); + case XML_REGEXP_RANGES: { + int accept = 0; + + for (i = 0;i < atom->nbRanges;i++) { + range = atom->ranges[i]; + if (range->neg == 2) { + ret = xmlRegCheckCharacterRange(range->type, codepoint, + 0, range->start, range->end, + range->blockName); + if (ret != 0) + return(0); /* excluded char */ + } else if (range->neg) { + ret = xmlRegCheckCharacterRange(range->type, codepoint, + 0, range->start, range->end, + range->blockName); + if (ret == 0) + accept = 1; + else + return(0); + } else { + ret = xmlRegCheckCharacterRange(range->type, codepoint, + 0, range->start, range->end, + range->blockName); + if (ret != 0) + accept = 1; /* might still be excluded */ + } + } + return(accept); + } + case XML_REGEXP_STRING: + printf("TODO: XML_REGEXP_STRING\n"); + return(-1); + case XML_REGEXP_ANYCHAR: + case XML_REGEXP_ANYSPACE: + case XML_REGEXP_NOTSPACE: + case XML_REGEXP_INITNAME: + case XML_REGEXP_NOTINITNAME: + case XML_REGEXP_NAMECHAR: + case XML_REGEXP_NOTNAMECHAR: + case XML_REGEXP_DECIMAL: + case XML_REGEXP_NOTDECIMAL: + case XML_REGEXP_REALCHAR: + case XML_REGEXP_NOTREALCHAR: + case XML_REGEXP_LETTER: + case XML_REGEXP_LETTER_UPPERCASE: + case XML_REGEXP_LETTER_LOWERCASE: + case XML_REGEXP_LETTER_TITLECASE: + case XML_REGEXP_LETTER_MODIFIER: + case XML_REGEXP_LETTER_OTHERS: + case XML_REGEXP_MARK: + case XML_REGEXP_MARK_NONSPACING: + case XML_REGEXP_MARK_SPACECOMBINING: + case XML_REGEXP_MARK_ENCLOSING: + case XML_REGEXP_NUMBER: + case XML_REGEXP_NUMBER_DECIMAL: + case XML_REGEXP_NUMBER_LETTER: + case XML_REGEXP_NUMBER_OTHERS: + case XML_REGEXP_PUNCT: + case XML_REGEXP_PUNCT_CONNECTOR: + case XML_REGEXP_PUNCT_DASH: + case XML_REGEXP_PUNCT_OPEN: + case XML_REGEXP_PUNCT_CLOSE: + case XML_REGEXP_PUNCT_INITQUOTE: + case XML_REGEXP_PUNCT_FINQUOTE: + case XML_REGEXP_PUNCT_OTHERS: + case XML_REGEXP_SEPAR: + case XML_REGEXP_SEPAR_SPACE: + case XML_REGEXP_SEPAR_LINE: + case XML_REGEXP_SEPAR_PARA: + case XML_REGEXP_SYMBOL: + case XML_REGEXP_SYMBOL_MATH: + case XML_REGEXP_SYMBOL_CURRENCY: + case XML_REGEXP_SYMBOL_MODIFIER: + case XML_REGEXP_SYMBOL_OTHERS: + case XML_REGEXP_OTHER: + case XML_REGEXP_OTHER_CONTROL: + case XML_REGEXP_OTHER_FORMAT: + case XML_REGEXP_OTHER_PRIVATE: + case XML_REGEXP_OTHER_NA: + case XML_REGEXP_BLOCK_NAME: + ret = xmlRegCheckCharacterRange(atom->type, codepoint, 0, 0, 0, + (const xmlChar *)atom->valuep); + if (atom->neg) + ret = !ret; + break; + } + return(ret); +} + +/************************************************************************ + * * + * Saving and restoring state of an execution context * + * * + ************************************************************************/ + +#ifdef DEBUG_REGEXP_EXEC +static void +xmlFARegDebugExec(xmlRegExecCtxtPtr exec) { + printf("state: %d:%d:idx %d", exec->state->no, exec->transno, exec->index); + if (exec->inputStack != NULL) { + int i; + printf(": "); + for (i = 0;(i < 3) && (i < exec->inputStackNr);i++) + printf("%s ", (const char *) + exec->inputStack[exec->inputStackNr - (i + 1)].value); + } else { + printf(": %s", &(exec->inputString[exec->index])); + } + printf("\n"); +} +#endif + +static void +xmlFARegExecSave(xmlRegExecCtxtPtr exec) { +#ifdef DEBUG_REGEXP_EXEC + printf("saving "); + exec->transno++; + xmlFARegDebugExec(exec); + exec->transno--; +#endif +#ifdef MAX_PUSH + if (exec->nbPush > MAX_PUSH) { + return; + } + exec->nbPush++; +#endif + + if (exec->maxRollbacks == 0) { + exec->maxRollbacks = 4; + exec->rollbacks = (xmlRegExecRollback *) xmlMalloc(exec->maxRollbacks * + sizeof(xmlRegExecRollback)); + if (exec->rollbacks == NULL) { + xmlRegexpErrMemory(NULL, "saving regexp"); + exec->maxRollbacks = 0; + return; + } + memset(exec->rollbacks, 0, + exec->maxRollbacks * sizeof(xmlRegExecRollback)); + } else if (exec->nbRollbacks >= exec->maxRollbacks) { + xmlRegExecRollback *tmp; + int len = exec->maxRollbacks; + + exec->maxRollbacks *= 2; + tmp = (xmlRegExecRollback *) xmlRealloc(exec->rollbacks, + exec->maxRollbacks * sizeof(xmlRegExecRollback)); + if (tmp == NULL) { + xmlRegexpErrMemory(NULL, "saving regexp"); + exec->maxRollbacks /= 2; + return; + } + exec->rollbacks = tmp; + tmp = &exec->rollbacks[len]; + memset(tmp, 0, (exec->maxRollbacks - len) * sizeof(xmlRegExecRollback)); + } + exec->rollbacks[exec->nbRollbacks].state = exec->state; + exec->rollbacks[exec->nbRollbacks].index = exec->index; + exec->rollbacks[exec->nbRollbacks].nextbranch = exec->transno + 1; + if (exec->comp->nbCounters > 0) { + if (exec->rollbacks[exec->nbRollbacks].counts == NULL) { + exec->rollbacks[exec->nbRollbacks].counts = (int *) + xmlMalloc(exec->comp->nbCounters * sizeof(int)); + if (exec->rollbacks[exec->nbRollbacks].counts == NULL) { + xmlRegexpErrMemory(NULL, "saving regexp"); + exec->status = -5; + return; + } + } + memcpy(exec->rollbacks[exec->nbRollbacks].counts, exec->counts, + exec->comp->nbCounters * sizeof(int)); + } + exec->nbRollbacks++; +} + +static void +xmlFARegExecRollBack(xmlRegExecCtxtPtr exec) { + if (exec->nbRollbacks <= 0) { + exec->status = -1; +#ifdef DEBUG_REGEXP_EXEC + printf("rollback failed on empty stack\n"); +#endif + return; + } + exec->nbRollbacks--; + exec->state = exec->rollbacks[exec->nbRollbacks].state; + exec->index = exec->rollbacks[exec->nbRollbacks].index; + exec->transno = exec->rollbacks[exec->nbRollbacks].nextbranch; + if (exec->comp->nbCounters > 0) { + if (exec->rollbacks[exec->nbRollbacks].counts == NULL) { + fprintf(stderr, "exec save: allocation failed"); + exec->status = -6; + return; + } + memcpy(exec->counts, exec->rollbacks[exec->nbRollbacks].counts, + exec->comp->nbCounters * sizeof(int)); + } + +#ifdef DEBUG_REGEXP_EXEC + printf("restored "); + xmlFARegDebugExec(exec); +#endif +} + +/************************************************************************ + * * + * Verifier, running an input against a compiled regexp * + * * + ************************************************************************/ + +static int +xmlFARegExec(xmlRegexpPtr comp, const xmlChar *content) { + xmlRegExecCtxt execval; + xmlRegExecCtxtPtr exec = &execval; + int ret, codepoint = 0, len, deter; + + exec->inputString = content; + exec->index = 0; + exec->nbPush = 0; + exec->determinist = 1; + exec->maxRollbacks = 0; + exec->nbRollbacks = 0; + exec->rollbacks = NULL; + exec->status = 0; + exec->comp = comp; + exec->state = comp->states[0]; + exec->transno = 0; + exec->transcount = 0; + exec->inputStack = NULL; + exec->inputStackMax = 0; + if (comp->nbCounters > 0) { + exec->counts = (int *) xmlMalloc(comp->nbCounters * sizeof(int)); + if (exec->counts == NULL) { + xmlRegexpErrMemory(NULL, "running regexp"); + return(-1); + } + memset(exec->counts, 0, comp->nbCounters * sizeof(int)); + } else + exec->counts = NULL; + while ((exec->status == 0) && (exec->state != NULL) && + ((exec->inputString[exec->index] != 0) || + ((exec->state != NULL) && + (exec->state->type != XML_REGEXP_FINAL_STATE)))) { + xmlRegTransPtr trans; + xmlRegAtomPtr atom; + + /* + * If end of input on non-terminal state, rollback, however we may + * still have epsilon like transition for counted transitions + * on counters, in that case don't break too early. Additionally, + * if we are working on a range like "AB{0,2}", where B is not present, + * we don't want to break. + */ + len = 1; + if ((exec->inputString[exec->index] == 0) && (exec->counts == NULL)) { + /* + * if there is a transition, we must check if + * atom allows minOccurs of 0 + */ + if (exec->transno < exec->state->nbTrans) { + trans = &exec->state->trans[exec->transno]; + if (trans->to >=0) { + atom = trans->atom; + if (!((atom->min == 0) && (atom->max > 0))) + goto rollback; + } + } else + goto rollback; + } + + exec->transcount = 0; + for (;exec->transno < exec->state->nbTrans;exec->transno++) { + trans = &exec->state->trans[exec->transno]; + if (trans->to < 0) + continue; + atom = trans->atom; + ret = 0; + deter = 1; + if (trans->count >= 0) { + int count; + xmlRegCounterPtr counter; + + if (exec->counts == NULL) { + exec->status = -1; + goto error; + } + /* + * A counted transition. + */ + + count = exec->counts[trans->count]; + counter = &exec->comp->counters[trans->count]; +#ifdef DEBUG_REGEXP_EXEC + printf("testing count %d: val %d, min %d, max %d\n", + trans->count, count, counter->min, counter->max); +#endif + ret = ((count >= counter->min) && (count <= counter->max)); + if ((ret) && (counter->min != counter->max)) + deter = 0; + } else if (atom == NULL) { + fprintf(stderr, "epsilon transition left at runtime\n"); + exec->status = -2; + break; + } else if (exec->inputString[exec->index] != 0) { + codepoint = CUR_SCHAR(&(exec->inputString[exec->index]), len); + ret = xmlRegCheckCharacter(atom, codepoint); + if ((ret == 1) && (atom->min >= 0) && (atom->max > 0)) { + xmlRegStatePtr to = comp->states[trans->to]; + + /* + * this is a multiple input sequence + * If there is a counter associated increment it now. + * before potentially saving and rollback + * do not increment if the counter is already over the + * maximum limit in which case get to next transition + */ + if (trans->counter >= 0) { + xmlRegCounterPtr counter; + + if ((exec->counts == NULL) || + (exec->comp == NULL) || + (exec->comp->counters == NULL)) { + exec->status = -1; + goto error; + } + counter = &exec->comp->counters[trans->counter]; + if (exec->counts[trans->counter] >= counter->max) + continue; /* for loop on transitions */ + +#ifdef DEBUG_REGEXP_EXEC + printf("Increasing count %d\n", trans->counter); +#endif + exec->counts[trans->counter]++; + } + if (exec->state->nbTrans > exec->transno + 1) { + xmlFARegExecSave(exec); + } + exec->transcount = 1; + do { + /* + * Try to progress as much as possible on the input + */ + if (exec->transcount == atom->max) { + break; + } + exec->index += len; + /* + * End of input: stop here + */ + if (exec->inputString[exec->index] == 0) { + exec->index -= len; + break; + } + if (exec->transcount >= atom->min) { + int transno = exec->transno; + xmlRegStatePtr state = exec->state; + + /* + * The transition is acceptable save it + */ + exec->transno = -1; /* trick */ + exec->state = to; + xmlFARegExecSave(exec); + exec->transno = transno; + exec->state = state; + } + codepoint = CUR_SCHAR(&(exec->inputString[exec->index]), + len); + ret = xmlRegCheckCharacter(atom, codepoint); + exec->transcount++; + } while (ret == 1); + if (exec->transcount < atom->min) + ret = 0; + + /* + * If the last check failed but one transition was found + * possible, rollback + */ + if (ret < 0) + ret = 0; + if (ret == 0) { + goto rollback; + } + if (trans->counter >= 0) { + if (exec->counts == NULL) { + exec->status = -1; + goto error; + } +#ifdef DEBUG_REGEXP_EXEC + printf("Decreasing count %d\n", trans->counter); +#endif + exec->counts[trans->counter]--; + } + } else if ((ret == 0) && (atom->min == 0) && (atom->max > 0)) { + /* + * we don't match on the codepoint, but minOccurs of 0 + * says that's ok. Setting len to 0 inhibits stepping + * over the codepoint. + */ + exec->transcount = 1; + len = 0; + ret = 1; + } + } else if ((atom->min == 0) && (atom->max > 0)) { + /* another spot to match when minOccurs is 0 */ + exec->transcount = 1; + len = 0; + ret = 1; + } + if (ret == 1) { + if ((trans->nd == 1) || + ((trans->count >= 0) && (deter == 0) && + (exec->state->nbTrans > exec->transno + 1))) { +#ifdef DEBUG_REGEXP_EXEC + if (trans->nd == 1) + printf("Saving on nd transition atom %d for %c at %d\n", + trans->atom->no, codepoint, exec->index); + else + printf("Saving on counted transition count %d for %c at %d\n", + trans->count, codepoint, exec->index); +#endif + xmlFARegExecSave(exec); + } + if (trans->counter >= 0) { + xmlRegCounterPtr counter; + + /* make sure we don't go over the counter maximum value */ + if ((exec->counts == NULL) || + (exec->comp == NULL) || + (exec->comp->counters == NULL)) { + exec->status = -1; + goto error; + } + counter = &exec->comp->counters[trans->counter]; + if (exec->counts[trans->counter] >= counter->max) + continue; /* for loop on transitions */ +#ifdef DEBUG_REGEXP_EXEC + printf("Increasing count %d\n", trans->counter); +#endif + exec->counts[trans->counter]++; + } + if ((trans->count >= 0) && + (trans->count < REGEXP_ALL_COUNTER)) { + if (exec->counts == NULL) { + exec->status = -1; + goto error; + } +#ifdef DEBUG_REGEXP_EXEC + printf("resetting count %d on transition\n", + trans->count); +#endif + exec->counts[trans->count] = 0; + } +#ifdef DEBUG_REGEXP_EXEC + printf("entering state %d\n", trans->to); +#endif + exec->state = comp->states[trans->to]; + exec->transno = 0; + if (trans->atom != NULL) { + exec->index += len; + } + goto progress; + } else if (ret < 0) { + exec->status = -4; + break; + } + } + if ((exec->transno != 0) || (exec->state->nbTrans == 0)) { +rollback: + /* + * Failed to find a way out + */ + exec->determinist = 0; +#ifdef DEBUG_REGEXP_EXEC + printf("rollback from state %d on %d:%c\n", exec->state->no, + codepoint,codepoint); +#endif + xmlFARegExecRollBack(exec); + } +progress: + continue; + } +error: + if (exec->rollbacks != NULL) { + if (exec->counts != NULL) { + int i; + + for (i = 0;i < exec->maxRollbacks;i++) + if (exec->rollbacks[i].counts != NULL) + xmlFree(exec->rollbacks[i].counts); + } + xmlFree(exec->rollbacks); + } + if (exec->state == NULL) + return(-1); + if (exec->counts != NULL) + xmlFree(exec->counts); + if (exec->status == 0) + return(1); + if (exec->status == -1) { + if (exec->nbPush > MAX_PUSH) + return(-1); + return(0); + } + return(exec->status); +} + +/************************************************************************ + * * + * Progressive interface to the verifier one atom at a time * + * * + ************************************************************************/ +#ifdef DEBUG_ERR +static void testerr(xmlRegExecCtxtPtr exec); +#endif + +/** + * xmlRegNewExecCtxt: + * @comp: a precompiled regular expression + * @callback: a callback function used for handling progresses in the + * automata matching phase + * @data: the context data associated to the callback in this context + * + * Build a context used for progressive evaluation of a regexp. + * + * Returns the new context + */ +xmlRegExecCtxtPtr +xmlRegNewExecCtxt(xmlRegexpPtr comp, xmlRegExecCallbacks callback, void *data) { + xmlRegExecCtxtPtr exec; + + if (comp == NULL) + return(NULL); + if ((comp->compact == NULL) && (comp->states == NULL)) + return(NULL); + exec = (xmlRegExecCtxtPtr) xmlMalloc(sizeof(xmlRegExecCtxt)); + if (exec == NULL) { + xmlRegexpErrMemory(NULL, "creating execution context"); + return(NULL); + } + memset(exec, 0, sizeof(xmlRegExecCtxt)); + exec->inputString = NULL; + exec->index = 0; + exec->determinist = 1; + exec->maxRollbacks = 0; + exec->nbRollbacks = 0; + exec->rollbacks = NULL; + exec->status = 0; + exec->comp = comp; + if (comp->compact == NULL) + exec->state = comp->states[0]; + exec->transno = 0; + exec->transcount = 0; + exec->callback = callback; + exec->data = data; + if (comp->nbCounters > 0) { + /* + * For error handling, exec->counts is allocated twice the size + * the second half is used to store the data in case of rollback + */ + exec->counts = (int *) xmlMalloc(comp->nbCounters * sizeof(int) + * 2); + if (exec->counts == NULL) { + xmlRegexpErrMemory(NULL, "creating execution context"); + xmlFree(exec); + return(NULL); + } + memset(exec->counts, 0, comp->nbCounters * sizeof(int) * 2); + exec->errCounts = &exec->counts[comp->nbCounters]; + } else { + exec->counts = NULL; + exec->errCounts = NULL; + } + exec->inputStackMax = 0; + exec->inputStackNr = 0; + exec->inputStack = NULL; + exec->errStateNo = -1; + exec->errString = NULL; + exec->nbPush = 0; + return(exec); +} + +/** + * xmlRegFreeExecCtxt: + * @exec: a regular expression evaulation context + * + * Free the structures associated to a regular expression evaulation context. + */ +void +xmlRegFreeExecCtxt(xmlRegExecCtxtPtr exec) { + if (exec == NULL) + return; + + if (exec->rollbacks != NULL) { + if (exec->counts != NULL) { + int i; + + for (i = 0;i < exec->maxRollbacks;i++) + if (exec->rollbacks[i].counts != NULL) + xmlFree(exec->rollbacks[i].counts); + } + xmlFree(exec->rollbacks); + } + if (exec->counts != NULL) + xmlFree(exec->counts); + if (exec->inputStack != NULL) { + int i; + + for (i = 0;i < exec->inputStackNr;i++) { + if (exec->inputStack[i].value != NULL) + xmlFree(exec->inputStack[i].value); + } + xmlFree(exec->inputStack); + } + if (exec->errString != NULL) + xmlFree(exec->errString); + xmlFree(exec); +} + +static void +xmlFARegExecSaveInputString(xmlRegExecCtxtPtr exec, const xmlChar *value, + void *data) { +#ifdef DEBUG_PUSH + printf("saving value: %d:%s\n", exec->inputStackNr, value); +#endif + if (exec->inputStackMax == 0) { + exec->inputStackMax = 4; + exec->inputStack = (xmlRegInputTokenPtr) + xmlMalloc(exec->inputStackMax * sizeof(xmlRegInputToken)); + if (exec->inputStack == NULL) { + xmlRegexpErrMemory(NULL, "pushing input string"); + exec->inputStackMax = 0; + return; + } + } else if (exec->inputStackNr + 1 >= exec->inputStackMax) { + xmlRegInputTokenPtr tmp; + + exec->inputStackMax *= 2; + tmp = (xmlRegInputTokenPtr) xmlRealloc(exec->inputStack, + exec->inputStackMax * sizeof(xmlRegInputToken)); + if (tmp == NULL) { + xmlRegexpErrMemory(NULL, "pushing input string"); + exec->inputStackMax /= 2; + return; + } + exec->inputStack = tmp; + } + exec->inputStack[exec->inputStackNr].value = xmlStrdup(value); + exec->inputStack[exec->inputStackNr].data = data; + exec->inputStackNr++; + exec->inputStack[exec->inputStackNr].value = NULL; + exec->inputStack[exec->inputStackNr].data = NULL; +} + +/** + * xmlRegStrEqualWildcard: + * @expStr: the string to be evaluated + * @valStr: the validation string + * + * Checks if both strings are equal or have the same content. "*" + * can be used as a wildcard in @valStr; "|" is used as a seperator of + * substrings in both @expStr and @valStr. + * + * Returns 1 if the comparison is satisfied and the number of substrings + * is equal, 0 otherwise. + */ + +static int +xmlRegStrEqualWildcard(const xmlChar *expStr, const xmlChar *valStr) { + if (expStr == valStr) return(1); + if (expStr == NULL) return(0); + if (valStr == NULL) return(0); + do { + /* + * Eval if we have a wildcard for the current item. + */ + if (*expStr != *valStr) { + /* if one of them starts with a wildcard make valStr be it */ + if (*valStr == '*') { + const xmlChar *tmp; + + tmp = valStr; + valStr = expStr; + expStr = tmp; + } + if ((*valStr != 0) && (*expStr != 0) && (*expStr++ == '*')) { + do { + if (*valStr == XML_REG_STRING_SEPARATOR) + break; + valStr++; + } while (*valStr != 0); + continue; + } else + return(0); + } + expStr++; + valStr++; + } while (*valStr != 0); + if (*expStr != 0) + return (0); + else + return (1); +} + +/** + * xmlRegCompactPushString: + * @exec: a regexp execution context + * @comp: the precompiled exec with a compact table + * @value: a string token input + * @data: data associated to the token to reuse in callbacks + * + * Push one input token in the execution context + * + * Returns: 1 if the regexp reached a final state, 0 if non-final, and + * a negative value in case of error. + */ +static int +xmlRegCompactPushString(xmlRegExecCtxtPtr exec, + xmlRegexpPtr comp, + const xmlChar *value, + void *data) { + int state = exec->index; + int i, target; + + if ((comp == NULL) || (comp->compact == NULL) || (comp->stringMap == NULL)) + return(-1); + + if (value == NULL) { + /* + * are we at a final state ? + */ + if (comp->compact[state * (comp->nbstrings + 1)] == + XML_REGEXP_FINAL_STATE) + return(1); + return(0); + } + +#ifdef DEBUG_PUSH + printf("value pushed: %s\n", value); +#endif + + /* + * Examine all outside transitions from current state + */ + for (i = 0;i < comp->nbstrings;i++) { + target = comp->compact[state * (comp->nbstrings + 1) + i + 1]; + if ((target > 0) && (target <= comp->nbstates)) { + target--; /* to avoid 0 */ + if (xmlRegStrEqualWildcard(comp->stringMap[i], value)) { + exec->index = target; + if ((exec->callback != NULL) && (comp->transdata != NULL)) { + exec->callback(exec->data, value, + comp->transdata[state * comp->nbstrings + i], data); + } +#ifdef DEBUG_PUSH + printf("entering state %d\n", target); +#endif + if (comp->compact[target * (comp->nbstrings + 1)] == + XML_REGEXP_SINK_STATE) + goto error; + + if (comp->compact[target * (comp->nbstrings + 1)] == + XML_REGEXP_FINAL_STATE) + return(1); + return(0); + } + } + } + /* + * Failed to find an exit transition out from current state for the + * current token + */ +#ifdef DEBUG_PUSH + printf("failed to find a transition for %s on state %d\n", value, state); +#endif +error: + if (exec->errString != NULL) + xmlFree(exec->errString); + exec->errString = xmlStrdup(value); + exec->errStateNo = state; + exec->status = -1; +#ifdef DEBUG_ERR + testerr(exec); +#endif + return(-1); +} + +/** + * xmlRegExecPushStringInternal: + * @exec: a regexp execution context or NULL to indicate the end + * @value: a string token input + * @data: data associated to the token to reuse in callbacks + * @compound: value was assembled from 2 strings + * + * Push one input token in the execution context + * + * Returns: 1 if the regexp reached a final state, 0 if non-final, and + * a negative value in case of error. + */ +static int +xmlRegExecPushStringInternal(xmlRegExecCtxtPtr exec, const xmlChar *value, + void *data, int compound) { + xmlRegTransPtr trans; + xmlRegAtomPtr atom; + int ret; + int final = 0; + int progress = 1; + + if (exec == NULL) + return(-1); + if (exec->comp == NULL) + return(-1); + if (exec->status != 0) + return(exec->status); + + if (exec->comp->compact != NULL) + return(xmlRegCompactPushString(exec, exec->comp, value, data)); + + if (value == NULL) { + if (exec->state->type == XML_REGEXP_FINAL_STATE) + return(1); + final = 1; + } + +#ifdef DEBUG_PUSH + printf("value pushed: %s\n", value); +#endif + /* + * If we have an active rollback stack push the new value there + * and get back to where we were left + */ + if ((value != NULL) && (exec->inputStackNr > 0)) { + xmlFARegExecSaveInputString(exec, value, data); + value = exec->inputStack[exec->index].value; + data = exec->inputStack[exec->index].data; +#ifdef DEBUG_PUSH + printf("value loaded: %s\n", value); +#endif + } + + while ((exec->status == 0) && + ((value != NULL) || + ((final == 1) && + (exec->state->type != XML_REGEXP_FINAL_STATE)))) { + + /* + * End of input on non-terminal state, rollback, however we may + * still have epsilon like transition for counted transitions + * on counters, in that case don't break too early. + */ + if ((value == NULL) && (exec->counts == NULL)) + goto rollback; + + exec->transcount = 0; + for (;exec->transno < exec->state->nbTrans;exec->transno++) { + trans = &exec->state->trans[exec->transno]; + if (trans->to < 0) + continue; + atom = trans->atom; + ret = 0; + if (trans->count == REGEXP_ALL_LAX_COUNTER) { + int i; + int count; + xmlRegTransPtr t; + xmlRegCounterPtr counter; + + ret = 0; + +#ifdef DEBUG_PUSH + printf("testing all lax %d\n", trans->count); +#endif + /* + * Check all counted transitions from the current state + */ + if ((value == NULL) && (final)) { + ret = 1; + } else if (value != NULL) { + for (i = 0;i < exec->state->nbTrans;i++) { + t = &exec->state->trans[i]; + if ((t->counter < 0) || (t == trans)) + continue; + counter = &exec->comp->counters[t->counter]; + count = exec->counts[t->counter]; + if ((count < counter->max) && + (t->atom != NULL) && + (xmlStrEqual(value, t->atom->valuep))) { + ret = 0; + break; + } + if ((count >= counter->min) && + (count < counter->max) && + (t->atom != NULL) && + (xmlStrEqual(value, t->atom->valuep))) { + ret = 1; + break; + } + } + } + } else if (trans->count == REGEXP_ALL_COUNTER) { + int i; + int count; + xmlRegTransPtr t; + xmlRegCounterPtr counter; + + ret = 1; + +#ifdef DEBUG_PUSH + printf("testing all %d\n", trans->count); +#endif + /* + * Check all counted transitions from the current state + */ + for (i = 0;i < exec->state->nbTrans;i++) { + t = &exec->state->trans[i]; + if ((t->counter < 0) || (t == trans)) + continue; + counter = &exec->comp->counters[t->counter]; + count = exec->counts[t->counter]; + if ((count < counter->min) || (count > counter->max)) { + ret = 0; + break; + } + } + } else if (trans->count >= 0) { + int count; + xmlRegCounterPtr counter; + + /* + * A counted transition. + */ + + count = exec->counts[trans->count]; + counter = &exec->comp->counters[trans->count]; +#ifdef DEBUG_PUSH + printf("testing count %d: val %d, min %d, max %d\n", + trans->count, count, counter->min, counter->max); +#endif + ret = ((count >= counter->min) && (count <= counter->max)); + } else if (atom == NULL) { + fprintf(stderr, "epsilon transition left at runtime\n"); + exec->status = -2; + break; + } else if (value != NULL) { + ret = xmlRegStrEqualWildcard(atom->valuep, value); + if (atom->neg) { + ret = !ret; + if (!compound) + ret = 0; + } + if ((ret == 1) && (trans->counter >= 0)) { + xmlRegCounterPtr counter; + int count; + + count = exec->counts[trans->counter]; + counter = &exec->comp->counters[trans->counter]; + if (count >= counter->max) + ret = 0; + } + + if ((ret == 1) && (atom->min > 0) && (atom->max > 0)) { + xmlRegStatePtr to = exec->comp->states[trans->to]; + + /* + * this is a multiple input sequence + */ + if (exec->state->nbTrans > exec->transno + 1) { + if (exec->inputStackNr <= 0) { + xmlFARegExecSaveInputString(exec, value, data); + } + xmlFARegExecSave(exec); + } + exec->transcount = 1; + do { + /* + * Try to progress as much as possible on the input + */ + if (exec->transcount == atom->max) { + break; + } + exec->index++; + value = exec->inputStack[exec->index].value; + data = exec->inputStack[exec->index].data; +#ifdef DEBUG_PUSH + printf("value loaded: %s\n", value); +#endif + + /* + * End of input: stop here + */ + if (value == NULL) { + exec->index --; + break; + } + if (exec->transcount >= atom->min) { + int transno = exec->transno; + xmlRegStatePtr state = exec->state; + + /* + * The transition is acceptable save it + */ + exec->transno = -1; /* trick */ + exec->state = to; + if (exec->inputStackNr <= 0) { + xmlFARegExecSaveInputString(exec, value, data); + } + xmlFARegExecSave(exec); + exec->transno = transno; + exec->state = state; + } + ret = xmlStrEqual(value, atom->valuep); + exec->transcount++; + } while (ret == 1); + if (exec->transcount < atom->min) + ret = 0; + + /* + * If the last check failed but one transition was found + * possible, rollback + */ + if (ret < 0) + ret = 0; + if (ret == 0) { + goto rollback; + } + } + } + if (ret == 1) { + if ((exec->callback != NULL) && (atom != NULL) && + (data != NULL)) { + exec->callback(exec->data, atom->valuep, + atom->data, data); + } + if (exec->state->nbTrans > exec->transno + 1) { + if (exec->inputStackNr <= 0) { + xmlFARegExecSaveInputString(exec, value, data); + } + xmlFARegExecSave(exec); + } + if (trans->counter >= 0) { +#ifdef DEBUG_PUSH + printf("Increasing count %d\n", trans->counter); +#endif + exec->counts[trans->counter]++; + } + if ((trans->count >= 0) && + (trans->count < REGEXP_ALL_COUNTER)) { +#ifdef DEBUG_REGEXP_EXEC + printf("resetting count %d on transition\n", + trans->count); +#endif + exec->counts[trans->count] = 0; + } +#ifdef DEBUG_PUSH + printf("entering state %d\n", trans->to); +#endif + if ((exec->comp->states[trans->to] != NULL) && + (exec->comp->states[trans->to]->type == + XML_REGEXP_SINK_STATE)) { + /* + * entering a sink state, save the current state as error + * state. + */ + if (exec->errString != NULL) + xmlFree(exec->errString); + exec->errString = xmlStrdup(value); + exec->errState = exec->state; + memcpy(exec->errCounts, exec->counts, + exec->comp->nbCounters * sizeof(int)); + } + exec->state = exec->comp->states[trans->to]; + exec->transno = 0; + if (trans->atom != NULL) { + if (exec->inputStack != NULL) { + exec->index++; + if (exec->index < exec->inputStackNr) { + value = exec->inputStack[exec->index].value; + data = exec->inputStack[exec->index].data; +#ifdef DEBUG_PUSH + printf("value loaded: %s\n", value); +#endif + } else { + value = NULL; + data = NULL; +#ifdef DEBUG_PUSH + printf("end of input\n"); +#endif + } + } else { + value = NULL; + data = NULL; +#ifdef DEBUG_PUSH + printf("end of input\n"); +#endif + } + } + goto progress; + } else if (ret < 0) { + exec->status = -4; + break; + } + } + if ((exec->transno != 0) || (exec->state->nbTrans == 0)) { +rollback: + /* + * if we didn't yet rollback on the current input + * store the current state as the error state. + */ + if ((progress) && (exec->state != NULL) && + (exec->state->type != XML_REGEXP_SINK_STATE)) { + progress = 0; + if (exec->errString != NULL) + xmlFree(exec->errString); + exec->errString = xmlStrdup(value); + exec->errState = exec->state; + memcpy(exec->errCounts, exec->counts, + exec->comp->nbCounters * sizeof(int)); + } + + /* + * Failed to find a way out + */ + exec->determinist = 0; + xmlFARegExecRollBack(exec); + if (exec->status == 0) { + value = exec->inputStack[exec->index].value; + data = exec->inputStack[exec->index].data; +#ifdef DEBUG_PUSH + printf("value loaded: %s\n", value); +#endif + } + } + continue; +progress: + progress = 1; + continue; + } + if (exec->status == 0) { + return(exec->state->type == XML_REGEXP_FINAL_STATE); + } +#ifdef DEBUG_ERR + if (exec->status < 0) { + testerr(exec); + } +#endif + return(exec->status); +} + +/** + * xmlRegExecPushString: + * @exec: a regexp execution context or NULL to indicate the end + * @value: a string token input + * @data: data associated to the token to reuse in callbacks + * + * Push one input token in the execution context + * + * Returns: 1 if the regexp reached a final state, 0 if non-final, and + * a negative value in case of error. + */ +int +xmlRegExecPushString(xmlRegExecCtxtPtr exec, const xmlChar *value, + void *data) { + return(xmlRegExecPushStringInternal(exec, value, data, 0)); +} + +/** + * xmlRegExecPushString2: + * @exec: a regexp execution context or NULL to indicate the end + * @value: the first string token input + * @value2: the second string token input + * @data: data associated to the token to reuse in callbacks + * + * Push one input token in the execution context + * + * Returns: 1 if the regexp reached a final state, 0 if non-final, and + * a negative value in case of error. + */ +int +xmlRegExecPushString2(xmlRegExecCtxtPtr exec, const xmlChar *value, + const xmlChar *value2, void *data) { + xmlChar buf[150]; + int lenn, lenp, ret; + xmlChar *str; + + if (exec == NULL) + return(-1); + if (exec->comp == NULL) + return(-1); + if (exec->status != 0) + return(exec->status); + + if (value2 == NULL) + return(xmlRegExecPushString(exec, value, data)); + + lenn = strlen((char *) value2); + lenp = strlen((char *) value); + + if (150 < lenn + lenp + 2) { + str = (xmlChar *) xmlMallocAtomic(lenn + lenp + 2); + if (str == NULL) { + exec->status = -1; + return(-1); + } + } else { + str = buf; + } + memcpy(&str[0], value, lenp); + str[lenp] = XML_REG_STRING_SEPARATOR; + memcpy(&str[lenp + 1], value2, lenn); + str[lenn + lenp + 1] = 0; + + if (exec->comp->compact != NULL) + ret = xmlRegCompactPushString(exec, exec->comp, str, data); + else + ret = xmlRegExecPushStringInternal(exec, str, data, 1); + + if (str != buf) + xmlFree(str); + return(ret); +} + +/** + * xmlRegExecGetValues: + * @exec: a regexp execution context + * @err: error extraction or normal one + * @nbval: pointer to the number of accepted values IN/OUT + * @nbneg: return number of negative transitions + * @values: pointer to the array of acceptable values + * @terminal: return value if this was a terminal state + * + * Extract informations from the regexp execution, internal routine to + * implement xmlRegExecNextValues() and xmlRegExecErrInfo() + * + * Returns: 0 in case of success or -1 in case of error. + */ +static int +xmlRegExecGetValues(xmlRegExecCtxtPtr exec, int err, + int *nbval, int *nbneg, + xmlChar **values, int *terminal) { + int maxval; + int nb = 0; + + if ((exec == NULL) || (nbval == NULL) || (nbneg == NULL) || + (values == NULL) || (*nbval <= 0)) + return(-1); + + maxval = *nbval; + *nbval = 0; + *nbneg = 0; + if ((exec->comp != NULL) && (exec->comp->compact != NULL)) { + xmlRegexpPtr comp; + int target, i, state; + + comp = exec->comp; + + if (err) { + if (exec->errStateNo == -1) return(-1); + state = exec->errStateNo; + } else { + state = exec->index; + } + if (terminal != NULL) { + if (comp->compact[state * (comp->nbstrings + 1)] == + XML_REGEXP_FINAL_STATE) + *terminal = 1; + else + *terminal = 0; + } + for (i = 0;(i < comp->nbstrings) && (nb < maxval);i++) { + target = comp->compact[state * (comp->nbstrings + 1) + i + 1]; + if ((target > 0) && (target <= comp->nbstates) && + (comp->compact[(target - 1) * (comp->nbstrings + 1)] != + XML_REGEXP_SINK_STATE)) { + values[nb++] = comp->stringMap[i]; + (*nbval)++; + } + } + for (i = 0;(i < comp->nbstrings) && (nb < maxval);i++) { + target = comp->compact[state * (comp->nbstrings + 1) + i + 1]; + if ((target > 0) && (target <= comp->nbstates) && + (comp->compact[(target - 1) * (comp->nbstrings + 1)] == + XML_REGEXP_SINK_STATE)) { + values[nb++] = comp->stringMap[i]; + (*nbneg)++; + } + } + } else { + int transno; + xmlRegTransPtr trans; + xmlRegAtomPtr atom; + xmlRegStatePtr state; + + if (terminal != NULL) { + if (exec->state->type == XML_REGEXP_FINAL_STATE) + *terminal = 1; + else + *terminal = 0; + } + + if (err) { + if (exec->errState == NULL) return(-1); + state = exec->errState; + } else { + if (exec->state == NULL) return(-1); + state = exec->state; + } + for (transno = 0; + (transno < state->nbTrans) && (nb < maxval); + transno++) { + trans = &state->trans[transno]; + if (trans->to < 0) + continue; + atom = trans->atom; + if ((atom == NULL) || (atom->valuep == NULL)) + continue; + if (trans->count == REGEXP_ALL_LAX_COUNTER) { + /* this should not be reached but ... */ + TODO; + } else if (trans->count == REGEXP_ALL_COUNTER) { + /* this should not be reached but ... */ + TODO; + } else if (trans->counter >= 0) { + xmlRegCounterPtr counter = NULL; + int count; + + if (err) + count = exec->errCounts[trans->counter]; + else + count = exec->counts[trans->counter]; + if (exec->comp != NULL) + counter = &exec->comp->counters[trans->counter]; + if ((counter == NULL) || (count < counter->max)) { + if (atom->neg) + values[nb++] = (xmlChar *) atom->valuep2; + else + values[nb++] = (xmlChar *) atom->valuep; + (*nbval)++; + } + } else { + if ((exec->comp->states[trans->to] != NULL) && + (exec->comp->states[trans->to]->type != + XML_REGEXP_SINK_STATE)) { + if (atom->neg) + values[nb++] = (xmlChar *) atom->valuep2; + else + values[nb++] = (xmlChar *) atom->valuep; + (*nbval)++; + } + } + } + for (transno = 0; + (transno < state->nbTrans) && (nb < maxval); + transno++) { + trans = &state->trans[transno]; + if (trans->to < 0) + continue; + atom = trans->atom; + if ((atom == NULL) || (atom->valuep == NULL)) + continue; + if (trans->count == REGEXP_ALL_LAX_COUNTER) { + continue; + } else if (trans->count == REGEXP_ALL_COUNTER) { + continue; + } else if (trans->counter >= 0) { + continue; + } else { + if ((exec->comp->states[trans->to] != NULL) && + (exec->comp->states[trans->to]->type == + XML_REGEXP_SINK_STATE)) { + if (atom->neg) + values[nb++] = (xmlChar *) atom->valuep2; + else + values[nb++] = (xmlChar *) atom->valuep; + (*nbneg)++; + } + } + } + } + return(0); +} + +/** + * xmlRegExecNextValues: + * @exec: a regexp execution context + * @nbval: pointer to the number of accepted values IN/OUT + * @nbneg: return number of negative transitions + * @values: pointer to the array of acceptable values + * @terminal: return value if this was a terminal state + * + * Extract informations from the regexp execution, + * the parameter @values must point to an array of @nbval string pointers + * on return nbval will contain the number of possible strings in that + * state and the @values array will be updated with them. The string values + * returned will be freed with the @exec context and don't need to be + * deallocated. + * + * Returns: 0 in case of success or -1 in case of error. + */ +int +xmlRegExecNextValues(xmlRegExecCtxtPtr exec, int *nbval, int *nbneg, + xmlChar **values, int *terminal) { + return(xmlRegExecGetValues(exec, 0, nbval, nbneg, values, terminal)); +} + +/** + * xmlRegExecErrInfo: + * @exec: a regexp execution context generating an error + * @string: return value for the error string + * @nbval: pointer to the number of accepted values IN/OUT + * @nbneg: return number of negative transitions + * @values: pointer to the array of acceptable values + * @terminal: return value if this was a terminal state + * + * Extract error informations from the regexp execution, the parameter + * @string will be updated with the value pushed and not accepted, + * the parameter @values must point to an array of @nbval string pointers + * on return nbval will contain the number of possible strings in that + * state and the @values array will be updated with them. The string values + * returned will be freed with the @exec context and don't need to be + * deallocated. + * + * Returns: 0 in case of success or -1 in case of error. + */ +int +xmlRegExecErrInfo(xmlRegExecCtxtPtr exec, const xmlChar **string, + int *nbval, int *nbneg, xmlChar **values, int *terminal) { + if (exec == NULL) + return(-1); + if (string != NULL) { + if (exec->status != 0) + *string = exec->errString; + else + *string = NULL; + } + return(xmlRegExecGetValues(exec, 1, nbval, nbneg, values, terminal)); +} + +#ifdef DEBUG_ERR +static void testerr(xmlRegExecCtxtPtr exec) { + const xmlChar *string; + xmlChar *values[5]; + int nb = 5; + int nbneg; + int terminal; + xmlRegExecErrInfo(exec, &string, &nb, &nbneg, &values[0], &terminal); +} +#endif + +#if 0 +static int +xmlRegExecPushChar(xmlRegExecCtxtPtr exec, int UCS) { + xmlRegTransPtr trans; + xmlRegAtomPtr atom; + int ret; + int codepoint, len; + + if (exec == NULL) + return(-1); + if (exec->status != 0) + return(exec->status); + + while ((exec->status == 0) && + ((exec->inputString[exec->index] != 0) || + (exec->state->type != XML_REGEXP_FINAL_STATE))) { + + /* + * End of input on non-terminal state, rollback, however we may + * still have epsilon like transition for counted transitions + * on counters, in that case don't break too early. + */ + if ((exec->inputString[exec->index] == 0) && (exec->counts == NULL)) + goto rollback; + + exec->transcount = 0; + for (;exec->transno < exec->state->nbTrans;exec->transno++) { + trans = &exec->state->trans[exec->transno]; + if (trans->to < 0) + continue; + atom = trans->atom; + ret = 0; + if (trans->count >= 0) { + int count; + xmlRegCounterPtr counter; + + /* + * A counted transition. + */ + + count = exec->counts[trans->count]; + counter = &exec->comp->counters[trans->count]; +#ifdef DEBUG_REGEXP_EXEC + printf("testing count %d: val %d, min %d, max %d\n", + trans->count, count, counter->min, counter->max); +#endif + ret = ((count >= counter->min) && (count <= counter->max)); + } else if (atom == NULL) { + fprintf(stderr, "epsilon transition left at runtime\n"); + exec->status = -2; + break; + } else if (exec->inputString[exec->index] != 0) { + codepoint = CUR_SCHAR(&(exec->inputString[exec->index]), len); + ret = xmlRegCheckCharacter(atom, codepoint); + if ((ret == 1) && (atom->min > 0) && (atom->max > 0)) { + xmlRegStatePtr to = exec->comp->states[trans->to]; + + /* + * this is a multiple input sequence + */ + if (exec->state->nbTrans > exec->transno + 1) { + xmlFARegExecSave(exec); + } + exec->transcount = 1; + do { + /* + * Try to progress as much as possible on the input + */ + if (exec->transcount == atom->max) { + break; + } + exec->index += len; + /* + * End of input: stop here + */ + if (exec->inputString[exec->index] == 0) { + exec->index -= len; + break; + } + if (exec->transcount >= atom->min) { + int transno = exec->transno; + xmlRegStatePtr state = exec->state; + + /* + * The transition is acceptable save it + */ + exec->transno = -1; /* trick */ + exec->state = to; + xmlFARegExecSave(exec); + exec->transno = transno; + exec->state = state; + } + codepoint = CUR_SCHAR(&(exec->inputString[exec->index]), + len); + ret = xmlRegCheckCharacter(atom, codepoint); + exec->transcount++; + } while (ret == 1); + if (exec->transcount < atom->min) + ret = 0; + + /* + * If the last check failed but one transition was found + * possible, rollback + */ + if (ret < 0) + ret = 0; + if (ret == 0) { + goto rollback; + } + } + } + if (ret == 1) { + if (exec->state->nbTrans > exec->transno + 1) { + xmlFARegExecSave(exec); + } + /* + * restart count for expressions like this ((abc){2})* + */ + if (trans->count >= 0) { +#ifdef DEBUG_REGEXP_EXEC + printf("Reset count %d\n", trans->count); +#endif + exec->counts[trans->count] = 0; + } + if (trans->counter >= 0) { +#ifdef DEBUG_REGEXP_EXEC + printf("Increasing count %d\n", trans->counter); +#endif + exec->counts[trans->counter]++; + } +#ifdef DEBUG_REGEXP_EXEC + printf("entering state %d\n", trans->to); +#endif + exec->state = exec->comp->states[trans->to]; + exec->transno = 0; + if (trans->atom != NULL) { + exec->index += len; + } + goto progress; + } else if (ret < 0) { + exec->status = -4; + break; + } + } + if ((exec->transno != 0) || (exec->state->nbTrans == 0)) { +rollback: + /* + * Failed to find a way out + */ + exec->determinist = 0; + xmlFARegExecRollBack(exec); + } +progress: + continue; + } +} +#endif +/************************************************************************ + * * + * Parser for the Schemas Datatype Regular Expressions * + * http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/#regexs * + * * + ************************************************************************/ + +/** + * xmlFAIsChar: + * @ctxt: a regexp parser context + * + * [10] Char ::= [^.\?*+()|#x5B#x5D] + */ +static int +xmlFAIsChar(xmlRegParserCtxtPtr ctxt) { + int cur; + int len; + + cur = CUR_SCHAR(ctxt->cur, len); + if ((cur == '.') || (cur == '\\') || (cur == '?') || + (cur == '*') || (cur == '+') || (cur == '(') || + (cur == ')') || (cur == '|') || (cur == 0x5B) || + (cur == 0x5D) || (cur == 0)) + return(-1); + return(cur); +} + +/** + * xmlFAParseCharProp: + * @ctxt: a regexp parser context + * + * [27] charProp ::= IsCategory | IsBlock + * [28] IsCategory ::= Letters | Marks | Numbers | Punctuation | + * Separators | Symbols | Others + * [29] Letters ::= 'L' [ultmo]? + * [30] Marks ::= 'M' [nce]? + * [31] Numbers ::= 'N' [dlo]? + * [32] Punctuation ::= 'P' [cdseifo]? + * [33] Separators ::= 'Z' [slp]? + * [34] Symbols ::= 'S' [mcko]? + * [35] Others ::= 'C' [cfon]? + * [36] IsBlock ::= 'Is' [a-zA-Z0-9#x2D]+ + */ +static void +xmlFAParseCharProp(xmlRegParserCtxtPtr ctxt) { + int cur; + xmlRegAtomType type = (xmlRegAtomType) 0; + xmlChar *blockName = NULL; + + cur = CUR; + if (cur == 'L') { + NEXT; + cur = CUR; + if (cur == 'u') { + NEXT; + type = XML_REGEXP_LETTER_UPPERCASE; + } else if (cur == 'l') { + NEXT; + type = XML_REGEXP_LETTER_LOWERCASE; + } else if (cur == 't') { + NEXT; + type = XML_REGEXP_LETTER_TITLECASE; + } else if (cur == 'm') { + NEXT; + type = XML_REGEXP_LETTER_MODIFIER; + } else if (cur == 'o') { + NEXT; + type = XML_REGEXP_LETTER_OTHERS; + } else { + type = XML_REGEXP_LETTER; + } + } else if (cur == 'M') { + NEXT; + cur = CUR; + if (cur == 'n') { + NEXT; + /* nonspacing */ + type = XML_REGEXP_MARK_NONSPACING; + } else if (cur == 'c') { + NEXT; + /* spacing combining */ + type = XML_REGEXP_MARK_SPACECOMBINING; + } else if (cur == 'e') { + NEXT; + /* enclosing */ + type = XML_REGEXP_MARK_ENCLOSING; + } else { + /* all marks */ + type = XML_REGEXP_MARK; + } + } else if (cur == 'N') { + NEXT; + cur = CUR; + if (cur == 'd') { + NEXT; + /* digital */ + type = XML_REGEXP_NUMBER_DECIMAL; + } else if (cur == 'l') { + NEXT; + /* letter */ + type = XML_REGEXP_NUMBER_LETTER; + } else if (cur == 'o') { + NEXT; + /* other */ + type = XML_REGEXP_NUMBER_OTHERS; + } else { + /* all numbers */ + type = XML_REGEXP_NUMBER; + } + } else if (cur == 'P') { + NEXT; + cur = CUR; + if (cur == 'c') { + NEXT; + /* connector */ + type = XML_REGEXP_PUNCT_CONNECTOR; + } else if (cur == 'd') { + NEXT; + /* dash */ + type = XML_REGEXP_PUNCT_DASH; + } else if (cur == 's') { + NEXT; + /* open */ + type = XML_REGEXP_PUNCT_OPEN; + } else if (cur == 'e') { + NEXT; + /* close */ + type = XML_REGEXP_PUNCT_CLOSE; + } else if (cur == 'i') { + NEXT; + /* initial quote */ + type = XML_REGEXP_PUNCT_INITQUOTE; + } else if (cur == 'f') { + NEXT; + /* final quote */ + type = XML_REGEXP_PUNCT_FINQUOTE; + } else if (cur == 'o') { + NEXT; + /* other */ + type = XML_REGEXP_PUNCT_OTHERS; + } else { + /* all punctuation */ + type = XML_REGEXP_PUNCT; + } + } else if (cur == 'Z') { + NEXT; + cur = CUR; + if (cur == 's') { + NEXT; + /* space */ + type = XML_REGEXP_SEPAR_SPACE; + } else if (cur == 'l') { + NEXT; + /* line */ + type = XML_REGEXP_SEPAR_LINE; + } else if (cur == 'p') { + NEXT; + /* paragraph */ + type = XML_REGEXP_SEPAR_PARA; + } else { + /* all separators */ + type = XML_REGEXP_SEPAR; + } + } else if (cur == 'S') { + NEXT; + cur = CUR; + if (cur == 'm') { + NEXT; + type = XML_REGEXP_SYMBOL_MATH; + /* math */ + } else if (cur == 'c') { + NEXT; + type = XML_REGEXP_SYMBOL_CURRENCY; + /* currency */ + } else if (cur == 'k') { + NEXT; + type = XML_REGEXP_SYMBOL_MODIFIER; + /* modifiers */ + } else if (cur == 'o') { + NEXT; + type = XML_REGEXP_SYMBOL_OTHERS; + /* other */ + } else { + /* all symbols */ + type = XML_REGEXP_SYMBOL; + } + } else if (cur == 'C') { + NEXT; + cur = CUR; + if (cur == 'c') { + NEXT; + /* control */ + type = XML_REGEXP_OTHER_CONTROL; + } else if (cur == 'f') { + NEXT; + /* format */ + type = XML_REGEXP_OTHER_FORMAT; + } else if (cur == 'o') { + NEXT; + /* private use */ + type = XML_REGEXP_OTHER_PRIVATE; + } else if (cur == 'n') { + NEXT; + /* not assigned */ + type = XML_REGEXP_OTHER_NA; + } else { + /* all others */ + type = XML_REGEXP_OTHER; + } + } else if (cur == 'I') { + const xmlChar *start; + NEXT; + cur = CUR; + if (cur != 's') { + ERROR("IsXXXX expected"); + return; + } + NEXT; + start = ctxt->cur; + cur = CUR; + if (((cur >= 'a') && (cur <= 'z')) || + ((cur >= 'A') && (cur <= 'Z')) || + ((cur >= '0') && (cur <= '9')) || + (cur == 0x2D)) { + NEXT; + cur = CUR; + while (((cur >= 'a') && (cur <= 'z')) || + ((cur >= 'A') && (cur <= 'Z')) || + ((cur >= '0') && (cur <= '9')) || + (cur == 0x2D)) { + NEXT; + cur = CUR; + } + } + type = XML_REGEXP_BLOCK_NAME; + blockName = xmlStrndup(start, ctxt->cur - start); + } else { + ERROR("Unknown char property"); + return; + } + if (ctxt->atom == NULL) { + ctxt->atom = xmlRegNewAtom(ctxt, type); + if (ctxt->atom != NULL) + ctxt->atom->valuep = blockName; + } else if (ctxt->atom->type == XML_REGEXP_RANGES) { + xmlRegAtomAddRange(ctxt, ctxt->atom, ctxt->neg, + type, 0, 0, blockName); + } +} + +/** + * xmlFAParseCharClassEsc: + * @ctxt: a regexp parser context + * + * [23] charClassEsc ::= ( SingleCharEsc | MultiCharEsc | catEsc | complEsc ) + * [24] SingleCharEsc ::= '\' [nrt\|.?*+(){}#x2D#x5B#x5D#x5E] + * [25] catEsc ::= '\p{' charProp '}' + * [26] complEsc ::= '\P{' charProp '}' + * [37] MultiCharEsc ::= '.' | ('\' [sSiIcCdDwW]) + */ +static void +xmlFAParseCharClassEsc(xmlRegParserCtxtPtr ctxt) { + int cur; + + if (CUR == '.') { + if (ctxt->atom == NULL) { + ctxt->atom = xmlRegNewAtom(ctxt, XML_REGEXP_ANYCHAR); + } else if (ctxt->atom->type == XML_REGEXP_RANGES) { + xmlRegAtomAddRange(ctxt, ctxt->atom, ctxt->neg, + XML_REGEXP_ANYCHAR, 0, 0, NULL); + } + NEXT; + return; + } + if (CUR != '\\') { + ERROR("Escaped sequence: expecting \\"); + return; + } + NEXT; + cur = CUR; + if (cur == 'p') { + NEXT; + if (CUR != '{') { + ERROR("Expecting '{'"); + return; + } + NEXT; + xmlFAParseCharProp(ctxt); + if (CUR != '}') { + ERROR("Expecting '}'"); + return; + } + NEXT; + } else if (cur == 'P') { + NEXT; + if (CUR != '{') { + ERROR("Expecting '{'"); + return; + } + NEXT; + xmlFAParseCharProp(ctxt); + ctxt->atom->neg = 1; + if (CUR != '}') { + ERROR("Expecting '}'"); + return; + } + NEXT; + } else if ((cur == 'n') || (cur == 'r') || (cur == 't') || (cur == '\\') || + (cur == '|') || (cur == '.') || (cur == '?') || (cur == '*') || + (cur == '+') || (cur == '(') || (cur == ')') || (cur == '{') || + (cur == '}') || (cur == 0x2D) || (cur == 0x5B) || (cur == 0x5D) || + (cur == 0x5E)) { + if (ctxt->atom == NULL) { + ctxt->atom = xmlRegNewAtom(ctxt, XML_REGEXP_CHARVAL); + if (ctxt->atom != NULL) { + switch (cur) { + case 'n': + ctxt->atom->codepoint = '\n'; + break; + case 'r': + ctxt->atom->codepoint = '\r'; + break; + case 't': + ctxt->atom->codepoint = '\t'; + break; + default: + ctxt->atom->codepoint = cur; + } + } + } else if (ctxt->atom->type == XML_REGEXP_RANGES) { + switch (cur) { + case 'n': + cur = '\n'; + break; + case 'r': + cur = '\r'; + break; + case 't': + cur = '\t'; + break; + } + xmlRegAtomAddRange(ctxt, ctxt->atom, ctxt->neg, + XML_REGEXP_CHARVAL, cur, cur, NULL); + } + NEXT; + } else if ((cur == 's') || (cur == 'S') || (cur == 'i') || (cur == 'I') || + (cur == 'c') || (cur == 'C') || (cur == 'd') || (cur == 'D') || + (cur == 'w') || (cur == 'W')) { + xmlRegAtomType type = XML_REGEXP_ANYSPACE; + + switch (cur) { + case 's': + type = XML_REGEXP_ANYSPACE; + break; + case 'S': + type = XML_REGEXP_NOTSPACE; + break; + case 'i': + type = XML_REGEXP_INITNAME; + break; + case 'I': + type = XML_REGEXP_NOTINITNAME; + break; + case 'c': + type = XML_REGEXP_NAMECHAR; + break; + case 'C': + type = XML_REGEXP_NOTNAMECHAR; + break; + case 'd': + type = XML_REGEXP_DECIMAL; + break; + case 'D': + type = XML_REGEXP_NOTDECIMAL; + break; + case 'w': + type = XML_REGEXP_REALCHAR; + break; + case 'W': + type = XML_REGEXP_NOTREALCHAR; + break; + } + NEXT; + if (ctxt->atom == NULL) { + ctxt->atom = xmlRegNewAtom(ctxt, type); + } else if (ctxt->atom->type == XML_REGEXP_RANGES) { + xmlRegAtomAddRange(ctxt, ctxt->atom, ctxt->neg, + type, 0, 0, NULL); + } + } else { + ERROR("Wrong escape sequence, misuse of character '\\'"); + } +} + +/** + * xmlFAParseCharRange: + * @ctxt: a regexp parser context + * + * [17] charRange ::= seRange | XmlCharRef | XmlCharIncDash + * [18] seRange ::= charOrEsc '-' charOrEsc + * [20] charOrEsc ::= XmlChar | SingleCharEsc + * [21] XmlChar ::= [^\#x2D#x5B#x5D] + * [22] XmlCharIncDash ::= [^\#x5B#x5D] + */ +static void +xmlFAParseCharRange(xmlRegParserCtxtPtr ctxt) { + int cur, len; + int start = -1; + int end = -1; + + if (CUR == '\0') { + ERROR("Expecting ']'"); + return; + } + + cur = CUR; + if (cur == '\\') { + NEXT; + cur = CUR; + switch (cur) { + case 'n': start = 0xA; break; + case 'r': start = 0xD; break; + case 't': start = 0x9; break; + case '\\': case '|': case '.': case '-': case '^': case '?': + case '*': case '+': case '{': case '}': case '(': case ')': + case '[': case ']': + start = cur; break; + default: + ERROR("Invalid escape value"); + return; + } + end = start; + len = 1; + } else if ((cur != 0x5B) && (cur != 0x5D)) { + end = start = CUR_SCHAR(ctxt->cur, len); + } else { + ERROR("Expecting a char range"); + return; + } + /* + * Since we are "inside" a range, we can assume ctxt->cur is past + * the start of ctxt->string, and PREV should be safe + */ + if ((start == '-') && (NXT(1) != ']') && (PREV != '[') && (PREV != '^')) { + NEXTL(len); + return; + } + NEXTL(len); + cur = CUR; + if ((cur != '-') || (NXT(1) == ']')) { + xmlRegAtomAddRange(ctxt, ctxt->atom, ctxt->neg, + XML_REGEXP_CHARVAL, start, end, NULL); + return; + } + NEXT; + cur = CUR; + if (cur == '\\') { + NEXT; + cur = CUR; + switch (cur) { + case 'n': end = 0xA; break; + case 'r': end = 0xD; break; + case 't': end = 0x9; break; + case '\\': case '|': case '.': case '-': case '^': case '?': + case '*': case '+': case '{': case '}': case '(': case ')': + case '[': case ']': + end = cur; break; + default: + ERROR("Invalid escape value"); + return; + } + len = 1; + } else if ((cur != 0x5B) && (cur != 0x5D)) { + end = CUR_SCHAR(ctxt->cur, len); + } else { + ERROR("Expecting the end of a char range"); + return; + } + NEXTL(len); + /* TODO check that the values are acceptable character ranges for XML */ + if (end < start) { + ERROR("End of range is before start of range"); + } else { + xmlRegAtomAddRange(ctxt, ctxt->atom, ctxt->neg, + XML_REGEXP_CHARVAL, start, end, NULL); + } + return; +} + +/** + * xmlFAParsePosCharGroup: + * @ctxt: a regexp parser context + * + * [14] posCharGroup ::= ( charRange | charClassEsc )+ + */ +static void +xmlFAParsePosCharGroup(xmlRegParserCtxtPtr ctxt) { + do { + if (CUR == '\\') { + xmlFAParseCharClassEsc(ctxt); + } else { + xmlFAParseCharRange(ctxt); + } + } while ((CUR != ']') && (CUR != '^') && (CUR != '-') && + (CUR != 0) && (ctxt->error == 0)); +} + +/** + * xmlFAParseCharGroup: + * @ctxt: a regexp parser context + * + * [13] charGroup ::= posCharGroup | negCharGroup | charClassSub + * [15] negCharGroup ::= '^' posCharGroup + * [16] charClassSub ::= ( posCharGroup | negCharGroup ) '-' charClassExpr + * [12] charClassExpr ::= '[' charGroup ']' + */ +static void +xmlFAParseCharGroup(xmlRegParserCtxtPtr ctxt) { + int n = ctxt->neg; + while ((CUR != ']') && (ctxt->error == 0)) { + if (CUR == '^') { + int neg = ctxt->neg; + + NEXT; + ctxt->neg = !ctxt->neg; + xmlFAParsePosCharGroup(ctxt); + ctxt->neg = neg; + } else if ((CUR == '-') && (NXT(1) == '[')) { + int neg = ctxt->neg; + ctxt->neg = 2; + NEXT; /* eat the '-' */ + NEXT; /* eat the '[' */ + xmlFAParseCharGroup(ctxt); + if (CUR == ']') { + NEXT; + } else { + ERROR("charClassExpr: ']' expected"); + break; + } + ctxt->neg = neg; + break; + } else if (CUR != ']') { + xmlFAParsePosCharGroup(ctxt); + } + } + ctxt->neg = n; +} + +/** + * xmlFAParseCharClass: + * @ctxt: a regexp parser context + * + * [11] charClass ::= charClassEsc | charClassExpr + * [12] charClassExpr ::= '[' charGroup ']' + */ +static void +xmlFAParseCharClass(xmlRegParserCtxtPtr ctxt) { + if (CUR == '[') { + NEXT; + ctxt->atom = xmlRegNewAtom(ctxt, XML_REGEXP_RANGES); + if (ctxt->atom == NULL) + return; + xmlFAParseCharGroup(ctxt); + if (CUR == ']') { + NEXT; + } else { + ERROR("xmlFAParseCharClass: ']' expected"); + } + } else { + xmlFAParseCharClassEsc(ctxt); + } +} + +/** + * xmlFAParseQuantExact: + * @ctxt: a regexp parser context + * + * [8] QuantExact ::= [0-9]+ + * + * Returns 0 if success or -1 in case of error + */ +static int +xmlFAParseQuantExact(xmlRegParserCtxtPtr ctxt) { + int ret = 0; + int ok = 0; + + while ((CUR >= '0') && (CUR <= '9')) { + ret = ret * 10 + (CUR - '0'); + ok = 1; + NEXT; + } + if (ok != 1) { + return(-1); + } + return(ret); +} + +/** + * xmlFAParseQuantifier: + * @ctxt: a regexp parser context + * + * [4] quantifier ::= [?*+] | ( '{' quantity '}' ) + * [5] quantity ::= quantRange | quantMin | QuantExact + * [6] quantRange ::= QuantExact ',' QuantExact + * [7] quantMin ::= QuantExact ',' + * [8] QuantExact ::= [0-9]+ + */ +static int +xmlFAParseQuantifier(xmlRegParserCtxtPtr ctxt) { + int cur; + + cur = CUR; + if ((cur == '?') || (cur == '*') || (cur == '+')) { + if (ctxt->atom != NULL) { + if (cur == '?') + ctxt->atom->quant = XML_REGEXP_QUANT_OPT; + else if (cur == '*') + ctxt->atom->quant = XML_REGEXP_QUANT_MULT; + else if (cur == '+') + ctxt->atom->quant = XML_REGEXP_QUANT_PLUS; + } + NEXT; + return(1); + } + if (cur == '{') { + int min = 0, max = 0; + + NEXT; + cur = xmlFAParseQuantExact(ctxt); + if (cur >= 0) + min = cur; + if (CUR == ',') { + NEXT; + if (CUR == '}') + max = INT_MAX; + else { + cur = xmlFAParseQuantExact(ctxt); + if (cur >= 0) + max = cur; + else { + ERROR("Improper quantifier"); + } + } + } + if (CUR == '}') { + NEXT; + } else { + ERROR("Unterminated quantifier"); + } + if (max == 0) + max = min; + if (ctxt->atom != NULL) { + ctxt->atom->quant = XML_REGEXP_QUANT_RANGE; + ctxt->atom->min = min; + ctxt->atom->max = max; + } + return(1); + } + return(0); +} + +/** + * xmlFAParseAtom: + * @ctxt: a regexp parser context + * + * [9] atom ::= Char | charClass | ( '(' regExp ')' ) + */ +static int +xmlFAParseAtom(xmlRegParserCtxtPtr ctxt) { + int codepoint, len; + + codepoint = xmlFAIsChar(ctxt); + if (codepoint > 0) { + ctxt->atom = xmlRegNewAtom(ctxt, XML_REGEXP_CHARVAL); + if (ctxt->atom == NULL) + return(-1); + codepoint = CUR_SCHAR(ctxt->cur, len); + ctxt->atom->codepoint = codepoint; + NEXTL(len); + return(1); + } else if (CUR == '|') { + return(0); + } else if (CUR == 0) { + return(0); + } else if (CUR == ')') { + return(0); + } else if (CUR == '(') { + xmlRegStatePtr start, oldend, start0; + + NEXT; + /* + * this extra Epsilon transition is needed if we count with 0 allowed + * unfortunately this can't be known at that point + */ + xmlFAGenerateEpsilonTransition(ctxt, ctxt->state, NULL); + start0 = ctxt->state; + xmlFAGenerateEpsilonTransition(ctxt, ctxt->state, NULL); + start = ctxt->state; + oldend = ctxt->end; + ctxt->end = NULL; + ctxt->atom = NULL; + xmlFAParseRegExp(ctxt, 0); + if (CUR == ')') { + NEXT; + } else { + ERROR("xmlFAParseAtom: expecting ')'"); + } + ctxt->atom = xmlRegNewAtom(ctxt, XML_REGEXP_SUBREG); + if (ctxt->atom == NULL) + return(-1); + ctxt->atom->start = start; + ctxt->atom->start0 = start0; + ctxt->atom->stop = ctxt->state; + ctxt->end = oldend; + return(1); + } else if ((CUR == '[') || (CUR == '\\') || (CUR == '.')) { + xmlFAParseCharClass(ctxt); + return(1); + } + return(0); +} + +/** + * xmlFAParsePiece: + * @ctxt: a regexp parser context + * + * [3] piece ::= atom quantifier? + */ +static int +xmlFAParsePiece(xmlRegParserCtxtPtr ctxt) { + int ret; + + ctxt->atom = NULL; + ret = xmlFAParseAtom(ctxt); + if (ret == 0) + return(0); + if (ctxt->atom == NULL) { + ERROR("internal: no atom generated"); + } + xmlFAParseQuantifier(ctxt); + return(1); +} + +/** + * xmlFAParseBranch: + * @ctxt: a regexp parser context + * @to: optional target to the end of the branch + * + * @to is used to optimize by removing duplicate path in automata + * in expressions like (a|b)(c|d) + * + * [2] branch ::= piece* + */ +static int +xmlFAParseBranch(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr to) { + xmlRegStatePtr previous; + int ret; + + previous = ctxt->state; + ret = xmlFAParsePiece(ctxt); + if (ret != 0) { + if (xmlFAGenerateTransitions(ctxt, previous, + (CUR=='|' || CUR==')') ? to : NULL, ctxt->atom) < 0) + return(-1); + previous = ctxt->state; + ctxt->atom = NULL; + } + while ((ret != 0) && (ctxt->error == 0)) { + ret = xmlFAParsePiece(ctxt); + if (ret != 0) { + if (xmlFAGenerateTransitions(ctxt, previous, + (CUR=='|' || CUR==')') ? to : NULL, ctxt->atom) < 0) + return(-1); + previous = ctxt->state; + ctxt->atom = NULL; + } + } + return(0); +} + +/** + * xmlFAParseRegExp: + * @ctxt: a regexp parser context + * @top: is this the top-level expression ? + * + * [1] regExp ::= branch ( '|' branch )* + */ +static void +xmlFAParseRegExp(xmlRegParserCtxtPtr ctxt, int top) { + xmlRegStatePtr start, end; + + /* if not top start should have been generated by an epsilon trans */ + start = ctxt->state; + ctxt->end = NULL; + xmlFAParseBranch(ctxt, NULL); + if (top) { +#ifdef DEBUG_REGEXP_GRAPH + printf("State %d is final\n", ctxt->state->no); +#endif + ctxt->state->type = XML_REGEXP_FINAL_STATE; + } + if (CUR != '|') { + ctxt->end = ctxt->state; + return; + } + end = ctxt->state; + while ((CUR == '|') && (ctxt->error == 0)) { + NEXT; + if (CUR == 0) { + ERROR("expecting a branch after |") + return; + } + ctxt->state = start; + ctxt->end = NULL; + xmlFAParseBranch(ctxt, end); + } + if (!top) { + ctxt->state = end; + ctxt->end = end; + } +} + +/************************************************************************ + * * + * The basic API * + * * + ************************************************************************/ + +/** + * xmlRegexpPrint: + * @output: the file for the output debug + * @regexp: the compiled regexp + * + * Print the content of the compiled regular expression + */ +void +xmlRegexpPrint(FILE *output, xmlRegexpPtr regexp) { + int i; + + if (output == NULL) + return; + fprintf(output, " regexp: "); + if (regexp == NULL) { + fprintf(output, "NULL\n"); + return; + } + fprintf(output, "'%s' ", regexp->string); + fprintf(output, "\n"); + fprintf(output, "%d atoms:\n", regexp->nbAtoms); + for (i = 0;i < regexp->nbAtoms; i++) { + fprintf(output, " %02d ", i); + xmlRegPrintAtom(output, regexp->atoms[i]); + } + fprintf(output, "%d states:", regexp->nbStates); + fprintf(output, "\n"); + for (i = 0;i < regexp->nbStates; i++) { + xmlRegPrintState(output, regexp->states[i]); + } + fprintf(output, "%d counters:\n", regexp->nbCounters); + for (i = 0;i < regexp->nbCounters; i++) { + fprintf(output, " %d: min %d max %d\n", i, regexp->counters[i].min, + regexp->counters[i].max); + } +} + +/** + * xmlRegexpCompile: + * @regexp: a regular expression string + * + * Parses a regular expression conforming to XML Schemas Part 2 Datatype + * Appendix F and builds an automata suitable for testing strings against + * that regular expression + * + * Returns the compiled expression or NULL in case of error + */ +xmlRegexpPtr +xmlRegexpCompile(const xmlChar *regexp) { + xmlRegexpPtr ret; + xmlRegParserCtxtPtr ctxt; + + ctxt = xmlRegNewParserCtxt(regexp); + if (ctxt == NULL) + return(NULL); + + /* initialize the parser */ + ctxt->end = NULL; + ctxt->start = ctxt->state = xmlRegNewState(ctxt); + xmlRegStatePush(ctxt, ctxt->start); + + /* parse the expression building an automata */ + xmlFAParseRegExp(ctxt, 1); + if (CUR != 0) { + ERROR("xmlFAParseRegExp: extra characters"); + } + if (ctxt->error != 0) { + xmlRegFreeParserCtxt(ctxt); + return(NULL); + } + ctxt->end = ctxt->state; + ctxt->start->type = XML_REGEXP_START_STATE; + ctxt->end->type = XML_REGEXP_FINAL_STATE; + + /* remove the Epsilon except for counted transitions */ + xmlFAEliminateEpsilonTransitions(ctxt); + + + if (ctxt->error != 0) { + xmlRegFreeParserCtxt(ctxt); + return(NULL); + } + ret = xmlRegEpxFromParse(ctxt); + xmlRegFreeParserCtxt(ctxt); + return(ret); +} + +/** + * xmlRegexpExec: + * @comp: the compiled regular expression + * @content: the value to check against the regular expression + * + * Check if the regular expression generates the value + * + * Returns 1 if it matches, 0 if not and a negative value in case of error + */ +int +xmlRegexpExec(xmlRegexpPtr comp, const xmlChar *content) { + if ((comp == NULL) || (content == NULL)) + return(-1); + return(xmlFARegExec(comp, content)); +} + +/** + * xmlRegexpIsDeterminist: + * @comp: the compiled regular expression + * + * Check if the regular expression is determinist + * + * Returns 1 if it yes, 0 if not and a negative value in case of error + */ +int +xmlRegexpIsDeterminist(xmlRegexpPtr comp) { + xmlAutomataPtr am; + int ret; + + if (comp == NULL) + return(-1); + if (comp->determinist != -1) + return(comp->determinist); + + am = xmlNewAutomata(); + if (am->states != NULL) { + int i; + + for (i = 0;i < am->nbStates;i++) + xmlRegFreeState(am->states[i]); + xmlFree(am->states); + } + am->nbAtoms = comp->nbAtoms; + am->atoms = comp->atoms; + am->nbStates = comp->nbStates; + am->states = comp->states; + am->determinist = -1; + am->flags = comp->flags; + ret = xmlFAComputesDeterminism(am); + am->atoms = NULL; + am->states = NULL; + xmlFreeAutomata(am); + comp->determinist = ret; + return(ret); +} + +/** + * xmlRegFreeRegexp: + * @regexp: the regexp + * + * Free a regexp + */ +void +xmlRegFreeRegexp(xmlRegexpPtr regexp) { + int i; + if (regexp == NULL) + return; + + if (regexp->string != NULL) + xmlFree(regexp->string); + if (regexp->states != NULL) { + for (i = 0;i < regexp->nbStates;i++) + xmlRegFreeState(regexp->states[i]); + xmlFree(regexp->states); + } + if (regexp->atoms != NULL) { + for (i = 0;i < regexp->nbAtoms;i++) + xmlRegFreeAtom(regexp->atoms[i]); + xmlFree(regexp->atoms); + } + if (regexp->counters != NULL) + xmlFree(regexp->counters); + if (regexp->compact != NULL) + xmlFree(regexp->compact); + if (regexp->transdata != NULL) + xmlFree(regexp->transdata); + if (regexp->stringMap != NULL) { + for (i = 0; i < regexp->nbstrings;i++) + xmlFree(regexp->stringMap[i]); + xmlFree(regexp->stringMap); + } + + xmlFree(regexp); +} + +#ifdef LIBXML_AUTOMATA_ENABLED +/************************************************************************ + * * + * The Automata interface * + * * + ************************************************************************/ + +/** + * xmlNewAutomata: + * + * Create a new automata + * + * Returns the new object or NULL in case of failure + */ +xmlAutomataPtr +xmlNewAutomata(void) { + xmlAutomataPtr ctxt; + + ctxt = xmlRegNewParserCtxt(NULL); + if (ctxt == NULL) + return(NULL); + + /* initialize the parser */ + ctxt->end = NULL; + ctxt->start = ctxt->state = xmlRegNewState(ctxt); + if (ctxt->start == NULL) { + xmlFreeAutomata(ctxt); + return(NULL); + } + ctxt->start->type = XML_REGEXP_START_STATE; + if (xmlRegStatePush(ctxt, ctxt->start) < 0) { + xmlRegFreeState(ctxt->start); + xmlFreeAutomata(ctxt); + return(NULL); + } + ctxt->flags = 0; + + return(ctxt); +} + +/** + * xmlFreeAutomata: + * @am: an automata + * + * Free an automata + */ +void +xmlFreeAutomata(xmlAutomataPtr am) { + if (am == NULL) + return; + xmlRegFreeParserCtxt(am); +} + +/** + * xmlAutomataSetFlags: + * @am: an automata + * @flags: a set of internal flags + * + * Set some flags on the automata + */ +void +xmlAutomataSetFlags(xmlAutomataPtr am, int flags) { + if (am == NULL) + return; + am->flags |= flags; +} + +/** + * xmlAutomataGetInitState: + * @am: an automata + * + * Initial state lookup + * + * Returns the initial state of the automata + */ +xmlAutomataStatePtr +xmlAutomataGetInitState(xmlAutomataPtr am) { + if (am == NULL) + return(NULL); + return(am->start); +} + +/** + * xmlAutomataSetFinalState: + * @am: an automata + * @state: a state in this automata + * + * Makes that state a final state + * + * Returns 0 or -1 in case of error + */ +int +xmlAutomataSetFinalState(xmlAutomataPtr am, xmlAutomataStatePtr state) { + if ((am == NULL) || (state == NULL)) + return(-1); + state->type = XML_REGEXP_FINAL_STATE; + return(0); +} + +/** + * xmlAutomataNewTransition: + * @am: an automata + * @from: the starting point of the transition + * @to: the target point of the transition or NULL + * @token: the input string associated to that transition + * @data: data passed to the callback function if the transition is activated + * + * If @to is NULL, this creates first a new target state in the automata + * and then adds a transition from the @from state to the target state + * activated by the value of @token + * + * Returns the target state or NULL in case of error + */ +xmlAutomataStatePtr +xmlAutomataNewTransition(xmlAutomataPtr am, xmlAutomataStatePtr from, + xmlAutomataStatePtr to, const xmlChar *token, + void *data) { + xmlRegAtomPtr atom; + + if ((am == NULL) || (from == NULL) || (token == NULL)) + return(NULL); + atom = xmlRegNewAtom(am, XML_REGEXP_STRING); + if (atom == NULL) + return(NULL); + atom->data = data; + if (atom == NULL) + return(NULL); + atom->valuep = xmlStrdup(token); + + if (xmlFAGenerateTransitions(am, from, to, atom) < 0) { + xmlRegFreeAtom(atom); + return(NULL); + } + if (to == NULL) + return(am->state); + return(to); +} + +/** + * xmlAutomataNewTransition2: + * @am: an automata + * @from: the starting point of the transition + * @to: the target point of the transition or NULL + * @token: the first input string associated to that transition + * @token2: the second input string associated to that transition + * @data: data passed to the callback function if the transition is activated + * + * If @to is NULL, this creates first a new target state in the automata + * and then adds a transition from the @from state to the target state + * activated by the value of @token + * + * Returns the target state or NULL in case of error + */ +xmlAutomataStatePtr +xmlAutomataNewTransition2(xmlAutomataPtr am, xmlAutomataStatePtr from, + xmlAutomataStatePtr to, const xmlChar *token, + const xmlChar *token2, void *data) { + xmlRegAtomPtr atom; + + if ((am == NULL) || (from == NULL) || (token == NULL)) + return(NULL); + atom = xmlRegNewAtom(am, XML_REGEXP_STRING); + if (atom == NULL) + return(NULL); + atom->data = data; + if ((token2 == NULL) || (*token2 == 0)) { + atom->valuep = xmlStrdup(token); + } else { + int lenn, lenp; + xmlChar *str; + + lenn = strlen((char *) token2); + lenp = strlen((char *) token); + + str = (xmlChar *) xmlMallocAtomic(lenn + lenp + 2); + if (str == NULL) { + xmlRegFreeAtom(atom); + return(NULL); + } + memcpy(&str[0], token, lenp); + str[lenp] = '|'; + memcpy(&str[lenp + 1], token2, lenn); + str[lenn + lenp + 1] = 0; + + atom->valuep = str; + } + + if (xmlFAGenerateTransitions(am, from, to, atom) < 0) { + xmlRegFreeAtom(atom); + return(NULL); + } + if (to == NULL) + return(am->state); + return(to); +} + +/** + * xmlAutomataNewNegTrans: + * @am: an automata + * @from: the starting point of the transition + * @to: the target point of the transition or NULL + * @token: the first input string associated to that transition + * @token2: the second input string associated to that transition + * @data: data passed to the callback function if the transition is activated + * + * If @to is NULL, this creates first a new target state in the automata + * and then adds a transition from the @from state to the target state + * activated by any value except (@token,@token2) + * Note that if @token2 is not NULL, then (X, NULL) won't match to follow + # the semantic of XSD ##other + * + * Returns the target state or NULL in case of error + */ +xmlAutomataStatePtr +xmlAutomataNewNegTrans(xmlAutomataPtr am, xmlAutomataStatePtr from, + xmlAutomataStatePtr to, const xmlChar *token, + const xmlChar *token2, void *data) { + xmlRegAtomPtr atom; + xmlChar err_msg[200]; + + if ((am == NULL) || (from == NULL) || (token == NULL)) + return(NULL); + atom = xmlRegNewAtom(am, XML_REGEXP_STRING); + if (atom == NULL) + return(NULL); + atom->data = data; + atom->neg = 1; + if ((token2 == NULL) || (*token2 == 0)) { + atom->valuep = xmlStrdup(token); + } else { + int lenn, lenp; + xmlChar *str; + + lenn = strlen((char *) token2); + lenp = strlen((char *) token); + + str = (xmlChar *) xmlMallocAtomic(lenn + lenp + 2); + if (str == NULL) { + xmlRegFreeAtom(atom); + return(NULL); + } + memcpy(&str[0], token, lenp); + str[lenp] = '|'; + memcpy(&str[lenp + 1], token2, lenn); + str[lenn + lenp + 1] = 0; + + atom->valuep = str; + } + snprintf((char *) err_msg, 199, "not %s", (const char *) atom->valuep); + err_msg[199] = 0; + atom->valuep2 = xmlStrdup(err_msg); + + if (xmlFAGenerateTransitions(am, from, to, atom) < 0) { + xmlRegFreeAtom(atom); + return(NULL); + } + am->negs++; + if (to == NULL) + return(am->state); + return(to); +} + +/** + * xmlAutomataNewCountTrans2: + * @am: an automata + * @from: the starting point of the transition + * @to: the target point of the transition or NULL + * @token: the input string associated to that transition + * @token2: the second input string associated to that transition + * @min: the minimum successive occurences of token + * @max: the maximum successive occurences of token + * @data: data associated to the transition + * + * If @to is NULL, this creates first a new target state in the automata + * and then adds a transition from the @from state to the target state + * activated by a succession of input of value @token and @token2 and + * whose number is between @min and @max + * + * Returns the target state or NULL in case of error + */ +xmlAutomataStatePtr +xmlAutomataNewCountTrans2(xmlAutomataPtr am, xmlAutomataStatePtr from, + xmlAutomataStatePtr to, const xmlChar *token, + const xmlChar *token2, + int min, int max, void *data) { + xmlRegAtomPtr atom; + int counter; + + if ((am == NULL) || (from == NULL) || (token == NULL)) + return(NULL); + if (min < 0) + return(NULL); + if ((max < min) || (max < 1)) + return(NULL); + atom = xmlRegNewAtom(am, XML_REGEXP_STRING); + if (atom == NULL) + return(NULL); + if ((token2 == NULL) || (*token2 == 0)) { + atom->valuep = xmlStrdup(token); + } else { + int lenn, lenp; + xmlChar *str; + + lenn = strlen((char *) token2); + lenp = strlen((char *) token); + + str = (xmlChar *) xmlMallocAtomic(lenn + lenp + 2); + if (str == NULL) { + xmlRegFreeAtom(atom); + return(NULL); + } + memcpy(&str[0], token, lenp); + str[lenp] = '|'; + memcpy(&str[lenp + 1], token2, lenn); + str[lenn + lenp + 1] = 0; + + atom->valuep = str; + } + atom->data = data; + if (min == 0) + atom->min = 1; + else + atom->min = min; + atom->max = max; + + /* + * associate a counter to the transition. + */ + counter = xmlRegGetCounter(am); + am->counters[counter].min = min; + am->counters[counter].max = max; + + /* xmlFAGenerateTransitions(am, from, to, atom); */ + if (to == NULL) { + to = xmlRegNewState(am); + xmlRegStatePush(am, to); + } + xmlRegStateAddTrans(am, from, atom, to, counter, -1); + xmlRegAtomPush(am, atom); + am->state = to; + + if (to == NULL) + to = am->state; + if (to == NULL) + return(NULL); + if (min == 0) + xmlFAGenerateEpsilonTransition(am, from, to); + return(to); +} + +/** + * xmlAutomataNewCountTrans: + * @am: an automata + * @from: the starting point of the transition + * @to: the target point of the transition or NULL + * @token: the input string associated to that transition + * @min: the minimum successive occurences of token + * @max: the maximum successive occurences of token + * @data: data associated to the transition + * + * If @to is NULL, this creates first a new target state in the automata + * and then adds a transition from the @from state to the target state + * activated by a succession of input of value @token and whose number + * is between @min and @max + * + * Returns the target state or NULL in case of error + */ +xmlAutomataStatePtr +xmlAutomataNewCountTrans(xmlAutomataPtr am, xmlAutomataStatePtr from, + xmlAutomataStatePtr to, const xmlChar *token, + int min, int max, void *data) { + xmlRegAtomPtr atom; + int counter; + + if ((am == NULL) || (from == NULL) || (token == NULL)) + return(NULL); + if (min < 0) + return(NULL); + if ((max < min) || (max < 1)) + return(NULL); + atom = xmlRegNewAtom(am, XML_REGEXP_STRING); + if (atom == NULL) + return(NULL); + atom->valuep = xmlStrdup(token); + atom->data = data; + if (min == 0) + atom->min = 1; + else + atom->min = min; + atom->max = max; + + /* + * associate a counter to the transition. + */ + counter = xmlRegGetCounter(am); + am->counters[counter].min = min; + am->counters[counter].max = max; + + /* xmlFAGenerateTransitions(am, from, to, atom); */ + if (to == NULL) { + to = xmlRegNewState(am); + xmlRegStatePush(am, to); + } + xmlRegStateAddTrans(am, from, atom, to, counter, -1); + xmlRegAtomPush(am, atom); + am->state = to; + + if (to == NULL) + to = am->state; + if (to == NULL) + return(NULL); + if (min == 0) + xmlFAGenerateEpsilonTransition(am, from, to); + return(to); +} + +/** + * xmlAutomataNewOnceTrans2: + * @am: an automata + * @from: the starting point of the transition + * @to: the target point of the transition or NULL + * @token: the input string associated to that transition + * @token2: the second input string associated to that transition + * @min: the minimum successive occurences of token + * @max: the maximum successive occurences of token + * @data: data associated to the transition + * + * If @to is NULL, this creates first a new target state in the automata + * and then adds a transition from the @from state to the target state + * activated by a succession of input of value @token and @token2 and whose + * number is between @min and @max, moreover that transition can only be + * crossed once. + * + * Returns the target state or NULL in case of error + */ +xmlAutomataStatePtr +xmlAutomataNewOnceTrans2(xmlAutomataPtr am, xmlAutomataStatePtr from, + xmlAutomataStatePtr to, const xmlChar *token, + const xmlChar *token2, + int min, int max, void *data) { + xmlRegAtomPtr atom; + int counter; + + if ((am == NULL) || (from == NULL) || (token == NULL)) + return(NULL); + if (min < 1) + return(NULL); + if ((max < min) || (max < 1)) + return(NULL); + atom = xmlRegNewAtom(am, XML_REGEXP_STRING); + if (atom == NULL) + return(NULL); + if ((token2 == NULL) || (*token2 == 0)) { + atom->valuep = xmlStrdup(token); + } else { + int lenn, lenp; + xmlChar *str; + + lenn = strlen((char *) token2); + lenp = strlen((char *) token); + + str = (xmlChar *) xmlMallocAtomic(lenn + lenp + 2); + if (str == NULL) { + xmlRegFreeAtom(atom); + return(NULL); + } + memcpy(&str[0], token, lenp); + str[lenp] = '|'; + memcpy(&str[lenp + 1], token2, lenn); + str[lenn + lenp + 1] = 0; + + atom->valuep = str; + } + atom->data = data; + atom->quant = XML_REGEXP_QUANT_ONCEONLY; + atom->min = min; + atom->max = max; + /* + * associate a counter to the transition. + */ + counter = xmlRegGetCounter(am); + am->counters[counter].min = 1; + am->counters[counter].max = 1; + + /* xmlFAGenerateTransitions(am, from, to, atom); */ + if (to == NULL) { + to = xmlRegNewState(am); + xmlRegStatePush(am, to); + } + xmlRegStateAddTrans(am, from, atom, to, counter, -1); + xmlRegAtomPush(am, atom); + am->state = to; + return(to); +} + + + +/** + * xmlAutomataNewOnceTrans: + * @am: an automata + * @from: the starting point of the transition + * @to: the target point of the transition or NULL + * @token: the input string associated to that transition + * @min: the minimum successive occurences of token + * @max: the maximum successive occurences of token + * @data: data associated to the transition + * + * If @to is NULL, this creates first a new target state in the automata + * and then adds a transition from the @from state to the target state + * activated by a succession of input of value @token and whose number + * is between @min and @max, moreover that transition can only be crossed + * once. + * + * Returns the target state or NULL in case of error + */ +xmlAutomataStatePtr +xmlAutomataNewOnceTrans(xmlAutomataPtr am, xmlAutomataStatePtr from, + xmlAutomataStatePtr to, const xmlChar *token, + int min, int max, void *data) { + xmlRegAtomPtr atom; + int counter; + + if ((am == NULL) || (from == NULL) || (token == NULL)) + return(NULL); + if (min < 1) + return(NULL); + if ((max < min) || (max < 1)) + return(NULL); + atom = xmlRegNewAtom(am, XML_REGEXP_STRING); + if (atom == NULL) + return(NULL); + atom->valuep = xmlStrdup(token); + atom->data = data; + atom->quant = XML_REGEXP_QUANT_ONCEONLY; + atom->min = min; + atom->max = max; + /* + * associate a counter to the transition. + */ + counter = xmlRegGetCounter(am); + am->counters[counter].min = 1; + am->counters[counter].max = 1; + + /* xmlFAGenerateTransitions(am, from, to, atom); */ + if (to == NULL) { + to = xmlRegNewState(am); + xmlRegStatePush(am, to); + } + xmlRegStateAddTrans(am, from, atom, to, counter, -1); + xmlRegAtomPush(am, atom); + am->state = to; + return(to); +} + +/** + * xmlAutomataNewState: + * @am: an automata + * + * Create a new disconnected state in the automata + * + * Returns the new state or NULL in case of error + */ +xmlAutomataStatePtr +xmlAutomataNewState(xmlAutomataPtr am) { + xmlAutomataStatePtr to; + + if (am == NULL) + return(NULL); + to = xmlRegNewState(am); + xmlRegStatePush(am, to); + return(to); +} + +/** + * xmlAutomataNewEpsilon: + * @am: an automata + * @from: the starting point of the transition + * @to: the target point of the transition or NULL + * + * If @to is NULL, this creates first a new target state in the automata + * and then adds an epsilon transition from the @from state to the + * target state + * + * Returns the target state or NULL in case of error + */ +xmlAutomataStatePtr +xmlAutomataNewEpsilon(xmlAutomataPtr am, xmlAutomataStatePtr from, + xmlAutomataStatePtr to) { + if ((am == NULL) || (from == NULL)) + return(NULL); + xmlFAGenerateEpsilonTransition(am, from, to); + if (to == NULL) + return(am->state); + return(to); +} + +/** + * xmlAutomataNewAllTrans: + * @am: an automata + * @from: the starting point of the transition + * @to: the target point of the transition or NULL + * @lax: allow to transition if not all all transitions have been activated + * + * If @to is NULL, this creates first a new target state in the automata + * and then adds a an ALL transition from the @from state to the + * target state. That transition is an epsilon transition allowed only when + * all transitions from the @from node have been activated. + * + * Returns the target state or NULL in case of error + */ +xmlAutomataStatePtr +xmlAutomataNewAllTrans(xmlAutomataPtr am, xmlAutomataStatePtr from, + xmlAutomataStatePtr to, int lax) { + if ((am == NULL) || (from == NULL)) + return(NULL); + xmlFAGenerateAllTransition(am, from, to, lax); + if (to == NULL) + return(am->state); + return(to); +} + +/** + * xmlAutomataNewCounter: + * @am: an automata + * @min: the minimal value on the counter + * @max: the maximal value on the counter + * + * Create a new counter + * + * Returns the counter number or -1 in case of error + */ +int +xmlAutomataNewCounter(xmlAutomataPtr am, int min, int max) { + int ret; + + if (am == NULL) + return(-1); + + ret = xmlRegGetCounter(am); + if (ret < 0) + return(-1); + am->counters[ret].min = min; + am->counters[ret].max = max; + return(ret); +} + +/** + * xmlAutomataNewCountedTrans: + * @am: an automata + * @from: the starting point of the transition + * @to: the target point of the transition or NULL + * @counter: the counter associated to that transition + * + * If @to is NULL, this creates first a new target state in the automata + * and then adds an epsilon transition from the @from state to the target state + * which will increment the counter provided + * + * Returns the target state or NULL in case of error + */ +xmlAutomataStatePtr +xmlAutomataNewCountedTrans(xmlAutomataPtr am, xmlAutomataStatePtr from, + xmlAutomataStatePtr to, int counter) { + if ((am == NULL) || (from == NULL) || (counter < 0)) + return(NULL); + xmlFAGenerateCountedEpsilonTransition(am, from, to, counter); + if (to == NULL) + return(am->state); + return(to); +} + +/** + * xmlAutomataNewCounterTrans: + * @am: an automata + * @from: the starting point of the transition + * @to: the target point of the transition or NULL + * @counter: the counter associated to that transition + * + * If @to is NULL, this creates first a new target state in the automata + * and then adds an epsilon transition from the @from state to the target state + * which will be allowed only if the counter is within the right range. + * + * Returns the target state or NULL in case of error + */ +xmlAutomataStatePtr +xmlAutomataNewCounterTrans(xmlAutomataPtr am, xmlAutomataStatePtr from, + xmlAutomataStatePtr to, int counter) { + if ((am == NULL) || (from == NULL) || (counter < 0)) + return(NULL); + xmlFAGenerateCountedTransition(am, from, to, counter); + if (to == NULL) + return(am->state); + return(to); +} + +/** + * xmlAutomataCompile: + * @am: an automata + * + * Compile the automata into a Reg Exp ready for being executed. + * The automata should be free after this point. + * + * Returns the compiled regexp or NULL in case of error + */ +xmlRegexpPtr +xmlAutomataCompile(xmlAutomataPtr am) { + xmlRegexpPtr ret; + + if ((am == NULL) || (am->error != 0)) return(NULL); + xmlFAEliminateEpsilonTransitions(am); + /* xmlFAComputesDeterminism(am); */ + ret = xmlRegEpxFromParse(am); + + return(ret); +} + +/** + * xmlAutomataIsDeterminist: + * @am: an automata + * + * Checks if an automata is determinist. + * + * Returns 1 if true, 0 if not, and -1 in case of error + */ +int +xmlAutomataIsDeterminist(xmlAutomataPtr am) { + int ret; + + if (am == NULL) + return(-1); + + ret = xmlFAComputesDeterminism(am); + return(ret); +} +#endif /* LIBXML_AUTOMATA_ENABLED */ + +#ifdef LIBXML_EXPR_ENABLED +/************************************************************************ + * * + * Formal Expression handling code * + * * + ************************************************************************/ +/************************************************************************ + * * + * Expression handling context * + * * + ************************************************************************/ + +struct _xmlExpCtxt { + xmlDictPtr dict; + xmlExpNodePtr *table; + int size; + int nbElems; + int nb_nodes; + int maxNodes; + const char *expr; + const char *cur; + int nb_cons; + int tabSize; +}; + +/** + * xmlExpNewCtxt: + * @maxNodes: the maximum number of nodes + * @dict: optional dictionnary to use internally + * + * Creates a new context for manipulating expressions + * + * Returns the context or NULL in case of error + */ +xmlExpCtxtPtr +xmlExpNewCtxt(int maxNodes, xmlDictPtr dict) { + xmlExpCtxtPtr ret; + int size = 256; + + if (maxNodes <= 4096) + maxNodes = 4096; + + ret = (xmlExpCtxtPtr) xmlMalloc(sizeof(xmlExpCtxt)); + if (ret == NULL) + return(NULL); + memset(ret, 0, sizeof(xmlExpCtxt)); + ret->size = size; + ret->nbElems = 0; + ret->maxNodes = maxNodes; + ret->table = xmlMalloc(size * sizeof(xmlExpNodePtr)); + if (ret->table == NULL) { + xmlFree(ret); + return(NULL); + } + memset(ret->table, 0, size * sizeof(xmlExpNodePtr)); + if (dict == NULL) { + ret->dict = xmlDictCreate(); + if (ret->dict == NULL) { + xmlFree(ret->table); + xmlFree(ret); + return(NULL); + } + } else { + ret->dict = dict; + xmlDictReference(ret->dict); + } + return(ret); +} + +/** + * xmlExpFreeCtxt: + * @ctxt: an expression context + * + * Free an expression context + */ +void +xmlExpFreeCtxt(xmlExpCtxtPtr ctxt) { + if (ctxt == NULL) + return; + xmlDictFree(ctxt->dict); + if (ctxt->table != NULL) + xmlFree(ctxt->table); + xmlFree(ctxt); +} + +/************************************************************************ + * * + * Structure associated to an expression node * + * * + ************************************************************************/ +#define MAX_NODES 10000 + +/* #define DEBUG_DERIV */ + +/* + * TODO: + * - Wildcards + * - public API for creation + * + * Started + * - regression testing + * + * Done + * - split into module and test tool + * - memleaks + */ + +typedef enum { + XML_EXP_NILABLE = (1 << 0) +} xmlExpNodeInfo; + +#define IS_NILLABLE(node) ((node)->info & XML_EXP_NILABLE) + +struct _xmlExpNode { + unsigned char type;/* xmlExpNodeType */ + unsigned char info;/* OR of xmlExpNodeInfo */ + unsigned short key; /* the hash key */ + unsigned int ref; /* The number of references */ + int c_max; /* the maximum length it can consume */ + xmlExpNodePtr exp_left; + xmlExpNodePtr next;/* the next node in the hash table or free list */ + union { + struct { + int f_min; + int f_max; + } count; + struct { + xmlExpNodePtr f_right; + } children; + const xmlChar *f_str; + } field; +}; + +#define exp_min field.count.f_min +#define exp_max field.count.f_max +/* #define exp_left field.children.f_left */ +#define exp_right field.children.f_right +#define exp_str field.f_str + +static xmlExpNodePtr xmlExpNewNode(xmlExpCtxtPtr ctxt, xmlExpNodeType type); +static xmlExpNode forbiddenExpNode = { + XML_EXP_FORBID, 0, 0, 0, 0, NULL, NULL, {{ 0, 0}} +}; +xmlExpNodePtr forbiddenExp = &forbiddenExpNode; +static xmlExpNode emptyExpNode = { + XML_EXP_EMPTY, 1, 0, 0, 0, NULL, NULL, {{ 0, 0}} +}; +xmlExpNodePtr emptyExp = &emptyExpNode; + +/************************************************************************ + * * + * The custom hash table for unicity and canonicalization * + * of sub-expressions pointers * + * * + ************************************************************************/ +/* + * xmlExpHashNameComputeKey: + * Calculate the hash key for a token + */ +static unsigned short +xmlExpHashNameComputeKey(const xmlChar *name) { + unsigned short value = 0L; + char ch; + + if (name != NULL) { + value += 30 * (*name); + while ((ch = *name++) != 0) { + value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch); + } + } + return (value); +} + +/* + * xmlExpHashComputeKey: + * Calculate the hash key for a compound expression + */ +static unsigned short +xmlExpHashComputeKey(xmlExpNodeType type, xmlExpNodePtr left, + xmlExpNodePtr right) { + unsigned long value; + unsigned short ret; + + switch (type) { + case XML_EXP_SEQ: + value = left->key; + value += right->key; + value *= 3; + ret = (unsigned short) value; + break; + case XML_EXP_OR: + value = left->key; + value += right->key; + value *= 7; + ret = (unsigned short) value; + break; + case XML_EXP_COUNT: + value = left->key; + value += right->key; + ret = (unsigned short) value; + break; + default: + ret = 0; + } + return(ret); +} + + +static xmlExpNodePtr +xmlExpNewNode(xmlExpCtxtPtr ctxt, xmlExpNodeType type) { + xmlExpNodePtr ret; + + if (ctxt->nb_nodes >= MAX_NODES) + return(NULL); + ret = (xmlExpNodePtr) xmlMalloc(sizeof(xmlExpNode)); + if (ret == NULL) + return(NULL); + memset(ret, 0, sizeof(xmlExpNode)); + ret->type = type; + ret->next = NULL; + ctxt->nb_nodes++; + ctxt->nb_cons++; + return(ret); +} + +/** + * xmlExpHashGetEntry: + * @table: the hash table + * + * Get the unique entry from the hash table. The entry is created if + * needed. @left and @right are consumed, i.e. their ref count will + * be decremented by the operation. + * + * Returns the pointer or NULL in case of error + */ +static xmlExpNodePtr +xmlExpHashGetEntry(xmlExpCtxtPtr ctxt, xmlExpNodeType type, + xmlExpNodePtr left, xmlExpNodePtr right, + const xmlChar *name, int min, int max) { + unsigned short kbase, key; + xmlExpNodePtr entry; + xmlExpNodePtr insert; + + if (ctxt == NULL) + return(NULL); + + /* + * Check for duplicate and insertion location. + */ + if (type == XML_EXP_ATOM) { + kbase = xmlExpHashNameComputeKey(name); + } else if (type == XML_EXP_COUNT) { + /* COUNT reduction rule 1 */ + /* a{1} -> a */ + if (min == max) { + if (min == 1) { + return(left); + } + if (min == 0) { + xmlExpFree(ctxt, left); + return(emptyExp); + } + } + if (min < 0) { + xmlExpFree(ctxt, left); + return(forbiddenExp); + } + if (max == -1) + kbase = min + 79; + else + kbase = max - min; + kbase += left->key; + } else if (type == XML_EXP_OR) { + /* Forbid reduction rules */ + if (left->type == XML_EXP_FORBID) { + xmlExpFree(ctxt, left); + return(right); + } + if (right->type == XML_EXP_FORBID) { + xmlExpFree(ctxt, right); + return(left); + } + + /* OR reduction rule 1 */ + /* a | a reduced to a */ + if (left == right) { + left->ref--; + return(left); + } + /* OR canonicalization rule 1 */ + /* linearize (a | b) | c into a | (b | c) */ + if ((left->type == XML_EXP_OR) && (right->type != XML_EXP_OR)) { + xmlExpNodePtr tmp = left; + left = right; + right = tmp; + } + /* OR reduction rule 2 */ + /* a | (a | b) and b | (a | b) are reduced to a | b */ + if (right->type == XML_EXP_OR) { + if ((left == right->exp_left) || + (left == right->exp_right)) { + xmlExpFree(ctxt, left); + return(right); + } + } + /* OR canonicalization rule 2 */ + /* linearize (a | b) | c into a | (b | c) */ + if (left->type == XML_EXP_OR) { + xmlExpNodePtr tmp; + + /* OR canonicalization rule 2 */ + if ((left->exp_right->type != XML_EXP_OR) && + (left->exp_right->key < left->exp_left->key)) { + tmp = left->exp_right; + left->exp_right = left->exp_left; + left->exp_left = tmp; + } + left->exp_right->ref++; + tmp = xmlExpHashGetEntry(ctxt, XML_EXP_OR, left->exp_right, right, + NULL, 0, 0); + left->exp_left->ref++; + tmp = xmlExpHashGetEntry(ctxt, XML_EXP_OR, left->exp_left, tmp, + NULL, 0, 0); + + xmlExpFree(ctxt, left); + return(tmp); + } + if (right->type == XML_EXP_OR) { + /* Ordering in the tree */ + /* C | (A | B) -> A | (B | C) */ + if (left->key > right->exp_right->key) { + xmlExpNodePtr tmp; + right->exp_right->ref++; + tmp = xmlExpHashGetEntry(ctxt, XML_EXP_OR, right->exp_right, + left, NULL, 0, 0); + right->exp_left->ref++; + tmp = xmlExpHashGetEntry(ctxt, XML_EXP_OR, right->exp_left, + tmp, NULL, 0, 0); + xmlExpFree(ctxt, right); + return(tmp); + } + /* Ordering in the tree */ + /* B | (A | C) -> A | (B | C) */ + if (left->key > right->exp_left->key) { + xmlExpNodePtr tmp; + right->exp_right->ref++; + tmp = xmlExpHashGetEntry(ctxt, XML_EXP_OR, left, + right->exp_right, NULL, 0, 0); + right->exp_left->ref++; + tmp = xmlExpHashGetEntry(ctxt, XML_EXP_OR, right->exp_left, + tmp, NULL, 0, 0); + xmlExpFree(ctxt, right); + return(tmp); + } + } + /* we know both types are != XML_EXP_OR here */ + else if (left->key > right->key) { + xmlExpNodePtr tmp = left; + left = right; + right = tmp; + } + kbase = xmlExpHashComputeKey(type, left, right); + } else if (type == XML_EXP_SEQ) { + /* Forbid reduction rules */ + if (left->type == XML_EXP_FORBID) { + xmlExpFree(ctxt, right); + return(left); + } + if (right->type == XML_EXP_FORBID) { + xmlExpFree(ctxt, left); + return(right); + } + /* Empty reduction rules */ + if (right->type == XML_EXP_EMPTY) { + return(left); + } + if (left->type == XML_EXP_EMPTY) { + return(right); + } + kbase = xmlExpHashComputeKey(type, left, right); + } else + return(NULL); + + key = kbase % ctxt->size; + if (ctxt->table[key] != NULL) { + for (insert = ctxt->table[key]; insert != NULL; + insert = insert->next) { + if ((insert->key == kbase) && + (insert->type == type)) { + if (type == XML_EXP_ATOM) { + if (name == insert->exp_str) { + insert->ref++; + return(insert); + } + } else if (type == XML_EXP_COUNT) { + if ((insert->exp_min == min) && (insert->exp_max == max) && + (insert->exp_left == left)) { + insert->ref++; + left->ref--; + return(insert); + } + } else if ((insert->exp_left == left) && + (insert->exp_right == right)) { + insert->ref++; + left->ref--; + right->ref--; + return(insert); + } + } + } + } + + entry = xmlExpNewNode(ctxt, type); + if (entry == NULL) + return(NULL); + entry->key = kbase; + if (type == XML_EXP_ATOM) { + entry->exp_str = name; + entry->c_max = 1; + } else if (type == XML_EXP_COUNT) { + entry->exp_min = min; + entry->exp_max = max; + entry->exp_left = left; + if ((min == 0) || (IS_NILLABLE(left))) + entry->info |= XML_EXP_NILABLE; + if (max < 0) + entry->c_max = -1; + else + entry->c_max = max * entry->exp_left->c_max; + } else { + entry->exp_left = left; + entry->exp_right = right; + if (type == XML_EXP_OR) { + if ((IS_NILLABLE(left)) || (IS_NILLABLE(right))) + entry->info |= XML_EXP_NILABLE; + if ((entry->exp_left->c_max == -1) || + (entry->exp_right->c_max == -1)) + entry->c_max = -1; + else if (entry->exp_left->c_max > entry->exp_right->c_max) + entry->c_max = entry->exp_left->c_max; + else + entry->c_max = entry->exp_right->c_max; + } else { + if ((IS_NILLABLE(left)) && (IS_NILLABLE(right))) + entry->info |= XML_EXP_NILABLE; + if ((entry->exp_left->c_max == -1) || + (entry->exp_right->c_max == -1)) + entry->c_max = -1; + else + entry->c_max = entry->exp_left->c_max + entry->exp_right->c_max; + } + } + entry->ref = 1; + if (ctxt->table[key] != NULL) + entry->next = ctxt->table[key]; + + ctxt->table[key] = entry; + ctxt->nbElems++; + + return(entry); +} + +/** + * xmlExpFree: + * @ctxt: the expression context + * @exp: the expression + * + * Dereference the expression + */ +void +xmlExpFree(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp) { + if ((exp == NULL) || (exp == forbiddenExp) || (exp == emptyExp)) + return; + exp->ref--; + if (exp->ref == 0) { + unsigned short key; + + /* Unlink it first from the hash table */ + key = exp->key % ctxt->size; + if (ctxt->table[key] == exp) { + ctxt->table[key] = exp->next; + } else { + xmlExpNodePtr tmp; + + tmp = ctxt->table[key]; + while (tmp != NULL) { + if (tmp->next == exp) { + tmp->next = exp->next; + break; + } + tmp = tmp->next; + } + } + + if ((exp->type == XML_EXP_SEQ) || (exp->type == XML_EXP_OR)) { + xmlExpFree(ctxt, exp->exp_left); + xmlExpFree(ctxt, exp->exp_right); + } else if (exp->type == XML_EXP_COUNT) { + xmlExpFree(ctxt, exp->exp_left); + } + xmlFree(exp); + ctxt->nb_nodes--; + } +} + +/** + * xmlExpRef: + * @exp: the expression + * + * Increase the reference count of the expression + */ +void +xmlExpRef(xmlExpNodePtr exp) { + if (exp != NULL) + exp->ref++; +} + +/** + * xmlExpNewAtom: + * @ctxt: the expression context + * @name: the atom name + * @len: the atom name length in byte (or -1); + * + * Get the atom associated to this name from that context + * + * Returns the node or NULL in case of error + */ +xmlExpNodePtr +xmlExpNewAtom(xmlExpCtxtPtr ctxt, const xmlChar *name, int len) { + if ((ctxt == NULL) || (name == NULL)) + return(NULL); + name = xmlDictLookup(ctxt->dict, name, len); + if (name == NULL) + return(NULL); + return(xmlExpHashGetEntry(ctxt, XML_EXP_ATOM, NULL, NULL, name, 0, 0)); +} + +/** + * xmlExpNewOr: + * @ctxt: the expression context + * @left: left expression + * @right: right expression + * + * Get the atom associated to the choice @left | @right + * Note that @left and @right are consumed in the operation, to keep + * an handle on them use xmlExpRef() and use xmlExpFree() to release them, + * this is true even in case of failure (unless ctxt == NULL). + * + * Returns the node or NULL in case of error + */ +xmlExpNodePtr +xmlExpNewOr(xmlExpCtxtPtr ctxt, xmlExpNodePtr left, xmlExpNodePtr right) { + if (ctxt == NULL) + return(NULL); + if ((left == NULL) || (right == NULL)) { + xmlExpFree(ctxt, left); + xmlExpFree(ctxt, right); + return(NULL); + } + return(xmlExpHashGetEntry(ctxt, XML_EXP_OR, left, right, NULL, 0, 0)); +} + +/** + * xmlExpNewSeq: + * @ctxt: the expression context + * @left: left expression + * @right: right expression + * + * Get the atom associated to the sequence @left , @right + * Note that @left and @right are consumed in the operation, to keep + * an handle on them use xmlExpRef() and use xmlExpFree() to release them, + * this is true even in case of failure (unless ctxt == NULL). + * + * Returns the node or NULL in case of error + */ +xmlExpNodePtr +xmlExpNewSeq(xmlExpCtxtPtr ctxt, xmlExpNodePtr left, xmlExpNodePtr right) { + if (ctxt == NULL) + return(NULL); + if ((left == NULL) || (right == NULL)) { + xmlExpFree(ctxt, left); + xmlExpFree(ctxt, right); + return(NULL); + } + return(xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, left, right, NULL, 0, 0)); +} + +/** + * xmlExpNewRange: + * @ctxt: the expression context + * @subset: the expression to be repeated + * @min: the lower bound for the repetition + * @max: the upper bound for the repetition, -1 means infinite + * + * Get the atom associated to the range (@subset){@min, @max} + * Note that @subset is consumed in the operation, to keep + * an handle on it use xmlExpRef() and use xmlExpFree() to release it, + * this is true even in case of failure (unless ctxt == NULL). + * + * Returns the node or NULL in case of error + */ +xmlExpNodePtr +xmlExpNewRange(xmlExpCtxtPtr ctxt, xmlExpNodePtr subset, int min, int max) { + if (ctxt == NULL) + return(NULL); + if ((subset == NULL) || (min < 0) || (max < -1) || + ((max >= 0) && (min > max))) { + xmlExpFree(ctxt, subset); + return(NULL); + } + return(xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, subset, + NULL, NULL, min, max)); +} + +/************************************************************************ + * * + * Public API for operations on expressions * + * * + ************************************************************************/ + +static int +xmlExpGetLanguageInt(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, + const xmlChar**list, int len, int nb) { + int tmp, tmp2; +tail: + switch (exp->type) { + case XML_EXP_EMPTY: + return(0); + case XML_EXP_ATOM: + for (tmp = 0;tmp < nb;tmp++) + if (list[tmp] == exp->exp_str) + return(0); + if (nb >= len) + return(-2); + list[nb] = exp->exp_str; + return(1); + case XML_EXP_COUNT: + exp = exp->exp_left; + goto tail; + case XML_EXP_SEQ: + case XML_EXP_OR: + tmp = xmlExpGetLanguageInt(ctxt, exp->exp_left, list, len, nb); + if (tmp < 0) + return(tmp); + tmp2 = xmlExpGetLanguageInt(ctxt, exp->exp_right, list, len, + nb + tmp); + if (tmp2 < 0) + return(tmp2); + return(tmp + tmp2); + } + return(-1); +} + +/** + * xmlExpGetLanguage: + * @ctxt: the expression context + * @exp: the expression + * @langList: where to store the tokens + * @len: the allocated length of @list + * + * Find all the strings used in @exp and store them in @list + * + * Returns the number of unique strings found, -1 in case of errors and + * -2 if there is more than @len strings + */ +int +xmlExpGetLanguage(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, + const xmlChar**langList, int len) { + if ((ctxt == NULL) || (exp == NULL) || (langList == NULL) || (len <= 0)) + return(-1); + return(xmlExpGetLanguageInt(ctxt, exp, langList, len, 0)); +} + +static int +xmlExpGetStartInt(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, + const xmlChar**list, int len, int nb) { + int tmp, tmp2; +tail: + switch (exp->type) { + case XML_EXP_FORBID: + return(0); + case XML_EXP_EMPTY: + return(0); + case XML_EXP_ATOM: + for (tmp = 0;tmp < nb;tmp++) + if (list[tmp] == exp->exp_str) + return(0); + if (nb >= len) + return(-2); + list[nb] = exp->exp_str; + return(1); + case XML_EXP_COUNT: + exp = exp->exp_left; + goto tail; + case XML_EXP_SEQ: + tmp = xmlExpGetStartInt(ctxt, exp->exp_left, list, len, nb); + if (tmp < 0) + return(tmp); + if (IS_NILLABLE(exp->exp_left)) { + tmp2 = xmlExpGetStartInt(ctxt, exp->exp_right, list, len, + nb + tmp); + if (tmp2 < 0) + return(tmp2); + tmp += tmp2; + } + return(tmp); + case XML_EXP_OR: + tmp = xmlExpGetStartInt(ctxt, exp->exp_left, list, len, nb); + if (tmp < 0) + return(tmp); + tmp2 = xmlExpGetStartInt(ctxt, exp->exp_right, list, len, + nb + tmp); + if (tmp2 < 0) + return(tmp2); + return(tmp + tmp2); + } + return(-1); +} + +/** + * xmlExpGetStart: + * @ctxt: the expression context + * @exp: the expression + * @tokList: where to store the tokens + * @len: the allocated length of @list + * + * Find all the strings that appears at the start of the languages + * accepted by @exp and store them in @list. E.g. for (a, b) | c + * it will return the list [a, c] + * + * Returns the number of unique strings found, -1 in case of errors and + * -2 if there is more than @len strings + */ +int +xmlExpGetStart(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, + const xmlChar**tokList, int len) { + if ((ctxt == NULL) || (exp == NULL) || (tokList == NULL) || (len <= 0)) + return(-1); + return(xmlExpGetStartInt(ctxt, exp, tokList, len, 0)); +} + +/** + * xmlExpIsNillable: + * @exp: the expression + * + * Finds if the expression is nillable, i.e. if it accepts the empty sequqnce + * + * Returns 1 if nillable, 0 if not and -1 in case of error + */ +int +xmlExpIsNillable(xmlExpNodePtr exp) { + if (exp == NULL) + return(-1); + return(IS_NILLABLE(exp) != 0); +} + +static xmlExpNodePtr +xmlExpStringDeriveInt(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, const xmlChar *str) +{ + xmlExpNodePtr ret; + + switch (exp->type) { + case XML_EXP_EMPTY: + return(forbiddenExp); + case XML_EXP_FORBID: + return(forbiddenExp); + case XML_EXP_ATOM: + if (exp->exp_str == str) { +#ifdef DEBUG_DERIV + printf("deriv atom: equal => Empty\n"); +#endif + ret = emptyExp; + } else { +#ifdef DEBUG_DERIV + printf("deriv atom: mismatch => forbid\n"); +#endif + /* TODO wildcards here */ + ret = forbiddenExp; + } + return(ret); + case XML_EXP_OR: { + xmlExpNodePtr tmp; + +#ifdef DEBUG_DERIV + printf("deriv or: => or(derivs)\n"); +#endif + tmp = xmlExpStringDeriveInt(ctxt, exp->exp_left, str); + if (tmp == NULL) { + return(NULL); + } + ret = xmlExpStringDeriveInt(ctxt, exp->exp_right, str); + if (ret == NULL) { + xmlExpFree(ctxt, tmp); + return(NULL); + } + ret = xmlExpHashGetEntry(ctxt, XML_EXP_OR, tmp, ret, + NULL, 0, 0); + return(ret); + } + case XML_EXP_SEQ: +#ifdef DEBUG_DERIV + printf("deriv seq: starting with left\n"); +#endif + ret = xmlExpStringDeriveInt(ctxt, exp->exp_left, str); + if (ret == NULL) { + return(NULL); + } else if (ret == forbiddenExp) { + if (IS_NILLABLE(exp->exp_left)) { +#ifdef DEBUG_DERIV + printf("deriv seq: left failed but nillable\n"); +#endif + ret = xmlExpStringDeriveInt(ctxt, exp->exp_right, str); + } + } else { +#ifdef DEBUG_DERIV + printf("deriv seq: left match => sequence\n"); +#endif + exp->exp_right->ref++; + ret = xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, ret, exp->exp_right, + NULL, 0, 0); + } + return(ret); + case XML_EXP_COUNT: { + int min, max; + xmlExpNodePtr tmp; + + if (exp->exp_max == 0) + return(forbiddenExp); + ret = xmlExpStringDeriveInt(ctxt, exp->exp_left, str); + if (ret == NULL) + return(NULL); + if (ret == forbiddenExp) { +#ifdef DEBUG_DERIV + printf("deriv count: pattern mismatch => forbid\n"); +#endif + return(ret); + } + if (exp->exp_max == 1) + return(ret); + if (exp->exp_max < 0) /* unbounded */ + max = -1; + else + max = exp->exp_max - 1; + if (exp->exp_min > 0) + min = exp->exp_min - 1; + else + min = 0; + exp->exp_left->ref++; + tmp = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, exp->exp_left, NULL, + NULL, min, max); + if (ret == emptyExp) { +#ifdef DEBUG_DERIV + printf("deriv count: match to empty => new count\n"); +#endif + return(tmp); + } +#ifdef DEBUG_DERIV + printf("deriv count: match => sequence with new count\n"); +#endif + return(xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, ret, tmp, + NULL, 0, 0)); + } + } + return(NULL); +} + +/** + * xmlExpStringDerive: + * @ctxt: the expression context + * @exp: the expression + * @str: the string + * @len: the string len in bytes if available + * + * Do one step of Brzozowski derivation of the expression @exp with + * respect to the input string + * + * Returns the resulting expression or NULL in case of internal error + */ +xmlExpNodePtr +xmlExpStringDerive(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, + const xmlChar *str, int len) { + const xmlChar *input; + + if ((exp == NULL) || (ctxt == NULL) || (str == NULL)) { + return(NULL); + } + /* + * check the string is in the dictionnary, if yes use an interned + * copy, otherwise we know it's not an acceptable input + */ + input = xmlDictExists(ctxt->dict, str, len); + if (input == NULL) { + return(forbiddenExp); + } + return(xmlExpStringDeriveInt(ctxt, exp, input)); +} + +static int +xmlExpCheckCard(xmlExpNodePtr exp, xmlExpNodePtr sub) { + int ret = 1; + + if (sub->c_max == -1) { + if (exp->c_max != -1) + ret = 0; + } else if ((exp->c_max >= 0) && (exp->c_max < sub->c_max)) { + ret = 0; + } +#if 0 + if ((IS_NILLABLE(sub)) && (!IS_NILLABLE(exp))) + ret = 0; +#endif + return(ret); +} + +static xmlExpNodePtr xmlExpExpDeriveInt(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, + xmlExpNodePtr sub); +/** + * xmlExpDivide: + * @ctxt: the expressions context + * @exp: the englobing expression + * @sub: the subexpression + * @mult: the multiple expression + * @remain: the remain from the derivation of the multiple + * + * Check if exp is a multiple of sub, i.e. if there is a finite number n + * so that sub{n} subsume exp + * + * Returns the multiple value if successful, 0 if it is not a multiple + * and -1 in case of internel error. + */ + +static int +xmlExpDivide(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, xmlExpNodePtr sub, + xmlExpNodePtr *mult, xmlExpNodePtr *remain) { + int i; + xmlExpNodePtr tmp, tmp2; + + if (mult != NULL) *mult = NULL; + if (remain != NULL) *remain = NULL; + if (exp->c_max == -1) return(0); + if (IS_NILLABLE(exp) && (!IS_NILLABLE(sub))) return(0); + + for (i = 1;i <= exp->c_max;i++) { + sub->ref++; + tmp = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, + sub, NULL, NULL, i, i); + if (tmp == NULL) { + return(-1); + } + if (!xmlExpCheckCard(tmp, exp)) { + xmlExpFree(ctxt, tmp); + continue; + } + tmp2 = xmlExpExpDeriveInt(ctxt, tmp, exp); + if (tmp2 == NULL) { + xmlExpFree(ctxt, tmp); + return(-1); + } + if ((tmp2 != forbiddenExp) && (IS_NILLABLE(tmp2))) { + if (remain != NULL) + *remain = tmp2; + else + xmlExpFree(ctxt, tmp2); + if (mult != NULL) + *mult = tmp; + else + xmlExpFree(ctxt, tmp); +#ifdef DEBUG_DERIV + printf("Divide succeeded %d\n", i); +#endif + return(i); + } + xmlExpFree(ctxt, tmp); + xmlExpFree(ctxt, tmp2); + } +#ifdef DEBUG_DERIV + printf("Divide failed\n"); +#endif + return(0); +} + +/** + * xmlExpExpDeriveInt: + * @ctxt: the expressions context + * @exp: the englobing expression + * @sub: the subexpression + * + * Try to do a step of Brzozowski derivation but at a higher level + * the input being a subexpression. + * + * Returns the resulting expression or NULL in case of internal error + */ +static xmlExpNodePtr +xmlExpExpDeriveInt(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, xmlExpNodePtr sub) { + xmlExpNodePtr ret, tmp, tmp2, tmp3; + const xmlChar **tab; + int len, i; + + /* + * In case of equality and if the expression can only consume a finite + * amount, then the derivation is empty + */ + if ((exp == sub) && (exp->c_max >= 0)) { +#ifdef DEBUG_DERIV + printf("Equal(exp, sub) and finite -> Empty\n"); +#endif + return(emptyExp); + } + /* + * decompose sub sequence first + */ + if (sub->type == XML_EXP_EMPTY) { +#ifdef DEBUG_DERIV + printf("Empty(sub) -> Empty\n"); +#endif + exp->ref++; + return(exp); + } + if (sub->type == XML_EXP_SEQ) { +#ifdef DEBUG_DERIV + printf("Seq(sub) -> decompose\n"); +#endif + tmp = xmlExpExpDeriveInt(ctxt, exp, sub->exp_left); + if (tmp == NULL) + return(NULL); + if (tmp == forbiddenExp) + return(tmp); + ret = xmlExpExpDeriveInt(ctxt, tmp, sub->exp_right); + xmlExpFree(ctxt, tmp); + return(ret); + } + if (sub->type == XML_EXP_OR) { +#ifdef DEBUG_DERIV + printf("Or(sub) -> decompose\n"); +#endif + tmp = xmlExpExpDeriveInt(ctxt, exp, sub->exp_left); + if (tmp == forbiddenExp) + return(tmp); + if (tmp == NULL) + return(NULL); + ret = xmlExpExpDeriveInt(ctxt, exp, sub->exp_right); + if ((ret == NULL) || (ret == forbiddenExp)) { + xmlExpFree(ctxt, tmp); + return(ret); + } + return(xmlExpHashGetEntry(ctxt, XML_EXP_OR, tmp, ret, NULL, 0, 0)); + } + if (!xmlExpCheckCard(exp, sub)) { +#ifdef DEBUG_DERIV + printf("CheckCard(exp, sub) failed -> Forbid\n"); +#endif + return(forbiddenExp); + } + switch (exp->type) { + case XML_EXP_EMPTY: + if (sub == emptyExp) + return(emptyExp); +#ifdef DEBUG_DERIV + printf("Empty(exp) -> Forbid\n"); +#endif + return(forbiddenExp); + case XML_EXP_FORBID: +#ifdef DEBUG_DERIV + printf("Forbid(exp) -> Forbid\n"); +#endif + return(forbiddenExp); + case XML_EXP_ATOM: + if (sub->type == XML_EXP_ATOM) { + /* TODO: handle wildcards */ + if (exp->exp_str == sub->exp_str) { +#ifdef DEBUG_DERIV + printf("Atom match -> Empty\n"); +#endif + return(emptyExp); + } +#ifdef DEBUG_DERIV + printf("Atom mismatch -> Forbid\n"); +#endif + return(forbiddenExp); + } + if ((sub->type == XML_EXP_COUNT) && + (sub->exp_max == 1) && + (sub->exp_left->type == XML_EXP_ATOM)) { + /* TODO: handle wildcards */ + if (exp->exp_str == sub->exp_left->exp_str) { +#ifdef DEBUG_DERIV + printf("Atom match -> Empty\n"); +#endif + return(emptyExp); + } +#ifdef DEBUG_DERIV + printf("Atom mismatch -> Forbid\n"); +#endif + return(forbiddenExp); + } +#ifdef DEBUG_DERIV + printf("Compex exp vs Atom -> Forbid\n"); +#endif + return(forbiddenExp); + case XML_EXP_SEQ: + /* try to get the sequence consumed only if possible */ + if (xmlExpCheckCard(exp->exp_left, sub)) { + /* See if the sequence can be consumed directly */ +#ifdef DEBUG_DERIV + printf("Seq trying left only\n"); +#endif + ret = xmlExpExpDeriveInt(ctxt, exp->exp_left, sub); + if ((ret != forbiddenExp) && (ret != NULL)) { +#ifdef DEBUG_DERIV + printf("Seq trying left only worked\n"); +#endif + /* + * TODO: assumption here that we are determinist + * i.e. we won't get to a nillable exp left + * subset which could be matched by the right + * part too. + * e.g.: (a | b)+,(a | c) and 'a+,a' + */ + exp->exp_right->ref++; + return(xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, ret, + exp->exp_right, NULL, 0, 0)); + } +#ifdef DEBUG_DERIV + } else { + printf("Seq: left too short\n"); +#endif + } + /* Try instead to decompose */ + if (sub->type == XML_EXP_COUNT) { + int min, max; + +#ifdef DEBUG_DERIV + printf("Seq: sub is a count\n"); +#endif + ret = xmlExpExpDeriveInt(ctxt, exp->exp_left, sub->exp_left); + if (ret == NULL) + return(NULL); + if (ret != forbiddenExp) { +#ifdef DEBUG_DERIV + printf("Seq , Count match on left\n"); +#endif + if (sub->exp_max < 0) + max = -1; + else + max = sub->exp_max -1; + if (sub->exp_min > 0) + min = sub->exp_min -1; + else + min = 0; + exp->exp_right->ref++; + tmp = xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, ret, + exp->exp_right, NULL, 0, 0); + if (tmp == NULL) + return(NULL); + + sub->exp_left->ref++; + tmp2 = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, + sub->exp_left, NULL, NULL, min, max); + if (tmp2 == NULL) { + xmlExpFree(ctxt, tmp); + return(NULL); + } + ret = xmlExpExpDeriveInt(ctxt, tmp, tmp2); + xmlExpFree(ctxt, tmp); + xmlExpFree(ctxt, tmp2); + return(ret); + } + } + /* we made no progress on structured operations */ + break; + case XML_EXP_OR: +#ifdef DEBUG_DERIV + printf("Or , trying both side\n"); +#endif + ret = xmlExpExpDeriveInt(ctxt, exp->exp_left, sub); + if (ret == NULL) + return(NULL); + tmp = xmlExpExpDeriveInt(ctxt, exp->exp_right, sub); + if (tmp == NULL) { + xmlExpFree(ctxt, ret); + return(NULL); + } + return(xmlExpHashGetEntry(ctxt, XML_EXP_OR, ret, tmp, NULL, 0, 0)); + case XML_EXP_COUNT: { + int min, max; + + if (sub->type == XML_EXP_COUNT) { + /* + * Try to see if the loop is completely subsumed + */ + tmp = xmlExpExpDeriveInt(ctxt, exp->exp_left, sub->exp_left); + if (tmp == NULL) + return(NULL); + if (tmp == forbiddenExp) { + int mult; + +#ifdef DEBUG_DERIV + printf("Count, Count inner don't subsume\n"); +#endif + mult = xmlExpDivide(ctxt, sub->exp_left, exp->exp_left, + NULL, &tmp); + if (mult <= 0) { +#ifdef DEBUG_DERIV + printf("Count, Count not multiple => forbidden\n"); +#endif + return(forbiddenExp); + } + if (sub->exp_max == -1) { + max = -1; + if (exp->exp_max == -1) { + if (exp->exp_min <= sub->exp_min * mult) + min = 0; + else + min = exp->exp_min - sub->exp_min * mult; + } else { +#ifdef DEBUG_DERIV + printf("Count, Count finite can't subsume infinite\n"); +#endif + xmlExpFree(ctxt, tmp); + return(forbiddenExp); + } + } else { + if (exp->exp_max == -1) { +#ifdef DEBUG_DERIV + printf("Infinite loop consume mult finite loop\n"); +#endif + if (exp->exp_min > sub->exp_min * mult) { + max = -1; + min = exp->exp_min - sub->exp_min * mult; + } else { + max = -1; + min = 0; + } + } else { + if (exp->exp_max < sub->exp_max * mult) { +#ifdef DEBUG_DERIV + printf("loops max mult mismatch => forbidden\n"); +#endif + xmlExpFree(ctxt, tmp); + return(forbiddenExp); + } + if (sub->exp_max * mult > exp->exp_min) + min = 0; + else + min = exp->exp_min - sub->exp_max * mult; + max = exp->exp_max - sub->exp_max * mult; + } + } + } else if (!IS_NILLABLE(tmp)) { + /* + * TODO: loop here to try to grow if working on finite + * blocks. + */ +#ifdef DEBUG_DERIV + printf("Count, Count remain not nillable => forbidden\n"); +#endif + xmlExpFree(ctxt, tmp); + return(forbiddenExp); + } else if (sub->exp_max == -1) { + if (exp->exp_max == -1) { + if (exp->exp_min <= sub->exp_min) { +#ifdef DEBUG_DERIV + printf("Infinite loops Okay => COUNT(0,Inf)\n"); +#endif + max = -1; + min = 0; + } else { +#ifdef DEBUG_DERIV + printf("Infinite loops min => Count(X,Inf)\n"); +#endif + max = -1; + min = exp->exp_min - sub->exp_min; + } + } else if (exp->exp_min > sub->exp_min) { +#ifdef DEBUG_DERIV + printf("loops min mismatch 1 => forbidden ???\n"); +#endif + xmlExpFree(ctxt, tmp); + return(forbiddenExp); + } else { + max = -1; + min = 0; + } + } else { + if (exp->exp_max == -1) { +#ifdef DEBUG_DERIV + printf("Infinite loop consume finite loop\n"); +#endif + if (exp->exp_min > sub->exp_min) { + max = -1; + min = exp->exp_min - sub->exp_min; + } else { + max = -1; + min = 0; + } + } else { + if (exp->exp_max < sub->exp_max) { +#ifdef DEBUG_DERIV + printf("loops max mismatch => forbidden\n"); +#endif + xmlExpFree(ctxt, tmp); + return(forbiddenExp); + } + if (sub->exp_max > exp->exp_min) + min = 0; + else + min = exp->exp_min - sub->exp_max; + max = exp->exp_max - sub->exp_max; + } + } +#ifdef DEBUG_DERIV + printf("loops match => SEQ(COUNT())\n"); +#endif + exp->exp_left->ref++; + tmp2 = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, exp->exp_left, + NULL, NULL, min, max); + if (tmp2 == NULL) { + return(NULL); + } + ret = xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, tmp, tmp2, + NULL, 0, 0); + return(ret); + } + tmp = xmlExpExpDeriveInt(ctxt, exp->exp_left, sub); + if (tmp == NULL) + return(NULL); + if (tmp == forbiddenExp) { +#ifdef DEBUG_DERIV + printf("loop mismatch => forbidden\n"); +#endif + return(forbiddenExp); + } + if (exp->exp_min > 0) + min = exp->exp_min - 1; + else + min = 0; + if (exp->exp_max < 0) + max = -1; + else + max = exp->exp_max - 1; + +#ifdef DEBUG_DERIV + printf("loop match => SEQ(COUNT())\n"); +#endif + exp->exp_left->ref++; + tmp2 = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, exp->exp_left, + NULL, NULL, min, max); + if (tmp2 == NULL) + return(NULL); + ret = xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, tmp, tmp2, + NULL, 0, 0); + return(ret); + } + } + +#ifdef DEBUG_DERIV + printf("Fallback to derivative\n"); +#endif + if (IS_NILLABLE(sub)) { + if (!(IS_NILLABLE(exp))) + return(forbiddenExp); + else + ret = emptyExp; + } else + ret = NULL; + /* + * here the structured derivation made no progress so + * we use the default token based derivation to force one more step + */ + if (ctxt->tabSize == 0) + ctxt->tabSize = 40; + + tab = (const xmlChar **) xmlMalloc(ctxt->tabSize * + sizeof(const xmlChar *)); + if (tab == NULL) { + return(NULL); + } + + /* + * collect all the strings accepted by the subexpression on input + */ + len = xmlExpGetStartInt(ctxt, sub, tab, ctxt->tabSize, 0); + while (len < 0) { + const xmlChar **temp; + temp = (const xmlChar **) xmlRealloc((xmlChar **) tab, ctxt->tabSize * 2 * + sizeof(const xmlChar *)); + if (temp == NULL) { + xmlFree((xmlChar **) tab); + return(NULL); + } + tab = temp; + ctxt->tabSize *= 2; + len = xmlExpGetStartInt(ctxt, sub, tab, ctxt->tabSize, 0); + } + for (i = 0;i < len;i++) { + tmp = xmlExpStringDeriveInt(ctxt, exp, tab[i]); + if ((tmp == NULL) || (tmp == forbiddenExp)) { + xmlExpFree(ctxt, ret); + xmlFree((xmlChar **) tab); + return(tmp); + } + tmp2 = xmlExpStringDeriveInt(ctxt, sub, tab[i]); + if ((tmp2 == NULL) || (tmp2 == forbiddenExp)) { + xmlExpFree(ctxt, tmp); + xmlExpFree(ctxt, ret); + xmlFree((xmlChar **) tab); + return(tmp); + } + tmp3 = xmlExpExpDeriveInt(ctxt, tmp, tmp2); + xmlExpFree(ctxt, tmp); + xmlExpFree(ctxt, tmp2); + + if ((tmp3 == NULL) || (tmp3 == forbiddenExp)) { + xmlExpFree(ctxt, ret); + xmlFree((xmlChar **) tab); + return(tmp3); + } + + if (ret == NULL) + ret = tmp3; + else { + ret = xmlExpHashGetEntry(ctxt, XML_EXP_OR, ret, tmp3, NULL, 0, 0); + if (ret == NULL) { + xmlFree((xmlChar **) tab); + return(NULL); + } + } + } + xmlFree((xmlChar **) tab); + return(ret); +} + +/** + * xmlExpExpDerive: + * @ctxt: the expressions context + * @exp: the englobing expression + * @sub: the subexpression + * + * Evaluates the expression resulting from @exp consuming a sub expression @sub + * Based on algebraic derivation and sometimes direct Brzozowski derivation + * it usually tatkes less than linear time and can handle expressions generating + * infinite languages. + * + * Returns the resulting expression or NULL in case of internal error, the + * result must be freed + */ +xmlExpNodePtr +xmlExpExpDerive(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, xmlExpNodePtr sub) { + if ((exp == NULL) || (ctxt == NULL) || (sub == NULL)) + return(NULL); + + /* + * O(1) speedups + */ + if (IS_NILLABLE(sub) && (!IS_NILLABLE(exp))) { +#ifdef DEBUG_DERIV + printf("Sub nillable and not exp : can't subsume\n"); +#endif + return(forbiddenExp); + } + if (xmlExpCheckCard(exp, sub) == 0) { +#ifdef DEBUG_DERIV + printf("sub generate longuer sequances than exp : can't subsume\n"); +#endif + return(forbiddenExp); + } + return(xmlExpExpDeriveInt(ctxt, exp, sub)); +} + +/** + * xmlExpSubsume: + * @ctxt: the expressions context + * @exp: the englobing expression + * @sub: the subexpression + * + * Check whether @exp accepts all the languages accexpted by @sub + * the input being a subexpression. + * + * Returns 1 if true 0 if false and -1 in case of failure. + */ +int +xmlExpSubsume(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, xmlExpNodePtr sub) { + xmlExpNodePtr tmp; + + if ((exp == NULL) || (ctxt == NULL) || (sub == NULL)) + return(-1); + + /* + * TODO: speedup by checking the language of sub is a subset of the + * language of exp + */ + /* + * O(1) speedups + */ + if (IS_NILLABLE(sub) && (!IS_NILLABLE(exp))) { +#ifdef DEBUG_DERIV + printf("Sub nillable and not exp : can't subsume\n"); +#endif + return(0); + } + if (xmlExpCheckCard(exp, sub) == 0) { +#ifdef DEBUG_DERIV + printf("sub generate longuer sequances than exp : can't subsume\n"); +#endif + return(0); + } + tmp = xmlExpExpDeriveInt(ctxt, exp, sub); +#ifdef DEBUG_DERIV + printf("Result derivation :\n"); + PRINT_EXP(tmp); +#endif + if (tmp == NULL) + return(-1); + if (tmp == forbiddenExp) + return(0); + if (tmp == emptyExp) + return(1); + if ((tmp != NULL) && (IS_NILLABLE(tmp))) { + xmlExpFree(ctxt, tmp); + return(1); + } + xmlExpFree(ctxt, tmp); + return(0); +} + +/************************************************************************ + * * + * Parsing expression * + * * + ************************************************************************/ + +static xmlExpNodePtr xmlExpParseExpr(xmlExpCtxtPtr ctxt); + +#undef CUR +#define CUR (*ctxt->cur) +#undef NEXT +#define NEXT ctxt->cur++; +#undef IS_BLANK +#define IS_BLANK(c) ((c == ' ') || (c == '\n') || (c == '\r') || (c == '\t')) +#define SKIP_BLANKS while (IS_BLANK(*ctxt->cur)) ctxt->cur++; + +static int +xmlExpParseNumber(xmlExpCtxtPtr ctxt) { + int ret = 0; + + SKIP_BLANKS + if (CUR == '*') { + NEXT + return(-1); + } + if ((CUR < '0') || (CUR > '9')) + return(-1); + while ((CUR >= '0') && (CUR <= '9')) { + ret = ret * 10 + (CUR - '0'); + NEXT + } + return(ret); +} + +static xmlExpNodePtr +xmlExpParseOr(xmlExpCtxtPtr ctxt) { + const char *base; + xmlExpNodePtr ret; + const xmlChar *val; + + SKIP_BLANKS + base = ctxt->cur; + if (*ctxt->cur == '(') { + NEXT + ret = xmlExpParseExpr(ctxt); + SKIP_BLANKS + if (*ctxt->cur != ')') { + fprintf(stderr, "unbalanced '(' : %s\n", base); + xmlExpFree(ctxt, ret); + return(NULL); + } + NEXT; + SKIP_BLANKS + goto parse_quantifier; + } + while ((CUR != 0) && (!(IS_BLANK(CUR))) && (CUR != '(') && + (CUR != ')') && (CUR != '|') && (CUR != ',') && (CUR != '{') && + (CUR != '*') && (CUR != '+') && (CUR != '?') && (CUR != '}')) + NEXT; + val = xmlDictLookup(ctxt->dict, BAD_CAST base, ctxt->cur - base); + if (val == NULL) + return(NULL); + ret = xmlExpHashGetEntry(ctxt, XML_EXP_ATOM, NULL, NULL, val, 0, 0); + if (ret == NULL) + return(NULL); + SKIP_BLANKS +parse_quantifier: + if (CUR == '{') { + int min, max; + + NEXT + min = xmlExpParseNumber(ctxt); + if (min < 0) { + xmlExpFree(ctxt, ret); + return(NULL); + } + SKIP_BLANKS + if (CUR == ',') { + NEXT + max = xmlExpParseNumber(ctxt); + SKIP_BLANKS + } else + max = min; + if (CUR != '}') { + xmlExpFree(ctxt, ret); + return(NULL); + } + NEXT + ret = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, ret, NULL, NULL, + min, max); + SKIP_BLANKS + } else if (CUR == '?') { + NEXT + ret = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, ret, NULL, NULL, + 0, 1); + SKIP_BLANKS + } else if (CUR == '+') { + NEXT + ret = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, ret, NULL, NULL, + 1, -1); + SKIP_BLANKS + } else if (CUR == '*') { + NEXT + ret = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, ret, NULL, NULL, + 0, -1); + SKIP_BLANKS + } + return(ret); +} + + +static xmlExpNodePtr +xmlExpParseSeq(xmlExpCtxtPtr ctxt) { + xmlExpNodePtr ret, right; + + ret = xmlExpParseOr(ctxt); + SKIP_BLANKS + while (CUR == '|') { + NEXT + right = xmlExpParseOr(ctxt); + if (right == NULL) { + xmlExpFree(ctxt, ret); + return(NULL); + } + ret = xmlExpHashGetEntry(ctxt, XML_EXP_OR, ret, right, NULL, 0, 0); + if (ret == NULL) + return(NULL); + } + return(ret); +} + +static xmlExpNodePtr +xmlExpParseExpr(xmlExpCtxtPtr ctxt) { + xmlExpNodePtr ret, right; + + ret = xmlExpParseSeq(ctxt); + SKIP_BLANKS + while (CUR == ',') { + NEXT + right = xmlExpParseSeq(ctxt); + if (right == NULL) { + xmlExpFree(ctxt, ret); + return(NULL); + } + ret = xmlExpHashGetEntry(ctxt, XML_EXP_SEQ, ret, right, NULL, 0, 0); + if (ret == NULL) + return(NULL); + } + return(ret); +} + +/** + * xmlExpParse: + * @ctxt: the expressions context + * @expr: the 0 terminated string + * + * Minimal parser for regexps, it understand the following constructs + * - string terminals + * - choice operator | + * - sequence operator , + * - subexpressions (...) + * - usual cardinality operators + * and ? + * - finite sequences { min, max } + * - infinite sequences { min, * } + * There is minimal checkings made especially no checking on strings values + * + * Returns a new expression or NULL in case of failure + */ +xmlExpNodePtr +xmlExpParse(xmlExpCtxtPtr ctxt, const char *expr) { + xmlExpNodePtr ret; + + ctxt->expr = expr; + ctxt->cur = expr; + + ret = xmlExpParseExpr(ctxt); + SKIP_BLANKS + if (*ctxt->cur != 0) { + xmlExpFree(ctxt, ret); + return(NULL); + } + return(ret); +} + +static void +xmlExpDumpInt(xmlBufferPtr buf, xmlExpNodePtr expr, int glob) { + xmlExpNodePtr c; + + if (expr == NULL) return; + if (glob) xmlBufferWriteChar(buf, "("); + switch (expr->type) { + case XML_EXP_EMPTY: + xmlBufferWriteChar(buf, "empty"); + break; + case XML_EXP_FORBID: + xmlBufferWriteChar(buf, "forbidden"); + break; + case XML_EXP_ATOM: + xmlBufferWriteCHAR(buf, expr->exp_str); + break; + case XML_EXP_SEQ: + c = expr->exp_left; + if ((c->type == XML_EXP_SEQ) || (c->type == XML_EXP_OR)) + xmlExpDumpInt(buf, c, 1); + else + xmlExpDumpInt(buf, c, 0); + xmlBufferWriteChar(buf, " , "); + c = expr->exp_right; + if ((c->type == XML_EXP_SEQ) || (c->type == XML_EXP_OR)) + xmlExpDumpInt(buf, c, 1); + else + xmlExpDumpInt(buf, c, 0); + break; + case XML_EXP_OR: + c = expr->exp_left; + if ((c->type == XML_EXP_SEQ) || (c->type == XML_EXP_OR)) + xmlExpDumpInt(buf, c, 1); + else + xmlExpDumpInt(buf, c, 0); + xmlBufferWriteChar(buf, " | "); + c = expr->exp_right; + if ((c->type == XML_EXP_SEQ) || (c->type == XML_EXP_OR)) + xmlExpDumpInt(buf, c, 1); + else + xmlExpDumpInt(buf, c, 0); + break; + case XML_EXP_COUNT: { + char rep[40]; + + c = expr->exp_left; + if ((c->type == XML_EXP_SEQ) || (c->type == XML_EXP_OR)) + xmlExpDumpInt(buf, c, 1); + else + xmlExpDumpInt(buf, c, 0); + if ((expr->exp_min == 0) && (expr->exp_max == 1)) { + rep[0] = '?'; + rep[1] = 0; + } else if ((expr->exp_min == 0) && (expr->exp_max == -1)) { + rep[0] = '*'; + rep[1] = 0; + } else if ((expr->exp_min == 1) && (expr->exp_max == -1)) { + rep[0] = '+'; + rep[1] = 0; + } else if (expr->exp_max == expr->exp_min) { + snprintf(rep, 39, "{%d}", expr->exp_min); + } else if (expr->exp_max < 0) { + snprintf(rep, 39, "{%d,inf}", expr->exp_min); + } else { + snprintf(rep, 39, "{%d,%d}", expr->exp_min, expr->exp_max); + } + rep[39] = 0; + xmlBufferWriteChar(buf, rep); + break; + } + default: + fprintf(stderr, "Error in tree\n"); + } + if (glob) + xmlBufferWriteChar(buf, ")"); +} +/** + * xmlExpDump: + * @buf: a buffer to receive the output + * @expr: the compiled expression + * + * Serialize the expression as compiled to the buffer + */ +void +xmlExpDump(xmlBufferPtr buf, xmlExpNodePtr expr) { + if ((buf == NULL) || (expr == NULL)) + return; + xmlExpDumpInt(buf, expr, 0); +} + +/** + * xmlExpMaxToken: + * @expr: a compiled expression + * + * Indicate the maximum number of input a expression can accept + * + * Returns the maximum length or -1 in case of error + */ +int +xmlExpMaxToken(xmlExpNodePtr expr) { + if (expr == NULL) + return(-1); + return(expr->c_max); +} + +/** + * xmlExpCtxtNbNodes: + * @ctxt: an expression context + * + * Debugging facility provides the number of allocated nodes at a that point + * + * Returns the number of nodes in use or -1 in case of error + */ +int +xmlExpCtxtNbNodes(xmlExpCtxtPtr ctxt) { + if (ctxt == NULL) + return(-1); + return(ctxt->nb_nodes); +} + +/** + * xmlExpCtxtNbCons: + * @ctxt: an expression context + * + * Debugging facility provides the number of allocated nodes over lifetime + * + * Returns the number of nodes ever allocated or -1 in case of error + */ +int +xmlExpCtxtNbCons(xmlExpCtxtPtr ctxt) { + if (ctxt == NULL) + return(-1); + return(ctxt->nb_cons); +} + +#endif /* LIBXML_EXPR_ENABLED */ +#define bottom_xmlregexp +#include "elfgcchack.h" +#endif /* LIBXML_REGEXP_ENABLED */ diff --git a/vendors/libxml/src/xmlsave.c b/vendors/libxml/src/xmlsave.c new file mode 100644 index 0000000..774404b --- /dev/null +++ b/vendors/libxml/src/xmlsave.c @@ -0,0 +1,2788 @@ +/* + * xmlsave.c: Implemetation of the document serializer + * + * See Copyright for the status of this software. + * + * daniel@veillard.com + */ + +#define IN_LIBXML +#include "libxml.h" + +#include +#include +#include +#include +#include + +#define MAX_INDENT 60 + +#include + +#include "buf.h" +#include "enc.h" +#include "save.h" + +/************************************************************************ + * * + * XHTML detection * + * * + ************************************************************************/ +#define XHTML_STRICT_PUBLIC_ID BAD_CAST \ + "-//W3C//DTD XHTML 1.0 Strict//EN" +#define XHTML_STRICT_SYSTEM_ID BAD_CAST \ + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" +#define XHTML_FRAME_PUBLIC_ID BAD_CAST \ + "-//W3C//DTD XHTML 1.0 Frameset//EN" +#define XHTML_FRAME_SYSTEM_ID BAD_CAST \ + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd" +#define XHTML_TRANS_PUBLIC_ID BAD_CAST \ + "-//W3C//DTD XHTML 1.0 Transitional//EN" +#define XHTML_TRANS_SYSTEM_ID BAD_CAST \ + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" + +#define XHTML_NS_NAME BAD_CAST "http://www.w3.org/1999/xhtml" +/** + * xmlIsXHTML: + * @systemID: the system identifier + * @publicID: the public identifier + * + * Try to find if the document correspond to an XHTML DTD + * + * Returns 1 if true, 0 if not and -1 in case of error + */ +int +xmlIsXHTML(const xmlChar *systemID, const xmlChar *publicID) { + if ((systemID == NULL) && (publicID == NULL)) + return(-1); + if (publicID != NULL) { + if (xmlStrEqual(publicID, XHTML_STRICT_PUBLIC_ID)) return(1); + if (xmlStrEqual(publicID, XHTML_FRAME_PUBLIC_ID)) return(1); + if (xmlStrEqual(publicID, XHTML_TRANS_PUBLIC_ID)) return(1); + } + if (systemID != NULL) { + if (xmlStrEqual(systemID, XHTML_STRICT_SYSTEM_ID)) return(1); + if (xmlStrEqual(systemID, XHTML_FRAME_SYSTEM_ID)) return(1); + if (xmlStrEqual(systemID, XHTML_TRANS_SYSTEM_ID)) return(1); + } + return(0); +} + +#ifdef LIBXML_OUTPUT_ENABLED + +#define TODO \ + xmlGenericError(xmlGenericErrorContext, \ + "Unimplemented block at %s:%d\n", \ + __FILE__, __LINE__); + +struct _xmlSaveCtxt { + void *_private; + int type; + int fd; + const xmlChar *filename; + const xmlChar *encoding; + xmlCharEncodingHandlerPtr handler; + xmlOutputBufferPtr buf; + xmlDocPtr doc; + int options; + int level; + int format; + char indent[MAX_INDENT + 1]; /* array for indenting output */ + int indent_nr; + int indent_size; + xmlCharEncodingOutputFunc escape; /* used for element content */ + xmlCharEncodingOutputFunc escapeAttr;/* used for attribute content */ +}; + +/************************************************************************ + * * + * Output error handlers * + * * + ************************************************************************/ +/** + * xmlSaveErrMemory: + * @extra: extra informations + * + * Handle an out of memory condition + */ +static void +xmlSaveErrMemory(const char *extra) +{ + __xmlSimpleError(XML_FROM_OUTPUT, XML_ERR_NO_MEMORY, NULL, NULL, extra); +} + +/** + * xmlSaveErr: + * @code: the error number + * @node: the location of the error. + * @extra: extra informations + * + * Handle an out of memory condition + */ +static void +xmlSaveErr(int code, xmlNodePtr node, const char *extra) +{ + const char *msg = NULL; + + switch(code) { + case XML_SAVE_NOT_UTF8: + msg = "string is not in UTF-8\n"; + break; + case XML_SAVE_CHAR_INVALID: + msg = "invalid character value\n"; + break; + case XML_SAVE_UNKNOWN_ENCODING: + msg = "unknown encoding %s\n"; + break; + case XML_SAVE_NO_DOCTYPE: + msg = "document has no DOCTYPE\n"; + break; + default: + msg = "unexpected error number\n"; + } + __xmlSimpleError(XML_FROM_OUTPUT, code, node, msg, extra); +} + +/************************************************************************ + * * + * Special escaping routines * + * * + ************************************************************************/ +static unsigned char * +xmlSerializeHexCharRef(unsigned char *out, int val) { + unsigned char *ptr; + + *out++ = '&'; + *out++ = '#'; + *out++ = 'x'; + if (val < 0x10) ptr = out; + else if (val < 0x100) ptr = out + 1; + else if (val < 0x1000) ptr = out + 2; + else if (val < 0x10000) ptr = out + 3; + else if (val < 0x100000) ptr = out + 4; + else ptr = out + 5; + out = ptr + 1; + while (val > 0) { + switch (val & 0xF) { + case 0: *ptr-- = '0'; break; + case 1: *ptr-- = '1'; break; + case 2: *ptr-- = '2'; break; + case 3: *ptr-- = '3'; break; + case 4: *ptr-- = '4'; break; + case 5: *ptr-- = '5'; break; + case 6: *ptr-- = '6'; break; + case 7: *ptr-- = '7'; break; + case 8: *ptr-- = '8'; break; + case 9: *ptr-- = '9'; break; + case 0xA: *ptr-- = 'A'; break; + case 0xB: *ptr-- = 'B'; break; + case 0xC: *ptr-- = 'C'; break; + case 0xD: *ptr-- = 'D'; break; + case 0xE: *ptr-- = 'E'; break; + case 0xF: *ptr-- = 'F'; break; + default: *ptr-- = '0'; break; + } + val >>= 4; + } + *out++ = ';'; + *out = 0; + return(out); +} + +/** + * xmlEscapeEntities: + * @out: a pointer to an array of bytes to store the result + * @outlen: the length of @out + * @in: a pointer to an array of unescaped UTF-8 bytes + * @inlen: the length of @in + * + * Take a block of UTF-8 chars in and escape them. Used when there is no + * encoding specified. + * + * Returns 0 if success, or -1 otherwise + * The value of @inlen after return is the number of octets consumed + * if the return value is positive, else unpredictable. + * The value of @outlen after return is the number of octets consumed. + */ +static int +xmlEscapeEntities(unsigned char* out, int *outlen, + const xmlChar* in, int *inlen) { + unsigned char* outstart = out; + const unsigned char* base = in; + unsigned char* outend = out + *outlen; + const unsigned char* inend; + int val; + + inend = in + (*inlen); + + while ((in < inend) && (out < outend)) { + if (*in == '<') { + if (outend - out < 4) break; + *out++ = '&'; + *out++ = 'l'; + *out++ = 't'; + *out++ = ';'; + in++; + continue; + } else if (*in == '>') { + if (outend - out < 4) break; + *out++ = '&'; + *out++ = 'g'; + *out++ = 't'; + *out++ = ';'; + in++; + continue; + } else if (*in == '&') { + if (outend - out < 5) break; + *out++ = '&'; + *out++ = 'a'; + *out++ = 'm'; + *out++ = 'p'; + *out++ = ';'; + in++; + continue; + } else if (((*in >= 0x20) && (*in < 0x80)) || + (*in == '\n') || (*in == '\t')) { + /* + * default case, just copy ! + */ + *out++ = *in++; + continue; + } else if (*in >= 0x80) { + /* + * We assume we have UTF-8 input. + */ + if (outend - out < 11) break; + + if (*in < 0xC0) { + xmlSaveErr(XML_SAVE_NOT_UTF8, NULL, NULL); + in++; + goto error; + } else if (*in < 0xE0) { + if (inend - in < 2) break; + val = (in[0]) & 0x1F; + val <<= 6; + val |= (in[1]) & 0x3F; + in += 2; + } else if (*in < 0xF0) { + if (inend - in < 3) break; + val = (in[0]) & 0x0F; + val <<= 6; + val |= (in[1]) & 0x3F; + val <<= 6; + val |= (in[2]) & 0x3F; + in += 3; + } else if (*in < 0xF8) { + if (inend - in < 4) break; + val = (in[0]) & 0x07; + val <<= 6; + val |= (in[1]) & 0x3F; + val <<= 6; + val |= (in[2]) & 0x3F; + val <<= 6; + val |= (in[3]) & 0x3F; + in += 4; + } else { + xmlSaveErr(XML_SAVE_CHAR_INVALID, NULL, NULL); + in++; + goto error; + } + if (!IS_CHAR(val)) { + xmlSaveErr(XML_SAVE_CHAR_INVALID, NULL, NULL); + in++; + goto error; + } + + /* + * We could do multiple things here. Just save as a char ref + */ + out = xmlSerializeHexCharRef(out, val); + } else if (IS_BYTE_CHAR(*in)) { + if (outend - out < 6) break; + out = xmlSerializeHexCharRef(out, *in++); + } else { + xmlGenericError(xmlGenericErrorContext, + "xmlEscapeEntities : char out of range\n"); + in++; + goto error; + } + } + *outlen = out - outstart; + *inlen = in - base; + return(0); +error: + *outlen = out - outstart; + *inlen = in - base; + return(-1); +} + +/************************************************************************ + * * + * Allocation and deallocation * + * * + ************************************************************************/ +/** + * xmlSaveCtxtInit: + * @ctxt: the saving context + * + * Initialize a saving context + */ +static void +xmlSaveCtxtInit(xmlSaveCtxtPtr ctxt) +{ + int i; + int len; + + if (ctxt == NULL) return; + if ((ctxt->encoding == NULL) && (ctxt->escape == NULL)) + ctxt->escape = xmlEscapeEntities; + len = xmlStrlen((xmlChar *)xmlTreeIndentString); + if ((xmlTreeIndentString == NULL) || (len == 0)) { + memset(&ctxt->indent[0], 0, MAX_INDENT + 1); + } else { + ctxt->indent_size = len; + ctxt->indent_nr = MAX_INDENT / ctxt->indent_size; + for (i = 0;i < ctxt->indent_nr;i++) + memcpy(&ctxt->indent[i * ctxt->indent_size], xmlTreeIndentString, + ctxt->indent_size); + ctxt->indent[ctxt->indent_nr * ctxt->indent_size] = 0; + } + + if (xmlSaveNoEmptyTags) { + ctxt->options |= XML_SAVE_NO_EMPTY; + } +} + +/** + * xmlFreeSaveCtxt: + * + * Free a saving context, destroying the ouptut in any remaining buffer + */ +static void +xmlFreeSaveCtxt(xmlSaveCtxtPtr ctxt) +{ + if (ctxt == NULL) return; + if (ctxt->encoding != NULL) + xmlFree((char *) ctxt->encoding); + if (ctxt->buf != NULL) + xmlOutputBufferClose(ctxt->buf); + xmlFree(ctxt); +} + +/** + * xmlNewSaveCtxt: + * + * Create a new saving context + * + * Returns the new structure or NULL in case of error + */ +static xmlSaveCtxtPtr +xmlNewSaveCtxt(const char *encoding, int options) +{ + xmlSaveCtxtPtr ret; + + ret = (xmlSaveCtxtPtr) xmlMalloc(sizeof(xmlSaveCtxt)); + if (ret == NULL) { + xmlSaveErrMemory("creating saving context"); + return ( NULL ); + } + memset(ret, 0, sizeof(xmlSaveCtxt)); + + if (encoding != NULL) { + ret->handler = xmlFindCharEncodingHandler(encoding); + if (ret->handler == NULL) { + xmlSaveErr(XML_SAVE_UNKNOWN_ENCODING, NULL, encoding); + xmlFreeSaveCtxt(ret); + return(NULL); + } + ret->encoding = xmlStrdup((const xmlChar *)encoding); + ret->escape = NULL; + } + xmlSaveCtxtInit(ret); + + /* + * Use the options + */ + + /* Re-check this option as it may already have been set */ + if ((ret->options & XML_SAVE_NO_EMPTY) && ! (options & XML_SAVE_NO_EMPTY)) { + options |= XML_SAVE_NO_EMPTY; + } + + ret->options = options; + if (options & XML_SAVE_FORMAT) + ret->format = 1; + else if (options & XML_SAVE_WSNONSIG) + ret->format = 2; + + return(ret); +} + +/************************************************************************ + * * + * Dumping XML tree content to a simple buffer * + * * + ************************************************************************/ +/** + * xmlAttrSerializeContent: + * @buf: the XML buffer output + * @doc: the document + * @attr: the attribute pointer + * + * Serialize the attribute in the buffer + */ +static void +xmlAttrSerializeContent(xmlOutputBufferPtr buf, xmlAttrPtr attr) +{ + xmlNodePtr children; + + children = attr->children; + while (children != NULL) { + switch (children->type) { + case XML_TEXT_NODE: + xmlBufAttrSerializeTxtContent(buf->buffer, attr->doc, + attr, children->content); + break; + case XML_ENTITY_REF_NODE: + xmlBufAdd(buf->buffer, BAD_CAST "&", 1); + xmlBufAdd(buf->buffer, children->name, + xmlStrlen(children->name)); + xmlBufAdd(buf->buffer, BAD_CAST ";", 1); + break; + default: + /* should not happen unless we have a badly built tree */ + break; + } + children = children->next; + } +} + +/** + * xmlBufDumpNotationTable: + * @buf: an xmlBufPtr output + * @table: A notation table + * + * This will dump the content of the notation table as an XML DTD definition + */ +void +xmlBufDumpNotationTable(xmlBufPtr buf, xmlNotationTablePtr table) { + xmlBufferPtr buffer; + + buffer = xmlBufferCreate(); + if (buffer == NULL) { + /* + * TODO set the error in buf + */ + return; + } + xmlDumpNotationTable(buffer, table); + xmlBufMergeBuffer(buf, buffer); +} + +/** + * xmlBufDumpElementDecl: + * @buf: an xmlBufPtr output + * @elem: An element table + * + * This will dump the content of the element declaration as an XML + * DTD definition + */ +void +xmlBufDumpElementDecl(xmlBufPtr buf, xmlElementPtr elem) { + xmlBufferPtr buffer; + + buffer = xmlBufferCreate(); + if (buffer == NULL) { + /* + * TODO set the error in buf + */ + return; + } + xmlDumpElementDecl(buffer, elem); + xmlBufMergeBuffer(buf, buffer); +} + +/** + * xmlBufDumpAttributeDecl: + * @buf: an xmlBufPtr output + * @attr: An attribute declaration + * + * This will dump the content of the attribute declaration as an XML + * DTD definition + */ +void +xmlBufDumpAttributeDecl(xmlBufPtr buf, xmlAttributePtr attr) { + xmlBufferPtr buffer; + + buffer = xmlBufferCreate(); + if (buffer == NULL) { + /* + * TODO set the error in buf + */ + return; + } + xmlDumpAttributeDecl(buffer, attr); + xmlBufMergeBuffer(buf, buffer); +} + +/** + * xmlBufDumpEntityDecl: + * @buf: an xmlBufPtr output + * @ent: An entity table + * + * This will dump the content of the entity table as an XML DTD definition + */ +void +xmlBufDumpEntityDecl(xmlBufPtr buf, xmlEntityPtr ent) { + xmlBufferPtr buffer; + + buffer = xmlBufferCreate(); + if (buffer == NULL) { + /* + * TODO set the error in buf + */ + return; + } + xmlDumpEntityDecl(buffer, ent); + xmlBufMergeBuffer(buf, buffer); +} + +/************************************************************************ + * * + * Dumping XML tree content to an I/O output buffer * + * * + ************************************************************************/ + +static int xmlSaveSwitchEncoding(xmlSaveCtxtPtr ctxt, const char *encoding) { + xmlOutputBufferPtr buf = ctxt->buf; + + if ((encoding != NULL) && (buf->encoder == NULL) && (buf->conv == NULL)) { + buf->encoder = xmlFindCharEncodingHandler((const char *)encoding); + if (buf->encoder == NULL) { + xmlSaveErr(XML_SAVE_UNKNOWN_ENCODING, NULL, + (const char *)encoding); + return(-1); + } + buf->conv = xmlBufCreate(); + if (buf->conv == NULL) { + xmlCharEncCloseFunc(buf->encoder); + xmlSaveErrMemory("creating encoding buffer"); + return(-1); + } + /* + * initialize the state, e.g. if outputting a BOM + */ + xmlCharEncOutput(buf, 1); + } + return(0); +} + +static int xmlSaveClearEncoding(xmlSaveCtxtPtr ctxt) { + xmlOutputBufferPtr buf = ctxt->buf; + xmlOutputBufferFlush(buf); + xmlCharEncCloseFunc(buf->encoder); + xmlBufFree(buf->conv); + buf->encoder = NULL; + buf->conv = NULL; + return(0); +} + +#ifdef LIBXML_HTML_ENABLED +static void +xhtmlNodeDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur); +#endif +static void xmlNodeListDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur); +static void xmlNodeDumpOutputInternal(xmlSaveCtxtPtr ctxt, xmlNodePtr cur); +void xmlNsListDumpOutput(xmlOutputBufferPtr buf, xmlNsPtr cur); +static int xmlDocContentDumpOutput(xmlSaveCtxtPtr ctxt, xmlDocPtr cur); + +/** + * xmlOutputBufferWriteWSNonSig: + * @ctxt: The save context + * @extra: Number of extra indents to apply to ctxt->level + * + * Write out formatting for non-significant whitespace output. + */ +static void +xmlOutputBufferWriteWSNonSig(xmlSaveCtxtPtr ctxt, int extra) +{ + int i; + if ((ctxt == NULL) || (ctxt->buf == NULL)) + return; + xmlOutputBufferWrite(ctxt->buf, 1, "\n"); + for (i = 0; i < (ctxt->level + extra); i += ctxt->indent_nr) { + xmlOutputBufferWrite(ctxt->buf, ctxt->indent_size * + ((ctxt->level + extra - i) > ctxt->indent_nr ? + ctxt->indent_nr : (ctxt->level + extra - i)), + ctxt->indent); + } +} + +/** + * xmlNsDumpOutput: + * @buf: the XML buffer output + * @cur: a namespace + * @ctxt: the output save context. Optional. + * + * Dump a local Namespace definition. + * Should be called in the context of attributes dumps. + * If @ctxt is supplied, @buf should be its buffer. + */ +static void +xmlNsDumpOutput(xmlOutputBufferPtr buf, xmlNsPtr cur, xmlSaveCtxtPtr ctxt) { + if ((cur == NULL) || (buf == NULL)) return; + if ((cur->type == XML_LOCAL_NAMESPACE) && (cur->href != NULL)) { + if (xmlStrEqual(cur->prefix, BAD_CAST "xml")) + return; + + if (ctxt != NULL && ctxt->format == 2) + xmlOutputBufferWriteWSNonSig(ctxt, 2); + else + xmlOutputBufferWrite(buf, 1, " "); + + /* Within the context of an element attributes */ + if (cur->prefix != NULL) { + xmlOutputBufferWrite(buf, 6, "xmlns:"); + xmlOutputBufferWriteString(buf, (const char *)cur->prefix); + } else + xmlOutputBufferWrite(buf, 5, "xmlns"); + xmlOutputBufferWrite(buf, 1, "="); + xmlBufWriteQuotedString(buf->buffer, cur->href); + } +} + +/** + * xmlNsDumpOutputCtxt + * @ctxt: the save context + * @cur: a namespace + * + * Dump a local Namespace definition to a save context. + * Should be called in the context of attribute dumps. + */ +static void +xmlNsDumpOutputCtxt(xmlSaveCtxtPtr ctxt, xmlNsPtr cur) { + xmlNsDumpOutput(ctxt->buf, cur, ctxt); +} + +/** + * xmlNsListDumpOutputCtxt + * @ctxt: the save context + * @cur: the first namespace + * + * Dump a list of local namespace definitions to a save context. + * Should be called in the context of attribute dumps. + */ +static void +xmlNsListDumpOutputCtxt(xmlSaveCtxtPtr ctxt, xmlNsPtr cur) { + while (cur != NULL) { + xmlNsDumpOutput(ctxt->buf, cur, ctxt); + cur = cur->next; + } +} + +/** + * xmlNsListDumpOutput: + * @buf: the XML buffer output + * @cur: the first namespace + * + * Dump a list of local Namespace definitions. + * Should be called in the context of attributes dumps. + */ +void +xmlNsListDumpOutput(xmlOutputBufferPtr buf, xmlNsPtr cur) { + while (cur != NULL) { + xmlNsDumpOutput(buf, cur, NULL); + cur = cur->next; + } +} + +/** + * xmlDtdDumpOutput: + * @buf: the XML buffer output + * @dtd: the pointer to the DTD + * + * Dump the XML document DTD, if any. + */ +static void +xmlDtdDumpOutput(xmlSaveCtxtPtr ctxt, xmlDtdPtr dtd) { + xmlOutputBufferPtr buf; + int format, level; + xmlDocPtr doc; + + if (dtd == NULL) return; + if ((ctxt == NULL) || (ctxt->buf == NULL)) + return; + buf = ctxt->buf; + xmlOutputBufferWrite(buf, 10, "name); + if (dtd->ExternalID != NULL) { + xmlOutputBufferWrite(buf, 8, " PUBLIC "); + xmlBufWriteQuotedString(buf->buffer, dtd->ExternalID); + xmlOutputBufferWrite(buf, 1, " "); + xmlBufWriteQuotedString(buf->buffer, dtd->SystemID); + } else if (dtd->SystemID != NULL) { + xmlOutputBufferWrite(buf, 8, " SYSTEM "); + xmlBufWriteQuotedString(buf->buffer, dtd->SystemID); + } + if ((dtd->entities == NULL) && (dtd->elements == NULL) && + (dtd->attributes == NULL) && (dtd->notations == NULL) && + (dtd->pentities == NULL)) { + xmlOutputBufferWrite(buf, 1, ">"); + return; + } + xmlOutputBufferWrite(buf, 3, " [\n"); + /* + * Dump the notations first they are not in the DTD children list + * Do this only on a standalone DTD or on the internal subset though. + */ + if ((dtd->notations != NULL) && ((dtd->doc == NULL) || + (dtd->doc->intSubset == dtd))) { + xmlBufDumpNotationTable(buf->buffer, + (xmlNotationTablePtr) dtd->notations); + } + format = ctxt->format; + level = ctxt->level; + doc = ctxt->doc; + ctxt->format = 0; + ctxt->level = -1; + ctxt->doc = dtd->doc; + xmlNodeListDumpOutput(ctxt, dtd->children); + ctxt->format = format; + ctxt->level = level; + ctxt->doc = doc; + xmlOutputBufferWrite(buf, 2, "]>"); +} + +/** + * xmlAttrDumpOutput: + * @buf: the XML buffer output + * @cur: the attribute pointer + * + * Dump an XML attribute + */ +static void +xmlAttrDumpOutput(xmlSaveCtxtPtr ctxt, xmlAttrPtr cur) { + xmlOutputBufferPtr buf; + + if (cur == NULL) return; + buf = ctxt->buf; + if (buf == NULL) return; + if (ctxt->format == 2) + xmlOutputBufferWriteWSNonSig(ctxt, 2); + else + xmlOutputBufferWrite(buf, 1, " "); + if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) { + xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix); + xmlOutputBufferWrite(buf, 1, ":"); + } + xmlOutputBufferWriteString(buf, (const char *)cur->name); + xmlOutputBufferWrite(buf, 2, "=\""); + xmlAttrSerializeContent(buf, cur); + xmlOutputBufferWrite(buf, 1, "\""); +} + +/** + * xmlAttrListDumpOutput: + * @buf: the XML buffer output + * @doc: the document + * @cur: the first attribute pointer + * @encoding: an optional encoding string + * + * Dump a list of XML attributes + */ +static void +xmlAttrListDumpOutput(xmlSaveCtxtPtr ctxt, xmlAttrPtr cur) { + if (cur == NULL) return; + while (cur != NULL) { + xmlAttrDumpOutput(ctxt, cur); + cur = cur->next; + } +} + + + +/** + * xmlNodeListDumpOutput: + * @cur: the first node + * + * Dump an XML node list, recursive behaviour, children are printed too. + */ +static void +xmlNodeListDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) { + xmlOutputBufferPtr buf; + + if (cur == NULL) return; + buf = ctxt->buf; + while (cur != NULL) { + if ((ctxt->format == 1) && (xmlIndentTreeOutput) && + ((cur->type == XML_ELEMENT_NODE) || + (cur->type == XML_COMMENT_NODE) || + (cur->type == XML_PI_NODE))) + xmlOutputBufferWrite(buf, ctxt->indent_size * + (ctxt->level > ctxt->indent_nr ? + ctxt->indent_nr : ctxt->level), + ctxt->indent); + xmlNodeDumpOutputInternal(ctxt, cur); + if (ctxt->format == 1) { + xmlOutputBufferWrite(buf, 1, "\n"); + } + cur = cur->next; + } +} + +#ifdef LIBXML_HTML_ENABLED +/** + * xmlNodeDumpOutputInternal: + * @cur: the current node + * + * Dump an HTML node, recursive behaviour, children are printed too. + */ +static int +htmlNodeDumpOutputInternal(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) { + const xmlChar *oldenc = NULL; + const xmlChar *oldctxtenc = ctxt->encoding; + const xmlChar *encoding = ctxt->encoding; + xmlOutputBufferPtr buf = ctxt->buf; + int switched_encoding = 0; + xmlDocPtr doc; + + xmlInitParser(); + + doc = cur->doc; + if (doc != NULL) { + oldenc = doc->encoding; + if (ctxt->encoding != NULL) { + doc->encoding = BAD_CAST ctxt->encoding; + } else if (doc->encoding != NULL) { + encoding = doc->encoding; + } + } + + if ((encoding != NULL) && (doc != NULL)) + htmlSetMetaEncoding(doc, (const xmlChar *) encoding); + if ((encoding == NULL) && (doc != NULL)) + encoding = htmlGetMetaEncoding(doc); + if (encoding == NULL) + encoding = BAD_CAST "HTML"; + if ((encoding != NULL) && (oldctxtenc == NULL) && + (buf->encoder == NULL) && (buf->conv == NULL)) { + if (xmlSaveSwitchEncoding(ctxt, (const char*) encoding) < 0) { + doc->encoding = oldenc; + return(-1); + } + switched_encoding = 1; + } + if (ctxt->options & XML_SAVE_FORMAT) + htmlNodeDumpFormatOutput(buf, doc, cur, + (const char *)encoding, 1); + else + htmlNodeDumpFormatOutput(buf, doc, cur, + (const char *)encoding, 0); + /* + * Restore the state of the saving context at the end of the document + */ + if ((switched_encoding) && (oldctxtenc == NULL)) { + xmlSaveClearEncoding(ctxt); + } + if (doc != NULL) + doc->encoding = oldenc; + return(0); +} +#endif + +/** + * xmlNodeDumpOutputInternal: + * @cur: the current node + * + * Dump an XML node, recursive behaviour, children are printed too. + */ +static void +xmlNodeDumpOutputInternal(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) { + int format; + xmlNodePtr tmp; + xmlChar *start, *end; + xmlOutputBufferPtr buf; + + if (cur == NULL) return; + buf = ctxt->buf; + if (cur->type == XML_XINCLUDE_START) + return; + if (cur->type == XML_XINCLUDE_END) + return; + if ((cur->type == XML_DOCUMENT_NODE) || + (cur->type == XML_HTML_DOCUMENT_NODE)) { + xmlDocContentDumpOutput(ctxt, (xmlDocPtr) cur); + return; + } +#ifdef LIBXML_HTML_ENABLED + if (ctxt->options & XML_SAVE_XHTML) { + xhtmlNodeDumpOutput(ctxt, cur); + return; + } + if (((cur->type != XML_NAMESPACE_DECL) && (cur->doc != NULL) && + (cur->doc->type == XML_HTML_DOCUMENT_NODE) && + ((ctxt->options & XML_SAVE_AS_XML) == 0)) || + (ctxt->options & XML_SAVE_AS_HTML)) { + htmlNodeDumpOutputInternal(ctxt, cur); + return; + } +#endif + if (cur->type == XML_DTD_NODE) { + xmlDtdDumpOutput(ctxt, (xmlDtdPtr) cur); + return; + } + if (cur->type == XML_DOCUMENT_FRAG_NODE) { + xmlNodeListDumpOutput(ctxt, cur->children); + return; + } + if (cur->type == XML_ELEMENT_DECL) { + xmlBufDumpElementDecl(buf->buffer, (xmlElementPtr) cur); + return; + } + if (cur->type == XML_ATTRIBUTE_DECL) { + xmlBufDumpAttributeDecl(buf->buffer, (xmlAttributePtr) cur); + return; + } + if (cur->type == XML_ENTITY_DECL) { + xmlBufDumpEntityDecl(buf->buffer, (xmlEntityPtr) cur); + return; + } + if (cur->type == XML_TEXT_NODE) { + if (cur->content != NULL) { + if (cur->name != xmlStringTextNoenc) { + xmlOutputBufferWriteEscape(buf, cur->content, ctxt->escape); + } else { + /* + * Disable escaping, needed for XSLT + */ + xmlOutputBufferWriteString(buf, (const char *) cur->content); + } + } + + return; + } + if (cur->type == XML_PI_NODE) { + if (cur->content != NULL) { + xmlOutputBufferWrite(buf, 2, "name); + if (cur->content != NULL) { + if (ctxt->format == 2) + xmlOutputBufferWriteWSNonSig(ctxt, 0); + else + xmlOutputBufferWrite(buf, 1, " "); + xmlOutputBufferWriteString(buf, (const char *)cur->content); + } + xmlOutputBufferWrite(buf, 2, "?>"); + } else { + xmlOutputBufferWrite(buf, 2, "name); + if (ctxt->format == 2) + xmlOutputBufferWriteWSNonSig(ctxt, 0); + xmlOutputBufferWrite(buf, 2, "?>"); + } + return; + } + if (cur->type == XML_COMMENT_NODE) { + if (cur->content != NULL) { + xmlOutputBufferWrite(buf, 4, ""); + } + return; + } + if (cur->type == XML_ENTITY_REF_NODE) { + xmlOutputBufferWrite(buf, 1, "&"); + xmlOutputBufferWriteString(buf, (const char *)cur->name); + xmlOutputBufferWrite(buf, 1, ";"); + return; + } + if (cur->type == XML_CDATA_SECTION_NODE) { + if (cur->content == NULL || *cur->content == '\0') { + xmlOutputBufferWrite(buf, 12, ""); + } else { + start = end = cur->content; + while (*end != '\0') { + if ((*end == ']') && (*(end + 1) == ']') && + (*(end + 2) == '>')) { + end = end + 2; + xmlOutputBufferWrite(buf, 9, ""); + start = end; + } + end++; + } + if (start != end) { + xmlOutputBufferWrite(buf, 9, ""); + } + } + return; + } + if (cur->type == XML_ATTRIBUTE_NODE) { + xmlAttrDumpOutput(ctxt, (xmlAttrPtr) cur); + return; + } + if (cur->type == XML_NAMESPACE_DECL) { + xmlNsDumpOutputCtxt(ctxt, (xmlNsPtr) cur); + return; + } + + format = ctxt->format; + if (format == 1) { + tmp = cur->children; + while (tmp != NULL) { + if ((tmp->type == XML_TEXT_NODE) || + (tmp->type == XML_CDATA_SECTION_NODE) || + (tmp->type == XML_ENTITY_REF_NODE)) { + ctxt->format = 0; + break; + } + tmp = tmp->next; + } + } + xmlOutputBufferWrite(buf, 1, "<"); + if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) { + xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix); + xmlOutputBufferWrite(buf, 1, ":"); + } + + xmlOutputBufferWriteString(buf, (const char *)cur->name); + if (cur->nsDef) + xmlNsListDumpOutputCtxt(ctxt, cur->nsDef); + if (cur->properties != NULL) + xmlAttrListDumpOutput(ctxt, cur->properties); + + if (((cur->type == XML_ELEMENT_NODE) || (cur->content == NULL)) && + (cur->children == NULL) && ((ctxt->options & XML_SAVE_NO_EMPTY) == 0)) { + if (ctxt->format == 2) + xmlOutputBufferWriteWSNonSig(ctxt, 0); + xmlOutputBufferWrite(buf, 2, "/>"); + ctxt->format = format; + return; + } + if (ctxt->format == 2) + xmlOutputBufferWriteWSNonSig(ctxt, 1); + xmlOutputBufferWrite(buf, 1, ">"); + if ((cur->type != XML_ELEMENT_NODE) && (cur->content != NULL)) { + xmlOutputBufferWriteEscape(buf, cur->content, ctxt->escape); + } + if (cur->children != NULL) { + if (ctxt->format == 1) xmlOutputBufferWrite(buf, 1, "\n"); + if (ctxt->level >= 0) ctxt->level++; + xmlNodeListDumpOutput(ctxt, cur->children); + if (ctxt->level > 0) ctxt->level--; + if ((xmlIndentTreeOutput) && (ctxt->format == 1)) + xmlOutputBufferWrite(buf, ctxt->indent_size * + (ctxt->level > ctxt->indent_nr ? + ctxt->indent_nr : ctxt->level), + ctxt->indent); + } + xmlOutputBufferWrite(buf, 2, "ns != NULL) && (cur->ns->prefix != NULL)) { + xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix); + xmlOutputBufferWrite(buf, 1, ":"); + } + + xmlOutputBufferWriteString(buf, (const char *)cur->name); + if (ctxt->format == 2) + xmlOutputBufferWriteWSNonSig(ctxt, 0); + xmlOutputBufferWrite(buf, 1, ">"); + ctxt->format = format; +} + +/** + * xmlDocContentDumpOutput: + * @cur: the document + * + * Dump an XML document. + */ +static int +xmlDocContentDumpOutput(xmlSaveCtxtPtr ctxt, xmlDocPtr cur) { +#ifdef LIBXML_HTML_ENABLED + xmlDtdPtr dtd; + int is_xhtml = 0; +#endif + const xmlChar *oldenc = cur->encoding; + const xmlChar *oldctxtenc = ctxt->encoding; + const xmlChar *encoding = ctxt->encoding; + xmlCharEncodingOutputFunc oldescape = ctxt->escape; + xmlCharEncodingOutputFunc oldescapeAttr = ctxt->escapeAttr; + xmlOutputBufferPtr buf = ctxt->buf; + xmlCharEncoding enc; + int switched_encoding = 0; + + xmlInitParser(); + + if ((cur->type != XML_HTML_DOCUMENT_NODE) && + (cur->type != XML_DOCUMENT_NODE)) + return(-1); + + if (ctxt->encoding != NULL) { + cur->encoding = BAD_CAST ctxt->encoding; + } else if (cur->encoding != NULL) { + encoding = cur->encoding; + } else if (cur->charset != XML_CHAR_ENCODING_UTF8) { + encoding = (const xmlChar *) + xmlGetCharEncodingName((xmlCharEncoding) cur->charset); + } + + if (((cur->type == XML_HTML_DOCUMENT_NODE) && + ((ctxt->options & XML_SAVE_AS_XML) == 0) && + ((ctxt->options & XML_SAVE_XHTML) == 0)) || + (ctxt->options & XML_SAVE_AS_HTML)) { +#ifdef LIBXML_HTML_ENABLED + if (encoding != NULL) + htmlSetMetaEncoding(cur, (const xmlChar *) encoding); + if (encoding == NULL) + encoding = htmlGetMetaEncoding(cur); + if (encoding == NULL) + encoding = BAD_CAST "HTML"; + if ((encoding != NULL) && (oldctxtenc == NULL) && + (buf->encoder == NULL) && (buf->conv == NULL)) { + if (xmlSaveSwitchEncoding(ctxt, (const char*) encoding) < 0) { + cur->encoding = oldenc; + return(-1); + } + } + if (ctxt->options & XML_SAVE_FORMAT) + htmlDocContentDumpFormatOutput(buf, cur, + (const char *)encoding, 1); + else + htmlDocContentDumpFormatOutput(buf, cur, + (const char *)encoding, 0); + if (ctxt->encoding != NULL) + cur->encoding = oldenc; + return(0); +#else + return(-1); +#endif + } else if ((cur->type == XML_DOCUMENT_NODE) || + (ctxt->options & XML_SAVE_AS_XML) || + (ctxt->options & XML_SAVE_XHTML)) { + enc = xmlParseCharEncoding((const char*) encoding); + if ((encoding != NULL) && (oldctxtenc == NULL) && + (buf->encoder == NULL) && (buf->conv == NULL) && + ((ctxt->options & XML_SAVE_NO_DECL) == 0)) { + if ((enc != XML_CHAR_ENCODING_UTF8) && + (enc != XML_CHAR_ENCODING_NONE) && + (enc != XML_CHAR_ENCODING_ASCII)) { + /* + * we need to switch to this encoding but just for this + * document since we output the XMLDecl the conversion + * must be done to not generate not well formed documents. + */ + if (xmlSaveSwitchEncoding(ctxt, (const char*) encoding) < 0) { + cur->encoding = oldenc; + return(-1); + } + switched_encoding = 1; + } + if (ctxt->escape == xmlEscapeEntities) + ctxt->escape = NULL; + if (ctxt->escapeAttr == xmlEscapeEntities) + ctxt->escapeAttr = NULL; + } + + + /* + * Save the XML declaration + */ + if ((ctxt->options & XML_SAVE_NO_DECL) == 0) { + xmlOutputBufferWrite(buf, 14, "version != NULL) + xmlBufWriteQuotedString(buf->buffer, cur->version); + else + xmlOutputBufferWrite(buf, 5, "\"1.0\""); + if (encoding != NULL) { + xmlOutputBufferWrite(buf, 10, " encoding="); + xmlBufWriteQuotedString(buf->buffer, (xmlChar *) encoding); + } + switch (cur->standalone) { + case 0: + xmlOutputBufferWrite(buf, 16, " standalone=\"no\""); + break; + case 1: + xmlOutputBufferWrite(buf, 17, " standalone=\"yes\""); + break; + } + xmlOutputBufferWrite(buf, 3, "?>\n"); + } + +#ifdef LIBXML_HTML_ENABLED + if (ctxt->options & XML_SAVE_XHTML) + is_xhtml = 1; + if ((ctxt->options & XML_SAVE_NO_XHTML) == 0) { + dtd = xmlGetIntSubset(cur); + if (dtd != NULL) { + is_xhtml = xmlIsXHTML(dtd->SystemID, dtd->ExternalID); + if (is_xhtml < 0) is_xhtml = 0; + } + } +#endif + if (cur->children != NULL) { + xmlNodePtr child = cur->children; + + while (child != NULL) { + ctxt->level = 0; +#ifdef LIBXML_HTML_ENABLED + if (is_xhtml) + xhtmlNodeDumpOutput(ctxt, child); + else +#endif + xmlNodeDumpOutputInternal(ctxt, child); + xmlOutputBufferWrite(buf, 1, "\n"); + child = child->next; + } + } + } + + /* + * Restore the state of the saving context at the end of the document + */ + if ((switched_encoding) && (oldctxtenc == NULL)) { + xmlSaveClearEncoding(ctxt); + ctxt->escape = oldescape; + ctxt->escapeAttr = oldescapeAttr; + } + cur->encoding = oldenc; + return(0); +} + +#ifdef LIBXML_HTML_ENABLED +/************************************************************************ + * * + * Functions specific to XHTML serialization * + * * + ************************************************************************/ + +/** + * xhtmlIsEmpty: + * @node: the node + * + * Check if a node is an empty xhtml node + * + * Returns 1 if the node is an empty node, 0 if not and -1 in case of error + */ +static int +xhtmlIsEmpty(xmlNodePtr node) { + if (node == NULL) + return(-1); + if (node->type != XML_ELEMENT_NODE) + return(0); + if ((node->ns != NULL) && (!xmlStrEqual(node->ns->href, XHTML_NS_NAME))) + return(0); + if (node->children != NULL) + return(0); + switch (node->name[0]) { + case 'a': + if (xmlStrEqual(node->name, BAD_CAST "area")) + return(1); + return(0); + case 'b': + if (xmlStrEqual(node->name, BAD_CAST "br")) + return(1); + if (xmlStrEqual(node->name, BAD_CAST "base")) + return(1); + if (xmlStrEqual(node->name, BAD_CAST "basefont")) + return(1); + return(0); + case 'c': + if (xmlStrEqual(node->name, BAD_CAST "col")) + return(1); + return(0); + case 'f': + if (xmlStrEqual(node->name, BAD_CAST "frame")) + return(1); + return(0); + case 'h': + if (xmlStrEqual(node->name, BAD_CAST "hr")) + return(1); + return(0); + case 'i': + if (xmlStrEqual(node->name, BAD_CAST "img")) + return(1); + if (xmlStrEqual(node->name, BAD_CAST "input")) + return(1); + if (xmlStrEqual(node->name, BAD_CAST "isindex")) + return(1); + return(0); + case 'l': + if (xmlStrEqual(node->name, BAD_CAST "link")) + return(1); + return(0); + case 'm': + if (xmlStrEqual(node->name, BAD_CAST "meta")) + return(1); + return(0); + case 'p': + if (xmlStrEqual(node->name, BAD_CAST "param")) + return(1); + return(0); + } + return(0); +} + +/** + * xhtmlAttrListDumpOutput: + * @cur: the first attribute pointer + * + * Dump a list of XML attributes + */ +static void +xhtmlAttrListDumpOutput(xmlSaveCtxtPtr ctxt, xmlAttrPtr cur) { + xmlAttrPtr xml_lang = NULL; + xmlAttrPtr lang = NULL; + xmlAttrPtr name = NULL; + xmlAttrPtr id = NULL; + xmlNodePtr parent; + xmlOutputBufferPtr buf; + + if (cur == NULL) return; + buf = ctxt->buf; + parent = cur->parent; + while (cur != NULL) { + if ((cur->ns == NULL) && (xmlStrEqual(cur->name, BAD_CAST "id"))) + id = cur; + else + if ((cur->ns == NULL) && (xmlStrEqual(cur->name, BAD_CAST "name"))) + name = cur; + else + if ((cur->ns == NULL) && (xmlStrEqual(cur->name, BAD_CAST "lang"))) + lang = cur; + else + if ((cur->ns != NULL) && (xmlStrEqual(cur->name, BAD_CAST "lang")) && + (xmlStrEqual(cur->ns->prefix, BAD_CAST "xml"))) + xml_lang = cur; + else if ((cur->ns == NULL) && + ((cur->children == NULL) || + (cur->children->content == NULL) || + (cur->children->content[0] == 0)) && + (htmlIsBooleanAttr(cur->name))) { + if (cur->children != NULL) + xmlFreeNode(cur->children); + cur->children = xmlNewText(cur->name); + if (cur->children != NULL) + cur->children->parent = (xmlNodePtr) cur; + } + xmlAttrDumpOutput(ctxt, cur); + cur = cur->next; + } + /* + * C.8 + */ + if ((name != NULL) && (id == NULL)) { + if ((parent != NULL) && (parent->name != NULL) && + ((xmlStrEqual(parent->name, BAD_CAST "a")) || + (xmlStrEqual(parent->name, BAD_CAST "p")) || + (xmlStrEqual(parent->name, BAD_CAST "div")) || + (xmlStrEqual(parent->name, BAD_CAST "img")) || + (xmlStrEqual(parent->name, BAD_CAST "map")) || + (xmlStrEqual(parent->name, BAD_CAST "applet")) || + (xmlStrEqual(parent->name, BAD_CAST "form")) || + (xmlStrEqual(parent->name, BAD_CAST "frame")) || + (xmlStrEqual(parent->name, BAD_CAST "iframe")))) { + xmlOutputBufferWrite(buf, 5, " id=\""); + xmlAttrSerializeContent(buf, name); + xmlOutputBufferWrite(buf, 1, "\""); + } + } + /* + * C.7. + */ + if ((lang != NULL) && (xml_lang == NULL)) { + xmlOutputBufferWrite(buf, 11, " xml:lang=\""); + xmlAttrSerializeContent(buf, lang); + xmlOutputBufferWrite(buf, 1, "\""); + } else + if ((xml_lang != NULL) && (lang == NULL)) { + xmlOutputBufferWrite(buf, 7, " lang=\""); + xmlAttrSerializeContent(buf, xml_lang); + xmlOutputBufferWrite(buf, 1, "\""); + } +} + +/** + * xhtmlNodeListDumpOutput: + * @buf: the XML buffer output + * @doc: the XHTML document + * @cur: the first node + * @level: the imbrication level for indenting + * @format: is formatting allowed + * @encoding: an optional encoding string + * + * Dump an XML node list, recursive behaviour, children are printed too. + * Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 + * or xmlKeepBlanksDefault(0) was called + */ +static void +xhtmlNodeListDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) { + xmlOutputBufferPtr buf; + + if (cur == NULL) return; + buf = ctxt->buf; + while (cur != NULL) { + if ((ctxt->format == 1) && (xmlIndentTreeOutput) && + (cur->type == XML_ELEMENT_NODE)) + xmlOutputBufferWrite(buf, ctxt->indent_size * + (ctxt->level > ctxt->indent_nr ? + ctxt->indent_nr : ctxt->level), + ctxt->indent); + xhtmlNodeDumpOutput(ctxt, cur); + if (ctxt->format == 1) { + xmlOutputBufferWrite(buf, 1, "\n"); + } + cur = cur->next; + } +} + +/** + * xhtmlNodeDumpOutput: + * @buf: the XML buffer output + * @doc: the XHTML document + * @cur: the current node + * @level: the imbrication level for indenting + * @format: is formatting allowed + * @encoding: an optional encoding string + * + * Dump an XHTML node, recursive behaviour, children are printed too. + */ +static void +xhtmlNodeDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) { + int format, addmeta = 0; + xmlNodePtr tmp; + xmlChar *start, *end; + xmlOutputBufferPtr buf; + + if (cur == NULL) return; + if ((cur->type == XML_DOCUMENT_NODE) || + (cur->type == XML_HTML_DOCUMENT_NODE)) { + xmlDocContentDumpOutput(ctxt, (xmlDocPtr) cur); + return; + } + if (cur->type == XML_XINCLUDE_START) + return; + if (cur->type == XML_XINCLUDE_END) + return; + if (cur->type == XML_NAMESPACE_DECL) { + xmlNsDumpOutputCtxt(ctxt, (xmlNsPtr) cur); + return; + } + if (cur->type == XML_DTD_NODE) { + xmlDtdDumpOutput(ctxt, (xmlDtdPtr) cur); + return; + } + if (cur->type == XML_DOCUMENT_FRAG_NODE) { + xhtmlNodeListDumpOutput(ctxt, cur->children); + return; + } + buf = ctxt->buf; + if (cur->type == XML_ELEMENT_DECL) { + xmlBufDumpElementDecl(buf->buffer, (xmlElementPtr) cur); + return; + } + if (cur->type == XML_ATTRIBUTE_DECL) { + xmlBufDumpAttributeDecl(buf->buffer, (xmlAttributePtr) cur); + return; + } + if (cur->type == XML_ENTITY_DECL) { + xmlBufDumpEntityDecl(buf->buffer, (xmlEntityPtr) cur); + return; + } + if (cur->type == XML_TEXT_NODE) { + if (cur->content != NULL) { + if ((cur->name == xmlStringText) || + (cur->name != xmlStringTextNoenc)) { + xmlOutputBufferWriteEscape(buf, cur->content, ctxt->escape); + } else { + /* + * Disable escaping, needed for XSLT + */ + xmlOutputBufferWriteString(buf, (const char *) cur->content); + } + } + + return; + } + if (cur->type == XML_PI_NODE) { + if (cur->content != NULL) { + xmlOutputBufferWrite(buf, 2, "name); + if (cur->content != NULL) { + xmlOutputBufferWrite(buf, 1, " "); + xmlOutputBufferWriteString(buf, (const char *)cur->content); + } + xmlOutputBufferWrite(buf, 2, "?>"); + } else { + xmlOutputBufferWrite(buf, 2, "name); + xmlOutputBufferWrite(buf, 2, "?>"); + } + return; + } + if (cur->type == XML_COMMENT_NODE) { + if (cur->content != NULL) { + xmlOutputBufferWrite(buf, 4, ""); + } + return; + } + if (cur->type == XML_ENTITY_REF_NODE) { + xmlOutputBufferWrite(buf, 1, "&"); + xmlOutputBufferWriteString(buf, (const char *)cur->name); + xmlOutputBufferWrite(buf, 1, ";"); + return; + } + if (cur->type == XML_CDATA_SECTION_NODE) { + if (cur->content == NULL || *cur->content == '\0') { + xmlOutputBufferWrite(buf, 12, ""); + } else { + start = end = cur->content; + while (*end != '\0') { + if (*end == ']' && *(end + 1) == ']' && *(end + 2) == '>') { + end = end + 2; + xmlOutputBufferWrite(buf, 9, ""); + start = end; + } + end++; + } + if (start != end) { + xmlOutputBufferWrite(buf, 9, ""); + } + } + return; + } + if (cur->type == XML_ATTRIBUTE_NODE) { + xmlAttrDumpOutput(ctxt, (xmlAttrPtr) cur); + return; + } + + format = ctxt->format; + if (format == 1) { + tmp = cur->children; + while (tmp != NULL) { + if ((tmp->type == XML_TEXT_NODE) || + (tmp->type == XML_ENTITY_REF_NODE)) { + format = 0; + break; + } + tmp = tmp->next; + } + } + xmlOutputBufferWrite(buf, 1, "<"); + if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) { + xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix); + xmlOutputBufferWrite(buf, 1, ":"); + } + + xmlOutputBufferWriteString(buf, (const char *)cur->name); + if (cur->nsDef) + xmlNsListDumpOutputCtxt(ctxt, cur->nsDef); + if ((xmlStrEqual(cur->name, BAD_CAST "html") && + (cur->ns == NULL) && (cur->nsDef == NULL))) { + /* + * 3.1.1. Strictly Conforming Documents A.3.1.1 3/ + */ + xmlOutputBufferWriteString(buf, + " xmlns=\"http://www.w3.org/1999/xhtml\""); + } + if (cur->properties != NULL) + xhtmlAttrListDumpOutput(ctxt, cur->properties); + + if ((cur->type == XML_ELEMENT_NODE) && + (cur->parent != NULL) && + (cur->parent->parent == (xmlNodePtr) cur->doc) && + xmlStrEqual(cur->name, BAD_CAST"head") && + xmlStrEqual(cur->parent->name, BAD_CAST"html")) { + + tmp = cur->children; + while (tmp != NULL) { + if (xmlStrEqual(tmp->name, BAD_CAST"meta")) { + xmlChar *httpequiv; + + httpequiv = xmlGetProp(tmp, BAD_CAST"http-equiv"); + if (httpequiv != NULL) { + if (xmlStrcasecmp(httpequiv, BAD_CAST"Content-Type") == 0) { + xmlFree(httpequiv); + break; + } + xmlFree(httpequiv); + } + } + tmp = tmp->next; + } + if (tmp == NULL) + addmeta = 1; + } + + if ((cur->type == XML_ELEMENT_NODE) && (cur->children == NULL)) { + if (((cur->ns == NULL) || (cur->ns->prefix == NULL)) && + ((xhtmlIsEmpty(cur) == 1) && (addmeta == 0))) { + /* + * C.2. Empty Elements + */ + xmlOutputBufferWrite(buf, 3, " />"); + } else { + if (addmeta == 1) { + xmlOutputBufferWrite(buf, 1, ">"); + if (ctxt->format == 1) { + xmlOutputBufferWrite(buf, 1, "\n"); + if (xmlIndentTreeOutput) + xmlOutputBufferWrite(buf, ctxt->indent_size * + (ctxt->level + 1 > ctxt->indent_nr ? + ctxt->indent_nr : ctxt->level + 1), ctxt->indent); + } + xmlOutputBufferWriteString(buf, + ""); + if (ctxt->format == 1) + xmlOutputBufferWrite(buf, 1, "\n"); + } else { + xmlOutputBufferWrite(buf, 1, ">"); + } + /* + * C.3. Element Minimization and Empty Element Content + */ + xmlOutputBufferWrite(buf, 2, "ns != NULL) && (cur->ns->prefix != NULL)) { + xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix); + xmlOutputBufferWrite(buf, 1, ":"); + } + xmlOutputBufferWriteString(buf, (const char *)cur->name); + xmlOutputBufferWrite(buf, 1, ">"); + } + return; + } + xmlOutputBufferWrite(buf, 1, ">"); + if (addmeta == 1) { + if (ctxt->format == 1) { + xmlOutputBufferWrite(buf, 1, "\n"); + if (xmlIndentTreeOutput) + xmlOutputBufferWrite(buf, ctxt->indent_size * + (ctxt->level + 1 > ctxt->indent_nr ? + ctxt->indent_nr : ctxt->level + 1), ctxt->indent); + } + xmlOutputBufferWriteString(buf, + ""); + } + if ((cur->type != XML_ELEMENT_NODE) && (cur->content != NULL)) { + xmlOutputBufferWriteEscape(buf, cur->content, ctxt->escape); + } + +#if 0 + /* + * This was removed due to problems with HTML processors. + * See bug #345147. + */ + /* + * 4.8. Script and Style elements + */ + if ((cur->type == XML_ELEMENT_NODE) && + ((xmlStrEqual(cur->name, BAD_CAST "script")) || + (xmlStrEqual(cur->name, BAD_CAST "style"))) && + ((cur->ns == NULL) || + (xmlStrEqual(cur->ns->href, XHTML_NS_NAME)))) { + xmlNodePtr child = cur->children; + + while (child != NULL) { + if (child->type == XML_TEXT_NODE) { + if ((xmlStrchr(child->content, '<') == NULL) && + (xmlStrchr(child->content, '&') == NULL) && + (xmlStrstr(child->content, BAD_CAST "]]>") == NULL)) { + /* Nothing to escape, so just output as is... */ + /* FIXME: Should we do something about "--" also? */ + int level = ctxt->level; + int indent = ctxt->format; + + ctxt->level = 0; + ctxt->format = 0; + xmlOutputBufferWriteString(buf, (const char *) child->content); + /* (We cannot use xhtmlNodeDumpOutput() here because + * we wish to leave '>' unescaped!) */ + ctxt->level = level; + ctxt->format = indent; + } else { + /* We must use a CDATA section. Unfortunately, + * this will break CSS and JavaScript when read by + * a browser in HTML4-compliant mode. :-( */ + start = end = child->content; + while (*end != '\0') { + if (*end == ']' && + *(end + 1) == ']' && + *(end + 2) == '>') { + end = end + 2; + xmlOutputBufferWrite(buf, 9, ""); + start = end; + } + end++; + } + if (start != end) { + xmlOutputBufferWrite(buf, 9, ""); + } + } + } else { + int level = ctxt->level; + int indent = ctxt->format; + + ctxt->level = 0; + ctxt->format = 0; + xhtmlNodeDumpOutput(ctxt, child); + ctxt->level = level; + ctxt->format = indent; + } + child = child->next; + } + } +#endif + + if (cur->children != NULL) { + int indent = ctxt->format; + + if (format == 1) xmlOutputBufferWrite(buf, 1, "\n"); + if (ctxt->level >= 0) ctxt->level++; + ctxt->format = format; + xhtmlNodeListDumpOutput(ctxt, cur->children); + if (ctxt->level > 0) ctxt->level--; + ctxt->format = indent; + if ((xmlIndentTreeOutput) && (format == 1)) + xmlOutputBufferWrite(buf, ctxt->indent_size * + (ctxt->level > ctxt->indent_nr ? + ctxt->indent_nr : ctxt->level), + ctxt->indent); + } + xmlOutputBufferWrite(buf, 2, "ns != NULL) && (cur->ns->prefix != NULL)) { + xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix); + xmlOutputBufferWrite(buf, 1, ":"); + } + + xmlOutputBufferWriteString(buf, (const char *)cur->name); + xmlOutputBufferWrite(buf, 1, ">"); +} +#endif + +/************************************************************************ + * * + * Public entry points * + * * + ************************************************************************/ + +/** + * xmlSaveToFd: + * @fd: a file descriptor number + * @encoding: the encoding name to use or NULL + * @options: a set of xmlSaveOptions + * + * Create a document saving context serializing to a file descriptor + * with the encoding and the options given. + * + * Returns a new serialization context or NULL in case of error. + */ +xmlSaveCtxtPtr +xmlSaveToFd(int fd, const char *encoding, int options) +{ + xmlSaveCtxtPtr ret; + + ret = xmlNewSaveCtxt(encoding, options); + if (ret == NULL) return(NULL); + ret->buf = xmlOutputBufferCreateFd(fd, ret->handler); + if (ret->buf == NULL) { + xmlFreeSaveCtxt(ret); + return(NULL); + } + return(ret); +} + +/** + * xmlSaveToFilename: + * @filename: a file name or an URL + * @encoding: the encoding name to use or NULL + * @options: a set of xmlSaveOptions + * + * Create a document saving context serializing to a filename or possibly + * to an URL (but this is less reliable) with the encoding and the options + * given. + * + * Returns a new serialization context or NULL in case of error. + */ +xmlSaveCtxtPtr +xmlSaveToFilename(const char *filename, const char *encoding, int options) +{ + xmlSaveCtxtPtr ret; + int compression = 0; /* TODO handle compression option */ + + ret = xmlNewSaveCtxt(encoding, options); + if (ret == NULL) return(NULL); + ret->buf = xmlOutputBufferCreateFilename(filename, ret->handler, + compression); + if (ret->buf == NULL) { + xmlFreeSaveCtxt(ret); + return(NULL); + } + return(ret); +} + +/** + * xmlSaveToBuffer: + * @buffer: a buffer + * @encoding: the encoding name to use or NULL + * @options: a set of xmlSaveOptions + * + * Create a document saving context serializing to a buffer + * with the encoding and the options given + * + * Returns a new serialization context or NULL in case of error. + */ + +xmlSaveCtxtPtr +xmlSaveToBuffer(xmlBufferPtr buffer, const char *encoding, int options) +{ + xmlSaveCtxtPtr ret; + xmlOutputBufferPtr out_buff; + xmlCharEncodingHandlerPtr handler; + + ret = xmlNewSaveCtxt(encoding, options); + if (ret == NULL) return(NULL); + + if (encoding != NULL) { + handler = xmlFindCharEncodingHandler(encoding); + if (handler == NULL) { + xmlFree(ret); + return(NULL); + } + } else + handler = NULL; + out_buff = xmlOutputBufferCreateBuffer(buffer, handler); + if (out_buff == NULL) { + xmlFree(ret); + if (handler) xmlCharEncCloseFunc(handler); + return(NULL); + } + + ret->buf = out_buff; + return(ret); +} + +/** + * xmlSaveToIO: + * @iowrite: an I/O write function + * @ioclose: an I/O close function + * @ioctx: an I/O handler + * @encoding: the encoding name to use or NULL + * @options: a set of xmlSaveOptions + * + * Create a document saving context serializing to a file descriptor + * with the encoding and the options given + * + * Returns a new serialization context or NULL in case of error. + */ +xmlSaveCtxtPtr +xmlSaveToIO(xmlOutputWriteCallback iowrite, + xmlOutputCloseCallback ioclose, + void *ioctx, const char *encoding, int options) +{ + xmlSaveCtxtPtr ret; + + ret = xmlNewSaveCtxt(encoding, options); + if (ret == NULL) return(NULL); + ret->buf = xmlOutputBufferCreateIO(iowrite, ioclose, ioctx, ret->handler); + if (ret->buf == NULL) { + xmlFreeSaveCtxt(ret); + return(NULL); + } + return(ret); +} + +/** + * xmlSaveDoc: + * @ctxt: a document saving context + * @doc: a document + * + * Save a full document to a saving context + * TODO: The function is not fully implemented yet as it does not return the + * byte count but 0 instead + * + * Returns the number of byte written or -1 in case of error + */ +long +xmlSaveDoc(xmlSaveCtxtPtr ctxt, xmlDocPtr doc) +{ + long ret = 0; + + if ((ctxt == NULL) || (doc == NULL)) return(-1); + if (xmlDocContentDumpOutput(ctxt, doc) < 0) + return(-1); + return(ret); +} + +/** + * xmlSaveTree: + * @ctxt: a document saving context + * @node: the top node of the subtree to save + * + * Save a subtree starting at the node parameter to a saving context + * TODO: The function is not fully implemented yet as it does not return the + * byte count but 0 instead + * + * Returns the number of byte written or -1 in case of error + */ +long +xmlSaveTree(xmlSaveCtxtPtr ctxt, xmlNodePtr node) +{ + long ret = 0; + + if ((ctxt == NULL) || (node == NULL)) return(-1); + xmlNodeDumpOutputInternal(ctxt, node); + return(ret); +} + +/** + * xmlSaveFlush: + * @ctxt: a document saving context + * + * Flush a document saving context, i.e. make sure that all bytes have + * been output. + * + * Returns the number of byte written or -1 in case of error. + */ +int +xmlSaveFlush(xmlSaveCtxtPtr ctxt) +{ + if (ctxt == NULL) return(-1); + if (ctxt->buf == NULL) return(-1); + return(xmlOutputBufferFlush(ctxt->buf)); +} + +/** + * xmlSaveClose: + * @ctxt: a document saving context + * + * Close a document saving context, i.e. make sure that all bytes have + * been output and free the associated data. + * + * Returns the number of byte written or -1 in case of error. + */ +int +xmlSaveClose(xmlSaveCtxtPtr ctxt) +{ + int ret; + + if (ctxt == NULL) return(-1); + ret = xmlSaveFlush(ctxt); + xmlFreeSaveCtxt(ctxt); + return(ret); +} + +/** + * xmlSaveSetEscape: + * @ctxt: a document saving context + * @escape: the escaping function + * + * Set a custom escaping function to be used for text in element content + * + * Returns 0 if successful or -1 in case of error. + */ +int +xmlSaveSetEscape(xmlSaveCtxtPtr ctxt, xmlCharEncodingOutputFunc escape) +{ + if (ctxt == NULL) return(-1); + ctxt->escape = escape; + return(0); +} + +/** + * xmlSaveSetAttrEscape: + * @ctxt: a document saving context + * @escape: the escaping function + * + * Set a custom escaping function to be used for text in attribute content + * + * Returns 0 if successful or -1 in case of error. + */ +int +xmlSaveSetAttrEscape(xmlSaveCtxtPtr ctxt, xmlCharEncodingOutputFunc escape) +{ + if (ctxt == NULL) return(-1); + ctxt->escapeAttr = escape; + return(0); +} + +/************************************************************************ + * * + * Public entry points based on buffers * + * * + ************************************************************************/ + +/** + * xmlBufAttrSerializeTxtContent: + * @buf: and xmlBufPtr output + * @doc: the document + * @attr: the attribute node + * @string: the text content + * + * Serialize text attribute values to an xmlBufPtr + */ +void +xmlBufAttrSerializeTxtContent(xmlBufPtr buf, xmlDocPtr doc, + xmlAttrPtr attr, const xmlChar * string) +{ + xmlChar *base, *cur; + + if (string == NULL) + return; + base = cur = (xmlChar *) string; + while (*cur != 0) { + if (*cur == '\n') { + if (base != cur) + xmlBufAdd(buf, base, cur - base); + xmlBufAdd(buf, BAD_CAST " ", 5); + cur++; + base = cur; + } else if (*cur == '\r') { + if (base != cur) + xmlBufAdd(buf, base, cur - base); + xmlBufAdd(buf, BAD_CAST " ", 5); + cur++; + base = cur; + } else if (*cur == '\t') { + if (base != cur) + xmlBufAdd(buf, base, cur - base); + xmlBufAdd(buf, BAD_CAST " ", 4); + cur++; + base = cur; + } else if (*cur == '"') { + if (base != cur) + xmlBufAdd(buf, base, cur - base); + xmlBufAdd(buf, BAD_CAST """, 6); + cur++; + base = cur; + } else if (*cur == '<') { + if (base != cur) + xmlBufAdd(buf, base, cur - base); + xmlBufAdd(buf, BAD_CAST "<", 4); + cur++; + base = cur; + } else if (*cur == '>') { + if (base != cur) + xmlBufAdd(buf, base, cur - base); + xmlBufAdd(buf, BAD_CAST ">", 4); + cur++; + base = cur; + } else if (*cur == '&') { + if (base != cur) + xmlBufAdd(buf, base, cur - base); + xmlBufAdd(buf, BAD_CAST "&", 5); + cur++; + base = cur; + } else if ((*cur >= 0x80) && ((doc == NULL) || + (doc->encoding == NULL))) { + /* + * We assume we have UTF-8 content. + */ + unsigned char tmp[12]; + int val = 0, l = 1; + + if (base != cur) + xmlBufAdd(buf, base, cur - base); + if (*cur < 0xC0) { + xmlSaveErr(XML_SAVE_NOT_UTF8, (xmlNodePtr) attr, NULL); + if (doc != NULL) + doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1"); + xmlSerializeHexCharRef(tmp, *cur); + xmlBufAdd(buf, (xmlChar *) tmp, -1); + cur++; + base = cur; + continue; + } else if (*cur < 0xE0) { + val = (cur[0]) & 0x1F; + val <<= 6; + val |= (cur[1]) & 0x3F; + l = 2; + } else if (*cur < 0xF0) { + val = (cur[0]) & 0x0F; + val <<= 6; + val |= (cur[1]) & 0x3F; + val <<= 6; + val |= (cur[2]) & 0x3F; + l = 3; + } else if (*cur < 0xF8) { + val = (cur[0]) & 0x07; + val <<= 6; + val |= (cur[1]) & 0x3F; + val <<= 6; + val |= (cur[2]) & 0x3F; + val <<= 6; + val |= (cur[3]) & 0x3F; + l = 4; + } + if ((l == 1) || (!IS_CHAR(val))) { + xmlSaveErr(XML_SAVE_CHAR_INVALID, (xmlNodePtr) attr, NULL); + if (doc != NULL) + doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1"); + + xmlSerializeHexCharRef(tmp, *cur); + xmlBufAdd(buf, (xmlChar *) tmp, -1); + cur++; + base = cur; + continue; + } + /* + * We could do multiple things here. Just save + * as a char ref + */ + xmlSerializeHexCharRef(tmp, val); + xmlBufAdd(buf, (xmlChar *) tmp, -1); + cur += l; + base = cur; + } else { + cur++; + } + } + if (base != cur) + xmlBufAdd(buf, base, cur - base); +} + +/** + * xmlAttrSerializeTxtContent: + * @buf: the XML buffer output + * @doc: the document + * @attr: the attribute node + * @string: the text content + * + * Serialize text attribute values to an xml simple buffer + */ +void +xmlAttrSerializeTxtContent(xmlBufferPtr buf, xmlDocPtr doc, + xmlAttrPtr attr, const xmlChar * string) +{ + xmlBufPtr buffer; + + if ((buf == NULL) || (string == NULL)) + return; + buffer = xmlBufFromBuffer(buf); + if (buffer == NULL) + return; + xmlBufAttrSerializeTxtContent(buffer, doc, attr, string); + xmlBufBackToBuffer(buffer); +} + +/** + * xmlNodeDump: + * @buf: the XML buffer output + * @doc: the document + * @cur: the current node + * @level: the imbrication level for indenting + * @format: is formatting allowed + * + * Dump an XML node, recursive behaviour,children are printed too. + * Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 + * or xmlKeepBlanksDefault(0) was called + * Since this is using xmlBuffer structures it is limited to 2GB and somehow + * deprecated, use xmlBufNodeDump() instead. + * + * Returns the number of bytes written to the buffer or -1 in case of error + */ +int +xmlNodeDump(xmlBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur, int level, + int format) +{ + xmlBufPtr buffer; + int ret; + + if ((buf == NULL) || (cur == NULL)) + return(-1); + buffer = xmlBufFromBuffer(buf); + if (buffer == NULL) + return(-1); + ret = xmlBufNodeDump(buffer, doc, cur, level, format); + xmlBufBackToBuffer(buffer); + if (ret > INT_MAX) + return(-1); + return((int) ret); +} + +/** + * xmlBufNodeDump: + * @buf: the XML buffer output + * @doc: the document + * @cur: the current node + * @level: the imbrication level for indenting + * @format: is formatting allowed + * + * Dump an XML node, recursive behaviour,children are printed too. + * Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 + * or xmlKeepBlanksDefault(0) was called + * + * Returns the number of bytes written to the buffer, in case of error 0 + * is returned or @buf stores the error + */ + +size_t +xmlBufNodeDump(xmlBufPtr buf, xmlDocPtr doc, xmlNodePtr cur, int level, + int format) +{ + size_t use; + int ret; + xmlOutputBufferPtr outbuf; + int oldalloc; + + xmlInitParser(); + + if (cur == NULL) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlNodeDump : node == NULL\n"); +#endif + return (-1); + } + if (buf == NULL) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlNodeDump : buf == NULL\n"); +#endif + return (-1); + } + outbuf = (xmlOutputBufferPtr) xmlMalloc(sizeof(xmlOutputBuffer)); + if (outbuf == NULL) { + xmlSaveErrMemory("creating buffer"); + return (-1); + } + memset(outbuf, 0, (size_t) sizeof(xmlOutputBuffer)); + outbuf->buffer = buf; + outbuf->encoder = NULL; + outbuf->writecallback = NULL; + outbuf->closecallback = NULL; + outbuf->context = NULL; + outbuf->written = 0; + + use = xmlBufUse(buf); + oldalloc = xmlBufGetAllocationScheme(buf); + xmlBufSetAllocationScheme(buf, XML_BUFFER_ALLOC_DOUBLEIT); + xmlNodeDumpOutput(outbuf, doc, cur, level, format, NULL); + xmlBufSetAllocationScheme(buf, oldalloc); + xmlFree(outbuf); + ret = xmlBufUse(buf) - use; + return (ret); +} + +/** + * xmlElemDump: + * @f: the FILE * for the output + * @doc: the document + * @cur: the current node + * + * Dump an XML/HTML node, recursive behaviour, children are printed too. + */ +void +xmlElemDump(FILE * f, xmlDocPtr doc, xmlNodePtr cur) +{ + xmlOutputBufferPtr outbuf; + + xmlInitParser(); + + if (cur == NULL) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlElemDump : cur == NULL\n"); +#endif + return; + } +#ifdef DEBUG_TREE + if (doc == NULL) { + xmlGenericError(xmlGenericErrorContext, + "xmlElemDump : doc == NULL\n"); + } +#endif + + outbuf = xmlOutputBufferCreateFile(f, NULL); + if (outbuf == NULL) + return; + if ((doc != NULL) && (doc->type == XML_HTML_DOCUMENT_NODE)) { +#ifdef LIBXML_HTML_ENABLED + htmlNodeDumpOutput(outbuf, doc, cur, NULL); +#else + xmlSaveErr(XML_ERR_INTERNAL_ERROR, cur, "HTML support not compiled in\n"); +#endif /* LIBXML_HTML_ENABLED */ + } else + xmlNodeDumpOutput(outbuf, doc, cur, 0, 1, NULL); + xmlOutputBufferClose(outbuf); +} + +/************************************************************************ + * * + * Saving functions front-ends * + * * + ************************************************************************/ + +/** + * xmlNodeDumpOutput: + * @buf: the XML buffer output + * @doc: the document + * @cur: the current node + * @level: the imbrication level for indenting + * @format: is formatting allowed + * @encoding: an optional encoding string + * + * Dump an XML node, recursive behaviour, children are printed too. + * Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 + * or xmlKeepBlanksDefault(0) was called + */ +void +xmlNodeDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur, + int level, int format, const char *encoding) +{ + xmlSaveCtxt ctxt; +#ifdef LIBXML_HTML_ENABLED + xmlDtdPtr dtd; + int is_xhtml = 0; +#endif + + xmlInitParser(); + + if ((buf == NULL) || (cur == NULL)) return; + + if (encoding == NULL) + encoding = "UTF-8"; + + memset(&ctxt, 0, sizeof(ctxt)); + ctxt.doc = doc; + ctxt.buf = buf; + ctxt.level = level; + ctxt.format = format ? 1 : 0; + ctxt.encoding = (const xmlChar *) encoding; + xmlSaveCtxtInit(&ctxt); + ctxt.options |= XML_SAVE_AS_XML; + +#ifdef LIBXML_HTML_ENABLED + dtd = xmlGetIntSubset(doc); + if (dtd != NULL) { + is_xhtml = xmlIsXHTML(dtd->SystemID, dtd->ExternalID); + if (is_xhtml < 0) + is_xhtml = 0; + } + + if (is_xhtml) + xhtmlNodeDumpOutput(&ctxt, cur); + else +#endif + xmlNodeDumpOutputInternal(&ctxt, cur); +} + +/** + * xmlDocDumpFormatMemoryEnc: + * @out_doc: Document to generate XML text from + * @doc_txt_ptr: Memory pointer for allocated XML text + * @doc_txt_len: Length of the generated XML text + * @txt_encoding: Character encoding to use when generating XML text + * @format: should formatting spaces been added + * + * Dump the current DOM tree into memory using the character encoding specified + * by the caller. Note it is up to the caller of this function to free the + * allocated memory with xmlFree(). + * Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 + * or xmlKeepBlanksDefault(0) was called + */ + +void +xmlDocDumpFormatMemoryEnc(xmlDocPtr out_doc, xmlChar **doc_txt_ptr, + int * doc_txt_len, const char * txt_encoding, + int format) { + xmlSaveCtxt ctxt; + int dummy = 0; + xmlOutputBufferPtr out_buff = NULL; + xmlCharEncodingHandlerPtr conv_hdlr = NULL; + + if (doc_txt_len == NULL) { + doc_txt_len = &dummy; /* Continue, caller just won't get length */ + } + + if (doc_txt_ptr == NULL) { + *doc_txt_len = 0; + return; + } + + *doc_txt_ptr = NULL; + *doc_txt_len = 0; + + if (out_doc == NULL) { + /* No document, no output */ + return; + } + + /* + * Validate the encoding value, if provided. + * This logic is copied from xmlSaveFileEnc. + */ + + if (txt_encoding == NULL) + txt_encoding = (const char *) out_doc->encoding; + if (txt_encoding != NULL) { + conv_hdlr = xmlFindCharEncodingHandler(txt_encoding); + if ( conv_hdlr == NULL ) { + xmlSaveErr(XML_SAVE_UNKNOWN_ENCODING, (xmlNodePtr) out_doc, + txt_encoding); + return; + } + } + + if ((out_buff = xmlAllocOutputBuffer(conv_hdlr)) == NULL ) { + xmlSaveErrMemory("creating buffer"); + return; + } + + memset(&ctxt, 0, sizeof(ctxt)); + ctxt.doc = out_doc; + ctxt.buf = out_buff; + ctxt.level = 0; + ctxt.format = format ? 1 : 0; + ctxt.encoding = (const xmlChar *) txt_encoding; + xmlSaveCtxtInit(&ctxt); + ctxt.options |= XML_SAVE_AS_XML; + xmlDocContentDumpOutput(&ctxt, out_doc); + xmlOutputBufferFlush(out_buff); + if (out_buff->conv != NULL) { + *doc_txt_len = xmlBufUse(out_buff->conv); + *doc_txt_ptr = xmlStrndup(xmlBufContent(out_buff->conv), *doc_txt_len); + } else { + *doc_txt_len = xmlBufUse(out_buff->buffer); + *doc_txt_ptr = xmlStrndup(xmlBufContent(out_buff->buffer),*doc_txt_len); + } + (void)xmlOutputBufferClose(out_buff); + + if ((*doc_txt_ptr == NULL) && (*doc_txt_len > 0)) { + *doc_txt_len = 0; + xmlSaveErrMemory("creating output"); + } + + return; +} + +/** + * xmlDocDumpMemory: + * @cur: the document + * @mem: OUT: the memory pointer + * @size: OUT: the memory length + * + * Dump an XML document in memory and return the #xmlChar * and it's size + * in bytes. It's up to the caller to free the memory with xmlFree(). + * The resulting byte array is zero terminated, though the last 0 is not + * included in the returned size. + */ +void +xmlDocDumpMemory(xmlDocPtr cur, xmlChar**mem, int *size) { + xmlDocDumpFormatMemoryEnc(cur, mem, size, NULL, 0); +} + +/** + * xmlDocDumpFormatMemory: + * @cur: the document + * @mem: OUT: the memory pointer + * @size: OUT: the memory length + * @format: should formatting spaces been added + * + * + * Dump an XML document in memory and return the #xmlChar * and it's size. + * It's up to the caller to free the memory with xmlFree(). + * Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 + * or xmlKeepBlanksDefault(0) was called + */ +void +xmlDocDumpFormatMemory(xmlDocPtr cur, xmlChar**mem, int *size, int format) { + xmlDocDumpFormatMemoryEnc(cur, mem, size, NULL, format); +} + +/** + * xmlDocDumpMemoryEnc: + * @out_doc: Document to generate XML text from + * @doc_txt_ptr: Memory pointer for allocated XML text + * @doc_txt_len: Length of the generated XML text + * @txt_encoding: Character encoding to use when generating XML text + * + * Dump the current DOM tree into memory using the character encoding specified + * by the caller. Note it is up to the caller of this function to free the + * allocated memory with xmlFree(). + */ + +void +xmlDocDumpMemoryEnc(xmlDocPtr out_doc, xmlChar **doc_txt_ptr, + int * doc_txt_len, const char * txt_encoding) { + xmlDocDumpFormatMemoryEnc(out_doc, doc_txt_ptr, doc_txt_len, + txt_encoding, 0); +} + +/** + * xmlDocFormatDump: + * @f: the FILE* + * @cur: the document + * @format: should formatting spaces been added + * + * Dump an XML document to an open FILE. + * + * returns: the number of bytes written or -1 in case of failure. + * Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 + * or xmlKeepBlanksDefault(0) was called + */ +int +xmlDocFormatDump(FILE *f, xmlDocPtr cur, int format) { + xmlSaveCtxt ctxt; + xmlOutputBufferPtr buf; + const char * encoding; + xmlCharEncodingHandlerPtr handler = NULL; + int ret; + + if (cur == NULL) { +#ifdef DEBUG_TREE + xmlGenericError(xmlGenericErrorContext, + "xmlDocDump : document == NULL\n"); +#endif + return(-1); + } + encoding = (const char *) cur->encoding; + + if (encoding != NULL) { + handler = xmlFindCharEncodingHandler(encoding); + if (handler == NULL) { + xmlFree((char *) cur->encoding); + cur->encoding = NULL; + encoding = NULL; + } + } + buf = xmlOutputBufferCreateFile(f, handler); + if (buf == NULL) return(-1); + memset(&ctxt, 0, sizeof(ctxt)); + ctxt.doc = cur; + ctxt.buf = buf; + ctxt.level = 0; + ctxt.format = format ? 1 : 0; + ctxt.encoding = (const xmlChar *) encoding; + xmlSaveCtxtInit(&ctxt); + ctxt.options |= XML_SAVE_AS_XML; + xmlDocContentDumpOutput(&ctxt, cur); + + ret = xmlOutputBufferClose(buf); + return(ret); +} + +/** + * xmlDocDump: + * @f: the FILE* + * @cur: the document + * + * Dump an XML document to an open FILE. + * + * returns: the number of bytes written or -1 in case of failure. + */ +int +xmlDocDump(FILE *f, xmlDocPtr cur) { + return(xmlDocFormatDump (f, cur, 0)); +} + +/** + * xmlSaveFileTo: + * @buf: an output I/O buffer + * @cur: the document + * @encoding: the encoding if any assuming the I/O layer handles the trancoding + * + * Dump an XML document to an I/O buffer. + * Warning ! This call xmlOutputBufferClose() on buf which is not available + * after this call. + * + * returns: the number of bytes written or -1 in case of failure. + */ +int +xmlSaveFileTo(xmlOutputBufferPtr buf, xmlDocPtr cur, const char *encoding) { + xmlSaveCtxt ctxt; + int ret; + + if (buf == NULL) return(-1); + if (cur == NULL) { + xmlOutputBufferClose(buf); + return(-1); + } + memset(&ctxt, 0, sizeof(ctxt)); + ctxt.doc = cur; + ctxt.buf = buf; + ctxt.level = 0; + ctxt.format = 0; + ctxt.encoding = (const xmlChar *) encoding; + xmlSaveCtxtInit(&ctxt); + ctxt.options |= XML_SAVE_AS_XML; + xmlDocContentDumpOutput(&ctxt, cur); + ret = xmlOutputBufferClose(buf); + return(ret); +} + +/** + * xmlSaveFormatFileTo: + * @buf: an output I/O buffer + * @cur: the document + * @encoding: the encoding if any assuming the I/O layer handles the trancoding + * @format: should formatting spaces been added + * + * Dump an XML document to an I/O buffer. + * Warning ! This call xmlOutputBufferClose() on buf which is not available + * after this call. + * + * returns: the number of bytes written or -1 in case of failure. + */ +int +xmlSaveFormatFileTo(xmlOutputBufferPtr buf, xmlDocPtr cur, + const char *encoding, int format) +{ + xmlSaveCtxt ctxt; + int ret; + + if (buf == NULL) return(-1); + if ((cur == NULL) || + ((cur->type != XML_DOCUMENT_NODE) && + (cur->type != XML_HTML_DOCUMENT_NODE))) { + xmlOutputBufferClose(buf); + return(-1); + } + memset(&ctxt, 0, sizeof(ctxt)); + ctxt.doc = cur; + ctxt.buf = buf; + ctxt.level = 0; + ctxt.format = format ? 1 : 0; + ctxt.encoding = (const xmlChar *) encoding; + xmlSaveCtxtInit(&ctxt); + ctxt.options |= XML_SAVE_AS_XML; + xmlDocContentDumpOutput(&ctxt, cur); + ret = xmlOutputBufferClose(buf); + return (ret); +} + +/** + * xmlSaveFormatFileEnc: + * @filename: the filename or URL to output + * @cur: the document being saved + * @encoding: the name of the encoding to use or NULL. + * @format: should formatting spaces be added. + * + * Dump an XML document to a file or an URL. + * + * Returns the number of bytes written or -1 in case of error. + * Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 + * or xmlKeepBlanksDefault(0) was called + */ +int +xmlSaveFormatFileEnc( const char * filename, xmlDocPtr cur, + const char * encoding, int format ) { + xmlSaveCtxt ctxt; + xmlOutputBufferPtr buf; + xmlCharEncodingHandlerPtr handler = NULL; + int ret; + + if (cur == NULL) + return(-1); + + if (encoding == NULL) + encoding = (const char *) cur->encoding; + + if (encoding != NULL) { + + handler = xmlFindCharEncodingHandler(encoding); + if (handler == NULL) + return(-1); + } + +#ifdef HAVE_ZLIB_H + if (cur->compression < 0) cur->compression = xmlGetCompressMode(); +#endif + /* + * save the content to a temp buffer. + */ + buf = xmlOutputBufferCreateFilename(filename, handler, cur->compression); + if (buf == NULL) return(-1); + memset(&ctxt, 0, sizeof(ctxt)); + ctxt.doc = cur; + ctxt.buf = buf; + ctxt.level = 0; + ctxt.format = format ? 1 : 0; + ctxt.encoding = (const xmlChar *) encoding; + xmlSaveCtxtInit(&ctxt); + ctxt.options |= XML_SAVE_AS_XML; + + xmlDocContentDumpOutput(&ctxt, cur); + + ret = xmlOutputBufferClose(buf); + return(ret); +} + + +/** + * xmlSaveFileEnc: + * @filename: the filename (or URL) + * @cur: the document + * @encoding: the name of an encoding (or NULL) + * + * Dump an XML document, converting it to the given encoding + * + * returns: the number of bytes written or -1 in case of failure. + */ +int +xmlSaveFileEnc(const char *filename, xmlDocPtr cur, const char *encoding) { + return ( xmlSaveFormatFileEnc( filename, cur, encoding, 0 ) ); +} + +/** + * xmlSaveFormatFile: + * @filename: the filename (or URL) + * @cur: the document + * @format: should formatting spaces been added + * + * Dump an XML document to a file. Will use compression if + * compiled in and enabled. If @filename is "-" the stdout file is + * used. If @format is set then the document will be indented on output. + * Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1 + * or xmlKeepBlanksDefault(0) was called + * + * returns: the number of bytes written or -1 in case of failure. + */ +int +xmlSaveFormatFile(const char *filename, xmlDocPtr cur, int format) { + return ( xmlSaveFormatFileEnc( filename, cur, NULL, format ) ); +} + +/** + * xmlSaveFile: + * @filename: the filename (or URL) + * @cur: the document + * + * Dump an XML document to a file. Will use compression if + * compiled in and enabled. If @filename is "-" the stdout file is + * used. + * returns: the number of bytes written or -1 in case of failure. + */ +int +xmlSaveFile(const char *filename, xmlDocPtr cur) { + return(xmlSaveFormatFileEnc(filename, cur, NULL, 0)); +} + +#endif /* LIBXML_OUTPUT_ENABLED */ + +#define bottom_xmlsave +#include "elfgcchack.h" diff --git a/vendors/libxml/src/xmlschemas.c b/vendors/libxml/src/xmlschemas.c new file mode 100644 index 0000000..121533f --- /dev/null +++ b/vendors/libxml/src/xmlschemas.c @@ -0,0 +1,28905 @@ +/* + * schemas.c : implementation of the XML Schema handling and + * schema validity checking + * + * See Copyright for the status of this software. + * + * Daniel Veillard + */ + +/* + * TODO: + * - when types are redefined in includes, check that all + * types in the redef list are equal + * -> need a type equality operation. + * - if we don't intend to use the schema for schemas, we + * need to validate all schema attributes (ref, type, name) + * against their types. + * - Eliminate item creation for: ?? + * + * URGENT TODO: + * - For xsi-driven schema acquisition, augment the IDCs after every + * acquisition episode (xmlSchemaAugmentIDC). + * + * NOTES: + * - Elimated item creation for: , , + * , , , + * + * PROBLEMS: + * - http://lists.w3.org/Archives/Public/www-xml-schema-comments/2005JulSep/0337.html + * IDC XPath expression and chameleon includes: the targetNamespace is changed, so + * XPath will have trouble to resolve to this namespace, since not known. + * + * + * CONSTRAINTS: + * + * Schema Component Constraint: + * All Group Limited (cos-all-limited) + * Status: complete + * (1.2) + * In xmlSchemaGroupDefReferenceTermFixup() and + * (2) + * In xmlSchemaParseModelGroup() + * TODO: Actually this should go to component-level checks, + * but is done here due to performance. Move it to an other layer + * is schema construction via an API is implemented. + */ +#define IN_LIBXML +#include "libxml.h" + +#ifdef LIBXML_SCHEMAS_ENABLED + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef LIBXML_PATTERN_ENABLED +#include +#endif +#ifdef LIBXML_READER_ENABLED +#include +#endif + +/* #define DEBUG 1 */ + +/* #define DEBUG_CONTENT 1 */ + +/* #define DEBUG_TYPE 1 */ + +/* #define DEBUG_CONTENT_REGEXP 1 */ + +/* #define DEBUG_AUTOMATA 1 */ + +/* #define DEBUG_IDC */ + +/* #define DEBUG_IDC_NODE_TABLE */ + +/* #define WXS_ELEM_DECL_CONS_ENABLED */ + +#ifdef DEBUG_IDC + #ifndef DEBUG_IDC_NODE_TABLE + #define DEBUG_IDC_NODE_TABLE + #endif +#endif + +/* #define ENABLE_PARTICLE_RESTRICTION 1 */ + +#define ENABLE_REDEFINE + +/* #define ENABLE_NAMED_LOCALS */ + +/* #define ENABLE_IDC_NODE_TABLES_TEST */ + +#define DUMP_CONTENT_MODEL + +#ifdef LIBXML_READER_ENABLED +/* #define XML_SCHEMA_READER_ENABLED */ +#endif + +#define UNBOUNDED (1 << 30) +#define TODO \ + xmlGenericError(xmlGenericErrorContext, \ + "Unimplemented block at %s:%d\n", \ + __FILE__, __LINE__); + +#define XML_SCHEMAS_NO_NAMESPACE (const xmlChar *) "##" + +/* + * The XML Schemas namespaces + */ +static const xmlChar *xmlSchemaNs = (const xmlChar *) + "http://www.w3.org/2001/XMLSchema"; + +static const xmlChar *xmlSchemaInstanceNs = (const xmlChar *) + "http://www.w3.org/2001/XMLSchema-instance"; + +static const xmlChar *xmlNamespaceNs = (const xmlChar *) + "http://www.w3.org/2000/xmlns/"; + +/* +* Come casting macros. +*/ +#define ACTXT_CAST (xmlSchemaAbstractCtxtPtr) +#define PCTXT_CAST (xmlSchemaParserCtxtPtr) +#define VCTXT_CAST (xmlSchemaValidCtxtPtr) +#define WXS_BASIC_CAST (xmlSchemaBasicItemPtr) +#define WXS_TREE_CAST (xmlSchemaTreeItemPtr) +#define WXS_PTC_CAST (xmlSchemaParticlePtr) +#define WXS_TYPE_CAST (xmlSchemaTypePtr) +#define WXS_ELEM_CAST (xmlSchemaElementPtr) +#define WXS_ATTR_GROUP_CAST (xmlSchemaAttributeGroupPtr) +#define WXS_ATTR_CAST (xmlSchemaAttributePtr) +#define WXS_ATTR_USE_CAST (xmlSchemaAttributeUsePtr) +#define WXS_ATTR_PROHIB_CAST (xmlSchemaAttributeUseProhibPtr) +#define WXS_MODEL_GROUPDEF_CAST (xmlSchemaModelGroupDefPtr) +#define WXS_MODEL_GROUP_CAST (xmlSchemaModelGroupPtr) +#define WXS_IDC_CAST (xmlSchemaIDCPtr) +#define WXS_QNAME_CAST (xmlSchemaQNameRefPtr) +#define WXS_LIST_CAST (xmlSchemaItemListPtr) + +/* +* Macros to query common properties of components. +*/ +#define WXS_ITEM_NODE(i) xmlSchemaGetComponentNode(WXS_BASIC_CAST (i)) + +#define WXS_ITEM_TYPE_NAME(i) xmlSchemaGetComponentTypeStr(WXS_BASIC_CAST (i)) +/* +* Macros for element declarations. +*/ +#define WXS_ELEM_TYPEDEF(e) (e)->subtypes + +#define WXS_SUBST_HEAD(item) (item)->refDecl +/* +* Macros for attribute declarations. +*/ +#define WXS_ATTR_TYPEDEF(a) (a)->subtypes +/* +* Macros for attribute uses. +*/ +#define WXS_ATTRUSE_DECL(au) WXS_ATTR_CAST (WXS_ATTR_USE_CAST (au))->attrDecl + +#define WXS_ATTRUSE_TYPEDEF(au) WXS_ATTR_TYPEDEF(WXS_ATTRUSE_DECL( WXS_ATTR_USE_CAST au)) + +#define WXS_ATTRUSE_DECL_NAME(au) (WXS_ATTRUSE_DECL(au))->name + +#define WXS_ATTRUSE_DECL_TNS(au) (WXS_ATTRUSE_DECL(au))->targetNamespace +/* +* Macros for attribute groups. +*/ +#define WXS_ATTR_GROUP_HAS_REFS(ag) ((WXS_ATTR_GROUP_CAST (ag))->flags & XML_SCHEMAS_ATTRGROUP_HAS_REFS) +#define WXS_ATTR_GROUP_EXPANDED(ag) ((WXS_ATTR_GROUP_CAST (ag))->flags & XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED) +/* +* Macros for particles. +*/ +#define WXS_PARTICLE(p) WXS_PTC_CAST (p) + +#define WXS_PARTICLE_TERM(p) (WXS_PARTICLE(p))->children + +#define WXS_PARTICLE_TERM_AS_ELEM(p) (WXS_ELEM_CAST WXS_PARTICLE_TERM(p)) + +#define WXS_PARTICLE_MODEL(p) WXS_MODEL_GROUP_CAST WXS_PARTICLE(p)->children +/* +* Macros for model groups definitions. +*/ +#define WXS_MODELGROUPDEF_MODEL(mgd) (WXS_MODEL_GROUP_CAST (mgd))->children +/* +* Macros for model groups. +*/ +#define WXS_IS_MODEL_GROUP(i) \ + (((i)->type == XML_SCHEMA_TYPE_SEQUENCE) || \ + ((i)->type == XML_SCHEMA_TYPE_CHOICE) || \ + ((i)->type == XML_SCHEMA_TYPE_ALL)) + +#define WXS_MODELGROUP_PARTICLE(mg) WXS_PTC_CAST (mg)->children +/* +* Macros for schema buckets. +*/ +#define WXS_IS_BUCKET_INCREDEF(t) (((t) == XML_SCHEMA_SCHEMA_INCLUDE) || \ + ((t) == XML_SCHEMA_SCHEMA_REDEFINE)) + +#define WXS_IS_BUCKET_IMPMAIN(t) (((t) == XML_SCHEMA_SCHEMA_MAIN) || \ + ((t) == XML_SCHEMA_SCHEMA_IMPORT)) + +#define WXS_IMPBUCKET(b) ((xmlSchemaImportPtr) (b)) + +#define WXS_INCBUCKET(b) ((xmlSchemaIncludePtr) (b)) +/* +* Macros for complex/simple types. +*/ +#define WXS_IS_ANYTYPE(i) \ + (( (i)->type == XML_SCHEMA_TYPE_BASIC) && \ + ( (WXS_TYPE_CAST (i))->builtInType == XML_SCHEMAS_ANYTYPE)) + +#define WXS_IS_COMPLEX(i) \ + (((i)->type == XML_SCHEMA_TYPE_COMPLEX) || \ + ((i)->builtInType == XML_SCHEMAS_ANYTYPE)) + +#define WXS_IS_SIMPLE(item) \ + ((item->type == XML_SCHEMA_TYPE_SIMPLE) || \ + ((item->type == XML_SCHEMA_TYPE_BASIC) && \ + (item->builtInType != XML_SCHEMAS_ANYTYPE))) + +#define WXS_IS_ANY_SIMPLE_TYPE(i) \ + (((i)->type == XML_SCHEMA_TYPE_BASIC) && \ + ((i)->builtInType == XML_SCHEMAS_ANYSIMPLETYPE)) + +#define WXS_IS_RESTRICTION(t) \ + ((t)->flags & XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION) + +#define WXS_IS_EXTENSION(t) \ + ((t)->flags & XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION) + +#define WXS_IS_TYPE_NOT_FIXED(i) \ + (((i)->type != XML_SCHEMA_TYPE_BASIC) && \ + (((i)->flags & XML_SCHEMAS_TYPE_INTERNAL_RESOLVED) == 0)) + +#define WXS_IS_TYPE_NOT_FIXED_1(item) \ + (((item)->type != XML_SCHEMA_TYPE_BASIC) && \ + (((item)->flags & XML_SCHEMAS_TYPE_FIXUP_1) == 0)) + +#define WXS_TYPE_IS_GLOBAL(t) ((t)->flags & XML_SCHEMAS_TYPE_GLOBAL) + +#define WXS_TYPE_IS_LOCAL(t) (((t)->flags & XML_SCHEMAS_TYPE_GLOBAL) == 0) +/* +* Macros for exclusively for complex types. +*/ +#define WXS_HAS_COMPLEX_CONTENT(item) \ + ((item->contentType == XML_SCHEMA_CONTENT_MIXED) || \ + (item->contentType == XML_SCHEMA_CONTENT_EMPTY) || \ + (item->contentType == XML_SCHEMA_CONTENT_ELEMENTS)) + +#define WXS_HAS_SIMPLE_CONTENT(item) \ + ((item->contentType == XML_SCHEMA_CONTENT_SIMPLE) || \ + (item->contentType == XML_SCHEMA_CONTENT_BASIC)) + +#define WXS_HAS_MIXED_CONTENT(item) \ + (item->contentType == XML_SCHEMA_CONTENT_MIXED) + +#define WXS_EMPTIABLE(t) \ + (xmlSchemaIsParticleEmptiable(WXS_PTC_CAST (t)->subtypes)) + +#define WXS_TYPE_CONTENTTYPE(t) (t)->subtypes + +#define WXS_TYPE_PARTICLE(t) WXS_PTC_CAST (t)->subtypes + +#define WXS_TYPE_PARTICLE_TERM(t) WXS_PARTICLE_TERM(WXS_TYPE_PARTICLE(t)) +/* +* Macros for exclusively for simple types. +*/ +#define WXS_LIST_ITEMTYPE(t) (t)->subtypes + +#define WXS_IS_ATOMIC(t) (t->flags & XML_SCHEMAS_TYPE_VARIETY_ATOMIC) + +#define WXS_IS_LIST(t) (t->flags & XML_SCHEMAS_TYPE_VARIETY_LIST) + +#define WXS_IS_UNION(t) (t->flags & XML_SCHEMAS_TYPE_VARIETY_UNION) +/* +* Misc parser context macros. +*/ +#define WXS_CONSTRUCTOR(ctx) (ctx)->constructor + +#define WXS_HAS_BUCKETS(ctx) \ +( (WXS_CONSTRUCTOR((ctx))->buckets != NULL) && \ +(WXS_CONSTRUCTOR((ctx))->buckets->nbItems > 0) ) + +#define WXS_SUBST_GROUPS(ctx) WXS_CONSTRUCTOR((ctx))->substGroups + +#define WXS_BUCKET(ctx) WXS_CONSTRUCTOR((ctx))->bucket + +#define WXS_SCHEMA(ctx) (ctx)->schema + +#define WXS_ADD_LOCAL(ctx, item) \ + xmlSchemaAddItemSize(&(WXS_BUCKET(ctx)->locals), 10, item) + +#define WXS_ADD_GLOBAL(ctx, item) \ + xmlSchemaAddItemSize(&(WXS_BUCKET(ctx)->globals), 5, item) + +#define WXS_ADD_PENDING(ctx, item) \ + xmlSchemaAddItemSize(&((ctx)->constructor->pending), 10, item) +/* +* xmlSchemaItemList macros. +*/ +#define WXS_ILIST_IS_EMPTY(l) ((l == NULL) || ((l)->nbItems == 0)) +/* +* Misc macros. +*/ +#define IS_SCHEMA(node, type) \ + ((node != NULL) && (node->ns != NULL) && \ + (xmlStrEqual(node->name, (const xmlChar *) type)) && \ + (xmlStrEqual(node->ns->href, xmlSchemaNs))) + +#define FREE_AND_NULL(str) if ((str) != NULL) { xmlFree((xmlChar *) (str)); str = NULL; } + +/* +* Since we put the default/fixed values into the dict, we can +* use pointer comparison for those values. +* REMOVED: (xmlStrEqual((v1), (v2))) +*/ +#define WXS_ARE_DEFAULT_STR_EQUAL(v1, v2) ((v1) == (v2)) + +#define INODE_NILLED(item) (item->flags & XML_SCHEMA_ELEM_INFO_NILLED) + +#define CAN_PARSE_SCHEMA(b) (((b)->doc != NULL) && ((b)->parsed == 0)) + +#define HFAILURE if (res == -1) goto exit_failure; + +#define HERROR if (res != 0) goto exit_error; + +#define HSTOP(ctx) if ((ctx)->stop) goto exit; +/* +* Some flags used for various schema constraints. +*/ +#define SUBSET_RESTRICTION 1<<0 +#define SUBSET_EXTENSION 1<<1 +#define SUBSET_SUBSTITUTION 1<<2 +#define SUBSET_LIST 1<<3 +#define SUBSET_UNION 1<<4 + +typedef struct _xmlSchemaNodeInfo xmlSchemaNodeInfo; +typedef xmlSchemaNodeInfo *xmlSchemaNodeInfoPtr; + +typedef struct _xmlSchemaItemList xmlSchemaItemList; +typedef xmlSchemaItemList *xmlSchemaItemListPtr; +struct _xmlSchemaItemList { + void **items; /* used for dynamic addition of schemata */ + int nbItems; /* used for dynamic addition of schemata */ + int sizeItems; /* used for dynamic addition of schemata */ +}; + +#define XML_SCHEMA_CTXT_PARSER 1 +#define XML_SCHEMA_CTXT_VALIDATOR 2 + +typedef struct _xmlSchemaAbstractCtxt xmlSchemaAbstractCtxt; +typedef xmlSchemaAbstractCtxt *xmlSchemaAbstractCtxtPtr; +struct _xmlSchemaAbstractCtxt { + int type; /* E.g. XML_SCHEMA_CTXT_VALIDATOR */ +}; + +typedef struct _xmlSchemaBucket xmlSchemaBucket; +typedef xmlSchemaBucket *xmlSchemaBucketPtr; + +#define XML_SCHEMA_SCHEMA_MAIN 0 +#define XML_SCHEMA_SCHEMA_IMPORT 1 +#define XML_SCHEMA_SCHEMA_INCLUDE 2 +#define XML_SCHEMA_SCHEMA_REDEFINE 3 + +/** + * xmlSchemaSchemaRelation: + * + * Used to create a graph of schema relationships. + */ +typedef struct _xmlSchemaSchemaRelation xmlSchemaSchemaRelation; +typedef xmlSchemaSchemaRelation *xmlSchemaSchemaRelationPtr; +struct _xmlSchemaSchemaRelation { + xmlSchemaSchemaRelationPtr next; + int type; /* E.g. XML_SCHEMA_SCHEMA_IMPORT */ + const xmlChar *importNamespace; + xmlSchemaBucketPtr bucket; +}; + +#define XML_SCHEMA_BUCKET_MARKED 1<<0 +#define XML_SCHEMA_BUCKET_COMPS_ADDED 1<<1 + +struct _xmlSchemaBucket { + int type; + int flags; + const xmlChar *schemaLocation; + const xmlChar *origTargetNamespace; + const xmlChar *targetNamespace; + xmlDocPtr doc; + xmlSchemaSchemaRelationPtr relations; + int located; + int parsed; + int imported; + int preserveDoc; + xmlSchemaItemListPtr globals; /* Global components. */ + xmlSchemaItemListPtr locals; /* Local components. */ +}; + +/** + * xmlSchemaImport: + * (extends xmlSchemaBucket) + * + * Reflects a schema. Holds some information + * about the schema and its toplevel components. Duplicate + * toplevel components are not checked at this level. + */ +typedef struct _xmlSchemaImport xmlSchemaImport; +typedef xmlSchemaImport *xmlSchemaImportPtr; +struct _xmlSchemaImport { + int type; /* Main OR import OR include. */ + int flags; + const xmlChar *schemaLocation; /* The URI of the schema document. */ + /* For chameleon includes, @origTargetNamespace will be NULL */ + const xmlChar *origTargetNamespace; + /* + * For chameleon includes, @targetNamespace will be the + * targetNamespace of the including schema. + */ + const xmlChar *targetNamespace; + xmlDocPtr doc; /* The schema node-tree. */ + /* @relations will hold any included/imported/redefined schemas. */ + xmlSchemaSchemaRelationPtr relations; + int located; + int parsed; + int imported; + int preserveDoc; + xmlSchemaItemListPtr globals; + xmlSchemaItemListPtr locals; + /* The imported schema. */ + xmlSchemaPtr schema; +}; + +/* +* (extends xmlSchemaBucket) +*/ +typedef struct _xmlSchemaInclude xmlSchemaInclude; +typedef xmlSchemaInclude *xmlSchemaIncludePtr; +struct _xmlSchemaInclude { + int type; + int flags; + const xmlChar *schemaLocation; + const xmlChar *origTargetNamespace; + const xmlChar *targetNamespace; + xmlDocPtr doc; + xmlSchemaSchemaRelationPtr relations; + int located; + int parsed; + int imported; + int preserveDoc; + xmlSchemaItemListPtr globals; /* Global components. */ + xmlSchemaItemListPtr locals; /* Local components. */ + + /* The owning main or import schema bucket. */ + xmlSchemaImportPtr ownerImport; +}; + +/** + * xmlSchemaBasicItem: + * + * The abstract base type for schema components. + */ +typedef struct _xmlSchemaBasicItem xmlSchemaBasicItem; +typedef xmlSchemaBasicItem *xmlSchemaBasicItemPtr; +struct _xmlSchemaBasicItem { + xmlSchemaTypeType type; +}; + +/** + * xmlSchemaAnnotItem: + * + * The abstract base type for annotated schema components. + * (Extends xmlSchemaBasicItem) + */ +typedef struct _xmlSchemaAnnotItem xmlSchemaAnnotItem; +typedef xmlSchemaAnnotItem *xmlSchemaAnnotItemPtr; +struct _xmlSchemaAnnotItem { + xmlSchemaTypeType type; + xmlSchemaAnnotPtr annot; +}; + +/** + * xmlSchemaTreeItem: + * + * The abstract base type for tree-like structured schema components. + * (Extends xmlSchemaAnnotItem) + */ +typedef struct _xmlSchemaTreeItem xmlSchemaTreeItem; +typedef xmlSchemaTreeItem *xmlSchemaTreeItemPtr; +struct _xmlSchemaTreeItem { + xmlSchemaTypeType type; + xmlSchemaAnnotPtr annot; + xmlSchemaTreeItemPtr next; + xmlSchemaTreeItemPtr children; +}; + + +#define XML_SCHEMA_ATTR_USE_FIXED 1<<0 +/** + * xmlSchemaAttributeUsePtr: + * + * The abstract base type for tree-like structured schema components. + * (Extends xmlSchemaTreeItem) + */ +typedef struct _xmlSchemaAttributeUse xmlSchemaAttributeUse; +typedef xmlSchemaAttributeUse *xmlSchemaAttributeUsePtr; +struct _xmlSchemaAttributeUse { + xmlSchemaTypeType type; + xmlSchemaAnnotPtr annot; + xmlSchemaAttributeUsePtr next; /* The next attr. use. */ + /* + * The attr. decl. OR a QName-ref. to an attr. decl. OR + * a QName-ref. to an attribute group definition. + */ + xmlSchemaAttributePtr attrDecl; + + int flags; + xmlNodePtr node; + int occurs; /* required, optional */ + const xmlChar * defValue; + xmlSchemaValPtr defVal; +}; + +/** + * xmlSchemaAttributeUseProhibPtr: + * + * A helper component to reflect attribute prohibitions. + * (Extends xmlSchemaBasicItem) + */ +typedef struct _xmlSchemaAttributeUseProhib xmlSchemaAttributeUseProhib; +typedef xmlSchemaAttributeUseProhib *xmlSchemaAttributeUseProhibPtr; +struct _xmlSchemaAttributeUseProhib { + xmlSchemaTypeType type; /* == XML_SCHEMA_EXTRA_ATTR_USE_PROHIB */ + xmlNodePtr node; + const xmlChar *name; + const xmlChar *targetNamespace; + int isRef; +}; + +/** + * xmlSchemaRedef: + */ +typedef struct _xmlSchemaRedef xmlSchemaRedef; +typedef xmlSchemaRedef *xmlSchemaRedefPtr; +struct _xmlSchemaRedef { + xmlSchemaRedefPtr next; + xmlSchemaBasicItemPtr item; /* The redefining component. */ + xmlSchemaBasicItemPtr reference; /* The referencing component. */ + xmlSchemaBasicItemPtr target; /* The to-be-redefined component. */ + const xmlChar *refName; /* The name of the to-be-redefined component. */ + const xmlChar *refTargetNs; /* The target namespace of the + to-be-redefined comp. */ + xmlSchemaBucketPtr targetBucket; /* The redefined schema. */ +}; + +/** + * xmlSchemaConstructionCtxt: + */ +typedef struct _xmlSchemaConstructionCtxt xmlSchemaConstructionCtxt; +typedef xmlSchemaConstructionCtxt *xmlSchemaConstructionCtxtPtr; +struct _xmlSchemaConstructionCtxt { + xmlSchemaPtr mainSchema; /* The main schema. */ + xmlSchemaBucketPtr mainBucket; /* The main schema bucket */ + xmlDictPtr dict; + xmlSchemaItemListPtr buckets; /* List of schema buckets. */ + /* xmlSchemaItemListPtr relations; */ /* List of schema relations. */ + xmlSchemaBucketPtr bucket; /* The current schema bucket */ + xmlSchemaItemListPtr pending; /* All Components of all schemas that + need to be fixed. */ + xmlHashTablePtr substGroups; + xmlSchemaRedefPtr redefs; + xmlSchemaRedefPtr lastRedef; +}; + +#define XML_SCHEMAS_PARSE_ERROR 1 +#define SCHEMAS_PARSE_OPTIONS XML_PARSE_NOENT + +struct _xmlSchemaParserCtxt { + int type; + void *errCtxt; /* user specific error context */ + xmlSchemaValidityErrorFunc error; /* the callback in case of errors */ + xmlSchemaValidityWarningFunc warning; /* the callback in case of warning */ + int err; + int nberrors; + xmlStructuredErrorFunc serror; + + xmlSchemaConstructionCtxtPtr constructor; + int ownsConstructor; /* TODO: Move this to parser *flags*. */ + + /* xmlSchemaPtr topschema; */ + /* xmlHashTablePtr namespaces; */ + + xmlSchemaPtr schema; /* The main schema in use */ + int counter; + + const xmlChar *URL; + xmlDocPtr doc; + int preserve; /* Whether the doc should be freed */ + + const char *buffer; + int size; + + /* + * Used to build complex element content models + */ + xmlAutomataPtr am; + xmlAutomataStatePtr start; + xmlAutomataStatePtr end; + xmlAutomataStatePtr state; + + xmlDictPtr dict; /* dictionnary for interned string names */ + xmlSchemaTypePtr ctxtType; /* The current context simple/complex type */ + int options; + xmlSchemaValidCtxtPtr vctxt; + int isS4S; + int isRedefine; + int xsiAssemble; + int stop; /* If the parser should stop; i.e. a critical error. */ + const xmlChar *targetNamespace; + xmlSchemaBucketPtr redefined; /* The schema to be redefined. */ + + xmlSchemaRedefPtr redef; /* Used for redefinitions. */ + int redefCounter; /* Used for redefinitions. */ + xmlSchemaItemListPtr attrProhibs; +}; + +/** + * xmlSchemaQNameRef: + * + * A component reference item (not a schema component) + * (Extends xmlSchemaBasicItem) + */ +typedef struct _xmlSchemaQNameRef xmlSchemaQNameRef; +typedef xmlSchemaQNameRef *xmlSchemaQNameRefPtr; +struct _xmlSchemaQNameRef { + xmlSchemaTypeType type; + xmlSchemaBasicItemPtr item; /* The resolved referenced item. */ + xmlSchemaTypeType itemType; + const xmlChar *name; + const xmlChar *targetNamespace; + xmlNodePtr node; +}; + +/** + * xmlSchemaParticle: + * + * A particle component. + * (Extends xmlSchemaTreeItem) + */ +typedef struct _xmlSchemaParticle xmlSchemaParticle; +typedef xmlSchemaParticle *xmlSchemaParticlePtr; +struct _xmlSchemaParticle { + xmlSchemaTypeType type; + xmlSchemaAnnotPtr annot; + xmlSchemaTreeItemPtr next; /* next particle */ + xmlSchemaTreeItemPtr children; /* the "term" (e.g. a model group, + a group definition, a XML_SCHEMA_EXTRA_QNAMEREF (if a reference), + etc.) */ + int minOccurs; + int maxOccurs; + xmlNodePtr node; +}; + +/** + * xmlSchemaModelGroup: + * + * A model group component. + * (Extends xmlSchemaTreeItem) + */ +typedef struct _xmlSchemaModelGroup xmlSchemaModelGroup; +typedef xmlSchemaModelGroup *xmlSchemaModelGroupPtr; +struct _xmlSchemaModelGroup { + xmlSchemaTypeType type; /* XML_SCHEMA_TYPE_SEQUENCE, XML_SCHEMA_TYPE_CHOICE, XML_SCHEMA_TYPE_ALL */ + xmlSchemaAnnotPtr annot; + xmlSchemaTreeItemPtr next; /* not used */ + xmlSchemaTreeItemPtr children; /* first particle (OR "element decl" OR "wildcard") */ + xmlNodePtr node; +}; + +#define XML_SCHEMA_MODEL_GROUP_DEF_MARKED 1<<0 +#define XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED 1<<1 +/** + * xmlSchemaModelGroupDef: + * + * A model group definition component. + * (Extends xmlSchemaTreeItem) + */ +typedef struct _xmlSchemaModelGroupDef xmlSchemaModelGroupDef; +typedef xmlSchemaModelGroupDef *xmlSchemaModelGroupDefPtr; +struct _xmlSchemaModelGroupDef { + xmlSchemaTypeType type; /* XML_SCHEMA_TYPE_GROUP */ + xmlSchemaAnnotPtr annot; + xmlSchemaTreeItemPtr next; /* not used */ + xmlSchemaTreeItemPtr children; /* the "model group" */ + const xmlChar *name; + const xmlChar *targetNamespace; + xmlNodePtr node; + int flags; +}; + +typedef struct _xmlSchemaIDC xmlSchemaIDC; +typedef xmlSchemaIDC *xmlSchemaIDCPtr; + +/** + * xmlSchemaIDCSelect: + * + * The identity-constraint "field" and "selector" item, holding the + * XPath expression. + */ +typedef struct _xmlSchemaIDCSelect xmlSchemaIDCSelect; +typedef xmlSchemaIDCSelect *xmlSchemaIDCSelectPtr; +struct _xmlSchemaIDCSelect { + xmlSchemaIDCSelectPtr next; + xmlSchemaIDCPtr idc; + int index; /* an index position if significant for IDC key-sequences */ + const xmlChar *xpath; /* the XPath expression */ + void *xpathComp; /* the compiled XPath expression */ +}; + +/** + * xmlSchemaIDC: + * + * The identity-constraint definition component. + * (Extends xmlSchemaAnnotItem) + */ + +struct _xmlSchemaIDC { + xmlSchemaTypeType type; + xmlSchemaAnnotPtr annot; + xmlSchemaIDCPtr next; + xmlNodePtr node; + const xmlChar *name; + const xmlChar *targetNamespace; + xmlSchemaIDCSelectPtr selector; + xmlSchemaIDCSelectPtr fields; + int nbFields; + xmlSchemaQNameRefPtr ref; +}; + +/** + * xmlSchemaIDCAug: + * + * The augmented IDC information used for validation. + */ +typedef struct _xmlSchemaIDCAug xmlSchemaIDCAug; +typedef xmlSchemaIDCAug *xmlSchemaIDCAugPtr; +struct _xmlSchemaIDCAug { + xmlSchemaIDCAugPtr next; /* next in a list */ + xmlSchemaIDCPtr def; /* the IDC definition */ + int keyrefDepth; /* the lowest tree level to which IDC + tables need to be bubbled upwards */ +}; + +/** + * xmlSchemaPSVIIDCKeySequence: + * + * The key sequence of a node table item. + */ +typedef struct _xmlSchemaPSVIIDCKey xmlSchemaPSVIIDCKey; +typedef xmlSchemaPSVIIDCKey *xmlSchemaPSVIIDCKeyPtr; +struct _xmlSchemaPSVIIDCKey { + xmlSchemaTypePtr type; + xmlSchemaValPtr val; +}; + +/** + * xmlSchemaPSVIIDCNode: + * + * The node table item of a node table. + */ +typedef struct _xmlSchemaPSVIIDCNode xmlSchemaPSVIIDCNode; +typedef xmlSchemaPSVIIDCNode *xmlSchemaPSVIIDCNodePtr; +struct _xmlSchemaPSVIIDCNode { + xmlNodePtr node; + xmlSchemaPSVIIDCKeyPtr *keys; + int nodeLine; + int nodeQNameID; + +}; + +/** + * xmlSchemaPSVIIDCBinding: + * + * The identity-constraint binding item of the [identity-constraint table]. + */ +typedef struct _xmlSchemaPSVIIDCBinding xmlSchemaPSVIIDCBinding; +typedef xmlSchemaPSVIIDCBinding *xmlSchemaPSVIIDCBindingPtr; +struct _xmlSchemaPSVIIDCBinding { + xmlSchemaPSVIIDCBindingPtr next; /* next binding of a specific node */ + xmlSchemaIDCPtr definition; /* the IDC definition */ + xmlSchemaPSVIIDCNodePtr *nodeTable; /* array of key-sequences */ + int nbNodes; /* number of entries in the node table */ + int sizeNodes; /* size of the node table */ + xmlSchemaItemListPtr dupls; +}; + + +#define XPATH_STATE_OBJ_TYPE_IDC_SELECTOR 1 +#define XPATH_STATE_OBJ_TYPE_IDC_FIELD 2 + +#define XPATH_STATE_OBJ_MATCHES -2 +#define XPATH_STATE_OBJ_BLOCKED -3 + +typedef struct _xmlSchemaIDCMatcher xmlSchemaIDCMatcher; +typedef xmlSchemaIDCMatcher *xmlSchemaIDCMatcherPtr; + +/** + * xmlSchemaIDCStateObj: + * + * The state object used to evaluate XPath expressions. + */ +typedef struct _xmlSchemaIDCStateObj xmlSchemaIDCStateObj; +typedef xmlSchemaIDCStateObj *xmlSchemaIDCStateObjPtr; +struct _xmlSchemaIDCStateObj { + int type; + xmlSchemaIDCStateObjPtr next; /* next if in a list */ + int depth; /* depth of creation */ + int *history; /* list of (depth, state-id) tuples */ + int nbHistory; + int sizeHistory; + xmlSchemaIDCMatcherPtr matcher; /* the correspondent field/selector + matcher */ + xmlSchemaIDCSelectPtr sel; + void *xpathCtxt; +}; + +#define IDC_MATCHER 0 + +/** + * xmlSchemaIDCMatcher: + * + * Used to evaluate IDC selectors (and fields). + */ +struct _xmlSchemaIDCMatcher { + int type; + int depth; /* the tree depth at creation time */ + xmlSchemaIDCMatcherPtr next; /* next in the list */ + xmlSchemaIDCMatcherPtr nextCached; /* next in the cache list */ + xmlSchemaIDCAugPtr aidc; /* the augmented IDC item */ + int idcType; + xmlSchemaPSVIIDCKeyPtr **keySeqs; /* the key-sequences of the target + elements */ + int sizeKeySeqs; + xmlSchemaItemListPtr targets; /* list of target-node + (xmlSchemaPSVIIDCNodePtr) entries */ +}; + +/* +* Element info flags. +*/ +#define XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES 1<<0 +#define XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES 1<<1 +#define XML_SCHEMA_ELEM_INFO_NILLED 1<<2 +#define XML_SCHEMA_ELEM_INFO_LOCAL_TYPE 1<<3 + +#define XML_SCHEMA_NODE_INFO_VALUE_NEEDED 1<<4 +#define XML_SCHEMA_ELEM_INFO_EMPTY 1<<5 +#define XML_SCHEMA_ELEM_INFO_HAS_CONTENT 1<<6 + +#define XML_SCHEMA_ELEM_INFO_HAS_ELEM_CONTENT 1<<7 +#define XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT 1<<8 +#define XML_SCHEMA_NODE_INFO_ERR_NOT_EXPECTED 1<<9 +#define XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE 1<<10 + +/** + * xmlSchemaNodeInfo: + * + * Holds information of an element node. + */ +struct _xmlSchemaNodeInfo { + int nodeType; + xmlNodePtr node; + int nodeLine; + const xmlChar *localName; + const xmlChar *nsName; + const xmlChar *value; + xmlSchemaValPtr val; /* the pre-computed value if any */ + xmlSchemaTypePtr typeDef; /* the complex/simple type definition if any */ + + int flags; /* combination of node info flags */ + + int valNeeded; + int normVal; + + xmlSchemaElementPtr decl; /* the element/attribute declaration */ + int depth; + xmlSchemaPSVIIDCBindingPtr idcTable; /* the table of PSVI IDC bindings + for the scope element*/ + xmlSchemaIDCMatcherPtr idcMatchers; /* the IDC matchers for the scope + element */ + xmlRegExecCtxtPtr regexCtxt; + + const xmlChar **nsBindings; /* Namespace bindings on this element */ + int nbNsBindings; + int sizeNsBindings; + + int hasKeyrefs; + int appliedXPath; /* Indicates that an XPath has been applied. */ +}; + +#define XML_SCHEMAS_ATTR_UNKNOWN 1 +#define XML_SCHEMAS_ATTR_ASSESSED 2 +#define XML_SCHEMAS_ATTR_PROHIBITED 3 +#define XML_SCHEMAS_ATTR_ERR_MISSING 4 +#define XML_SCHEMAS_ATTR_INVALID_VALUE 5 +#define XML_SCHEMAS_ATTR_ERR_NO_TYPE 6 +#define XML_SCHEMAS_ATTR_ERR_FIXED_VALUE 7 +#define XML_SCHEMAS_ATTR_DEFAULT 8 +#define XML_SCHEMAS_ATTR_VALIDATE_VALUE 9 +#define XML_SCHEMAS_ATTR_ERR_WILD_STRICT_NO_DECL 10 +#define XML_SCHEMAS_ATTR_HAS_ATTR_USE 11 +#define XML_SCHEMAS_ATTR_HAS_ATTR_DECL 12 +#define XML_SCHEMAS_ATTR_WILD_SKIP 13 +#define XML_SCHEMAS_ATTR_WILD_LAX_NO_DECL 14 +#define XML_SCHEMAS_ATTR_ERR_WILD_DUPLICATE_ID 15 +#define XML_SCHEMAS_ATTR_ERR_WILD_AND_USE_ID 16 +#define XML_SCHEMAS_ATTR_META 17 +/* +* @metaType values of xmlSchemaAttrInfo. +*/ +#define XML_SCHEMA_ATTR_INFO_META_XSI_TYPE 1 +#define XML_SCHEMA_ATTR_INFO_META_XSI_NIL 2 +#define XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC 3 +#define XML_SCHEMA_ATTR_INFO_META_XSI_NO_NS_SCHEMA_LOC 4 +#define XML_SCHEMA_ATTR_INFO_META_XMLNS 5 + +typedef struct _xmlSchemaAttrInfo xmlSchemaAttrInfo; +typedef xmlSchemaAttrInfo *xmlSchemaAttrInfoPtr; +struct _xmlSchemaAttrInfo { + int nodeType; + xmlNodePtr node; + int nodeLine; + const xmlChar *localName; + const xmlChar *nsName; + const xmlChar *value; + xmlSchemaValPtr val; /* the pre-computed value if any */ + xmlSchemaTypePtr typeDef; /* the complex/simple type definition if any */ + int flags; /* combination of node info flags */ + + xmlSchemaAttributePtr decl; /* the attribute declaration */ + xmlSchemaAttributeUsePtr use; /* the attribute use */ + int state; + int metaType; + const xmlChar *vcValue; /* the value constraint value */ + xmlSchemaNodeInfoPtr parent; +}; + + +#define XML_SCHEMA_VALID_CTXT_FLAG_STREAM 1 +/** + * xmlSchemaValidCtxt: + * + * A Schemas validation context + */ +struct _xmlSchemaValidCtxt { + int type; + void *errCtxt; /* user specific data block */ + xmlSchemaValidityErrorFunc error; /* the callback in case of errors */ + xmlSchemaValidityWarningFunc warning; /* the callback in case of warning */ + xmlStructuredErrorFunc serror; + + xmlSchemaPtr schema; /* The schema in use */ + xmlDocPtr doc; + xmlParserInputBufferPtr input; + xmlCharEncoding enc; + xmlSAXHandlerPtr sax; + xmlParserCtxtPtr parserCtxt; + void *user_data; /* TODO: What is this for? */ + char *filename; + + int err; + int nberrors; + + xmlNodePtr node; + xmlNodePtr cur; + /* xmlSchemaTypePtr type; */ + + xmlRegExecCtxtPtr regexp; + xmlSchemaValPtr value; + + int valueWS; + int options; + xmlNodePtr validationRoot; + xmlSchemaParserCtxtPtr pctxt; + int xsiAssemble; + + int depth; + xmlSchemaNodeInfoPtr *elemInfos; /* array of element informations */ + int sizeElemInfos; + xmlSchemaNodeInfoPtr inode; /* the current element information */ + + xmlSchemaIDCAugPtr aidcs; /* a list of augmented IDC informations */ + + xmlSchemaIDCStateObjPtr xpathStates; /* first active state object. */ + xmlSchemaIDCStateObjPtr xpathStatePool; /* first stored state object. */ + xmlSchemaIDCMatcherPtr idcMatcherCache; /* Cache for IDC matcher objects. */ + + xmlSchemaPSVIIDCNodePtr *idcNodes; /* list of all IDC node-table entries*/ + int nbIdcNodes; + int sizeIdcNodes; + + xmlSchemaPSVIIDCKeyPtr *idcKeys; /* list of all IDC node-table entries */ + int nbIdcKeys; + int sizeIdcKeys; + + int flags; + + xmlDictPtr dict; + +#ifdef LIBXML_READER_ENABLED + xmlTextReaderPtr reader; +#endif + + xmlSchemaAttrInfoPtr *attrInfos; + int nbAttrInfos; + int sizeAttrInfos; + + int skipDepth; + xmlSchemaItemListPtr nodeQNames; + int hasKeyrefs; + int createIDCNodeTables; + int psviExposeIDCNodeTables; + + /* Locator for error reporting in streaming mode */ + xmlSchemaValidityLocatorFunc locFunc; + void *locCtxt; +}; + +/** + * xmlSchemaSubstGroup: + * + * + */ +typedef struct _xmlSchemaSubstGroup xmlSchemaSubstGroup; +typedef xmlSchemaSubstGroup *xmlSchemaSubstGroupPtr; +struct _xmlSchemaSubstGroup { + xmlSchemaElementPtr head; + xmlSchemaItemListPtr members; +}; + +/************************************************************************ + * * + * Some predeclarations * + * * + ************************************************************************/ + +static int xmlSchemaParseInclude(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaPtr schema, + xmlNodePtr node); +static int xmlSchemaParseRedefine(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaPtr schema, + xmlNodePtr node); +static int +xmlSchemaTypeFixup(xmlSchemaTypePtr type, + xmlSchemaAbstractCtxtPtr ctxt); +static const xmlChar * +xmlSchemaFacetTypeToString(xmlSchemaTypeType type); +static int +xmlSchemaParseImport(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, + xmlNodePtr node); +static int +xmlSchemaCheckFacetValues(xmlSchemaTypePtr typeDecl, + xmlSchemaParserCtxtPtr ctxt); +static void +xmlSchemaClearValidCtxt(xmlSchemaValidCtxtPtr vctxt); +static xmlSchemaWhitespaceValueType +xmlSchemaGetWhiteSpaceFacetValue(xmlSchemaTypePtr type); +static xmlSchemaTreeItemPtr +xmlSchemaParseModelGroup(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, + xmlNodePtr node, xmlSchemaTypeType type, + int withParticle); +static const xmlChar * +xmlSchemaGetComponentTypeStr(xmlSchemaBasicItemPtr item); +static xmlSchemaTypeLinkPtr +xmlSchemaGetUnionSimpleTypeMemberTypes(xmlSchemaTypePtr type); +static void +xmlSchemaInternalErr(xmlSchemaAbstractCtxtPtr actxt, + const char *funcName, + const char *message); +static int +xmlSchemaCheckCOSSTDerivedOK(xmlSchemaAbstractCtxtPtr ctxt, + xmlSchemaTypePtr type, + xmlSchemaTypePtr baseType, + int subset); +static void +xmlSchemaCheckElementDeclComponent(xmlSchemaElementPtr elemDecl, + xmlSchemaParserCtxtPtr ctxt); +static void +xmlSchemaComponentListFree(xmlSchemaItemListPtr list); +static xmlSchemaQNameRefPtr +xmlSchemaParseAttributeGroupRef(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaPtr schema, + xmlNodePtr node); + +/************************************************************************ + * * + * Helper functions * + * * + ************************************************************************/ + +/** + * xmlSchemaItemTypeToStr: + * @type: the type of the schema item + * + * Returns the component name of a schema item. + */ +static const xmlChar * +xmlSchemaItemTypeToStr(xmlSchemaTypeType type) +{ + switch (type) { + case XML_SCHEMA_TYPE_BASIC: + return(BAD_CAST "simple type definition"); + case XML_SCHEMA_TYPE_SIMPLE: + return(BAD_CAST "simple type definition"); + case XML_SCHEMA_TYPE_COMPLEX: + return(BAD_CAST "complex type definition"); + case XML_SCHEMA_TYPE_ELEMENT: + return(BAD_CAST "element declaration"); + case XML_SCHEMA_TYPE_ATTRIBUTE_USE: + return(BAD_CAST "attribute use"); + case XML_SCHEMA_TYPE_ATTRIBUTE: + return(BAD_CAST "attribute declaration"); + case XML_SCHEMA_TYPE_GROUP: + return(BAD_CAST "model group definition"); + case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: + return(BAD_CAST "attribute group definition"); + case XML_SCHEMA_TYPE_NOTATION: + return(BAD_CAST "notation declaration"); + case XML_SCHEMA_TYPE_SEQUENCE: + return(BAD_CAST "model group (sequence)"); + case XML_SCHEMA_TYPE_CHOICE: + return(BAD_CAST "model group (choice)"); + case XML_SCHEMA_TYPE_ALL: + return(BAD_CAST "model group (all)"); + case XML_SCHEMA_TYPE_PARTICLE: + return(BAD_CAST "particle"); + case XML_SCHEMA_TYPE_IDC_UNIQUE: + return(BAD_CAST "unique identity-constraint"); + /* return(BAD_CAST "IDC (unique)"); */ + case XML_SCHEMA_TYPE_IDC_KEY: + return(BAD_CAST "key identity-constraint"); + /* return(BAD_CAST "IDC (key)"); */ + case XML_SCHEMA_TYPE_IDC_KEYREF: + return(BAD_CAST "keyref identity-constraint"); + /* return(BAD_CAST "IDC (keyref)"); */ + case XML_SCHEMA_TYPE_ANY: + return(BAD_CAST "wildcard (any)"); + case XML_SCHEMA_EXTRA_QNAMEREF: + return(BAD_CAST "[helper component] QName reference"); + case XML_SCHEMA_EXTRA_ATTR_USE_PROHIB: + return(BAD_CAST "[helper component] attribute use prohibition"); + default: + return(BAD_CAST "Not a schema component"); + } +} + +/** + * xmlSchemaGetComponentTypeStr: + * @type: the type of the schema item + * + * Returns the component name of a schema item. + */ +static const xmlChar * +xmlSchemaGetComponentTypeStr(xmlSchemaBasicItemPtr item) +{ + switch (item->type) { + case XML_SCHEMA_TYPE_BASIC: + if (WXS_IS_COMPLEX(WXS_TYPE_CAST item)) + return(BAD_CAST "complex type definition"); + else + return(BAD_CAST "simple type definition"); + default: + return(xmlSchemaItemTypeToStr(item->type)); + } +} + +/** + * xmlSchemaGetComponentNode: + * @item: a schema component + * + * Returns node associated with the schema component. + * NOTE that such a node need not be available; plus, a component's + * node need not to reflect the component directly, since there is no + * one-to-one relationship between the XML Schema representation and + * the component representation. + */ +static xmlNodePtr +xmlSchemaGetComponentNode(xmlSchemaBasicItemPtr item) +{ + switch (item->type) { + case XML_SCHEMA_TYPE_ELEMENT: + return (((xmlSchemaElementPtr) item)->node); + case XML_SCHEMA_TYPE_ATTRIBUTE: + return (((xmlSchemaAttributePtr) item)->node); + case XML_SCHEMA_TYPE_COMPLEX: + case XML_SCHEMA_TYPE_SIMPLE: + return (((xmlSchemaTypePtr) item)->node); + case XML_SCHEMA_TYPE_ANY: + case XML_SCHEMA_TYPE_ANY_ATTRIBUTE: + return (((xmlSchemaWildcardPtr) item)->node); + case XML_SCHEMA_TYPE_PARTICLE: + return (((xmlSchemaParticlePtr) item)->node); + case XML_SCHEMA_TYPE_SEQUENCE: + case XML_SCHEMA_TYPE_CHOICE: + case XML_SCHEMA_TYPE_ALL: + return (((xmlSchemaModelGroupPtr) item)->node); + case XML_SCHEMA_TYPE_GROUP: + return (((xmlSchemaModelGroupDefPtr) item)->node); + case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: + return (((xmlSchemaAttributeGroupPtr) item)->node); + case XML_SCHEMA_TYPE_IDC_UNIQUE: + case XML_SCHEMA_TYPE_IDC_KEY: + case XML_SCHEMA_TYPE_IDC_KEYREF: + return (((xmlSchemaIDCPtr) item)->node); + case XML_SCHEMA_EXTRA_QNAMEREF: + return(((xmlSchemaQNameRefPtr) item)->node); + /* TODO: What to do with NOTATIONs? + case XML_SCHEMA_TYPE_NOTATION: + return (((xmlSchemaNotationPtr) item)->node); + */ + case XML_SCHEMA_TYPE_ATTRIBUTE_USE: + return (((xmlSchemaAttributeUsePtr) item)->node); + default: + return (NULL); + } +} + +#if 0 +/** + * xmlSchemaGetNextComponent: + * @item: a schema component + * + * Returns the next sibling of the schema component. + */ +static xmlSchemaBasicItemPtr +xmlSchemaGetNextComponent(xmlSchemaBasicItemPtr item) +{ + switch (item->type) { + case XML_SCHEMA_TYPE_ELEMENT: + return ((xmlSchemaBasicItemPtr) ((xmlSchemaElementPtr) item)->next); + case XML_SCHEMA_TYPE_ATTRIBUTE: + return ((xmlSchemaBasicItemPtr) ((xmlSchemaAttributePtr) item)->next); + case XML_SCHEMA_TYPE_COMPLEX: + case XML_SCHEMA_TYPE_SIMPLE: + return ((xmlSchemaBasicItemPtr) ((xmlSchemaTypePtr) item)->next); + case XML_SCHEMA_TYPE_ANY: + case XML_SCHEMA_TYPE_ANY_ATTRIBUTE: + return (NULL); + case XML_SCHEMA_TYPE_PARTICLE: + return ((xmlSchemaBasicItemPtr) ((xmlSchemaParticlePtr) item)->next); + case XML_SCHEMA_TYPE_SEQUENCE: + case XML_SCHEMA_TYPE_CHOICE: + case XML_SCHEMA_TYPE_ALL: + return (NULL); + case XML_SCHEMA_TYPE_GROUP: + return (NULL); + case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: + return ((xmlSchemaBasicItemPtr) ((xmlSchemaAttributeGroupPtr) item)->next); + case XML_SCHEMA_TYPE_IDC_UNIQUE: + case XML_SCHEMA_TYPE_IDC_KEY: + case XML_SCHEMA_TYPE_IDC_KEYREF: + return ((xmlSchemaBasicItemPtr) ((xmlSchemaIDCPtr) item)->next); + default: + return (NULL); + } +} +#endif + + +/** + * xmlSchemaFormatQName: + * @buf: the string buffer + * @namespaceName: the namespace name + * @localName: the local name + * + * Returns the given QName in the format "{namespaceName}localName" or + * just "localName" if @namespaceName is NULL. + * + * Returns the localName if @namespaceName is NULL, a formatted + * string otherwise. + */ +static const xmlChar* +xmlSchemaFormatQName(xmlChar **buf, + const xmlChar *namespaceName, + const xmlChar *localName) +{ + FREE_AND_NULL(*buf) + if (namespaceName != NULL) { + *buf = xmlStrdup(BAD_CAST "{"); + *buf = xmlStrcat(*buf, namespaceName); + *buf = xmlStrcat(*buf, BAD_CAST "}"); + } + if (localName != NULL) { + if (namespaceName == NULL) + return(localName); + *buf = xmlStrcat(*buf, localName); + } else { + *buf = xmlStrcat(*buf, BAD_CAST "(NULL)"); + } + return ((const xmlChar *) *buf); +} + +static const xmlChar* +xmlSchemaFormatQNameNs(xmlChar **buf, xmlNsPtr ns, const xmlChar *localName) +{ + if (ns != NULL) + return (xmlSchemaFormatQName(buf, ns->href, localName)); + else + return (xmlSchemaFormatQName(buf, NULL, localName)); +} + +static const xmlChar * +xmlSchemaGetComponentName(xmlSchemaBasicItemPtr item) +{ + switch (item->type) { + case XML_SCHEMA_TYPE_ELEMENT: + return (((xmlSchemaElementPtr) item)->name); + case XML_SCHEMA_TYPE_ATTRIBUTE: + return (((xmlSchemaAttributePtr) item)->name); + case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: + return (((xmlSchemaAttributeGroupPtr) item)->name); + case XML_SCHEMA_TYPE_BASIC: + case XML_SCHEMA_TYPE_SIMPLE: + case XML_SCHEMA_TYPE_COMPLEX: + return (((xmlSchemaTypePtr) item)->name); + case XML_SCHEMA_TYPE_GROUP: + return (((xmlSchemaModelGroupDefPtr) item)->name); + case XML_SCHEMA_TYPE_IDC_KEY: + case XML_SCHEMA_TYPE_IDC_UNIQUE: + case XML_SCHEMA_TYPE_IDC_KEYREF: + return (((xmlSchemaIDCPtr) item)->name); + case XML_SCHEMA_TYPE_ATTRIBUTE_USE: + if (WXS_ATTRUSE_DECL(item) != NULL) { + return(xmlSchemaGetComponentName( + WXS_BASIC_CAST WXS_ATTRUSE_DECL(item))); + } else + return(NULL); + case XML_SCHEMA_EXTRA_QNAMEREF: + return (((xmlSchemaQNameRefPtr) item)->name); + case XML_SCHEMA_TYPE_NOTATION: + return (((xmlSchemaNotationPtr) item)->name); + default: + /* + * Other components cannot have names. + */ + break; + } + return (NULL); +} + +#define xmlSchemaGetQNameRefName(r) (WXS_QNAME_CAST (r))->name +#define xmlSchemaGetQNameRefTargetNs(r) (WXS_QNAME_CAST (r))->targetNamespace +/* +static const xmlChar * +xmlSchemaGetQNameRefName(void *ref) +{ + return(((xmlSchemaQNameRefPtr) ref)->name); +} + +static const xmlChar * +xmlSchemaGetQNameRefTargetNs(void *ref) +{ + return(((xmlSchemaQNameRefPtr) ref)->targetNamespace); +} +*/ + +static const xmlChar * +xmlSchemaGetComponentTargetNs(xmlSchemaBasicItemPtr item) +{ + switch (item->type) { + case XML_SCHEMA_TYPE_ELEMENT: + return (((xmlSchemaElementPtr) item)->targetNamespace); + case XML_SCHEMA_TYPE_ATTRIBUTE: + return (((xmlSchemaAttributePtr) item)->targetNamespace); + case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: + return (((xmlSchemaAttributeGroupPtr) item)->targetNamespace); + case XML_SCHEMA_TYPE_BASIC: + return (BAD_CAST "http://www.w3.org/2001/XMLSchema"); + case XML_SCHEMA_TYPE_SIMPLE: + case XML_SCHEMA_TYPE_COMPLEX: + return (((xmlSchemaTypePtr) item)->targetNamespace); + case XML_SCHEMA_TYPE_GROUP: + return (((xmlSchemaModelGroupDefPtr) item)->targetNamespace); + case XML_SCHEMA_TYPE_IDC_KEY: + case XML_SCHEMA_TYPE_IDC_UNIQUE: + case XML_SCHEMA_TYPE_IDC_KEYREF: + return (((xmlSchemaIDCPtr) item)->targetNamespace); + case XML_SCHEMA_TYPE_ATTRIBUTE_USE: + if (WXS_ATTRUSE_DECL(item) != NULL) { + return(xmlSchemaGetComponentTargetNs( + WXS_BASIC_CAST WXS_ATTRUSE_DECL(item))); + } + /* TODO: Will returning NULL break something? */ + break; + case XML_SCHEMA_EXTRA_QNAMEREF: + return (((xmlSchemaQNameRefPtr) item)->targetNamespace); + case XML_SCHEMA_TYPE_NOTATION: + return (((xmlSchemaNotationPtr) item)->targetNamespace); + default: + /* + * Other components cannot have names. + */ + break; + } + return (NULL); +} + +static const xmlChar* +xmlSchemaGetComponentQName(xmlChar **buf, + void *item) +{ + return (xmlSchemaFormatQName(buf, + xmlSchemaGetComponentTargetNs((xmlSchemaBasicItemPtr) item), + xmlSchemaGetComponentName((xmlSchemaBasicItemPtr) item))); +} + +static const xmlChar* +xmlSchemaGetComponentDesignation(xmlChar **buf, void *item) +{ + xmlChar *str = NULL; + + *buf = xmlStrcat(*buf, WXS_ITEM_TYPE_NAME(item)); + *buf = xmlStrcat(*buf, BAD_CAST " '"); + *buf = xmlStrcat(*buf, xmlSchemaGetComponentQName(&str, + (xmlSchemaBasicItemPtr) item)); + *buf = xmlStrcat(*buf, BAD_CAST "'"); + FREE_AND_NULL(str); + return(*buf); +} + +static const xmlChar* +xmlSchemaGetIDCDesignation(xmlChar **buf, xmlSchemaIDCPtr idc) +{ + return(xmlSchemaGetComponentDesignation(buf, idc)); +} + +/** + * xmlSchemaWildcardPCToString: + * @pc: the type of processContents + * + * Returns a string representation of the type of + * processContents. + */ +static const xmlChar * +xmlSchemaWildcardPCToString(int pc) +{ + switch (pc) { + case XML_SCHEMAS_ANY_SKIP: + return (BAD_CAST "skip"); + case XML_SCHEMAS_ANY_LAX: + return (BAD_CAST "lax"); + case XML_SCHEMAS_ANY_STRICT: + return (BAD_CAST "strict"); + default: + return (BAD_CAST "invalid process contents"); + } +} + +/** + * xmlSchemaGetCanonValueWhtspExt: + * @val: the precomputed value + * @retValue: the returned value + * @ws: the whitespace type of the value + * + * Get a the cononical representation of the value. + * The caller has to free the returned retValue. + * + * Returns 0 if the value could be built and -1 in case of + * API errors or if the value type is not supported yet. + */ +static int +xmlSchemaGetCanonValueWhtspExt(xmlSchemaValPtr val, + xmlSchemaWhitespaceValueType ws, + xmlChar **retValue) +{ + int list; + xmlSchemaValType valType; + const xmlChar *value, *value2 = NULL; + + + if ((retValue == NULL) || (val == NULL)) + return (-1); + list = xmlSchemaValueGetNext(val) ? 1 : 0; + *retValue = NULL; + do { + value = NULL; + valType = xmlSchemaGetValType(val); + switch (valType) { + case XML_SCHEMAS_STRING: + case XML_SCHEMAS_NORMSTRING: + case XML_SCHEMAS_ANYSIMPLETYPE: + value = xmlSchemaValueGetAsString(val); + if (value != NULL) { + if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) + value2 = xmlSchemaCollapseString(value); + else if (ws == XML_SCHEMA_WHITESPACE_REPLACE) + value2 = xmlSchemaWhiteSpaceReplace(value); + if (value2 != NULL) + value = value2; + } + break; + default: + if (xmlSchemaGetCanonValue(val, &value2) == -1) { + if (value2 != NULL) + xmlFree((xmlChar *) value2); + goto internal_error; + } + value = value2; + } + if (*retValue == NULL) + if (value == NULL) { + if (! list) + *retValue = xmlStrdup(BAD_CAST ""); + } else + *retValue = xmlStrdup(value); + else if (value != NULL) { + /* List. */ + *retValue = xmlStrcat((xmlChar *) *retValue, BAD_CAST " "); + *retValue = xmlStrcat((xmlChar *) *retValue, value); + } + FREE_AND_NULL(value2) + val = xmlSchemaValueGetNext(val); + } while (val != NULL); + + return (0); +internal_error: + if (*retValue != NULL) + xmlFree((xmlChar *) (*retValue)); + if (value2 != NULL) + xmlFree((xmlChar *) value2); + return (-1); +} + +/** + * xmlSchemaFormatItemForReport: + * @buf: the string buffer + * @itemDes: the designation of the item + * @itemName: the name of the item + * @item: the item as an object + * @itemNode: the node of the item + * @local: the local name + * @parsing: if the function is used during the parse + * + * Returns a representation of the given item used + * for error reports. + * + * The following order is used to build the resulting + * designation if the arguments are not NULL: + * 1a. If itemDes not NULL -> itemDes + * 1b. If (itemDes not NULL) and (itemName not NULL) + * -> itemDes + itemName + * 2. If the preceding was NULL and (item not NULL) -> item + * 3. If the preceding was NULL and (itemNode not NULL) -> itemNode + * + * If the itemNode is an attribute node, the name of the attribute + * will be appended to the result. + * + * Returns the formatted string and sets @buf to the resulting value. + */ +static xmlChar* +xmlSchemaFormatItemForReport(xmlChar **buf, + const xmlChar *itemDes, + xmlSchemaBasicItemPtr item, + xmlNodePtr itemNode) +{ + xmlChar *str = NULL; + int named = 1; + + if (*buf != NULL) { + xmlFree(*buf); + *buf = NULL; + } + + if (itemDes != NULL) { + *buf = xmlStrdup(itemDes); + } else if (item != NULL) { + switch (item->type) { + case XML_SCHEMA_TYPE_BASIC: { + xmlSchemaTypePtr type = WXS_TYPE_CAST item; + + if (WXS_IS_ATOMIC(type)) + *buf = xmlStrdup(BAD_CAST "atomic type 'xs:"); + else if (WXS_IS_LIST(type)) + *buf = xmlStrdup(BAD_CAST "list type 'xs:"); + else if (WXS_IS_UNION(type)) + *buf = xmlStrdup(BAD_CAST "union type 'xs:"); + else + *buf = xmlStrdup(BAD_CAST "simple type 'xs:"); + *buf = xmlStrcat(*buf, type->name); + *buf = xmlStrcat(*buf, BAD_CAST "'"); + } + break; + case XML_SCHEMA_TYPE_SIMPLE: { + xmlSchemaTypePtr type = WXS_TYPE_CAST item; + + if (type->flags & XML_SCHEMAS_TYPE_GLOBAL) { + *buf = xmlStrdup(BAD_CAST""); + } else { + *buf = xmlStrdup(BAD_CAST "local "); + } + if (WXS_IS_ATOMIC(type)) + *buf = xmlStrcat(*buf, BAD_CAST "atomic type"); + else if (WXS_IS_LIST(type)) + *buf = xmlStrcat(*buf, BAD_CAST "list type"); + else if (WXS_IS_UNION(type)) + *buf = xmlStrcat(*buf, BAD_CAST "union type"); + else + *buf = xmlStrcat(*buf, BAD_CAST "simple type"); + if (type->flags & XML_SCHEMAS_TYPE_GLOBAL) { + *buf = xmlStrcat(*buf, BAD_CAST " '"); + *buf = xmlStrcat(*buf, type->name); + *buf = xmlStrcat(*buf, BAD_CAST "'"); + } + } + break; + case XML_SCHEMA_TYPE_COMPLEX: { + xmlSchemaTypePtr type = WXS_TYPE_CAST item; + + if (type->flags & XML_SCHEMAS_TYPE_GLOBAL) + *buf = xmlStrdup(BAD_CAST ""); + else + *buf = xmlStrdup(BAD_CAST "local "); + *buf = xmlStrcat(*buf, BAD_CAST "complex type"); + if (type->flags & XML_SCHEMAS_TYPE_GLOBAL) { + *buf = xmlStrcat(*buf, BAD_CAST " '"); + *buf = xmlStrcat(*buf, type->name); + *buf = xmlStrcat(*buf, BAD_CAST "'"); + } + } + break; + case XML_SCHEMA_TYPE_ATTRIBUTE_USE: { + xmlSchemaAttributeUsePtr ause; + + ause = WXS_ATTR_USE_CAST item; + *buf = xmlStrdup(BAD_CAST "attribute use "); + if (WXS_ATTRUSE_DECL(ause) != NULL) { + *buf = xmlStrcat(*buf, BAD_CAST "'"); + *buf = xmlStrcat(*buf, + xmlSchemaGetComponentQName(&str, WXS_ATTRUSE_DECL(ause))); + FREE_AND_NULL(str) + *buf = xmlStrcat(*buf, BAD_CAST "'"); + } else { + *buf = xmlStrcat(*buf, BAD_CAST "(unknown)"); + } + } + break; + case XML_SCHEMA_TYPE_ATTRIBUTE: { + xmlSchemaAttributePtr attr; + + attr = (xmlSchemaAttributePtr) item; + *buf = xmlStrdup(BAD_CAST "attribute decl."); + *buf = xmlStrcat(*buf, BAD_CAST " '"); + *buf = xmlStrcat(*buf, xmlSchemaFormatQName(&str, + attr->targetNamespace, attr->name)); + FREE_AND_NULL(str) + *buf = xmlStrcat(*buf, BAD_CAST "'"); + } + break; + case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: + xmlSchemaGetComponentDesignation(buf, item); + break; + case XML_SCHEMA_TYPE_ELEMENT: { + xmlSchemaElementPtr elem; + + elem = (xmlSchemaElementPtr) item; + *buf = xmlStrdup(BAD_CAST "element decl."); + *buf = xmlStrcat(*buf, BAD_CAST " '"); + *buf = xmlStrcat(*buf, xmlSchemaFormatQName(&str, + elem->targetNamespace, elem->name)); + *buf = xmlStrcat(*buf, BAD_CAST "'"); + } + break; + case XML_SCHEMA_TYPE_IDC_UNIQUE: + case XML_SCHEMA_TYPE_IDC_KEY: + case XML_SCHEMA_TYPE_IDC_KEYREF: + if (item->type == XML_SCHEMA_TYPE_IDC_UNIQUE) + *buf = xmlStrdup(BAD_CAST "unique '"); + else if (item->type == XML_SCHEMA_TYPE_IDC_KEY) + *buf = xmlStrdup(BAD_CAST "key '"); + else + *buf = xmlStrdup(BAD_CAST "keyRef '"); + *buf = xmlStrcat(*buf, ((xmlSchemaIDCPtr) item)->name); + *buf = xmlStrcat(*buf, BAD_CAST "'"); + break; + case XML_SCHEMA_TYPE_ANY: + case XML_SCHEMA_TYPE_ANY_ATTRIBUTE: + *buf = xmlStrdup(xmlSchemaWildcardPCToString( + ((xmlSchemaWildcardPtr) item)->processContents)); + *buf = xmlStrcat(*buf, BAD_CAST " wildcard"); + break; + case XML_SCHEMA_FACET_MININCLUSIVE: + case XML_SCHEMA_FACET_MINEXCLUSIVE: + case XML_SCHEMA_FACET_MAXINCLUSIVE: + case XML_SCHEMA_FACET_MAXEXCLUSIVE: + case XML_SCHEMA_FACET_TOTALDIGITS: + case XML_SCHEMA_FACET_FRACTIONDIGITS: + case XML_SCHEMA_FACET_PATTERN: + case XML_SCHEMA_FACET_ENUMERATION: + case XML_SCHEMA_FACET_WHITESPACE: + case XML_SCHEMA_FACET_LENGTH: + case XML_SCHEMA_FACET_MAXLENGTH: + case XML_SCHEMA_FACET_MINLENGTH: + *buf = xmlStrdup(BAD_CAST "facet '"); + *buf = xmlStrcat(*buf, xmlSchemaFacetTypeToString(item->type)); + *buf = xmlStrcat(*buf, BAD_CAST "'"); + break; + case XML_SCHEMA_TYPE_GROUP: { + *buf = xmlStrdup(BAD_CAST "model group def."); + *buf = xmlStrcat(*buf, BAD_CAST " '"); + *buf = xmlStrcat(*buf, xmlSchemaGetComponentQName(&str, item)); + *buf = xmlStrcat(*buf, BAD_CAST "'"); + FREE_AND_NULL(str) + } + break; + case XML_SCHEMA_TYPE_SEQUENCE: + case XML_SCHEMA_TYPE_CHOICE: + case XML_SCHEMA_TYPE_ALL: + case XML_SCHEMA_TYPE_PARTICLE: + *buf = xmlStrdup(WXS_ITEM_TYPE_NAME(item)); + break; + case XML_SCHEMA_TYPE_NOTATION: { + *buf = xmlStrdup(WXS_ITEM_TYPE_NAME(item)); + *buf = xmlStrcat(*buf, BAD_CAST " '"); + *buf = xmlStrcat(*buf, xmlSchemaGetComponentQName(&str, item)); + *buf = xmlStrcat(*buf, BAD_CAST "'"); + FREE_AND_NULL(str); + } + default: + named = 0; + } + } else + named = 0; + + if ((named == 0) && (itemNode != NULL)) { + xmlNodePtr elem; + + if (itemNode->type == XML_ATTRIBUTE_NODE) + elem = itemNode->parent; + else + elem = itemNode; + *buf = xmlStrdup(BAD_CAST "Element '"); + if (elem->ns != NULL) { + *buf = xmlStrcat(*buf, + xmlSchemaFormatQName(&str, elem->ns->href, elem->name)); + FREE_AND_NULL(str) + } else + *buf = xmlStrcat(*buf, elem->name); + *buf = xmlStrcat(*buf, BAD_CAST "'"); + + } + if ((itemNode != NULL) && (itemNode->type == XML_ATTRIBUTE_NODE)) { + *buf = xmlStrcat(*buf, BAD_CAST ", attribute '"); + if (itemNode->ns != NULL) { + *buf = xmlStrcat(*buf, xmlSchemaFormatQName(&str, + itemNode->ns->href, itemNode->name)); + FREE_AND_NULL(str) + } else + *buf = xmlStrcat(*buf, itemNode->name); + *buf = xmlStrcat(*buf, BAD_CAST "'"); + } + FREE_AND_NULL(str) + + return (*buf); +} + +/** + * xmlSchemaFormatFacetEnumSet: + * @buf: the string buffer + * @type: the type holding the enumeration facets + * + * Builds a string consisting of all enumeration elements. + * + * Returns a string of all enumeration elements. + */ +static const xmlChar * +xmlSchemaFormatFacetEnumSet(xmlSchemaAbstractCtxtPtr actxt, + xmlChar **buf, xmlSchemaTypePtr type) +{ + xmlSchemaFacetPtr facet; + xmlSchemaWhitespaceValueType ws; + xmlChar *value = NULL; + int res, found = 0; + + if (*buf != NULL) + xmlFree(*buf); + *buf = NULL; + + do { + /* + * Use the whitespace type of the base type. + */ + ws = xmlSchemaGetWhiteSpaceFacetValue(type->baseType); + for (facet = type->facets; facet != NULL; facet = facet->next) { + if (facet->type != XML_SCHEMA_FACET_ENUMERATION) + continue; + found = 1; + res = xmlSchemaGetCanonValueWhtspExt(facet->val, + ws, &value); + if (res == -1) { + xmlSchemaInternalErr(actxt, + "xmlSchemaFormatFacetEnumSet", + "compute the canonical lexical representation"); + if (*buf != NULL) + xmlFree(*buf); + *buf = NULL; + return (NULL); + } + if (*buf == NULL) + *buf = xmlStrdup(BAD_CAST "'"); + else + *buf = xmlStrcat(*buf, BAD_CAST ", '"); + *buf = xmlStrcat(*buf, BAD_CAST value); + *buf = xmlStrcat(*buf, BAD_CAST "'"); + if (value != NULL) { + xmlFree((xmlChar *)value); + value = NULL; + } + } + /* + * The enumeration facet of a type restricts the enumeration + * facet of the ancestor type; i.e., such restricted enumerations + * do not belong to the set of the given type. Thus we break + * on the first found enumeration. + */ + if (found) + break; + type = type->baseType; + } while ((type != NULL) && (type->type != XML_SCHEMA_TYPE_BASIC)); + + return ((const xmlChar *) *buf); +} + +/************************************************************************ + * * + * Error functions * + * * + ************************************************************************/ + +#if 0 +static void +xmlSchemaErrMemory(const char *msg) +{ + __xmlSimpleError(XML_FROM_SCHEMASP, XML_ERR_NO_MEMORY, NULL, NULL, + msg); +} +#endif + +static void +xmlSchemaPSimpleErr(const char *msg) +{ + __xmlSimpleError(XML_FROM_SCHEMASP, XML_ERR_NO_MEMORY, NULL, NULL, + msg); +} + +/** + * xmlSchemaPErrMemory: + * @node: a context node + * @extra: extra informations + * + * Handle an out of memory condition + */ +static void +xmlSchemaPErrMemory(xmlSchemaParserCtxtPtr ctxt, + const char *extra, xmlNodePtr node) +{ + if (ctxt != NULL) + ctxt->nberrors++; + __xmlSimpleError(XML_FROM_SCHEMASP, XML_ERR_NO_MEMORY, node, NULL, + extra); +} + +/** + * xmlSchemaPErr: + * @ctxt: the parsing context + * @node: the context node + * @error: the error code + * @msg: the error message + * @str1: extra data + * @str2: extra data + * + * Handle a parser error + */ +static void +xmlSchemaPErr(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node, int error, + const char *msg, const xmlChar * str1, const xmlChar * str2) +{ + xmlGenericErrorFunc channel = NULL; + xmlStructuredErrorFunc schannel = NULL; + void *data = NULL; + + if (ctxt != NULL) { + ctxt->nberrors++; + ctxt->err = error; + channel = ctxt->error; + data = ctxt->errCtxt; + schannel = ctxt->serror; + } + __xmlRaiseError(schannel, channel, data, ctxt, node, XML_FROM_SCHEMASP, + error, XML_ERR_ERROR, NULL, 0, + (const char *) str1, (const char *) str2, NULL, 0, 0, + msg, str1, str2); +} + +/** + * xmlSchemaPErr2: + * @ctxt: the parsing context + * @node: the context node + * @node: the current child + * @error: the error code + * @msg: the error message + * @str1: extra data + * @str2: extra data + * + * Handle a parser error + */ +static void +xmlSchemaPErr2(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node, + xmlNodePtr child, int error, + const char *msg, const xmlChar * str1, const xmlChar * str2) +{ + if (child != NULL) + xmlSchemaPErr(ctxt, child, error, msg, str1, str2); + else + xmlSchemaPErr(ctxt, node, error, msg, str1, str2); +} + + +/** + * xmlSchemaPErrExt: + * @ctxt: the parsing context + * @node: the context node + * @error: the error code + * @strData1: extra data + * @strData2: extra data + * @strData3: extra data + * @msg: the message + * @str1: extra parameter for the message display + * @str2: extra parameter for the message display + * @str3: extra parameter for the message display + * @str4: extra parameter for the message display + * @str5: extra parameter for the message display + * + * Handle a parser error + */ +static void +xmlSchemaPErrExt(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node, int error, + const xmlChar * strData1, const xmlChar * strData2, + const xmlChar * strData3, const char *msg, const xmlChar * str1, + const xmlChar * str2, const xmlChar * str3, const xmlChar * str4, + const xmlChar * str5) +{ + + xmlGenericErrorFunc channel = NULL; + xmlStructuredErrorFunc schannel = NULL; + void *data = NULL; + + if (ctxt != NULL) { + ctxt->nberrors++; + ctxt->err = error; + channel = ctxt->error; + data = ctxt->errCtxt; + schannel = ctxt->serror; + } + __xmlRaiseError(schannel, channel, data, ctxt, node, XML_FROM_SCHEMASP, + error, XML_ERR_ERROR, NULL, 0, + (const char *) strData1, (const char *) strData2, + (const char *) strData3, 0, 0, msg, str1, str2, + str3, str4, str5); +} + +/************************************************************************ + * * + * Allround error functions * + * * + ************************************************************************/ + +/** + * xmlSchemaVTypeErrMemory: + * @node: a context node + * @extra: extra informations + * + * Handle an out of memory condition + */ +static void +xmlSchemaVErrMemory(xmlSchemaValidCtxtPtr ctxt, + const char *extra, xmlNodePtr node) +{ + if (ctxt != NULL) { + ctxt->nberrors++; + ctxt->err = XML_SCHEMAV_INTERNAL; + } + __xmlSimpleError(XML_FROM_SCHEMASV, XML_ERR_NO_MEMORY, node, NULL, + extra); +} + +static void +xmlSchemaPSimpleInternalErr(xmlNodePtr node, + const char *msg, const xmlChar *str) +{ + __xmlSimpleError(XML_FROM_SCHEMASP, XML_SCHEMAP_INTERNAL, node, + msg, (const char *) str); +} + +#define WXS_ERROR_TYPE_ERROR 1 +#define WXS_ERROR_TYPE_WARNING 2 +/** + * xmlSchemaErr3: + * @ctxt: the validation context + * @node: the context node + * @error: the error code + * @msg: the error message + * @str1: extra data + * @str2: extra data + * @str3: extra data + * + * Handle a validation error + */ +static void +xmlSchemaErr4Line(xmlSchemaAbstractCtxtPtr ctxt, + xmlErrorLevel errorLevel, + int error, xmlNodePtr node, int line, const char *msg, + const xmlChar *str1, const xmlChar *str2, + const xmlChar *str3, const xmlChar *str4) +{ + xmlStructuredErrorFunc schannel = NULL; + xmlGenericErrorFunc channel = NULL; + void *data = NULL; + + if (ctxt != NULL) { + if (ctxt->type == XML_SCHEMA_CTXT_VALIDATOR) { + xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctxt; + const char *file = NULL; + if (errorLevel != XML_ERR_WARNING) { + vctxt->nberrors++; + vctxt->err = error; + channel = vctxt->error; + } else { + channel = vctxt->warning; + } + schannel = vctxt->serror; + data = vctxt->errCtxt; + + /* + * Error node. If we specify a line number, then + * do not channel any node to the error function. + */ + if (line == 0) { + if ((node == NULL) && + (vctxt->depth >= 0) && + (vctxt->inode != NULL)) { + node = vctxt->inode->node; + } + /* + * Get filename and line if no node-tree. + */ + if ((node == NULL) && + (vctxt->parserCtxt != NULL) && + (vctxt->parserCtxt->input != NULL)) { + file = vctxt->parserCtxt->input->filename; + line = vctxt->parserCtxt->input->line; + } + } else { + /* + * Override the given node's (if any) position + * and channel only the given line number. + */ + node = NULL; + /* + * Get filename. + */ + if (vctxt->doc != NULL) + file = (const char *) vctxt->doc->URL; + else if ((vctxt->parserCtxt != NULL) && + (vctxt->parserCtxt->input != NULL)) + file = vctxt->parserCtxt->input->filename; + } + if (vctxt->locFunc != NULL) { + if ((file == NULL) || (line == 0)) { + unsigned long l; + const char *f; + vctxt->locFunc(vctxt->locCtxt, &f, &l); + if (file == NULL) + file = f; + if (line == 0) + line = (int) l; + } + } + if ((file == NULL) && (vctxt->filename != NULL)) + file = vctxt->filename; + + __xmlRaiseError(schannel, channel, data, ctxt, + node, XML_FROM_SCHEMASV, + error, errorLevel, file, line, + (const char *) str1, (const char *) str2, + (const char *) str3, 0, 0, msg, str1, str2, str3, str4); + + } else if (ctxt->type == XML_SCHEMA_CTXT_PARSER) { + xmlSchemaParserCtxtPtr pctxt = (xmlSchemaParserCtxtPtr) ctxt; + if (errorLevel != XML_ERR_WARNING) { + pctxt->nberrors++; + pctxt->err = error; + channel = pctxt->error; + } else { + channel = pctxt->warning; + } + schannel = pctxt->serror; + data = pctxt->errCtxt; + __xmlRaiseError(schannel, channel, data, ctxt, + node, XML_FROM_SCHEMASP, error, + errorLevel, NULL, 0, + (const char *) str1, (const char *) str2, + (const char *) str3, 0, 0, msg, str1, str2, str3, str4); + } else { + TODO + } + } +} + +/** + * xmlSchemaErr3: + * @ctxt: the validation context + * @node: the context node + * @error: the error code + * @msg: the error message + * @str1: extra data + * @str2: extra data + * @str3: extra data + * + * Handle a validation error + */ +static void +xmlSchemaErr3(xmlSchemaAbstractCtxtPtr actxt, + int error, xmlNodePtr node, const char *msg, + const xmlChar *str1, const xmlChar *str2, const xmlChar *str3) +{ + xmlSchemaErr4Line(actxt, XML_ERR_ERROR, error, node, 0, + msg, str1, str2, str3, NULL); +} + +static void +xmlSchemaErr4(xmlSchemaAbstractCtxtPtr actxt, + int error, xmlNodePtr node, const char *msg, + const xmlChar *str1, const xmlChar *str2, + const xmlChar *str3, const xmlChar *str4) +{ + xmlSchemaErr4Line(actxt, XML_ERR_ERROR, error, node, 0, + msg, str1, str2, str3, str4); +} + +static void +xmlSchemaErr(xmlSchemaAbstractCtxtPtr actxt, + int error, xmlNodePtr node, const char *msg, + const xmlChar *str1, const xmlChar *str2) +{ + xmlSchemaErr4(actxt, error, node, msg, str1, str2, NULL, NULL); +} + +static xmlChar * +xmlSchemaFormatNodeForError(xmlChar ** msg, + xmlSchemaAbstractCtxtPtr actxt, + xmlNodePtr node) +{ + xmlChar *str = NULL; + + *msg = NULL; + if ((node != NULL) && + (node->type != XML_ELEMENT_NODE) && + (node->type != XML_ATTRIBUTE_NODE)) + { + /* + * Don't try to format other nodes than element and + * attribute nodes. + * Play save and return an empty string. + */ + *msg = xmlStrdup(BAD_CAST ""); + return(*msg); + } + if (node != NULL) { + /* + * Work on tree nodes. + */ + if (node->type == XML_ATTRIBUTE_NODE) { + xmlNodePtr elem = node->parent; + + *msg = xmlStrdup(BAD_CAST "Element '"); + if (elem->ns != NULL) + *msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str, + elem->ns->href, elem->name)); + else + *msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str, + NULL, elem->name)); + FREE_AND_NULL(str); + *msg = xmlStrcat(*msg, BAD_CAST "', "); + *msg = xmlStrcat(*msg, BAD_CAST "attribute '"); + } else { + *msg = xmlStrdup(BAD_CAST "Element '"); + } + if (node->ns != NULL) + *msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str, + node->ns->href, node->name)); + else + *msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str, + NULL, node->name)); + FREE_AND_NULL(str); + *msg = xmlStrcat(*msg, BAD_CAST "': "); + } else if (actxt->type == XML_SCHEMA_CTXT_VALIDATOR) { + xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) actxt; + /* + * Work on node infos. + */ + if (vctxt->inode->nodeType == XML_ATTRIBUTE_NODE) { + xmlSchemaNodeInfoPtr ielem = + vctxt->elemInfos[vctxt->depth]; + + *msg = xmlStrdup(BAD_CAST "Element '"); + *msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str, + ielem->nsName, ielem->localName)); + FREE_AND_NULL(str); + *msg = xmlStrcat(*msg, BAD_CAST "', "); + *msg = xmlStrcat(*msg, BAD_CAST "attribute '"); + } else { + *msg = xmlStrdup(BAD_CAST "Element '"); + } + *msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str, + vctxt->inode->nsName, vctxt->inode->localName)); + FREE_AND_NULL(str); + *msg = xmlStrcat(*msg, BAD_CAST "': "); + } else if (actxt->type == XML_SCHEMA_CTXT_PARSER) { + /* + * Hmm, no node while parsing? + * Return an empty string, in case NULL will break something. + */ + *msg = xmlStrdup(BAD_CAST ""); + } else { + TODO + return (NULL); + } + /* + * VAL TODO: The output of the given schema component is currently + * disabled. + */ +#if 0 + if ((type != NULL) && (xmlSchemaIsGlobalItem(type))) { + *msg = xmlStrcat(*msg, BAD_CAST " ["); + *msg = xmlStrcat(*msg, xmlSchemaFormatItemForReport(&str, + NULL, type, NULL, 0)); + FREE_AND_NULL(str) + *msg = xmlStrcat(*msg, BAD_CAST "]"); + } +#endif + return (*msg); +} + +static void +xmlSchemaInternalErr2(xmlSchemaAbstractCtxtPtr actxt, + const char *funcName, + const char *message, + const xmlChar *str1, + const xmlChar *str2) +{ + xmlChar *msg = NULL; + + if (actxt == NULL) + return; + msg = xmlStrdup(BAD_CAST "Internal error: "); + msg = xmlStrcat(msg, BAD_CAST funcName); + msg = xmlStrcat(msg, BAD_CAST ", "); + msg = xmlStrcat(msg, BAD_CAST message); + msg = xmlStrcat(msg, BAD_CAST ".\n"); + + if (actxt->type == XML_SCHEMA_CTXT_VALIDATOR) + xmlSchemaErr(actxt, XML_SCHEMAV_INTERNAL, NULL, + (const char *) msg, str1, str2); + + else if (actxt->type == XML_SCHEMA_CTXT_PARSER) + xmlSchemaErr(actxt, XML_SCHEMAP_INTERNAL, NULL, + (const char *) msg, str1, str2); + + FREE_AND_NULL(msg) +} + +static void +xmlSchemaInternalErr(xmlSchemaAbstractCtxtPtr actxt, + const char *funcName, + const char *message) +{ + xmlSchemaInternalErr2(actxt, funcName, message, NULL, NULL); +} + +#if 0 +static void +xmlSchemaPInternalErr(xmlSchemaParserCtxtPtr pctxt, + const char *funcName, + const char *message, + const xmlChar *str1, + const xmlChar *str2) +{ + xmlSchemaInternalErr2(ACTXT_CAST pctxt, funcName, message, + str1, str2); +} +#endif + +static void +xmlSchemaCustomErr4(xmlSchemaAbstractCtxtPtr actxt, + xmlParserErrors error, + xmlNodePtr node, + xmlSchemaBasicItemPtr item, + const char *message, + const xmlChar *str1, const xmlChar *str2, + const xmlChar *str3, const xmlChar *str4) +{ + xmlChar *msg = NULL; + + if ((node == NULL) && (item != NULL) && + (actxt->type == XML_SCHEMA_CTXT_PARSER)) { + node = WXS_ITEM_NODE(item); + xmlSchemaFormatItemForReport(&msg, NULL, item, NULL); + msg = xmlStrcat(msg, BAD_CAST ": "); + } else + xmlSchemaFormatNodeForError(&msg, actxt, node); + msg = xmlStrcat(msg, (const xmlChar *) message); + msg = xmlStrcat(msg, BAD_CAST ".\n"); + xmlSchemaErr4(actxt, error, node, + (const char *) msg, str1, str2, str3, str4); + FREE_AND_NULL(msg) +} + +static void +xmlSchemaCustomErr(xmlSchemaAbstractCtxtPtr actxt, + xmlParserErrors error, + xmlNodePtr node, + xmlSchemaBasicItemPtr item, + const char *message, + const xmlChar *str1, + const xmlChar *str2) +{ + xmlSchemaCustomErr4(actxt, error, node, item, + message, str1, str2, NULL, NULL); +} + + + +static void +xmlSchemaCustomWarning(xmlSchemaAbstractCtxtPtr actxt, + xmlParserErrors error, + xmlNodePtr node, + xmlSchemaTypePtr type ATTRIBUTE_UNUSED, + const char *message, + const xmlChar *str1, + const xmlChar *str2, + const xmlChar *str3) +{ + xmlChar *msg = NULL; + + xmlSchemaFormatNodeForError(&msg, actxt, node); + msg = xmlStrcat(msg, (const xmlChar *) message); + msg = xmlStrcat(msg, BAD_CAST ".\n"); + + /* URGENT TODO: Set the error code to something sane. */ + xmlSchemaErr4Line(actxt, XML_ERR_WARNING, error, node, 0, + (const char *) msg, str1, str2, str3, NULL); + + FREE_AND_NULL(msg) +} + + + +static void +xmlSchemaKeyrefErr(xmlSchemaValidCtxtPtr vctxt, + xmlParserErrors error, + xmlSchemaPSVIIDCNodePtr idcNode, + xmlSchemaTypePtr type ATTRIBUTE_UNUSED, + const char *message, + const xmlChar *str1, + const xmlChar *str2) +{ + xmlChar *msg = NULL, *qname = NULL; + + msg = xmlStrdup(BAD_CAST "Element '%s': "); + msg = xmlStrcat(msg, (const xmlChar *) message); + msg = xmlStrcat(msg, BAD_CAST ".\n"); + xmlSchemaErr4Line(ACTXT_CAST vctxt, XML_ERR_ERROR, + error, NULL, idcNode->nodeLine, (const char *) msg, + xmlSchemaFormatQName(&qname, + vctxt->nodeQNames->items[idcNode->nodeQNameID +1], + vctxt->nodeQNames->items[idcNode->nodeQNameID]), + str1, str2, NULL); + FREE_AND_NULL(qname); + FREE_AND_NULL(msg); +} + +static int +xmlSchemaEvalErrorNodeType(xmlSchemaAbstractCtxtPtr actxt, + xmlNodePtr node) +{ + if (node != NULL) + return (node->type); + if ((actxt->type == XML_SCHEMA_CTXT_VALIDATOR) && + (((xmlSchemaValidCtxtPtr) actxt)->inode != NULL)) + return ( ((xmlSchemaValidCtxtPtr) actxt)->inode->nodeType); + return (-1); +} + +static int +xmlSchemaIsGlobalItem(xmlSchemaTypePtr item) +{ + switch (item->type) { + case XML_SCHEMA_TYPE_COMPLEX: + case XML_SCHEMA_TYPE_SIMPLE: + if (item->flags & XML_SCHEMAS_TYPE_GLOBAL) + return(1); + break; + case XML_SCHEMA_TYPE_GROUP: + return (1); + case XML_SCHEMA_TYPE_ELEMENT: + if ( ((xmlSchemaElementPtr) item)->flags & + XML_SCHEMAS_ELEM_GLOBAL) + return(1); + break; + case XML_SCHEMA_TYPE_ATTRIBUTE: + if ( ((xmlSchemaAttributePtr) item)->flags & + XML_SCHEMAS_ATTR_GLOBAL) + return(1); + break; + /* Note that attribute groups are always global. */ + default: + return(1); + } + return (0); +} + +static void +xmlSchemaSimpleTypeErr(xmlSchemaAbstractCtxtPtr actxt, + xmlParserErrors error, + xmlNodePtr node, + const xmlChar *value, + xmlSchemaTypePtr type, + int displayValue) +{ + xmlChar *msg = NULL; + + xmlSchemaFormatNodeForError(&msg, actxt, node); + + if (displayValue || (xmlSchemaEvalErrorNodeType(actxt, node) == + XML_ATTRIBUTE_NODE)) + msg = xmlStrcat(msg, BAD_CAST "'%s' is not a valid value of "); + else + msg = xmlStrcat(msg, BAD_CAST "The character content is not a valid " + "value of "); + + if (! xmlSchemaIsGlobalItem(type)) + msg = xmlStrcat(msg, BAD_CAST "the local "); + else + msg = xmlStrcat(msg, BAD_CAST "the "); + + if (WXS_IS_ATOMIC(type)) + msg = xmlStrcat(msg, BAD_CAST "atomic type"); + else if (WXS_IS_LIST(type)) + msg = xmlStrcat(msg, BAD_CAST "list type"); + else if (WXS_IS_UNION(type)) + msg = xmlStrcat(msg, BAD_CAST "union type"); + + if (xmlSchemaIsGlobalItem(type)) { + xmlChar *str = NULL; + msg = xmlStrcat(msg, BAD_CAST " '"); + if (type->builtInType != 0) { + msg = xmlStrcat(msg, BAD_CAST "xs:"); + msg = xmlStrcat(msg, type->name); + } else + msg = xmlStrcat(msg, + xmlSchemaFormatQName(&str, + type->targetNamespace, type->name)); + msg = xmlStrcat(msg, BAD_CAST "'"); + FREE_AND_NULL(str); + } + msg = xmlStrcat(msg, BAD_CAST ".\n"); + if (displayValue || (xmlSchemaEvalErrorNodeType(actxt, node) == + XML_ATTRIBUTE_NODE)) + xmlSchemaErr(actxt, error, node, (const char *) msg, value, NULL); + else + xmlSchemaErr(actxt, error, node, (const char *) msg, NULL, NULL); + FREE_AND_NULL(msg) +} + +static const xmlChar * +xmlSchemaFormatErrorNodeQName(xmlChar ** str, + xmlSchemaNodeInfoPtr ni, + xmlNodePtr node) +{ + if (node != NULL) { + if (node->ns != NULL) + return (xmlSchemaFormatQName(str, node->ns->href, node->name)); + else + return (xmlSchemaFormatQName(str, NULL, node->name)); + } else if (ni != NULL) + return (xmlSchemaFormatQName(str, ni->nsName, ni->localName)); + return (NULL); +} + +static void +xmlSchemaIllegalAttrErr(xmlSchemaAbstractCtxtPtr actxt, + xmlParserErrors error, + xmlSchemaAttrInfoPtr ni, + xmlNodePtr node) +{ + xmlChar *msg = NULL, *str = NULL; + + xmlSchemaFormatNodeForError(&msg, actxt, node); + msg = xmlStrcat(msg, BAD_CAST "The attribute '%s' is not allowed.\n"); + xmlSchemaErr(actxt, error, node, (const char *) msg, + xmlSchemaFormatErrorNodeQName(&str, (xmlSchemaNodeInfoPtr) ni, node), + NULL); + FREE_AND_NULL(str) + FREE_AND_NULL(msg) +} + +static void +xmlSchemaComplexTypeErr(xmlSchemaAbstractCtxtPtr actxt, + xmlParserErrors error, + xmlNodePtr node, + xmlSchemaTypePtr type ATTRIBUTE_UNUSED, + const char *message, + int nbval, + int nbneg, + xmlChar **values) +{ + xmlChar *str = NULL, *msg = NULL; + xmlChar *localName, *nsName; + const xmlChar *cur, *end; + int i; + + xmlSchemaFormatNodeForError(&msg, actxt, node); + msg = xmlStrcat(msg, (const xmlChar *) message); + msg = xmlStrcat(msg, BAD_CAST "."); + /* + * Note that is does not make sense to report that we have a + * wildcard here, since the wildcard might be unfolded into + * multiple transitions. + */ + if (nbval + nbneg > 0) { + if (nbval + nbneg > 1) { + str = xmlStrdup(BAD_CAST " Expected is one of ( "); + } else + str = xmlStrdup(BAD_CAST " Expected is ( "); + nsName = NULL; + + for (i = 0; i < nbval + nbneg; i++) { + cur = values[i]; + if (cur == NULL) + continue; + if ((cur[0] == 'n') && (cur[1] == 'o') && (cur[2] == 't') && + (cur[3] == ' ')) { + cur += 4; + str = xmlStrcat(str, BAD_CAST "##other"); + } + /* + * Get the local name. + */ + localName = NULL; + + end = cur; + if (*end == '*') { + localName = xmlStrdup(BAD_CAST "*"); + end++; + } else { + while ((*end != 0) && (*end != '|')) + end++; + localName = xmlStrncat(localName, BAD_CAST cur, end - cur); + } + if (*end != 0) { + end++; + /* + * Skip "*|*" if they come with negated expressions, since + * they represent the same negated wildcard. + */ + if ((nbneg == 0) || (*end != '*') || (*localName != '*')) { + /* + * Get the namespace name. + */ + cur = end; + if (*end == '*') { + nsName = xmlStrdup(BAD_CAST "{*}"); + } else { + while (*end != 0) + end++; + + if (i >= nbval) + nsName = xmlStrdup(BAD_CAST "{##other:"); + else + nsName = xmlStrdup(BAD_CAST "{"); + + nsName = xmlStrncat(nsName, BAD_CAST cur, end - cur); + nsName = xmlStrcat(nsName, BAD_CAST "}"); + } + str = xmlStrcat(str, BAD_CAST nsName); + FREE_AND_NULL(nsName) + } else { + FREE_AND_NULL(localName); + continue; + } + } + str = xmlStrcat(str, BAD_CAST localName); + FREE_AND_NULL(localName); + + if (i < nbval + nbneg -1) + str = xmlStrcat(str, BAD_CAST ", "); + } + str = xmlStrcat(str, BAD_CAST " ).\n"); + msg = xmlStrcat(msg, BAD_CAST str); + FREE_AND_NULL(str) + } else + msg = xmlStrcat(msg, BAD_CAST "\n"); + xmlSchemaErr(actxt, error, node, (const char *) msg, NULL, NULL); + xmlFree(msg); +} + +static void +xmlSchemaFacetErr(xmlSchemaAbstractCtxtPtr actxt, + xmlParserErrors error, + xmlNodePtr node, + const xmlChar *value, + unsigned long length, + xmlSchemaTypePtr type, + xmlSchemaFacetPtr facet, + const char *message, + const xmlChar *str1, + const xmlChar *str2) +{ + xmlChar *str = NULL, *msg = NULL; + xmlSchemaTypeType facetType; + int nodeType = xmlSchemaEvalErrorNodeType(actxt, node); + + xmlSchemaFormatNodeForError(&msg, actxt, node); + if (error == XML_SCHEMAV_CVC_ENUMERATION_VALID) { + facetType = XML_SCHEMA_FACET_ENUMERATION; + /* + * If enumerations are validated, one must not expect the + * facet to be given. + */ + } else + facetType = facet->type; + msg = xmlStrcat(msg, BAD_CAST "["); + msg = xmlStrcat(msg, BAD_CAST "facet '"); + msg = xmlStrcat(msg, xmlSchemaFacetTypeToString(facetType)); + msg = xmlStrcat(msg, BAD_CAST "'] "); + if (message == NULL) { + /* + * Use a default message. + */ + if ((facetType == XML_SCHEMA_FACET_LENGTH) || + (facetType == XML_SCHEMA_FACET_MINLENGTH) || + (facetType == XML_SCHEMA_FACET_MAXLENGTH)) { + + char len[25], actLen[25]; + + /* FIXME, TODO: What is the max expected string length of the + * this value? + */ + if (nodeType == XML_ATTRIBUTE_NODE) + msg = xmlStrcat(msg, BAD_CAST "The value '%s' has a length of '%s'; "); + else + msg = xmlStrcat(msg, BAD_CAST "The value has a length of '%s'; "); + + snprintf(len, 24, "%lu", xmlSchemaGetFacetValueAsULong(facet)); + snprintf(actLen, 24, "%lu", length); + + if (facetType == XML_SCHEMA_FACET_LENGTH) + msg = xmlStrcat(msg, + BAD_CAST "this differs from the allowed length of '%s'.\n"); + else if (facetType == XML_SCHEMA_FACET_MAXLENGTH) + msg = xmlStrcat(msg, + BAD_CAST "this exceeds the allowed maximum length of '%s'.\n"); + else if (facetType == XML_SCHEMA_FACET_MINLENGTH) + msg = xmlStrcat(msg, + BAD_CAST "this underruns the allowed minimum length of '%s'.\n"); + + if (nodeType == XML_ATTRIBUTE_NODE) + xmlSchemaErr3(actxt, error, node, (const char *) msg, + value, (const xmlChar *) actLen, (const xmlChar *) len); + else + xmlSchemaErr(actxt, error, node, (const char *) msg, + (const xmlChar *) actLen, (const xmlChar *) len); + + } else if (facetType == XML_SCHEMA_FACET_ENUMERATION) { + msg = xmlStrcat(msg, BAD_CAST "The value '%s' is not an element " + "of the set {%s}.\n"); + xmlSchemaErr(actxt, error, node, (const char *) msg, value, + xmlSchemaFormatFacetEnumSet(actxt, &str, type)); + } else if (facetType == XML_SCHEMA_FACET_PATTERN) { + msg = xmlStrcat(msg, BAD_CAST "The value '%s' is not accepted " + "by the pattern '%s'.\n"); + xmlSchemaErr(actxt, error, node, (const char *) msg, value, + facet->value); + } else if (facetType == XML_SCHEMA_FACET_MININCLUSIVE) { + msg = xmlStrcat(msg, BAD_CAST "The value '%s' is less than the " + "minimum value allowed ('%s').\n"); + xmlSchemaErr(actxt, error, node, (const char *) msg, value, + facet->value); + } else if (facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) { + msg = xmlStrcat(msg, BAD_CAST "The value '%s' is greater than the " + "maximum value allowed ('%s').\n"); + xmlSchemaErr(actxt, error, node, (const char *) msg, value, + facet->value); + } else if (facetType == XML_SCHEMA_FACET_MINEXCLUSIVE) { + msg = xmlStrcat(msg, BAD_CAST "The value '%s' must be greater than " + "'%s'.\n"); + xmlSchemaErr(actxt, error, node, (const char *) msg, value, + facet->value); + } else if (facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) { + msg = xmlStrcat(msg, BAD_CAST "The value '%s' must be less than " + "'%s'.\n"); + xmlSchemaErr(actxt, error, node, (const char *) msg, value, + facet->value); + } else if (facetType == XML_SCHEMA_FACET_TOTALDIGITS) { + msg = xmlStrcat(msg, BAD_CAST "The value '%s' has more " + "digits than are allowed ('%s').\n"); + xmlSchemaErr(actxt, error, node, (const char*) msg, value, + facet->value); + } else if (facetType == XML_SCHEMA_FACET_FRACTIONDIGITS) { + msg = xmlStrcat(msg, BAD_CAST "The value '%s' has more fractional " + "digits than are allowed ('%s').\n"); + xmlSchemaErr(actxt, error, node, (const char*) msg, value, + facet->value); + } else if (nodeType == XML_ATTRIBUTE_NODE) { + msg = xmlStrcat(msg, BAD_CAST "The value '%s' is not facet-valid.\n"); + xmlSchemaErr(actxt, error, node, (const char *) msg, value, NULL); + } else { + msg = xmlStrcat(msg, BAD_CAST "The value is not facet-valid.\n"); + xmlSchemaErr(actxt, error, node, (const char *) msg, NULL, NULL); + } + } else { + msg = xmlStrcat(msg, (const xmlChar *) message); + msg = xmlStrcat(msg, BAD_CAST ".\n"); + xmlSchemaErr(actxt, error, node, (const char *) msg, str1, str2); + } + FREE_AND_NULL(str) + xmlFree(msg); +} + +#define VERROR(err, type, msg) \ + xmlSchemaCustomErr(ACTXT_CAST vctxt, err, NULL, type, msg, NULL, NULL); + +#define VERROR_INT(func, msg) xmlSchemaInternalErr(ACTXT_CAST vctxt, func, msg); + +#define PERROR_INT(func, msg) xmlSchemaInternalErr(ACTXT_CAST pctxt, func, msg); +#define PERROR_INT2(func, msg) xmlSchemaInternalErr(ACTXT_CAST ctxt, func, msg); + +#define AERROR_INT(func, msg) xmlSchemaInternalErr(actxt, func, msg); + + +/** + * xmlSchemaPMissingAttrErr: + * @ctxt: the schema validation context + * @ownerDes: the designation of the owner + * @ownerName: the name of the owner + * @ownerItem: the owner as a schema object + * @ownerElem: the owner as an element node + * @node: the parent element node of the missing attribute node + * @type: the corresponding type of the attribute node + * + * Reports an illegal attribute. + */ +static void +xmlSchemaPMissingAttrErr(xmlSchemaParserCtxtPtr ctxt, + xmlParserErrors error, + xmlSchemaBasicItemPtr ownerItem, + xmlNodePtr ownerElem, + const char *name, + const char *message) +{ + xmlChar *des = NULL; + + xmlSchemaFormatItemForReport(&des, NULL, ownerItem, ownerElem); + + if (message != NULL) + xmlSchemaPErr(ctxt, ownerElem, error, "%s: %s.\n", BAD_CAST des, BAD_CAST message); + else + xmlSchemaPErr(ctxt, ownerElem, error, + "%s: The attribute '%s' is required but missing.\n", + BAD_CAST des, BAD_CAST name); + FREE_AND_NULL(des); +} + + +/** + * xmlSchemaPResCompAttrErr: + * @ctxt: the schema validation context + * @error: the error code + * @ownerDes: the designation of the owner + * @ownerItem: the owner as a schema object + * @ownerElem: the owner as an element node + * @name: the name of the attribute holding the QName + * @refName: the referenced local name + * @refURI: the referenced namespace URI + * @message: optional message + * + * Used to report QName attribute values that failed to resolve + * to schema components. + */ +static void +xmlSchemaPResCompAttrErr(xmlSchemaParserCtxtPtr ctxt, + xmlParserErrors error, + xmlSchemaBasicItemPtr ownerItem, + xmlNodePtr ownerElem, + const char *name, + const xmlChar *refName, + const xmlChar *refURI, + xmlSchemaTypeType refType, + const char *refTypeStr) +{ + xmlChar *des = NULL, *strA = NULL; + + xmlSchemaFormatItemForReport(&des, NULL, ownerItem, ownerElem); + if (refTypeStr == NULL) + refTypeStr = (const char *) xmlSchemaItemTypeToStr(refType); + xmlSchemaPErrExt(ctxt, ownerElem, error, + NULL, NULL, NULL, + "%s, attribute '%s': The QName value '%s' does not resolve to a(n) " + "%s.\n", BAD_CAST des, BAD_CAST name, + xmlSchemaFormatQName(&strA, refURI, refName), + BAD_CAST refTypeStr, NULL); + FREE_AND_NULL(des) + FREE_AND_NULL(strA) +} + +/** + * xmlSchemaPCustomAttrErr: + * @ctxt: the schema parser context + * @error: the error code + * @ownerDes: the designation of the owner + * @ownerItem: the owner as a schema object + * @attr: the illegal attribute node + * + * Reports an illegal attribute during the parse. + */ +static void +xmlSchemaPCustomAttrErr(xmlSchemaParserCtxtPtr ctxt, + xmlParserErrors error, + xmlChar **ownerDes, + xmlSchemaBasicItemPtr ownerItem, + xmlAttrPtr attr, + const char *msg) +{ + xmlChar *des = NULL; + + if (ownerDes == NULL) + xmlSchemaFormatItemForReport(&des, NULL, ownerItem, attr->parent); + else if (*ownerDes == NULL) { + xmlSchemaFormatItemForReport(ownerDes, NULL, ownerItem, attr->parent); + des = *ownerDes; + } else + des = *ownerDes; + if (attr == NULL) { + xmlSchemaPErrExt(ctxt, NULL, error, NULL, NULL, NULL, + "%s, attribute '%s': %s.\n", + BAD_CAST des, (const xmlChar *) "Unknown", + (const xmlChar *) msg, NULL, NULL); + } else { + xmlSchemaPErrExt(ctxt, (xmlNodePtr) attr, error, NULL, NULL, NULL, + "%s, attribute '%s': %s.\n", + BAD_CAST des, attr->name, (const xmlChar *) msg, NULL, NULL); + } + if (ownerDes == NULL) + FREE_AND_NULL(des); +} + +/** + * xmlSchemaPIllegalAttrErr: + * @ctxt: the schema parser context + * @error: the error code + * @ownerDes: the designation of the attribute's owner + * @ownerItem: the attribute's owner item + * @attr: the illegal attribute node + * + * Reports an illegal attribute during the parse. + */ +static void +xmlSchemaPIllegalAttrErr(xmlSchemaParserCtxtPtr ctxt, + xmlParserErrors error, + xmlSchemaBasicItemPtr ownerComp ATTRIBUTE_UNUSED, + xmlAttrPtr attr) +{ + xmlChar *strA = NULL, *strB = NULL; + + xmlSchemaFormatNodeForError(&strA, ACTXT_CAST ctxt, attr->parent); + xmlSchemaErr4(ACTXT_CAST ctxt, error, (xmlNodePtr) attr, + "%sThe attribute '%s' is not allowed.\n", BAD_CAST strA, + xmlSchemaFormatQNameNs(&strB, attr->ns, attr->name), + NULL, NULL); + FREE_AND_NULL(strA); + FREE_AND_NULL(strB); +} + +/** + * xmlSchemaPCustomErr: + * @ctxt: the schema parser context + * @error: the error code + * @itemDes: the designation of the schema item + * @item: the schema item + * @itemElem: the node of the schema item + * @message: the error message + * @str1: an optional param for the error message + * @str2: an optional param for the error message + * @str3: an optional param for the error message + * + * Reports an error during parsing. + */ +static void +xmlSchemaPCustomErrExt(xmlSchemaParserCtxtPtr ctxt, + xmlParserErrors error, + xmlSchemaBasicItemPtr item, + xmlNodePtr itemElem, + const char *message, + const xmlChar *str1, + const xmlChar *str2, + const xmlChar *str3) +{ + xmlChar *des = NULL, *msg = NULL; + + xmlSchemaFormatItemForReport(&des, NULL, item, itemElem); + msg = xmlStrdup(BAD_CAST "%s: "); + msg = xmlStrcat(msg, (const xmlChar *) message); + msg = xmlStrcat(msg, BAD_CAST ".\n"); + if ((itemElem == NULL) && (item != NULL)) + itemElem = WXS_ITEM_NODE(item); + xmlSchemaPErrExt(ctxt, itemElem, error, NULL, NULL, NULL, + (const char *) msg, BAD_CAST des, str1, str2, str3, NULL); + FREE_AND_NULL(des); + FREE_AND_NULL(msg); +} + +/** + * xmlSchemaPCustomErr: + * @ctxt: the schema parser context + * @error: the error code + * @itemDes: the designation of the schema item + * @item: the schema item + * @itemElem: the node of the schema item + * @message: the error message + * @str1: the optional param for the error message + * + * Reports an error during parsing. + */ +static void +xmlSchemaPCustomErr(xmlSchemaParserCtxtPtr ctxt, + xmlParserErrors error, + xmlSchemaBasicItemPtr item, + xmlNodePtr itemElem, + const char *message, + const xmlChar *str1) +{ + xmlSchemaPCustomErrExt(ctxt, error, item, itemElem, message, + str1, NULL, NULL); +} + +/** + * xmlSchemaPAttrUseErr: + * @ctxt: the schema parser context + * @error: the error code + * @itemDes: the designation of the schema type + * @item: the schema type + * @itemElem: the node of the schema type + * @attr: the invalid schema attribute + * @message: the error message + * @str1: the optional param for the error message + * + * Reports an attribute use error during parsing. + */ +static void +xmlSchemaPAttrUseErr4(xmlSchemaParserCtxtPtr ctxt, + xmlParserErrors error, + xmlNodePtr node, + xmlSchemaBasicItemPtr ownerItem, + const xmlSchemaAttributeUsePtr attruse, + const char *message, + const xmlChar *str1, const xmlChar *str2, + const xmlChar *str3,const xmlChar *str4) +{ + xmlChar *str = NULL, *msg = NULL; + + xmlSchemaFormatItemForReport(&msg, NULL, ownerItem, NULL); + msg = xmlStrcat(msg, BAD_CAST ", "); + msg = xmlStrcat(msg, + BAD_CAST xmlSchemaFormatItemForReport(&str, NULL, + WXS_BASIC_CAST attruse, NULL)); + FREE_AND_NULL(str); + msg = xmlStrcat(msg, BAD_CAST ": "); + msg = xmlStrcat(msg, (const xmlChar *) message); + msg = xmlStrcat(msg, BAD_CAST ".\n"); + xmlSchemaErr4(ACTXT_CAST ctxt, error, node, + (const char *) msg, str1, str2, str3, str4); + xmlFree(msg); +} + +/** + * xmlSchemaPIllegalFacetAtomicErr: + * @ctxt: the schema parser context + * @error: the error code + * @type: the schema type + * @baseType: the base type of type + * @facet: the illegal facet + * + * Reports an illegal facet for atomic simple types. + */ +static void +xmlSchemaPIllegalFacetAtomicErr(xmlSchemaParserCtxtPtr ctxt, + xmlParserErrors error, + xmlSchemaTypePtr type, + xmlSchemaTypePtr baseType, + xmlSchemaFacetPtr facet) +{ + xmlChar *des = NULL, *strT = NULL; + + xmlSchemaFormatItemForReport(&des, NULL, WXS_BASIC_CAST type, type->node); + xmlSchemaPErrExt(ctxt, type->node, error, NULL, NULL, NULL, + "%s: The facet '%s' is not allowed on types derived from the " + "type %s.\n", + BAD_CAST des, xmlSchemaFacetTypeToString(facet->type), + xmlSchemaFormatItemForReport(&strT, NULL, WXS_BASIC_CAST baseType, NULL), + NULL, NULL); + FREE_AND_NULL(des); + FREE_AND_NULL(strT); +} + +/** + * xmlSchemaPIllegalFacetListUnionErr: + * @ctxt: the schema parser context + * @error: the error code + * @itemDes: the designation of the schema item involved + * @item: the schema item involved + * @facet: the illegal facet + * + * Reports an illegal facet for and . + */ +static void +xmlSchemaPIllegalFacetListUnionErr(xmlSchemaParserCtxtPtr ctxt, + xmlParserErrors error, + xmlSchemaTypePtr type, + xmlSchemaFacetPtr facet) +{ + xmlChar *des = NULL; + + xmlSchemaFormatItemForReport(&des, NULL, WXS_BASIC_CAST type, + type->node); + xmlSchemaPErr(ctxt, type->node, error, + "%s: The facet '%s' is not allowed.\n", + BAD_CAST des, xmlSchemaFacetTypeToString(facet->type)); + FREE_AND_NULL(des); +} + +/** + * xmlSchemaPMutualExclAttrErr: + * @ctxt: the schema validation context + * @error: the error code + * @elemDes: the designation of the parent element node + * @attr: the bad attribute node + * @type: the corresponding type of the attribute node + * + * Reports an illegal attribute. + */ +static void +xmlSchemaPMutualExclAttrErr(xmlSchemaParserCtxtPtr ctxt, + xmlParserErrors error, + xmlSchemaBasicItemPtr ownerItem, + xmlAttrPtr attr, + const char *name1, + const char *name2) +{ + xmlChar *des = NULL; + + xmlSchemaFormatItemForReport(&des, NULL, WXS_BASIC_CAST ownerItem, attr->parent); + xmlSchemaPErrExt(ctxt, (xmlNodePtr) attr, error, NULL, NULL, NULL, + "%s: The attributes '%s' and '%s' are mutually exclusive.\n", + BAD_CAST des, BAD_CAST name1, BAD_CAST name2, NULL, NULL); + FREE_AND_NULL(des); +} + +/** + * xmlSchemaPSimpleTypeErr: + * @ctxt: the schema validation context + * @error: the error code + * @type: the type specifier + * @ownerDes: the designation of the owner + * @ownerItem: the schema object if existent + * @node: the validated node + * @value: the validated value + * + * Reports a simple type validation error. + * TODO: Should this report the value of an element as well? + */ +static void +xmlSchemaPSimpleTypeErr(xmlSchemaParserCtxtPtr ctxt, + xmlParserErrors error, + xmlSchemaBasicItemPtr ownerItem ATTRIBUTE_UNUSED, + xmlNodePtr node, + xmlSchemaTypePtr type, + const char *expected, + const xmlChar *value, + const char *message, + const xmlChar *str1, + const xmlChar *str2) +{ + xmlChar *msg = NULL; + + xmlSchemaFormatNodeForError(&msg, ACTXT_CAST ctxt, node); + if (message == NULL) { + /* + * Use default messages. + */ + if (type != NULL) { + if (node->type == XML_ATTRIBUTE_NODE) + msg = xmlStrcat(msg, BAD_CAST "'%s' is not a valid value of "); + else + msg = xmlStrcat(msg, BAD_CAST "The character content is not a " + "valid value of "); + if (! xmlSchemaIsGlobalItem(type)) + msg = xmlStrcat(msg, BAD_CAST "the local "); + else + msg = xmlStrcat(msg, BAD_CAST "the "); + + if (WXS_IS_ATOMIC(type)) + msg = xmlStrcat(msg, BAD_CAST "atomic type"); + else if (WXS_IS_LIST(type)) + msg = xmlStrcat(msg, BAD_CAST "list type"); + else if (WXS_IS_UNION(type)) + msg = xmlStrcat(msg, BAD_CAST "union type"); + + if (xmlSchemaIsGlobalItem(type)) { + xmlChar *str = NULL; + msg = xmlStrcat(msg, BAD_CAST " '"); + if (type->builtInType != 0) { + msg = xmlStrcat(msg, BAD_CAST "xs:"); + msg = xmlStrcat(msg, type->name); + } else + msg = xmlStrcat(msg, + xmlSchemaFormatQName(&str, + type->targetNamespace, type->name)); + msg = xmlStrcat(msg, BAD_CAST "'."); + FREE_AND_NULL(str); + } + } else { + if (node->type == XML_ATTRIBUTE_NODE) + msg = xmlStrcat(msg, BAD_CAST "The value '%s' is not valid."); + else + msg = xmlStrcat(msg, BAD_CAST "The character content is not " + "valid."); + } + if (expected) { + msg = xmlStrcat(msg, BAD_CAST " Expected is '"); + msg = xmlStrcat(msg, BAD_CAST expected); + msg = xmlStrcat(msg, BAD_CAST "'.\n"); + } else + msg = xmlStrcat(msg, BAD_CAST "\n"); + if (node->type == XML_ATTRIBUTE_NODE) + xmlSchemaPErr(ctxt, node, error, (const char *) msg, value, NULL); + else + xmlSchemaPErr(ctxt, node, error, (const char *) msg, NULL, NULL); + } else { + msg = xmlStrcat(msg, BAD_CAST message); + msg = xmlStrcat(msg, BAD_CAST ".\n"); + xmlSchemaPErrExt(ctxt, node, error, NULL, NULL, NULL, + (const char*) msg, str1, str2, NULL, NULL, NULL); + } + /* Cleanup. */ + FREE_AND_NULL(msg) +} + +/** + * xmlSchemaPContentErr: + * @ctxt: the schema parser context + * @error: the error code + * @onwerDes: the designation of the holder of the content + * @ownerItem: the owner item of the holder of the content + * @ownerElem: the node of the holder of the content + * @child: the invalid child node + * @message: the optional error message + * @content: the optional string describing the correct content + * + * Reports an error concerning the content of a schema element. + */ +static void +xmlSchemaPContentErr(xmlSchemaParserCtxtPtr ctxt, + xmlParserErrors error, + xmlSchemaBasicItemPtr ownerItem, + xmlNodePtr ownerElem, + xmlNodePtr child, + const char *message, + const char *content) +{ + xmlChar *des = NULL; + + xmlSchemaFormatItemForReport(&des, NULL, ownerItem, ownerElem); + if (message != NULL) + xmlSchemaPErr2(ctxt, ownerElem, child, error, + "%s: %s.\n", + BAD_CAST des, BAD_CAST message); + else { + if (content != NULL) { + xmlSchemaPErr2(ctxt, ownerElem, child, error, + "%s: The content is not valid. Expected is %s.\n", + BAD_CAST des, BAD_CAST content); + } else { + xmlSchemaPErr2(ctxt, ownerElem, child, error, + "%s: The content is not valid.\n", + BAD_CAST des, NULL); + } + } + FREE_AND_NULL(des) +} + +/************************************************************************ + * * + * Streamable error functions * + * * + ************************************************************************/ + + + + +/************************************************************************ + * * + * Validation helper functions * + * * + ************************************************************************/ + + +/************************************************************************ + * * + * Allocation functions * + * * + ************************************************************************/ + +/** + * xmlSchemaNewSchemaForParserCtxt: + * @ctxt: a schema validation context + * + * Allocate a new Schema structure. + * + * Returns the newly allocated structure or NULL in case or error + */ +static xmlSchemaPtr +xmlSchemaNewSchema(xmlSchemaParserCtxtPtr ctxt) +{ + xmlSchemaPtr ret; + + ret = (xmlSchemaPtr) xmlMalloc(sizeof(xmlSchema)); + if (ret == NULL) { + xmlSchemaPErrMemory(ctxt, "allocating schema", NULL); + return (NULL); + } + memset(ret, 0, sizeof(xmlSchema)); + ret->dict = ctxt->dict; + xmlDictReference(ret->dict); + + return (ret); +} + +/** + * xmlSchemaNewFacet: + * + * Allocate a new Facet structure. + * + * Returns the newly allocated structure or NULL in case or error + */ +xmlSchemaFacetPtr +xmlSchemaNewFacet(void) +{ + xmlSchemaFacetPtr ret; + + ret = (xmlSchemaFacetPtr) xmlMalloc(sizeof(xmlSchemaFacet)); + if (ret == NULL) { + return (NULL); + } + memset(ret, 0, sizeof(xmlSchemaFacet)); + + return (ret); +} + +/** + * xmlSchemaNewAnnot: + * @ctxt: a schema validation context + * @node: a node + * + * Allocate a new annotation structure. + * + * Returns the newly allocated structure or NULL in case or error + */ +static xmlSchemaAnnotPtr +xmlSchemaNewAnnot(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node) +{ + xmlSchemaAnnotPtr ret; + + ret = (xmlSchemaAnnotPtr) xmlMalloc(sizeof(xmlSchemaAnnot)); + if (ret == NULL) { + xmlSchemaPErrMemory(ctxt, "allocating annotation", node); + return (NULL); + } + memset(ret, 0, sizeof(xmlSchemaAnnot)); + ret->content = node; + return (ret); +} + +static xmlSchemaItemListPtr +xmlSchemaItemListCreate(void) +{ + xmlSchemaItemListPtr ret; + + ret = xmlMalloc(sizeof(xmlSchemaItemList)); + if (ret == NULL) { + xmlSchemaPErrMemory(NULL, + "allocating an item list structure", NULL); + return (NULL); + } + memset(ret, 0, sizeof(xmlSchemaItemList)); + return (ret); +} + +static void +xmlSchemaItemListClear(xmlSchemaItemListPtr list) +{ + if (list->items != NULL) { + xmlFree(list->items); + list->items = NULL; + } + list->nbItems = 0; + list->sizeItems = 0; +} + +static int +xmlSchemaItemListAdd(xmlSchemaItemListPtr list, void *item) +{ + if (list->items == NULL) { + list->items = (void **) xmlMalloc( + 20 * sizeof(void *)); + if (list->items == NULL) { + xmlSchemaPErrMemory(NULL, "allocating new item list", NULL); + return(-1); + } + list->sizeItems = 20; + } else if (list->sizeItems <= list->nbItems) { + list->sizeItems *= 2; + list->items = (void **) xmlRealloc(list->items, + list->sizeItems * sizeof(void *)); + if (list->items == NULL) { + xmlSchemaPErrMemory(NULL, "growing item list", NULL); + list->sizeItems = 0; + return(-1); + } + } + list->items[list->nbItems++] = item; + return(0); +} + +static int +xmlSchemaItemListAddSize(xmlSchemaItemListPtr list, + int initialSize, + void *item) +{ + if (list->items == NULL) { + if (initialSize <= 0) + initialSize = 1; + list->items = (void **) xmlMalloc( + initialSize * sizeof(void *)); + if (list->items == NULL) { + xmlSchemaPErrMemory(NULL, "allocating new item list", NULL); + return(-1); + } + list->sizeItems = initialSize; + } else if (list->sizeItems <= list->nbItems) { + list->sizeItems *= 2; + list->items = (void **) xmlRealloc(list->items, + list->sizeItems * sizeof(void *)); + if (list->items == NULL) { + xmlSchemaPErrMemory(NULL, "growing item list", NULL); + list->sizeItems = 0; + return(-1); + } + } + list->items[list->nbItems++] = item; + return(0); +} + +static int +xmlSchemaItemListInsert(xmlSchemaItemListPtr list, void *item, int idx) +{ + if (list->items == NULL) { + list->items = (void **) xmlMalloc( + 20 * sizeof(void *)); + if (list->items == NULL) { + xmlSchemaPErrMemory(NULL, "allocating new item list", NULL); + return(-1); + } + list->sizeItems = 20; + } else if (list->sizeItems <= list->nbItems) { + list->sizeItems *= 2; + list->items = (void **) xmlRealloc(list->items, + list->sizeItems * sizeof(void *)); + if (list->items == NULL) { + xmlSchemaPErrMemory(NULL, "growing item list", NULL); + list->sizeItems = 0; + return(-1); + } + } + /* + * Just append if the index is greater/equal than the item count. + */ + if (idx >= list->nbItems) { + list->items[list->nbItems++] = item; + } else { + int i; + for (i = list->nbItems; i > idx; i--) + list->items[i] = list->items[i-1]; + list->items[idx] = item; + list->nbItems++; + } + return(0); +} + +#if 0 /* enable if ever needed */ +static int +xmlSchemaItemListInsertSize(xmlSchemaItemListPtr list, + int initialSize, + void *item, + int idx) +{ + if (list->items == NULL) { + if (initialSize <= 0) + initialSize = 1; + list->items = (void **) xmlMalloc( + initialSize * sizeof(void *)); + if (list->items == NULL) { + xmlSchemaPErrMemory(NULL, "allocating new item list", NULL); + return(-1); + } + list->sizeItems = initialSize; + } else if (list->sizeItems <= list->nbItems) { + list->sizeItems *= 2; + list->items = (void **) xmlRealloc(list->items, + list->sizeItems * sizeof(void *)); + if (list->items == NULL) { + xmlSchemaPErrMemory(NULL, "growing item list", NULL); + list->sizeItems = 0; + return(-1); + } + } + /* + * Just append if the index is greater/equal than the item count. + */ + if (idx >= list->nbItems) { + list->items[list->nbItems++] = item; + } else { + int i; + for (i = list->nbItems; i > idx; i--) + list->items[i] = list->items[i-1]; + list->items[idx] = item; + list->nbItems++; + } + return(0); +} +#endif + +static int +xmlSchemaItemListRemove(xmlSchemaItemListPtr list, int idx) +{ + int i; + if ((list->items == NULL) || (idx >= list->nbItems)) { + xmlSchemaPSimpleErr("Internal error: xmlSchemaItemListRemove, " + "index error.\n"); + return(-1); + } + + if (list->nbItems == 1) { + /* TODO: Really free the list? */ + xmlFree(list->items); + list->items = NULL; + list->nbItems = 0; + list->sizeItems = 0; + } else if (list->nbItems -1 == idx) { + list->nbItems--; + } else { + for (i = idx; i < list->nbItems -1; i++) + list->items[i] = list->items[i+1]; + list->nbItems--; + } + return(0); +} + +/** + * xmlSchemaItemListFree: + * @annot: a schema type structure + * + * Deallocate a annotation structure + */ +static void +xmlSchemaItemListFree(xmlSchemaItemListPtr list) +{ + if (list == NULL) + return; + if (list->items != NULL) + xmlFree(list->items); + xmlFree(list); +} + +static void +xmlSchemaBucketFree(xmlSchemaBucketPtr bucket) +{ + if (bucket == NULL) + return; + if (bucket->globals != NULL) { + xmlSchemaComponentListFree(bucket->globals); + xmlSchemaItemListFree(bucket->globals); + } + if (bucket->locals != NULL) { + xmlSchemaComponentListFree(bucket->locals); + xmlSchemaItemListFree(bucket->locals); + } + if (bucket->relations != NULL) { + xmlSchemaSchemaRelationPtr prev, cur = bucket->relations; + do { + prev = cur; + cur = cur->next; + xmlFree(prev); + } while (cur != NULL); + } + if ((! bucket->preserveDoc) && (bucket->doc != NULL)) { + xmlFreeDoc(bucket->doc); + } + if (bucket->type == XML_SCHEMA_SCHEMA_IMPORT) { + if (WXS_IMPBUCKET(bucket)->schema != NULL) + xmlSchemaFree(WXS_IMPBUCKET(bucket)->schema); + } + xmlFree(bucket); +} + +static xmlSchemaBucketPtr +xmlSchemaBucketCreate(xmlSchemaParserCtxtPtr pctxt, + int type, const xmlChar *targetNamespace) +{ + xmlSchemaBucketPtr ret; + int size; + xmlSchemaPtr mainSchema; + + if (WXS_CONSTRUCTOR(pctxt)->mainSchema == NULL) { + PERROR_INT("xmlSchemaBucketCreate", + "no main schema on constructor"); + return(NULL); + } + mainSchema = WXS_CONSTRUCTOR(pctxt)->mainSchema; + /* Create the schema bucket. */ + if (WXS_IS_BUCKET_INCREDEF(type)) + size = sizeof(xmlSchemaInclude); + else + size = sizeof(xmlSchemaImport); + ret = (xmlSchemaBucketPtr) xmlMalloc(size); + if (ret == NULL) { + xmlSchemaPErrMemory(NULL, "allocating schema bucket", NULL); + return(NULL); + } + memset(ret, 0, size); + ret->targetNamespace = targetNamespace; + ret->type = type; + ret->globals = xmlSchemaItemListCreate(); + if (ret->globals == NULL) { + xmlFree(ret); + return(NULL); + } + ret->locals = xmlSchemaItemListCreate(); + if (ret->locals == NULL) { + xmlFree(ret); + return(NULL); + } + /* + * The following will assure that only the first bucket is marked as + * XML_SCHEMA_SCHEMA_MAIN and it points to the *main* schema. + * For each following import buckets an xmlSchema will be created. + * An xmlSchema will be created for every distinct targetNamespace. + * We assign the targetNamespace to the schemata here. + */ + if (! WXS_HAS_BUCKETS(pctxt)) { + if (WXS_IS_BUCKET_INCREDEF(type)) { + PERROR_INT("xmlSchemaBucketCreate", + "first bucket but it's an include or redefine"); + xmlSchemaBucketFree(ret); + return(NULL); + } + /* Force the type to be XML_SCHEMA_SCHEMA_MAIN. */ + ret->type = XML_SCHEMA_SCHEMA_MAIN; + /* Point to the *main* schema. */ + WXS_CONSTRUCTOR(pctxt)->mainBucket = ret; + WXS_IMPBUCKET(ret)->schema = mainSchema; + /* + * Ensure that the main schema gets a targetNamespace. + */ + mainSchema->targetNamespace = targetNamespace; + } else { + if (type == XML_SCHEMA_SCHEMA_MAIN) { + PERROR_INT("xmlSchemaBucketCreate", + "main bucket but it's not the first one"); + xmlSchemaBucketFree(ret); + return(NULL); + } else if (type == XML_SCHEMA_SCHEMA_IMPORT) { + /* + * Create a schema for imports and assign the + * targetNamespace. + */ + WXS_IMPBUCKET(ret)->schema = xmlSchemaNewSchema(pctxt); + if (WXS_IMPBUCKET(ret)->schema == NULL) { + xmlSchemaBucketFree(ret); + return(NULL); + } + WXS_IMPBUCKET(ret)->schema->targetNamespace = targetNamespace; + } + } + if (WXS_IS_BUCKET_IMPMAIN(type)) { + int res; + /* + * Imports go into the "schemasImports" slot of the main *schema*. + * Note that we create an import entry for the main schema as well; i.e., + * even if there's only one schema, we'll get an import. + */ + if (mainSchema->schemasImports == NULL) { + mainSchema->schemasImports = xmlHashCreateDict(5, + WXS_CONSTRUCTOR(pctxt)->dict); + if (mainSchema->schemasImports == NULL) { + xmlSchemaBucketFree(ret); + return(NULL); + } + } + if (targetNamespace == NULL) + res = xmlHashAddEntry(mainSchema->schemasImports, + XML_SCHEMAS_NO_NAMESPACE, ret); + else + res = xmlHashAddEntry(mainSchema->schemasImports, + targetNamespace, ret); + if (res != 0) { + PERROR_INT("xmlSchemaBucketCreate", + "failed to add the schema bucket to the hash"); + xmlSchemaBucketFree(ret); + return(NULL); + } + } else { + /* Set the @ownerImport of an include bucket. */ + if (WXS_IS_BUCKET_IMPMAIN(WXS_CONSTRUCTOR(pctxt)->bucket->type)) + WXS_INCBUCKET(ret)->ownerImport = + WXS_IMPBUCKET(WXS_CONSTRUCTOR(pctxt)->bucket); + else + WXS_INCBUCKET(ret)->ownerImport = + WXS_INCBUCKET(WXS_CONSTRUCTOR(pctxt)->bucket)->ownerImport; + + /* Includes got into the "includes" slot of the *main* schema. */ + if (mainSchema->includes == NULL) { + mainSchema->includes = xmlSchemaItemListCreate(); + if (mainSchema->includes == NULL) { + xmlSchemaBucketFree(ret); + return(NULL); + } + } + xmlSchemaItemListAdd(mainSchema->includes, ret); + } + /* + * Add to list of all buckets; this is used for lookup + * during schema construction time only. + */ + if (xmlSchemaItemListAdd(WXS_CONSTRUCTOR(pctxt)->buckets, ret) == -1) + return(NULL); + return(ret); +} + +static int +xmlSchemaAddItemSize(xmlSchemaItemListPtr *list, int initialSize, void *item) +{ + if (*list == NULL) { + *list = xmlSchemaItemListCreate(); + if (*list == NULL) + return(-1); + } + xmlSchemaItemListAddSize(*list, initialSize, item); + return(0); +} + +/** + * xmlSchemaFreeAnnot: + * @annot: a schema type structure + * + * Deallocate a annotation structure + */ +static void +xmlSchemaFreeAnnot(xmlSchemaAnnotPtr annot) +{ + if (annot == NULL) + return; + if (annot->next == NULL) { + xmlFree(annot); + } else { + xmlSchemaAnnotPtr prev; + + do { + prev = annot; + annot = annot->next; + xmlFree(prev); + } while (annot != NULL); + } +} + +/** + * xmlSchemaFreeNotation: + * @schema: a schema notation structure + * + * Deallocate a Schema Notation structure. + */ +static void +xmlSchemaFreeNotation(xmlSchemaNotationPtr nota) +{ + if (nota == NULL) + return; + xmlFree(nota); +} + +/** + * xmlSchemaFreeAttribute: + * @attr: an attribute declaration + * + * Deallocates an attribute declaration structure. + */ +static void +xmlSchemaFreeAttribute(xmlSchemaAttributePtr attr) +{ + if (attr == NULL) + return; + if (attr->annot != NULL) + xmlSchemaFreeAnnot(attr->annot); + if (attr->defVal != NULL) + xmlSchemaFreeValue(attr->defVal); + xmlFree(attr); +} + +/** + * xmlSchemaFreeAttributeUse: + * @use: an attribute use + * + * Deallocates an attribute use structure. + */ +static void +xmlSchemaFreeAttributeUse(xmlSchemaAttributeUsePtr use) +{ + if (use == NULL) + return; + if (use->annot != NULL) + xmlSchemaFreeAnnot(use->annot); + if (use->defVal != NULL) + xmlSchemaFreeValue(use->defVal); + xmlFree(use); +} + +/** + * xmlSchemaFreeAttributeUseProhib: + * @prohib: an attribute use prohibition + * + * Deallocates an attribute use structure. + */ +static void +xmlSchemaFreeAttributeUseProhib(xmlSchemaAttributeUseProhibPtr prohib) +{ + if (prohib == NULL) + return; + xmlFree(prohib); +} + +/** + * xmlSchemaFreeWildcardNsSet: + * set: a schema wildcard namespace + * + * Deallocates a list of wildcard constraint structures. + */ +static void +xmlSchemaFreeWildcardNsSet(xmlSchemaWildcardNsPtr set) +{ + xmlSchemaWildcardNsPtr next; + + while (set != NULL) { + next = set->next; + xmlFree(set); + set = next; + } +} + +/** + * xmlSchemaFreeWildcard: + * @wildcard: a wildcard structure + * + * Deallocates a wildcard structure. + */ +void +xmlSchemaFreeWildcard(xmlSchemaWildcardPtr wildcard) +{ + if (wildcard == NULL) + return; + if (wildcard->annot != NULL) + xmlSchemaFreeAnnot(wildcard->annot); + if (wildcard->nsSet != NULL) + xmlSchemaFreeWildcardNsSet(wildcard->nsSet); + if (wildcard->negNsSet != NULL) + xmlFree(wildcard->negNsSet); + xmlFree(wildcard); +} + +/** + * xmlSchemaFreeAttributeGroup: + * @schema: a schema attribute group structure + * + * Deallocate a Schema Attribute Group structure. + */ +static void +xmlSchemaFreeAttributeGroup(xmlSchemaAttributeGroupPtr attrGr) +{ + if (attrGr == NULL) + return; + if (attrGr->annot != NULL) + xmlSchemaFreeAnnot(attrGr->annot); + if (attrGr->attrUses != NULL) + xmlSchemaItemListFree(WXS_LIST_CAST attrGr->attrUses); + xmlFree(attrGr); +} + +/** + * xmlSchemaFreeQNameRef: + * @item: a QName reference structure + * + * Deallocatea a QName reference structure. + */ +static void +xmlSchemaFreeQNameRef(xmlSchemaQNameRefPtr item) +{ + xmlFree(item); +} + +/** + * xmlSchemaFreeTypeLinkList: + * @alink: a type link + * + * Deallocate a list of types. + */ +static void +xmlSchemaFreeTypeLinkList(xmlSchemaTypeLinkPtr link) +{ + xmlSchemaTypeLinkPtr next; + + while (link != NULL) { + next = link->next; + xmlFree(link); + link = next; + } +} + +static void +xmlSchemaFreeIDCStateObjList(xmlSchemaIDCStateObjPtr sto) +{ + xmlSchemaIDCStateObjPtr next; + while (sto != NULL) { + next = sto->next; + if (sto->history != NULL) + xmlFree(sto->history); + if (sto->xpathCtxt != NULL) + xmlFreeStreamCtxt((xmlStreamCtxtPtr) sto->xpathCtxt); + xmlFree(sto); + sto = next; + } +} + +/** + * xmlSchemaFreeIDC: + * @idc: a identity-constraint definition + * + * Deallocates an identity-constraint definition. + */ +static void +xmlSchemaFreeIDC(xmlSchemaIDCPtr idcDef) +{ + xmlSchemaIDCSelectPtr cur, prev; + + if (idcDef == NULL) + return; + if (idcDef->annot != NULL) + xmlSchemaFreeAnnot(idcDef->annot); + /* Selector */ + if (idcDef->selector != NULL) { + if (idcDef->selector->xpathComp != NULL) + xmlFreePattern((xmlPatternPtr) idcDef->selector->xpathComp); + xmlFree(idcDef->selector); + } + /* Fields */ + if (idcDef->fields != NULL) { + cur = idcDef->fields; + do { + prev = cur; + cur = cur->next; + if (prev->xpathComp != NULL) + xmlFreePattern((xmlPatternPtr) prev->xpathComp); + xmlFree(prev); + } while (cur != NULL); + } + xmlFree(idcDef); +} + +/** + * xmlSchemaFreeElement: + * @schema: a schema element structure + * + * Deallocate a Schema Element structure. + */ +static void +xmlSchemaFreeElement(xmlSchemaElementPtr elem) +{ + if (elem == NULL) + return; + if (elem->annot != NULL) + xmlSchemaFreeAnnot(elem->annot); + if (elem->contModel != NULL) + xmlRegFreeRegexp(elem->contModel); + if (elem->defVal != NULL) + xmlSchemaFreeValue(elem->defVal); + xmlFree(elem); +} + +/** + * xmlSchemaFreeFacet: + * @facet: a schema facet structure + * + * Deallocate a Schema Facet structure. + */ +void +xmlSchemaFreeFacet(xmlSchemaFacetPtr facet) +{ + if (facet == NULL) + return; + if (facet->val != NULL) + xmlSchemaFreeValue(facet->val); + if (facet->regexp != NULL) + xmlRegFreeRegexp(facet->regexp); + if (facet->annot != NULL) + xmlSchemaFreeAnnot(facet->annot); + xmlFree(facet); +} + +/** + * xmlSchemaFreeType: + * @type: a schema type structure + * + * Deallocate a Schema Type structure. + */ +void +xmlSchemaFreeType(xmlSchemaTypePtr type) +{ + if (type == NULL) + return; + if (type->annot != NULL) + xmlSchemaFreeAnnot(type->annot); + if (type->facets != NULL) { + xmlSchemaFacetPtr facet, next; + + facet = type->facets; + while (facet != NULL) { + next = facet->next; + xmlSchemaFreeFacet(facet); + facet = next; + } + } + if (type->attrUses != NULL) + xmlSchemaItemListFree((xmlSchemaItemListPtr) type->attrUses); + if (type->memberTypes != NULL) + xmlSchemaFreeTypeLinkList(type->memberTypes); + if (type->facetSet != NULL) { + xmlSchemaFacetLinkPtr next, link; + + link = type->facetSet; + do { + next = link->next; + xmlFree(link); + link = next; + } while (link != NULL); + } + if (type->contModel != NULL) + xmlRegFreeRegexp(type->contModel); + xmlFree(type); +} + +/** + * xmlSchemaFreeModelGroupDef: + * @item: a schema model group definition + * + * Deallocates a schema model group definition. + */ +static void +xmlSchemaFreeModelGroupDef(xmlSchemaModelGroupDefPtr item) +{ + if (item->annot != NULL) + xmlSchemaFreeAnnot(item->annot); + xmlFree(item); +} + +/** + * xmlSchemaFreeModelGroup: + * @item: a schema model group + * + * Deallocates a schema model group structure. + */ +static void +xmlSchemaFreeModelGroup(xmlSchemaModelGroupPtr item) +{ + if (item->annot != NULL) + xmlSchemaFreeAnnot(item->annot); + xmlFree(item); +} + +static void +xmlSchemaComponentListFree(xmlSchemaItemListPtr list) +{ + if ((list == NULL) || (list->nbItems == 0)) + return; + { + xmlSchemaTreeItemPtr item; + xmlSchemaTreeItemPtr *items = (xmlSchemaTreeItemPtr *) list->items; + int i; + + for (i = 0; i < list->nbItems; i++) { + item = items[i]; + if (item == NULL) + continue; + switch (item->type) { + case XML_SCHEMA_TYPE_SIMPLE: + case XML_SCHEMA_TYPE_COMPLEX: + xmlSchemaFreeType((xmlSchemaTypePtr) item); + break; + case XML_SCHEMA_TYPE_ATTRIBUTE: + xmlSchemaFreeAttribute((xmlSchemaAttributePtr) item); + break; + case XML_SCHEMA_TYPE_ATTRIBUTE_USE: + xmlSchemaFreeAttributeUse((xmlSchemaAttributeUsePtr) item); + break; + case XML_SCHEMA_EXTRA_ATTR_USE_PROHIB: + xmlSchemaFreeAttributeUseProhib( + (xmlSchemaAttributeUseProhibPtr) item); + break; + case XML_SCHEMA_TYPE_ELEMENT: + xmlSchemaFreeElement((xmlSchemaElementPtr) item); + break; + case XML_SCHEMA_TYPE_PARTICLE: + if (item->annot != NULL) + xmlSchemaFreeAnnot(item->annot); + xmlFree(item); + break; + case XML_SCHEMA_TYPE_SEQUENCE: + case XML_SCHEMA_TYPE_CHOICE: + case XML_SCHEMA_TYPE_ALL: + xmlSchemaFreeModelGroup((xmlSchemaModelGroupPtr) item); + break; + case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: + xmlSchemaFreeAttributeGroup( + (xmlSchemaAttributeGroupPtr) item); + break; + case XML_SCHEMA_TYPE_GROUP: + xmlSchemaFreeModelGroupDef( + (xmlSchemaModelGroupDefPtr) item); + break; + case XML_SCHEMA_TYPE_ANY: + case XML_SCHEMA_TYPE_ANY_ATTRIBUTE: + xmlSchemaFreeWildcard((xmlSchemaWildcardPtr) item); + break; + case XML_SCHEMA_TYPE_IDC_KEY: + case XML_SCHEMA_TYPE_IDC_UNIQUE: + case XML_SCHEMA_TYPE_IDC_KEYREF: + xmlSchemaFreeIDC((xmlSchemaIDCPtr) item); + break; + case XML_SCHEMA_TYPE_NOTATION: + xmlSchemaFreeNotation((xmlSchemaNotationPtr) item); + break; + case XML_SCHEMA_EXTRA_QNAMEREF: + xmlSchemaFreeQNameRef((xmlSchemaQNameRefPtr) item); + break; + default: { + /* TODO: This should never be hit. */ + xmlSchemaPSimpleInternalErr(NULL, + "Internal error: xmlSchemaComponentListFree, " + "unexpected component type '%s'\n", + (const xmlChar *) WXS_ITEM_TYPE_NAME(item)); + } + break; + } + } + list->nbItems = 0; + } +} + +/** + * xmlSchemaFree: + * @schema: a schema structure + * + * Deallocate a Schema structure. + */ +void +xmlSchemaFree(xmlSchemaPtr schema) +{ + if (schema == NULL) + return; + /* @volatiles is not used anymore :-/ */ + if (schema->volatiles != NULL) + TODO + /* + * Note that those slots are not responsible for freeing + * schema components anymore; this will now be done by + * the schema buckets. + */ + if (schema->notaDecl != NULL) + xmlHashFree(schema->notaDecl, NULL); + if (schema->attrDecl != NULL) + xmlHashFree(schema->attrDecl, NULL); + if (schema->attrgrpDecl != NULL) + xmlHashFree(schema->attrgrpDecl, NULL); + if (schema->elemDecl != NULL) + xmlHashFree(schema->elemDecl, NULL); + if (schema->typeDecl != NULL) + xmlHashFree(schema->typeDecl, NULL); + if (schema->groupDecl != NULL) + xmlHashFree(schema->groupDecl, NULL); + if (schema->idcDef != NULL) + xmlHashFree(schema->idcDef, NULL); + + if (schema->schemasImports != NULL) + xmlHashFree(schema->schemasImports, + (xmlHashDeallocator) xmlSchemaBucketFree); + if (schema->includes != NULL) { + xmlSchemaItemListPtr list = (xmlSchemaItemListPtr) schema->includes; + int i; + for (i = 0; i < list->nbItems; i++) { + xmlSchemaBucketFree((xmlSchemaBucketPtr) list->items[i]); + } + xmlSchemaItemListFree(list); + } + if (schema->annot != NULL) + xmlSchemaFreeAnnot(schema->annot); + /* Never free the doc here, since this will be done by the buckets. */ + + xmlDictFree(schema->dict); + xmlFree(schema); +} + +/************************************************************************ + * * + * Debug functions * + * * + ************************************************************************/ + +#ifdef LIBXML_OUTPUT_ENABLED + +static void +xmlSchemaTypeDump(xmlSchemaTypePtr type, FILE * output); /* forward */ + +/** + * xmlSchemaElementDump: + * @elem: an element + * @output: the file output + * + * Dump the element + */ +static void +xmlSchemaElementDump(xmlSchemaElementPtr elem, FILE * output, + const xmlChar * name ATTRIBUTE_UNUSED, + const xmlChar * namespace ATTRIBUTE_UNUSED, + const xmlChar * context ATTRIBUTE_UNUSED) +{ + if (elem == NULL) + return; + + + fprintf(output, "Element"); + if (elem->flags & XML_SCHEMAS_ELEM_GLOBAL) + fprintf(output, " (global)"); + fprintf(output, ": '%s' ", elem->name); + if (namespace != NULL) + fprintf(output, "ns '%s'", namespace); + fprintf(output, "\n"); +#if 0 + if ((elem->minOccurs != 1) || (elem->maxOccurs != 1)) { + fprintf(output, " min %d ", elem->minOccurs); + if (elem->maxOccurs >= UNBOUNDED) + fprintf(output, "max: unbounded\n"); + else if (elem->maxOccurs != 1) + fprintf(output, "max: %d\n", elem->maxOccurs); + else + fprintf(output, "\n"); + } +#endif + /* + * Misc other properties. + */ + if ((elem->flags & XML_SCHEMAS_ELEM_NILLABLE) || + (elem->flags & XML_SCHEMAS_ELEM_ABSTRACT) || + (elem->flags & XML_SCHEMAS_ELEM_FIXED) || + (elem->flags & XML_SCHEMAS_ELEM_DEFAULT)) { + fprintf(output, " props: "); + if (elem->flags & XML_SCHEMAS_ELEM_FIXED) + fprintf(output, "[fixed] "); + if (elem->flags & XML_SCHEMAS_ELEM_DEFAULT) + fprintf(output, "[default] "); + if (elem->flags & XML_SCHEMAS_ELEM_ABSTRACT) + fprintf(output, "[abstract] "); + if (elem->flags & XML_SCHEMAS_ELEM_NILLABLE) + fprintf(output, "[nillable] "); + fprintf(output, "\n"); + } + /* + * Default/fixed value. + */ + if (elem->value != NULL) + fprintf(output, " value: '%s'\n", elem->value); + /* + * Type. + */ + if (elem->namedType != NULL) { + fprintf(output, " type: '%s' ", elem->namedType); + if (elem->namedTypeNs != NULL) + fprintf(output, "ns '%s'\n", elem->namedTypeNs); + else + fprintf(output, "\n"); + } else if (elem->subtypes != NULL) { + /* + * Dump local types. + */ + xmlSchemaTypeDump(elem->subtypes, output); + } + /* + * Substitution group. + */ + if (elem->substGroup != NULL) { + fprintf(output, " substitutionGroup: '%s' ", elem->substGroup); + if (elem->substGroupNs != NULL) + fprintf(output, "ns '%s'\n", elem->substGroupNs); + else + fprintf(output, "\n"); + } +} + +/** + * xmlSchemaAnnotDump: + * @output: the file output + * @annot: a annotation + * + * Dump the annotation + */ +static void +xmlSchemaAnnotDump(FILE * output, xmlSchemaAnnotPtr annot) +{ + xmlChar *content; + + if (annot == NULL) + return; + + content = xmlNodeGetContent(annot->content); + if (content != NULL) { + fprintf(output, " Annot: %s\n", content); + xmlFree(content); + } else + fprintf(output, " Annot: empty\n"); +} + +/** + * xmlSchemaContentModelDump: + * @particle: the schema particle + * @output: the file output + * @depth: the depth used for intentation + * + * Dump a SchemaType structure + */ +static void +xmlSchemaContentModelDump(xmlSchemaParticlePtr particle, FILE * output, int depth) +{ + xmlChar *str = NULL; + xmlSchemaTreeItemPtr term; + char shift[100]; + int i; + + if (particle == NULL) + return; + for (i = 0;((i < depth) && (i < 25));i++) + shift[2 * i] = shift[2 * i + 1] = ' '; + shift[2 * i] = shift[2 * i + 1] = 0; + fprintf(output, "%s", shift); + if (particle->children == NULL) { + fprintf(output, "MISSING particle term\n"); + return; + } + term = particle->children; + if (term == NULL) { + fprintf(output, "(NULL)"); + } else { + switch (term->type) { + case XML_SCHEMA_TYPE_ELEMENT: + fprintf(output, "ELEM '%s'", xmlSchemaFormatQName(&str, + ((xmlSchemaElementPtr)term)->targetNamespace, + ((xmlSchemaElementPtr)term)->name)); + FREE_AND_NULL(str); + break; + case XML_SCHEMA_TYPE_SEQUENCE: + fprintf(output, "SEQUENCE"); + break; + case XML_SCHEMA_TYPE_CHOICE: + fprintf(output, "CHOICE"); + break; + case XML_SCHEMA_TYPE_ALL: + fprintf(output, "ALL"); + break; + case XML_SCHEMA_TYPE_ANY: + fprintf(output, "ANY"); + break; + default: + fprintf(output, "UNKNOWN\n"); + return; + } + } + if (particle->minOccurs != 1) + fprintf(output, " min: %d", particle->minOccurs); + if (particle->maxOccurs >= UNBOUNDED) + fprintf(output, " max: unbounded"); + else if (particle->maxOccurs != 1) + fprintf(output, " max: %d", particle->maxOccurs); + fprintf(output, "\n"); + if (term && + ((term->type == XML_SCHEMA_TYPE_SEQUENCE) || + (term->type == XML_SCHEMA_TYPE_CHOICE) || + (term->type == XML_SCHEMA_TYPE_ALL)) && + (term->children != NULL)) { + xmlSchemaContentModelDump((xmlSchemaParticlePtr) term->children, + output, depth +1); + } + if (particle->next != NULL) + xmlSchemaContentModelDump((xmlSchemaParticlePtr) particle->next, + output, depth); +} + +/** + * xmlSchemaAttrUsesDump: + * @uses: attribute uses list + * @output: the file output + * + * Dumps a list of attribute use components. + */ +static void +xmlSchemaAttrUsesDump(xmlSchemaItemListPtr uses, FILE * output) +{ + xmlSchemaAttributeUsePtr use; + xmlSchemaAttributeUseProhibPtr prohib; + xmlSchemaQNameRefPtr ref; + const xmlChar *name, *tns; + xmlChar *str = NULL; + int i; + + if ((uses == NULL) || (uses->nbItems == 0)) + return; + + fprintf(output, " attributes:\n"); + for (i = 0; i < uses->nbItems; i++) { + use = uses->items[i]; + if (use->type == XML_SCHEMA_EXTRA_ATTR_USE_PROHIB) { + fprintf(output, " [prohibition] "); + prohib = (xmlSchemaAttributeUseProhibPtr) use; + name = prohib->name; + tns = prohib->targetNamespace; + } else if (use->type == XML_SCHEMA_EXTRA_QNAMEREF) { + fprintf(output, " [reference] "); + ref = (xmlSchemaQNameRefPtr) use; + name = ref->name; + tns = ref->targetNamespace; + } else { + fprintf(output, " [use] "); + name = WXS_ATTRUSE_DECL_NAME(use); + tns = WXS_ATTRUSE_DECL_TNS(use); + } + fprintf(output, "'%s'\n", + (const char *) xmlSchemaFormatQName(&str, tns, name)); + FREE_AND_NULL(str); + } +} + +/** + * xmlSchemaTypeDump: + * @output: the file output + * @type: a type structure + * + * Dump a SchemaType structure + */ +static void +xmlSchemaTypeDump(xmlSchemaTypePtr type, FILE * output) +{ + if (type == NULL) { + fprintf(output, "Type: NULL\n"); + return; + } + fprintf(output, "Type: "); + if (type->name != NULL) + fprintf(output, "'%s' ", type->name); + else + fprintf(output, "(no name) "); + if (type->targetNamespace != NULL) + fprintf(output, "ns '%s' ", type->targetNamespace); + switch (type->type) { + case XML_SCHEMA_TYPE_BASIC: + fprintf(output, "[basic] "); + break; + case XML_SCHEMA_TYPE_SIMPLE: + fprintf(output, "[simple] "); + break; + case XML_SCHEMA_TYPE_COMPLEX: + fprintf(output, "[complex] "); + break; + case XML_SCHEMA_TYPE_SEQUENCE: + fprintf(output, "[sequence] "); + break; + case XML_SCHEMA_TYPE_CHOICE: + fprintf(output, "[choice] "); + break; + case XML_SCHEMA_TYPE_ALL: + fprintf(output, "[all] "); + break; + case XML_SCHEMA_TYPE_UR: + fprintf(output, "[ur] "); + break; + case XML_SCHEMA_TYPE_RESTRICTION: + fprintf(output, "[restriction] "); + break; + case XML_SCHEMA_TYPE_EXTENSION: + fprintf(output, "[extension] "); + break; + default: + fprintf(output, "[unknown type %d] ", type->type); + break; + } + fprintf(output, "content: "); + switch (type->contentType) { + case XML_SCHEMA_CONTENT_UNKNOWN: + fprintf(output, "[unknown] "); + break; + case XML_SCHEMA_CONTENT_EMPTY: + fprintf(output, "[empty] "); + break; + case XML_SCHEMA_CONTENT_ELEMENTS: + fprintf(output, "[element] "); + break; + case XML_SCHEMA_CONTENT_MIXED: + fprintf(output, "[mixed] "); + break; + case XML_SCHEMA_CONTENT_MIXED_OR_ELEMENTS: + /* not used. */ + break; + case XML_SCHEMA_CONTENT_BASIC: + fprintf(output, "[basic] "); + break; + case XML_SCHEMA_CONTENT_SIMPLE: + fprintf(output, "[simple] "); + break; + case XML_SCHEMA_CONTENT_ANY: + fprintf(output, "[any] "); + break; + } + fprintf(output, "\n"); + if (type->base != NULL) { + fprintf(output, " base type: '%s'", type->base); + if (type->baseNs != NULL) + fprintf(output, " ns '%s'\n", type->baseNs); + else + fprintf(output, "\n"); + } + if (type->attrUses != NULL) + xmlSchemaAttrUsesDump(type->attrUses, output); + if (type->annot != NULL) + xmlSchemaAnnotDump(output, type->annot); +#ifdef DUMP_CONTENT_MODEL + if ((type->type == XML_SCHEMA_TYPE_COMPLEX) && + (type->subtypes != NULL)) { + xmlSchemaContentModelDump((xmlSchemaParticlePtr) type->subtypes, + output, 1); + } +#endif +} + +/** + * xmlSchemaDump: + * @output: the file output + * @schema: a schema structure + * + * Dump a Schema structure. + */ +void +xmlSchemaDump(FILE * output, xmlSchemaPtr schema) +{ + if (output == NULL) + return; + if (schema == NULL) { + fprintf(output, "Schemas: NULL\n"); + return; + } + fprintf(output, "Schemas: "); + if (schema->name != NULL) + fprintf(output, "%s, ", schema->name); + else + fprintf(output, "no name, "); + if (schema->targetNamespace != NULL) + fprintf(output, "%s", (const char *) schema->targetNamespace); + else + fprintf(output, "no target namespace"); + fprintf(output, "\n"); + if (schema->annot != NULL) + xmlSchemaAnnotDump(output, schema->annot); + xmlHashScan(schema->typeDecl, (xmlHashScanner) xmlSchemaTypeDump, + output); + xmlHashScanFull(schema->elemDecl, + (xmlHashScannerFull) xmlSchemaElementDump, output); +} + +#ifdef DEBUG_IDC_NODE_TABLE +/** + * xmlSchemaDebugDumpIDCTable: + * @vctxt: the WXS validation context + * + * Displays the current IDC table for debug purposes. + */ +static void +xmlSchemaDebugDumpIDCTable(FILE * output, + const xmlChar *namespaceName, + const xmlChar *localName, + xmlSchemaPSVIIDCBindingPtr bind) +{ + xmlChar *str = NULL; + const xmlChar *value; + xmlSchemaPSVIIDCNodePtr tab; + xmlSchemaPSVIIDCKeyPtr key; + int i, j, res; + + fprintf(output, "IDC: TABLES on '%s'\n", + xmlSchemaFormatQName(&str, namespaceName, localName)); + FREE_AND_NULL(str) + + if (bind == NULL) + return; + do { + fprintf(output, "IDC: BINDING '%s' (%d)\n", + xmlSchemaGetComponentQName(&str, + bind->definition), bind->nbNodes); + FREE_AND_NULL(str) + for (i = 0; i < bind->nbNodes; i++) { + tab = bind->nodeTable[i]; + fprintf(output, " ( "); + for (j = 0; j < bind->definition->nbFields; j++) { + key = tab->keys[j]; + if ((key != NULL) && (key->val != NULL)) { + res = xmlSchemaGetCanonValue(key->val, &value); + if (res >= 0) + fprintf(output, "'%s' ", value); + else + fprintf(output, "CANON-VALUE-FAILED "); + if (res == 0) + FREE_AND_NULL(value) + } else if (key != NULL) + fprintf(output, "(no val), "); + else + fprintf(output, "(key missing), "); + } + fprintf(output, ")\n"); + } + if (bind->dupls && bind->dupls->nbItems) { + fprintf(output, "IDC: dupls (%d):\n", bind->dupls->nbItems); + for (i = 0; i < bind->dupls->nbItems; i++) { + tab = bind->dupls->items[i]; + fprintf(output, " ( "); + for (j = 0; j < bind->definition->nbFields; j++) { + key = tab->keys[j]; + if ((key != NULL) && (key->val != NULL)) { + res = xmlSchemaGetCanonValue(key->val, &value); + if (res >= 0) + fprintf(output, "'%s' ", value); + else + fprintf(output, "CANON-VALUE-FAILED "); + if (res == 0) + FREE_AND_NULL(value) + } else if (key != NULL) + fprintf(output, "(no val), "); + else + fprintf(output, "(key missing), "); + } + fprintf(output, ")\n"); + } + } + bind = bind->next; + } while (bind != NULL); +} +#endif /* DEBUG_IDC */ +#endif /* LIBXML_OUTPUT_ENABLED */ + +/************************************************************************ + * * + * Utilities * + * * + ************************************************************************/ + +/** + * xmlSchemaGetPropNode: + * @node: the element node + * @name: the name of the attribute + * + * Seeks an attribute with a name of @name in + * no namespace. + * + * Returns the attribute or NULL if not present. + */ +static xmlAttrPtr +xmlSchemaGetPropNode(xmlNodePtr node, const char *name) +{ + xmlAttrPtr prop; + + if ((node == NULL) || (name == NULL)) + return(NULL); + prop = node->properties; + while (prop != NULL) { + if ((prop->ns == NULL) && xmlStrEqual(prop->name, BAD_CAST name)) + return(prop); + prop = prop->next; + } + return (NULL); +} + +/** + * xmlSchemaGetPropNodeNs: + * @node: the element node + * @uri: the uri + * @name: the name of the attribute + * + * Seeks an attribute with a local name of @name and + * a namespace URI of @uri. + * + * Returns the attribute or NULL if not present. + */ +static xmlAttrPtr +xmlSchemaGetPropNodeNs(xmlNodePtr node, const char *uri, const char *name) +{ + xmlAttrPtr prop; + + if ((node == NULL) || (name == NULL)) + return(NULL); + prop = node->properties; + while (prop != NULL) { + if ((prop->ns != NULL) && + xmlStrEqual(prop->name, BAD_CAST name) && + xmlStrEqual(prop->ns->href, BAD_CAST uri)) + return(prop); + prop = prop->next; + } + return (NULL); +} + +static const xmlChar * +xmlSchemaGetNodeContent(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node) +{ + xmlChar *val; + const xmlChar *ret; + + val = xmlNodeGetContent(node); + if (val == NULL) + val = xmlStrdup((xmlChar *)""); + ret = xmlDictLookup(ctxt->dict, val, -1); + xmlFree(val); + return(ret); +} + +static const xmlChar * +xmlSchemaGetNodeContentNoDict(xmlNodePtr node) +{ + return((const xmlChar*) xmlNodeGetContent(node)); +} + +/** + * xmlSchemaGetProp: + * @ctxt: the parser context + * @node: the node + * @name: the property name + * + * Read a attribute value and internalize the string + * + * Returns the string or NULL if not present. + */ +static const xmlChar * +xmlSchemaGetProp(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node, + const char *name) +{ + xmlChar *val; + const xmlChar *ret; + + val = xmlGetNoNsProp(node, BAD_CAST name); + if (val == NULL) + return(NULL); + ret = xmlDictLookup(ctxt->dict, val, -1); + xmlFree(val); + return(ret); +} + +/************************************************************************ + * * + * Parsing functions * + * * + ************************************************************************/ + +#define WXS_FIND_GLOBAL_ITEM(slot) \ + if (xmlStrEqual(nsName, schema->targetNamespace)) { \ + ret = xmlHashLookup(schema->slot, name); \ + if (ret != NULL) goto exit; \ + } \ + if (xmlHashSize(schema->schemasImports) > 1) { \ + xmlSchemaImportPtr import; \ + if (nsName == NULL) \ + import = xmlHashLookup(schema->schemasImports, \ + XML_SCHEMAS_NO_NAMESPACE); \ + else \ + import = xmlHashLookup(schema->schemasImports, nsName); \ + if (import == NULL) \ + goto exit; \ + ret = xmlHashLookup(import->schema->slot, name); \ + } + +/** + * xmlSchemaGetElem: + * @schema: the schema context + * @name: the element name + * @ns: the element namespace + * + * Lookup a global element declaration in the schema. + * + * Returns the element declaration or NULL if not found. + */ +static xmlSchemaElementPtr +xmlSchemaGetElem(xmlSchemaPtr schema, const xmlChar * name, + const xmlChar * nsName) +{ + xmlSchemaElementPtr ret = NULL; + + if ((name == NULL) || (schema == NULL)) + return(NULL); + if (schema != NULL) { + WXS_FIND_GLOBAL_ITEM(elemDecl) + } +exit: +#ifdef DEBUG + if (ret == NULL) { + if (nsName == NULL) + fprintf(stderr, "Unable to lookup element decl. %s", name); + else + fprintf(stderr, "Unable to lookup element decl. %s:%s", name, + nsName); + } +#endif + return (ret); +} + +/** + * xmlSchemaGetType: + * @schema: the main schema + * @name: the type's name + * nsName: the type's namespace + * + * Lookup a type in the schemas or the predefined types + * + * Returns the group definition or NULL if not found. + */ +static xmlSchemaTypePtr +xmlSchemaGetType(xmlSchemaPtr schema, const xmlChar * name, + const xmlChar * nsName) +{ + xmlSchemaTypePtr ret = NULL; + + if (name == NULL) + return (NULL); + /* First try the built-in types. */ + if ((nsName != NULL) && xmlStrEqual(nsName, xmlSchemaNs)) { + ret = xmlSchemaGetPredefinedType(name, nsName); + if (ret != NULL) + goto exit; + /* + * Note that we try the parsed schemas as well here + * since one might have parsed the S4S, which contain more + * than the built-in types. + * TODO: Can we optimize this? + */ + } + if (schema != NULL) { + WXS_FIND_GLOBAL_ITEM(typeDecl) + } +exit: + +#ifdef DEBUG + if (ret == NULL) { + if (nsName == NULL) + fprintf(stderr, "Unable to lookup type %s", name); + else + fprintf(stderr, "Unable to lookup type %s:%s", name, + nsName); + } +#endif + return (ret); +} + +/** + * xmlSchemaGetAttributeDecl: + * @schema: the context of the schema + * @name: the name of the attribute + * @ns: the target namespace of the attribute + * + * Lookup a an attribute in the schema or imported schemas + * + * Returns the attribute declaration or NULL if not found. + */ +static xmlSchemaAttributePtr +xmlSchemaGetAttributeDecl(xmlSchemaPtr schema, const xmlChar * name, + const xmlChar * nsName) +{ + xmlSchemaAttributePtr ret = NULL; + + if ((name == NULL) || (schema == NULL)) + return (NULL); + if (schema != NULL) { + WXS_FIND_GLOBAL_ITEM(attrDecl) + } +exit: +#ifdef DEBUG + if (ret == NULL) { + if (nsName == NULL) + fprintf(stderr, "Unable to lookup attribute %s", name); + else + fprintf(stderr, "Unable to lookup attribute %s:%s", name, + nsName); + } +#endif + return (ret); +} + +/** + * xmlSchemaGetAttributeGroup: + * @schema: the context of the schema + * @name: the name of the attribute group + * @ns: the target namespace of the attribute group + * + * Lookup a an attribute group in the schema or imported schemas + * + * Returns the attribute group definition or NULL if not found. + */ +static xmlSchemaAttributeGroupPtr +xmlSchemaGetAttributeGroup(xmlSchemaPtr schema, const xmlChar * name, + const xmlChar * nsName) +{ + xmlSchemaAttributeGroupPtr ret = NULL; + + if ((name == NULL) || (schema == NULL)) + return (NULL); + if (schema != NULL) { + WXS_FIND_GLOBAL_ITEM(attrgrpDecl) + } +exit: + /* TODO: + if ((ret != NULL) && (ret->redef != NULL)) { + * Return the last redefinition. * + ret = ret->redef; + } + */ +#ifdef DEBUG + if (ret == NULL) { + if (nsName == NULL) + fprintf(stderr, "Unable to lookup attribute group %s", name); + else + fprintf(stderr, "Unable to lookup attribute group %s:%s", name, + nsName); + } +#endif + return (ret); +} + +/** + * xmlSchemaGetGroup: + * @schema: the context of the schema + * @name: the name of the group + * @ns: the target namespace of the group + * + * Lookup a group in the schema or imported schemas + * + * Returns the group definition or NULL if not found. + */ +static xmlSchemaModelGroupDefPtr +xmlSchemaGetGroup(xmlSchemaPtr schema, const xmlChar * name, + const xmlChar * nsName) +{ + xmlSchemaModelGroupDefPtr ret = NULL; + + if ((name == NULL) || (schema == NULL)) + return (NULL); + if (schema != NULL) { + WXS_FIND_GLOBAL_ITEM(groupDecl) + } +exit: + +#ifdef DEBUG + if (ret == NULL) { + if (nsName == NULL) + fprintf(stderr, "Unable to lookup group %s", name); + else + fprintf(stderr, "Unable to lookup group %s:%s", name, + nsName); + } +#endif + return (ret); +} + +static xmlSchemaNotationPtr +xmlSchemaGetNotation(xmlSchemaPtr schema, + const xmlChar *name, + const xmlChar *nsName) +{ + xmlSchemaNotationPtr ret = NULL; + + if ((name == NULL) || (schema == NULL)) + return (NULL); + if (schema != NULL) { + WXS_FIND_GLOBAL_ITEM(notaDecl) + } +exit: + return (ret); +} + +static xmlSchemaIDCPtr +xmlSchemaGetIDC(xmlSchemaPtr schema, + const xmlChar *name, + const xmlChar *nsName) +{ + xmlSchemaIDCPtr ret = NULL; + + if ((name == NULL) || (schema == NULL)) + return (NULL); + if (schema != NULL) { + WXS_FIND_GLOBAL_ITEM(idcDef) + } +exit: + return (ret); +} + +/** + * xmlSchemaGetNamedComponent: + * @schema: the schema + * @name: the name of the group + * @ns: the target namespace of the group + * + * Lookup a group in the schema or imported schemas + * + * Returns the group definition or NULL if not found. + */ +static xmlSchemaBasicItemPtr +xmlSchemaGetNamedComponent(xmlSchemaPtr schema, + xmlSchemaTypeType itemType, + const xmlChar *name, + const xmlChar *targetNs) +{ + switch (itemType) { + case XML_SCHEMA_TYPE_GROUP: + return ((xmlSchemaBasicItemPtr) xmlSchemaGetGroup(schema, + name, targetNs)); + case XML_SCHEMA_TYPE_ELEMENT: + return ((xmlSchemaBasicItemPtr) xmlSchemaGetElem(schema, + name, targetNs)); + default: + TODO + return (NULL); + } +} + +/************************************************************************ + * * + * Parsing functions * + * * + ************************************************************************/ + +#define IS_BLANK_NODE(n) \ + (((n)->type == XML_TEXT_NODE) && (xmlSchemaIsBlank((n)->content, -1))) + +/** + * xmlSchemaIsBlank: + * @str: a string + * @len: the length of the string or -1 + * + * Check if a string is ignorable + * + * Returns 1 if the string is NULL or made of blanks chars, 0 otherwise + */ +static int +xmlSchemaIsBlank(xmlChar * str, int len) +{ + if (str == NULL) + return (1); + if (len < 0) { + while (*str != 0) { + if (!(IS_BLANK_CH(*str))) + return (0); + str++; + } + } else while ((*str != 0) && (len != 0)) { + if (!(IS_BLANK_CH(*str))) + return (0); + str++; + len--; + } + + return (1); +} + +#define WXS_COMP_NAME(c, t) ((t) (c))->name +#define WXS_COMP_TNS(c, t) ((t) (c))->targetNamespace +/* +* xmlSchemaFindRedefCompInGraph: +* ATTENTION TODO: This uses pointer comp. for strings. +*/ +static xmlSchemaBasicItemPtr +xmlSchemaFindRedefCompInGraph(xmlSchemaBucketPtr bucket, + xmlSchemaTypeType type, + const xmlChar *name, + const xmlChar *nsName) +{ + xmlSchemaBasicItemPtr ret; + int i; + + if ((bucket == NULL) || (name == NULL)) + return(NULL); + if ((bucket->globals == NULL) || + (bucket->globals->nbItems == 0)) + goto subschemas; + /* + * Search in global components. + */ + for (i = 0; i < bucket->globals->nbItems; i++) { + ret = bucket->globals->items[i]; + if (ret->type == type) { + switch (type) { + case XML_SCHEMA_TYPE_COMPLEX: + case XML_SCHEMA_TYPE_SIMPLE: + if ((WXS_COMP_NAME(ret, xmlSchemaTypePtr) == name) && + (WXS_COMP_TNS(ret, xmlSchemaTypePtr) == + nsName)) + { + return(ret); + } + break; + case XML_SCHEMA_TYPE_GROUP: + if ((WXS_COMP_NAME(ret, + xmlSchemaModelGroupDefPtr) == name) && + (WXS_COMP_TNS(ret, + xmlSchemaModelGroupDefPtr) == nsName)) + { + return(ret); + } + break; + case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: + if ((WXS_COMP_NAME(ret, + xmlSchemaAttributeGroupPtr) == name) && + (WXS_COMP_TNS(ret, + xmlSchemaAttributeGroupPtr) == nsName)) + { + return(ret); + } + break; + default: + /* Should not be hit. */ + return(NULL); + } + } + } +subschemas: + /* + * Process imported/included schemas. + */ + if (bucket->relations != NULL) { + xmlSchemaSchemaRelationPtr rel = bucket->relations; + + /* + * TODO: Marking the bucket will not avoid multiple searches + * in the same schema, but avoids at least circularity. + */ + bucket->flags |= XML_SCHEMA_BUCKET_MARKED; + do { + if ((rel->bucket != NULL) && + ((rel->bucket->flags & XML_SCHEMA_BUCKET_MARKED) == 0)) { + ret = xmlSchemaFindRedefCompInGraph(rel->bucket, + type, name, nsName); + if (ret != NULL) + return(ret); + } + rel = rel->next; + } while (rel != NULL); + bucket->flags ^= XML_SCHEMA_BUCKET_MARKED; + } + return(NULL); +} + +/** + * xmlSchemaAddNotation: + * @ctxt: a schema parser context + * @schema: the schema being built + * @name: the item name + * + * Add an XML schema annotation declaration + * *WARNING* this interface is highly subject to change + * + * Returns the new struture or NULL in case of error + */ +static xmlSchemaNotationPtr +xmlSchemaAddNotation(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, + const xmlChar *name, const xmlChar *nsName, + xmlNodePtr node ATTRIBUTE_UNUSED) +{ + xmlSchemaNotationPtr ret = NULL; + + if ((ctxt == NULL) || (schema == NULL) || (name == NULL)) + return (NULL); + + ret = (xmlSchemaNotationPtr) xmlMalloc(sizeof(xmlSchemaNotation)); + if (ret == NULL) { + xmlSchemaPErrMemory(ctxt, "add annotation", NULL); + return (NULL); + } + memset(ret, 0, sizeof(xmlSchemaNotation)); + ret->type = XML_SCHEMA_TYPE_NOTATION; + ret->name = name; + ret->targetNamespace = nsName; + /* TODO: do we need the node to be set? + * ret->node = node;*/ + WXS_ADD_GLOBAL(ctxt, ret); + return (ret); +} + +/** + * xmlSchemaAddAttribute: + * @ctxt: a schema parser context + * @schema: the schema being built + * @name: the item name + * @namespace: the namespace + * + * Add an XML schema Attrribute declaration + * *WARNING* this interface is highly subject to change + * + * Returns the new struture or NULL in case of error + */ +static xmlSchemaAttributePtr +xmlSchemaAddAttribute(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, + const xmlChar * name, const xmlChar * nsName, + xmlNodePtr node, int topLevel) +{ + xmlSchemaAttributePtr ret = NULL; + + if ((ctxt == NULL) || (schema == NULL)) + return (NULL); + + ret = (xmlSchemaAttributePtr) xmlMalloc(sizeof(xmlSchemaAttribute)); + if (ret == NULL) { + xmlSchemaPErrMemory(ctxt, "allocating attribute", NULL); + return (NULL); + } + memset(ret, 0, sizeof(xmlSchemaAttribute)); + ret->type = XML_SCHEMA_TYPE_ATTRIBUTE; + ret->node = node; + ret->name = name; + ret->targetNamespace = nsName; + + if (topLevel) + WXS_ADD_GLOBAL(ctxt, ret); + else + WXS_ADD_LOCAL(ctxt, ret); + WXS_ADD_PENDING(ctxt, ret); + return (ret); +} + +/** + * xmlSchemaAddAttributeUse: + * @ctxt: a schema parser context + * @schema: the schema being built + * @name: the item name + * @namespace: the namespace + * + * Add an XML schema Attrribute declaration + * *WARNING* this interface is highly subject to change + * + * Returns the new struture or NULL in case of error + */ +static xmlSchemaAttributeUsePtr +xmlSchemaAddAttributeUse(xmlSchemaParserCtxtPtr pctxt, + xmlNodePtr node) +{ + xmlSchemaAttributeUsePtr ret = NULL; + + if (pctxt == NULL) + return (NULL); + + ret = (xmlSchemaAttributeUsePtr) xmlMalloc(sizeof(xmlSchemaAttributeUse)); + if (ret == NULL) { + xmlSchemaPErrMemory(pctxt, "allocating attribute", NULL); + return (NULL); + } + memset(ret, 0, sizeof(xmlSchemaAttributeUse)); + ret->type = XML_SCHEMA_TYPE_ATTRIBUTE_USE; + ret->node = node; + + WXS_ADD_LOCAL(pctxt, ret); + return (ret); +} + +/* +* xmlSchemaAddRedef: +* +* Adds a redefinition information. This is used at a later stage to: +* resolve references to the redefined components and to check constraints. +*/ +static xmlSchemaRedefPtr +xmlSchemaAddRedef(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaBucketPtr targetBucket, + void *item, + const xmlChar *refName, + const xmlChar *refTargetNs) +{ + xmlSchemaRedefPtr ret; + + ret = (xmlSchemaRedefPtr) + xmlMalloc(sizeof(xmlSchemaRedef)); + if (ret == NULL) { + xmlSchemaPErrMemory(pctxt, + "allocating redefinition info", NULL); + return (NULL); + } + memset(ret, 0, sizeof(xmlSchemaRedef)); + ret->item = item; + ret->targetBucket = targetBucket; + ret->refName = refName; + ret->refTargetNs = refTargetNs; + if (WXS_CONSTRUCTOR(pctxt)->redefs == NULL) + WXS_CONSTRUCTOR(pctxt)->redefs = ret; + else + WXS_CONSTRUCTOR(pctxt)->lastRedef->next = ret; + WXS_CONSTRUCTOR(pctxt)->lastRedef = ret; + + return (ret); +} + +/** + * xmlSchemaAddAttributeGroupDefinition: + * @ctxt: a schema parser context + * @schema: the schema being built + * @name: the item name + * @nsName: the target namespace + * @node: the corresponding node + * + * Add an XML schema Attrribute Group definition. + * + * Returns the new struture or NULL in case of error + */ +static xmlSchemaAttributeGroupPtr +xmlSchemaAddAttributeGroupDefinition(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaPtr schema ATTRIBUTE_UNUSED, + const xmlChar *name, + const xmlChar *nsName, + xmlNodePtr node) +{ + xmlSchemaAttributeGroupPtr ret = NULL; + + if ((pctxt == NULL) || (name == NULL)) + return (NULL); + + ret = (xmlSchemaAttributeGroupPtr) + xmlMalloc(sizeof(xmlSchemaAttributeGroup)); + if (ret == NULL) { + xmlSchemaPErrMemory(pctxt, "allocating attribute group", NULL); + return (NULL); + } + memset(ret, 0, sizeof(xmlSchemaAttributeGroup)); + ret->type = XML_SCHEMA_TYPE_ATTRIBUTEGROUP; + ret->name = name; + ret->targetNamespace = nsName; + ret->node = node; + + /* TODO: Remove the flag. */ + ret->flags |= XML_SCHEMAS_ATTRGROUP_GLOBAL; + if (pctxt->isRedefine) { + pctxt->redef = xmlSchemaAddRedef(pctxt, pctxt->redefined, + ret, name, nsName); + if (pctxt->redef == NULL) { + xmlFree(ret); + return(NULL); + } + pctxt->redefCounter = 0; + } + WXS_ADD_GLOBAL(pctxt, ret); + WXS_ADD_PENDING(pctxt, ret); + return (ret); +} + +/** + * xmlSchemaAddElement: + * @ctxt: a schema parser context + * @schema: the schema being built + * @name: the type name + * @namespace: the type namespace + * + * Add an XML schema Element declaration + * *WARNING* this interface is highly subject to change + * + * Returns the new struture or NULL in case of error + */ +static xmlSchemaElementPtr +xmlSchemaAddElement(xmlSchemaParserCtxtPtr ctxt, + const xmlChar * name, const xmlChar * nsName, + xmlNodePtr node, int topLevel) +{ + xmlSchemaElementPtr ret = NULL; + + if ((ctxt == NULL) || (name == NULL)) + return (NULL); + + ret = (xmlSchemaElementPtr) xmlMalloc(sizeof(xmlSchemaElement)); + if (ret == NULL) { + xmlSchemaPErrMemory(ctxt, "allocating element", NULL); + return (NULL); + } + memset(ret, 0, sizeof(xmlSchemaElement)); + ret->type = XML_SCHEMA_TYPE_ELEMENT; + ret->name = name; + ret->targetNamespace = nsName; + ret->node = node; + + if (topLevel) + WXS_ADD_GLOBAL(ctxt, ret); + else + WXS_ADD_LOCAL(ctxt, ret); + WXS_ADD_PENDING(ctxt, ret); + return (ret); +} + +/** + * xmlSchemaAddType: + * @ctxt: a schema parser context + * @schema: the schema being built + * @name: the item name + * @namespace: the namespace + * + * Add an XML schema item + * *WARNING* this interface is highly subject to change + * + * Returns the new struture or NULL in case of error + */ +static xmlSchemaTypePtr +xmlSchemaAddType(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, + xmlSchemaTypeType type, + const xmlChar * name, const xmlChar * nsName, + xmlNodePtr node, int topLevel) +{ + xmlSchemaTypePtr ret = NULL; + + if ((ctxt == NULL) || (schema == NULL)) + return (NULL); + + ret = (xmlSchemaTypePtr) xmlMalloc(sizeof(xmlSchemaType)); + if (ret == NULL) { + xmlSchemaPErrMemory(ctxt, "allocating type", NULL); + return (NULL); + } + memset(ret, 0, sizeof(xmlSchemaType)); + ret->type = type; + ret->name = name; + ret->targetNamespace = nsName; + ret->node = node; + if (topLevel) { + if (ctxt->isRedefine) { + ctxt->redef = xmlSchemaAddRedef(ctxt, ctxt->redefined, + ret, name, nsName); + if (ctxt->redef == NULL) { + xmlFree(ret); + return(NULL); + } + ctxt->redefCounter = 0; + } + WXS_ADD_GLOBAL(ctxt, ret); + } else + WXS_ADD_LOCAL(ctxt, ret); + WXS_ADD_PENDING(ctxt, ret); + return (ret); +} + +static xmlSchemaQNameRefPtr +xmlSchemaNewQNameRef(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaTypeType refType, + const xmlChar *refName, + const xmlChar *refNs) +{ + xmlSchemaQNameRefPtr ret; + + ret = (xmlSchemaQNameRefPtr) + xmlMalloc(sizeof(xmlSchemaQNameRef)); + if (ret == NULL) { + xmlSchemaPErrMemory(pctxt, + "allocating QName reference item", NULL); + return (NULL); + } + ret->node = NULL; + ret->type = XML_SCHEMA_EXTRA_QNAMEREF; + ret->name = refName; + ret->targetNamespace = refNs; + ret->item = NULL; + ret->itemType = refType; + /* + * Store the reference item in the schema. + */ + WXS_ADD_LOCAL(pctxt, ret); + return (ret); +} + +static xmlSchemaAttributeUseProhibPtr +xmlSchemaAddAttributeUseProhib(xmlSchemaParserCtxtPtr pctxt) +{ + xmlSchemaAttributeUseProhibPtr ret; + + ret = (xmlSchemaAttributeUseProhibPtr) + xmlMalloc(sizeof(xmlSchemaAttributeUseProhib)); + if (ret == NULL) { + xmlSchemaPErrMemory(pctxt, + "allocating attribute use prohibition", NULL); + return (NULL); + } + memset(ret, 0, sizeof(xmlSchemaAttributeUseProhib)); + ret->type = XML_SCHEMA_EXTRA_ATTR_USE_PROHIB; + WXS_ADD_LOCAL(pctxt, ret); + return (ret); +} + + +/** + * xmlSchemaAddModelGroup: + * @ctxt: a schema parser context + * @schema: the schema being built + * @type: the "compositor" type of the model group + * @node: the node in the schema doc + * + * Adds a schema model group + * *WARNING* this interface is highly subject to change + * + * Returns the new struture or NULL in case of error + */ +static xmlSchemaModelGroupPtr +xmlSchemaAddModelGroup(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaPtr schema, + xmlSchemaTypeType type, + xmlNodePtr node) +{ + xmlSchemaModelGroupPtr ret = NULL; + + if ((ctxt == NULL) || (schema == NULL)) + return (NULL); + + ret = (xmlSchemaModelGroupPtr) + xmlMalloc(sizeof(xmlSchemaModelGroup)); + if (ret == NULL) { + xmlSchemaPErrMemory(ctxt, "allocating model group component", + NULL); + return (NULL); + } + memset(ret, 0, sizeof(xmlSchemaModelGroup)); + ret->type = type; + ret->node = node; + WXS_ADD_LOCAL(ctxt, ret); + if ((type == XML_SCHEMA_TYPE_SEQUENCE) || + (type == XML_SCHEMA_TYPE_CHOICE)) + WXS_ADD_PENDING(ctxt, ret); + return (ret); +} + + +/** + * xmlSchemaAddParticle: + * @ctxt: a schema parser context + * @schema: the schema being built + * @node: the corresponding node in the schema doc + * @min: the minOccurs + * @max: the maxOccurs + * + * Adds an XML schema particle component. + * *WARNING* this interface is highly subject to change + * + * Returns the new struture or NULL in case of error + */ +static xmlSchemaParticlePtr +xmlSchemaAddParticle(xmlSchemaParserCtxtPtr ctxt, + xmlNodePtr node, int min, int max) +{ + xmlSchemaParticlePtr ret = NULL; + if (ctxt == NULL) + return (NULL); + +#ifdef DEBUG + fprintf(stderr, "Adding particle component\n"); +#endif + ret = (xmlSchemaParticlePtr) + xmlMalloc(sizeof(xmlSchemaParticle)); + if (ret == NULL) { + xmlSchemaPErrMemory(ctxt, "allocating particle component", + NULL); + return (NULL); + } + ret->type = XML_SCHEMA_TYPE_PARTICLE; + ret->annot = NULL; + ret->node = node; + ret->minOccurs = min; + ret->maxOccurs = max; + ret->next = NULL; + ret->children = NULL; + + WXS_ADD_LOCAL(ctxt, ret); + /* + * Note that addition to pending components will be done locally + * to the specific parsing function, since the most particles + * need not to be fixed up (i.e. the reference to be resolved). + * REMOVED: WXS_ADD_PENDING(ctxt, ret); + */ + return (ret); +} + +/** + * xmlSchemaAddModelGroupDefinition: + * @ctxt: a schema validation context + * @schema: the schema being built + * @name: the group name + * + * Add an XML schema Group definition + * + * Returns the new struture or NULL in case of error + */ +static xmlSchemaModelGroupDefPtr +xmlSchemaAddModelGroupDefinition(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaPtr schema, + const xmlChar *name, + const xmlChar *nsName, + xmlNodePtr node) +{ + xmlSchemaModelGroupDefPtr ret = NULL; + + if ((ctxt == NULL) || (schema == NULL) || (name == NULL)) + return (NULL); + + ret = (xmlSchemaModelGroupDefPtr) + xmlMalloc(sizeof(xmlSchemaModelGroupDef)); + if (ret == NULL) { + xmlSchemaPErrMemory(ctxt, "adding group", NULL); + return (NULL); + } + memset(ret, 0, sizeof(xmlSchemaModelGroupDef)); + ret->name = name; + ret->type = XML_SCHEMA_TYPE_GROUP; + ret->node = node; + ret->targetNamespace = nsName; + + if (ctxt->isRedefine) { + ctxt->redef = xmlSchemaAddRedef(ctxt, ctxt->redefined, + ret, name, nsName); + if (ctxt->redef == NULL) { + xmlFree(ret); + return(NULL); + } + ctxt->redefCounter = 0; + } + WXS_ADD_GLOBAL(ctxt, ret); + WXS_ADD_PENDING(ctxt, ret); + return (ret); +} + +/** + * xmlSchemaNewWildcardNs: + * @ctxt: a schema validation context + * + * Creates a new wildcard namespace constraint. + * + * Returns the new struture or NULL in case of error + */ +static xmlSchemaWildcardNsPtr +xmlSchemaNewWildcardNsConstraint(xmlSchemaParserCtxtPtr ctxt) +{ + xmlSchemaWildcardNsPtr ret; + + ret = (xmlSchemaWildcardNsPtr) + xmlMalloc(sizeof(xmlSchemaWildcardNs)); + if (ret == NULL) { + xmlSchemaPErrMemory(ctxt, "creating wildcard namespace constraint", NULL); + return (NULL); + } + ret->value = NULL; + ret->next = NULL; + return (ret); +} + +static xmlSchemaIDCPtr +xmlSchemaAddIDC(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, + const xmlChar *name, const xmlChar *nsName, + int category, xmlNodePtr node) +{ + xmlSchemaIDCPtr ret = NULL; + + if ((ctxt == NULL) || (schema == NULL) || (name == NULL)) + return (NULL); + + ret = (xmlSchemaIDCPtr) xmlMalloc(sizeof(xmlSchemaIDC)); + if (ret == NULL) { + xmlSchemaPErrMemory(ctxt, + "allocating an identity-constraint definition", NULL); + return (NULL); + } + memset(ret, 0, sizeof(xmlSchemaIDC)); + /* The target namespace of the parent element declaration. */ + ret->targetNamespace = nsName; + ret->name = name; + ret->type = category; + ret->node = node; + + WXS_ADD_GLOBAL(ctxt, ret); + /* + * Only keyrefs need to be fixup up. + */ + if (category == XML_SCHEMA_TYPE_IDC_KEYREF) + WXS_ADD_PENDING(ctxt, ret); + return (ret); +} + +/** + * xmlSchemaAddWildcard: + * @ctxt: a schema validation context + * @schema: a schema + * + * Adds a wildcard. + * It corresponds to a xsd:anyAttribute and xsd:any. + * + * Returns the new struture or NULL in case of error + */ +static xmlSchemaWildcardPtr +xmlSchemaAddWildcard(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, + xmlSchemaTypeType type, xmlNodePtr node) +{ + xmlSchemaWildcardPtr ret = NULL; + + if ((ctxt == NULL) || (schema == NULL)) + return (NULL); + + ret = (xmlSchemaWildcardPtr) xmlMalloc(sizeof(xmlSchemaWildcard)); + if (ret == NULL) { + xmlSchemaPErrMemory(ctxt, "adding wildcard", NULL); + return (NULL); + } + memset(ret, 0, sizeof(xmlSchemaWildcard)); + ret->type = type; + ret->node = node; + WXS_ADD_LOCAL(ctxt, ret); + return (ret); +} + +static void +xmlSchemaSubstGroupFree(xmlSchemaSubstGroupPtr group) +{ + if (group == NULL) + return; + if (group->members != NULL) + xmlSchemaItemListFree(group->members); + xmlFree(group); +} + +static xmlSchemaSubstGroupPtr +xmlSchemaSubstGroupAdd(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaElementPtr head) +{ + xmlSchemaSubstGroupPtr ret; + + /* Init subst group hash. */ + if (WXS_SUBST_GROUPS(pctxt) == NULL) { + WXS_SUBST_GROUPS(pctxt) = xmlHashCreateDict(10, pctxt->dict); + if (WXS_SUBST_GROUPS(pctxt) == NULL) + return(NULL); + } + /* Create a new substitution group. */ + ret = (xmlSchemaSubstGroupPtr) xmlMalloc(sizeof(xmlSchemaSubstGroup)); + if (ret == NULL) { + xmlSchemaPErrMemory(NULL, + "allocating a substitution group container", NULL); + return(NULL); + } + memset(ret, 0, sizeof(xmlSchemaSubstGroup)); + ret->head = head; + /* Create list of members. */ + ret->members = xmlSchemaItemListCreate(); + if (ret->members == NULL) { + xmlSchemaSubstGroupFree(ret); + return(NULL); + } + /* Add subst group to hash. */ + if (xmlHashAddEntry2(WXS_SUBST_GROUPS(pctxt), + head->name, head->targetNamespace, ret) != 0) { + PERROR_INT("xmlSchemaSubstGroupAdd", + "failed to add a new substitution container"); + xmlSchemaSubstGroupFree(ret); + return(NULL); + } + return(ret); +} + +static xmlSchemaSubstGroupPtr +xmlSchemaSubstGroupGet(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaElementPtr head) +{ + if (WXS_SUBST_GROUPS(pctxt) == NULL) + return(NULL); + return(xmlHashLookup2(WXS_SUBST_GROUPS(pctxt), + head->name, head->targetNamespace)); + +} + +/** + * xmlSchemaAddElementSubstitutionMember: + * @pctxt: a schema parser context + * @head: the head of the substitution group + * @member: the new member of the substitution group + * + * Allocate a new annotation structure. + * + * Returns the newly allocated structure or NULL in case or error + */ +static int +xmlSchemaAddElementSubstitutionMember(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaElementPtr head, + xmlSchemaElementPtr member) +{ + xmlSchemaSubstGroupPtr substGroup = NULL; + + if ((pctxt == NULL) || (head == NULL) || (member == NULL)) + return (-1); + + substGroup = xmlSchemaSubstGroupGet(pctxt, head); + if (substGroup == NULL) + substGroup = xmlSchemaSubstGroupAdd(pctxt, head); + if (substGroup == NULL) + return(-1); + if (xmlSchemaItemListAdd(substGroup->members, member) == -1) + return(-1); + return(0); +} + +/************************************************************************ + * * + * Utilities for parsing * + * * + ************************************************************************/ + +/** + * xmlSchemaPValAttrNodeQNameValue: + * @ctxt: a schema parser context + * @schema: the schema context + * @ownerDes: the designation of the parent element + * @ownerItem: the parent as a schema object + * @value: the QName value + * @local: the resulting local part if found, the attribute value otherwise + * @uri: the resulting namespace URI if found + * + * Extracts the local name and the URI of a QName value and validates it. + * This one is intended to be used on attribute values that + * should resolve to schema components. + * + * Returns 0, in case the QName is valid, a positive error code + * if not valid and -1 if an internal error occurs. + */ +static int +xmlSchemaPValAttrNodeQNameValue(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaPtr schema, + xmlSchemaBasicItemPtr ownerItem, + xmlAttrPtr attr, + const xmlChar *value, + const xmlChar **uri, + const xmlChar **local) +{ + const xmlChar *pref; + xmlNsPtr ns; + int len, ret; + + *uri = NULL; + *local = NULL; + ret = xmlValidateQName(value, 1); + if (ret > 0) { + xmlSchemaPSimpleTypeErr(ctxt, + XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, + ownerItem, (xmlNodePtr) attr, + xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME), + NULL, value, NULL, NULL, NULL); + *local = value; + return (ctxt->err); + } else if (ret < 0) + return (-1); + + if (!strchr((char *) value, ':')) { + ns = xmlSearchNs(attr->doc, attr->parent, NULL); + if (ns) + *uri = xmlDictLookup(ctxt->dict, ns->href, -1); + else if (schema->flags & XML_SCHEMAS_INCLUDING_CONVERT_NS) { + /* TODO: move XML_SCHEMAS_INCLUDING_CONVERT_NS to the + * parser context. */ + /* + * This one takes care of included schemas with no + * target namespace. + */ + *uri = ctxt->targetNamespace; + } + *local = xmlDictLookup(ctxt->dict, value, -1); + return (0); + } + /* + * At this point xmlSplitQName3 has to return a local name. + */ + *local = xmlSplitQName3(value, &len); + *local = xmlDictLookup(ctxt->dict, *local, -1); + pref = xmlDictLookup(ctxt->dict, value, len); + ns = xmlSearchNs(attr->doc, attr->parent, pref); + if (ns == NULL) { + xmlSchemaPSimpleTypeErr(ctxt, + XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, + ownerItem, (xmlNodePtr) attr, + xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME), NULL, value, + "The value '%s' of simple type 'xs:QName' has no " + "corresponding namespace declaration in scope", value, NULL); + return (ctxt->err); + } else { + *uri = xmlDictLookup(ctxt->dict, ns->href, -1); + } + return (0); +} + +/** + * xmlSchemaPValAttrNodeQName: + * @ctxt: a schema parser context + * @schema: the schema context + * @ownerDes: the designation of the owner element + * @ownerItem: the owner as a schema object + * @attr: the attribute node + * @local: the resulting local part if found, the attribute value otherwise + * @uri: the resulting namespace URI if found + * + * Extracts and validates the QName of an attribute value. + * This one is intended to be used on attribute values that + * should resolve to schema components. + * + * Returns 0, in case the QName is valid, a positive error code + * if not valid and -1 if an internal error occurs. + */ +static int +xmlSchemaPValAttrNodeQName(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaPtr schema, + xmlSchemaBasicItemPtr ownerItem, + xmlAttrPtr attr, + const xmlChar **uri, + const xmlChar **local) +{ + const xmlChar *value; + + value = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); + return (xmlSchemaPValAttrNodeQNameValue(ctxt, schema, + ownerItem, attr, value, uri, local)); +} + +/** + * xmlSchemaPValAttrQName: + * @ctxt: a schema parser context + * @schema: the schema context + * @ownerDes: the designation of the parent element + * @ownerItem: the owner as a schema object + * @ownerElem: the parent node of the attribute + * @name: the name of the attribute + * @local: the resulting local part if found, the attribute value otherwise + * @uri: the resulting namespace URI if found + * + * Extracts and validates the QName of an attribute value. + * + * Returns 0, in case the QName is valid, a positive error code + * if not valid and -1 if an internal error occurs. + */ +static int +xmlSchemaPValAttrQName(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaPtr schema, + xmlSchemaBasicItemPtr ownerItem, + xmlNodePtr ownerElem, + const char *name, + const xmlChar **uri, + const xmlChar **local) +{ + xmlAttrPtr attr; + + attr = xmlSchemaGetPropNode(ownerElem, name); + if (attr == NULL) { + *local = NULL; + *uri = NULL; + return (0); + } + return (xmlSchemaPValAttrNodeQName(ctxt, schema, + ownerItem, attr, uri, local)); +} + +/** + * xmlSchemaPValAttrID: + * @ctxt: a schema parser context + * @schema: the schema context + * @ownerDes: the designation of the parent element + * @ownerItem: the owner as a schema object + * @ownerElem: the parent node of the attribute + * @name: the name of the attribute + * + * Extracts and validates the ID of an attribute value. + * + * Returns 0, in case the ID is valid, a positive error code + * if not valid and -1 if an internal error occurs. + */ +static int +xmlSchemaPValAttrNodeID(xmlSchemaParserCtxtPtr ctxt, xmlAttrPtr attr) +{ + int ret; + const xmlChar *value; + + if (attr == NULL) + return(0); + value = xmlSchemaGetNodeContentNoDict((xmlNodePtr) attr); + ret = xmlValidateNCName(value, 1); + if (ret == 0) { + /* + * NOTE: the IDness might have already be declared in the DTD + */ + if (attr->atype != XML_ATTRIBUTE_ID) { + xmlIDPtr res; + xmlChar *strip; + + /* + * TODO: Use xmlSchemaStrip here; it's not exported at this + * moment. + */ + strip = xmlSchemaCollapseString(value); + if (strip != NULL) { + xmlFree((xmlChar *) value); + value = strip; + } + res = xmlAddID(NULL, attr->doc, value, attr); + if (res == NULL) { + ret = XML_SCHEMAP_S4S_ATTR_INVALID_VALUE; + xmlSchemaPSimpleTypeErr(ctxt, + XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, + NULL, (xmlNodePtr) attr, + xmlSchemaGetBuiltInType(XML_SCHEMAS_ID), + NULL, NULL, "Duplicate value '%s' of simple " + "type 'xs:ID'", value, NULL); + } else + attr->atype = XML_ATTRIBUTE_ID; + } + } else if (ret > 0) { + ret = XML_SCHEMAP_S4S_ATTR_INVALID_VALUE; + xmlSchemaPSimpleTypeErr(ctxt, + XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, + NULL, (xmlNodePtr) attr, + xmlSchemaGetBuiltInType(XML_SCHEMAS_ID), + NULL, NULL, "The value '%s' of simple type 'xs:ID' is " + "not a valid 'xs:NCName'", + value, NULL); + } + if (value != NULL) + xmlFree((xmlChar *)value); + + return (ret); +} + +static int +xmlSchemaPValAttrID(xmlSchemaParserCtxtPtr ctxt, + xmlNodePtr ownerElem, + const xmlChar *name) +{ + xmlAttrPtr attr; + + attr = xmlSchemaGetPropNode(ownerElem, (const char *) name); + if (attr == NULL) + return(0); + return(xmlSchemaPValAttrNodeID(ctxt, attr)); + +} + +/** + * xmlGetMaxOccurs: + * @ctxt: a schema validation context + * @node: a subtree containing XML Schema informations + * + * Get the maxOccurs property + * + * Returns the default if not found, or the value + */ +static int +xmlGetMaxOccurs(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node, + int min, int max, int def, const char *expected) +{ + const xmlChar *val, *cur; + int ret = 0; + xmlAttrPtr attr; + + attr = xmlSchemaGetPropNode(node, "maxOccurs"); + if (attr == NULL) + return (def); + val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); + + if (xmlStrEqual(val, (const xmlChar *) "unbounded")) { + if (max != UNBOUNDED) { + xmlSchemaPSimpleTypeErr(ctxt, + XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, + /* XML_SCHEMAP_INVALID_MINOCCURS, */ + NULL, (xmlNodePtr) attr, NULL, expected, + val, NULL, NULL, NULL); + return (def); + } else + return (UNBOUNDED); /* encoding it with -1 might be another option */ + } + + cur = val; + while (IS_BLANK_CH(*cur)) + cur++; + if (*cur == 0) { + xmlSchemaPSimpleTypeErr(ctxt, + XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, + /* XML_SCHEMAP_INVALID_MINOCCURS, */ + NULL, (xmlNodePtr) attr, NULL, expected, + val, NULL, NULL, NULL); + return (def); + } + while ((*cur >= '0') && (*cur <= '9')) { + ret = ret * 10 + (*cur - '0'); + cur++; + } + while (IS_BLANK_CH(*cur)) + cur++; + /* + * TODO: Restrict the maximal value to Integer. + */ + if ((*cur != 0) || (ret < min) || ((max != -1) && (ret > max))) { + xmlSchemaPSimpleTypeErr(ctxt, + XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, + /* XML_SCHEMAP_INVALID_MINOCCURS, */ + NULL, (xmlNodePtr) attr, NULL, expected, + val, NULL, NULL, NULL); + return (def); + } + return (ret); +} + +/** + * xmlGetMinOccurs: + * @ctxt: a schema validation context + * @node: a subtree containing XML Schema informations + * + * Get the minOccurs property + * + * Returns the default if not found, or the value + */ +static int +xmlGetMinOccurs(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node, + int min, int max, int def, const char *expected) +{ + const xmlChar *val, *cur; + int ret = 0; + xmlAttrPtr attr; + + attr = xmlSchemaGetPropNode(node, "minOccurs"); + if (attr == NULL) + return (def); + val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); + cur = val; + while (IS_BLANK_CH(*cur)) + cur++; + if (*cur == 0) { + xmlSchemaPSimpleTypeErr(ctxt, + XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, + /* XML_SCHEMAP_INVALID_MINOCCURS, */ + NULL, (xmlNodePtr) attr, NULL, expected, + val, NULL, NULL, NULL); + return (def); + } + while ((*cur >= '0') && (*cur <= '9')) { + ret = ret * 10 + (*cur - '0'); + cur++; + } + while (IS_BLANK_CH(*cur)) + cur++; + /* + * TODO: Restrict the maximal value to Integer. + */ + if ((*cur != 0) || (ret < min) || ((max != -1) && (ret > max))) { + xmlSchemaPSimpleTypeErr(ctxt, + XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, + /* XML_SCHEMAP_INVALID_MINOCCURS, */ + NULL, (xmlNodePtr) attr, NULL, expected, + val, NULL, NULL, NULL); + return (def); + } + return (ret); +} + +/** + * xmlSchemaPGetBoolNodeValue: + * @ctxt: a schema validation context + * @ownerDes: owner designation + * @ownerItem: the owner as a schema item + * @node: the node holding the value + * + * Converts a boolean string value into 1 or 0. + * + * Returns 0 or 1. + */ +static int +xmlSchemaPGetBoolNodeValue(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaBasicItemPtr ownerItem, + xmlNodePtr node) +{ + xmlChar *value = NULL; + int res = 0; + + value = xmlNodeGetContent(node); + /* + * 3.2.2.1 Lexical representation + * An instance of a datatype that is defined as �boolean� + * can have the following legal literals {true, false, 1, 0}. + */ + if (xmlStrEqual(BAD_CAST value, BAD_CAST "true")) + res = 1; + else if (xmlStrEqual(BAD_CAST value, BAD_CAST "false")) + res = 0; + else if (xmlStrEqual(BAD_CAST value, BAD_CAST "1")) + res = 1; + else if (xmlStrEqual(BAD_CAST value, BAD_CAST "0")) + res = 0; + else { + xmlSchemaPSimpleTypeErr(ctxt, + XML_SCHEMAP_INVALID_BOOLEAN, + ownerItem, node, + xmlSchemaGetBuiltInType(XML_SCHEMAS_BOOLEAN), + NULL, BAD_CAST value, + NULL, NULL, NULL); + } + if (value != NULL) + xmlFree(value); + return (res); +} + +/** + * xmlGetBooleanProp: + * @ctxt: a schema validation context + * @node: a subtree containing XML Schema informations + * @name: the attribute name + * @def: the default value + * + * Evaluate if a boolean property is set + * + * Returns the default if not found, 0 if found to be false, + * 1 if found to be true + */ +static int +xmlGetBooleanProp(xmlSchemaParserCtxtPtr ctxt, + xmlNodePtr node, + const char *name, int def) +{ + const xmlChar *val; + + val = xmlSchemaGetProp(ctxt, node, name); + if (val == NULL) + return (def); + /* + * 3.2.2.1 Lexical representation + * An instance of a datatype that is defined as �boolean� + * can have the following legal literals {true, false, 1, 0}. + */ + if (xmlStrEqual(val, BAD_CAST "true")) + def = 1; + else if (xmlStrEqual(val, BAD_CAST "false")) + def = 0; + else if (xmlStrEqual(val, BAD_CAST "1")) + def = 1; + else if (xmlStrEqual(val, BAD_CAST "0")) + def = 0; + else { + xmlSchemaPSimpleTypeErr(ctxt, + XML_SCHEMAP_INVALID_BOOLEAN, + NULL, + (xmlNodePtr) xmlSchemaGetPropNode(node, name), + xmlSchemaGetBuiltInType(XML_SCHEMAS_BOOLEAN), + NULL, val, NULL, NULL, NULL); + } + return (def); +} + +/************************************************************************ + * * + * Shema extraction from an Infoset * + * * + ************************************************************************/ +static xmlSchemaTypePtr xmlSchemaParseSimpleType(xmlSchemaParserCtxtPtr + ctxt, xmlSchemaPtr schema, + xmlNodePtr node, + int topLevel); +static xmlSchemaTypePtr xmlSchemaParseComplexType(xmlSchemaParserCtxtPtr + ctxt, + xmlSchemaPtr schema, + xmlNodePtr node, + int topLevel); +static xmlSchemaTypePtr xmlSchemaParseRestriction(xmlSchemaParserCtxtPtr + ctxt, + xmlSchemaPtr schema, + xmlNodePtr node, + xmlSchemaTypeType parentType); +static xmlSchemaBasicItemPtr +xmlSchemaParseLocalAttribute(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaPtr schema, + xmlNodePtr node, + xmlSchemaItemListPtr uses, + int parentType); +static xmlSchemaTypePtr xmlSchemaParseList(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaPtr schema, + xmlNodePtr node); +static xmlSchemaWildcardPtr +xmlSchemaParseAnyAttribute(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaPtr schema, xmlNodePtr node); + +/** + * xmlSchemaPValAttrNodeValue: + * + * @ctxt: a schema parser context + * @ownerDes: the designation of the parent element + * @ownerItem: the schema object owner if existent + * @attr: the schema attribute node being validated + * @value: the value + * @type: the built-in type to be validated against + * + * Validates a value against the given built-in type. + * This one is intended to be used internally for validation + * of schema attribute values during parsing of the schema. + * + * Returns 0 if the value is valid, a positive error code + * number otherwise and -1 in case of an internal or API error. + */ +static int +xmlSchemaPValAttrNodeValue(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaBasicItemPtr ownerItem, + xmlAttrPtr attr, + const xmlChar *value, + xmlSchemaTypePtr type) +{ + + int ret = 0; + + /* + * NOTE: Should we move this to xmlschematypes.c? Hmm, but this + * one is really meant to be used internally, so better not. + */ + if ((pctxt == NULL) || (type == NULL) || (attr == NULL)) + return (-1); + if (type->type != XML_SCHEMA_TYPE_BASIC) { + PERROR_INT("xmlSchemaPValAttrNodeValue", + "the given type is not a built-in type"); + return (-1); + } + switch (type->builtInType) { + case XML_SCHEMAS_NCNAME: + case XML_SCHEMAS_QNAME: + case XML_SCHEMAS_ANYURI: + case XML_SCHEMAS_TOKEN: + case XML_SCHEMAS_LANGUAGE: + ret = xmlSchemaValPredefTypeNode(type, value, NULL, + (xmlNodePtr) attr); + break; + default: { + PERROR_INT("xmlSchemaPValAttrNodeValue", + "validation using the given type is not supported while " + "parsing a schema"); + return (-1); + } + } + /* + * TODO: Should we use the S4S error codes instead? + */ + if (ret < 0) { + PERROR_INT("xmlSchemaPValAttrNodeValue", + "failed to validate a schema attribute value"); + return (-1); + } else if (ret > 0) { + if (WXS_IS_LIST(type)) + ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2; + else + ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1; + xmlSchemaPSimpleTypeErr(pctxt, + ret, ownerItem, (xmlNodePtr) attr, + type, NULL, value, NULL, NULL, NULL); + } + return (ret); +} + +/** + * xmlSchemaPValAttrNode: + * + * @ctxt: a schema parser context + * @ownerDes: the designation of the parent element + * @ownerItem: the schema object owner if existent + * @attr: the schema attribute node being validated + * @type: the built-in type to be validated against + * @value: the resulting value if any + * + * Extracts and validates a value against the given built-in type. + * This one is intended to be used internally for validation + * of schema attribute values during parsing of the schema. + * + * Returns 0 if the value is valid, a positive error code + * number otherwise and -1 in case of an internal or API error. + */ +static int +xmlSchemaPValAttrNode(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaBasicItemPtr ownerItem, + xmlAttrPtr attr, + xmlSchemaTypePtr type, + const xmlChar **value) +{ + const xmlChar *val; + + if ((ctxt == NULL) || (type == NULL) || (attr == NULL)) + return (-1); + + val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); + if (value != NULL) + *value = val; + + return (xmlSchemaPValAttrNodeValue(ctxt, ownerItem, attr, + val, type)); +} + +/** + * xmlSchemaPValAttr: + * + * @ctxt: a schema parser context + * @node: the element node of the attribute + * @ownerDes: the designation of the parent element + * @ownerItem: the schema object owner if existent + * @ownerElem: the owner element node + * @name: the name of the schema attribute node + * @type: the built-in type to be validated against + * @value: the resulting value if any + * + * Extracts and validates a value against the given built-in type. + * This one is intended to be used internally for validation + * of schema attribute values during parsing of the schema. + * + * Returns 0 if the value is valid, a positive error code + * number otherwise and -1 in case of an internal or API error. + */ +static int +xmlSchemaPValAttr(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaBasicItemPtr ownerItem, + xmlNodePtr ownerElem, + const char *name, + xmlSchemaTypePtr type, + const xmlChar **value) +{ + xmlAttrPtr attr; + + if ((ctxt == NULL) || (type == NULL)) { + if (value != NULL) + *value = NULL; + return (-1); + } + if (type->type != XML_SCHEMA_TYPE_BASIC) { + if (value != NULL) + *value = NULL; + xmlSchemaPErr(ctxt, ownerElem, + XML_SCHEMAP_INTERNAL, + "Internal error: xmlSchemaPValAttr, the given " + "type '%s' is not a built-in type.\n", + type->name, NULL); + return (-1); + } + attr = xmlSchemaGetPropNode(ownerElem, name); + if (attr == NULL) { + if (value != NULL) + *value = NULL; + return (0); + } + return (xmlSchemaPValAttrNode(ctxt, ownerItem, attr, + type, value)); +} + +static int +xmlSchemaCheckReference(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaPtr schema ATTRIBUTE_UNUSED, + xmlNodePtr node, + xmlAttrPtr attr, + const xmlChar *namespaceName) +{ + /* TODO: Pointer comparison instead? */ + if (xmlStrEqual(pctxt->targetNamespace, namespaceName)) + return (0); + if (xmlStrEqual(xmlSchemaNs, namespaceName)) + return (0); + /* + * Check if the referenced namespace was ed. + */ + if (WXS_BUCKET(pctxt)->relations != NULL) { + xmlSchemaSchemaRelationPtr rel; + + rel = WXS_BUCKET(pctxt)->relations; + do { + if (WXS_IS_BUCKET_IMPMAIN(rel->type) && + xmlStrEqual(namespaceName, rel->importNamespace)) + return (0); + rel = rel->next; + } while (rel != NULL); + } + /* + * No matching ed namespace found. + */ + { + xmlNodePtr n = (attr != NULL) ? (xmlNodePtr) attr : node; + + if (namespaceName == NULL) + xmlSchemaCustomErr(ACTXT_CAST pctxt, + XML_SCHEMAP_SRC_RESOLVE, n, NULL, + "References from this schema to components in no " + "namespace are not allowed, since not indicated by an " + "import statement", NULL, NULL); + else + xmlSchemaCustomErr(ACTXT_CAST pctxt, + XML_SCHEMAP_SRC_RESOLVE, n, NULL, + "References from this schema to components in the " + "namespace '%s' are not allowed, since not indicated by an " + "import statement", namespaceName, NULL); + } + return (XML_SCHEMAP_SRC_RESOLVE); +} + +/** + * xmlSchemaParseLocalAttributes: + * @ctxt: a schema validation context + * @schema: the schema being built + * @node: a subtree containing XML Schema informations + * @type: the hosting type where the attributes will be anchored + * + * Parses attribute uses and attribute declarations and + * attribute group references. + */ +static int +xmlSchemaParseLocalAttributes(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, + xmlNodePtr *child, xmlSchemaItemListPtr *list, + int parentType, int *hasRefs) +{ + void *item; + + while ((IS_SCHEMA((*child), "attribute")) || + (IS_SCHEMA((*child), "attributeGroup"))) { + if (IS_SCHEMA((*child), "attribute")) { + item = xmlSchemaParseLocalAttribute(ctxt, schema, *child, + *list, parentType); + } else { + item = xmlSchemaParseAttributeGroupRef(ctxt, schema, *child); + if ((item != NULL) && (hasRefs != NULL)) + *hasRefs = 1; + } + if (item != NULL) { + if (*list == NULL) { + /* TODO: Customize grow factor. */ + *list = xmlSchemaItemListCreate(); + if (*list == NULL) + return(-1); + } + if (xmlSchemaItemListAddSize(*list, 2, item) == -1) + return(-1); + } + *child = (*child)->next; + } + return (0); +} + +/** + * xmlSchemaParseAnnotation: + * @ctxt: a schema validation context + * @schema: the schema being built + * @node: a subtree containing XML Schema informations + * + * parse a XML schema Attrribute declaration + * *WARNING* this interface is highly subject to change + * + * Returns -1 in case of error, 0 if the declaration is improper and + * 1 in case of success. + */ +static xmlSchemaAnnotPtr +xmlSchemaParseAnnotation(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node, int needed) +{ + xmlSchemaAnnotPtr ret; + xmlNodePtr child = NULL; + xmlAttrPtr attr; + int barked = 0; + + /* + * INFO: S4S completed. + */ + /* + * id = ID + * {any attributes with non-schema namespace . . .}> + * Content: (appinfo | documentation)* + */ + if ((ctxt == NULL) || (node == NULL)) + return (NULL); + if (needed) + ret = xmlSchemaNewAnnot(ctxt, node); + else + ret = NULL; + attr = node->properties; + while (attr != NULL) { + if (((attr->ns == NULL) && + (!xmlStrEqual(attr->name, BAD_CAST "id"))) || + ((attr->ns != NULL) && + xmlStrEqual(attr->ns->href, xmlSchemaNs))) { + + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + attr = attr->next; + } + xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); + /* + * And now for the children... + */ + child = node->children; + while (child != NULL) { + if (IS_SCHEMA(child, "appinfo")) { + /* TODO: make available the content of "appinfo". */ + /* + * source = anyURI + * {any attributes with non-schema namespace . . .}> + * Content: ({any})* + */ + attr = child->properties; + while (attr != NULL) { + if (((attr->ns == NULL) && + (!xmlStrEqual(attr->name, BAD_CAST "source"))) || + ((attr->ns != NULL) && + xmlStrEqual(attr->ns->href, xmlSchemaNs))) { + + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + attr = attr->next; + } + xmlSchemaPValAttr(ctxt, NULL, child, "source", + xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI), NULL); + child = child->next; + } else if (IS_SCHEMA(child, "documentation")) { + /* TODO: make available the content of "documentation". */ + /* + * source = anyURI + * {any attributes with non-schema namespace . . .}> + * Content: ({any})* + */ + attr = child->properties; + while (attr != NULL) { + if (attr->ns == NULL) { + if (!xmlStrEqual(attr->name, BAD_CAST "source")) { + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + } else { + if (xmlStrEqual(attr->ns->href, xmlSchemaNs) || + (xmlStrEqual(attr->name, BAD_CAST "lang") && + (!xmlStrEqual(attr->ns->href, XML_XML_NAMESPACE)))) { + + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + } + attr = attr->next; + } + /* + * Attribute "xml:lang". + */ + attr = xmlSchemaGetPropNodeNs(child, (const char *) XML_XML_NAMESPACE, "lang"); + if (attr != NULL) + xmlSchemaPValAttrNode(ctxt, NULL, attr, + xmlSchemaGetBuiltInType(XML_SCHEMAS_LANGUAGE), NULL); + child = child->next; + } else { + if (!barked) + xmlSchemaPContentErr(ctxt, + XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, + NULL, node, child, NULL, "(appinfo | documentation)*"); + barked = 1; + child = child->next; + } + } + + return (ret); +} + +/** + * xmlSchemaParseFacet: + * @ctxt: a schema validation context + * @schema: the schema being built + * @node: a subtree containing XML Schema informations + * + * parse a XML schema Facet declaration + * *WARNING* this interface is highly subject to change + * + * Returns the new type structure or NULL in case of error + */ +static xmlSchemaFacetPtr +xmlSchemaParseFacet(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, + xmlNodePtr node) +{ + xmlSchemaFacetPtr facet; + xmlNodePtr child = NULL; + const xmlChar *value; + + if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) + return (NULL); + + facet = xmlSchemaNewFacet(); + if (facet == NULL) { + xmlSchemaPErrMemory(ctxt, "allocating facet", node); + return (NULL); + } + facet->node = node; + value = xmlSchemaGetProp(ctxt, node, "value"); + if (value == NULL) { + xmlSchemaPErr2(ctxt, node, child, XML_SCHEMAP_FACET_NO_VALUE, + "Facet %s has no value\n", node->name, NULL); + xmlSchemaFreeFacet(facet); + return (NULL); + } + if (IS_SCHEMA(node, "minInclusive")) { + facet->type = XML_SCHEMA_FACET_MININCLUSIVE; + } else if (IS_SCHEMA(node, "minExclusive")) { + facet->type = XML_SCHEMA_FACET_MINEXCLUSIVE; + } else if (IS_SCHEMA(node, "maxInclusive")) { + facet->type = XML_SCHEMA_FACET_MAXINCLUSIVE; + } else if (IS_SCHEMA(node, "maxExclusive")) { + facet->type = XML_SCHEMA_FACET_MAXEXCLUSIVE; + } else if (IS_SCHEMA(node, "totalDigits")) { + facet->type = XML_SCHEMA_FACET_TOTALDIGITS; + } else if (IS_SCHEMA(node, "fractionDigits")) { + facet->type = XML_SCHEMA_FACET_FRACTIONDIGITS; + } else if (IS_SCHEMA(node, "pattern")) { + facet->type = XML_SCHEMA_FACET_PATTERN; + } else if (IS_SCHEMA(node, "enumeration")) { + facet->type = XML_SCHEMA_FACET_ENUMERATION; + } else if (IS_SCHEMA(node, "whiteSpace")) { + facet->type = XML_SCHEMA_FACET_WHITESPACE; + } else if (IS_SCHEMA(node, "length")) { + facet->type = XML_SCHEMA_FACET_LENGTH; + } else if (IS_SCHEMA(node, "maxLength")) { + facet->type = XML_SCHEMA_FACET_MAXLENGTH; + } else if (IS_SCHEMA(node, "minLength")) { + facet->type = XML_SCHEMA_FACET_MINLENGTH; + } else { + xmlSchemaPErr2(ctxt, node, child, XML_SCHEMAP_UNKNOWN_FACET_TYPE, + "Unknown facet type %s\n", node->name, NULL); + xmlSchemaFreeFacet(facet); + return (NULL); + } + xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); + facet->value = value; + if ((facet->type != XML_SCHEMA_FACET_PATTERN) && + (facet->type != XML_SCHEMA_FACET_ENUMERATION)) { + const xmlChar *fixed; + + fixed = xmlSchemaGetProp(ctxt, node, "fixed"); + if (fixed != NULL) { + if (xmlStrEqual(fixed, BAD_CAST "true")) + facet->fixed = 1; + } + } + child = node->children; + + if (IS_SCHEMA(child, "annotation")) { + facet->annot = xmlSchemaParseAnnotation(ctxt, child, 1); + child = child->next; + } + if (child != NULL) { + xmlSchemaPErr2(ctxt, node, child, XML_SCHEMAP_UNKNOWN_FACET_CHILD, + "Facet %s has unexpected child content\n", + node->name, NULL); + } + return (facet); +} + +/** + * xmlSchemaParseWildcardNs: + * @ctxt: a schema parser context + * @wildc: the wildcard, already created + * @node: a subtree containing XML Schema informations + * + * Parses the attribute "processContents" and "namespace" + * of a xsd:anyAttribute and xsd:any. + * *WARNING* this interface is highly subject to change + * + * Returns 0 if everything goes fine, a positive error code + * if something is not valid and -1 if an internal error occurs. + */ +static int +xmlSchemaParseWildcardNs(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaPtr schema ATTRIBUTE_UNUSED, + xmlSchemaWildcardPtr wildc, + xmlNodePtr node) +{ + const xmlChar *pc, *ns, *dictnsItem; + int ret = 0; + xmlChar *nsItem; + xmlSchemaWildcardNsPtr tmp, lastNs = NULL; + xmlAttrPtr attr; + + pc = xmlSchemaGetProp(ctxt, node, "processContents"); + if ((pc == NULL) + || (xmlStrEqual(pc, (const xmlChar *) "strict"))) { + wildc->processContents = XML_SCHEMAS_ANY_STRICT; + } else if (xmlStrEqual(pc, (const xmlChar *) "skip")) { + wildc->processContents = XML_SCHEMAS_ANY_SKIP; + } else if (xmlStrEqual(pc, (const xmlChar *) "lax")) { + wildc->processContents = XML_SCHEMAS_ANY_LAX; + } else { + xmlSchemaPSimpleTypeErr(ctxt, + XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, + NULL, node, + NULL, "(strict | skip | lax)", pc, + NULL, NULL, NULL); + wildc->processContents = XML_SCHEMAS_ANY_STRICT; + ret = XML_SCHEMAP_S4S_ATTR_INVALID_VALUE; + } + /* + * Build the namespace constraints. + */ + attr = xmlSchemaGetPropNode(node, "namespace"); + ns = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); + if ((attr == NULL) || (xmlStrEqual(ns, BAD_CAST "##any"))) + wildc->any = 1; + else if (xmlStrEqual(ns, BAD_CAST "##other")) { + wildc->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt); + if (wildc->negNsSet == NULL) { + return (-1); + } + wildc->negNsSet->value = ctxt->targetNamespace; + } else { + const xmlChar *end, *cur; + + cur = ns; + do { + while (IS_BLANK_CH(*cur)) + cur++; + end = cur; + while ((*end != 0) && (!(IS_BLANK_CH(*end)))) + end++; + if (end == cur) + break; + nsItem = xmlStrndup(cur, end - cur); + if ((xmlStrEqual(nsItem, BAD_CAST "##other")) || + (xmlStrEqual(nsItem, BAD_CAST "##any"))) { + xmlSchemaPSimpleTypeErr(ctxt, + XML_SCHEMAP_WILDCARD_INVALID_NS_MEMBER, + NULL, (xmlNodePtr) attr, + NULL, + "((##any | ##other) | List of (xs:anyURI | " + "(##targetNamespace | ##local)))", + nsItem, NULL, NULL, NULL); + ret = XML_SCHEMAP_WILDCARD_INVALID_NS_MEMBER; + } else { + if (xmlStrEqual(nsItem, BAD_CAST "##targetNamespace")) { + dictnsItem = ctxt->targetNamespace; + } else if (xmlStrEqual(nsItem, BAD_CAST "##local")) { + dictnsItem = NULL; + } else { + /* + * Validate the item (anyURI). + */ + xmlSchemaPValAttrNodeValue(ctxt, NULL, attr, + nsItem, xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI)); + dictnsItem = xmlDictLookup(ctxt->dict, nsItem, -1); + } + /* + * Avoid dublicate namespaces. + */ + tmp = wildc->nsSet; + while (tmp != NULL) { + if (dictnsItem == tmp->value) + break; + tmp = tmp->next; + } + if (tmp == NULL) { + tmp = xmlSchemaNewWildcardNsConstraint(ctxt); + if (tmp == NULL) { + xmlFree(nsItem); + return (-1); + } + tmp->value = dictnsItem; + tmp->next = NULL; + if (wildc->nsSet == NULL) + wildc->nsSet = tmp; + else if (lastNs != NULL) + lastNs->next = tmp; + lastNs = tmp; + } + + } + xmlFree(nsItem); + cur = end; + } while (*cur != 0); + } + return (ret); +} + +static int +xmlSchemaPCheckParticleCorrect_2(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaParticlePtr item ATTRIBUTE_UNUSED, + xmlNodePtr node, + int minOccurs, + int maxOccurs) { + + if ((maxOccurs == 0) && ( minOccurs == 0)) + return (0); + if (maxOccurs != UNBOUNDED) { + /* + * TODO: Maybe we should better not create the particle, + * if min/max is invalid, since it could confuse the build of the + * content model. + */ + /* + * 3.9.6 Schema Component Constraint: Particle Correct + * + */ + if (maxOccurs < 1) { + /* + * 2.2 {max occurs} must be greater than or equal to 1. + */ + xmlSchemaPCustomAttrErr(ctxt, + XML_SCHEMAP_P_PROPS_CORRECT_2_2, + NULL, NULL, + xmlSchemaGetPropNode(node, "maxOccurs"), + "The value must be greater than or equal to 1"); + return (XML_SCHEMAP_P_PROPS_CORRECT_2_2); + } else if (minOccurs > maxOccurs) { + /* + * 2.1 {min occurs} must not be greater than {max occurs}. + */ + xmlSchemaPCustomAttrErr(ctxt, + XML_SCHEMAP_P_PROPS_CORRECT_2_1, + NULL, NULL, + xmlSchemaGetPropNode(node, "minOccurs"), + "The value must not be greater than the value of 'maxOccurs'"); + return (XML_SCHEMAP_P_PROPS_CORRECT_2_1); + } + } + return (0); +} + +/** + * xmlSchemaParseAny: + * @ctxt: a schema validation context + * @schema: the schema being built + * @node: a subtree containing XML Schema informations + * + * Parsea a XML schema element. A particle and wildcard + * will be created (except if minOccurs==maxOccurs==0, in this case + * nothing will be created). + * *WARNING* this interface is highly subject to change + * + * Returns the particle or NULL in case of error or if minOccurs==maxOccurs==0 + */ +static xmlSchemaParticlePtr +xmlSchemaParseAny(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, + xmlNodePtr node) +{ + xmlSchemaParticlePtr particle; + xmlNodePtr child = NULL; + xmlSchemaWildcardPtr wild; + int min, max; + xmlAttrPtr attr; + xmlSchemaAnnotPtr annot = NULL; + + if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) + return (NULL); + /* + * Check for illegal attributes. + */ + attr = node->properties; + while (attr != NULL) { + if (attr->ns == NULL) { + if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && + (!xmlStrEqual(attr->name, BAD_CAST "minOccurs")) && + (!xmlStrEqual(attr->name, BAD_CAST "maxOccurs")) && + (!xmlStrEqual(attr->name, BAD_CAST "namespace")) && + (!xmlStrEqual(attr->name, BAD_CAST "processContents"))) { + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + attr = attr->next; + } + xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); + /* + * minOccurs/maxOccurs. + */ + max = xmlGetMaxOccurs(ctxt, node, 0, UNBOUNDED, 1, + "(xs:nonNegativeInteger | unbounded)"); + min = xmlGetMinOccurs(ctxt, node, 0, -1, 1, + "xs:nonNegativeInteger"); + xmlSchemaPCheckParticleCorrect_2(ctxt, NULL, node, min, max); + /* + * Create & parse the wildcard. + */ + wild = xmlSchemaAddWildcard(ctxt, schema, XML_SCHEMA_TYPE_ANY, node); + if (wild == NULL) + return (NULL); + xmlSchemaParseWildcardNs(ctxt, schema, wild, node); + /* + * And now for the children... + */ + child = node->children; + if (IS_SCHEMA(child, "annotation")) { + annot = xmlSchemaParseAnnotation(ctxt, child, 1); + child = child->next; + } + if (child != NULL) { + xmlSchemaPContentErr(ctxt, + XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, + NULL, node, child, + NULL, "(annotation?)"); + } + /* + * No component if minOccurs==maxOccurs==0. + */ + if ((min == 0) && (max == 0)) { + /* Don't free the wildcard, since it's already on the list. */ + return (NULL); + } + /* + * Create the particle. + */ + particle = xmlSchemaAddParticle(ctxt, node, min, max); + if (particle == NULL) + return (NULL); + particle->annot = annot; + particle->children = (xmlSchemaTreeItemPtr) wild; + + return (particle); +} + +/** + * xmlSchemaParseNotation: + * @ctxt: a schema validation context + * @schema: the schema being built + * @node: a subtree containing XML Schema informations + * + * parse a XML schema Notation declaration + * + * Returns the new structure or NULL in case of error + */ +static xmlSchemaNotationPtr +xmlSchemaParseNotation(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, + xmlNodePtr node) +{ + const xmlChar *name; + xmlSchemaNotationPtr ret; + xmlNodePtr child = NULL; + + if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) + return (NULL); + name = xmlSchemaGetProp(ctxt, node, "name"); + if (name == NULL) { + xmlSchemaPErr2(ctxt, node, child, XML_SCHEMAP_NOTATION_NO_NAME, + "Notation has no name\n", NULL, NULL); + return (NULL); + } + ret = xmlSchemaAddNotation(ctxt, schema, name, + ctxt->targetNamespace, node); + if (ret == NULL) + return (NULL); + xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); + + child = node->children; + if (IS_SCHEMA(child, "annotation")) { + ret->annot = xmlSchemaParseAnnotation(ctxt, child, 1); + child = child->next; + } + if (child != NULL) { + xmlSchemaPContentErr(ctxt, + XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, + NULL, node, child, + NULL, "(annotation?)"); + } + + return (ret); +} + +/** + * xmlSchemaParseAnyAttribute: + * @ctxt: a schema validation context + * @schema: the schema being built + * @node: a subtree containing XML Schema informations + * + * parse a XML schema AnyAttrribute declaration + * *WARNING* this interface is highly subject to change + * + * Returns a wildcard or NULL. + */ +static xmlSchemaWildcardPtr +xmlSchemaParseAnyAttribute(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaPtr schema, xmlNodePtr node) +{ + xmlSchemaWildcardPtr ret; + xmlNodePtr child = NULL; + xmlAttrPtr attr; + + if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) + return (NULL); + + ret = xmlSchemaAddWildcard(ctxt, schema, XML_SCHEMA_TYPE_ANY_ATTRIBUTE, + node); + if (ret == NULL) { + return (NULL); + } + /* + * Check for illegal attributes. + */ + attr = node->properties; + while (attr != NULL) { + if (attr->ns == NULL) { + if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && + (!xmlStrEqual(attr->name, BAD_CAST "namespace")) && + (!xmlStrEqual(attr->name, BAD_CAST "processContents"))) { + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + attr = attr->next; + } + xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); + /* + * Parse the namespace list. + */ + if (xmlSchemaParseWildcardNs(ctxt, schema, ret, node) != 0) + return (NULL); + /* + * And now for the children... + */ + child = node->children; + if (IS_SCHEMA(child, "annotation")) { + ret->annot = xmlSchemaParseAnnotation(ctxt, child, 1); + child = child->next; + } + if (child != NULL) { + xmlSchemaPContentErr(ctxt, + XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, + NULL, node, child, + NULL, "(annotation?)"); + } + + return (ret); +} + + +/** + * xmlSchemaParseAttribute: + * @ctxt: a schema validation context + * @schema: the schema being built + * @node: a subtree containing XML Schema informations + * + * parse a XML schema Attrribute declaration + * *WARNING* this interface is highly subject to change + * + * Returns the attribute declaration. + */ +static xmlSchemaBasicItemPtr +xmlSchemaParseLocalAttribute(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaPtr schema, + xmlNodePtr node, + xmlSchemaItemListPtr uses, + int parentType) +{ + const xmlChar *attrValue, *name = NULL, *ns = NULL; + xmlSchemaAttributeUsePtr use = NULL; + xmlNodePtr child = NULL; + xmlAttrPtr attr; + const xmlChar *tmpNs = NULL, *tmpName = NULL, *defValue = NULL; + int isRef = 0, occurs = XML_SCHEMAS_ATTR_USE_OPTIONAL; + int nberrors, hasForm = 0, defValueType = 0; + +#define WXS_ATTR_DEF_VAL_DEFAULT 1 +#define WXS_ATTR_DEF_VAL_FIXED 2 + + /* + * 3.2.3 Constraints on XML Representations of Attribute Declarations + */ + + if ((pctxt == NULL) || (schema == NULL) || (node == NULL)) + return (NULL); + attr = xmlSchemaGetPropNode(node, "ref"); + if (attr != NULL) { + if (xmlSchemaPValAttrNodeQName(pctxt, schema, + NULL, attr, &tmpNs, &tmpName) != 0) { + return (NULL); + } + if (xmlSchemaCheckReference(pctxt, schema, node, attr, tmpNs) != 0) + return(NULL); + isRef = 1; + } + nberrors = pctxt->nberrors; + /* + * Check for illegal attributes. + */ + attr = node->properties; + while (attr != NULL) { + if (attr->ns == NULL) { + if (isRef) { + if (xmlStrEqual(attr->name, BAD_CAST "id")) { + xmlSchemaPValAttrNodeID(pctxt, attr); + goto attr_next; + } else if (xmlStrEqual(attr->name, BAD_CAST "ref")) { + goto attr_next; + } + } else { + if (xmlStrEqual(attr->name, BAD_CAST "name")) { + goto attr_next; + } else if (xmlStrEqual(attr->name, BAD_CAST "id")) { + xmlSchemaPValAttrNodeID(pctxt, attr); + goto attr_next; + } else if (xmlStrEqual(attr->name, BAD_CAST "type")) { + xmlSchemaPValAttrNodeQName(pctxt, schema, NULL, + attr, &tmpNs, &tmpName); + goto attr_next; + } else if (xmlStrEqual(attr->name, BAD_CAST "form")) { + /* + * Evaluate the target namespace + */ + hasForm = 1; + attrValue = xmlSchemaGetNodeContent(pctxt, + (xmlNodePtr) attr); + if (xmlStrEqual(attrValue, BAD_CAST "qualified")) { + ns = pctxt->targetNamespace; + } else if (!xmlStrEqual(attrValue, BAD_CAST "unqualified")) + { + xmlSchemaPSimpleTypeErr(pctxt, + XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, + NULL, (xmlNodePtr) attr, + NULL, "(qualified | unqualified)", + attrValue, NULL, NULL, NULL); + } + goto attr_next; + } + } + if (xmlStrEqual(attr->name, BAD_CAST "use")) { + + attrValue = xmlSchemaGetNodeContent(pctxt, (xmlNodePtr) attr); + /* TODO: Maybe we need to normalize the value beforehand. */ + if (xmlStrEqual(attrValue, BAD_CAST "optional")) + occurs = XML_SCHEMAS_ATTR_USE_OPTIONAL; + else if (xmlStrEqual(attrValue, BAD_CAST "prohibited")) + occurs = XML_SCHEMAS_ATTR_USE_PROHIBITED; + else if (xmlStrEqual(attrValue, BAD_CAST "required")) + occurs = XML_SCHEMAS_ATTR_USE_REQUIRED; + else { + xmlSchemaPSimpleTypeErr(pctxt, + XML_SCHEMAP_INVALID_ATTR_USE, + NULL, (xmlNodePtr) attr, + NULL, "(optional | prohibited | required)", + attrValue, NULL, NULL, NULL); + } + goto attr_next; + } else if (xmlStrEqual(attr->name, BAD_CAST "default")) { + /* + * 3.2.3 : 1 + * default and fixed must not both be present. + */ + if (defValue) { + xmlSchemaPMutualExclAttrErr(pctxt, + XML_SCHEMAP_SRC_ATTRIBUTE_1, + NULL, attr, "default", "fixed"); + } else { + defValue = xmlSchemaGetNodeContent(pctxt, (xmlNodePtr) attr); + defValueType = WXS_ATTR_DEF_VAL_DEFAULT; + } + goto attr_next; + } else if (xmlStrEqual(attr->name, BAD_CAST "fixed")) { + /* + * 3.2.3 : 1 + * default and fixed must not both be present. + */ + if (defValue) { + xmlSchemaPMutualExclAttrErr(pctxt, + XML_SCHEMAP_SRC_ATTRIBUTE_1, + NULL, attr, "default", "fixed"); + } else { + defValue = xmlSchemaGetNodeContent(pctxt, (xmlNodePtr) attr); + defValueType = WXS_ATTR_DEF_VAL_FIXED; + } + goto attr_next; + } + } else if (! xmlStrEqual(attr->ns->href, xmlSchemaNs)) + goto attr_next; + + xmlSchemaPIllegalAttrErr(pctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + +attr_next: + attr = attr->next; + } + /* + * 3.2.3 : 2 + * If default and use are both present, use must have + * the actual value optional. + */ + if ((defValueType == WXS_ATTR_DEF_VAL_DEFAULT) && + (occurs != XML_SCHEMAS_ATTR_USE_OPTIONAL)) { + xmlSchemaPSimpleTypeErr(pctxt, + XML_SCHEMAP_SRC_ATTRIBUTE_2, + NULL, node, NULL, + "(optional | prohibited | required)", NULL, + "The value of the attribute 'use' must be 'optional' " + "if the attribute 'default' is present", + NULL, NULL); + } + /* + * We want correct attributes. + */ + if (nberrors != pctxt->nberrors) + return(NULL); + if (! isRef) { + xmlSchemaAttributePtr attrDecl; + + /* TODO: move XML_SCHEMAS_QUALIF_ATTR to the parser. */ + if ((! hasForm) && (schema->flags & XML_SCHEMAS_QUALIF_ATTR)) + ns = pctxt->targetNamespace; + /* + * 3.2.6 Schema Component Constraint: xsi: Not Allowed + * TODO: Move this to the component layer. + */ + if (xmlStrEqual(ns, xmlSchemaInstanceNs)) { + xmlSchemaCustomErr(ACTXT_CAST pctxt, + XML_SCHEMAP_NO_XSI, + node, NULL, + "The target namespace must not match '%s'", + xmlSchemaInstanceNs, NULL); + } + attr = xmlSchemaGetPropNode(node, "name"); + if (attr == NULL) { + xmlSchemaPMissingAttrErr(pctxt, XML_SCHEMAP_S4S_ATTR_MISSING, + NULL, node, "name", NULL); + return (NULL); + } + if (xmlSchemaPValAttrNode(pctxt, NULL, attr, + xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0) { + return (NULL); + } + /* + * 3.2.6 Schema Component Constraint: xmlns Not Allowed + * TODO: Move this to the component layer. + */ + if (xmlStrEqual(name, BAD_CAST "xmlns")) { + xmlSchemaPSimpleTypeErr(pctxt, + XML_SCHEMAP_NO_XMLNS, + NULL, (xmlNodePtr) attr, + xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), NULL, NULL, + "The value of the attribute must not match 'xmlns'", + NULL, NULL); + return (NULL); + } + if (occurs == XML_SCHEMAS_ATTR_USE_PROHIBITED) + goto check_children; + /* + * Create the attribute use component. + */ + use = xmlSchemaAddAttributeUse(pctxt, node); + if (use == NULL) + return(NULL); + use->occurs = occurs; + /* + * Create the attribute declaration. + */ + attrDecl = xmlSchemaAddAttribute(pctxt, schema, name, ns, node, 0); + if (attrDecl == NULL) + return (NULL); + if (tmpName != NULL) { + attrDecl->typeName = tmpName; + attrDecl->typeNs = tmpNs; + } + use->attrDecl = attrDecl; + /* + * Value constraint. + */ + if (defValue != NULL) { + attrDecl->defValue = defValue; + if (defValueType == WXS_ATTR_DEF_VAL_FIXED) + attrDecl->flags |= XML_SCHEMAS_ATTR_FIXED; + } + } else if (occurs != XML_SCHEMAS_ATTR_USE_PROHIBITED) { + xmlSchemaQNameRefPtr ref; + + /* + * Create the attribute use component. + */ + use = xmlSchemaAddAttributeUse(pctxt, node); + if (use == NULL) + return(NULL); + /* + * We need to resolve the reference at later stage. + */ + WXS_ADD_PENDING(pctxt, use); + use->occurs = occurs; + /* + * Create a QName reference to the attribute declaration. + */ + ref = xmlSchemaNewQNameRef(pctxt, XML_SCHEMA_TYPE_ATTRIBUTE, + tmpName, tmpNs); + if (ref == NULL) + return(NULL); + /* + * Assign the reference. This will be substituted for the + * referenced attribute declaration when the QName is resolved. + */ + use->attrDecl = WXS_ATTR_CAST ref; + /* + * Value constraint. + */ + if (defValue != NULL) + use->defValue = defValue; + if (defValueType == WXS_ATTR_DEF_VAL_FIXED) + use->flags |= XML_SCHEMA_ATTR_USE_FIXED; + } + +check_children: + /* + * And now for the children... + */ + child = node->children; + if (occurs == XML_SCHEMAS_ATTR_USE_PROHIBITED) { + xmlSchemaAttributeUseProhibPtr prohib; + + if (IS_SCHEMA(child, "annotation")) { + xmlSchemaParseAnnotation(pctxt, child, 0); + child = child->next; + } + if (child != NULL) { + xmlSchemaPContentErr(pctxt, + XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, + NULL, node, child, NULL, + "(annotation?)"); + } + /* + * Check for pointlessness of attribute prohibitions. + */ + if (parentType == XML_SCHEMA_TYPE_ATTRIBUTEGROUP) { + xmlSchemaCustomWarning(ACTXT_CAST pctxt, + XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH, + node, NULL, + "Skipping attribute use prohibition, since it is " + "pointless inside an ", + NULL, NULL, NULL); + return(NULL); + } else if (parentType == XML_SCHEMA_TYPE_EXTENSION) { + xmlSchemaCustomWarning(ACTXT_CAST pctxt, + XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH, + node, NULL, + "Skipping attribute use prohibition, since it is " + "pointless when extending a type", + NULL, NULL, NULL); + return(NULL); + } + if (! isRef) { + tmpName = name; + tmpNs = ns; + } + /* + * Check for duplicate attribute prohibitions. + */ + if (uses) { + int i; + + for (i = 0; i < uses->nbItems; i++) { + use = uses->items[i]; + if ((use->type == XML_SCHEMA_EXTRA_ATTR_USE_PROHIB) && + (tmpName == (WXS_ATTR_PROHIB_CAST use)->name) && + (tmpNs == (WXS_ATTR_PROHIB_CAST use)->targetNamespace)) + { + xmlChar *str = NULL; + + xmlSchemaCustomWarning(ACTXT_CAST pctxt, + XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH, + node, NULL, + "Skipping duplicate attribute use prohibition '%s'", + xmlSchemaFormatQName(&str, tmpNs, tmpName), + NULL, NULL); + FREE_AND_NULL(str) + return(NULL); + } + } + } + /* + * Create the attribute prohibition helper component. + */ + prohib = xmlSchemaAddAttributeUseProhib(pctxt); + if (prohib == NULL) + return(NULL); + prohib->node = node; + prohib->name = tmpName; + prohib->targetNamespace = tmpNs; + if (isRef) { + /* + * We need at least to resolve to the attribute declaration. + */ + WXS_ADD_PENDING(pctxt, prohib); + } + return(WXS_BASIC_CAST prohib); + } else { + if (IS_SCHEMA(child, "annotation")) { + /* + * TODO: Should this go into the attr decl? + */ + use->annot = xmlSchemaParseAnnotation(pctxt, child, 1); + child = child->next; + } + if (isRef) { + if (child != NULL) { + if (IS_SCHEMA(child, "simpleType")) + /* + * 3.2.3 : 3.2 + * If ref is present, then all of , + * form and type must be absent. + */ + xmlSchemaPContentErr(pctxt, + XML_SCHEMAP_SRC_ATTRIBUTE_3_2, + NULL, node, child, NULL, + "(annotation?)"); + else + xmlSchemaPContentErr(pctxt, + XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, + NULL, node, child, NULL, + "(annotation?)"); + } + } else { + if (IS_SCHEMA(child, "simpleType")) { + if (WXS_ATTRUSE_DECL(use)->typeName != NULL) { + /* + * 3.2.3 : 4 + * type and must not both be present. + */ + xmlSchemaPContentErr(pctxt, XML_SCHEMAP_SRC_ATTRIBUTE_4, + NULL, node, child, + "The attribute 'type' and the child " + "are mutually exclusive", NULL); + } else + WXS_ATTRUSE_TYPEDEF(use) = + xmlSchemaParseSimpleType(pctxt, schema, child, 0); + child = child->next; + } + if (child != NULL) + xmlSchemaPContentErr(pctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, + NULL, node, child, NULL, + "(annotation?, simpleType?)"); + } + } + return (WXS_BASIC_CAST use); +} + + +static xmlSchemaAttributePtr +xmlSchemaParseGlobalAttribute(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaPtr schema, + xmlNodePtr node) +{ + const xmlChar *attrValue; + xmlSchemaAttributePtr ret; + xmlNodePtr child = NULL; + xmlAttrPtr attr; + + /* + * Note that the w3c spec assumes the schema to be validated with schema + * for schemas beforehand. + * + * 3.2.3 Constraints on XML Representations of Attribute Declarations + */ + if ((pctxt == NULL) || (schema == NULL) || (node == NULL)) + return (NULL); + /* + * 3.2.3 : 3.1 + * One of ref or name must be present, but not both + */ + attr = xmlSchemaGetPropNode(node, "name"); + if (attr == NULL) { + xmlSchemaPMissingAttrErr(pctxt, XML_SCHEMAP_S4S_ATTR_MISSING, + NULL, node, "name", NULL); + return (NULL); + } + if (xmlSchemaPValAttrNode(pctxt, NULL, attr, + xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &attrValue) != 0) { + return (NULL); + } + /* + * 3.2.6 Schema Component Constraint: xmlns Not Allowed + * TODO: Move this to the component layer. + */ + if (xmlStrEqual(attrValue, BAD_CAST "xmlns")) { + xmlSchemaPSimpleTypeErr(pctxt, + XML_SCHEMAP_NO_XMLNS, + NULL, (xmlNodePtr) attr, + xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), NULL, NULL, + "The value of the attribute must not match 'xmlns'", + NULL, NULL); + return (NULL); + } + /* + * 3.2.6 Schema Component Constraint: xsi: Not Allowed + * TODO: Move this to the component layer. + * Or better leave it here and add it to the component layer + * if we have a schema construction API. + */ + if (xmlStrEqual(pctxt->targetNamespace, xmlSchemaInstanceNs)) { + xmlSchemaCustomErr(ACTXT_CAST pctxt, + XML_SCHEMAP_NO_XSI, node, NULL, + "The target namespace must not match '%s'", + xmlSchemaInstanceNs, NULL); + } + + ret = xmlSchemaAddAttribute(pctxt, schema, attrValue, + pctxt->targetNamespace, node, 1); + if (ret == NULL) + return (NULL); + ret->flags |= XML_SCHEMAS_ATTR_GLOBAL; + + /* + * Check for illegal attributes. + */ + attr = node->properties; + while (attr != NULL) { + if (attr->ns == NULL) { + if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && + (!xmlStrEqual(attr->name, BAD_CAST "default")) && + (!xmlStrEqual(attr->name, BAD_CAST "fixed")) && + (!xmlStrEqual(attr->name, BAD_CAST "name")) && + (!xmlStrEqual(attr->name, BAD_CAST "type"))) + { + xmlSchemaPIllegalAttrErr(pctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { + xmlSchemaPIllegalAttrErr(pctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + attr = attr->next; + } + xmlSchemaPValAttrQName(pctxt, schema, NULL, + node, "type", &ret->typeNs, &ret->typeName); + + xmlSchemaPValAttrID(pctxt, node, BAD_CAST "id"); + /* + * Attribute "fixed". + */ + ret->defValue = xmlSchemaGetProp(pctxt, node, "fixed"); + if (ret->defValue != NULL) + ret->flags |= XML_SCHEMAS_ATTR_FIXED; + /* + * Attribute "default". + */ + attr = xmlSchemaGetPropNode(node, "default"); + if (attr != NULL) { + /* + * 3.2.3 : 1 + * default and fixed must not both be present. + */ + if (ret->flags & XML_SCHEMAS_ATTR_FIXED) { + xmlSchemaPMutualExclAttrErr(pctxt, XML_SCHEMAP_SRC_ATTRIBUTE_1, + WXS_BASIC_CAST ret, attr, "default", "fixed"); + } else + ret->defValue = xmlSchemaGetNodeContent(pctxt, (xmlNodePtr) attr); + } + /* + * And now for the children... + */ + child = node->children; + if (IS_SCHEMA(child, "annotation")) { + ret->annot = xmlSchemaParseAnnotation(pctxt, child, 1); + child = child->next; + } + if (IS_SCHEMA(child, "simpleType")) { + if (ret->typeName != NULL) { + /* + * 3.2.3 : 4 + * type and must not both be present. + */ + xmlSchemaPContentErr(pctxt, XML_SCHEMAP_SRC_ATTRIBUTE_4, + NULL, node, child, + "The attribute 'type' and the child " + "are mutually exclusive", NULL); + } else + ret->subtypes = xmlSchemaParseSimpleType(pctxt, schema, child, 0); + child = child->next; + } + if (child != NULL) + xmlSchemaPContentErr(pctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, + NULL, node, child, NULL, + "(annotation?, simpleType?)"); + + return (ret); +} + +/** + * xmlSchemaParseAttributeGroupRef: + * @ctxt: a schema validation context + * @schema: the schema being built + * @node: a subtree containing XML Schema informations + * + * Parse an attribute group definition reference. + * Note that a reference to an attribute group does not + * correspond to any component at all. + * *WARNING* this interface is highly subject to change + * + * Returns the attribute group or NULL in case of error. + */ +static xmlSchemaQNameRefPtr +xmlSchemaParseAttributeGroupRef(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaPtr schema, + xmlNodePtr node) +{ + xmlSchemaQNameRefPtr ret; + xmlNodePtr child = NULL; + xmlAttrPtr attr; + const xmlChar *refNs = NULL, *ref = NULL; + + if ((pctxt == NULL) || (schema == NULL) || (node == NULL)) + return (NULL); + + attr = xmlSchemaGetPropNode(node, "ref"); + if (attr == NULL) { + xmlSchemaPMissingAttrErr(pctxt, + XML_SCHEMAP_S4S_ATTR_MISSING, + NULL, node, "ref", NULL); + return (NULL); + } + xmlSchemaPValAttrNodeQName(pctxt, schema, + NULL, attr, &refNs, &ref); + if (xmlSchemaCheckReference(pctxt, schema, node, attr, refNs) != 0) + return(NULL); + + /* + * Check for illegal attributes. + */ + attr = node->properties; + while (attr != NULL) { + if (attr->ns == NULL) { + if ((!xmlStrEqual(attr->name, BAD_CAST "ref")) && + (!xmlStrEqual(attr->name, BAD_CAST "id"))) + { + xmlSchemaPIllegalAttrErr(pctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { + xmlSchemaPIllegalAttrErr(pctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + attr = attr->next; + } + /* Attribute ID */ + xmlSchemaPValAttrID(pctxt, node, BAD_CAST "id"); + + /* + * And now for the children... + */ + child = node->children; + if (IS_SCHEMA(child, "annotation")) { + /* + * TODO: We do not have a place to store the annotation, do we? + */ + xmlSchemaParseAnnotation(pctxt, child, 0); + child = child->next; + } + if (child != NULL) { + xmlSchemaPContentErr(pctxt, + XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, + NULL, node, child, NULL, + "(annotation?)"); + } + + /* + * Handle attribute group redefinitions. + */ + if (pctxt->isRedefine && pctxt->redef && + (pctxt->redef->item->type == + XML_SCHEMA_TYPE_ATTRIBUTEGROUP) && + (ref == pctxt->redef->refName) && + (refNs == pctxt->redef->refTargetNs)) + { + /* + * SPEC src-redefine: + * (7.1) "If it has an among its contents + * the �actual value� of whose ref [attribute] is the same + * as the �actual value� of its own name attribute plus + * target namespace, then it must have exactly one such group." + */ + if (pctxt->redefCounter != 0) { + xmlChar *str = NULL; + + xmlSchemaCustomErr(ACTXT_CAST pctxt, + XML_SCHEMAP_SRC_REDEFINE, node, NULL, + "The redefining attribute group definition " + "'%s' must not contain more than one " + "reference to the redefined definition", + xmlSchemaFormatQName(&str, refNs, ref), NULL); + FREE_AND_NULL(str); + return(NULL); + } + pctxt->redefCounter++; + /* + * URGENT TODO: How to ensure that the reference will not be + * handled by the normal component resolution mechanism? + */ + ret = xmlSchemaNewQNameRef(pctxt, + XML_SCHEMA_TYPE_ATTRIBUTEGROUP, ref, refNs); + if (ret == NULL) + return(NULL); + ret->node = node; + pctxt->redef->reference = WXS_BASIC_CAST ret; + } else { + /* + * Create a QName-reference helper component. We will substitute this + * component for the attribute uses of the referenced attribute group + * definition. + */ + ret = xmlSchemaNewQNameRef(pctxt, + XML_SCHEMA_TYPE_ATTRIBUTEGROUP, ref, refNs); + if (ret == NULL) + return(NULL); + ret->node = node; + /* Add to pending items, to be able to resolve the reference. */ + WXS_ADD_PENDING(pctxt, ret); + } + return (ret); +} + +/** + * xmlSchemaParseAttributeGroupDefinition: + * @pctxt: a schema validation context + * @schema: the schema being built + * @node: a subtree containing XML Schema informations + * + * parse a XML schema Attribute Group declaration + * *WARNING* this interface is highly subject to change + * + * Returns the attribute group definition or NULL in case of error. + */ +static xmlSchemaAttributeGroupPtr +xmlSchemaParseAttributeGroupDefinition(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaPtr schema, + xmlNodePtr node) +{ + const xmlChar *name; + xmlSchemaAttributeGroupPtr ret; + xmlNodePtr child = NULL; + xmlAttrPtr attr; + int hasRefs = 0; + + if ((pctxt == NULL) || (schema == NULL) || (node == NULL)) + return (NULL); + + attr = xmlSchemaGetPropNode(node, "name"); + if (attr == NULL) { + xmlSchemaPMissingAttrErr(pctxt, + XML_SCHEMAP_S4S_ATTR_MISSING, + NULL, node, "name", NULL); + return (NULL); + } + /* + * The name is crucial, exit if invalid. + */ + if (xmlSchemaPValAttrNode(pctxt, + NULL, attr, + xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0) { + return (NULL); + } + ret = xmlSchemaAddAttributeGroupDefinition(pctxt, schema, + name, pctxt->targetNamespace, node); + if (ret == NULL) + return (NULL); + /* + * Check for illegal attributes. + */ + attr = node->properties; + while (attr != NULL) { + if (attr->ns == NULL) { + if ((!xmlStrEqual(attr->name, BAD_CAST "name")) && + (!xmlStrEqual(attr->name, BAD_CAST "id"))) + { + xmlSchemaPIllegalAttrErr(pctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { + xmlSchemaPIllegalAttrErr(pctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + attr = attr->next; + } + /* Attribute ID */ + xmlSchemaPValAttrID(pctxt, node, BAD_CAST "id"); + /* + * And now for the children... + */ + child = node->children; + if (IS_SCHEMA(child, "annotation")) { + ret->annot = xmlSchemaParseAnnotation(pctxt, child, 1); + child = child->next; + } + /* + * Parse contained attribute decls/refs. + */ + if (xmlSchemaParseLocalAttributes(pctxt, schema, &child, + (xmlSchemaItemListPtr *) &(ret->attrUses), + XML_SCHEMA_TYPE_ATTRIBUTEGROUP, &hasRefs) == -1) + return(NULL); + if (hasRefs) + ret->flags |= XML_SCHEMAS_ATTRGROUP_HAS_REFS; + /* + * Parse the attribute wildcard. + */ + if (IS_SCHEMA(child, "anyAttribute")) { + ret->attributeWildcard = xmlSchemaParseAnyAttribute(pctxt, + schema, child); + child = child->next; + } + if (child != NULL) { + xmlSchemaPContentErr(pctxt, + XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, + NULL, node, child, NULL, + "(annotation?, ((attribute | attributeGroup)*, anyAttribute?))"); + } + return (ret); +} + +/** + * xmlSchemaPValAttrFormDefault: + * @value: the value + * @flags: the flags to be modified + * @flagQualified: the specific flag for "qualified" + * + * Returns 0 if the value is valid, 1 otherwise. + */ +static int +xmlSchemaPValAttrFormDefault(const xmlChar *value, + int *flags, + int flagQualified) +{ + if (xmlStrEqual(value, BAD_CAST "qualified")) { + if ((*flags & flagQualified) == 0) + *flags |= flagQualified; + } else if (!xmlStrEqual(value, BAD_CAST "unqualified")) + return (1); + + return (0); +} + +/** + * xmlSchemaPValAttrBlockFinal: + * @value: the value + * @flags: the flags to be modified + * @flagAll: the specific flag for "#all" + * @flagExtension: the specific flag for "extension" + * @flagRestriction: the specific flag for "restriction" + * @flagSubstitution: the specific flag for "substitution" + * @flagList: the specific flag for "list" + * @flagUnion: the specific flag for "union" + * + * Validates the value of the attribute "final" and "block". The value + * is converted into the specified flag values and returned in @flags. + * + * Returns 0 if the value is valid, 1 otherwise. + */ + +static int +xmlSchemaPValAttrBlockFinal(const xmlChar *value, + int *flags, + int flagAll, + int flagExtension, + int flagRestriction, + int flagSubstitution, + int flagList, + int flagUnion) +{ + int ret = 0; + + /* + * TODO: This does not check for dublicate entries. + */ + if ((flags == NULL) || (value == NULL)) + return (-1); + if (value[0] == 0) + return (0); + if (xmlStrEqual(value, BAD_CAST "#all")) { + if (flagAll != -1) + *flags |= flagAll; + else { + if (flagExtension != -1) + *flags |= flagExtension; + if (flagRestriction != -1) + *flags |= flagRestriction; + if (flagSubstitution != -1) + *flags |= flagSubstitution; + if (flagList != -1) + *flags |= flagList; + if (flagUnion != -1) + *flags |= flagUnion; + } + } else { + const xmlChar *end, *cur = value; + xmlChar *item; + + do { + while (IS_BLANK_CH(*cur)) + cur++; + end = cur; + while ((*end != 0) && (!(IS_BLANK_CH(*end)))) + end++; + if (end == cur) + break; + item = xmlStrndup(cur, end - cur); + if (xmlStrEqual(item, BAD_CAST "extension")) { + if (flagExtension != -1) { + if ((*flags & flagExtension) == 0) + *flags |= flagExtension; + } else + ret = 1; + } else if (xmlStrEqual(item, BAD_CAST "restriction")) { + if (flagRestriction != -1) { + if ((*flags & flagRestriction) == 0) + *flags |= flagRestriction; + } else + ret = 1; + } else if (xmlStrEqual(item, BAD_CAST "substitution")) { + if (flagSubstitution != -1) { + if ((*flags & flagSubstitution) == 0) + *flags |= flagSubstitution; + } else + ret = 1; + } else if (xmlStrEqual(item, BAD_CAST "list")) { + if (flagList != -1) { + if ((*flags & flagList) == 0) + *flags |= flagList; + } else + ret = 1; + } else if (xmlStrEqual(item, BAD_CAST "union")) { + if (flagUnion != -1) { + if ((*flags & flagUnion) == 0) + *flags |= flagUnion; + } else + ret = 1; + } else + ret = 1; + if (item != NULL) + xmlFree(item); + cur = end; + } while ((ret == 0) && (*cur != 0)); + } + + return (ret); +} + +static int +xmlSchemaCheckCSelectorXPath(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaIDCPtr idc, + xmlSchemaIDCSelectPtr selector, + xmlAttrPtr attr, + int isField) +{ + xmlNodePtr node; + + /* + * c-selector-xpath: + * Schema Component Constraint: Selector Value OK + * + * TODO: 1 The {selector} must be a valid XPath expression, as defined + * in [XPath]. + */ + if (selector == NULL) { + xmlSchemaPErr(ctxt, idc->node, + XML_SCHEMAP_INTERNAL, + "Internal error: xmlSchemaCheckCSelectorXPath, " + "the selector is not specified.\n", NULL, NULL); + return (-1); + } + if (attr == NULL) + node = idc->node; + else + node = (xmlNodePtr) attr; + if (selector->xpath == NULL) { + xmlSchemaPCustomErr(ctxt, + /* TODO: Adjust error code. */ + XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, + NULL, node, + "The XPath expression of the selector is not valid", NULL); + return (XML_SCHEMAP_S4S_ATTR_INVALID_VALUE); + } else { + const xmlChar **nsArray = NULL; + xmlNsPtr *nsList = NULL; + /* + * Compile the XPath expression. + */ + /* + * TODO: We need the array of in-scope namespaces for compilation. + * TODO: Call xmlPatterncompile with different options for selector/ + * field. + */ + if (attr == NULL) + nsList = NULL; + else + nsList = xmlGetNsList(attr->doc, attr->parent); + /* + * Build an array of prefixes and namespaces. + */ + if (nsList != NULL) { + int i, count = 0; + + for (i = 0; nsList[i] != NULL; i++) + count++; + + nsArray = (const xmlChar **) xmlMalloc( + (count * 2 + 1) * sizeof(const xmlChar *)); + if (nsArray == NULL) { + xmlSchemaPErrMemory(ctxt, "allocating a namespace array", + NULL); + xmlFree(nsList); + return (-1); + } + for (i = 0; i < count; i++) { + nsArray[2 * i] = nsList[i]->href; + nsArray[2 * i + 1] = nsList[i]->prefix; + } + nsArray[count * 2] = NULL; + xmlFree(nsList); + } + /* + * TODO: Differentiate between "selector" and "field". + */ + if (isField) + selector->xpathComp = (void *) xmlPatterncompile(selector->xpath, + NULL, XML_PATTERN_XSFIELD, nsArray); + else + selector->xpathComp = (void *) xmlPatterncompile(selector->xpath, + NULL, XML_PATTERN_XSSEL, nsArray); + if (nsArray != NULL) + xmlFree((xmlChar **) nsArray); + + if (selector->xpathComp == NULL) { + xmlSchemaPCustomErr(ctxt, + /* TODO: Adjust error code? */ + XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, + NULL, node, + "The XPath expression '%s' could not be " + "compiled", selector->xpath); + return (XML_SCHEMAP_S4S_ATTR_INVALID_VALUE); + } + } + return (0); +} + +#define ADD_ANNOTATION(annot) \ + xmlSchemaAnnotPtr cur = item->annot; \ + if (item->annot == NULL) { \ + item->annot = annot; \ + return (annot); \ + } \ + cur = item->annot; \ + if (cur->next != NULL) { \ + cur = cur->next; \ + } \ + cur->next = annot; + +/** + * xmlSchemaAssignAnnotation: + * @item: the schema component + * @annot: the annotation + * + * Adds the annotation to the given schema component. + * + * Returns the given annotaion. + */ +static xmlSchemaAnnotPtr +xmlSchemaAddAnnotation(xmlSchemaAnnotItemPtr annItem, + xmlSchemaAnnotPtr annot) +{ + if ((annItem == NULL) || (annot == NULL)) + return (NULL); + switch (annItem->type) { + case XML_SCHEMA_TYPE_ELEMENT: { + xmlSchemaElementPtr item = (xmlSchemaElementPtr) annItem; + ADD_ANNOTATION(annot) + } + break; + case XML_SCHEMA_TYPE_ATTRIBUTE: { + xmlSchemaAttributePtr item = (xmlSchemaAttributePtr) annItem; + ADD_ANNOTATION(annot) + } + break; + case XML_SCHEMA_TYPE_ANY_ATTRIBUTE: + case XML_SCHEMA_TYPE_ANY: { + xmlSchemaWildcardPtr item = (xmlSchemaWildcardPtr) annItem; + ADD_ANNOTATION(annot) + } + break; + case XML_SCHEMA_TYPE_PARTICLE: + case XML_SCHEMA_TYPE_IDC_KEY: + case XML_SCHEMA_TYPE_IDC_KEYREF: + case XML_SCHEMA_TYPE_IDC_UNIQUE: { + xmlSchemaAnnotItemPtr item = (xmlSchemaAnnotItemPtr) annItem; + ADD_ANNOTATION(annot) + } + break; + case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: { + xmlSchemaAttributeGroupPtr item = + (xmlSchemaAttributeGroupPtr) annItem; + ADD_ANNOTATION(annot) + } + break; + case XML_SCHEMA_TYPE_NOTATION: { + xmlSchemaNotationPtr item = (xmlSchemaNotationPtr) annItem; + ADD_ANNOTATION(annot) + } + break; + case XML_SCHEMA_FACET_MININCLUSIVE: + case XML_SCHEMA_FACET_MINEXCLUSIVE: + case XML_SCHEMA_FACET_MAXINCLUSIVE: + case XML_SCHEMA_FACET_MAXEXCLUSIVE: + case XML_SCHEMA_FACET_TOTALDIGITS: + case XML_SCHEMA_FACET_FRACTIONDIGITS: + case XML_SCHEMA_FACET_PATTERN: + case XML_SCHEMA_FACET_ENUMERATION: + case XML_SCHEMA_FACET_WHITESPACE: + case XML_SCHEMA_FACET_LENGTH: + case XML_SCHEMA_FACET_MAXLENGTH: + case XML_SCHEMA_FACET_MINLENGTH: { + xmlSchemaFacetPtr item = (xmlSchemaFacetPtr) annItem; + ADD_ANNOTATION(annot) + } + break; + case XML_SCHEMA_TYPE_SIMPLE: + case XML_SCHEMA_TYPE_COMPLEX: { + xmlSchemaTypePtr item = (xmlSchemaTypePtr) annItem; + ADD_ANNOTATION(annot) + } + break; + case XML_SCHEMA_TYPE_GROUP: { + xmlSchemaModelGroupDefPtr item = (xmlSchemaModelGroupDefPtr) annItem; + ADD_ANNOTATION(annot) + } + break; + case XML_SCHEMA_TYPE_SEQUENCE: + case XML_SCHEMA_TYPE_CHOICE: + case XML_SCHEMA_TYPE_ALL: { + xmlSchemaModelGroupPtr item = (xmlSchemaModelGroupPtr) annItem; + ADD_ANNOTATION(annot) + } + break; + default: + xmlSchemaPCustomErr(NULL, + XML_SCHEMAP_INTERNAL, + NULL, NULL, + "Internal error: xmlSchemaAddAnnotation, " + "The item is not a annotated schema component", NULL); + break; + } + return (annot); +} + +/** + * xmlSchemaParseIDCSelectorAndField: + * @ctxt: a schema validation context + * @schema: the schema being built + * @node: a subtree containing XML Schema informations + * + * Parses a XML Schema identity-contraint definition's + * and elements. + * + * Returns the parsed identity-constraint definition. + */ +static xmlSchemaIDCSelectPtr +xmlSchemaParseIDCSelectorAndField(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaIDCPtr idc, + xmlNodePtr node, + int isField) +{ + xmlSchemaIDCSelectPtr item; + xmlNodePtr child = NULL; + xmlAttrPtr attr; + + /* + * Check for illegal attributes. + */ + attr = node->properties; + while (attr != NULL) { + if (attr->ns == NULL) { + if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && + (!xmlStrEqual(attr->name, BAD_CAST "xpath"))) { + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + attr = attr->next; + } + /* + * Create the item. + */ + item = (xmlSchemaIDCSelectPtr) xmlMalloc(sizeof(xmlSchemaIDCSelect)); + if (item == NULL) { + xmlSchemaPErrMemory(ctxt, + "allocating a 'selector' of an identity-constraint definition", + NULL); + return (NULL); + } + memset(item, 0, sizeof(xmlSchemaIDCSelect)); + /* + * Attribute "xpath" (mandatory). + */ + attr = xmlSchemaGetPropNode(node, "xpath"); + if (attr == NULL) { + xmlSchemaPMissingAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_MISSING, + NULL, node, + "name", NULL); + } else { + item->xpath = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); + /* + * URGENT TODO: "field"s have an other syntax than "selector"s. + */ + + if (xmlSchemaCheckCSelectorXPath(ctxt, idc, item, attr, + isField) == -1) { + xmlSchemaPErr(ctxt, + (xmlNodePtr) attr, + XML_SCHEMAP_INTERNAL, + "Internal error: xmlSchemaParseIDCSelectorAndField, " + "validating the XPath expression of a IDC selector.\n", + NULL, NULL); + } + + } + xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); + /* + * And now for the children... + */ + child = node->children; + if (IS_SCHEMA(child, "annotation")) { + /* + * Add the annotation to the parent IDC. + */ + xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) idc, + xmlSchemaParseAnnotation(ctxt, child, 1)); + child = child->next; + } + if (child != NULL) { + xmlSchemaPContentErr(ctxt, + XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, + NULL, node, child, + NULL, "(annotation?)"); + } + + return (item); +} + +/** + * xmlSchemaParseIDC: + * @ctxt: a schema validation context + * @schema: the schema being built + * @node: a subtree containing XML Schema informations + * + * Parses a XML Schema identity-contraint definition. + * + * Returns the parsed identity-constraint definition. + */ +static xmlSchemaIDCPtr +xmlSchemaParseIDC(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaPtr schema, + xmlNodePtr node, + xmlSchemaTypeType idcCategory, + const xmlChar *targetNamespace) +{ + xmlSchemaIDCPtr item = NULL; + xmlNodePtr child = NULL; + xmlAttrPtr attr; + const xmlChar *name = NULL; + xmlSchemaIDCSelectPtr field = NULL, lastField = NULL; + + /* + * Check for illegal attributes. + */ + attr = node->properties; + while (attr != NULL) { + if (attr->ns == NULL) { + if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && + (!xmlStrEqual(attr->name, BAD_CAST "name")) && + ((idcCategory != XML_SCHEMA_TYPE_IDC_KEYREF) || + (!xmlStrEqual(attr->name, BAD_CAST "refer")))) { + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + attr = attr->next; + } + /* + * Attribute "name" (mandatory). + */ + attr = xmlSchemaGetPropNode(node, "name"); + if (attr == NULL) { + xmlSchemaPMissingAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_MISSING, + NULL, node, + "name", NULL); + return (NULL); + } else if (xmlSchemaPValAttrNode(ctxt, + NULL, attr, + xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0) { + return (NULL); + } + /* Create the component. */ + item = xmlSchemaAddIDC(ctxt, schema, name, targetNamespace, + idcCategory, node); + if (item == NULL) + return(NULL); + + xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); + if (idcCategory == XML_SCHEMA_TYPE_IDC_KEYREF) { + /* + * Attribute "refer" (mandatory). + */ + attr = xmlSchemaGetPropNode(node, "refer"); + if (attr == NULL) { + xmlSchemaPMissingAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_MISSING, + NULL, node, + "refer", NULL); + } else { + /* + * Create a reference item. + */ + item->ref = xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_IDC_KEY, + NULL, NULL); + if (item->ref == NULL) + return (NULL); + xmlSchemaPValAttrNodeQName(ctxt, schema, + NULL, attr, + &(item->ref->targetNamespace), + &(item->ref->name)); + xmlSchemaCheckReference(ctxt, schema, node, attr, + item->ref->targetNamespace); + } + } + /* + * And now for the children... + */ + child = node->children; + if (IS_SCHEMA(child, "annotation")) { + item->annot = xmlSchemaParseAnnotation(ctxt, child, 1); + child = child->next; + } + if (child == NULL) { + xmlSchemaPContentErr(ctxt, + XML_SCHEMAP_S4S_ELEM_MISSING, + NULL, node, child, + "A child element is missing", + "(annotation?, (selector, field+))"); + } + /* + * Child element . + */ + if (IS_SCHEMA(child, "selector")) { + item->selector = xmlSchemaParseIDCSelectorAndField(ctxt, + item, child, 0); + child = child->next; + /* + * Child elements . + */ + if (IS_SCHEMA(child, "field")) { + do { + field = xmlSchemaParseIDCSelectorAndField(ctxt, + item, child, 1); + if (field != NULL) { + field->index = item->nbFields; + item->nbFields++; + if (lastField != NULL) + lastField->next = field; + else + item->fields = field; + lastField = field; + } + child = child->next; + } while (IS_SCHEMA(child, "field")); + } else { + xmlSchemaPContentErr(ctxt, + XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, + NULL, node, child, + NULL, "(annotation?, (selector, field+))"); + } + } + if (child != NULL) { + xmlSchemaPContentErr(ctxt, + XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, + NULL, node, child, + NULL, "(annotation?, (selector, field+))"); + } + + return (item); +} + +/** + * xmlSchemaParseElement: + * @ctxt: a schema validation context + * @schema: the schema being built + * @node: a subtree containing XML Schema informations + * @topLevel: indicates if this is global declaration + * + * Parses a XML schema element declaration. + * *WARNING* this interface is highly subject to change + * + * Returns the element declaration or a particle; NULL in case + * of an error or if the particle has minOccurs==maxOccurs==0. + */ +static xmlSchemaBasicItemPtr +xmlSchemaParseElement(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, + xmlNodePtr node, int *isElemRef, int topLevel) +{ + xmlSchemaElementPtr decl = NULL; + xmlSchemaParticlePtr particle = NULL; + xmlSchemaAnnotPtr annot = NULL; + xmlNodePtr child = NULL; + xmlAttrPtr attr, nameAttr; + int min, max, isRef = 0; + xmlChar *des = NULL; + + /* 3.3.3 Constraints on XML Representations of Element Declarations */ + /* TODO: Complete implementation of 3.3.6 */ + + if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) + return (NULL); + + if (isElemRef != NULL) + *isElemRef = 0; + /* + * If we get a "ref" attribute on a local we will assume it's + * a reference - even if there's a "name" attribute; this seems to be more + * robust. + */ + nameAttr = xmlSchemaGetPropNode(node, "name"); + attr = xmlSchemaGetPropNode(node, "ref"); + if ((topLevel) || (attr == NULL)) { + if (nameAttr == NULL) { + xmlSchemaPMissingAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_MISSING, + NULL, node, "name", NULL); + return (NULL); + } + } else + isRef = 1; + + xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); + child = node->children; + if (IS_SCHEMA(child, "annotation")) { + annot = xmlSchemaParseAnnotation(ctxt, child, 1); + child = child->next; + } + /* + * Skip particle part if a global declaration. + */ + if (topLevel) + goto declaration_part; + /* + * The particle part ================================================== + */ + min = xmlGetMinOccurs(ctxt, node, 0, -1, 1, "xs:nonNegativeInteger"); + max = xmlGetMaxOccurs(ctxt, node, 0, UNBOUNDED, 1, "(xs:nonNegativeInteger | unbounded)"); + xmlSchemaPCheckParticleCorrect_2(ctxt, NULL, node, min, max); + particle = xmlSchemaAddParticle(ctxt, node, min, max); + if (particle == NULL) + goto return_null; + + /* ret->flags |= XML_SCHEMAS_ELEM_REF; */ + + if (isRef) { + const xmlChar *refNs = NULL, *ref = NULL; + xmlSchemaQNameRefPtr refer = NULL; + /* + * The reference part ============================================= + */ + if (isElemRef != NULL) + *isElemRef = 1; + + xmlSchemaPValAttrNodeQName(ctxt, schema, + NULL, attr, &refNs, &ref); + xmlSchemaCheckReference(ctxt, schema, node, attr, refNs); + /* + * SPEC (3.3.3 : 2.1) "One of ref or name must be present, but not both" + */ + if (nameAttr != NULL) { + xmlSchemaPMutualExclAttrErr(ctxt, + XML_SCHEMAP_SRC_ELEMENT_2_1, NULL, nameAttr, "ref", "name"); + } + /* + * Check for illegal attributes. + */ + attr = node->properties; + while (attr != NULL) { + if (attr->ns == NULL) { + if (xmlStrEqual(attr->name, BAD_CAST "ref") || + xmlStrEqual(attr->name, BAD_CAST "name") || + xmlStrEqual(attr->name, BAD_CAST "id") || + xmlStrEqual(attr->name, BAD_CAST "maxOccurs") || + xmlStrEqual(attr->name, BAD_CAST "minOccurs")) + { + attr = attr->next; + continue; + } else { + /* SPEC (3.3.3 : 2.2) */ + xmlSchemaPCustomAttrErr(ctxt, + XML_SCHEMAP_SRC_ELEMENT_2_2, + NULL, NULL, attr, + "Only the attributes 'minOccurs', 'maxOccurs' and " + "'id' are allowed in addition to 'ref'"); + break; + } + } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + attr = attr->next; + } + /* + * No children except expected. + */ + if (child != NULL) { + xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, + NULL, node, child, NULL, "(annotation?)"); + } + if ((min == 0) && (max == 0)) + goto return_null; + /* + * Create the reference item and attach it to the particle. + */ + refer = xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_ELEMENT, + ref, refNs); + if (refer == NULL) + goto return_null; + particle->children = (xmlSchemaTreeItemPtr) refer; + particle->annot = annot; + /* + * Add the particle to pending components, since the reference + * need to be resolved. + */ + WXS_ADD_PENDING(ctxt, particle); + return ((xmlSchemaBasicItemPtr) particle); + } + /* + * The declaration part =============================================== + */ +declaration_part: + { + const xmlChar *ns = NULL, *fixed, *name, *attrValue; + xmlSchemaIDCPtr curIDC = NULL, lastIDC = NULL; + + if (xmlSchemaPValAttrNode(ctxt, NULL, nameAttr, + xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0) + goto return_null; + /* + * Evaluate the target namespace. + */ + if (topLevel) { + ns = ctxt->targetNamespace; + } else { + attr = xmlSchemaGetPropNode(node, "form"); + if (attr != NULL) { + attrValue = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); + if (xmlStrEqual(attrValue, BAD_CAST "qualified")) { + ns = ctxt->targetNamespace; + } else if (!xmlStrEqual(attrValue, BAD_CAST "unqualified")) { + xmlSchemaPSimpleTypeErr(ctxt, + XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, + NULL, (xmlNodePtr) attr, + NULL, "(qualified | unqualified)", + attrValue, NULL, NULL, NULL); + } + } else if (schema->flags & XML_SCHEMAS_QUALIF_ELEM) + ns = ctxt->targetNamespace; + } + decl = xmlSchemaAddElement(ctxt, name, ns, node, topLevel); + if (decl == NULL) { + goto return_null; + } + /* + * Check for illegal attributes. + */ + attr = node->properties; + while (attr != NULL) { + if (attr->ns == NULL) { + if ((!xmlStrEqual(attr->name, BAD_CAST "name")) && + (!xmlStrEqual(attr->name, BAD_CAST "type")) && + (!xmlStrEqual(attr->name, BAD_CAST "id")) && + (!xmlStrEqual(attr->name, BAD_CAST "default")) && + (!xmlStrEqual(attr->name, BAD_CAST "fixed")) && + (!xmlStrEqual(attr->name, BAD_CAST "block")) && + (!xmlStrEqual(attr->name, BAD_CAST "nillable"))) + { + if (topLevel == 0) { + if ((!xmlStrEqual(attr->name, BAD_CAST "maxOccurs")) && + (!xmlStrEqual(attr->name, BAD_CAST "minOccurs")) && + (!xmlStrEqual(attr->name, BAD_CAST "form"))) + { + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + } else if ((!xmlStrEqual(attr->name, BAD_CAST "final")) && + (!xmlStrEqual(attr->name, BAD_CAST "abstract")) && + (!xmlStrEqual(attr->name, BAD_CAST "substitutionGroup"))) { + + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + } + } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { + + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + attr = attr->next; + } + /* + * Extract/validate attributes. + */ + if (topLevel) { + /* + * Process top attributes of global element declarations here. + */ + decl->flags |= XML_SCHEMAS_ELEM_GLOBAL; + decl->flags |= XML_SCHEMAS_ELEM_TOPLEVEL; + xmlSchemaPValAttrQName(ctxt, schema, + NULL, node, "substitutionGroup", + &(decl->substGroupNs), &(decl->substGroup)); + if (xmlGetBooleanProp(ctxt, node, "abstract", 0)) + decl->flags |= XML_SCHEMAS_ELEM_ABSTRACT; + /* + * Attribute "final". + */ + attr = xmlSchemaGetPropNode(node, "final"); + if (attr == NULL) { + if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_EXTENSION) + decl->flags |= XML_SCHEMAS_ELEM_FINAL_EXTENSION; + if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION) + decl->flags |= XML_SCHEMAS_ELEM_FINAL_RESTRICTION; + } else { + attrValue = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); + if (xmlSchemaPValAttrBlockFinal(attrValue, &(decl->flags), + -1, + XML_SCHEMAS_ELEM_FINAL_EXTENSION, + XML_SCHEMAS_ELEM_FINAL_RESTRICTION, -1, -1, -1) != 0) { + xmlSchemaPSimpleTypeErr(ctxt, + XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, + NULL, (xmlNodePtr) attr, + NULL, "(#all | List of (extension | restriction))", + attrValue, NULL, NULL, NULL); + } + } + } + /* + * Attribute "block". + */ + attr = xmlSchemaGetPropNode(node, "block"); + if (attr == NULL) { + /* + * Apply default "block" values. + */ + if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION) + decl->flags |= XML_SCHEMAS_ELEM_BLOCK_RESTRICTION; + if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION) + decl->flags |= XML_SCHEMAS_ELEM_BLOCK_EXTENSION; + if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION) + decl->flags |= XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION; + } else { + attrValue = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); + if (xmlSchemaPValAttrBlockFinal(attrValue, &(decl->flags), + -1, + XML_SCHEMAS_ELEM_BLOCK_EXTENSION, + XML_SCHEMAS_ELEM_BLOCK_RESTRICTION, + XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION, -1, -1) != 0) { + xmlSchemaPSimpleTypeErr(ctxt, + XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, + NULL, (xmlNodePtr) attr, + NULL, "(#all | List of (extension | " + "restriction | substitution))", attrValue, + NULL, NULL, NULL); + } + } + if (xmlGetBooleanProp(ctxt, node, "nillable", 0)) + decl->flags |= XML_SCHEMAS_ELEM_NILLABLE; + + attr = xmlSchemaGetPropNode(node, "type"); + if (attr != NULL) { + xmlSchemaPValAttrNodeQName(ctxt, schema, + NULL, attr, + &(decl->namedTypeNs), &(decl->namedType)); + xmlSchemaCheckReference(ctxt, schema, node, + attr, decl->namedTypeNs); + } + decl->value = xmlSchemaGetProp(ctxt, node, "default"); + attr = xmlSchemaGetPropNode(node, "fixed"); + if (attr != NULL) { + fixed = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); + if (decl->value != NULL) { + /* + * 3.3.3 : 1 + * default and fixed must not both be present. + */ + xmlSchemaPMutualExclAttrErr(ctxt, + XML_SCHEMAP_SRC_ELEMENT_1, + NULL, attr, "default", "fixed"); + } else { + decl->flags |= XML_SCHEMAS_ELEM_FIXED; + decl->value = fixed; + } + } + /* + * And now for the children... + */ + if (IS_SCHEMA(child, "complexType")) { + /* + * 3.3.3 : 3 + * "type" and either or are mutually + * exclusive + */ + if (decl->namedType != NULL) { + xmlSchemaPContentErr(ctxt, + XML_SCHEMAP_SRC_ELEMENT_3, + NULL, node, child, + "The attribute 'type' and the child are " + "mutually exclusive", NULL); + } else + WXS_ELEM_TYPEDEF(decl) = xmlSchemaParseComplexType(ctxt, schema, child, 0); + child = child->next; + } else if (IS_SCHEMA(child, "simpleType")) { + /* + * 3.3.3 : 3 + * "type" and either or are + * mutually exclusive + */ + if (decl->namedType != NULL) { + xmlSchemaPContentErr(ctxt, + XML_SCHEMAP_SRC_ELEMENT_3, + NULL, node, child, + "The attribute 'type' and the child are " + "mutually exclusive", NULL); + } else + WXS_ELEM_TYPEDEF(decl) = xmlSchemaParseSimpleType(ctxt, schema, child, 0); + child = child->next; + } + while ((IS_SCHEMA(child, "unique")) || + (IS_SCHEMA(child, "key")) || (IS_SCHEMA(child, "keyref"))) { + if (IS_SCHEMA(child, "unique")) { + curIDC = xmlSchemaParseIDC(ctxt, schema, child, + XML_SCHEMA_TYPE_IDC_UNIQUE, decl->targetNamespace); + } else if (IS_SCHEMA(child, "key")) { + curIDC = xmlSchemaParseIDC(ctxt, schema, child, + XML_SCHEMA_TYPE_IDC_KEY, decl->targetNamespace); + } else if (IS_SCHEMA(child, "keyref")) { + curIDC = xmlSchemaParseIDC(ctxt, schema, child, + XML_SCHEMA_TYPE_IDC_KEYREF, decl->targetNamespace); + } + if (lastIDC != NULL) + lastIDC->next = curIDC; + else + decl->idcs = (void *) curIDC; + lastIDC = curIDC; + child = child->next; + } + if (child != NULL) { + xmlSchemaPContentErr(ctxt, + XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, + NULL, node, child, + NULL, "(annotation?, ((simpleType | complexType)?, " + "(unique | key | keyref)*))"); + } + decl->annot = annot; + } + /* + * NOTE: Element Declaration Representation OK 4. will be checked at a + * different layer. + */ + FREE_AND_NULL(des) + if (topLevel) + return ((xmlSchemaBasicItemPtr) decl); + else { + particle->children = (xmlSchemaTreeItemPtr) decl; + return ((xmlSchemaBasicItemPtr) particle); + } + +return_null: + FREE_AND_NULL(des); + if (annot != NULL) { + if (particle != NULL) + particle->annot = NULL; + if (decl != NULL) + decl->annot = NULL; + xmlSchemaFreeAnnot(annot); + } + return (NULL); +} + +/** + * xmlSchemaParseUnion: + * @ctxt: a schema validation context + * @schema: the schema being built + * @node: a subtree containing XML Schema informations + * + * parse a XML schema Union definition + * *WARNING* this interface is highly subject to change + * + * Returns -1 in case of internal error, 0 in case of success and a positive + * error code otherwise. + */ +static int +xmlSchemaParseUnion(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, + xmlNodePtr node) +{ + xmlSchemaTypePtr type; + xmlNodePtr child = NULL; + xmlAttrPtr attr; + const xmlChar *cur = NULL; + + if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) + return (-1); + /* Not a component, don't create it. */ + type = ctxt->ctxtType; + /* + * Mark the simple type as being of variety "union". + */ + type->flags |= XML_SCHEMAS_TYPE_VARIETY_UNION; + /* + * SPEC (Base type) (2) "If the or alternative is chosen, + * then the �simple ur-type definition�." + */ + type->baseType = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYSIMPLETYPE); + /* + * Check for illegal attributes. + */ + attr = node->properties; + while (attr != NULL) { + if (attr->ns == NULL) { + if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && + (!xmlStrEqual(attr->name, BAD_CAST "memberTypes"))) { + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + attr = attr->next; + } + xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); + /* + * Attribute "memberTypes". This is a list of QNames. + * TODO: Check the value to contain anything. + */ + attr = xmlSchemaGetPropNode(node, "memberTypes"); + if (attr != NULL) { + const xmlChar *end; + xmlChar *tmp; + const xmlChar *localName, *nsName; + xmlSchemaTypeLinkPtr link, lastLink = NULL; + xmlSchemaQNameRefPtr ref; + + cur = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); + type->base = cur; + do { + while (IS_BLANK_CH(*cur)) + cur++; + end = cur; + while ((*end != 0) && (!(IS_BLANK_CH(*end)))) + end++; + if (end == cur) + break; + tmp = xmlStrndup(cur, end - cur); + if (xmlSchemaPValAttrNodeQNameValue(ctxt, schema, + NULL, attr, BAD_CAST tmp, &nsName, &localName) == 0) { + /* + * Create the member type link. + */ + link = (xmlSchemaTypeLinkPtr) + xmlMalloc(sizeof(xmlSchemaTypeLink)); + if (link == NULL) { + xmlSchemaPErrMemory(ctxt, "xmlSchemaParseUnion, " + "allocating a type link", NULL); + return (-1); + } + link->type = NULL; + link->next = NULL; + if (lastLink == NULL) + type->memberTypes = link; + else + lastLink->next = link; + lastLink = link; + /* + * Create a reference item. + */ + ref = xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_SIMPLE, + localName, nsName); + if (ref == NULL) { + FREE_AND_NULL(tmp) + return (-1); + } + /* + * Assign the reference to the link, it will be resolved + * later during fixup of the union simple type. + */ + link->type = (xmlSchemaTypePtr) ref; + } + FREE_AND_NULL(tmp) + cur = end; + } while (*cur != 0); + + } + /* + * And now for the children... + */ + child = node->children; + if (IS_SCHEMA(child, "annotation")) { + /* + * Add the annotation to the simple type ancestor. + */ + xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type, + xmlSchemaParseAnnotation(ctxt, child, 1)); + child = child->next; + } + if (IS_SCHEMA(child, "simpleType")) { + xmlSchemaTypePtr subtype, last = NULL; + + /* + * Anchor the member types in the "subtypes" field of the + * simple type. + */ + while (IS_SCHEMA(child, "simpleType")) { + subtype = (xmlSchemaTypePtr) + xmlSchemaParseSimpleType(ctxt, schema, child, 0); + if (subtype != NULL) { + if (last == NULL) { + type->subtypes = subtype; + last = subtype; + } else { + last->next = subtype; + last = subtype; + } + last->next = NULL; + } + child = child->next; + } + } + if (child != NULL) { + xmlSchemaPContentErr(ctxt, + XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, + NULL, node, child, NULL, "(annotation?, simpleType*)"); + } + if ((attr == NULL) && (type->subtypes == NULL)) { + /* + * src-union-memberTypes-or-simpleTypes + * Either the memberTypes [attribute] of the element must + * be non-empty or there must be at least one simpleType [child]. + */ + xmlSchemaPCustomErr(ctxt, + XML_SCHEMAP_SRC_UNION_MEMBERTYPES_OR_SIMPLETYPES, + NULL, node, + "Either the attribute 'memberTypes' or " + "at least one child must be present", NULL); + } + return (0); +} + +/** + * xmlSchemaParseList: + * @ctxt: a schema validation context + * @schema: the schema being built + * @node: a subtree containing XML Schema informations + * + * parse a XML schema List definition + * *WARNING* this interface is highly subject to change + * + * Returns -1 in case of error, 0 if the declaration is improper and + * 1 in case of success. + */ +static xmlSchemaTypePtr +xmlSchemaParseList(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, + xmlNodePtr node) +{ + xmlSchemaTypePtr type; + xmlNodePtr child = NULL; + xmlAttrPtr attr; + + if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) + return (NULL); + /* Not a component, don't create it. */ + type = ctxt->ctxtType; + /* + * Mark the type as being of variety "list". + */ + type->flags |= XML_SCHEMAS_TYPE_VARIETY_LIST; + /* + * SPEC (Base type) (2) "If the or alternative is chosen, + * then the �simple ur-type definition�." + */ + type->baseType = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYSIMPLETYPE); + /* + * Check for illegal attributes. + */ + attr = node->properties; + while (attr != NULL) { + if (attr->ns == NULL) { + if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && + (!xmlStrEqual(attr->name, BAD_CAST "itemType"))) { + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + attr = attr->next; + } + + xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); + + /* + * Attribute "itemType". NOTE that we will use the "ref" and "refNs" + * fields for holding the reference to the itemType. + * + * REVAMP TODO: Use the "base" and "baseNs" fields, since we will remove + * the "ref" fields. + */ + xmlSchemaPValAttrQName(ctxt, schema, NULL, + node, "itemType", &(type->baseNs), &(type->base)); + /* + * And now for the children... + */ + child = node->children; + if (IS_SCHEMA(child, "annotation")) { + xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type, + xmlSchemaParseAnnotation(ctxt, child, 1)); + child = child->next; + } + if (IS_SCHEMA(child, "simpleType")) { + /* + * src-list-itemType-or-simpleType + * Either the itemType [attribute] or the [child] of + * the element must be present, but not both. + */ + if (type->base != NULL) { + xmlSchemaPCustomErr(ctxt, + XML_SCHEMAP_SRC_SIMPLE_TYPE_1, + NULL, node, + "The attribute 'itemType' and the child " + "are mutually exclusive", NULL); + } else { + type->subtypes = xmlSchemaParseSimpleType(ctxt, schema, child, 0); + } + child = child->next; + } else if (type->base == NULL) { + xmlSchemaPCustomErr(ctxt, + XML_SCHEMAP_SRC_SIMPLE_TYPE_1, + NULL, node, + "Either the attribute 'itemType' or the child " + "must be present", NULL); + } + if (child != NULL) { + xmlSchemaPContentErr(ctxt, + XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, + NULL, node, child, NULL, "(annotation?, simpleType?)"); + } + if ((type->base == NULL) && + (type->subtypes == NULL) && + (xmlSchemaGetPropNode(node, "itemType") == NULL)) { + xmlSchemaPCustomErr(ctxt, + XML_SCHEMAP_SRC_SIMPLE_TYPE_1, + NULL, node, + "Either the attribute 'itemType' or the child " + "must be present", NULL); + } + return (NULL); +} + +/** + * xmlSchemaParseSimpleType: + * @ctxt: a schema validation context + * @schema: the schema being built + * @node: a subtree containing XML Schema informations + * + * parse a XML schema Simple Type definition + * *WARNING* this interface is highly subject to change + * + * Returns -1 in case of error, 0 if the declaration is improper and + * 1 in case of success. + */ +static xmlSchemaTypePtr +xmlSchemaParseSimpleType(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, + xmlNodePtr node, int topLevel) +{ + xmlSchemaTypePtr type, oldCtxtType; + xmlNodePtr child = NULL; + const xmlChar *attrValue = NULL; + xmlAttrPtr attr; + int hasRestriction = 0; + + if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) + return (NULL); + + if (topLevel) { + attr = xmlSchemaGetPropNode(node, "name"); + if (attr == NULL) { + xmlSchemaPMissingAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_MISSING, + NULL, node, + "name", NULL); + return (NULL); + } else { + if (xmlSchemaPValAttrNode(ctxt, + NULL, attr, + xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &attrValue) != 0) + return (NULL); + /* + * Skip built-in types. + */ + if (ctxt->isS4S) { + xmlSchemaTypePtr biType; + + if (ctxt->isRedefine) { + /* + * REDEFINE: Disallow redefinition of built-in-types. + * TODO: It seems that the spec does not say anything + * about this case. + */ + xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_SRC_REDEFINE, + NULL, node, + "Redefinition of built-in simple types is not " + "supported", NULL); + return(NULL); + } + biType = xmlSchemaGetPredefinedType(attrValue, xmlSchemaNs); + if (biType != NULL) + return (biType); + } + } + } + /* + * TargetNamespace: + * SPEC "The �actual value� of the targetNamespace [attribute] + * of the ancestor element information item if present, + * otherwise �absent�. + */ + if (topLevel == 0) { +#ifdef ENABLE_NAMED_LOCALS + char buf[40]; +#endif + /* + * Parse as local simple type definition. + */ +#ifdef ENABLE_NAMED_LOCALS + snprintf(buf, 39, "#ST%d", ctxt->counter++ + 1); + type = xmlSchemaAddType(ctxt, schema, + XML_SCHEMA_TYPE_SIMPLE, + xmlDictLookup(ctxt->dict, (const xmlChar *)buf, -1), + ctxt->targetNamespace, node, 0); +#else + type = xmlSchemaAddType(ctxt, schema, + XML_SCHEMA_TYPE_SIMPLE, + NULL, ctxt->targetNamespace, node, 0); +#endif + if (type == NULL) + return (NULL); + type->type = XML_SCHEMA_TYPE_SIMPLE; + type->contentType = XML_SCHEMA_CONTENT_SIMPLE; + /* + * Check for illegal attributes. + */ + attr = node->properties; + while (attr != NULL) { + if (attr->ns == NULL) { + if (!xmlStrEqual(attr->name, BAD_CAST "id")) { + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + attr = attr->next; + } + } else { + /* + * Parse as global simple type definition. + * + * Note that attrValue is the value of the attribute "name" here. + */ + type = xmlSchemaAddType(ctxt, schema, XML_SCHEMA_TYPE_SIMPLE, + attrValue, ctxt->targetNamespace, node, 1); + if (type == NULL) + return (NULL); + type->type = XML_SCHEMA_TYPE_SIMPLE; + type->contentType = XML_SCHEMA_CONTENT_SIMPLE; + type->flags |= XML_SCHEMAS_TYPE_GLOBAL; + /* + * Check for illegal attributes. + */ + attr = node->properties; + while (attr != NULL) { + if (attr->ns == NULL) { + if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && + (!xmlStrEqual(attr->name, BAD_CAST "name")) && + (!xmlStrEqual(attr->name, BAD_CAST "final"))) { + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + attr = attr->next; + } + /* + * Attribute "final". + */ + attr = xmlSchemaGetPropNode(node, "final"); + if (attr == NULL) { + if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION) + type->flags |= XML_SCHEMAS_TYPE_FINAL_RESTRICTION; + if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_LIST) + type->flags |= XML_SCHEMAS_TYPE_FINAL_LIST; + if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_UNION) + type->flags |= XML_SCHEMAS_TYPE_FINAL_UNION; + } else { + attrValue = xmlSchemaGetProp(ctxt, node, "final"); + if (xmlSchemaPValAttrBlockFinal(attrValue, &(type->flags), + -1, -1, XML_SCHEMAS_TYPE_FINAL_RESTRICTION, -1, + XML_SCHEMAS_TYPE_FINAL_LIST, + XML_SCHEMAS_TYPE_FINAL_UNION) != 0) { + + xmlSchemaPSimpleTypeErr(ctxt, + XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, + WXS_BASIC_CAST type, (xmlNodePtr) attr, + NULL, "(#all | List of (list | union | restriction)", + attrValue, NULL, NULL, NULL); + } + } + } + type->targetNamespace = ctxt->targetNamespace; + xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); + /* + * And now for the children... + */ + oldCtxtType = ctxt->ctxtType; + + ctxt->ctxtType = type; + + child = node->children; + if (IS_SCHEMA(child, "annotation")) { + type->annot = xmlSchemaParseAnnotation(ctxt, child, 1); + child = child->next; + } + if (child == NULL) { + xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_MISSING, + NULL, node, child, NULL, + "(annotation?, (restriction | list | union))"); + } else if (IS_SCHEMA(child, "restriction")) { + xmlSchemaParseRestriction(ctxt, schema, child, + XML_SCHEMA_TYPE_SIMPLE); + hasRestriction = 1; + child = child->next; + } else if (IS_SCHEMA(child, "list")) { + xmlSchemaParseList(ctxt, schema, child); + child = child->next; + } else if (IS_SCHEMA(child, "union")) { + xmlSchemaParseUnion(ctxt, schema, child); + child = child->next; + } + if (child != NULL) { + xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, + NULL, node, child, NULL, + "(annotation?, (restriction | list | union))"); + } + /* + * REDEFINE: SPEC src-redefine (5) + * "Within the [children], each must have a + * among its [children] ... the �actual value� of whose + * base [attribute] must be the same as the �actual value� of its own + * name attribute plus target namespace;" + */ + if (topLevel && ctxt->isRedefine && (! hasRestriction)) { + xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_SRC_REDEFINE, + NULL, node, "This is a redefinition, thus the " + " must have a child", NULL); + } + + ctxt->ctxtType = oldCtxtType; + return (type); +} + +/** + * xmlSchemaParseModelGroupDefRef: + * @ctxt: the parser context + * @schema: the schema being built + * @node: the node + * + * Parses a reference to a model group definition. + * + * We will return a particle component with a qname-component or + * NULL in case of an error. + */ +static xmlSchemaTreeItemPtr +xmlSchemaParseModelGroupDefRef(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaPtr schema, + xmlNodePtr node) +{ + xmlSchemaParticlePtr item; + xmlNodePtr child = NULL; + xmlAttrPtr attr; + const xmlChar *ref = NULL, *refNs = NULL; + int min, max; + + if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) + return (NULL); + + attr = xmlSchemaGetPropNode(node, "ref"); + if (attr == NULL) { + xmlSchemaPMissingAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_MISSING, + NULL, node, "ref", NULL); + return (NULL); + } else if (xmlSchemaPValAttrNodeQName(ctxt, schema, NULL, + attr, &refNs, &ref) != 0) { + return (NULL); + } + xmlSchemaCheckReference(ctxt, schema, node, attr, refNs); + min = xmlGetMinOccurs(ctxt, node, 0, -1, 1, "xs:nonNegativeInteger"); + max = xmlGetMaxOccurs(ctxt, node, 0, UNBOUNDED, 1, + "(xs:nonNegativeInteger | unbounded)"); + /* + * Check for illegal attributes. + */ + attr = node->properties; + while (attr != NULL) { + if (attr->ns == NULL) { + if ((!xmlStrEqual(attr->name, BAD_CAST "ref")) && + (!xmlStrEqual(attr->name, BAD_CAST "id")) && + (!xmlStrEqual(attr->name, BAD_CAST "minOccurs")) && + (!xmlStrEqual(attr->name, BAD_CAST "maxOccurs"))) { + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + attr = attr->next; + } + xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); + item = xmlSchemaAddParticle(ctxt, node, min, max); + if (item == NULL) + return (NULL); + /* + * Create a qname-reference and set as the term; it will be substituted + * for the model group after the reference has been resolved. + */ + item->children = (xmlSchemaTreeItemPtr) + xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_GROUP, ref, refNs); + xmlSchemaPCheckParticleCorrect_2(ctxt, item, node, min, max); + /* + * And now for the children... + */ + child = node->children; + /* TODO: Is annotation even allowed for a model group reference? */ + if (IS_SCHEMA(child, "annotation")) { + /* + * TODO: What to do exactly with the annotation? + */ + item->annot = xmlSchemaParseAnnotation(ctxt, child, 1); + child = child->next; + } + if (child != NULL) { + xmlSchemaPContentErr(ctxt, + XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, + NULL, node, child, NULL, + "(annotation?)"); + } + /* + * Corresponds to no component at all if minOccurs==maxOccurs==0. + */ + if ((min == 0) && (max == 0)) + return (NULL); + + return ((xmlSchemaTreeItemPtr) item); +} + +/** + * xmlSchemaParseModelGroupDefinition: + * @ctxt: a schema validation context + * @schema: the schema being built + * @node: a subtree containing XML Schema informations + * + * Parses a XML schema model group definition. + * + * Note that the contraint src-redefine (6.2) can't be applied until + * references have been resolved. So we will do this at the + * component fixup level. + * + * *WARNING* this interface is highly subject to change + * + * Returns -1 in case of error, 0 if the declaration is improper and + * 1 in case of success. + */ +static xmlSchemaModelGroupDefPtr +xmlSchemaParseModelGroupDefinition(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaPtr schema, + xmlNodePtr node) +{ + xmlSchemaModelGroupDefPtr item; + xmlNodePtr child = NULL; + xmlAttrPtr attr; + const xmlChar *name; + + if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) + return (NULL); + + attr = xmlSchemaGetPropNode(node, "name"); + if (attr == NULL) { + xmlSchemaPMissingAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_MISSING, + NULL, node, + "name", NULL); + return (NULL); + } else if (xmlSchemaPValAttrNode(ctxt, NULL, attr, + xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0) { + return (NULL); + } + item = xmlSchemaAddModelGroupDefinition(ctxt, schema, name, + ctxt->targetNamespace, node); + if (item == NULL) + return (NULL); + /* + * Check for illegal attributes. + */ + attr = node->properties; + while (attr != NULL) { + if (attr->ns == NULL) { + if ((!xmlStrEqual(attr->name, BAD_CAST "name")) && + (!xmlStrEqual(attr->name, BAD_CAST "id"))) { + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + attr = attr->next; + } + xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); + /* + * And now for the children... + */ + child = node->children; + if (IS_SCHEMA(child, "annotation")) { + item->annot = xmlSchemaParseAnnotation(ctxt, child, 1); + child = child->next; + } + if (IS_SCHEMA(child, "all")) { + item->children = xmlSchemaParseModelGroup(ctxt, schema, child, + XML_SCHEMA_TYPE_ALL, 0); + child = child->next; + } else if (IS_SCHEMA(child, "choice")) { + item->children = xmlSchemaParseModelGroup(ctxt, schema, child, + XML_SCHEMA_TYPE_CHOICE, 0); + child = child->next; + } else if (IS_SCHEMA(child, "sequence")) { + item->children = xmlSchemaParseModelGroup(ctxt, schema, child, + XML_SCHEMA_TYPE_SEQUENCE, 0); + child = child->next; + } + + + + if (child != NULL) { + xmlSchemaPContentErr(ctxt, + XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, + NULL, node, child, NULL, + "(annotation?, (all | choice | sequence)?)"); + } + return (item); +} + +/** + * xmlSchemaCleanupDoc: + * @ctxt: a schema validation context + * @node: the root of the document. + * + * removes unwanted nodes in a schemas document tree + */ +static void +xmlSchemaCleanupDoc(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr root) +{ + xmlNodePtr delete, cur; + + if ((ctxt == NULL) || (root == NULL)) return; + + /* + * Remove all the blank text nodes + */ + delete = NULL; + cur = root; + while (cur != NULL) { + if (delete != NULL) { + xmlUnlinkNode(delete); + xmlFreeNode(delete); + delete = NULL; + } + if (cur->type == XML_TEXT_NODE) { + if (IS_BLANK_NODE(cur)) { + if (xmlNodeGetSpacePreserve(cur) != 1) { + delete = cur; + } + } + } else if ((cur->type != XML_ELEMENT_NODE) && + (cur->type != XML_CDATA_SECTION_NODE)) { + delete = cur; + goto skip_children; + } + + /* + * Skip to next node + */ + if (cur->children != NULL) { + if ((cur->children->type != XML_ENTITY_DECL) && + (cur->children->type != XML_ENTITY_REF_NODE) && + (cur->children->type != XML_ENTITY_NODE)) { + cur = cur->children; + continue; + } + } + skip_children: + if (cur->next != NULL) { + cur = cur->next; + continue; + } + + do { + cur = cur->parent; + if (cur == NULL) + break; + if (cur == root) { + cur = NULL; + break; + } + if (cur->next != NULL) { + cur = cur->next; + break; + } + } while (cur != NULL); + } + if (delete != NULL) { + xmlUnlinkNode(delete); + xmlFreeNode(delete); + delete = NULL; + } +} + + +static void +xmlSchemaClearSchemaDefaults(xmlSchemaPtr schema) +{ + if (schema->flags & XML_SCHEMAS_QUALIF_ELEM) + schema->flags ^= XML_SCHEMAS_QUALIF_ELEM; + + if (schema->flags & XML_SCHEMAS_QUALIF_ATTR) + schema->flags ^= XML_SCHEMAS_QUALIF_ATTR; + + if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_EXTENSION) + schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_EXTENSION; + if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION) + schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION; + if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_LIST) + schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_LIST; + if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_UNION) + schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_UNION; + + if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION) + schema->flags ^= XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION; + if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION) + schema->flags ^= XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION; + if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION) + schema->flags ^= XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION; +} + +static int +xmlSchemaParseSchemaElement(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaPtr schema, + xmlNodePtr node) +{ + xmlAttrPtr attr; + const xmlChar *val; + int res = 0, oldErrs = ctxt->nberrors; + + /* + * Those flags should be moved to the parser context flags, + * since they are not visible at the component level. I.e. + * they are used if processing schema *documents* only. + */ + res = xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); + HFAILURE; + + /* + * Since the version is of type xs:token, we won't bother to + * check it. + */ + /* REMOVED: + attr = xmlSchemaGetPropNode(node, "version"); + if (attr != NULL) { + res = xmlSchemaPValAttrNode(ctxt, NULL, NULL, attr, + xmlSchemaGetBuiltInType(XML_SCHEMAS_TOKEN), &val); + HFAILURE; + } + */ + attr = xmlSchemaGetPropNode(node, "targetNamespace"); + if (attr != NULL) { + res = xmlSchemaPValAttrNode(ctxt, NULL, attr, + xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI), NULL); + HFAILURE; + if (res != 0) { + ctxt->stop = XML_SCHEMAP_S4S_ATTR_INVALID_VALUE; + goto exit; + } + } + attr = xmlSchemaGetPropNode(node, "elementFormDefault"); + if (attr != NULL) { + val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); + res = xmlSchemaPValAttrFormDefault(val, &schema->flags, + XML_SCHEMAS_QUALIF_ELEM); + HFAILURE; + if (res != 0) { + xmlSchemaPSimpleTypeErr(ctxt, + XML_SCHEMAP_ELEMFORMDEFAULT_VALUE, + NULL, (xmlNodePtr) attr, NULL, + "(qualified | unqualified)", val, NULL, NULL, NULL); + } + } + attr = xmlSchemaGetPropNode(node, "attributeFormDefault"); + if (attr != NULL) { + val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); + res = xmlSchemaPValAttrFormDefault(val, &schema->flags, + XML_SCHEMAS_QUALIF_ATTR); + HFAILURE; + if (res != 0) { + xmlSchemaPSimpleTypeErr(ctxt, + XML_SCHEMAP_ATTRFORMDEFAULT_VALUE, + NULL, (xmlNodePtr) attr, NULL, + "(qualified | unqualified)", val, NULL, NULL, NULL); + } + } + attr = xmlSchemaGetPropNode(node, "finalDefault"); + if (attr != NULL) { + val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); + res = xmlSchemaPValAttrBlockFinal(val, &(schema->flags), -1, + XML_SCHEMAS_FINAL_DEFAULT_EXTENSION, + XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION, + -1, + XML_SCHEMAS_FINAL_DEFAULT_LIST, + XML_SCHEMAS_FINAL_DEFAULT_UNION); + HFAILURE; + if (res != 0) { + xmlSchemaPSimpleTypeErr(ctxt, + XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, + NULL, (xmlNodePtr) attr, NULL, + "(#all | List of (extension | restriction | list | union))", + val, NULL, NULL, NULL); + } + } + attr = xmlSchemaGetPropNode(node, "blockDefault"); + if (attr != NULL) { + val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr); + res = xmlSchemaPValAttrBlockFinal(val, &(schema->flags), -1, + XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION, + XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION, + XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION, -1, -1); + HFAILURE; + if (res != 0) { + xmlSchemaPSimpleTypeErr(ctxt, + XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, + NULL, (xmlNodePtr) attr, NULL, + "(#all | List of (extension | restriction | substitution))", + val, NULL, NULL, NULL); + } + } + +exit: + if (oldErrs != ctxt->nberrors) + res = ctxt->err; + return(res); +exit_failure: + return(-1); +} + +/** + * xmlSchemaParseSchemaTopLevel: + * @ctxt: a schema validation context + * @schema: the schemas + * @nodes: the list of top level nodes + * + * Returns the internal XML Schema structure built from the resource or + * NULL in case of error + */ +static int +xmlSchemaParseSchemaTopLevel(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaPtr schema, xmlNodePtr nodes) +{ + xmlNodePtr child; + xmlSchemaAnnotPtr annot; + int res = 0, oldErrs, tmpOldErrs; + + if ((ctxt == NULL) || (schema == NULL) || (nodes == NULL)) + return(-1); + + oldErrs = ctxt->nberrors; + child = nodes; + while ((IS_SCHEMA(child, "include")) || + (IS_SCHEMA(child, "import")) || + (IS_SCHEMA(child, "redefine")) || + (IS_SCHEMA(child, "annotation"))) { + if (IS_SCHEMA(child, "annotation")) { + annot = xmlSchemaParseAnnotation(ctxt, child, 1); + if (schema->annot == NULL) + schema->annot = annot; + else + xmlSchemaFreeAnnot(annot); + } else if (IS_SCHEMA(child, "import")) { + tmpOldErrs = ctxt->nberrors; + res = xmlSchemaParseImport(ctxt, schema, child); + HFAILURE; + HSTOP(ctxt); + if (tmpOldErrs != ctxt->nberrors) + goto exit; + } else if (IS_SCHEMA(child, "include")) { + tmpOldErrs = ctxt->nberrors; + res = xmlSchemaParseInclude(ctxt, schema, child); + HFAILURE; + HSTOP(ctxt); + if (tmpOldErrs != ctxt->nberrors) + goto exit; + } else if (IS_SCHEMA(child, "redefine")) { + tmpOldErrs = ctxt->nberrors; + res = xmlSchemaParseRedefine(ctxt, schema, child); + HFAILURE; + HSTOP(ctxt); + if (tmpOldErrs != ctxt->nberrors) + goto exit; + } + child = child->next; + } + /* + * URGENT TODO: Change the functions to return int results. + * We need especially to catch internal errors. + */ + while (child != NULL) { + if (IS_SCHEMA(child, "complexType")) { + xmlSchemaParseComplexType(ctxt, schema, child, 1); + child = child->next; + } else if (IS_SCHEMA(child, "simpleType")) { + xmlSchemaParseSimpleType(ctxt, schema, child, 1); + child = child->next; + } else if (IS_SCHEMA(child, "element")) { + xmlSchemaParseElement(ctxt, schema, child, NULL, 1); + child = child->next; + } else if (IS_SCHEMA(child, "attribute")) { + xmlSchemaParseGlobalAttribute(ctxt, schema, child); + child = child->next; + } else if (IS_SCHEMA(child, "attributeGroup")) { + xmlSchemaParseAttributeGroupDefinition(ctxt, schema, child); + child = child->next; + } else if (IS_SCHEMA(child, "group")) { + xmlSchemaParseModelGroupDefinition(ctxt, schema, child); + child = child->next; + } else if (IS_SCHEMA(child, "notation")) { + xmlSchemaParseNotation(ctxt, schema, child); + child = child->next; + } else { + xmlSchemaPContentErr(ctxt, + XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, + NULL, child->parent, child, + NULL, "((include | import | redefine | annotation)*, " + "(((simpleType | complexType | group | attributeGroup) " + "| element | attribute | notation), annotation*)*)"); + child = child->next; + } + while (IS_SCHEMA(child, "annotation")) { + /* + * TODO: We should add all annotations. + */ + annot = xmlSchemaParseAnnotation(ctxt, child, 1); + if (schema->annot == NULL) + schema->annot = annot; + else + xmlSchemaFreeAnnot(annot); + child = child->next; + } + } +exit: + ctxt->ctxtType = NULL; + if (oldErrs != ctxt->nberrors) + res = ctxt->err; + return(res); +exit_failure: + return(-1); +} + +static xmlSchemaSchemaRelationPtr +xmlSchemaSchemaRelationCreate(void) +{ + xmlSchemaSchemaRelationPtr ret; + + ret = (xmlSchemaSchemaRelationPtr) + xmlMalloc(sizeof(xmlSchemaSchemaRelation)); + if (ret == NULL) { + xmlSchemaPErrMemory(NULL, "allocating schema relation", NULL); + return(NULL); + } + memset(ret, 0, sizeof(xmlSchemaSchemaRelation)); + return(ret); +} + +#if 0 +static void +xmlSchemaSchemaRelationFree(xmlSchemaSchemaRelationPtr rel) +{ + xmlFree(rel); +} +#endif + +static void +xmlSchemaRedefListFree(xmlSchemaRedefPtr redef) +{ + xmlSchemaRedefPtr prev; + + while (redef != NULL) { + prev = redef; + redef = redef->next; + xmlFree(prev); + } +} + +static void +xmlSchemaConstructionCtxtFree(xmlSchemaConstructionCtxtPtr con) +{ + /* + * After the construction context has been freed, there will be + * no schema graph available any more. Only the schema buckets + * will stay alive, which are put into the "schemasImports" and + * "includes" slots of the xmlSchema. + */ + if (con->buckets != NULL) + xmlSchemaItemListFree(con->buckets); + if (con->pending != NULL) + xmlSchemaItemListFree(con->pending); + if (con->substGroups != NULL) + xmlHashFree(con->substGroups, + (xmlHashDeallocator) xmlSchemaSubstGroupFree); + if (con->redefs != NULL) + xmlSchemaRedefListFree(con->redefs); + if (con->dict != NULL) + xmlDictFree(con->dict); + xmlFree(con); +} + +static xmlSchemaConstructionCtxtPtr +xmlSchemaConstructionCtxtCreate(xmlDictPtr dict) +{ + xmlSchemaConstructionCtxtPtr ret; + + ret = (xmlSchemaConstructionCtxtPtr) + xmlMalloc(sizeof(xmlSchemaConstructionCtxt)); + if (ret == NULL) { + xmlSchemaPErrMemory(NULL, + "allocating schema construction context", NULL); + return (NULL); + } + memset(ret, 0, sizeof(xmlSchemaConstructionCtxt)); + + ret->buckets = xmlSchemaItemListCreate(); + if (ret->buckets == NULL) { + xmlSchemaPErrMemory(NULL, + "allocating list of schema buckets", NULL); + xmlFree(ret); + return (NULL); + } + ret->pending = xmlSchemaItemListCreate(); + if (ret->pending == NULL) { + xmlSchemaPErrMemory(NULL, + "allocating list of pending global components", NULL); + xmlSchemaConstructionCtxtFree(ret); + return (NULL); + } + ret->dict = dict; + xmlDictReference(dict); + return(ret); +} + +static xmlSchemaParserCtxtPtr +xmlSchemaParserCtxtCreate(void) +{ + xmlSchemaParserCtxtPtr ret; + + ret = (xmlSchemaParserCtxtPtr) xmlMalloc(sizeof(xmlSchemaParserCtxt)); + if (ret == NULL) { + xmlSchemaPErrMemory(NULL, "allocating schema parser context", + NULL); + return (NULL); + } + memset(ret, 0, sizeof(xmlSchemaParserCtxt)); + ret->type = XML_SCHEMA_CTXT_PARSER; + ret->attrProhibs = xmlSchemaItemListCreate(); + if (ret->attrProhibs == NULL) { + xmlFree(ret); + return(NULL); + } + return(ret); +} + +/** + * xmlSchemaNewParserCtxtUseDict: + * @URL: the location of the schema + * @dict: the dictionary to be used + * + * Create an XML Schemas parse context for that file/resource expected + * to contain an XML Schemas file. + * + * Returns the parser context or NULL in case of error + */ +static xmlSchemaParserCtxtPtr +xmlSchemaNewParserCtxtUseDict(const char *URL, xmlDictPtr dict) +{ + xmlSchemaParserCtxtPtr ret; + + ret = xmlSchemaParserCtxtCreate(); + if (ret == NULL) + return (NULL); + ret->dict = dict; + xmlDictReference(dict); + if (URL != NULL) + ret->URL = xmlDictLookup(dict, (const xmlChar *) URL, -1); + return (ret); +} + +static int +xmlSchemaCreatePCtxtOnVCtxt(xmlSchemaValidCtxtPtr vctxt) +{ + if (vctxt->pctxt == NULL) { + if (vctxt->schema != NULL) + vctxt->pctxt = + xmlSchemaNewParserCtxtUseDict("*", vctxt->schema->dict); + else + vctxt->pctxt = xmlSchemaNewParserCtxt("*"); + if (vctxt->pctxt == NULL) { + VERROR_INT("xmlSchemaCreatePCtxtOnVCtxt", + "failed to create a temp. parser context"); + return (-1); + } + /* TODO: Pass user data. */ + xmlSchemaSetParserErrors(vctxt->pctxt, vctxt->error, + vctxt->warning, vctxt->errCtxt); + xmlSchemaSetParserStructuredErrors(vctxt->pctxt, vctxt->serror, + vctxt->errCtxt); + } + return (0); +} + +/** + * xmlSchemaGetSchemaBucket: + * @pctxt: the schema parser context + * @schemaLocation: the URI of the schema document + * + * Returns a schema bucket if it was already parsed. + * + * Returns a schema bucket if it was already parsed from + * @schemaLocation, NULL otherwise. + */ +static xmlSchemaBucketPtr +xmlSchemaGetSchemaBucket(xmlSchemaParserCtxtPtr pctxt, + const xmlChar *schemaLocation) +{ + xmlSchemaBucketPtr cur; + xmlSchemaItemListPtr list; + + list = pctxt->constructor->buckets; + if (list->nbItems == 0) + return(NULL); + else { + int i; + for (i = 0; i < list->nbItems; i++) { + cur = (xmlSchemaBucketPtr) list->items[i]; + /* Pointer comparison! */ + if (cur->schemaLocation == schemaLocation) + return(cur); + } + } + return(NULL); +} + +static xmlSchemaBucketPtr +xmlSchemaGetChameleonSchemaBucket(xmlSchemaParserCtxtPtr pctxt, + const xmlChar *schemaLocation, + const xmlChar *targetNamespace) +{ + xmlSchemaBucketPtr cur; + xmlSchemaItemListPtr list; + + list = pctxt->constructor->buckets; + if (list->nbItems == 0) + return(NULL); + else { + int i; + for (i = 0; i < list->nbItems; i++) { + cur = (xmlSchemaBucketPtr) list->items[i]; + /* Pointer comparison! */ + if ((cur->origTargetNamespace == NULL) && + (cur->schemaLocation == schemaLocation) && + (cur->targetNamespace == targetNamespace)) + return(cur); + } + } + return(NULL); +} + + +#define IS_BAD_SCHEMA_DOC(b) \ + (((b)->doc == NULL) && ((b)->schemaLocation != NULL)) + +static xmlSchemaBucketPtr +xmlSchemaGetSchemaBucketByTNS(xmlSchemaParserCtxtPtr pctxt, + const xmlChar *targetNamespace, + int imported) +{ + xmlSchemaBucketPtr cur; + xmlSchemaItemListPtr list; + + list = pctxt->constructor->buckets; + if (list->nbItems == 0) + return(NULL); + else { + int i; + for (i = 0; i < list->nbItems; i++) { + cur = (xmlSchemaBucketPtr) list->items[i]; + if ((! IS_BAD_SCHEMA_DOC(cur)) && + (cur->origTargetNamespace == targetNamespace) && + ((imported && cur->imported) || + ((!imported) && (!cur->imported)))) + return(cur); + } + } + return(NULL); +} + +static int +xmlSchemaParseNewDocWithContext(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaPtr schema, + xmlSchemaBucketPtr bucket) +{ + int oldFlags; + xmlDocPtr oldDoc; + xmlNodePtr node; + int ret, oldErrs; + xmlSchemaBucketPtr oldbucket = pctxt->constructor->bucket; + + /* + * Save old values; reset the *main* schema. + * URGENT TODO: This is not good; move the per-document information + * to the parser. Get rid of passing the main schema to the + * parsing functions. + */ + oldFlags = schema->flags; + oldDoc = schema->doc; + if (schema->flags != 0) + xmlSchemaClearSchemaDefaults(schema); + schema->doc = bucket->doc; + pctxt->schema = schema; + /* + * Keep the current target namespace on the parser *not* on the + * main schema. + */ + pctxt->targetNamespace = bucket->targetNamespace; + WXS_CONSTRUCTOR(pctxt)->bucket = bucket; + + if ((bucket->targetNamespace != NULL) && + xmlStrEqual(bucket->targetNamespace, xmlSchemaNs)) { + /* + * We are parsing the schema for schemas! + */ + pctxt->isS4S = 1; + } + /* Mark it as parsed, even if parsing fails. */ + bucket->parsed++; + /* Compile the schema doc. */ + node = xmlDocGetRootElement(bucket->doc); + ret = xmlSchemaParseSchemaElement(pctxt, schema, node); + if (ret != 0) + goto exit; + /* An empty schema; just get out. */ + if (node->children == NULL) + goto exit; + oldErrs = pctxt->nberrors; + ret = xmlSchemaParseSchemaTopLevel(pctxt, schema, node->children); + if (ret != 0) + goto exit; + /* + * TODO: Not nice, but I'm not 100% sure we will get always an error + * as a result of the obove functions; so better rely on pctxt->err + * as well. + */ + if ((ret == 0) && (oldErrs != pctxt->nberrors)) { + ret = pctxt->err; + goto exit; + } + +exit: + WXS_CONSTRUCTOR(pctxt)->bucket = oldbucket; + /* Restore schema values. */ + schema->doc = oldDoc; + schema->flags = oldFlags; + return(ret); +} + +static int +xmlSchemaParseNewDoc(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaPtr schema, + xmlSchemaBucketPtr bucket) +{ + xmlSchemaParserCtxtPtr newpctxt; + int res = 0; + + if (bucket == NULL) + return(0); + if (bucket->parsed) { + PERROR_INT("xmlSchemaParseNewDoc", + "reparsing a schema doc"); + return(-1); + } + if (bucket->doc == NULL) { + PERROR_INT("xmlSchemaParseNewDoc", + "parsing a schema doc, but there's no doc"); + return(-1); + } + if (pctxt->constructor == NULL) { + PERROR_INT("xmlSchemaParseNewDoc", + "no constructor"); + return(-1); + } + /* Create and init the temporary parser context. */ + newpctxt = xmlSchemaNewParserCtxtUseDict( + (const char *) bucket->schemaLocation, pctxt->dict); + if (newpctxt == NULL) + return(-1); + newpctxt->constructor = pctxt->constructor; + /* + * TODO: Can we avoid that the parser knows about the main schema? + * It would be better if he knows about the current schema bucket + * only. + */ + newpctxt->schema = schema; + xmlSchemaSetParserErrors(newpctxt, pctxt->error, pctxt->warning, + pctxt->errCtxt); + xmlSchemaSetParserStructuredErrors(newpctxt, pctxt->serror, + pctxt->errCtxt); + newpctxt->counter = pctxt->counter; + + + res = xmlSchemaParseNewDocWithContext(newpctxt, schema, bucket); + + /* Channel back errors and cleanup the temporary parser context. */ + if (res != 0) + pctxt->err = res; + pctxt->nberrors += newpctxt->nberrors; + pctxt->counter = newpctxt->counter; + newpctxt->constructor = NULL; + /* Free the parser context. */ + xmlSchemaFreeParserCtxt(newpctxt); + return(res); +} + +static void +xmlSchemaSchemaRelationAddChild(xmlSchemaBucketPtr bucket, + xmlSchemaSchemaRelationPtr rel) +{ + xmlSchemaSchemaRelationPtr cur = bucket->relations; + + if (cur == NULL) { + bucket->relations = rel; + return; + } + while (cur->next != NULL) + cur = cur->next; + cur->next = rel; +} + + +static const xmlChar * +xmlSchemaBuildAbsoluteURI(xmlDictPtr dict, const xmlChar* location, + xmlNodePtr ctxtNode) +{ + /* + * Build an absolue location URI. + */ + if (location != NULL) { + if (ctxtNode == NULL) + return(location); + else { + xmlChar *base, *URI; + const xmlChar *ret = NULL; + + base = xmlNodeGetBase(ctxtNode->doc, ctxtNode); + if (base == NULL) { + URI = xmlBuildURI(location, ctxtNode->doc->URL); + } else { + URI = xmlBuildURI(location, base); + xmlFree(base); + } + if (URI != NULL) { + ret = xmlDictLookup(dict, URI, -1); + xmlFree(URI); + return(ret); + } + } + } + return(NULL); +} + + + +/** + * xmlSchemaAddSchemaDoc: + * @pctxt: a schema validation context + * @schema: the schema being built + * @node: a subtree containing XML Schema informations + * + * Parse an included (and to-be-redefined) XML schema document. + * + * Returns 0 on success, a positive error code on errors and + * -1 in case of an internal or API error. + */ + +static int +xmlSchemaAddSchemaDoc(xmlSchemaParserCtxtPtr pctxt, + int type, /* import or include or redefine */ + const xmlChar *schemaLocation, + xmlDocPtr schemaDoc, + const char *schemaBuffer, + int schemaBufferLen, + xmlNodePtr invokingNode, + const xmlChar *sourceTargetNamespace, + const xmlChar *importNamespace, + xmlSchemaBucketPtr *bucket) +{ + const xmlChar *targetNamespace = NULL; + xmlSchemaSchemaRelationPtr relation = NULL; + xmlDocPtr doc = NULL; + int res = 0, err = 0, located = 0, preserveDoc = 0; + xmlSchemaBucketPtr bkt = NULL; + + if (bucket != NULL) + *bucket = NULL; + + switch (type) { + case XML_SCHEMA_SCHEMA_IMPORT: + case XML_SCHEMA_SCHEMA_MAIN: + err = XML_SCHEMAP_SRC_IMPORT; + break; + case XML_SCHEMA_SCHEMA_INCLUDE: + err = XML_SCHEMAP_SRC_INCLUDE; + break; + case XML_SCHEMA_SCHEMA_REDEFINE: + err = XML_SCHEMAP_SRC_REDEFINE; + break; + } + + + /* Special handling for the main schema: + * skip the location and relation logic and just parse the doc. + * We need just a bucket to be returned in this case. + */ + if ((type == XML_SCHEMA_SCHEMA_MAIN) || (! WXS_HAS_BUCKETS(pctxt))) + goto doc_load; + + /* Note that we expect the location to be an absulute URI. */ + if (schemaLocation != NULL) { + bkt = xmlSchemaGetSchemaBucket(pctxt, schemaLocation); + if ((bkt != NULL) && + (pctxt->constructor->bucket == bkt)) { + /* Report self-imports/inclusions/redefinitions. */ + + xmlSchemaCustomErr(ACTXT_CAST pctxt, err, + invokingNode, NULL, + "The schema must not import/include/redefine itself", + NULL, NULL); + goto exit; + } + } + /* + * Create a relation for the graph of schemas. + */ + relation = xmlSchemaSchemaRelationCreate(); + if (relation == NULL) + return(-1); + xmlSchemaSchemaRelationAddChild(pctxt->constructor->bucket, + relation); + relation->type = type; + + /* + * Save the namespace import information. + */ + if (WXS_IS_BUCKET_IMPMAIN(type)) { + relation->importNamespace = importNamespace; + if (schemaLocation == NULL) { + /* + * No location; this is just an import of the namespace. + * Note that we don't assign a bucket to the relation + * in this case. + */ + goto exit; + } + targetNamespace = importNamespace; + } + + /* Did we already fetch the doc? */ + if (bkt != NULL) { + if ((WXS_IS_BUCKET_IMPMAIN(type)) && (! bkt->imported)) { + /* + * We included/redefined and then try to import a schema, + * but the new location provided for import was different. + */ + if (schemaLocation == NULL) + schemaLocation = BAD_CAST "in_memory_buffer"; + if (!xmlStrEqual(schemaLocation, + bkt->schemaLocation)) { + xmlSchemaCustomErr(ACTXT_CAST pctxt, err, + invokingNode, NULL, + "The schema document '%s' cannot be imported, since " + "it was already included or redefined", + schemaLocation, NULL); + goto exit; + } + } else if ((! WXS_IS_BUCKET_IMPMAIN(type)) && (bkt->imported)) { + /* + * We imported and then try to include/redefine a schema, + * but the new location provided for the include/redefine + * was different. + */ + if (schemaLocation == NULL) + schemaLocation = BAD_CAST "in_memory_buffer"; + if (!xmlStrEqual(schemaLocation, + bkt->schemaLocation)) { + xmlSchemaCustomErr(ACTXT_CAST pctxt, err, + invokingNode, NULL, + "The schema document '%s' cannot be included or " + "redefined, since it was already imported", + schemaLocation, NULL); + goto exit; + } + } + } + + if (WXS_IS_BUCKET_IMPMAIN(type)) { + /* + * Given that the schemaLocation [attribute] is only a hint, it is open + * to applications to ignore all but the first for a given + * namespace, regardless of the �actual value� of schemaLocation, but + * such a strategy risks missing useful information when new + * schemaLocations are offered. + * + * We will use the first that comes with a location. + * Further s *with* a location, will result in an error. + * TODO: Better would be to just report a warning here, but + * we'll try it this way until someone complains. + * + * Schema Document Location Strategy: + * 3 Based on the namespace name, identify an existing schema document, + * either as a resource which is an XML document or a element + * information item, in some local schema repository; + * 5 Attempt to resolve the namespace name to locate such a resource. + * + * NOTE: (3) and (5) are not supported. + */ + if (bkt != NULL) { + relation->bucket = bkt; + goto exit; + } + bkt = xmlSchemaGetSchemaBucketByTNS(pctxt, + importNamespace, 1); + + if (bkt != NULL) { + relation->bucket = bkt; + if (bkt->schemaLocation == NULL) { + /* First given location of the schema; load the doc. */ + bkt->schemaLocation = schemaLocation; + } else { + if (!xmlStrEqual(schemaLocation, + bkt->schemaLocation)) { + /* + * Additional location given; just skip it. + * URGENT TODO: We should report a warning here. + * res = XML_SCHEMAP_SRC_IMPORT; + */ + if (schemaLocation == NULL) + schemaLocation = BAD_CAST "in_memory_buffer"; + + xmlSchemaCustomWarning(ACTXT_CAST pctxt, + XML_SCHEMAP_WARN_SKIP_SCHEMA, + invokingNode, NULL, + "Skipping import of schema located at '%s' for the " + "namespace '%s', since this namespace was already " + "imported with the schema located at '%s'", + schemaLocation, importNamespace, bkt->schemaLocation); + } + goto exit; + } + } + /* + * No bucket + first location: load the doc and create a + * bucket. + */ + } else { + /* and */ + if (bkt != NULL) { + + if ((bkt->origTargetNamespace == NULL) && + (bkt->targetNamespace != sourceTargetNamespace)) { + xmlSchemaBucketPtr chamel; + + /* + * Chameleon include/redefine: skip loading only if it was + * aleady build for the targetNamespace of the including + * schema. + */ + /* + * URGENT TODO: If the schema is a chameleon-include then copy + * the components into the including schema and modify the + * targetNamespace of those components, do nothing otherwise. + * NOTE: This is currently worked-around by compiling the + * chameleon for every destinct including targetNamespace; thus + * not performant at the moment. + * TODO: Check when the namespace in wildcards for chameleons + * needs to be converted: before we built wildcard intersections + * or after. + * Answer: after! + */ + chamel = xmlSchemaGetChameleonSchemaBucket(pctxt, + schemaLocation, sourceTargetNamespace); + if (chamel != NULL) { + /* A fitting chameleon was already parsed; NOP. */ + relation->bucket = chamel; + goto exit; + } + /* + * We need to parse the chameleon again for a different + * targetNamespace. + * CHAMELEON TODO: Optimize this by only parsing the + * chameleon once, and then copying the components to + * the new targetNamespace. + */ + bkt = NULL; + } else { + relation->bucket = bkt; + goto exit; + } + } + } + if ((bkt != NULL) && (bkt->doc != NULL)) { + PERROR_INT("xmlSchemaAddSchemaDoc", + "trying to load a schema doc, but a doc is already " + "assigned to the schema bucket"); + goto exit_failure; + } + +doc_load: + /* + * Load the document. + */ + if (schemaDoc != NULL) { + doc = schemaDoc; + /* Don' free this one, since it was provided by the caller. */ + preserveDoc = 1; + /* TODO: Does the context or the doc hold the location? */ + if (schemaDoc->URL != NULL) + schemaLocation = xmlDictLookup(pctxt->dict, + schemaDoc->URL, -1); + else + schemaLocation = BAD_CAST "in_memory_buffer"; + } else if ((schemaLocation != NULL) || (schemaBuffer != NULL)) { + xmlParserCtxtPtr parserCtxt; + + parserCtxt = xmlNewParserCtxt(); + if (parserCtxt == NULL) { + xmlSchemaPErrMemory(NULL, "xmlSchemaGetDoc, " + "allocating a parser context", NULL); + goto exit_failure; + } + if ((pctxt->dict != NULL) && (parserCtxt->dict != NULL)) { + /* + * TODO: Do we have to burden the schema parser dict with all + * the content of the schema doc? + */ + xmlDictFree(parserCtxt->dict); + parserCtxt->dict = pctxt->dict; + xmlDictReference(parserCtxt->dict); + } + if (schemaLocation != NULL) { + /* Parse from file. */ + doc = xmlCtxtReadFile(parserCtxt, (const char *) schemaLocation, + NULL, SCHEMAS_PARSE_OPTIONS); + } else if (schemaBuffer != NULL) { + /* Parse from memory buffer. */ + doc = xmlCtxtReadMemory(parserCtxt, schemaBuffer, schemaBufferLen, + NULL, NULL, SCHEMAS_PARSE_OPTIONS); + schemaLocation = BAD_CAST "in_memory_buffer"; + if (doc != NULL) + doc->URL = xmlStrdup(schemaLocation); + } + /* + * For : + * 2.1 The referent is (a fragment of) a resource which is an + * XML document (see clause 1.1), which in turn corresponds to + * a element information item in a well-formed information + * set, which in turn corresponds to a valid schema. + * TODO: (2.1) fragments of XML documents are not supported. + * + * 2.2 The referent is a element information item in + * a well-formed information set, which in turn corresponds + * to a valid schema. + * TODO: (2.2) is not supported. + */ + if (doc == NULL) { + xmlErrorPtr lerr; + lerr = xmlGetLastError(); + /* + * Check if this a parser error, or if the document could + * just not be located. + * TODO: Try to find specific error codes to react only on + * localisation failures. + */ + if ((lerr == NULL) || (lerr->domain != XML_FROM_IO)) { + /* + * We assume a parser error here. + */ + located = 1; + /* TODO: Error code ?? */ + res = XML_SCHEMAP_SRC_IMPORT_2_1; + xmlSchemaCustomErr(ACTXT_CAST pctxt, res, + invokingNode, NULL, + "Failed to parse the XML resource '%s'", + schemaLocation, NULL); + } + } + xmlFreeParserCtxt(parserCtxt); + if ((doc == NULL) && located) + goto exit_error; + } else { + xmlSchemaPErr(pctxt, NULL, + XML_SCHEMAP_NOTHING_TO_PARSE, + "No information for parsing was provided with the " + "given schema parser context.\n", + NULL, NULL); + goto exit_failure; + } + /* + * Preprocess the document. + */ + if (doc != NULL) { + xmlNodePtr docElem = NULL; + + located = 1; + docElem = xmlDocGetRootElement(doc); + if (docElem == NULL) { + xmlSchemaCustomErr(ACTXT_CAST pctxt, XML_SCHEMAP_NOROOT, + invokingNode, NULL, + "The document '%s' has no document element", + schemaLocation, NULL); + goto exit_error; + } + /* + * Remove all the blank text nodes. + */ + xmlSchemaCleanupDoc(pctxt, docElem); + /* + * Check the schema's top level element. + */ + if (!IS_SCHEMA(docElem, "schema")) { + xmlSchemaCustomErr(ACTXT_CAST pctxt, XML_SCHEMAP_NOT_SCHEMA, + invokingNode, NULL, + "The XML document '%s' is not a schema document", + schemaLocation, NULL); + goto exit_error; + } + /* + * Note that we don't apply a type check for the + * targetNamespace value here. + */ + targetNamespace = xmlSchemaGetProp(pctxt, docElem, + "targetNamespace"); + } + +/* after_doc_loading: */ + if ((bkt == NULL) && located) { + /* Only create a bucket if the schema was located. */ + bkt = xmlSchemaBucketCreate(pctxt, type, + targetNamespace); + if (bkt == NULL) + goto exit_failure; + } + if (bkt != NULL) { + bkt->schemaLocation = schemaLocation; + bkt->located = located; + if (doc != NULL) { + bkt->doc = doc; + bkt->targetNamespace = targetNamespace; + bkt->origTargetNamespace = targetNamespace; + if (preserveDoc) + bkt->preserveDoc = 1; + } + if (WXS_IS_BUCKET_IMPMAIN(type)) + bkt->imported++; + /* + * Add it to the graph of schemas. + */ + if (relation != NULL) + relation->bucket = bkt; + } + +exit: + /* + * Return the bucket explicitely; this is needed for the + * main schema. + */ + if (bucket != NULL) + *bucket = bkt; + return (0); + +exit_error: + if ((doc != NULL) && (! preserveDoc)) { + xmlFreeDoc(doc); + if (bkt != NULL) + bkt->doc = NULL; + } + return(pctxt->err); + +exit_failure: + if ((doc != NULL) && (! preserveDoc)) { + xmlFreeDoc(doc); + if (bkt != NULL) + bkt->doc = NULL; + } + return (-1); +} + +/** + * xmlSchemaParseImport: + * @ctxt: a schema validation context + * @schema: the schema being built + * @node: a subtree containing XML Schema informations + * + * parse a XML schema Import definition + * *WARNING* this interface is highly subject to change + * + * Returns 0 in case of success, a positive error code if + * not valid and -1 in case of an internal error. + */ +static int +xmlSchemaParseImport(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr schema, + xmlNodePtr node) +{ + xmlNodePtr child; + const xmlChar *namespaceName = NULL, *schemaLocation = NULL; + const xmlChar *thisTargetNamespace; + xmlAttrPtr attr; + int ret = 0; + xmlSchemaBucketPtr bucket = NULL; + + if ((pctxt == NULL) || (schema == NULL) || (node == NULL)) + return (-1); + + /* + * Check for illegal attributes. + */ + attr = node->properties; + while (attr != NULL) { + if (attr->ns == NULL) { + if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && + (!xmlStrEqual(attr->name, BAD_CAST "namespace")) && + (!xmlStrEqual(attr->name, BAD_CAST "schemaLocation"))) { + xmlSchemaPIllegalAttrErr(pctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { + xmlSchemaPIllegalAttrErr(pctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + attr = attr->next; + } + /* + * Extract and validate attributes. + */ + if (xmlSchemaPValAttr(pctxt, NULL, node, + "namespace", xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI), + &namespaceName) != 0) { + xmlSchemaPSimpleTypeErr(pctxt, + XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, + NULL, node, + xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI), + NULL, namespaceName, NULL, NULL, NULL); + return (pctxt->err); + } + + if (xmlSchemaPValAttr(pctxt, NULL, node, + "schemaLocation", xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI), + &schemaLocation) != 0) { + xmlSchemaPSimpleTypeErr(pctxt, + XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, + NULL, node, + xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI), + NULL, namespaceName, NULL, NULL, NULL); + return (pctxt->err); + } + /* + * And now for the children... + */ + child = node->children; + if (IS_SCHEMA(child, "annotation")) { + /* + * the annotation here is simply discarded ... + * TODO: really? + */ + child = child->next; + } + if (child != NULL) { + xmlSchemaPContentErr(pctxt, + XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, + NULL, node, child, NULL, + "(annotation?)"); + } + /* + * Apply additional constraints. + * + * Note that it is important to use the original @targetNamespace + * (or none at all), to rule out imports of schemas _with_ a + * @targetNamespace if the importing schema is a chameleon schema + * (with no @targetNamespace). + */ + thisTargetNamespace = WXS_BUCKET(pctxt)->origTargetNamespace; + if (namespaceName != NULL) { + /* + * 1.1 If the namespace [attribute] is present, then its �actual value� + * must not match the �actual value� of the enclosing 's + * targetNamespace [attribute]. + */ + if (xmlStrEqual(thisTargetNamespace, namespaceName)) { + xmlSchemaPCustomErr(pctxt, + XML_SCHEMAP_SRC_IMPORT_1_1, + NULL, node, + "The value of the attribute 'namespace' must not match " + "the target namespace '%s' of the importing schema", + thisTargetNamespace); + return (pctxt->err); + } + } else { + /* + * 1.2 If the namespace [attribute] is not present, then the enclosing + * must have a targetNamespace [attribute]. + */ + if (thisTargetNamespace == NULL) { + xmlSchemaPCustomErr(pctxt, + XML_SCHEMAP_SRC_IMPORT_1_2, + NULL, node, + "The attribute 'namespace' must be existent if " + "the importing schema has no target namespace", + NULL); + return (pctxt->err); + } + } + /* + * Locate and acquire the schema document. + */ + if (schemaLocation != NULL) + schemaLocation = xmlSchemaBuildAbsoluteURI(pctxt->dict, + schemaLocation, node); + ret = xmlSchemaAddSchemaDoc(pctxt, XML_SCHEMA_SCHEMA_IMPORT, + schemaLocation, NULL, NULL, 0, node, thisTargetNamespace, + namespaceName, &bucket); + + if (ret != 0) + return(ret); + + /* + * For : "It is *not* an error for the application + * schema reference strategy to fail." + * So just don't parse if no schema document was found. + * Note that we will get no bucket if the schema could not be + * located or if there was no schemaLocation. + */ + if ((bucket == NULL) && (schemaLocation != NULL)) { + xmlSchemaCustomWarning(ACTXT_CAST pctxt, + XML_SCHEMAP_WARN_UNLOCATED_SCHEMA, + node, NULL, + "Failed to locate a schema at location '%s'. " + "Skipping the import", schemaLocation, NULL, NULL); + } + + if ((bucket != NULL) && CAN_PARSE_SCHEMA(bucket)) { + ret = xmlSchemaParseNewDoc(pctxt, schema, bucket); + } + + return (ret); +} + +static int +xmlSchemaParseIncludeOrRedefineAttrs(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaPtr schema, + xmlNodePtr node, + xmlChar **schemaLocation, + int type) +{ + xmlAttrPtr attr; + + if ((pctxt == NULL) || (schema == NULL) || (node == NULL) || + (schemaLocation == NULL)) + return (-1); + + *schemaLocation = NULL; + /* + * Check for illegal attributes. + * Applies for both and . + */ + attr = node->properties; + while (attr != NULL) { + if (attr->ns == NULL) { + if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && + (!xmlStrEqual(attr->name, BAD_CAST "schemaLocation"))) { + xmlSchemaPIllegalAttrErr(pctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { + xmlSchemaPIllegalAttrErr(pctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + attr = attr->next; + } + xmlSchemaPValAttrID(pctxt, node, BAD_CAST "id"); + /* + * Preliminary step, extract the URI-Reference and make an URI + * from the base. + */ + /* + * Attribute "schemaLocation" is mandatory. + */ + attr = xmlSchemaGetPropNode(node, "schemaLocation"); + if (attr != NULL) { + xmlChar *base = NULL; + xmlChar *uri = NULL; + + if (xmlSchemaPValAttrNode(pctxt, NULL, attr, + xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI), + (const xmlChar **) schemaLocation) != 0) + goto exit_error; + base = xmlNodeGetBase(node->doc, node); + if (base == NULL) { + uri = xmlBuildURI(*schemaLocation, node->doc->URL); + } else { + uri = xmlBuildURI(*schemaLocation, base); + xmlFree(base); + } + if (uri == NULL) { + PERROR_INT("xmlSchemaParseIncludeOrRedefine", + "could not build an URI from the schemaLocation") + goto exit_failure; + } + (*schemaLocation) = (xmlChar *) xmlDictLookup(pctxt->dict, uri, -1); + xmlFree(uri); + } else { + xmlSchemaPMissingAttrErr(pctxt, + XML_SCHEMAP_S4S_ATTR_MISSING, + NULL, node, "schemaLocation", NULL); + goto exit_error; + } + /* + * Report self-inclusion and self-redefinition. + */ + if (xmlStrEqual(*schemaLocation, pctxt->URL)) { + if (type == XML_SCHEMA_SCHEMA_REDEFINE) { + xmlSchemaPCustomErr(pctxt, + XML_SCHEMAP_SRC_REDEFINE, + NULL, node, + "The schema document '%s' cannot redefine itself.", + *schemaLocation); + } else { + xmlSchemaPCustomErr(pctxt, + XML_SCHEMAP_SRC_INCLUDE, + NULL, node, + "The schema document '%s' cannot include itself.", + *schemaLocation); + } + goto exit_error; + } + + return(0); +exit_error: + return(pctxt->err); +exit_failure: + return(-1); +} + +static int +xmlSchemaParseIncludeOrRedefine(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaPtr schema, + xmlNodePtr node, + int type) +{ + xmlNodePtr child = NULL; + const xmlChar *schemaLocation = NULL; + int res = 0; /* hasRedefinitions = 0 */ + int isChameleon = 0, wasChameleon = 0; + xmlSchemaBucketPtr bucket = NULL; + + if ((pctxt == NULL) || (schema == NULL) || (node == NULL)) + return (-1); + + /* + * Parse attributes. Note that the returned schemaLocation will + * be already converted to an absolute URI. + */ + res = xmlSchemaParseIncludeOrRedefineAttrs(pctxt, schema, + node, (xmlChar **) (&schemaLocation), type); + if (res != 0) + return(res); + /* + * Load and add the schema document. + */ + res = xmlSchemaAddSchemaDoc(pctxt, type, schemaLocation, NULL, + NULL, 0, node, pctxt->targetNamespace, NULL, &bucket); + if (res != 0) + return(res); + /* + * If we get no schema bucket back, then this means that the schema + * document could not be located or was broken XML or was not + * a schema document. + */ + if ((bucket == NULL) || (bucket->doc == NULL)) { + if (type == XML_SCHEMA_SCHEMA_INCLUDE) { + /* + * WARNING for : + * We will raise an error if the schema cannot be located + * for inclusions, since the that was the feedback from the + * schema people. I.e. the following spec piece will *not* be + * satisfied: + * SPEC src-include: "It is not an error for the �actual value� of the + * schemaLocation [attribute] to fail to resolve it all, in which + * case no corresponding inclusion is performed. + * So do we need a warning report here?" + */ + res = XML_SCHEMAP_SRC_INCLUDE; + xmlSchemaCustomErr(ACTXT_CAST pctxt, res, + node, NULL, + "Failed to load the document '%s' for inclusion", + schemaLocation, NULL); + } else { + /* + * NOTE: This was changed to raise an error even if no redefinitions + * are specified. + * + * SPEC src-redefine (1) + * "If there are any element information items among the [children] + * other than then the �actual value� of the + * schemaLocation [attribute] must successfully resolve." + * TODO: Ask the WG if a the location has always to resolve + * here as well! + */ + res = XML_SCHEMAP_SRC_REDEFINE; + xmlSchemaCustomErr(ACTXT_CAST pctxt, res, + node, NULL, + "Failed to load the document '%s' for redefinition", + schemaLocation, NULL); + } + } else { + /* + * Check targetNamespace sanity before parsing the new schema. + * TODO: Note that we won't check further content if the + * targetNamespace was bad. + */ + if (bucket->origTargetNamespace != NULL) { + /* + * SPEC src-include (2.1) + * "SII has a targetNamespace [attribute], and its �actual + * value� is identical to the �actual value� of the targetNamespace + * [attribute] of SII� (which must have such an [attribute])." + */ + if (pctxt->targetNamespace == NULL) { + xmlSchemaCustomErr(ACTXT_CAST pctxt, + XML_SCHEMAP_SRC_INCLUDE, + node, NULL, + "The target namespace of the included/redefined schema " + "'%s' has to be absent, since the including/redefining " + "schema has no target namespace", + schemaLocation, NULL); + goto exit_error; + } else if (!xmlStrEqual(bucket->origTargetNamespace, + pctxt->targetNamespace)) { + /* TODO: Change error function. */ + xmlSchemaPCustomErrExt(pctxt, + XML_SCHEMAP_SRC_INCLUDE, + NULL, node, + "The target namespace '%s' of the included/redefined " + "schema '%s' differs from '%s' of the " + "including/redefining schema", + bucket->origTargetNamespace, schemaLocation, + pctxt->targetNamespace); + goto exit_error; + } + } else if (pctxt->targetNamespace != NULL) { + /* + * Chameleons: the original target namespace will + * differ from the resulting namespace. + */ + isChameleon = 1; + if (bucket->parsed && + bucket->origTargetNamespace != NULL) { + xmlSchemaCustomErr(ACTXT_CAST pctxt, + XML_SCHEMAP_SRC_INCLUDE, + node, NULL, + "The target namespace of the included/redefined schema " + "'%s' has to be absent or the same as the " + "including/redefining schema's target namespace", + schemaLocation, NULL); + goto exit_error; + } + bucket->targetNamespace = pctxt->targetNamespace; + } + } + /* + * Parse the schema. + */ + if (bucket && (!bucket->parsed) && (bucket->doc != NULL)) { + if (isChameleon) { + /* TODO: Get rid of this flag on the schema itself. */ + if ((schema->flags & XML_SCHEMAS_INCLUDING_CONVERT_NS) == 0) { + schema->flags |= XML_SCHEMAS_INCLUDING_CONVERT_NS; + } else + wasChameleon = 1; + } + xmlSchemaParseNewDoc(pctxt, schema, bucket); + /* Restore chameleon flag. */ + if (isChameleon && (!wasChameleon)) + schema->flags ^= XML_SCHEMAS_INCLUDING_CONVERT_NS; + } + /* + * And now for the children... + */ + child = node->children; + if (type == XML_SCHEMA_SCHEMA_REDEFINE) { + /* + * Parse (simpleType | complexType | group | attributeGroup))* + */ + pctxt->redefined = bucket; + /* + * How to proceed if the redefined schema was not located? + */ + pctxt->isRedefine = 1; + while (IS_SCHEMA(child, "annotation") || + IS_SCHEMA(child, "simpleType") || + IS_SCHEMA(child, "complexType") || + IS_SCHEMA(child, "group") || + IS_SCHEMA(child, "attributeGroup")) { + if (IS_SCHEMA(child, "annotation")) { + /* + * TODO: discard or not? + */ + } else if (IS_SCHEMA(child, "simpleType")) { + xmlSchemaParseSimpleType(pctxt, schema, child, 1); + } else if (IS_SCHEMA(child, "complexType")) { + xmlSchemaParseComplexType(pctxt, schema, child, 1); + /* hasRedefinitions = 1; */ + } else if (IS_SCHEMA(child, "group")) { + /* hasRedefinitions = 1; */ + xmlSchemaParseModelGroupDefinition(pctxt, + schema, child); + } else if (IS_SCHEMA(child, "attributeGroup")) { + /* hasRedefinitions = 1; */ + xmlSchemaParseAttributeGroupDefinition(pctxt, schema, + child); + } + child = child->next; + } + pctxt->redefined = NULL; + pctxt->isRedefine = 0; + } else { + if (IS_SCHEMA(child, "annotation")) { + /* + * TODO: discard or not? + */ + child = child->next; + } + } + if (child != NULL) { + res = XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED; + if (type == XML_SCHEMA_SCHEMA_REDEFINE) { + xmlSchemaPContentErr(pctxt, res, + NULL, node, child, NULL, + "(annotation | (simpleType | complexType | group | attributeGroup))*"); + } else { + xmlSchemaPContentErr(pctxt, res, + NULL, node, child, NULL, + "(annotation?)"); + } + } + return(res); + +exit_error: + return(pctxt->err); +} + +static int +xmlSchemaParseRedefine(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr schema, + xmlNodePtr node) +{ + int res; +#ifndef ENABLE_REDEFINE + TODO + return(0); +#endif + res = xmlSchemaParseIncludeOrRedefine(pctxt, schema, node, + XML_SCHEMA_SCHEMA_REDEFINE); + if (res != 0) + return(res); + return(0); +} + +static int +xmlSchemaParseInclude(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr schema, + xmlNodePtr node) +{ + int res; + + res = xmlSchemaParseIncludeOrRedefine(pctxt, schema, node, + XML_SCHEMA_SCHEMA_INCLUDE); + if (res != 0) + return(res); + return(0); +} + +/** + * xmlSchemaParseModelGroup: + * @ctxt: a schema validation context + * @schema: the schema being built + * @node: a subtree containing XML Schema informations + * @type: the "compositor" type + * @particleNeeded: if a a model group with a particle + * + * parse a XML schema Sequence definition. + * Applies parts of: + * Schema Representation Constraint: + * Redefinition Constraints and Semantics (src-redefine) + * (6.1), (6.1.1), (6.1.2) + * + * Schema Component Constraint: + * All Group Limited (cos-all-limited) (2) + * TODO: Actually this should go to component-level checks, + * but is done here due to performance. Move it to an other layer + * is schema construction via an API is implemented. + * + * *WARNING* this interface is highly subject to change + * + * Returns -1 in case of error, 0 if the declaration is improper and + * 1 in case of success. + */ +static xmlSchemaTreeItemPtr +xmlSchemaParseModelGroup(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, + xmlNodePtr node, xmlSchemaTypeType type, + int withParticle) +{ + xmlSchemaModelGroupPtr item; + xmlSchemaParticlePtr particle = NULL; + xmlNodePtr child = NULL; + xmlAttrPtr attr; + int min = 1, max = 1, isElemRef, hasRefs = 0; + + if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) + return (NULL); + /* + * Create a model group with the given compositor. + */ + item = xmlSchemaAddModelGroup(ctxt, schema, type, node); + if (item == NULL) + return (NULL); + + if (withParticle) { + if (type == XML_SCHEMA_TYPE_ALL) { + min = xmlGetMinOccurs(ctxt, node, 0, 1, 1, "(0 | 1)"); + max = xmlGetMaxOccurs(ctxt, node, 1, 1, 1, "1"); + } else { + /* choice + sequence */ + min = xmlGetMinOccurs(ctxt, node, 0, -1, 1, "xs:nonNegativeInteger"); + max = xmlGetMaxOccurs(ctxt, node, 0, UNBOUNDED, 1, + "(xs:nonNegativeInteger | unbounded)"); + } + xmlSchemaPCheckParticleCorrect_2(ctxt, NULL, node, min, max); + /* + * Create a particle + */ + particle = xmlSchemaAddParticle(ctxt, node, min, max); + if (particle == NULL) + return (NULL); + particle->children = (xmlSchemaTreeItemPtr) item; + /* + * Check for illegal attributes. + */ + attr = node->properties; + while (attr != NULL) { + if (attr->ns == NULL) { + if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && + (!xmlStrEqual(attr->name, BAD_CAST "maxOccurs")) && + (!xmlStrEqual(attr->name, BAD_CAST "minOccurs"))) { + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + attr = attr->next; + } + } else { + /* + * Check for illegal attributes. + */ + attr = node->properties; + while (attr != NULL) { + if (attr->ns == NULL) { + if (!xmlStrEqual(attr->name, BAD_CAST "id")) { + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + attr = attr->next; + } + } + + /* + * Extract and validate attributes. + */ + xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); + /* + * And now for the children... + */ + child = node->children; + if (IS_SCHEMA(child, "annotation")) { + item->annot = xmlSchemaParseAnnotation(ctxt, child, 1); + child = child->next; + } + if (type == XML_SCHEMA_TYPE_ALL) { + xmlSchemaParticlePtr part, last = NULL; + + while (IS_SCHEMA(child, "element")) { + part = (xmlSchemaParticlePtr) xmlSchemaParseElement(ctxt, + schema, child, &isElemRef, 0); + /* + * SPEC cos-all-limited (2) + * "The {max occurs} of all the particles in the {particles} + * of the ('all') group must be 0 or 1. + */ + if (part != NULL) { + if (isElemRef) + hasRefs++; + if (part->minOccurs > 1) { + xmlSchemaPCustomErr(ctxt, + XML_SCHEMAP_COS_ALL_LIMITED, + NULL, child, + "Invalid value for minOccurs (must be 0 or 1)", + NULL); + /* Reset to 1. */ + part->minOccurs = 1; + } + if (part->maxOccurs > 1) { + xmlSchemaPCustomErr(ctxt, + XML_SCHEMAP_COS_ALL_LIMITED, + NULL, child, + "Invalid value for maxOccurs (must be 0 or 1)", + NULL); + /* Reset to 1. */ + part->maxOccurs = 1; + } + if (last == NULL) + item->children = (xmlSchemaTreeItemPtr) part; + else + last->next = (xmlSchemaTreeItemPtr) part; + last = part; + } + child = child->next; + } + if (child != NULL) { + xmlSchemaPContentErr(ctxt, + XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, + NULL, node, child, NULL, + "(annotation?, (annotation?, element*)"); + } + } else { + /* choice + sequence */ + xmlSchemaTreeItemPtr part = NULL, last = NULL; + + while ((IS_SCHEMA(child, "element")) || + (IS_SCHEMA(child, "group")) || + (IS_SCHEMA(child, "any")) || + (IS_SCHEMA(child, "choice")) || + (IS_SCHEMA(child, "sequence"))) { + + if (IS_SCHEMA(child, "element")) { + part = (xmlSchemaTreeItemPtr) + xmlSchemaParseElement(ctxt, schema, child, &isElemRef, 0); + if (part && isElemRef) + hasRefs++; + } else if (IS_SCHEMA(child, "group")) { + part = + xmlSchemaParseModelGroupDefRef(ctxt, schema, child); + if (part != NULL) + hasRefs++; + /* + * Handle redefinitions. + */ + if (ctxt->isRedefine && ctxt->redef && + (ctxt->redef->item->type == XML_SCHEMA_TYPE_GROUP) && + part && part->children) + { + if ((xmlSchemaGetQNameRefName(part->children) == + ctxt->redef->refName) && + (xmlSchemaGetQNameRefTargetNs(part->children) == + ctxt->redef->refTargetNs)) + { + /* + * SPEC src-redefine: + * (6.1) "If it has a among its contents at + * some level the �actual value� of whose ref + * [attribute] is the same as the �actual value� of + * its own name attribute plus target namespace, then + * all of the following must be true:" + * (6.1.1) "It must have exactly one such group." + */ + if (ctxt->redefCounter != 0) { + xmlChar *str = NULL; + + xmlSchemaCustomErr(ACTXT_CAST ctxt, + XML_SCHEMAP_SRC_REDEFINE, child, NULL, + "The redefining model group definition " + "'%s' must not contain more than one " + "reference to the redefined definition", + xmlSchemaFormatQName(&str, + ctxt->redef->refTargetNs, + ctxt->redef->refName), + NULL); + FREE_AND_NULL(str) + part = NULL; + } else if (((WXS_PARTICLE(part))->minOccurs != 1) || + ((WXS_PARTICLE(part))->maxOccurs != 1)) + { + xmlChar *str = NULL; + /* + * SPEC src-redefine: + * (6.1.2) "The �actual value� of both that + * group's minOccurs and maxOccurs [attribute] + * must be 1 (or �absent�). + */ + xmlSchemaCustomErr(ACTXT_CAST ctxt, + XML_SCHEMAP_SRC_REDEFINE, child, NULL, + "The redefining model group definition " + "'%s' must not contain a reference to the " + "redefined definition with a " + "maxOccurs/minOccurs other than 1", + xmlSchemaFormatQName(&str, + ctxt->redef->refTargetNs, + ctxt->redef->refName), + NULL); + FREE_AND_NULL(str) + part = NULL; + } + ctxt->redef->reference = WXS_BASIC_CAST part; + ctxt->redefCounter++; + } + } + } else if (IS_SCHEMA(child, "any")) { + part = (xmlSchemaTreeItemPtr) + xmlSchemaParseAny(ctxt, schema, child); + } else if (IS_SCHEMA(child, "choice")) { + part = xmlSchemaParseModelGroup(ctxt, schema, child, + XML_SCHEMA_TYPE_CHOICE, 1); + } else if (IS_SCHEMA(child, "sequence")) { + part = xmlSchemaParseModelGroup(ctxt, schema, child, + XML_SCHEMA_TYPE_SEQUENCE, 1); + } + if (part != NULL) { + if (last == NULL) + item->children = part; + else + last->next = part; + last = part; + } + child = child->next; + } + if (child != NULL) { + xmlSchemaPContentErr(ctxt, + XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, + NULL, node, child, NULL, + "(annotation?, (element | group | choice | sequence | any)*)"); + } + } + if ((max == 0) && (min == 0)) + return (NULL); + if (hasRefs) { + /* + * We need to resolve references. + */ + WXS_ADD_PENDING(ctxt, item); + } + if (withParticle) + return ((xmlSchemaTreeItemPtr) particle); + else + return ((xmlSchemaTreeItemPtr) item); +} + +/** + * xmlSchemaParseRestriction: + * @ctxt: a schema validation context + * @schema: the schema being built + * @node: a subtree containing XML Schema informations + * + * parse a XML schema Restriction definition + * *WARNING* this interface is highly subject to change + * + * Returns the type definition or NULL in case of error + */ +static xmlSchemaTypePtr +xmlSchemaParseRestriction(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, + xmlNodePtr node, xmlSchemaTypeType parentType) +{ + xmlSchemaTypePtr type; + xmlNodePtr child = NULL; + xmlAttrPtr attr; + + if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) + return (NULL); + /* Not a component, don't create it. */ + type = ctxt->ctxtType; + type->flags |= XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION; + + /* + * Check for illegal attributes. + */ + attr = node->properties; + while (attr != NULL) { + if (attr->ns == NULL) { + if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && + (!xmlStrEqual(attr->name, BAD_CAST "base"))) { + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + attr = attr->next; + } + /* + * Extract and validate attributes. + */ + xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); + /* + * Attribute + */ + /* + * Extract the base type. The "base" attribute is mandatory if inside + * a complex type or if redefining. + * + * SPEC (1.2) "...otherwise ( has no " + * among its [children]), the simple type definition which is + * the {content type} of the type definition �resolved� to by + * the �actual value� of the base [attribute]" + */ + if (xmlSchemaPValAttrQName(ctxt, schema, NULL, node, "base", + &(type->baseNs), &(type->base)) == 0) + { + if ((type->base == NULL) && (type->type == XML_SCHEMA_TYPE_COMPLEX)) { + xmlSchemaPMissingAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_MISSING, + NULL, node, "base", NULL); + } else if ((ctxt->isRedefine) && + (type->flags & XML_SCHEMAS_TYPE_GLOBAL)) + { + if (type->base == NULL) { + xmlSchemaPMissingAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_MISSING, + NULL, node, "base", NULL); + } else if ((! xmlStrEqual(type->base, type->name)) || + (! xmlStrEqual(type->baseNs, type->targetNamespace))) + { + xmlChar *str1 = NULL, *str2 = NULL; + /* + * REDEFINE: SPEC src-redefine (5) + * "Within the [children], each must have a + * among its [children] ... the �actual value� of + * whose base [attribute] must be the same as the �actual value� + * of its own name attribute plus target namespace;" + */ + xmlSchemaPCustomErrExt(ctxt, XML_SCHEMAP_SRC_REDEFINE, + NULL, node, "This is a redefinition, but the QName " + "value '%s' of the 'base' attribute does not match the " + "type's designation '%s'", + xmlSchemaFormatQName(&str1, type->baseNs, type->base), + xmlSchemaFormatQName(&str2, type->targetNamespace, + type->name), NULL); + FREE_AND_NULL(str1); + FREE_AND_NULL(str2); + /* Avoid confusion and erase the values. */ + type->base = NULL; + type->baseNs = NULL; + } + } + } + /* + * And now for the children... + */ + child = node->children; + if (IS_SCHEMA(child, "annotation")) { + /* + * Add the annotation to the simple type ancestor. + */ + xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type, + xmlSchemaParseAnnotation(ctxt, child, 1)); + child = child->next; + } + if (parentType == XML_SCHEMA_TYPE_SIMPLE) { + /* + * Corresponds to . + */ + if (IS_SCHEMA(child, "simpleType")) { + if (type->base != NULL) { + /* + * src-restriction-base-or-simpleType + * Either the base [attribute] or the simpleType [child] of the + * element must be present, but not both. + */ + xmlSchemaPContentErr(ctxt, + XML_SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE, + NULL, node, child, + "The attribute 'base' and the child are " + "mutually exclusive", NULL); + } else { + type->baseType = (xmlSchemaTypePtr) + xmlSchemaParseSimpleType(ctxt, schema, child, 0); + } + child = child->next; + } else if (type->base == NULL) { + xmlSchemaPContentErr(ctxt, + XML_SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE, + NULL, node, child, + "Either the attribute 'base' or a child " + "must be present", NULL); + } + } else if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) { + /* + * Corresponds to ... + * followed by: + * + * Model groups , and . + */ + if (IS_SCHEMA(child, "all")) { + type->subtypes = (xmlSchemaTypePtr) + xmlSchemaParseModelGroup(ctxt, schema, child, + XML_SCHEMA_TYPE_ALL, 1); + child = child->next; + } else if (IS_SCHEMA(child, "choice")) { + type->subtypes = (xmlSchemaTypePtr) + xmlSchemaParseModelGroup(ctxt, + schema, child, XML_SCHEMA_TYPE_CHOICE, 1); + child = child->next; + } else if (IS_SCHEMA(child, "sequence")) { + type->subtypes = (xmlSchemaTypePtr) + xmlSchemaParseModelGroup(ctxt, schema, child, + XML_SCHEMA_TYPE_SEQUENCE, 1); + child = child->next; + /* + * Model group reference . + */ + } else if (IS_SCHEMA(child, "group")) { + type->subtypes = (xmlSchemaTypePtr) + xmlSchemaParseModelGroupDefRef(ctxt, schema, child); + /* + * Note that the reference will be resolved in + * xmlSchemaResolveTypeReferences(); + */ + child = child->next; + } + } else if (parentType == XML_SCHEMA_TYPE_SIMPLE_CONTENT) { + /* + * Corresponds to ... + * + * "1.1 the simple type definition corresponding to the + * among the [children] of if there is one;" + */ + if (IS_SCHEMA(child, "simpleType")) { + /* + * We will store the to-be-restricted simple type in + * type->contentTypeDef *temporarily*. + */ + type->contentTypeDef = (xmlSchemaTypePtr) + xmlSchemaParseSimpleType(ctxt, schema, child, 0); + if ( type->contentTypeDef == NULL) + return (NULL); + child = child->next; + } + } + + if ((parentType == XML_SCHEMA_TYPE_SIMPLE) || + (parentType == XML_SCHEMA_TYPE_SIMPLE_CONTENT)) { + xmlSchemaFacetPtr facet, lastfacet = NULL; + /* + * Corresponds to ... + * ... + */ + + /* + * Add the facets to the simple type ancestor. + */ + /* + * TODO: Datatypes: 4.1.3 Constraints on XML Representation of + * Simple Type Definition Schema Representation Constraint: + * *Single Facet Value* + */ + while ((IS_SCHEMA(child, "minInclusive")) || + (IS_SCHEMA(child, "minExclusive")) || + (IS_SCHEMA(child, "maxInclusive")) || + (IS_SCHEMA(child, "maxExclusive")) || + (IS_SCHEMA(child, "totalDigits")) || + (IS_SCHEMA(child, "fractionDigits")) || + (IS_SCHEMA(child, "pattern")) || + (IS_SCHEMA(child, "enumeration")) || + (IS_SCHEMA(child, "whiteSpace")) || + (IS_SCHEMA(child, "length")) || + (IS_SCHEMA(child, "maxLength")) || + (IS_SCHEMA(child, "minLength"))) { + facet = xmlSchemaParseFacet(ctxt, schema, child); + if (facet != NULL) { + if (lastfacet == NULL) + type->facets = facet; + else + lastfacet->next = facet; + lastfacet = facet; + lastfacet->next = NULL; + } + child = child->next; + } + /* + * Create links for derivation and validation. + */ + if (type->facets != NULL) { + xmlSchemaFacetLinkPtr facetLink, lastFacetLink = NULL; + + facet = type->facets; + do { + facetLink = (xmlSchemaFacetLinkPtr) + xmlMalloc(sizeof(xmlSchemaFacetLink)); + if (facetLink == NULL) { + xmlSchemaPErrMemory(ctxt, "allocating a facet link", NULL); + xmlFree(facetLink); + return (NULL); + } + facetLink->facet = facet; + facetLink->next = NULL; + if (lastFacetLink == NULL) + type->facetSet = facetLink; + else + lastFacetLink->next = facetLink; + lastFacetLink = facetLink; + facet = facet->next; + } while (facet != NULL); + } + } + if (type->type == XML_SCHEMA_TYPE_COMPLEX) { + /* + * Attribute uses/declarations. + */ + if (xmlSchemaParseLocalAttributes(ctxt, schema, &child, + (xmlSchemaItemListPtr *) &(type->attrUses), + XML_SCHEMA_TYPE_RESTRICTION, NULL) == -1) + return(NULL); + /* + * Attribute wildcard. + */ + if (IS_SCHEMA(child, "anyAttribute")) { + type->attributeWildcard = + xmlSchemaParseAnyAttribute(ctxt, schema, child); + child = child->next; + } + } + if (child != NULL) { + if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) { + xmlSchemaPContentErr(ctxt, + XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, + NULL, node, child, NULL, + "annotation?, (group | all | choice | sequence)?, " + "((attribute | attributeGroup)*, anyAttribute?))"); + } else if (parentType == XML_SCHEMA_TYPE_SIMPLE_CONTENT) { + xmlSchemaPContentErr(ctxt, + XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, + NULL, node, child, NULL, + "(annotation?, (simpleType?, (minExclusive | minInclusive | " + "maxExclusive | maxInclusive | totalDigits | fractionDigits | " + "length | minLength | maxLength | enumeration | whiteSpace | " + "pattern)*)?, ((attribute | attributeGroup)*, anyAttribute?))"); + } else { + /* Simple type */ + xmlSchemaPContentErr(ctxt, + XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, + NULL, node, child, NULL, + "(annotation?, (simpleType?, (minExclusive | minInclusive | " + "maxExclusive | maxInclusive | totalDigits | fractionDigits | " + "length | minLength | maxLength | enumeration | whiteSpace | " + "pattern)*))"); + } + } + return (NULL); +} + +/** + * xmlSchemaParseExtension: + * @ctxt: a schema validation context + * @schema: the schema being built + * @node: a subtree containing XML Schema informations + * + * Parses an , which is found inside a + * or . + * *WARNING* this interface is highly subject to change. + * + * TODO: Returns the type definition or NULL in case of error + */ +static xmlSchemaTypePtr +xmlSchemaParseExtension(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, + xmlNodePtr node, xmlSchemaTypeType parentType) +{ + xmlSchemaTypePtr type; + xmlNodePtr child = NULL; + xmlAttrPtr attr; + + if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) + return (NULL); + /* Not a component, don't create it. */ + type = ctxt->ctxtType; + type->flags |= XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION; + + /* + * Check for illegal attributes. + */ + attr = node->properties; + while (attr != NULL) { + if (attr->ns == NULL) { + if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && + (!xmlStrEqual(attr->name, BAD_CAST "base"))) { + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + attr = attr->next; + } + + xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); + + /* + * Attribute "base" - mandatory. + */ + if ((xmlSchemaPValAttrQName(ctxt, schema, NULL, node, + "base", &(type->baseNs), &(type->base)) == 0) && + (type->base == NULL)) { + xmlSchemaPMissingAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_MISSING, + NULL, node, "base", NULL); + } + /* + * And now for the children... + */ + child = node->children; + if (IS_SCHEMA(child, "annotation")) { + /* + * Add the annotation to the type ancestor. + */ + xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type, + xmlSchemaParseAnnotation(ctxt, child, 1)); + child = child->next; + } + if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) { + /* + * Corresponds to ... and: + * + * Model groups , , and . + */ + if (IS_SCHEMA(child, "all")) { + type->subtypes = (xmlSchemaTypePtr) + xmlSchemaParseModelGroup(ctxt, schema, + child, XML_SCHEMA_TYPE_ALL, 1); + child = child->next; + } else if (IS_SCHEMA(child, "choice")) { + type->subtypes = (xmlSchemaTypePtr) + xmlSchemaParseModelGroup(ctxt, schema, + child, XML_SCHEMA_TYPE_CHOICE, 1); + child = child->next; + } else if (IS_SCHEMA(child, "sequence")) { + type->subtypes = (xmlSchemaTypePtr) + xmlSchemaParseModelGroup(ctxt, schema, + child, XML_SCHEMA_TYPE_SEQUENCE, 1); + child = child->next; + } else if (IS_SCHEMA(child, "group")) { + type->subtypes = (xmlSchemaTypePtr) + xmlSchemaParseModelGroupDefRef(ctxt, schema, child); + /* + * Note that the reference will be resolved in + * xmlSchemaResolveTypeReferences(); + */ + child = child->next; + } + } + if (child != NULL) { + /* + * Attribute uses/declarations. + */ + if (xmlSchemaParseLocalAttributes(ctxt, schema, &child, + (xmlSchemaItemListPtr *) &(type->attrUses), + XML_SCHEMA_TYPE_EXTENSION, NULL) == -1) + return(NULL); + /* + * Attribute wildcard. + */ + if (IS_SCHEMA(child, "anyAttribute")) { + ctxt->ctxtType->attributeWildcard = + xmlSchemaParseAnyAttribute(ctxt, schema, child); + child = child->next; + } + } + if (child != NULL) { + if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) { + /* Complex content extension. */ + xmlSchemaPContentErr(ctxt, + XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, + NULL, node, child, NULL, + "(annotation?, ((group | all | choice | sequence)?, " + "((attribute | attributeGroup)*, anyAttribute?)))"); + } else { + /* Simple content extension. */ + xmlSchemaPContentErr(ctxt, + XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, + NULL, node, child, NULL, + "(annotation?, ((attribute | attributeGroup)*, " + "anyAttribute?))"); + } + } + return (NULL); +} + +/** + * xmlSchemaParseSimpleContent: + * @ctxt: a schema validation context + * @schema: the schema being built + * @node: a subtree containing XML Schema informations + * + * parse a XML schema SimpleContent definition + * *WARNING* this interface is highly subject to change + * + * Returns the type definition or NULL in case of error + */ +static int +xmlSchemaParseSimpleContent(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaPtr schema, xmlNodePtr node, + int *hasRestrictionOrExtension) +{ + xmlSchemaTypePtr type; + xmlNodePtr child = NULL; + xmlAttrPtr attr; + + if ((ctxt == NULL) || (schema == NULL) || (node == NULL) || + (hasRestrictionOrExtension == NULL)) + return (-1); + *hasRestrictionOrExtension = 0; + /* Not a component, don't create it. */ + type = ctxt->ctxtType; + type->contentType = XML_SCHEMA_CONTENT_SIMPLE; + /* + * Check for illegal attributes. + */ + attr = node->properties; + while (attr != NULL) { + if (attr->ns == NULL) { + if ((!xmlStrEqual(attr->name, BAD_CAST "id"))) { + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + attr = attr->next; + } + + xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); + + /* + * And now for the children... + */ + child = node->children; + if (IS_SCHEMA(child, "annotation")) { + /* + * Add the annotation to the complex type ancestor. + */ + xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type, + xmlSchemaParseAnnotation(ctxt, child, 1)); + child = child->next; + } + if (child == NULL) { + xmlSchemaPContentErr(ctxt, + XML_SCHEMAP_S4S_ELEM_MISSING, + NULL, node, NULL, NULL, + "(annotation?, (restriction | extension))"); + } + if (child == NULL) { + xmlSchemaPContentErr(ctxt, + XML_SCHEMAP_S4S_ELEM_MISSING, + NULL, node, NULL, NULL, + "(annotation?, (restriction | extension))"); + } + if (IS_SCHEMA(child, "restriction")) { + xmlSchemaParseRestriction(ctxt, schema, child, + XML_SCHEMA_TYPE_SIMPLE_CONTENT); + (*hasRestrictionOrExtension) = 1; + child = child->next; + } else if (IS_SCHEMA(child, "extension")) { + xmlSchemaParseExtension(ctxt, schema, child, + XML_SCHEMA_TYPE_SIMPLE_CONTENT); + (*hasRestrictionOrExtension) = 1; + child = child->next; + } + if (child != NULL) { + xmlSchemaPContentErr(ctxt, + XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, + NULL, node, child, NULL, + "(annotation?, (restriction | extension))"); + } + return (0); +} + +/** + * xmlSchemaParseComplexContent: + * @ctxt: a schema validation context + * @schema: the schema being built + * @node: a subtree containing XML Schema informations + * + * parse a XML schema ComplexContent definition + * *WARNING* this interface is highly subject to change + * + * Returns the type definition or NULL in case of error + */ +static int +xmlSchemaParseComplexContent(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaPtr schema, xmlNodePtr node, + int *hasRestrictionOrExtension) +{ + xmlSchemaTypePtr type; + xmlNodePtr child = NULL; + xmlAttrPtr attr; + + if ((ctxt == NULL) || (schema == NULL) || (node == NULL) || + (hasRestrictionOrExtension == NULL)) + return (-1); + *hasRestrictionOrExtension = 0; + /* Not a component, don't create it. */ + type = ctxt->ctxtType; + /* + * Check for illegal attributes. + */ + attr = node->properties; + while (attr != NULL) { + if (attr->ns == NULL) { + if ((!xmlStrEqual(attr->name, BAD_CAST "id")) && + (!xmlStrEqual(attr->name, BAD_CAST "mixed"))) + { + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + attr = attr->next; + } + + xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); + + /* + * Set the 'mixed' on the complex type ancestor. + */ + if (xmlGetBooleanProp(ctxt, node, "mixed", 0)) { + if ((type->flags & XML_SCHEMAS_TYPE_MIXED) == 0) + type->flags |= XML_SCHEMAS_TYPE_MIXED; + } + child = node->children; + if (IS_SCHEMA(child, "annotation")) { + /* + * Add the annotation to the complex type ancestor. + */ + xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type, + xmlSchemaParseAnnotation(ctxt, child, 1)); + child = child->next; + } + if (child == NULL) { + xmlSchemaPContentErr(ctxt, + XML_SCHEMAP_S4S_ELEM_MISSING, + NULL, node, NULL, + NULL, "(annotation?, (restriction | extension))"); + } + if (child == NULL) { + xmlSchemaPContentErr(ctxt, + XML_SCHEMAP_S4S_ELEM_MISSING, + NULL, node, NULL, + NULL, "(annotation?, (restriction | extension))"); + } + if (IS_SCHEMA(child, "restriction")) { + xmlSchemaParseRestriction(ctxt, schema, child, + XML_SCHEMA_TYPE_COMPLEX_CONTENT); + (*hasRestrictionOrExtension) = 1; + child = child->next; + } else if (IS_SCHEMA(child, "extension")) { + xmlSchemaParseExtension(ctxt, schema, child, + XML_SCHEMA_TYPE_COMPLEX_CONTENT); + (*hasRestrictionOrExtension) = 1; + child = child->next; + } + if (child != NULL) { + xmlSchemaPContentErr(ctxt, + XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, + NULL, node, child, + NULL, "(annotation?, (restriction | extension))"); + } + return (0); +} + +/** + * xmlSchemaParseComplexType: + * @ctxt: a schema validation context + * @schema: the schema being built + * @node: a subtree containing XML Schema informations + * + * parse a XML schema Complex Type definition + * *WARNING* this interface is highly subject to change + * + * Returns the type definition or NULL in case of error + */ +static xmlSchemaTypePtr +xmlSchemaParseComplexType(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, + xmlNodePtr node, int topLevel) +{ + xmlSchemaTypePtr type, ctxtType; + xmlNodePtr child = NULL; + const xmlChar *name = NULL; + xmlAttrPtr attr; + const xmlChar *attrValue; +#ifdef ENABLE_NAMED_LOCALS + char buf[40]; +#endif + int final = 0, block = 0, hasRestrictionOrExtension = 0; + + + if ((ctxt == NULL) || (schema == NULL) || (node == NULL)) + return (NULL); + + ctxtType = ctxt->ctxtType; + + if (topLevel) { + attr = xmlSchemaGetPropNode(node, "name"); + if (attr == NULL) { + xmlSchemaPMissingAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_MISSING, NULL, node, "name", NULL); + return (NULL); + } else if (xmlSchemaPValAttrNode(ctxt, NULL, attr, + xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0) { + return (NULL); + } + } + + if (topLevel == 0) { + /* + * Parse as local complex type definition. + */ +#ifdef ENABLE_NAMED_LOCALS + snprintf(buf, 39, "#CT%d", ctxt->counter++ + 1); + type = xmlSchemaAddType(ctxt, schema, + XML_SCHEMA_TYPE_COMPLEX, + xmlDictLookup(ctxt->dict, (const xmlChar *)buf, -1), + ctxt->targetNamespace, node, 0); +#else + type = xmlSchemaAddType(ctxt, schema, + XML_SCHEMA_TYPE_COMPLEX, + NULL, ctxt->targetNamespace, node, 0); +#endif + if (type == NULL) + return (NULL); + name = type->name; + type->node = node; + type->type = XML_SCHEMA_TYPE_COMPLEX; + /* + * TODO: We need the target namespace. + */ + } else { + /* + * Parse as global complex type definition. + */ + type = xmlSchemaAddType(ctxt, schema, + XML_SCHEMA_TYPE_COMPLEX, + name, ctxt->targetNamespace, node, 1); + if (type == NULL) + return (NULL); + type->node = node; + type->type = XML_SCHEMA_TYPE_COMPLEX; + type->flags |= XML_SCHEMAS_TYPE_GLOBAL; + } + type->targetNamespace = ctxt->targetNamespace; + /* + * Handle attributes. + */ + attr = node->properties; + while (attr != NULL) { + if (attr->ns == NULL) { + if (xmlStrEqual(attr->name, BAD_CAST "id")) { + /* + * Attribute "id". + */ + xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id"); + } else if (xmlStrEqual(attr->name, BAD_CAST "mixed")) { + /* + * Attribute "mixed". + */ + if (xmlSchemaPGetBoolNodeValue(ctxt, + NULL, (xmlNodePtr) attr)) + type->flags |= XML_SCHEMAS_TYPE_MIXED; + } else if (topLevel) { + /* + * Attributes of global complex type definitions. + */ + if (xmlStrEqual(attr->name, BAD_CAST "name")) { + /* Pass. */ + } else if (xmlStrEqual(attr->name, BAD_CAST "abstract")) { + /* + * Attribute "abstract". + */ + if (xmlSchemaPGetBoolNodeValue(ctxt, + NULL, (xmlNodePtr) attr)) + type->flags |= XML_SCHEMAS_TYPE_ABSTRACT; + } else if (xmlStrEqual(attr->name, BAD_CAST "final")) { + /* + * Attribute "final". + */ + attrValue = xmlSchemaGetNodeContent(ctxt, + (xmlNodePtr) attr); + if (xmlSchemaPValAttrBlockFinal(attrValue, + &(type->flags), + -1, + XML_SCHEMAS_TYPE_FINAL_EXTENSION, + XML_SCHEMAS_TYPE_FINAL_RESTRICTION, + -1, -1, -1) != 0) + { + xmlSchemaPSimpleTypeErr(ctxt, + XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, + NULL, (xmlNodePtr) attr, NULL, + "(#all | List of (extension | restriction))", + attrValue, NULL, NULL, NULL); + } else + final = 1; + } else if (xmlStrEqual(attr->name, BAD_CAST "block")) { + /* + * Attribute "block". + */ + attrValue = xmlSchemaGetNodeContent(ctxt, + (xmlNodePtr) attr); + if (xmlSchemaPValAttrBlockFinal(attrValue, &(type->flags), + -1, + XML_SCHEMAS_TYPE_BLOCK_EXTENSION, + XML_SCHEMAS_TYPE_BLOCK_RESTRICTION, + -1, -1, -1) != 0) { + xmlSchemaPSimpleTypeErr(ctxt, + XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, + NULL, (xmlNodePtr) attr, NULL, + "(#all | List of (extension | restriction)) ", + attrValue, NULL, NULL, NULL); + } else + block = 1; + } else { + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + } else { + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) { + xmlSchemaPIllegalAttrErr(ctxt, + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr); + } + attr = attr->next; + } + if (! block) { + /* + * Apply default "block" values. + */ + if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION) + type->flags |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION; + if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION) + type->flags |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION; + } + if (! final) { + /* + * Apply default "block" values. + */ + if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION) + type->flags |= XML_SCHEMAS_TYPE_FINAL_RESTRICTION; + if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_EXTENSION) + type->flags |= XML_SCHEMAS_TYPE_FINAL_EXTENSION; + } + /* + * And now for the children... + */ + child = node->children; + if (IS_SCHEMA(child, "annotation")) { + type->annot = xmlSchemaParseAnnotation(ctxt, child, 1); + child = child->next; + } + ctxt->ctxtType = type; + if (IS_SCHEMA(child, "simpleContent")) { + /* + * ... + * 3.4.3 : 2.2 + * Specifying mixed='true' when the + * alternative is chosen has no effect + */ + if (type->flags & XML_SCHEMAS_TYPE_MIXED) + type->flags ^= XML_SCHEMAS_TYPE_MIXED; + xmlSchemaParseSimpleContent(ctxt, schema, child, + &hasRestrictionOrExtension); + child = child->next; + } else if (IS_SCHEMA(child, "complexContent")) { + /* + * ... + */ + type->contentType = XML_SCHEMA_CONTENT_EMPTY; + xmlSchemaParseComplexContent(ctxt, schema, child, + &hasRestrictionOrExtension); + child = child->next; + } else { + /* + * E.g ... or ... etc. + * + * SPEC + * "...the third alternative (neither nor + * ) is chosen. This case is understood as shorthand + * for complex content restricting the �ur-type definition�, and the + * details of the mappings should be modified as necessary. + */ + type->baseType = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE); + type->flags |= XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION; + /* + * Parse model groups. + */ + if (IS_SCHEMA(child, "all")) { + type->subtypes = (xmlSchemaTypePtr) + xmlSchemaParseModelGroup(ctxt, schema, child, + XML_SCHEMA_TYPE_ALL, 1); + child = child->next; + } else if (IS_SCHEMA(child, "choice")) { + type->subtypes = (xmlSchemaTypePtr) + xmlSchemaParseModelGroup(ctxt, schema, child, + XML_SCHEMA_TYPE_CHOICE, 1); + child = child->next; + } else if (IS_SCHEMA(child, "sequence")) { + type->subtypes = (xmlSchemaTypePtr) + xmlSchemaParseModelGroup(ctxt, schema, child, + XML_SCHEMA_TYPE_SEQUENCE, 1); + child = child->next; + } else if (IS_SCHEMA(child, "group")) { + type->subtypes = (xmlSchemaTypePtr) + xmlSchemaParseModelGroupDefRef(ctxt, schema, child); + /* + * Note that the reference will be resolved in + * xmlSchemaResolveTypeReferences(); + */ + child = child->next; + } + /* + * Parse attribute decls/refs. + */ + if (xmlSchemaParseLocalAttributes(ctxt, schema, &child, + (xmlSchemaItemListPtr *) &(type->attrUses), + XML_SCHEMA_TYPE_RESTRICTION, NULL) == -1) + return(NULL); + /* + * Parse attribute wildcard. + */ + if (IS_SCHEMA(child, "anyAttribute")) { + type->attributeWildcard = xmlSchemaParseAnyAttribute(ctxt, schema, child); + child = child->next; + } + } + if (child != NULL) { + xmlSchemaPContentErr(ctxt, + XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, + NULL, node, child, + NULL, "(annotation?, (simpleContent | complexContent | " + "((group | all | choice | sequence)?, ((attribute | " + "attributeGroup)*, anyAttribute?))))"); + } + /* + * REDEFINE: SPEC src-redefine (5) + */ + if (topLevel && ctxt->isRedefine && (! hasRestrictionOrExtension)) { + xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_SRC_REDEFINE, + NULL, node, "This is a redefinition, thus the " + " must have a or " + "grand-child", NULL); + } + ctxt->ctxtType = ctxtType; + return (type); +} + +/************************************************************************ + * * + * Validating using Schemas * + * * + ************************************************************************/ + +/************************************************************************ + * * + * Reading/Writing Schemas * + * * + ************************************************************************/ + +#if 0 /* Will be enabled if it is clear what options are needed. */ +/** + * xmlSchemaParserCtxtSetOptions: + * @ctxt: a schema parser context + * @options: a combination of xmlSchemaParserOption + * + * Sets the options to be used during the parse. + * + * Returns 0 in case of success, -1 in case of an + * API error. + */ +static int +xmlSchemaParserCtxtSetOptions(xmlSchemaParserCtxtPtr ctxt, + int options) + +{ + int i; + + if (ctxt == NULL) + return (-1); + /* + * WARNING: Change the start value if adding to the + * xmlSchemaParseOption. + */ + for (i = 1; i < (int) sizeof(int) * 8; i++) { + if (options & 1<options = options; + return (0); +} + +/** + * xmlSchemaValidCtxtGetOptions: + * @ctxt: a schema parser context + * + * Returns the option combination of the parser context. + */ +static int +xmlSchemaParserCtxtGetOptions(xmlSchemaParserCtxtPtr ctxt) + +{ + if (ctxt == NULL) + return (-1); + else + return (ctxt->options); +} +#endif + +/** + * xmlSchemaNewParserCtxt: + * @URL: the location of the schema + * + * Create an XML Schemas parse context for that file/resource expected + * to contain an XML Schemas file. + * + * Returns the parser context or NULL in case of error + */ +xmlSchemaParserCtxtPtr +xmlSchemaNewParserCtxt(const char *URL) +{ + xmlSchemaParserCtxtPtr ret; + + if (URL == NULL) + return (NULL); + + ret = xmlSchemaParserCtxtCreate(); + if (ret == NULL) + return(NULL); + ret->dict = xmlDictCreate(); + ret->URL = xmlDictLookup(ret->dict, (const xmlChar *) URL, -1); + return (ret); +} + +/** + * xmlSchemaNewMemParserCtxt: + * @buffer: a pointer to a char array containing the schemas + * @size: the size of the array + * + * Create an XML Schemas parse context for that memory buffer expected + * to contain an XML Schemas file. + * + * Returns the parser context or NULL in case of error + */ +xmlSchemaParserCtxtPtr +xmlSchemaNewMemParserCtxt(const char *buffer, int size) +{ + xmlSchemaParserCtxtPtr ret; + + if ((buffer == NULL) || (size <= 0)) + return (NULL); + ret = xmlSchemaParserCtxtCreate(); + if (ret == NULL) + return(NULL); + ret->buffer = buffer; + ret->size = size; + ret->dict = xmlDictCreate(); + return (ret); +} + +/** + * xmlSchemaNewDocParserCtxt: + * @doc: a preparsed document tree + * + * Create an XML Schemas parse context for that document. + * NB. The document may be modified during the parsing process. + * + * Returns the parser context or NULL in case of error + */ +xmlSchemaParserCtxtPtr +xmlSchemaNewDocParserCtxt(xmlDocPtr doc) +{ + xmlSchemaParserCtxtPtr ret; + + if (doc == NULL) + return (NULL); + ret = xmlSchemaParserCtxtCreate(); + if (ret == NULL) + return(NULL); + ret->doc = doc; + ret->dict = xmlDictCreate(); + /* The application has responsibility for the document */ + ret->preserve = 1; + + return (ret); +} + +/** + * xmlSchemaFreeParserCtxt: + * @ctxt: the schema parser context + * + * Free the resources associated to the schema parser context + */ +void +xmlSchemaFreeParserCtxt(xmlSchemaParserCtxtPtr ctxt) +{ + if (ctxt == NULL) + return; + if (ctxt->doc != NULL && !ctxt->preserve) + xmlFreeDoc(ctxt->doc); + if (ctxt->vctxt != NULL) { + xmlSchemaFreeValidCtxt(ctxt->vctxt); + } + if (ctxt->ownsConstructor && (ctxt->constructor != NULL)) { + xmlSchemaConstructionCtxtFree(ctxt->constructor); + ctxt->constructor = NULL; + ctxt->ownsConstructor = 0; + } + if (ctxt->attrProhibs != NULL) + xmlSchemaItemListFree(ctxt->attrProhibs); + xmlDictFree(ctxt->dict); + xmlFree(ctxt); +} + +/************************************************************************ + * * + * Building the content models * + * * + ************************************************************************/ + +/** + * xmlSchemaBuildContentModelForSubstGroup: + * + * Returns 1 if nillable, 0 otherwise + */ +static int +xmlSchemaBuildContentModelForSubstGroup(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaParticlePtr particle, int counter, xmlAutomataStatePtr end) +{ + xmlAutomataStatePtr start, tmp; + xmlSchemaElementPtr elemDecl, member; + xmlSchemaSubstGroupPtr substGroup; + int i; + int ret = 0; + + elemDecl = (xmlSchemaElementPtr) particle->children; + /* + * Wrap the substitution group with a CHOICE. + */ + start = pctxt->state; + if (end == NULL) + end = xmlAutomataNewState(pctxt->am); + substGroup = xmlSchemaSubstGroupGet(pctxt, elemDecl); + if (substGroup == NULL) { + xmlSchemaPErr(pctxt, WXS_ITEM_NODE(particle), + XML_SCHEMAP_INTERNAL, + "Internal error: xmlSchemaBuildContentModelForSubstGroup, " + "declaration is marked having a subst. group but none " + "available.\n", elemDecl->name, NULL); + return(0); + } + if (counter >= 0) { + /* + * NOTE that we put the declaration in, even if it's abstract. + * However, an error will be raised during *validation* if an element + * information item shall be validated against an abstract element + * declaration. + */ + tmp = xmlAutomataNewCountedTrans(pctxt->am, start, NULL, counter); + xmlAutomataNewTransition2(pctxt->am, tmp, end, + elemDecl->name, elemDecl->targetNamespace, elemDecl); + /* + * Add subst. group members. + */ + for (i = 0; i < substGroup->members->nbItems; i++) { + member = (xmlSchemaElementPtr) substGroup->members->items[i]; + xmlAutomataNewTransition2(pctxt->am, tmp, end, + member->name, member->targetNamespace, member); + } + } else if (particle->maxOccurs == 1) { + /* + * NOTE that we put the declaration in, even if it's abstract, + */ + xmlAutomataNewEpsilon(pctxt->am, + xmlAutomataNewTransition2(pctxt->am, + start, NULL, + elemDecl->name, elemDecl->targetNamespace, elemDecl), end); + /* + * Add subst. group members. + */ + for (i = 0; i < substGroup->members->nbItems; i++) { + member = (xmlSchemaElementPtr) substGroup->members->items[i]; + /* + * NOTE: This fixes bug #341150. xmlAutomataNewOnceTrans2() + * was incorrectly used instead of xmlAutomataNewTransition2() + * (seems like a copy&paste bug from the XML_SCHEMA_TYPE_ALL + * section in xmlSchemaBuildAContentModel() ). + * TODO: Check if xmlAutomataNewOnceTrans2() was instead + * intended for the above "counter" section originally. I.e., + * check xs:all with subst-groups. + * + * tmp = xmlAutomataNewOnceTrans2(pctxt->am, start, NULL, + * member->name, member->targetNamespace, + * 1, 1, member); + */ + tmp = xmlAutomataNewTransition2(pctxt->am, start, NULL, + member->name, member->targetNamespace, member); + xmlAutomataNewEpsilon(pctxt->am, tmp, end); + } + } else { + xmlAutomataStatePtr hop; + int maxOccurs = particle->maxOccurs == UNBOUNDED ? + UNBOUNDED : particle->maxOccurs - 1; + int minOccurs = particle->minOccurs < 1 ? 0 : particle->minOccurs - 1; + + counter = + xmlAutomataNewCounter(pctxt->am, minOccurs, + maxOccurs); + hop = xmlAutomataNewState(pctxt->am); + + xmlAutomataNewEpsilon(pctxt->am, + xmlAutomataNewTransition2(pctxt->am, + start, NULL, + elemDecl->name, elemDecl->targetNamespace, elemDecl), + hop); + /* + * Add subst. group members. + */ + for (i = 0; i < substGroup->members->nbItems; i++) { + member = (xmlSchemaElementPtr) substGroup->members->items[i]; + xmlAutomataNewEpsilon(pctxt->am, + xmlAutomataNewTransition2(pctxt->am, + start, NULL, + member->name, member->targetNamespace, member), + hop); + } + xmlAutomataNewCountedTrans(pctxt->am, hop, start, counter); + xmlAutomataNewCounterTrans(pctxt->am, hop, end, counter); + } + if (particle->minOccurs == 0) { + xmlAutomataNewEpsilon(pctxt->am, start, end); + ret = 1; + } + pctxt->state = end; + return(ret); +} + +/** + * xmlSchemaBuildContentModelForElement: + * + * Returns 1 if nillable, 0 otherwise + */ +static int +xmlSchemaBuildContentModelForElement(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaParticlePtr particle) +{ + int ret = 0; + + if (((xmlSchemaElementPtr) particle->children)->flags & + XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD) { + /* + * Substitution groups. + */ + ret = xmlSchemaBuildContentModelForSubstGroup(ctxt, particle, -1, NULL); + } else { + xmlSchemaElementPtr elemDecl; + xmlAutomataStatePtr start; + + elemDecl = (xmlSchemaElementPtr) particle->children; + + if (elemDecl->flags & XML_SCHEMAS_ELEM_ABSTRACT) + return(0); + if (particle->maxOccurs == 1) { + start = ctxt->state; + ctxt->state = xmlAutomataNewTransition2(ctxt->am, start, NULL, + elemDecl->name, elemDecl->targetNamespace, elemDecl); + } else if ((particle->maxOccurs >= UNBOUNDED) && + (particle->minOccurs < 2)) { + /* Special case. */ + start = ctxt->state; + ctxt->state = xmlAutomataNewTransition2(ctxt->am, start, NULL, + elemDecl->name, elemDecl->targetNamespace, elemDecl); + ctxt->state = xmlAutomataNewTransition2(ctxt->am, ctxt->state, ctxt->state, + elemDecl->name, elemDecl->targetNamespace, elemDecl); + } else { + int counter; + int maxOccurs = particle->maxOccurs == UNBOUNDED ? + UNBOUNDED : particle->maxOccurs - 1; + int minOccurs = particle->minOccurs < 1 ? + 0 : particle->minOccurs - 1; + + start = xmlAutomataNewEpsilon(ctxt->am, ctxt->state, NULL); + counter = xmlAutomataNewCounter(ctxt->am, minOccurs, maxOccurs); + ctxt->state = xmlAutomataNewTransition2(ctxt->am, start, NULL, + elemDecl->name, elemDecl->targetNamespace, elemDecl); + xmlAutomataNewCountedTrans(ctxt->am, ctxt->state, start, counter); + ctxt->state = xmlAutomataNewCounterTrans(ctxt->am, ctxt->state, + NULL, counter); + } + if (particle->minOccurs == 0) { + xmlAutomataNewEpsilon(ctxt->am, start, ctxt->state); + ret = 1; + } + } + return(ret); +} + +/** + * xmlSchemaBuildAContentModel: + * @ctxt: the schema parser context + * @particle: the particle component + * @name: the complex type's name whose content is being built + * + * Create the automaton for the {content type} of a complex type. + * + * Returns 1 if the content is nillable, 0 otherwise + */ +static int +xmlSchemaBuildAContentModel(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaParticlePtr particle) +{ + int ret = 0, tmp2; + + if (particle == NULL) { + PERROR_INT("xmlSchemaBuildAContentModel", "particle is NULL"); + return(1); + } + if (particle->children == NULL) { + /* + * Just return in this case. A missing "term" of the particle + * might arise due to an invalid "term" component. + */ + return(1); + } + + switch (particle->children->type) { + case XML_SCHEMA_TYPE_ANY: { + xmlAutomataStatePtr start, end; + xmlSchemaWildcardPtr wild; + xmlSchemaWildcardNsPtr ns; + + wild = (xmlSchemaWildcardPtr) particle->children; + + start = pctxt->state; + end = xmlAutomataNewState(pctxt->am); + + if (particle->maxOccurs == 1) { + if (wild->any == 1) { + /* + * We need to add both transitions: + * + * 1. the {"*", "*"} for elements in a namespace. + */ + pctxt->state = + xmlAutomataNewTransition2(pctxt->am, + start, NULL, BAD_CAST "*", BAD_CAST "*", wild); + xmlAutomataNewEpsilon(pctxt->am, pctxt->state, end); + /* + * 2. the {"*"} for elements in no namespace. + */ + pctxt->state = + xmlAutomataNewTransition2(pctxt->am, + start, NULL, BAD_CAST "*", NULL, wild); + xmlAutomataNewEpsilon(pctxt->am, pctxt->state, end); + + } else if (wild->nsSet != NULL) { + ns = wild->nsSet; + do { + pctxt->state = start; + pctxt->state = xmlAutomataNewTransition2(pctxt->am, + pctxt->state, NULL, BAD_CAST "*", ns->value, wild); + xmlAutomataNewEpsilon(pctxt->am, pctxt->state, end); + ns = ns->next; + } while (ns != NULL); + + } else if (wild->negNsSet != NULL) { + pctxt->state = xmlAutomataNewNegTrans(pctxt->am, + start, end, BAD_CAST "*", wild->negNsSet->value, + wild); + } + } else { + int counter; + xmlAutomataStatePtr hop; + int maxOccurs = + particle->maxOccurs == UNBOUNDED ? UNBOUNDED : + particle->maxOccurs - 1; + int minOccurs = + particle->minOccurs < 1 ? 0 : particle->minOccurs - 1; + + counter = xmlAutomataNewCounter(pctxt->am, minOccurs, maxOccurs); + hop = xmlAutomataNewState(pctxt->am); + if (wild->any == 1) { + pctxt->state = + xmlAutomataNewTransition2(pctxt->am, + start, NULL, BAD_CAST "*", BAD_CAST "*", wild); + xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop); + pctxt->state = + xmlAutomataNewTransition2(pctxt->am, + start, NULL, BAD_CAST "*", NULL, wild); + xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop); + } else if (wild->nsSet != NULL) { + ns = wild->nsSet; + do { + pctxt->state = + xmlAutomataNewTransition2(pctxt->am, + start, NULL, BAD_CAST "*", ns->value, wild); + xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop); + ns = ns->next; + } while (ns != NULL); + + } else if (wild->negNsSet != NULL) { + pctxt->state = xmlAutomataNewNegTrans(pctxt->am, + start, hop, BAD_CAST "*", wild->negNsSet->value, + wild); + } + xmlAutomataNewCountedTrans(pctxt->am, hop, start, counter); + xmlAutomataNewCounterTrans(pctxt->am, hop, end, counter); + } + if (particle->minOccurs == 0) { + xmlAutomataNewEpsilon(pctxt->am, start, end); + ret = 1; + } + pctxt->state = end; + break; + } + case XML_SCHEMA_TYPE_ELEMENT: + ret = xmlSchemaBuildContentModelForElement(pctxt, particle); + break; + case XML_SCHEMA_TYPE_SEQUENCE:{ + xmlSchemaTreeItemPtr sub; + + ret = 1; + /* + * If max and min occurances are default (1) then + * simply iterate over the particles of the . + */ + if ((particle->minOccurs == 1) && (particle->maxOccurs == 1)) { + sub = particle->children->children; + + while (sub != NULL) { + tmp2 = xmlSchemaBuildAContentModel(pctxt, + (xmlSchemaParticlePtr) sub); + if (tmp2 != 1) ret = 0; + sub = sub->next; + } + } else { + xmlAutomataStatePtr oldstate = pctxt->state; + + if (particle->maxOccurs >= UNBOUNDED) { + if (particle->minOccurs > 1) { + xmlAutomataStatePtr tmp; + int counter; + + pctxt->state = xmlAutomataNewEpsilon(pctxt->am, + oldstate, NULL); + oldstate = pctxt->state; + + counter = xmlAutomataNewCounter(pctxt->am, + particle->minOccurs - 1, UNBOUNDED); + + sub = particle->children->children; + while (sub != NULL) { + tmp2 = xmlSchemaBuildAContentModel(pctxt, + (xmlSchemaParticlePtr) sub); + if (tmp2 != 1) ret = 0; + sub = sub->next; + } + tmp = pctxt->state; + xmlAutomataNewCountedTrans(pctxt->am, tmp, + oldstate, counter); + pctxt->state = + xmlAutomataNewCounterTrans(pctxt->am, tmp, + NULL, counter); + if (ret == 1) + xmlAutomataNewEpsilon(pctxt->am, + oldstate, pctxt->state); + + } else { + pctxt->state = xmlAutomataNewEpsilon(pctxt->am, + oldstate, NULL); + oldstate = pctxt->state; + + sub = particle->children->children; + while (sub != NULL) { + tmp2 = xmlSchemaBuildAContentModel(pctxt, + (xmlSchemaParticlePtr) sub); + if (tmp2 != 1) ret = 0; + sub = sub->next; + } + xmlAutomataNewEpsilon(pctxt->am, pctxt->state, + oldstate); + /* + * epsilon needed to block previous trans from + * being allowed to enter back from another + * construct + */ + pctxt->state = xmlAutomataNewEpsilon(pctxt->am, + pctxt->state, NULL); + if (particle->minOccurs == 0) { + xmlAutomataNewEpsilon(pctxt->am, + oldstate, pctxt->state); + ret = 1; + } + } + } else if ((particle->maxOccurs > 1) + || (particle->minOccurs > 1)) { + xmlAutomataStatePtr tmp; + int counter; + + pctxt->state = xmlAutomataNewEpsilon(pctxt->am, + oldstate, NULL); + oldstate = pctxt->state; + + counter = xmlAutomataNewCounter(pctxt->am, + particle->minOccurs - 1, + particle->maxOccurs - 1); + + sub = particle->children->children; + while (sub != NULL) { + tmp2 = xmlSchemaBuildAContentModel(pctxt, + (xmlSchemaParticlePtr) sub); + if (tmp2 != 1) ret = 0; + sub = sub->next; + } + tmp = pctxt->state; + xmlAutomataNewCountedTrans(pctxt->am, + tmp, oldstate, counter); + pctxt->state = + xmlAutomataNewCounterTrans(pctxt->am, tmp, NULL, + counter); + if ((particle->minOccurs == 0) || (ret == 1)) { + xmlAutomataNewEpsilon(pctxt->am, + oldstate, pctxt->state); + ret = 1; + } + } else { + sub = particle->children->children; + while (sub != NULL) { + tmp2 = xmlSchemaBuildAContentModel(pctxt, + (xmlSchemaParticlePtr) sub); + if (tmp2 != 1) ret = 0; + sub = sub->next; + } + + /* + * epsilon needed to block previous trans from + * being allowed to enter back from another + * construct + */ + pctxt->state = xmlAutomataNewEpsilon(pctxt->am, + pctxt->state, NULL); + + if (particle->minOccurs == 0) { + xmlAutomataNewEpsilon(pctxt->am, oldstate, + pctxt->state); + ret = 1; + } + } + } + break; + } + case XML_SCHEMA_TYPE_CHOICE:{ + xmlSchemaTreeItemPtr sub; + xmlAutomataStatePtr start, end; + + ret = 0; + start = pctxt->state; + end = xmlAutomataNewState(pctxt->am); + + /* + * iterate over the subtypes and remerge the end with an + * epsilon transition + */ + if (particle->maxOccurs == 1) { + sub = particle->children->children; + while (sub != NULL) { + pctxt->state = start; + tmp2 = xmlSchemaBuildAContentModel(pctxt, + (xmlSchemaParticlePtr) sub); + if (tmp2 == 1) ret = 1; + xmlAutomataNewEpsilon(pctxt->am, pctxt->state, end); + sub = sub->next; + } + } else { + int counter; + xmlAutomataStatePtr hop, base; + int maxOccurs = particle->maxOccurs == UNBOUNDED ? + UNBOUNDED : particle->maxOccurs - 1; + int minOccurs = + particle->minOccurs < 1 ? 0 : particle->minOccurs - 1; + + /* + * use a counter to keep track of the number of transtions + * which went through the choice. + */ + counter = + xmlAutomataNewCounter(pctxt->am, minOccurs, maxOccurs); + hop = xmlAutomataNewState(pctxt->am); + base = xmlAutomataNewState(pctxt->am); + + sub = particle->children->children; + while (sub != NULL) { + pctxt->state = base; + tmp2 = xmlSchemaBuildAContentModel(pctxt, + (xmlSchemaParticlePtr) sub); + if (tmp2 == 1) ret = 1; + xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop); + sub = sub->next; + } + xmlAutomataNewEpsilon(pctxt->am, start, base); + xmlAutomataNewCountedTrans(pctxt->am, hop, base, counter); + xmlAutomataNewCounterTrans(pctxt->am, hop, end, counter); + if (ret == 1) + xmlAutomataNewEpsilon(pctxt->am, base, end); + } + if (particle->minOccurs == 0) { + xmlAutomataNewEpsilon(pctxt->am, start, end); + ret = 1; + } + pctxt->state = end; + break; + } + case XML_SCHEMA_TYPE_ALL:{ + xmlAutomataStatePtr start, tmp; + xmlSchemaParticlePtr sub; + xmlSchemaElementPtr elemDecl; + + ret = 1; + + sub = (xmlSchemaParticlePtr) particle->children->children; + if (sub == NULL) + break; + + ret = 0; + + start = pctxt->state; + tmp = xmlAutomataNewState(pctxt->am); + xmlAutomataNewEpsilon(pctxt->am, pctxt->state, tmp); + pctxt->state = tmp; + while (sub != NULL) { + pctxt->state = tmp; + + elemDecl = (xmlSchemaElementPtr) sub->children; + if (elemDecl == NULL) { + PERROR_INT("xmlSchemaBuildAContentModel", + " particle has no term"); + return(ret); + }; + /* + * NOTE: The {max occurs} of all the particles in the + * {particles} of the group must be 0 or 1; this is + * already ensured during the parse of the content of + * . + */ + if (elemDecl->flags & XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD) { + int counter; + + /* + * This is an abstract group, we need to share + * the same counter for all the element transitions + * derived from the group + */ + counter = xmlAutomataNewCounter(pctxt->am, + sub->minOccurs, sub->maxOccurs); + xmlSchemaBuildContentModelForSubstGroup(pctxt, + sub, counter, pctxt->state); + } else { + if ((sub->minOccurs == 1) && + (sub->maxOccurs == 1)) { + xmlAutomataNewOnceTrans2(pctxt->am, pctxt->state, + pctxt->state, + elemDecl->name, + elemDecl->targetNamespace, + 1, 1, elemDecl); + } else if ((sub->minOccurs == 0) && + (sub->maxOccurs == 1)) { + + xmlAutomataNewCountTrans2(pctxt->am, pctxt->state, + pctxt->state, + elemDecl->name, + elemDecl->targetNamespace, + 0, + 1, + elemDecl); + } + } + sub = (xmlSchemaParticlePtr) sub->next; + } + pctxt->state = + xmlAutomataNewAllTrans(pctxt->am, pctxt->state, NULL, 0); + if (particle->minOccurs == 0) { + xmlAutomataNewEpsilon(pctxt->am, start, pctxt->state); + ret = 1; + } + break; + } + case XML_SCHEMA_TYPE_GROUP: + /* + * If we hit a model group definition, then this means that + * it was empty, thus was not substituted for the containing + * model group. Just do nothing in this case. + * TODO: But the group should be substituted and not occur at + * all in the content model at this point. Fix this. + */ + ret = 1; + break; + default: + xmlSchemaInternalErr2(ACTXT_CAST pctxt, + "xmlSchemaBuildAContentModel", + "found unexpected term of type '%s' in content model", + WXS_ITEM_TYPE_NAME(particle->children), NULL); + return(ret); + } + return(ret); +} + +/** + * xmlSchemaBuildContentModel: + * @ctxt: the schema parser context + * @type: the complex type definition + * @name: the element name + * + * Builds the content model of the complex type. + */ +static void +xmlSchemaBuildContentModel(xmlSchemaTypePtr type, + xmlSchemaParserCtxtPtr ctxt) +{ + if ((type->type != XML_SCHEMA_TYPE_COMPLEX) || + (type->contModel != NULL) || + ((type->contentType != XML_SCHEMA_CONTENT_ELEMENTS) && + (type->contentType != XML_SCHEMA_CONTENT_MIXED))) + return; + +#ifdef DEBUG_CONTENT + xmlGenericError(xmlGenericErrorContext, + "Building content model for %s\n", name); +#endif + ctxt->am = NULL; + ctxt->am = xmlNewAutomata(); + if (ctxt->am == NULL) { + xmlGenericError(xmlGenericErrorContext, + "Cannot create automata for complex type %s\n", type->name); + return; + } + ctxt->state = xmlAutomataGetInitState(ctxt->am); + /* + * Build the automaton. + */ + xmlSchemaBuildAContentModel(ctxt, WXS_TYPE_PARTICLE(type)); + xmlAutomataSetFinalState(ctxt->am, ctxt->state); + type->contModel = xmlAutomataCompile(ctxt->am); + if (type->contModel == NULL) { + xmlSchemaPCustomErr(ctxt, + XML_SCHEMAP_INTERNAL, + WXS_BASIC_CAST type, type->node, + "Failed to compile the content model", NULL); + } else if (xmlRegexpIsDeterminist(type->contModel) != 1) { + xmlSchemaPCustomErr(ctxt, + XML_SCHEMAP_NOT_DETERMINISTIC, + /* XML_SCHEMAS_ERR_NOTDETERMINIST, */ + WXS_BASIC_CAST type, type->node, + "The content model is not determinist", NULL); + } else { +#ifdef DEBUG_CONTENT_REGEXP + xmlGenericError(xmlGenericErrorContext, + "Content model of %s:\n", type->name); + xmlRegexpPrint(stderr, type->contModel); +#endif + } + ctxt->state = NULL; + xmlFreeAutomata(ctxt->am); + ctxt->am = NULL; +} + +/** + * xmlSchemaResolveElementReferences: + * @elem: the schema element context + * @ctxt: the schema parser context + * + * Resolves the references of an element declaration + * or particle, which has an element declaration as it's + * term. + */ +static void +xmlSchemaResolveElementReferences(xmlSchemaElementPtr elemDecl, + xmlSchemaParserCtxtPtr ctxt) +{ + if ((ctxt == NULL) || (elemDecl == NULL) || + ((elemDecl != NULL) && + (elemDecl->flags & XML_SCHEMAS_ELEM_INTERNAL_RESOLVED))) + return; + elemDecl->flags |= XML_SCHEMAS_ELEM_INTERNAL_RESOLVED; + + if ((elemDecl->subtypes == NULL) && (elemDecl->namedType != NULL)) { + xmlSchemaTypePtr type; + + /* (type definition) ... otherwise the type definition �resolved� + * to by the �actual value� of the type [attribute] ... + */ + type = xmlSchemaGetType(ctxt->schema, elemDecl->namedType, + elemDecl->namedTypeNs); + if (type == NULL) { + xmlSchemaPResCompAttrErr(ctxt, + XML_SCHEMAP_SRC_RESOLVE, + WXS_BASIC_CAST elemDecl, elemDecl->node, + "type", elemDecl->namedType, elemDecl->namedTypeNs, + XML_SCHEMA_TYPE_BASIC, "type definition"); + } else + elemDecl->subtypes = type; + } + if (elemDecl->substGroup != NULL) { + xmlSchemaElementPtr substHead; + + /* + * FIXME TODO: Do we need a new field in _xmlSchemaElement for + * substitutionGroup? + */ + substHead = xmlSchemaGetElem(ctxt->schema, elemDecl->substGroup, + elemDecl->substGroupNs); + if (substHead == NULL) { + xmlSchemaPResCompAttrErr(ctxt, + XML_SCHEMAP_SRC_RESOLVE, + WXS_BASIC_CAST elemDecl, NULL, + "substitutionGroup", elemDecl->substGroup, + elemDecl->substGroupNs, XML_SCHEMA_TYPE_ELEMENT, NULL); + } else { + xmlSchemaResolveElementReferences(substHead, ctxt); + /* + * Set the "substitution group affiliation". + * NOTE that now we use the "refDecl" field for this. + */ + WXS_SUBST_HEAD(elemDecl) = substHead; + /* + * The type definitions is set to: + * SPEC "...the {type definition} of the element + * declaration �resolved� to by the �actual value� + * of the substitutionGroup [attribute], if present" + */ + if (elemDecl->subtypes == NULL) + elemDecl->subtypes = substHead->subtypes; + } + } + /* + * SPEC "The definition of anyType serves as the default type definition + * for element declarations whose XML representation does not specify one." + */ + if ((elemDecl->subtypes == NULL) && + (elemDecl->namedType == NULL) && + (elemDecl->substGroup == NULL)) + elemDecl->subtypes = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE); +} + +/** + * xmlSchemaResolveUnionMemberTypes: + * @ctxt: the schema parser context + * @type: the schema simple type definition + * + * Checks and builds the "member type definitions" property of the union + * simple type. This handles part (1), part (2) is done in + * xmlSchemaFinishMemberTypeDefinitionsProperty() + * + * Returns -1 in case of an internal error, 0 otherwise. + */ +static int +xmlSchemaResolveUnionMemberTypes(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaTypePtr type) +{ + + xmlSchemaTypeLinkPtr link, lastLink, newLink; + xmlSchemaTypePtr memberType; + + /* + * SPEC (1) "If the alternative is chosen, then [Definition:] + * define the explicit members as the type definitions �resolved� + * to by the items in the �actual value� of the memberTypes [attribute], + * if any, followed by the type definitions corresponding to the + * s among the [children] of , if any." + */ + /* + * Resolve references. + */ + link = type->memberTypes; + lastLink = NULL; + while (link != NULL) { + const xmlChar *name, *nsName; + + name = ((xmlSchemaQNameRefPtr) link->type)->name; + nsName = ((xmlSchemaQNameRefPtr) link->type)->targetNamespace; + + memberType = xmlSchemaGetType(ctxt->schema, name, nsName); + if ((memberType == NULL) || (! WXS_IS_SIMPLE(memberType))) { + xmlSchemaPResCompAttrErr(ctxt, XML_SCHEMAP_SRC_RESOLVE, + WXS_BASIC_CAST type, type->node, "memberTypes", + name, nsName, XML_SCHEMA_TYPE_SIMPLE, NULL); + /* + * Remove the member type link. + */ + if (lastLink == NULL) + type->memberTypes = link->next; + else + lastLink->next = link->next; + newLink = link; + link = link->next; + xmlFree(newLink); + } else { + link->type = memberType; + lastLink = link; + link = link->next; + } + } + /* + * Add local simple types, + */ + memberType = type->subtypes; + while (memberType != NULL) { + link = (xmlSchemaTypeLinkPtr) xmlMalloc(sizeof(xmlSchemaTypeLink)); + if (link == NULL) { + xmlSchemaPErrMemory(ctxt, "allocating a type link", NULL); + return (-1); + } + link->type = memberType; + link->next = NULL; + if (lastLink == NULL) + type->memberTypes = link; + else + lastLink->next = link; + lastLink = link; + memberType = memberType->next; + } + return (0); +} + +/** + * xmlSchemaIsDerivedFromBuiltInType: + * @ctxt: the schema parser context + * @type: the type definition + * @valType: the value type + * + * + * Returns 1 if the type has the given value type, or + * is derived from such a type. + */ +static int +xmlSchemaIsDerivedFromBuiltInType(xmlSchemaTypePtr type, int valType) +{ + if (type == NULL) + return (0); + if (WXS_IS_COMPLEX(type)) + return (0); + if (type->type == XML_SCHEMA_TYPE_BASIC) { + if (type->builtInType == valType) + return(1); + if ((type->builtInType == XML_SCHEMAS_ANYSIMPLETYPE) || + (type->builtInType == XML_SCHEMAS_ANYTYPE)) + return (0); + return(xmlSchemaIsDerivedFromBuiltInType(type->subtypes, valType)); + } + return(xmlSchemaIsDerivedFromBuiltInType(type->subtypes, valType)); +} + +#if 0 +/** + * xmlSchemaIsDerivedFromBuiltInType: + * @ctxt: the schema parser context + * @type: the type definition + * @valType: the value type + * + * + * Returns 1 if the type has the given value type, or + * is derived from such a type. + */ +static int +xmlSchemaIsUserDerivedFromBuiltInType(xmlSchemaTypePtr type, int valType) +{ + if (type == NULL) + return (0); + if (WXS_IS_COMPLEX(type)) + return (0); + if (type->type == XML_SCHEMA_TYPE_BASIC) { + if (type->builtInType == valType) + return(1); + return (0); + } else + return(xmlSchemaIsDerivedFromBuiltInType(type->subtypes, valType)); + + return (0); +} + +static xmlSchemaTypePtr +xmlSchemaQueryBuiltInType(xmlSchemaTypePtr type) +{ + if (type == NULL) + return (NULL); + if (WXS_IS_COMPLEX(type)) + return (NULL); + if (type->type == XML_SCHEMA_TYPE_BASIC) + return(type); + return(xmlSchemaQueryBuiltInType(type->subtypes)); +} +#endif + +/** + * xmlSchemaGetPrimitiveType: + * @type: the simpleType definition + * + * Returns the primitive type of the given type or + * NULL in case of error. + */ +static xmlSchemaTypePtr +xmlSchemaGetPrimitiveType(xmlSchemaTypePtr type) +{ + + while (type != NULL) { + /* + * Note that anySimpleType is actually not a primitive type + * but we need that here. + */ + if ((type->builtInType == XML_SCHEMAS_ANYSIMPLETYPE) || + (type->flags & XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE)) + return (type); + type = type->baseType; + } + + return (NULL); +} + +#if 0 +/** + * xmlSchemaGetBuiltInTypeAncestor: + * @type: the simpleType definition + * + * Returns the primitive type of the given type or + * NULL in case of error. + */ +static xmlSchemaTypePtr +xmlSchemaGetBuiltInTypeAncestor(xmlSchemaTypePtr type) +{ + if (WXS_IS_LIST(type) || WXS_IS_UNION(type)) + return (0); + while (type != NULL) { + if (type->type == XML_SCHEMA_TYPE_BASIC) + return (type); + type = type->baseType; + } + + return (NULL); +} +#endif + +/** + * xmlSchemaCloneWildcardNsConstraints: + * @ctxt: the schema parser context + * @dest: the destination wildcard + * @source: the source wildcard + * + * Clones the namespace constraints of source + * and assignes them to dest. + * Returns -1 on internal error, 0 otherwise. + */ +static int +xmlSchemaCloneWildcardNsConstraints(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaWildcardPtr dest, + xmlSchemaWildcardPtr source) +{ + xmlSchemaWildcardNsPtr cur, tmp, last; + + if ((source == NULL) || (dest == NULL)) + return(-1); + dest->any = source->any; + cur = source->nsSet; + last = NULL; + while (cur != NULL) { + tmp = xmlSchemaNewWildcardNsConstraint(ctxt); + if (tmp == NULL) + return(-1); + tmp->value = cur->value; + if (last == NULL) + dest->nsSet = tmp; + else + last->next = tmp; + last = tmp; + cur = cur->next; + } + if (dest->negNsSet != NULL) + xmlSchemaFreeWildcardNsSet(dest->negNsSet); + if (source->negNsSet != NULL) { + dest->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt); + if (dest->negNsSet == NULL) + return(-1); + dest->negNsSet->value = source->negNsSet->value; + } else + dest->negNsSet = NULL; + return(0); +} + +/** + * xmlSchemaUnionWildcards: + * @ctxt: the schema parser context + * @completeWild: the first wildcard + * @curWild: the second wildcard + * + * Unions the namespace constraints of the given wildcards. + * @completeWild will hold the resulting union. + * Returns a positive error code on failure, -1 in case of an + * internal error, 0 otherwise. + */ +static int +xmlSchemaUnionWildcards(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaWildcardPtr completeWild, + xmlSchemaWildcardPtr curWild) +{ + xmlSchemaWildcardNsPtr cur, curB, tmp; + + /* + * 1 If O1 and O2 are the same value, then that value must be the + * value. + */ + if ((completeWild->any == curWild->any) && + ((completeWild->nsSet == NULL) == (curWild->nsSet == NULL)) && + ((completeWild->negNsSet == NULL) == (curWild->negNsSet == NULL))) { + + if ((completeWild->negNsSet == NULL) || + (completeWild->negNsSet->value == curWild->negNsSet->value)) { + + if (completeWild->nsSet != NULL) { + int found = 0; + + /* + * Check equality of sets. + */ + cur = completeWild->nsSet; + while (cur != NULL) { + found = 0; + curB = curWild->nsSet; + while (curB != NULL) { + if (cur->value == curB->value) { + found = 1; + break; + } + curB = curB->next; + } + if (!found) + break; + cur = cur->next; + } + if (found) + return(0); + } else + return(0); + } + } + /* + * 2 If either O1 or O2 is any, then any must be the value + */ + if (completeWild->any != curWild->any) { + if (completeWild->any == 0) { + completeWild->any = 1; + if (completeWild->nsSet != NULL) { + xmlSchemaFreeWildcardNsSet(completeWild->nsSet); + completeWild->nsSet = NULL; + } + if (completeWild->negNsSet != NULL) { + xmlFree(completeWild->negNsSet); + completeWild->negNsSet = NULL; + } + } + return (0); + } + /* + * 3 If both O1 and O2 are sets of (namespace names or �absent�), + * then the union of those sets must be the value. + */ + if ((completeWild->nsSet != NULL) && (curWild->nsSet != NULL)) { + int found; + xmlSchemaWildcardNsPtr start; + + cur = curWild->nsSet; + start = completeWild->nsSet; + while (cur != NULL) { + found = 0; + curB = start; + while (curB != NULL) { + if (cur->value == curB->value) { + found = 1; + break; + } + curB = curB->next; + } + if (!found) { + tmp = xmlSchemaNewWildcardNsConstraint(ctxt); + if (tmp == NULL) + return (-1); + tmp->value = cur->value; + tmp->next = completeWild->nsSet; + completeWild->nsSet = tmp; + } + cur = cur->next; + } + + return(0); + } + /* + * 4 If the two are negations of different values (namespace names + * or �absent�), then a pair of not and �absent� must be the value. + */ + if ((completeWild->negNsSet != NULL) && + (curWild->negNsSet != NULL) && + (completeWild->negNsSet->value != curWild->negNsSet->value)) { + completeWild->negNsSet->value = NULL; + + return(0); + } + /* + * 5. + */ + if (((completeWild->negNsSet != NULL) && + (completeWild->negNsSet->value != NULL) && + (curWild->nsSet != NULL)) || + ((curWild->negNsSet != NULL) && + (curWild->negNsSet->value != NULL) && + (completeWild->nsSet != NULL))) { + + int nsFound, absentFound = 0; + + if (completeWild->nsSet != NULL) { + cur = completeWild->nsSet; + curB = curWild->negNsSet; + } else { + cur = curWild->nsSet; + curB = completeWild->negNsSet; + } + nsFound = 0; + while (cur != NULL) { + if (cur->value == NULL) + absentFound = 1; + else if (cur->value == curB->value) + nsFound = 1; + if (nsFound && absentFound) + break; + cur = cur->next; + } + + if (nsFound && absentFound) { + /* + * 5.1 If the set S includes both the negated namespace + * name and �absent�, then any must be the value. + */ + completeWild->any = 1; + if (completeWild->nsSet != NULL) { + xmlSchemaFreeWildcardNsSet(completeWild->nsSet); + completeWild->nsSet = NULL; + } + if (completeWild->negNsSet != NULL) { + xmlFree(completeWild->negNsSet); + completeWild->negNsSet = NULL; + } + } else if (nsFound && (!absentFound)) { + /* + * 5.2 If the set S includes the negated namespace name + * but not �absent�, then a pair of not and �absent� must + * be the value. + */ + if (completeWild->nsSet != NULL) { + xmlSchemaFreeWildcardNsSet(completeWild->nsSet); + completeWild->nsSet = NULL; + } + if (completeWild->negNsSet == NULL) { + completeWild->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt); + if (completeWild->negNsSet == NULL) + return (-1); + } + completeWild->negNsSet->value = NULL; + } else if ((!nsFound) && absentFound) { + /* + * 5.3 If the set S includes �absent� but not the negated + * namespace name, then the union is not expressible. + */ + xmlSchemaPErr(ctxt, completeWild->node, + XML_SCHEMAP_UNION_NOT_EXPRESSIBLE, + "The union of the wilcard is not expressible.\n", + NULL, NULL); + return(XML_SCHEMAP_UNION_NOT_EXPRESSIBLE); + } else if ((!nsFound) && (!absentFound)) { + /* + * 5.4 If the set S does not include either the negated namespace + * name or �absent�, then whichever of O1 or O2 is a pair of not + * and a namespace name must be the value. + */ + if (completeWild->negNsSet == NULL) { + if (completeWild->nsSet != NULL) { + xmlSchemaFreeWildcardNsSet(completeWild->nsSet); + completeWild->nsSet = NULL; + } + completeWild->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt); + if (completeWild->negNsSet == NULL) + return (-1); + completeWild->negNsSet->value = curWild->negNsSet->value; + } + } + return (0); + } + /* + * 6. + */ + if (((completeWild->negNsSet != NULL) && + (completeWild->negNsSet->value == NULL) && + (curWild->nsSet != NULL)) || + ((curWild->negNsSet != NULL) && + (curWild->negNsSet->value == NULL) && + (completeWild->nsSet != NULL))) { + + if (completeWild->nsSet != NULL) { + cur = completeWild->nsSet; + } else { + cur = curWild->nsSet; + } + while (cur != NULL) { + if (cur->value == NULL) { + /* + * 6.1 If the set S includes �absent�, then any must be the + * value. + */ + completeWild->any = 1; + if (completeWild->nsSet != NULL) { + xmlSchemaFreeWildcardNsSet(completeWild->nsSet); + completeWild->nsSet = NULL; + } + if (completeWild->negNsSet != NULL) { + xmlFree(completeWild->negNsSet); + completeWild->negNsSet = NULL; + } + return (0); + } + cur = cur->next; + } + if (completeWild->negNsSet == NULL) { + /* + * 6.2 If the set S does not include �absent�, then a pair of not + * and �absent� must be the value. + */ + if (completeWild->nsSet != NULL) { + xmlSchemaFreeWildcardNsSet(completeWild->nsSet); + completeWild->nsSet = NULL; + } + completeWild->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt); + if (completeWild->negNsSet == NULL) + return (-1); + completeWild->negNsSet->value = NULL; + } + return (0); + } + return (0); + +} + +/** + * xmlSchemaIntersectWildcards: + * @ctxt: the schema parser context + * @completeWild: the first wildcard + * @curWild: the second wildcard + * + * Intersects the namespace constraints of the given wildcards. + * @completeWild will hold the resulting intersection. + * Returns a positive error code on failure, -1 in case of an + * internal error, 0 otherwise. + */ +static int +xmlSchemaIntersectWildcards(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaWildcardPtr completeWild, + xmlSchemaWildcardPtr curWild) +{ + xmlSchemaWildcardNsPtr cur, curB, prev, tmp; + + /* + * 1 If O1 and O2 are the same value, then that value must be the + * value. + */ + if ((completeWild->any == curWild->any) && + ((completeWild->nsSet == NULL) == (curWild->nsSet == NULL)) && + ((completeWild->negNsSet == NULL) == (curWild->negNsSet == NULL))) { + + if ((completeWild->negNsSet == NULL) || + (completeWild->negNsSet->value == curWild->negNsSet->value)) { + + if (completeWild->nsSet != NULL) { + int found = 0; + + /* + * Check equality of sets. + */ + cur = completeWild->nsSet; + while (cur != NULL) { + found = 0; + curB = curWild->nsSet; + while (curB != NULL) { + if (cur->value == curB->value) { + found = 1; + break; + } + curB = curB->next; + } + if (!found) + break; + cur = cur->next; + } + if (found) + return(0); + } else + return(0); + } + } + /* + * 2 If either O1 or O2 is any, then the other must be the value. + */ + if ((completeWild->any != curWild->any) && (completeWild->any)) { + if (xmlSchemaCloneWildcardNsConstraints(ctxt, completeWild, curWild) == -1) + return(-1); + return(0); + } + /* + * 3 If either O1 or O2 is a pair of not and a value (a namespace + * name or �absent�) and the other is a set of (namespace names or + * �absent�), then that set, minus the negated value if it was in + * the set, minus �absent� if it was in the set, must be the value. + */ + if (((completeWild->negNsSet != NULL) && (curWild->nsSet != NULL)) || + ((curWild->negNsSet != NULL) && (completeWild->nsSet != NULL))) { + const xmlChar *neg; + + if (completeWild->nsSet == NULL) { + neg = completeWild->negNsSet->value; + if (xmlSchemaCloneWildcardNsConstraints(ctxt, completeWild, curWild) == -1) + return(-1); + } else + neg = curWild->negNsSet->value; + /* + * Remove absent and negated. + */ + prev = NULL; + cur = completeWild->nsSet; + while (cur != NULL) { + if (cur->value == NULL) { + if (prev == NULL) + completeWild->nsSet = cur->next; + else + prev->next = cur->next; + xmlFree(cur); + break; + } + prev = cur; + cur = cur->next; + } + if (neg != NULL) { + prev = NULL; + cur = completeWild->nsSet; + while (cur != NULL) { + if (cur->value == neg) { + if (prev == NULL) + completeWild->nsSet = cur->next; + else + prev->next = cur->next; + xmlFree(cur); + break; + } + prev = cur; + cur = cur->next; + } + } + + return(0); + } + /* + * 4 If both O1 and O2 are sets of (namespace names or �absent�), + * then the intersection of those sets must be the value. + */ + if ((completeWild->nsSet != NULL) && (curWild->nsSet != NULL)) { + int found; + + cur = completeWild->nsSet; + prev = NULL; + while (cur != NULL) { + found = 0; + curB = curWild->nsSet; + while (curB != NULL) { + if (cur->value == curB->value) { + found = 1; + break; + } + curB = curB->next; + } + if (!found) { + if (prev == NULL) + completeWild->nsSet = cur->next; + else + prev->next = cur->next; + tmp = cur->next; + xmlFree(cur); + cur = tmp; + continue; + } + prev = cur; + cur = cur->next; + } + + return(0); + } + /* 5 If the two are negations of different namespace names, + * then the intersection is not expressible + */ + if ((completeWild->negNsSet != NULL) && + (curWild->negNsSet != NULL) && + (completeWild->negNsSet->value != curWild->negNsSet->value) && + (completeWild->negNsSet->value != NULL) && + (curWild->negNsSet->value != NULL)) { + + xmlSchemaPErr(ctxt, completeWild->node, XML_SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE, + "The intersection of the wilcard is not expressible.\n", + NULL, NULL); + return(XML_SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE); + } + /* + * 6 If the one is a negation of a namespace name and the other + * is a negation of �absent�, then the one which is the negation + * of a namespace name must be the value. + */ + if ((completeWild->negNsSet != NULL) && (curWild->negNsSet != NULL) && + (completeWild->negNsSet->value != curWild->negNsSet->value) && + (completeWild->negNsSet->value == NULL)) { + completeWild->negNsSet->value = curWild->negNsSet->value; + } + return(0); +} + +/** + * xmlSchemaIsWildcardNsConstraintSubset: + * @ctxt: the schema parser context + * @sub: the first wildcard + * @super: the second wildcard + * + * Schema Component Constraint: Wildcard Subset (cos-ns-subset) + * + * Returns 0 if the namespace constraint of @sub is an intensional + * subset of @super, 1 otherwise. + */ +static int +xmlSchemaCheckCOSNSSubset(xmlSchemaWildcardPtr sub, + xmlSchemaWildcardPtr super) +{ + /* + * 1 super must be any. + */ + if (super->any) + return (0); + /* + * 2.1 sub must be a pair of not and a namespace name or �absent�. + * 2.2 super must be a pair of not and the same value. + */ + if ((sub->negNsSet != NULL) && + (super->negNsSet != NULL) && + (sub->negNsSet->value == super->negNsSet->value)) + return (0); + /* + * 3.1 sub must be a set whose members are either namespace names or �absent�. + */ + if (sub->nsSet != NULL) { + /* + * 3.2.1 super must be the same set or a superset thereof. + */ + if (super->nsSet != NULL) { + xmlSchemaWildcardNsPtr cur, curB; + int found = 0; + + cur = sub->nsSet; + while (cur != NULL) { + found = 0; + curB = super->nsSet; + while (curB != NULL) { + if (cur->value == curB->value) { + found = 1; + break; + } + curB = curB->next; + } + if (!found) + return (1); + cur = cur->next; + } + if (found) + return (0); + } else if (super->negNsSet != NULL) { + xmlSchemaWildcardNsPtr cur; + /* + * 3.2.2 super must be a pair of not and a namespace name or + * �absent� and that value must not be in sub's set. + */ + cur = sub->nsSet; + while (cur != NULL) { + if (cur->value == super->negNsSet->value) + return (1); + cur = cur->next; + } + return (0); + } + } + return (1); +} + +static int +xmlSchemaGetEffectiveValueConstraint(xmlSchemaAttributeUsePtr attruse, + int *fixed, + const xmlChar **value, + xmlSchemaValPtr *val) +{ + *fixed = 0; + *value = NULL; + if (val != 0) + *val = NULL; + + if (attruse->defValue != NULL) { + *value = attruse->defValue; + if (val != NULL) + *val = attruse->defVal; + if (attruse->flags & XML_SCHEMA_ATTR_USE_FIXED) + *fixed = 1; + return(1); + } else if ((attruse->attrDecl != NULL) && + (attruse->attrDecl->defValue != NULL)) { + *value = attruse->attrDecl->defValue; + if (val != NULL) + *val = attruse->attrDecl->defVal; + if (attruse->attrDecl->flags & XML_SCHEMAS_ATTR_FIXED) + *fixed = 1; + return(1); + } + return(0); +} +/** + * xmlSchemaCheckCVCWildcardNamespace: + * @wild: the wildcard + * @ns: the namespace + * + * Validation Rule: Wildcard allows Namespace Name + * (cvc-wildcard-namespace) + * + * Returns 0 if the given namespace matches the wildcard, + * 1 otherwise and -1 on API errors. + */ +static int +xmlSchemaCheckCVCWildcardNamespace(xmlSchemaWildcardPtr wild, + const xmlChar* ns) +{ + if (wild == NULL) + return(-1); + + if (wild->any) + return(0); + else if (wild->nsSet != NULL) { + xmlSchemaWildcardNsPtr cur; + + cur = wild->nsSet; + while (cur != NULL) { + if (xmlStrEqual(cur->value, ns)) + return(0); + cur = cur->next; + } + } else if ((wild->negNsSet != NULL) && (ns != NULL) && + (!xmlStrEqual(wild->negNsSet->value, ns))) + return(0); + + return(1); +} + +#define XML_SCHEMA_ACTION_DERIVE 0 +#define XML_SCHEMA_ACTION_REDEFINE 1 + +#define WXS_ACTION_STR(a) \ +((a) == XML_SCHEMA_ACTION_DERIVE) ? (const xmlChar *) "base" : (const xmlChar *) "redefined" + +/* +* Schema Component Constraint: +* Derivation Valid (Restriction, Complex) +* derivation-ok-restriction (2) - (4) +* +* ATTENTION: +* In XML Schema 1.1 this will be: +* Validation Rule: +* Checking complex type subsumption (practicalSubsumption) (1, 2 and 3) +* +*/ +static int +xmlSchemaCheckDerivationOKRestriction2to4(xmlSchemaParserCtxtPtr pctxt, + int action, + xmlSchemaBasicItemPtr item, + xmlSchemaBasicItemPtr baseItem, + xmlSchemaItemListPtr uses, + xmlSchemaItemListPtr baseUses, + xmlSchemaWildcardPtr wild, + xmlSchemaWildcardPtr baseWild) +{ + xmlSchemaAttributeUsePtr cur = NULL, bcur; + int i, j, found; /* err = 0; */ + const xmlChar *bEffValue; + int effFixed; + + if (uses != NULL) { + for (i = 0; i < uses->nbItems; i++) { + cur = uses->items[i]; + found = 0; + if (baseUses == NULL) + goto not_found; + for (j = 0; j < baseUses->nbItems; j++) { + bcur = baseUses->items[j]; + if ((WXS_ATTRUSE_DECL_NAME(cur) == + WXS_ATTRUSE_DECL_NAME(bcur)) && + (WXS_ATTRUSE_DECL_TNS(cur) == + WXS_ATTRUSE_DECL_TNS(bcur))) + { + /* + * (2.1) "If there is an attribute use in the {attribute + * uses} of the {base type definition} (call this B) whose + * {attribute declaration} has the same {name} and {target + * namespace}, then all of the following must be true:" + */ + found = 1; + + if ((cur->occurs == XML_SCHEMAS_ATTR_USE_OPTIONAL) && + (bcur->occurs == XML_SCHEMAS_ATTR_USE_REQUIRED)) + { + xmlChar *str = NULL; + /* + * (2.1.1) "one of the following must be true:" + * (2.1.1.1) "B's {required} is false." + * (2.1.1.2) "R's {required} is true." + */ + xmlSchemaPAttrUseErr4(pctxt, + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_1, + WXS_ITEM_NODE(item), item, cur, + "The 'optional' attribute use is inconsistent " + "with the corresponding 'required' attribute use of " + "the %s %s", + WXS_ACTION_STR(action), + xmlSchemaGetComponentDesignation(&str, baseItem), + NULL, NULL); + FREE_AND_NULL(str); + /* err = pctxt->err; */ + } else if (xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST pctxt, + WXS_ATTRUSE_TYPEDEF(cur), + WXS_ATTRUSE_TYPEDEF(bcur), 0) != 0) + { + xmlChar *strA = NULL, *strB = NULL, *strC = NULL; + + /* + * SPEC (2.1.2) "R's {attribute declaration}'s + * {type definition} must be validly derived from + * B's {type definition} given the empty set as + * defined in Type Derivation OK (Simple) (�3.14.6)." + */ + xmlSchemaPAttrUseErr4(pctxt, + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_2, + WXS_ITEM_NODE(item), item, cur, + "The attribute declaration's %s " + "is not validly derived from " + "the corresponding %s of the " + "attribute declaration in the %s %s", + xmlSchemaGetComponentDesignation(&strA, + WXS_ATTRUSE_TYPEDEF(cur)), + xmlSchemaGetComponentDesignation(&strB, + WXS_ATTRUSE_TYPEDEF(bcur)), + WXS_ACTION_STR(action), + xmlSchemaGetComponentDesignation(&strC, baseItem)); + /* xmlSchemaGetComponentDesignation(&str, baseItem), */ + FREE_AND_NULL(strA); + FREE_AND_NULL(strB); + FREE_AND_NULL(strC); + /* err = pctxt->err; */ + } else { + /* + * 2.1.3 [Definition:] Let the effective value + * constraint of an attribute use be its {value + * constraint}, if present, otherwise its {attribute + * declaration}'s {value constraint} . + */ + xmlSchemaGetEffectiveValueConstraint(bcur, + &effFixed, &bEffValue, NULL); + /* + * 2.1.3 ... one of the following must be true + * + * 2.1.3.1 B's �effective value constraint� is + * �absent� or default. + */ + if ((bEffValue != NULL) && + (effFixed == 1)) { + const xmlChar *rEffValue = NULL; + + xmlSchemaGetEffectiveValueConstraint(bcur, + &effFixed, &rEffValue, NULL); + /* + * 2.1.3.2 R's �effective value constraint� is + * fixed with the same string as B's. + * MAYBE TODO: Compare the computed values. + * Hmm, it says "same string" so + * string-equality might really be sufficient. + */ + if ((effFixed == 0) || + (! WXS_ARE_DEFAULT_STR_EQUAL(rEffValue, bEffValue))) + { + xmlChar *str = NULL; + + xmlSchemaPAttrUseErr4(pctxt, + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_3, + WXS_ITEM_NODE(item), item, cur, + "The effective value constraint of the " + "attribute use is inconsistent with " + "its correspondent in the %s %s", + WXS_ACTION_STR(action), + xmlSchemaGetComponentDesignation(&str, + baseItem), + NULL, NULL); + FREE_AND_NULL(str); + /* err = pctxt->err; */ + } + } + } + break; + } + } +not_found: + if (!found) { + /* + * (2.2) "otherwise the {base type definition} must have an + * {attribute wildcard} and the {target namespace} of the + * R's {attribute declaration} must be �valid� with respect + * to that wildcard, as defined in Wildcard allows Namespace + * Name (�3.10.4)." + */ + if ((baseWild == NULL) || + (xmlSchemaCheckCVCWildcardNamespace(baseWild, + (WXS_ATTRUSE_DECL(cur))->targetNamespace) != 0)) + { + xmlChar *str = NULL; + + xmlSchemaPAttrUseErr4(pctxt, + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_2, + WXS_ITEM_NODE(item), item, cur, + "Neither a matching attribute use, " + "nor a matching wildcard exists in the %s %s", + WXS_ACTION_STR(action), + xmlSchemaGetComponentDesignation(&str, baseItem), + NULL, NULL); + FREE_AND_NULL(str); + /* err = pctxt->err; */ + } + } + } + } + /* + * SPEC derivation-ok-restriction (3): + * (3) "For each attribute use in the {attribute uses} of the {base type + * definition} whose {required} is true, there must be an attribute + * use with an {attribute declaration} with the same {name} and + * {target namespace} as its {attribute declaration} in the {attribute + * uses} of the complex type definition itself whose {required} is true. + */ + if (baseUses != NULL) { + for (j = 0; j < baseUses->nbItems; j++) { + bcur = baseUses->items[j]; + if (bcur->occurs != XML_SCHEMAS_ATTR_USE_REQUIRED) + continue; + found = 0; + if (uses != NULL) { + for (i = 0; i < uses->nbItems; i++) { + cur = uses->items[i]; + if ((WXS_ATTRUSE_DECL_NAME(cur) == + WXS_ATTRUSE_DECL_NAME(bcur)) && + (WXS_ATTRUSE_DECL_TNS(cur) == + WXS_ATTRUSE_DECL_TNS(bcur))) { + found = 1; + break; + } + } + } + if (!found) { + xmlChar *strA = NULL, *strB = NULL; + + xmlSchemaCustomErr4(ACTXT_CAST pctxt, + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_3, + NULL, item, + "A matching attribute use for the " + "'required' %s of the %s %s is missing", + xmlSchemaGetComponentDesignation(&strA, bcur), + WXS_ACTION_STR(action), + xmlSchemaGetComponentDesignation(&strB, baseItem), + NULL); + FREE_AND_NULL(strA); + FREE_AND_NULL(strB); + } + } + } + /* + * derivation-ok-restriction (4) + */ + if (wild != NULL) { + /* + * (4) "If there is an {attribute wildcard}, all of the + * following must be true:" + */ + if (baseWild == NULL) { + xmlChar *str = NULL; + + /* + * (4.1) "The {base type definition} must also have one." + */ + xmlSchemaCustomErr4(ACTXT_CAST pctxt, + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_1, + NULL, item, + "The %s has an attribute wildcard, " + "but the %s %s '%s' does not have one", + WXS_ITEM_TYPE_NAME(item), + WXS_ACTION_STR(action), + WXS_ITEM_TYPE_NAME(baseItem), + xmlSchemaGetComponentQName(&str, baseItem)); + FREE_AND_NULL(str); + return(pctxt->err); + } else if ((baseWild->any == 0) && + xmlSchemaCheckCOSNSSubset(wild, baseWild)) + { + xmlChar *str = NULL; + /* + * (4.2) "The complex type definition's {attribute wildcard}'s + * {namespace constraint} must be a subset of the {base type + * definition}'s {attribute wildcard}'s {namespace constraint}, + * as defined by Wildcard Subset (�3.10.6)." + */ + xmlSchemaCustomErr4(ACTXT_CAST pctxt, + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_2, + NULL, item, + "The attribute wildcard is not a valid " + "subset of the wildcard in the %s %s '%s'", + WXS_ACTION_STR(action), + WXS_ITEM_TYPE_NAME(baseItem), + xmlSchemaGetComponentQName(&str, baseItem), + NULL); + FREE_AND_NULL(str); + return(pctxt->err); + } + /* 4.3 Unless the {base type definition} is the �ur-type + * definition�, the complex type definition's {attribute + * wildcard}'s {process contents} must be identical to or + * stronger than the {base type definition}'s {attribute + * wildcard}'s {process contents}, where strict is stronger + * than lax is stronger than skip. + */ + if ((! WXS_IS_ANYTYPE(baseItem)) && + (wild->processContents < baseWild->processContents)) { + xmlChar *str = NULL; + xmlSchemaCustomErr4(ACTXT_CAST pctxt, + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_3, + NULL, baseItem, + "The {process contents} of the attribute wildcard is " + "weaker than the one in the %s %s '%s'", + WXS_ACTION_STR(action), + WXS_ITEM_TYPE_NAME(baseItem), + xmlSchemaGetComponentQName(&str, baseItem), + NULL); + FREE_AND_NULL(str) + return(pctxt->err); + } + } + return(0); +} + + +static int +xmlSchemaExpandAttributeGroupRefs(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaBasicItemPtr item, + xmlSchemaWildcardPtr *completeWild, + xmlSchemaItemListPtr list, + xmlSchemaItemListPtr prohibs); +/** + * xmlSchemaFixupTypeAttributeUses: + * @ctxt: the schema parser context + * @type: the complex type definition + * + * + * Builds the wildcard and the attribute uses on the given complex type. + * Returns -1 if an internal error occurs, 0 otherwise. + * + * ATTENTION TODO: Experimantally this uses pointer comparisons for + * strings, so recheck this if we start to hardcode some schemata, since + * they might not be in the same dict. + * NOTE: It is allowed to "extend" the xs:anyType type. + */ +static int +xmlSchemaFixupTypeAttributeUses(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaTypePtr type) +{ + xmlSchemaTypePtr baseType = NULL; + xmlSchemaAttributeUsePtr use; + xmlSchemaItemListPtr uses, baseUses, prohibs = NULL; + + if (type->baseType == NULL) { + PERROR_INT("xmlSchemaFixupTypeAttributeUses", + "no base type"); + return (-1); + } + baseType = type->baseType; + if (WXS_IS_TYPE_NOT_FIXED(baseType)) + if (xmlSchemaTypeFixup(baseType, ACTXT_CAST pctxt) == -1) + return(-1); + + uses = type->attrUses; + baseUses = baseType->attrUses; + /* + * Expand attribute group references. And build the 'complete' + * wildcard, i.e. intersect multiple wildcards. + * Move attribute prohibitions into a separate list. + */ + if (uses != NULL) { + if (WXS_IS_RESTRICTION(type)) { + /* + * This one will transfer all attr. prohibitions + * into pctxt->attrProhibs. + */ + if (xmlSchemaExpandAttributeGroupRefs(pctxt, + WXS_BASIC_CAST type, &(type->attributeWildcard), uses, + pctxt->attrProhibs) == -1) + { + PERROR_INT("xmlSchemaFixupTypeAttributeUses", + "failed to expand attributes"); + } + if (pctxt->attrProhibs->nbItems != 0) + prohibs = pctxt->attrProhibs; + } else { + if (xmlSchemaExpandAttributeGroupRefs(pctxt, + WXS_BASIC_CAST type, &(type->attributeWildcard), uses, + NULL) == -1) + { + PERROR_INT("xmlSchemaFixupTypeAttributeUses", + "failed to expand attributes"); + } + } + } + /* + * Inherit the attribute uses of the base type. + */ + if (baseUses != NULL) { + int i, j; + xmlSchemaAttributeUseProhibPtr pro; + + if (WXS_IS_RESTRICTION(type)) { + int usesCount; + xmlSchemaAttributeUsePtr tmp; + + if (uses != NULL) + usesCount = uses->nbItems; + else + usesCount = 0; + + /* Restriction. */ + for (i = 0; i < baseUses->nbItems; i++) { + use = baseUses->items[i]; + if (prohibs) { + /* + * Filter out prohibited uses. + */ + for (j = 0; j < prohibs->nbItems; j++) { + pro = prohibs->items[j]; + if ((WXS_ATTRUSE_DECL_NAME(use) == pro->name) && + (WXS_ATTRUSE_DECL_TNS(use) == + pro->targetNamespace)) + { + goto inherit_next; + } + } + } + if (usesCount) { + /* + * Filter out existing uses. + */ + for (j = 0; j < usesCount; j++) { + tmp = uses->items[j]; + if ((WXS_ATTRUSE_DECL_NAME(use) == + WXS_ATTRUSE_DECL_NAME(tmp)) && + (WXS_ATTRUSE_DECL_TNS(use) == + WXS_ATTRUSE_DECL_TNS(tmp))) + { + goto inherit_next; + } + } + } + if (uses == NULL) { + type->attrUses = xmlSchemaItemListCreate(); + if (type->attrUses == NULL) + goto exit_failure; + uses = type->attrUses; + } + xmlSchemaItemListAddSize(uses, 2, use); +inherit_next: {} + } + } else { + /* Extension. */ + for (i = 0; i < baseUses->nbItems; i++) { + use = baseUses->items[i]; + if (uses == NULL) { + type->attrUses = xmlSchemaItemListCreate(); + if (type->attrUses == NULL) + goto exit_failure; + uses = type->attrUses; + } + xmlSchemaItemListAddSize(uses, baseUses->nbItems, use); + } + } + } + /* + * Shrink attr. uses. + */ + if (uses) { + if (uses->nbItems == 0) { + xmlSchemaItemListFree(uses); + type->attrUses = NULL; + } + /* + * TODO: We could shrink the size of the array + * to fit the actual number of items. + */ + } + /* + * Compute the complete wildcard. + */ + if (WXS_IS_EXTENSION(type)) { + if (baseType->attributeWildcard != NULL) { + /* + * (3.2.2.1) "If the �base wildcard� is non-�absent�, then + * the appropriate case among the following:" + */ + if (type->attributeWildcard != NULL) { + /* + * Union the complete wildcard with the base wildcard. + * SPEC {attribute wildcard} + * (3.2.2.1.2) "otherwise a wildcard whose {process contents} + * and {annotation} are those of the �complete wildcard�, + * and whose {namespace constraint} is the intensional union + * of the {namespace constraint} of the �complete wildcard� + * and of the �base wildcard�, as defined in Attribute + * Wildcard Union (�3.10.6)." + */ + if (xmlSchemaUnionWildcards(pctxt, type->attributeWildcard, + baseType->attributeWildcard) == -1) + goto exit_failure; + } else { + /* + * (3.2.2.1.1) "If the �complete wildcard� is �absent�, + * then the �base wildcard�." + */ + type->attributeWildcard = baseType->attributeWildcard; + } + } else { + /* + * (3.2.2.2) "otherwise (the �base wildcard� is �absent�) the + * �complete wildcard" + * NOOP + */ + } + } else { + /* + * SPEC {attribute wildcard} + * (3.1) "If the alternative is chosen, then the + * �complete wildcard�;" + * NOOP + */ + } + + return (0); + +exit_failure: + return(-1); +} + +/** + * xmlSchemaTypeFinalContains: + * @schema: the schema + * @type: the type definition + * @final: the final + * + * Evaluates if a type definition contains the given "final". + * This does take "finalDefault" into account as well. + * + * Returns 1 if the type does containt the given "final", + * 0 otherwise. + */ +static int +xmlSchemaTypeFinalContains(xmlSchemaTypePtr type, int final) +{ + if (type == NULL) + return (0); + if (type->flags & final) + return (1); + else + return (0); +} + +/** + * xmlSchemaGetUnionSimpleTypeMemberTypes: + * @type: the Union Simple Type + * + * Returns a list of member types of @type if existing, + * returns NULL otherwise. + */ +static xmlSchemaTypeLinkPtr +xmlSchemaGetUnionSimpleTypeMemberTypes(xmlSchemaTypePtr type) +{ + while ((type != NULL) && (type->type == XML_SCHEMA_TYPE_SIMPLE)) { + if (type->memberTypes != NULL) + return (type->memberTypes); + else + type = type->baseType; + } + return (NULL); +} + +/** + * xmlSchemaGetParticleTotalRangeMin: + * @particle: the particle + * + * Schema Component Constraint: Effective Total Range + * (all and sequence) + (choice) + * + * Returns the minimun Effective Total Range. + */ +static int +xmlSchemaGetParticleTotalRangeMin(xmlSchemaParticlePtr particle) +{ + if ((particle->children == NULL) || + (particle->minOccurs == 0)) + return (0); + if (particle->children->type == XML_SCHEMA_TYPE_CHOICE) { + int min = -1, cur; + xmlSchemaParticlePtr part = + (xmlSchemaParticlePtr) particle->children->children; + + if (part == NULL) + return (0); + while (part != NULL) { + if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) || + (part->children->type == XML_SCHEMA_TYPE_ANY)) + cur = part->minOccurs; + else + cur = xmlSchemaGetParticleTotalRangeMin(part); + if (cur == 0) + return (0); + if ((min > cur) || (min == -1)) + min = cur; + part = (xmlSchemaParticlePtr) part->next; + } + return (particle->minOccurs * min); + } else { + /* and */ + int sum = 0; + xmlSchemaParticlePtr part = + (xmlSchemaParticlePtr) particle->children->children; + + if (part == NULL) + return (0); + do { + if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) || + (part->children->type == XML_SCHEMA_TYPE_ANY)) + sum += part->minOccurs; + else + sum += xmlSchemaGetParticleTotalRangeMin(part); + part = (xmlSchemaParticlePtr) part->next; + } while (part != NULL); + return (particle->minOccurs * sum); + } +} + +#if 0 +/** + * xmlSchemaGetParticleTotalRangeMax: + * @particle: the particle + * + * Schema Component Constraint: Effective Total Range + * (all and sequence) + (choice) + * + * Returns the maximum Effective Total Range. + */ +static int +xmlSchemaGetParticleTotalRangeMax(xmlSchemaParticlePtr particle) +{ + if ((particle->children == NULL) || + (particle->children->children == NULL)) + return (0); + if (particle->children->type == XML_SCHEMA_TYPE_CHOICE) { + int max = -1, cur; + xmlSchemaParticlePtr part = + (xmlSchemaParticlePtr) particle->children->children; + + for (; part != NULL; part = (xmlSchemaParticlePtr) part->next) { + if (part->children == NULL) + continue; + if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) || + (part->children->type == XML_SCHEMA_TYPE_ANY)) + cur = part->maxOccurs; + else + cur = xmlSchemaGetParticleTotalRangeMax(part); + if (cur == UNBOUNDED) + return (UNBOUNDED); + if ((max < cur) || (max == -1)) + max = cur; + } + /* TODO: Handle overflows? */ + return (particle->maxOccurs * max); + } else { + /* and */ + int sum = 0, cur; + xmlSchemaParticlePtr part = + (xmlSchemaParticlePtr) particle->children->children; + + for (; part != NULL; part = (xmlSchemaParticlePtr) part->next) { + if (part->children == NULL) + continue; + if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) || + (part->children->type == XML_SCHEMA_TYPE_ANY)) + cur = part->maxOccurs; + else + cur = xmlSchemaGetParticleTotalRangeMax(part); + if (cur == UNBOUNDED) + return (UNBOUNDED); + if ((cur > 0) && (particle->maxOccurs == UNBOUNDED)) + return (UNBOUNDED); + sum += cur; + } + /* TODO: Handle overflows? */ + return (particle->maxOccurs * sum); + } +} +#endif + +/** + * xmlSchemaIsParticleEmptiable: + * @particle: the particle + * + * Schema Component Constraint: Particle Emptiable + * Checks whether the given particle is emptiable. + * + * Returns 1 if emptiable, 0 otherwise. + */ +static int +xmlSchemaIsParticleEmptiable(xmlSchemaParticlePtr particle) +{ + /* + * SPEC (1) "Its {min occurs} is 0." + */ + if ((particle == NULL) || (particle->minOccurs == 0) || + (particle->children == NULL)) + return (1); + /* + * SPEC (2) "Its {term} is a group and the minimum part of the + * effective total range of that group, [...] is 0." + */ + if (WXS_IS_MODEL_GROUP(particle->children)) { + if (xmlSchemaGetParticleTotalRangeMin(particle) == 0) + return (1); + } + return (0); +} + +/** + * xmlSchemaCheckCOSSTDerivedOK: + * @actxt: a context + * @type: the derived simple type definition + * @baseType: the base type definition + * @subset: the subset of ('restriction', ect.) + * + * Schema Component Constraint: + * Type Derivation OK (Simple) (cos-st-derived-OK) + * + * Checks wheter @type can be validly + * derived from @baseType. + * + * Returns 0 on success, an positive error code otherwise. + */ +static int +xmlSchemaCheckCOSSTDerivedOK(xmlSchemaAbstractCtxtPtr actxt, + xmlSchemaTypePtr type, + xmlSchemaTypePtr baseType, + int subset) +{ + /* + * 1 They are the same type definition. + * TODO: The identy check might have to be more complex than this. + */ + if (type == baseType) + return (0); + /* + * 2.1 restriction is not in the subset, or in the {final} + * of its own {base type definition}; + * + * NOTE that this will be used also via "xsi:type". + * + * TODO: Revise this, it looks strange. How can the "type" + * not be fixed or *in* fixing? + */ + if (WXS_IS_TYPE_NOT_FIXED(type)) + if (xmlSchemaTypeFixup(type, actxt) == -1) + return(-1); + if (WXS_IS_TYPE_NOT_FIXED(baseType)) + if (xmlSchemaTypeFixup(baseType, actxt) == -1) + return(-1); + if ((subset & SUBSET_RESTRICTION) || + (xmlSchemaTypeFinalContains(type->baseType, + XML_SCHEMAS_TYPE_FINAL_RESTRICTION))) { + return (XML_SCHEMAP_COS_ST_DERIVED_OK_2_1); + } + /* 2.2 */ + if (type->baseType == baseType) { + /* + * 2.2.1 D's �base type definition� is B. + */ + return (0); + } + /* + * 2.2.2 D's �base type definition� is not the �ur-type definition� + * and is validly derived from B given the subset, as defined by this + * constraint. + */ + if ((! WXS_IS_ANYTYPE(type->baseType)) && + (xmlSchemaCheckCOSSTDerivedOK(actxt, type->baseType, + baseType, subset) == 0)) { + return (0); + } + /* + * 2.2.3 D's {variety} is list or union and B is the �simple ur-type + * definition�. + */ + if (WXS_IS_ANY_SIMPLE_TYPE(baseType) && + (WXS_IS_LIST(type) || WXS_IS_UNION(type))) { + return (0); + } + /* + * 2.2.4 B's {variety} is union and D is validly derived from a type + * definition in B's {member type definitions} given the subset, as + * defined by this constraint. + * + * NOTE: This seems not to involve built-in types, since there is no + * built-in Union Simple Type. + */ + if (WXS_IS_UNION(baseType)) { + xmlSchemaTypeLinkPtr cur; + + cur = baseType->memberTypes; + while (cur != NULL) { + if (WXS_IS_TYPE_NOT_FIXED(cur->type)) + if (xmlSchemaTypeFixup(cur->type, actxt) == -1) + return(-1); + if (xmlSchemaCheckCOSSTDerivedOK(actxt, + type, cur->type, subset) == 0) + { + /* + * It just has to be validly derived from at least one + * member-type. + */ + return (0); + } + cur = cur->next; + } + } + return (XML_SCHEMAP_COS_ST_DERIVED_OK_2_2); +} + +/** + * xmlSchemaCheckTypeDefCircularInternal: + * @pctxt: the schema parser context + * @ctxtType: the type definition + * @ancestor: an ancestor of @ctxtType + * + * Checks st-props-correct (2) + ct-props-correct (3). + * Circular type definitions are not allowed. + * + * Returns XML_SCHEMAP_ST_PROPS_CORRECT_2 if the given type is + * circular, 0 otherwise. + */ +static int +xmlSchemaCheckTypeDefCircularInternal(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaTypePtr ctxtType, + xmlSchemaTypePtr ancestor) +{ + int ret; + + if ((ancestor == NULL) || (ancestor->type == XML_SCHEMA_TYPE_BASIC)) + return (0); + + if (ctxtType == ancestor) { + xmlSchemaPCustomErr(pctxt, + XML_SCHEMAP_ST_PROPS_CORRECT_2, + WXS_BASIC_CAST ctxtType, WXS_ITEM_NODE(ctxtType), + "The definition is circular", NULL); + return (XML_SCHEMAP_ST_PROPS_CORRECT_2); + } + if (ancestor->flags & XML_SCHEMAS_TYPE_MARKED) { + /* + * Avoid inifinite recursion on circular types not yet checked. + */ + return (0); + } + ancestor->flags |= XML_SCHEMAS_TYPE_MARKED; + ret = xmlSchemaCheckTypeDefCircularInternal(pctxt, ctxtType, + ancestor->baseType); + ancestor->flags ^= XML_SCHEMAS_TYPE_MARKED; + return (ret); +} + +/** + * xmlSchemaCheckTypeDefCircular: + * @item: the complex/simple type definition + * @ctxt: the parser context + * @name: the name + * + * Checks for circular type definitions. + */ +static void +xmlSchemaCheckTypeDefCircular(xmlSchemaTypePtr item, + xmlSchemaParserCtxtPtr ctxt) +{ + if ((item == NULL) || + (item->type == XML_SCHEMA_TYPE_BASIC) || + (item->baseType == NULL)) + return; + xmlSchemaCheckTypeDefCircularInternal(ctxt, item, + item->baseType); +} + +/* +* Simple Type Definition Representation OK (src-simple-type) 4 +* +* "4 Circular union type definition is disallowed. That is, if the +* alternative is chosen, there must not be any entries in the +* memberTypes [attribute] at any depth which resolve to the component +* corresponding to the ." +* +* Note that this should work on the *representation* of a component, +* thus assumes any union types in the member types not being yet +* substituted. At this stage we need the variety of the types +* to be already computed. +*/ +static int +xmlSchemaCheckUnionTypeDefCircularRecur(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaTypePtr ctxType, + xmlSchemaTypeLinkPtr members) +{ + xmlSchemaTypeLinkPtr member; + xmlSchemaTypePtr memberType; + + member = members; + while (member != NULL) { + memberType = member->type; + while ((memberType != NULL) && + (memberType->type != XML_SCHEMA_TYPE_BASIC)) { + if (memberType == ctxType) { + xmlSchemaPCustomErr(pctxt, + XML_SCHEMAP_SRC_SIMPLE_TYPE_4, + WXS_BASIC_CAST ctxType, NULL, + "The union type definition is circular", NULL); + return (XML_SCHEMAP_SRC_SIMPLE_TYPE_4); + } + if ((WXS_IS_UNION(memberType)) && + ((memberType->flags & XML_SCHEMAS_TYPE_MARKED) == 0)) + { + int res; + memberType->flags |= XML_SCHEMAS_TYPE_MARKED; + res = xmlSchemaCheckUnionTypeDefCircularRecur(pctxt, + ctxType, + xmlSchemaGetUnionSimpleTypeMemberTypes(memberType)); + memberType->flags ^= XML_SCHEMAS_TYPE_MARKED; + if (res != 0) + return(res); + } + memberType = memberType->baseType; + } + member = member->next; + } + return(0); +} + +static int +xmlSchemaCheckUnionTypeDefCircular(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaTypePtr type) +{ + if (! WXS_IS_UNION(type)) + return(0); + return(xmlSchemaCheckUnionTypeDefCircularRecur(pctxt, type, + type->memberTypes)); +} + +/** + * xmlSchemaResolveTypeReferences: + * @item: the complex/simple type definition + * @ctxt: the parser context + * @name: the name + * + * Resolvese type definition references + */ +static void +xmlSchemaResolveTypeReferences(xmlSchemaTypePtr typeDef, + xmlSchemaParserCtxtPtr ctxt) +{ + if (typeDef == NULL) + return; + + /* + * Resolve the base type. + */ + if (typeDef->baseType == NULL) { + typeDef->baseType = xmlSchemaGetType(ctxt->schema, + typeDef->base, typeDef->baseNs); + if (typeDef->baseType == NULL) { + xmlSchemaPResCompAttrErr(ctxt, + XML_SCHEMAP_SRC_RESOLVE, + WXS_BASIC_CAST typeDef, typeDef->node, + "base", typeDef->base, typeDef->baseNs, + XML_SCHEMA_TYPE_SIMPLE, NULL); + return; + } + } + if (WXS_IS_SIMPLE(typeDef)) { + if (WXS_IS_UNION(typeDef)) { + /* + * Resolve the memberTypes. + */ + xmlSchemaResolveUnionMemberTypes(ctxt, typeDef); + return; + } else if (WXS_IS_LIST(typeDef)) { + /* + * Resolve the itemType. + */ + if ((typeDef->subtypes == NULL) && (typeDef->base != NULL)) { + + typeDef->subtypes = xmlSchemaGetType(ctxt->schema, + typeDef->base, typeDef->baseNs); + + if ((typeDef->subtypes == NULL) || + (! WXS_IS_SIMPLE(typeDef->subtypes))) + { + typeDef->subtypes = NULL; + xmlSchemaPResCompAttrErr(ctxt, + XML_SCHEMAP_SRC_RESOLVE, + WXS_BASIC_CAST typeDef, typeDef->node, + "itemType", typeDef->base, typeDef->baseNs, + XML_SCHEMA_TYPE_SIMPLE, NULL); + } + } + return; + } + } + /* + * The ball of letters below means, that if we have a particle + * which has a QName-helper component as its {term}, we want + * to resolve it... + */ + else if ((WXS_TYPE_CONTENTTYPE(typeDef) != NULL) && + ((WXS_TYPE_CONTENTTYPE(typeDef))->type == + XML_SCHEMA_TYPE_PARTICLE) && + (WXS_TYPE_PARTICLE_TERM(typeDef) != NULL) && + ((WXS_TYPE_PARTICLE_TERM(typeDef))->type == + XML_SCHEMA_EXTRA_QNAMEREF)) + { + xmlSchemaQNameRefPtr ref = + WXS_QNAME_CAST WXS_TYPE_PARTICLE_TERM(typeDef); + xmlSchemaModelGroupDefPtr groupDef; + + /* + * URGENT TODO: Test this. + */ + WXS_TYPE_PARTICLE_TERM(typeDef) = NULL; + /* + * Resolve the MG definition reference. + */ + groupDef = + WXS_MODEL_GROUPDEF_CAST xmlSchemaGetNamedComponent(ctxt->schema, + ref->itemType, ref->name, ref->targetNamespace); + if (groupDef == NULL) { + xmlSchemaPResCompAttrErr(ctxt, XML_SCHEMAP_SRC_RESOLVE, + NULL, WXS_ITEM_NODE(WXS_TYPE_PARTICLE(typeDef)), + "ref", ref->name, ref->targetNamespace, ref->itemType, + NULL); + /* Remove the particle. */ + WXS_TYPE_CONTENTTYPE(typeDef) = NULL; + } else if (WXS_MODELGROUPDEF_MODEL(groupDef) == NULL) + /* Remove the particle. */ + WXS_TYPE_CONTENTTYPE(typeDef) = NULL; + else { + /* + * Assign the MG definition's {model group} to the + * particle's {term}. + */ + WXS_TYPE_PARTICLE_TERM(typeDef) = WXS_MODELGROUPDEF_MODEL(groupDef); + + if (WXS_MODELGROUPDEF_MODEL(groupDef)->type == XML_SCHEMA_TYPE_ALL) { + /* + * SPEC cos-all-limited (1.2) + * "1.2 the {term} property of a particle with + * {max occurs}=1 which is part of a pair which constitutes + * the {content type} of a complex type definition." + */ + if ((WXS_TYPE_PARTICLE(typeDef))->maxOccurs != 1) { + xmlSchemaCustomErr(ACTXT_CAST ctxt, + /* TODO: error code */ + XML_SCHEMAP_COS_ALL_LIMITED, + WXS_ITEM_NODE(WXS_TYPE_PARTICLE(typeDef)), NULL, + "The particle's {max occurs} must be 1, since the " + "reference resolves to an 'all' model group", + NULL, NULL); + } + } + } + } +} + + + +/** + * xmlSchemaCheckSTPropsCorrect: + * @ctxt: the schema parser context + * @type: the simple type definition + * + * Checks st-props-correct. + * + * Returns 0 if the properties are correct, + * if not, a positive error code and -1 on internal + * errors. + */ +static int +xmlSchemaCheckSTPropsCorrect(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaTypePtr type) +{ + xmlSchemaTypePtr baseType = type->baseType; + xmlChar *str = NULL; + + /* STATE: error funcs converted. */ + /* + * Schema Component Constraint: Simple Type Definition Properties Correct + * + * NOTE: This is somehow redundant, since we actually built a simple type + * to have all the needed information; this acts as an self test. + */ + /* Base type: If the datatype has been �derived� by �restriction� + * then the Simple Type Definition component from which it is �derived�, + * otherwise the Simple Type Definition for anySimpleType (�4.1.6). + */ + if (baseType == NULL) { + /* + * TODO: Think about: "modulo the impact of Missing + * Sub-components (�5.3)." + */ + xmlSchemaPCustomErr(ctxt, + XML_SCHEMAP_ST_PROPS_CORRECT_1, + WXS_BASIC_CAST type, NULL, + "No base type existent", NULL); + return (XML_SCHEMAP_ST_PROPS_CORRECT_1); + + } + if (! WXS_IS_SIMPLE(baseType)) { + xmlSchemaPCustomErr(ctxt, + XML_SCHEMAP_ST_PROPS_CORRECT_1, + WXS_BASIC_CAST type, NULL, + "The base type '%s' is not a simple type", + xmlSchemaGetComponentQName(&str, baseType)); + FREE_AND_NULL(str) + return (XML_SCHEMAP_ST_PROPS_CORRECT_1); + } + if ((WXS_IS_LIST(type) || WXS_IS_UNION(type)) && + (WXS_IS_RESTRICTION(type) == 0) && + ((! WXS_IS_ANY_SIMPLE_TYPE(baseType)) && + (baseType->type != XML_SCHEMA_TYPE_SIMPLE))) { + xmlSchemaPCustomErr(ctxt, + XML_SCHEMAP_ST_PROPS_CORRECT_1, + WXS_BASIC_CAST type, NULL, + "A type, derived by list or union, must have " + "the simple ur-type definition as base type, not '%s'", + xmlSchemaGetComponentQName(&str, baseType)); + FREE_AND_NULL(str) + return (XML_SCHEMAP_ST_PROPS_CORRECT_1); + } + /* + * Variety: One of {atomic, list, union}. + */ + if ((! WXS_IS_ATOMIC(type)) && (! WXS_IS_UNION(type)) && + (! WXS_IS_LIST(type))) { + xmlSchemaPCustomErr(ctxt, + XML_SCHEMAP_ST_PROPS_CORRECT_1, + WXS_BASIC_CAST type, NULL, + "The variety is absent", NULL); + return (XML_SCHEMAP_ST_PROPS_CORRECT_1); + } + /* TODO: Finish this. Hmm, is this finished? */ + + /* + * 3 The {final} of the {base type definition} must not contain restriction. + */ + if (xmlSchemaTypeFinalContains(baseType, + XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) { + xmlSchemaPCustomErr(ctxt, + XML_SCHEMAP_ST_PROPS_CORRECT_3, + WXS_BASIC_CAST type, NULL, + "The 'final' of its base type '%s' must not contain " + "'restriction'", + xmlSchemaGetComponentQName(&str, baseType)); + FREE_AND_NULL(str) + return (XML_SCHEMAP_ST_PROPS_CORRECT_3); + } + + /* + * 2 All simple type definitions must be derived ultimately from the �simple + * ur-type definition (so� circular definitions are disallowed). That is, it + * must be possible to reach a built-in primitive datatype or the �simple + * ur-type definition� by repeatedly following the {base type definition}. + * + * NOTE: this is done in xmlSchemaCheckTypeDefCircular(). + */ + return (0); +} + +/** + * xmlSchemaCheckCOSSTRestricts: + * @ctxt: the schema parser context + * @type: the simple type definition + * + * Schema Component Constraint: + * Derivation Valid (Restriction, Simple) (cos-st-restricts) + + * Checks if the given @type (simpleType) is derived validly by restriction. + * STATUS: + * + * Returns -1 on internal errors, 0 if the type is validly derived, + * a positive error code otherwise. + */ +static int +xmlSchemaCheckCOSSTRestricts(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaTypePtr type) +{ + xmlChar *str = NULL; + + if (type->type != XML_SCHEMA_TYPE_SIMPLE) { + PERROR_INT("xmlSchemaCheckCOSSTRestricts", + "given type is not a user-derived simpleType"); + return (-1); + } + + if (WXS_IS_ATOMIC(type)) { + xmlSchemaTypePtr primitive; + /* + * 1.1 The {base type definition} must be an atomic simple + * type definition or a built-in primitive datatype. + */ + if (! WXS_IS_ATOMIC(type->baseType)) { + xmlSchemaPCustomErr(pctxt, + XML_SCHEMAP_COS_ST_RESTRICTS_1_1, + WXS_BASIC_CAST type, NULL, + "The base type '%s' is not an atomic simple type", + xmlSchemaGetComponentQName(&str, type->baseType)); + FREE_AND_NULL(str) + return (XML_SCHEMAP_COS_ST_RESTRICTS_1_1); + } + /* 1.2 The {final} of the {base type definition} must not contain + * restriction. + */ + /* OPTIMIZE TODO : This is already done in xmlSchemaCheckStPropsCorrect */ + if (xmlSchemaTypeFinalContains(type->baseType, + XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) { + xmlSchemaPCustomErr(pctxt, + XML_SCHEMAP_COS_ST_RESTRICTS_1_2, + WXS_BASIC_CAST type, NULL, + "The final of its base type '%s' must not contain 'restriction'", + xmlSchemaGetComponentQName(&str, type->baseType)); + FREE_AND_NULL(str) + return (XML_SCHEMAP_COS_ST_RESTRICTS_1_2); + } + + /* + * 1.3.1 DF must be an allowed constraining facet for the {primitive + * type definition}, as specified in the appropriate subsection of 3.2 + * Primitive datatypes. + */ + if (type->facets != NULL) { + xmlSchemaFacetPtr facet; + int ok = 1; + + primitive = xmlSchemaGetPrimitiveType(type); + if (primitive == NULL) { + PERROR_INT("xmlSchemaCheckCOSSTRestricts", + "failed to get primitive type"); + return (-1); + } + facet = type->facets; + do { + if (xmlSchemaIsBuiltInTypeFacet(primitive, facet->type) == 0) { + ok = 0; + xmlSchemaPIllegalFacetAtomicErr(pctxt, + XML_SCHEMAP_COS_ST_RESTRICTS_1_3_1, + type, primitive, facet); + } + facet = facet->next; + } while (facet != NULL); + if (ok == 0) + return (XML_SCHEMAP_COS_ST_RESTRICTS_1_3_1); + } + /* + * SPEC (1.3.2) "If there is a facet of the same kind in the {facets} + * of the {base type definition} (call this BF),then the DF's {value} + * must be a valid restriction of BF's {value} as defined in + * [XML Schemas: Datatypes]." + * + * NOTE (1.3.2) Facet derivation constraints are currently handled in + * xmlSchemaDeriveAndValidateFacets() + */ + } else if (WXS_IS_LIST(type)) { + xmlSchemaTypePtr itemType = NULL; + + itemType = type->subtypes; + if ((itemType == NULL) || (! WXS_IS_SIMPLE(itemType))) { + PERROR_INT("xmlSchemaCheckCOSSTRestricts", + "failed to evaluate the item type"); + return (-1); + } + if (WXS_IS_TYPE_NOT_FIXED(itemType)) + xmlSchemaTypeFixup(itemType, ACTXT_CAST pctxt); + /* + * 2.1 The {item type definition} must have a {variety} of atomic or + * union (in which case all the {member type definitions} + * must be atomic). + */ + if ((! WXS_IS_ATOMIC(itemType)) && + (! WXS_IS_UNION(itemType))) { + xmlSchemaPCustomErr(pctxt, + XML_SCHEMAP_COS_ST_RESTRICTS_2_1, + WXS_BASIC_CAST type, NULL, + "The item type '%s' does not have a variety of atomic or union", + xmlSchemaGetComponentQName(&str, itemType)); + FREE_AND_NULL(str) + return (XML_SCHEMAP_COS_ST_RESTRICTS_2_1); + } else if (WXS_IS_UNION(itemType)) { + xmlSchemaTypeLinkPtr member; + + member = itemType->memberTypes; + while (member != NULL) { + if (! WXS_IS_ATOMIC(member->type)) { + xmlSchemaPCustomErr(pctxt, + XML_SCHEMAP_COS_ST_RESTRICTS_2_1, + WXS_BASIC_CAST type, NULL, + "The item type is a union type, but the " + "member type '%s' of this item type is not atomic", + xmlSchemaGetComponentQName(&str, member->type)); + FREE_AND_NULL(str) + return (XML_SCHEMAP_COS_ST_RESTRICTS_2_1); + } + member = member->next; + } + } + + if (WXS_IS_ANY_SIMPLE_TYPE(type->baseType)) { + xmlSchemaFacetPtr facet; + /* + * This is the case if we have: facets != NULL) { + facet = type->facets; + do { + if (facet->type != XML_SCHEMA_FACET_WHITESPACE) { + xmlSchemaPIllegalFacetListUnionErr(pctxt, + XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_2, + type, facet); + return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_2); + } + facet = facet->next; + } while (facet != NULL); + } + /* + * MAYBE TODO: (Hmm, not really) Datatypes states: + * A �list� datatype can be �derived� from an �atomic� datatype + * whose �lexical space� allows space (such as string or anyURI)or + * a �union� datatype any of whose {member type definitions}'s + * �lexical space� allows space. + */ + } else { + /* + * This is the case if we have: baseType)) { + xmlSchemaPCustomErr(pctxt, + XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_1, + WXS_BASIC_CAST type, NULL, + "The base type '%s' must be a list type", + xmlSchemaGetComponentQName(&str, type->baseType)); + FREE_AND_NULL(str) + return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_1); + } + /* + * 2.3.2.2 The {final} of the {base type definition} must not + * contain restriction. + */ + if (xmlSchemaTypeFinalContains(type->baseType, + XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) { + xmlSchemaPCustomErr(pctxt, + XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_2, + WXS_BASIC_CAST type, NULL, + "The 'final' of the base type '%s' must not contain 'restriction'", + xmlSchemaGetComponentQName(&str, type->baseType)); + FREE_AND_NULL(str) + return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_2); + } + /* + * 2.3.2.3 The {item type definition} must be validly derived + * from the {base type definition}'s {item type definition} given + * the empty set, as defined in Type Derivation OK (Simple) (�3.14.6). + */ + { + xmlSchemaTypePtr baseItemType; + + baseItemType = type->baseType->subtypes; + if ((baseItemType == NULL) || (! WXS_IS_SIMPLE(baseItemType))) { + PERROR_INT("xmlSchemaCheckCOSSTRestricts", + "failed to eval the item type of a base type"); + return (-1); + } + if ((itemType != baseItemType) && + (xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST pctxt, itemType, + baseItemType, 0) != 0)) { + xmlChar *strBIT = NULL, *strBT = NULL; + xmlSchemaPCustomErrExt(pctxt, + XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_3, + WXS_BASIC_CAST type, NULL, + "The item type '%s' is not validly derived from " + "the item type '%s' of the base type '%s'", + xmlSchemaGetComponentQName(&str, itemType), + xmlSchemaGetComponentQName(&strBIT, baseItemType), + xmlSchemaGetComponentQName(&strBT, type->baseType)); + + FREE_AND_NULL(str) + FREE_AND_NULL(strBIT) + FREE_AND_NULL(strBT) + return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_3); + } + } + + if (type->facets != NULL) { + xmlSchemaFacetPtr facet; + int ok = 1; + /* + * 2.3.2.4 Only length, minLength, maxLength, whiteSpace, pattern + * and enumeration facet components are allowed among the {facets}. + */ + facet = type->facets; + do { + switch (facet->type) { + case XML_SCHEMA_FACET_LENGTH: + case XML_SCHEMA_FACET_MINLENGTH: + case XML_SCHEMA_FACET_MAXLENGTH: + case XML_SCHEMA_FACET_WHITESPACE: + /* + * TODO: 2.5.1.2 List datatypes + * The value of �whiteSpace� is fixed to the value collapse. + */ + case XML_SCHEMA_FACET_PATTERN: + case XML_SCHEMA_FACET_ENUMERATION: + break; + default: { + xmlSchemaPIllegalFacetListUnionErr(pctxt, + XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_4, + type, facet); + /* + * We could return, but it's nicer to report all + * invalid facets. + */ + ok = 0; + } + } + facet = facet->next; + } while (facet != NULL); + if (ok == 0) + return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_4); + /* + * SPEC (2.3.2.5) (same as 1.3.2) + * + * NOTE (2.3.2.5) This is currently done in + * xmlSchemaDeriveAndValidateFacets() + */ + } + } + } else if (WXS_IS_UNION(type)) { + /* + * 3.1 The {member type definitions} must all have {variety} of + * atomic or list. + */ + xmlSchemaTypeLinkPtr member; + + member = type->memberTypes; + while (member != NULL) { + if (WXS_IS_TYPE_NOT_FIXED(member->type)) + xmlSchemaTypeFixup(member->type, ACTXT_CAST pctxt); + + if ((! WXS_IS_ATOMIC(member->type)) && + (! WXS_IS_LIST(member->type))) { + xmlSchemaPCustomErr(pctxt, + XML_SCHEMAP_COS_ST_RESTRICTS_3_1, + WXS_BASIC_CAST type, NULL, + "The member type '%s' is neither an atomic, nor a list type", + xmlSchemaGetComponentQName(&str, member->type)); + FREE_AND_NULL(str) + return (XML_SCHEMAP_COS_ST_RESTRICTS_3_1); + } + member = member->next; + } + /* + * 3.3.1 If the {base type definition} is the �simple ur-type + * definition� + */ + if (type->baseType->builtInType == XML_SCHEMAS_ANYSIMPLETYPE) { + /* + * 3.3.1.1 All of the {member type definitions} must have a + * {final} which does not contain union. + */ + member = type->memberTypes; + while (member != NULL) { + if (xmlSchemaTypeFinalContains(member->type, + XML_SCHEMAS_TYPE_FINAL_UNION)) { + xmlSchemaPCustomErr(pctxt, + XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1, + WXS_BASIC_CAST type, NULL, + "The 'final' of member type '%s' contains 'union'", + xmlSchemaGetComponentQName(&str, member->type)); + FREE_AND_NULL(str) + return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1); + } + member = member->next; + } + /* + * 3.3.1.2 The {facets} must be empty. + */ + if (type->facetSet != NULL) { + xmlSchemaPCustomErr(pctxt, + XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1_2, + WXS_BASIC_CAST type, NULL, + "No facets allowed", NULL); + return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1_2); + } + } else { + /* + * 3.3.2.1 The {base type definition} must have a {variety} of union. + * I.e. the variety of "list" is inherited. + */ + if (! WXS_IS_UNION(type->baseType)) { + xmlSchemaPCustomErr(pctxt, + XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_1, + WXS_BASIC_CAST type, NULL, + "The base type '%s' is not a union type", + xmlSchemaGetComponentQName(&str, type->baseType)); + FREE_AND_NULL(str) + return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_1); + } + /* + * 3.3.2.2 The {final} of the {base type definition} must not contain restriction. + */ + if (xmlSchemaTypeFinalContains(type->baseType, + XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) { + xmlSchemaPCustomErr(pctxt, + XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_2, + WXS_BASIC_CAST type, NULL, + "The 'final' of its base type '%s' must not contain 'restriction'", + xmlSchemaGetComponentQName(&str, type->baseType)); + FREE_AND_NULL(str) + return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_2); + } + /* + * 3.3.2.3 The {member type definitions}, in order, must be validly + * derived from the corresponding type definitions in the {base + * type definition}'s {member type definitions} given the empty set, + * as defined in Type Derivation OK (Simple) (�3.14.6). + */ + { + xmlSchemaTypeLinkPtr baseMember; + + /* + * OPTIMIZE: if the type is restricting, it has no local defined + * member types and inherits the member types of the base type; + * thus a check for equality can be skipped. + */ + /* + * Even worse: I cannot see a scenario where a restricting + * union simple type can have other member types as the member + * types of it's base type. This check seems not necessary with + * respect to the derivation process in libxml2. + * But necessary if constructing types with an API. + */ + if (type->memberTypes != NULL) { + member = type->memberTypes; + baseMember = xmlSchemaGetUnionSimpleTypeMemberTypes(type->baseType); + if ((member == NULL) && (baseMember != NULL)) { + PERROR_INT("xmlSchemaCheckCOSSTRestricts", + "different number of member types in base"); + } + while (member != NULL) { + if (baseMember == NULL) { + PERROR_INT("xmlSchemaCheckCOSSTRestricts", + "different number of member types in base"); + } else if ((member->type != baseMember->type) && + (xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST pctxt, + member->type, baseMember->type, 0) != 0)) { + xmlChar *strBMT = NULL, *strBT = NULL; + + xmlSchemaPCustomErrExt(pctxt, + XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_3, + WXS_BASIC_CAST type, NULL, + "The member type %s is not validly " + "derived from its corresponding member " + "type %s of the base type %s", + xmlSchemaGetComponentQName(&str, member->type), + xmlSchemaGetComponentQName(&strBMT, baseMember->type), + xmlSchemaGetComponentQName(&strBT, type->baseType)); + FREE_AND_NULL(str) + FREE_AND_NULL(strBMT) + FREE_AND_NULL(strBT) + return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_3); + } + member = member->next; + if (baseMember != NULL) + baseMember = baseMember->next; + } + } + } + /* + * 3.3.2.4 Only pattern and enumeration facet components are + * allowed among the {facets}. + */ + if (type->facets != NULL) { + xmlSchemaFacetPtr facet; + int ok = 1; + + facet = type->facets; + do { + if ((facet->type != XML_SCHEMA_FACET_PATTERN) && + (facet->type != XML_SCHEMA_FACET_ENUMERATION)) { + xmlSchemaPIllegalFacetListUnionErr(pctxt, + XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_4, + type, facet); + ok = 0; + } + facet = facet->next; + } while (facet != NULL); + if (ok == 0) + return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_4); + + } + /* + * SPEC (3.3.2.5) (same as 1.3.2) + * + * NOTE (3.3.2.5) This is currently done in + * xmlSchemaDeriveAndValidateFacets() + */ + } + } + + return (0); +} + +/** + * xmlSchemaCheckSRCSimpleType: + * @ctxt: the schema parser context + * @type: the simple type definition + * + * Checks crc-simple-type constraints. + * + * Returns 0 if the constraints are satisfied, + * if not a positive error code and -1 on internal + * errors. + */ +#if 0 +static int +xmlSchemaCheckSRCSimpleType(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaTypePtr type) +{ + /* + * src-simple-type.1 The corresponding simple type definition, if any, + * must satisfy the conditions set out in Constraints on Simple Type + * Definition Schema Components (�3.14.6). + */ + if (WXS_IS_RESTRICTION(type)) { + /* + * src-simple-type.2 "If the alternative is chosen, + * either it must have a base [attribute] or a among its + * [children], but not both." + * NOTE: This is checked in the parse function of . + */ + /* + * + */ + } else if (WXS_IS_LIST(type)) { + /* src-simple-type.3 "If the alternative is chosen, either it must have + * an itemType [attribute] or a among its [children], + * but not both." + * + * NOTE: This is checked in the parse function of . + */ + } else if (WXS_IS_UNION(type)) { + /* + * src-simple-type.4 is checked in xmlSchemaCheckUnionTypeDefCircular(). + */ + } + return (0); +} +#endif + +static int +xmlSchemaCreateVCtxtOnPCtxt(xmlSchemaParserCtxtPtr ctxt) +{ + if (ctxt->vctxt == NULL) { + ctxt->vctxt = xmlSchemaNewValidCtxt(NULL); + if (ctxt->vctxt == NULL) { + xmlSchemaPErr(ctxt, NULL, + XML_SCHEMAP_INTERNAL, + "Internal error: xmlSchemaCreateVCtxtOnPCtxt, " + "failed to create a temp. validation context.\n", + NULL, NULL); + return (-1); + } + /* TODO: Pass user data. */ + xmlSchemaSetValidErrors(ctxt->vctxt, + ctxt->error, ctxt->warning, ctxt->errCtxt); + xmlSchemaSetValidStructuredErrors(ctxt->vctxt, + ctxt->serror, ctxt->errCtxt); + } + return (0); +} + +static int +xmlSchemaVCheckCVCSimpleType(xmlSchemaAbstractCtxtPtr actxt, + xmlNodePtr node, + xmlSchemaTypePtr type, + const xmlChar *value, + xmlSchemaValPtr *retVal, + int fireErrors, + int normalize, + int isNormalized); + +/** + * xmlSchemaParseCheckCOSValidDefault: + * @pctxt: the schema parser context + * @type: the simple type definition + * @value: the default value + * @node: an optional node (the holder of the value) + * + * Schema Component Constraint: Element Default Valid (Immediate) + * (cos-valid-default) + * This will be used by the parser only. For the validator there's + * an other version. + * + * Returns 0 if the constraints are satisfied, + * if not, a positive error code and -1 on internal + * errors. + */ +static int +xmlSchemaParseCheckCOSValidDefault(xmlSchemaParserCtxtPtr pctxt, + xmlNodePtr node, + xmlSchemaTypePtr type, + const xmlChar *value, + xmlSchemaValPtr *val) +{ + int ret = 0; + + /* + * cos-valid-default: + * Schema Component Constraint: Element Default Valid (Immediate) + * For a string to be a valid default with respect to a type + * definition the appropriate case among the following must be true: + */ + if WXS_IS_COMPLEX(type) { + /* + * Complex type. + * + * SPEC (2.1) "its {content type} must be a simple type definition + * or mixed." + * SPEC (2.2.2) "If the {content type} is mixed, then the {content + * type}'s particle must be �emptiable� as defined by + * Particle Emptiable (�3.9.6)." + */ + if ((! WXS_HAS_SIMPLE_CONTENT(type)) && + ((! WXS_HAS_MIXED_CONTENT(type)) || (! WXS_EMPTIABLE(type)))) { + /* NOTE that this covers (2.2.2) as well. */ + xmlSchemaPCustomErr(pctxt, + XML_SCHEMAP_COS_VALID_DEFAULT_2_1, + WXS_BASIC_CAST type, type->node, + "For a string to be a valid default, the type definition " + "must be a simple type or a complex type with mixed content " + "and a particle emptiable", NULL); + return(XML_SCHEMAP_COS_VALID_DEFAULT_2_1); + } + } + /* + * 1 If the type definition is a simple type definition, then the string + * must be �valid� with respect to that definition as defined by String + * Valid (�3.14.4). + * + * AND + * + * 2.2.1 If the {content type} is a simple type definition, then the + * string must be �valid� with respect to that simple type definition + * as defined by String Valid (�3.14.4). + */ + if (WXS_IS_SIMPLE(type)) + ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST pctxt, node, + type, value, val, 1, 1, 0); + else if (WXS_HAS_SIMPLE_CONTENT(type)) + ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST pctxt, node, + type->contentTypeDef, value, val, 1, 1, 0); + else + return (ret); + + if (ret < 0) { + PERROR_INT("xmlSchemaParseCheckCOSValidDefault", + "calling xmlSchemaVCheckCVCSimpleType()"); + } + + return (ret); +} + +/** + * xmlSchemaCheckCTPropsCorrect: + * @ctxt: the schema parser context + * @type: the complex type definition + * + *.(4.6) Constraints on Complex Type Definition Schema Components + * Schema Component Constraint: + * Complex Type Definition Properties Correct (ct-props-correct) + * STATUS: (seems) complete + * + * Returns 0 if the constraints are satisfied, a positive + * error code if not and -1 if an internal error occured. + */ +static int +xmlSchemaCheckCTPropsCorrect(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaTypePtr type) +{ + /* + * TODO: Correct the error code; XML_SCHEMAP_SRC_CT_1 is used temporarily. + * + * SPEC (1) "The values of the properties of a complex type definition must + * be as described in the property tableau in The Complex Type Definition + * Schema Component (�3.4.1), modulo the impact of Missing + * Sub-components (�5.3)." + */ + if ((type->baseType != NULL) && + (WXS_IS_SIMPLE(type->baseType)) && + (WXS_IS_EXTENSION(type) == 0)) { + /* + * SPEC (2) "If the {base type definition} is a simple type definition, + * the {derivation method} must be extension." + */ + xmlSchemaCustomErr(ACTXT_CAST pctxt, + XML_SCHEMAP_SRC_CT_1, + NULL, WXS_BASIC_CAST type, + "If the base type is a simple type, the derivation method must be " + "'extension'", NULL, NULL); + return (XML_SCHEMAP_SRC_CT_1); + } + /* + * SPEC (3) "Circular definitions are disallowed, except for the �ur-type + * definition�. That is, it must be possible to reach the �ur-type + * definition by repeatedly following the {base type definition}." + * + * NOTE (3) is done in xmlSchemaCheckTypeDefCircular(). + */ + /* + * NOTE that (4) and (5) need the following: + * - attribute uses need to be already inherited (apply attr. prohibitions) + * - attribute group references need to be expanded already + * - simple types need to be typefixed already + */ + if (type->attrUses && + (((xmlSchemaItemListPtr) type->attrUses)->nbItems > 1)) + { + xmlSchemaItemListPtr uses = (xmlSchemaItemListPtr) type->attrUses; + xmlSchemaAttributeUsePtr use, tmp; + int i, j, hasId = 0; + + for (i = uses->nbItems -1; i >= 0; i--) { + use = uses->items[i]; + + /* + * SPEC ct-props-correct + * (4) "Two distinct attribute declarations in the + * {attribute uses} must not have identical {name}s and + * {target namespace}s." + */ + if (i > 0) { + for (j = i -1; j >= 0; j--) { + tmp = uses->items[j]; + if ((WXS_ATTRUSE_DECL_NAME(use) == + WXS_ATTRUSE_DECL_NAME(tmp)) && + (WXS_ATTRUSE_DECL_TNS(use) == + WXS_ATTRUSE_DECL_TNS(tmp))) + { + xmlChar *str = NULL; + + xmlSchemaCustomErr(ACTXT_CAST pctxt, + XML_SCHEMAP_AG_PROPS_CORRECT, + NULL, WXS_BASIC_CAST type, + "Duplicate %s", + xmlSchemaGetComponentDesignation(&str, use), + NULL); + FREE_AND_NULL(str); + /* + * Remove the duplicate. + */ + if (xmlSchemaItemListRemove(uses, i) == -1) + goto exit_failure; + goto next_use; + } + } + } + /* + * SPEC ct-props-correct + * (5) "Two distinct attribute declarations in the + * {attribute uses} must not have {type definition}s which + * are or are derived from ID." + */ + if (WXS_ATTRUSE_TYPEDEF(use) != NULL) { + if (xmlSchemaIsDerivedFromBuiltInType( + WXS_ATTRUSE_TYPEDEF(use), XML_SCHEMAS_ID)) + { + if (hasId) { + xmlChar *str = NULL; + + xmlSchemaCustomErr(ACTXT_CAST pctxt, + XML_SCHEMAP_AG_PROPS_CORRECT, + NULL, WXS_BASIC_CAST type, + "There must not exist more than one attribute " + "declaration of type 'xs:ID' " + "(or derived from 'xs:ID'). The %s violates this " + "constraint", + xmlSchemaGetComponentDesignation(&str, use), + NULL); + FREE_AND_NULL(str); + if (xmlSchemaItemListRemove(uses, i) == -1) + goto exit_failure; + } + + hasId = 1; + } + } +next_use: {} + } + } + return (0); +exit_failure: + return(-1); +} + +static int +xmlSchemaAreEqualTypes(xmlSchemaTypePtr typeA, + xmlSchemaTypePtr typeB) +{ + /* + * TODO: This should implement component-identity + * in the future. + */ + if ((typeA == NULL) || (typeB == NULL)) + return (0); + return (typeA == typeB); +} + +/** + * xmlSchemaCheckCOSCTDerivedOK: + * @ctxt: the schema parser context + * @type: the to-be derived complex type definition + * @baseType: the base complex type definition + * @set: the given set + * + * Schema Component Constraint: + * Type Derivation OK (Complex) (cos-ct-derived-ok) + * + * STATUS: completed + * + * Returns 0 if the constraints are satisfied, or 1 + * if not. + */ +static int +xmlSchemaCheckCOSCTDerivedOK(xmlSchemaAbstractCtxtPtr actxt, + xmlSchemaTypePtr type, + xmlSchemaTypePtr baseType, + int set) +{ + int equal = xmlSchemaAreEqualTypes(type, baseType); + /* TODO: Error codes. */ + /* + * SPEC "For a complex type definition (call it D, for derived) + * to be validly derived from a type definition (call this + * B, for base) given a subset of {extension, restriction} + * all of the following must be true:" + */ + if (! equal) { + /* + * SPEC (1) "If B and D are not the same type definition, then the + * {derivation method} of D must not be in the subset." + */ + if (((set & SUBSET_EXTENSION) && (WXS_IS_EXTENSION(type))) || + ((set & SUBSET_RESTRICTION) && (WXS_IS_RESTRICTION(type)))) + return (1); + } else { + /* + * SPEC (2.1) "B and D must be the same type definition." + */ + return (0); + } + /* + * SPEC (2.2) "B must be D's {base type definition}." + */ + if (type->baseType == baseType) + return (0); + /* + * SPEC (2.3.1) "D's {base type definition} must not be the �ur-type + * definition�." + */ + if (WXS_IS_ANYTYPE(type->baseType)) + return (1); + + if (WXS_IS_COMPLEX(type->baseType)) { + /* + * SPEC (2.3.2.1) "If D's {base type definition} is complex, then it + * must be validly derived from B given the subset as defined by this + * constraint." + */ + return (xmlSchemaCheckCOSCTDerivedOK(actxt, type->baseType, + baseType, set)); + } else { + /* + * SPEC (2.3.2.2) "If D's {base type definition} is simple, then it + * must be validly derived from B given the subset as defined in Type + * Derivation OK (Simple) (�3.14.6). + */ + return (xmlSchemaCheckCOSSTDerivedOK(actxt, type->baseType, + baseType, set)); + } +} + +/** + * xmlSchemaCheckCOSDerivedOK: + * @type: the derived simple type definition + * @baseType: the base type definition + * + * Calls: + * Type Derivation OK (Simple) AND Type Derivation OK (Complex) + * + * Checks wheter @type can be validly derived from @baseType. + * + * Returns 0 on success, an positive error code otherwise. + */ +static int +xmlSchemaCheckCOSDerivedOK(xmlSchemaAbstractCtxtPtr actxt, + xmlSchemaTypePtr type, + xmlSchemaTypePtr baseType, + int set) +{ + if (WXS_IS_SIMPLE(type)) + return (xmlSchemaCheckCOSSTDerivedOK(actxt, type, baseType, set)); + else + return (xmlSchemaCheckCOSCTDerivedOK(actxt, type, baseType, set)); +} + +/** + * xmlSchemaCheckCOSCTExtends: + * @ctxt: the schema parser context + * @type: the complex type definition + * + * (3.4.6) Constraints on Complex Type Definition Schema Components + * Schema Component Constraint: + * Derivation Valid (Extension) (cos-ct-extends) + * + * STATUS: + * missing: + * (1.5) + * (1.4.3.2.2.2) "Particle Valid (Extension)" + * + * Returns 0 if the constraints are satisfied, a positive + * error code if not and -1 if an internal error occured. + */ +static int +xmlSchemaCheckCOSCTExtends(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaTypePtr type) +{ + xmlSchemaTypePtr base = type->baseType; + /* + * TODO: Correct the error code; XML_SCHEMAP_COS_CT_EXTENDS_1_1 is used + * temporarily only. + */ + /* + * SPEC (1) "If the {base type definition} is a complex type definition, + * then all of the following must be true:" + */ + if (WXS_IS_COMPLEX(base)) { + /* + * SPEC (1.1) "The {final} of the {base type definition} must not + * contain extension." + */ + if (base->flags & XML_SCHEMAS_TYPE_FINAL_EXTENSION) { + xmlSchemaPCustomErr(ctxt, + XML_SCHEMAP_COS_CT_EXTENDS_1_1, + WXS_BASIC_CAST type, NULL, + "The 'final' of the base type definition " + "contains 'extension'", NULL); + return (XML_SCHEMAP_COS_CT_EXTENDS_1_1); + } + + /* + * ATTENTION: The constrains (1.2) and (1.3) are not applied, + * since they are automatically satisfied through the + * inheriting mechanism. + * Note that even if redefining components, the inheriting mechanism + * is used. + */ +#if 0 + /* + * SPEC (1.2) "Its {attribute uses} must be a subset of the {attribute + * uses} + * of the complex type definition itself, that is, for every attribute + * use in the {attribute uses} of the {base type definition}, there + * must be an attribute use in the {attribute uses} of the complex + * type definition itself whose {attribute declaration} has the same + * {name}, {target namespace} and {type definition} as its attribute + * declaration" + */ + if (base->attrUses != NULL) { + int i, j, found; + xmlSchemaAttributeUsePtr use, buse; + + for (i = 0; i < (WXS_LIST_CAST base->attrUses)->nbItems; i ++) { + buse = (WXS_LIST_CAST base->attrUses)->items[i]; + found = 0; + if (type->attrUses != NULL) { + use = (WXS_LIST_CAST type->attrUses)->items[j]; + for (j = 0; j < (WXS_LIST_CAST type->attrUses)->nbItems; j ++) + { + if ((WXS_ATTRUSE_DECL_NAME(use) == + WXS_ATTRUSE_DECL_NAME(buse)) && + (WXS_ATTRUSE_DECL_TNS(use) == + WXS_ATTRUSE_DECL_TNS(buse)) && + (WXS_ATTRUSE_TYPEDEF(use) == + WXS_ATTRUSE_TYPEDEF(buse)) + { + found = 1; + break; + } + } + } + if (! found) { + xmlChar *str = NULL; + + xmlSchemaCustomErr(ACTXT_CAST ctxt, + XML_SCHEMAP_COS_CT_EXTENDS_1_2, + NULL, WXS_BASIC_CAST type, + /* + * TODO: The report does not indicate that also the + * type needs to be the same. + */ + "This type is missing a matching correspondent " + "for its {base type}'s %s in its {attribute uses}", + xmlSchemaGetComponentDesignation(&str, + buse->children), + NULL); + FREE_AND_NULL(str) + } + } + } + /* + * SPEC (1.3) "If it has an {attribute wildcard}, the complex type + * definition must also have one, and the base type definition's + * {attribute wildcard}'s {namespace constraint} must be a subset + * of the complex type definition's {attribute wildcard}'s {namespace + * constraint}, as defined by Wildcard Subset (�3.10.6)." + */ + + /* + * MAYBE TODO: Enable if ever needed. But this will be needed only + * if created the type via a schema construction API. + */ + if (base->attributeWildcard != NULL) { + if (type->attributeWilcard == NULL) { + xmlChar *str = NULL; + + xmlSchemaCustomErr(ACTXT_CAST pctxt, + XML_SCHEMAP_COS_CT_EXTENDS_1_3, + NULL, type, + "The base %s has an attribute wildcard, " + "but this type is missing an attribute wildcard", + xmlSchemaGetComponentDesignation(&str, base)); + FREE_AND_NULL(str) + + } else if (xmlSchemaCheckCOSNSSubset( + base->attributeWildcard, type->attributeWildcard)) + { + xmlChar *str = NULL; + + xmlSchemaCustomErr(ACTXT_CAST pctxt, + XML_SCHEMAP_COS_CT_EXTENDS_1_3, + NULL, type, + "The attribute wildcard is not a valid " + "superset of the one in the base %s", + xmlSchemaGetComponentDesignation(&str, base)); + FREE_AND_NULL(str) + } + } +#endif + /* + * SPEC (1.4) "One of the following must be true:" + */ + if ((type->contentTypeDef != NULL) && + (type->contentTypeDef == base->contentTypeDef)) { + /* + * SPEC (1.4.1) "The {content type} of the {base type definition} + * and the {content type} of the complex type definition itself + * must be the same simple type definition" + * PASS + */ + } else if ((type->contentType == XML_SCHEMA_CONTENT_EMPTY) && + (base->contentType == XML_SCHEMA_CONTENT_EMPTY) ) { + /* + * SPEC (1.4.2) "The {content type} of both the {base type + * definition} and the complex type definition itself must + * be empty." + * PASS + */ + } else { + /* + * SPEC (1.4.3) "All of the following must be true:" + */ + if (type->subtypes == NULL) { + /* + * SPEC 1.4.3.1 The {content type} of the complex type + * definition itself must specify a particle. + */ + xmlSchemaPCustomErr(ctxt, + XML_SCHEMAP_COS_CT_EXTENDS_1_1, + WXS_BASIC_CAST type, NULL, + "The content type must specify a particle", NULL); + return (XML_SCHEMAP_COS_CT_EXTENDS_1_1); + } + /* + * SPEC (1.4.3.2) "One of the following must be true:" + */ + if (base->contentType == XML_SCHEMA_CONTENT_EMPTY) { + /* + * SPEC (1.4.3.2.1) "The {content type} of the {base type + * definition} must be empty. + * PASS + */ + } else { + /* + * SPEC (1.4.3.2.2) "All of the following must be true:" + */ + if ((type->contentType != base->contentType) || + ((type->contentType != XML_SCHEMA_CONTENT_MIXED) && + (type->contentType != XML_SCHEMA_CONTENT_ELEMENTS))) { + /* + * SPEC (1.4.3.2.2.1) "Both {content type}s must be mixed + * or both must be element-only." + */ + xmlSchemaPCustomErr(ctxt, + XML_SCHEMAP_COS_CT_EXTENDS_1_1, + WXS_BASIC_CAST type, NULL, + "The content type of both, the type and its base " + "type, must either 'mixed' or 'element-only'", NULL); + return (XML_SCHEMAP_COS_CT_EXTENDS_1_1); + } + /* + * URGENT TODO SPEC (1.4.3.2.2.2) "The particle of the + * complex type definition must be a �valid extension� + * of the {base type definition}'s particle, as defined + * in Particle Valid (Extension) (�3.9.6)." + * + * NOTE that we won't check "Particle Valid (Extension)", + * since it is ensured by the derivation process in + * xmlSchemaTypeFixup(). We need to implement this when heading + * for a construction API + * TODO: !! This is needed to be checked if redefining a type !! + */ + } + /* + * URGENT TODO (1.5) + */ + } + } else { + /* + * SPEC (2) "If the {base type definition} is a simple type definition, + * then all of the following must be true:" + */ + if (type->contentTypeDef != base) { + /* + * SPEC (2.1) "The {content type} must be the same simple type + * definition." + */ + xmlSchemaPCustomErr(ctxt, + XML_SCHEMAP_COS_CT_EXTENDS_1_1, + WXS_BASIC_CAST type, NULL, + "The content type must be the simple base type", NULL); + return (XML_SCHEMAP_COS_CT_EXTENDS_1_1); + } + if (base->flags & XML_SCHEMAS_TYPE_FINAL_EXTENSION) { + /* + * SPEC (2.2) "The {final} of the {base type definition} must not + * contain extension" + * NOTE that this is the same as (1.1). + */ + xmlSchemaPCustomErr(ctxt, + XML_SCHEMAP_COS_CT_EXTENDS_1_1, + WXS_BASIC_CAST type, NULL, + "The 'final' of the base type definition " + "contains 'extension'", NULL); + return (XML_SCHEMAP_COS_CT_EXTENDS_1_1); + } + } + return (0); +} + +/** + * xmlSchemaCheckDerivationOKRestriction: + * @ctxt: the schema parser context + * @type: the complex type definition + * + * (3.4.6) Constraints on Complex Type Definition Schema Components + * Schema Component Constraint: + * Derivation Valid (Restriction, Complex) (derivation-ok-restriction) + * + * STATUS: + * missing: + * (5.4.2) ??? + * + * ATTENTION: + * In XML Schema 1.1 this will be: + * Validation Rule: Checking complex type subsumption + * + * Returns 0 if the constraints are satisfied, a positive + * error code if not and -1 if an internal error occured. + */ +static int +xmlSchemaCheckDerivationOKRestriction(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaTypePtr type) +{ + xmlSchemaTypePtr base; + + /* + * TODO: Correct the error code; XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1 is used + * temporarily only. + */ + base = type->baseType; + if (! WXS_IS_COMPLEX(base)) { + xmlSchemaCustomErr(ACTXT_CAST ctxt, + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1, + type->node, WXS_BASIC_CAST type, + "The base type must be a complex type", NULL, NULL); + return(ctxt->err); + } + if (base->flags & XML_SCHEMAS_TYPE_FINAL_RESTRICTION) { + /* + * SPEC (1) "The {base type definition} must be a complex type + * definition whose {final} does not contain restriction." + */ + xmlSchemaCustomErr(ACTXT_CAST ctxt, + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1, + type->node, WXS_BASIC_CAST type, + "The 'final' of the base type definition " + "contains 'restriction'", NULL, NULL); + return (ctxt->err); + } + /* + * SPEC (2), (3) and (4) + * Those are handled in a separate function, since the + * same constraints are needed for redefinition of + * attribute groups as well. + */ + if (xmlSchemaCheckDerivationOKRestriction2to4(ctxt, + XML_SCHEMA_ACTION_DERIVE, + WXS_BASIC_CAST type, WXS_BASIC_CAST base, + type->attrUses, base->attrUses, + type->attributeWildcard, + base->attributeWildcard) == -1) + { + return(-1); + } + /* + * SPEC (5) "One of the following must be true:" + */ + if (base->builtInType == XML_SCHEMAS_ANYTYPE) { + /* + * SPEC (5.1) "The {base type definition} must be the + * �ur-type definition�." + * PASS + */ + } else if ((type->contentType == XML_SCHEMA_CONTENT_SIMPLE) || + (type->contentType == XML_SCHEMA_CONTENT_BASIC)) { + /* + * SPEC (5.2.1) "The {content type} of the complex type definition + * must be a simple type definition" + * + * SPEC (5.2.2) "One of the following must be true:" + */ + if ((base->contentType == XML_SCHEMA_CONTENT_SIMPLE) || + (base->contentType == XML_SCHEMA_CONTENT_BASIC)) + { + int err; + /* + * SPEC (5.2.2.1) "The {content type} of the {base type + * definition} must be a simple type definition from which + * the {content type} is validly derived given the empty + * set as defined in Type Derivation OK (Simple) (�3.14.6)." + * + * ATTENTION TODO: This seems not needed if the type implicitely + * derived from the base type. + * + */ + err = xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST ctxt, + type->contentTypeDef, base->contentTypeDef, 0); + if (err != 0) { + xmlChar *strA = NULL, *strB = NULL; + + if (err == -1) + return(-1); + xmlSchemaCustomErr(ACTXT_CAST ctxt, + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1, + NULL, WXS_BASIC_CAST type, + "The {content type} %s is not validly derived from the " + "base type's {content type} %s", + xmlSchemaGetComponentDesignation(&strA, + type->contentTypeDef), + xmlSchemaGetComponentDesignation(&strB, + base->contentTypeDef)); + FREE_AND_NULL(strA); + FREE_AND_NULL(strB); + return(ctxt->err); + } + } else if ((base->contentType == XML_SCHEMA_CONTENT_MIXED) && + (xmlSchemaIsParticleEmptiable( + (xmlSchemaParticlePtr) base->subtypes))) { + /* + * SPEC (5.2.2.2) "The {base type definition} must be mixed + * and have a particle which is �emptiable� as defined in + * Particle Emptiable (�3.9.6)." + * PASS + */ + } else { + xmlSchemaPCustomErr(ctxt, + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1, + WXS_BASIC_CAST type, NULL, + "The content type of the base type must be either " + "a simple type or 'mixed' and an emptiable particle", NULL); + return (ctxt->err); + } + } else if (type->contentType == XML_SCHEMA_CONTENT_EMPTY) { + /* + * SPEC (5.3.1) "The {content type} of the complex type itself must + * be empty" + */ + if (base->contentType == XML_SCHEMA_CONTENT_EMPTY) { + /* + * SPEC (5.3.2.1) "The {content type} of the {base type + * definition} must also be empty." + * PASS + */ + } else if (((base->contentType == XML_SCHEMA_CONTENT_ELEMENTS) || + (base->contentType == XML_SCHEMA_CONTENT_MIXED)) && + xmlSchemaIsParticleEmptiable( + (xmlSchemaParticlePtr) base->subtypes)) { + /* + * SPEC (5.3.2.2) "The {content type} of the {base type + * definition} must be elementOnly or mixed and have a particle + * which is �emptiable� as defined in Particle Emptiable (�3.9.6)." + * PASS + */ + } else { + xmlSchemaPCustomErr(ctxt, + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1, + WXS_BASIC_CAST type, NULL, + "The content type of the base type must be either " + "empty or 'mixed' (or 'elements-only') and an emptiable " + "particle", NULL); + return (ctxt->err); + } + } else if ((type->contentType == XML_SCHEMA_CONTENT_ELEMENTS) || + WXS_HAS_MIXED_CONTENT(type)) { + /* + * SPEC (5.4.1.1) "The {content type} of the complex type definition + * itself must be element-only" + */ + if (WXS_HAS_MIXED_CONTENT(type) && (! WXS_HAS_MIXED_CONTENT(base))) { + /* + * SPEC (5.4.1.2) "The {content type} of the complex type + * definition itself and of the {base type definition} must be + * mixed" + */ + xmlSchemaPCustomErr(ctxt, + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1, + WXS_BASIC_CAST type, NULL, + "If the content type is 'mixed', then the content type of the " + "base type must also be 'mixed'", NULL); + return (ctxt->err); + } + /* + * SPEC (5.4.2) "The particle of the complex type definition itself + * must be a �valid restriction� of the particle of the {content + * type} of the {base type definition} as defined in Particle Valid + * (Restriction) (�3.9.6). + * + * URGENT TODO: (5.4.2) + */ + } else { + xmlSchemaPCustomErr(ctxt, + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1, + WXS_BASIC_CAST type, NULL, + "The type is not a valid restriction of its base type", NULL); + return (ctxt->err); + } + return (0); +} + +/** + * xmlSchemaCheckCTComponent: + * @ctxt: the schema parser context + * @type: the complex type definition + * + * (3.4.6) Constraints on Complex Type Definition Schema Components + * + * Returns 0 if the constraints are satisfied, a positive + * error code if not and -1 if an internal error occured. + */ +static int +xmlSchemaCheckCTComponent(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaTypePtr type) +{ + int ret; + /* + * Complex Type Definition Properties Correct + */ + ret = xmlSchemaCheckCTPropsCorrect(ctxt, type); + if (ret != 0) + return (ret); + if (WXS_IS_EXTENSION(type)) + ret = xmlSchemaCheckCOSCTExtends(ctxt, type); + else + ret = xmlSchemaCheckDerivationOKRestriction(ctxt, type); + return (ret); +} + +/** + * xmlSchemaCheckSRCCT: + * @ctxt: the schema parser context + * @type: the complex type definition + * + * (3.4.3) Constraints on XML Representations of Complex Type Definitions: + * Schema Representation Constraint: + * Complex Type Definition Representation OK (src-ct) + * + * Returns 0 if the constraints are satisfied, a positive + * error code if not and -1 if an internal error occured. + */ +static int +xmlSchemaCheckSRCCT(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaTypePtr type) +{ + xmlSchemaTypePtr base; + int ret = 0; + + /* + * TODO: Adjust the error codes here, as I used + * XML_SCHEMAP_SRC_CT_1 only yet. + */ + base = type->baseType; + if (! WXS_HAS_SIMPLE_CONTENT(type)) { + /* + * 1 If the alternative is chosen, the type definition + * �resolved� to by the �actual value� of the base [attribute] + * must be a complex type definition; + */ + if (! WXS_IS_COMPLEX(base)) { + xmlChar *str = NULL; + xmlSchemaPCustomErr(ctxt, + XML_SCHEMAP_SRC_CT_1, + WXS_BASIC_CAST type, type->node, + "If using , the base type is expected to be " + "a complex type. The base type '%s' is a simple type", + xmlSchemaFormatQName(&str, base->targetNamespace, + base->name)); + FREE_AND_NULL(str) + return (XML_SCHEMAP_SRC_CT_1); + } + } else { + /* + * SPEC + * 2 If the alternative is chosen, all of the + * following must be true: + * 2.1 The type definition �resolved� to by the �actual value� of the + * base [attribute] must be one of the following: + */ + if (WXS_IS_SIMPLE(base)) { + if (WXS_IS_EXTENSION(type) == 0) { + xmlChar *str = NULL; + /* + * 2.1.3 only if the alternative is also + * chosen, a simple type definition. + */ + /* TODO: Change error code to ..._SRC_CT_2_1_3. */ + xmlSchemaPCustomErr(ctxt, + XML_SCHEMAP_SRC_CT_1, + WXS_BASIC_CAST type, NULL, + "If using and , the base " + "type must be a complex type. The base type '%s' is " + "a simple type", + xmlSchemaFormatQName(&str, base->targetNamespace, + base->name)); + FREE_AND_NULL(str) + return (XML_SCHEMAP_SRC_CT_1); + } + } else { + /* Base type is a complex type. */ + if ((base->contentType == XML_SCHEMA_CONTENT_SIMPLE) || + (base->contentType == XML_SCHEMA_CONTENT_BASIC)) { + /* + * 2.1.1 a complex type definition whose {content type} is a + * simple type definition; + * PASS + */ + if (base->contentTypeDef == NULL) { + xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_INTERNAL, + WXS_BASIC_CAST type, NULL, + "Internal error: xmlSchemaCheckSRCCT, " + "'%s', base type has no content type", + type->name); + return (-1); + } + } else if ((base->contentType == XML_SCHEMA_CONTENT_MIXED) && + (WXS_IS_RESTRICTION(type))) { + + /* + * 2.1.2 only if the alternative is also + * chosen, a complex type definition whose {content type} + * is mixed and a particle emptiable. + */ + if (! xmlSchemaIsParticleEmptiable( + (xmlSchemaParticlePtr) base->subtypes)) { + ret = XML_SCHEMAP_SRC_CT_1; + } else + /* + * Attention: at this point the child is in + * ->contentTypeDef (put there during parsing). + */ + if (type->contentTypeDef == NULL) { + xmlChar *str = NULL; + /* + * 2.2 If clause 2.1.2 above is satisfied, then there + * must be a among the [children] of + * . + */ + /* TODO: Change error code to ..._SRC_CT_2_2. */ + xmlSchemaPCustomErr(ctxt, + XML_SCHEMAP_SRC_CT_1, + WXS_BASIC_CAST type, NULL, + "A is expected among the children " + "of , if is used and " + "the base type '%s' is a complex type", + xmlSchemaFormatQName(&str, base->targetNamespace, + base->name)); + FREE_AND_NULL(str) + return (XML_SCHEMAP_SRC_CT_1); + } + } else { + ret = XML_SCHEMAP_SRC_CT_1; + } + } + if (ret > 0) { + xmlChar *str = NULL; + if (WXS_IS_RESTRICTION(type)) { + xmlSchemaPCustomErr(ctxt, + XML_SCHEMAP_SRC_CT_1, + WXS_BASIC_CAST type, NULL, + "If and is used, the " + "base type must be a simple type or a complex type with " + "mixed content and particle emptiable. The base type " + "'%s' is none of those", + xmlSchemaFormatQName(&str, base->targetNamespace, + base->name)); + } else { + xmlSchemaPCustomErr(ctxt, + XML_SCHEMAP_SRC_CT_1, + WXS_BASIC_CAST type, NULL, + "If and is used, the " + "base type must be a simple type. The base type '%s' " + "is a complex type", + xmlSchemaFormatQName(&str, base->targetNamespace, + base->name)); + } + FREE_AND_NULL(str) + } + } + /* + * SPEC (3) "The corresponding complex type definition component must + * satisfy the conditions set out in Constraints on Complex Type + * Definition Schema Components (�3.4.6);" + * NOTE (3) will be done in xmlSchemaTypeFixup(). + */ + /* + * SPEC (4) If clause 2.2.1 or clause 2.2.2 in the correspondence specification + * above for {attribute wildcard} is satisfied, the intensional + * intersection must be expressible, as defined in Attribute Wildcard + * Intersection (�3.10.6). + * NOTE (4) is done in xmlSchemaFixupTypeAttributeUses(). + */ + return (ret); +} + +#ifdef ENABLE_PARTICLE_RESTRICTION +/** + * xmlSchemaCheckParticleRangeOK: + * @ctxt: the schema parser context + * @type: the complex type definition + * + * (3.9.6) Constraints on Particle Schema Components + * Schema Component Constraint: + * Occurrence Range OK (range-ok) + * + * STATUS: complete + * + * Returns 0 if the constraints are satisfied, a positive + * error code if not and -1 if an internal error occured. + */ +static int +xmlSchemaCheckParticleRangeOK(int rmin, int rmax, + int bmin, int bmax) +{ + if (rmin < bmin) + return (1); + if ((bmax != UNBOUNDED) && + (rmax > bmax)) + return (1); + return (0); +} + +/** + * xmlSchemaCheckRCaseNameAndTypeOK: + * @ctxt: the schema parser context + * @r: the restricting element declaration particle + * @b: the base element declaration particle + * + * (3.9.6) Constraints on Particle Schema Components + * Schema Component Constraint: + * Particle Restriction OK (Elt:Elt -- NameAndTypeOK) + * (rcase-NameAndTypeOK) + * + * STATUS: + * MISSING (3.2.3) + * CLARIFY: (3.2.2) + * + * Returns 0 if the constraints are satisfied, a positive + * error code if not and -1 if an internal error occured. + */ +static int +xmlSchemaCheckRCaseNameAndTypeOK(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaParticlePtr r, + xmlSchemaParticlePtr b) +{ + xmlSchemaElementPtr elemR, elemB; + + /* TODO: Error codes (rcase-NameAndTypeOK). */ + elemR = (xmlSchemaElementPtr) r->children; + elemB = (xmlSchemaElementPtr) b->children; + /* + * SPEC (1) "The declarations' {name}s and {target namespace}s are + * the same." + */ + if ((elemR != elemB) && + ((! xmlStrEqual(elemR->name, elemB->name)) || + (! xmlStrEqual(elemR->targetNamespace, elemB->targetNamespace)))) + return (1); + /* + * SPEC (2) "R's occurrence range is a valid restriction of B's + * occurrence range as defined by Occurrence Range OK (�3.9.6)." + */ + if (xmlSchemaCheckParticleRangeOK(r->minOccurs, r->maxOccurs, + b->minOccurs, b->maxOccurs) != 0) + return (1); + /* + * SPEC (3.1) "Both B's declaration's {scope} and R's declaration's + * {scope} are global." + */ + if (elemR == elemB) + return (0); + /* + * SPEC (3.2.1) "Either B's {nillable} is true or R's {nillable} is false." + */ + if (((elemB->flags & XML_SCHEMAS_ELEM_NILLABLE) == 0) && + (elemR->flags & XML_SCHEMAS_ELEM_NILLABLE)) + return (1); + /* + * SPEC (3.2.2) "either B's declaration's {value constraint} is absent, + * or is not fixed, or R's declaration's {value constraint} is fixed + * with the same value." + */ + if ((elemB->value != NULL) && (elemB->flags & XML_SCHEMAS_ELEM_FIXED) && + ((elemR->value == NULL) || + ((elemR->flags & XML_SCHEMAS_ELEM_FIXED) == 0) || + /* TODO: Equality of the initial value or normalized or canonical? */ + (! xmlStrEqual(elemR->value, elemB->value)))) + return (1); + /* + * TODO: SPEC (3.2.3) "R's declaration's {identity-constraint + * definitions} is a subset of B's declaration's {identity-constraint + * definitions}, if any." + */ + if (elemB->idcs != NULL) { + /* TODO */ + } + /* + * SPEC (3.2.4) "R's declaration's {disallowed substitutions} is a + * superset of B's declaration's {disallowed substitutions}." + */ + if (((elemB->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION) && + ((elemR->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION) == 0)) || + ((elemB->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION) && + ((elemR->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION) == 0)) || + ((elemB->flags & XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION) && + ((elemR->flags & XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION) == 0))) + return (1); + /* + * SPEC (3.2.5) "R's {type definition} is validly derived given + * {extension, list, union} from B's {type definition}" + * + * BADSPEC TODO: What's the point of adding "list" and "union" to the + * set, if the corresponding constraints handle "restriction" and + * "extension" only? + * + */ + { + int set = 0; + + set |= SUBSET_EXTENSION; + set |= SUBSET_LIST; + set |= SUBSET_UNION; + if (xmlSchemaCheckCOSDerivedOK(ACTXT_CAST ctxt, elemR->subtypes, + elemB->subtypes, set) != 0) + return (1); + } + return (0); +} + +/** + * xmlSchemaCheckRCaseNSCompat: + * @ctxt: the schema parser context + * @r: the restricting element declaration particle + * @b: the base wildcard particle + * + * (3.9.6) Constraints on Particle Schema Components + * Schema Component Constraint: + * Particle Derivation OK (Elt:Any -- NSCompat) + * (rcase-NSCompat) + * + * STATUS: complete + * + * Returns 0 if the constraints are satisfied, a positive + * error code if not and -1 if an internal error occured. + */ +static int +xmlSchemaCheckRCaseNSCompat(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaParticlePtr r, + xmlSchemaParticlePtr b) +{ + /* TODO:Error codes (rcase-NSCompat). */ + /* + * SPEC "For an element declaration particle to be a �valid restriction� + * of a wildcard particle all of the following must be true:" + * + * SPEC (1) "The element declaration's {target namespace} is �valid� + * with respect to the wildcard's {namespace constraint} as defined by + * Wildcard allows Namespace Name (�3.10.4)." + */ + if (xmlSchemaCheckCVCWildcardNamespace((xmlSchemaWildcardPtr) b->children, + ((xmlSchemaElementPtr) r->children)->targetNamespace) != 0) + return (1); + /* + * SPEC (2) "R's occurrence range is a valid restriction of B's + * occurrence range as defined by Occurrence Range OK (�3.9.6)." + */ + if (xmlSchemaCheckParticleRangeOK(r->minOccurs, r->maxOccurs, + b->minOccurs, b->maxOccurs) != 0) + return (1); + + return (0); +} + +/** + * xmlSchemaCheckRCaseRecurseAsIfGroup: + * @ctxt: the schema parser context + * @r: the restricting element declaration particle + * @b: the base model group particle + * + * (3.9.6) Constraints on Particle Schema Components + * Schema Component Constraint: + * Particle Derivation OK (Elt:All/Choice/Sequence -- RecurseAsIfGroup) + * (rcase-RecurseAsIfGroup) + * + * STATUS: TODO + * + * Returns 0 if the constraints are satisfied, a positive + * error code if not and -1 if an internal error occured. + */ +static int +xmlSchemaCheckRCaseRecurseAsIfGroup(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaParticlePtr r, + xmlSchemaParticlePtr b) +{ + /* TODO: Error codes (rcase-RecurseAsIfGroup). */ + TODO + return (0); +} + +/** + * xmlSchemaCheckRCaseNSSubset: + * @ctxt: the schema parser context + * @r: the restricting wildcard particle + * @b: the base wildcard particle + * + * (3.9.6) Constraints on Particle Schema Components + * Schema Component Constraint: + * Particle Derivation OK (Any:Any -- NSSubset) + * (rcase-NSSubset) + * + * STATUS: complete + * + * Returns 0 if the constraints are satisfied, a positive + * error code if not and -1 if an internal error occured. + */ +static int +xmlSchemaCheckRCaseNSSubset(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaParticlePtr r, + xmlSchemaParticlePtr b, + int isAnyTypeBase) +{ + /* TODO: Error codes (rcase-NSSubset). */ + /* + * SPEC (1) "R's occurrence range is a valid restriction of B's + * occurrence range as defined by Occurrence Range OK (�3.9.6)." + */ + if (xmlSchemaCheckParticleRangeOK(r->minOccurs, r->maxOccurs, + b->minOccurs, b->maxOccurs)) + return (1); + /* + * SPEC (2) "R's {namespace constraint} must be an intensional subset + * of B's {namespace constraint} as defined by Wildcard Subset (�3.10.6)." + */ + if (xmlSchemaCheckCOSNSSubset((xmlSchemaWildcardPtr) r->children, + (xmlSchemaWildcardPtr) b->children)) + return (1); + /* + * SPEC (3) "Unless B is the content model wildcard of the �ur-type + * definition�, R's {process contents} must be identical to or stronger + * than B's {process contents}, where strict is stronger than lax is + * stronger than skip." + */ + if (! isAnyTypeBase) { + if ( ((xmlSchemaWildcardPtr) r->children)->processContents < + ((xmlSchemaWildcardPtr) b->children)->processContents) + return (1); + } + + return (0); +} + +/** + * xmlSchemaCheckCOSParticleRestrict: + * @ctxt: the schema parser context + * @type: the complex type definition + * + * (3.9.6) Constraints on Particle Schema Components + * Schema Component Constraint: + * Particle Valid (Restriction) (cos-particle-restrict) + * + * STATUS: TODO + * + * Returns 0 if the constraints are satisfied, a positive + * error code if not and -1 if an internal error occured. + */ +static int +xmlSchemaCheckCOSParticleRestrict(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaParticlePtr r, + xmlSchemaParticlePtr b) +{ + int ret = 0; + + /*part = WXS_TYPE_PARTICLE(type); + basePart = WXS_TYPE_PARTICLE(base); + */ + + TODO + + /* + * SPEC (1) "They are the same particle." + */ + if (r == b) + return (0); + + + return (0); +} + +#if 0 +/** + * xmlSchemaCheckRCaseNSRecurseCheckCardinality: + * @ctxt: the schema parser context + * @r: the model group particle + * @b: the base wildcard particle + * + * (3.9.6) Constraints on Particle Schema Components + * Schema Component Constraint: + * Particle Derivation OK (All/Choice/Sequence:Any -- + * NSRecurseCheckCardinality) + * (rcase-NSRecurseCheckCardinality) + * + * STATUS: TODO: subst-groups + * + * Returns 0 if the constraints are satisfied, a positive + * error code if not and -1 if an internal error occured. + */ +static int +xmlSchemaCheckRCaseNSRecurseCheckCardinality(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaParticlePtr r, + xmlSchemaParticlePtr b) +{ + xmlSchemaParticlePtr part; + /* TODO: Error codes (rcase-NSRecurseCheckCardinality). */ + if ((r->children == NULL) || (r->children->children == NULL)) + return (-1); + /* + * SPEC "For a group particle to be a �valid restriction� of a + * wildcard particle..." + * + * SPEC (1) "Every member of the {particles} of the group is a �valid + * restriction� of the wildcard as defined by + * Particle Valid (Restriction) (�3.9.6)." + */ + part = (xmlSchemaParticlePtr) r->children->children; + do { + if (xmlSchemaCheckCOSParticleRestrict(ctxt, part, b)) + return (1); + part = (xmlSchemaParticlePtr) part->next; + } while (part != NULL); + /* + * SPEC (2) "The effective total range of the group [...] is a + * valid restriction of B's occurrence range as defined by + * Occurrence Range OK (�3.9.6)." + */ + if (xmlSchemaCheckParticleRangeOK( + xmlSchemaGetParticleTotalRangeMin(r), + xmlSchemaGetParticleTotalRangeMax(r), + b->minOccurs, b->maxOccurs) != 0) + return (1); + return (0); +} +#endif + +/** + * xmlSchemaCheckRCaseRecurse: + * @ctxt: the schema parser context + * @r: the or model group particle + * @b: the base or model group particle + * + * (3.9.6) Constraints on Particle Schema Components + * Schema Component Constraint: + * Particle Derivation OK (All:All,Sequence:Sequence -- + Recurse) + * (rcase-Recurse) + * + * STATUS: ? + * TODO: subst-groups + * + * Returns 0 if the constraints are satisfied, a positive + * error code if not and -1 if an internal error occured. + */ +static int +xmlSchemaCheckRCaseRecurse(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaParticlePtr r, + xmlSchemaParticlePtr b) +{ + /* xmlSchemaParticlePtr part; */ + /* TODO: Error codes (rcase-Recurse). */ + if ((r->children == NULL) || (b->children == NULL) || + (r->children->type != b->children->type)) + return (-1); + /* + * SPEC "For an all or sequence group particle to be a �valid + * restriction� of another group particle with the same {compositor}..." + * + * SPEC (1) "R's occurrence range is a valid restriction of B's + * occurrence range as defined by Occurrence Range OK (�3.9.6)." + */ + if (xmlSchemaCheckParticleRangeOK(r->minOccurs, r->maxOccurs, + b->minOccurs, b->maxOccurs)) + return (1); + + + return (0); +} + +#endif + +#define FACET_RESTR_MUTUAL_ERR(fac1, fac2) \ + xmlSchemaPCustomErrExt(pctxt, \ + XML_SCHEMAP_INVALID_FACET_VALUE, \ + WXS_BASIC_CAST fac1, fac1->node, \ + "It is an error for both '%s' and '%s' to be specified on the "\ + "same type definition", \ + BAD_CAST xmlSchemaFacetTypeToString(fac1->type), \ + BAD_CAST xmlSchemaFacetTypeToString(fac2->type), NULL); + +#define FACET_RESTR_ERR(fac1, msg) \ + xmlSchemaPCustomErr(pctxt, \ + XML_SCHEMAP_INVALID_FACET_VALUE, \ + WXS_BASIC_CAST fac1, fac1->node, \ + msg, NULL); + +#define FACET_RESTR_FIXED_ERR(fac) \ + xmlSchemaPCustomErr(pctxt, \ + XML_SCHEMAP_INVALID_FACET_VALUE, \ + WXS_BASIC_CAST fac, fac->node, \ + "The base type's facet is 'fixed', thus the value must not " \ + "differ", NULL); + +static void +xmlSchemaDeriveFacetErr(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaFacetPtr facet1, + xmlSchemaFacetPtr facet2, + int lessGreater, + int orEqual, + int ofBase) +{ + xmlChar *msg = NULL; + + msg = xmlStrdup(BAD_CAST "'"); + msg = xmlStrcat(msg, xmlSchemaFacetTypeToString(facet1->type)); + msg = xmlStrcat(msg, BAD_CAST "' has to be"); + if (lessGreater == 0) + msg = xmlStrcat(msg, BAD_CAST " equal to"); + if (lessGreater == 1) + msg = xmlStrcat(msg, BAD_CAST " greater than"); + else + msg = xmlStrcat(msg, BAD_CAST " less than"); + + if (orEqual) + msg = xmlStrcat(msg, BAD_CAST " or equal to"); + msg = xmlStrcat(msg, BAD_CAST " '"); + msg = xmlStrcat(msg, xmlSchemaFacetTypeToString(facet2->type)); + if (ofBase) + msg = xmlStrcat(msg, BAD_CAST "' of the base type"); + else + msg = xmlStrcat(msg, BAD_CAST "'"); + + xmlSchemaPCustomErr(pctxt, + XML_SCHEMAP_INVALID_FACET_VALUE, + WXS_BASIC_CAST facet1, NULL, + (const char *) msg, NULL); + + if (msg != NULL) + xmlFree(msg); +} + +/* +* xmlSchemaDeriveAndValidateFacets: +* +* Schema Component Constraint: Simple Type Restriction (Facets) +* (st-restrict-facets) +*/ +static int +xmlSchemaDeriveAndValidateFacets(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaTypePtr type) +{ + xmlSchemaTypePtr base = type->baseType; + xmlSchemaFacetLinkPtr link, cur, last = NULL; + xmlSchemaFacetPtr facet, bfacet, + flength = NULL, ftotdig = NULL, ffracdig = NULL, + fmaxlen = NULL, fminlen = NULL, /* facets of the current type */ + fmininc = NULL, fmaxinc = NULL, + fminexc = NULL, fmaxexc = NULL, + bflength = NULL, bftotdig = NULL, bffracdig = NULL, + bfmaxlen = NULL, bfminlen = NULL, /* facets of the base type */ + bfmininc = NULL, bfmaxinc = NULL, + bfminexc = NULL, bfmaxexc = NULL; + int res; /* err = 0, fixedErr; */ + + /* + * SPEC st-restrict-facets 1: + * "The {variety} of R is the same as that of B." + */ + /* + * SPEC st-restrict-facets 2: + * "If {variety} is atomic, the {primitive type definition} + * of R is the same as that of B." + * + * NOTE: we leave 1 & 2 out for now, since this will be + * satisfied by the derivation process. + * CONSTRUCTION TODO: Maybe needed if using a construction API. + */ + /* + * SPEC st-restrict-facets 3: + * "The {facets} of R are the union of S and the {facets} + * of B, eliminating duplicates. To eliminate duplicates, + * when a facet of the same kind occurs in both S and the + * {facets} of B, the one in the {facets} of B is not + * included, with the exception of enumeration and pattern + * facets, for which multiple occurrences with distinct values + * are allowed." + */ + + if ((type->facetSet == NULL) && (base->facetSet == NULL)) + return (0); + + last = type->facetSet; + if (last != NULL) + while (last->next != NULL) + last = last->next; + + for (cur = type->facetSet; cur != NULL; cur = cur->next) { + facet = cur->facet; + switch (facet->type) { + case XML_SCHEMA_FACET_LENGTH: + flength = facet; break; + case XML_SCHEMA_FACET_MINLENGTH: + fminlen = facet; break; + case XML_SCHEMA_FACET_MININCLUSIVE: + fmininc = facet; break; + case XML_SCHEMA_FACET_MINEXCLUSIVE: + fminexc = facet; break; + case XML_SCHEMA_FACET_MAXLENGTH: + fmaxlen = facet; break; + case XML_SCHEMA_FACET_MAXINCLUSIVE: + fmaxinc = facet; break; + case XML_SCHEMA_FACET_MAXEXCLUSIVE: + fmaxexc = facet; break; + case XML_SCHEMA_FACET_TOTALDIGITS: + ftotdig = facet; break; + case XML_SCHEMA_FACET_FRACTIONDIGITS: + ffracdig = facet; break; + default: + break; + } + } + for (cur = base->facetSet; cur != NULL; cur = cur->next) { + facet = cur->facet; + switch (facet->type) { + case XML_SCHEMA_FACET_LENGTH: + bflength = facet; break; + case XML_SCHEMA_FACET_MINLENGTH: + bfminlen = facet; break; + case XML_SCHEMA_FACET_MININCLUSIVE: + bfmininc = facet; break; + case XML_SCHEMA_FACET_MINEXCLUSIVE: + bfminexc = facet; break; + case XML_SCHEMA_FACET_MAXLENGTH: + bfmaxlen = facet; break; + case XML_SCHEMA_FACET_MAXINCLUSIVE: + bfmaxinc = facet; break; + case XML_SCHEMA_FACET_MAXEXCLUSIVE: + bfmaxexc = facet; break; + case XML_SCHEMA_FACET_TOTALDIGITS: + bftotdig = facet; break; + case XML_SCHEMA_FACET_FRACTIONDIGITS: + bffracdig = facet; break; + default: + break; + } + } + /* + * length and minLength or maxLength (2.2) + (3.2) + */ + if (flength && (fminlen || fmaxlen)) { + FACET_RESTR_ERR(flength, "It is an error for both 'length' and " + "either of 'minLength' or 'maxLength' to be specified on " + "the same type definition") + } + /* + * Mutual exclusions in the same derivation step. + */ + if ((fmaxinc) && (fmaxexc)) { + /* + * SCC "maxInclusive and maxExclusive" + */ + FACET_RESTR_MUTUAL_ERR(fmaxinc, fmaxexc) + } + if ((fmininc) && (fminexc)) { + /* + * SCC "minInclusive and minExclusive" + */ + FACET_RESTR_MUTUAL_ERR(fmininc, fminexc) + } + + if (flength && bflength) { + /* + * SCC "length valid restriction" + * The values have to be equal. + */ + res = xmlSchemaCompareValues(flength->val, bflength->val); + if (res == -2) + goto internal_error; + if (res != 0) + xmlSchemaDeriveFacetErr(pctxt, flength, bflength, 0, 0, 1); + if ((res != 0) && (bflength->fixed)) { + FACET_RESTR_FIXED_ERR(flength) + } + + } + if (fminlen && bfminlen) { + /* + * SCC "minLength valid restriction" + * minLength >= BASE minLength + */ + res = xmlSchemaCompareValues(fminlen->val, bfminlen->val); + if (res == -2) + goto internal_error; + if (res == -1) + xmlSchemaDeriveFacetErr(pctxt, fminlen, bfminlen, 1, 1, 1); + if ((res != 0) && (bfminlen->fixed)) { + FACET_RESTR_FIXED_ERR(fminlen) + } + } + if (fmaxlen && bfmaxlen) { + /* + * SCC "maxLength valid restriction" + * maxLength <= BASE minLength + */ + res = xmlSchemaCompareValues(fmaxlen->val, bfmaxlen->val); + if (res == -2) + goto internal_error; + if (res == 1) + xmlSchemaDeriveFacetErr(pctxt, fmaxlen, bfmaxlen, -1, 1, 1); + if ((res != 0) && (bfmaxlen->fixed)) { + FACET_RESTR_FIXED_ERR(fmaxlen) + } + } + /* + * SCC "length and minLength or maxLength" + */ + if (! flength) + flength = bflength; + if (flength) { + if (! fminlen) + fminlen = bfminlen; + if (fminlen) { + /* (1.1) length >= minLength */ + res = xmlSchemaCompareValues(flength->val, fminlen->val); + if (res == -2) + goto internal_error; + if (res == -1) + xmlSchemaDeriveFacetErr(pctxt, flength, fminlen, 1, 1, 0); + } + if (! fmaxlen) + fmaxlen = bfmaxlen; + if (fmaxlen) { + /* (2.1) length <= maxLength */ + res = xmlSchemaCompareValues(flength->val, fmaxlen->val); + if (res == -2) + goto internal_error; + if (res == 1) + xmlSchemaDeriveFacetErr(pctxt, flength, fmaxlen, -1, 1, 0); + } + } + if (fmaxinc) { + /* + * "maxInclusive" + */ + if (fmininc) { + /* SCC "maxInclusive >= minInclusive" */ + res = xmlSchemaCompareValues(fmaxinc->val, fmininc->val); + if (res == -2) + goto internal_error; + if (res == -1) { + xmlSchemaDeriveFacetErr(pctxt, fmaxinc, fmininc, 1, 1, 0); + } + } + /* + * SCC "maxInclusive valid restriction" + */ + if (bfmaxinc) { + /* maxInclusive <= BASE maxInclusive */ + res = xmlSchemaCompareValues(fmaxinc->val, bfmaxinc->val); + if (res == -2) + goto internal_error; + if (res == 1) + xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfmaxinc, -1, 1, 1); + if ((res != 0) && (bfmaxinc->fixed)) { + FACET_RESTR_FIXED_ERR(fmaxinc) + } + } + if (bfmaxexc) { + /* maxInclusive < BASE maxExclusive */ + res = xmlSchemaCompareValues(fmaxinc->val, bfmaxexc->val); + if (res == -2) + goto internal_error; + if (res != -1) { + xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfmaxexc, -1, 0, 1); + } + } + if (bfmininc) { + /* maxInclusive >= BASE minInclusive */ + res = xmlSchemaCompareValues(fmaxinc->val, bfmininc->val); + if (res == -2) + goto internal_error; + if (res == -1) { + xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfmininc, 1, 1, 1); + } + } + if (bfminexc) { + /* maxInclusive > BASE minExclusive */ + res = xmlSchemaCompareValues(fmaxinc->val, bfminexc->val); + if (res == -2) + goto internal_error; + if (res != 1) { + xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfminexc, 1, 0, 1); + } + } + } + if (fmaxexc) { + /* + * "maxExclusive >= minExclusive" + */ + if (fminexc) { + res = xmlSchemaCompareValues(fmaxexc->val, fminexc->val); + if (res == -2) + goto internal_error; + if (res == -1) { + xmlSchemaDeriveFacetErr(pctxt, fmaxexc, fminexc, 1, 1, 0); + } + } + /* + * "maxExclusive valid restriction" + */ + if (bfmaxexc) { + /* maxExclusive <= BASE maxExclusive */ + res = xmlSchemaCompareValues(fmaxexc->val, bfmaxexc->val); + if (res == -2) + goto internal_error; + if (res == 1) { + xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfmaxexc, -1, 1, 1); + } + if ((res != 0) && (bfmaxexc->fixed)) { + FACET_RESTR_FIXED_ERR(fmaxexc) + } + } + if (bfmaxinc) { + /* maxExclusive <= BASE maxInclusive */ + res = xmlSchemaCompareValues(fmaxexc->val, bfmaxinc->val); + if (res == -2) + goto internal_error; + if (res == 1) { + xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfmaxinc, -1, 1, 1); + } + } + if (bfmininc) { + /* maxExclusive > BASE minInclusive */ + res = xmlSchemaCompareValues(fmaxexc->val, bfmininc->val); + if (res == -2) + goto internal_error; + if (res != 1) { + xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfmininc, 1, 0, 1); + } + } + if (bfminexc) { + /* maxExclusive > BASE minExclusive */ + res = xmlSchemaCompareValues(fmaxexc->val, bfminexc->val); + if (res == -2) + goto internal_error; + if (res != 1) { + xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfminexc, 1, 0, 1); + } + } + } + if (fminexc) { + /* + * "minExclusive < maxInclusive" + */ + if (fmaxinc) { + res = xmlSchemaCompareValues(fminexc->val, fmaxinc->val); + if (res == -2) + goto internal_error; + if (res != -1) { + xmlSchemaDeriveFacetErr(pctxt, fminexc, fmaxinc, -1, 0, 0); + } + } + /* + * "minExclusive valid restriction" + */ + if (bfminexc) { + /* minExclusive >= BASE minExclusive */ + res = xmlSchemaCompareValues(fminexc->val, bfminexc->val); + if (res == -2) + goto internal_error; + if (res == -1) { + xmlSchemaDeriveFacetErr(pctxt, fminexc, bfminexc, 1, 1, 1); + } + if ((res != 0) && (bfminexc->fixed)) { + FACET_RESTR_FIXED_ERR(fminexc) + } + } + if (bfmaxinc) { + /* minExclusive <= BASE maxInclusive */ + res = xmlSchemaCompareValues(fminexc->val, bfmaxinc->val); + if (res == -2) + goto internal_error; + if (res == 1) { + xmlSchemaDeriveFacetErr(pctxt, fminexc, bfmaxinc, -1, 1, 1); + } + } + if (bfmininc) { + /* minExclusive >= BASE minInclusive */ + res = xmlSchemaCompareValues(fminexc->val, bfmininc->val); + if (res == -2) + goto internal_error; + if (res == -1) { + xmlSchemaDeriveFacetErr(pctxt, fminexc, bfmininc, 1, 1, 1); + } + } + if (bfmaxexc) { + /* minExclusive < BASE maxExclusive */ + res = xmlSchemaCompareValues(fminexc->val, bfmaxexc->val); + if (res == -2) + goto internal_error; + if (res != -1) { + xmlSchemaDeriveFacetErr(pctxt, fminexc, bfmaxexc, -1, 0, 1); + } + } + } + if (fmininc) { + /* + * "minInclusive < maxExclusive" + */ + if (fmaxexc) { + res = xmlSchemaCompareValues(fmininc->val, fmaxexc->val); + if (res == -2) + goto internal_error; + if (res != -1) { + xmlSchemaDeriveFacetErr(pctxt, fmininc, fmaxexc, -1, 0, 0); + } + } + /* + * "minExclusive valid restriction" + */ + if (bfmininc) { + /* minInclusive >= BASE minInclusive */ + res = xmlSchemaCompareValues(fmininc->val, bfmininc->val); + if (res == -2) + goto internal_error; + if (res == -1) { + xmlSchemaDeriveFacetErr(pctxt, fmininc, bfmininc, 1, 1, 1); + } + if ((res != 0) && (bfmininc->fixed)) { + FACET_RESTR_FIXED_ERR(fmininc) + } + } + if (bfmaxinc) { + /* minInclusive <= BASE maxInclusive */ + res = xmlSchemaCompareValues(fmininc->val, bfmaxinc->val); + if (res == -2) + goto internal_error; + if (res == 1) { + xmlSchemaDeriveFacetErr(pctxt, fmininc, bfmaxinc, -1, 1, 1); + } + } + if (bfminexc) { + /* minInclusive > BASE minExclusive */ + res = xmlSchemaCompareValues(fmininc->val, bfminexc->val); + if (res == -2) + goto internal_error; + if (res != 1) + xmlSchemaDeriveFacetErr(pctxt, fmininc, bfminexc, 1, 0, 1); + } + if (bfmaxexc) { + /* minInclusive < BASE maxExclusive */ + res = xmlSchemaCompareValues(fmininc->val, bfmaxexc->val); + if (res == -2) + goto internal_error; + if (res != -1) + xmlSchemaDeriveFacetErr(pctxt, fmininc, bfmaxexc, -1, 0, 1); + } + } + if (ftotdig && bftotdig) { + /* + * SCC " totalDigits valid restriction" + * totalDigits <= BASE totalDigits + */ + res = xmlSchemaCompareValues(ftotdig->val, bftotdig->val); + if (res == -2) + goto internal_error; + if (res == 1) + xmlSchemaDeriveFacetErr(pctxt, ftotdig, bftotdig, + -1, 1, 1); + if ((res != 0) && (bftotdig->fixed)) { + FACET_RESTR_FIXED_ERR(ftotdig) + } + } + if (ffracdig && bffracdig) { + /* + * SCC "fractionDigits valid restriction" + * fractionDigits <= BASE fractionDigits + */ + res = xmlSchemaCompareValues(ffracdig->val, bffracdig->val); + if (res == -2) + goto internal_error; + if (res == 1) + xmlSchemaDeriveFacetErr(pctxt, ffracdig, bffracdig, + -1, 1, 1); + if ((res != 0) && (bffracdig->fixed)) { + FACET_RESTR_FIXED_ERR(ffracdig) + } + } + /* + * SCC "fractionDigits less than or equal to totalDigits" + */ + if (! ftotdig) + ftotdig = bftotdig; + if (! ffracdig) + ffracdig = bffracdig; + if (ftotdig && ffracdig) { + res = xmlSchemaCompareValues(ffracdig->val, ftotdig->val); + if (res == -2) + goto internal_error; + if (res == 1) + xmlSchemaDeriveFacetErr(pctxt, ffracdig, ftotdig, + -1, 1, 0); + } + /* + * *Enumerations* won' be added here, since only the first set + * of enumerations in the ancestor-or-self axis is used + * for validation, plus we need to use the base type of those + * enumerations for whitespace. + * + * *Patterns*: won't be add here, since they are ORed at + * type level and ANDed at ancestor level. This will + * happed during validation by walking the base axis + * of the type. + */ + for (cur = base->facetSet; cur != NULL; cur = cur->next) { + bfacet = cur->facet; + /* + * Special handling of enumerations and patterns. + * TODO: hmm, they should not appear in the set, so remove this. + */ + if ((bfacet->type == XML_SCHEMA_FACET_PATTERN) || + (bfacet->type == XML_SCHEMA_FACET_ENUMERATION)) + continue; + /* + * Search for a duplicate facet in the current type. + */ + link = type->facetSet; + /* err = 0; */ + /* fixedErr = 0; */ + while (link != NULL) { + facet = link->facet; + if (facet->type == bfacet->type) { + switch (facet->type) { + case XML_SCHEMA_FACET_WHITESPACE: + /* + * The whitespace must be stronger. + */ + if (facet->whitespace < bfacet->whitespace) { + FACET_RESTR_ERR(facet, + "The 'whitespace' value has to be equal to " + "or stronger than the 'whitespace' value of " + "the base type") + } + if ((bfacet->fixed) && + (facet->whitespace != bfacet->whitespace)) { + FACET_RESTR_FIXED_ERR(facet) + } + break; + default: + break; + } + /* Duplicate found. */ + break; + } + link = link->next; + } + /* + * If no duplicate was found: add the base types's facet + * to the set. + */ + if (link == NULL) { + link = (xmlSchemaFacetLinkPtr) + xmlMalloc(sizeof(xmlSchemaFacetLink)); + if (link == NULL) { + xmlSchemaPErrMemory(pctxt, + "deriving facets, creating a facet link", NULL); + return (-1); + } + link->facet = cur->facet; + link->next = NULL; + if (last == NULL) + type->facetSet = link; + else + last->next = link; + last = link; + } + + } + + return (0); +internal_error: + PERROR_INT("xmlSchemaDeriveAndValidateFacets", + "an error occured"); + return (-1); +} + +static int +xmlSchemaFinishMemberTypeDefinitionsProperty(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaTypePtr type) +{ + xmlSchemaTypeLinkPtr link, lastLink, prevLink, subLink, newLink; + /* + * The actual value is then formed by replacing any union type + * definition in the �explicit members� with the members of their + * {member type definitions}, in order. + * + * TODO: There's a bug entry at + * "http://lists.w3.org/Archives/Public/www-xml-schema-comments/2005JulSep/0287.html" + * which indicates that we'll keep the union types the future. + */ + link = type->memberTypes; + while (link != NULL) { + + if (WXS_IS_TYPE_NOT_FIXED(link->type)) + xmlSchemaTypeFixup(link->type, ACTXT_CAST pctxt); + + if (WXS_IS_UNION(link->type)) { + subLink = xmlSchemaGetUnionSimpleTypeMemberTypes(link->type); + if (subLink != NULL) { + link->type = subLink->type; + if (subLink->next != NULL) { + lastLink = link->next; + subLink = subLink->next; + prevLink = link; + while (subLink != NULL) { + newLink = (xmlSchemaTypeLinkPtr) + xmlMalloc(sizeof(xmlSchemaTypeLink)); + if (newLink == NULL) { + xmlSchemaPErrMemory(pctxt, "allocating a type link", + NULL); + return (-1); + } + newLink->type = subLink->type; + prevLink->next = newLink; + prevLink = newLink; + newLink->next = lastLink; + + subLink = subLink->next; + } + } + } + } + link = link->next; + } + return (0); +} + +static void +xmlSchemaTypeFixupOptimFacets(xmlSchemaTypePtr type) +{ + int has = 0, needVal = 0, normVal = 0; + + has = (type->baseType->flags & XML_SCHEMAS_TYPE_HAS_FACETS) ? 1 : 0; + if (has) { + needVal = (type->baseType->flags & + XML_SCHEMAS_TYPE_FACETSNEEDVALUE) ? 1 : 0; + normVal = (type->baseType->flags & + XML_SCHEMAS_TYPE_NORMVALUENEEDED) ? 1 : 0; + } + if (type->facets != NULL) { + xmlSchemaFacetPtr fac; + + for (fac = type->facets; fac != NULL; fac = fac->next) { + switch (fac->type) { + case XML_SCHEMA_FACET_WHITESPACE: + break; + case XML_SCHEMA_FACET_PATTERN: + normVal = 1; + has = 1; + break; + case XML_SCHEMA_FACET_ENUMERATION: + needVal = 1; + normVal = 1; + has = 1; + break; + default: + has = 1; + break; + } + } + } + if (normVal) + type->flags |= XML_SCHEMAS_TYPE_NORMVALUENEEDED; + if (needVal) + type->flags |= XML_SCHEMAS_TYPE_FACETSNEEDVALUE; + if (has) + type->flags |= XML_SCHEMAS_TYPE_HAS_FACETS; + + if (has && (! needVal) && WXS_IS_ATOMIC(type)) { + xmlSchemaTypePtr prim = xmlSchemaGetPrimitiveType(type); + /* + * OPTIMIZE VAL TODO: Some facets need a computed value. + */ + if ((prim->builtInType != XML_SCHEMAS_ANYSIMPLETYPE) && + (prim->builtInType != XML_SCHEMAS_STRING)) { + type->flags |= XML_SCHEMAS_TYPE_FACETSNEEDVALUE; + } + } +} + +static int +xmlSchemaTypeFixupWhitespace(xmlSchemaTypePtr type) +{ + + + /* + * Evaluate the whitespace-facet value. + */ + if (WXS_IS_LIST(type)) { + type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE; + return (0); + } else if (WXS_IS_UNION(type)) + return (0); + + if (type->facetSet != NULL) { + xmlSchemaFacetLinkPtr lin; + + for (lin = type->facetSet; lin != NULL; lin = lin->next) { + if (lin->facet->type == XML_SCHEMA_FACET_WHITESPACE) { + switch (lin->facet->whitespace) { + case XML_SCHEMAS_FACET_PRESERVE: + type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE; + break; + case XML_SCHEMAS_FACET_REPLACE: + type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_REPLACE; + break; + case XML_SCHEMAS_FACET_COLLAPSE: + type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE; + break; + default: + return (-1); + } + return (0); + } + } + } + /* + * For all �atomic� datatypes other than string (and types �derived� + * by �restriction� from it) the value of whiteSpace is fixed to + * collapse + */ + { + xmlSchemaTypePtr anc; + + for (anc = type->baseType; anc != NULL && + anc->builtInType != XML_SCHEMAS_ANYTYPE; + anc = anc->baseType) { + + if (anc->type == XML_SCHEMA_TYPE_BASIC) { + if (anc->builtInType == XML_SCHEMAS_NORMSTRING) { + type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_REPLACE; + + } else if ((anc->builtInType == XML_SCHEMAS_STRING) || + (anc->builtInType == XML_SCHEMAS_ANYSIMPLETYPE)) { + type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE; + + } else + type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE; + break; + } + } + } + return (0); +} + +static int +xmlSchemaFixupSimpleTypeStageOne(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaTypePtr type) +{ + if (type->type != XML_SCHEMA_TYPE_SIMPLE) + return(0); + if (! WXS_IS_TYPE_NOT_FIXED_1(type)) + return(0); + type->flags |= XML_SCHEMAS_TYPE_FIXUP_1; + + if (WXS_IS_LIST(type)) { + /* + * Corresponds to ... + */ + if (type->subtypes == NULL) { + /* + * This one is really needed, so get out. + */ + PERROR_INT("xmlSchemaFixupSimpleTypeStageOne", + "list type has no item-type assigned"); + return(-1); + } + } else if (WXS_IS_UNION(type)) { + /* + * Corresponds to ... + */ + if (type->memberTypes == NULL) { + /* + * This one is really needed, so get out. + */ + PERROR_INT("xmlSchemaFixupSimpleTypeStageOne", + "union type has no member-types assigned"); + return(-1); + } + } else { + /* + * Corresponds to ... + */ + if (type->baseType == NULL) { + PERROR_INT("xmlSchemaFixupSimpleTypeStageOne", + "type has no base-type assigned"); + return(-1); + } + if (WXS_IS_TYPE_NOT_FIXED_1(type->baseType)) + if (xmlSchemaFixupSimpleTypeStageOne(pctxt, type->baseType) == -1) + return(-1); + /* + * Variety + * If the alternative is chosen, then the + * {variety} of the {base type definition}. + */ + if (WXS_IS_ATOMIC(type->baseType)) + type->flags |= XML_SCHEMAS_TYPE_VARIETY_ATOMIC; + else if (WXS_IS_LIST(type->baseType)) { + type->flags |= XML_SCHEMAS_TYPE_VARIETY_LIST; + /* + * Inherit the itemType. + */ + type->subtypes = type->baseType->subtypes; + } else if (WXS_IS_UNION(type->baseType)) { + type->flags |= XML_SCHEMAS_TYPE_VARIETY_UNION; + /* + * NOTE that we won't assign the memberTypes of the base, + * since this will make trouble when freeing them; we will + * use a lookup function to access them instead. + */ + } + } + return(0); +} + +#ifdef DEBUG_TYPE +static void +xmlSchemaDebugFixedType(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaTypePtr type) +{ + if (type->node != NULL) { + xmlGenericError(xmlGenericErrorContext, + "Type of %s : %s:%d :", name, + type->node->doc->URL, + xmlGetLineNo(type->node)); + } else { + xmlGenericError(xmlGenericErrorContext, "Type of %s :", name); + } + if ((WXS_IS_SIMPLE(type)) || (WXS_IS_COMPLEX(type))) { + switch (type->contentType) { + case XML_SCHEMA_CONTENT_SIMPLE: + xmlGenericError(xmlGenericErrorContext, "simple\n"); + break; + case XML_SCHEMA_CONTENT_ELEMENTS: + xmlGenericError(xmlGenericErrorContext, "elements\n"); + break; + case XML_SCHEMA_CONTENT_UNKNOWN: + xmlGenericError(xmlGenericErrorContext, "unknown !!!\n"); + break; + case XML_SCHEMA_CONTENT_EMPTY: + xmlGenericError(xmlGenericErrorContext, "empty\n"); + break; + case XML_SCHEMA_CONTENT_MIXED: + if (xmlSchemaIsParticleEmptiable((xmlSchemaParticlePtr) + type->subtypes)) + xmlGenericError(xmlGenericErrorContext, + "mixed as emptiable particle\n"); + else + xmlGenericError(xmlGenericErrorContext, "mixed\n"); + break; + /* Removed, since not used. */ + /* + case XML_SCHEMA_CONTENT_MIXED_OR_ELEMENTS: + xmlGenericError(xmlGenericErrorContext, "mixed or elems\n"); + break; + */ + case XML_SCHEMA_CONTENT_BASIC: + xmlGenericError(xmlGenericErrorContext, "basic\n"); + break; + default: + xmlGenericError(xmlGenericErrorContext, + "not registered !!!\n"); + break; + } + } +} +#endif + +/* +* 3.14.6 Constraints on Simple Type Definition Schema Components +*/ +static int +xmlSchemaFixupSimpleTypeStageTwo(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaTypePtr type) +{ + int res, olderrs = pctxt->nberrors; + + if (type->type != XML_SCHEMA_TYPE_SIMPLE) + return(-1); + + if (! WXS_IS_TYPE_NOT_FIXED(type)) + return(0); + + type->flags |= XML_SCHEMAS_TYPE_INTERNAL_RESOLVED; + type->contentType = XML_SCHEMA_CONTENT_SIMPLE; + + if (type->baseType == NULL) { + PERROR_INT("xmlSchemaFixupSimpleTypeStageTwo", + "missing baseType"); + goto exit_failure; + } + if (WXS_IS_TYPE_NOT_FIXED(type->baseType)) + xmlSchemaTypeFixup(type->baseType, ACTXT_CAST pctxt); + /* + * If a member type of a union is a union itself, we need to substitute + * that member type for its member types. + * NOTE that this might change in WXS 1.1; i.e. we will keep the union + * types in WXS 1.1. + */ + if ((type->memberTypes != NULL) && + (xmlSchemaFinishMemberTypeDefinitionsProperty(pctxt, type) == -1)) + return(-1); + /* + * SPEC src-simple-type 1 + * "The corresponding simple type definition, if any, must satisfy + * the conditions set out in Constraints on Simple Type Definition + * Schema Components (�3.14.6)." + */ + /* + * Schema Component Constraint: Simple Type Definition Properties Correct + * (st-props-correct) + */ + res = xmlSchemaCheckSTPropsCorrect(pctxt, type); + HFAILURE HERROR + /* + * Schema Component Constraint: Derivation Valid (Restriction, Simple) + * (cos-st-restricts) + */ + res = xmlSchemaCheckCOSSTRestricts(pctxt, type); + HFAILURE HERROR + /* + * TODO: Removed the error report, since it got annoying to get an + * extra error report, if anything failed until now. + * Enable this if needed. + * + * xmlSchemaPErr(ctxt, type->node, + * XML_SCHEMAP_SRC_SIMPLE_TYPE_1, + * "Simple type '%s' does not satisfy the constraints " + * "on simple type definitions.\n", + * type->name, NULL); + */ + /* + * Schema Component Constraint: Simple Type Restriction (Facets) + * (st-restrict-facets) + */ + res = xmlSchemaCheckFacetValues(type, pctxt); + HFAILURE HERROR + if ((type->facetSet != NULL) || + (type->baseType->facetSet != NULL)) { + res = xmlSchemaDeriveAndValidateFacets(pctxt, type); + HFAILURE HERROR + } + /* + * Whitespace value. + */ + res = xmlSchemaTypeFixupWhitespace(type); + HFAILURE HERROR + xmlSchemaTypeFixupOptimFacets(type); + +exit_error: +#ifdef DEBUG_TYPE + xmlSchemaDebugFixedType(pctxt, type); +#endif + if (olderrs != pctxt->nberrors) + return(pctxt->err); + return(0); + +exit_failure: +#ifdef DEBUG_TYPE + xmlSchemaDebugFixedType(pctxt, type); +#endif + return(-1); +} + +static int +xmlSchemaFixupComplexType(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaTypePtr type) +{ + int res = 0, olderrs = pctxt->nberrors; + xmlSchemaTypePtr baseType = type->baseType; + + if (! WXS_IS_TYPE_NOT_FIXED(type)) + return(0); + type->flags |= XML_SCHEMAS_TYPE_INTERNAL_RESOLVED; + if (baseType == NULL) { + PERROR_INT("xmlSchemaFixupComplexType", + "missing baseType"); + goto exit_failure; + } + /* + * Fixup the base type. + */ + if (WXS_IS_TYPE_NOT_FIXED(baseType)) + xmlSchemaTypeFixup(baseType, ACTXT_CAST pctxt); + if (baseType->flags & XML_SCHEMAS_TYPE_INTERNAL_INVALID) { + /* + * Skip fixup if the base type is invalid. + * TODO: Generate a warning! + */ + return(0); + } + /* + * This basically checks if the base type can be derived. + */ + res = xmlSchemaCheckSRCCT(pctxt, type); + HFAILURE HERROR + /* + * Fixup the content type. + */ + if (type->contentType == XML_SCHEMA_CONTENT_SIMPLE) { + /* + * Corresponds to ... + */ + if ((WXS_IS_COMPLEX(baseType)) && + (baseType->contentTypeDef != NULL) && + (WXS_IS_RESTRICTION(type))) { + xmlSchemaTypePtr contentBase, content; +#ifdef ENABLE_NAMED_LOCALS + char buf[30]; + const xmlChar *tmpname; +#endif + /* + * SPEC (1) If + base type is , + * "whose own {content type} is a simple type..." + */ + if (type->contentTypeDef != NULL) { + /* + * SPEC (1.1) "the simple type definition corresponding to the + * among the [children] of if there + * is one;" + * Note that this " among the [children]" was put + * into ->contentTypeDef during parsing. + */ + contentBase = type->contentTypeDef; + type->contentTypeDef = NULL; + } else { + /* + * (1.2) "...otherwise ( has no + * among its [children]), the simple type definition which + * is the {content type} of the ... base type." + */ + contentBase = baseType->contentTypeDef; + } + /* + * SPEC + * "... a simple type definition which restricts the simple + * type definition identified in clause 1.1 or clause 1.2 + * with a set of facet components" + * + * Create the anonymous simple type, which will be the content + * type of the complex type. + */ +#ifdef ENABLE_NAMED_LOCALS + snprintf(buf, 29, "#scST%d", ++(pctxt->counter)); + tmpname = xmlDictLookup(pctxt->dict, BAD_CAST buf, -1); + content = xmlSchemaAddType(pctxt, pctxt->schema, + XML_SCHEMA_TYPE_SIMPLE, tmpname, type->targetNamespace, + type->node, 0); +#else + content = xmlSchemaAddType(pctxt, pctxt->schema, + XML_SCHEMA_TYPE_SIMPLE, NULL, type->targetNamespace, + type->node, 0); +#endif + if (content == NULL) + goto exit_failure; + /* + * We will use the same node as for the + * to have it somehow anchored in the schema doc. + */ + content->type = XML_SCHEMA_TYPE_SIMPLE; + content->baseType = contentBase; + /* + * Move the facets, previously anchored on the + * complexType during parsing. + */ + content->facets = type->facets; + type->facets = NULL; + content->facetSet = type->facetSet; + type->facetSet = NULL; + + type->contentTypeDef = content; + if (WXS_IS_TYPE_NOT_FIXED(contentBase)) + xmlSchemaTypeFixup(contentBase, ACTXT_CAST pctxt); + /* + * Fixup the newly created type. We don't need to check + * for circularity here. + */ + res = xmlSchemaFixupSimpleTypeStageOne(pctxt, content); + HFAILURE HERROR + res = xmlSchemaFixupSimpleTypeStageTwo(pctxt, content); + HFAILURE HERROR + + } else if ((WXS_IS_COMPLEX(baseType)) && + (baseType->contentType == XML_SCHEMA_CONTENT_MIXED) && + (WXS_IS_RESTRICTION(type))) { + /* + * SPEC (2) If + base is a mixed with + * an emptiable particle, then a simple type definition which + * restricts the 's child. + */ + if ((type->contentTypeDef == NULL) || + (type->contentTypeDef->baseType == NULL)) { + /* + * TODO: Check if this ever happens. + */ + xmlSchemaPCustomErr(pctxt, + XML_SCHEMAP_INTERNAL, + WXS_BASIC_CAST type, NULL, + "Internal error: xmlSchemaTypeFixup, " + "complex type '%s': the " + "is missing a child, but was not catched " + "by xmlSchemaCheckSRCCT()", type->name); + goto exit_failure; + } + } else if ((WXS_IS_COMPLEX(baseType)) && WXS_IS_EXTENSION(type)) { + /* + * SPEC (3) If + base is with + * content, "...then the {content type} of that + * complex type definition" + */ + if (baseType->contentTypeDef == NULL) { + /* + * TODO: Check if this ever happens. xmlSchemaCheckSRCCT + * should have catched this already. + */ + xmlSchemaPCustomErr(pctxt, + XML_SCHEMAP_INTERNAL, + WXS_BASIC_CAST type, NULL, + "Internal error: xmlSchemaTypeFixup, " + "complex type '%s': the ed base type is " + "a complex type with no simple content type", + type->name); + goto exit_failure; + } + type->contentTypeDef = baseType->contentTypeDef; + } else if ((WXS_IS_SIMPLE(baseType)) && WXS_IS_EXTENSION(type)) { + /* + * SPEC (4) + base is + * "... then that simple type definition" + */ + type->contentTypeDef = baseType; + } else { + /* + * TODO: Check if this ever happens. + */ + xmlSchemaPCustomErr(pctxt, + XML_SCHEMAP_INTERNAL, + WXS_BASIC_CAST type, NULL, + "Internal error: xmlSchemaTypeFixup, " + "complex type '%s' with : unhandled " + "derivation case", type->name); + goto exit_failure; + } + } else { + int dummySequence = 0; + xmlSchemaParticlePtr particle = + (xmlSchemaParticlePtr) type->subtypes; + /* + * Corresponds to ... + * + * NOTE that the effective mixed was already set during parsing of + * and ; its flag value is + * XML_SCHEMAS_TYPE_MIXED. + * + * Compute the "effective content": + * (2.1.1) + (2.1.2) + (2.1.3) + */ + if ((particle == NULL) || + ((particle->type == XML_SCHEMA_TYPE_PARTICLE) && + ((particle->children->type == XML_SCHEMA_TYPE_ALL) || + (particle->children->type == XML_SCHEMA_TYPE_SEQUENCE) || + ((particle->children->type == XML_SCHEMA_TYPE_CHOICE) && + (particle->minOccurs == 0))) && + ( ((xmlSchemaTreeItemPtr) particle->children)->children == NULL))) { + if (type->flags & XML_SCHEMAS_TYPE_MIXED) { + /* + * SPEC (2.1.4) "If the �effective mixed� is true, then + * a particle whose properties are as follows:..." + * + * Empty sequence model group with + * minOccurs/maxOccurs = 1 (i.e. a "particle emptiable"). + * NOTE that we sill assign it the node to + * somehow anchor it in the doc. + */ + if ((particle == NULL) || + (particle->children->type != XML_SCHEMA_TYPE_SEQUENCE)) { + /* + * Create the particle. + */ + particle = xmlSchemaAddParticle(pctxt, + type->node, 1, 1); + if (particle == NULL) + goto exit_failure; + /* + * Create the model group. + */ /* URGENT TODO: avoid adding to pending items. */ + particle->children = (xmlSchemaTreeItemPtr) + xmlSchemaAddModelGroup(pctxt, pctxt->schema, + XML_SCHEMA_TYPE_SEQUENCE, type->node); + if (particle->children == NULL) + goto exit_failure; + + type->subtypes = (xmlSchemaTypePtr) particle; + } + dummySequence = 1; + type->contentType = XML_SCHEMA_CONTENT_ELEMENTS; + } else { + /* + * SPEC (2.1.5) "otherwise empty" + */ + type->contentType = XML_SCHEMA_CONTENT_EMPTY; + } + } else { + /* + * SPEC (2.2) "otherwise the particle corresponding to the + * , , or among the + * [children]." + */ + type->contentType = XML_SCHEMA_CONTENT_ELEMENTS; + } + /* + * Compute the "content type". + */ + if (WXS_IS_RESTRICTION(type)) { + /* + * SPEC (3.1) "If ..." + * (3.1.1) + (3.1.2) */ + if (type->contentType != XML_SCHEMA_CONTENT_EMPTY) { + if (type->flags & XML_SCHEMAS_TYPE_MIXED) + type->contentType = XML_SCHEMA_CONTENT_MIXED; + } + } else { + /* + * SPEC (3.2) "If ..." + */ + if (type->contentType == XML_SCHEMA_CONTENT_EMPTY) { + /* + * SPEC (3.2.1) + * "If the �effective content� is empty, then the + * {content type} of the [...] base ..." + */ + type->contentType = baseType->contentType; + type->subtypes = baseType->subtypes; + /* + * Fixes bug #347316: + * This is the case when the base type has a simple + * type definition as content. + */ + type->contentTypeDef = baseType->contentTypeDef; + /* + * NOTE that the effective mixed is ignored here. + */ + } else if (baseType->contentType == XML_SCHEMA_CONTENT_EMPTY) { + /* + * SPEC (3.2.2) + */ + if (type->flags & XML_SCHEMAS_TYPE_MIXED) + type->contentType = XML_SCHEMA_CONTENT_MIXED; + } else { + /* + * SPEC (3.2.3) + */ + if (type->flags & XML_SCHEMAS_TYPE_MIXED) + type->contentType = XML_SCHEMA_CONTENT_MIXED; + /* + * "A model group whose {compositor} is sequence and whose + * {particles} are..." + */ + if ((WXS_TYPE_PARTICLE(type) != NULL) && + (WXS_TYPE_PARTICLE_TERM(type) != NULL) && + ((WXS_TYPE_PARTICLE_TERM(type))->type == + XML_SCHEMA_TYPE_ALL)) + { + /* + * SPEC cos-all-limited (1) + */ + xmlSchemaCustomErr(ACTXT_CAST pctxt, + /* TODO: error code */ + XML_SCHEMAP_COS_ALL_LIMITED, + WXS_ITEM_NODE(type), NULL, + "The type has an 'all' model group in its " + "{content type} and thus cannot be derived from " + "a non-empty type, since this would produce a " + "'sequence' model group containing the 'all' " + "model group; 'all' model groups are not " + "allowed to appear inside other model groups", + NULL, NULL); + + } else if ((WXS_TYPE_PARTICLE(baseType) != NULL) && + (WXS_TYPE_PARTICLE_TERM(baseType) != NULL) && + ((WXS_TYPE_PARTICLE_TERM(baseType))->type == + XML_SCHEMA_TYPE_ALL)) + { + /* + * SPEC cos-all-limited (1) + */ + xmlSchemaCustomErr(ACTXT_CAST pctxt, + /* TODO: error code */ + XML_SCHEMAP_COS_ALL_LIMITED, + WXS_ITEM_NODE(type), NULL, + "A type cannot be derived by extension from a type " + "which has an 'all' model group in its " + "{content type}, since this would produce a " + "'sequence' model group containing the 'all' " + "model group; 'all' model groups are not " + "allowed to appear inside other model groups", + NULL, NULL); + + } else if (! dummySequence) { + xmlSchemaTreeItemPtr effectiveContent = + (xmlSchemaTreeItemPtr) type->subtypes; + /* + * Create the particle. + */ + particle = xmlSchemaAddParticle(pctxt, + type->node, 1, 1); + if (particle == NULL) + goto exit_failure; + /* + * Create the "sequence" model group. + */ + particle->children = (xmlSchemaTreeItemPtr) + xmlSchemaAddModelGroup(pctxt, pctxt->schema, + XML_SCHEMA_TYPE_SEQUENCE, type->node); + if (particle->children == NULL) + goto exit_failure; + WXS_TYPE_CONTENTTYPE(type) = (xmlSchemaTypePtr) particle; + /* + * SPEC "the particle of the {content type} of + * the ... base ..." + * Create a duplicate of the base type's particle + * and assign its "term" to it. + */ + particle->children->children = + (xmlSchemaTreeItemPtr) xmlSchemaAddParticle(pctxt, + type->node, + ((xmlSchemaParticlePtr) baseType->subtypes)->minOccurs, + ((xmlSchemaParticlePtr) baseType->subtypes)->maxOccurs); + if (particle->children->children == NULL) + goto exit_failure; + particle = (xmlSchemaParticlePtr) + particle->children->children; + particle->children = + ((xmlSchemaParticlePtr) baseType->subtypes)->children; + /* + * SPEC "followed by the �effective content�." + */ + particle->next = effectiveContent; + /* + * This all will result in: + * new-particle + * --> new-sequence( + * new-particle + * --> base-model, + * this-particle + * --> this-model + * ) + */ + } else { + /* + * This is the case when there is already an empty + * with minOccurs==maxOccurs==1. + * Just add the base types's content type. + * NOTE that, although we miss to add an intermediate + * , this should produce no difference to + * neither the regex compilation of the content model, + * nor to the complex type contraints. + */ + particle->children->children = + (xmlSchemaTreeItemPtr) baseType->subtypes; + } + } + } + } + /* + * Now fixup attribute uses: + * - expand attr. group references + * - intersect attribute wildcards + * - inherit attribute uses of the base type + * - inherit or union attr. wildcards if extending + * - apply attr. use prohibitions if restricting + */ + res = xmlSchemaFixupTypeAttributeUses(pctxt, type); + HFAILURE HERROR + /* + * Apply the complex type component constraints; this will not + * check attributes, since this is done in + * xmlSchemaFixupTypeAttributeUses(). + */ + res = xmlSchemaCheckCTComponent(pctxt, type); + HFAILURE HERROR + +#ifdef DEBUG_TYPE + xmlSchemaDebugFixedType(pctxt, type); +#endif + if (olderrs != pctxt->nberrors) + return(pctxt->err); + else + return(0); + +exit_error: + type->flags |= XML_SCHEMAS_TYPE_INTERNAL_INVALID; +#ifdef DEBUG_TYPE + xmlSchemaDebugFixedType(pctxt, type); +#endif + return(pctxt->err); + +exit_failure: + type->flags |= XML_SCHEMAS_TYPE_INTERNAL_INVALID; +#ifdef DEBUG_TYPE + xmlSchemaDebugFixedType(pctxt, type); +#endif + return(-1); +} + + +/** + * xmlSchemaTypeFixup: + * @typeDecl: the schema type definition + * @ctxt: the schema parser context + * + * Fixes the content model of the type. + * URGENT TODO: We need an int result! + */ +static int +xmlSchemaTypeFixup(xmlSchemaTypePtr type, + xmlSchemaAbstractCtxtPtr actxt) +{ + if (type == NULL) + return(0); + if (actxt->type != XML_SCHEMA_CTXT_PARSER) { + AERROR_INT("xmlSchemaTypeFixup", + "this function needs a parser context"); + return(-1); + } + if (! WXS_IS_TYPE_NOT_FIXED(type)) + return(0); + if (type->type == XML_SCHEMA_TYPE_COMPLEX) + return(xmlSchemaFixupComplexType(PCTXT_CAST actxt, type)); + else if (type->type == XML_SCHEMA_TYPE_SIMPLE) + return(xmlSchemaFixupSimpleTypeStageTwo(PCTXT_CAST actxt, type)); + return(0); +} + +/** + * xmlSchemaCheckFacet: + * @facet: the facet + * @typeDecl: the schema type definition + * @pctxt: the schema parser context or NULL + * @name: the optional name of the type + * + * Checks and computes the values of facets. + * + * Returns 0 if valid, a positive error code if not valid and + * -1 in case of an internal or API error. + */ +int +xmlSchemaCheckFacet(xmlSchemaFacetPtr facet, + xmlSchemaTypePtr typeDecl, + xmlSchemaParserCtxtPtr pctxt, + const xmlChar * name ATTRIBUTE_UNUSED) +{ + int ret = 0, ctxtGiven; + + if ((facet == NULL) || (typeDecl == NULL)) + return(-1); + /* + * TODO: will the parser context be given if used from + * the relaxNG module? + */ + if (pctxt == NULL) + ctxtGiven = 0; + else + ctxtGiven = 1; + + switch (facet->type) { + case XML_SCHEMA_FACET_MININCLUSIVE: + case XML_SCHEMA_FACET_MINEXCLUSIVE: + case XML_SCHEMA_FACET_MAXINCLUSIVE: + case XML_SCHEMA_FACET_MAXEXCLUSIVE: + case XML_SCHEMA_FACET_ENUMERATION: { + /* + * Okay we need to validate the value + * at that point. + */ + xmlSchemaTypePtr base; + + /* 4.3.5.5 Constraints on enumeration Schema Components + * Schema Component Constraint: enumeration valid restriction + * It is an �error� if any member of {value} is not in the + * �value space� of {base type definition}. + * + * minInclusive, maxInclusive, minExclusive, maxExclusive: + * The value �must� be in the + * �value space� of the �base type�. + */ + /* + * This function is intended to deliver a compiled value + * on the facet. In this implementation of XML Schemata the + * type holding a facet, won't be a built-in type. + * Thus to ensure that other API + * calls (relaxng) do work, if the given type is a built-in + * type, we will assume that the given built-in type *is + * already* the base type. + */ + if (typeDecl->type != XML_SCHEMA_TYPE_BASIC) { + base = typeDecl->baseType; + if (base == NULL) { + PERROR_INT("xmlSchemaCheckFacet", + "a type user derived type has no base type"); + return (-1); + } + } else + base = typeDecl; + + if (! ctxtGiven) { + /* + * A context is needed if called from RelaxNG. + */ + pctxt = xmlSchemaNewParserCtxt("*"); + if (pctxt == NULL) + return (-1); + } + /* + * NOTE: This call does not check the content nodes, + * since they are not available: + * facet->node is just the node holding the facet + * definition, *not* the attribute holding the *value* + * of the facet. + */ + ret = xmlSchemaVCheckCVCSimpleType( + ACTXT_CAST pctxt, facet->node, base, + facet->value, &(facet->val), 1, 1, 0); + if (ret != 0) { + if (ret < 0) { + /* No error message for RelaxNG. */ + if (ctxtGiven) { + xmlSchemaCustomErr(ACTXT_CAST pctxt, + XML_SCHEMAP_INTERNAL, facet->node, NULL, + "Internal error: xmlSchemaCheckFacet, " + "failed to validate the value '%s' of the " + "facet '%s' against the base type", + facet->value, xmlSchemaFacetTypeToString(facet->type)); + } + goto internal_error; + } + ret = XML_SCHEMAP_INVALID_FACET_VALUE; + /* No error message for RelaxNG. */ + if (ctxtGiven) { + xmlChar *str = NULL; + + xmlSchemaCustomErr(ACTXT_CAST pctxt, + ret, facet->node, WXS_BASIC_CAST facet, + "The value '%s' of the facet does not validate " + "against the base type '%s'", + facet->value, + xmlSchemaFormatQName(&str, + base->targetNamespace, base->name)); + FREE_AND_NULL(str); + } + goto exit; + } else if (facet->val == NULL) { + if (ctxtGiven) { + PERROR_INT("xmlSchemaCheckFacet", + "value was not computed"); + } + TODO + } + break; + } + case XML_SCHEMA_FACET_PATTERN: + facet->regexp = xmlRegexpCompile(facet->value); + if (facet->regexp == NULL) { + ret = XML_SCHEMAP_REGEXP_INVALID; + /* No error message for RelaxNG. */ + if (ctxtGiven) { + xmlSchemaCustomErr(ACTXT_CAST pctxt, + ret, facet->node, WXS_BASIC_CAST typeDecl, + "The value '%s' of the facet 'pattern' is not a " + "valid regular expression", + facet->value, NULL); + } + } + break; + case XML_SCHEMA_FACET_TOTALDIGITS: + case XML_SCHEMA_FACET_FRACTIONDIGITS: + case XML_SCHEMA_FACET_LENGTH: + case XML_SCHEMA_FACET_MAXLENGTH: + case XML_SCHEMA_FACET_MINLENGTH: + + if (facet->type == XML_SCHEMA_FACET_TOTALDIGITS) { + ret = xmlSchemaValidatePredefinedType( + xmlSchemaGetBuiltInType(XML_SCHEMAS_PINTEGER), + facet->value, &(facet->val)); + } else { + ret = xmlSchemaValidatePredefinedType( + xmlSchemaGetBuiltInType(XML_SCHEMAS_NNINTEGER), + facet->value, &(facet->val)); + } + if (ret != 0) { + if (ret < 0) { + /* No error message for RelaxNG. */ + if (ctxtGiven) { + PERROR_INT("xmlSchemaCheckFacet", + "validating facet value"); + } + goto internal_error; + } + ret = XML_SCHEMAP_INVALID_FACET_VALUE; + /* No error message for RelaxNG. */ + if (ctxtGiven) { + /* error code */ + xmlSchemaCustomErr4(ACTXT_CAST pctxt, + ret, facet->node, WXS_BASIC_CAST typeDecl, + "The value '%s' of the facet '%s' is not a valid '%s'", + facet->value, + xmlSchemaFacetTypeToString(facet->type), + (facet->type != XML_SCHEMA_FACET_TOTALDIGITS) ? + BAD_CAST "nonNegativeInteger" : + BAD_CAST "positiveInteger", + NULL); + } + } + break; + + case XML_SCHEMA_FACET_WHITESPACE:{ + if (xmlStrEqual(facet->value, BAD_CAST "preserve")) { + facet->whitespace = XML_SCHEMAS_FACET_PRESERVE; + } else if (xmlStrEqual(facet->value, BAD_CAST "replace")) { + facet->whitespace = XML_SCHEMAS_FACET_REPLACE; + } else if (xmlStrEqual(facet->value, BAD_CAST "collapse")) { + facet->whitespace = XML_SCHEMAS_FACET_COLLAPSE; + } else { + ret = XML_SCHEMAP_INVALID_FACET_VALUE; + /* No error message for RelaxNG. */ + if (ctxtGiven) { + /* error was previously: XML_SCHEMAP_INVALID_WHITE_SPACE */ + xmlSchemaCustomErr(ACTXT_CAST pctxt, + ret, facet->node, WXS_BASIC_CAST typeDecl, + "The value '%s' of the facet 'whitespace' is not " + "valid", facet->value, NULL); + } + } + } + default: + break; + } +exit: + if ((! ctxtGiven) && (pctxt != NULL)) + xmlSchemaFreeParserCtxt(pctxt); + return (ret); +internal_error: + if ((! ctxtGiven) && (pctxt != NULL)) + xmlSchemaFreeParserCtxt(pctxt); + return (-1); +} + +/** + * xmlSchemaCheckFacetValues: + * @typeDecl: the schema type definition + * @ctxt: the schema parser context + * + * Checks the default values types, especially for facets + */ +static int +xmlSchemaCheckFacetValues(xmlSchemaTypePtr typeDecl, + xmlSchemaParserCtxtPtr pctxt) +{ + int res, olderrs = pctxt->nberrors; + const xmlChar *name = typeDecl->name; + /* + * NOTE: It is intended to use the facets list, instead + * of facetSet. + */ + if (typeDecl->facets != NULL) { + xmlSchemaFacetPtr facet = typeDecl->facets; + + /* + * Temporarily assign the "schema" to the validation context + * of the parser context. This is needed for NOTATION validation. + */ + if (pctxt->vctxt == NULL) { + if (xmlSchemaCreateVCtxtOnPCtxt(pctxt) == -1) + return(-1); + } + pctxt->vctxt->schema = pctxt->schema; + while (facet != NULL) { + res = xmlSchemaCheckFacet(facet, typeDecl, pctxt, name); + HFAILURE + facet = facet->next; + } + pctxt->vctxt->schema = NULL; + } + if (olderrs != pctxt->nberrors) + return(pctxt->err); + return(0); +exit_failure: + return(-1); +} + +/** + * xmlSchemaGetCircModelGrDefRef: + * @ctxtMGroup: the searched model group + * @selfMGroup: the second searched model group + * @particle: the first particle + * + * This one is intended to be used by + * xmlSchemaCheckGroupDefCircular only. + * + * Returns the particle with the circular model group definition reference, + * otherwise NULL. + */ +static xmlSchemaTreeItemPtr +xmlSchemaGetCircModelGrDefRef(xmlSchemaModelGroupDefPtr groupDef, + xmlSchemaTreeItemPtr particle) +{ + xmlSchemaTreeItemPtr circ = NULL; + xmlSchemaTreeItemPtr term; + xmlSchemaModelGroupDefPtr gdef; + + for (; particle != NULL; particle = particle->next) { + term = particle->children; + if (term == NULL) + continue; + switch (term->type) { + case XML_SCHEMA_TYPE_GROUP: + gdef = (xmlSchemaModelGroupDefPtr) term; + if (gdef == groupDef) + return (particle); + /* + * Mark this model group definition to avoid infinite + * recursion on circular references not yet examined. + */ + if (gdef->flags & XML_SCHEMA_MODEL_GROUP_DEF_MARKED) + continue; + if (gdef->children != NULL) { + gdef->flags |= XML_SCHEMA_MODEL_GROUP_DEF_MARKED; + circ = xmlSchemaGetCircModelGrDefRef(groupDef, + gdef->children->children); + gdef->flags ^= XML_SCHEMA_MODEL_GROUP_DEF_MARKED; + if (circ != NULL) + return (circ); + } + break; + case XML_SCHEMA_TYPE_SEQUENCE: + case XML_SCHEMA_TYPE_CHOICE: + case XML_SCHEMA_TYPE_ALL: + circ = xmlSchemaGetCircModelGrDefRef(groupDef, term->children); + if (circ != NULL) + return (circ); + break; + default: + break; + } + } + return (NULL); +} + +/** + * xmlSchemaCheckGroupDefCircular: + * @item: the model group definition + * @ctxt: the parser context + * @name: the name + * + * Checks for circular references to model group definitions. + */ +static void +xmlSchemaCheckGroupDefCircular(xmlSchemaModelGroupDefPtr item, + xmlSchemaParserCtxtPtr ctxt) +{ + /* + * Schema Component Constraint: Model Group Correct + * 2 Circular groups are disallowed. That is, within the {particles} + * of a group there must not be at any depth a particle whose {term} + * is the group itself. + */ + if ((item == NULL) || + (item->type != XML_SCHEMA_TYPE_GROUP) || + (item->children == NULL)) + return; + { + xmlSchemaTreeItemPtr circ; + + circ = xmlSchemaGetCircModelGrDefRef(item, item->children->children); + if (circ != NULL) { + xmlChar *str = NULL; + /* + * TODO: The error report is not adequate: this constraint + * is defined for model groups but not definitions, but since + * there cannot be any circular model groups without a model group + * definition (if not using a construction API), we check those + * defintions only. + */ + xmlSchemaPCustomErr(ctxt, + XML_SCHEMAP_MG_PROPS_CORRECT_2, + NULL, WXS_ITEM_NODE(circ), + "Circular reference to the model group definition '%s' " + "defined", xmlSchemaFormatQName(&str, + item->targetNamespace, item->name)); + FREE_AND_NULL(str) + /* + * NOTE: We will cut the reference to avoid further + * confusion of the processor. This is a fatal error. + */ + circ->children = NULL; + } + } +} + +/** + * xmlSchemaModelGroupToModelGroupDefFixup: + * @ctxt: the parser context + * @mg: the model group + * + * Assigns the model group of model group definitions to the "term" + * of the referencing particle. + * In xmlSchemaResolveModelGroupParticleReferences the model group + * definitions were assigned to the "term", since needed for the + * circularity check. + * + * Schema Component Constraint: + * All Group Limited (cos-all-limited) (1.2) + */ +static void +xmlSchemaModelGroupToModelGroupDefFixup( + xmlSchemaParserCtxtPtr ctxt ATTRIBUTE_UNUSED, + xmlSchemaModelGroupPtr mg) +{ + xmlSchemaParticlePtr particle = WXS_MODELGROUP_PARTICLE(mg); + + while (particle != NULL) { + if ((WXS_PARTICLE_TERM(particle) == NULL) || + ((WXS_PARTICLE_TERM(particle))->type != + XML_SCHEMA_TYPE_GROUP)) + { + particle = WXS_PTC_CAST particle->next; + continue; + } + if (WXS_MODELGROUPDEF_MODEL(WXS_PARTICLE_TERM(particle)) == NULL) { + /* + * TODO: Remove the particle. + */ + WXS_PARTICLE_TERM(particle) = NULL; + particle = WXS_PTC_CAST particle->next; + continue; + } + /* + * Assign the model group to the {term} of the particle. + */ + WXS_PARTICLE_TERM(particle) = + WXS_TREE_CAST WXS_MODELGROUPDEF_MODEL(WXS_PARTICLE_TERM(particle)); + + particle = WXS_PTC_CAST particle->next; + } +} + +/** + * xmlSchemaCheckAttrGroupCircularRecur: + * @ctxtGr: the searched attribute group + * @attr: the current attribute list to be processed + * + * This one is intended to be used by + * xmlSchemaCheckAttrGroupCircular only. + * + * Returns the circular attribute grou reference, otherwise NULL. + */ +static xmlSchemaQNameRefPtr +xmlSchemaCheckAttrGroupCircularRecur(xmlSchemaAttributeGroupPtr ctxtGr, + xmlSchemaItemListPtr list) +{ + xmlSchemaAttributeGroupPtr gr; + xmlSchemaQNameRefPtr ref, circ; + int i; + /* + * We will search for an attribute group reference which + * references the context attribute group. + */ + for (i = 0; i < list->nbItems; i++) { + ref = list->items[i]; + if ((ref->type == XML_SCHEMA_EXTRA_QNAMEREF) && + (ref->itemType == XML_SCHEMA_TYPE_ATTRIBUTEGROUP) && + (ref->item != NULL)) + { + gr = WXS_ATTR_GROUP_CAST ref->item; + if (gr == ctxtGr) + return(ref); + if (gr->flags & XML_SCHEMAS_ATTRGROUP_MARKED) + continue; + /* + * Mark as visited to avoid infinite recursion on + * circular references not yet examined. + */ + if ((gr->attrUses) && + (gr->flags & XML_SCHEMAS_ATTRGROUP_HAS_REFS)) + { + gr->flags |= XML_SCHEMAS_ATTRGROUP_MARKED; + circ = xmlSchemaCheckAttrGroupCircularRecur(ctxtGr, + (xmlSchemaItemListPtr) gr->attrUses); + gr->flags ^= XML_SCHEMAS_ATTRGROUP_MARKED; + if (circ != NULL) + return (circ); + } + + } + } + return (NULL); +} + +/** + * xmlSchemaCheckAttrGroupCircular: + * attrGr: the attribute group definition + * @ctxt: the parser context + * @name: the name + * + * Checks for circular references of attribute groups. + */ +static int +xmlSchemaCheckAttrGroupCircular(xmlSchemaAttributeGroupPtr attrGr, + xmlSchemaParserCtxtPtr ctxt) +{ + /* + * Schema Representation Constraint: + * Attribute Group Definition Representation OK + * 3 Circular group reference is disallowed outside . + * That is, unless this element information item's parent is + * , then among the [children], if any, there must + * not be an with ref [attribute] which resolves + * to the component corresponding to this . Indirect + * circularity is also ruled out. That is, when QName resolution + * (Schema Document) (�3.15.3) is applied to a �QName� arising from + * any s with a ref [attribute] among the [children], + * it must not be the case that a �QName� is encountered at any depth + * which resolves to the component corresponding to this . + */ + if (attrGr->attrUses == NULL) + return(0); + else if ((attrGr->flags & XML_SCHEMAS_ATTRGROUP_HAS_REFS) == 0) + return(0); + else { + xmlSchemaQNameRefPtr circ; + + circ = xmlSchemaCheckAttrGroupCircularRecur(attrGr, + (xmlSchemaItemListPtr) attrGr->attrUses); + if (circ != NULL) { + xmlChar *str = NULL; + /* + * TODO: Report the referenced attr group as QName. + */ + xmlSchemaPCustomErr(ctxt, + XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_3, + NULL, WXS_ITEM_NODE(WXS_BASIC_CAST circ), + "Circular reference to the attribute group '%s' " + "defined", xmlSchemaGetComponentQName(&str, attrGr)); + FREE_AND_NULL(str); + /* + * NOTE: We will cut the reference to avoid further + * confusion of the processor. + * BADSPEC TODO: The spec should define how to process in this case. + */ + circ->item = NULL; + return(ctxt->err); + } + } + return(0); +} + +static int +xmlSchemaAttributeGroupExpandRefs(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaAttributeGroupPtr attrGr); + +/** + * xmlSchemaExpandAttributeGroupRefs: + * @pctxt: the parser context + * @node: the node of the component holding the attribute uses + * @completeWild: the intersected wildcard to be returned + * @list: the attribute uses + * + * Substitutes contained attribute group references + * for their attribute uses. Wilcards are intersected. + * Attribute use prohibitions are removed from the list + * and returned via the @prohibs list. + * Pointlessness of attr. prohibs, if a matching attr. decl + * is existent a well, are checked. + */ +static int +xmlSchemaExpandAttributeGroupRefs(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaBasicItemPtr item, + xmlSchemaWildcardPtr *completeWild, + xmlSchemaItemListPtr list, + xmlSchemaItemListPtr prohibs) +{ + xmlSchemaAttributeGroupPtr gr; + xmlSchemaAttributeUsePtr use; + xmlSchemaItemListPtr sublist; + int i, j; + int created = (*completeWild == NULL) ? 0 : 1; + + if (prohibs) + prohibs->nbItems = 0; + + for (i = 0; i < list->nbItems; i++) { + use = list->items[i]; + + if (use->type == XML_SCHEMA_EXTRA_ATTR_USE_PROHIB) { + if (prohibs == NULL) { + PERROR_INT("xmlSchemaExpandAttributeGroupRefs", + "unexpected attr prohibition found"); + return(-1); + } + /* + * Remove from attribute uses. + */ + if (xmlSchemaItemListRemove(list, i) == -1) + return(-1); + i--; + /* + * Note that duplicate prohibitions were already + * handled at parsing time. + */ + /* + * Add to list of prohibitions. + */ + xmlSchemaItemListAddSize(prohibs, 2, use); + continue; + } + if ((use->type == XML_SCHEMA_EXTRA_QNAMEREF) && + ((WXS_QNAME_CAST use)->itemType == XML_SCHEMA_TYPE_ATTRIBUTEGROUP)) + { + if ((WXS_QNAME_CAST use)->item == NULL) + return(-1); + gr = WXS_ATTR_GROUP_CAST (WXS_QNAME_CAST use)->item; + /* + * Expand the referenced attr. group. + * TODO: remove this, this is done in a previous step, so + * already done here. + */ + if ((gr->flags & XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED) == 0) { + if (xmlSchemaAttributeGroupExpandRefs(pctxt, gr) == -1) + return(-1); + } + /* + * Build the 'complete' wildcard; i.e. intersect multiple + * wildcards. + */ + if (gr->attributeWildcard != NULL) { + if (*completeWild == NULL) { + *completeWild = gr->attributeWildcard; + } else { + if (! created) { + xmlSchemaWildcardPtr tmpWild; + + /* + * Copy the first encountered wildcard as context, + * except for the annotation. + * + * Although the complete wildcard might not correspond + * to any node in the schema, we will anchor it on + * the node of the owner component. + */ + tmpWild = xmlSchemaAddWildcard(pctxt, pctxt->schema, + XML_SCHEMA_TYPE_ANY_ATTRIBUTE, + WXS_ITEM_NODE(item)); + if (tmpWild == NULL) + return(-1); + if (xmlSchemaCloneWildcardNsConstraints(pctxt, + tmpWild, *completeWild) == -1) + return (-1); + tmpWild->processContents = (*completeWild)->processContents; + *completeWild = tmpWild; + created = 1; + } + + if (xmlSchemaIntersectWildcards(pctxt, *completeWild, + gr->attributeWildcard) == -1) + return(-1); + } + } + /* + * Just remove the reference if the referenced group does not + * contain any attribute uses. + */ + sublist = ((xmlSchemaItemListPtr) gr->attrUses); + if ((sublist == NULL) || sublist->nbItems == 0) { + if (xmlSchemaItemListRemove(list, i) == -1) + return(-1); + i--; + continue; + } + /* + * Add the attribute uses. + */ + list->items[i] = sublist->items[0]; + if (sublist->nbItems != 1) { + for (j = 1; j < sublist->nbItems; j++) { + i++; + if (xmlSchemaItemListInsert(list, + sublist->items[j], i) == -1) + return(-1); + } + } + } + + } + /* + * Handle pointless prohibitions of declared attributes. + */ + if (prohibs && (prohibs->nbItems != 0) && (list->nbItems != 0)) { + xmlSchemaAttributeUseProhibPtr prohib; + + for (i = prohibs->nbItems -1; i >= 0; i--) { + prohib = prohibs->items[i]; + for (j = 0; j < list->nbItems; j++) { + use = list->items[j]; + + if ((prohib->name == WXS_ATTRUSE_DECL_NAME(use)) && + (prohib->targetNamespace == WXS_ATTRUSE_DECL_TNS(use))) + { + xmlChar *str = NULL; + + xmlSchemaCustomWarning(ACTXT_CAST pctxt, + XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH, + prohib->node, NULL, + "Skipping pointless attribute use prohibition " + "'%s', since a corresponding attribute use " + "exists already in the type definition", + xmlSchemaFormatQName(&str, + prohib->targetNamespace, prohib->name), + NULL, NULL); + FREE_AND_NULL(str); + /* + * Remove the prohibition. + */ + if (xmlSchemaItemListRemove(prohibs, i) == -1) + return(-1); + break; + } + } + } + } + return(0); +} + +/** + * xmlSchemaAttributeGroupExpandRefs: + * @pctxt: the parser context + * @attrGr: the attribute group definition + * + * Computation of: + * {attribute uses} property + * {attribute wildcard} property + * + * Substitutes contained attribute group references + * for their attribute uses. Wilcards are intersected. + */ +static int +xmlSchemaAttributeGroupExpandRefs(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaAttributeGroupPtr attrGr) +{ + if ((attrGr->attrUses == NULL) || + (attrGr->flags & XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED)) + return(0); + + attrGr->flags |= XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED; + if (xmlSchemaExpandAttributeGroupRefs(pctxt, WXS_BASIC_CAST attrGr, + &(attrGr->attributeWildcard), attrGr->attrUses, NULL) == -1) + return(-1); + return(0); +} + +/** + * xmlSchemaAttributeGroupExpandRefs: + * @pctxt: the parser context + * @attrGr: the attribute group definition + * + * Substitutes contained attribute group references + * for their attribute uses. Wilcards are intersected. + * + * Schema Component Constraint: + * Attribute Group Definition Properties Correct (ag-props-correct) + */ +static int +xmlSchemaCheckAGPropsCorrect(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaAttributeGroupPtr attrGr) +{ + /* + * SPEC ag-props-correct + * (1) "The values of the properties of an attribute group definition + * must be as described in the property tableau in The Attribute + * Group Definition Schema Component (�3.6.1), modulo the impact of + * Missing Sub-components (�5.3);" + */ + + if ((attrGr->attrUses != NULL) && + (WXS_LIST_CAST attrGr->attrUses)->nbItems > 1) + { + xmlSchemaItemListPtr uses = WXS_LIST_CAST attrGr->attrUses; + xmlSchemaAttributeUsePtr use, tmp; + int i, j, hasId = 0; + + for (i = uses->nbItems -1; i >= 0; i--) { + use = uses->items[i]; + /* + * SPEC ag-props-correct + * (2) "Two distinct members of the {attribute uses} must not have + * {attribute declaration}s both of whose {name}s match and whose + * {target namespace}s are identical." + */ + if (i > 0) { + for (j = i -1; j >= 0; j--) { + tmp = uses->items[j]; + if ((WXS_ATTRUSE_DECL_NAME(use) == + WXS_ATTRUSE_DECL_NAME(tmp)) && + (WXS_ATTRUSE_DECL_TNS(use) == + WXS_ATTRUSE_DECL_TNS(tmp))) + { + xmlChar *str = NULL; + + xmlSchemaCustomErr(ACTXT_CAST pctxt, + XML_SCHEMAP_AG_PROPS_CORRECT, + attrGr->node, WXS_BASIC_CAST attrGr, + "Duplicate %s", + xmlSchemaGetComponentDesignation(&str, use), + NULL); + FREE_AND_NULL(str); + /* + * Remove the duplicate. + */ + if (xmlSchemaItemListRemove(uses, i) == -1) + return(-1); + goto next_use; + } + } + } + /* + * SPEC ag-props-correct + * (3) "Two distinct members of the {attribute uses} must not have + * {attribute declaration}s both of whose {type definition}s are or + * are derived from ID." + * TODO: Does 'derived' include member-types of unions? + */ + if (WXS_ATTRUSE_TYPEDEF(use) != NULL) { + if (xmlSchemaIsDerivedFromBuiltInType( + WXS_ATTRUSE_TYPEDEF(use), XML_SCHEMAS_ID)) + { + if (hasId) { + xmlChar *str = NULL; + + xmlSchemaCustomErr(ACTXT_CAST pctxt, + XML_SCHEMAP_AG_PROPS_CORRECT, + attrGr->node, WXS_BASIC_CAST attrGr, + "There must not exist more than one attribute " + "declaration of type 'xs:ID' " + "(or derived from 'xs:ID'). The %s violates this " + "constraint", + xmlSchemaGetComponentDesignation(&str, use), + NULL); + FREE_AND_NULL(str); + if (xmlSchemaItemListRemove(uses, i) == -1) + return(-1); + } + hasId = 1; + } + } +next_use: {} + } + } + return(0); +} + +/** + * xmlSchemaResolveAttrGroupReferences: + * @attrgrpDecl: the schema attribute definition + * @ctxt: the schema parser context + * @name: the attribute name + * + * Resolves references to attribute group definitions. + */ +static int +xmlSchemaResolveAttrGroupReferences(xmlSchemaQNameRefPtr ref, + xmlSchemaParserCtxtPtr ctxt) +{ + xmlSchemaAttributeGroupPtr group; + + if (ref->item != NULL) + return(0); + group = xmlSchemaGetAttributeGroup(ctxt->schema, + ref->name, + ref->targetNamespace); + if (group == NULL) { + xmlSchemaPResCompAttrErr(ctxt, + XML_SCHEMAP_SRC_RESOLVE, + NULL, ref->node, + "ref", ref->name, ref->targetNamespace, + ref->itemType, NULL); + return(ctxt->err); + } + ref->item = WXS_BASIC_CAST group; + return(0); +} + +/** + * xmlSchemaCheckAttrPropsCorrect: + * @item: an schema attribute declaration/use + * @ctxt: a schema parser context + * @name: the name of the attribute + * + * + * Schema Component Constraint: + * Attribute Declaration Properties Correct (a-props-correct) + * + * Validates the value constraints of an attribute declaration/use. + * NOTE that this needs the simle type definitions to be already + * builded and checked. + */ +static int +xmlSchemaCheckAttrPropsCorrect(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaAttributePtr attr) +{ + + /* + * SPEC a-props-correct (1) + * "The values of the properties of an attribute declaration must + * be as described in the property tableau in The Attribute + * Declaration Schema Component (�3.2.1), modulo the impact of + * Missing Sub-components (�5.3)." + */ + + if (WXS_ATTR_TYPEDEF(attr) == NULL) + return(0); + + if (attr->defValue != NULL) { + int ret; + + /* + * SPEC a-props-correct (3) + * "If the {type definition} is or is derived from ID then there + * must not be a {value constraint}." + */ + if (xmlSchemaIsDerivedFromBuiltInType( + WXS_ATTR_TYPEDEF(attr), XML_SCHEMAS_ID)) + { + xmlSchemaCustomErr(ACTXT_CAST pctxt, + XML_SCHEMAP_A_PROPS_CORRECT_3, + NULL, WXS_BASIC_CAST attr, + "Value constraints are not allowed if the type definition " + "is or is derived from xs:ID", + NULL, NULL); + return(pctxt->err); + } + /* + * SPEC a-props-correct (2) + * "if there is a {value constraint}, the canonical lexical + * representation of its value must be �valid� with respect + * to the {type definition} as defined in String Valid (�3.14.4)." + * TODO: Don't care about the *cononical* stuff here, this requirement + * will be removed in WXS 1.1 anyway. + */ + ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST pctxt, + attr->node, WXS_ATTR_TYPEDEF(attr), + attr->defValue, &(attr->defVal), + 1, 1, 0); + if (ret != 0) { + if (ret < 0) { + PERROR_INT("xmlSchemaCheckAttrPropsCorrect", + "calling xmlSchemaVCheckCVCSimpleType()"); + return(-1); + } + xmlSchemaCustomErr(ACTXT_CAST pctxt, + XML_SCHEMAP_A_PROPS_CORRECT_2, + NULL, WXS_BASIC_CAST attr, + "The value of the value constraint is not valid", + NULL, NULL); + return(pctxt->err); + } + } + + return(0); +} + +static xmlSchemaElementPtr +xmlSchemaCheckSubstGroupCircular(xmlSchemaElementPtr elemDecl, + xmlSchemaElementPtr ancestor) +{ + xmlSchemaElementPtr ret; + + if (WXS_SUBST_HEAD(ancestor) == NULL) + return (NULL); + if (WXS_SUBST_HEAD(ancestor) == elemDecl) + return (ancestor); + + if (WXS_SUBST_HEAD(ancestor)->flags & XML_SCHEMAS_ELEM_CIRCULAR) + return (NULL); + WXS_SUBST_HEAD(ancestor)->flags |= XML_SCHEMAS_ELEM_CIRCULAR; + ret = xmlSchemaCheckSubstGroupCircular(elemDecl, + WXS_SUBST_HEAD(ancestor)); + WXS_SUBST_HEAD(ancestor)->flags ^= XML_SCHEMAS_ELEM_CIRCULAR; + + return (ret); +} + +/** + * xmlSchemaCheckElemPropsCorrect: + * @ctxt: a schema parser context + * @decl: the element declaration + * @name: the name of the attribute + * + * Schema Component Constraint: + * Element Declaration Properties Correct (e-props-correct) + * + * STATUS: + * missing: (6) + */ +static int +xmlSchemaCheckElemPropsCorrect(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaElementPtr elemDecl) +{ + int ret = 0; + xmlSchemaTypePtr typeDef = WXS_ELEM_TYPEDEF(elemDecl); + /* + * SPEC (1) "The values of the properties of an element declaration + * must be as described in the property tableau in The Element + * Declaration Schema Component (�3.3.1), modulo the impact of Missing + * Sub-components (�5.3)." + */ + if (WXS_SUBST_HEAD(elemDecl) != NULL) { + xmlSchemaElementPtr head = WXS_SUBST_HEAD(elemDecl), circ; + + xmlSchemaCheckElementDeclComponent(head, pctxt); + /* + * SPEC (3) "If there is a non-�absent� {substitution group + * affiliation}, then {scope} must be global." + */ + if ((elemDecl->flags & XML_SCHEMAS_ELEM_GLOBAL) == 0) { + xmlSchemaPCustomErr(pctxt, + XML_SCHEMAP_E_PROPS_CORRECT_3, + WXS_BASIC_CAST elemDecl, NULL, + "Only global element declarations can have a " + "substitution group affiliation", NULL); + ret = XML_SCHEMAP_E_PROPS_CORRECT_3; + } + /* + * TODO: SPEC (6) "Circular substitution groups are disallowed. + * That is, it must not be possible to return to an element declaration + * by repeatedly following the {substitution group affiliation} + * property." + */ + if (head == elemDecl) + circ = head; + else if (WXS_SUBST_HEAD(head) != NULL) + circ = xmlSchemaCheckSubstGroupCircular(head, head); + else + circ = NULL; + if (circ != NULL) { + xmlChar *strA = NULL, *strB = NULL; + + xmlSchemaPCustomErrExt(pctxt, + XML_SCHEMAP_E_PROPS_CORRECT_6, + WXS_BASIC_CAST circ, NULL, + "The element declaration '%s' defines a circular " + "substitution group to element declaration '%s'", + xmlSchemaGetComponentQName(&strA, circ), + xmlSchemaGetComponentQName(&strB, head), + NULL); + FREE_AND_NULL(strA) + FREE_AND_NULL(strB) + ret = XML_SCHEMAP_E_PROPS_CORRECT_6; + } + /* + * SPEC (4) "If there is a {substitution group affiliation}, + * the {type definition} + * of the element declaration must be validly derived from the {type + * definition} of the {substitution group affiliation}, given the value + * of the {substitution group exclusions} of the {substitution group + * affiliation}, as defined in Type Derivation OK (Complex) (�3.4.6) + * (if the {type definition} is complex) or as defined in + * Type Derivation OK (Simple) (�3.14.6) (if the {type definition} is + * simple)." + * + * NOTE: {substitution group exclusions} means the values of the + * attribute "final". + */ + + if (typeDef != WXS_ELEM_TYPEDEF(WXS_SUBST_HEAD(elemDecl))) { + int set = 0; + + if (head->flags & XML_SCHEMAS_ELEM_FINAL_EXTENSION) + set |= SUBSET_EXTENSION; + if (head->flags & XML_SCHEMAS_ELEM_FINAL_RESTRICTION) + set |= SUBSET_RESTRICTION; + + if (xmlSchemaCheckCOSDerivedOK(ACTXT_CAST pctxt, typeDef, + WXS_ELEM_TYPEDEF(head), set) != 0) { + xmlChar *strA = NULL, *strB = NULL, *strC = NULL; + + ret = XML_SCHEMAP_E_PROPS_CORRECT_4; + xmlSchemaPCustomErrExt(pctxt, + XML_SCHEMAP_E_PROPS_CORRECT_4, + WXS_BASIC_CAST elemDecl, NULL, + "The type definition '%s' was " + "either rejected by the substitution group " + "affiliation '%s', or not validly derived from its type " + "definition '%s'", + xmlSchemaGetComponentQName(&strA, typeDef), + xmlSchemaGetComponentQName(&strB, head), + xmlSchemaGetComponentQName(&strC, WXS_ELEM_TYPEDEF(head))); + FREE_AND_NULL(strA) + FREE_AND_NULL(strB) + FREE_AND_NULL(strC) + } + } + } + /* + * SPEC (5) "If the {type definition} or {type definition}'s + * {content type} + * is or is derived from ID then there must not be a {value constraint}. + * Note: The use of ID as a type definition for elements goes beyond + * XML 1.0, and should be avoided if backwards compatibility is desired" + */ + if ((elemDecl->value != NULL) && + ((WXS_IS_SIMPLE(typeDef) && + xmlSchemaIsDerivedFromBuiltInType(typeDef, XML_SCHEMAS_ID)) || + (WXS_IS_COMPLEX(typeDef) && + WXS_HAS_SIMPLE_CONTENT(typeDef) && + xmlSchemaIsDerivedFromBuiltInType(typeDef->contentTypeDef, + XML_SCHEMAS_ID)))) { + + ret = XML_SCHEMAP_E_PROPS_CORRECT_5; + xmlSchemaPCustomErr(pctxt, + XML_SCHEMAP_E_PROPS_CORRECT_5, + WXS_BASIC_CAST elemDecl, NULL, + "The type definition (or type definition's content type) is or " + "is derived from ID; value constraints are not allowed in " + "conjunction with such a type definition", NULL); + } else if (elemDecl->value != NULL) { + int vcret; + xmlNodePtr node = NULL; + + /* + * SPEC (2) "If there is a {value constraint}, the canonical lexical + * representation of its value must be �valid� with respect to the + * {type definition} as defined in Element Default Valid (Immediate) + * (�3.3.6)." + */ + if (typeDef == NULL) { + xmlSchemaPErr(pctxt, elemDecl->node, + XML_SCHEMAP_INTERNAL, + "Internal error: xmlSchemaCheckElemPropsCorrect, " + "type is missing... skipping validation of " + "the value constraint", NULL, NULL); + return (-1); + } + if (elemDecl->node != NULL) { + if (elemDecl->flags & XML_SCHEMAS_ELEM_FIXED) + node = (xmlNodePtr) xmlHasProp(elemDecl->node, + BAD_CAST "fixed"); + else + node = (xmlNodePtr) xmlHasProp(elemDecl->node, + BAD_CAST "default"); + } + vcret = xmlSchemaParseCheckCOSValidDefault(pctxt, node, + typeDef, elemDecl->value, &(elemDecl->defVal)); + if (vcret != 0) { + if (vcret < 0) { + PERROR_INT("xmlSchemaElemCheckValConstr", + "failed to validate the value constraint of an " + "element declaration"); + return (-1); + } + return (vcret); + } + } + + return (ret); +} + +/** + * xmlSchemaCheckElemSubstGroup: + * @ctxt: a schema parser context + * @decl: the element declaration + * @name: the name of the attribute + * + * Schema Component Constraint: + * Substitution Group (cos-equiv-class) + * + * In Libxml2 the subst. groups will be precomputed, in terms of that + * a list will be built for each subst. group head, holding all direct + * referents to this head. + * NOTE that this function needs: + * 1. circular subst. groups to be checked beforehand + * 2. the declaration's type to be derived from the head's type + * + * STATUS: + * + */ +static void +xmlSchemaCheckElemSubstGroup(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaElementPtr elemDecl) +{ + if ((WXS_SUBST_HEAD(elemDecl) == NULL) || + /* SPEC (1) "Its {abstract} is false." */ + (elemDecl->flags & XML_SCHEMAS_ELEM_ABSTRACT)) + return; + { + xmlSchemaElementPtr head; + xmlSchemaTypePtr headType, type; + int set, methSet; + /* + * SPEC (2) "It is validly substitutable for HEAD subject to HEAD's + * {disallowed substitutions} as the blocking constraint, as defined in + * Substitution Group OK (Transitive) (�3.3.6)." + */ + for (head = WXS_SUBST_HEAD(elemDecl); head != NULL; + head = WXS_SUBST_HEAD(head)) { + set = 0; + methSet = 0; + /* + * The blocking constraints. + */ + if (head->flags & XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION) + continue; + headType = head->subtypes; + type = elemDecl->subtypes; + if (headType == type) + goto add_member; + if (head->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION) + set |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION; + if (head->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION) + set |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION; + /* + * SPEC: Substitution Group OK (Transitive) (2.3) + * "The set of all {derivation method}s involved in the + * derivation of D's {type definition} from C's {type definition} + * does not intersect with the union of the blocking constraint, + * C's {prohibited substitutions} (if C is complex, otherwise the + * empty set) and the {prohibited substitutions} (respectively the + * empty set) of any intermediate {type definition}s in the + * derivation of D's {type definition} from C's {type definition}." + */ + /* + * OPTIMIZE TODO: Optimize this a bit, since, if traversing the + * subst.head axis, the methSet does not need to be computed for + * the full depth over and over. + */ + /* + * The set of all {derivation method}s involved in the derivation + */ + while ((type != NULL) && (type != headType)) { + if ((WXS_IS_EXTENSION(type)) && + ((methSet & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) == 0)) + methSet |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION; + + if (WXS_IS_RESTRICTION(type) && + ((methSet & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) == 0)) + methSet |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION; + + type = type->baseType; + } + /* + * The {prohibited substitutions} of all intermediate types + + * the head's type. + */ + type = elemDecl->subtypes->baseType; + while (type != NULL) { + if (WXS_IS_COMPLEX(type)) { + if ((type->flags & + XML_SCHEMAS_TYPE_BLOCK_EXTENSION) && + ((set & XML_SCHEMAS_TYPE_BLOCK_EXTENSION) == 0)) + set |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION; + if ((type->flags & + XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) && + ((set & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) == 0)) + set |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION; + } else + break; + if (type == headType) + break; + type = type->baseType; + } + if ((set != 0) && + (((set & XML_SCHEMAS_TYPE_BLOCK_EXTENSION) && + (methSet & XML_SCHEMAS_TYPE_BLOCK_EXTENSION)) || + ((set & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) && + (methSet & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION)))) { + continue; + } +add_member: + xmlSchemaAddElementSubstitutionMember(ctxt, head, elemDecl); + if ((head->flags & XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD) == 0) + head->flags |= XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD; + } + } +} + +#ifdef WXS_ELEM_DECL_CONS_ENABLED /* enable when finished */ +/** + * xmlSchemaCheckElementDeclComponent + * @pctxt: the schema parser context + * @ctxtComponent: the context component (an element declaration) + * @ctxtParticle: the first particle of the context component + * @searchParticle: the element declaration particle to be analysed + * + * Schema Component Constraint: Element Declarations Consistent + */ +static int +xmlSchemaCheckElementDeclConsistent(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaBasicItemPtr ctxtComponent, + xmlSchemaParticlePtr ctxtParticle, + xmlSchemaParticlePtr searchParticle, + xmlSchemaParticlePtr curParticle, + int search) +{ + return(0); + + int ret = 0; + xmlSchemaParticlePtr cur = curParticle; + if (curParticle == NULL) { + return(0); + } + if (WXS_PARTICLE_TERM(curParticle) == NULL) { + /* + * Just return in this case. A missing "term" of the particle + * might arise due to an invalid "term" component. + */ + return(0); + } + while (cur != NULL) { + switch (WXS_PARTICLE_TERM(cur)->type) { + case XML_SCHEMA_TYPE_ANY: + break; + case XML_SCHEMA_TYPE_ELEMENT: + if (search == 0) { + ret = xmlSchemaCheckElementDeclConsistent(pctxt, + ctxtComponent, ctxtParticle, cur, ctxtParticle, 1); + if (ret != 0) + return(ret); + } else { + xmlSchemaElementPtr elem = + WXS_ELEM_CAST(WXS_PARTICLE_TERM(cur)); + /* + * SPEC Element Declarations Consistent: + * "If the {particles} contains, either directly, + * indirectly (that is, within the {particles} of a + * contained model group, recursively) or �implicitly� + * two or more element declaration particles with + * the same {name} and {target namespace}, then + * all their type definitions must be the same + * top-level definition [...]" + */ + if (xmlStrEqual(WXS_PARTICLE_TERM_AS_ELEM(cur)->name, + WXS_PARTICLE_TERM_AS_ELEM(searchParticle)->name) && + xmlStrEqual(WXS_PARTICLE_TERM_AS_ELEM(cur)->targetNamespace, + WXS_PARTICLE_TERM_AS_ELEM(searchParticle)->targetNamespace)) + { + xmlChar *strA = NULL, *strB = NULL; + + xmlSchemaCustomErr(ACTXT_CAST pctxt, + /* TODO: error code */ + XML_SCHEMAP_COS_NONAMBIG, + WXS_ITEM_NODE(cur), NULL, + "In the content model of %s, there are multiple " + "element declarations for '%s' with different " + "type definitions", + xmlSchemaGetComponentDesignation(&strA, + ctxtComponent), + xmlSchemaFormatQName(&strB, + WXS_PARTICLE_TERM_AS_ELEM(cur)->targetNamespace, + WXS_PARTICLE_TERM_AS_ELEM(cur)->name)); + FREE_AND_NULL(strA); + FREE_AND_NULL(strB); + return(XML_SCHEMAP_COS_NONAMBIG); + } + } + break; + case XML_SCHEMA_TYPE_SEQUENCE: { + break; + } + case XML_SCHEMA_TYPE_CHOICE:{ + /* + xmlSchemaTreeItemPtr sub; + + sub = WXS_PARTICLE_TERM(particle)->children; (xmlSchemaParticlePtr) + while (sub != NULL) { + ret = xmlSchemaCheckElementDeclConsistent(pctxt, ctxtComponent, + ctxtParticle, ctxtElem); + if (ret != 0) + return(ret); + sub = sub->next; + } + */ + break; + } + case XML_SCHEMA_TYPE_ALL: + break; + case XML_SCHEMA_TYPE_GROUP: + break; + default: + xmlSchemaInternalErr2(ACTXT_CAST pctxt, + "xmlSchemaCheckElementDeclConsistent", + "found unexpected term of type '%s' in content model", + WXS_ITEM_TYPE_NAME(WXS_PARTICLE_TERM(cur)), NULL); + return(-1); + } + cur = (xmlSchemaParticlePtr) cur->next; + } + +exit: + return(ret); +} +#endif + +/** + * xmlSchemaCheckElementDeclComponent + * @item: an schema element declaration/particle + * @ctxt: a schema parser context + * @name: the name of the attribute + * + * Validates the value constraints of an element declaration. + * Adds substitution group members. + */ +static void +xmlSchemaCheckElementDeclComponent(xmlSchemaElementPtr elemDecl, + xmlSchemaParserCtxtPtr ctxt) +{ + if (elemDecl == NULL) + return; + if (elemDecl->flags & XML_SCHEMAS_ELEM_INTERNAL_CHECKED) + return; + elemDecl->flags |= XML_SCHEMAS_ELEM_INTERNAL_CHECKED; + if (xmlSchemaCheckElemPropsCorrect(ctxt, elemDecl) == 0) { + /* + * Adds substitution group members. + */ + xmlSchemaCheckElemSubstGroup(ctxt, elemDecl); + } +} + +/** + * xmlSchemaResolveModelGroupParticleReferences: + * @particle: a particle component + * @ctxt: a parser context + * + * Resolves references of a model group's {particles} to + * model group definitions and to element declarations. + */ +static void +xmlSchemaResolveModelGroupParticleReferences( + xmlSchemaParserCtxtPtr ctxt, + xmlSchemaModelGroupPtr mg) +{ + xmlSchemaParticlePtr particle = WXS_MODELGROUP_PARTICLE(mg); + xmlSchemaQNameRefPtr ref; + xmlSchemaBasicItemPtr refItem; + + /* + * URGENT TODO: Test this. + */ + while (particle != NULL) { + if ((WXS_PARTICLE_TERM(particle) == NULL) || + ((WXS_PARTICLE_TERM(particle))->type != + XML_SCHEMA_EXTRA_QNAMEREF)) + { + goto next_particle; + } + ref = WXS_QNAME_CAST WXS_PARTICLE_TERM(particle); + /* + * Resolve the reference. + * NULL the {term} by default. + */ + particle->children = NULL; + + refItem = xmlSchemaGetNamedComponent(ctxt->schema, + ref->itemType, ref->name, ref->targetNamespace); + if (refItem == NULL) { + xmlSchemaPResCompAttrErr(ctxt, XML_SCHEMAP_SRC_RESOLVE, + NULL, WXS_ITEM_NODE(particle), "ref", ref->name, + ref->targetNamespace, ref->itemType, NULL); + /* TODO: remove the particle. */ + goto next_particle; + } + if (refItem->type == XML_SCHEMA_TYPE_GROUP) { + if (WXS_MODELGROUPDEF_MODEL(refItem) == NULL) + /* TODO: remove the particle. */ + goto next_particle; + /* + * NOTE that we will assign the model group definition + * itself to the "term" of the particle. This will ease + * the check for circular model group definitions. After + * that the "term" will be assigned the model group of the + * model group definition. + */ + if ((WXS_MODELGROUPDEF_MODEL(refItem))->type == + XML_SCHEMA_TYPE_ALL) { + /* + * SPEC cos-all-limited (1) + * SPEC cos-all-limited (1.2) + * "It appears only as the value of one or both of the + * following properties:" + * (1.1) "the {model group} property of a model group + * definition." + * (1.2) "the {term} property of a particle [... of] the " + * {content type} of a complex type definition." + */ + xmlSchemaCustomErr(ACTXT_CAST ctxt, + /* TODO: error code */ + XML_SCHEMAP_COS_ALL_LIMITED, + WXS_ITEM_NODE(particle), NULL, + "A model group definition is referenced, but " + "it contains an 'all' model group, which " + "cannot be contained by model groups", + NULL, NULL); + /* TODO: remove the particle. */ + goto next_particle; + } + particle->children = (xmlSchemaTreeItemPtr) refItem; + } else { + /* + * TODO: Are referenced element declarations the only + * other components we expect here? + */ + particle->children = (xmlSchemaTreeItemPtr) refItem; + } +next_particle: + particle = WXS_PTC_CAST particle->next; + } +} + +static int +xmlSchemaAreValuesEqual(xmlSchemaValPtr x, + xmlSchemaValPtr y) +{ + xmlSchemaTypePtr tx, ty, ptx, pty; + int ret; + + while (x != NULL) { + /* Same types. */ + tx = xmlSchemaGetBuiltInType(xmlSchemaGetValType(x)); + ty = xmlSchemaGetBuiltInType(xmlSchemaGetValType(y)); + ptx = xmlSchemaGetPrimitiveType(tx); + pty = xmlSchemaGetPrimitiveType(ty); + /* + * (1) if a datatype T' is �derived� by �restriction� from an + * atomic datatype T then the �value space� of T' is a subset of + * the �value space� of T. */ + /* + * (2) if datatypes T' and T'' are �derived� by �restriction� + * from a common atomic ancestor T then the �value space�s of T' + * and T'' may overlap. + */ + if (ptx != pty) + return(0); + /* + * We assume computed values to be normalized, so do a fast + * string comparison for string based types. + */ + if ((ptx->builtInType == XML_SCHEMAS_STRING) || + WXS_IS_ANY_SIMPLE_TYPE(ptx)) { + if (! xmlStrEqual( + xmlSchemaValueGetAsString(x), + xmlSchemaValueGetAsString(y))) + return (0); + } else { + ret = xmlSchemaCompareValuesWhtsp( + x, XML_SCHEMA_WHITESPACE_PRESERVE, + y, XML_SCHEMA_WHITESPACE_PRESERVE); + if (ret == -2) + return(-1); + if (ret != 0) + return(0); + } + /* + * Lists. + */ + x = xmlSchemaValueGetNext(x); + if (x != NULL) { + y = xmlSchemaValueGetNext(y); + if (y == NULL) + return (0); + } else if (xmlSchemaValueGetNext(y) != NULL) + return (0); + else + return (1); + } + return (0); +} + +/** + * xmlSchemaResolveAttrUseReferences: + * @item: an attribute use + * @ctxt: a parser context + * + * Resolves the referenced attribute declaration. + */ +static int +xmlSchemaResolveAttrUseReferences(xmlSchemaAttributeUsePtr ause, + xmlSchemaParserCtxtPtr ctxt) +{ + if ((ctxt == NULL) || (ause == NULL)) + return(-1); + if ((ause->attrDecl == NULL) || + (ause->attrDecl->type != XML_SCHEMA_EXTRA_QNAMEREF)) + return(0); + + { + xmlSchemaQNameRefPtr ref = WXS_QNAME_CAST ause->attrDecl; + + /* + * TODO: Evaluate, what errors could occur if the declaration is not + * found. + */ + ause->attrDecl = xmlSchemaGetAttributeDecl(ctxt->schema, + ref->name, ref->targetNamespace); + if (ause->attrDecl == NULL) { + xmlSchemaPResCompAttrErr(ctxt, + XML_SCHEMAP_SRC_RESOLVE, + WXS_BASIC_CAST ause, ause->node, + "ref", ref->name, ref->targetNamespace, + XML_SCHEMA_TYPE_ATTRIBUTE, NULL); + return(ctxt->err);; + } + } + return(0); +} + +/** + * xmlSchemaCheckAttrUsePropsCorrect: + * @ctxt: a parser context + * @use: an attribute use + * + * Schema Component Constraint: + * Attribute Use Correct (au-props-correct) + * + */ +static int +xmlSchemaCheckAttrUsePropsCorrect(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaAttributeUsePtr use) +{ + if ((ctxt == NULL) || (use == NULL)) + return(-1); + if ((use->defValue == NULL) || (WXS_ATTRUSE_DECL(use) == NULL) || + ((WXS_ATTRUSE_DECL(use))->type != XML_SCHEMA_TYPE_ATTRIBUTE)) + return(0); + + /* + * SPEC au-props-correct (1) + * "The values of the properties of an attribute use must be as + * described in the property tableau in The Attribute Use Schema + * Component (�3.5.1), modulo the impact of Missing + * Sub-components (�5.3)." + */ + + if (((WXS_ATTRUSE_DECL(use))->defValue != NULL) && + ((WXS_ATTRUSE_DECL(use))->flags & XML_SCHEMAS_ATTR_FIXED) && + ((use->flags & XML_SCHEMA_ATTR_USE_FIXED) == 0)) + { + xmlSchemaPCustomErr(ctxt, + XML_SCHEMAP_AU_PROPS_CORRECT_2, + WXS_BASIC_CAST use, NULL, + "The attribute declaration has a 'fixed' value constraint " + ", thus the attribute use must also have a 'fixed' value " + "constraint", + NULL); + return(ctxt->err); + } + /* + * Compute and check the value constraint's value. + */ + if ((use->defVal != NULL) && (WXS_ATTRUSE_TYPEDEF(use) != NULL)) { + int ret; + /* + * TODO: The spec seems to be missing a check of the + * value constraint of the attribute use. We will do it here. + */ + /* + * SPEC a-props-correct (3) + */ + if (xmlSchemaIsDerivedFromBuiltInType( + WXS_ATTRUSE_TYPEDEF(use), XML_SCHEMAS_ID)) + { + xmlSchemaCustomErr(ACTXT_CAST ctxt, + XML_SCHEMAP_AU_PROPS_CORRECT, + NULL, WXS_BASIC_CAST use, + "Value constraints are not allowed if the type definition " + "is or is derived from xs:ID", + NULL, NULL); + return(ctxt->err); + } + + ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST ctxt, + use->node, WXS_ATTRUSE_TYPEDEF(use), + use->defValue, &(use->defVal), + 1, 1, 0); + if (ret != 0) { + if (ret < 0) { + PERROR_INT2("xmlSchemaCheckAttrUsePropsCorrect", + "calling xmlSchemaVCheckCVCSimpleType()"); + return(-1); + } + xmlSchemaCustomErr(ACTXT_CAST ctxt, + XML_SCHEMAP_AU_PROPS_CORRECT, + NULL, WXS_BASIC_CAST use, + "The value of the value constraint is not valid", + NULL, NULL); + return(ctxt->err); + } + } + /* + * SPEC au-props-correct (2) + * "If the {attribute declaration} has a fixed + * {value constraint}, then if the attribute use itself has a + * {value constraint}, it must also be fixed and its value must match + * that of the {attribute declaration}'s {value constraint}." + */ + if (((WXS_ATTRUSE_DECL(use))->defVal != NULL) && + (((WXS_ATTRUSE_DECL(use))->flags & XML_SCHEMA_ATTR_USE_FIXED) == 0)) + { + if (! xmlSchemaAreValuesEqual(use->defVal, + (WXS_ATTRUSE_DECL(use))->defVal)) + { + xmlSchemaPCustomErr(ctxt, + XML_SCHEMAP_AU_PROPS_CORRECT_2, + WXS_BASIC_CAST use, NULL, + "The 'fixed' value constraint of the attribute use " + "must match the attribute declaration's value " + "constraint '%s'", + (WXS_ATTRUSE_DECL(use))->defValue); + } + return(ctxt->err); + } + return(0); +} + + + + +/** + * xmlSchemaResolveAttrTypeReferences: + * @item: an attribute declaration + * @ctxt: a parser context + * + * Resolves the referenced type definition component. + */ +static int +xmlSchemaResolveAttrTypeReferences(xmlSchemaAttributePtr item, + xmlSchemaParserCtxtPtr ctxt) +{ + /* + * The simple type definition corresponding to the element + * information item in the [children], if present, otherwise the simple + * type definition �resolved� to by the �actual value� of the type + * [attribute], if present, otherwise the �simple ur-type definition�. + */ + if (item->flags & XML_SCHEMAS_ATTR_INTERNAL_RESOLVED) + return(0); + item->flags |= XML_SCHEMAS_ATTR_INTERNAL_RESOLVED; + if (item->subtypes != NULL) + return(0); + if (item->typeName != NULL) { + xmlSchemaTypePtr type; + + type = xmlSchemaGetType(ctxt->schema, item->typeName, + item->typeNs); + if ((type == NULL) || (! WXS_IS_SIMPLE(type))) { + xmlSchemaPResCompAttrErr(ctxt, + XML_SCHEMAP_SRC_RESOLVE, + WXS_BASIC_CAST item, item->node, + "type", item->typeName, item->typeNs, + XML_SCHEMA_TYPE_SIMPLE, NULL); + return(ctxt->err); + } else + item->subtypes = type; + + } else { + /* + * The type defaults to the xs:anySimpleType. + */ + item->subtypes = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYSIMPLETYPE); + } + return(0); +} + +/** + * xmlSchemaResolveIDCKeyReferences: + * @idc: the identity-constraint definition + * @ctxt: the schema parser context + * @name: the attribute name + * + * Resolve keyRef references to key/unique IDCs. + * Schema Component Constraint: + * Identity-constraint Definition Properties Correct (c-props-correct) + */ +static int +xmlSchemaResolveIDCKeyReferences(xmlSchemaIDCPtr idc, + xmlSchemaParserCtxtPtr pctxt) +{ + if (idc->type != XML_SCHEMA_TYPE_IDC_KEYREF) + return(0); + if (idc->ref->name != NULL) { + idc->ref->item = (xmlSchemaBasicItemPtr) + xmlSchemaGetIDC(pctxt->schema, idc->ref->name, + idc->ref->targetNamespace); + if (idc->ref->item == NULL) { + /* + * TODO: It is actually not an error to fail to resolve + * at this stage. BUT we need to be that strict! + */ + xmlSchemaPResCompAttrErr(pctxt, + XML_SCHEMAP_SRC_RESOLVE, + WXS_BASIC_CAST idc, idc->node, + "refer", idc->ref->name, + idc->ref->targetNamespace, + XML_SCHEMA_TYPE_IDC_KEY, NULL); + return(pctxt->err); + } else if (idc->ref->item->type == XML_SCHEMA_TYPE_IDC_KEYREF) { + /* + * SPEC c-props-correct (1) + */ + xmlSchemaCustomErr(ACTXT_CAST pctxt, + XML_SCHEMAP_C_PROPS_CORRECT, + NULL, WXS_BASIC_CAST idc, + "The keyref references a keyref", + NULL, NULL); + idc->ref->item = NULL; + return(pctxt->err); + } else { + if (idc->nbFields != + ((xmlSchemaIDCPtr) idc->ref->item)->nbFields) { + xmlChar *str = NULL; + xmlSchemaIDCPtr refer; + + refer = (xmlSchemaIDCPtr) idc->ref->item; + /* + * SPEC c-props-correct(2) + * "If the {identity-constraint category} is keyref, + * the cardinality of the {fields} must equal that of + * the {fields} of the {referenced key}. + */ + xmlSchemaCustomErr(ACTXT_CAST pctxt, + XML_SCHEMAP_C_PROPS_CORRECT, + NULL, WXS_BASIC_CAST idc, + "The cardinality of the keyref differs from the " + "cardinality of the referenced key/unique '%s'", + xmlSchemaFormatQName(&str, refer->targetNamespace, + refer->name), + NULL); + FREE_AND_NULL(str) + return(pctxt->err); + } + } + } + return(0); +} + +static int +xmlSchemaResolveAttrUseProhibReferences(xmlSchemaAttributeUseProhibPtr prohib, + xmlSchemaParserCtxtPtr pctxt) +{ + if (xmlSchemaGetAttributeDecl(pctxt->schema, prohib->name, + prohib->targetNamespace) == NULL) { + + xmlSchemaPResCompAttrErr(pctxt, + XML_SCHEMAP_SRC_RESOLVE, + NULL, prohib->node, + "ref", prohib->name, prohib->targetNamespace, + XML_SCHEMA_TYPE_ATTRIBUTE, NULL); + return(XML_SCHEMAP_SRC_RESOLVE); + } + return(0); +} + +#define WXS_REDEFINED_TYPE(c) \ +(((xmlSchemaTypePtr) item)->flags & XML_SCHEMAS_TYPE_REDEFINED) + +#define WXS_REDEFINED_MODEL_GROUP_DEF(c) \ +(((xmlSchemaModelGroupDefPtr) item)->flags & XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED) + +#define WXS_REDEFINED_ATTR_GROUP(c) \ +(((xmlSchemaAttributeGroupPtr) item)->flags & XML_SCHEMAS_ATTRGROUP_REDEFINED) + +static int +xmlSchemaCheckSRCRedefineFirst(xmlSchemaParserCtxtPtr pctxt) +{ + int err = 0; + xmlSchemaRedefPtr redef = WXS_CONSTRUCTOR(pctxt)->redefs; + xmlSchemaBasicItemPtr prev, item; + int wasRedefined; + + if (redef == NULL) + return(0); + + do { + item = redef->item; + /* + * First try to locate the redefined component in the + * schema graph starting with the redefined schema. + * NOTE: According to this schema bug entry: + * http://lists.w3.org/Archives/Public/www-xml-schema-comments/2005OctDec/0019.html + * it's not clear if the referenced component needs to originate + * from the d schema _document_ or the schema; the latter + * would include all imported and included sub-schemas of the + * d schema. Currenlty we latter approach is used. + * SUPPLEMENT: It seems that the WG moves towards the latter + * approach, so we are doing it right. + * + */ + prev = xmlSchemaFindRedefCompInGraph( + redef->targetBucket, item->type, + redef->refName, redef->refTargetNs); + if (prev == NULL) { + xmlChar *str = NULL; + xmlNodePtr node; + + /* + * SPEC src-redefine: + * (6.2.1) "The �actual value� of its own name attribute plus + * target namespace must successfully �resolve� to a model + * group definition in I." + * (7.2.1) "The �actual value� of its own name attribute plus + * target namespace must successfully �resolve� to an attribute + * group definition in I." + + * + * Note that, if we are redefining with the use of references + * to components, the spec assumes the src-resolve to be used; + * but this won't assure that we search only *inside* the + * redefined schema. + */ + if (redef->reference) + node = WXS_ITEM_NODE(redef->reference); + else + node = WXS_ITEM_NODE(item); + xmlSchemaCustomErr(ACTXT_CAST pctxt, + /* + * TODO: error code. + * Probably XML_SCHEMAP_SRC_RESOLVE, if this is using the + * reference kind. + */ + XML_SCHEMAP_SRC_REDEFINE, node, NULL, + "The %s '%s' to be redefined could not be found in " + "the redefined schema", + WXS_ITEM_TYPE_NAME(item), + xmlSchemaFormatQName(&str, redef->refTargetNs, + redef->refName)); + FREE_AND_NULL(str); + err = pctxt->err; + redef = redef->next; + continue; + } + /* + * TODO: Obtaining and setting the redefinition state is really + * clumsy. + */ + wasRedefined = 0; + switch (item->type) { + case XML_SCHEMA_TYPE_COMPLEX: + case XML_SCHEMA_TYPE_SIMPLE: + if ((WXS_TYPE_CAST prev)->flags & + XML_SCHEMAS_TYPE_REDEFINED) + { + wasRedefined = 1; + break; + } + /* Mark it as redefined. */ + (WXS_TYPE_CAST prev)->flags |= XML_SCHEMAS_TYPE_REDEFINED; + /* + * Assign the redefined type to the + * base type of the redefining type. + * TODO: How + */ + ((xmlSchemaTypePtr) item)->baseType = + (xmlSchemaTypePtr) prev; + break; + case XML_SCHEMA_TYPE_GROUP: + if ((WXS_MODEL_GROUPDEF_CAST prev)->flags & + XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED) + { + wasRedefined = 1; + break; + } + /* Mark it as redefined. */ + (WXS_MODEL_GROUPDEF_CAST prev)->flags |= + XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED; + if (redef->reference != NULL) { + /* + * Overwrite the QName-reference with the + * referenced model group def. + */ + (WXS_PTC_CAST redef->reference)->children = + WXS_TREE_CAST prev; + } + redef->target = prev; + break; + case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: + if ((WXS_ATTR_GROUP_CAST prev)->flags & + XML_SCHEMAS_ATTRGROUP_REDEFINED) + { + wasRedefined = 1; + break; + } + (WXS_ATTR_GROUP_CAST prev)->flags |= + XML_SCHEMAS_ATTRGROUP_REDEFINED; + if (redef->reference != NULL) { + /* + * Assign the redefined attribute group to the + * QName-reference component. + * This is the easy case, since we will just + * expand the redefined group. + */ + (WXS_QNAME_CAST redef->reference)->item = prev; + redef->target = NULL; + } else { + /* + * This is the complicated case: we need + * to apply src-redefine (7.2.2) at a later + * stage, i.e. when attribute group references + * have beed expanded and simple types have + * beed fixed. + */ + redef->target = prev; + } + break; + default: + PERROR_INT("xmlSchemaResolveRedefReferences", + "Unexpected redefined component type"); + return(-1); + } + if (wasRedefined) { + xmlChar *str = NULL; + xmlNodePtr node; + + if (redef->reference) + node = WXS_ITEM_NODE(redef->reference); + else + node = WXS_ITEM_NODE(redef->item); + + xmlSchemaCustomErr(ACTXT_CAST pctxt, + /* TODO: error code. */ + XML_SCHEMAP_SRC_REDEFINE, + node, NULL, + "The referenced %s was already redefined. Multiple " + "redefinition of the same component is not supported", + xmlSchemaGetComponentDesignation(&str, prev), + NULL); + FREE_AND_NULL(str) + err = pctxt->err; + redef = redef->next; + continue; + } + redef = redef->next; + } while (redef != NULL); + + return(err); +} + +static int +xmlSchemaCheckSRCRedefineSecond(xmlSchemaParserCtxtPtr pctxt) +{ + int err = 0; + xmlSchemaRedefPtr redef = WXS_CONSTRUCTOR(pctxt)->redefs; + xmlSchemaBasicItemPtr item; + + if (redef == NULL) + return(0); + + do { + if (redef->target == NULL) { + redef = redef->next; + continue; + } + item = redef->item; + + switch (item->type) { + case XML_SCHEMA_TYPE_SIMPLE: + case XML_SCHEMA_TYPE_COMPLEX: + /* + * Since the spec wants the {name} of the redefined + * type to be 'absent', we'll NULL it. + */ + (WXS_TYPE_CAST redef->target)->name = NULL; + + /* + * TODO: Seems like there's nothing more to do. The normal + * inheritance mechanism is used. But not 100% sure. + */ + break; + case XML_SCHEMA_TYPE_GROUP: + /* + * URGENT TODO: + * SPEC src-redefine: + * (6.2.2) "The {model group} of the model group definition + * which corresponds to it per XML Representation of Model + * Group Definition Schema Components (�3.7.2) must be a + * �valid restriction� of the {model group} of that model + * group definition in I, as defined in Particle Valid + * (Restriction) (�3.9.6)." + */ + break; + case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: + /* + * SPEC src-redefine: + * (7.2.2) "The {attribute uses} and {attribute wildcard} of + * the attribute group definition which corresponds to it + * per XML Representation of Attribute Group Definition Schema + * Components (�3.6.2) must be �valid restrictions� of the + * {attribute uses} and {attribute wildcard} of that attribute + * group definition in I, as defined in clause 2, clause 3 and + * clause 4 of Derivation Valid (Restriction, Complex) + * (�3.4.6) (where references to the base type definition are + * understood as references to the attribute group definition + * in I)." + */ + err = xmlSchemaCheckDerivationOKRestriction2to4(pctxt, + XML_SCHEMA_ACTION_REDEFINE, + item, redef->target, + (WXS_ATTR_GROUP_CAST item)->attrUses, + (WXS_ATTR_GROUP_CAST redef->target)->attrUses, + (WXS_ATTR_GROUP_CAST item)->attributeWildcard, + (WXS_ATTR_GROUP_CAST redef->target)->attributeWildcard); + if (err == -1) + return(-1); + break; + default: + break; + } + redef = redef->next; + } while (redef != NULL); + return(0); +} + + +static int +xmlSchemaAddComponents(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaBucketPtr bucket) +{ + xmlSchemaBasicItemPtr item; + int err; + xmlHashTablePtr *table; + const xmlChar *name; + int i; + +#define WXS_GET_GLOBAL_HASH(c, slot) { \ + if (WXS_IS_BUCKET_IMPMAIN((c)->type)) \ + table = &(WXS_IMPBUCKET((c))->schema->slot); \ + else \ + table = &(WXS_INCBUCKET((c))->ownerImport->schema->slot); } + + /* + * Add global components to the schema's hash tables. + * This is the place where duplicate components will be + * detected. + * TODO: I think normally we should support imports of the + * same namespace from multiple locations. We don't do currently, + * but if we do then according to: + * http://www.w3.org/Bugs/Public/show_bug.cgi?id=2224 + * we would need, if imported directly, to import redefined + * components as well to be able to catch clashing components. + * (I hope I'll still know what this means after some months :-() + */ + if (bucket == NULL) + return(-1); + if (bucket->flags & XML_SCHEMA_BUCKET_COMPS_ADDED) + return(0); + bucket->flags |= XML_SCHEMA_BUCKET_COMPS_ADDED; + + for (i = 0; i < bucket->globals->nbItems; i++) { + item = bucket->globals->items[i]; + table = NULL; + switch (item->type) { + case XML_SCHEMA_TYPE_COMPLEX: + case XML_SCHEMA_TYPE_SIMPLE: + if (WXS_REDEFINED_TYPE(item)) + continue; + name = (WXS_TYPE_CAST item)->name; + WXS_GET_GLOBAL_HASH(bucket, typeDecl) + break; + case XML_SCHEMA_TYPE_ELEMENT: + name = (WXS_ELEM_CAST item)->name; + WXS_GET_GLOBAL_HASH(bucket, elemDecl) + break; + case XML_SCHEMA_TYPE_ATTRIBUTE: + name = (WXS_ATTR_CAST item)->name; + WXS_GET_GLOBAL_HASH(bucket, attrDecl) + break; + case XML_SCHEMA_TYPE_GROUP: + if (WXS_REDEFINED_MODEL_GROUP_DEF(item)) + continue; + name = (WXS_MODEL_GROUPDEF_CAST item)->name; + WXS_GET_GLOBAL_HASH(bucket, groupDecl) + break; + case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: + if (WXS_REDEFINED_ATTR_GROUP(item)) + continue; + name = (WXS_ATTR_GROUP_CAST item)->name; + WXS_GET_GLOBAL_HASH(bucket, attrgrpDecl) + break; + case XML_SCHEMA_TYPE_IDC_KEY: + case XML_SCHEMA_TYPE_IDC_UNIQUE: + case XML_SCHEMA_TYPE_IDC_KEYREF: + name = (WXS_IDC_CAST item)->name; + WXS_GET_GLOBAL_HASH(bucket, idcDef) + break; + case XML_SCHEMA_TYPE_NOTATION: + name = ((xmlSchemaNotationPtr) item)->name; + WXS_GET_GLOBAL_HASH(bucket, notaDecl) + break; + default: + PERROR_INT("xmlSchemaAddComponents", + "Unexpected global component type"); + continue; + } + if (*table == NULL) { + *table = xmlHashCreateDict(10, pctxt->dict); + if (*table == NULL) { + PERROR_INT("xmlSchemaAddComponents", + "failed to create a component hash table"); + return(-1); + } + } + err = xmlHashAddEntry(*table, name, item); + if (err != 0) { + xmlChar *str = NULL; + + xmlSchemaCustomErr(ACTXT_CAST pctxt, + XML_SCHEMAP_REDEFINED_TYPE, + WXS_ITEM_NODE(item), + WXS_BASIC_CAST item, + "A global %s '%s' does already exist", + WXS_ITEM_TYPE_NAME(item), + xmlSchemaGetComponentQName(&str, item)); + FREE_AND_NULL(str); + } + } + /* + * Process imported/included schemas. + */ + if (bucket->relations != NULL) { + xmlSchemaSchemaRelationPtr rel = bucket->relations; + do { + if ((rel->bucket != NULL) && + ((rel->bucket->flags & XML_SCHEMA_BUCKET_COMPS_ADDED) == 0)) { + if (xmlSchemaAddComponents(pctxt, rel->bucket) == -1) + return(-1); + } + rel = rel->next; + } while (rel != NULL); + } + return(0); +} + +static int +xmlSchemaFixupComponents(xmlSchemaParserCtxtPtr pctxt, + xmlSchemaBucketPtr rootBucket) +{ + xmlSchemaConstructionCtxtPtr con = pctxt->constructor; + xmlSchemaTreeItemPtr item, *items; + int nbItems, i, ret = 0; + xmlSchemaBucketPtr oldbucket = con->bucket; + xmlSchemaElementPtr elemDecl; + +#define FIXHFAILURE if (pctxt->err == XML_SCHEMAP_INTERNAL) goto exit_failure; + + if ((con->pending == NULL) || + (con->pending->nbItems == 0)) + return(0); + + /* + * Since xmlSchemaFixupComplexType() will create new particles + * (local components), and those particle components need a bucket + * on the constructor, we'll assure here that the constructor has + * a bucket. + * TODO: Think about storing locals _only_ on the main bucket. + */ + if (con->bucket == NULL) + con->bucket = rootBucket; + + /* TODO: + * SPEC (src-redefine): + * (6.2) "If it has no such self-reference, then all of the + * following must be true:" + + * (6.2.2) The {model group} of the model group definition which + * corresponds to it per XML Representation of Model Group + * Definition Schema Components (�3.7.2) must be a �valid + * restriction� of the {model group} of that model group definition + * in I, as defined in Particle Valid (Restriction) (�3.9.6)." + */ + xmlSchemaCheckSRCRedefineFirst(pctxt); + + /* + * Add global components to the schemata's hash tables. + */ + xmlSchemaAddComponents(pctxt, rootBucket); + + pctxt->ctxtType = NULL; + items = (xmlSchemaTreeItemPtr *) con->pending->items; + nbItems = con->pending->nbItems; + /* + * Now that we have parsed *all* the schema document(s) and converted + * them to schema components, we can resolve references, apply component + * constraints, create the FSA from the content model, etc. + */ + /* + * Resolve references of.. + * + * 1. element declarations: + * - the type definition + * - the substitution group affiliation + * 2. simple/complex types: + * - the base type definition + * - the memberTypes of union types + * - the itemType of list types + * 3. attributes declarations and attribute uses: + * - the type definition + * - if an attribute use, then the attribute declaration + * 4. attribute group references: + * - the attribute group definition + * 5. particles: + * - the term of the particle (e.g. a model group) + * 6. IDC key-references: + * - the referenced IDC 'key' or 'unique' definition + * 7. Attribute prohibitions which had a "ref" attribute. + */ + for (i = 0; i < nbItems; i++) { + item = items[i]; + switch (item->type) { + case XML_SCHEMA_TYPE_ELEMENT: + xmlSchemaResolveElementReferences( + (xmlSchemaElementPtr) item, pctxt); + FIXHFAILURE; + break; + case XML_SCHEMA_TYPE_COMPLEX: + case XML_SCHEMA_TYPE_SIMPLE: + xmlSchemaResolveTypeReferences( + (xmlSchemaTypePtr) item, pctxt); + FIXHFAILURE; + break; + case XML_SCHEMA_TYPE_ATTRIBUTE: + xmlSchemaResolveAttrTypeReferences( + (xmlSchemaAttributePtr) item, pctxt); + FIXHFAILURE; + break; + case XML_SCHEMA_TYPE_ATTRIBUTE_USE: + xmlSchemaResolveAttrUseReferences( + (xmlSchemaAttributeUsePtr) item, pctxt); + FIXHFAILURE; + break; + case XML_SCHEMA_EXTRA_QNAMEREF: + if ((WXS_QNAME_CAST item)->itemType == + XML_SCHEMA_TYPE_ATTRIBUTEGROUP) + { + xmlSchemaResolveAttrGroupReferences( + WXS_QNAME_CAST item, pctxt); + } + FIXHFAILURE; + break; + case XML_SCHEMA_TYPE_SEQUENCE: + case XML_SCHEMA_TYPE_CHOICE: + case XML_SCHEMA_TYPE_ALL: + xmlSchemaResolveModelGroupParticleReferences(pctxt, + WXS_MODEL_GROUP_CAST item); + FIXHFAILURE; + break; + case XML_SCHEMA_TYPE_IDC_KEY: + case XML_SCHEMA_TYPE_IDC_UNIQUE: + case XML_SCHEMA_TYPE_IDC_KEYREF: + xmlSchemaResolveIDCKeyReferences( + (xmlSchemaIDCPtr) item, pctxt); + FIXHFAILURE; + break; + case XML_SCHEMA_EXTRA_ATTR_USE_PROHIB: + /* + * Handle attribue prohibition which had a + * "ref" attribute. + */ + xmlSchemaResolveAttrUseProhibReferences( + WXS_ATTR_PROHIB_CAST item, pctxt); + FIXHFAILURE; + break; + default: + break; + } + } + if (pctxt->nberrors != 0) + goto exit_error; + + /* + * Now that all references are resolved we + * can check for circularity of... + * 1. the base axis of type definitions + * 2. nested model group definitions + * 3. nested attribute group definitions + * TODO: check for circual substitution groups. + */ + for (i = 0; i < nbItems; i++) { + item = items[i]; + /* + * Let's better stop on the first error here. + */ + switch (item->type) { + case XML_SCHEMA_TYPE_COMPLEX: + case XML_SCHEMA_TYPE_SIMPLE: + xmlSchemaCheckTypeDefCircular( + (xmlSchemaTypePtr) item, pctxt); + FIXHFAILURE; + if (pctxt->nberrors != 0) + goto exit_error; + break; + case XML_SCHEMA_TYPE_GROUP: + xmlSchemaCheckGroupDefCircular( + (xmlSchemaModelGroupDefPtr) item, pctxt); + FIXHFAILURE; + if (pctxt->nberrors != 0) + goto exit_error; + break; + case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: + xmlSchemaCheckAttrGroupCircular( + (xmlSchemaAttributeGroupPtr) item, pctxt); + FIXHFAILURE; + if (pctxt->nberrors != 0) + goto exit_error; + break; + default: + break; + } + } + if (pctxt->nberrors != 0) + goto exit_error; + /* + * Model group definition references: + * Such a reference is reflected by a particle at the component + * level. Until now the 'term' of such particles pointed + * to the model group definition; this was done, in order to + * ease circularity checks. Now we need to set the 'term' of + * such particles to the model group of the model group definition. + */ + for (i = 0; i < nbItems; i++) { + item = items[i]; + switch (item->type) { + case XML_SCHEMA_TYPE_SEQUENCE: + case XML_SCHEMA_TYPE_CHOICE: + xmlSchemaModelGroupToModelGroupDefFixup(pctxt, + WXS_MODEL_GROUP_CAST item); + break; + default: + break; + } + } + if (pctxt->nberrors != 0) + goto exit_error; + /* + * Expand attribute group references of attribute group definitions. + */ + for (i = 0; i < nbItems; i++) { + item = items[i]; + switch (item->type) { + case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: + if ((! WXS_ATTR_GROUP_EXPANDED(item)) && + WXS_ATTR_GROUP_HAS_REFS(item)) + { + xmlSchemaAttributeGroupExpandRefs(pctxt, + WXS_ATTR_GROUP_CAST item); + FIXHFAILURE; + } + break; + default: + break; + } + } + if (pctxt->nberrors != 0) + goto exit_error; + /* + * First compute the variety of simple types. This is needed as + * a seperate step, since otherwise we won't be able to detect + * circular union types in all cases. + */ + for (i = 0; i < nbItems; i++) { + item = items[i]; + switch (item->type) { + case XML_SCHEMA_TYPE_SIMPLE: + if (WXS_IS_TYPE_NOT_FIXED_1((xmlSchemaTypePtr) item)) { + xmlSchemaFixupSimpleTypeStageOne(pctxt, + (xmlSchemaTypePtr) item); + FIXHFAILURE; + } + break; + default: + break; + } + } + if (pctxt->nberrors != 0) + goto exit_error; + /* + * Detect circular union types. Note that this needs the variety to + * be already computed. + */ + for (i = 0; i < nbItems; i++) { + item = items[i]; + switch (item->type) { + case XML_SCHEMA_TYPE_SIMPLE: + if (((xmlSchemaTypePtr) item)->memberTypes != NULL) { + xmlSchemaCheckUnionTypeDefCircular(pctxt, + (xmlSchemaTypePtr) item); + FIXHFAILURE; + } + break; + default: + break; + } + } + if (pctxt->nberrors != 0) + goto exit_error; + + /* + * Do the complete type fixup for simple types. + */ + for (i = 0; i < nbItems; i++) { + item = items[i]; + switch (item->type) { + case XML_SCHEMA_TYPE_SIMPLE: + if (WXS_IS_TYPE_NOT_FIXED(WXS_TYPE_CAST item)) { + xmlSchemaFixupSimpleTypeStageTwo(pctxt, WXS_TYPE_CAST item); + FIXHFAILURE; + } + break; + default: + break; + } + } + if (pctxt->nberrors != 0) + goto exit_error; + /* + * At this point we need build and check all simple types. + */ + /* + * Apply contraints for attribute declarations. + */ + for (i = 0; i < nbItems; i++) { + item = items[i]; + switch (item->type) { + case XML_SCHEMA_TYPE_ATTRIBUTE: + xmlSchemaCheckAttrPropsCorrect(pctxt, WXS_ATTR_CAST item); + FIXHFAILURE; + break; + default: + break; + } + } + if (pctxt->nberrors != 0) + goto exit_error; + /* + * Apply constraints for attribute uses. + */ + for (i = 0; i < nbItems; i++) { + item = items[i]; + switch (item->type) { + case XML_SCHEMA_TYPE_ATTRIBUTE_USE: + if (((xmlSchemaAttributeUsePtr)item)->defValue != NULL) { + xmlSchemaCheckAttrUsePropsCorrect(pctxt, + WXS_ATTR_USE_CAST item); + FIXHFAILURE; + } + break; + default: + break; + } + } + if (pctxt->nberrors != 0) + goto exit_error; + + /* + * Apply constraints for attribute group definitions. + */ + for (i = 0; i < nbItems; i++) { + item = items[i]; + switch (item->type) { + case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: + if (( (WXS_ATTR_GROUP_CAST item)->attrUses != NULL) && + ( (WXS_LIST_CAST (WXS_ATTR_GROUP_CAST item)->attrUses)->nbItems > 1)) + { + xmlSchemaCheckAGPropsCorrect(pctxt, WXS_ATTR_GROUP_CAST item); + FIXHFAILURE; + } + break; + default: + break; + } + } + if (pctxt->nberrors != 0) + goto exit_error; + + /* + * Apply constraints for redefinitions. + */ + if (WXS_CONSTRUCTOR(pctxt)->redefs != NULL) + xmlSchemaCheckSRCRedefineSecond(pctxt); + if (pctxt->nberrors != 0) + goto exit_error; + + /* + * Complex types are builded and checked. + */ + for (i = 0; i < nbItems; i++) { + item = con->pending->items[i]; + switch (item->type) { + case XML_SCHEMA_TYPE_COMPLEX: + if (WXS_IS_TYPE_NOT_FIXED(WXS_TYPE_CAST item)) { + xmlSchemaFixupComplexType(pctxt, WXS_TYPE_CAST item); + FIXHFAILURE; + } + break; + default: + break; + } + } + if (pctxt->nberrors != 0) + goto exit_error; + + /* + * The list could have changed, since xmlSchemaFixupComplexType() + * will create particles and model groups in some cases. + */ + items = (xmlSchemaTreeItemPtr *) con->pending->items; + nbItems = con->pending->nbItems; + + /* + * Apply some constraints for element declarations. + */ + for (i = 0; i < nbItems; i++) { + item = items[i]; + switch (item->type) { + case XML_SCHEMA_TYPE_ELEMENT: + elemDecl = (xmlSchemaElementPtr) item; + + if ((elemDecl->flags & XML_SCHEMAS_ELEM_INTERNAL_CHECKED) == 0) + { + xmlSchemaCheckElementDeclComponent( + (xmlSchemaElementPtr) elemDecl, pctxt); + FIXHFAILURE; + } + +#ifdef WXS_ELEM_DECL_CONS_ENABLED + /* + * Schema Component Constraint: Element Declarations Consistent + * Apply this constraint to local types of element declarations. + */ + if ((WXS_ELEM_TYPEDEF(elemDecl) != NULL) && + (WXS_IS_COMPLEX(WXS_ELEM_TYPEDEF(elemDecl))) && + (WXS_TYPE_IS_LOCAL(WXS_ELEM_TYPEDEF(elemDecl)))) + { + xmlSchemaCheckElementDeclConsistent(pctxt, + WXS_BASIC_CAST elemDecl, + WXS_TYPE_PARTICLE(WXS_ELEM_TYPEDEF(elemDecl)), + NULL, NULL, 0); + } +#endif + break; + default: + break; + } + } + if (pctxt->nberrors != 0) + goto exit_error; + + /* + * Finally we can build the automaton from the content model of + * complex types. + */ + + for (i = 0; i < nbItems; i++) { + item = items[i]; + switch (item->type) { + case XML_SCHEMA_TYPE_COMPLEX: + xmlSchemaBuildContentModel((xmlSchemaTypePtr) item, pctxt); + /* FIXHFAILURE; */ + break; + default: + break; + } + } + if (pctxt->nberrors != 0) + goto exit_error; + /* + * URGENT TODO: cos-element-consistent + */ + goto exit; + +exit_error: + ret = pctxt->err; + goto exit; + +exit_failure: + ret = -1; + +exit: + /* + * Reset the constructor. This is needed for XSI acquisition, since + * those items will be processed over and over again for every XSI + * if not cleared here. + */ + con->bucket = oldbucket; + con->pending->nbItems = 0; + if (con->substGroups != NULL) { + xmlHashFree(con->substGroups, + (xmlHashDeallocator) xmlSchemaSubstGroupFree); + con->substGroups = NULL; + } + if (con->redefs != NULL) { + xmlSchemaRedefListFree(con->redefs); + con->redefs = NULL; + } + return(ret); +} +/** + * xmlSchemaParse: + * @ctxt: a schema validation context + * + * parse a schema definition resource and build an internal + * XML Shema struture which can be used to validate instances. + * + * Returns the internal XML Schema structure built from the resource or + * NULL in case of error + */ +xmlSchemaPtr +xmlSchemaParse(xmlSchemaParserCtxtPtr ctxt) +{ + xmlSchemaPtr mainSchema = NULL; + xmlSchemaBucketPtr bucket = NULL; + int res; + + /* + * This one is used if the schema to be parsed was specified via + * the API; i.e. not automatically by the validated instance document. + */ + + xmlSchemaInitTypes(); + + if (ctxt == NULL) + return (NULL); + + /* TODO: Init the context. Is this all we need?*/ + ctxt->nberrors = 0; + ctxt->err = 0; + ctxt->counter = 0; + + /* Create the *main* schema. */ + mainSchema = xmlSchemaNewSchema(ctxt); + if (mainSchema == NULL) + goto exit_failure; + /* + * Create the schema constructor. + */ + if (ctxt->constructor == NULL) { + ctxt->constructor = xmlSchemaConstructionCtxtCreate(ctxt->dict); + if (ctxt->constructor == NULL) + return(NULL); + /* Take ownership of the constructor to be able to free it. */ + ctxt->ownsConstructor = 1; + } + ctxt->constructor->mainSchema = mainSchema; + /* + * Locate and add the schema document. + */ + res = xmlSchemaAddSchemaDoc(ctxt, XML_SCHEMA_SCHEMA_MAIN, + ctxt->URL, ctxt->doc, ctxt->buffer, ctxt->size, NULL, + NULL, NULL, &bucket); + if (res == -1) + goto exit_failure; + if (res != 0) + goto exit; + + if (bucket == NULL) { + /* TODO: Error code, actually we failed to *locate* the schema. */ + if (ctxt->URL) + xmlSchemaCustomErr(ACTXT_CAST ctxt, XML_SCHEMAP_FAILED_LOAD, + NULL, NULL, + "Failed to locate the main schema resource at '%s'", + ctxt->URL, NULL); + else + xmlSchemaCustomErr(ACTXT_CAST ctxt, XML_SCHEMAP_FAILED_LOAD, + NULL, NULL, + "Failed to locate the main schema resource", + NULL, NULL); + goto exit; + } + /* Then do the parsing for good. */ + if (xmlSchemaParseNewDocWithContext(ctxt, mainSchema, bucket) == -1) + goto exit_failure; + if (ctxt->nberrors != 0) + goto exit; + + mainSchema->doc = bucket->doc; + mainSchema->preserve = ctxt->preserve; + + ctxt->schema = mainSchema; + + if (xmlSchemaFixupComponents(ctxt, WXS_CONSTRUCTOR(ctxt)->mainBucket) == -1) + goto exit_failure; + + /* + * TODO: This is not nice, since we cannot distinguish from the + * result if there was an internal error or not. + */ +exit: + if (ctxt->nberrors != 0) { + if (mainSchema) { + xmlSchemaFree(mainSchema); + mainSchema = NULL; + } + if (ctxt->constructor) { + xmlSchemaConstructionCtxtFree(ctxt->constructor); + ctxt->constructor = NULL; + ctxt->ownsConstructor = 0; + } + } + ctxt->schema = NULL; + return(mainSchema); +exit_failure: + /* + * Quite verbose, but should catch internal errors, which were + * not communitated. + */ + if (mainSchema) { + xmlSchemaFree(mainSchema); + mainSchema = NULL; + } + if (ctxt->constructor) { + xmlSchemaConstructionCtxtFree(ctxt->constructor); + ctxt->constructor = NULL; + ctxt->ownsConstructor = 0; + } + PERROR_INT2("xmlSchemaParse", + "An internal error occured"); + ctxt->schema = NULL; + return(NULL); +} + +/** + * xmlSchemaSetParserErrors: + * @ctxt: a schema validation context + * @err: the error callback + * @warn: the warning callback + * @ctx: contextual data for the callbacks + * + * Set the callback functions used to handle errors for a validation context + */ +void +xmlSchemaSetParserErrors(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaValidityErrorFunc err, + xmlSchemaValidityWarningFunc warn, void *ctx) +{ + if (ctxt == NULL) + return; + ctxt->error = err; + ctxt->warning = warn; + ctxt->errCtxt = ctx; + if (ctxt->vctxt != NULL) + xmlSchemaSetValidErrors(ctxt->vctxt, err, warn, ctx); +} + +/** + * xmlSchemaSetParserStructuredErrors: + * @ctxt: a schema parser context + * @serror: the structured error function + * @ctx: the functions context + * + * Set the structured error callback + */ +void +xmlSchemaSetParserStructuredErrors(xmlSchemaParserCtxtPtr ctxt, + xmlStructuredErrorFunc serror, + void *ctx) +{ + if (ctxt == NULL) + return; + ctxt->serror = serror; + ctxt->errCtxt = ctx; + if (ctxt->vctxt != NULL) + xmlSchemaSetValidStructuredErrors(ctxt->vctxt, serror, ctx); +} + +/** + * xmlSchemaGetParserErrors: + * @ctxt: a XMl-Schema parser context + * @err: the error callback result + * @warn: the warning callback result + * @ctx: contextual data for the callbacks result + * + * Get the callback information used to handle errors for a parser context + * + * Returns -1 in case of failure, 0 otherwise + */ +int +xmlSchemaGetParserErrors(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaValidityErrorFunc * err, + xmlSchemaValidityWarningFunc * warn, void **ctx) +{ + if (ctxt == NULL) + return(-1); + if (err != NULL) + *err = ctxt->error; + if (warn != NULL) + *warn = ctxt->warning; + if (ctx != NULL) + *ctx = ctxt->errCtxt; + return(0); +} + +/** + * xmlSchemaFacetTypeToString: + * @type: the facet type + * + * Convert the xmlSchemaTypeType to a char string. + * + * Returns the char string representation of the facet type if the + * type is a facet and an "Internal Error" string otherwise. + */ +static const xmlChar * +xmlSchemaFacetTypeToString(xmlSchemaTypeType type) +{ + switch (type) { + case XML_SCHEMA_FACET_PATTERN: + return (BAD_CAST "pattern"); + case XML_SCHEMA_FACET_MAXEXCLUSIVE: + return (BAD_CAST "maxExclusive"); + case XML_SCHEMA_FACET_MAXINCLUSIVE: + return (BAD_CAST "maxInclusive"); + case XML_SCHEMA_FACET_MINEXCLUSIVE: + return (BAD_CAST "minExclusive"); + case XML_SCHEMA_FACET_MININCLUSIVE: + return (BAD_CAST "minInclusive"); + case XML_SCHEMA_FACET_WHITESPACE: + return (BAD_CAST "whiteSpace"); + case XML_SCHEMA_FACET_ENUMERATION: + return (BAD_CAST "enumeration"); + case XML_SCHEMA_FACET_LENGTH: + return (BAD_CAST "length"); + case XML_SCHEMA_FACET_MAXLENGTH: + return (BAD_CAST "maxLength"); + case XML_SCHEMA_FACET_MINLENGTH: + return (BAD_CAST "minLength"); + case XML_SCHEMA_FACET_TOTALDIGITS: + return (BAD_CAST "totalDigits"); + case XML_SCHEMA_FACET_FRACTIONDIGITS: + return (BAD_CAST "fractionDigits"); + default: + break; + } + return (BAD_CAST "Internal Error"); +} + +static xmlSchemaWhitespaceValueType +xmlSchemaGetWhiteSpaceFacetValue(xmlSchemaTypePtr type) +{ + /* + * The normalization type can be changed only for types which are derived + * from xsd:string. + */ + if (type->type == XML_SCHEMA_TYPE_BASIC) { + /* + * Note that we assume a whitespace of preserve for anySimpleType. + */ + if ((type->builtInType == XML_SCHEMAS_STRING) || + (type->builtInType == XML_SCHEMAS_ANYSIMPLETYPE)) + return(XML_SCHEMA_WHITESPACE_PRESERVE); + else if (type->builtInType == XML_SCHEMAS_NORMSTRING) + return(XML_SCHEMA_WHITESPACE_REPLACE); + else { + /* + * For all �atomic� datatypes other than string (and types �derived� + * by �restriction� from it) the value of whiteSpace is fixed to + * collapse + * Note that this includes built-in list datatypes. + */ + return(XML_SCHEMA_WHITESPACE_COLLAPSE); + } + } else if (WXS_IS_LIST(type)) { + /* + * For list types the facet "whiteSpace" is fixed to "collapse". + */ + return (XML_SCHEMA_WHITESPACE_COLLAPSE); + } else if (WXS_IS_UNION(type)) { + return (XML_SCHEMA_WHITESPACE_UNKNOWN); + } else if (WXS_IS_ATOMIC(type)) { + if (type->flags & XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE) + return (XML_SCHEMA_WHITESPACE_PRESERVE); + else if (type->flags & XML_SCHEMAS_TYPE_WHITESPACE_REPLACE) + return (XML_SCHEMA_WHITESPACE_REPLACE); + else + return (XML_SCHEMA_WHITESPACE_COLLAPSE); + } + return (-1); +} + +/************************************************************************ + * * + * Simple type validation * + * * + ************************************************************************/ + + +/************************************************************************ + * * + * DOM Validation code * + * * + ************************************************************************/ + +/** + * xmlSchemaAssembleByLocation: + * @pctxt: a schema parser context + * @vctxt: a schema validation context + * @schema: the existing schema + * @node: the node that fired the assembling + * @nsName: the namespace name of the new schema + * @location: the location of the schema + * + * Expands an existing schema by an additional schema. + * + * Returns 0 if the new schema is correct, a positive error code + * number otherwise and -1 in case of an internal or API error. + */ +static int +xmlSchemaAssembleByLocation(xmlSchemaValidCtxtPtr vctxt, + xmlSchemaPtr schema, + xmlNodePtr node, + const xmlChar *nsName, + const xmlChar *location) +{ + int ret = 0; + xmlSchemaParserCtxtPtr pctxt; + xmlSchemaBucketPtr bucket = NULL; + + if ((vctxt == NULL) || (schema == NULL)) + return (-1); + + if (vctxt->pctxt == NULL) { + VERROR_INT("xmlSchemaAssembleByLocation", + "no parser context available"); + return(-1); + } + pctxt = vctxt->pctxt; + if (pctxt->constructor == NULL) { + PERROR_INT("xmlSchemaAssembleByLocation", + "no constructor"); + return(-1); + } + /* + * Acquire the schema document. + */ + location = xmlSchemaBuildAbsoluteURI(pctxt->dict, + location, node); + /* + * Note that we pass XML_SCHEMA_SCHEMA_IMPORT here; + * the process will automatically change this to + * XML_SCHEMA_SCHEMA_MAIN if it is the first schema document. + */ + ret = xmlSchemaAddSchemaDoc(pctxt, XML_SCHEMA_SCHEMA_IMPORT, + location, NULL, NULL, 0, node, NULL, nsName, + &bucket); + if (ret != 0) + return(ret); + if (bucket == NULL) { + /* + * Generate a warning that the document could not be located. + */ + xmlSchemaCustomWarning(ACTXT_CAST vctxt, XML_SCHEMAV_MISC, + node, NULL, + "The document at location '%s' could not be acquired", + location, NULL, NULL); + return(ret); + } + /* + * The first located schema will be handled as if all other + * schemas imported by XSI were imported by this first schema. + */ + if ((bucket != NULL) && + (WXS_CONSTRUCTOR(pctxt)->bucket == NULL)) + WXS_CONSTRUCTOR(pctxt)->bucket = bucket; + /* + * TODO: Is this handled like an import? I.e. is it not an error + * if the schema cannot be located? + */ + if ((bucket == NULL) || (! CAN_PARSE_SCHEMA(bucket))) + return(0); + /* + * We will reuse the parser context for every schema imported + * directly via XSI. So reset the context. + */ + pctxt->nberrors = 0; + pctxt->err = 0; + pctxt->doc = bucket->doc; + + ret = xmlSchemaParseNewDocWithContext(pctxt, schema, bucket); + if (ret == -1) { + pctxt->doc = NULL; + goto exit_failure; + } + /* Paranoid error channelling. */ + if ((ret == 0) && (pctxt->nberrors != 0)) + ret = pctxt->err; + if (pctxt->nberrors == 0) { + /* + * Only bother to fixup pending components, if there was + * no error yet. + * For every XSI acquired schema (and its sub-schemata) we will + * fixup the components. + */ + xmlSchemaFixupComponents(pctxt, bucket); + ret = pctxt->err; + /* + * Not nice, but we need somehow to channel the schema parser + * error to the validation context. + */ + if ((ret != 0) && (vctxt->err == 0)) + vctxt->err = ret; + vctxt->nberrors += pctxt->nberrors; + } else { + /* Add to validation error sum. */ + vctxt->nberrors += pctxt->nberrors; + } + pctxt->doc = NULL; + return(ret); +exit_failure: + pctxt->doc = NULL; + return (-1); +} + +static xmlSchemaAttrInfoPtr +xmlSchemaGetMetaAttrInfo(xmlSchemaValidCtxtPtr vctxt, + int metaType) +{ + if (vctxt->nbAttrInfos == 0) + return (NULL); + { + int i; + xmlSchemaAttrInfoPtr iattr; + + for (i = 0; i < vctxt->nbAttrInfos; i++) { + iattr = vctxt->attrInfos[i]; + if (iattr->metaType == metaType) + return (iattr); + } + + } + return (NULL); +} + +/** + * xmlSchemaAssembleByXSI: + * @vctxt: a schema validation context + * + * Expands an existing schema by an additional schema using + * the xsi:schemaLocation or xsi:noNamespaceSchemaLocation attribute + * of an instance. If xsi:noNamespaceSchemaLocation is used, @noNamespace + * must be set to 1. + * + * Returns 0 if the new schema is correct, a positive error code + * number otherwise and -1 in case of an internal or API error. + */ +static int +xmlSchemaAssembleByXSI(xmlSchemaValidCtxtPtr vctxt) +{ + const xmlChar *cur, *end; + const xmlChar *nsname = NULL, *location; + int count = 0; + int ret = 0; + xmlSchemaAttrInfoPtr iattr; + + /* + * Parse the value; we will assume an even number of values + * to be given (this is how Xerces and XSV work). + * + * URGENT TODO: !! This needs to work for both + * @noNamespaceSchemaLocation AND @schemaLocation on the same + * element !! + */ + iattr = xmlSchemaGetMetaAttrInfo(vctxt, + XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC); + if (iattr == NULL) + iattr = xmlSchemaGetMetaAttrInfo(vctxt, + XML_SCHEMA_ATTR_INFO_META_XSI_NO_NS_SCHEMA_LOC); + if (iattr == NULL) + return (0); + cur = iattr->value; + do { + /* + * TODO: Move the string parsing mechanism away from here. + */ + if (iattr->metaType == XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC) { + /* + * Get the namespace name. + */ + while (IS_BLANK_CH(*cur)) + cur++; + end = cur; + while ((*end != 0) && (!(IS_BLANK_CH(*end)))) + end++; + if (end == cur) + break; + count++; /* TODO: Don't use the schema's dict. */ + nsname = xmlDictLookup(vctxt->schema->dict, cur, end - cur); + cur = end; + } + /* + * Get the URI. + */ + while (IS_BLANK_CH(*cur)) + cur++; + end = cur; + while ((*end != 0) && (!(IS_BLANK_CH(*end)))) + end++; + if (end == cur) { + if (iattr->metaType == + XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC) + { + /* + * If using @schemaLocation then tuples are expected. + * I.e. the namespace name *and* the document's URI. + */ + xmlSchemaCustomWarning(ACTXT_CAST vctxt, XML_SCHEMAV_MISC, + iattr->node, NULL, + "The value must consist of tuples: the target namespace " + "name and the document's URI", NULL, NULL, NULL); + } + break; + } + count++; /* TODO: Don't use the schema's dict. */ + location = xmlDictLookup(vctxt->schema->dict, cur, end - cur); + cur = end; + ret = xmlSchemaAssembleByLocation(vctxt, vctxt->schema, + iattr->node, nsname, location); + if (ret == -1) { + VERROR_INT("xmlSchemaAssembleByXSI", + "assembling schemata"); + return (-1); + } + } while (*cur != 0); + return (ret); +} + +static const xmlChar * +xmlSchemaLookupNamespace(xmlSchemaValidCtxtPtr vctxt, + const xmlChar *prefix) +{ + if (vctxt->sax != NULL) { + int i, j; + xmlSchemaNodeInfoPtr inode; + + for (i = vctxt->depth; i >= 0; i--) { + if (vctxt->elemInfos[i]->nbNsBindings != 0) { + inode = vctxt->elemInfos[i]; + for (j = 0; j < inode->nbNsBindings * 2; j += 2) { + if (((prefix == NULL) && + (inode->nsBindings[j] == NULL)) || + ((prefix != NULL) && xmlStrEqual(prefix, + inode->nsBindings[j]))) { + + /* + * Note that the namespace bindings are already + * in a string dict. + */ + return (inode->nsBindings[j+1]); + } + } + } + } + return (NULL); +#ifdef LIBXML_READER_ENABLED + } else if (vctxt->reader != NULL) { + xmlChar *nsName; + + nsName = xmlTextReaderLookupNamespace(vctxt->reader, prefix); + if (nsName != NULL) { + const xmlChar *ret; + + ret = xmlDictLookup(vctxt->dict, nsName, -1); + xmlFree(nsName); + return (ret); + } else + return (NULL); +#endif + } else { + xmlNsPtr ns; + + if ((vctxt->inode->node == NULL) || + (vctxt->inode->node->doc == NULL)) { + VERROR_INT("xmlSchemaLookupNamespace", + "no node or node's doc avaliable"); + return (NULL); + } + ns = xmlSearchNs(vctxt->inode->node->doc, + vctxt->inode->node, prefix); + if (ns != NULL) + return (ns->href); + return (NULL); + } +} + +/* +* This one works on the schema of the validation context. +*/ +static int +xmlSchemaValidateNotation(xmlSchemaValidCtxtPtr vctxt, + xmlSchemaPtr schema, + xmlNodePtr node, + const xmlChar *value, + xmlSchemaValPtr *val, + int valNeeded) +{ + int ret; + + if (vctxt && (vctxt->schema == NULL)) { + VERROR_INT("xmlSchemaValidateNotation", + "a schema is needed on the validation context"); + return (-1); + } + ret = xmlValidateQName(value, 1); + if (ret != 0) + return (ret); + { + xmlChar *localName = NULL; + xmlChar *prefix = NULL; + + localName = xmlSplitQName2(value, &prefix); + if (prefix != NULL) { + const xmlChar *nsName = NULL; + + if (vctxt != NULL) + nsName = xmlSchemaLookupNamespace(vctxt, BAD_CAST prefix); + else if (node != NULL) { + xmlNsPtr ns = xmlSearchNs(node->doc, node, prefix); + if (ns != NULL) + nsName = ns->href; + } else { + xmlFree(prefix); + xmlFree(localName); + return (1); + } + if (nsName == NULL) { + xmlFree(prefix); + xmlFree(localName); + return (1); + } + if (xmlSchemaGetNotation(schema, localName, nsName) != NULL) { + if ((valNeeded) && (val != NULL)) { + (*val) = xmlSchemaNewNOTATIONValue(xmlStrdup(localName), + xmlStrdup(nsName)); + if (*val == NULL) + ret = -1; + } + } else + ret = 1; + xmlFree(prefix); + xmlFree(localName); + } else { + if (xmlSchemaGetNotation(schema, value, NULL) != NULL) { + if (valNeeded && (val != NULL)) { + (*val) = xmlSchemaNewNOTATIONValue( + BAD_CAST xmlStrdup(value), NULL); + if (*val == NULL) + ret = -1; + } + } else + return (1); + } + } + return (ret); +} + +static int +xmlSchemaVAddNodeQName(xmlSchemaValidCtxtPtr vctxt, + const xmlChar* lname, + const xmlChar* nsname) +{ + int i; + + lname = xmlDictLookup(vctxt->dict, lname, -1); + if (lname == NULL) + return(-1); + if (nsname != NULL) { + nsname = xmlDictLookup(vctxt->dict, nsname, -1); + if (nsname == NULL) + return(-1); + } + for (i = 0; i < vctxt->nodeQNames->nbItems; i += 2) { + if ((vctxt->nodeQNames->items [i] == lname) && + (vctxt->nodeQNames->items[i +1] == nsname)) + /* Already there */ + return(i); + } + /* Add new entry. */ + i = vctxt->nodeQNames->nbItems; + xmlSchemaItemListAdd(vctxt->nodeQNames, (void *) lname); + xmlSchemaItemListAdd(vctxt->nodeQNames, (void *) nsname); + return(i); +} + +/************************************************************************ + * * + * Validation of identity-constraints (IDC) * + * * + ************************************************************************/ + +/** + * xmlSchemaAugmentIDC: + * @idcDef: the IDC definition + * + * Creates an augmented IDC definition item. + * + * Returns the item, or NULL on internal errors. + */ +static void +xmlSchemaAugmentIDC(xmlSchemaIDCPtr idcDef, + xmlSchemaValidCtxtPtr vctxt) +{ + xmlSchemaIDCAugPtr aidc; + + aidc = (xmlSchemaIDCAugPtr) xmlMalloc(sizeof(xmlSchemaIDCAug)); + if (aidc == NULL) { + xmlSchemaVErrMemory(vctxt, + "xmlSchemaAugmentIDC: allocating an augmented IDC definition", + NULL); + return; + } + aidc->keyrefDepth = -1; + aidc->def = idcDef; + aidc->next = NULL; + if (vctxt->aidcs == NULL) + vctxt->aidcs = aidc; + else { + aidc->next = vctxt->aidcs; + vctxt->aidcs = aidc; + } + /* + * Save if we have keyrefs at all. + */ + if ((vctxt->hasKeyrefs == 0) && + (idcDef->type == XML_SCHEMA_TYPE_IDC_KEYREF)) + vctxt->hasKeyrefs = 1; +} + +/** + * xmlSchemaAugmentImportedIDC: + * @imported: the imported schema + * + * Creates an augmented IDC definition for the imported schema. + */ +static void +xmlSchemaAugmentImportedIDC(xmlSchemaImportPtr imported, xmlSchemaValidCtxtPtr vctxt) { + if (imported->schema->idcDef != NULL) { + xmlHashScan(imported->schema->idcDef , + (xmlHashScanner) xmlSchemaAugmentIDC, vctxt); + } +} + +/** + * xmlSchemaIDCNewBinding: + * @idcDef: the IDC definition of this binding + * + * Creates a new IDC binding. + * + * Returns the new IDC binding, NULL on internal errors. + */ +static xmlSchemaPSVIIDCBindingPtr +xmlSchemaIDCNewBinding(xmlSchemaIDCPtr idcDef) +{ + xmlSchemaPSVIIDCBindingPtr ret; + + ret = (xmlSchemaPSVIIDCBindingPtr) xmlMalloc( + sizeof(xmlSchemaPSVIIDCBinding)); + if (ret == NULL) { + xmlSchemaVErrMemory(NULL, + "allocating a PSVI IDC binding item", NULL); + return (NULL); + } + memset(ret, 0, sizeof(xmlSchemaPSVIIDCBinding)); + ret->definition = idcDef; + return (ret); +} + +/** + * xmlSchemaIDCStoreNodeTableItem: + * @vctxt: the WXS validation context + * @item: the IDC node table item + * + * The validation context is used to store IDC node table items. + * They are stored to avoid copying them if IDC node-tables are merged + * with corresponding parent IDC node-tables (bubbling). + * + * Returns 0 if succeeded, -1 on internal errors. + */ +static int +xmlSchemaIDCStoreNodeTableItem(xmlSchemaValidCtxtPtr vctxt, + xmlSchemaPSVIIDCNodePtr item) +{ + /* + * Add to gobal list. + */ + if (vctxt->idcNodes == NULL) { + vctxt->idcNodes = (xmlSchemaPSVIIDCNodePtr *) + xmlMalloc(20 * sizeof(xmlSchemaPSVIIDCNodePtr)); + if (vctxt->idcNodes == NULL) { + xmlSchemaVErrMemory(vctxt, + "allocating the IDC node table item list", NULL); + return (-1); + } + vctxt->sizeIdcNodes = 20; + } else if (vctxt->sizeIdcNodes <= vctxt->nbIdcNodes) { + vctxt->sizeIdcNodes *= 2; + vctxt->idcNodes = (xmlSchemaPSVIIDCNodePtr *) + xmlRealloc(vctxt->idcNodes, vctxt->sizeIdcNodes * + sizeof(xmlSchemaPSVIIDCNodePtr)); + if (vctxt->idcNodes == NULL) { + xmlSchemaVErrMemory(vctxt, + "re-allocating the IDC node table item list", NULL); + return (-1); + } + } + vctxt->idcNodes[vctxt->nbIdcNodes++] = item; + + return (0); +} + +/** + * xmlSchemaIDCStoreKey: + * @vctxt: the WXS validation context + * @item: the IDC key + * + * The validation context is used to store an IDC key. + * + * Returns 0 if succeeded, -1 on internal errors. + */ +static int +xmlSchemaIDCStoreKey(xmlSchemaValidCtxtPtr vctxt, + xmlSchemaPSVIIDCKeyPtr key) +{ + /* + * Add to gobal list. + */ + if (vctxt->idcKeys == NULL) { + vctxt->idcKeys = (xmlSchemaPSVIIDCKeyPtr *) + xmlMalloc(40 * sizeof(xmlSchemaPSVIIDCKeyPtr)); + if (vctxt->idcKeys == NULL) { + xmlSchemaVErrMemory(vctxt, + "allocating the IDC key storage list", NULL); + return (-1); + } + vctxt->sizeIdcKeys = 40; + } else if (vctxt->sizeIdcKeys <= vctxt->nbIdcKeys) { + vctxt->sizeIdcKeys *= 2; + vctxt->idcKeys = (xmlSchemaPSVIIDCKeyPtr *) + xmlRealloc(vctxt->idcKeys, vctxt->sizeIdcKeys * + sizeof(xmlSchemaPSVIIDCKeyPtr)); + if (vctxt->idcKeys == NULL) { + xmlSchemaVErrMemory(vctxt, + "re-allocating the IDC key storage list", NULL); + return (-1); + } + } + vctxt->idcKeys[vctxt->nbIdcKeys++] = key; + + return (0); +} + +/** + * xmlSchemaIDCAppendNodeTableItem: + * @bind: the IDC binding + * @ntItem: the node-table item + * + * Appends the IDC node-table item to the binding. + * + * Returns 0 on success and -1 on internal errors. + */ +static int +xmlSchemaIDCAppendNodeTableItem(xmlSchemaPSVIIDCBindingPtr bind, + xmlSchemaPSVIIDCNodePtr ntItem) +{ + if (bind->nodeTable == NULL) { + bind->sizeNodes = 10; + bind->nodeTable = (xmlSchemaPSVIIDCNodePtr *) + xmlMalloc(10 * sizeof(xmlSchemaPSVIIDCNodePtr)); + if (bind->nodeTable == NULL) { + xmlSchemaVErrMemory(NULL, + "allocating an array of IDC node-table items", NULL); + return(-1); + } + } else if (bind->sizeNodes <= bind->nbNodes) { + bind->sizeNodes *= 2; + bind->nodeTable = (xmlSchemaPSVIIDCNodePtr *) + xmlRealloc(bind->nodeTable, bind->sizeNodes * + sizeof(xmlSchemaPSVIIDCNodePtr)); + if (bind->nodeTable == NULL) { + xmlSchemaVErrMemory(NULL, + "re-allocating an array of IDC node-table items", NULL); + return(-1); + } + } + bind->nodeTable[bind->nbNodes++] = ntItem; + return(0); +} + +/** + * xmlSchemaIDCAcquireBinding: + * @vctxt: the WXS validation context + * @matcher: the IDC matcher + * + * Looks up an PSVI IDC binding, for the IDC definition and + * of the given matcher. If none found, a new one is created + * and added to the IDC table. + * + * Returns an IDC binding or NULL on internal errors. + */ +static xmlSchemaPSVIIDCBindingPtr +xmlSchemaIDCAcquireBinding(xmlSchemaValidCtxtPtr vctxt, + xmlSchemaIDCMatcherPtr matcher) +{ + xmlSchemaNodeInfoPtr ielem; + + ielem = vctxt->elemInfos[matcher->depth]; + + if (ielem->idcTable == NULL) { + ielem->idcTable = xmlSchemaIDCNewBinding(matcher->aidc->def); + if (ielem->idcTable == NULL) + return (NULL); + return(ielem->idcTable); + } else { + xmlSchemaPSVIIDCBindingPtr bind = NULL; + + bind = ielem->idcTable; + do { + if (bind->definition == matcher->aidc->def) + return(bind); + if (bind->next == NULL) { + bind->next = xmlSchemaIDCNewBinding(matcher->aidc->def); + if (bind->next == NULL) + return (NULL); + return(bind->next); + } + bind = bind->next; + } while (bind != NULL); + } + return (NULL); +} + +static xmlSchemaItemListPtr +xmlSchemaIDCAcquireTargetList(xmlSchemaValidCtxtPtr vctxt ATTRIBUTE_UNUSED, + xmlSchemaIDCMatcherPtr matcher) +{ + if (matcher->targets == NULL) + matcher->targets = xmlSchemaItemListCreate(); + return(matcher->targets); +} + +/** + * xmlSchemaIDCFreeKey: + * @key: the IDC key + * + * Frees an IDC key together with its compiled value. + */ +static void +xmlSchemaIDCFreeKey(xmlSchemaPSVIIDCKeyPtr key) +{ + if (key->val != NULL) + xmlSchemaFreeValue(key->val); + xmlFree(key); +} + +/** + * xmlSchemaIDCFreeBinding: + * + * Frees an IDC binding. Note that the node table-items + * are not freed. + */ +static void +xmlSchemaIDCFreeBinding(xmlSchemaPSVIIDCBindingPtr bind) +{ + if (bind->nodeTable != NULL) + xmlFree(bind->nodeTable); + if (bind->dupls != NULL) + xmlSchemaItemListFree(bind->dupls); + xmlFree(bind); +} + +/** + * xmlSchemaIDCFreeIDCTable: + * @bind: the first IDC binding in the list + * + * Frees an IDC table, i.e. all the IDC bindings in the list. + */ +static void +xmlSchemaIDCFreeIDCTable(xmlSchemaPSVIIDCBindingPtr bind) +{ + xmlSchemaPSVIIDCBindingPtr prev; + + while (bind != NULL) { + prev = bind; + bind = bind->next; + xmlSchemaIDCFreeBinding(prev); + } +} + +/** + * xmlSchemaIDCFreeMatcherList: + * @matcher: the first IDC matcher in the list + * + * Frees a list of IDC matchers. + */ +static void +xmlSchemaIDCFreeMatcherList(xmlSchemaIDCMatcherPtr matcher) +{ + xmlSchemaIDCMatcherPtr next; + + while (matcher != NULL) { + next = matcher->next; + if (matcher->keySeqs != NULL) { + int i; + for (i = 0; i < matcher->sizeKeySeqs; i++) + if (matcher->keySeqs[i] != NULL) + xmlFree(matcher->keySeqs[i]); + xmlFree(matcher->keySeqs); + } + if (matcher->targets != NULL) { + if (matcher->idcType == XML_SCHEMA_TYPE_IDC_KEYREF) { + int i; + xmlSchemaPSVIIDCNodePtr idcNode; + /* + * Node-table items for keyrefs are not stored globally + * to the validation context, since they are not bubbled. + * We need to free them here. + */ + for (i = 0; i < matcher->targets->nbItems; i++) { + idcNode = + (xmlSchemaPSVIIDCNodePtr) matcher->targets->items[i]; + xmlFree(idcNode->keys); + xmlFree(idcNode); + } + } + xmlSchemaItemListFree(matcher->targets); + } + xmlFree(matcher); + matcher = next; + } +} + +/** + * xmlSchemaIDCReleaseMatcherList: + * @vctxt: the WXS validation context + * @matcher: the first IDC matcher in the list + * + * Caches a list of IDC matchers for reuse. + */ +static void +xmlSchemaIDCReleaseMatcherList(xmlSchemaValidCtxtPtr vctxt, + xmlSchemaIDCMatcherPtr matcher) +{ + xmlSchemaIDCMatcherPtr next; + + while (matcher != NULL) { + next = matcher->next; + if (matcher->keySeqs != NULL) { + int i; + /* + * Don't free the array, but only the content. + */ + for (i = 0; i < matcher->sizeKeySeqs; i++) + if (matcher->keySeqs[i] != NULL) { + xmlFree(matcher->keySeqs[i]); + matcher->keySeqs[i] = NULL; + } + } + if (matcher->targets) { + if (matcher->idcType == XML_SCHEMA_TYPE_IDC_KEYREF) { + int i; + xmlSchemaPSVIIDCNodePtr idcNode; + /* + * Node-table items for keyrefs are not stored globally + * to the validation context, since they are not bubbled. + * We need to free them here. + */ + for (i = 0; i < matcher->targets->nbItems; i++) { + idcNode = + (xmlSchemaPSVIIDCNodePtr) matcher->targets->items[i]; + xmlFree(idcNode->keys); + xmlFree(idcNode); + } + } + xmlSchemaItemListFree(matcher->targets); + matcher->targets = NULL; + } + matcher->next = NULL; + /* + * Cache the matcher. + */ + if (vctxt->idcMatcherCache != NULL) + matcher->nextCached = vctxt->idcMatcherCache; + vctxt->idcMatcherCache = matcher; + + matcher = next; + } +} + +/** + * xmlSchemaIDCAddStateObject: + * @vctxt: the WXS validation context + * @matcher: the IDC matcher + * @sel: the XPath information + * @parent: the parent "selector" state object if any + * @type: "selector" or "field" + * + * Creates/reuses and activates state objects for the given + * XPath information; if the XPath expression consists of unions, + * multiple state objects are created for every unioned expression. + * + * Returns 0 on success and -1 on internal errors. + */ +static int +xmlSchemaIDCAddStateObject(xmlSchemaValidCtxtPtr vctxt, + xmlSchemaIDCMatcherPtr matcher, + xmlSchemaIDCSelectPtr sel, + int type) +{ + xmlSchemaIDCStateObjPtr sto; + + /* + * Reuse the state objects from the pool. + */ + if (vctxt->xpathStatePool != NULL) { + sto = vctxt->xpathStatePool; + vctxt->xpathStatePool = sto->next; + sto->next = NULL; + } else { + /* + * Create a new state object. + */ + sto = (xmlSchemaIDCStateObjPtr) xmlMalloc(sizeof(xmlSchemaIDCStateObj)); + if (sto == NULL) { + xmlSchemaVErrMemory(NULL, + "allocating an IDC state object", NULL); + return (-1); + } + memset(sto, 0, sizeof(xmlSchemaIDCStateObj)); + } + /* + * Add to global list. + */ + if (vctxt->xpathStates != NULL) + sto->next = vctxt->xpathStates; + vctxt->xpathStates = sto; + + /* + * Free the old xpath validation context. + */ + if (sto->xpathCtxt != NULL) + xmlFreeStreamCtxt((xmlStreamCtxtPtr) sto->xpathCtxt); + + /* + * Create a new XPath (pattern) validation context. + */ + sto->xpathCtxt = (void *) xmlPatternGetStreamCtxt( + (xmlPatternPtr) sel->xpathComp); + if (sto->xpathCtxt == NULL) { + VERROR_INT("xmlSchemaIDCAddStateObject", + "failed to create an XPath validation context"); + return (-1); + } + sto->type = type; + sto->depth = vctxt->depth; + sto->matcher = matcher; + sto->sel = sel; + sto->nbHistory = 0; + +#ifdef DEBUG_IDC + xmlGenericError(xmlGenericErrorContext, "IDC: STO push '%s'\n", + sto->sel->xpath); +#endif + return (0); +} + +/** + * xmlSchemaXPathEvaluate: + * @vctxt: the WXS validation context + * @nodeType: the nodeType of the current node + * + * Evaluates all active XPath state objects. + * + * Returns the number of IC "field" state objects which resolved to + * this node, 0 if none resolved and -1 on internal errors. + */ +static int +xmlSchemaXPathEvaluate(xmlSchemaValidCtxtPtr vctxt, + xmlElementType nodeType) +{ + xmlSchemaIDCStateObjPtr sto, head = NULL, first; + int res, resolved = 0, depth = vctxt->depth; + + if (vctxt->xpathStates == NULL) + return (0); + + if (nodeType == XML_ATTRIBUTE_NODE) + depth++; +#ifdef DEBUG_IDC + { + xmlChar *str = NULL; + xmlGenericError(xmlGenericErrorContext, + "IDC: EVAL on %s, depth %d, type %d\n", + xmlSchemaFormatQName(&str, vctxt->inode->nsName, + vctxt->inode->localName), depth, nodeType); + FREE_AND_NULL(str) + } +#endif + /* + * Process all active XPath state objects. + */ + first = vctxt->xpathStates; + sto = first; + while (sto != head) { +#ifdef DEBUG_IDC + if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_SELECTOR) + xmlGenericError(xmlGenericErrorContext, "IDC: ['%s'] selector '%s'\n", + sto->matcher->aidc->def->name, sto->sel->xpath); + else + xmlGenericError(xmlGenericErrorContext, "IDC: ['%s'] field '%s'\n", + sto->matcher->aidc->def->name, sto->sel->xpath); +#endif + if (nodeType == XML_ELEMENT_NODE) + res = xmlStreamPush((xmlStreamCtxtPtr) sto->xpathCtxt, + vctxt->inode->localName, vctxt->inode->nsName); + else + res = xmlStreamPushAttr((xmlStreamCtxtPtr) sto->xpathCtxt, + vctxt->inode->localName, vctxt->inode->nsName); + + if (res == -1) { + VERROR_INT("xmlSchemaXPathEvaluate", + "calling xmlStreamPush()"); + return (-1); + } + if (res == 0) + goto next_sto; + /* + * Full match. + */ +#ifdef DEBUG_IDC + xmlGenericError(xmlGenericErrorContext, "IDC: " + "MATCH\n"); +#endif + /* + * Register a match in the state object history. + */ + if (sto->history == NULL) { + sto->history = (int *) xmlMalloc(5 * sizeof(int)); + if (sto->history == NULL) { + xmlSchemaVErrMemory(NULL, + "allocating the state object history", NULL); + return(-1); + } + sto->sizeHistory = 5; + } else if (sto->sizeHistory <= sto->nbHistory) { + sto->sizeHistory *= 2; + sto->history = (int *) xmlRealloc(sto->history, + sto->sizeHistory * sizeof(int)); + if (sto->history == NULL) { + xmlSchemaVErrMemory(NULL, + "re-allocating the state object history", NULL); + return(-1); + } + } + sto->history[sto->nbHistory++] = depth; + +#ifdef DEBUG_IDC + xmlGenericError(xmlGenericErrorContext, "IDC: push match '%d'\n", + vctxt->depth); +#endif + + if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_SELECTOR) { + xmlSchemaIDCSelectPtr sel; + /* + * Activate state objects for the IDC fields of + * the IDC selector. + */ +#ifdef DEBUG_IDC + xmlGenericError(xmlGenericErrorContext, "IDC: " + "activating field states\n"); +#endif + sel = sto->matcher->aidc->def->fields; + while (sel != NULL) { + if (xmlSchemaIDCAddStateObject(vctxt, sto->matcher, + sel, XPATH_STATE_OBJ_TYPE_IDC_FIELD) == -1) + return (-1); + sel = sel->next; + } + } else if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_FIELD) { + /* + * An IDC key node was found by the IDC field. + */ +#ifdef DEBUG_IDC + xmlGenericError(xmlGenericErrorContext, + "IDC: key found\n"); +#endif + /* + * Notify that the character value of this node is + * needed. + */ + if (resolved == 0) { + if ((vctxt->inode->flags & + XML_SCHEMA_NODE_INFO_VALUE_NEEDED) == 0) + vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_VALUE_NEEDED; + } + resolved++; + } +next_sto: + if (sto->next == NULL) { + /* + * Evaluate field state objects created on this node as well. + */ + head = first; + sto = vctxt->xpathStates; + } else + sto = sto->next; + } + return (resolved); +} + +static const xmlChar * +xmlSchemaFormatIDCKeySequence(xmlSchemaValidCtxtPtr vctxt, + xmlChar **buf, + xmlSchemaPSVIIDCKeyPtr *seq, + int count) +{ + int i, res; + xmlChar *value = NULL; + + *buf = xmlStrdup(BAD_CAST "["); + for (i = 0; i < count; i++) { + *buf = xmlStrcat(*buf, BAD_CAST "'"); + res = xmlSchemaGetCanonValueWhtspExt(seq[i]->val, + xmlSchemaGetWhiteSpaceFacetValue(seq[i]->type), + &value); + if (res == 0) + *buf = xmlStrcat(*buf, BAD_CAST value); + else { + VERROR_INT("xmlSchemaFormatIDCKeySequence", + "failed to compute a canonical value"); + *buf = xmlStrcat(*buf, BAD_CAST "???"); + } + if (i < count -1) + *buf = xmlStrcat(*buf, BAD_CAST "', "); + else + *buf = xmlStrcat(*buf, BAD_CAST "'"); + if (value != NULL) { + xmlFree(value); + value = NULL; + } + } + *buf = xmlStrcat(*buf, BAD_CAST "]"); + + return (BAD_CAST *buf); +} + +/** + * xmlSchemaXPathPop: + * @vctxt: the WXS validation context + * + * Pops all XPath states. + * + * Returns 0 on success and -1 on internal errors. + */ +static int +xmlSchemaXPathPop(xmlSchemaValidCtxtPtr vctxt) +{ + xmlSchemaIDCStateObjPtr sto; + int res; + + if (vctxt->xpathStates == NULL) + return(0); + sto = vctxt->xpathStates; + do { + res = xmlStreamPop((xmlStreamCtxtPtr) sto->xpathCtxt); + if (res == -1) + return (-1); + sto = sto->next; + } while (sto != NULL); + return(0); +} + +/** + * xmlSchemaXPathProcessHistory: + * @vctxt: the WXS validation context + * @type: the simple/complex type of the current node if any at all + * @val: the precompiled value + * + * Processes and pops the history items of the IDC state objects. + * IDC key-sequences are validated/created on IDC bindings. + * + * Returns 0 on success and -1 on internal errors. + */ +static int +xmlSchemaXPathProcessHistory(xmlSchemaValidCtxtPtr vctxt, + int depth) +{ + xmlSchemaIDCStateObjPtr sto, nextsto; + int res, matchDepth; + xmlSchemaPSVIIDCKeyPtr key = NULL; + xmlSchemaTypePtr type = vctxt->inode->typeDef, simpleType = NULL; + + if (vctxt->xpathStates == NULL) + return (0); + sto = vctxt->xpathStates; + +#ifdef DEBUG_IDC + { + xmlChar *str = NULL; + xmlGenericError(xmlGenericErrorContext, + "IDC: BACK on %s, depth %d\n", + xmlSchemaFormatQName(&str, vctxt->inode->nsName, + vctxt->inode->localName), vctxt->depth); + FREE_AND_NULL(str) + } +#endif + /* + * Evaluate the state objects. + */ + while (sto != NULL) { + res = xmlStreamPop((xmlStreamCtxtPtr) sto->xpathCtxt); + if (res == -1) { + VERROR_INT("xmlSchemaXPathProcessHistory", + "calling xmlStreamPop()"); + return (-1); + } +#ifdef DEBUG_IDC + xmlGenericError(xmlGenericErrorContext, "IDC: stream pop '%s'\n", + sto->sel->xpath); +#endif + if (sto->nbHistory == 0) + goto deregister_check; + + matchDepth = sto->history[sto->nbHistory -1]; + + /* + * Only matches at the current depth are of interest. + */ + if (matchDepth != depth) { + sto = sto->next; + continue; + } + if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_FIELD) { + /* + * NOTE: According to + * http://www.w3.org/Bugs/Public/show_bug.cgi?id=2198 + * ... the simple-content of complex types is also allowed. + */ + + if (WXS_IS_COMPLEX(type)) { + if (WXS_HAS_SIMPLE_CONTENT(type)) { + /* + * Sanity check for complex types with simple content. + */ + simpleType = type->contentTypeDef; + if (simpleType == NULL) { + VERROR_INT("xmlSchemaXPathProcessHistory", + "field resolves to a CT with simple content " + "but the CT is missing the ST definition"); + return (-1); + } + } else + simpleType = NULL; + } else + simpleType = type; + if (simpleType == NULL) { + xmlChar *str = NULL; + + /* + * Not qualified if the field resolves to a node of non + * simple type. + */ + xmlSchemaCustomErr(ACTXT_CAST vctxt, + XML_SCHEMAV_CVC_IDC, NULL, + WXS_BASIC_CAST sto->matcher->aidc->def, + "The XPath '%s' of a field of %s does evaluate to a node of " + "non-simple type", + sto->sel->xpath, + xmlSchemaGetIDCDesignation(&str, sto->matcher->aidc->def)); + FREE_AND_NULL(str); + sto->nbHistory--; + goto deregister_check; + } + + if ((key == NULL) && (vctxt->inode->val == NULL)) { + /* + * Failed to provide the normalized value; maybe + * the value was invalid. + */ + VERROR(XML_SCHEMAV_CVC_IDC, + WXS_BASIC_CAST sto->matcher->aidc->def, + "Warning: No precomputed value available, the value " + "was either invalid or something strange happend"); + sto->nbHistory--; + goto deregister_check; + } else { + xmlSchemaIDCMatcherPtr matcher = sto->matcher; + xmlSchemaPSVIIDCKeyPtr *keySeq; + int pos, idx; + + /* + * The key will be anchored on the matcher's list of + * key-sequences. The position in this list is determined + * by the target node's depth relative to the matcher's + * depth of creation (i.e. the depth of the scope element). + * + * Element Depth Pos List-entries + * 0 NULL + * 1 NULL + * 2 2 target + * + * + * + * The size of the list is only dependant on the depth of + * the tree. + * An entry will be NULLed in selector_leave, i.e. when + * we hit the target's + */ + pos = sto->depth - matcher->depth; + idx = sto->sel->index; + + /* + * Create/grow the array of key-sequences. + */ + if (matcher->keySeqs == NULL) { + if (pos > 9) + matcher->sizeKeySeqs = pos * 2; + else + matcher->sizeKeySeqs = 10; + matcher->keySeqs = (xmlSchemaPSVIIDCKeyPtr **) + xmlMalloc(matcher->sizeKeySeqs * + sizeof(xmlSchemaPSVIIDCKeyPtr *)); + if (matcher->keySeqs == NULL) { + xmlSchemaVErrMemory(NULL, + "allocating an array of key-sequences", + NULL); + return(-1); + } + memset(matcher->keySeqs, 0, + matcher->sizeKeySeqs * + sizeof(xmlSchemaPSVIIDCKeyPtr *)); + } else if (pos >= matcher->sizeKeySeqs) { + int i = matcher->sizeKeySeqs; + + matcher->sizeKeySeqs *= 2; + matcher->keySeqs = (xmlSchemaPSVIIDCKeyPtr **) + xmlRealloc(matcher->keySeqs, + matcher->sizeKeySeqs * + sizeof(xmlSchemaPSVIIDCKeyPtr *)); + if (matcher->keySeqs == NULL) { + xmlSchemaVErrMemory(NULL, + "reallocating an array of key-sequences", + NULL); + return (-1); + } + /* + * The array needs to be NULLed. + * TODO: Use memset? + */ + for (; i < matcher->sizeKeySeqs; i++) + matcher->keySeqs[i] = NULL; + } + + /* + * Get/create the key-sequence. + */ + keySeq = matcher->keySeqs[pos]; + if (keySeq == NULL) { + goto create_sequence; + } else if (keySeq[idx] != NULL) { + xmlChar *str = NULL; + /* + * cvc-identity-constraint: + * 3 For each node in the �target node set� all + * of the {fields}, with that node as the context + * node, evaluate to either an empty node-set or + * a node-set with exactly one member, which must + * have a simple type. + * + * The key was already set; report an error. + */ + xmlSchemaCustomErr(ACTXT_CAST vctxt, + XML_SCHEMAV_CVC_IDC, NULL, + WXS_BASIC_CAST matcher->aidc->def, + "The XPath '%s' of a field of %s evaluates to a " + "node-set with more than one member", + sto->sel->xpath, + xmlSchemaGetIDCDesignation(&str, matcher->aidc->def)); + FREE_AND_NULL(str); + sto->nbHistory--; + goto deregister_check; + } else + goto create_key; + +create_sequence: + /* + * Create a key-sequence. + */ + keySeq = (xmlSchemaPSVIIDCKeyPtr *) xmlMalloc( + matcher->aidc->def->nbFields * + sizeof(xmlSchemaPSVIIDCKeyPtr)); + if (keySeq == NULL) { + xmlSchemaVErrMemory(NULL, + "allocating an IDC key-sequence", NULL); + return(-1); + } + memset(keySeq, 0, matcher->aidc->def->nbFields * + sizeof(xmlSchemaPSVIIDCKeyPtr)); + matcher->keySeqs[pos] = keySeq; +create_key: + /* + * Create a key once per node only. + */ + if (key == NULL) { + key = (xmlSchemaPSVIIDCKeyPtr) xmlMalloc( + sizeof(xmlSchemaPSVIIDCKey)); + if (key == NULL) { + xmlSchemaVErrMemory(NULL, + "allocating a IDC key", NULL); + xmlFree(keySeq); + matcher->keySeqs[pos] = NULL; + return(-1); + } + /* + * Consume the compiled value. + */ + key->type = simpleType; + key->val = vctxt->inode->val; + vctxt->inode->val = NULL; + /* + * Store the key in a global list. + */ + if (xmlSchemaIDCStoreKey(vctxt, key) == -1) { + xmlSchemaIDCFreeKey(key); + return (-1); + } + } + keySeq[idx] = key; + } + } else if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_SELECTOR) { + + xmlSchemaPSVIIDCKeyPtr **keySeq = NULL; + /* xmlSchemaPSVIIDCBindingPtr bind; */ + xmlSchemaPSVIIDCNodePtr ntItem; + xmlSchemaIDCMatcherPtr matcher; + xmlSchemaIDCPtr idc; + xmlSchemaItemListPtr targets; + int pos, i, j, nbKeys; + /* + * Here we have the following scenario: + * An IDC 'selector' state object resolved to a target node, + * during the time this target node was in the + * ancestor-or-self axis, the 'field' state object(s) looked + * out for matching nodes to create a key-sequence for this + * target node. Now we are back to this target node and need + * to put the key-sequence, together with the target node + * itself, into the node-table of the corresponding IDC + * binding. + */ + matcher = sto->matcher; + idc = matcher->aidc->def; + nbKeys = idc->nbFields; + pos = depth - matcher->depth; + /* + * Check if the matcher has any key-sequences at all, plus + * if it has a key-sequence for the current target node. + */ + if ((matcher->keySeqs == NULL) || + (matcher->sizeKeySeqs <= pos)) { + if (idc->type == XML_SCHEMA_TYPE_IDC_KEY) + goto selector_key_error; + else + goto selector_leave; + } + + keySeq = &(matcher->keySeqs[pos]); + if (*keySeq == NULL) { + if (idc->type == XML_SCHEMA_TYPE_IDC_KEY) + goto selector_key_error; + else + goto selector_leave; + } + + for (i = 0; i < nbKeys; i++) { + if ((*keySeq)[i] == NULL) { + /* + * Not qualified, if not all fields did resolve. + */ + if (idc->type == XML_SCHEMA_TYPE_IDC_KEY) { + /* + * All fields of a "key" IDC must resolve. + */ + goto selector_key_error; + } + goto selector_leave; + } + } + /* + * All fields did resolve. + */ + + /* + * 4.1 If the {identity-constraint category} is unique(/key), + * then no two members of the �qualified node set� have + * �key-sequences� whose members are pairwise equal, as + * defined by Equal in [XML Schemas: Datatypes]. + * + * Get the IDC binding from the matcher and check for + * duplicate key-sequences. + */ +#if 0 + bind = xmlSchemaIDCAcquireBinding(vctxt, matcher); +#endif + targets = xmlSchemaIDCAcquireTargetList(vctxt, matcher); + if ((idc->type != XML_SCHEMA_TYPE_IDC_KEYREF) && + (targets->nbItems != 0)) { + xmlSchemaPSVIIDCKeyPtr ckey, bkey, *bkeySeq; + + i = 0; + res = 0; + /* + * Compare the key-sequences, key by key. + */ + do { + bkeySeq = + ((xmlSchemaPSVIIDCNodePtr) targets->items[i])->keys; + for (j = 0; j < nbKeys; j++) { + ckey = (*keySeq)[j]; + bkey = bkeySeq[j]; + res = xmlSchemaAreValuesEqual(ckey->val, bkey->val); + if (res == -1) { + return (-1); + } else if (res == 0) { + /* + * One of the keys differs, so the key-sequence + * won't be equal; get out. + */ + break; + } + } + if (res == 1) { + /* + * Duplicate key-sequence found. + */ + break; + } + i++; + } while (i < targets->nbItems); + if (i != targets->nbItems) { + xmlChar *str = NULL, *strB = NULL; + /* + * TODO: Try to report the key-sequence. + */ + xmlSchemaCustomErr(ACTXT_CAST vctxt, + XML_SCHEMAV_CVC_IDC, NULL, + WXS_BASIC_CAST idc, + "Duplicate key-sequence %s in %s", + xmlSchemaFormatIDCKeySequence(vctxt, &str, + (*keySeq), nbKeys), + xmlSchemaGetIDCDesignation(&strB, idc)); + FREE_AND_NULL(str); + FREE_AND_NULL(strB); + goto selector_leave; + } + } + /* + * Add a node-table item to the IDC binding. + */ + ntItem = (xmlSchemaPSVIIDCNodePtr) xmlMalloc( + sizeof(xmlSchemaPSVIIDCNode)); + if (ntItem == NULL) { + xmlSchemaVErrMemory(NULL, + "allocating an IDC node-table item", NULL); + xmlFree(*keySeq); + *keySeq = NULL; + return(-1); + } + memset(ntItem, 0, sizeof(xmlSchemaPSVIIDCNode)); + + /* + * Store the node-table item in a global list. + */ + if (idc->type != XML_SCHEMA_TYPE_IDC_KEYREF) { + if (xmlSchemaIDCStoreNodeTableItem(vctxt, ntItem) == -1) { + xmlFree(ntItem); + xmlFree(*keySeq); + *keySeq = NULL; + return (-1); + } + ntItem->nodeQNameID = -1; + } else { + /* + * Save a cached QName for this node on the IDC node, to be + * able to report it, even if the node is not saved. + */ + ntItem->nodeQNameID = xmlSchemaVAddNodeQName(vctxt, + vctxt->inode->localName, vctxt->inode->nsName); + if (ntItem->nodeQNameID == -1) { + xmlFree(ntItem); + xmlFree(*keySeq); + *keySeq = NULL; + return (-1); + } + } + /* + * Init the node-table item: Save the node, position and + * consume the key-sequence. + */ + ntItem->node = vctxt->node; + ntItem->nodeLine = vctxt->inode->nodeLine; + ntItem->keys = *keySeq; + *keySeq = NULL; +#if 0 + if (xmlSchemaIDCAppendNodeTableItem(bind, ntItem) == -1) +#endif + if (xmlSchemaItemListAdd(targets, ntItem) == -1) { + if (idc->type == XML_SCHEMA_TYPE_IDC_KEYREF) { + /* + * Free the item, since keyref items won't be + * put on a global list. + */ + xmlFree(ntItem->keys); + xmlFree(ntItem); + } + return (-1); + } + + goto selector_leave; +selector_key_error: + { + xmlChar *str = NULL; + /* + * 4.2.1 (KEY) The �target node set� and the + * �qualified node set� are equal, that is, every + * member of the �target node set� is also a member + * of the �qualified node set� and vice versa. + */ + xmlSchemaCustomErr(ACTXT_CAST vctxt, + XML_SCHEMAV_CVC_IDC, NULL, + WXS_BASIC_CAST idc, + "Not all fields of %s evaluate to a node", + xmlSchemaGetIDCDesignation(&str, idc), NULL); + FREE_AND_NULL(str); + } +selector_leave: + /* + * Free the key-sequence if not added to the IDC table. + */ + if ((keySeq != NULL) && (*keySeq != NULL)) { + xmlFree(*keySeq); + *keySeq = NULL; + } + } /* if selector */ + + sto->nbHistory--; + +deregister_check: + /* + * Deregister state objects if they reach the depth of creation. + */ + if ((sto->nbHistory == 0) && (sto->depth == depth)) { +#ifdef DEBUG_IDC + xmlGenericError(xmlGenericErrorContext, "IDC: STO pop '%s'\n", + sto->sel->xpath); +#endif + if (vctxt->xpathStates != sto) { + VERROR_INT("xmlSchemaXPathProcessHistory", + "The state object to be removed is not the first " + "in the list"); + } + nextsto = sto->next; + /* + * Unlink from the list of active XPath state objects. + */ + vctxt->xpathStates = sto->next; + sto->next = vctxt->xpathStatePool; + /* + * Link it to the pool of reusable state objects. + */ + vctxt->xpathStatePool = sto; + sto = nextsto; + } else + sto = sto->next; + } /* while (sto != NULL) */ + return (0); +} + +/** + * xmlSchemaIDCRegisterMatchers: + * @vctxt: the WXS validation context + * @elemDecl: the element declaration + * + * Creates helper objects to evaluate IDC selectors/fields + * successively. + * + * Returns 0 if OK and -1 on internal errors. + */ +static int +xmlSchemaIDCRegisterMatchers(xmlSchemaValidCtxtPtr vctxt, + xmlSchemaElementPtr elemDecl) +{ + xmlSchemaIDCMatcherPtr matcher, last = NULL; + xmlSchemaIDCPtr idc, refIdc; + xmlSchemaIDCAugPtr aidc; + + idc = (xmlSchemaIDCPtr) elemDecl->idcs; + if (idc == NULL) + return (0); + +#ifdef DEBUG_IDC + { + xmlChar *str = NULL; + xmlGenericError(xmlGenericErrorContext, + "IDC: REGISTER on %s, depth %d\n", + (char *) xmlSchemaFormatQName(&str, vctxt->inode->nsName, + vctxt->inode->localName), vctxt->depth); + FREE_AND_NULL(str) + } +#endif + if (vctxt->inode->idcMatchers != NULL) { + VERROR_INT("xmlSchemaIDCRegisterMatchers", + "The chain of IDC matchers is expected to be empty"); + return (-1); + } + do { + if (idc->type == XML_SCHEMA_TYPE_IDC_KEYREF) { + /* + * Since IDCs bubbles are expensive we need to know the + * depth at which the bubbles should stop; this will be + * the depth of the top-most keyref IDC. If no keyref + * references a key/unique IDC, the keyrefDepth will + * be -1, indicating that no bubbles are needed. + */ + refIdc = (xmlSchemaIDCPtr) idc->ref->item; + if (refIdc != NULL) { + /* + * Remember that we have keyrefs on this node. + */ + vctxt->inode->hasKeyrefs = 1; + /* + * Lookup the referenced augmented IDC info. + */ + aidc = vctxt->aidcs; + while (aidc != NULL) { + if (aidc->def == refIdc) + break; + aidc = aidc->next; + } + if (aidc == NULL) { + VERROR_INT("xmlSchemaIDCRegisterMatchers", + "Could not find an augmented IDC item for an IDC " + "definition"); + return (-1); + } + if ((aidc->keyrefDepth == -1) || + (vctxt->depth < aidc->keyrefDepth)) + aidc->keyrefDepth = vctxt->depth; + } + } + /* + * Lookup the augmented IDC item for the IDC definition. + */ + aidc = vctxt->aidcs; + while (aidc != NULL) { + if (aidc->def == idc) + break; + aidc = aidc->next; + } + if (aidc == NULL) { + VERROR_INT("xmlSchemaIDCRegisterMatchers", + "Could not find an augmented IDC item for an IDC definition"); + return (-1); + } + /* + * Create an IDC matcher for every IDC definition. + */ + if (vctxt->idcMatcherCache != NULL) { + /* + * Reuse a cached matcher. + */ + matcher = vctxt->idcMatcherCache; + vctxt->idcMatcherCache = matcher->nextCached; + matcher->nextCached = NULL; + } else { + matcher = (xmlSchemaIDCMatcherPtr) + xmlMalloc(sizeof(xmlSchemaIDCMatcher)); + if (matcher == NULL) { + xmlSchemaVErrMemory(vctxt, + "allocating an IDC matcher", NULL); + return (-1); + } + memset(matcher, 0, sizeof(xmlSchemaIDCMatcher)); + } + if (last == NULL) + vctxt->inode->idcMatchers = matcher; + else + last->next = matcher; + last = matcher; + + matcher->type = IDC_MATCHER; + matcher->depth = vctxt->depth; + matcher->aidc = aidc; + matcher->idcType = aidc->def->type; +#ifdef DEBUG_IDC + xmlGenericError(xmlGenericErrorContext, "IDC: register matcher\n"); +#endif + /* + * Init the automaton state object. + */ + if (xmlSchemaIDCAddStateObject(vctxt, matcher, + idc->selector, XPATH_STATE_OBJ_TYPE_IDC_SELECTOR) == -1) + return (-1); + + idc = idc->next; + } while (idc != NULL); + return (0); +} + +static int +xmlSchemaIDCFillNodeTables(xmlSchemaValidCtxtPtr vctxt, + xmlSchemaNodeInfoPtr ielem) +{ + xmlSchemaPSVIIDCBindingPtr bind; + int res, i, j, k, nbTargets, nbFields, nbDupls, nbNodeTable; + xmlSchemaPSVIIDCKeyPtr *keys, *ntkeys; + xmlSchemaPSVIIDCNodePtr *targets, *dupls; + + xmlSchemaIDCMatcherPtr matcher = ielem->idcMatchers; + /* vctxt->createIDCNodeTables */ + while (matcher != NULL) { + /* + * Skip keyref IDCs and empty IDC target-lists. + */ + if ((matcher->aidc->def->type == XML_SCHEMA_TYPE_IDC_KEYREF) || + WXS_ILIST_IS_EMPTY(matcher->targets)) + { + matcher = matcher->next; + continue; + } + /* + * If we _want_ the IDC node-table to be created in any case + * then do so. Otherwise create them only if keyrefs need them. + */ + if ((! vctxt->createIDCNodeTables) && + ((matcher->aidc->keyrefDepth == -1) || + (matcher->aidc->keyrefDepth > vctxt->depth))) + { + matcher = matcher->next; + continue; + } + /* + * Get/create the IDC binding on this element for the IDC definition. + */ + bind = xmlSchemaIDCAcquireBinding(vctxt, matcher); + + if (! WXS_ILIST_IS_EMPTY(bind->dupls)) { + dupls = (xmlSchemaPSVIIDCNodePtr *) bind->dupls->items; + nbDupls = bind->dupls->nbItems; + } else { + dupls = NULL; + nbDupls = 0; + } + if (bind->nodeTable != NULL) { + nbNodeTable = bind->nbNodes; + } else { + nbNodeTable = 0; + } + + if ((nbNodeTable == 0) && (nbDupls == 0)) { + /* + * Transfer all IDC target-nodes to the IDC node-table. + */ + bind->nodeTable = + (xmlSchemaPSVIIDCNodePtr *) matcher->targets->items; + bind->sizeNodes = matcher->targets->sizeItems; + bind->nbNodes = matcher->targets->nbItems; + + matcher->targets->items = NULL; + matcher->targets->sizeItems = 0; + matcher->targets->nbItems = 0; + } else { + /* + * Compare the key-sequences and add to the IDC node-table. + */ + nbTargets = matcher->targets->nbItems; + targets = (xmlSchemaPSVIIDCNodePtr *) matcher->targets->items; + nbFields = matcher->aidc->def->nbFields; + i = 0; + do { + keys = targets[i]->keys; + if (nbDupls) { + /* + * Search in already found duplicates first. + */ + j = 0; + do { + if (nbFields == 1) { + res = xmlSchemaAreValuesEqual(keys[0]->val, + dupls[j]->keys[0]->val); + if (res == -1) + goto internal_error; + if (res == 1) { + /* + * Equal key-sequence. + */ + goto next_target; + } + } else { + res = 0; + ntkeys = dupls[j]->keys; + for (k = 0; k < nbFields; k++) { + res = xmlSchemaAreValuesEqual(keys[k]->val, + ntkeys[k]->val); + if (res == -1) + goto internal_error; + if (res == 0) { + /* + * One of the keys differs. + */ + break; + } + } + if (res == 1) { + /* + * Equal key-sequence found. + */ + goto next_target; + } + } + j++; + } while (j < nbDupls); + } + if (nbNodeTable) { + j = 0; + do { + if (nbFields == 1) { + res = xmlSchemaAreValuesEqual(keys[0]->val, + bind->nodeTable[j]->keys[0]->val); + if (res == -1) + goto internal_error; + if (res == 0) { + /* + * The key-sequence differs. + */ + goto next_node_table_entry; + } + } else { + res = 0; + ntkeys = bind->nodeTable[j]->keys; + for (k = 0; k < nbFields; k++) { + res = xmlSchemaAreValuesEqual(keys[k]->val, + ntkeys[k]->val); + if (res == -1) + goto internal_error; + if (res == 0) { + /* + * One of the keys differs. + */ + goto next_node_table_entry; + } + } + } + /* + * Add the duplicate to the list of duplicates. + */ + if (bind->dupls == NULL) { + bind->dupls = xmlSchemaItemListCreate(); + if (bind->dupls == NULL) + goto internal_error; + } + if (xmlSchemaItemListAdd(bind->dupls, bind->nodeTable[j]) == -1) + goto internal_error; + /* + * Remove the duplicate entry from the IDC node-table. + */ + bind->nodeTable[j] = bind->nodeTable[bind->nbNodes -1]; + bind->nbNodes--; + + goto next_target; + +next_node_table_entry: + j++; + } while (j < nbNodeTable); + } + /* + * If everything is fine, then add the IDC target-node to + * the IDC node-table. + */ + if (xmlSchemaIDCAppendNodeTableItem(bind, targets[i]) == -1) + goto internal_error; + +next_target: + i++; + } while (i < nbTargets); + } + matcher = matcher->next; + } + return(0); + +internal_error: + return(-1); +} + +/** + * xmlSchemaBubbleIDCNodeTables: + * @depth: the current tree depth + * + * Merges IDC bindings of an element at @depth into the corresponding IDC + * bindings of its parent element. If a duplicate note-table entry is found, + * both, the parent node-table entry and child entry are discarded from the + * node-table of the parent. + * + * Returns 0 if OK and -1 on internal errors. + */ +static int +xmlSchemaBubbleIDCNodeTables(xmlSchemaValidCtxtPtr vctxt) +{ + xmlSchemaPSVIIDCBindingPtr bind; /* IDC bindings of the current node. */ + xmlSchemaPSVIIDCBindingPtr *parTable, parBind = NULL; /* parent IDC bindings. */ + xmlSchemaPSVIIDCNodePtr node, parNode = NULL, *dupls, *parNodes; /* node-table entries. */ + xmlSchemaIDCAugPtr aidc; + int i, j, k, ret = 0, nbFields, oldNum, oldDupls; + + bind = vctxt->inode->idcTable; + if (bind == NULL) { + /* Fine, no table, no bubbles. */ + return (0); + } + + parTable = &(vctxt->elemInfos[vctxt->depth -1]->idcTable); + /* + * Walk all bindings; create new or add to existing bindings. + * Remove duplicate key-sequences. + */ + while (bind != NULL) { + + if ((bind->nbNodes == 0) && WXS_ILIST_IS_EMPTY(bind->dupls)) + goto next_binding; + /* + * Check if the key/unique IDC table needs to be bubbled. + */ + if (! vctxt->createIDCNodeTables) { + aidc = vctxt->aidcs; + do { + if (aidc->def == bind->definition) { + if ((aidc->keyrefDepth == -1) || + (aidc->keyrefDepth >= vctxt->depth)) { + goto next_binding; + } + break; + } + aidc = aidc->next; + } while (aidc != NULL); + } + + if (parTable != NULL) + parBind = *parTable; + /* + * Search a matching parent binding for the + * IDC definition. + */ + while (parBind != NULL) { + if (parBind->definition == bind->definition) + break; + parBind = parBind->next; + } + + if (parBind != NULL) { + /* + * Compare every node-table entry of the child node, + * i.e. the key-sequence within, ... + */ + oldNum = parBind->nbNodes; /* Skip newly added items. */ + + if (! WXS_ILIST_IS_EMPTY(parBind->dupls)) { + oldDupls = parBind->dupls->nbItems; + dupls = (xmlSchemaPSVIIDCNodePtr *) parBind->dupls->items; + } else { + dupls = NULL; + oldDupls = 0; + } + + parNodes = parBind->nodeTable; + nbFields = bind->definition->nbFields; + + for (i = 0; i < bind->nbNodes; i++) { + node = bind->nodeTable[i]; + if (node == NULL) + continue; + /* + * ...with every key-sequence of the parent node, already + * evaluated to be a duplicate key-sequence. + */ + if (oldDupls) { + j = 0; + while (j < oldDupls) { + if (nbFields == 1) { + ret = xmlSchemaAreValuesEqual( + node->keys[0]->val, + dupls[j]->keys[0]->val); + if (ret == -1) + goto internal_error; + if (ret == 0) { + j++; + continue; + } + } else { + parNode = dupls[j]; + for (k = 0; k < nbFields; k++) { + ret = xmlSchemaAreValuesEqual( + node->keys[k]->val, + parNode->keys[k]->val); + if (ret == -1) + goto internal_error; + if (ret == 0) + break; + } + } + if (ret == 1) + /* Duplicate found. */ + break; + j++; + } + if (j != oldDupls) { + /* Duplicate found. Skip this entry. */ + continue; + } + } + /* + * ... and with every key-sequence of the parent node. + */ + if (oldNum) { + j = 0; + while (j < oldNum) { + parNode = parNodes[j]; + if (nbFields == 1) { + ret = xmlSchemaAreValuesEqual( + node->keys[0]->val, + parNode->keys[0]->val); + if (ret == -1) + goto internal_error; + if (ret == 0) { + j++; + continue; + } + } else { + for (k = 0; k < nbFields; k++) { + ret = xmlSchemaAreValuesEqual( + node->keys[k]->val, + parNode->keys[k]->val); + if (ret == -1) + goto internal_error; + if (ret == 0) + break; + } + } + if (ret == 1) + /* Duplicate found. */ + break; + j++; + } + if (j != oldNum) { + /* + * Handle duplicates. Move the duplicate in + * the parent's node-table to the list of + * duplicates. + */ + oldNum--; + parBind->nbNodes--; + /* + * Move last old item to pos of duplicate. + */ + parNodes[j] = parNodes[oldNum]; + + if (parBind->nbNodes != oldNum) { + /* + * If new items exist, move last new item to + * last of old items. + */ + parNodes[oldNum] = + parNodes[parBind->nbNodes]; + } + if (parBind->dupls == NULL) { + parBind->dupls = xmlSchemaItemListCreate(); + if (parBind->dupls == NULL) + goto internal_error; + } + xmlSchemaItemListAdd(parBind->dupls, parNode); + } else { + /* + * Add the node-table entry (node and key-sequence) of + * the child node to the node table of the parent node. + */ + if (parBind->nodeTable == NULL) { + parBind->nodeTable = (xmlSchemaPSVIIDCNodePtr *) + xmlMalloc(10 * sizeof(xmlSchemaPSVIIDCNodePtr)); + if (parBind->nodeTable == NULL) { + xmlSchemaVErrMemory(NULL, + "allocating IDC list of node-table items", NULL); + goto internal_error; + } + parBind->sizeNodes = 1; + } else if (parBind->nbNodes >= parBind->sizeNodes) { + parBind->sizeNodes *= 2; + parBind->nodeTable = (xmlSchemaPSVIIDCNodePtr *) + xmlRealloc(parBind->nodeTable, parBind->sizeNodes * + sizeof(xmlSchemaPSVIIDCNodePtr)); + if (parBind->nodeTable == NULL) { + xmlSchemaVErrMemory(NULL, + "re-allocating IDC list of node-table items", NULL); + goto internal_error; + } + } + parNodes = parBind->nodeTable; + /* + * Append the new node-table entry to the 'new node-table + * entries' section. + */ + parNodes[parBind->nbNodes++] = node; + } + + } + + } + } else { + /* + * No binding for the IDC was found: create a new one and + * copy all node-tables. + */ + parBind = xmlSchemaIDCNewBinding(bind->definition); + if (parBind == NULL) + goto internal_error; + + /* + * TODO: Hmm, how to optimize the initial number of + * allocated entries? + */ + if (bind->nbNodes != 0) { + /* + * Add all IDC node-table entries. + */ + if (! vctxt->psviExposeIDCNodeTables) { + /* + * Just move the entries. + * NOTE: this is quite save here, since + * all the keyref lookups have already been + * performed. + */ + parBind->nodeTable = bind->nodeTable; + bind->nodeTable = NULL; + parBind->sizeNodes = bind->sizeNodes; + bind->sizeNodes = 0; + parBind->nbNodes = bind->nbNodes; + bind->nbNodes = 0; + } else { + /* + * Copy the entries. + */ + parBind->nodeTable = (xmlSchemaPSVIIDCNodePtr *) + xmlMalloc(bind->nbNodes * + sizeof(xmlSchemaPSVIIDCNodePtr)); + if (parBind->nodeTable == NULL) { + xmlSchemaVErrMemory(NULL, + "allocating an array of IDC node-table " + "items", NULL); + xmlSchemaIDCFreeBinding(parBind); + goto internal_error; + } + parBind->sizeNodes = bind->nbNodes; + parBind->nbNodes = bind->nbNodes; + memcpy(parBind->nodeTable, bind->nodeTable, + bind->nbNodes * sizeof(xmlSchemaPSVIIDCNodePtr)); + } + } + if (bind->dupls) { + /* + * Move the duplicates. + */ + if (parBind->dupls != NULL) + xmlSchemaItemListFree(parBind->dupls); + parBind->dupls = bind->dupls; + bind->dupls = NULL; + } + if (parTable != NULL) { + if (*parTable == NULL) + *parTable = parBind; + else { + parBind->next = *parTable; + *parTable = parBind; + } + } + } + +next_binding: + bind = bind->next; + } + return (0); + +internal_error: + return(-1); +} + +/** + * xmlSchemaCheckCVCIDCKeyRef: + * @vctxt: the WXS validation context + * @elemDecl: the element declaration + * + * Check the cvc-idc-keyref constraints. + */ +static int +xmlSchemaCheckCVCIDCKeyRef(xmlSchemaValidCtxtPtr vctxt) +{ + xmlSchemaIDCMatcherPtr matcher; + xmlSchemaPSVIIDCBindingPtr bind; + + matcher = vctxt->inode->idcMatchers; + /* + * Find a keyref. + */ + while (matcher != NULL) { + if ((matcher->idcType == XML_SCHEMA_TYPE_IDC_KEYREF) && + matcher->targets && + matcher->targets->nbItems) + { + int i, j, k, res, nbFields, hasDupls; + xmlSchemaPSVIIDCKeyPtr *refKeys, *keys; + xmlSchemaPSVIIDCNodePtr refNode = NULL; + + nbFields = matcher->aidc->def->nbFields; + + /* + * Find the IDC node-table for the referenced IDC key/unique. + */ + bind = vctxt->inode->idcTable; + while (bind != NULL) { + if ((xmlSchemaIDCPtr) matcher->aidc->def->ref->item == + bind->definition) + break; + bind = bind->next; + } + hasDupls = (bind && bind->dupls && bind->dupls->nbItems) ? 1 : 0; + /* + * Search for a matching key-sequences. + */ + for (i = 0; i < matcher->targets->nbItems; i++) { + res = 0; + refNode = matcher->targets->items[i]; + if (bind != NULL) { + refKeys = refNode->keys; + for (j = 0; j < bind->nbNodes; j++) { + keys = bind->nodeTable[j]->keys; + for (k = 0; k < nbFields; k++) { + res = xmlSchemaAreValuesEqual(keys[k]->val, + refKeys[k]->val); + if (res == 0) + break; + else if (res == -1) { + return (-1); + } + } + if (res == 1) { + /* + * Match found. + */ + break; + } + } + if ((res == 0) && hasDupls) { + /* + * Search in duplicates + */ + for (j = 0; j < bind->dupls->nbItems; j++) { + keys = ((xmlSchemaPSVIIDCNodePtr) + bind->dupls->items[j])->keys; + for (k = 0; k < nbFields; k++) { + res = xmlSchemaAreValuesEqual(keys[k]->val, + refKeys[k]->val); + if (res == 0) + break; + else if (res == -1) { + return (-1); + } + } + if (res == 1) { + /* + * Match in duplicates found. + */ + xmlChar *str = NULL, *strB = NULL; + xmlSchemaKeyrefErr(vctxt, + XML_SCHEMAV_CVC_IDC, refNode, + (xmlSchemaTypePtr) matcher->aidc->def, + "More than one match found for " + "key-sequence %s of keyref '%s'", + xmlSchemaFormatIDCKeySequence(vctxt, &str, + refNode->keys, nbFields), + xmlSchemaGetComponentQName(&strB, + matcher->aidc->def)); + FREE_AND_NULL(str); + FREE_AND_NULL(strB); + break; + } + } + } + } + + if (res == 0) { + xmlChar *str = NULL, *strB = NULL; + xmlSchemaKeyrefErr(vctxt, + XML_SCHEMAV_CVC_IDC, refNode, + (xmlSchemaTypePtr) matcher->aidc->def, + "No match found for key-sequence %s of keyref '%s'", + xmlSchemaFormatIDCKeySequence(vctxt, &str, + refNode->keys, nbFields), + xmlSchemaGetComponentQName(&strB, matcher->aidc->def)); + FREE_AND_NULL(str); + FREE_AND_NULL(strB); + } + } + } + matcher = matcher->next; + } + /* TODO: Return an error if any error encountered. */ + return (0); +} + +/************************************************************************ + * * + * XML Reader validation code * + * * + ************************************************************************/ + +static xmlSchemaAttrInfoPtr +xmlSchemaGetFreshAttrInfo(xmlSchemaValidCtxtPtr vctxt) +{ + xmlSchemaAttrInfoPtr iattr; + /* + * Grow/create list of attribute infos. + */ + if (vctxt->attrInfos == NULL) { + vctxt->attrInfos = (xmlSchemaAttrInfoPtr *) + xmlMalloc(sizeof(xmlSchemaAttrInfoPtr)); + vctxt->sizeAttrInfos = 1; + if (vctxt->attrInfos == NULL) { + xmlSchemaVErrMemory(vctxt, + "allocating attribute info list", NULL); + return (NULL); + } + } else if (vctxt->sizeAttrInfos <= vctxt->nbAttrInfos) { + vctxt->sizeAttrInfos++; + vctxt->attrInfos = (xmlSchemaAttrInfoPtr *) + xmlRealloc(vctxt->attrInfos, + vctxt->sizeAttrInfos * sizeof(xmlSchemaAttrInfoPtr)); + if (vctxt->attrInfos == NULL) { + xmlSchemaVErrMemory(vctxt, + "re-allocating attribute info list", NULL); + return (NULL); + } + } else { + iattr = vctxt->attrInfos[vctxt->nbAttrInfos++]; + if (iattr->localName != NULL) { + VERROR_INT("xmlSchemaGetFreshAttrInfo", + "attr info not cleared"); + return (NULL); + } + iattr->nodeType = XML_ATTRIBUTE_NODE; + return (iattr); + } + /* + * Create an attribute info. + */ + iattr = (xmlSchemaAttrInfoPtr) + xmlMalloc(sizeof(xmlSchemaAttrInfo)); + if (iattr == NULL) { + xmlSchemaVErrMemory(vctxt, "creating new attribute info", NULL); + return (NULL); + } + memset(iattr, 0, sizeof(xmlSchemaAttrInfo)); + iattr->nodeType = XML_ATTRIBUTE_NODE; + vctxt->attrInfos[vctxt->nbAttrInfos++] = iattr; + + return (iattr); +} + +static int +xmlSchemaValidatorPushAttribute(xmlSchemaValidCtxtPtr vctxt, + xmlNodePtr attrNode, + int nodeLine, + const xmlChar *localName, + const xmlChar *nsName, + int ownedNames, + xmlChar *value, + int ownedValue) +{ + xmlSchemaAttrInfoPtr attr; + + attr = xmlSchemaGetFreshAttrInfo(vctxt); + if (attr == NULL) { + VERROR_INT("xmlSchemaPushAttribute", + "calling xmlSchemaGetFreshAttrInfo()"); + return (-1); + } + attr->node = attrNode; + attr->nodeLine = nodeLine; + attr->state = XML_SCHEMAS_ATTR_UNKNOWN; + attr->localName = localName; + attr->nsName = nsName; + if (ownedNames) + attr->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES; + /* + * Evaluate if it's an XSI attribute. + */ + if (nsName != NULL) { + if (xmlStrEqual(localName, BAD_CAST "nil")) { + if (xmlStrEqual(attr->nsName, xmlSchemaInstanceNs)) { + attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_NIL; + } + } else if (xmlStrEqual(localName, BAD_CAST "type")) { + if (xmlStrEqual(attr->nsName, xmlSchemaInstanceNs)) { + attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_TYPE; + } + } else if (xmlStrEqual(localName, BAD_CAST "schemaLocation")) { + if (xmlStrEqual(attr->nsName, xmlSchemaInstanceNs)) { + attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC; + } + } else if (xmlStrEqual(localName, BAD_CAST "noNamespaceSchemaLocation")) { + if (xmlStrEqual(attr->nsName, xmlSchemaInstanceNs)) { + attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_NO_NS_SCHEMA_LOC; + } + } else if (xmlStrEqual(attr->nsName, xmlNamespaceNs)) { + attr->metaType = XML_SCHEMA_ATTR_INFO_META_XMLNS; + } + } + attr->value = value; + if (ownedValue) + attr->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES; + if (attr->metaType != 0) + attr->state = XML_SCHEMAS_ATTR_META; + return (0); +} + +/** + * xmlSchemaClearElemInfo: + * @vctxt: the WXS validation context + * @ielem: the element information item + */ +static void +xmlSchemaClearElemInfo(xmlSchemaValidCtxtPtr vctxt, + xmlSchemaNodeInfoPtr ielem) +{ + ielem->hasKeyrefs = 0; + ielem->appliedXPath = 0; + if (ielem->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES) { + FREE_AND_NULL(ielem->localName); + FREE_AND_NULL(ielem->nsName); + } else { + ielem->localName = NULL; + ielem->nsName = NULL; + } + if (ielem->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES) { + FREE_AND_NULL(ielem->value); + } else { + ielem->value = NULL; + } + if (ielem->val != NULL) { + /* + * PSVI TODO: Be careful not to free it when the value is + * exposed via PSVI. + */ + xmlSchemaFreeValue(ielem->val); + ielem->val = NULL; + } + if (ielem->idcMatchers != NULL) { + /* + * REVISIT OPTIMIZE TODO: Use a pool of IDC matchers. + * Does it work? + */ + xmlSchemaIDCReleaseMatcherList(vctxt, ielem->idcMatchers); +#if 0 + xmlSchemaIDCFreeMatcherList(ielem->idcMatchers); +#endif + ielem->idcMatchers = NULL; + } + if (ielem->idcTable != NULL) { + /* + * OPTIMIZE TODO: Use a pool of IDC tables??. + */ + xmlSchemaIDCFreeIDCTable(ielem->idcTable); + ielem->idcTable = NULL; + } + if (ielem->regexCtxt != NULL) { + xmlRegFreeExecCtxt(ielem->regexCtxt); + ielem->regexCtxt = NULL; + } + if (ielem->nsBindings != NULL) { + xmlFree((xmlChar **)ielem->nsBindings); + ielem->nsBindings = NULL; + ielem->nbNsBindings = 0; + ielem->sizeNsBindings = 0; + } +} + +/** + * xmlSchemaGetFreshElemInfo: + * @vctxt: the schema validation context + * + * Creates/reuses and initializes the element info item for + * the currect tree depth. + * + * Returns the element info item or NULL on API or internal errors. + */ +static xmlSchemaNodeInfoPtr +xmlSchemaGetFreshElemInfo(xmlSchemaValidCtxtPtr vctxt) +{ + xmlSchemaNodeInfoPtr info = NULL; + + if (vctxt->depth > vctxt->sizeElemInfos) { + VERROR_INT("xmlSchemaGetFreshElemInfo", + "inconsistent depth encountered"); + return (NULL); + } + if (vctxt->elemInfos == NULL) { + vctxt->elemInfos = (xmlSchemaNodeInfoPtr *) + xmlMalloc(10 * sizeof(xmlSchemaNodeInfoPtr)); + if (vctxt->elemInfos == NULL) { + xmlSchemaVErrMemory(vctxt, + "allocating the element info array", NULL); + return (NULL); + } + memset(vctxt->elemInfos, 0, 10 * sizeof(xmlSchemaNodeInfoPtr)); + vctxt->sizeElemInfos = 10; + } else if (vctxt->sizeElemInfos <= vctxt->depth) { + int i = vctxt->sizeElemInfos; + + vctxt->sizeElemInfos *= 2; + vctxt->elemInfos = (xmlSchemaNodeInfoPtr *) + xmlRealloc(vctxt->elemInfos, vctxt->sizeElemInfos * + sizeof(xmlSchemaNodeInfoPtr)); + if (vctxt->elemInfos == NULL) { + xmlSchemaVErrMemory(vctxt, + "re-allocating the element info array", NULL); + return (NULL); + } + /* + * We need the new memory to be NULLed. + * TODO: Use memset instead? + */ + for (; i < vctxt->sizeElemInfos; i++) + vctxt->elemInfos[i] = NULL; + } else + info = vctxt->elemInfos[vctxt->depth]; + + if (info == NULL) { + info = (xmlSchemaNodeInfoPtr) + xmlMalloc(sizeof(xmlSchemaNodeInfo)); + if (info == NULL) { + xmlSchemaVErrMemory(vctxt, + "allocating an element info", NULL); + return (NULL); + } + vctxt->elemInfos[vctxt->depth] = info; + } else { + if (info->localName != NULL) { + VERROR_INT("xmlSchemaGetFreshElemInfo", + "elem info has not been cleared"); + return (NULL); + } + } + memset(info, 0, sizeof(xmlSchemaNodeInfo)); + info->nodeType = XML_ELEMENT_NODE; + info->depth = vctxt->depth; + + return (info); +} + +#define ACTIVATE_ATTRIBUTE(item) vctxt->inode = (xmlSchemaNodeInfoPtr) item; +#define ACTIVATE_ELEM vctxt->inode = vctxt->elemInfos[vctxt->depth]; +#define ACTIVATE_PARENT_ELEM vctxt->inode = vctxt->elemInfos[vctxt->depth -1]; + +static int +xmlSchemaValidateFacets(xmlSchemaAbstractCtxtPtr actxt, + xmlNodePtr node, + xmlSchemaTypePtr type, + xmlSchemaValType valType, + const xmlChar * value, + xmlSchemaValPtr val, + unsigned long length, + int fireErrors) +{ + int ret, error = 0; + + xmlSchemaTypePtr tmpType; + xmlSchemaFacetLinkPtr facetLink; + xmlSchemaFacetPtr facet; + unsigned long len = 0; + xmlSchemaWhitespaceValueType ws; + + /* + * In Libxml2, derived built-in types have currently no explicit facets. + */ + if (type->type == XML_SCHEMA_TYPE_BASIC) + return (0); + + /* + * NOTE: Do not jump away, if the facetSet of the given type is + * empty: until now, "pattern" and "enumeration" facets of the + * *base types* need to be checked as well. + */ + if (type->facetSet == NULL) + goto pattern_and_enum; + + if (! WXS_IS_ATOMIC(type)) { + if (WXS_IS_LIST(type)) + goto WXS_IS_LIST; + else + goto pattern_and_enum; + } + /* + * Whitespace handling is only of importance for string-based + * types. + */ + tmpType = xmlSchemaGetPrimitiveType(type); + if ((tmpType->builtInType == XML_SCHEMAS_STRING) || + WXS_IS_ANY_SIMPLE_TYPE(tmpType)) { + ws = xmlSchemaGetWhiteSpaceFacetValue(type); + } else + ws = XML_SCHEMA_WHITESPACE_COLLAPSE; + /* + * If the value was not computed (for string or + * anySimpleType based types), then use the provided + * type. + */ + if (val == NULL) + valType = valType; + else + valType = xmlSchemaGetValType(val); + + ret = 0; + for (facetLink = type->facetSet; facetLink != NULL; + facetLink = facetLink->next) { + /* + * Skip the pattern "whiteSpace": it is used to + * format the character content beforehand. + */ + switch (facetLink->facet->type) { + case XML_SCHEMA_FACET_WHITESPACE: + case XML_SCHEMA_FACET_PATTERN: + case XML_SCHEMA_FACET_ENUMERATION: + continue; + case XML_SCHEMA_FACET_LENGTH: + case XML_SCHEMA_FACET_MINLENGTH: + case XML_SCHEMA_FACET_MAXLENGTH: + ret = xmlSchemaValidateLengthFacetWhtsp(facetLink->facet, + valType, value, val, &len, ws); + break; + default: + ret = xmlSchemaValidateFacetWhtsp(facetLink->facet, ws, + valType, value, val, ws); + break; + } + if (ret < 0) { + AERROR_INT("xmlSchemaValidateFacets", + "validating against a atomic type facet"); + return (-1); + } else if (ret > 0) { + if (fireErrors) + xmlSchemaFacetErr(actxt, ret, node, + value, len, type, facetLink->facet, NULL, NULL, NULL); + else + return (ret); + if (error == 0) + error = ret; + } + ret = 0; + } + +WXS_IS_LIST: + if (! WXS_IS_LIST(type)) + goto pattern_and_enum; + /* + * "length", "minLength" and "maxLength" of list types. + */ + ret = 0; + for (facetLink = type->facetSet; facetLink != NULL; + facetLink = facetLink->next) { + + switch (facetLink->facet->type) { + case XML_SCHEMA_FACET_LENGTH: + case XML_SCHEMA_FACET_MINLENGTH: + case XML_SCHEMA_FACET_MAXLENGTH: + ret = xmlSchemaValidateListSimpleTypeFacet(facetLink->facet, + value, length, NULL); + break; + default: + continue; + } + if (ret < 0) { + AERROR_INT("xmlSchemaValidateFacets", + "validating against a list type facet"); + return (-1); + } else if (ret > 0) { + if (fireErrors) + xmlSchemaFacetErr(actxt, ret, node, + value, length, type, facetLink->facet, NULL, NULL, NULL); + else + return (ret); + if (error == 0) + error = ret; + } + ret = 0; + } + +pattern_and_enum: + if (error >= 0) { + int found = 0; + /* + * Process enumerations. Facet values are in the value space + * of the defining type's base type. This seems to be a bug in the + * XML Schema 1.0 spec. Use the whitespace type of the base type. + * Only the first set of enumerations in the ancestor-or-self axis + * is used for validation. + */ + ret = 0; + tmpType = type; + do { + for (facet = tmpType->facets; facet != NULL; facet = facet->next) { + if (facet->type != XML_SCHEMA_FACET_ENUMERATION) + continue; + found = 1; + ret = xmlSchemaAreValuesEqual(facet->val, val); + if (ret == 1) + break; + else if (ret < 0) { + AERROR_INT("xmlSchemaValidateFacets", + "validating against an enumeration facet"); + return (-1); + } + } + if (ret != 0) + break; + /* + * Break on the first set of enumerations. Any additional + * enumerations which might be existent on the ancestors + * of the current type are restricted by this set; thus + * *must* *not* be taken into account. + */ + if (found) + break; + tmpType = tmpType->baseType; + } while ((tmpType != NULL) && + (tmpType->type != XML_SCHEMA_TYPE_BASIC)); + if (found && (ret == 0)) { + ret = XML_SCHEMAV_CVC_ENUMERATION_VALID; + if (fireErrors) { + xmlSchemaFacetErr(actxt, ret, node, + value, 0, type, NULL, NULL, NULL, NULL); + } else + return (ret); + if (error == 0) + error = ret; + } + } + + if (error >= 0) { + int found; + /* + * Process patters. Pattern facets are ORed at type level + * and ANDed if derived. Walk the base type axis. + */ + tmpType = type; + facet = NULL; + do { + found = 0; + for (facetLink = tmpType->facetSet; facetLink != NULL; + facetLink = facetLink->next) { + if (facetLink->facet->type != XML_SCHEMA_FACET_PATTERN) + continue; + found = 1; + /* + * NOTE that for patterns, @value needs to be the + * normalized vaule. + */ + ret = xmlRegexpExec(facetLink->facet->regexp, value); + if (ret == 1) + break; + else if (ret < 0) { + AERROR_INT("xmlSchemaValidateFacets", + "validating against a pattern facet"); + return (-1); + } else { + /* + * Save the last non-validating facet. + */ + facet = facetLink->facet; + } + } + if (found && (ret != 1)) { + ret = XML_SCHEMAV_CVC_PATTERN_VALID; + if (fireErrors) { + xmlSchemaFacetErr(actxt, ret, node, + value, 0, type, facet, NULL, NULL, NULL); + } else + return (ret); + if (error == 0) + error = ret; + break; + } + tmpType = tmpType->baseType; + } while ((tmpType != NULL) && (tmpType->type != XML_SCHEMA_TYPE_BASIC)); + } + + return (error); +} + +static xmlChar * +xmlSchemaNormalizeValue(xmlSchemaTypePtr type, + const xmlChar *value) +{ + switch (xmlSchemaGetWhiteSpaceFacetValue(type)) { + case XML_SCHEMA_WHITESPACE_COLLAPSE: + return (xmlSchemaCollapseString(value)); + case XML_SCHEMA_WHITESPACE_REPLACE: + return (xmlSchemaWhiteSpaceReplace(value)); + default: + return (NULL); + } +} + +static int +xmlSchemaValidateQName(xmlSchemaValidCtxtPtr vctxt, + const xmlChar *value, + xmlSchemaValPtr *val, + int valNeeded) +{ + int ret; + const xmlChar *nsName; + xmlChar *local, *prefix = NULL; + + ret = xmlValidateQName(value, 1); + if (ret != 0) { + if (ret == -1) { + VERROR_INT("xmlSchemaValidateQName", + "calling xmlValidateQName()"); + return (-1); + } + return( XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1); + } + /* + * NOTE: xmlSplitQName2 will always return a duplicated + * strings. + */ + local = xmlSplitQName2(value, &prefix); + if (local == NULL) + local = xmlStrdup(value); + /* + * OPTIMIZE TODO: Use flags for: + * - is there any namespace binding? + * - is there a default namespace? + */ + nsName = xmlSchemaLookupNamespace(vctxt, prefix); + + if (prefix != NULL) { + xmlFree(prefix); + /* + * A namespace must be found if the prefix is + * NOT NULL. + */ + if (nsName == NULL) { + ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1; + xmlSchemaCustomErr(ACTXT_CAST vctxt, ret, NULL, + WXS_BASIC_CAST xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME), + "The QName value '%s' has no " + "corresponding namespace declaration in " + "scope", value, NULL); + if (local != NULL) + xmlFree(local); + return (ret); + } + } + if (valNeeded && val) { + if (nsName != NULL) + *val = xmlSchemaNewQNameValue( + BAD_CAST xmlStrdup(nsName), BAD_CAST local); + else + *val = xmlSchemaNewQNameValue(NULL, + BAD_CAST local); + } else + xmlFree(local); + return (0); +} + +/* +* cvc-simple-type +*/ +static int +xmlSchemaVCheckCVCSimpleType(xmlSchemaAbstractCtxtPtr actxt, + xmlNodePtr node, + xmlSchemaTypePtr type, + const xmlChar *value, + xmlSchemaValPtr *retVal, + int fireErrors, + int normalize, + int isNormalized) +{ + int ret = 0, valNeeded = (retVal) ? 1 : 0; + xmlSchemaValPtr val = NULL; + /* xmlSchemaWhitespaceValueType ws; */ + xmlChar *normValue = NULL; + +#define NORMALIZE(atype) \ + if ((! isNormalized) && \ + (normalize || (type->flags & XML_SCHEMAS_TYPE_NORMVALUENEEDED))) { \ + normValue = xmlSchemaNormalizeValue(atype, value); \ + if (normValue != NULL) \ + value = normValue; \ + isNormalized = 1; \ + } + + if ((retVal != NULL) && (*retVal != NULL)) { + xmlSchemaFreeValue(*retVal); + *retVal = NULL; + } + /* + * 3.14.4 Simple Type Definition Validation Rules + * Validation Rule: String Valid + */ + /* + * 1 It is schema-valid with respect to that definition as defined + * by Datatype Valid in [XML Schemas: Datatypes]. + */ + /* + * 2.1 If The definition is ENTITY or is validly derived from ENTITY given + * the empty set, as defined in Type Derivation OK (Simple) (�3.14.6), then + * the string must be a �declared entity name�. + */ + /* + * 2.2 If The definition is ENTITIES or is validly derived from ENTITIES + * given the empty set, as defined in Type Derivation OK (Simple) (�3.14.6), + * then every whitespace-delimited substring of the string must be a �declared + * entity name�. + */ + /* + * 2.3 otherwise no further condition applies. + */ + if ((! valNeeded) && (type->flags & XML_SCHEMAS_TYPE_FACETSNEEDVALUE)) + valNeeded = 1; + if (value == NULL) + value = BAD_CAST ""; + if (WXS_IS_ANY_SIMPLE_TYPE(type) || WXS_IS_ATOMIC(type)) { + xmlSchemaTypePtr biType; /* The built-in type. */ + /* + * SPEC (1.2.1) "if {variety} is �atomic� then the string must �match� + * a literal in the �lexical space� of {base type definition}" + */ + /* + * Whitespace-normalize. + */ + NORMALIZE(type); + if (type->type != XML_SCHEMA_TYPE_BASIC) { + /* + * Get the built-in type. + */ + biType = type->baseType; + while ((biType != NULL) && + (biType->type != XML_SCHEMA_TYPE_BASIC)) + biType = biType->baseType; + + if (biType == NULL) { + AERROR_INT("xmlSchemaVCheckCVCSimpleType", + "could not get the built-in type"); + goto internal_error; + } + } else + biType = type; + /* + * NOTATIONs need to be processed here, since they need + * to lookup in the hashtable of NOTATION declarations of the schema. + */ + if (actxt->type == XML_SCHEMA_CTXT_VALIDATOR) { + switch (biType->builtInType) { + case XML_SCHEMAS_NOTATION: + ret = xmlSchemaValidateNotation( + (xmlSchemaValidCtxtPtr) actxt, + ((xmlSchemaValidCtxtPtr) actxt)->schema, + NULL, value, &val, valNeeded); + break; + case XML_SCHEMAS_QNAME: + ret = xmlSchemaValidateQName((xmlSchemaValidCtxtPtr) actxt, + value, &val, valNeeded); + break; + default: + /* ws = xmlSchemaGetWhiteSpaceFacetValue(type); */ + if (valNeeded) + ret = xmlSchemaValPredefTypeNodeNoNorm(biType, + value, &val, node); + else + ret = xmlSchemaValPredefTypeNodeNoNorm(biType, + value, NULL, node); + break; + } + } else if (actxt->type == XML_SCHEMA_CTXT_PARSER) { + switch (biType->builtInType) { + case XML_SCHEMAS_NOTATION: + ret = xmlSchemaValidateNotation(NULL, + ((xmlSchemaParserCtxtPtr) actxt)->schema, node, + value, &val, valNeeded); + break; + default: + /* ws = xmlSchemaGetWhiteSpaceFacetValue(type); */ + if (valNeeded) + ret = xmlSchemaValPredefTypeNodeNoNorm(biType, + value, &val, node); + else + ret = xmlSchemaValPredefTypeNodeNoNorm(biType, + value, NULL, node); + break; + } + } else { + /* + * Validation via a public API is not implemented yet. + */ + TODO + goto internal_error; + } + if (ret != 0) { + if (ret < 0) { + AERROR_INT("xmlSchemaVCheckCVCSimpleType", + "validating against a built-in type"); + goto internal_error; + } + if (WXS_IS_LIST(type)) + ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2; + else + ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1; + } + if ((ret == 0) && (type->flags & XML_SCHEMAS_TYPE_HAS_FACETS)) { + /* + * Check facets. + */ + ret = xmlSchemaValidateFacets(actxt, node, type, + (xmlSchemaValType) biType->builtInType, value, val, + 0, fireErrors); + if (ret != 0) { + if (ret < 0) { + AERROR_INT("xmlSchemaVCheckCVCSimpleType", + "validating facets of atomic simple type"); + goto internal_error; + } + if (WXS_IS_LIST(type)) + ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2; + else + ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1; + } + } + if (fireErrors && (ret > 0)) + xmlSchemaSimpleTypeErr(actxt, ret, node, value, type, 1); + } else if (WXS_IS_LIST(type)) { + + xmlSchemaTypePtr itemType; + const xmlChar *cur, *end; + xmlChar *tmpValue = NULL; + unsigned long len = 0; + xmlSchemaValPtr prevVal = NULL, curVal = NULL; + /* 1.2.2 if {variety} is �list� then the string must be a sequence + * of white space separated tokens, each of which �match�es a literal + * in the �lexical space� of {item type definition} + */ + /* + * Note that XML_SCHEMAS_TYPE_NORMVALUENEEDED will be set if + * the list type has an enum or pattern facet. + */ + NORMALIZE(type); + /* + * VAL TODO: Optimize validation of empty values. + * VAL TODO: We do not have computed values for lists. + */ + itemType = WXS_LIST_ITEMTYPE(type); + cur = value; + do { + while (IS_BLANK_CH(*cur)) + cur++; + end = cur; + while ((*end != 0) && (!(IS_BLANK_CH(*end)))) + end++; + if (end == cur) + break; + tmpValue = xmlStrndup(cur, end - cur); + len++; + + if (valNeeded) + ret = xmlSchemaVCheckCVCSimpleType(actxt, node, itemType, + tmpValue, &curVal, fireErrors, 0, 1); + else + ret = xmlSchemaVCheckCVCSimpleType(actxt, node, itemType, + tmpValue, NULL, fireErrors, 0, 1); + FREE_AND_NULL(tmpValue); + if (curVal != NULL) { + /* + * Add to list of computed values. + */ + if (val == NULL) + val = curVal; + else + xmlSchemaValueAppend(prevVal, curVal); + prevVal = curVal; + curVal = NULL; + } + if (ret != 0) { + if (ret < 0) { + AERROR_INT("xmlSchemaVCheckCVCSimpleType", + "validating an item of list simple type"); + goto internal_error; + } + ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2; + break; + } + cur = end; + } while (*cur != 0); + FREE_AND_NULL(tmpValue); + if ((ret == 0) && (type->flags & XML_SCHEMAS_TYPE_HAS_FACETS)) { + /* + * Apply facets (pattern, enumeration). + */ + ret = xmlSchemaValidateFacets(actxt, node, type, + XML_SCHEMAS_UNKNOWN, value, val, + len, fireErrors); + if (ret != 0) { + if (ret < 0) { + AERROR_INT("xmlSchemaVCheckCVCSimpleType", + "validating facets of list simple type"); + goto internal_error; + } + ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2; + } + } + if (fireErrors && (ret > 0)) { + /* + * Report the normalized value. + */ + normalize = 1; + NORMALIZE(type); + xmlSchemaSimpleTypeErr(actxt, ret, node, value, type, 1); + } + } else if (WXS_IS_UNION(type)) { + xmlSchemaTypeLinkPtr memberLink; + /* + * TODO: For all datatypes �derived� by �union� whiteSpace does + * not apply directly; however, the normalization behavior of �union� + * types is controlled by the value of whiteSpace on that one of the + * �memberTypes� against which the �union� is successfully validated. + * + * This means that the value is normalized by the first validating + * member type, then the facets of the union type are applied. This + * needs changing of the value! + */ + + /* + * 1.2.3 if {variety} is �union� then the string must �match� a + * literal in the �lexical space� of at least one member of + * {member type definitions} + */ + memberLink = xmlSchemaGetUnionSimpleTypeMemberTypes(type); + if (memberLink == NULL) { + AERROR_INT("xmlSchemaVCheckCVCSimpleType", + "union simple type has no member types"); + goto internal_error; + } + /* + * Always normalize union type values, since we currently + * cannot store the whitespace information with the value + * itself; otherwise a later value-comparison would be + * not possible. + */ + while (memberLink != NULL) { + if (valNeeded) + ret = xmlSchemaVCheckCVCSimpleType(actxt, node, + memberLink->type, value, &val, 0, 1, 0); + else + ret = xmlSchemaVCheckCVCSimpleType(actxt, node, + memberLink->type, value, NULL, 0, 1, 0); + if (ret <= 0) + break; + memberLink = memberLink->next; + } + if (ret != 0) { + if (ret < 0) { + AERROR_INT("xmlSchemaVCheckCVCSimpleType", + "validating members of union simple type"); + goto internal_error; + } + ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_3; + } + /* + * Apply facets (pattern, enumeration). + */ + if ((ret == 0) && (type->flags & XML_SCHEMAS_TYPE_HAS_FACETS)) { + /* + * The normalization behavior of �union� types is controlled by + * the value of whiteSpace on that one of the �memberTypes� + * against which the �union� is successfully validated. + */ + NORMALIZE(memberLink->type); + ret = xmlSchemaValidateFacets(actxt, node, type, + XML_SCHEMAS_UNKNOWN, value, val, + 0, fireErrors); + if (ret != 0) { + if (ret < 0) { + AERROR_INT("xmlSchemaVCheckCVCSimpleType", + "validating facets of union simple type"); + goto internal_error; + } + ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_3; + } + } + if (fireErrors && (ret > 0)) + xmlSchemaSimpleTypeErr(actxt, ret, node, value, type, 1); + } + + if (normValue != NULL) + xmlFree(normValue); + if (ret == 0) { + if (retVal != NULL) + *retVal = val; + else if (val != NULL) + xmlSchemaFreeValue(val); + } else if (val != NULL) + xmlSchemaFreeValue(val); + return (ret); +internal_error: + if (normValue != NULL) + xmlFree(normValue); + if (val != NULL) + xmlSchemaFreeValue(val); + return (-1); +} + +static int +xmlSchemaVExpandQName(xmlSchemaValidCtxtPtr vctxt, + const xmlChar *value, + const xmlChar **nsName, + const xmlChar **localName) +{ + int ret = 0; + + if ((nsName == NULL) || (localName == NULL)) + return (-1); + *nsName = NULL; + *localName = NULL; + + ret = xmlValidateQName(value, 1); + if (ret == -1) + return (-1); + if (ret > 0) { + xmlSchemaSimpleTypeErr(ACTXT_CAST vctxt, + XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1, NULL, + value, xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME), 1); + return (1); + } + { + xmlChar *local = NULL; + xmlChar *prefix; + + /* + * NOTE: xmlSplitQName2 will return a duplicated + * string. + */ + local = xmlSplitQName2(value, &prefix); + if (local == NULL) + *localName = xmlDictLookup(vctxt->dict, value, -1); + else { + *localName = xmlDictLookup(vctxt->dict, local, -1); + xmlFree(local); + } + + *nsName = xmlSchemaLookupNamespace(vctxt, prefix); + + if (prefix != NULL) { + xmlFree(prefix); + /* + * A namespace must be found if the prefix is NOT NULL. + */ + if (*nsName == NULL) { + xmlSchemaCustomErr(ACTXT_CAST vctxt, + XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1, NULL, + WXS_BASIC_CAST xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME), + "The QName value '%s' has no " + "corresponding namespace declaration in scope", + value, NULL); + return (2); + } + } + } + return (0); +} + +static int +xmlSchemaProcessXSIType(xmlSchemaValidCtxtPtr vctxt, + xmlSchemaAttrInfoPtr iattr, + xmlSchemaTypePtr *localType, + xmlSchemaElementPtr elemDecl) +{ + int ret = 0; + /* + * cvc-elt (3.3.4) : (4) + * AND + * Schema-Validity Assessment (Element) (cvc-assess-elt) + * (1.2.1.2.1) - (1.2.1.2.4) + * Handle 'xsi:type'. + */ + if (localType == NULL) + return (-1); + *localType = NULL; + if (iattr == NULL) + return (0); + else { + const xmlChar *nsName = NULL, *local = NULL; + /* + * TODO: We should report a *warning* that the type was overriden + * by the instance. + */ + ACTIVATE_ATTRIBUTE(iattr); + /* + * (cvc-elt) (3.3.4) : (4.1) + * (cvc-assess-elt) (1.2.1.2.2) + */ + ret = xmlSchemaVExpandQName(vctxt, iattr->value, + &nsName, &local); + if (ret != 0) { + if (ret < 0) { + VERROR_INT("xmlSchemaValidateElementByDeclaration", + "calling xmlSchemaQNameExpand() to validate the " + "attribute 'xsi:type'"); + goto internal_error; + } + goto exit; + } + /* + * (cvc-elt) (3.3.4) : (4.2) + * (cvc-assess-elt) (1.2.1.2.3) + */ + *localType = xmlSchemaGetType(vctxt->schema, local, nsName); + if (*localType == NULL) { + xmlChar *str = NULL; + + xmlSchemaCustomErr(ACTXT_CAST vctxt, + XML_SCHEMAV_CVC_ELT_4_2, NULL, + WXS_BASIC_CAST xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME), + "The QName value '%s' of the xsi:type attribute does not " + "resolve to a type definition", + xmlSchemaFormatQName(&str, nsName, local), NULL); + FREE_AND_NULL(str); + ret = vctxt->err; + goto exit; + } + if (elemDecl != NULL) { + int set = 0; + + /* + * SPEC cvc-elt (3.3.4) : (4.3) (Type Derivation OK) + * "The �local type definition� must be validly + * derived from the {type definition} given the union of + * the {disallowed substitutions} and the {type definition}'s + * {prohibited substitutions}, as defined in + * Type Derivation OK (Complex) (�3.4.6) + * (if it is a complex type definition), + * or given {disallowed substitutions} as defined in Type + * Derivation OK (Simple) (�3.14.6) (if it is a simple type + * definition)." + * + * {disallowed substitutions}: the "block" on the element decl. + * {prohibited substitutions}: the "block" on the type def. + */ + /* + * OPTIMIZE TODO: We could map types already evaluated + * to be validly derived from other types to avoid checking + * this over and over for the same types. + */ + if ((elemDecl->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION) || + (elemDecl->subtypes->flags & + XML_SCHEMAS_TYPE_BLOCK_EXTENSION)) + set |= SUBSET_EXTENSION; + + if ((elemDecl->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION) || + (elemDecl->subtypes->flags & + XML_SCHEMAS_TYPE_BLOCK_RESTRICTION)) + set |= SUBSET_RESTRICTION; + + /* + * REMOVED and CHANGED since this produced a parser context + * which adds to the string dict of the schema. So this would + * change the schema and we don't want this. We don't need + * the parser context anymore. + * + * if ((vctxt->pctxt == NULL) && + * (xmlSchemaCreatePCtxtOnVCtxt(vctxt) == -1)) + * return (-1); + */ + + if (xmlSchemaCheckCOSDerivedOK(ACTXT_CAST vctxt, *localType, + elemDecl->subtypes, set) != 0) { + xmlChar *str = NULL; + + xmlSchemaCustomErr(ACTXT_CAST vctxt, + XML_SCHEMAV_CVC_ELT_4_3, NULL, NULL, + "The type definition '%s', specified by xsi:type, is " + "blocked or not validly derived from the type definition " + "of the element declaration", + xmlSchemaFormatQName(&str, + (*localType)->targetNamespace, + (*localType)->name), + NULL); + FREE_AND_NULL(str); + ret = vctxt->err; + *localType = NULL; + } + } + } +exit: + ACTIVATE_ELEM; + return (ret); +internal_error: + ACTIVATE_ELEM; + return (-1); +} + +static int +xmlSchemaValidateElemDecl(xmlSchemaValidCtxtPtr vctxt) +{ + xmlSchemaElementPtr elemDecl = vctxt->inode->decl; + xmlSchemaTypePtr actualType; + + /* + * cvc-elt (3.3.4) : 1 + */ + if (elemDecl == NULL) { + VERROR(XML_SCHEMAV_CVC_ELT_1, NULL, + "No matching declaration available"); + return (vctxt->err); + } + actualType = WXS_ELEM_TYPEDEF(elemDecl); + /* + * cvc-elt (3.3.4) : 2 + */ + if (elemDecl->flags & XML_SCHEMAS_ELEM_ABSTRACT) { + VERROR(XML_SCHEMAV_CVC_ELT_2, NULL, + "The element declaration is abstract"); + return (vctxt->err); + } + if (actualType == NULL) { + VERROR(XML_SCHEMAV_CVC_TYPE_1, NULL, + "The type definition is absent"); + return (XML_SCHEMAV_CVC_TYPE_1); + } + if (vctxt->nbAttrInfos != 0) { + int ret; + xmlSchemaAttrInfoPtr iattr; + /* + * cvc-elt (3.3.4) : 3 + * Handle 'xsi:nil'. + */ + iattr = xmlSchemaGetMetaAttrInfo(vctxt, + XML_SCHEMA_ATTR_INFO_META_XSI_NIL); + if (iattr) { + ACTIVATE_ATTRIBUTE(iattr); + /* + * Validate the value. + */ + ret = xmlSchemaVCheckCVCSimpleType( + ACTXT_CAST vctxt, NULL, + xmlSchemaGetBuiltInType(XML_SCHEMAS_BOOLEAN), + iattr->value, &(iattr->val), 1, 0, 0); + ACTIVATE_ELEM; + if (ret < 0) { + VERROR_INT("xmlSchemaValidateElemDecl", + "calling xmlSchemaVCheckCVCSimpleType() to " + "validate the attribute 'xsi:nil'"); + return (-1); + } + if (ret == 0) { + if ((elemDecl->flags & XML_SCHEMAS_ELEM_NILLABLE) == 0) { + /* + * cvc-elt (3.3.4) : 3.1 + */ + VERROR(XML_SCHEMAV_CVC_ELT_3_1, NULL, + "The element is not 'nillable'"); + /* Does not return an error on purpose. */ + } else { + if (xmlSchemaValueGetAsBoolean(iattr->val)) { + /* + * cvc-elt (3.3.4) : 3.2.2 + */ + if ((elemDecl->flags & XML_SCHEMAS_ELEM_FIXED) && + (elemDecl->value != NULL)) { + VERROR(XML_SCHEMAV_CVC_ELT_3_2_2, NULL, + "The element cannot be 'nilled' because " + "there is a fixed value constraint defined " + "for it"); + /* Does not return an error on purpose. */ + } else + vctxt->inode->flags |= + XML_SCHEMA_ELEM_INFO_NILLED; + } + } + } + } + /* + * cvc-elt (3.3.4) : 4 + * Handle 'xsi:type'. + */ + iattr = xmlSchemaGetMetaAttrInfo(vctxt, + XML_SCHEMA_ATTR_INFO_META_XSI_TYPE); + if (iattr) { + xmlSchemaTypePtr localType = NULL; + + ret = xmlSchemaProcessXSIType(vctxt, iattr, &localType, + elemDecl); + if (ret != 0) { + if (ret == -1) { + VERROR_INT("xmlSchemaValidateElemDecl", + "calling xmlSchemaProcessXSIType() to " + "process the attribute 'xsi:type'"); + return (-1); + } + /* Does not return an error on purpose. */ + } + if (localType != NULL) { + vctxt->inode->flags |= XML_SCHEMA_ELEM_INFO_LOCAL_TYPE; + actualType = localType; + } + } + } + /* + * IDC: Register identity-constraint XPath matchers. + */ + if ((elemDecl->idcs != NULL) && + (xmlSchemaIDCRegisterMatchers(vctxt, elemDecl) == -1)) + return (-1); + /* + * No actual type definition. + */ + if (actualType == NULL) { + VERROR(XML_SCHEMAV_CVC_TYPE_1, NULL, + "The type definition is absent"); + return (XML_SCHEMAV_CVC_TYPE_1); + } + /* + * Remember the actual type definition. + */ + vctxt->inode->typeDef = actualType; + + return (0); +} + +static int +xmlSchemaVAttributesSimple(xmlSchemaValidCtxtPtr vctxt) +{ + xmlSchemaAttrInfoPtr iattr; + int ret = 0, i; + + /* + * SPEC cvc-type (3.1.1) + * "The attributes of must be empty, excepting those whose namespace + * name is identical to http://www.w3.org/2001/XMLSchema-instance and + * whose local name is one of type, nil, schemaLocation or + * noNamespaceSchemaLocation." + */ + if (vctxt->nbAttrInfos == 0) + return (0); + for (i = 0; i < vctxt->nbAttrInfos; i++) { + iattr = vctxt->attrInfos[i]; + if (! iattr->metaType) { + ACTIVATE_ATTRIBUTE(iattr) + xmlSchemaIllegalAttrErr(ACTXT_CAST vctxt, + XML_SCHEMAV_CVC_TYPE_3_1_1, iattr, NULL); + ret = XML_SCHEMAV_CVC_TYPE_3_1_1; + } + } + ACTIVATE_ELEM + return (ret); +} + +/* +* Cleanup currently used attribute infos. +*/ +static void +xmlSchemaClearAttrInfos(xmlSchemaValidCtxtPtr vctxt) +{ + int i; + xmlSchemaAttrInfoPtr attr; + + if (vctxt->nbAttrInfos == 0) + return; + for (i = 0; i < vctxt->nbAttrInfos; i++) { + attr = vctxt->attrInfos[i]; + if (attr->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES) { + if (attr->localName != NULL) + xmlFree((xmlChar *) attr->localName); + if (attr->nsName != NULL) + xmlFree((xmlChar *) attr->nsName); + } + if (attr->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES) { + if (attr->value != NULL) + xmlFree((xmlChar *) attr->value); + } + if (attr->val != NULL) { + xmlSchemaFreeValue(attr->val); + attr->val = NULL; + } + memset(attr, 0, sizeof(xmlSchemaAttrInfo)); + } + vctxt->nbAttrInfos = 0; +} + +/* +* 3.4.4 Complex Type Definition Validation Rules +* Element Locally Valid (Complex Type) (cvc-complex-type) +* 3.2.4 Attribute Declaration Validation Rules +* Validation Rule: Attribute Locally Valid (cvc-attribute) +* Attribute Locally Valid (Use) (cvc-au) +* +* Only "assessed" attribute information items will be visible to +* IDCs. I.e. not "lax" (without declaration) and "skip" wild attributes. +*/ +static int +xmlSchemaVAttributesComplex(xmlSchemaValidCtxtPtr vctxt) +{ + xmlSchemaTypePtr type = vctxt->inode->typeDef; + xmlSchemaItemListPtr attrUseList; + xmlSchemaAttributeUsePtr attrUse = NULL; + xmlSchemaAttributePtr attrDecl = NULL; + xmlSchemaAttrInfoPtr iattr, tmpiattr; + int i, j, found, nbAttrs, nbUses; + int xpathRes = 0, res, wildIDs = 0, fixed; + xmlNodePtr defAttrOwnerElem = NULL; + + /* + * SPEC (cvc-attribute) + * (1) "The declaration must not be �absent� (see Missing + * Sub-components (�5.3) for how this can fail to be + * the case)." + * (2) "Its {type definition} must not be absent." + * + * NOTE (1) + (2): This is not handled here, since we currently do not + * allow validation against schemas which have missing sub-components. + * + * SPEC (cvc-complex-type) + * (3) "For each attribute information item in the element information + * item's [attributes] excepting those whose [namespace name] is + * identical to http://www.w3.org/2001/XMLSchema-instance and whose + * [local name] is one of type, nil, schemaLocation or + * noNamespaceSchemaLocation, the appropriate case among the following + * must be true: + * + */ + attrUseList = (xmlSchemaItemListPtr) type->attrUses; + /* + * @nbAttrs is the number of attributes present in the instance. + */ + nbAttrs = vctxt->nbAttrInfos; + if (attrUseList != NULL) + nbUses = attrUseList->nbItems; + else + nbUses = 0; + for (i = 0; i < nbUses; i++) { + found = 0; + attrUse = attrUseList->items[i]; + attrDecl = WXS_ATTRUSE_DECL(attrUse); + for (j = 0; j < nbAttrs; j++) { + iattr = vctxt->attrInfos[j]; + /* + * SPEC (cvc-complex-type) (3) + * Skip meta attributes. + */ + if (iattr->metaType) + continue; + if (iattr->localName[0] != attrDecl->name[0]) + continue; + if (!xmlStrEqual(iattr->localName, attrDecl->name)) + continue; + if (!xmlStrEqual(iattr->nsName, attrDecl->targetNamespace)) + continue; + found = 1; + /* + * SPEC (cvc-complex-type) + * (3.1) "If there is among the {attribute uses} an attribute + * use with an {attribute declaration} whose {name} matches + * the attribute information item's [local name] and whose + * {target namespace} is identical to the attribute information + * item's [namespace name] (where an �absent� {target namespace} + * is taken to be identical to a [namespace name] with no value), + * then the attribute information must be �valid� with respect + * to that attribute use as per Attribute Locally Valid (Use) + * (�3.5.4). In this case the {attribute declaration} of that + * attribute use is the �context-determined declaration� for the + * attribute information item with respect to Schema-Validity + * Assessment (Attribute) (�3.2.4) and + * Assessment Outcome (Attribute) (�3.2.5). + */ + iattr->state = XML_SCHEMAS_ATTR_ASSESSED; + iattr->use = attrUse; + /* + * Context-determined declaration. + */ + iattr->decl = attrDecl; + iattr->typeDef = attrDecl->subtypes; + break; + } + + if (found) + continue; + + if (attrUse->occurs == XML_SCHEMAS_ATTR_USE_REQUIRED) { + /* + * Handle non-existent, required attributes. + * + * SPEC (cvc-complex-type) + * (4) "The {attribute declaration} of each attribute use in + * the {attribute uses} whose {required} is true matches one + * of the attribute information items in the element information + * item's [attributes] as per clause 3.1 above." + */ + tmpiattr = xmlSchemaGetFreshAttrInfo(vctxt); + if (tmpiattr == NULL) { + VERROR_INT( + "xmlSchemaVAttributesComplex", + "calling xmlSchemaGetFreshAttrInfo()"); + return (-1); + } + tmpiattr->state = XML_SCHEMAS_ATTR_ERR_MISSING; + tmpiattr->use = attrUse; + tmpiattr->decl = attrDecl; + } else if ((attrUse->occurs == XML_SCHEMAS_ATTR_USE_OPTIONAL) && + ((attrUse->defValue != NULL) || + (attrDecl->defValue != NULL))) { + /* + * Handle non-existent, optional, default/fixed attributes. + */ + tmpiattr = xmlSchemaGetFreshAttrInfo(vctxt); + if (tmpiattr == NULL) { + VERROR_INT( + "xmlSchemaVAttributesComplex", + "calling xmlSchemaGetFreshAttrInfo()"); + return (-1); + } + tmpiattr->state = XML_SCHEMAS_ATTR_DEFAULT; + tmpiattr->use = attrUse; + tmpiattr->decl = attrDecl; + tmpiattr->typeDef = attrDecl->subtypes; + tmpiattr->localName = attrDecl->name; + tmpiattr->nsName = attrDecl->targetNamespace; + } + } + + if (vctxt->nbAttrInfos == 0) + return (0); + /* + * Validate against the wildcard. + */ + if (type->attributeWildcard != NULL) { + /* + * SPEC (cvc-complex-type) + * (3.2.1) "There must be an {attribute wildcard}." + */ + for (i = 0; i < nbAttrs; i++) { + iattr = vctxt->attrInfos[i]; + /* + * SPEC (cvc-complex-type) (3) + * Skip meta attributes. + */ + if (iattr->state != XML_SCHEMAS_ATTR_UNKNOWN) + continue; + /* + * SPEC (cvc-complex-type) + * (3.2.2) "The attribute information item must be �valid� with + * respect to it as defined in Item Valid (Wildcard) (�3.10.4)." + * + * SPEC Item Valid (Wildcard) (cvc-wildcard) + * "... its [namespace name] must be �valid� with respect to + * the wildcard constraint, as defined in Wildcard allows + * Namespace Name (�3.10.4)." + */ + if (xmlSchemaCheckCVCWildcardNamespace(type->attributeWildcard, + iattr->nsName) == 0) { + /* + * Handle processContents. + * + * SPEC (cvc-wildcard): + * processContents | context-determined declaration: + * "strict" "mustFind" + * "lax" "none" + * "skip" "skip" + */ + if (type->attributeWildcard->processContents == + XML_SCHEMAS_ANY_SKIP) { + /* + * context-determined declaration = "skip" + * + * SPEC PSVI Assessment Outcome (Attribute) + * [validity] = "notKnown" + * [validation attempted] = "none" + */ + iattr->state = XML_SCHEMAS_ATTR_WILD_SKIP; + continue; + } + /* + * Find an attribute declaration. + */ + iattr->decl = xmlSchemaGetAttributeDecl(vctxt->schema, + iattr->localName, iattr->nsName); + if (iattr->decl != NULL) { + iattr->state = XML_SCHEMAS_ATTR_ASSESSED; + /* + * SPEC (cvc-complex-type) + * (5) "Let [Definition:] the wild IDs be the set of + * all attribute information item to which clause 3.2 + * applied and whose �validation� resulted in a + * �context-determined declaration� of mustFind or no + * �context-determined declaration� at all, and whose + * [local name] and [namespace name] resolve (as + * defined by QName resolution (Instance) (�3.15.4)) to + * an attribute declaration whose {type definition} is + * or is derived from ID. Then all of the following + * must be true:" + */ + iattr->typeDef = WXS_ATTR_TYPEDEF(iattr->decl); + if (xmlSchemaIsDerivedFromBuiltInType( + iattr->typeDef, XML_SCHEMAS_ID)) { + /* + * SPEC (5.1) "There must be no more than one + * item in �wild IDs�." + */ + if (wildIDs != 0) { + /* VAL TODO */ + iattr->state = XML_SCHEMAS_ATTR_ERR_WILD_DUPLICATE_ID; + TODO + continue; + } + wildIDs++; + /* + * SPEC (cvc-complex-type) + * (5.2) "If �wild IDs� is non-empty, there must not + * be any attribute uses among the {attribute uses} + * whose {attribute declaration}'s {type definition} + * is or is derived from ID." + */ + if (attrUseList != NULL) { + for (j = 0; j < attrUseList->nbItems; j++) { + if (xmlSchemaIsDerivedFromBuiltInType( + WXS_ATTRUSE_TYPEDEF(attrUseList->items[j]), + XML_SCHEMAS_ID)) { + /* URGENT VAL TODO: implement */ + iattr->state = XML_SCHEMAS_ATTR_ERR_WILD_AND_USE_ID; + TODO + break; + } + } + } + } + } else if (type->attributeWildcard->processContents == + XML_SCHEMAS_ANY_LAX) { + iattr->state = XML_SCHEMAS_ATTR_WILD_LAX_NO_DECL; + /* + * SPEC PSVI Assessment Outcome (Attribute) + * [validity] = "notKnown" + * [validation attempted] = "none" + */ + } else { + iattr->state = XML_SCHEMAS_ATTR_ERR_WILD_STRICT_NO_DECL; + } + } + } + } + + if (vctxt->nbAttrInfos == 0) + return (0); + + /* + * Get the owner element; needed for creation of default attributes. + * This fixes bug #341337, reported by David Grohmann. + */ + if (vctxt->options & XML_SCHEMA_VAL_VC_I_CREATE) { + xmlSchemaNodeInfoPtr ielem = vctxt->elemInfos[vctxt->depth]; + if (ielem && ielem->node && ielem->node->doc) + defAttrOwnerElem = ielem->node; + } + /* + * Validate values, create default attributes, evaluate IDCs. + */ + for (i = 0; i < vctxt->nbAttrInfos; i++) { + iattr = vctxt->attrInfos[i]; + /* + * VAL TODO: Note that we won't try to resolve IDCs to + * "lax" and "skip" validated attributes. Check what to + * do in this case. + */ + if ((iattr->state != XML_SCHEMAS_ATTR_ASSESSED) && + (iattr->state != XML_SCHEMAS_ATTR_DEFAULT)) + continue; + /* + * VAL TODO: What to do if the type definition is missing? + */ + if (iattr->typeDef == NULL) { + iattr->state = XML_SCHEMAS_ATTR_ERR_NO_TYPE; + continue; + } + + ACTIVATE_ATTRIBUTE(iattr); + fixed = 0; + xpathRes = 0; + + if (vctxt->xpathStates != NULL) { + /* + * Evaluate IDCs. + */ + xpathRes = xmlSchemaXPathEvaluate(vctxt, + XML_ATTRIBUTE_NODE); + if (xpathRes == -1) { + VERROR_INT("xmlSchemaVAttributesComplex", + "calling xmlSchemaXPathEvaluate()"); + goto internal_error; + } + } + + if (iattr->state == XML_SCHEMAS_ATTR_DEFAULT) { + /* + * Default/fixed attributes. + * We need the value only if we need to resolve IDCs or + * will create default attributes. + */ + if ((xpathRes) || (defAttrOwnerElem)) { + if (iattr->use->defValue != NULL) { + iattr->value = (xmlChar *) iattr->use->defValue; + iattr->val = iattr->use->defVal; + } else { + iattr->value = (xmlChar *) iattr->decl->defValue; + iattr->val = iattr->decl->defVal; + } + /* + * IDCs will consume the precomputed default value, + * so we need to clone it. + */ + if (iattr->val == NULL) { + VERROR_INT("xmlSchemaVAttributesComplex", + "default/fixed value on an attribute use was " + "not precomputed"); + goto internal_error; + } + iattr->val = xmlSchemaCopyValue(iattr->val); + if (iattr->val == NULL) { + VERROR_INT("xmlSchemaVAttributesComplex", + "calling xmlSchemaCopyValue()"); + goto internal_error; + } + } + /* + * PSVI: Add the default attribute to the current element. + * VAL TODO: Should we use the *normalized* value? This currently + * uses the *initial* value. + */ + + if (defAttrOwnerElem) { + xmlChar *normValue; + const xmlChar *value; + + value = iattr->value; + /* + * Normalize the value. + */ + normValue = xmlSchemaNormalizeValue(iattr->typeDef, + iattr->value); + if (normValue != NULL) + value = BAD_CAST normValue; + + if (iattr->nsName == NULL) { + if (xmlNewProp(defAttrOwnerElem, + iattr->localName, value) == NULL) { + VERROR_INT("xmlSchemaVAttributesComplex", + "callling xmlNewProp()"); + if (normValue != NULL) + xmlFree(normValue); + goto internal_error; + } + } else { + xmlNsPtr ns; + + ns = xmlSearchNsByHref(defAttrOwnerElem->doc, + defAttrOwnerElem, iattr->nsName); + if (ns == NULL) { + xmlChar prefix[12]; + int counter = 0; + + /* + * Create a namespace declaration on the validation + * root node if no namespace declaration is in scope. + */ + do { + snprintf((char *) prefix, 12, "p%d", counter++); + ns = xmlSearchNs(defAttrOwnerElem->doc, + defAttrOwnerElem, BAD_CAST prefix); + if (counter > 1000) { + VERROR_INT( + "xmlSchemaVAttributesComplex", + "could not compute a ns prefix for a " + "default/fixed attribute"); + if (normValue != NULL) + xmlFree(normValue); + goto internal_error; + } + } while (ns != NULL); + ns = xmlNewNs(vctxt->validationRoot, + iattr->nsName, BAD_CAST prefix); + } + /* + * TODO: + * http://lists.w3.org/Archives/Public/www-xml-schema-comments/2005JulSep/0406.html + * If we have QNames: do we need to ensure there's a + * prefix defined for the QName? + */ + xmlNewNsProp(defAttrOwnerElem, ns, iattr->localName, value); + } + if (normValue != NULL) + xmlFree(normValue); + } + /* + * Go directly to IDC evaluation. + */ + goto eval_idcs; + } + /* + * Validate the value. + */ + if (vctxt->value != NULL) { + /* + * Free last computed value; just for safety reasons. + */ + xmlSchemaFreeValue(vctxt->value); + vctxt->value = NULL; + } + /* + * Note that the attribute *use* can be unavailable, if + * the attribute was a wild attribute. + */ + if ((iattr->decl->flags & XML_SCHEMAS_ATTR_FIXED) || + ((iattr->use != NULL) && + (iattr->use->flags & XML_SCHEMAS_ATTR_FIXED))) + fixed = 1; + else + fixed = 0; + /* + * SPEC (cvc-attribute) + * (3) "The item's �normalized value� must be locally �valid� + * with respect to that {type definition} as per + * String Valid (�3.14.4)." + * + * VAL TODO: Do we already have the + * "normalized attribute value" here? + */ + if (xpathRes || fixed) { + iattr->flags |= XML_SCHEMA_NODE_INFO_VALUE_NEEDED; + /* + * Request a computed value. + */ + res = xmlSchemaVCheckCVCSimpleType( + ACTXT_CAST vctxt, + iattr->node, iattr->typeDef, iattr->value, &(iattr->val), + 1, 1, 0); + } else { + res = xmlSchemaVCheckCVCSimpleType( + ACTXT_CAST vctxt, + iattr->node, iattr->typeDef, iattr->value, NULL, + 1, 0, 0); + } + + if (res != 0) { + if (res == -1) { + VERROR_INT("xmlSchemaVAttributesComplex", + "calling xmlSchemaStreamValidateSimpleTypeValue()"); + goto internal_error; + } + iattr->state = XML_SCHEMAS_ATTR_INVALID_VALUE; + /* + * SPEC PSVI Assessment Outcome (Attribute) + * [validity] = "invalid" + */ + goto eval_idcs; + } + + if (fixed) { + /* + * SPEC Attribute Locally Valid (Use) (cvc-au) + * "For an attribute information item to be�valid� + * with respect to an attribute use its *normalized* + * value� must match the *canonical* lexical + * representation of the attribute use's {value + * constraint}value, if it is present and fixed." + * + * VAL TODO: The requirement for the *canonical* value + * will be removed in XML Schema 1.1. + */ + /* + * SPEC Attribute Locally Valid (cvc-attribute) + * (4) "The item's *actual* value� must match the *value* of + * the {value constraint}, if it is present and fixed." + */ + if (iattr->val == NULL) { + /* VAL TODO: A value was not precomputed. */ + TODO + goto eval_idcs; + } + if ((iattr->use != NULL) && + (iattr->use->defValue != NULL)) { + if (iattr->use->defVal == NULL) { + /* VAL TODO: A default value was not precomputed. */ + TODO + goto eval_idcs; + } + iattr->vcValue = iattr->use->defValue; + /* + if (xmlSchemaCompareValuesWhtsp(attr->val, + (xmlSchemaWhitespaceValueType) ws, + attr->use->defVal, + (xmlSchemaWhitespaceValueType) ws) != 0) { + */ + if (! xmlSchemaAreValuesEqual(iattr->val, iattr->use->defVal)) + iattr->state = XML_SCHEMAS_ATTR_ERR_FIXED_VALUE; + } else { + if (iattr->decl->defVal == NULL) { + /* VAL TODO: A default value was not precomputed. */ + TODO + goto eval_idcs; + } + iattr->vcValue = iattr->decl->defValue; + /* + if (xmlSchemaCompareValuesWhtsp(attr->val, + (xmlSchemaWhitespaceValueType) ws, + attrDecl->defVal, + (xmlSchemaWhitespaceValueType) ws) != 0) { + */ + if (! xmlSchemaAreValuesEqual(iattr->val, iattr->decl->defVal)) + iattr->state = XML_SCHEMAS_ATTR_ERR_FIXED_VALUE; + } + /* + * [validity] = "valid" + */ + } +eval_idcs: + /* + * Evaluate IDCs. + */ + if (xpathRes) { + if (xmlSchemaXPathProcessHistory(vctxt, + vctxt->depth +1) == -1) { + VERROR_INT("xmlSchemaVAttributesComplex", + "calling xmlSchemaXPathEvaluate()"); + goto internal_error; + } + } else if (vctxt->xpathStates != NULL) + xmlSchemaXPathPop(vctxt); + } + + /* + * Report errors. + */ + for (i = 0; i < vctxt->nbAttrInfos; i++) { + iattr = vctxt->attrInfos[i]; + if ((iattr->state == XML_SCHEMAS_ATTR_META) || + (iattr->state == XML_SCHEMAS_ATTR_ASSESSED) || + (iattr->state == XML_SCHEMAS_ATTR_WILD_SKIP) || + (iattr->state == XML_SCHEMAS_ATTR_WILD_LAX_NO_DECL)) + continue; + ACTIVATE_ATTRIBUTE(iattr); + switch (iattr->state) { + case XML_SCHEMAS_ATTR_ERR_MISSING: { + xmlChar *str = NULL; + ACTIVATE_ELEM; + xmlSchemaCustomErr(ACTXT_CAST vctxt, + XML_SCHEMAV_CVC_COMPLEX_TYPE_4, NULL, NULL, + "The attribute '%s' is required but missing", + xmlSchemaFormatQName(&str, + iattr->decl->targetNamespace, + iattr->decl->name), + NULL); + FREE_AND_NULL(str) + break; + } + case XML_SCHEMAS_ATTR_ERR_NO_TYPE: + VERROR(XML_SCHEMAV_CVC_ATTRIBUTE_2, NULL, + "The type definition is absent"); + break; + case XML_SCHEMAS_ATTR_ERR_FIXED_VALUE: + xmlSchemaCustomErr(ACTXT_CAST vctxt, + XML_SCHEMAV_CVC_AU, NULL, NULL, + "The value '%s' does not match the fixed " + "value constraint '%s'", + iattr->value, iattr->vcValue); + break; + case XML_SCHEMAS_ATTR_ERR_WILD_STRICT_NO_DECL: + VERROR(XML_SCHEMAV_CVC_WILDCARD, NULL, + "No matching global attribute declaration available, but " + "demanded by the strict wildcard"); + break; + case XML_SCHEMAS_ATTR_UNKNOWN: + if (iattr->metaType) + break; + /* + * MAYBE VAL TODO: One might report different error messages + * for the following errors. + */ + if (type->attributeWildcard == NULL) { + xmlSchemaIllegalAttrErr(ACTXT_CAST vctxt, + XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_1, iattr, NULL); + } else { + xmlSchemaIllegalAttrErr(ACTXT_CAST vctxt, + XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_2, iattr, NULL); + } + break; + default: + break; + } + } + + ACTIVATE_ELEM; + return (0); +internal_error: + ACTIVATE_ELEM; + return (-1); +} + +static int +xmlSchemaValidateElemWildcard(xmlSchemaValidCtxtPtr vctxt, + int *skip) +{ + xmlSchemaWildcardPtr wild = (xmlSchemaWildcardPtr) vctxt->inode->decl; + /* + * The namespace of the element was already identified to be + * matching the wildcard. + */ + if ((skip == NULL) || (wild == NULL) || + (wild->type != XML_SCHEMA_TYPE_ANY)) { + VERROR_INT("xmlSchemaValidateElemWildcard", + "bad arguments"); + return (-1); + } + *skip = 0; + if (wild->processContents == XML_SCHEMAS_ANY_SKIP) { + /* + * URGENT VAL TODO: Either we need to position the stream to the + * next sibling, or walk the whole subtree. + */ + *skip = 1; + return (0); + } + { + xmlSchemaElementPtr decl = NULL; + + decl = xmlSchemaGetElem(vctxt->schema, + vctxt->inode->localName, vctxt->inode->nsName); + if (decl != NULL) { + vctxt->inode->decl = decl; + return (0); + } + } + if (wild->processContents == XML_SCHEMAS_ANY_STRICT) { + /* VAL TODO: Change to proper error code. */ + VERROR(XML_SCHEMAV_CVC_ELT_1, NULL, /* WXS_BASIC_CAST wild */ + "No matching global element declaration available, but " + "demanded by the strict wildcard"); + return (vctxt->err); + } + if (vctxt->nbAttrInfos != 0) { + xmlSchemaAttrInfoPtr iattr; + /* + * SPEC Validation Rule: Schema-Validity Assessment (Element) + * (1.2.1.2.1) - (1.2.1.2.3 ) + * + * Use the xsi:type attribute for the type definition. + */ + iattr = xmlSchemaGetMetaAttrInfo(vctxt, + XML_SCHEMA_ATTR_INFO_META_XSI_TYPE); + if (iattr != NULL) { + if (xmlSchemaProcessXSIType(vctxt, iattr, + &(vctxt->inode->typeDef), NULL) == -1) { + VERROR_INT("xmlSchemaValidateElemWildcard", + "calling xmlSchemaProcessXSIType() to " + "process the attribute 'xsi:nil'"); + return (-1); + } + /* + * Don't return an error on purpose. + */ + return (0); + } + } + /* + * SPEC Validation Rule: Schema-Validity Assessment (Element) + * + * Fallback to "anyType". + */ + vctxt->inode->typeDef = + xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE); + return (0); +} + +/* +* xmlSchemaCheckCOSValidDefault: +* +* This will be called if: not nilled, no content and a default/fixed +* value is provided. +*/ + +static int +xmlSchemaCheckCOSValidDefault(xmlSchemaValidCtxtPtr vctxt, + const xmlChar *value, + xmlSchemaValPtr *val) +{ + int ret = 0; + xmlSchemaNodeInfoPtr inode = vctxt->inode; + + /* + * cos-valid-default: + * Schema Component Constraint: Element Default Valid (Immediate) + * For a string to be a valid default with respect to a type + * definition the appropriate case among the following must be true: + */ + if WXS_IS_COMPLEX(inode->typeDef) { + /* + * Complex type. + * + * SPEC (2.1) "its {content type} must be a simple type definition + * or mixed." + * SPEC (2.2.2) "If the {content type} is mixed, then the {content + * type}'s particle must be �emptiable� as defined by + * Particle Emptiable (�3.9.6)." + */ + if ((! WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) && + ((! WXS_HAS_MIXED_CONTENT(inode->typeDef)) || + (! WXS_EMPTIABLE(inode->typeDef)))) { + ret = XML_SCHEMAP_COS_VALID_DEFAULT_2_1; + /* NOTE that this covers (2.2.2) as well. */ + VERROR(ret, NULL, + "For a string to be a valid default, the type definition " + "must be a simple type or a complex type with simple content " + "or mixed content and a particle emptiable"); + return(ret); + } + } + /* + * 1 If the type definition is a simple type definition, then the string + * must be �valid� with respect to that definition as defined by String + * Valid (�3.14.4). + * + * AND + * + * 2.2.1 If the {content type} is a simple type definition, then the + * string must be �valid� with respect to that simple type definition + * as defined by String Valid (�3.14.4). + */ + if (WXS_IS_SIMPLE(inode->typeDef)) { + + ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST vctxt, + NULL, inode->typeDef, value, val, 1, 1, 0); + + } else if (WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) { + + ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST vctxt, + NULL, inode->typeDef->contentTypeDef, value, val, 1, 1, 0); + } + if (ret < 0) { + VERROR_INT("xmlSchemaCheckCOSValidDefault", + "calling xmlSchemaVCheckCVCSimpleType()"); + } + return (ret); +} + +static void +xmlSchemaVContentModelCallback(xmlSchemaValidCtxtPtr vctxt ATTRIBUTE_UNUSED, + const xmlChar * name ATTRIBUTE_UNUSED, + xmlSchemaElementPtr item, + xmlSchemaNodeInfoPtr inode) +{ + inode->decl = item; +#ifdef DEBUG_CONTENT + { + xmlChar *str = NULL; + + if (item->type == XML_SCHEMA_TYPE_ELEMENT) { + xmlGenericError(xmlGenericErrorContext, + "AUTOMATON callback for '%s' [declaration]\n", + xmlSchemaFormatQName(&str, + inode->localName, inode->nsName)); + } else { + xmlGenericError(xmlGenericErrorContext, + "AUTOMATON callback for '%s' [wildcard]\n", + xmlSchemaFormatQName(&str, + inode->localName, inode->nsName)); + + } + FREE_AND_NULL(str) + } +#endif +} + +static int +xmlSchemaValidatorPushElem(xmlSchemaValidCtxtPtr vctxt) +{ + vctxt->inode = xmlSchemaGetFreshElemInfo(vctxt); + if (vctxt->inode == NULL) { + VERROR_INT("xmlSchemaValidatorPushElem", + "calling xmlSchemaGetFreshElemInfo()"); + return (-1); + } + vctxt->nbAttrInfos = 0; + return (0); +} + +static int +xmlSchemaVCheckINodeDataType(xmlSchemaValidCtxtPtr vctxt, + xmlSchemaNodeInfoPtr inode, + xmlSchemaTypePtr type, + const xmlChar *value) +{ + if (inode->flags & XML_SCHEMA_NODE_INFO_VALUE_NEEDED) + return (xmlSchemaVCheckCVCSimpleType( + ACTXT_CAST vctxt, NULL, + type, value, &(inode->val), 1, 1, 0)); + else + return (xmlSchemaVCheckCVCSimpleType( + ACTXT_CAST vctxt, NULL, + type, value, NULL, 1, 0, 0)); +} + + + +/* +* Process END of element. +*/ +static int +xmlSchemaValidatorPopElem(xmlSchemaValidCtxtPtr vctxt) +{ + int ret = 0; + xmlSchemaNodeInfoPtr inode = vctxt->inode; + + if (vctxt->nbAttrInfos != 0) + xmlSchemaClearAttrInfos(vctxt); + if (inode->flags & XML_SCHEMA_NODE_INFO_ERR_NOT_EXPECTED) { + /* + * This element was not expected; + * we will not validate child elements of broken parents. + * Skip validation of all content of the parent. + */ + vctxt->skipDepth = vctxt->depth -1; + goto end_elem; + } + if ((inode->typeDef == NULL) || + (inode->flags & XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE)) { + /* + * 1. the type definition might be missing if the element was + * error prone + * 2. it might be abstract. + */ + goto end_elem; + } + /* + * Check the content model. + */ + if ((inode->typeDef->contentType == XML_SCHEMA_CONTENT_MIXED) || + (inode->typeDef->contentType == XML_SCHEMA_CONTENT_ELEMENTS)) { + + /* + * Workaround for "anyType". + */ + if (inode->typeDef->builtInType == XML_SCHEMAS_ANYTYPE) + goto character_content; + + if ((inode->flags & XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT) == 0) { + xmlChar *values[10]; + int terminal, nbval = 10, nbneg; + + if (inode->regexCtxt == NULL) { + /* + * Create the regex context. + */ + inode->regexCtxt = + xmlRegNewExecCtxt(inode->typeDef->contModel, + (xmlRegExecCallbacks) xmlSchemaVContentModelCallback, + vctxt); + if (inode->regexCtxt == NULL) { + VERROR_INT("xmlSchemaValidatorPopElem", + "failed to create a regex context"); + goto internal_error; + } +#ifdef DEBUG_AUTOMATA + xmlGenericError(xmlGenericErrorContext, + "AUTOMATON create on '%s'\n", inode->localName); +#endif + } + + /* + * Do not check further content if the node has been nilled + */ + if (INODE_NILLED(inode)) { + ret = 0; +#ifdef DEBUG_AUTOMATA + xmlGenericError(xmlGenericErrorContext, + "AUTOMATON succeeded on nilled '%s'\n", + inode->localName); +#endif + goto skip_nilled; + } + + /* + * Get hold of the still expected content, since a further + * call to xmlRegExecPushString() will loose this information. + */ + xmlRegExecNextValues(inode->regexCtxt, + &nbval, &nbneg, &values[0], &terminal); + ret = xmlRegExecPushString(inode->regexCtxt, NULL, NULL); + if ((ret<0) || ((ret==0) && (!INODE_NILLED(inode)))) { + /* + * Still missing something. + */ + ret = 1; + inode->flags |= + XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT; + xmlSchemaComplexTypeErr(ACTXT_CAST vctxt, + XML_SCHEMAV_ELEMENT_CONTENT, NULL, NULL, + "Missing child element(s)", + nbval, nbneg, values); +#ifdef DEBUG_AUTOMATA + xmlGenericError(xmlGenericErrorContext, + "AUTOMATON missing ERROR on '%s'\n", + inode->localName); +#endif + } else { + /* + * Content model is satisfied. + */ + ret = 0; +#ifdef DEBUG_AUTOMATA + xmlGenericError(xmlGenericErrorContext, + "AUTOMATON succeeded on '%s'\n", + inode->localName); +#endif + } + + } + } + +skip_nilled: + + if (inode->typeDef->contentType == XML_SCHEMA_CONTENT_ELEMENTS) + goto end_elem; + +character_content: + + if (vctxt->value != NULL) { + xmlSchemaFreeValue(vctxt->value); + vctxt->value = NULL; + } + /* + * Check character content. + */ + if (inode->decl == NULL) { + /* + * Speedup if no declaration exists. + */ + if (WXS_IS_SIMPLE(inode->typeDef)) { + ret = xmlSchemaVCheckINodeDataType(vctxt, + inode, inode->typeDef, inode->value); + } else if (WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) { + ret = xmlSchemaVCheckINodeDataType(vctxt, + inode, inode->typeDef->contentTypeDef, + inode->value); + } + if (ret < 0) { + VERROR_INT("xmlSchemaValidatorPopElem", + "calling xmlSchemaVCheckCVCSimpleType()"); + goto internal_error; + } + goto end_elem; + } + /* + * cvc-elt (3.3.4) : 5 + * The appropriate case among the following must be true: + */ + /* + * cvc-elt (3.3.4) : 5.1 + * If the declaration has a {value constraint}, + * the item has neither element nor character [children] and + * clause 3.2 has not applied, then all of the following must be true: + */ + if ((inode->decl->value != NULL) && + (inode->flags & XML_SCHEMA_ELEM_INFO_EMPTY) && + (! INODE_NILLED(inode))) { + /* + * cvc-elt (3.3.4) : 5.1.1 + * If the �actual type definition� is a �local type definition� + * then the canonical lexical representation of the {value constraint} + * value must be a valid default for the �actual type definition� as + * defined in Element Default Valid (Immediate) (�3.3.6). + */ + /* + * NOTE: 'local' above means types acquired by xsi:type. + * NOTE: Although the *canonical* value is stated, it is not + * relevant if canonical or not. Additionally XML Schema 1.1 + * will removed this requirement as well. + */ + if (inode->flags & XML_SCHEMA_ELEM_INFO_LOCAL_TYPE) { + + ret = xmlSchemaCheckCOSValidDefault(vctxt, + inode->decl->value, &(inode->val)); + if (ret != 0) { + if (ret < 0) { + VERROR_INT("xmlSchemaValidatorPopElem", + "calling xmlSchemaCheckCOSValidDefault()"); + goto internal_error; + } + goto end_elem; + } + /* + * Stop here, to avoid redundant validation of the value + * (see following). + */ + goto default_psvi; + } + /* + * cvc-elt (3.3.4) : 5.1.2 + * The element information item with the canonical lexical + * representation of the {value constraint} value used as its + * �normalized value� must be �valid� with respect to the + * �actual type definition� as defined by Element Locally Valid (Type) + * (�3.3.4). + */ + if (WXS_IS_SIMPLE(inode->typeDef)) { + ret = xmlSchemaVCheckINodeDataType(vctxt, + inode, inode->typeDef, inode->decl->value); + } else if (WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) { + ret = xmlSchemaVCheckINodeDataType(vctxt, + inode, inode->typeDef->contentTypeDef, + inode->decl->value); + } + if (ret != 0) { + if (ret < 0) { + VERROR_INT("xmlSchemaValidatorPopElem", + "calling xmlSchemaVCheckCVCSimpleType()"); + goto internal_error; + } + goto end_elem; + } + +default_psvi: + /* + * PSVI: Create a text node on the instance element. + */ + if ((vctxt->options & XML_SCHEMA_VAL_VC_I_CREATE) && + (inode->node != NULL)) { + xmlNodePtr textChild; + xmlChar *normValue; + /* + * VAL TODO: Normalize the value. + */ + normValue = xmlSchemaNormalizeValue(inode->typeDef, + inode->decl->value); + if (normValue != NULL) { + textChild = xmlNewText(BAD_CAST normValue); + xmlFree(normValue); + } else + textChild = xmlNewText(inode->decl->value); + if (textChild == NULL) { + VERROR_INT("xmlSchemaValidatorPopElem", + "calling xmlNewText()"); + goto internal_error; + } else + xmlAddChild(inode->node, textChild); + } + + } else if (! INODE_NILLED(inode)) { + /* + * 5.2.1 The element information item must be �valid� with respect + * to the �actual type definition� as defined by Element Locally + * Valid (Type) (�3.3.4). + */ + if (WXS_IS_SIMPLE(inode->typeDef)) { + /* + * SPEC (cvc-type) (3.1) + * "If the type definition is a simple type definition, ..." + * (3.1.3) "If clause 3.2 of Element Locally Valid + * (Element) (�3.3.4) did not apply, then the �normalized value� + * must be �valid� with respect to the type definition as defined + * by String Valid (�3.14.4). + */ + ret = xmlSchemaVCheckINodeDataType(vctxt, + inode, inode->typeDef, inode->value); + } else if (WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) { + /* + * SPEC (cvc-type) (3.2) "If the type definition is a complex type + * definition, then the element information item must be + * �valid� with respect to the type definition as per + * Element Locally Valid (Complex Type) (�3.4.4);" + * + * SPEC (cvc-complex-type) (2.2) + * "If the {content type} is a simple type definition, ... + * the �normalized value� of the element information item is + * �valid� with respect to that simple type definition as + * defined by String Valid (�3.14.4)." + */ + ret = xmlSchemaVCheckINodeDataType(vctxt, + inode, inode->typeDef->contentTypeDef, inode->value); + } + if (ret != 0) { + if (ret < 0) { + VERROR_INT("xmlSchemaValidatorPopElem", + "calling xmlSchemaVCheckCVCSimpleType()"); + goto internal_error; + } + goto end_elem; + } + /* + * 5.2.2 If there is a fixed {value constraint} and clause 3.2 has + * not applied, all of the following must be true: + */ + if ((inode->decl->value != NULL) && + (inode->decl->flags & XML_SCHEMAS_ELEM_FIXED)) { + + /* + * TODO: We will need a computed value, when comparison is + * done on computed values. + */ + /* + * 5.2.2.1 The element information item must have no element + * information item [children]. + */ + if (inode->flags & + XML_SCHEMA_ELEM_INFO_HAS_ELEM_CONTENT) { + ret = XML_SCHEMAV_CVC_ELT_5_2_2_1; + VERROR(ret, NULL, + "The content must not containt element nodes since " + "there is a fixed value constraint"); + goto end_elem; + } else { + /* + * 5.2.2.2 The appropriate case among the following must + * be true: + */ + if (WXS_HAS_MIXED_CONTENT(inode->typeDef)) { + /* + * 5.2.2.2.1 If the {content type} of the �actual type + * definition� is mixed, then the *initial value* of the + * item must match the canonical lexical representation + * of the {value constraint} value. + * + * ... the *initial value* of an element information + * item is the string composed of, in order, the + * [character code] of each character information item in + * the [children] of that element information item. + */ + if (! xmlStrEqual(inode->value, inode->decl->value)){ + /* + * VAL TODO: Report invalid & expected values as well. + * VAL TODO: Implement the canonical stuff. + */ + ret = XML_SCHEMAV_CVC_ELT_5_2_2_2_1; + xmlSchemaCustomErr(ACTXT_CAST vctxt, + ret, NULL, NULL, + "The initial value '%s' does not match the fixed " + "value constraint '%s'", + inode->value, inode->decl->value); + goto end_elem; + } + } else if (WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) { + /* + * 5.2.2.2.2 If the {content type} of the �actual type + * definition� is a simple type definition, then the + * *actual value* of the item must match the canonical + * lexical representation of the {value constraint} value. + */ + /* + * VAL TODO: *actual value* is the normalized value, impl. + * this. + * VAL TODO: Report invalid & expected values as well. + * VAL TODO: Implement a comparison with the computed values. + */ + if (! xmlStrEqual(inode->value, + inode->decl->value)) { + ret = XML_SCHEMAV_CVC_ELT_5_2_2_2_2; + xmlSchemaCustomErr(ACTXT_CAST vctxt, + ret, NULL, NULL, + "The actual value '%s' does not match the fixed " + "value constraint '%s'", + inode->value, + inode->decl->value); + goto end_elem; + } + } + } + } + } + +end_elem: + if (vctxt->depth < 0) { + /* TODO: raise error? */ + return (0); + } + if (vctxt->depth == vctxt->skipDepth) + vctxt->skipDepth = -1; + /* + * Evaluate the history of XPath state objects. + */ + if (inode->appliedXPath && + (xmlSchemaXPathProcessHistory(vctxt, vctxt->depth) == -1)) + goto internal_error; + /* + * MAYBE TODO: + * SPEC (6) "The element information item must be �valid� with + * respect to each of the {identity-constraint definitions} as per + * Identity-constraint Satisfied (�3.11.4)." + */ + /* + * PSVI TODO: If we expose IDC node-tables via PSVI then the tables + * need to be built in any case. + * We will currently build IDC node-tables and bubble them only if + * keyrefs do exist. + */ + + /* + * Add the current IDC target-nodes to the IDC node-tables. + */ + if ((inode->idcMatchers != NULL) && + (vctxt->hasKeyrefs || vctxt->createIDCNodeTables)) + { + if (xmlSchemaIDCFillNodeTables(vctxt, inode) == -1) + goto internal_error; + } + /* + * Validate IDC keyrefs. + */ + if (vctxt->inode->hasKeyrefs) + if (xmlSchemaCheckCVCIDCKeyRef(vctxt) == -1) + goto internal_error; + /* + * Merge/free the IDC table. + */ + if (inode->idcTable != NULL) { +#ifdef DEBUG_IDC_NODE_TABLE + xmlSchemaDebugDumpIDCTable(stdout, + inode->nsName, + inode->localName, + inode->idcTable); +#endif + if ((vctxt->depth > 0) && + (vctxt->hasKeyrefs || vctxt->createIDCNodeTables)) + { + /* + * Merge the IDC node table with the table of the parent node. + */ + if (xmlSchemaBubbleIDCNodeTables(vctxt) == -1) + goto internal_error; + } + } + /* + * Clear the current ielem. + * VAL TODO: Don't free the PSVI IDC tables if they are + * requested for the PSVI. + */ + xmlSchemaClearElemInfo(vctxt, inode); + /* + * Skip further processing if we are on the validation root. + */ + if (vctxt->depth == 0) { + vctxt->depth--; + vctxt->inode = NULL; + return (0); + } + /* + * Reset the keyrefDepth if needed. + */ + if (vctxt->aidcs != NULL) { + xmlSchemaIDCAugPtr aidc = vctxt->aidcs; + do { + if (aidc->keyrefDepth == vctxt->depth) { + /* + * A 'keyrefDepth' of a key/unique IDC matches the current + * depth, this means that we are leaving the scope of the + * top-most keyref IDC which refers to this IDC. + */ + aidc->keyrefDepth = -1; + } + aidc = aidc->next; + } while (aidc != NULL); + } + vctxt->depth--; + vctxt->inode = vctxt->elemInfos[vctxt->depth]; + /* + * VAL TODO: 7 If the element information item is the �validation root�, it must be + * �valid� per Validation Root Valid (ID/IDREF) (�3.3.4). + */ + return (ret); + +internal_error: + vctxt->err = -1; + return (-1); +} + +/* +* 3.4.4 Complex Type Definition Validation Rules +* Validation Rule: Element Locally Valid (Complex Type) (cvc-complex-type) +*/ +static int +xmlSchemaValidateChildElem(xmlSchemaValidCtxtPtr vctxt) +{ + xmlSchemaNodeInfoPtr pielem; + xmlSchemaTypePtr ptype; + int ret = 0; + + if (vctxt->depth <= 0) { + VERROR_INT("xmlSchemaValidateChildElem", + "not intended for the validation root"); + return (-1); + } + pielem = vctxt->elemInfos[vctxt->depth -1]; + if (pielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY) + pielem->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY; + /* + * Handle 'nilled' elements. + */ + if (INODE_NILLED(pielem)) { + /* + * SPEC (cvc-elt) (3.3.4) : (3.2.1) + */ + ACTIVATE_PARENT_ELEM; + ret = XML_SCHEMAV_CVC_ELT_3_2_1; + VERROR(ret, NULL, + "Neither character nor element content is allowed, " + "because the element was 'nilled'"); + ACTIVATE_ELEM; + goto unexpected_elem; + } + + ptype = pielem->typeDef; + + if (ptype->builtInType == XML_SCHEMAS_ANYTYPE) { + /* + * Workaround for "anyType": we have currently no content model + * assigned for "anyType", so handle it explicitely. + * "anyType" has an unbounded, lax "any" wildcard. + */ + vctxt->inode->decl = xmlSchemaGetElem(vctxt->schema, + vctxt->inode->localName, + vctxt->inode->nsName); + + if (vctxt->inode->decl == NULL) { + xmlSchemaAttrInfoPtr iattr; + /* + * Process "xsi:type". + * SPEC (cvc-assess-elt) (1.2.1.2.1) - (1.2.1.2.3) + */ + iattr = xmlSchemaGetMetaAttrInfo(vctxt, + XML_SCHEMA_ATTR_INFO_META_XSI_TYPE); + if (iattr != NULL) { + ret = xmlSchemaProcessXSIType(vctxt, iattr, + &(vctxt->inode->typeDef), NULL); + if (ret != 0) { + if (ret == -1) { + VERROR_INT("xmlSchemaValidateChildElem", + "calling xmlSchemaProcessXSIType() to " + "process the attribute 'xsi:nil'"); + return (-1); + } + return (ret); + } + } else { + /* + * Fallback to "anyType". + * + * SPEC (cvc-assess-elt) + * "If the item cannot be �strictly assessed�, [...] + * an element information item's schema validity may be laxly + * assessed if its �context-determined declaration� is not + * skip by �validating� with respect to the �ur-type + * definition� as per Element Locally Valid (Type) (�3.3.4)." + */ + vctxt->inode->typeDef = + xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE); + } + } + return (0); + } + + switch (ptype->contentType) { + case XML_SCHEMA_CONTENT_EMPTY: + /* + * SPEC (2.1) "If the {content type} is empty, then the + * element information item has no character or element + * information item [children]." + */ + ACTIVATE_PARENT_ELEM + ret = XML_SCHEMAV_CVC_COMPLEX_TYPE_2_1; + VERROR(ret, NULL, + "Element content is not allowed, " + "because the content type is empty"); + ACTIVATE_ELEM + goto unexpected_elem; + break; + + case XML_SCHEMA_CONTENT_MIXED: + case XML_SCHEMA_CONTENT_ELEMENTS: { + xmlRegExecCtxtPtr regexCtxt; + xmlChar *values[10]; + int terminal, nbval = 10, nbneg; + + /* VAL TODO: Optimized "anyType" validation.*/ + + if (ptype->contModel == NULL) { + VERROR_INT("xmlSchemaValidateChildElem", + "type has elem content but no content model"); + return (-1); + } + /* + * Safety belf for evaluation if the cont. model was already + * examined to be invalid. + */ + if (pielem->flags & XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT) { + VERROR_INT("xmlSchemaValidateChildElem", + "validating elem, but elem content is already invalid"); + return (-1); + } + + regexCtxt = pielem->regexCtxt; + if (regexCtxt == NULL) { + /* + * Create the regex context. + */ + regexCtxt = xmlRegNewExecCtxt(ptype->contModel, + (xmlRegExecCallbacks) xmlSchemaVContentModelCallback, + vctxt); + if (regexCtxt == NULL) { + VERROR_INT("xmlSchemaValidateChildElem", + "failed to create a regex context"); + return (-1); + } + pielem->regexCtxt = regexCtxt; +#ifdef DEBUG_AUTOMATA + xmlGenericError(xmlGenericErrorContext, "AUTOMATA create on '%s'\n", + pielem->localName); +#endif + } + + /* + * SPEC (2.4) "If the {content type} is element-only or mixed, + * then the sequence of the element information item's + * element information item [children], if any, taken in + * order, is �valid� with respect to the {content type}'s + * particle, as defined in Element Sequence Locally Valid + * (Particle) (�3.9.4)." + */ + ret = xmlRegExecPushString2(regexCtxt, + vctxt->inode->localName, + vctxt->inode->nsName, + vctxt->inode); +#ifdef DEBUG_AUTOMATA + if (ret < 0) + xmlGenericError(xmlGenericErrorContext, + "AUTOMATON push ERROR for '%s' on '%s'\n", + vctxt->inode->localName, pielem->localName); + else + xmlGenericError(xmlGenericErrorContext, + "AUTOMATON push OK for '%s' on '%s'\n", + vctxt->inode->localName, pielem->localName); +#endif + if (vctxt->err == XML_SCHEMAV_INTERNAL) { + VERROR_INT("xmlSchemaValidateChildElem", + "calling xmlRegExecPushString2()"); + return (-1); + } + if (ret < 0) { + xmlRegExecErrInfo(regexCtxt, NULL, &nbval, &nbneg, + &values[0], &terminal); + xmlSchemaComplexTypeErr(ACTXT_CAST vctxt, + XML_SCHEMAV_ELEMENT_CONTENT, NULL,NULL, + "This element is not expected", + nbval, nbneg, values); + ret = vctxt->err; + goto unexpected_elem; + } else + ret = 0; + } + break; + case XML_SCHEMA_CONTENT_SIMPLE: + case XML_SCHEMA_CONTENT_BASIC: + ACTIVATE_PARENT_ELEM + if (WXS_IS_COMPLEX(ptype)) { + /* + * SPEC (cvc-complex-type) (2.2) + * "If the {content type} is a simple type definition, then + * the element information item has no element information + * item [children], ..." + */ + ret = XML_SCHEMAV_CVC_COMPLEX_TYPE_2_2; + VERROR(ret, NULL, "Element content is not allowed, " + "because the content type is a simple type definition"); + } else { + /* + * SPEC (cvc-type) (3.1.2) "The element information item must + * have no element information item [children]." + */ + ret = XML_SCHEMAV_CVC_TYPE_3_1_2; + VERROR(ret, NULL, "Element content is not allowed, " + "because the type definition is simple"); + } + ACTIVATE_ELEM + ret = vctxt->err; + goto unexpected_elem; + break; + + default: + break; + } + return (ret); +unexpected_elem: + /* + * Pop this element and set the skipDepth to skip + * all further content of the parent element. + */ + vctxt->skipDepth = vctxt->depth; + vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_ERR_NOT_EXPECTED; + pielem->flags |= XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT; + return (ret); +} + +#define XML_SCHEMA_PUSH_TEXT_PERSIST 1 +#define XML_SCHEMA_PUSH_TEXT_CREATED 2 +#define XML_SCHEMA_PUSH_TEXT_VOLATILE 3 + +static int +xmlSchemaVPushText(xmlSchemaValidCtxtPtr vctxt, + int nodeType, const xmlChar *value, int len, + int mode, int *consumed) +{ + /* + * Unfortunately we have to duplicate the text sometimes. + * OPTIMIZE: Maybe we could skip it, if: + * 1. content type is simple + * 2. whitespace is "collapse" + * 3. it consists of whitespace only + * + * Process character content. + */ + if (consumed != NULL) + *consumed = 0; + if (INODE_NILLED(vctxt->inode)) { + /* + * SPEC cvc-elt (3.3.4 - 3.2.1) + * "The element information item must have no character or + * element information item [children]." + */ + VERROR(XML_SCHEMAV_CVC_ELT_3_2_1, NULL, + "Neither character nor element content is allowed " + "because the element is 'nilled'"); + return (vctxt->err); + } + /* + * SPEC (2.1) "If the {content type} is empty, then the + * element information item has no character or element + * information item [children]." + */ + if (vctxt->inode->typeDef->contentType == + XML_SCHEMA_CONTENT_EMPTY) { + VERROR(XML_SCHEMAV_CVC_COMPLEX_TYPE_2_1, NULL, + "Character content is not allowed, " + "because the content type is empty"); + return (vctxt->err); + } + + if (vctxt->inode->typeDef->contentType == + XML_SCHEMA_CONTENT_ELEMENTS) { + if ((nodeType != XML_TEXT_NODE) || + (! xmlSchemaIsBlank((xmlChar *) value, len))) { + /* + * SPEC cvc-complex-type (2.3) + * "If the {content type} is element-only, then the + * element information item has no character information + * item [children] other than those whose [character + * code] is defined as a white space in [XML 1.0 (Second + * Edition)]." + */ + VERROR(XML_SCHEMAV_CVC_COMPLEX_TYPE_2_3, NULL, + "Character content other than whitespace is not allowed " + "because the content type is 'element-only'"); + return (vctxt->err); + } + return (0); + } + + if ((value == NULL) || (value[0] == 0)) + return (0); + /* + * Save the value. + * NOTE that even if the content type is *mixed*, we need the + * *initial value* for default/fixed value constraints. + */ + if ((vctxt->inode->typeDef->contentType == XML_SCHEMA_CONTENT_MIXED) && + ((vctxt->inode->decl == NULL) || + (vctxt->inode->decl->value == NULL))) + return (0); + + if (vctxt->inode->value == NULL) { + /* + * Set the value. + */ + switch (mode) { + case XML_SCHEMA_PUSH_TEXT_PERSIST: + /* + * When working on a tree. + */ + vctxt->inode->value = value; + break; + case XML_SCHEMA_PUSH_TEXT_CREATED: + /* + * When working with the reader. + * The value will be freed by the element info. + */ + vctxt->inode->value = value; + if (consumed != NULL) + *consumed = 1; + vctxt->inode->flags |= + XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES; + break; + case XML_SCHEMA_PUSH_TEXT_VOLATILE: + /* + * When working with SAX. + * The value will be freed by the element info. + */ + if (len != -1) + vctxt->inode->value = BAD_CAST xmlStrndup(value, len); + else + vctxt->inode->value = BAD_CAST xmlStrdup(value); + vctxt->inode->flags |= + XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES; + break; + default: + break; + } + } else { + if (len < 0) + len = xmlStrlen(value); + /* + * Concat the value. + */ + if (vctxt->inode->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES) { + vctxt->inode->value = BAD_CAST xmlStrncat( + (xmlChar *) vctxt->inode->value, value, len); + } else { + vctxt->inode->value = + BAD_CAST xmlStrncatNew(vctxt->inode->value, value, len); + vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES; + } + } + + return (0); +} + +static int +xmlSchemaValidateElem(xmlSchemaValidCtxtPtr vctxt) +{ + int ret = 0; + + if ((vctxt->skipDepth != -1) && + (vctxt->depth >= vctxt->skipDepth)) { + VERROR_INT("xmlSchemaValidateElem", + "in skip-state"); + goto internal_error; + } + if (vctxt->xsiAssemble) { + /* + * We will stop validation if there was an error during + * dynamic schema construction. + * Note that we simply set @skipDepth to 0, this could + * mean that a streaming document via SAX would be + * still read to the end but it won't be validated any more. + * TODO: If we are sure how to stop the validation at once + * for all input scenarios, then this should be changed to + * instantly stop the validation. + */ + ret = xmlSchemaAssembleByXSI(vctxt); + if (ret != 0) { + if (ret == -1) + goto internal_error; + vctxt->skipDepth = 0; + return(ret); + } + /* + * Augment the IDC definitions for the main schema and all imported ones + * NOTE: main schema is the first in the imported list + */ + xmlHashScan(vctxt->schema->schemasImports,(xmlHashScanner)xmlSchemaAugmentImportedIDC, vctxt); + } + if (vctxt->depth > 0) { + /* + * Validate this element against the content model + * of the parent. + */ + ret = xmlSchemaValidateChildElem(vctxt); + if (ret != 0) { + if (ret < 0) { + VERROR_INT("xmlSchemaValidateElem", + "calling xmlSchemaStreamValidateChildElement()"); + goto internal_error; + } + goto exit; + } + if (vctxt->depth == vctxt->skipDepth) + goto exit; + if ((vctxt->inode->decl == NULL) && + (vctxt->inode->typeDef == NULL)) { + VERROR_INT("xmlSchemaValidateElem", + "the child element was valid but neither the " + "declaration nor the type was set"); + goto internal_error; + } + } else { + /* + * Get the declaration of the validation root. + */ + vctxt->inode->decl = xmlSchemaGetElem(vctxt->schema, + vctxt->inode->localName, + vctxt->inode->nsName); + if (vctxt->inode->decl == NULL) { + ret = XML_SCHEMAV_CVC_ELT_1; + VERROR(ret, NULL, + "No matching global declaration available " + "for the validation root"); + goto exit; + } + } + + if (vctxt->inode->decl == NULL) + goto type_validation; + + if (vctxt->inode->decl->type == XML_SCHEMA_TYPE_ANY) { + int skip; + /* + * Wildcards. + */ + ret = xmlSchemaValidateElemWildcard(vctxt, &skip); + if (ret != 0) { + if (ret < 0) { + VERROR_INT("xmlSchemaValidateElem", + "calling xmlSchemaValidateElemWildcard()"); + goto internal_error; + } + goto exit; + } + if (skip) { + vctxt->skipDepth = vctxt->depth; + goto exit; + } + /* + * The declaration might be set by the wildcard validation, + * when the processContents is "lax" or "strict". + */ + if (vctxt->inode->decl->type != XML_SCHEMA_TYPE_ELEMENT) { + /* + * Clear the "decl" field to not confuse further processing. + */ + vctxt->inode->decl = NULL; + goto type_validation; + } + } + /* + * Validate against the declaration. + */ + ret = xmlSchemaValidateElemDecl(vctxt); + if (ret != 0) { + if (ret < 0) { + VERROR_INT("xmlSchemaValidateElem", + "calling xmlSchemaValidateElemDecl()"); + goto internal_error; + } + goto exit; + } + /* + * Validate against the type definition. + */ +type_validation: + + if (vctxt->inode->typeDef == NULL) { + vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE; + ret = XML_SCHEMAV_CVC_TYPE_1; + VERROR(ret, NULL, + "The type definition is absent"); + goto exit; + } + if (vctxt->inode->typeDef->flags & XML_SCHEMAS_TYPE_ABSTRACT) { + vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE; + ret = XML_SCHEMAV_CVC_TYPE_2; + VERROR(ret, NULL, + "The type definition is abstract"); + goto exit; + } + /* + * Evaluate IDCs. Do it here, since new IDC matchers are registered + * during validation against the declaration. This must be done + * _before_ attribute validation. + */ + if (vctxt->xpathStates != NULL) { + ret = xmlSchemaXPathEvaluate(vctxt, XML_ELEMENT_NODE); + vctxt->inode->appliedXPath = 1; + if (ret == -1) { + VERROR_INT("xmlSchemaValidateElem", + "calling xmlSchemaXPathEvaluate()"); + goto internal_error; + } + } + /* + * Validate attributes. + */ + if (WXS_IS_COMPLEX(vctxt->inode->typeDef)) { + if ((vctxt->nbAttrInfos != 0) || + (vctxt->inode->typeDef->attrUses != NULL)) { + + ret = xmlSchemaVAttributesComplex(vctxt); + } + } else if (vctxt->nbAttrInfos != 0) { + + ret = xmlSchemaVAttributesSimple(vctxt); + } + /* + * Clear registered attributes. + */ + if (vctxt->nbAttrInfos != 0) + xmlSchemaClearAttrInfos(vctxt); + if (ret == -1) { + VERROR_INT("xmlSchemaValidateElem", + "calling attributes validation"); + goto internal_error; + } + /* + * Don't return an error if attributes are invalid on purpose. + */ + ret = 0; + +exit: + if (ret != 0) + vctxt->skipDepth = vctxt->depth; + return (ret); +internal_error: + return (-1); +} + +#ifdef XML_SCHEMA_READER_ENABLED +static int +xmlSchemaVReaderWalk(xmlSchemaValidCtxtPtr vctxt) +{ + const int WHTSP = 13, SIGN_WHTSP = 14, END_ELEM = 15; + int depth, nodeType, ret = 0, consumed; + xmlSchemaNodeInfoPtr ielem; + + vctxt->depth = -1; + ret = xmlTextReaderRead(vctxt->reader); + /* + * Move to the document element. + */ + while (ret == 1) { + nodeType = xmlTextReaderNodeType(vctxt->reader); + if (nodeType == XML_ELEMENT_NODE) + goto root_found; + ret = xmlTextReaderRead(vctxt->reader); + } + goto exit; + +root_found: + + do { + depth = xmlTextReaderDepth(vctxt->reader); + nodeType = xmlTextReaderNodeType(vctxt->reader); + + if (nodeType == XML_ELEMENT_NODE) { + + vctxt->depth++; + if (xmlSchemaValidatorPushElem(vctxt) == -1) { + VERROR_INT("xmlSchemaVReaderWalk", + "calling xmlSchemaValidatorPushElem()"); + goto internal_error; + } + ielem = vctxt->inode; + ielem->localName = xmlTextReaderLocalName(vctxt->reader); + ielem->nsName = xmlTextReaderNamespaceUri(vctxt->reader); + ielem->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES; + /* + * Is the element empty? + */ + ret = xmlTextReaderIsEmptyElement(vctxt->reader); + if (ret == -1) { + VERROR_INT("xmlSchemaVReaderWalk", + "calling xmlTextReaderIsEmptyElement()"); + goto internal_error; + } + if (ret) { + ielem->flags |= XML_SCHEMA_ELEM_INFO_EMPTY; + } + /* + * Register attributes. + */ + vctxt->nbAttrInfos = 0; + ret = xmlTextReaderMoveToFirstAttribute(vctxt->reader); + if (ret == -1) { + VERROR_INT("xmlSchemaVReaderWalk", + "calling xmlTextReaderMoveToFirstAttribute()"); + goto internal_error; + } + if (ret == 1) { + do { + /* + * VAL TODO: How do we know that the reader works on a + * node tree, to be able to pass a node here? + */ + if (xmlSchemaValidatorPushAttribute(vctxt, NULL, + (const xmlChar *) xmlTextReaderLocalName(vctxt->reader), + xmlTextReaderNamespaceUri(vctxt->reader), 1, + xmlTextReaderValue(vctxt->reader), 1) == -1) { + + VERROR_INT("xmlSchemaVReaderWalk", + "calling xmlSchemaValidatorPushAttribute()"); + goto internal_error; + } + ret = xmlTextReaderMoveToNextAttribute(vctxt->reader); + if (ret == -1) { + VERROR_INT("xmlSchemaVReaderWalk", + "calling xmlTextReaderMoveToFirstAttribute()"); + goto internal_error; + } + } while (ret == 1); + /* + * Back to element position. + */ + ret = xmlTextReaderMoveToElement(vctxt->reader); + if (ret == -1) { + VERROR_INT("xmlSchemaVReaderWalk", + "calling xmlTextReaderMoveToElement()"); + goto internal_error; + } + } + /* + * Validate the element. + */ + ret= xmlSchemaValidateElem(vctxt); + if (ret != 0) { + if (ret == -1) { + VERROR_INT("xmlSchemaVReaderWalk", + "calling xmlSchemaValidateElem()"); + goto internal_error; + } + goto exit; + } + if (vctxt->depth == vctxt->skipDepth) { + int curDepth; + /* + * Skip all content. + */ + if ((ielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY) == 0) { + ret = xmlTextReaderRead(vctxt->reader); + curDepth = xmlTextReaderDepth(vctxt->reader); + while ((ret == 1) && (curDepth != depth)) { + ret = xmlTextReaderRead(vctxt->reader); + curDepth = xmlTextReaderDepth(vctxt->reader); + } + if (ret < 0) { + /* + * VAL TODO: A reader error occured; what to do here? + */ + ret = 1; + goto exit; + } + } + goto leave_elem; + } + /* + * READER VAL TODO: Is an END_ELEM really never called + * if the elem is empty? + */ + if (ielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY) + goto leave_elem; + } else if (nodeType == END_ELEM) { + /* + * Process END of element. + */ +leave_elem: + ret = xmlSchemaValidatorPopElem(vctxt); + if (ret != 0) { + if (ret < 0) { + VERROR_INT("xmlSchemaVReaderWalk", + "calling xmlSchemaValidatorPopElem()"); + goto internal_error; + } + goto exit; + } + if (vctxt->depth >= 0) + ielem = vctxt->inode; + else + ielem = NULL; + } else if ((nodeType == XML_TEXT_NODE) || + (nodeType == XML_CDATA_SECTION_NODE) || + (nodeType == WHTSP) || + (nodeType == SIGN_WHTSP)) { + /* + * Process character content. + */ + xmlChar *value; + + if ((nodeType == WHTSP) || (nodeType == SIGN_WHTSP)) + nodeType = XML_TEXT_NODE; + + value = xmlTextReaderValue(vctxt->reader); + ret = xmlSchemaVPushText(vctxt, nodeType, BAD_CAST value, + -1, XML_SCHEMA_PUSH_TEXT_CREATED, &consumed); + if (! consumed) + xmlFree(value); + if (ret == -1) { + VERROR_INT("xmlSchemaVReaderWalk", + "calling xmlSchemaVPushText()"); + goto internal_error; + } + } else if ((nodeType == XML_ENTITY_NODE) || + (nodeType == XML_ENTITY_REF_NODE)) { + /* + * VAL TODO: What to do with entities? + */ + TODO + } + /* + * Read next node. + */ + ret = xmlTextReaderRead(vctxt->reader); + } while (ret == 1); + +exit: + return (ret); +internal_error: + return (-1); +} +#endif + +/************************************************************************ + * * + * SAX validation handlers * + * * + ************************************************************************/ + +/* +* Process text content. +*/ +static void +xmlSchemaSAXHandleText(void *ctx, + const xmlChar * ch, + int len) +{ + xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctx; + + if (vctxt->depth < 0) + return; + if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth)) + return; + if (vctxt->inode->flags & XML_SCHEMA_ELEM_INFO_EMPTY) + vctxt->inode->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY; + if (xmlSchemaVPushText(vctxt, XML_TEXT_NODE, ch, len, + XML_SCHEMA_PUSH_TEXT_VOLATILE, NULL) == -1) { + VERROR_INT("xmlSchemaSAXHandleCDataSection", + "calling xmlSchemaVPushText()"); + vctxt->err = -1; + xmlStopParser(vctxt->parserCtxt); + } +} + +/* +* Process CDATA content. +*/ +static void +xmlSchemaSAXHandleCDataSection(void *ctx, + const xmlChar * ch, + int len) +{ + xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctx; + + if (vctxt->depth < 0) + return; + if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth)) + return; + if (vctxt->inode->flags & XML_SCHEMA_ELEM_INFO_EMPTY) + vctxt->inode->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY; + if (xmlSchemaVPushText(vctxt, XML_CDATA_SECTION_NODE, ch, len, + XML_SCHEMA_PUSH_TEXT_VOLATILE, NULL) == -1) { + VERROR_INT("xmlSchemaSAXHandleCDataSection", + "calling xmlSchemaVPushText()"); + vctxt->err = -1; + xmlStopParser(vctxt->parserCtxt); + } +} + +static void +xmlSchemaSAXHandleReference(void *ctx ATTRIBUTE_UNUSED, + const xmlChar * name ATTRIBUTE_UNUSED) +{ + xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctx; + + if (vctxt->depth < 0) + return; + if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth)) + return; + /* SAX VAL TODO: What to do here? */ + TODO +} + +static void +xmlSchemaSAXHandleStartElementNs(void *ctx, + const xmlChar * localname, + const xmlChar * prefix ATTRIBUTE_UNUSED, + const xmlChar * URI, + int nb_namespaces, + const xmlChar ** namespaces, + int nb_attributes, + int nb_defaulted ATTRIBUTE_UNUSED, + const xmlChar ** attributes) +{ + xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctx; + int ret; + xmlSchemaNodeInfoPtr ielem; + int i, j; + + /* + * SAX VAL TODO: What to do with nb_defaulted? + */ + /* + * Skip elements if inside a "skip" wildcard or invalid. + */ + vctxt->depth++; + if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth)) + return; + /* + * Push the element. + */ + if (xmlSchemaValidatorPushElem(vctxt) == -1) { + VERROR_INT("xmlSchemaSAXHandleStartElementNs", + "calling xmlSchemaValidatorPushElem()"); + goto internal_error; + } + ielem = vctxt->inode; + /* + * TODO: Is this OK? + */ + ielem->nodeLine = xmlSAX2GetLineNumber(vctxt->parserCtxt); + ielem->localName = localname; + ielem->nsName = URI; + ielem->flags |= XML_SCHEMA_ELEM_INFO_EMPTY; + /* + * Register namespaces on the elem info. + */ + if (nb_namespaces != 0) { + /* + * Although the parser builds its own namespace list, + * we have no access to it, so we'll use an own one. + */ + for (i = 0, j = 0; i < nb_namespaces; i++, j += 2) { + /* + * Store prefix and namespace name. + */ + if (ielem->nsBindings == NULL) { + ielem->nsBindings = + (const xmlChar **) xmlMalloc(10 * + sizeof(const xmlChar *)); + if (ielem->nsBindings == NULL) { + xmlSchemaVErrMemory(vctxt, + "allocating namespace bindings for SAX validation", + NULL); + goto internal_error; + } + ielem->nbNsBindings = 0; + ielem->sizeNsBindings = 5; + } else if (ielem->sizeNsBindings <= ielem->nbNsBindings) { + ielem->sizeNsBindings *= 2; + ielem->nsBindings = + (const xmlChar **) xmlRealloc( + (void *) ielem->nsBindings, + ielem->sizeNsBindings * 2 * sizeof(const xmlChar *)); + if (ielem->nsBindings == NULL) { + xmlSchemaVErrMemory(vctxt, + "re-allocating namespace bindings for SAX validation", + NULL); + goto internal_error; + } + } + + ielem->nsBindings[ielem->nbNsBindings * 2] = namespaces[j]; + if (namespaces[j+1][0] == 0) { + /* + * Handle xmlns="". + */ + ielem->nsBindings[ielem->nbNsBindings * 2 + 1] = NULL; + } else + ielem->nsBindings[ielem->nbNsBindings * 2 + 1] = + namespaces[j+1]; + ielem->nbNsBindings++; + } + } + /* + * Register attributes. + * SAX VAL TODO: We are not adding namespace declaration + * attributes yet. + */ + if (nb_attributes != 0) { + xmlChar *value; + + for (j = 0, i = 0; i < nb_attributes; i++, j += 5) { + /* + * Duplicate the value. + */ + value = xmlStrndup(attributes[j+3], + attributes[j+4] - attributes[j+3]); + /* + * TODO: Set the node line. + */ + ret = xmlSchemaValidatorPushAttribute(vctxt, + NULL, ielem->nodeLine, attributes[j], attributes[j+2], 0, + value, 1); + if (ret == -1) { + VERROR_INT("xmlSchemaSAXHandleStartElementNs", + "calling xmlSchemaValidatorPushAttribute()"); + goto internal_error; + } + } + } + /* + * Validate the element. + */ + ret = xmlSchemaValidateElem(vctxt); + if (ret != 0) { + if (ret == -1) { + VERROR_INT("xmlSchemaSAXHandleStartElementNs", + "calling xmlSchemaValidateElem()"); + goto internal_error; + } + goto exit; + } + +exit: + return; +internal_error: + vctxt->err = -1; + xmlStopParser(vctxt->parserCtxt); + return; +} + +static void +xmlSchemaSAXHandleEndElementNs(void *ctx, + const xmlChar * localname ATTRIBUTE_UNUSED, + const xmlChar * prefix ATTRIBUTE_UNUSED, + const xmlChar * URI ATTRIBUTE_UNUSED) +{ + xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctx; + int res; + + /* + * Skip elements if inside a "skip" wildcard or if invalid. + */ + if (vctxt->skipDepth != -1) { + if (vctxt->depth > vctxt->skipDepth) { + vctxt->depth--; + return; + } else + vctxt->skipDepth = -1; + } + /* + * SAX VAL TODO: Just a temporary check. + */ + if ((!xmlStrEqual(vctxt->inode->localName, localname)) || + (!xmlStrEqual(vctxt->inode->nsName, URI))) { + VERROR_INT("xmlSchemaSAXHandleEndElementNs", + "elem pop mismatch"); + } + res = xmlSchemaValidatorPopElem(vctxt); + if (res != 0) { + if (res < 0) { + VERROR_INT("xmlSchemaSAXHandleEndElementNs", + "calling xmlSchemaValidatorPopElem()"); + goto internal_error; + } + goto exit; + } +exit: + return; +internal_error: + vctxt->err = -1; + xmlStopParser(vctxt->parserCtxt); + return; +} + +/************************************************************************ + * * + * Validation interfaces * + * * + ************************************************************************/ + +/** + * xmlSchemaNewValidCtxt: + * @schema: a precompiled XML Schemas + * + * Create an XML Schemas validation context based on the given schema. + * + * Returns the validation context or NULL in case of error + */ +xmlSchemaValidCtxtPtr +xmlSchemaNewValidCtxt(xmlSchemaPtr schema) +{ + xmlSchemaValidCtxtPtr ret; + + ret = (xmlSchemaValidCtxtPtr) xmlMalloc(sizeof(xmlSchemaValidCtxt)); + if (ret == NULL) { + xmlSchemaVErrMemory(NULL, "allocating validation context", NULL); + return (NULL); + } + memset(ret, 0, sizeof(xmlSchemaValidCtxt)); + ret->type = XML_SCHEMA_CTXT_VALIDATOR; + ret->dict = xmlDictCreate(); + ret->nodeQNames = xmlSchemaItemListCreate(); + ret->schema = schema; + return (ret); +} + +/** + * xmlSchemaValidateSetFilename: + * @vctxt: the schema validation context + * @filename: the file name + * + * Workaround to provide file error reporting information when this is + * not provided by current APIs + */ +void +xmlSchemaValidateSetFilename(xmlSchemaValidCtxtPtr vctxt, const char *filename) { + if (vctxt == NULL) + return; + if (vctxt->filename != NULL) + xmlFree(vctxt->filename); + if (filename != NULL) + vctxt->filename = (char *) xmlStrdup((const xmlChar *) filename); + else + vctxt->filename = NULL; +} + +/** + * xmlSchemaClearValidCtxt: + * @vctxt: the schema validation context + * + * Free the resources associated to the schema validation context; + * leaves some fields alive intended for reuse of the context. + */ +static void +xmlSchemaClearValidCtxt(xmlSchemaValidCtxtPtr vctxt) +{ + if (vctxt == NULL) + return; + + /* + * TODO: Should we clear the flags? + * Might be problematic if one reuses the context + * and assumes that the options remain the same. + */ + vctxt->flags = 0; + vctxt->validationRoot = NULL; + vctxt->doc = NULL; +#ifdef LIBXML_READER_ENABLED + vctxt->reader = NULL; +#endif + vctxt->hasKeyrefs = 0; + + if (vctxt->value != NULL) { + xmlSchemaFreeValue(vctxt->value); + vctxt->value = NULL; + } + /* + * Augmented IDC information. + */ + if (vctxt->aidcs != NULL) { + xmlSchemaIDCAugPtr cur = vctxt->aidcs, next; + do { + next = cur->next; + xmlFree(cur); + cur = next; + } while (cur != NULL); + vctxt->aidcs = NULL; + } + if (vctxt->idcMatcherCache != NULL) { + xmlSchemaIDCMatcherPtr matcher = vctxt->idcMatcherCache, tmp; + + while (matcher) { + tmp = matcher; + matcher = matcher->nextCached; + xmlSchemaIDCFreeMatcherList(tmp); + } + vctxt->idcMatcherCache = NULL; + } + + + if (vctxt->idcNodes != NULL) { + int i; + xmlSchemaPSVIIDCNodePtr item; + + for (i = 0; i < vctxt->nbIdcNodes; i++) { + item = vctxt->idcNodes[i]; + xmlFree(item->keys); + xmlFree(item); + } + xmlFree(vctxt->idcNodes); + vctxt->idcNodes = NULL; + vctxt->nbIdcNodes = 0; + vctxt->sizeIdcNodes = 0; + } + /* + * Note that we won't delete the XPath state pool here. + */ + if (vctxt->xpathStates != NULL) { + xmlSchemaFreeIDCStateObjList(vctxt->xpathStates); + vctxt->xpathStates = NULL; + } + /* + * Attribute info. + */ + if (vctxt->nbAttrInfos != 0) { + xmlSchemaClearAttrInfos(vctxt); + } + /* + * Element info. + */ + if (vctxt->elemInfos != NULL) { + int i; + xmlSchemaNodeInfoPtr ei; + + for (i = 0; i < vctxt->sizeElemInfos; i++) { + ei = vctxt->elemInfos[i]; + if (ei == NULL) + break; + xmlSchemaClearElemInfo(vctxt, ei); + } + } + xmlSchemaItemListClear(vctxt->nodeQNames); + /* Recreate the dict. */ + xmlDictFree(vctxt->dict); + /* + * TODO: Is is save to recreate it? Do we have a scenario + * where the user provides the dict? + */ + vctxt->dict = xmlDictCreate(); + + if (vctxt->filename != NULL) { + xmlFree(vctxt->filename); + vctxt->filename = NULL; + } +} + +/** + * xmlSchemaFreeValidCtxt: + * @ctxt: the schema validation context + * + * Free the resources associated to the schema validation context + */ +void +xmlSchemaFreeValidCtxt(xmlSchemaValidCtxtPtr ctxt) +{ + if (ctxt == NULL) + return; + if (ctxt->value != NULL) + xmlSchemaFreeValue(ctxt->value); + if (ctxt->pctxt != NULL) + xmlSchemaFreeParserCtxt(ctxt->pctxt); + if (ctxt->idcNodes != NULL) { + int i; + xmlSchemaPSVIIDCNodePtr item; + + for (i = 0; i < ctxt->nbIdcNodes; i++) { + item = ctxt->idcNodes[i]; + xmlFree(item->keys); + xmlFree(item); + } + xmlFree(ctxt->idcNodes); + } + if (ctxt->idcKeys != NULL) { + int i; + for (i = 0; i < ctxt->nbIdcKeys; i++) + xmlSchemaIDCFreeKey(ctxt->idcKeys[i]); + xmlFree(ctxt->idcKeys); + } + + if (ctxt->xpathStates != NULL) { + xmlSchemaFreeIDCStateObjList(ctxt->xpathStates); + ctxt->xpathStates = NULL; + } + if (ctxt->xpathStatePool != NULL) { + xmlSchemaFreeIDCStateObjList(ctxt->xpathStatePool); + ctxt->xpathStatePool = NULL; + } + + /* + * Augmented IDC information. + */ + if (ctxt->aidcs != NULL) { + xmlSchemaIDCAugPtr cur = ctxt->aidcs, next; + do { + next = cur->next; + xmlFree(cur); + cur = next; + } while (cur != NULL); + } + if (ctxt->attrInfos != NULL) { + int i; + xmlSchemaAttrInfoPtr attr; + + /* Just a paranoid call to the cleanup. */ + if (ctxt->nbAttrInfos != 0) + xmlSchemaClearAttrInfos(ctxt); + for (i = 0; i < ctxt->sizeAttrInfos; i++) { + attr = ctxt->attrInfos[i]; + xmlFree(attr); + } + xmlFree(ctxt->attrInfos); + } + if (ctxt->elemInfos != NULL) { + int i; + xmlSchemaNodeInfoPtr ei; + + for (i = 0; i < ctxt->sizeElemInfos; i++) { + ei = ctxt->elemInfos[i]; + if (ei == NULL) + break; + xmlSchemaClearElemInfo(ctxt, ei); + xmlFree(ei); + } + xmlFree(ctxt->elemInfos); + } + if (ctxt->nodeQNames != NULL) + xmlSchemaItemListFree(ctxt->nodeQNames); + if (ctxt->dict != NULL) + xmlDictFree(ctxt->dict); + if (ctxt->filename != NULL) + xmlFree(ctxt->filename); + xmlFree(ctxt); +} + +/** + * xmlSchemaIsValid: + * @ctxt: the schema validation context + * + * Check if any error was detected during validation. + * + * Returns 1 if valid so far, 0 if errors were detected, and -1 in case + * of internal error. + */ +int +xmlSchemaIsValid(xmlSchemaValidCtxtPtr ctxt) +{ + if (ctxt == NULL) + return(-1); + return(ctxt->err == 0); +} + +/** + * xmlSchemaSetValidErrors: + * @ctxt: a schema validation context + * @err: the error function + * @warn: the warning function + * @ctx: the functions context + * + * Set the error and warning callback informations + */ +void +xmlSchemaSetValidErrors(xmlSchemaValidCtxtPtr ctxt, + xmlSchemaValidityErrorFunc err, + xmlSchemaValidityWarningFunc warn, void *ctx) +{ + if (ctxt == NULL) + return; + ctxt->error = err; + ctxt->warning = warn; + ctxt->errCtxt = ctx; + if (ctxt->pctxt != NULL) + xmlSchemaSetParserErrors(ctxt->pctxt, err, warn, ctx); +} + +/** + * xmlSchemaSetValidStructuredErrors: + * @ctxt: a schema validation context + * @serror: the structured error function + * @ctx: the functions context + * + * Set the structured error callback + */ +void +xmlSchemaSetValidStructuredErrors(xmlSchemaValidCtxtPtr ctxt, + xmlStructuredErrorFunc serror, void *ctx) +{ + if (ctxt == NULL) + return; + ctxt->serror = serror; + ctxt->error = NULL; + ctxt->warning = NULL; + ctxt->errCtxt = ctx; + if (ctxt->pctxt != NULL) + xmlSchemaSetParserStructuredErrors(ctxt->pctxt, serror, ctx); +} + +/** + * xmlSchemaGetValidErrors: + * @ctxt: a XML-Schema validation context + * @err: the error function result + * @warn: the warning function result + * @ctx: the functions context result + * + * Get the error and warning callback informations + * + * Returns -1 in case of error and 0 otherwise + */ +int +xmlSchemaGetValidErrors(xmlSchemaValidCtxtPtr ctxt, + xmlSchemaValidityErrorFunc * err, + xmlSchemaValidityWarningFunc * warn, void **ctx) +{ + if (ctxt == NULL) + return (-1); + if (err != NULL) + *err = ctxt->error; + if (warn != NULL) + *warn = ctxt->warning; + if (ctx != NULL) + *ctx = ctxt->errCtxt; + return (0); +} + + +/** + * xmlSchemaSetValidOptions: + * @ctxt: a schema validation context + * @options: a combination of xmlSchemaValidOption + * + * Sets the options to be used during the validation. + * + * Returns 0 in case of success, -1 in case of an + * API error. + */ +int +xmlSchemaSetValidOptions(xmlSchemaValidCtxtPtr ctxt, + int options) + +{ + int i; + + if (ctxt == NULL) + return (-1); + /* + * WARNING: Change the start value if adding to the + * xmlSchemaValidOption. + * TODO: Is there an other, more easy to maintain, + * way? + */ + for (i = 1; i < (int) sizeof(int) * 8; i++) { + if (options & 1<options = options; + return (0); +} + +/** + * xmlSchemaValidCtxtGetOptions: + * @ctxt: a schema validation context + * + * Get the validation context options. + * + * Returns the option combination or -1 on error. + */ +int +xmlSchemaValidCtxtGetOptions(xmlSchemaValidCtxtPtr ctxt) + +{ + if (ctxt == NULL) + return (-1); + else + return (ctxt->options); +} + +static int +xmlSchemaVDocWalk(xmlSchemaValidCtxtPtr vctxt) +{ + xmlAttrPtr attr; + int ret = 0; + xmlSchemaNodeInfoPtr ielem = NULL; + xmlNodePtr node, valRoot; + const xmlChar *nsName; + + /* DOC VAL TODO: Move this to the start function. */ + if (vctxt->validationRoot != NULL) + valRoot = vctxt->validationRoot; + else + valRoot = xmlDocGetRootElement(vctxt->doc); + if (valRoot == NULL) { + /* VAL TODO: Error code? */ + VERROR(1, NULL, "The document has no document element"); + return (1); + } + vctxt->depth = -1; + vctxt->validationRoot = valRoot; + node = valRoot; + while (node != NULL) { + if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth)) + goto next_sibling; + if (node->type == XML_ELEMENT_NODE) { + + /* + * Init the node-info. + */ + vctxt->depth++; + if (xmlSchemaValidatorPushElem(vctxt) == -1) + goto internal_error; + ielem = vctxt->inode; + ielem->node = node; + ielem->nodeLine = node->line; + ielem->localName = node->name; + if (node->ns != NULL) + ielem->nsName = node->ns->href; + ielem->flags |= XML_SCHEMA_ELEM_INFO_EMPTY; + /* + * Register attributes. + * DOC VAL TODO: We do not register namespace declaration + * attributes yet. + */ + vctxt->nbAttrInfos = 0; + if (node->properties != NULL) { + attr = node->properties; + do { + if (attr->ns != NULL) + nsName = attr->ns->href; + else + nsName = NULL; + ret = xmlSchemaValidatorPushAttribute(vctxt, + (xmlNodePtr) attr, + /* + * Note that we give it the line number of the + * parent element. + */ + ielem->nodeLine, + attr->name, nsName, 0, + xmlNodeListGetString(attr->doc, attr->children, 1), 1); + if (ret == -1) { + VERROR_INT("xmlSchemaDocWalk", + "calling xmlSchemaValidatorPushAttribute()"); + goto internal_error; + } + attr = attr->next; + } while (attr); + } + /* + * Validate the element. + */ + ret = xmlSchemaValidateElem(vctxt); + if (ret != 0) { + if (ret == -1) { + VERROR_INT("xmlSchemaDocWalk", + "calling xmlSchemaValidateElem()"); + goto internal_error; + } + /* + * Don't stop validation; just skip the content + * of this element. + */ + goto leave_node; + } + if ((vctxt->skipDepth != -1) && + (vctxt->depth >= vctxt->skipDepth)) + goto leave_node; + } else if ((node->type == XML_TEXT_NODE) || + (node->type == XML_CDATA_SECTION_NODE)) { + /* + * Process character content. + */ + if ((ielem != NULL) && (ielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY)) + ielem->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY; + ret = xmlSchemaVPushText(vctxt, node->type, node->content, + -1, XML_SCHEMA_PUSH_TEXT_PERSIST, NULL); + if (ret < 0) { + VERROR_INT("xmlSchemaVDocWalk", + "calling xmlSchemaVPushText()"); + goto internal_error; + } + /* + * DOC VAL TODO: Should we skip further validation of the + * element content here? + */ + } else if ((node->type == XML_ENTITY_NODE) || + (node->type == XML_ENTITY_REF_NODE)) { + /* + * DOC VAL TODO: What to do with entities? + */ + VERROR_INT("xmlSchemaVDocWalk", + "there is at least one entity reference in the node-tree " + "currently being validated. Processing of entities with " + "this XML Schema processor is not supported (yet). Please " + "substitute entities before validation."); + goto internal_error; + } else { + goto leave_node; + /* + * DOC VAL TODO: XInclude nodes, etc. + */ + } + /* + * Walk the doc. + */ + if (node->children != NULL) { + node = node->children; + continue; + } +leave_node: + if (node->type == XML_ELEMENT_NODE) { + /* + * Leaving the scope of an element. + */ + if (node != vctxt->inode->node) { + VERROR_INT("xmlSchemaVDocWalk", + "element position mismatch"); + goto internal_error; + } + ret = xmlSchemaValidatorPopElem(vctxt); + if (ret != 0) { + if (ret < 0) { + VERROR_INT("xmlSchemaVDocWalk", + "calling xmlSchemaValidatorPopElem()"); + goto internal_error; + } + } + if (node == valRoot) + goto exit; + } +next_sibling: + if (node->next != NULL) + node = node->next; + else { + node = node->parent; + goto leave_node; + } + } + +exit: + return (ret); +internal_error: + return (-1); +} + +static int +xmlSchemaPreRun(xmlSchemaValidCtxtPtr vctxt) { + /* + * Some initialization. + */ + vctxt->err = 0; + vctxt->nberrors = 0; + vctxt->depth = -1; + vctxt->skipDepth = -1; + vctxt->xsiAssemble = 0; + vctxt->hasKeyrefs = 0; +#ifdef ENABLE_IDC_NODE_TABLES_TEST + vctxt->createIDCNodeTables = 1; +#else + vctxt->createIDCNodeTables = 0; +#endif + /* + * Create a schema + parser if necessary. + */ + if (vctxt->schema == NULL) { + xmlSchemaParserCtxtPtr pctxt; + + vctxt->xsiAssemble = 1; + /* + * If not schema was given then we will create a schema + * dynamically using XSI schema locations. + * + * Create the schema parser context. + */ + if ((vctxt->pctxt == NULL) && + (xmlSchemaCreatePCtxtOnVCtxt(vctxt) == -1)) + return (-1); + pctxt = vctxt->pctxt; + pctxt->xsiAssemble = 1; + /* + * Create the schema. + */ + vctxt->schema = xmlSchemaNewSchema(pctxt); + if (vctxt->schema == NULL) + return (-1); + /* + * Create the schema construction context. + */ + pctxt->constructor = xmlSchemaConstructionCtxtCreate(pctxt->dict); + if (pctxt->constructor == NULL) + return(-1); + pctxt->constructor->mainSchema = vctxt->schema; + /* + * Take ownership of the constructor to be able to free it. + */ + pctxt->ownsConstructor = 1; + } + /* + * Augment the IDC definitions for the main schema and all imported ones + * NOTE: main schema if the first in the imported list + */ + xmlHashScan(vctxt->schema->schemasImports,(xmlHashScanner)xmlSchemaAugmentImportedIDC, vctxt); + + return(0); +} + +static void +xmlSchemaPostRun(xmlSchemaValidCtxtPtr vctxt) { + if (vctxt->xsiAssemble) { + if (vctxt->schema != NULL) { + xmlSchemaFree(vctxt->schema); + vctxt->schema = NULL; + } + } + xmlSchemaClearValidCtxt(vctxt); +} + +static int +xmlSchemaVStart(xmlSchemaValidCtxtPtr vctxt) +{ + int ret = 0; + + if (xmlSchemaPreRun(vctxt) < 0) + return(-1); + + if (vctxt->doc != NULL) { + /* + * Tree validation. + */ + ret = xmlSchemaVDocWalk(vctxt); +#ifdef LIBXML_READER_ENABLED + } else if (vctxt->reader != NULL) { + /* + * XML Reader validation. + */ +#ifdef XML_SCHEMA_READER_ENABLED + ret = xmlSchemaVReaderWalk(vctxt); +#endif +#endif + } else if ((vctxt->sax != NULL) && (vctxt->parserCtxt != NULL)) { + /* + * SAX validation. + */ + ret = xmlParseDocument(vctxt->parserCtxt); + } else { + VERROR_INT("xmlSchemaVStart", + "no instance to validate"); + ret = -1; + } + + xmlSchemaPostRun(vctxt); + if (ret == 0) + ret = vctxt->err; + return (ret); +} + +/** + * xmlSchemaValidateOneElement: + * @ctxt: a schema validation context + * @elem: an element node + * + * Validate a branch of a tree, starting with the given @elem. + * + * Returns 0 if the element and its subtree is valid, a positive error + * code number otherwise and -1 in case of an internal or API error. + */ +int +xmlSchemaValidateOneElement(xmlSchemaValidCtxtPtr ctxt, xmlNodePtr elem) +{ + if ((ctxt == NULL) || (elem == NULL) || (elem->type != XML_ELEMENT_NODE)) + return (-1); + + if (ctxt->schema == NULL) + return (-1); + + ctxt->doc = elem->doc; + ctxt->node = elem; + ctxt->validationRoot = elem; + return(xmlSchemaVStart(ctxt)); +} + +/** + * xmlSchemaValidateDoc: + * @ctxt: a schema validation context + * @doc: a parsed document tree + * + * Validate a document tree in memory. + * + * Returns 0 if the document is schemas valid, a positive error code + * number otherwise and -1 in case of internal or API error. + */ +int +xmlSchemaValidateDoc(xmlSchemaValidCtxtPtr ctxt, xmlDocPtr doc) +{ + if ((ctxt == NULL) || (doc == NULL)) + return (-1); + + ctxt->doc = doc; + ctxt->node = xmlDocGetRootElement(doc); + if (ctxt->node == NULL) { + xmlSchemaCustomErr(ACTXT_CAST ctxt, + XML_SCHEMAV_DOCUMENT_ELEMENT_MISSING, + (xmlNodePtr) doc, NULL, + "The document has no document element", NULL, NULL); + return (ctxt->err); + } + ctxt->validationRoot = ctxt->node; + return (xmlSchemaVStart(ctxt)); +} + + +/************************************************************************ + * * + * Function and data for SAX streaming API * + * * + ************************************************************************/ +typedef struct _xmlSchemaSplitSAXData xmlSchemaSplitSAXData; +typedef xmlSchemaSplitSAXData *xmlSchemaSplitSAXDataPtr; + +struct _xmlSchemaSplitSAXData { + xmlSAXHandlerPtr user_sax; + void *user_data; + xmlSchemaValidCtxtPtr ctxt; + xmlSAXHandlerPtr schemas_sax; +}; + +#define XML_SAX_PLUG_MAGIC 0xdc43ba21 + +struct _xmlSchemaSAXPlug { + unsigned int magic; + + /* the original callbacks informations */ + xmlSAXHandlerPtr *user_sax_ptr; + xmlSAXHandlerPtr user_sax; + void **user_data_ptr; + void *user_data; + + /* the block plugged back and validation informations */ + xmlSAXHandler schemas_sax; + xmlSchemaValidCtxtPtr ctxt; +}; + +/* All those functions just bounces to the user provided SAX handlers */ +static void +internalSubsetSplit(void *ctx, const xmlChar *name, + const xmlChar *ExternalID, const xmlChar *SystemID) +{ + xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; + if ((ctxt != NULL) && (ctxt->user_sax != NULL) && + (ctxt->user_sax->internalSubset != NULL)) + ctxt->user_sax->internalSubset(ctxt->user_data, name, ExternalID, + SystemID); +} + +static int +isStandaloneSplit(void *ctx) +{ + xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; + if ((ctxt != NULL) && (ctxt->user_sax != NULL) && + (ctxt->user_sax->isStandalone != NULL)) + return(ctxt->user_sax->isStandalone(ctxt->user_data)); + return(0); +} + +static int +hasInternalSubsetSplit(void *ctx) +{ + xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; + if ((ctxt != NULL) && (ctxt->user_sax != NULL) && + (ctxt->user_sax->hasInternalSubset != NULL)) + return(ctxt->user_sax->hasInternalSubset(ctxt->user_data)); + return(0); +} + +static int +hasExternalSubsetSplit(void *ctx) +{ + xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; + if ((ctxt != NULL) && (ctxt->user_sax != NULL) && + (ctxt->user_sax->hasExternalSubset != NULL)) + return(ctxt->user_sax->hasExternalSubset(ctxt->user_data)); + return(0); +} + +static void +externalSubsetSplit(void *ctx, const xmlChar *name, + const xmlChar *ExternalID, const xmlChar *SystemID) +{ + xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; + if ((ctxt != NULL) && (ctxt->user_sax != NULL) && + (ctxt->user_sax->externalSubset != NULL)) + ctxt->user_sax->externalSubset(ctxt->user_data, name, ExternalID, + SystemID); +} + +static xmlParserInputPtr +resolveEntitySplit(void *ctx, const xmlChar *publicId, const xmlChar *systemId) +{ + xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; + if ((ctxt != NULL) && (ctxt->user_sax != NULL) && + (ctxt->user_sax->resolveEntity != NULL)) + return(ctxt->user_sax->resolveEntity(ctxt->user_data, publicId, + systemId)); + return(NULL); +} + +static xmlEntityPtr +getEntitySplit(void *ctx, const xmlChar *name) +{ + xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; + if ((ctxt != NULL) && (ctxt->user_sax != NULL) && + (ctxt->user_sax->getEntity != NULL)) + return(ctxt->user_sax->getEntity(ctxt->user_data, name)); + return(NULL); +} + +static xmlEntityPtr +getParameterEntitySplit(void *ctx, const xmlChar *name) +{ + xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; + if ((ctxt != NULL) && (ctxt->user_sax != NULL) && + (ctxt->user_sax->getParameterEntity != NULL)) + return(ctxt->user_sax->getParameterEntity(ctxt->user_data, name)); + return(NULL); +} + + +static void +entityDeclSplit(void *ctx, const xmlChar *name, int type, + const xmlChar *publicId, const xmlChar *systemId, xmlChar *content) +{ + xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; + if ((ctxt != NULL) && (ctxt->user_sax != NULL) && + (ctxt->user_sax->entityDecl != NULL)) + ctxt->user_sax->entityDecl(ctxt->user_data, name, type, publicId, + systemId, content); +} + +static void +attributeDeclSplit(void *ctx, const xmlChar * elem, + const xmlChar * name, int type, int def, + const xmlChar * defaultValue, xmlEnumerationPtr tree) +{ + xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; + if ((ctxt != NULL) && (ctxt->user_sax != NULL) && + (ctxt->user_sax->attributeDecl != NULL)) { + ctxt->user_sax->attributeDecl(ctxt->user_data, elem, name, type, + def, defaultValue, tree); + } else { + xmlFreeEnumeration(tree); + } +} + +static void +elementDeclSplit(void *ctx, const xmlChar *name, int type, + xmlElementContentPtr content) +{ + xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; + if ((ctxt != NULL) && (ctxt->user_sax != NULL) && + (ctxt->user_sax->elementDecl != NULL)) + ctxt->user_sax->elementDecl(ctxt->user_data, name, type, content); +} + +static void +notationDeclSplit(void *ctx, const xmlChar *name, + const xmlChar *publicId, const xmlChar *systemId) +{ + xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; + if ((ctxt != NULL) && (ctxt->user_sax != NULL) && + (ctxt->user_sax->notationDecl != NULL)) + ctxt->user_sax->notationDecl(ctxt->user_data, name, publicId, + systemId); +} + +static void +unparsedEntityDeclSplit(void *ctx, const xmlChar *name, + const xmlChar *publicId, const xmlChar *systemId, + const xmlChar *notationName) +{ + xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; + if ((ctxt != NULL) && (ctxt->user_sax != NULL) && + (ctxt->user_sax->unparsedEntityDecl != NULL)) + ctxt->user_sax->unparsedEntityDecl(ctxt->user_data, name, publicId, + systemId, notationName); +} + +static void +setDocumentLocatorSplit(void *ctx, xmlSAXLocatorPtr loc) +{ + xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; + if ((ctxt != NULL) && (ctxt->user_sax != NULL) && + (ctxt->user_sax->setDocumentLocator != NULL)) + ctxt->user_sax->setDocumentLocator(ctxt->user_data, loc); +} + +static void +startDocumentSplit(void *ctx) +{ + xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; + if ((ctxt != NULL) && (ctxt->user_sax != NULL) && + (ctxt->user_sax->startDocument != NULL)) + ctxt->user_sax->startDocument(ctxt->user_data); +} + +static void +endDocumentSplit(void *ctx) +{ + xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; + if ((ctxt != NULL) && (ctxt->user_sax != NULL) && + (ctxt->user_sax->endDocument != NULL)) + ctxt->user_sax->endDocument(ctxt->user_data); +} + +static void +processingInstructionSplit(void *ctx, const xmlChar *target, + const xmlChar *data) +{ + xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; + if ((ctxt != NULL) && (ctxt->user_sax != NULL) && + (ctxt->user_sax->processingInstruction != NULL)) + ctxt->user_sax->processingInstruction(ctxt->user_data, target, data); +} + +static void +commentSplit(void *ctx, const xmlChar *value) +{ + xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; + if ((ctxt != NULL) && (ctxt->user_sax != NULL) && + (ctxt->user_sax->comment != NULL)) + ctxt->user_sax->comment(ctxt->user_data, value); +} + +/* + * Varargs error callbacks to the user application, harder ... + */ + +static void XMLCDECL +warningSplit(void *ctx, const char *msg ATTRIBUTE_UNUSED, ...) { + xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; + if ((ctxt != NULL) && (ctxt->user_sax != NULL) && + (ctxt->user_sax->warning != NULL)) { + TODO + } +} +static void XMLCDECL +errorSplit(void *ctx, const char *msg ATTRIBUTE_UNUSED, ...) { + xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; + if ((ctxt != NULL) && (ctxt->user_sax != NULL) && + (ctxt->user_sax->error != NULL)) { + TODO + } +} +static void XMLCDECL +fatalErrorSplit(void *ctx, const char *msg ATTRIBUTE_UNUSED, ...) { + xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; + if ((ctxt != NULL) && (ctxt->user_sax != NULL) && + (ctxt->user_sax->fatalError != NULL)) { + TODO + } +} + +/* + * Those are function where both the user handler and the schemas handler + * need to be called. + */ +static void +charactersSplit(void *ctx, const xmlChar *ch, int len) +{ + xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; + if (ctxt == NULL) + return; + if ((ctxt->user_sax != NULL) && (ctxt->user_sax->characters != NULL)) + ctxt->user_sax->characters(ctxt->user_data, ch, len); + if (ctxt->ctxt != NULL) + xmlSchemaSAXHandleText(ctxt->ctxt, ch, len); +} + +static void +ignorableWhitespaceSplit(void *ctx, const xmlChar *ch, int len) +{ + xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; + if (ctxt == NULL) + return; + if ((ctxt->user_sax != NULL) && + (ctxt->user_sax->ignorableWhitespace != NULL)) + ctxt->user_sax->ignorableWhitespace(ctxt->user_data, ch, len); + if (ctxt->ctxt != NULL) + xmlSchemaSAXHandleText(ctxt->ctxt, ch, len); +} + +static void +cdataBlockSplit(void *ctx, const xmlChar *value, int len) +{ + xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; + if (ctxt == NULL) + return; + if ((ctxt->user_sax != NULL) && + (ctxt->user_sax->cdataBlock != NULL)) + ctxt->user_sax->cdataBlock(ctxt->user_data, value, len); + if (ctxt->ctxt != NULL) + xmlSchemaSAXHandleCDataSection(ctxt->ctxt, value, len); +} + +static void +referenceSplit(void *ctx, const xmlChar *name) +{ + xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; + if (ctxt == NULL) + return; + if ((ctxt != NULL) && (ctxt->user_sax != NULL) && + (ctxt->user_sax->reference != NULL)) + ctxt->user_sax->reference(ctxt->user_data, name); + if (ctxt->ctxt != NULL) + xmlSchemaSAXHandleReference(ctxt->user_data, name); +} + +static void +startElementNsSplit(void *ctx, const xmlChar * localname, + const xmlChar * prefix, const xmlChar * URI, + int nb_namespaces, const xmlChar ** namespaces, + int nb_attributes, int nb_defaulted, + const xmlChar ** attributes) { + xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; + if (ctxt == NULL) + return; + if ((ctxt->user_sax != NULL) && + (ctxt->user_sax->startElementNs != NULL)) + ctxt->user_sax->startElementNs(ctxt->user_data, localname, prefix, + URI, nb_namespaces, namespaces, + nb_attributes, nb_defaulted, + attributes); + if (ctxt->ctxt != NULL) + xmlSchemaSAXHandleStartElementNs(ctxt->ctxt, localname, prefix, + URI, nb_namespaces, namespaces, + nb_attributes, nb_defaulted, + attributes); +} + +static void +endElementNsSplit(void *ctx, const xmlChar * localname, + const xmlChar * prefix, const xmlChar * URI) { + xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx; + if (ctxt == NULL) + return; + if ((ctxt->user_sax != NULL) && + (ctxt->user_sax->endElementNs != NULL)) + ctxt->user_sax->endElementNs(ctxt->user_data, localname, prefix, URI); + if (ctxt->ctxt != NULL) + xmlSchemaSAXHandleEndElementNs(ctxt->ctxt, localname, prefix, URI); +} + +/** + * xmlSchemaSAXPlug: + * @ctxt: a schema validation context + * @sax: a pointer to the original xmlSAXHandlerPtr + * @user_data: a pointer to the original SAX user data pointer + * + * Plug a SAX based validation layer in a SAX parsing event flow. + * The original @saxptr and @dataptr data are replaced by new pointers + * but the calls to the original will be maintained. + * + * Returns a pointer to a data structure needed to unplug the validation layer + * or NULL in case of errors. + */ +xmlSchemaSAXPlugPtr +xmlSchemaSAXPlug(xmlSchemaValidCtxtPtr ctxt, + xmlSAXHandlerPtr *sax, void **user_data) +{ + xmlSchemaSAXPlugPtr ret; + xmlSAXHandlerPtr old_sax; + + if ((ctxt == NULL) || (sax == NULL) || (user_data == NULL)) + return(NULL); + + /* + * We only allow to plug into SAX2 event streams + */ + old_sax = *sax; + if ((old_sax != NULL) && (old_sax->initialized != XML_SAX2_MAGIC)) + return(NULL); + if ((old_sax != NULL) && + (old_sax->startElementNs == NULL) && (old_sax->endElementNs == NULL) && + ((old_sax->startElement != NULL) || (old_sax->endElement != NULL))) + return(NULL); + + /* + * everything seems right allocate the local data needed for that layer + */ + ret = (xmlSchemaSAXPlugPtr) xmlMalloc(sizeof(xmlSchemaSAXPlugStruct)); + if (ret == NULL) { + return(NULL); + } + memset(ret, 0, sizeof(xmlSchemaSAXPlugStruct)); + ret->magic = XML_SAX_PLUG_MAGIC; + ret->schemas_sax.initialized = XML_SAX2_MAGIC; + ret->ctxt = ctxt; + ret->user_sax_ptr = sax; + ret->user_sax = old_sax; + if (old_sax == NULL) { + /* + * go direct, no need for the split block and functions. + */ + ret->schemas_sax.startElementNs = xmlSchemaSAXHandleStartElementNs; + ret->schemas_sax.endElementNs = xmlSchemaSAXHandleEndElementNs; + /* + * Note that we use the same text-function for both, to prevent + * the parser from testing for ignorable whitespace. + */ + ret->schemas_sax.ignorableWhitespace = xmlSchemaSAXHandleText; + ret->schemas_sax.characters = xmlSchemaSAXHandleText; + + ret->schemas_sax.cdataBlock = xmlSchemaSAXHandleCDataSection; + ret->schemas_sax.reference = xmlSchemaSAXHandleReference; + + ret->user_data = ctxt; + *user_data = ctxt; + } else { + /* + * for each callback unused by Schemas initialize it to the Split + * routine only if non NULL in the user block, this can speed up + * things at the SAX level. + */ + if (old_sax->internalSubset != NULL) + ret->schemas_sax.internalSubset = internalSubsetSplit; + if (old_sax->isStandalone != NULL) + ret->schemas_sax.isStandalone = isStandaloneSplit; + if (old_sax->hasInternalSubset != NULL) + ret->schemas_sax.hasInternalSubset = hasInternalSubsetSplit; + if (old_sax->hasExternalSubset != NULL) + ret->schemas_sax.hasExternalSubset = hasExternalSubsetSplit; + if (old_sax->resolveEntity != NULL) + ret->schemas_sax.resolveEntity = resolveEntitySplit; + if (old_sax->getEntity != NULL) + ret->schemas_sax.getEntity = getEntitySplit; + if (old_sax->entityDecl != NULL) + ret->schemas_sax.entityDecl = entityDeclSplit; + if (old_sax->notationDecl != NULL) + ret->schemas_sax.notationDecl = notationDeclSplit; + if (old_sax->attributeDecl != NULL) + ret->schemas_sax.attributeDecl = attributeDeclSplit; + if (old_sax->elementDecl != NULL) + ret->schemas_sax.elementDecl = elementDeclSplit; + if (old_sax->unparsedEntityDecl != NULL) + ret->schemas_sax.unparsedEntityDecl = unparsedEntityDeclSplit; + if (old_sax->setDocumentLocator != NULL) + ret->schemas_sax.setDocumentLocator = setDocumentLocatorSplit; + if (old_sax->startDocument != NULL) + ret->schemas_sax.startDocument = startDocumentSplit; + if (old_sax->endDocument != NULL) + ret->schemas_sax.endDocument = endDocumentSplit; + if (old_sax->processingInstruction != NULL) + ret->schemas_sax.processingInstruction = processingInstructionSplit; + if (old_sax->comment != NULL) + ret->schemas_sax.comment = commentSplit; + if (old_sax->warning != NULL) + ret->schemas_sax.warning = warningSplit; + if (old_sax->error != NULL) + ret->schemas_sax.error = errorSplit; + if (old_sax->fatalError != NULL) + ret->schemas_sax.fatalError = fatalErrorSplit; + if (old_sax->getParameterEntity != NULL) + ret->schemas_sax.getParameterEntity = getParameterEntitySplit; + if (old_sax->externalSubset != NULL) + ret->schemas_sax.externalSubset = externalSubsetSplit; + + /* + * the 6 schemas callback have to go to the splitter functions + * Note that we use the same text-function for ignorableWhitespace + * if possible, to prevent the parser from testing for ignorable + * whitespace. + */ + ret->schemas_sax.characters = charactersSplit; + if ((old_sax->ignorableWhitespace != NULL) && + (old_sax->ignorableWhitespace != old_sax->characters)) + ret->schemas_sax.ignorableWhitespace = ignorableWhitespaceSplit; + else + ret->schemas_sax.ignorableWhitespace = charactersSplit; + ret->schemas_sax.cdataBlock = cdataBlockSplit; + ret->schemas_sax.reference = referenceSplit; + ret->schemas_sax.startElementNs = startElementNsSplit; + ret->schemas_sax.endElementNs = endElementNsSplit; + + ret->user_data_ptr = user_data; + ret->user_data = *user_data; + *user_data = ret; + } + + /* + * plug the pointers back. + */ + *sax = &(ret->schemas_sax); + ctxt->sax = *sax; + ctxt->flags |= XML_SCHEMA_VALID_CTXT_FLAG_STREAM; + xmlSchemaPreRun(ctxt); + return(ret); +} + +/** + * xmlSchemaSAXUnplug: + * @plug: a data structure returned by xmlSchemaSAXPlug + * + * Unplug a SAX based validation layer in a SAX parsing event flow. + * The original pointers used in the call are restored. + * + * Returns 0 in case of success and -1 in case of failure. + */ +int +xmlSchemaSAXUnplug(xmlSchemaSAXPlugPtr plug) +{ + xmlSAXHandlerPtr *sax; + void **user_data; + + if ((plug == NULL) || (plug->magic != XML_SAX_PLUG_MAGIC)) + return(-1); + plug->magic = 0; + + xmlSchemaPostRun(plug->ctxt); + /* restore the data */ + sax = plug->user_sax_ptr; + *sax = plug->user_sax; + if (plug->user_sax != NULL) { + user_data = plug->user_data_ptr; + *user_data = plug->user_data; + } + + /* free and return */ + xmlFree(plug); + return(0); +} + +/** + * xmlSchemaValidateSetLocator: + * @vctxt: a schema validation context + * @f: the locator function pointer + * @ctxt: the locator context + * + * Allows to set a locator function to the validation context, + * which will be used to provide file and line information since + * those are not provided as part of the SAX validation flow + * Setting @f to NULL disable the locator. + */ + +void +xmlSchemaValidateSetLocator(xmlSchemaValidCtxtPtr vctxt, + xmlSchemaValidityLocatorFunc f, + void *ctxt) +{ + if (vctxt == NULL) return; + vctxt->locFunc = f; + vctxt->locCtxt = ctxt; +} + +/** + * xmlSchemaValidateStreamLocator: + * @ctx: the xmlTextReaderPtr used + * @file: returned file information + * @line: returned line information + * + * Internal locator function for the readers + * + * Returns 0 in case the Schema validation could be (des)activated and + * -1 in case of error. + */ +static int +xmlSchemaValidateStreamLocator(void *ctx, const char **file, + unsigned long *line) { + xmlParserCtxtPtr ctxt; + + if ((ctx == NULL) || ((file == NULL) && (line == NULL))) + return(-1); + + if (file != NULL) + *file = NULL; + if (line != NULL) + *line = 0; + + ctxt = (xmlParserCtxtPtr) ctx; + if (ctxt->input != NULL) { + if (file != NULL) + *file = ctxt->input->filename; + if (line != NULL) + *line = ctxt->input->line; + return(0); + } + return(-1); +} + +/** + * xmlSchemaValidateStream: + * @ctxt: a schema validation context + * @input: the input to use for reading the data + * @enc: an optional encoding information + * @sax: a SAX handler for the resulting events + * @user_data: the context to provide to the SAX handler. + * + * Validate an input based on a flow of SAX event from the parser + * and forward the events to the @sax handler with the provided @user_data + * the user provided @sax handler must be a SAX2 one. + * + * Returns 0 if the document is schemas valid, a positive error code + * number otherwise and -1 in case of internal or API error. + */ +int +xmlSchemaValidateStream(xmlSchemaValidCtxtPtr ctxt, + xmlParserInputBufferPtr input, xmlCharEncoding enc, + xmlSAXHandlerPtr sax, void *user_data) +{ + xmlSchemaSAXPlugPtr plug = NULL; + xmlSAXHandlerPtr old_sax = NULL; + xmlParserCtxtPtr pctxt = NULL; + xmlParserInputPtr inputStream = NULL; + int ret; + + if ((ctxt == NULL) || (input == NULL)) + return (-1); + + /* + * prepare the parser + */ + pctxt = xmlNewParserCtxt(); + if (pctxt == NULL) + return (-1); + old_sax = pctxt->sax; + pctxt->sax = sax; + pctxt->userData = user_data; +#if 0 + if (options) + xmlCtxtUseOptions(pctxt, options); +#endif + pctxt->linenumbers = 1; + xmlSchemaValidateSetLocator(ctxt, xmlSchemaValidateStreamLocator, pctxt); + + inputStream = xmlNewIOInputStream(pctxt, input, enc);; + if (inputStream == NULL) { + ret = -1; + goto done; + } + inputPush(pctxt, inputStream); + ctxt->parserCtxt = pctxt; + ctxt->input = input; + + /* + * Plug the validation and launch the parsing + */ + plug = xmlSchemaSAXPlug(ctxt, &(pctxt->sax), &(pctxt->userData)); + if (plug == NULL) { + ret = -1; + goto done; + } + ctxt->input = input; + ctxt->enc = enc; + ctxt->sax = pctxt->sax; + ctxt->flags |= XML_SCHEMA_VALID_CTXT_FLAG_STREAM; + ret = xmlSchemaVStart(ctxt); + + if ((ret == 0) && (! ctxt->parserCtxt->wellFormed)) { + ret = ctxt->parserCtxt->errNo; + if (ret == 0) + ret = 1; + } + +done: + ctxt->parserCtxt = NULL; + ctxt->sax = NULL; + ctxt->input = NULL; + if (plug != NULL) { + xmlSchemaSAXUnplug(plug); + } + /* cleanup */ + if (pctxt != NULL) { + pctxt->sax = old_sax; + xmlFreeParserCtxt(pctxt); + } + return (ret); +} + +/** + * xmlSchemaValidateFile: + * @ctxt: a schema validation context + * @filename: the URI of the instance + * @options: a future set of options, currently unused + * + * Do a schemas validation of the given resource, it will use the + * SAX streamable validation internally. + * + * Returns 0 if the document is valid, a positive error code + * number otherwise and -1 in case of an internal or API error. + */ +int +xmlSchemaValidateFile(xmlSchemaValidCtxtPtr ctxt, + const char * filename, + int options ATTRIBUTE_UNUSED) +{ + int ret; + xmlParserInputBufferPtr input; + + if ((ctxt == NULL) || (filename == NULL)) + return (-1); + + input = xmlParserInputBufferCreateFilename(filename, + XML_CHAR_ENCODING_NONE); + if (input == NULL) + return (-1); + ret = xmlSchemaValidateStream(ctxt, input, XML_CHAR_ENCODING_NONE, + NULL, NULL); + return (ret); +} + +/** + * xmlSchemaValidCtxtGetParserCtxt: + * @ctxt: a schema validation context + * + * allow access to the parser context of the schema validation context + * + * Returns the parser context of the schema validation context or NULL + * in case of error. + */ +xmlParserCtxtPtr +xmlSchemaValidCtxtGetParserCtxt(xmlSchemaValidCtxtPtr ctxt) +{ + if (ctxt == NULL) + return(NULL); + return (ctxt->parserCtxt); +} + +#define bottom_xmlschemas +#include "elfgcchack.h" +#endif /* LIBXML_SCHEMAS_ENABLED */ diff --git a/vendors/libxml/src/xmlschemastypes.c b/vendors/libxml/src/xmlschemastypes.c new file mode 100644 index 0000000..a9edc03 --- /dev/null +++ b/vendors/libxml/src/xmlschemastypes.c @@ -0,0 +1,6134 @@ +/* + * schemastypes.c : implementation of the XML Schema Datatypes + * definition and validity checking + * + * See Copyright for the status of this software. + * + * Daniel Veillard + */ + +#define IN_LIBXML +#include "libxml.h" + +#ifdef LIBXML_SCHEMAS_ENABLED + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#ifdef HAVE_MATH_H +#include +#endif +#ifdef HAVE_FLOAT_H +#include +#endif + +#define DEBUG + +#ifndef LIBXML_XPATH_ENABLED +extern double xmlXPathNAN; +extern double xmlXPathPINF; +extern double xmlXPathNINF; +#endif + +#define TODO \ + xmlGenericError(xmlGenericErrorContext, \ + "Unimplemented block at %s:%d\n", \ + __FILE__, __LINE__); + +#define XML_SCHEMAS_NAMESPACE_NAME \ + (const xmlChar *)"http://www.w3.org/2001/XMLSchema" + +#define IS_WSP_REPLACE_CH(c) ((((c) == 0x9) || ((c) == 0xa)) || \ + ((c) == 0xd)) + +#define IS_WSP_SPACE_CH(c) ((c) == 0x20) + +#define IS_WSP_BLANK_CH(c) IS_BLANK_CH(c) + +/* Date value */ +typedef struct _xmlSchemaValDate xmlSchemaValDate; +typedef xmlSchemaValDate *xmlSchemaValDatePtr; +struct _xmlSchemaValDate { + long year; + unsigned int mon :4; /* 1 <= mon <= 12 */ + unsigned int day :5; /* 1 <= day <= 31 */ + unsigned int hour :5; /* 0 <= hour <= 23 */ + unsigned int min :6; /* 0 <= min <= 59 */ + double sec; + unsigned int tz_flag :1; /* is tzo explicitely set? */ + signed int tzo :12; /* -1440 <= tzo <= 1440; + currently only -840 to +840 are needed */ +}; + +/* Duration value */ +typedef struct _xmlSchemaValDuration xmlSchemaValDuration; +typedef xmlSchemaValDuration *xmlSchemaValDurationPtr; +struct _xmlSchemaValDuration { + long mon; /* mon stores years also */ + long day; + double sec; /* sec stores min and hour also */ +}; + +typedef struct _xmlSchemaValDecimal xmlSchemaValDecimal; +typedef xmlSchemaValDecimal *xmlSchemaValDecimalPtr; +struct _xmlSchemaValDecimal { + /* would use long long but not portable */ + unsigned long lo; + unsigned long mi; + unsigned long hi; + unsigned int extra; + unsigned int sign:1; + unsigned int frac:7; + unsigned int total:8; +}; + +typedef struct _xmlSchemaValQName xmlSchemaValQName; +typedef xmlSchemaValQName *xmlSchemaValQNamePtr; +struct _xmlSchemaValQName { + xmlChar *name; + xmlChar *uri; +}; + +typedef struct _xmlSchemaValHex xmlSchemaValHex; +typedef xmlSchemaValHex *xmlSchemaValHexPtr; +struct _xmlSchemaValHex { + xmlChar *str; + unsigned int total; +}; + +typedef struct _xmlSchemaValBase64 xmlSchemaValBase64; +typedef xmlSchemaValBase64 *xmlSchemaValBase64Ptr; +struct _xmlSchemaValBase64 { + xmlChar *str; + unsigned int total; +}; + +struct _xmlSchemaVal { + xmlSchemaValType type; + struct _xmlSchemaVal *next; + union { + xmlSchemaValDecimal decimal; + xmlSchemaValDate date; + xmlSchemaValDuration dur; + xmlSchemaValQName qname; + xmlSchemaValHex hex; + xmlSchemaValBase64 base64; + float f; + double d; + int b; + xmlChar *str; + } value; +}; + +static int xmlSchemaTypesInitialized = 0; +static xmlHashTablePtr xmlSchemaTypesBank = NULL; + +/* + * Basic types + */ +static xmlSchemaTypePtr xmlSchemaTypeStringDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeAnyTypeDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeAnySimpleTypeDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeDecimalDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeDatetimeDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeDateDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeTimeDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeGYearDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeGYearMonthDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeGDayDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeGMonthDayDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeGMonthDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeDurationDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeFloatDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeBooleanDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeDoubleDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeHexBinaryDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeBase64BinaryDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeAnyURIDef = NULL; + +/* + * Derived types + */ +static xmlSchemaTypePtr xmlSchemaTypePositiveIntegerDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeNonPositiveIntegerDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeNegativeIntegerDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeNonNegativeIntegerDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeIntegerDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeLongDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeIntDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeShortDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeByteDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeUnsignedLongDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeUnsignedIntDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeUnsignedShortDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeUnsignedByteDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeNormStringDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeTokenDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeLanguageDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeNameDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeQNameDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeNCNameDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeIdDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeIdrefDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeIdrefsDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeEntityDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeEntitiesDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeNotationDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeNmtokenDef = NULL; +static xmlSchemaTypePtr xmlSchemaTypeNmtokensDef = NULL; + +/************************************************************************ + * * + * Datatype error handlers * + * * + ************************************************************************/ +/** + * xmlSchemaTypeErrMemory: + * @extra: extra informations + * + * Handle an out of memory condition + */ +static void +xmlSchemaTypeErrMemory(xmlNodePtr node, const char *extra) +{ + __xmlSimpleError(XML_FROM_DATATYPE, XML_ERR_NO_MEMORY, node, NULL, extra); +} + +/************************************************************************ + * * + * Base types support * + * * + ************************************************************************/ + +/** + * xmlSchemaNewValue: + * @type: the value type + * + * Allocate a new simple type value + * + * Returns a pointer to the new value or NULL in case of error + */ +static xmlSchemaValPtr +xmlSchemaNewValue(xmlSchemaValType type) { + xmlSchemaValPtr value; + + value = (xmlSchemaValPtr) xmlMalloc(sizeof(xmlSchemaVal)); + if (value == NULL) { + return(NULL); + } + memset(value, 0, sizeof(xmlSchemaVal)); + value->type = type; + return(value); +} + +static xmlSchemaFacetPtr +xmlSchemaNewMinLengthFacet(int value) +{ + xmlSchemaFacetPtr ret; + + ret = xmlSchemaNewFacet(); + if (ret == NULL) { + return(NULL); + } + ret->type = XML_SCHEMA_FACET_MINLENGTH; + ret->val = xmlSchemaNewValue(XML_SCHEMAS_NNINTEGER); + ret->val->value.decimal.lo = value; + return (ret); +} + +/* + * xmlSchemaInitBasicType: + * @name: the type name + * @type: the value type associated + * + * Initialize one primitive built-in type + */ +static xmlSchemaTypePtr +xmlSchemaInitBasicType(const char *name, xmlSchemaValType type, + xmlSchemaTypePtr baseType) { + xmlSchemaTypePtr ret; + + ret = (xmlSchemaTypePtr) xmlMalloc(sizeof(xmlSchemaType)); + if (ret == NULL) { + xmlSchemaTypeErrMemory(NULL, "could not initialize basic types"); + return(NULL); + } + memset(ret, 0, sizeof(xmlSchemaType)); + ret->name = (const xmlChar *)name; + ret->targetNamespace = XML_SCHEMAS_NAMESPACE_NAME; + ret->type = XML_SCHEMA_TYPE_BASIC; + ret->baseType = baseType; + ret->contentType = XML_SCHEMA_CONTENT_BASIC; + /* + * Primitive types. + */ + switch (type) { + case XML_SCHEMAS_STRING: + case XML_SCHEMAS_DECIMAL: + case XML_SCHEMAS_DATE: + case XML_SCHEMAS_DATETIME: + case XML_SCHEMAS_TIME: + case XML_SCHEMAS_GYEAR: + case XML_SCHEMAS_GYEARMONTH: + case XML_SCHEMAS_GMONTH: + case XML_SCHEMAS_GMONTHDAY: + case XML_SCHEMAS_GDAY: + case XML_SCHEMAS_DURATION: + case XML_SCHEMAS_FLOAT: + case XML_SCHEMAS_DOUBLE: + case XML_SCHEMAS_BOOLEAN: + case XML_SCHEMAS_ANYURI: + case XML_SCHEMAS_HEXBINARY: + case XML_SCHEMAS_BASE64BINARY: + case XML_SCHEMAS_QNAME: + case XML_SCHEMAS_NOTATION: + ret->flags |= XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE; + break; + default: + break; + } + /* + * Set variety. + */ + switch (type) { + case XML_SCHEMAS_ANYTYPE: + case XML_SCHEMAS_ANYSIMPLETYPE: + break; + case XML_SCHEMAS_IDREFS: + case XML_SCHEMAS_NMTOKENS: + case XML_SCHEMAS_ENTITIES: + ret->flags |= XML_SCHEMAS_TYPE_VARIETY_LIST; + ret->facets = xmlSchemaNewMinLengthFacet(1); + ret->flags |= XML_SCHEMAS_TYPE_HAS_FACETS; + break; + default: + ret->flags |= XML_SCHEMAS_TYPE_VARIETY_ATOMIC; + break; + } + xmlHashAddEntry2(xmlSchemaTypesBank, ret->name, + XML_SCHEMAS_NAMESPACE_NAME, ret); + ret->builtInType = type; + return(ret); +} + +/* +* WARNING: Those type reside normally in xmlschemas.c but are +* redefined here locally in oder of being able to use them for xs:anyType- +* TODO: Remove those definition if we move the types to a header file. +* TODO: Always keep those structs up-to-date with the originals. +*/ +#define UNBOUNDED (1 << 30) + +typedef struct _xmlSchemaTreeItem xmlSchemaTreeItem; +typedef xmlSchemaTreeItem *xmlSchemaTreeItemPtr; +struct _xmlSchemaTreeItem { + xmlSchemaTypeType type; + xmlSchemaAnnotPtr annot; + xmlSchemaTreeItemPtr next; + xmlSchemaTreeItemPtr children; +}; + +typedef struct _xmlSchemaParticle xmlSchemaParticle; +typedef xmlSchemaParticle *xmlSchemaParticlePtr; +struct _xmlSchemaParticle { + xmlSchemaTypeType type; + xmlSchemaAnnotPtr annot; + xmlSchemaTreeItemPtr next; + xmlSchemaTreeItemPtr children; + int minOccurs; + int maxOccurs; + xmlNodePtr node; +}; + +typedef struct _xmlSchemaModelGroup xmlSchemaModelGroup; +typedef xmlSchemaModelGroup *xmlSchemaModelGroupPtr; +struct _xmlSchemaModelGroup { + xmlSchemaTypeType type; + xmlSchemaAnnotPtr annot; + xmlSchemaTreeItemPtr next; + xmlSchemaTreeItemPtr children; + xmlNodePtr node; +}; + +static xmlSchemaParticlePtr +xmlSchemaAddParticle(void) +{ + xmlSchemaParticlePtr ret = NULL; + + ret = (xmlSchemaParticlePtr) + xmlMalloc(sizeof(xmlSchemaParticle)); + if (ret == NULL) { + xmlSchemaTypeErrMemory(NULL, "allocating particle component"); + return (NULL); + } + memset(ret, 0, sizeof(xmlSchemaParticle)); + ret->type = XML_SCHEMA_TYPE_PARTICLE; + ret->minOccurs = 1; + ret->maxOccurs = 1; + return (ret); +} + +/* + * xmlSchemaInitTypes: + * + * Initialize the default XML Schemas type library + */ +void +xmlSchemaInitTypes(void) +{ + if (xmlSchemaTypesInitialized != 0) + return; + xmlSchemaTypesBank = xmlHashCreate(40); + + + /* + * 3.4.7 Built-in Complex Type Definition + */ + xmlSchemaTypeAnyTypeDef = xmlSchemaInitBasicType("anyType", + XML_SCHEMAS_ANYTYPE, + NULL); + xmlSchemaTypeAnyTypeDef->baseType = xmlSchemaTypeAnyTypeDef; + xmlSchemaTypeAnyTypeDef->contentType = XML_SCHEMA_CONTENT_MIXED; + /* + * Init the content type. + */ + xmlSchemaTypeAnyTypeDef->contentType = XML_SCHEMA_CONTENT_MIXED; + { + xmlSchemaParticlePtr particle; + xmlSchemaModelGroupPtr sequence; + xmlSchemaWildcardPtr wild; + /* First particle. */ + particle = xmlSchemaAddParticle(); + if (particle == NULL) + return; + xmlSchemaTypeAnyTypeDef->subtypes = (xmlSchemaTypePtr) particle; + /* Sequence model group. */ + sequence = (xmlSchemaModelGroupPtr) + xmlMalloc(sizeof(xmlSchemaModelGroup)); + if (sequence == NULL) { + xmlSchemaTypeErrMemory(NULL, "allocating model group component"); + return; + } + memset(sequence, 0, sizeof(xmlSchemaModelGroup)); + sequence->type = XML_SCHEMA_TYPE_SEQUENCE; + particle->children = (xmlSchemaTreeItemPtr) sequence; + /* Second particle. */ + particle = xmlSchemaAddParticle(); + if (particle == NULL) + return; + particle->minOccurs = 0; + particle->maxOccurs = UNBOUNDED; + sequence->children = (xmlSchemaTreeItemPtr) particle; + /* The wildcard */ + wild = (xmlSchemaWildcardPtr) xmlMalloc(sizeof(xmlSchemaWildcard)); + if (wild == NULL) { + xmlSchemaTypeErrMemory(NULL, "allocating wildcard component"); + return; + } + memset(wild, 0, sizeof(xmlSchemaWildcard)); + wild->type = XML_SCHEMA_TYPE_ANY; + wild->any = 1; + wild->processContents = XML_SCHEMAS_ANY_LAX; + particle->children = (xmlSchemaTreeItemPtr) wild; + /* + * Create the attribute wildcard. + */ + wild = (xmlSchemaWildcardPtr) xmlMalloc(sizeof(xmlSchemaWildcard)); + if (wild == NULL) { + xmlSchemaTypeErrMemory(NULL, "could not create an attribute " + "wildcard on anyType"); + return; + } + memset(wild, 0, sizeof(xmlSchemaWildcard)); + wild->any = 1; + wild->processContents = XML_SCHEMAS_ANY_LAX; + xmlSchemaTypeAnyTypeDef->attributeWildcard = wild; + } + xmlSchemaTypeAnySimpleTypeDef = xmlSchemaInitBasicType("anySimpleType", + XML_SCHEMAS_ANYSIMPLETYPE, + xmlSchemaTypeAnyTypeDef); + /* + * primitive datatypes + */ + xmlSchemaTypeStringDef = xmlSchemaInitBasicType("string", + XML_SCHEMAS_STRING, + xmlSchemaTypeAnySimpleTypeDef); + xmlSchemaTypeDecimalDef = xmlSchemaInitBasicType("decimal", + XML_SCHEMAS_DECIMAL, + xmlSchemaTypeAnySimpleTypeDef); + xmlSchemaTypeDateDef = xmlSchemaInitBasicType("date", + XML_SCHEMAS_DATE, + xmlSchemaTypeAnySimpleTypeDef); + xmlSchemaTypeDatetimeDef = xmlSchemaInitBasicType("dateTime", + XML_SCHEMAS_DATETIME, + xmlSchemaTypeAnySimpleTypeDef); + xmlSchemaTypeTimeDef = xmlSchemaInitBasicType("time", + XML_SCHEMAS_TIME, + xmlSchemaTypeAnySimpleTypeDef); + xmlSchemaTypeGYearDef = xmlSchemaInitBasicType("gYear", + XML_SCHEMAS_GYEAR, + xmlSchemaTypeAnySimpleTypeDef); + xmlSchemaTypeGYearMonthDef = xmlSchemaInitBasicType("gYearMonth", + XML_SCHEMAS_GYEARMONTH, + xmlSchemaTypeAnySimpleTypeDef); + xmlSchemaTypeGMonthDef = xmlSchemaInitBasicType("gMonth", + XML_SCHEMAS_GMONTH, + xmlSchemaTypeAnySimpleTypeDef); + xmlSchemaTypeGMonthDayDef = xmlSchemaInitBasicType("gMonthDay", + XML_SCHEMAS_GMONTHDAY, + xmlSchemaTypeAnySimpleTypeDef); + xmlSchemaTypeGDayDef = xmlSchemaInitBasicType("gDay", + XML_SCHEMAS_GDAY, + xmlSchemaTypeAnySimpleTypeDef); + xmlSchemaTypeDurationDef = xmlSchemaInitBasicType("duration", + XML_SCHEMAS_DURATION, + xmlSchemaTypeAnySimpleTypeDef); + xmlSchemaTypeFloatDef = xmlSchemaInitBasicType("float", + XML_SCHEMAS_FLOAT, + xmlSchemaTypeAnySimpleTypeDef); + xmlSchemaTypeDoubleDef = xmlSchemaInitBasicType("double", + XML_SCHEMAS_DOUBLE, + xmlSchemaTypeAnySimpleTypeDef); + xmlSchemaTypeBooleanDef = xmlSchemaInitBasicType("boolean", + XML_SCHEMAS_BOOLEAN, + xmlSchemaTypeAnySimpleTypeDef); + xmlSchemaTypeAnyURIDef = xmlSchemaInitBasicType("anyURI", + XML_SCHEMAS_ANYURI, + xmlSchemaTypeAnySimpleTypeDef); + xmlSchemaTypeHexBinaryDef = xmlSchemaInitBasicType("hexBinary", + XML_SCHEMAS_HEXBINARY, + xmlSchemaTypeAnySimpleTypeDef); + xmlSchemaTypeBase64BinaryDef + = xmlSchemaInitBasicType("base64Binary", XML_SCHEMAS_BASE64BINARY, + xmlSchemaTypeAnySimpleTypeDef); + xmlSchemaTypeNotationDef = xmlSchemaInitBasicType("NOTATION", + XML_SCHEMAS_NOTATION, + xmlSchemaTypeAnySimpleTypeDef); + xmlSchemaTypeQNameDef = xmlSchemaInitBasicType("QName", + XML_SCHEMAS_QNAME, + xmlSchemaTypeAnySimpleTypeDef); + + /* + * derived datatypes + */ + xmlSchemaTypeIntegerDef = xmlSchemaInitBasicType("integer", + XML_SCHEMAS_INTEGER, + xmlSchemaTypeDecimalDef); + xmlSchemaTypeNonPositiveIntegerDef = + xmlSchemaInitBasicType("nonPositiveInteger", + XML_SCHEMAS_NPINTEGER, + xmlSchemaTypeIntegerDef); + xmlSchemaTypeNegativeIntegerDef = + xmlSchemaInitBasicType("negativeInteger", XML_SCHEMAS_NINTEGER, + xmlSchemaTypeNonPositiveIntegerDef); + xmlSchemaTypeLongDef = + xmlSchemaInitBasicType("long", XML_SCHEMAS_LONG, + xmlSchemaTypeIntegerDef); + xmlSchemaTypeIntDef = xmlSchemaInitBasicType("int", XML_SCHEMAS_INT, + xmlSchemaTypeLongDef); + xmlSchemaTypeShortDef = xmlSchemaInitBasicType("short", + XML_SCHEMAS_SHORT, + xmlSchemaTypeIntDef); + xmlSchemaTypeByteDef = xmlSchemaInitBasicType("byte", + XML_SCHEMAS_BYTE, + xmlSchemaTypeShortDef); + xmlSchemaTypeNonNegativeIntegerDef = + xmlSchemaInitBasicType("nonNegativeInteger", + XML_SCHEMAS_NNINTEGER, + xmlSchemaTypeIntegerDef); + xmlSchemaTypeUnsignedLongDef = + xmlSchemaInitBasicType("unsignedLong", XML_SCHEMAS_ULONG, + xmlSchemaTypeNonNegativeIntegerDef); + xmlSchemaTypeUnsignedIntDef = + xmlSchemaInitBasicType("unsignedInt", XML_SCHEMAS_UINT, + xmlSchemaTypeUnsignedLongDef); + xmlSchemaTypeUnsignedShortDef = + xmlSchemaInitBasicType("unsignedShort", XML_SCHEMAS_USHORT, + xmlSchemaTypeUnsignedIntDef); + xmlSchemaTypeUnsignedByteDef = + xmlSchemaInitBasicType("unsignedByte", XML_SCHEMAS_UBYTE, + xmlSchemaTypeUnsignedShortDef); + xmlSchemaTypePositiveIntegerDef = + xmlSchemaInitBasicType("positiveInteger", XML_SCHEMAS_PINTEGER, + xmlSchemaTypeNonNegativeIntegerDef); + xmlSchemaTypeNormStringDef = xmlSchemaInitBasicType("normalizedString", + XML_SCHEMAS_NORMSTRING, + xmlSchemaTypeStringDef); + xmlSchemaTypeTokenDef = xmlSchemaInitBasicType("token", + XML_SCHEMAS_TOKEN, + xmlSchemaTypeNormStringDef); + xmlSchemaTypeLanguageDef = xmlSchemaInitBasicType("language", + XML_SCHEMAS_LANGUAGE, + xmlSchemaTypeTokenDef); + xmlSchemaTypeNameDef = xmlSchemaInitBasicType("Name", + XML_SCHEMAS_NAME, + xmlSchemaTypeTokenDef); + xmlSchemaTypeNmtokenDef = xmlSchemaInitBasicType("NMTOKEN", + XML_SCHEMAS_NMTOKEN, + xmlSchemaTypeTokenDef); + xmlSchemaTypeNCNameDef = xmlSchemaInitBasicType("NCName", + XML_SCHEMAS_NCNAME, + xmlSchemaTypeNameDef); + xmlSchemaTypeIdDef = xmlSchemaInitBasicType("ID", XML_SCHEMAS_ID, + xmlSchemaTypeNCNameDef); + xmlSchemaTypeIdrefDef = xmlSchemaInitBasicType("IDREF", + XML_SCHEMAS_IDREF, + xmlSchemaTypeNCNameDef); + xmlSchemaTypeEntityDef = xmlSchemaInitBasicType("ENTITY", + XML_SCHEMAS_ENTITY, + xmlSchemaTypeNCNameDef); + /* + * Derived list types. + */ + /* ENTITIES */ + xmlSchemaTypeEntitiesDef = xmlSchemaInitBasicType("ENTITIES", + XML_SCHEMAS_ENTITIES, + xmlSchemaTypeAnySimpleTypeDef); + xmlSchemaTypeEntitiesDef->subtypes = xmlSchemaTypeEntityDef; + /* IDREFS */ + xmlSchemaTypeIdrefsDef = xmlSchemaInitBasicType("IDREFS", + XML_SCHEMAS_IDREFS, + xmlSchemaTypeAnySimpleTypeDef); + xmlSchemaTypeIdrefsDef->subtypes = xmlSchemaTypeIdrefDef; + + /* NMTOKENS */ + xmlSchemaTypeNmtokensDef = xmlSchemaInitBasicType("NMTOKENS", + XML_SCHEMAS_NMTOKENS, + xmlSchemaTypeAnySimpleTypeDef); + xmlSchemaTypeNmtokensDef->subtypes = xmlSchemaTypeNmtokenDef; + + xmlSchemaTypesInitialized = 1; +} + +/** + * xmlSchemaCleanupTypes: + * + * Cleanup the default XML Schemas type library + */ +void +xmlSchemaCleanupTypes(void) { + if (xmlSchemaTypesInitialized == 0) + return; + /* + * Free xs:anyType. + */ + { + xmlSchemaParticlePtr particle; + /* Attribute wildcard. */ + xmlSchemaFreeWildcard(xmlSchemaTypeAnyTypeDef->attributeWildcard); + /* Content type. */ + particle = (xmlSchemaParticlePtr) xmlSchemaTypeAnyTypeDef->subtypes; + /* Wildcard. */ + xmlSchemaFreeWildcard((xmlSchemaWildcardPtr) + particle->children->children->children); + xmlFree((xmlSchemaParticlePtr) particle->children->children); + /* Sequence model group. */ + xmlFree((xmlSchemaModelGroupPtr) particle->children); + xmlFree((xmlSchemaParticlePtr) particle); + xmlSchemaTypeAnyTypeDef->subtypes = NULL; + } + xmlHashFree(xmlSchemaTypesBank, (xmlHashDeallocator) xmlSchemaFreeType); + xmlSchemaTypesInitialized = 0; +} + +/** + * xmlSchemaIsBuiltInTypeFacet: + * @type: the built-in type + * @facetType: the facet type + * + * Evaluates if a specific facet can be + * used in conjunction with a type. + * + * Returns 1 if the facet can be used with the given built-in type, + * 0 otherwise and -1 in case the type is not a built-in type. + */ +int +xmlSchemaIsBuiltInTypeFacet(xmlSchemaTypePtr type, int facetType) +{ + if (type == NULL) + return (-1); + if (type->type != XML_SCHEMA_TYPE_BASIC) + return (-1); + switch (type->builtInType) { + case XML_SCHEMAS_BOOLEAN: + if ((facetType == XML_SCHEMA_FACET_PATTERN) || + (facetType == XML_SCHEMA_FACET_WHITESPACE)) + return (1); + else + return (0); + case XML_SCHEMAS_STRING: + case XML_SCHEMAS_NOTATION: + case XML_SCHEMAS_QNAME: + case XML_SCHEMAS_ANYURI: + case XML_SCHEMAS_BASE64BINARY: + case XML_SCHEMAS_HEXBINARY: + if ((facetType == XML_SCHEMA_FACET_LENGTH) || + (facetType == XML_SCHEMA_FACET_MINLENGTH) || + (facetType == XML_SCHEMA_FACET_MAXLENGTH) || + (facetType == XML_SCHEMA_FACET_PATTERN) || + (facetType == XML_SCHEMA_FACET_ENUMERATION) || + (facetType == XML_SCHEMA_FACET_WHITESPACE)) + return (1); + else + return (0); + case XML_SCHEMAS_DECIMAL: + if ((facetType == XML_SCHEMA_FACET_TOTALDIGITS) || + (facetType == XML_SCHEMA_FACET_FRACTIONDIGITS) || + (facetType == XML_SCHEMA_FACET_PATTERN) || + (facetType == XML_SCHEMA_FACET_WHITESPACE) || + (facetType == XML_SCHEMA_FACET_ENUMERATION) || + (facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) || + (facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) || + (facetType == XML_SCHEMA_FACET_MININCLUSIVE) || + (facetType == XML_SCHEMA_FACET_MINEXCLUSIVE)) + return (1); + else + return (0); + case XML_SCHEMAS_TIME: + case XML_SCHEMAS_GDAY: + case XML_SCHEMAS_GMONTH: + case XML_SCHEMAS_GMONTHDAY: + case XML_SCHEMAS_GYEAR: + case XML_SCHEMAS_GYEARMONTH: + case XML_SCHEMAS_DATE: + case XML_SCHEMAS_DATETIME: + case XML_SCHEMAS_DURATION: + case XML_SCHEMAS_FLOAT: + case XML_SCHEMAS_DOUBLE: + if ((facetType == XML_SCHEMA_FACET_PATTERN) || + (facetType == XML_SCHEMA_FACET_ENUMERATION) || + (facetType == XML_SCHEMA_FACET_WHITESPACE) || + (facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) || + (facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) || + (facetType == XML_SCHEMA_FACET_MININCLUSIVE) || + (facetType == XML_SCHEMA_FACET_MINEXCLUSIVE)) + return (1); + else + return (0); + default: + break; + } + return (0); +} + +/** + * xmlSchemaGetBuiltInType: + * @type: the type of the built in type + * + * Gives you the type struct for a built-in + * type by its type id. + * + * Returns the type if found, NULL otherwise. + */ +xmlSchemaTypePtr +xmlSchemaGetBuiltInType(xmlSchemaValType type) +{ + if (xmlSchemaTypesInitialized == 0) + xmlSchemaInitTypes(); + switch (type) { + + case XML_SCHEMAS_ANYSIMPLETYPE: + return (xmlSchemaTypeAnySimpleTypeDef); + case XML_SCHEMAS_STRING: + return (xmlSchemaTypeStringDef); + case XML_SCHEMAS_NORMSTRING: + return (xmlSchemaTypeNormStringDef); + case XML_SCHEMAS_DECIMAL: + return (xmlSchemaTypeDecimalDef); + case XML_SCHEMAS_TIME: + return (xmlSchemaTypeTimeDef); + case XML_SCHEMAS_GDAY: + return (xmlSchemaTypeGDayDef); + case XML_SCHEMAS_GMONTH: + return (xmlSchemaTypeGMonthDef); + case XML_SCHEMAS_GMONTHDAY: + return (xmlSchemaTypeGMonthDayDef); + case XML_SCHEMAS_GYEAR: + return (xmlSchemaTypeGYearDef); + case XML_SCHEMAS_GYEARMONTH: + return (xmlSchemaTypeGYearMonthDef); + case XML_SCHEMAS_DATE: + return (xmlSchemaTypeDateDef); + case XML_SCHEMAS_DATETIME: + return (xmlSchemaTypeDatetimeDef); + case XML_SCHEMAS_DURATION: + return (xmlSchemaTypeDurationDef); + case XML_SCHEMAS_FLOAT: + return (xmlSchemaTypeFloatDef); + case XML_SCHEMAS_DOUBLE: + return (xmlSchemaTypeDoubleDef); + case XML_SCHEMAS_BOOLEAN: + return (xmlSchemaTypeBooleanDef); + case XML_SCHEMAS_TOKEN: + return (xmlSchemaTypeTokenDef); + case XML_SCHEMAS_LANGUAGE: + return (xmlSchemaTypeLanguageDef); + case XML_SCHEMAS_NMTOKEN: + return (xmlSchemaTypeNmtokenDef); + case XML_SCHEMAS_NMTOKENS: + return (xmlSchemaTypeNmtokensDef); + case XML_SCHEMAS_NAME: + return (xmlSchemaTypeNameDef); + case XML_SCHEMAS_QNAME: + return (xmlSchemaTypeQNameDef); + case XML_SCHEMAS_NCNAME: + return (xmlSchemaTypeNCNameDef); + case XML_SCHEMAS_ID: + return (xmlSchemaTypeIdDef); + case XML_SCHEMAS_IDREF: + return (xmlSchemaTypeIdrefDef); + case XML_SCHEMAS_IDREFS: + return (xmlSchemaTypeIdrefsDef); + case XML_SCHEMAS_ENTITY: + return (xmlSchemaTypeEntityDef); + case XML_SCHEMAS_ENTITIES: + return (xmlSchemaTypeEntitiesDef); + case XML_SCHEMAS_NOTATION: + return (xmlSchemaTypeNotationDef); + case XML_SCHEMAS_ANYURI: + return (xmlSchemaTypeAnyURIDef); + case XML_SCHEMAS_INTEGER: + return (xmlSchemaTypeIntegerDef); + case XML_SCHEMAS_NPINTEGER: + return (xmlSchemaTypeNonPositiveIntegerDef); + case XML_SCHEMAS_NINTEGER: + return (xmlSchemaTypeNegativeIntegerDef); + case XML_SCHEMAS_NNINTEGER: + return (xmlSchemaTypeNonNegativeIntegerDef); + case XML_SCHEMAS_PINTEGER: + return (xmlSchemaTypePositiveIntegerDef); + case XML_SCHEMAS_INT: + return (xmlSchemaTypeIntDef); + case XML_SCHEMAS_UINT: + return (xmlSchemaTypeUnsignedIntDef); + case XML_SCHEMAS_LONG: + return (xmlSchemaTypeLongDef); + case XML_SCHEMAS_ULONG: + return (xmlSchemaTypeUnsignedLongDef); + case XML_SCHEMAS_SHORT: + return (xmlSchemaTypeShortDef); + case XML_SCHEMAS_USHORT: + return (xmlSchemaTypeUnsignedShortDef); + case XML_SCHEMAS_BYTE: + return (xmlSchemaTypeByteDef); + case XML_SCHEMAS_UBYTE: + return (xmlSchemaTypeUnsignedByteDef); + case XML_SCHEMAS_HEXBINARY: + return (xmlSchemaTypeHexBinaryDef); + case XML_SCHEMAS_BASE64BINARY: + return (xmlSchemaTypeBase64BinaryDef); + case XML_SCHEMAS_ANYTYPE: + return (xmlSchemaTypeAnyTypeDef); + default: + return (NULL); + } +} + +/** + * xmlSchemaValueAppend: + * @prev: the value + * @cur: the value to be appended + * + * Appends a next sibling to a list of computed values. + * + * Returns 0 if succeeded and -1 on API errors. + */ +int +xmlSchemaValueAppend(xmlSchemaValPtr prev, xmlSchemaValPtr cur) { + + if ((prev == NULL) || (cur == NULL)) + return (-1); + prev->next = cur; + return (0); +} + +/** + * xmlSchemaValueGetNext: + * @cur: the value + * + * Accessor for the next sibling of a list of computed values. + * + * Returns the next value or NULL if there was none, or on + * API errors. + */ +xmlSchemaValPtr +xmlSchemaValueGetNext(xmlSchemaValPtr cur) { + + if (cur == NULL) + return (NULL); + return (cur->next); +} + +/** + * xmlSchemaValueGetAsString: + * @val: the value + * + * Accessor for the string value of a computed value. + * + * Returns the string value or NULL if there was none, or on + * API errors. + */ +const xmlChar * +xmlSchemaValueGetAsString(xmlSchemaValPtr val) +{ + if (val == NULL) + return (NULL); + switch (val->type) { + case XML_SCHEMAS_STRING: + case XML_SCHEMAS_NORMSTRING: + case XML_SCHEMAS_ANYSIMPLETYPE: + case XML_SCHEMAS_TOKEN: + case XML_SCHEMAS_LANGUAGE: + case XML_SCHEMAS_NMTOKEN: + case XML_SCHEMAS_NAME: + case XML_SCHEMAS_NCNAME: + case XML_SCHEMAS_ID: + case XML_SCHEMAS_IDREF: + case XML_SCHEMAS_ENTITY: + case XML_SCHEMAS_ANYURI: + return (BAD_CAST val->value.str); + default: + break; + } + return (NULL); +} + +/** + * xmlSchemaValueGetAsBoolean: + * @val: the value + * + * Accessor for the boolean value of a computed value. + * + * Returns 1 if true and 0 if false, or in case of an error. Hmm. + */ +int +xmlSchemaValueGetAsBoolean(xmlSchemaValPtr val) +{ + if ((val == NULL) || (val->type != XML_SCHEMAS_BOOLEAN)) + return (0); + return (val->value.b); +} + +/** + * xmlSchemaNewStringValue: + * @type: the value type + * @value: the value + * + * Allocate a new simple type value. The type can be + * of XML_SCHEMAS_STRING. + * WARNING: This one is intended to be expanded for other + * string based types. We need this for anySimpleType as well. + * The given value is consumed and freed with the struct. + * + * Returns a pointer to the new value or NULL in case of error + */ +xmlSchemaValPtr +xmlSchemaNewStringValue(xmlSchemaValType type, + const xmlChar *value) +{ + xmlSchemaValPtr val; + + if (type != XML_SCHEMAS_STRING) + return(NULL); + val = (xmlSchemaValPtr) xmlMalloc(sizeof(xmlSchemaVal)); + if (val == NULL) { + return(NULL); + } + memset(val, 0, sizeof(xmlSchemaVal)); + val->type = type; + val->value.str = (xmlChar *) value; + return(val); +} + +/** + * xmlSchemaNewNOTATIONValue: + * @name: the notation name + * @ns: the notation namespace name or NULL + * + * Allocate a new NOTATION value. + * The given values are consumed and freed with the struct. + * + * Returns a pointer to the new value or NULL in case of error + */ +xmlSchemaValPtr +xmlSchemaNewNOTATIONValue(const xmlChar *name, + const xmlChar *ns) +{ + xmlSchemaValPtr val; + + val = xmlSchemaNewValue(XML_SCHEMAS_NOTATION); + if (val == NULL) + return (NULL); + + val->value.qname.name = (xmlChar *)name; + if (ns != NULL) + val->value.qname.uri = (xmlChar *)ns; + return(val); +} + +/** + * xmlSchemaNewQNameValue: + * @namespaceName: the namespace name + * @localName: the local name + * + * Allocate a new QName value. + * The given values are consumed and freed with the struct. + * + * Returns a pointer to the new value or NULL in case of an error. + */ +xmlSchemaValPtr +xmlSchemaNewQNameValue(const xmlChar *namespaceName, + const xmlChar *localName) +{ + xmlSchemaValPtr val; + + val = xmlSchemaNewValue(XML_SCHEMAS_QNAME); + if (val == NULL) + return (NULL); + + val->value.qname.name = (xmlChar *) localName; + val->value.qname.uri = (xmlChar *) namespaceName; + return(val); +} + +/** + * xmlSchemaFreeValue: + * @value: the value to free + * + * Cleanup the default XML Schemas type library + */ +void +xmlSchemaFreeValue(xmlSchemaValPtr value) { + xmlSchemaValPtr prev; + + while (value != NULL) { + switch (value->type) { + case XML_SCHEMAS_STRING: + case XML_SCHEMAS_NORMSTRING: + case XML_SCHEMAS_TOKEN: + case XML_SCHEMAS_LANGUAGE: + case XML_SCHEMAS_NMTOKEN: + case XML_SCHEMAS_NMTOKENS: + case XML_SCHEMAS_NAME: + case XML_SCHEMAS_NCNAME: + case XML_SCHEMAS_ID: + case XML_SCHEMAS_IDREF: + case XML_SCHEMAS_IDREFS: + case XML_SCHEMAS_ENTITY: + case XML_SCHEMAS_ENTITIES: + case XML_SCHEMAS_ANYURI: + case XML_SCHEMAS_ANYSIMPLETYPE: + if (value->value.str != NULL) + xmlFree(value->value.str); + break; + case XML_SCHEMAS_NOTATION: + case XML_SCHEMAS_QNAME: + if (value->value.qname.uri != NULL) + xmlFree(value->value.qname.uri); + if (value->value.qname.name != NULL) + xmlFree(value->value.qname.name); + break; + case XML_SCHEMAS_HEXBINARY: + if (value->value.hex.str != NULL) + xmlFree(value->value.hex.str); + break; + case XML_SCHEMAS_BASE64BINARY: + if (value->value.base64.str != NULL) + xmlFree(value->value.base64.str); + break; + default: + break; + } + prev = value; + value = value->next; + xmlFree(prev); + } +} + +/** + * xmlSchemaGetPredefinedType: + * @name: the type name + * @ns: the URI of the namespace usually "http://www.w3.org/2001/XMLSchema" + * + * Lookup a type in the default XML Schemas type library + * + * Returns the type if found, NULL otherwise + */ +xmlSchemaTypePtr +xmlSchemaGetPredefinedType(const xmlChar *name, const xmlChar *ns) { + if (xmlSchemaTypesInitialized == 0) + xmlSchemaInitTypes(); + if (name == NULL) + return(NULL); + return((xmlSchemaTypePtr) xmlHashLookup2(xmlSchemaTypesBank, name, ns)); +} + +/** + * xmlSchemaGetBuiltInListSimpleTypeItemType: + * @type: the built-in simple type. + * + * Lookup function + * + * Returns the item type of @type as defined by the built-in datatype + * hierarchy of XML Schema Part 2: Datatypes, or NULL in case of an error. + */ +xmlSchemaTypePtr +xmlSchemaGetBuiltInListSimpleTypeItemType(xmlSchemaTypePtr type) +{ + if ((type == NULL) || (type->type != XML_SCHEMA_TYPE_BASIC)) + return (NULL); + switch (type->builtInType) { + case XML_SCHEMAS_NMTOKENS: + return (xmlSchemaTypeNmtokenDef ); + case XML_SCHEMAS_IDREFS: + return (xmlSchemaTypeIdrefDef); + case XML_SCHEMAS_ENTITIES: + return (xmlSchemaTypeEntityDef); + default: + return (NULL); + } +} + +/**************************************************************** + * * + * Convenience macros and functions * + * * + ****************************************************************/ + +#define IS_TZO_CHAR(c) \ + ((c == 0) || (c == 'Z') || (c == '+') || (c == '-')) + +#define VALID_YEAR(yr) (yr != 0) +#define VALID_MONTH(mon) ((mon >= 1) && (mon <= 12)) +/* VALID_DAY should only be used when month is unknown */ +#define VALID_DAY(day) ((day >= 1) && (day <= 31)) +#define VALID_HOUR(hr) ((hr >= 0) && (hr <= 23)) +#define VALID_MIN(min) ((min >= 0) && (min <= 59)) +#define VALID_SEC(sec) ((sec >= 0) && (sec < 60)) +#define VALID_TZO(tzo) ((tzo > -840) && (tzo < 840)) +#define IS_LEAP(y) \ + (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)) + +static const unsigned int daysInMonth[12] = + { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; +static const unsigned int daysInMonthLeap[12] = + { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; + +#define MAX_DAYINMONTH(yr,mon) \ + (IS_LEAP(yr) ? daysInMonthLeap[mon - 1] : daysInMonth[mon - 1]) + +#define VALID_MDAY(dt) \ + (IS_LEAP(dt->year) ? \ + (dt->day <= daysInMonthLeap[dt->mon - 1]) : \ + (dt->day <= daysInMonth[dt->mon - 1])) + +#define VALID_DATE(dt) \ + (VALID_YEAR(dt->year) && VALID_MONTH(dt->mon) && VALID_MDAY(dt)) + +#define VALID_TIME(dt) \ + (VALID_HOUR(dt->hour) && VALID_MIN(dt->min) && \ + VALID_SEC(dt->sec) && VALID_TZO(dt->tzo)) + +#define VALID_DATETIME(dt) \ + (VALID_DATE(dt) && VALID_TIME(dt)) + +#define SECS_PER_MIN (60) +#define SECS_PER_HOUR (60 * SECS_PER_MIN) +#define SECS_PER_DAY (24 * SECS_PER_HOUR) + +static const long dayInYearByMonth[12] = + { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }; +static const long dayInLeapYearByMonth[12] = + { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 }; + +#define DAY_IN_YEAR(day, month, year) \ + ((IS_LEAP(year) ? \ + dayInLeapYearByMonth[month - 1] : \ + dayInYearByMonth[month - 1]) + day) + +#ifdef DEBUG +#define DEBUG_DATE(dt) \ + xmlGenericError(xmlGenericErrorContext, \ + "type=%o %04ld-%02u-%02uT%02u:%02u:%03f", \ + dt->type,dt->value.date.year,dt->value.date.mon, \ + dt->value.date.day,dt->value.date.hour,dt->value.date.min, \ + dt->value.date.sec); \ + if (dt->value.date.tz_flag) \ + if (dt->value.date.tzo != 0) \ + xmlGenericError(xmlGenericErrorContext, \ + "%+05d\n",dt->value.date.tzo); \ + else \ + xmlGenericError(xmlGenericErrorContext, "Z\n"); \ + else \ + xmlGenericError(xmlGenericErrorContext,"\n") +#else +#define DEBUG_DATE(dt) +#endif + +/** + * _xmlSchemaParseGYear: + * @dt: pointer to a date structure + * @str: pointer to the string to analyze + * + * Parses a xs:gYear without time zone and fills in the appropriate + * field of the @dt structure. @str is updated to point just after the + * xs:gYear. It is supposed that @dt->year is big enough to contain + * the year. + * + * Returns 0 or the error code + */ +static int +_xmlSchemaParseGYear (xmlSchemaValDatePtr dt, const xmlChar **str) { + const xmlChar *cur = *str, *firstChar; + int isneg = 0, digcnt = 0; + + if (((*cur < '0') || (*cur > '9')) && + (*cur != '-') && (*cur != '+')) + return -1; + + if (*cur == '-') { + isneg = 1; + cur++; + } + + firstChar = cur; + + while ((*cur >= '0') && (*cur <= '9')) { + dt->year = dt->year * 10 + (*cur - '0'); + cur++; + digcnt++; + } + + /* year must be at least 4 digits (CCYY); over 4 + * digits cannot have a leading zero. */ + if ((digcnt < 4) || ((digcnt > 4) && (*firstChar == '0'))) + return 1; + + if (isneg) + dt->year = - dt->year; + + if (!VALID_YEAR(dt->year)) + return 2; + + *str = cur; + return 0; +} + +/** + * PARSE_2_DIGITS: + * @num: the integer to fill in + * @cur: an #xmlChar * + * @invalid: an integer + * + * Parses a 2-digits integer and updates @num with the value. @cur is + * updated to point just after the integer. + * In case of error, @invalid is set to %TRUE, values of @num and + * @cur are undefined. + */ +#define PARSE_2_DIGITS(num, cur, invalid) \ + if ((cur[0] < '0') || (cur[0] > '9') || \ + (cur[1] < '0') || (cur[1] > '9')) \ + invalid = 1; \ + else \ + num = (cur[0] - '0') * 10 + (cur[1] - '0'); \ + cur += 2; + +/** + * PARSE_FLOAT: + * @num: the double to fill in + * @cur: an #xmlChar * + * @invalid: an integer + * + * Parses a float and updates @num with the value. @cur is + * updated to point just after the float. The float must have a + * 2-digits integer part and may or may not have a decimal part. + * In case of error, @invalid is set to %TRUE, values of @num and + * @cur are undefined. + */ +#define PARSE_FLOAT(num, cur, invalid) \ + PARSE_2_DIGITS(num, cur, invalid); \ + if (!invalid && (*cur == '.')) { \ + double mult = 1; \ + cur++; \ + if ((*cur < '0') || (*cur > '9')) \ + invalid = 1; \ + while ((*cur >= '0') && (*cur <= '9')) { \ + mult /= 10; \ + num += (*cur - '0') * mult; \ + cur++; \ + } \ + } + +/** + * _xmlSchemaParseGMonth: + * @dt: pointer to a date structure + * @str: pointer to the string to analyze + * + * Parses a xs:gMonth without time zone and fills in the appropriate + * field of the @dt structure. @str is updated to point just after the + * xs:gMonth. + * + * Returns 0 or the error code + */ +static int +_xmlSchemaParseGMonth (xmlSchemaValDatePtr dt, const xmlChar **str) { + const xmlChar *cur = *str; + int ret = 0; + unsigned int value = 0; + + PARSE_2_DIGITS(value, cur, ret); + if (ret != 0) + return ret; + + if (!VALID_MONTH(value)) + return 2; + + dt->mon = value; + + *str = cur; + return 0; +} + +/** + * _xmlSchemaParseGDay: + * @dt: pointer to a date structure + * @str: pointer to the string to analyze + * + * Parses a xs:gDay without time zone and fills in the appropriate + * field of the @dt structure. @str is updated to point just after the + * xs:gDay. + * + * Returns 0 or the error code + */ +static int +_xmlSchemaParseGDay (xmlSchemaValDatePtr dt, const xmlChar **str) { + const xmlChar *cur = *str; + int ret = 0; + unsigned int value = 0; + + PARSE_2_DIGITS(value, cur, ret); + if (ret != 0) + return ret; + + if (!VALID_DAY(value)) + return 2; + + dt->day = value; + *str = cur; + return 0; +} + +/** + * _xmlSchemaParseTime: + * @dt: pointer to a date structure + * @str: pointer to the string to analyze + * + * Parses a xs:time without time zone and fills in the appropriate + * fields of the @dt structure. @str is updated to point just after the + * xs:time. + * In case of error, values of @dt fields are undefined. + * + * Returns 0 or the error code + */ +static int +_xmlSchemaParseTime (xmlSchemaValDatePtr dt, const xmlChar **str) { + const xmlChar *cur = *str; + int ret = 0; + int value = 0; + + PARSE_2_DIGITS(value, cur, ret); + if (ret != 0) + return ret; + if (*cur != ':') + return 1; + if (!VALID_HOUR(value)) + return 2; + cur++; + + /* the ':' insures this string is xs:time */ + dt->hour = value; + + PARSE_2_DIGITS(value, cur, ret); + if (ret != 0) + return ret; + if (!VALID_MIN(value)) + return 2; + dt->min = value; + + if (*cur != ':') + return 1; + cur++; + + PARSE_FLOAT(dt->sec, cur, ret); + if (ret != 0) + return ret; + + if ((!VALID_SEC(dt->sec)) || (!VALID_TZO(dt->tzo))) + return 2; + + *str = cur; + return 0; +} + +/** + * _xmlSchemaParseTimeZone: + * @dt: pointer to a date structure + * @str: pointer to the string to analyze + * + * Parses a time zone without time zone and fills in the appropriate + * field of the @dt structure. @str is updated to point just after the + * time zone. + * + * Returns 0 or the error code + */ +static int +_xmlSchemaParseTimeZone (xmlSchemaValDatePtr dt, const xmlChar **str) { + const xmlChar *cur; + int ret = 0; + + if (str == NULL) + return -1; + cur = *str; + + switch (*cur) { + case 0: + dt->tz_flag = 0; + dt->tzo = 0; + break; + + case 'Z': + dt->tz_flag = 1; + dt->tzo = 0; + cur++; + break; + + case '+': + case '-': { + int isneg = 0, tmp = 0; + isneg = (*cur == '-'); + + cur++; + + PARSE_2_DIGITS(tmp, cur, ret); + if (ret != 0) + return ret; + if (!VALID_HOUR(tmp)) + return 2; + + if (*cur != ':') + return 1; + cur++; + + dt->tzo = tmp * 60; + + PARSE_2_DIGITS(tmp, cur, ret); + if (ret != 0) + return ret; + if (!VALID_MIN(tmp)) + return 2; + + dt->tzo += tmp; + if (isneg) + dt->tzo = - dt->tzo; + + if (!VALID_TZO(dt->tzo)) + return 2; + + dt->tz_flag = 1; + break; + } + default: + return 1; + } + + *str = cur; + return 0; +} + +/** + * _xmlSchemaBase64Decode: + * @ch: a character + * + * Converts a base64 encoded character to its base 64 value. + * + * Returns 0-63 (value), 64 (pad), or -1 (not recognized) + */ +static int +_xmlSchemaBase64Decode (const xmlChar ch) { + if (('A' <= ch) && (ch <= 'Z')) return ch - 'A'; + if (('a' <= ch) && (ch <= 'z')) return ch - 'a' + 26; + if (('0' <= ch) && (ch <= '9')) return ch - '0' + 52; + if ('+' == ch) return 62; + if ('/' == ch) return 63; + if ('=' == ch) return 64; + return -1; +} + +/**************************************************************** + * * + * XML Schema Dates/Times Datatypes Handling * + * * + ****************************************************************/ + +/** + * PARSE_DIGITS: + * @num: the integer to fill in + * @cur: an #xmlChar * + * @num_type: an integer flag + * + * Parses a digits integer and updates @num with the value. @cur is + * updated to point just after the integer. + * In case of error, @num_type is set to -1, values of @num and + * @cur are undefined. + */ +#define PARSE_DIGITS(num, cur, num_type) \ + if ((*cur < '0') || (*cur > '9')) \ + num_type = -1; \ + else \ + while ((*cur >= '0') && (*cur <= '9')) { \ + num = num * 10 + (*cur - '0'); \ + cur++; \ + } + +/** + * PARSE_NUM: + * @num: the double to fill in + * @cur: an #xmlChar * + * @num_type: an integer flag + * + * Parses a float or integer and updates @num with the value. @cur is + * updated to point just after the number. If the number is a float, + * then it must have an integer part and a decimal part; @num_type will + * be set to 1. If there is no decimal part, @num_type is set to zero. + * In case of error, @num_type is set to -1, values of @num and + * @cur are undefined. + */ +#define PARSE_NUM(num, cur, num_type) \ + num = 0; \ + PARSE_DIGITS(num, cur, num_type); \ + if (!num_type && (*cur == '.')) { \ + double mult = 1; \ + cur++; \ + if ((*cur < '0') || (*cur > '9')) \ + num_type = -1; \ + else \ + num_type = 1; \ + while ((*cur >= '0') && (*cur <= '9')) { \ + mult /= 10; \ + num += (*cur - '0') * mult; \ + cur++; \ + } \ + } + +/** + * xmlSchemaValidateDates: + * @type: the expected type or XML_SCHEMAS_UNKNOWN + * @dateTime: string to analyze + * @val: the return computed value + * + * Check that @dateTime conforms to the lexical space of one of the date types. + * if true a value is computed and returned in @val. + * + * Returns 0 if this validates, a positive error code number otherwise + * and -1 in case of internal or API error. + */ +static int +xmlSchemaValidateDates (xmlSchemaValType type, + const xmlChar *dateTime, xmlSchemaValPtr *val, + int collapse) { + xmlSchemaValPtr dt; + int ret; + const xmlChar *cur = dateTime; + +#define RETURN_TYPE_IF_VALID(t) \ + if (IS_TZO_CHAR(*cur)) { \ + ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur); \ + if (ret == 0) { \ + if (*cur != 0) \ + goto error; \ + dt->type = t; \ + goto done; \ + } \ + } + + if (dateTime == NULL) + return -1; + + if (collapse) + while IS_WSP_BLANK_CH(*cur) cur++; + + if ((*cur != '-') && (*cur < '0') && (*cur > '9')) + return 1; + + dt = xmlSchemaNewValue(XML_SCHEMAS_UNKNOWN); + if (dt == NULL) + return -1; + + if ((cur[0] == '-') && (cur[1] == '-')) { + /* + * It's an incomplete date (xs:gMonthDay, xs:gMonth or + * xs:gDay) + */ + cur += 2; + + /* is it an xs:gDay? */ + if (*cur == '-') { + if (type == XML_SCHEMAS_GMONTH) + goto error; + ++cur; + ret = _xmlSchemaParseGDay(&(dt->value.date), &cur); + if (ret != 0) + goto error; + + RETURN_TYPE_IF_VALID(XML_SCHEMAS_GDAY); + + goto error; + } + + /* + * it should be an xs:gMonthDay or xs:gMonth + */ + ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur); + if (ret != 0) + goto error; + + /* + * a '-' char could indicate this type is xs:gMonthDay or + * a negative time zone offset. Check for xs:gMonthDay first. + * Also the first three char's of a negative tzo (-MM:SS) can + * appear to be a valid day; so even if the day portion + * of the xs:gMonthDay verifies, we must insure it was not + * a tzo. + */ + if (*cur == '-') { + const xmlChar *rewnd = cur; + cur++; + + ret = _xmlSchemaParseGDay(&(dt->value.date), &cur); + if ((ret == 0) && ((*cur == 0) || (*cur != ':'))) { + + /* + * we can use the VALID_MDAY macro to validate the month + * and day because the leap year test will flag year zero + * as a leap year (even though zero is an invalid year). + * FUTURE TODO: Zero will become valid in XML Schema 1.1 + * probably. + */ + if (VALID_MDAY((&(dt->value.date)))) { + + RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTHDAY); + + goto error; + } + } + + /* + * not xs:gMonthDay so rewind and check if just xs:gMonth + * with an optional time zone. + */ + cur = rewnd; + } + + RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTH); + + goto error; + } + + /* + * It's a right-truncated date or an xs:time. + * Try to parse an xs:time then fallback on right-truncated dates. + */ + if ((*cur >= '0') && (*cur <= '9')) { + ret = _xmlSchemaParseTime(&(dt->value.date), &cur); + if (ret == 0) { + /* it's an xs:time */ + RETURN_TYPE_IF_VALID(XML_SCHEMAS_TIME); + } + } + + /* fallback on date parsing */ + cur = dateTime; + + ret = _xmlSchemaParseGYear(&(dt->value.date), &cur); + if (ret != 0) + goto error; + + /* is it an xs:gYear? */ + RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEAR); + + if (*cur != '-') + goto error; + cur++; + + ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur); + if (ret != 0) + goto error; + + /* is it an xs:gYearMonth? */ + RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEARMONTH); + + if (*cur != '-') + goto error; + cur++; + + ret = _xmlSchemaParseGDay(&(dt->value.date), &cur); + if ((ret != 0) || !VALID_DATE((&(dt->value.date)))) + goto error; + + /* is it an xs:date? */ + RETURN_TYPE_IF_VALID(XML_SCHEMAS_DATE); + + if (*cur != 'T') + goto error; + cur++; + + /* it should be an xs:dateTime */ + ret = _xmlSchemaParseTime(&(dt->value.date), &cur); + if (ret != 0) + goto error; + + ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur); + if (collapse) + while IS_WSP_BLANK_CH(*cur) cur++; + if ((ret != 0) || (*cur != 0) || (!(VALID_DATETIME((&(dt->value.date)))))) + goto error; + + + dt->type = XML_SCHEMAS_DATETIME; + +done: +#if 1 + if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type)) + goto error; +#else + /* + * insure the parsed type is equal to or less significant (right + * truncated) than the desired type. + */ + if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type)) { + + /* time only matches time */ + if ((type == XML_SCHEMAS_TIME) && (dt->type == XML_SCHEMAS_TIME)) + goto error; + + if ((type == XML_SCHEMAS_DATETIME) && + ((dt->type != XML_SCHEMAS_DATE) || + (dt->type != XML_SCHEMAS_GYEARMONTH) || + (dt->type != XML_SCHEMAS_GYEAR))) + goto error; + + if ((type == XML_SCHEMAS_DATE) && + ((dt->type != XML_SCHEMAS_GYEAR) || + (dt->type != XML_SCHEMAS_GYEARMONTH))) + goto error; + + if ((type == XML_SCHEMAS_GYEARMONTH) && (dt->type != XML_SCHEMAS_GYEAR)) + goto error; + + if ((type == XML_SCHEMAS_GMONTHDAY) && (dt->type != XML_SCHEMAS_GMONTH)) + goto error; + } +#endif + + if (val != NULL) + *val = dt; + else + xmlSchemaFreeValue(dt); + + return 0; + +error: + if (dt != NULL) + xmlSchemaFreeValue(dt); + return 1; +} + +/** + * xmlSchemaValidateDuration: + * @type: the predefined type + * @duration: string to analyze + * @val: the return computed value + * + * Check that @duration conforms to the lexical space of the duration type. + * if true a value is computed and returned in @val. + * + * Returns 0 if this validates, a positive error code number otherwise + * and -1 in case of internal or API error. + */ +static int +xmlSchemaValidateDuration (xmlSchemaTypePtr type ATTRIBUTE_UNUSED, + const xmlChar *duration, xmlSchemaValPtr *val, + int collapse) { + const xmlChar *cur = duration; + xmlSchemaValPtr dur; + int isneg = 0; + unsigned int seq = 0; + double num; + int num_type = 0; /* -1 = invalid, 0 = int, 1 = floating */ + const xmlChar desig[] = {'Y', 'M', 'D', 'H', 'M', 'S'}; + const double multi[] = { 0.0, 0.0, 86400.0, 3600.0, 60.0, 1.0, 0.0}; + + if (duration == NULL) + return -1; + + if (collapse) + while IS_WSP_BLANK_CH(*cur) cur++; + + if (*cur == '-') { + isneg = 1; + cur++; + } + + /* duration must start with 'P' (after sign) */ + if (*cur++ != 'P') + return 1; + + if (*cur == 0) + return 1; + + dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION); + if (dur == NULL) + return -1; + + while (*cur != 0) { + + /* input string should be empty or invalid date/time item */ + if (seq >= sizeof(desig)) + goto error; + + /* T designator must be present for time items */ + if (*cur == 'T') { + if (seq <= 3) { + seq = 3; + cur++; + } else + return 1; + } else if (seq == 3) + goto error; + + /* parse the number portion of the item */ + PARSE_NUM(num, cur, num_type); + + if ((num_type == -1) || (*cur == 0)) + goto error; + + /* update duration based on item type */ + while (seq < sizeof(desig)) { + if (*cur == desig[seq]) { + + /* verify numeric type; only seconds can be float */ + if ((num_type != 0) && (seq < (sizeof(desig)-1))) + goto error; + + switch (seq) { + case 0: + dur->value.dur.mon = (long)num * 12; + break; + case 1: + dur->value.dur.mon += (long)num; + break; + default: + /* convert to seconds using multiplier */ + dur->value.dur.sec += num * multi[seq]; + seq++; + break; + } + + break; /* exit loop */ + } + /* no date designators found? */ + if ((++seq == 3) || (seq == 6)) + goto error; + } + cur++; + if (collapse) + while IS_WSP_BLANK_CH(*cur) cur++; + } + + if (isneg) { + dur->value.dur.mon = -dur->value.dur.mon; + dur->value.dur.day = -dur->value.dur.day; + dur->value.dur.sec = -dur->value.dur.sec; + } + + if (val != NULL) + *val = dur; + else + xmlSchemaFreeValue(dur); + + return 0; + +error: + if (dur != NULL) + xmlSchemaFreeValue(dur); + return 1; +} + +/** + * xmlSchemaStrip: + * @value: a value + * + * Removes the leading and ending spaces of a string + * + * Returns the new string or NULL if no change was required. + */ +static xmlChar * +xmlSchemaStrip(const xmlChar *value) { + const xmlChar *start = value, *end, *f; + + if (value == NULL) return(NULL); + while ((*start != 0) && (IS_BLANK_CH(*start))) start++; + end = start; + while (*end != 0) end++; + f = end; + end--; + while ((end > start) && (IS_BLANK_CH(*end))) end--; + end++; + if ((start == value) && (f == end)) return(NULL); + return(xmlStrndup(start, end - start)); +} + +/** + * xmlSchemaWhiteSpaceReplace: + * @value: a value + * + * Replaces 0xd, 0x9 and 0xa with a space. + * + * Returns the new string or NULL if no change was required. + */ +xmlChar * +xmlSchemaWhiteSpaceReplace(const xmlChar *value) { + const xmlChar *cur = value; + xmlChar *ret = NULL, *mcur; + + if (value == NULL) + return(NULL); + + while ((*cur != 0) && + (((*cur) != 0xd) && ((*cur) != 0x9) && ((*cur) != 0xa))) { + cur++; + } + if (*cur == 0) + return (NULL); + ret = xmlStrdup(value); + /* TODO FIXME: I guess gcc will bark at this. */ + mcur = (xmlChar *) (ret + (cur - value)); + do { + if ( ((*mcur) == 0xd) || ((*mcur) == 0x9) || ((*mcur) == 0xa) ) + *mcur = ' '; + mcur++; + } while (*mcur != 0); + return(ret); +} + +/** + * xmlSchemaCollapseString: + * @value: a value + * + * Removes and normalize white spaces in the string + * + * Returns the new string or NULL if no change was required. + */ +xmlChar * +xmlSchemaCollapseString(const xmlChar *value) { + const xmlChar *start = value, *end, *f; + xmlChar *g; + int col = 0; + + if (value == NULL) return(NULL); + while ((*start != 0) && (IS_BLANK_CH(*start))) start++; + end = start; + while (*end != 0) { + if ((*end == ' ') && (IS_BLANK_CH(end[1]))) { + col = end - start; + break; + } else if ((*end == 0xa) || (*end == 0x9) || (*end == 0xd)) { + col = end - start; + break; + } + end++; + } + if (col == 0) { + f = end; + end--; + while ((end > start) && (IS_BLANK_CH(*end))) end--; + end++; + if ((start == value) && (f == end)) return(NULL); + return(xmlStrndup(start, end - start)); + } + start = xmlStrdup(start); + if (start == NULL) return(NULL); + g = (xmlChar *) (start + col); + end = g; + while (*end != 0) { + if (IS_BLANK_CH(*end)) { + end++; + while (IS_BLANK_CH(*end)) end++; + if (*end != 0) + *g++ = ' '; + } else + *g++ = *end++; + } + *g = 0; + return((xmlChar *) start); +} + +/** + * xmlSchemaValAtomicListNode: + * @type: the predefined atomic type for a token in the list + * @value: the list value to check + * @ret: the return computed value + * @node: the node containing the value + * + * Check that a value conforms to the lexical space of the predefined + * list type. if true a value is computed and returned in @ret. + * + * Returns the number of items if this validates, a negative error code + * number otherwise + */ +static int +xmlSchemaValAtomicListNode(xmlSchemaTypePtr type, const xmlChar *value, + xmlSchemaValPtr *ret, xmlNodePtr node) { + xmlChar *val, *cur, *endval; + int nb_values = 0; + int tmp = 0; + + if (value == NULL) { + return(-1); + } + val = xmlStrdup(value); + if (val == NULL) { + return(-1); + } + if (ret != NULL) { + *ret = NULL; + } + cur = val; + /* + * Split the list + */ + while (IS_BLANK_CH(*cur)) *cur++ = 0; + while (*cur != 0) { + if (IS_BLANK_CH(*cur)) { + *cur = 0; + cur++; + while (IS_BLANK_CH(*cur)) *cur++ = 0; + } else { + nb_values++; + cur++; + while ((*cur != 0) && (!IS_BLANK_CH(*cur))) cur++; + } + } + if (nb_values == 0) { + xmlFree(val); + return(nb_values); + } + endval = cur; + cur = val; + while ((*cur == 0) && (cur != endval)) cur++; + while (cur != endval) { + tmp = xmlSchemaValPredefTypeNode(type, cur, NULL, node); + if (tmp != 0) + break; + while (*cur != 0) cur++; + while ((*cur == 0) && (cur != endval)) cur++; + } + /* TODO what return value ? c.f. bug #158628 + if (ret != NULL) { + TODO + } */ + xmlFree(val); + if (tmp == 0) + return(nb_values); + return(-1); +} + +/** + * xmlSchemaParseUInt: + * @str: pointer to the string R/W + * @llo: pointer to the low result + * @lmi: pointer to the mid result + * @lhi: pointer to the high result + * + * Parse an unsigned long into 3 fields. + * + * Returns the number of significant digits in the number or + * -1 if overflow of the capacity and -2 if it's not a number. + */ +static int +xmlSchemaParseUInt(const xmlChar **str, unsigned long *llo, + unsigned long *lmi, unsigned long *lhi) { + unsigned long lo = 0, mi = 0, hi = 0; + const xmlChar *tmp, *cur = *str; + int ret = 0, i = 0; + + if (!((*cur >= '0') && (*cur <= '9'))) + return(-2); + + while (*cur == '0') { /* ignore leading zeroes */ + cur++; + } + tmp = cur; + while ((*tmp != 0) && (*tmp >= '0') && (*tmp <= '9')) { + i++;tmp++;ret++; + } + if (i > 24) { + *str = tmp; + return(-1); + } + while (i > 16) { + hi = hi * 10 + (*cur++ - '0'); + i--; + } + while (i > 8) { + mi = mi * 10 + (*cur++ - '0'); + i--; + } + while (i > 0) { + lo = lo * 10 + (*cur++ - '0'); + i--; + } + + *str = cur; + *llo = lo; + *lmi = mi; + *lhi = hi; + return(ret); +} + +/** + * xmlSchemaValAtomicType: + * @type: the predefined type + * @value: the value to check + * @val: the return computed value + * @node: the node containing the value + * flags: flags to control the vlidation + * + * Check that a value conforms to the lexical space of the atomic type. + * if true a value is computed and returned in @val. + * This checks the value space for list types as well (IDREFS, NMTOKENS). + * + * Returns 0 if this validates, a positive error code number otherwise + * and -1 in case of internal or API error. + */ +static int +xmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar * value, + xmlSchemaValPtr * val, xmlNodePtr node, int flags, + xmlSchemaWhitespaceValueType ws, + int normOnTheFly, int applyNorm, int createStringValue) +{ + xmlSchemaValPtr v; + xmlChar *norm = NULL; + int ret = 0; + + if (xmlSchemaTypesInitialized == 0) + xmlSchemaInitTypes(); + if (type == NULL) + return (-1); + + /* + * validating a non existant text node is similar to validating + * an empty one. + */ + if (value == NULL) + value = BAD_CAST ""; + + if (val != NULL) + *val = NULL; + if ((flags == 0) && (value != NULL)) { + + if ((type->builtInType != XML_SCHEMAS_STRING) && + (type->builtInType != XML_SCHEMAS_ANYTYPE) && + (type->builtInType != XML_SCHEMAS_ANYSIMPLETYPE)) { + if (type->builtInType == XML_SCHEMAS_NORMSTRING) + norm = xmlSchemaWhiteSpaceReplace(value); + else + norm = xmlSchemaCollapseString(value); + if (norm != NULL) + value = norm; + } + } + + switch (type->builtInType) { + case XML_SCHEMAS_UNKNOWN: + goto error; + case XML_SCHEMAS_ANYTYPE: + case XML_SCHEMAS_ANYSIMPLETYPE: + if ((createStringValue) && (val != NULL)) { + v = xmlSchemaNewValue(XML_SCHEMAS_ANYSIMPLETYPE); + if (v != NULL) { + v->value.str = xmlStrdup(value); + *val = v; + } else { + goto error; + } + } + goto return0; + case XML_SCHEMAS_STRING: + if (! normOnTheFly) { + const xmlChar *cur = value; + + if (ws == XML_SCHEMA_WHITESPACE_REPLACE) { + while (*cur != 0) { + if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { + goto return1; + } else { + cur++; + } + } + } else if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) { + while (*cur != 0) { + if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { + goto return1; + } else if IS_WSP_SPACE_CH(*cur) { + cur++; + if IS_WSP_SPACE_CH(*cur) + goto return1; + } else { + cur++; + } + } + } + } + if (createStringValue && (val != NULL)) { + if (applyNorm) { + if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) + norm = xmlSchemaCollapseString(value); + else if (ws == XML_SCHEMA_WHITESPACE_REPLACE) + norm = xmlSchemaWhiteSpaceReplace(value); + if (norm != NULL) + value = norm; + } + v = xmlSchemaNewValue(XML_SCHEMAS_STRING); + if (v != NULL) { + v->value.str = xmlStrdup(value); + *val = v; + } else { + goto error; + } + } + goto return0; + case XML_SCHEMAS_NORMSTRING:{ + if (normOnTheFly) { + if (applyNorm) { + if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) + norm = xmlSchemaCollapseString(value); + else + norm = xmlSchemaWhiteSpaceReplace(value); + if (norm != NULL) + value = norm; + } + } else { + const xmlChar *cur = value; + while (*cur != 0) { + if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { + goto return1; + } else { + cur++; + } + } + } + if (val != NULL) { + v = xmlSchemaNewValue(XML_SCHEMAS_NORMSTRING); + if (v != NULL) { + v->value.str = xmlStrdup(value); + *val = v; + } else { + goto error; + } + } + goto return0; + } + case XML_SCHEMAS_DECIMAL:{ + const xmlChar *cur = value; + unsigned int len, neg, integ, hasLeadingZeroes; + xmlChar cval[25]; + xmlChar *cptr = cval; + + if ((cur == NULL) || (*cur == 0)) + goto return1; + + /* + * xs:decimal has a whitespace-facet value of 'collapse'. + */ + if (normOnTheFly) + while IS_WSP_BLANK_CH(*cur) cur++; + + /* + * First we handle an optional sign. + */ + neg = 0; + if (*cur == '-') { + neg = 1; + cur++; + } else if (*cur == '+') + cur++; + /* + * Disallow: "", "-", "- " + */ + if (*cur == 0) + goto return1; + /* + * Next we "pre-parse" the number, in preparation for calling + * the common routine xmlSchemaParseUInt. We get rid of any + * leading zeroes (because we have reserved only 25 chars), + * and note the position of a decimal point. + */ + len = 0; + integ = ~0u; + hasLeadingZeroes = 0; + /* + * Skip leading zeroes. + */ + while (*cur == '0') { + cur++; + hasLeadingZeroes = 1; + } + if (*cur != 0) { + do { + if ((*cur >= '0') && (*cur <= '9')) { + *cptr++ = *cur++; + len++; + } else if (*cur == '.') { + cur++; + integ = len; + do { + if ((*cur >= '0') && (*cur <= '9')) { + *cptr++ = *cur++; + len++; + } else + break; + } while (len < 24); + /* + * Disallow "." but allow "00." + */ + if ((len == 0) && (!hasLeadingZeroes)) + goto return1; + break; + } else + break; + } while (len < 24); + } + if (normOnTheFly) + while IS_WSP_BLANK_CH(*cur) cur++; + if (*cur != 0) + goto return1; /* error if any extraneous chars */ + if (val != NULL) { + v = xmlSchemaNewValue(XML_SCHEMAS_DECIMAL); + if (v != NULL) { + /* + * Now evaluate the significant digits of the number + */ + if (len != 0) { + + if (integ != ~0u) { + /* + * Get rid of trailing zeroes in the + * fractional part. + */ + while ((len != integ) && (*(cptr-1) == '0')) { + cptr--; + len--; + } + } + /* + * Terminate the (preparsed) string. + */ + if (len != 0) { + *cptr = 0; + cptr = cval; + + xmlSchemaParseUInt((const xmlChar **)&cptr, + &v->value.decimal.lo, + &v->value.decimal.mi, + &v->value.decimal.hi); + } + } + /* + * Set the total digits to 1 if a zero value. + */ + v->value.decimal.sign = neg; + if (len == 0) { + /* Speedup for zero values. */ + v->value.decimal.total = 1; + } else { + v->value.decimal.total = len; + if (integ == ~0u) + v->value.decimal.frac = 0; + else + v->value.decimal.frac = len - integ; + } + *val = v; + } + } + goto return0; + } + case XML_SCHEMAS_TIME: + case XML_SCHEMAS_GDAY: + case XML_SCHEMAS_GMONTH: + case XML_SCHEMAS_GMONTHDAY: + case XML_SCHEMAS_GYEAR: + case XML_SCHEMAS_GYEARMONTH: + case XML_SCHEMAS_DATE: + case XML_SCHEMAS_DATETIME: + ret = xmlSchemaValidateDates(type->builtInType, value, val, + normOnTheFly); + break; + case XML_SCHEMAS_DURATION: + ret = xmlSchemaValidateDuration(type, value, val, + normOnTheFly); + break; + case XML_SCHEMAS_FLOAT: + case XML_SCHEMAS_DOUBLE: { + const xmlChar *cur = value; + int neg = 0; + int digits_before = 0; + int digits_after = 0; + + if (normOnTheFly) + while IS_WSP_BLANK_CH(*cur) cur++; + + if ((cur[0] == 'N') && (cur[1] == 'a') && (cur[2] == 'N')) { + cur += 3; + if (*cur != 0) + goto return1; + if (val != NULL) { + if (type == xmlSchemaTypeFloatDef) { + v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT); + if (v != NULL) { + v->value.f = (float) xmlXPathNAN; + } else { + xmlSchemaFreeValue(v); + goto error; + } + } else { + v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE); + if (v != NULL) { + v->value.d = xmlXPathNAN; + } else { + xmlSchemaFreeValue(v); + goto error; + } + } + *val = v; + } + goto return0; + } + if (*cur == '-') { + neg = 1; + cur++; + } + if ((cur[0] == 'I') && (cur[1] == 'N') && (cur[2] == 'F')) { + cur += 3; + if (*cur != 0) + goto return1; + if (val != NULL) { + if (type == xmlSchemaTypeFloatDef) { + v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT); + if (v != NULL) { + if (neg) + v->value.f = (float) xmlXPathNINF; + else + v->value.f = (float) xmlXPathPINF; + } else { + xmlSchemaFreeValue(v); + goto error; + } + } else { + v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE); + if (v != NULL) { + if (neg) + v->value.d = xmlXPathNINF; + else + v->value.d = xmlXPathPINF; + } else { + xmlSchemaFreeValue(v); + goto error; + } + } + *val = v; + } + goto return0; + } + if ((neg == 0) && (*cur == '+')) + cur++; + if ((cur[0] == 0) || (cur[0] == '+') || (cur[0] == '-')) + goto return1; + while ((*cur >= '0') && (*cur <= '9')) { + cur++; + digits_before++; + } + if (*cur == '.') { + cur++; + while ((*cur >= '0') && (*cur <= '9')) { + cur++; + digits_after++; + } + } + if ((digits_before == 0) && (digits_after == 0)) + goto return1; + if ((*cur == 'e') || (*cur == 'E')) { + cur++; + if ((*cur == '-') || (*cur == '+')) + cur++; + while ((*cur >= '0') && (*cur <= '9')) + cur++; + } + if (normOnTheFly) + while IS_WSP_BLANK_CH(*cur) cur++; + + if (*cur != 0) + goto return1; + if (val != NULL) { + if (type == xmlSchemaTypeFloatDef) { + v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT); + if (v != NULL) { + /* + * TODO: sscanf seems not to give the correct + * value for extremely high/low values. + * E.g. "1E-149" results in zero. + */ + if (sscanf((const char *) value, "%f", + &(v->value.f)) == 1) { + *val = v; + } else { + xmlSchemaFreeValue(v); + goto return1; + } + } else { + goto error; + } + } else { + v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE); + if (v != NULL) { + /* + * TODO: sscanf seems not to give the correct + * value for extremely high/low values. + */ + if (sscanf((const char *) value, "%lf", + &(v->value.d)) == 1) { + *val = v; + } else { + xmlSchemaFreeValue(v); + goto return1; + } + } else { + goto error; + } + } + } + goto return0; + } + case XML_SCHEMAS_BOOLEAN:{ + const xmlChar *cur = value; + + if (normOnTheFly) { + while IS_WSP_BLANK_CH(*cur) cur++; + if (*cur == '0') { + ret = 0; + cur++; + } else if (*cur == '1') { + ret = 1; + cur++; + } else if (*cur == 't') { + cur++; + if ((*cur++ == 'r') && (*cur++ == 'u') && + (*cur++ == 'e')) { + ret = 1; + } else + goto return1; + } else if (*cur == 'f') { + cur++; + if ((*cur++ == 'a') && (*cur++ == 'l') && + (*cur++ == 's') && (*cur++ == 'e')) { + ret = 0; + } else + goto return1; + } else + goto return1; + if (*cur != 0) { + while IS_WSP_BLANK_CH(*cur) cur++; + if (*cur != 0) + goto return1; + } + } else { + if ((cur[0] == '0') && (cur[1] == 0)) + ret = 0; + else if ((cur[0] == '1') && (cur[1] == 0)) + ret = 1; + else if ((cur[0] == 't') && (cur[1] == 'r') + && (cur[2] == 'u') && (cur[3] == 'e') + && (cur[4] == 0)) + ret = 1; + else if ((cur[0] == 'f') && (cur[1] == 'a') + && (cur[2] == 'l') && (cur[3] == 's') + && (cur[4] == 'e') && (cur[5] == 0)) + ret = 0; + else + goto return1; + } + if (val != NULL) { + v = xmlSchemaNewValue(XML_SCHEMAS_BOOLEAN); + if (v != NULL) { + v->value.b = ret; + *val = v; + } else { + goto error; + } + } + goto return0; + } + case XML_SCHEMAS_TOKEN:{ + const xmlChar *cur = value; + + if (! normOnTheFly) { + while (*cur != 0) { + if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { + goto return1; + } else if (*cur == ' ') { + cur++; + if (*cur == 0) + goto return1; + if (*cur == ' ') + goto return1; + } else { + cur++; + } + } + } + if (val != NULL) { + v = xmlSchemaNewValue(XML_SCHEMAS_TOKEN); + if (v != NULL) { + v->value.str = xmlStrdup(value); + *val = v; + } else { + goto error; + } + } + goto return0; + } + case XML_SCHEMAS_LANGUAGE: + if (normOnTheFly) { + norm = xmlSchemaCollapseString(value); + if (norm != NULL) + value = norm; + } + if (xmlCheckLanguageID(value) == 1) { + if (val != NULL) { + v = xmlSchemaNewValue(XML_SCHEMAS_LANGUAGE); + if (v != NULL) { + v->value.str = xmlStrdup(value); + *val = v; + } else { + goto error; + } + } + goto return0; + } + goto return1; + case XML_SCHEMAS_NMTOKEN: + if (xmlValidateNMToken(value, 1) == 0) { + if (val != NULL) { + v = xmlSchemaNewValue(XML_SCHEMAS_NMTOKEN); + if (v != NULL) { + v->value.str = xmlStrdup(value); + *val = v; + } else { + goto error; + } + } + goto return0; + } + goto return1; + case XML_SCHEMAS_NMTOKENS: + ret = xmlSchemaValAtomicListNode(xmlSchemaTypeNmtokenDef, + value, val, node); + if (ret > 0) + ret = 0; + else + ret = 1; + goto done; + case XML_SCHEMAS_NAME: + ret = xmlValidateName(value, 1); + if ((ret == 0) && (val != NULL) && (value != NULL)) { + v = xmlSchemaNewValue(XML_SCHEMAS_NAME); + if (v != NULL) { + const xmlChar *start = value, *end; + while (IS_BLANK_CH(*start)) start++; + end = start; + while ((*end != 0) && (!IS_BLANK_CH(*end))) end++; + v->value.str = xmlStrndup(start, end - start); + *val = v; + } else { + goto error; + } + } + goto done; + case XML_SCHEMAS_QNAME:{ + const xmlChar *uri = NULL; + xmlChar *local = NULL; + + ret = xmlValidateQName(value, 1); + if (ret != 0) + goto done; + if (node != NULL) { + xmlChar *prefix; + xmlNsPtr ns; + + local = xmlSplitQName2(value, &prefix); + ns = xmlSearchNs(node->doc, node, prefix); + if ((ns == NULL) && (prefix != NULL)) { + xmlFree(prefix); + if (local != NULL) + xmlFree(local); + goto return1; + } + if (ns != NULL) + uri = ns->href; + if (prefix != NULL) + xmlFree(prefix); + } + if (val != NULL) { + v = xmlSchemaNewValue(XML_SCHEMAS_QNAME); + if (v == NULL) { + if (local != NULL) + xmlFree(local); + goto error; + } + if (local != NULL) + v->value.qname.name = local; + else + v->value.qname.name = xmlStrdup(value); + if (uri != NULL) + v->value.qname.uri = xmlStrdup(uri); + *val = v; + } else + if (local != NULL) + xmlFree(local); + goto done; + } + case XML_SCHEMAS_NCNAME: + ret = xmlValidateNCName(value, 1); + if ((ret == 0) && (val != NULL)) { + v = xmlSchemaNewValue(XML_SCHEMAS_NCNAME); + if (v != NULL) { + v->value.str = xmlStrdup(value); + *val = v; + } else { + goto error; + } + } + goto done; + case XML_SCHEMAS_ID: + ret = xmlValidateNCName(value, 1); + if ((ret == 0) && (val != NULL)) { + v = xmlSchemaNewValue(XML_SCHEMAS_ID); + if (v != NULL) { + v->value.str = xmlStrdup(value); + *val = v; + } else { + goto error; + } + } + if ((ret == 0) && (node != NULL) && + (node->type == XML_ATTRIBUTE_NODE)) { + xmlAttrPtr attr = (xmlAttrPtr) node; + + /* + * NOTE: the IDness might have already be declared in the DTD + */ + if (attr->atype != XML_ATTRIBUTE_ID) { + xmlIDPtr res; + xmlChar *strip; + + strip = xmlSchemaStrip(value); + if (strip != NULL) { + res = xmlAddID(NULL, node->doc, strip, attr); + xmlFree(strip); + } else + res = xmlAddID(NULL, node->doc, value, attr); + if (res == NULL) { + ret = 2; + } else { + attr->atype = XML_ATTRIBUTE_ID; + } + } + } + goto done; + case XML_SCHEMAS_IDREF: + ret = xmlValidateNCName(value, 1); + if ((ret == 0) && (val != NULL)) { + v = xmlSchemaNewValue(XML_SCHEMAS_IDREF); + if (v == NULL) + goto error; + v->value.str = xmlStrdup(value); + *val = v; + } + if ((ret == 0) && (node != NULL) && + (node->type == XML_ATTRIBUTE_NODE)) { + xmlAttrPtr attr = (xmlAttrPtr) node; + xmlChar *strip; + + strip = xmlSchemaStrip(value); + if (strip != NULL) { + xmlAddRef(NULL, node->doc, strip, attr); + xmlFree(strip); + } else + xmlAddRef(NULL, node->doc, value, attr); + attr->atype = XML_ATTRIBUTE_IDREF; + } + goto done; + case XML_SCHEMAS_IDREFS: + ret = xmlSchemaValAtomicListNode(xmlSchemaTypeIdrefDef, + value, val, node); + if (ret < 0) + ret = 2; + else + ret = 0; + if ((ret == 0) && (node != NULL) && + (node->type == XML_ATTRIBUTE_NODE)) { + xmlAttrPtr attr = (xmlAttrPtr) node; + + attr->atype = XML_ATTRIBUTE_IDREFS; + } + goto done; + case XML_SCHEMAS_ENTITY:{ + xmlChar *strip; + + ret = xmlValidateNCName(value, 1); + if ((node == NULL) || (node->doc == NULL)) + ret = 3; + if (ret == 0) { + xmlEntityPtr ent; + + strip = xmlSchemaStrip(value); + if (strip != NULL) { + ent = xmlGetDocEntity(node->doc, strip); + xmlFree(strip); + } else { + ent = xmlGetDocEntity(node->doc, value); + } + if ((ent == NULL) || + (ent->etype != + XML_EXTERNAL_GENERAL_UNPARSED_ENTITY)) + ret = 4; + } + if ((ret == 0) && (val != NULL)) { + TODO; + } + if ((ret == 0) && (node != NULL) && + (node->type == XML_ATTRIBUTE_NODE)) { + xmlAttrPtr attr = (xmlAttrPtr) node; + + attr->atype = XML_ATTRIBUTE_ENTITY; + } + goto done; + } + case XML_SCHEMAS_ENTITIES: + if ((node == NULL) || (node->doc == NULL)) + goto return3; + ret = xmlSchemaValAtomicListNode(xmlSchemaTypeEntityDef, + value, val, node); + if (ret <= 0) + ret = 1; + else + ret = 0; + if ((ret == 0) && (node != NULL) && + (node->type == XML_ATTRIBUTE_NODE)) { + xmlAttrPtr attr = (xmlAttrPtr) node; + + attr->atype = XML_ATTRIBUTE_ENTITIES; + } + goto done; + case XML_SCHEMAS_NOTATION:{ + xmlChar *uri = NULL; + xmlChar *local = NULL; + + ret = xmlValidateQName(value, 1); + if ((ret == 0) && (node != NULL)) { + xmlChar *prefix; + + local = xmlSplitQName2(value, &prefix); + if (prefix != NULL) { + xmlNsPtr ns; + + ns = xmlSearchNs(node->doc, node, prefix); + if (ns == NULL) + ret = 1; + else if (val != NULL) + uri = xmlStrdup(ns->href); + } + if ((local != NULL) && ((val == NULL) || (ret != 0))) + xmlFree(local); + if (prefix != NULL) + xmlFree(prefix); + } + if ((node == NULL) || (node->doc == NULL)) + ret = 3; + if (ret == 0) { + ret = xmlValidateNotationUse(NULL, node->doc, value); + if (ret == 1) + ret = 0; + else + ret = 1; + } + if ((ret == 0) && (val != NULL)) { + v = xmlSchemaNewValue(XML_SCHEMAS_NOTATION); + if (v != NULL) { + if (local != NULL) + v->value.qname.name = local; + else + v->value.qname.name = xmlStrdup(value); + if (uri != NULL) + v->value.qname.uri = uri; + + *val = v; + } else { + if (local != NULL) + xmlFree(local); + if (uri != NULL) + xmlFree(uri); + goto error; + } + } + goto done; + } + case XML_SCHEMAS_ANYURI:{ + if (*value != 0) { + xmlURIPtr uri; + xmlChar *tmpval, *cur; + if (normOnTheFly) { + norm = xmlSchemaCollapseString(value); + if (norm != NULL) + value = norm; + } + tmpval = xmlStrdup(value); + for (cur = tmpval; *cur; ++cur) { + if (*cur < 32 || *cur >= 127 || *cur == ' ' || + *cur == '<' || *cur == '>' || *cur == '"' || + *cur == '{' || *cur == '}' || *cur == '|' || + *cur == '\\' || *cur == '^' || *cur == '`' || + *cur == '\'') + *cur = '_'; + } + uri = xmlParseURI((const char *) tmpval); + xmlFree(tmpval); + if (uri == NULL) + goto return1; + xmlFreeURI(uri); + } + + if (val != NULL) { + v = xmlSchemaNewValue(XML_SCHEMAS_ANYURI); + if (v == NULL) + goto error; + v->value.str = xmlStrdup(value); + *val = v; + } + goto return0; + } + case XML_SCHEMAS_HEXBINARY:{ + const xmlChar *cur = value, *start; + xmlChar *base; + int total, i = 0; + + if (cur == NULL) + goto return1; + + if (normOnTheFly) + while IS_WSP_BLANK_CH(*cur) cur++; + + start = cur; + while (((*cur >= '0') && (*cur <= '9')) || + ((*cur >= 'A') && (*cur <= 'F')) || + ((*cur >= 'a') && (*cur <= 'f'))) { + i++; + cur++; + } + if (normOnTheFly) + while IS_WSP_BLANK_CH(*cur) cur++; + + if (*cur != 0) + goto return1; + if ((i % 2) != 0) + goto return1; + + if (val != NULL) { + + v = xmlSchemaNewValue(XML_SCHEMAS_HEXBINARY); + if (v == NULL) + goto error; + /* + * Copy only the normalized piece. + * CRITICAL TODO: Check this. + */ + cur = xmlStrndup(start, i); + if (cur == NULL) { + xmlSchemaTypeErrMemory(node, "allocating hexbin data"); + xmlFree(v); + goto return1; + } + + total = i / 2; /* number of octets */ + + base = (xmlChar *) cur; + while (i-- > 0) { + if (*base >= 'a') + *base = *base - ('a' - 'A'); + base++; + } + + v->value.hex.str = (xmlChar *) cur; + v->value.hex.total = total; + *val = v; + } + goto return0; + } + case XML_SCHEMAS_BASE64BINARY:{ + /* ISSUE: + * + * Ignore all stray characters? (yes, currently) + * Worry about long lines? (no, currently) + * + * rfc2045.txt: + * + * "The encoded output stream must be represented in lines of + * no more than 76 characters each. All line breaks or other + * characters not found in Table 1 must be ignored by decoding + * software. In base64 data, characters other than those in + * Table 1, line breaks, and other white space probably + * indicate a transmission error, about which a warning + * message or even a message rejection might be appropriate + * under some circumstances." */ + const xmlChar *cur = value; + xmlChar *base; + int total, i = 0, pad = 0; + + if (cur == NULL) + goto return1; + + for (; *cur; ++cur) { + int decc; + + decc = _xmlSchemaBase64Decode(*cur); + if (decc < 0) ; + else if (decc < 64) + i++; + else + break; + } + for (; *cur; ++cur) { + int decc; + + decc = _xmlSchemaBase64Decode(*cur); + if (decc < 0) ; + else if (decc < 64) + goto return1; + if (decc == 64) + pad++; + } + + /* rfc2045.txt: "Special processing is performed if fewer than + * 24 bits are available at the end of the data being encoded. + * A full encoding quantum is always completed at the end of a + * body. When fewer than 24 input bits are available in an + * input group, zero bits are added (on the right) to form an + * integral number of 6-bit groups. Padding at the end of the + * data is performed using the "=" character. Since all + * base64 input is an integral number of octets, only the + * following cases can arise: (1) the final quantum of + * encoding input is an integral multiple of 24 bits; here, + * the final unit of encoded output will be an integral + * multiple ofindent: Standard input:701: Warning:old style + * assignment ambiguity in "=*". Assuming "= *" 4 characters + * with no "=" padding, (2) the final + * quantum of encoding input is exactly 8 bits; here, the + * final unit of encoded output will be two characters + * followed by two "=" padding characters, or (3) the final + * quantum of encoding input is exactly 16 bits; here, the + * final unit of encoded output will be three characters + * followed by one "=" padding character." */ + + total = 3 * (i / 4); + if (pad == 0) { + if (i % 4 != 0) + goto return1; + } else if (pad == 1) { + int decc; + + if (i % 4 != 3) + goto return1; + for (decc = _xmlSchemaBase64Decode(*cur); + (decc < 0) || (decc > 63); + decc = _xmlSchemaBase64Decode(*cur)) + --cur; + /* 16bits in 24bits means 2 pad bits: nnnnnn nnmmmm mmmm00*/ + /* 00111100 -> 0x3c */ + if (decc & ~0x3c) + goto return1; + total += 2; + } else if (pad == 2) { + int decc; + + if (i % 4 != 2) + goto return1; + for (decc = _xmlSchemaBase64Decode(*cur); + (decc < 0) || (decc > 63); + decc = _xmlSchemaBase64Decode(*cur)) + --cur; + /* 8bits in 12bits means 4 pad bits: nnnnnn nn0000 */ + /* 00110000 -> 0x30 */ + if (decc & ~0x30) + goto return1; + total += 1; + } else + goto return1; + + if (val != NULL) { + v = xmlSchemaNewValue(XML_SCHEMAS_BASE64BINARY); + if (v == NULL) + goto error; + base = + (xmlChar *) xmlMallocAtomic((i + pad + 1) * + sizeof(xmlChar)); + if (base == NULL) { + xmlSchemaTypeErrMemory(node, "allocating base64 data"); + xmlFree(v); + goto return1; + } + v->value.base64.str = base; + for (cur = value; *cur; ++cur) + if (_xmlSchemaBase64Decode(*cur) >= 0) { + *base = *cur; + ++base; + } + *base = 0; + v->value.base64.total = total; + *val = v; + } + goto return0; + } + case XML_SCHEMAS_INTEGER: + case XML_SCHEMAS_PINTEGER: + case XML_SCHEMAS_NPINTEGER: + case XML_SCHEMAS_NINTEGER: + case XML_SCHEMAS_NNINTEGER:{ + const xmlChar *cur = value; + unsigned long lo, mi, hi; + int sign = 0; + + if (cur == NULL) + goto return1; + if (normOnTheFly) + while IS_WSP_BLANK_CH(*cur) cur++; + if (*cur == '-') { + sign = 1; + cur++; + } else if (*cur == '+') + cur++; + ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); + if (ret < 0) + goto return1; + if (normOnTheFly) + while IS_WSP_BLANK_CH(*cur) cur++; + if (*cur != 0) + goto return1; + if (type->builtInType == XML_SCHEMAS_NPINTEGER) { + if ((sign == 0) && + ((hi != 0) || (mi != 0) || (lo != 0))) + goto return1; + } else if (type->builtInType == XML_SCHEMAS_PINTEGER) { + if (sign == 1) + goto return1; + if ((hi == 0) && (mi == 0) && (lo == 0)) + goto return1; + } else if (type->builtInType == XML_SCHEMAS_NINTEGER) { + if (sign == 0) + goto return1; + if ((hi == 0) && (mi == 0) && (lo == 0)) + goto return1; + } else if (type->builtInType == XML_SCHEMAS_NNINTEGER) { + if ((sign == 1) && + ((hi != 0) || (mi != 0) || (lo != 0))) + goto return1; + } + if (val != NULL) { + v = xmlSchemaNewValue(type->builtInType); + if (v != NULL) { + if (ret == 0) + ret++; + v->value.decimal.lo = lo; + v->value.decimal.mi = mi; + v->value.decimal.hi = hi; + v->value.decimal.sign = sign; + v->value.decimal.frac = 0; + v->value.decimal.total = ret; + *val = v; + } + } + goto return0; + } + case XML_SCHEMAS_LONG: + case XML_SCHEMAS_BYTE: + case XML_SCHEMAS_SHORT: + case XML_SCHEMAS_INT:{ + const xmlChar *cur = value; + unsigned long lo, mi, hi; + int sign = 0; + + if (cur == NULL) + goto return1; + if (*cur == '-') { + sign = 1; + cur++; + } else if (*cur == '+') + cur++; + ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); + if (ret < 0) + goto return1; + if (*cur != 0) + goto return1; + if (type->builtInType == XML_SCHEMAS_LONG) { + if (hi >= 922) { + if (hi > 922) + goto return1; + if (mi >= 33720368) { + if (mi > 33720368) + goto return1; + if ((sign == 0) && (lo > 54775807)) + goto return1; + if ((sign == 1) && (lo > 54775808)) + goto return1; + } + } + } else if (type->builtInType == XML_SCHEMAS_INT) { + if (hi != 0) + goto return1; + if (mi >= 21) { + if (mi > 21) + goto return1; + if ((sign == 0) && (lo > 47483647)) + goto return1; + if ((sign == 1) && (lo > 47483648)) + goto return1; + } + } else if (type->builtInType == XML_SCHEMAS_SHORT) { + if ((mi != 0) || (hi != 0)) + goto return1; + if ((sign == 1) && (lo > 32768)) + goto return1; + if ((sign == 0) && (lo > 32767)) + goto return1; + } else if (type->builtInType == XML_SCHEMAS_BYTE) { + if ((mi != 0) || (hi != 0)) + goto return1; + if ((sign == 1) && (lo > 128)) + goto return1; + if ((sign == 0) && (lo > 127)) + goto return1; + } + if (val != NULL) { + v = xmlSchemaNewValue(type->builtInType); + if (v != NULL) { + v->value.decimal.lo = lo; + v->value.decimal.mi = mi; + v->value.decimal.hi = hi; + v->value.decimal.sign = sign; + v->value.decimal.frac = 0; + v->value.decimal.total = ret; + *val = v; + } + } + goto return0; + } + case XML_SCHEMAS_UINT: + case XML_SCHEMAS_ULONG: + case XML_SCHEMAS_USHORT: + case XML_SCHEMAS_UBYTE:{ + const xmlChar *cur = value; + unsigned long lo, mi, hi; + + if (cur == NULL) + goto return1; + ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); + if (ret < 0) + goto return1; + if (*cur != 0) + goto return1; + if (type->builtInType == XML_SCHEMAS_ULONG) { + if (hi >= 1844) { + if (hi > 1844) + goto return1; + if (mi >= 67440737) { + if (mi > 67440737) + goto return1; + if (lo > 9551615) + goto return1; + } + } + } else if (type->builtInType == XML_SCHEMAS_UINT) { + if (hi != 0) + goto return1; + if (mi >= 42) { + if (mi > 42) + goto return1; + if (lo > 94967295) + goto return1; + } + } else if (type->builtInType == XML_SCHEMAS_USHORT) { + if ((mi != 0) || (hi != 0)) + goto return1; + if (lo > 65535) + goto return1; + } else if (type->builtInType == XML_SCHEMAS_UBYTE) { + if ((mi != 0) || (hi != 0)) + goto return1; + if (lo > 255) + goto return1; + } + if (val != NULL) { + v = xmlSchemaNewValue(type->builtInType); + if (v != NULL) { + v->value.decimal.lo = lo; + v->value.decimal.mi = mi; + v->value.decimal.hi = hi; + v->value.decimal.sign = 0; + v->value.decimal.frac = 0; + v->value.decimal.total = ret; + *val = v; + } + } + goto return0; + } + } + + done: + if (norm != NULL) + xmlFree(norm); + return (ret); + return3: + if (norm != NULL) + xmlFree(norm); + return (3); + return1: + if (norm != NULL) + xmlFree(norm); + return (1); + return0: + if (norm != NULL) + xmlFree(norm); + return (0); + error: + if (norm != NULL) + xmlFree(norm); + return (-1); +} + +/** + * xmlSchemaValPredefTypeNode: + * @type: the predefined type + * @value: the value to check + * @val: the return computed value + * @node: the node containing the value + * + * Check that a value conforms to the lexical space of the predefined type. + * if true a value is computed and returned in @val. + * + * Returns 0 if this validates, a positive error code number otherwise + * and -1 in case of internal or API error. + */ +int +xmlSchemaValPredefTypeNode(xmlSchemaTypePtr type, const xmlChar *value, + xmlSchemaValPtr *val, xmlNodePtr node) { + return(xmlSchemaValAtomicType(type, value, val, node, 0, + XML_SCHEMA_WHITESPACE_UNKNOWN, 1, 1, 0)); +} + +/** + * xmlSchemaValPredefTypeNodeNoNorm: + * @type: the predefined type + * @value: the value to check + * @val: the return computed value + * @node: the node containing the value + * + * Check that a value conforms to the lexical space of the predefined type. + * if true a value is computed and returned in @val. + * This one does apply any normalization to the value. + * + * Returns 0 if this validates, a positive error code number otherwise + * and -1 in case of internal or API error. + */ +int +xmlSchemaValPredefTypeNodeNoNorm(xmlSchemaTypePtr type, const xmlChar *value, + xmlSchemaValPtr *val, xmlNodePtr node) { + return(xmlSchemaValAtomicType(type, value, val, node, 1, + XML_SCHEMA_WHITESPACE_UNKNOWN, 1, 0, 1)); +} + +/** + * xmlSchemaValidatePredefinedType: + * @type: the predefined type + * @value: the value to check + * @val: the return computed value + * + * Check that a value conforms to the lexical space of the predefined type. + * if true a value is computed and returned in @val. + * + * Returns 0 if this validates, a positive error code number otherwise + * and -1 in case of internal or API error. + */ +int +xmlSchemaValidatePredefinedType(xmlSchemaTypePtr type, const xmlChar *value, + xmlSchemaValPtr *val) { + return(xmlSchemaValPredefTypeNode(type, value, val, NULL)); +} + +/** + * xmlSchemaCompareDecimals: + * @x: a first decimal value + * @y: a second decimal value + * + * Compare 2 decimals + * + * Returns -1 if x < y, 0 if x == y, 1 if x > y and -2 in case of error + */ +static int +xmlSchemaCompareDecimals(xmlSchemaValPtr x, xmlSchemaValPtr y) +{ + xmlSchemaValPtr swp; + int order = 1, integx, integy, dlen; + unsigned long hi, mi, lo; + + /* + * First test: If x is -ve and not zero + */ + if ((x->value.decimal.sign) && + ((x->value.decimal.lo != 0) || + (x->value.decimal.mi != 0) || + (x->value.decimal.hi != 0))) { + /* + * Then if y is -ve and not zero reverse the compare + */ + if ((y->value.decimal.sign) && + ((y->value.decimal.lo != 0) || + (y->value.decimal.mi != 0) || + (y->value.decimal.hi != 0))) + order = -1; + /* + * Otherwise (y >= 0) we have the answer + */ + else + return (-1); + /* + * If x is not -ve and y is -ve we have the answer + */ + } else if ((y->value.decimal.sign) && + ((y->value.decimal.lo != 0) || + (y->value.decimal.mi != 0) || + (y->value.decimal.hi != 0))) { + return (1); + } + /* + * If it's not simply determined by a difference in sign, + * then we need to compare the actual values of the two nums. + * To do this, we start by looking at the integral parts. + * If the number of integral digits differ, then we have our + * answer. + */ + integx = x->value.decimal.total - x->value.decimal.frac; + integy = y->value.decimal.total - y->value.decimal.frac; + /* + * NOTE: We changed the "total" for values like "0.1" + * (or "-0.1" or ".1") to be 1, which was 2 previously. + * Therefore the special case, when such values are + * compared with 0, needs to be handled separately; + * otherwise a zero would be recognized incorrectly as + * greater than those values. This has the nice side effect + * that we gain an overall optimized comparison with zeroes. + * Note that a "0" has a "total" of 1 already. + */ + if (integx == 1) { + if (x->value.decimal.lo == 0) { + if (integy != 1) + return -order; + else if (y->value.decimal.lo != 0) + return -order; + else + return(0); + } + } + if (integy == 1) { + if (y->value.decimal.lo == 0) { + if (integx != 1) + return order; + else if (x->value.decimal.lo != 0) + return order; + else + return(0); + } + } + + if (integx > integy) + return order; + else if (integy > integx) + return -order; + + /* + * If the number of integral digits is the same for both numbers, + * then things get a little more complicated. We need to "normalize" + * the numbers in order to properly compare them. To do this, we + * look at the total length of each number (length => number of + * significant digits), and divide the "shorter" by 10 (decreasing + * the length) until they are of equal length. + */ + dlen = x->value.decimal.total - y->value.decimal.total; + if (dlen < 0) { /* y has more digits than x */ + swp = x; + hi = y->value.decimal.hi; + mi = y->value.decimal.mi; + lo = y->value.decimal.lo; + dlen = -dlen; + order = -order; + } else { /* x has more digits than y */ + swp = y; + hi = x->value.decimal.hi; + mi = x->value.decimal.mi; + lo = x->value.decimal.lo; + } + while (dlen > 8) { /* in effect, right shift by 10**8 */ + lo = mi; + mi = hi; + hi = 0; + dlen -= 8; + } + while (dlen > 0) { + unsigned long rem1, rem2; + rem1 = (hi % 10) * 100000000L; + hi = hi / 10; + rem2 = (mi % 10) * 100000000L; + mi = (mi + rem1) / 10; + lo = (lo + rem2) / 10; + dlen--; + } + if (hi > swp->value.decimal.hi) { + return order; + } else if (hi == swp->value.decimal.hi) { + if (mi > swp->value.decimal.mi) { + return order; + } else if (mi == swp->value.decimal.mi) { + if (lo > swp->value.decimal.lo) { + return order; + } else if (lo == swp->value.decimal.lo) { + if (x->value.decimal.total == y->value.decimal.total) { + return 0; + } else { + return order; + } + } + } + } + return -order; +} + +/** + * xmlSchemaCompareDurations: + * @x: a first duration value + * @y: a second duration value + * + * Compare 2 durations + * + * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in + * case of error + */ +static int +xmlSchemaCompareDurations(xmlSchemaValPtr x, xmlSchemaValPtr y) +{ + long carry, mon, day; + double sec; + int invert = 1; + long xmon, xday, myear, minday, maxday; + static const long dayRange [2][12] = { + { 0, 28, 59, 89, 120, 150, 181, 212, 242, 273, 303, 334, }, + { 0, 31, 62, 92, 123, 153, 184, 215, 245, 276, 306, 337} }; + + if ((x == NULL) || (y == NULL)) + return -2; + + /* months */ + mon = x->value.dur.mon - y->value.dur.mon; + + /* seconds */ + sec = x->value.dur.sec - y->value.dur.sec; + carry = (long)(sec / SECS_PER_DAY); + sec -= ((double)carry) * SECS_PER_DAY; + + /* days */ + day = x->value.dur.day - y->value.dur.day + carry; + + /* easy test */ + if (mon == 0) { + if (day == 0) + if (sec == 0.0) + return 0; + else if (sec < 0.0) + return -1; + else + return 1; + else if (day < 0) + return -1; + else + return 1; + } + + if (mon > 0) { + if ((day >= 0) && (sec >= 0.0)) + return 1; + else { + xmon = mon; + xday = -day; + } + } else if ((day <= 0) && (sec <= 0.0)) { + return -1; + } else { + invert = -1; + xmon = -mon; + xday = day; + } + + myear = xmon / 12; + if (myear == 0) { + minday = 0; + maxday = 0; + } else { + maxday = 366 * ((myear + 3) / 4) + + 365 * ((myear - 1) % 4); + minday = maxday - 1; + } + + xmon = xmon % 12; + minday += dayRange[0][xmon]; + maxday += dayRange[1][xmon]; + + if ((maxday == minday) && (maxday == xday)) + return(0); /* can this really happen ? */ + if (maxday < xday) + return(-invert); + if (minday > xday) + return(invert); + + /* indeterminate */ + return 2; +} + +/* + * macros for adding date/times and durations + */ +#define FQUOTIENT(a,b) (floor(((double)a/(double)b))) +#define MODULO(a,b) (a - FQUOTIENT(a,b) * b) +#define FQUOTIENT_RANGE(a,low,high) (FQUOTIENT((a-low),(high-low))) +#define MODULO_RANGE(a,low,high) ((MODULO((a-low),(high-low)))+low) + +/** + * xmlSchemaDupVal: + * @v: the #xmlSchemaValPtr value to duplicate + * + * Makes a copy of @v. The calling program is responsible for freeing + * the returned value. + * + * returns a pointer to a duplicated #xmlSchemaValPtr or NULL if error. + */ +static xmlSchemaValPtr +xmlSchemaDupVal (xmlSchemaValPtr v) +{ + xmlSchemaValPtr ret = xmlSchemaNewValue(v->type); + if (ret == NULL) + return NULL; + + memcpy(ret, v, sizeof(xmlSchemaVal)); + ret->next = NULL; + return ret; +} + +/** + * xmlSchemaCopyValue: + * @val: the precomputed value to be copied + * + * Copies the precomputed value. This duplicates any string within. + * + * Returns the copy or NULL if a copy for a data-type is not implemented. + */ +xmlSchemaValPtr +xmlSchemaCopyValue(xmlSchemaValPtr val) +{ + xmlSchemaValPtr ret = NULL, prev = NULL, cur; + + /* + * Copy the string values. + */ + while (val != NULL) { + switch (val->type) { + case XML_SCHEMAS_ANYTYPE: + case XML_SCHEMAS_IDREFS: + case XML_SCHEMAS_ENTITIES: + case XML_SCHEMAS_NMTOKENS: + xmlSchemaFreeValue(ret); + return (NULL); + case XML_SCHEMAS_ANYSIMPLETYPE: + case XML_SCHEMAS_STRING: + case XML_SCHEMAS_NORMSTRING: + case XML_SCHEMAS_TOKEN: + case XML_SCHEMAS_LANGUAGE: + case XML_SCHEMAS_NAME: + case XML_SCHEMAS_NCNAME: + case XML_SCHEMAS_ID: + case XML_SCHEMAS_IDREF: + case XML_SCHEMAS_ENTITY: + case XML_SCHEMAS_NMTOKEN: + case XML_SCHEMAS_ANYURI: + cur = xmlSchemaDupVal(val); + if (val->value.str != NULL) + cur->value.str = xmlStrdup(BAD_CAST val->value.str); + break; + case XML_SCHEMAS_QNAME: + case XML_SCHEMAS_NOTATION: + cur = xmlSchemaDupVal(val); + if (val->value.qname.name != NULL) + cur->value.qname.name = + xmlStrdup(BAD_CAST val->value.qname.name); + if (val->value.qname.uri != NULL) + cur->value.qname.uri = + xmlStrdup(BAD_CAST val->value.qname.uri); + break; + case XML_SCHEMAS_HEXBINARY: + cur = xmlSchemaDupVal(val); + if (val->value.hex.str != NULL) + cur->value.hex.str = xmlStrdup(BAD_CAST val->value.hex.str); + break; + case XML_SCHEMAS_BASE64BINARY: + cur = xmlSchemaDupVal(val); + if (val->value.base64.str != NULL) + cur->value.base64.str = + xmlStrdup(BAD_CAST val->value.base64.str); + break; + default: + cur = xmlSchemaDupVal(val); + break; + } + if (ret == NULL) + ret = cur; + else + prev->next = cur; + prev = cur; + val = val->next; + } + return (ret); +} + +/** + * _xmlSchemaDateAdd: + * @dt: an #xmlSchemaValPtr + * @dur: an #xmlSchemaValPtr of type #XS_DURATION + * + * Compute a new date/time from @dt and @dur. This function assumes @dt + * is either #XML_SCHEMAS_DATETIME, #XML_SCHEMAS_DATE, #XML_SCHEMAS_GYEARMONTH, + * or #XML_SCHEMAS_GYEAR. The returned #xmlSchemaVal is the same type as + * @dt. The calling program is responsible for freeing the returned value. + * + * Returns a pointer to a new #xmlSchemaVal or NULL if error. + */ +static xmlSchemaValPtr +_xmlSchemaDateAdd (xmlSchemaValPtr dt, xmlSchemaValPtr dur) +{ + xmlSchemaValPtr ret, tmp; + long carry, tempdays, temp; + xmlSchemaValDatePtr r, d; + xmlSchemaValDurationPtr u; + + if ((dt == NULL) || (dur == NULL)) + return NULL; + + ret = xmlSchemaNewValue(dt->type); + if (ret == NULL) + return NULL; + + /* make a copy so we don't alter the original value */ + tmp = xmlSchemaDupVal(dt); + if (tmp == NULL) { + xmlSchemaFreeValue(ret); + return NULL; + } + + r = &(ret->value.date); + d = &(tmp->value.date); + u = &(dur->value.dur); + + /* normalization */ + if (d->mon == 0) + d->mon = 1; + + /* normalize for time zone offset */ + u->sec -= (d->tzo * 60); + d->tzo = 0; + + /* normalization */ + if (d->day == 0) + d->day = 1; + + /* month */ + carry = d->mon + u->mon; + r->mon = (unsigned int) MODULO_RANGE(carry, 1, 13); + carry = (long) FQUOTIENT_RANGE(carry, 1, 13); + + /* year (may be modified later) */ + r->year = d->year + carry; + if (r->year == 0) { + if (d->year > 0) + r->year--; + else + r->year++; + } + + /* time zone */ + r->tzo = d->tzo; + r->tz_flag = d->tz_flag; + + /* seconds */ + r->sec = d->sec + u->sec; + carry = (long) FQUOTIENT((long)r->sec, 60); + if (r->sec != 0.0) { + r->sec = MODULO(r->sec, 60.0); + } + + /* minute */ + carry += d->min; + r->min = (unsigned int) MODULO(carry, 60); + carry = (long) FQUOTIENT(carry, 60); + + /* hours */ + carry += d->hour; + r->hour = (unsigned int) MODULO(carry, 24); + carry = (long)FQUOTIENT(carry, 24); + + /* + * days + * Note we use tempdays because the temporary values may need more + * than 5 bits + */ + if ((VALID_YEAR(r->year)) && (VALID_MONTH(r->mon)) && + (d->day > MAX_DAYINMONTH(r->year, r->mon))) + tempdays = MAX_DAYINMONTH(r->year, r->mon); + else if (d->day < 1) + tempdays = 1; + else + tempdays = d->day; + + tempdays += u->day + carry; + + while (1) { + if (tempdays < 1) { + long tmon = (long) MODULO_RANGE((int)r->mon-1, 1, 13); + long tyr = r->year + (long)FQUOTIENT_RANGE((int)r->mon-1, 1, 13); + if (tyr == 0) + tyr--; + /* + * Coverity detected an overrun in daysInMonth + * of size 12 at position 12 with index variable "((r)->mon - 1)" + */ + if (tmon < 0) + tmon = 0; + if (tmon > 12) + tmon = 12; + tempdays += MAX_DAYINMONTH(tyr, tmon); + carry = -1; + } else if (tempdays > (long) MAX_DAYINMONTH(r->year, r->mon)) { + tempdays = tempdays - MAX_DAYINMONTH(r->year, r->mon); + carry = 1; + } else + break; + + temp = r->mon + carry; + r->mon = (unsigned int) MODULO_RANGE(temp, 1, 13); + r->year = r->year + (unsigned int) FQUOTIENT_RANGE(temp, 1, 13); + if (r->year == 0) { + if (temp < 1) + r->year--; + else + r->year++; + } + } + + r->day = tempdays; + + /* + * adjust the date/time type to the date values + */ + if (ret->type != XML_SCHEMAS_DATETIME) { + if ((r->hour) || (r->min) || (r->sec)) + ret->type = XML_SCHEMAS_DATETIME; + else if (ret->type != XML_SCHEMAS_DATE) { + if ((r->mon != 1) && (r->day != 1)) + ret->type = XML_SCHEMAS_DATE; + else if ((ret->type != XML_SCHEMAS_GYEARMONTH) && (r->mon != 1)) + ret->type = XML_SCHEMAS_GYEARMONTH; + } + } + + xmlSchemaFreeValue(tmp); + + return ret; +} + +/** + * xmlSchemaDateNormalize: + * @dt: an #xmlSchemaValPtr of a date/time type value. + * @offset: number of seconds to adjust @dt by. + * + * Normalize @dt to GMT time. The @offset parameter is subtracted from + * the return value is a time-zone offset is present on @dt. + * + * Returns a normalized copy of @dt or NULL if error. + */ +static xmlSchemaValPtr +xmlSchemaDateNormalize (xmlSchemaValPtr dt, double offset) +{ + xmlSchemaValPtr dur, ret; + + if (dt == NULL) + return NULL; + + if (((dt->type != XML_SCHEMAS_TIME) && + (dt->type != XML_SCHEMAS_DATETIME) && + (dt->type != XML_SCHEMAS_DATE)) || (dt->value.date.tzo == 0)) + return xmlSchemaDupVal(dt); + + dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION); + if (dur == NULL) + return NULL; + + dur->value.date.sec -= offset; + + ret = _xmlSchemaDateAdd(dt, dur); + if (ret == NULL) + return NULL; + + xmlSchemaFreeValue(dur); + + /* ret->value.date.tzo = 0; */ + return ret; +} + +/** + * _xmlSchemaDateCastYMToDays: + * @dt: an #xmlSchemaValPtr + * + * Convert mon and year of @dt to total number of days. Take the + * number of years since (or before) 1 AD and add the number of leap + * years. This is a function because negative + * years must be handled a little differently and there is no zero year. + * + * Returns number of days. + */ +static long +_xmlSchemaDateCastYMToDays (const xmlSchemaValPtr dt) +{ + long ret; + int mon; + + mon = dt->value.date.mon; + if (mon <= 0) mon = 1; /* normalization */ + + if (dt->value.date.year <= 0) + ret = (dt->value.date.year * 365) + + (((dt->value.date.year+1)/4)-((dt->value.date.year+1)/100)+ + ((dt->value.date.year+1)/400)) + + DAY_IN_YEAR(0, mon, dt->value.date.year); + else + ret = ((dt->value.date.year-1) * 365) + + (((dt->value.date.year-1)/4)-((dt->value.date.year-1)/100)+ + ((dt->value.date.year-1)/400)) + + DAY_IN_YEAR(0, mon, dt->value.date.year); + + return ret; +} + +/** + * TIME_TO_NUMBER: + * @dt: an #xmlSchemaValPtr + * + * Calculates the number of seconds in the time portion of @dt. + * + * Returns seconds. + */ +#define TIME_TO_NUMBER(dt) \ + ((double)((dt->value.date.hour * SECS_PER_HOUR) + \ + (dt->value.date.min * SECS_PER_MIN) + \ + (dt->value.date.tzo * SECS_PER_MIN)) + \ + dt->value.date.sec) + +/** + * xmlSchemaCompareDates: + * @x: a first date/time value + * @y: a second date/time value + * + * Compare 2 date/times + * + * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in + * case of error + */ +static int +xmlSchemaCompareDates (xmlSchemaValPtr x, xmlSchemaValPtr y) +{ + unsigned char xmask, ymask, xor_mask, and_mask; + xmlSchemaValPtr p1, p2, q1, q2; + long p1d, p2d, q1d, q2d; + + if ((x == NULL) || (y == NULL)) + return -2; + + if (x->value.date.tz_flag) { + + if (!y->value.date.tz_flag) { + p1 = xmlSchemaDateNormalize(x, 0); + p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day; + /* normalize y + 14:00 */ + q1 = xmlSchemaDateNormalize(y, (14 * SECS_PER_HOUR)); + + q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day; + if (p1d < q1d) { + xmlSchemaFreeValue(p1); + xmlSchemaFreeValue(q1); + return -1; + } else if (p1d == q1d) { + double sec; + + sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1); + if (sec < 0.0) { + xmlSchemaFreeValue(p1); + xmlSchemaFreeValue(q1); + return -1; + } else { + int ret = 0; + /* normalize y - 14:00 */ + q2 = xmlSchemaDateNormalize(y, -(14 * SECS_PER_HOUR)); + q2d = _xmlSchemaDateCastYMToDays(q2) + q2->value.date.day; + if (p1d > q2d) + ret = 1; + else if (p1d == q2d) { + sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q2); + if (sec > 0.0) + ret = 1; + else + ret = 2; /* indeterminate */ + } + xmlSchemaFreeValue(p1); + xmlSchemaFreeValue(q1); + xmlSchemaFreeValue(q2); + if (ret != 0) + return(ret); + } + } else { + xmlSchemaFreeValue(p1); + xmlSchemaFreeValue(q1); + } + } + } else if (y->value.date.tz_flag) { + q1 = xmlSchemaDateNormalize(y, 0); + q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day; + + /* normalize x - 14:00 */ + p1 = xmlSchemaDateNormalize(x, -(14 * SECS_PER_HOUR)); + p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day; + + if (p1d < q1d) { + xmlSchemaFreeValue(p1); + xmlSchemaFreeValue(q1); + return -1; + } else if (p1d == q1d) { + double sec; + + sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1); + if (sec < 0.0) { + xmlSchemaFreeValue(p1); + xmlSchemaFreeValue(q1); + return -1; + } else { + int ret = 0; + /* normalize x + 14:00 */ + p2 = xmlSchemaDateNormalize(x, (14 * SECS_PER_HOUR)); + p2d = _xmlSchemaDateCastYMToDays(p2) + p2->value.date.day; + + if (p2d > q1d) { + ret = 1; + } else if (p2d == q1d) { + sec = TIME_TO_NUMBER(p2) - TIME_TO_NUMBER(q1); + if (sec > 0.0) + ret = 1; + else + ret = 2; /* indeterminate */ + } + xmlSchemaFreeValue(p1); + xmlSchemaFreeValue(q1); + xmlSchemaFreeValue(p2); + if (ret != 0) + return(ret); + } + } else { + xmlSchemaFreeValue(p1); + xmlSchemaFreeValue(q1); + } + } + + /* + * if the same type then calculate the difference + */ + if (x->type == y->type) { + int ret = 0; + q1 = xmlSchemaDateNormalize(y, 0); + q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day; + + p1 = xmlSchemaDateNormalize(x, 0); + p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day; + + if (p1d < q1d) { + ret = -1; + } else if (p1d > q1d) { + ret = 1; + } else { + double sec; + + sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1); + if (sec < 0.0) + ret = -1; + else if (sec > 0.0) + ret = 1; + + } + xmlSchemaFreeValue(p1); + xmlSchemaFreeValue(q1); + return(ret); + } + + switch (x->type) { + case XML_SCHEMAS_DATETIME: + xmask = 0xf; + break; + case XML_SCHEMAS_DATE: + xmask = 0x7; + break; + case XML_SCHEMAS_GYEAR: + xmask = 0x1; + break; + case XML_SCHEMAS_GMONTH: + xmask = 0x2; + break; + case XML_SCHEMAS_GDAY: + xmask = 0x3; + break; + case XML_SCHEMAS_GYEARMONTH: + xmask = 0x3; + break; + case XML_SCHEMAS_GMONTHDAY: + xmask = 0x6; + break; + case XML_SCHEMAS_TIME: + xmask = 0x8; + break; + default: + xmask = 0; + break; + } + + switch (y->type) { + case XML_SCHEMAS_DATETIME: + ymask = 0xf; + break; + case XML_SCHEMAS_DATE: + ymask = 0x7; + break; + case XML_SCHEMAS_GYEAR: + ymask = 0x1; + break; + case XML_SCHEMAS_GMONTH: + ymask = 0x2; + break; + case XML_SCHEMAS_GDAY: + ymask = 0x3; + break; + case XML_SCHEMAS_GYEARMONTH: + ymask = 0x3; + break; + case XML_SCHEMAS_GMONTHDAY: + ymask = 0x6; + break; + case XML_SCHEMAS_TIME: + ymask = 0x8; + break; + default: + ymask = 0; + break; + } + + xor_mask = xmask ^ ymask; /* mark type differences */ + and_mask = xmask & ymask; /* mark field specification */ + + /* year */ + if (xor_mask & 1) + return 2; /* indeterminate */ + else if (and_mask & 1) { + if (x->value.date.year < y->value.date.year) + return -1; + else if (x->value.date.year > y->value.date.year) + return 1; + } + + /* month */ + if (xor_mask & 2) + return 2; /* indeterminate */ + else if (and_mask & 2) { + if (x->value.date.mon < y->value.date.mon) + return -1; + else if (x->value.date.mon > y->value.date.mon) + return 1; + } + + /* day */ + if (xor_mask & 4) + return 2; /* indeterminate */ + else if (and_mask & 4) { + if (x->value.date.day < y->value.date.day) + return -1; + else if (x->value.date.day > y->value.date.day) + return 1; + } + + /* time */ + if (xor_mask & 8) + return 2; /* indeterminate */ + else if (and_mask & 8) { + if (x->value.date.hour < y->value.date.hour) + return -1; + else if (x->value.date.hour > y->value.date.hour) + return 1; + else if (x->value.date.min < y->value.date.min) + return -1; + else if (x->value.date.min > y->value.date.min) + return 1; + else if (x->value.date.sec < y->value.date.sec) + return -1; + else if (x->value.date.sec > y->value.date.sec) + return 1; + } + + return 0; +} + +/** + * xmlSchemaComparePreserveReplaceStrings: + * @x: a first string value + * @y: a second string value + * @invert: inverts the result if x < y or x > y. + * + * Compare 2 string for their normalized values. + * @x is a string with whitespace of "preserve", @y is + * a string with a whitespace of "replace". I.e. @x could + * be an "xsd:string" and @y an "xsd:normalizedString". + * + * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in + * case of error + */ +static int +xmlSchemaComparePreserveReplaceStrings(const xmlChar *x, + const xmlChar *y, + int invert) +{ + int tmp; + + while ((*x != 0) && (*y != 0)) { + if (IS_WSP_REPLACE_CH(*y)) { + if (! IS_WSP_SPACE_CH(*x)) { + if ((*x - 0x20) < 0) { + if (invert) + return(1); + else + return(-1); + } else { + if (invert) + return(-1); + else + return(1); + } + } + } else { + tmp = *x - *y; + if (tmp < 0) { + if (invert) + return(1); + else + return(-1); + } + if (tmp > 0) { + if (invert) + return(-1); + else + return(1); + } + } + x++; + y++; + } + if (*x != 0) { + if (invert) + return(-1); + else + return(1); + } + if (*y != 0) { + if (invert) + return(1); + else + return(-1); + } + return(0); +} + +/** + * xmlSchemaComparePreserveCollapseStrings: + * @x: a first string value + * @y: a second string value + * + * Compare 2 string for their normalized values. + * @x is a string with whitespace of "preserve", @y is + * a string with a whitespace of "collapse". I.e. @x could + * be an "xsd:string" and @y an "xsd:normalizedString". + * + * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in + * case of error + */ +static int +xmlSchemaComparePreserveCollapseStrings(const xmlChar *x, + const xmlChar *y, + int invert) +{ + int tmp; + + /* + * Skip leading blank chars of the collapsed string. + */ + while IS_WSP_BLANK_CH(*y) + y++; + + while ((*x != 0) && (*y != 0)) { + if IS_WSP_BLANK_CH(*y) { + if (! IS_WSP_SPACE_CH(*x)) { + /* + * The yv character would have been replaced to 0x20. + */ + if ((*x - 0x20) < 0) { + if (invert) + return(1); + else + return(-1); + } else { + if (invert) + return(-1); + else + return(1); + } + } + x++; + y++; + /* + * Skip contiguous blank chars of the collapsed string. + */ + while IS_WSP_BLANK_CH(*y) + y++; + } else { + tmp = *x++ - *y++; + if (tmp < 0) { + if (invert) + return(1); + else + return(-1); + } + if (tmp > 0) { + if (invert) + return(-1); + else + return(1); + } + } + } + if (*x != 0) { + if (invert) + return(-1); + else + return(1); + } + if (*y != 0) { + /* + * Skip trailing blank chars of the collapsed string. + */ + while IS_WSP_BLANK_CH(*y) + y++; + if (*y != 0) { + if (invert) + return(1); + else + return(-1); + } + } + return(0); +} + +/** + * xmlSchemaComparePreserveCollapseStrings: + * @x: a first string value + * @y: a second string value + * + * Compare 2 string for their normalized values. + * @x is a string with whitespace of "preserve", @y is + * a string with a whitespace of "collapse". I.e. @x could + * be an "xsd:string" and @y an "xsd:normalizedString". + * + * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in + * case of error + */ +static int +xmlSchemaCompareReplaceCollapseStrings(const xmlChar *x, + const xmlChar *y, + int invert) +{ + int tmp; + + /* + * Skip leading blank chars of the collapsed string. + */ + while IS_WSP_BLANK_CH(*y) + y++; + + while ((*x != 0) && (*y != 0)) { + if IS_WSP_BLANK_CH(*y) { + if (! IS_WSP_BLANK_CH(*x)) { + /* + * The yv character would have been replaced to 0x20. + */ + if ((*x - 0x20) < 0) { + if (invert) + return(1); + else + return(-1); + } else { + if (invert) + return(-1); + else + return(1); + } + } + x++; + y++; + /* + * Skip contiguous blank chars of the collapsed string. + */ + while IS_WSP_BLANK_CH(*y) + y++; + } else { + if IS_WSP_BLANK_CH(*x) { + /* + * The xv character would have been replaced to 0x20. + */ + if ((0x20 - *y) < 0) { + if (invert) + return(1); + else + return(-1); + } else { + if (invert) + return(-1); + else + return(1); + } + } + tmp = *x++ - *y++; + if (tmp < 0) + return(-1); + if (tmp > 0) + return(1); + } + } + if (*x != 0) { + if (invert) + return(-1); + else + return(1); + } + if (*y != 0) { + /* + * Skip trailing blank chars of the collapsed string. + */ + while IS_WSP_BLANK_CH(*y) + y++; + if (*y != 0) { + if (invert) + return(1); + else + return(-1); + } + } + return(0); +} + + +/** + * xmlSchemaCompareReplacedStrings: + * @x: a first string value + * @y: a second string value + * + * Compare 2 string for their normalized values. + * + * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in + * case of error + */ +static int +xmlSchemaCompareReplacedStrings(const xmlChar *x, + const xmlChar *y) +{ + int tmp; + + while ((*x != 0) && (*y != 0)) { + if IS_WSP_BLANK_CH(*y) { + if (! IS_WSP_BLANK_CH(*x)) { + if ((*x - 0x20) < 0) + return(-1); + else + return(1); + } + } else { + if IS_WSP_BLANK_CH(*x) { + if ((0x20 - *y) < 0) + return(-1); + else + return(1); + } + tmp = *x - *y; + if (tmp < 0) + return(-1); + if (tmp > 0) + return(1); + } + x++; + y++; + } + if (*x != 0) + return(1); + if (*y != 0) + return(-1); + return(0); +} + +/** + * xmlSchemaCompareNormStrings: + * @x: a first string value + * @y: a second string value + * + * Compare 2 string for their normalized values. + * + * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in + * case of error + */ +static int +xmlSchemaCompareNormStrings(const xmlChar *x, + const xmlChar *y) { + int tmp; + + while (IS_BLANK_CH(*x)) x++; + while (IS_BLANK_CH(*y)) y++; + while ((*x != 0) && (*y != 0)) { + if (IS_BLANK_CH(*x)) { + if (!IS_BLANK_CH(*y)) { + tmp = *x - *y; + return(tmp); + } + while (IS_BLANK_CH(*x)) x++; + while (IS_BLANK_CH(*y)) y++; + } else { + tmp = *x++ - *y++; + if (tmp < 0) + return(-1); + if (tmp > 0) + return(1); + } + } + if (*x != 0) { + while (IS_BLANK_CH(*x)) x++; + if (*x != 0) + return(1); + } + if (*y != 0) { + while (IS_BLANK_CH(*y)) y++; + if (*y != 0) + return(-1); + } + return(0); +} + +/** + * xmlSchemaCompareFloats: + * @x: a first float or double value + * @y: a second float or double value + * + * Compare 2 values + * + * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in + * case of error + */ +static int +xmlSchemaCompareFloats(xmlSchemaValPtr x, xmlSchemaValPtr y) { + double d1, d2; + + if ((x == NULL) || (y == NULL)) + return(-2); + + /* + * Cast everything to doubles. + */ + if (x->type == XML_SCHEMAS_DOUBLE) + d1 = x->value.d; + else if (x->type == XML_SCHEMAS_FLOAT) + d1 = x->value.f; + else + return(-2); + + if (y->type == XML_SCHEMAS_DOUBLE) + d2 = y->value.d; + else if (y->type == XML_SCHEMAS_FLOAT) + d2 = y->value.f; + else + return(-2); + + /* + * Check for special cases. + */ + if (xmlXPathIsNaN(d1)) { + if (xmlXPathIsNaN(d2)) + return(0); + return(1); + } + if (xmlXPathIsNaN(d2)) + return(-1); + if (d1 == xmlXPathPINF) { + if (d2 == xmlXPathPINF) + return(0); + return(1); + } + if (d2 == xmlXPathPINF) + return(-1); + if (d1 == xmlXPathNINF) { + if (d2 == xmlXPathNINF) + return(0); + return(-1); + } + if (d2 == xmlXPathNINF) + return(1); + + /* + * basic tests, the last one we should have equality, but + * portability is more important than speed and handling + * NaN or Inf in a portable way is always a challenge, so ... + */ + if (d1 < d2) + return(-1); + if (d1 > d2) + return(1); + if (d1 == d2) + return(0); + return(2); +} + +/** + * xmlSchemaCompareValues: + * @x: a first value + * @xvalue: the first value as a string (optional) + * @xwtsp: the whitespace type + * @y: a second value + * @xvalue: the second value as a string (optional) + * @ywtsp: the whitespace type + * + * Compare 2 values + * + * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, 3 if not + * comparable and -2 in case of error + */ +static int +xmlSchemaCompareValuesInternal(xmlSchemaValType xtype, + xmlSchemaValPtr x, + const xmlChar *xvalue, + xmlSchemaWhitespaceValueType xws, + xmlSchemaValType ytype, + xmlSchemaValPtr y, + const xmlChar *yvalue, + xmlSchemaWhitespaceValueType yws) +{ + switch (xtype) { + case XML_SCHEMAS_UNKNOWN: + case XML_SCHEMAS_ANYTYPE: + return(-2); + case XML_SCHEMAS_INTEGER: + case XML_SCHEMAS_NPINTEGER: + case XML_SCHEMAS_NINTEGER: + case XML_SCHEMAS_NNINTEGER: + case XML_SCHEMAS_PINTEGER: + case XML_SCHEMAS_INT: + case XML_SCHEMAS_UINT: + case XML_SCHEMAS_LONG: + case XML_SCHEMAS_ULONG: + case XML_SCHEMAS_SHORT: + case XML_SCHEMAS_USHORT: + case XML_SCHEMAS_BYTE: + case XML_SCHEMAS_UBYTE: + case XML_SCHEMAS_DECIMAL: + if ((x == NULL) || (y == NULL)) + return(-2); + if (ytype == xtype) + return(xmlSchemaCompareDecimals(x, y)); + if ((ytype == XML_SCHEMAS_DECIMAL) || + (ytype == XML_SCHEMAS_INTEGER) || + (ytype == XML_SCHEMAS_NPINTEGER) || + (ytype == XML_SCHEMAS_NINTEGER) || + (ytype == XML_SCHEMAS_NNINTEGER) || + (ytype == XML_SCHEMAS_PINTEGER) || + (ytype == XML_SCHEMAS_INT) || + (ytype == XML_SCHEMAS_UINT) || + (ytype == XML_SCHEMAS_LONG) || + (ytype == XML_SCHEMAS_ULONG) || + (ytype == XML_SCHEMAS_SHORT) || + (ytype == XML_SCHEMAS_USHORT) || + (ytype == XML_SCHEMAS_BYTE) || + (ytype == XML_SCHEMAS_UBYTE)) + return(xmlSchemaCompareDecimals(x, y)); + return(-2); + case XML_SCHEMAS_DURATION: + if ((x == NULL) || (y == NULL)) + return(-2); + if (ytype == XML_SCHEMAS_DURATION) + return(xmlSchemaCompareDurations(x, y)); + return(-2); + case XML_SCHEMAS_TIME: + case XML_SCHEMAS_GDAY: + case XML_SCHEMAS_GMONTH: + case XML_SCHEMAS_GMONTHDAY: + case XML_SCHEMAS_GYEAR: + case XML_SCHEMAS_GYEARMONTH: + case XML_SCHEMAS_DATE: + case XML_SCHEMAS_DATETIME: + if ((x == NULL) || (y == NULL)) + return(-2); + if ((ytype == XML_SCHEMAS_DATETIME) || + (ytype == XML_SCHEMAS_TIME) || + (ytype == XML_SCHEMAS_GDAY) || + (ytype == XML_SCHEMAS_GMONTH) || + (ytype == XML_SCHEMAS_GMONTHDAY) || + (ytype == XML_SCHEMAS_GYEAR) || + (ytype == XML_SCHEMAS_DATE) || + (ytype == XML_SCHEMAS_GYEARMONTH)) + return (xmlSchemaCompareDates(x, y)); + return (-2); + /* + * Note that we will support comparison of string types against + * anySimpleType as well. + */ + case XML_SCHEMAS_ANYSIMPLETYPE: + case XML_SCHEMAS_STRING: + case XML_SCHEMAS_NORMSTRING: + case XML_SCHEMAS_TOKEN: + case XML_SCHEMAS_LANGUAGE: + case XML_SCHEMAS_NMTOKEN: + case XML_SCHEMAS_NAME: + case XML_SCHEMAS_NCNAME: + case XML_SCHEMAS_ID: + case XML_SCHEMAS_IDREF: + case XML_SCHEMAS_ENTITY: + case XML_SCHEMAS_ANYURI: + { + const xmlChar *xv, *yv; + + if (x == NULL) + xv = xvalue; + else + xv = x->value.str; + if (y == NULL) + yv = yvalue; + else + yv = y->value.str; + /* + * TODO: Compare those against QName. + */ + if (ytype == XML_SCHEMAS_QNAME) { + TODO + if (y == NULL) + return(-2); + return (-2); + } + if ((ytype == XML_SCHEMAS_ANYSIMPLETYPE) || + (ytype == XML_SCHEMAS_STRING) || + (ytype == XML_SCHEMAS_NORMSTRING) || + (ytype == XML_SCHEMAS_TOKEN) || + (ytype == XML_SCHEMAS_LANGUAGE) || + (ytype == XML_SCHEMAS_NMTOKEN) || + (ytype == XML_SCHEMAS_NAME) || + (ytype == XML_SCHEMAS_NCNAME) || + (ytype == XML_SCHEMAS_ID) || + (ytype == XML_SCHEMAS_IDREF) || + (ytype == XML_SCHEMAS_ENTITY) || + (ytype == XML_SCHEMAS_ANYURI)) { + + if (xws == XML_SCHEMA_WHITESPACE_PRESERVE) { + + if (yws == XML_SCHEMA_WHITESPACE_PRESERVE) { + /* TODO: What about x < y or x > y. */ + if (xmlStrEqual(xv, yv)) + return (0); + else + return (2); + } else if (yws == XML_SCHEMA_WHITESPACE_REPLACE) + return (xmlSchemaComparePreserveReplaceStrings(xv, yv, 0)); + else if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE) + return (xmlSchemaComparePreserveCollapseStrings(xv, yv, 0)); + + } else if (xws == XML_SCHEMA_WHITESPACE_REPLACE) { + + if (yws == XML_SCHEMA_WHITESPACE_PRESERVE) + return (xmlSchemaComparePreserveReplaceStrings(yv, xv, 1)); + if (yws == XML_SCHEMA_WHITESPACE_REPLACE) + return (xmlSchemaCompareReplacedStrings(xv, yv)); + if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE) + return (xmlSchemaCompareReplaceCollapseStrings(xv, yv, 0)); + + } else if (xws == XML_SCHEMA_WHITESPACE_COLLAPSE) { + + if (yws == XML_SCHEMA_WHITESPACE_PRESERVE) + return (xmlSchemaComparePreserveCollapseStrings(yv, xv, 1)); + if (yws == XML_SCHEMA_WHITESPACE_REPLACE) + return (xmlSchemaCompareReplaceCollapseStrings(yv, xv, 1)); + if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE) + return (xmlSchemaCompareNormStrings(xv, yv)); + } else + return (-2); + + } + return (-2); + } + case XML_SCHEMAS_QNAME: + case XML_SCHEMAS_NOTATION: + if ((x == NULL) || (y == NULL)) + return(-2); + if ((ytype == XML_SCHEMAS_QNAME) || + (ytype == XML_SCHEMAS_NOTATION)) { + if ((xmlStrEqual(x->value.qname.name, y->value.qname.name)) && + (xmlStrEqual(x->value.qname.uri, y->value.qname.uri))) + return(0); + return(2); + } + return (-2); + case XML_SCHEMAS_FLOAT: + case XML_SCHEMAS_DOUBLE: + if ((x == NULL) || (y == NULL)) + return(-2); + if ((ytype == XML_SCHEMAS_FLOAT) || + (ytype == XML_SCHEMAS_DOUBLE)) + return (xmlSchemaCompareFloats(x, y)); + return (-2); + case XML_SCHEMAS_BOOLEAN: + if ((x == NULL) || (y == NULL)) + return(-2); + if (ytype == XML_SCHEMAS_BOOLEAN) { + if (x->value.b == y->value.b) + return(0); + if (x->value.b == 0) + return(-1); + return(1); + } + return (-2); + case XML_SCHEMAS_HEXBINARY: + if ((x == NULL) || (y == NULL)) + return(-2); + if (ytype == XML_SCHEMAS_HEXBINARY) { + if (x->value.hex.total == y->value.hex.total) { + int ret = xmlStrcmp(x->value.hex.str, y->value.hex.str); + if (ret > 0) + return(1); + else if (ret == 0) + return(0); + } + else if (x->value.hex.total > y->value.hex.total) + return(1); + + return(-1); + } + return (-2); + case XML_SCHEMAS_BASE64BINARY: + if ((x == NULL) || (y == NULL)) + return(-2); + if (ytype == XML_SCHEMAS_BASE64BINARY) { + if (x->value.base64.total == y->value.base64.total) { + int ret = xmlStrcmp(x->value.base64.str, + y->value.base64.str); + if (ret > 0) + return(1); + else if (ret == 0) + return(0); + else + return(-1); + } + else if (x->value.base64.total > y->value.base64.total) + return(1); + else + return(-1); + } + return (-2); + case XML_SCHEMAS_IDREFS: + case XML_SCHEMAS_ENTITIES: + case XML_SCHEMAS_NMTOKENS: + TODO + break; + } + return -2; +} + +/** + * xmlSchemaCompareValues: + * @x: a first value + * @y: a second value + * + * Compare 2 values + * + * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in + * case of error + */ +int +xmlSchemaCompareValues(xmlSchemaValPtr x, xmlSchemaValPtr y) { + xmlSchemaWhitespaceValueType xws, yws; + + if ((x == NULL) || (y == NULL)) + return(-2); + if (x->type == XML_SCHEMAS_STRING) + xws = XML_SCHEMA_WHITESPACE_PRESERVE; + else if (x->type == XML_SCHEMAS_NORMSTRING) + xws = XML_SCHEMA_WHITESPACE_REPLACE; + else + xws = XML_SCHEMA_WHITESPACE_COLLAPSE; + + if (y->type == XML_SCHEMAS_STRING) + yws = XML_SCHEMA_WHITESPACE_PRESERVE; + else if (x->type == XML_SCHEMAS_NORMSTRING) + yws = XML_SCHEMA_WHITESPACE_REPLACE; + else + yws = XML_SCHEMA_WHITESPACE_COLLAPSE; + + return(xmlSchemaCompareValuesInternal(x->type, x, NULL, xws, y->type, + y, NULL, yws)); +} + +/** + * xmlSchemaCompareValuesWhtsp: + * @x: a first value + * @xws: the whitespace value of x + * @y: a second value + * @yws: the whitespace value of y + * + * Compare 2 values + * + * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in + * case of error + */ +int +xmlSchemaCompareValuesWhtsp(xmlSchemaValPtr x, + xmlSchemaWhitespaceValueType xws, + xmlSchemaValPtr y, + xmlSchemaWhitespaceValueType yws) +{ + if ((x == NULL) || (y == NULL)) + return(-2); + return(xmlSchemaCompareValuesInternal(x->type, x, NULL, xws, y->type, + y, NULL, yws)); +} + +/** + * xmlSchemaCompareValuesWhtspExt: + * @x: a first value + * @xws: the whitespace value of x + * @y: a second value + * @yws: the whitespace value of y + * + * Compare 2 values + * + * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in + * case of error + */ +static int +xmlSchemaCompareValuesWhtspExt(xmlSchemaValType xtype, + xmlSchemaValPtr x, + const xmlChar *xvalue, + xmlSchemaWhitespaceValueType xws, + xmlSchemaValType ytype, + xmlSchemaValPtr y, + const xmlChar *yvalue, + xmlSchemaWhitespaceValueType yws) +{ + return(xmlSchemaCompareValuesInternal(xtype, x, xvalue, xws, ytype, y, + yvalue, yws)); +} + +/** + * xmlSchemaNormLen: + * @value: a string + * + * Computes the UTF8 length of the normalized value of the string + * + * Returns the length or -1 in case of error. + */ +static int +xmlSchemaNormLen(const xmlChar *value) { + const xmlChar *utf; + int ret = 0; + + if (value == NULL) + return(-1); + utf = value; + while (IS_BLANK_CH(*utf)) utf++; + while (*utf != 0) { + if (utf[0] & 0x80) { + if ((utf[1] & 0xc0) != 0x80) + return(-1); + if ((utf[0] & 0xe0) == 0xe0) { + if ((utf[2] & 0xc0) != 0x80) + return(-1); + if ((utf[0] & 0xf0) == 0xf0) { + if ((utf[0] & 0xf8) != 0xf0 || (utf[3] & 0xc0) != 0x80) + return(-1); + utf += 4; + } else { + utf += 3; + } + } else { + utf += 2; + } + } else if (IS_BLANK_CH(*utf)) { + while (IS_BLANK_CH(*utf)) utf++; + if (*utf == 0) + break; + } else { + utf++; + } + ret++; + } + return(ret); +} + +/** + * xmlSchemaGetFacetValueAsULong: + * @facet: an schemas type facet + * + * Extract the value of a facet + * + * Returns the value as a long + */ +unsigned long +xmlSchemaGetFacetValueAsULong(xmlSchemaFacetPtr facet) +{ + /* + * TODO: Check if this is a decimal. + */ + if (facet == NULL) + return 0; + return ((unsigned long) facet->val->value.decimal.lo); +} + +/** + * xmlSchemaValidateListSimpleTypeFacet: + * @facet: the facet to check + * @value: the lexical repr of the value to validate + * @actualLen: the number of list items + * @expectedLen: the resulting expected number of list items + * + * Checks the value of a list simple type against a facet. + * + * Returns 0 if the value is valid, a positive error code + * number otherwise and -1 in case of an internal error. + */ +int +xmlSchemaValidateListSimpleTypeFacet(xmlSchemaFacetPtr facet, + const xmlChar *value, + unsigned long actualLen, + unsigned long *expectedLen) +{ + if (facet == NULL) + return(-1); + /* + * TODO: Check if this will work with large numbers. + * (compare value.decimal.mi and value.decimal.hi as well?). + */ + if (facet->type == XML_SCHEMA_FACET_LENGTH) { + if (actualLen != facet->val->value.decimal.lo) { + if (expectedLen != NULL) + *expectedLen = facet->val->value.decimal.lo; + return (XML_SCHEMAV_CVC_LENGTH_VALID); + } + } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) { + if (actualLen < facet->val->value.decimal.lo) { + if (expectedLen != NULL) + *expectedLen = facet->val->value.decimal.lo; + return (XML_SCHEMAV_CVC_MINLENGTH_VALID); + } + } else if (facet->type == XML_SCHEMA_FACET_MAXLENGTH) { + if (actualLen > facet->val->value.decimal.lo) { + if (expectedLen != NULL) + *expectedLen = facet->val->value.decimal.lo; + return (XML_SCHEMAV_CVC_MAXLENGTH_VALID); + } + } else + /* + * NOTE: That we can pass NULL as xmlSchemaValPtr to + * xmlSchemaValidateFacet, since the remaining facet types + * are: XML_SCHEMA_FACET_PATTERN, XML_SCHEMA_FACET_ENUMERATION. + */ + return(xmlSchemaValidateFacet(NULL, facet, value, NULL)); + return (0); +} + +/** + * xmlSchemaValidateLengthFacet: + * @type: the built-in type + * @facet: the facet to check + * @value: the lexical repr. of the value to be validated + * @val: the precomputed value + * @ws: the whitespace type of the value + * @length: the actual length of the value + * + * Checka a value against a "length", "minLength" and "maxLength" + * facet; sets @length to the computed length of @value. + * + * Returns 0 if the value is valid, a positive error code + * otherwise and -1 in case of an internal or API error. + */ +static int +xmlSchemaValidateLengthFacetInternal(xmlSchemaFacetPtr facet, + xmlSchemaValType valType, + const xmlChar *value, + xmlSchemaValPtr val, + unsigned long *length, + xmlSchemaWhitespaceValueType ws) +{ + unsigned int len = 0; + + if ((length == NULL) || (facet == NULL)) + return (-1); + *length = 0; + if ((facet->type != XML_SCHEMA_FACET_LENGTH) && + (facet->type != XML_SCHEMA_FACET_MAXLENGTH) && + (facet->type != XML_SCHEMA_FACET_MINLENGTH)) + return (-1); + + /* + * TODO: length, maxLength and minLength must be of type + * nonNegativeInteger only. Check if decimal is used somehow. + */ + if ((facet->val == NULL) || + ((facet->val->type != XML_SCHEMAS_DECIMAL) && + (facet->val->type != XML_SCHEMAS_NNINTEGER)) || + (facet->val->value.decimal.frac != 0)) { + return(-1); + } + if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY)) + len = val->value.hex.total; + else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY)) + len = val->value.base64.total; + else { + switch (valType) { + case XML_SCHEMAS_STRING: + case XML_SCHEMAS_NORMSTRING: + if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) { + /* + * This is to ensure API compatibility with the old + * xmlSchemaValidateLengthFacet(). Anyway, this was and + * is not the correct handling. + * TODO: Get rid of this case somehow. + */ + if (valType == XML_SCHEMAS_STRING) + len = xmlUTF8Strlen(value); + else + len = xmlSchemaNormLen(value); + } else if (value != NULL) { + if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) + len = xmlSchemaNormLen(value); + else + /* + * Should be OK for "preserve" as well. + */ + len = xmlUTF8Strlen(value); + } + break; + case XML_SCHEMAS_IDREF: + case XML_SCHEMAS_TOKEN: + case XML_SCHEMAS_LANGUAGE: + case XML_SCHEMAS_NMTOKEN: + case XML_SCHEMAS_NAME: + case XML_SCHEMAS_NCNAME: + case XML_SCHEMAS_ID: + /* + * FIXME: What exactly to do with anyURI? + */ + case XML_SCHEMAS_ANYURI: + if (value != NULL) + len = xmlSchemaNormLen(value); + break; + case XML_SCHEMAS_QNAME: + case XML_SCHEMAS_NOTATION: + /* + * For QName and NOTATION, those facets are + * deprecated and should be ignored. + */ + return (0); + default: + TODO + } + } + *length = (unsigned long) len; + /* + * TODO: Return the whole expected value, i.e. "lo", "mi" and "hi". + */ + if (facet->type == XML_SCHEMA_FACET_LENGTH) { + if (len != facet->val->value.decimal.lo) + return(XML_SCHEMAV_CVC_LENGTH_VALID); + } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) { + if (len < facet->val->value.decimal.lo) + return(XML_SCHEMAV_CVC_MINLENGTH_VALID); + } else { + if (len > facet->val->value.decimal.lo) + return(XML_SCHEMAV_CVC_MAXLENGTH_VALID); + } + + return (0); +} + +/** + * xmlSchemaValidateLengthFacet: + * @type: the built-in type + * @facet: the facet to check + * @value: the lexical repr. of the value to be validated + * @val: the precomputed value + * @length: the actual length of the value + * + * Checka a value against a "length", "minLength" and "maxLength" + * facet; sets @length to the computed length of @value. + * + * Returns 0 if the value is valid, a positive error code + * otherwise and -1 in case of an internal or API error. + */ +int +xmlSchemaValidateLengthFacet(xmlSchemaTypePtr type, + xmlSchemaFacetPtr facet, + const xmlChar *value, + xmlSchemaValPtr val, + unsigned long *length) +{ + if (type == NULL) + return(-1); + return (xmlSchemaValidateLengthFacetInternal(facet, + type->builtInType, value, val, length, + XML_SCHEMA_WHITESPACE_UNKNOWN)); +} + +/** + * xmlSchemaValidateLengthFacetWhtsp: + * @facet: the facet to check + * @valType: the built-in type + * @value: the lexical repr. of the value to be validated + * @val: the precomputed value + * @ws: the whitespace type of the value + * @length: the actual length of the value + * + * Checka a value against a "length", "minLength" and "maxLength" + * facet; sets @length to the computed length of @value. + * + * Returns 0 if the value is valid, a positive error code + * otherwise and -1 in case of an internal or API error. + */ +int +xmlSchemaValidateLengthFacetWhtsp(xmlSchemaFacetPtr facet, + xmlSchemaValType valType, + const xmlChar *value, + xmlSchemaValPtr val, + unsigned long *length, + xmlSchemaWhitespaceValueType ws) +{ + return (xmlSchemaValidateLengthFacetInternal(facet, valType, value, val, + length, ws)); +} + +/** + * xmlSchemaValidateFacetInternal: + * @facet: the facet to check + * @fws: the whitespace type of the facet's value + * @valType: the built-in type of the value + * @value: the lexical repr of the value to validate + * @val: the precomputed value + * @ws: the whitespace type of the value + * + * Check a value against a facet condition + * + * Returns 0 if the element is schemas valid, a positive error code + * number otherwise and -1 in case of internal or API error. + */ +static int +xmlSchemaValidateFacetInternal(xmlSchemaFacetPtr facet, + xmlSchemaWhitespaceValueType fws, + xmlSchemaValType valType, + const xmlChar *value, + xmlSchemaValPtr val, + xmlSchemaWhitespaceValueType ws) +{ + int ret; + + if (facet == NULL) + return(-1); + + switch (facet->type) { + case XML_SCHEMA_FACET_PATTERN: + /* + * NOTE that for patterns, the @value needs to be the normalized + * value, *not* the lexical initial value or the canonical value. + */ + if (value == NULL) + return(-1); + ret = xmlRegexpExec(facet->regexp, value); + if (ret == 1) + return(0); + if (ret == 0) + return(XML_SCHEMAV_CVC_PATTERN_VALID); + return(ret); + case XML_SCHEMA_FACET_MAXEXCLUSIVE: + ret = xmlSchemaCompareValues(val, facet->val); + if (ret == -2) + return(-1); + if (ret == -1) + return(0); + return(XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID); + case XML_SCHEMA_FACET_MAXINCLUSIVE: + ret = xmlSchemaCompareValues(val, facet->val); + if (ret == -2) + return(-1); + if ((ret == -1) || (ret == 0)) + return(0); + return(XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID); + case XML_SCHEMA_FACET_MINEXCLUSIVE: + ret = xmlSchemaCompareValues(val, facet->val); + if (ret == -2) + return(-1); + if (ret == 1) + return(0); + return(XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID); + case XML_SCHEMA_FACET_MININCLUSIVE: + ret = xmlSchemaCompareValues(val, facet->val); + if (ret == -2) + return(-1); + if ((ret == 1) || (ret == 0)) + return(0); + return(XML_SCHEMAV_CVC_MININCLUSIVE_VALID); + case XML_SCHEMA_FACET_WHITESPACE: + /* TODO whitespaces */ + /* + * NOTE: Whitespace should be handled to normalize + * the value to be validated against a the facets; + * not to normalize the value in-between. + */ + return(0); + case XML_SCHEMA_FACET_ENUMERATION: + if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) { + /* + * This is to ensure API compatibility with the old + * xmlSchemaValidateFacet(). + * TODO: Get rid of this case. + */ + if ((facet->value != NULL) && + (xmlStrEqual(facet->value, value))) + return(0); + } else { + ret = xmlSchemaCompareValuesWhtspExt(facet->val->type, + facet->val, facet->value, fws, valType, val, + value, ws); + if (ret == -2) + return(-1); + if (ret == 0) + return(0); + } + return(XML_SCHEMAV_CVC_ENUMERATION_VALID); + case XML_SCHEMA_FACET_LENGTH: + /* + * SPEC (1.3) "if {primitive type definition} is QName or NOTATION, + * then any {value} is facet-valid." + */ + if ((valType == XML_SCHEMAS_QNAME) || + (valType == XML_SCHEMAS_NOTATION)) + return (0); + /* No break on purpose. */ + case XML_SCHEMA_FACET_MAXLENGTH: + case XML_SCHEMA_FACET_MINLENGTH: { + unsigned int len = 0; + + if ((valType == XML_SCHEMAS_QNAME) || + (valType == XML_SCHEMAS_NOTATION)) + return (0); + /* + * TODO: length, maxLength and minLength must be of type + * nonNegativeInteger only. Check if decimal is used somehow. + */ + if ((facet->val == NULL) || + ((facet->val->type != XML_SCHEMAS_DECIMAL) && + (facet->val->type != XML_SCHEMAS_NNINTEGER)) || + (facet->val->value.decimal.frac != 0)) { + return(-1); + } + if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY)) + len = val->value.hex.total; + else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY)) + len = val->value.base64.total; + else { + switch (valType) { + case XML_SCHEMAS_STRING: + case XML_SCHEMAS_NORMSTRING: + if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) { + /* + * This is to ensure API compatibility with the old + * xmlSchemaValidateFacet(). Anyway, this was and + * is not the correct handling. + * TODO: Get rid of this case somehow. + */ + if (valType == XML_SCHEMAS_STRING) + len = xmlUTF8Strlen(value); + else + len = xmlSchemaNormLen(value); + } else if (value != NULL) { + if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) + len = xmlSchemaNormLen(value); + else + /* + * Should be OK for "preserve" as well. + */ + len = xmlUTF8Strlen(value); + } + break; + case XML_SCHEMAS_IDREF: + case XML_SCHEMAS_TOKEN: + case XML_SCHEMAS_LANGUAGE: + case XML_SCHEMAS_NMTOKEN: + case XML_SCHEMAS_NAME: + case XML_SCHEMAS_NCNAME: + case XML_SCHEMAS_ID: + case XML_SCHEMAS_ANYURI: + if (value != NULL) + len = xmlSchemaNormLen(value); + break; + default: + TODO + } + } + if (facet->type == XML_SCHEMA_FACET_LENGTH) { + if (len != facet->val->value.decimal.lo) + return(XML_SCHEMAV_CVC_LENGTH_VALID); + } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) { + if (len < facet->val->value.decimal.lo) + return(XML_SCHEMAV_CVC_MINLENGTH_VALID); + } else { + if (len > facet->val->value.decimal.lo) + return(XML_SCHEMAV_CVC_MAXLENGTH_VALID); + } + break; + } + case XML_SCHEMA_FACET_TOTALDIGITS: + case XML_SCHEMA_FACET_FRACTIONDIGITS: + + if ((facet->val == NULL) || + ((facet->val->type != XML_SCHEMAS_PINTEGER) && + (facet->val->type != XML_SCHEMAS_NNINTEGER)) || + (facet->val->value.decimal.frac != 0)) { + return(-1); + } + if ((val == NULL) || + ((val->type != XML_SCHEMAS_DECIMAL) && + (val->type != XML_SCHEMAS_INTEGER) && + (val->type != XML_SCHEMAS_NPINTEGER) && + (val->type != XML_SCHEMAS_NINTEGER) && + (val->type != XML_SCHEMAS_NNINTEGER) && + (val->type != XML_SCHEMAS_PINTEGER) && + (val->type != XML_SCHEMAS_INT) && + (val->type != XML_SCHEMAS_UINT) && + (val->type != XML_SCHEMAS_LONG) && + (val->type != XML_SCHEMAS_ULONG) && + (val->type != XML_SCHEMAS_SHORT) && + (val->type != XML_SCHEMAS_USHORT) && + (val->type != XML_SCHEMAS_BYTE) && + (val->type != XML_SCHEMAS_UBYTE))) { + return(-1); + } + if (facet->type == XML_SCHEMA_FACET_TOTALDIGITS) { + if (val->value.decimal.total > facet->val->value.decimal.lo) + return(XML_SCHEMAV_CVC_TOTALDIGITS_VALID); + + } else if (facet->type == XML_SCHEMA_FACET_FRACTIONDIGITS) { + if (val->value.decimal.frac > facet->val->value.decimal.lo) + return(XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID); + } + break; + default: + TODO + } + return(0); + +} + +/** + * xmlSchemaValidateFacet: + * @base: the base type + * @facet: the facet to check + * @value: the lexical repr of the value to validate + * @val: the precomputed value + * + * Check a value against a facet condition + * + * Returns 0 if the element is schemas valid, a positive error code + * number otherwise and -1 in case of internal or API error. + */ +int +xmlSchemaValidateFacet(xmlSchemaTypePtr base, + xmlSchemaFacetPtr facet, + const xmlChar *value, + xmlSchemaValPtr val) +{ + /* + * This tries to ensure API compatibility regarding the old + * xmlSchemaValidateFacet() and the new xmlSchemaValidateFacetInternal() and + * xmlSchemaValidateFacetWhtsp(). + */ + if (val != NULL) + return(xmlSchemaValidateFacetInternal(facet, + XML_SCHEMA_WHITESPACE_UNKNOWN, val->type, value, val, + XML_SCHEMA_WHITESPACE_UNKNOWN)); + else if (base != NULL) + return(xmlSchemaValidateFacetInternal(facet, + XML_SCHEMA_WHITESPACE_UNKNOWN, base->builtInType, value, val, + XML_SCHEMA_WHITESPACE_UNKNOWN)); + return(-1); +} + +/** + * xmlSchemaValidateFacetWhtsp: + * @facet: the facet to check + * @fws: the whitespace type of the facet's value + * @valType: the built-in type of the value + * @value: the lexical (or normalized for pattern) repr of the value to validate + * @val: the precomputed value + * @ws: the whitespace type of the value + * + * Check a value against a facet condition. This takes value normalization + * according to the specified whitespace types into account. + * Note that @value needs to be the *normalized* value if the facet + * is of type "pattern". + * + * Returns 0 if the element is schemas valid, a positive error code + * number otherwise and -1 in case of internal or API error. + */ +int +xmlSchemaValidateFacetWhtsp(xmlSchemaFacetPtr facet, + xmlSchemaWhitespaceValueType fws, + xmlSchemaValType valType, + const xmlChar *value, + xmlSchemaValPtr val, + xmlSchemaWhitespaceValueType ws) +{ + return(xmlSchemaValidateFacetInternal(facet, fws, valType, + value, val, ws)); +} + +#if 0 +#ifndef DBL_DIG +#define DBL_DIG 16 +#endif +#ifndef DBL_EPSILON +#define DBL_EPSILON 1E-9 +#endif + +#define INTEGER_DIGITS DBL_DIG +#define FRACTION_DIGITS (DBL_DIG + 1) +#define EXPONENT_DIGITS (3 + 2) + +/** + * xmlXPathFormatNumber: + * @number: number to format + * @buffer: output buffer + * @buffersize: size of output buffer + * + * Convert the number into a string representation. + */ +static void +xmlSchemaFormatFloat(double number, char buffer[], int buffersize) +{ + switch (xmlXPathIsInf(number)) { + case 1: + if (buffersize > (int)sizeof("INF")) + snprintf(buffer, buffersize, "INF"); + break; + case -1: + if (buffersize > (int)sizeof("-INF")) + snprintf(buffer, buffersize, "-INF"); + break; + default: + if (xmlXPathIsNaN(number)) { + if (buffersize > (int)sizeof("NaN")) + snprintf(buffer, buffersize, "NaN"); + } else if (number == 0) { + snprintf(buffer, buffersize, "0.0E0"); + } else { + /* 3 is sign, decimal point, and terminating zero */ + char work[DBL_DIG + EXPONENT_DIGITS + 3]; + int integer_place, fraction_place; + char *ptr; + char *after_fraction; + double absolute_value; + int size; + + absolute_value = fabs(number); + + /* + * Result is in work, and after_fraction points + * just past the fractional part. + * Use scientific notation + */ + integer_place = DBL_DIG + EXPONENT_DIGITS + 1; + fraction_place = DBL_DIG - 1; + snprintf(work, sizeof(work),"%*.*e", + integer_place, fraction_place, number); + after_fraction = strchr(work + DBL_DIG, 'e'); + /* Remove fractional trailing zeroes */ + ptr = after_fraction; + while (*(--ptr) == '0') + ; + if (*ptr != '.') + ptr++; + while ((*ptr++ = *after_fraction++) != 0); + + /* Finally copy result back to caller */ + size = strlen(work) + 1; + if (size > buffersize) { + work[buffersize - 1] = 0; + size = buffersize; + } + memmove(buffer, work, size); + } + break; + } +} +#endif + +/** + * xmlSchemaGetCanonValue: + * @val: the precomputed value + * @retValue: the returned value + * + * Get a the cononical lexical representation of the value. + * The caller has to FREE the returned retValue. + * + * WARNING: Some value types are not supported yet, resulting + * in a @retValue of "???". + * + * TODO: XML Schema 1.0 does not define canonical representations + * for: duration, gYearMonth, gYear, gMonthDay, gMonth, gDay, + * anyURI, QName, NOTATION. This will be fixed in XML Schema 1.1. + * + * + * Returns 0 if the value could be built, 1 if the value type is + * not supported yet and -1 in case of API errors. + */ +int +xmlSchemaGetCanonValue(xmlSchemaValPtr val, const xmlChar **retValue) +{ + if ((retValue == NULL) || (val == NULL)) + return (-1); + *retValue = NULL; + switch (val->type) { + case XML_SCHEMAS_STRING: + if (val->value.str == NULL) + *retValue = BAD_CAST xmlStrdup(BAD_CAST ""); + else + *retValue = + BAD_CAST xmlStrdup((const xmlChar *) val->value.str); + break; + case XML_SCHEMAS_NORMSTRING: + if (val->value.str == NULL) + *retValue = BAD_CAST xmlStrdup(BAD_CAST ""); + else { + *retValue = xmlSchemaWhiteSpaceReplace( + (const xmlChar *) val->value.str); + if ((*retValue) == NULL) + *retValue = BAD_CAST xmlStrdup( + (const xmlChar *) val->value.str); + } + break; + case XML_SCHEMAS_TOKEN: + case XML_SCHEMAS_LANGUAGE: + case XML_SCHEMAS_NMTOKEN: + case XML_SCHEMAS_NAME: + case XML_SCHEMAS_NCNAME: + case XML_SCHEMAS_ID: + case XML_SCHEMAS_IDREF: + case XML_SCHEMAS_ENTITY: + case XML_SCHEMAS_NOTATION: /* Unclear */ + case XML_SCHEMAS_ANYURI: /* Unclear */ + if (val->value.str == NULL) + return (-1); + *retValue = + BAD_CAST xmlSchemaCollapseString(BAD_CAST val->value.str); + if (*retValue == NULL) + *retValue = + BAD_CAST xmlStrdup((const xmlChar *) val->value.str); + break; + case XML_SCHEMAS_QNAME: + /* TODO: Unclear in XML Schema 1.0. */ + if (val->value.qname.uri == NULL) { + *retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.qname.name); + return (0); + } else { + *retValue = BAD_CAST xmlStrdup(BAD_CAST "{"); + *retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue), + BAD_CAST val->value.qname.uri); + *retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue), + BAD_CAST "}"); + *retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue), + BAD_CAST val->value.qname.uri); + } + break; + case XML_SCHEMAS_DECIMAL: + /* + * TODO: Lookout for a more simple implementation. + */ + if ((val->value.decimal.total == 1) && + (val->value.decimal.lo == 0)) { + *retValue = xmlStrdup(BAD_CAST "0.0"); + } else { + xmlSchemaValDecimal dec = val->value.decimal; + int bufsize; + char *buf = NULL, *offs; + + /* Add room for the decimal point as well. */ + bufsize = dec.total + 2; + if (dec.sign) + bufsize++; + /* Add room for leading/trailing zero. */ + if ((dec.frac == 0) || (dec.frac == dec.total)) + bufsize++; + buf = xmlMalloc(bufsize); + if (buf == NULL) + return(-1); + offs = buf; + if (dec.sign) + *offs++ = '-'; + if (dec.frac == dec.total) { + *offs++ = '0'; + *offs++ = '.'; + } + if (dec.hi != 0) + snprintf(offs, bufsize - (offs - buf), + "%lu%lu%lu", dec.hi, dec.mi, dec.lo); + else if (dec.mi != 0) + snprintf(offs, bufsize - (offs - buf), + "%lu%lu", dec.mi, dec.lo); + else + snprintf(offs, bufsize - (offs - buf), + "%lu", dec.lo); + + if (dec.frac != 0) { + if (dec.frac != dec.total) { + int diff = dec.total - dec.frac; + /* + * Insert the decimal point. + */ + memmove(offs + diff + 1, offs + diff, dec.frac +1); + offs[diff] = '.'; + } else { + unsigned int i = 0; + /* + * Insert missing zeroes behind the decimal point. + */ + while (*(offs + i) != 0) + i++; + if (i < dec.total) { + memmove(offs + (dec.total - i), offs, i +1); + memset(offs, '0', dec.total - i); + } + } + } else { + /* + * Append decimal point and zero. + */ + offs = buf + bufsize - 1; + *offs-- = 0; + *offs-- = '0'; + *offs-- = '.'; + } + *retValue = BAD_CAST buf; + } + break; + case XML_SCHEMAS_INTEGER: + case XML_SCHEMAS_PINTEGER: + case XML_SCHEMAS_NPINTEGER: + case XML_SCHEMAS_NINTEGER: + case XML_SCHEMAS_NNINTEGER: + case XML_SCHEMAS_LONG: + case XML_SCHEMAS_BYTE: + case XML_SCHEMAS_SHORT: + case XML_SCHEMAS_INT: + case XML_SCHEMAS_UINT: + case XML_SCHEMAS_ULONG: + case XML_SCHEMAS_USHORT: + case XML_SCHEMAS_UBYTE: + if ((val->value.decimal.total == 1) && + (val->value.decimal.lo == 0)) + *retValue = xmlStrdup(BAD_CAST "0"); + else { + xmlSchemaValDecimal dec = val->value.decimal; + int bufsize = dec.total + 1; + + /* Add room for the decimal point as well. */ + if (dec.sign) + bufsize++; + *retValue = xmlMalloc(bufsize); + if (*retValue == NULL) + return(-1); + if (dec.hi != 0) { + if (dec.sign) + snprintf((char *) *retValue, bufsize, + "-%lu%lu%lu", dec.hi, dec.mi, dec.lo); + else + snprintf((char *) *retValue, bufsize, + "%lu%lu%lu", dec.hi, dec.mi, dec.lo); + } else if (dec.mi != 0) { + if (dec.sign) + snprintf((char *) *retValue, bufsize, + "-%lu%lu", dec.mi, dec.lo); + else + snprintf((char *) *retValue, bufsize, + "%lu%lu", dec.mi, dec.lo); + } else { + if (dec.sign) + snprintf((char *) *retValue, bufsize, "-%lu", dec.lo); + else + snprintf((char *) *retValue, bufsize, "%lu", dec.lo); + } + } + break; + case XML_SCHEMAS_BOOLEAN: + if (val->value.b) + *retValue = BAD_CAST xmlStrdup(BAD_CAST "true"); + else + *retValue = BAD_CAST xmlStrdup(BAD_CAST "false"); + break; + case XML_SCHEMAS_DURATION: { + char buf[100]; + unsigned long year; + unsigned long mon, day, hour = 0, min = 0; + double sec = 0, left; + + /* TODO: Unclear in XML Schema 1.0 */ + /* + * TODO: This results in a normalized output of the value + * - which is NOT conformant to the spec - + * since the exact values of each property are not + * recoverable. Think about extending the structure to + * provide a field for every property. + */ + year = (unsigned long) FQUOTIENT(labs(val->value.dur.mon), 12); + mon = labs(val->value.dur.mon) - 12 * year; + + day = (unsigned long) FQUOTIENT(fabs(val->value.dur.sec), 86400); + left = fabs(val->value.dur.sec) - day * 86400; + if (left > 0) { + hour = (unsigned long) FQUOTIENT(left, 3600); + left = left - (hour * 3600); + if (left > 0) { + min = (unsigned long) FQUOTIENT(left, 60); + sec = left - (min * 60); + } + } + if ((val->value.dur.mon < 0) || (val->value.dur.sec < 0)) + snprintf(buf, 100, "P%luY%luM%luDT%luH%luM%.14gS", + year, mon, day, hour, min, sec); + else + snprintf(buf, 100, "-P%luY%luM%luDT%luH%luM%.14gS", + year, mon, day, hour, min, sec); + *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); + } + break; + case XML_SCHEMAS_GYEAR: { + char buf[30]; + /* TODO: Unclear in XML Schema 1.0 */ + /* TODO: What to do with the timezone? */ + snprintf(buf, 30, "%04ld", val->value.date.year); + *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); + } + break; + case XML_SCHEMAS_GMONTH: { + /* TODO: Unclear in XML Schema 1.0 */ + /* TODO: What to do with the timezone? */ + *retValue = xmlMalloc(6); + if (*retValue == NULL) + return(-1); + snprintf((char *) *retValue, 6, "--%02u", + val->value.date.mon); + } + break; + case XML_SCHEMAS_GDAY: { + /* TODO: Unclear in XML Schema 1.0 */ + /* TODO: What to do with the timezone? */ + *retValue = xmlMalloc(6); + if (*retValue == NULL) + return(-1); + snprintf((char *) *retValue, 6, "---%02u", + val->value.date.day); + } + break; + case XML_SCHEMAS_GMONTHDAY: { + /* TODO: Unclear in XML Schema 1.0 */ + /* TODO: What to do with the timezone? */ + *retValue = xmlMalloc(8); + if (*retValue == NULL) + return(-1); + snprintf((char *) *retValue, 8, "--%02u-%02u", + val->value.date.mon, val->value.date.day); + } + break; + case XML_SCHEMAS_GYEARMONTH: { + char buf[35]; + /* TODO: Unclear in XML Schema 1.0 */ + /* TODO: What to do with the timezone? */ + if (val->value.date.year < 0) + snprintf(buf, 35, "-%04ld-%02u", + labs(val->value.date.year), + val->value.date.mon); + else + snprintf(buf, 35, "%04ld-%02u", + val->value.date.year, val->value.date.mon); + *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); + } + break; + case XML_SCHEMAS_TIME: + { + char buf[30]; + + if (val->value.date.tz_flag) { + xmlSchemaValPtr norm; + + norm = xmlSchemaDateNormalize(val, 0); + if (norm == NULL) + return (-1); + /* + * TODO: Check if "%.14g" is portable. + */ + snprintf(buf, 30, + "%02u:%02u:%02.14gZ", + norm->value.date.hour, + norm->value.date.min, + norm->value.date.sec); + xmlSchemaFreeValue(norm); + } else { + snprintf(buf, 30, + "%02u:%02u:%02.14g", + val->value.date.hour, + val->value.date.min, + val->value.date.sec); + } + *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); + } + break; + case XML_SCHEMAS_DATE: + { + char buf[30]; + + if (val->value.date.tz_flag) { + xmlSchemaValPtr norm; + + norm = xmlSchemaDateNormalize(val, 0); + if (norm == NULL) + return (-1); + /* + * TODO: Append the canonical value of the + * recoverable timezone and not "Z". + */ + snprintf(buf, 30, + "%04ld:%02u:%02uZ", + norm->value.date.year, norm->value.date.mon, + norm->value.date.day); + xmlSchemaFreeValue(norm); + } else { + snprintf(buf, 30, + "%04ld:%02u:%02u", + val->value.date.year, val->value.date.mon, + val->value.date.day); + } + *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); + } + break; + case XML_SCHEMAS_DATETIME: + { + char buf[50]; + + if (val->value.date.tz_flag) { + xmlSchemaValPtr norm; + + norm = xmlSchemaDateNormalize(val, 0); + if (norm == NULL) + return (-1); + /* + * TODO: Check if "%.14g" is portable. + */ + snprintf(buf, 50, + "%04ld:%02u:%02uT%02u:%02u:%02.14gZ", + norm->value.date.year, norm->value.date.mon, + norm->value.date.day, norm->value.date.hour, + norm->value.date.min, norm->value.date.sec); + xmlSchemaFreeValue(norm); + } else { + snprintf(buf, 50, + "%04ld:%02u:%02uT%02u:%02u:%02.14g", + val->value.date.year, val->value.date.mon, + val->value.date.day, val->value.date.hour, + val->value.date.min, val->value.date.sec); + } + *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); + } + break; + case XML_SCHEMAS_HEXBINARY: + *retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.hex.str); + break; + case XML_SCHEMAS_BASE64BINARY: + /* + * TODO: Is the following spec piece implemented?: + * SPEC: "Note: For some values the canonical form defined + * above does not conform to [RFC 2045], which requires breaking + * with linefeeds at appropriate intervals." + */ + *retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.base64.str); + break; + case XML_SCHEMAS_FLOAT: { + char buf[30]; + /* + * |m| < 16777216, -149 <= e <= 104. + * TODO: Handle, NaN, INF, -INF. The format is not + * yet conformant. The c type float does not cover + * the whole range. + */ + snprintf(buf, 30, "%01.14e", val->value.f); + *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); + } + break; + case XML_SCHEMAS_DOUBLE: { + char buf[40]; + /* |m| < 9007199254740992, -1075 <= e <= 970 */ + /* + * TODO: Handle, NaN, INF, -INF. The format is not + * yet conformant. The c type float does not cover + * the whole range. + */ + snprintf(buf, 40, "%01.14e", val->value.d); + *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); + } + break; + default: + *retValue = BAD_CAST xmlStrdup(BAD_CAST "???"); + return (1); + } + if (*retValue == NULL) + return(-1); + return (0); +} + +/** + * xmlSchemaGetCanonValueWhtsp: + * @val: the precomputed value + * @retValue: the returned value + * @ws: the whitespace type of the value + * + * Get a the cononical representation of the value. + * The caller has to free the returned @retValue. + * + * Returns 0 if the value could be built, 1 if the value type is + * not supported yet and -1 in case of API errors. + */ +int +xmlSchemaGetCanonValueWhtsp(xmlSchemaValPtr val, + const xmlChar **retValue, + xmlSchemaWhitespaceValueType ws) +{ + if ((retValue == NULL) || (val == NULL)) + return (-1); + if ((ws == XML_SCHEMA_WHITESPACE_UNKNOWN) || + (ws > XML_SCHEMA_WHITESPACE_COLLAPSE)) + return (-1); + + *retValue = NULL; + switch (val->type) { + case XML_SCHEMAS_STRING: + if (val->value.str == NULL) + *retValue = BAD_CAST xmlStrdup(BAD_CAST ""); + else if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) + *retValue = xmlSchemaCollapseString(val->value.str); + else if (ws == XML_SCHEMA_WHITESPACE_REPLACE) + *retValue = xmlSchemaWhiteSpaceReplace(val->value.str); + if ((*retValue) == NULL) + *retValue = BAD_CAST xmlStrdup(val->value.str); + break; + case XML_SCHEMAS_NORMSTRING: + if (val->value.str == NULL) + *retValue = BAD_CAST xmlStrdup(BAD_CAST ""); + else { + if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) + *retValue = xmlSchemaCollapseString(val->value.str); + else + *retValue = xmlSchemaWhiteSpaceReplace(val->value.str); + if ((*retValue) == NULL) + *retValue = BAD_CAST xmlStrdup(val->value.str); + } + break; + default: + return (xmlSchemaGetCanonValue(val, retValue)); + } + return (0); +} + +/** + * xmlSchemaGetValType: + * @val: a schemas value + * + * Accessor for the type of a value + * + * Returns the xmlSchemaValType of the value + */ +xmlSchemaValType +xmlSchemaGetValType(xmlSchemaValPtr val) +{ + if (val == NULL) + return(XML_SCHEMAS_UNKNOWN); + return (val->type); +} + +#define bottom_xmlschemastypes +#include "elfgcchack.h" +#endif /* LIBXML_SCHEMAS_ENABLED */ diff --git a/vendors/libxml/src/xmlstring.c b/vendors/libxml/src/xmlstring.c new file mode 100644 index 0000000..a37220d --- /dev/null +++ b/vendors/libxml/src/xmlstring.c @@ -0,0 +1,984 @@ +/* + * string.c : an XML string utilities module + * + * This module provides various utility functions for manipulating + * the xmlChar* type. All functions named xmlStr* have been moved here + * from the parser.c file (their original home). + * + * See Copyright for the status of this software. + * + * UTF8 string routines from: + * William Brack + * + * daniel@veillard.com + */ + +#define IN_LIBXML +#include "libxml.h" + +#include +#include +#include +#include +#include + +/************************************************************************ + * * + * Commodity functions to handle xmlChars * + * * + ************************************************************************/ + +/** + * xmlStrndup: + * @cur: the input xmlChar * + * @len: the len of @cur + * + * a strndup for array of xmlChar's + * + * Returns a new xmlChar * or NULL + */ +xmlChar * +xmlStrndup(const xmlChar *cur, int len) { + xmlChar *ret; + + if ((cur == NULL) || (len < 0)) return(NULL); + ret = (xmlChar *) xmlMallocAtomic((len + 1) * sizeof(xmlChar)); + if (ret == NULL) { + xmlErrMemory(NULL, NULL); + return(NULL); + } + memcpy(ret, cur, len * sizeof(xmlChar)); + ret[len] = 0; + return(ret); +} + +/** + * xmlStrdup: + * @cur: the input xmlChar * + * + * a strdup for array of xmlChar's. Since they are supposed to be + * encoded in UTF-8 or an encoding with 8bit based chars, we assume + * a termination mark of '0'. + * + * Returns a new xmlChar * or NULL + */ +xmlChar * +xmlStrdup(const xmlChar *cur) { + const xmlChar *p = cur; + + if (cur == NULL) return(NULL); + while (*p != 0) p++; /* non input consuming */ + return(xmlStrndup(cur, p - cur)); +} + +/** + * xmlCharStrndup: + * @cur: the input char * + * @len: the len of @cur + * + * a strndup for char's to xmlChar's + * + * Returns a new xmlChar * or NULL + */ + +xmlChar * +xmlCharStrndup(const char *cur, int len) { + int i; + xmlChar *ret; + + if ((cur == NULL) || (len < 0)) return(NULL); + ret = (xmlChar *) xmlMallocAtomic((len + 1) * sizeof(xmlChar)); + if (ret == NULL) { + xmlErrMemory(NULL, NULL); + return(NULL); + } + for (i = 0;i < len;i++) { + ret[i] = (xmlChar) cur[i]; + if (ret[i] == 0) return(ret); + } + ret[len] = 0; + return(ret); +} + +/** + * xmlCharStrdup: + * @cur: the input char * + * + * a strdup for char's to xmlChar's + * + * Returns a new xmlChar * or NULL + */ + +xmlChar * +xmlCharStrdup(const char *cur) { + const char *p = cur; + + if (cur == NULL) return(NULL); + while (*p != '\0') p++; /* non input consuming */ + return(xmlCharStrndup(cur, p - cur)); +} + +/** + * xmlStrcmp: + * @str1: the first xmlChar * + * @str2: the second xmlChar * + * + * a strcmp for xmlChar's + * + * Returns the integer result of the comparison + */ + +int +xmlStrcmp(const xmlChar *str1, const xmlChar *str2) { + register int tmp; + + if (str1 == str2) return(0); + if (str1 == NULL) return(-1); + if (str2 == NULL) return(1); + do { + tmp = *str1++ - *str2; + if (tmp != 0) return(tmp); + } while (*str2++ != 0); + return 0; +} + +/** + * xmlStrEqual: + * @str1: the first xmlChar * + * @str2: the second xmlChar * + * + * Check if both strings are equal of have same content. + * Should be a bit more readable and faster than xmlStrcmp() + * + * Returns 1 if they are equal, 0 if they are different + */ + +int +xmlStrEqual(const xmlChar *str1, const xmlChar *str2) { + if (str1 == str2) return(1); + if (str1 == NULL) return(0); + if (str2 == NULL) return(0); + do { + if (*str1++ != *str2) return(0); + } while (*str2++); + return(1); +} + +/** + * xmlStrQEqual: + * @pref: the prefix of the QName + * @name: the localname of the QName + * @str: the second xmlChar * + * + * Check if a QName is Equal to a given string + * + * Returns 1 if they are equal, 0 if they are different + */ + +int +xmlStrQEqual(const xmlChar *pref, const xmlChar *name, const xmlChar *str) { + if (pref == NULL) return(xmlStrEqual(name, str)); + if (name == NULL) return(0); + if (str == NULL) return(0); + + do { + if (*pref++ != *str) return(0); + } while ((*str++) && (*pref)); + if (*str++ != ':') return(0); + do { + if (*name++ != *str) return(0); + } while (*str++); + return(1); +} + +/** + * xmlStrncmp: + * @str1: the first xmlChar * + * @str2: the second xmlChar * + * @len: the max comparison length + * + * a strncmp for xmlChar's + * + * Returns the integer result of the comparison + */ + +int +xmlStrncmp(const xmlChar *str1, const xmlChar *str2, int len) { + register int tmp; + + if (len <= 0) return(0); + if (str1 == str2) return(0); + if (str1 == NULL) return(-1); + if (str2 == NULL) return(1); +#ifdef __GNUC__ + tmp = strncmp((const char *)str1, (const char *)str2, len); + return tmp; +#else + do { + tmp = *str1++ - *str2; + if (tmp != 0 || --len == 0) return(tmp); + } while (*str2++ != 0); + return 0; +#endif +} + +static const xmlChar casemap[256] = { + 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,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,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,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,0xCE,0xCF, + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7, + 0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7, + 0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7, + 0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF +}; + +/** + * xmlStrcasecmp: + * @str1: the first xmlChar * + * @str2: the second xmlChar * + * + * a strcasecmp for xmlChar's + * + * Returns the integer result of the comparison + */ + +int +xmlStrcasecmp(const xmlChar *str1, const xmlChar *str2) { + register int tmp; + + if (str1 == str2) return(0); + if (str1 == NULL) return(-1); + if (str2 == NULL) return(1); + do { + tmp = casemap[*str1++] - casemap[*str2]; + if (tmp != 0) return(tmp); + } while (*str2++ != 0); + return 0; +} + +/** + * xmlStrncasecmp: + * @str1: the first xmlChar * + * @str2: the second xmlChar * + * @len: the max comparison length + * + * a strncasecmp for xmlChar's + * + * Returns the integer result of the comparison + */ + +int +xmlStrncasecmp(const xmlChar *str1, const xmlChar *str2, int len) { + register int tmp; + + if (len <= 0) return(0); + if (str1 == str2) return(0); + if (str1 == NULL) return(-1); + if (str2 == NULL) return(1); + do { + tmp = casemap[*str1++] - casemap[*str2]; + if (tmp != 0 || --len == 0) return(tmp); + } while (*str2++ != 0); + return 0; +} + +/** + * xmlStrchr: + * @str: the xmlChar * array + * @val: the xmlChar to search + * + * a strchr for xmlChar's + * + * Returns the xmlChar * for the first occurrence or NULL. + */ + +const xmlChar * +xmlStrchr(const xmlChar *str, xmlChar val) { + if (str == NULL) return(NULL); + while (*str != 0) { /* non input consuming */ + if (*str == val) return((xmlChar *) str); + str++; + } + return(NULL); +} + +/** + * xmlStrstr: + * @str: the xmlChar * array (haystack) + * @val: the xmlChar to search (needle) + * + * a strstr for xmlChar's + * + * Returns the xmlChar * for the first occurrence or NULL. + */ + +const xmlChar * +xmlStrstr(const xmlChar *str, const xmlChar *val) { + int n; + + if (str == NULL) return(NULL); + if (val == NULL) return(NULL); + n = xmlStrlen(val); + + if (n == 0) return(str); + while (*str != 0) { /* non input consuming */ + if (*str == *val) { + if (!xmlStrncmp(str, val, n)) return((const xmlChar *) str); + } + str++; + } + return(NULL); +} + +/** + * xmlStrcasestr: + * @str: the xmlChar * array (haystack) + * @val: the xmlChar to search (needle) + * + * a case-ignoring strstr for xmlChar's + * + * Returns the xmlChar * for the first occurrence or NULL. + */ + +const xmlChar * +xmlStrcasestr(const xmlChar *str, const xmlChar *val) { + int n; + + if (str == NULL) return(NULL); + if (val == NULL) return(NULL); + n = xmlStrlen(val); + + if (n == 0) return(str); + while (*str != 0) { /* non input consuming */ + if (casemap[*str] == casemap[*val]) + if (!xmlStrncasecmp(str, val, n)) return(str); + str++; + } + return(NULL); +} + +/** + * xmlStrsub: + * @str: the xmlChar * array (haystack) + * @start: the index of the first char (zero based) + * @len: the length of the substring + * + * Extract a substring of a given string + * + * Returns the xmlChar * for the first occurrence or NULL. + */ + +xmlChar * +xmlStrsub(const xmlChar *str, int start, int len) { + int i; + + if (str == NULL) return(NULL); + if (start < 0) return(NULL); + if (len < 0) return(NULL); + + for (i = 0;i < start;i++) { + if (*str == 0) return(NULL); + str++; + } + if (*str == 0) return(NULL); + return(xmlStrndup(str, len)); +} + +/** + * xmlStrlen: + * @str: the xmlChar * array + * + * length of a xmlChar's string + * + * Returns the number of xmlChar contained in the ARRAY. + */ + +int +xmlStrlen(const xmlChar *str) { + int len = 0; + + if (str == NULL) return(0); + while (*str != 0) { /* non input consuming */ + str++; + len++; + } + return(len); +} + +/** + * xmlStrncat: + * @cur: the original xmlChar * array + * @add: the xmlChar * array added + * @len: the length of @add + * + * a strncat for array of xmlChar's, it will extend @cur with the len + * first bytes of @add. Note that if @len < 0 then this is an API error + * and NULL will be returned. + * + * Returns a new xmlChar *, the original @cur is reallocated if needed + * and should not be freed + */ + +xmlChar * +xmlStrncat(xmlChar *cur, const xmlChar *add, int len) { + int size; + xmlChar *ret; + + if ((add == NULL) || (len == 0)) + return(cur); + if (len < 0) + return(NULL); + if (cur == NULL) + return(xmlStrndup(add, len)); + + size = xmlStrlen(cur); + ret = (xmlChar *) xmlRealloc(cur, (size + len + 1) * sizeof(xmlChar)); + if (ret == NULL) { + xmlErrMemory(NULL, NULL); + return(cur); + } + memcpy(&ret[size], add, len * sizeof(xmlChar)); + ret[size + len] = 0; + return(ret); +} + +/** + * xmlStrncatNew: + * @str1: first xmlChar string + * @str2: second xmlChar string + * @len: the len of @str2 or < 0 + * + * same as xmlStrncat, but creates a new string. The original + * two strings are not freed. If @len is < 0 then the length + * will be calculated automatically. + * + * Returns a new xmlChar * or NULL + */ +xmlChar * +xmlStrncatNew(const xmlChar *str1, const xmlChar *str2, int len) { + int size; + xmlChar *ret; + + if (len < 0) + len = xmlStrlen(str2); + if ((str2 == NULL) || (len == 0)) + return(xmlStrdup(str1)); + if (str1 == NULL) + return(xmlStrndup(str2, len)); + + size = xmlStrlen(str1); + ret = (xmlChar *) xmlMalloc((size + len + 1) * sizeof(xmlChar)); + if (ret == NULL) { + xmlErrMemory(NULL, NULL); + return(xmlStrndup(str1, size)); + } + memcpy(ret, str1, size * sizeof(xmlChar)); + memcpy(&ret[size], str2, len * sizeof(xmlChar)); + ret[size + len] = 0; + return(ret); +} + +/** + * xmlStrcat: + * @cur: the original xmlChar * array + * @add: the xmlChar * array added + * + * a strcat for array of xmlChar's. Since they are supposed to be + * encoded in UTF-8 or an encoding with 8bit based chars, we assume + * a termination mark of '0'. + * + * Returns a new xmlChar * containing the concatenated string. + */ +xmlChar * +xmlStrcat(xmlChar *cur, const xmlChar *add) { + const xmlChar *p = add; + + if (add == NULL) return(cur); + if (cur == NULL) + return(xmlStrdup(add)); + + while (*p != 0) p++; /* non input consuming */ + return(xmlStrncat(cur, add, p - add)); +} + +/** + * xmlStrPrintf: + * @buf: the result buffer. + * @len: the result buffer length. + * @msg: the message with printf formatting. + * @...: extra parameters for the message. + * + * Formats @msg and places result into @buf. + * + * Returns the number of characters written to @buf or -1 if an error occurs. + */ +int XMLCDECL +xmlStrPrintf(xmlChar *buf, int len, const xmlChar *msg, ...) { + va_list args; + int ret; + + if((buf == NULL) || (msg == NULL)) { + return(-1); + } + + va_start(args, msg); + ret = vsnprintf((char *) buf, len, (const char *) msg, args); + va_end(args); + buf[len - 1] = 0; /* be safe ! */ + + return(ret); +} + +/** + * xmlStrVPrintf: + * @buf: the result buffer. + * @len: the result buffer length. + * @msg: the message with printf formatting. + * @ap: extra parameters for the message. + * + * Formats @msg and places result into @buf. + * + * Returns the number of characters written to @buf or -1 if an error occurs. + */ +int +xmlStrVPrintf(xmlChar *buf, int len, const xmlChar *msg, va_list ap) { + int ret; + + if((buf == NULL) || (msg == NULL)) { + return(-1); + } + + ret = vsnprintf((char *) buf, len, (const char *) msg, ap); + buf[len - 1] = 0; /* be safe ! */ + + return(ret); +} + +/************************************************************************ + * * + * Generic UTF8 handling routines * + * * + * From rfc2044: encoding of the Unicode values on UTF-8: * + * * + * UCS-4 range (hex.) UTF-8 octet sequence (binary) * + * 0000 0000-0000 007F 0xxxxxxx * + * 0000 0080-0000 07FF 110xxxxx 10xxxxxx * + * 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx * + * * + * I hope we won't use values > 0xFFFF anytime soon ! * + * * + ************************************************************************/ + + +/** + * xmlUTF8Size: + * @utf: pointer to the UTF8 character + * + * calculates the internal size of a UTF8 character + * + * returns the numbers of bytes in the character, -1 on format error + */ +int +xmlUTF8Size(const xmlChar *utf) { + xmlChar mask; + int len; + + if (utf == NULL) + return -1; + if (*utf < 0x80) + return 1; + /* check valid UTF8 character */ + if (!(*utf & 0x40)) + return -1; + /* determine number of bytes in char */ + len = 2; + for (mask=0x20; mask != 0; mask>>=1) { + if (!(*utf & mask)) + return len; + len++; + } + return -1; +} + +/** + * xmlUTF8Charcmp: + * @utf1: pointer to first UTF8 char + * @utf2: pointer to second UTF8 char + * + * compares the two UCS4 values + * + * returns result of the compare as with xmlStrncmp + */ +int +xmlUTF8Charcmp(const xmlChar *utf1, const xmlChar *utf2) { + + if (utf1 == NULL ) { + if (utf2 == NULL) + return 0; + return -1; + } + return xmlStrncmp(utf1, utf2, xmlUTF8Size(utf1)); +} + +/** + * xmlUTF8Strlen: + * @utf: a sequence of UTF-8 encoded bytes + * + * compute the length of an UTF8 string, it doesn't do a full UTF8 + * checking of the content of the string. + * + * Returns the number of characters in the string or -1 in case of error + */ +int +xmlUTF8Strlen(const xmlChar *utf) { + int ret = 0; + + if (utf == NULL) + return(-1); + + while (*utf != 0) { + if (utf[0] & 0x80) { + if ((utf[1] & 0xc0) != 0x80) + return(-1); + if ((utf[0] & 0xe0) == 0xe0) { + if ((utf[2] & 0xc0) != 0x80) + return(-1); + if ((utf[0] & 0xf0) == 0xf0) { + if ((utf[0] & 0xf8) != 0xf0 || (utf[3] & 0xc0) != 0x80) + return(-1); + utf += 4; + } else { + utf += 3; + } + } else { + utf += 2; + } + } else { + utf++; + } + ret++; + } + return(ret); +} + +/** + * xmlGetUTF8Char: + * @utf: a sequence of UTF-8 encoded bytes + * @len: a pointer to the minimum number of bytes present in + * the sequence. This is used to assure the next character + * is completely contained within the sequence. + * + * Read the first UTF8 character from @utf + * + * Returns the char value or -1 in case of error, and sets *len to + * the actual number of bytes consumed (0 in case of error) + */ +int +xmlGetUTF8Char(const unsigned char *utf, int *len) { + unsigned int c; + + if (utf == NULL) + goto error; + if (len == NULL) + goto error; + if (*len < 1) + goto error; + + c = utf[0]; + if (c & 0x80) { + if (*len < 2) + goto error; + if ((utf[1] & 0xc0) != 0x80) + goto error; + if ((c & 0xe0) == 0xe0) { + if (*len < 3) + goto error; + if ((utf[2] & 0xc0) != 0x80) + goto error; + if ((c & 0xf0) == 0xf0) { + if (*len < 4) + goto error; + if ((c & 0xf8) != 0xf0 || (utf[3] & 0xc0) != 0x80) + goto error; + *len = 4; + /* 4-byte code */ + c = (utf[0] & 0x7) << 18; + c |= (utf[1] & 0x3f) << 12; + c |= (utf[2] & 0x3f) << 6; + c |= utf[3] & 0x3f; + } else { + /* 3-byte code */ + *len = 3; + c = (utf[0] & 0xf) << 12; + c |= (utf[1] & 0x3f) << 6; + c |= utf[2] & 0x3f; + } + } else { + /* 2-byte code */ + *len = 2; + c = (utf[0] & 0x1f) << 6; + c |= utf[1] & 0x3f; + } + } else { + /* 1-byte code */ + *len = 1; + } + return(c); + +error: + if (len != NULL) + *len = 0; + return(-1); +} + +/** + * xmlCheckUTF8: + * @utf: Pointer to putative UTF-8 encoded string. + * + * Checks @utf for being valid UTF-8. @utf is assumed to be + * null-terminated. This function is not super-strict, as it will + * allow longer UTF-8 sequences than necessary. Note that Java is + * capable of producing these sequences if provoked. Also note, this + * routine checks for the 4-byte maximum size, but does not check for + * 0x10ffff maximum value. + * + * Return value: true if @utf is valid. + **/ +int +xmlCheckUTF8(const unsigned char *utf) +{ + int ix; + unsigned char c; + + if (utf == NULL) + return(0); + /* + * utf is a string of 1, 2, 3 or 4 bytes. The valid strings + * are as follows (in "bit format"): + * 0xxxxxxx valid 1-byte + * 110xxxxx 10xxxxxx valid 2-byte + * 1110xxxx 10xxxxxx 10xxxxxx valid 3-byte + * 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx valid 4-byte + */ + for (ix = 0; (c = utf[ix]);) { /* string is 0-terminated */ + if ((c & 0x80) == 0x00) { /* 1-byte code, starts with 10 */ + ix++; + } else if ((c & 0xe0) == 0xc0) {/* 2-byte code, starts with 110 */ + if ((utf[ix+1] & 0xc0 ) != 0x80) + return 0; + ix += 2; + } else if ((c & 0xf0) == 0xe0) {/* 3-byte code, starts with 1110 */ + if (((utf[ix+1] & 0xc0) != 0x80) || + ((utf[ix+2] & 0xc0) != 0x80)) + return 0; + ix += 3; + } else if ((c & 0xf8) == 0xf0) {/* 4-byte code, starts with 11110 */ + if (((utf[ix+1] & 0xc0) != 0x80) || + ((utf[ix+2] & 0xc0) != 0x80) || + ((utf[ix+3] & 0xc0) != 0x80)) + return 0; + ix += 4; + } else /* unknown encoding */ + return 0; + } + return(1); +} + +/** + * xmlUTF8Strsize: + * @utf: a sequence of UTF-8 encoded bytes + * @len: the number of characters in the array + * + * storage size of an UTF8 string + * the behaviour is not garanteed if the input string is not UTF-8 + * + * Returns the storage size of + * the first 'len' characters of ARRAY + */ + +int +xmlUTF8Strsize(const xmlChar *utf, int len) { + const xmlChar *ptr=utf; + xmlChar ch; + + if (utf == NULL) + return(0); + + if (len <= 0) + return(0); + + while ( len-- > 0) { + if ( !*ptr ) + break; + if ( (ch = *ptr++) & 0x80) + while ((ch<<=1) & 0x80 ) { + ptr++; + if (*ptr == 0) break; + } + } + return (ptr - utf); +} + + +/** + * xmlUTF8Strndup: + * @utf: the input UTF8 * + * @len: the len of @utf (in chars) + * + * a strndup for array of UTF8's + * + * Returns a new UTF8 * or NULL + */ +xmlChar * +xmlUTF8Strndup(const xmlChar *utf, int len) { + xmlChar *ret; + int i; + + if ((utf == NULL) || (len < 0)) return(NULL); + i = xmlUTF8Strsize(utf, len); + ret = (xmlChar *) xmlMallocAtomic((i + 1) * sizeof(xmlChar)); + if (ret == NULL) { + xmlGenericError(xmlGenericErrorContext, + "malloc of %ld byte failed\n", + (len + 1) * (long)sizeof(xmlChar)); + return(NULL); + } + memcpy(ret, utf, i * sizeof(xmlChar)); + ret[i] = 0; + return(ret); +} + +/** + * xmlUTF8Strpos: + * @utf: the input UTF8 * + * @pos: the position of the desired UTF8 char (in chars) + * + * a function to provide the equivalent of fetching a + * character from a string array + * + * Returns a pointer to the UTF8 character or NULL + */ +const xmlChar * +xmlUTF8Strpos(const xmlChar *utf, int pos) { + xmlChar ch; + + if (utf == NULL) return(NULL); + if (pos < 0) + return(NULL); + while (pos--) { + if ((ch=*utf++) == 0) return(NULL); + if ( ch & 0x80 ) { + /* if not simple ascii, verify proper format */ + if ( (ch & 0xc0) != 0xc0 ) + return(NULL); + /* then skip over remaining bytes for this char */ + while ( (ch <<= 1) & 0x80 ) + if ( (*utf++ & 0xc0) != 0x80 ) + return(NULL); + } + } + return((xmlChar *)utf); +} + +/** + * xmlUTF8Strloc: + * @utf: the input UTF8 * + * @utfchar: the UTF8 character to be found + * + * a function to provide the relative location of a UTF8 char + * + * Returns the relative character position of the desired char + * or -1 if not found + */ +int +xmlUTF8Strloc(const xmlChar *utf, const xmlChar *utfchar) { + int i, size; + xmlChar ch; + + if (utf==NULL || utfchar==NULL) return -1; + size = xmlUTF8Strsize(utfchar, 1); + for(i=0; (ch=*utf) != 0; i++) { + if (xmlStrncmp(utf, utfchar, size)==0) + return(i); + utf++; + if ( ch & 0x80 ) { + /* if not simple ascii, verify proper format */ + if ( (ch & 0xc0) != 0xc0 ) + return(-1); + /* then skip over remaining bytes for this char */ + while ( (ch <<= 1) & 0x80 ) + if ( (*utf++ & 0xc0) != 0x80 ) + return(-1); + } + } + + return(-1); +} +/** + * xmlUTF8Strsub: + * @utf: a sequence of UTF-8 encoded bytes + * @start: relative pos of first char + * @len: total number to copy + * + * Create a substring from a given UTF-8 string + * Note: positions are given in units of UTF-8 chars + * + * Returns a pointer to a newly created string + * or NULL if any problem + */ + +xmlChar * +xmlUTF8Strsub(const xmlChar *utf, int start, int len) { + int i; + xmlChar ch; + + if (utf == NULL) return(NULL); + if (start < 0) return(NULL); + if (len < 0) return(NULL); + + /* + * Skip over any leading chars + */ + for (i = 0;i < start;i++) { + if ((ch=*utf++) == 0) return(NULL); + if ( ch & 0x80 ) { + /* if not simple ascii, verify proper format */ + if ( (ch & 0xc0) != 0xc0 ) + return(NULL); + /* then skip over remaining bytes for this char */ + while ( (ch <<= 1) & 0x80 ) + if ( (*utf++ & 0xc0) != 0x80 ) + return(NULL); + } + } + + return(xmlUTF8Strndup(utf, len)); +} + +#define bottom_xmlstring +#include "elfgcchack.h" diff --git a/vendors/libxml/src/xmlunicode.c b/vendors/libxml/src/xmlunicode.c new file mode 100644 index 0000000..ce6e9a4 --- /dev/null +++ b/vendors/libxml/src/xmlunicode.c @@ -0,0 +1,3179 @@ +/* + * xmlunicode.c: this module implements the Unicode character APIs + * + * This file is automatically generated from the + * UCS description files of the Unicode Character Database + * http://www.unicode.org/Public/4.0-Update1/UCD-4.0.1.html + * using the genUnicode.py Python script. + * + * Generation date: Mon Mar 27 11:09:52 2006 + * Sources: Blocks-4.0.1.txt UnicodeData-4.0.1.txt + * Daniel Veillard + */ + +#define IN_LIBXML +#include "libxml.h" + +#ifdef LIBXML_UNICODE_ENABLED + +#include +#include +#include +#include + +typedef int (xmlIntFunc)(int); /* just to keep one's mind untwisted */ + +typedef struct { + const char *rangename; + xmlIntFunc *func; +} xmlUnicodeRange; + +typedef struct { + xmlUnicodeRange *table; + int numentries; +} xmlUnicodeNameTable; + + +static xmlIntFunc *xmlUnicodeLookup(xmlUnicodeNameTable *tptr, const char *tname); + +static xmlUnicodeRange xmlUnicodeBlocks[] = { + {"AegeanNumbers", xmlUCSIsAegeanNumbers}, + {"AlphabeticPresentationForms", xmlUCSIsAlphabeticPresentationForms}, + {"Arabic", xmlUCSIsArabic}, + {"ArabicPresentationForms-A", xmlUCSIsArabicPresentationFormsA}, + {"ArabicPresentationForms-B", xmlUCSIsArabicPresentationFormsB}, + {"Armenian", xmlUCSIsArmenian}, + {"Arrows", xmlUCSIsArrows}, + {"BasicLatin", xmlUCSIsBasicLatin}, + {"Bengali", xmlUCSIsBengali}, + {"BlockElements", xmlUCSIsBlockElements}, + {"Bopomofo", xmlUCSIsBopomofo}, + {"BopomofoExtended", xmlUCSIsBopomofoExtended}, + {"BoxDrawing", xmlUCSIsBoxDrawing}, + {"BraillePatterns", xmlUCSIsBraillePatterns}, + {"Buhid", xmlUCSIsBuhid}, + {"ByzantineMusicalSymbols", xmlUCSIsByzantineMusicalSymbols}, + {"CJKCompatibility", xmlUCSIsCJKCompatibility}, + {"CJKCompatibilityForms", xmlUCSIsCJKCompatibilityForms}, + {"CJKCompatibilityIdeographs", xmlUCSIsCJKCompatibilityIdeographs}, + {"CJKCompatibilityIdeographsSupplement", xmlUCSIsCJKCompatibilityIdeographsSupplement}, + {"CJKRadicalsSupplement", xmlUCSIsCJKRadicalsSupplement}, + {"CJKSymbolsandPunctuation", xmlUCSIsCJKSymbolsandPunctuation}, + {"CJKUnifiedIdeographs", xmlUCSIsCJKUnifiedIdeographs}, + {"CJKUnifiedIdeographsExtensionA", xmlUCSIsCJKUnifiedIdeographsExtensionA}, + {"CJKUnifiedIdeographsExtensionB", xmlUCSIsCJKUnifiedIdeographsExtensionB}, + {"Cherokee", xmlUCSIsCherokee}, + {"CombiningDiacriticalMarks", xmlUCSIsCombiningDiacriticalMarks}, + {"CombiningDiacriticalMarksforSymbols", xmlUCSIsCombiningDiacriticalMarksforSymbols}, + {"CombiningHalfMarks", xmlUCSIsCombiningHalfMarks}, + {"CombiningMarksforSymbols", xmlUCSIsCombiningMarksforSymbols}, + {"ControlPictures", xmlUCSIsControlPictures}, + {"CurrencySymbols", xmlUCSIsCurrencySymbols}, + {"CypriotSyllabary", xmlUCSIsCypriotSyllabary}, + {"Cyrillic", xmlUCSIsCyrillic}, + {"CyrillicSupplement", xmlUCSIsCyrillicSupplement}, + {"Deseret", xmlUCSIsDeseret}, + {"Devanagari", xmlUCSIsDevanagari}, + {"Dingbats", xmlUCSIsDingbats}, + {"EnclosedAlphanumerics", xmlUCSIsEnclosedAlphanumerics}, + {"EnclosedCJKLettersandMonths", xmlUCSIsEnclosedCJKLettersandMonths}, + {"Ethiopic", xmlUCSIsEthiopic}, + {"GeneralPunctuation", xmlUCSIsGeneralPunctuation}, + {"GeometricShapes", xmlUCSIsGeometricShapes}, + {"Georgian", xmlUCSIsGeorgian}, + {"Gothic", xmlUCSIsGothic}, + {"Greek", xmlUCSIsGreek}, + {"GreekExtended", xmlUCSIsGreekExtended}, + {"GreekandCoptic", xmlUCSIsGreekandCoptic}, + {"Gujarati", xmlUCSIsGujarati}, + {"Gurmukhi", xmlUCSIsGurmukhi}, + {"HalfwidthandFullwidthForms", xmlUCSIsHalfwidthandFullwidthForms}, + {"HangulCompatibilityJamo", xmlUCSIsHangulCompatibilityJamo}, + {"HangulJamo", xmlUCSIsHangulJamo}, + {"HangulSyllables", xmlUCSIsHangulSyllables}, + {"Hanunoo", xmlUCSIsHanunoo}, + {"Hebrew", xmlUCSIsHebrew}, + {"HighPrivateUseSurrogates", xmlUCSIsHighPrivateUseSurrogates}, + {"HighSurrogates", xmlUCSIsHighSurrogates}, + {"Hiragana", xmlUCSIsHiragana}, + {"IPAExtensions", xmlUCSIsIPAExtensions}, + {"IdeographicDescriptionCharacters", xmlUCSIsIdeographicDescriptionCharacters}, + {"Kanbun", xmlUCSIsKanbun}, + {"KangxiRadicals", xmlUCSIsKangxiRadicals}, + {"Kannada", xmlUCSIsKannada}, + {"Katakana", xmlUCSIsKatakana}, + {"KatakanaPhoneticExtensions", xmlUCSIsKatakanaPhoneticExtensions}, + {"Khmer", xmlUCSIsKhmer}, + {"KhmerSymbols", xmlUCSIsKhmerSymbols}, + {"Lao", xmlUCSIsLao}, + {"Latin-1Supplement", xmlUCSIsLatin1Supplement}, + {"LatinExtended-A", xmlUCSIsLatinExtendedA}, + {"LatinExtended-B", xmlUCSIsLatinExtendedB}, + {"LatinExtendedAdditional", xmlUCSIsLatinExtendedAdditional}, + {"LetterlikeSymbols", xmlUCSIsLetterlikeSymbols}, + {"Limbu", xmlUCSIsLimbu}, + {"LinearBIdeograms", xmlUCSIsLinearBIdeograms}, + {"LinearBSyllabary", xmlUCSIsLinearBSyllabary}, + {"LowSurrogates", xmlUCSIsLowSurrogates}, + {"Malayalam", xmlUCSIsMalayalam}, + {"MathematicalAlphanumericSymbols", xmlUCSIsMathematicalAlphanumericSymbols}, + {"MathematicalOperators", xmlUCSIsMathematicalOperators}, + {"MiscellaneousMathematicalSymbols-A", xmlUCSIsMiscellaneousMathematicalSymbolsA}, + {"MiscellaneousMathematicalSymbols-B", xmlUCSIsMiscellaneousMathematicalSymbolsB}, + {"MiscellaneousSymbols", xmlUCSIsMiscellaneousSymbols}, + {"MiscellaneousSymbolsandArrows", xmlUCSIsMiscellaneousSymbolsandArrows}, + {"MiscellaneousTechnical", xmlUCSIsMiscellaneousTechnical}, + {"Mongolian", xmlUCSIsMongolian}, + {"MusicalSymbols", xmlUCSIsMusicalSymbols}, + {"Myanmar", xmlUCSIsMyanmar}, + {"NumberForms", xmlUCSIsNumberForms}, + {"Ogham", xmlUCSIsOgham}, + {"OldItalic", xmlUCSIsOldItalic}, + {"OpticalCharacterRecognition", xmlUCSIsOpticalCharacterRecognition}, + {"Oriya", xmlUCSIsOriya}, + {"Osmanya", xmlUCSIsOsmanya}, + {"PhoneticExtensions", xmlUCSIsPhoneticExtensions}, + {"PrivateUse", xmlUCSIsPrivateUse}, + {"PrivateUseArea", xmlUCSIsPrivateUseArea}, + {"Runic", xmlUCSIsRunic}, + {"Shavian", xmlUCSIsShavian}, + {"Sinhala", xmlUCSIsSinhala}, + {"SmallFormVariants", xmlUCSIsSmallFormVariants}, + {"SpacingModifierLetters", xmlUCSIsSpacingModifierLetters}, + {"Specials", xmlUCSIsSpecials}, + {"SuperscriptsandSubscripts", xmlUCSIsSuperscriptsandSubscripts}, + {"SupplementalArrows-A", xmlUCSIsSupplementalArrowsA}, + {"SupplementalArrows-B", xmlUCSIsSupplementalArrowsB}, + {"SupplementalMathematicalOperators", xmlUCSIsSupplementalMathematicalOperators}, + {"SupplementaryPrivateUseArea-A", xmlUCSIsSupplementaryPrivateUseAreaA}, + {"SupplementaryPrivateUseArea-B", xmlUCSIsSupplementaryPrivateUseAreaB}, + {"Syriac", xmlUCSIsSyriac}, + {"Tagalog", xmlUCSIsTagalog}, + {"Tagbanwa", xmlUCSIsTagbanwa}, + {"Tags", xmlUCSIsTags}, + {"TaiLe", xmlUCSIsTaiLe}, + {"TaiXuanJingSymbols", xmlUCSIsTaiXuanJingSymbols}, + {"Tamil", xmlUCSIsTamil}, + {"Telugu", xmlUCSIsTelugu}, + {"Thaana", xmlUCSIsThaana}, + {"Thai", xmlUCSIsThai}, + {"Tibetan", xmlUCSIsTibetan}, + {"Ugaritic", xmlUCSIsUgaritic}, + {"UnifiedCanadianAboriginalSyllabics", xmlUCSIsUnifiedCanadianAboriginalSyllabics}, + {"VariationSelectors", xmlUCSIsVariationSelectors}, + {"VariationSelectorsSupplement", xmlUCSIsVariationSelectorsSupplement}, + {"YiRadicals", xmlUCSIsYiRadicals}, + {"YiSyllables", xmlUCSIsYiSyllables}, + {"YijingHexagramSymbols", xmlUCSIsYijingHexagramSymbols}}; + +static xmlUnicodeRange xmlUnicodeCats[] = { + {"C", xmlUCSIsCatC}, + {"Cc", xmlUCSIsCatCc}, + {"Cf", xmlUCSIsCatCf}, + {"Co", xmlUCSIsCatCo}, + {"Cs", xmlUCSIsCatCs}, + {"L", xmlUCSIsCatL}, + {"Ll", xmlUCSIsCatLl}, + {"Lm", xmlUCSIsCatLm}, + {"Lo", xmlUCSIsCatLo}, + {"Lt", xmlUCSIsCatLt}, + {"Lu", xmlUCSIsCatLu}, + {"M", xmlUCSIsCatM}, + {"Mc", xmlUCSIsCatMc}, + {"Me", xmlUCSIsCatMe}, + {"Mn", xmlUCSIsCatMn}, + {"N", xmlUCSIsCatN}, + {"Nd", xmlUCSIsCatNd}, + {"Nl", xmlUCSIsCatNl}, + {"No", xmlUCSIsCatNo}, + {"P", xmlUCSIsCatP}, + {"Pc", xmlUCSIsCatPc}, + {"Pd", xmlUCSIsCatPd}, + {"Pe", xmlUCSIsCatPe}, + {"Pf", xmlUCSIsCatPf}, + {"Pi", xmlUCSIsCatPi}, + {"Po", xmlUCSIsCatPo}, + {"Ps", xmlUCSIsCatPs}, + {"S", xmlUCSIsCatS}, + {"Sc", xmlUCSIsCatSc}, + {"Sk", xmlUCSIsCatSk}, + {"Sm", xmlUCSIsCatSm}, + {"So", xmlUCSIsCatSo}, + {"Z", xmlUCSIsCatZ}, + {"Zl", xmlUCSIsCatZl}, + {"Zp", xmlUCSIsCatZp}, + {"Zs", xmlUCSIsCatZs}}; + +static const xmlChSRange xmlCS[] = {{0x0, 0x1f}, {0x7f, 0x9f}, + {0xad, 0xad}, {0x600, 0x603}, {0x6dd, 0x6dd}, {0x70f, 0x70f}, + {0x17b4, 0x17b5}, {0x200b, 0x200f}, {0x202a, 0x202e}, {0x2060, 0x2063}, + {0x206a, 0x206f}, {0xd800, 0xd800}, {0xdb7f, 0xdb80}, {0xdbff, 0xdc00}, + {0xdfff, 0xe000}, {0xf8ff, 0xf8ff}, {0xfeff, 0xfeff}, {0xfff9, 0xfffb} }; +static const xmlChLRange xmlCL[] = {{0x1d173, 0x1d17a}, {0xe0001, 0xe0001}, + {0xe0020, 0xe007f}, {0xf0000, 0xf0000}, {0xffffd, 0xffffd}, + {0x100000, 0x100000}, {0x10fffd, 0x10fffd} }; +static xmlChRangeGroup xmlCG = {18,7,xmlCS,xmlCL}; + +static const xmlChSRange xmlCfS[] = {{0xad, 0xad}, {0x600, 0x603}, + {0x6dd, 0x6dd}, {0x70f, 0x70f}, {0x17b4, 0x17b5}, {0x200b, 0x200f}, + {0x202a, 0x202e}, {0x2060, 0x2063}, {0x206a, 0x206f}, {0xfeff, 0xfeff}, + {0xfff9, 0xfffb} }; +static const xmlChLRange xmlCfL[] = {{0x1d173, 0x1d17a}, {0xe0001, 0xe0001}, + {0xe0020, 0xe007f} }; +static xmlChRangeGroup xmlCfG = {11,3,xmlCfS,xmlCfL}; + +static const xmlChSRange xmlLS[] = {{0x41, 0x5a}, {0x61, 0x7a}, + {0xaa, 0xaa}, {0xb5, 0xb5}, {0xba, 0xba}, {0xc0, 0xd6}, {0xd8, 0xf6}, + {0xf8, 0x236}, {0x250, 0x2c1}, {0x2c6, 0x2d1}, {0x2e0, 0x2e4}, + {0x2ee, 0x2ee}, {0x37a, 0x37a}, {0x386, 0x386}, {0x388, 0x38a}, + {0x38c, 0x38c}, {0x38e, 0x3a1}, {0x3a3, 0x3ce}, {0x3d0, 0x3f5}, + {0x3f7, 0x3fb}, {0x400, 0x481}, {0x48a, 0x4ce}, {0x4d0, 0x4f5}, + {0x4f8, 0x4f9}, {0x500, 0x50f}, {0x531, 0x556}, {0x559, 0x559}, + {0x561, 0x587}, {0x5d0, 0x5ea}, {0x5f0, 0x5f2}, {0x621, 0x63a}, + {0x640, 0x64a}, {0x66e, 0x66f}, {0x671, 0x6d3}, {0x6d5, 0x6d5}, + {0x6e5, 0x6e6}, {0x6ee, 0x6ef}, {0x6fa, 0x6fc}, {0x6ff, 0x6ff}, + {0x710, 0x710}, {0x712, 0x72f}, {0x74d, 0x74f}, {0x780, 0x7a5}, + {0x7b1, 0x7b1}, {0x904, 0x939}, {0x93d, 0x93d}, {0x950, 0x950}, + {0x958, 0x961}, {0x985, 0x98c}, {0x98f, 0x990}, {0x993, 0x9a8}, + {0x9aa, 0x9b0}, {0x9b2, 0x9b2}, {0x9b6, 0x9b9}, {0x9bd, 0x9bd}, + {0x9dc, 0x9dd}, {0x9df, 0x9e1}, {0x9f0, 0x9f1}, {0xa05, 0xa0a}, + {0xa0f, 0xa10}, {0xa13, 0xa28}, {0xa2a, 0xa30}, {0xa32, 0xa33}, + {0xa35, 0xa36}, {0xa38, 0xa39}, {0xa59, 0xa5c}, {0xa5e, 0xa5e}, + {0xa72, 0xa74}, {0xa85, 0xa8d}, {0xa8f, 0xa91}, {0xa93, 0xaa8}, + {0xaaa, 0xab0}, {0xab2, 0xab3}, {0xab5, 0xab9}, {0xabd, 0xabd}, + {0xad0, 0xad0}, {0xae0, 0xae1}, {0xb05, 0xb0c}, {0xb0f, 0xb10}, + {0xb13, 0xb28}, {0xb2a, 0xb30}, {0xb32, 0xb33}, {0xb35, 0xb39}, + {0xb3d, 0xb3d}, {0xb5c, 0xb5d}, {0xb5f, 0xb61}, {0xb71, 0xb71}, + {0xb83, 0xb83}, {0xb85, 0xb8a}, {0xb8e, 0xb90}, {0xb92, 0xb95}, + {0xb99, 0xb9a}, {0xb9c, 0xb9c}, {0xb9e, 0xb9f}, {0xba3, 0xba4}, + {0xba8, 0xbaa}, {0xbae, 0xbb5}, {0xbb7, 0xbb9}, {0xc05, 0xc0c}, + {0xc0e, 0xc10}, {0xc12, 0xc28}, {0xc2a, 0xc33}, {0xc35, 0xc39}, + {0xc60, 0xc61}, {0xc85, 0xc8c}, {0xc8e, 0xc90}, {0xc92, 0xca8}, + {0xcaa, 0xcb3}, {0xcb5, 0xcb9}, {0xcbd, 0xcbd}, {0xcde, 0xcde}, + {0xce0, 0xce1}, {0xd05, 0xd0c}, {0xd0e, 0xd10}, {0xd12, 0xd28}, + {0xd2a, 0xd39}, {0xd60, 0xd61}, {0xd85, 0xd96}, {0xd9a, 0xdb1}, + {0xdb3, 0xdbb}, {0xdbd, 0xdbd}, {0xdc0, 0xdc6}, {0xe01, 0xe30}, + {0xe32, 0xe33}, {0xe40, 0xe46}, {0xe81, 0xe82}, {0xe84, 0xe84}, + {0xe87, 0xe88}, {0xe8a, 0xe8a}, {0xe8d, 0xe8d}, {0xe94, 0xe97}, + {0xe99, 0xe9f}, {0xea1, 0xea3}, {0xea5, 0xea5}, {0xea7, 0xea7}, + {0xeaa, 0xeab}, {0xead, 0xeb0}, {0xeb2, 0xeb3}, {0xebd, 0xebd}, + {0xec0, 0xec4}, {0xec6, 0xec6}, {0xedc, 0xedd}, {0xf00, 0xf00}, + {0xf40, 0xf47}, {0xf49, 0xf6a}, {0xf88, 0xf8b}, {0x1000, 0x1021}, + {0x1023, 0x1027}, {0x1029, 0x102a}, {0x1050, 0x1055}, {0x10a0, 0x10c5}, + {0x10d0, 0x10f8}, {0x1100, 0x1159}, {0x115f, 0x11a2}, {0x11a8, 0x11f9}, + {0x1200, 0x1206}, {0x1208, 0x1246}, {0x1248, 0x1248}, {0x124a, 0x124d}, + {0x1250, 0x1256}, {0x1258, 0x1258}, {0x125a, 0x125d}, {0x1260, 0x1286}, + {0x1288, 0x1288}, {0x128a, 0x128d}, {0x1290, 0x12ae}, {0x12b0, 0x12b0}, + {0x12b2, 0x12b5}, {0x12b8, 0x12be}, {0x12c0, 0x12c0}, {0x12c2, 0x12c5}, + {0x12c8, 0x12ce}, {0x12d0, 0x12d6}, {0x12d8, 0x12ee}, {0x12f0, 0x130e}, + {0x1310, 0x1310}, {0x1312, 0x1315}, {0x1318, 0x131e}, {0x1320, 0x1346}, + {0x1348, 0x135a}, {0x13a0, 0x13f4}, {0x1401, 0x166c}, {0x166f, 0x1676}, + {0x1681, 0x169a}, {0x16a0, 0x16ea}, {0x1700, 0x170c}, {0x170e, 0x1711}, + {0x1720, 0x1731}, {0x1740, 0x1751}, {0x1760, 0x176c}, {0x176e, 0x1770}, + {0x1780, 0x17b3}, {0x17d7, 0x17d7}, {0x17dc, 0x17dc}, {0x1820, 0x1877}, + {0x1880, 0x18a8}, {0x1900, 0x191c}, {0x1950, 0x196d}, {0x1970, 0x1974}, + {0x1d00, 0x1d6b}, {0x1e00, 0x1e9b}, {0x1ea0, 0x1ef9}, {0x1f00, 0x1f15}, + {0x1f18, 0x1f1d}, {0x1f20, 0x1f45}, {0x1f48, 0x1f4d}, {0x1f50, 0x1f57}, + {0x1f59, 0x1f59}, {0x1f5b, 0x1f5b}, {0x1f5d, 0x1f5d}, {0x1f5f, 0x1f7d}, + {0x1f80, 0x1fb4}, {0x1fb6, 0x1fbc}, {0x1fbe, 0x1fbe}, {0x1fc2, 0x1fc4}, + {0x1fc6, 0x1fcc}, {0x1fd0, 0x1fd3}, {0x1fd6, 0x1fdb}, {0x1fe0, 0x1fec}, + {0x1ff2, 0x1ff4}, {0x1ff6, 0x1ffc}, {0x2071, 0x2071}, {0x207f, 0x207f}, + {0x2102, 0x2102}, {0x2107, 0x2107}, {0x210a, 0x2113}, {0x2115, 0x2115}, + {0x2119, 0x211d}, {0x2124, 0x2124}, {0x2126, 0x2126}, {0x2128, 0x2128}, + {0x212a, 0x212d}, {0x212f, 0x2131}, {0x2133, 0x2139}, {0x213d, 0x213f}, + {0x2145, 0x2149}, {0x3005, 0x3006}, {0x3031, 0x3035}, {0x303b, 0x303c}, + {0x3041, 0x3096}, {0x309d, 0x309f}, {0x30a1, 0x30fa}, {0x30fc, 0x30ff}, + {0x3105, 0x312c}, {0x3131, 0x318e}, {0x31a0, 0x31b7}, {0x31f0, 0x31ff}, + {0x3400, 0x3400}, {0x4db5, 0x4db5}, {0x4e00, 0x4e00}, {0x9fa5, 0x9fa5}, + {0xa000, 0xa48c}, {0xac00, 0xac00}, {0xd7a3, 0xd7a3}, {0xf900, 0xfa2d}, + {0xfa30, 0xfa6a}, {0xfb00, 0xfb06}, {0xfb13, 0xfb17}, {0xfb1d, 0xfb1d}, + {0xfb1f, 0xfb28}, {0xfb2a, 0xfb36}, {0xfb38, 0xfb3c}, {0xfb3e, 0xfb3e}, + {0xfb40, 0xfb41}, {0xfb43, 0xfb44}, {0xfb46, 0xfbb1}, {0xfbd3, 0xfd3d}, + {0xfd50, 0xfd8f}, {0xfd92, 0xfdc7}, {0xfdf0, 0xfdfb}, {0xfe70, 0xfe74}, + {0xfe76, 0xfefc}, {0xff21, 0xff3a}, {0xff41, 0xff5a}, {0xff66, 0xffbe}, + {0xffc2, 0xffc7}, {0xffca, 0xffcf}, {0xffd2, 0xffd7}, {0xffda, 0xffdc} }; +static const xmlChLRange xmlLL[] = {{0x10000, 0x1000b}, {0x1000d, 0x10026}, + {0x10028, 0x1003a}, {0x1003c, 0x1003d}, {0x1003f, 0x1004d}, + {0x10050, 0x1005d}, {0x10080, 0x100fa}, {0x10300, 0x1031e}, + {0x10330, 0x10349}, {0x10380, 0x1039d}, {0x10400, 0x1049d}, + {0x10800, 0x10805}, {0x10808, 0x10808}, {0x1080a, 0x10835}, + {0x10837, 0x10838}, {0x1083c, 0x1083c}, {0x1083f, 0x1083f}, + {0x1d400, 0x1d454}, {0x1d456, 0x1d49c}, {0x1d49e, 0x1d49f}, + {0x1d4a2, 0x1d4a2}, {0x1d4a5, 0x1d4a6}, {0x1d4a9, 0x1d4ac}, + {0x1d4ae, 0x1d4b9}, {0x1d4bb, 0x1d4bb}, {0x1d4bd, 0x1d4c3}, + {0x1d4c5, 0x1d505}, {0x1d507, 0x1d50a}, {0x1d50d, 0x1d514}, + {0x1d516, 0x1d51c}, {0x1d51e, 0x1d539}, {0x1d53b, 0x1d53e}, + {0x1d540, 0x1d544}, {0x1d546, 0x1d546}, {0x1d54a, 0x1d550}, + {0x1d552, 0x1d6a3}, {0x1d6a8, 0x1d6c0}, {0x1d6c2, 0x1d6da}, + {0x1d6dc, 0x1d6fa}, {0x1d6fc, 0x1d714}, {0x1d716, 0x1d734}, + {0x1d736, 0x1d74e}, {0x1d750, 0x1d76e}, {0x1d770, 0x1d788}, + {0x1d78a, 0x1d7a8}, {0x1d7aa, 0x1d7c2}, {0x1d7c4, 0x1d7c9}, + {0x20000, 0x20000}, {0x2a6d6, 0x2a6d6}, {0x2f800, 0x2fa1d} }; +static xmlChRangeGroup xmlLG = {279,50,xmlLS,xmlLL}; + +static const xmlChSRange xmlLlS[] = {{0x61, 0x7a}, {0xaa, 0xaa}, + {0xb5, 0xb5}, {0xba, 0xba}, {0xdf, 0xf6}, {0xf8, 0xff}, {0x101, 0x101}, + {0x103, 0x103}, {0x105, 0x105}, {0x107, 0x107}, {0x109, 0x109}, + {0x10b, 0x10b}, {0x10d, 0x10d}, {0x10f, 0x10f}, {0x111, 0x111}, + {0x113, 0x113}, {0x115, 0x115}, {0x117, 0x117}, {0x119, 0x119}, + {0x11b, 0x11b}, {0x11d, 0x11d}, {0x11f, 0x11f}, {0x121, 0x121}, + {0x123, 0x123}, {0x125, 0x125}, {0x127, 0x127}, {0x129, 0x129}, + {0x12b, 0x12b}, {0x12d, 0x12d}, {0x12f, 0x12f}, {0x131, 0x131}, + {0x133, 0x133}, {0x135, 0x135}, {0x137, 0x138}, {0x13a, 0x13a}, + {0x13c, 0x13c}, {0x13e, 0x13e}, {0x140, 0x140}, {0x142, 0x142}, + {0x144, 0x144}, {0x146, 0x146}, {0x148, 0x149}, {0x14b, 0x14b}, + {0x14d, 0x14d}, {0x14f, 0x14f}, {0x151, 0x151}, {0x153, 0x153}, + {0x155, 0x155}, {0x157, 0x157}, {0x159, 0x159}, {0x15b, 0x15b}, + {0x15d, 0x15d}, {0x15f, 0x15f}, {0x161, 0x161}, {0x163, 0x163}, + {0x165, 0x165}, {0x167, 0x167}, {0x169, 0x169}, {0x16b, 0x16b}, + {0x16d, 0x16d}, {0x16f, 0x16f}, {0x171, 0x171}, {0x173, 0x173}, + {0x175, 0x175}, {0x177, 0x177}, {0x17a, 0x17a}, {0x17c, 0x17c}, + {0x17e, 0x180}, {0x183, 0x183}, {0x185, 0x185}, {0x188, 0x188}, + {0x18c, 0x18d}, {0x192, 0x192}, {0x195, 0x195}, {0x199, 0x19b}, + {0x19e, 0x19e}, {0x1a1, 0x1a1}, {0x1a3, 0x1a3}, {0x1a5, 0x1a5}, + {0x1a8, 0x1a8}, {0x1aa, 0x1ab}, {0x1ad, 0x1ad}, {0x1b0, 0x1b0}, + {0x1b4, 0x1b4}, {0x1b6, 0x1b6}, {0x1b9, 0x1ba}, {0x1bd, 0x1bf}, + {0x1c6, 0x1c6}, {0x1c9, 0x1c9}, {0x1cc, 0x1cc}, {0x1ce, 0x1ce}, + {0x1d0, 0x1d0}, {0x1d2, 0x1d2}, {0x1d4, 0x1d4}, {0x1d6, 0x1d6}, + {0x1d8, 0x1d8}, {0x1da, 0x1da}, {0x1dc, 0x1dd}, {0x1df, 0x1df}, + {0x1e1, 0x1e1}, {0x1e3, 0x1e3}, {0x1e5, 0x1e5}, {0x1e7, 0x1e7}, + {0x1e9, 0x1e9}, {0x1eb, 0x1eb}, {0x1ed, 0x1ed}, {0x1ef, 0x1f0}, + {0x1f3, 0x1f3}, {0x1f5, 0x1f5}, {0x1f9, 0x1f9}, {0x1fb, 0x1fb}, + {0x1fd, 0x1fd}, {0x1ff, 0x1ff}, {0x201, 0x201}, {0x203, 0x203}, + {0x205, 0x205}, {0x207, 0x207}, {0x209, 0x209}, {0x20b, 0x20b}, + {0x20d, 0x20d}, {0x20f, 0x20f}, {0x211, 0x211}, {0x213, 0x213}, + {0x215, 0x215}, {0x217, 0x217}, {0x219, 0x219}, {0x21b, 0x21b}, + {0x21d, 0x21d}, {0x21f, 0x21f}, {0x221, 0x221}, {0x223, 0x223}, + {0x225, 0x225}, {0x227, 0x227}, {0x229, 0x229}, {0x22b, 0x22b}, + {0x22d, 0x22d}, {0x22f, 0x22f}, {0x231, 0x231}, {0x233, 0x236}, + {0x250, 0x2af}, {0x390, 0x390}, {0x3ac, 0x3ce}, {0x3d0, 0x3d1}, + {0x3d5, 0x3d7}, {0x3d9, 0x3d9}, {0x3db, 0x3db}, {0x3dd, 0x3dd}, + {0x3df, 0x3df}, {0x3e1, 0x3e1}, {0x3e3, 0x3e3}, {0x3e5, 0x3e5}, + {0x3e7, 0x3e7}, {0x3e9, 0x3e9}, {0x3eb, 0x3eb}, {0x3ed, 0x3ed}, + {0x3ef, 0x3f3}, {0x3f5, 0x3f5}, {0x3f8, 0x3f8}, {0x3fb, 0x3fb}, + {0x430, 0x45f}, {0x461, 0x461}, {0x463, 0x463}, {0x465, 0x465}, + {0x467, 0x467}, {0x469, 0x469}, {0x46b, 0x46b}, {0x46d, 0x46d}, + {0x46f, 0x46f}, {0x471, 0x471}, {0x473, 0x473}, {0x475, 0x475}, + {0x477, 0x477}, {0x479, 0x479}, {0x47b, 0x47b}, {0x47d, 0x47d}, + {0x47f, 0x47f}, {0x481, 0x481}, {0x48b, 0x48b}, {0x48d, 0x48d}, + {0x48f, 0x48f}, {0x491, 0x491}, {0x493, 0x493}, {0x495, 0x495}, + {0x497, 0x497}, {0x499, 0x499}, {0x49b, 0x49b}, {0x49d, 0x49d}, + {0x49f, 0x49f}, {0x4a1, 0x4a1}, {0x4a3, 0x4a3}, {0x4a5, 0x4a5}, + {0x4a7, 0x4a7}, {0x4a9, 0x4a9}, {0x4ab, 0x4ab}, {0x4ad, 0x4ad}, + {0x4af, 0x4af}, {0x4b1, 0x4b1}, {0x4b3, 0x4b3}, {0x4b5, 0x4b5}, + {0x4b7, 0x4b7}, {0x4b9, 0x4b9}, {0x4bb, 0x4bb}, {0x4bd, 0x4bd}, + {0x4bf, 0x4bf}, {0x4c2, 0x4c2}, {0x4c4, 0x4c4}, {0x4c6, 0x4c6}, + {0x4c8, 0x4c8}, {0x4ca, 0x4ca}, {0x4cc, 0x4cc}, {0x4ce, 0x4ce}, + {0x4d1, 0x4d1}, {0x4d3, 0x4d3}, {0x4d5, 0x4d5}, {0x4d7, 0x4d7}, + {0x4d9, 0x4d9}, {0x4db, 0x4db}, {0x4dd, 0x4dd}, {0x4df, 0x4df}, + {0x4e1, 0x4e1}, {0x4e3, 0x4e3}, {0x4e5, 0x4e5}, {0x4e7, 0x4e7}, + {0x4e9, 0x4e9}, {0x4eb, 0x4eb}, {0x4ed, 0x4ed}, {0x4ef, 0x4ef}, + {0x4f1, 0x4f1}, {0x4f3, 0x4f3}, {0x4f5, 0x4f5}, {0x4f9, 0x4f9}, + {0x501, 0x501}, {0x503, 0x503}, {0x505, 0x505}, {0x507, 0x507}, + {0x509, 0x509}, {0x50b, 0x50b}, {0x50d, 0x50d}, {0x50f, 0x50f}, + {0x561, 0x587}, {0x1d00, 0x1d2b}, {0x1d62, 0x1d6b}, {0x1e01, 0x1e01}, + {0x1e03, 0x1e03}, {0x1e05, 0x1e05}, {0x1e07, 0x1e07}, {0x1e09, 0x1e09}, + {0x1e0b, 0x1e0b}, {0x1e0d, 0x1e0d}, {0x1e0f, 0x1e0f}, {0x1e11, 0x1e11}, + {0x1e13, 0x1e13}, {0x1e15, 0x1e15}, {0x1e17, 0x1e17}, {0x1e19, 0x1e19}, + {0x1e1b, 0x1e1b}, {0x1e1d, 0x1e1d}, {0x1e1f, 0x1e1f}, {0x1e21, 0x1e21}, + {0x1e23, 0x1e23}, {0x1e25, 0x1e25}, {0x1e27, 0x1e27}, {0x1e29, 0x1e29}, + {0x1e2b, 0x1e2b}, {0x1e2d, 0x1e2d}, {0x1e2f, 0x1e2f}, {0x1e31, 0x1e31}, + {0x1e33, 0x1e33}, {0x1e35, 0x1e35}, {0x1e37, 0x1e37}, {0x1e39, 0x1e39}, + {0x1e3b, 0x1e3b}, {0x1e3d, 0x1e3d}, {0x1e3f, 0x1e3f}, {0x1e41, 0x1e41}, + {0x1e43, 0x1e43}, {0x1e45, 0x1e45}, {0x1e47, 0x1e47}, {0x1e49, 0x1e49}, + {0x1e4b, 0x1e4b}, {0x1e4d, 0x1e4d}, {0x1e4f, 0x1e4f}, {0x1e51, 0x1e51}, + {0x1e53, 0x1e53}, {0x1e55, 0x1e55}, {0x1e57, 0x1e57}, {0x1e59, 0x1e59}, + {0x1e5b, 0x1e5b}, {0x1e5d, 0x1e5d}, {0x1e5f, 0x1e5f}, {0x1e61, 0x1e61}, + {0x1e63, 0x1e63}, {0x1e65, 0x1e65}, {0x1e67, 0x1e67}, {0x1e69, 0x1e69}, + {0x1e6b, 0x1e6b}, {0x1e6d, 0x1e6d}, {0x1e6f, 0x1e6f}, {0x1e71, 0x1e71}, + {0x1e73, 0x1e73}, {0x1e75, 0x1e75}, {0x1e77, 0x1e77}, {0x1e79, 0x1e79}, + {0x1e7b, 0x1e7b}, {0x1e7d, 0x1e7d}, {0x1e7f, 0x1e7f}, {0x1e81, 0x1e81}, + {0x1e83, 0x1e83}, {0x1e85, 0x1e85}, {0x1e87, 0x1e87}, {0x1e89, 0x1e89}, + {0x1e8b, 0x1e8b}, {0x1e8d, 0x1e8d}, {0x1e8f, 0x1e8f}, {0x1e91, 0x1e91}, + {0x1e93, 0x1e93}, {0x1e95, 0x1e9b}, {0x1ea1, 0x1ea1}, {0x1ea3, 0x1ea3}, + {0x1ea5, 0x1ea5}, {0x1ea7, 0x1ea7}, {0x1ea9, 0x1ea9}, {0x1eab, 0x1eab}, + {0x1ead, 0x1ead}, {0x1eaf, 0x1eaf}, {0x1eb1, 0x1eb1}, {0x1eb3, 0x1eb3}, + {0x1eb5, 0x1eb5}, {0x1eb7, 0x1eb7}, {0x1eb9, 0x1eb9}, {0x1ebb, 0x1ebb}, + {0x1ebd, 0x1ebd}, {0x1ebf, 0x1ebf}, {0x1ec1, 0x1ec1}, {0x1ec3, 0x1ec3}, + {0x1ec5, 0x1ec5}, {0x1ec7, 0x1ec7}, {0x1ec9, 0x1ec9}, {0x1ecb, 0x1ecb}, + {0x1ecd, 0x1ecd}, {0x1ecf, 0x1ecf}, {0x1ed1, 0x1ed1}, {0x1ed3, 0x1ed3}, + {0x1ed5, 0x1ed5}, {0x1ed7, 0x1ed7}, {0x1ed9, 0x1ed9}, {0x1edb, 0x1edb}, + {0x1edd, 0x1edd}, {0x1edf, 0x1edf}, {0x1ee1, 0x1ee1}, {0x1ee3, 0x1ee3}, + {0x1ee5, 0x1ee5}, {0x1ee7, 0x1ee7}, {0x1ee9, 0x1ee9}, {0x1eeb, 0x1eeb}, + {0x1eed, 0x1eed}, {0x1eef, 0x1eef}, {0x1ef1, 0x1ef1}, {0x1ef3, 0x1ef3}, + {0x1ef5, 0x1ef5}, {0x1ef7, 0x1ef7}, {0x1ef9, 0x1ef9}, {0x1f00, 0x1f07}, + {0x1f10, 0x1f15}, {0x1f20, 0x1f27}, {0x1f30, 0x1f37}, {0x1f40, 0x1f45}, + {0x1f50, 0x1f57}, {0x1f60, 0x1f67}, {0x1f70, 0x1f7d}, {0x1f80, 0x1f87}, + {0x1f90, 0x1f97}, {0x1fa0, 0x1fa7}, {0x1fb0, 0x1fb4}, {0x1fb6, 0x1fb7}, + {0x1fbe, 0x1fbe}, {0x1fc2, 0x1fc4}, {0x1fc6, 0x1fc7}, {0x1fd0, 0x1fd3}, + {0x1fd6, 0x1fd7}, {0x1fe0, 0x1fe7}, {0x1ff2, 0x1ff4}, {0x1ff6, 0x1ff7}, + {0x2071, 0x2071}, {0x207f, 0x207f}, {0x210a, 0x210a}, {0x210e, 0x210f}, + {0x2113, 0x2113}, {0x212f, 0x212f}, {0x2134, 0x2134}, {0x2139, 0x2139}, + {0x213d, 0x213d}, {0x2146, 0x2149}, {0xfb00, 0xfb06}, {0xfb13, 0xfb17}, + {0xff41, 0xff5a} }; +static const xmlChLRange xmlLlL[] = {{0x10428, 0x1044f}, {0x1d41a, 0x1d433}, + {0x1d44e, 0x1d454}, {0x1d456, 0x1d467}, {0x1d482, 0x1d49b}, + {0x1d4b6, 0x1d4b9}, {0x1d4bb, 0x1d4bb}, {0x1d4bd, 0x1d4c3}, + {0x1d4c5, 0x1d4cf}, {0x1d4ea, 0x1d503}, {0x1d51e, 0x1d537}, + {0x1d552, 0x1d56b}, {0x1d586, 0x1d59f}, {0x1d5ba, 0x1d5d3}, + {0x1d5ee, 0x1d607}, {0x1d622, 0x1d63b}, {0x1d656, 0x1d66f}, + {0x1d68a, 0x1d6a3}, {0x1d6c2, 0x1d6da}, {0x1d6dc, 0x1d6e1}, + {0x1d6fc, 0x1d714}, {0x1d716, 0x1d71b}, {0x1d736, 0x1d74e}, + {0x1d750, 0x1d755}, {0x1d770, 0x1d788}, {0x1d78a, 0x1d78f}, + {0x1d7aa, 0x1d7c2}, {0x1d7c4, 0x1d7c9} }; +static xmlChRangeGroup xmlLlG = {396,28,xmlLlS,xmlLlL}; + +static const xmlChSRange xmlLmS[] = {{0x2b0, 0x2c1}, {0x2c6, 0x2d1}, + {0x2e0, 0x2e4}, {0x2ee, 0x2ee}, {0x37a, 0x37a}, {0x559, 0x559}, + {0x640, 0x640}, {0x6e5, 0x6e6}, {0xe46, 0xe46}, {0xec6, 0xec6}, + {0x17d7, 0x17d7}, {0x1843, 0x1843}, {0x1d2c, 0x1d61}, {0x3005, 0x3005}, + {0x3031, 0x3035}, {0x303b, 0x303b}, {0x309d, 0x309e}, {0x30fc, 0x30fe}, + {0xff70, 0xff70}, {0xff9e, 0xff9f} }; +static xmlChRangeGroup xmlLmG = {20,0,xmlLmS,NULL}; + +static const xmlChSRange xmlLoS[] = {{0x1bb, 0x1bb}, {0x1c0, 0x1c3}, + {0x5d0, 0x5ea}, {0x5f0, 0x5f2}, {0x621, 0x63a}, {0x641, 0x64a}, + {0x66e, 0x66f}, {0x671, 0x6d3}, {0x6d5, 0x6d5}, {0x6ee, 0x6ef}, + {0x6fa, 0x6fc}, {0x6ff, 0x6ff}, {0x710, 0x710}, {0x712, 0x72f}, + {0x74d, 0x74f}, {0x780, 0x7a5}, {0x7b1, 0x7b1}, {0x904, 0x939}, + {0x93d, 0x93d}, {0x950, 0x950}, {0x958, 0x961}, {0x985, 0x98c}, + {0x98f, 0x990}, {0x993, 0x9a8}, {0x9aa, 0x9b0}, {0x9b2, 0x9b2}, + {0x9b6, 0x9b9}, {0x9bd, 0x9bd}, {0x9dc, 0x9dd}, {0x9df, 0x9e1}, + {0x9f0, 0x9f1}, {0xa05, 0xa0a}, {0xa0f, 0xa10}, {0xa13, 0xa28}, + {0xa2a, 0xa30}, {0xa32, 0xa33}, {0xa35, 0xa36}, {0xa38, 0xa39}, + {0xa59, 0xa5c}, {0xa5e, 0xa5e}, {0xa72, 0xa74}, {0xa85, 0xa8d}, + {0xa8f, 0xa91}, {0xa93, 0xaa8}, {0xaaa, 0xab0}, {0xab2, 0xab3}, + {0xab5, 0xab9}, {0xabd, 0xabd}, {0xad0, 0xad0}, {0xae0, 0xae1}, + {0xb05, 0xb0c}, {0xb0f, 0xb10}, {0xb13, 0xb28}, {0xb2a, 0xb30}, + {0xb32, 0xb33}, {0xb35, 0xb39}, {0xb3d, 0xb3d}, {0xb5c, 0xb5d}, + {0xb5f, 0xb61}, {0xb71, 0xb71}, {0xb83, 0xb83}, {0xb85, 0xb8a}, + {0xb8e, 0xb90}, {0xb92, 0xb95}, {0xb99, 0xb9a}, {0xb9c, 0xb9c}, + {0xb9e, 0xb9f}, {0xba3, 0xba4}, {0xba8, 0xbaa}, {0xbae, 0xbb5}, + {0xbb7, 0xbb9}, {0xc05, 0xc0c}, {0xc0e, 0xc10}, {0xc12, 0xc28}, + {0xc2a, 0xc33}, {0xc35, 0xc39}, {0xc60, 0xc61}, {0xc85, 0xc8c}, + {0xc8e, 0xc90}, {0xc92, 0xca8}, {0xcaa, 0xcb3}, {0xcb5, 0xcb9}, + {0xcbd, 0xcbd}, {0xcde, 0xcde}, {0xce0, 0xce1}, {0xd05, 0xd0c}, + {0xd0e, 0xd10}, {0xd12, 0xd28}, {0xd2a, 0xd39}, {0xd60, 0xd61}, + {0xd85, 0xd96}, {0xd9a, 0xdb1}, {0xdb3, 0xdbb}, {0xdbd, 0xdbd}, + {0xdc0, 0xdc6}, {0xe01, 0xe30}, {0xe32, 0xe33}, {0xe40, 0xe45}, + {0xe81, 0xe82}, {0xe84, 0xe84}, {0xe87, 0xe88}, {0xe8a, 0xe8a}, + {0xe8d, 0xe8d}, {0xe94, 0xe97}, {0xe99, 0xe9f}, {0xea1, 0xea3}, + {0xea5, 0xea5}, {0xea7, 0xea7}, {0xeaa, 0xeab}, {0xead, 0xeb0}, + {0xeb2, 0xeb3}, {0xebd, 0xebd}, {0xec0, 0xec4}, {0xedc, 0xedd}, + {0xf00, 0xf00}, {0xf40, 0xf47}, {0xf49, 0xf6a}, {0xf88, 0xf8b}, + {0x1000, 0x1021}, {0x1023, 0x1027}, {0x1029, 0x102a}, {0x1050, 0x1055}, + {0x10d0, 0x10f8}, {0x1100, 0x1159}, {0x115f, 0x11a2}, {0x11a8, 0x11f9}, + {0x1200, 0x1206}, {0x1208, 0x1246}, {0x1248, 0x1248}, {0x124a, 0x124d}, + {0x1250, 0x1256}, {0x1258, 0x1258}, {0x125a, 0x125d}, {0x1260, 0x1286}, + {0x1288, 0x1288}, {0x128a, 0x128d}, {0x1290, 0x12ae}, {0x12b0, 0x12b0}, + {0x12b2, 0x12b5}, {0x12b8, 0x12be}, {0x12c0, 0x12c0}, {0x12c2, 0x12c5}, + {0x12c8, 0x12ce}, {0x12d0, 0x12d6}, {0x12d8, 0x12ee}, {0x12f0, 0x130e}, + {0x1310, 0x1310}, {0x1312, 0x1315}, {0x1318, 0x131e}, {0x1320, 0x1346}, + {0x1348, 0x135a}, {0x13a0, 0x13f4}, {0x1401, 0x166c}, {0x166f, 0x1676}, + {0x1681, 0x169a}, {0x16a0, 0x16ea}, {0x1700, 0x170c}, {0x170e, 0x1711}, + {0x1720, 0x1731}, {0x1740, 0x1751}, {0x1760, 0x176c}, {0x176e, 0x1770}, + {0x1780, 0x17b3}, {0x17dc, 0x17dc}, {0x1820, 0x1842}, {0x1844, 0x1877}, + {0x1880, 0x18a8}, {0x1900, 0x191c}, {0x1950, 0x196d}, {0x1970, 0x1974}, + {0x2135, 0x2138}, {0x3006, 0x3006}, {0x303c, 0x303c}, {0x3041, 0x3096}, + {0x309f, 0x309f}, {0x30a1, 0x30fa}, {0x30ff, 0x30ff}, {0x3105, 0x312c}, + {0x3131, 0x318e}, {0x31a0, 0x31b7}, {0x31f0, 0x31ff}, {0x3400, 0x3400}, + {0x4db5, 0x4db5}, {0x4e00, 0x4e00}, {0x9fa5, 0x9fa5}, {0xa000, 0xa48c}, + {0xac00, 0xac00}, {0xd7a3, 0xd7a3}, {0xf900, 0xfa2d}, {0xfa30, 0xfa6a}, + {0xfb1d, 0xfb1d}, {0xfb1f, 0xfb28}, {0xfb2a, 0xfb36}, {0xfb38, 0xfb3c}, + {0xfb3e, 0xfb3e}, {0xfb40, 0xfb41}, {0xfb43, 0xfb44}, {0xfb46, 0xfbb1}, + {0xfbd3, 0xfd3d}, {0xfd50, 0xfd8f}, {0xfd92, 0xfdc7}, {0xfdf0, 0xfdfb}, + {0xfe70, 0xfe74}, {0xfe76, 0xfefc}, {0xff66, 0xff6f}, {0xff71, 0xff9d}, + {0xffa0, 0xffbe}, {0xffc2, 0xffc7}, {0xffca, 0xffcf}, {0xffd2, 0xffd7}, + {0xffda, 0xffdc} }; +static const xmlChLRange xmlLoL[] = {{0x10000, 0x1000b}, {0x1000d, 0x10026}, + {0x10028, 0x1003a}, {0x1003c, 0x1003d}, {0x1003f, 0x1004d}, + {0x10050, 0x1005d}, {0x10080, 0x100fa}, {0x10300, 0x1031e}, + {0x10330, 0x10349}, {0x10380, 0x1039d}, {0x10450, 0x1049d}, + {0x10800, 0x10805}, {0x10808, 0x10808}, {0x1080a, 0x10835}, + {0x10837, 0x10838}, {0x1083c, 0x1083c}, {0x1083f, 0x1083f}, + {0x20000, 0x20000}, {0x2a6d6, 0x2a6d6}, {0x2f800, 0x2fa1d} }; +static xmlChRangeGroup xmlLoG = {211,20,xmlLoS,xmlLoL}; + +static const xmlChSRange xmlLtS[] = {{0x1c5, 0x1c5}, {0x1c8, 0x1c8}, + {0x1cb, 0x1cb}, {0x1f2, 0x1f2}, {0x1f88, 0x1f8f}, {0x1f98, 0x1f9f}, + {0x1fa8, 0x1faf}, {0x1fbc, 0x1fbc}, {0x1fcc, 0x1fcc}, {0x1ffc, 0x1ffc} }; +static xmlChRangeGroup xmlLtG = {10,0,xmlLtS,NULL}; + +static const xmlChSRange xmlLuS[] = {{0x41, 0x5a}, {0xc0, 0xd6}, + {0xd8, 0xde}, {0x100, 0x100}, {0x102, 0x102}, {0x104, 0x104}, + {0x106, 0x106}, {0x108, 0x108}, {0x10a, 0x10a}, {0x10c, 0x10c}, + {0x10e, 0x10e}, {0x110, 0x110}, {0x112, 0x112}, {0x114, 0x114}, + {0x116, 0x116}, {0x118, 0x118}, {0x11a, 0x11a}, {0x11c, 0x11c}, + {0x11e, 0x11e}, {0x120, 0x120}, {0x122, 0x122}, {0x124, 0x124}, + {0x126, 0x126}, {0x128, 0x128}, {0x12a, 0x12a}, {0x12c, 0x12c}, + {0x12e, 0x12e}, {0x130, 0x130}, {0x132, 0x132}, {0x134, 0x134}, + {0x136, 0x136}, {0x139, 0x139}, {0x13b, 0x13b}, {0x13d, 0x13d}, + {0x13f, 0x13f}, {0x141, 0x141}, {0x143, 0x143}, {0x145, 0x145}, + {0x147, 0x147}, {0x14a, 0x14a}, {0x14c, 0x14c}, {0x14e, 0x14e}, + {0x150, 0x150}, {0x152, 0x152}, {0x154, 0x154}, {0x156, 0x156}, + {0x158, 0x158}, {0x15a, 0x15a}, {0x15c, 0x15c}, {0x15e, 0x15e}, + {0x160, 0x160}, {0x162, 0x162}, {0x164, 0x164}, {0x166, 0x166}, + {0x168, 0x168}, {0x16a, 0x16a}, {0x16c, 0x16c}, {0x16e, 0x16e}, + {0x170, 0x170}, {0x172, 0x172}, {0x174, 0x174}, {0x176, 0x176}, + {0x178, 0x179}, {0x17b, 0x17b}, {0x17d, 0x17d}, {0x181, 0x182}, + {0x184, 0x184}, {0x186, 0x187}, {0x189, 0x18b}, {0x18e, 0x191}, + {0x193, 0x194}, {0x196, 0x198}, {0x19c, 0x19d}, {0x19f, 0x1a0}, + {0x1a2, 0x1a2}, {0x1a4, 0x1a4}, {0x1a6, 0x1a7}, {0x1a9, 0x1a9}, + {0x1ac, 0x1ac}, {0x1ae, 0x1af}, {0x1b1, 0x1b3}, {0x1b5, 0x1b5}, + {0x1b7, 0x1b8}, {0x1bc, 0x1bc}, {0x1c4, 0x1c4}, {0x1c7, 0x1c7}, + {0x1ca, 0x1ca}, {0x1cd, 0x1cd}, {0x1cf, 0x1cf}, {0x1d1, 0x1d1}, + {0x1d3, 0x1d3}, {0x1d5, 0x1d5}, {0x1d7, 0x1d7}, {0x1d9, 0x1d9}, + {0x1db, 0x1db}, {0x1de, 0x1de}, {0x1e0, 0x1e0}, {0x1e2, 0x1e2}, + {0x1e4, 0x1e4}, {0x1e6, 0x1e6}, {0x1e8, 0x1e8}, {0x1ea, 0x1ea}, + {0x1ec, 0x1ec}, {0x1ee, 0x1ee}, {0x1f1, 0x1f1}, {0x1f4, 0x1f4}, + {0x1f6, 0x1f8}, {0x1fa, 0x1fa}, {0x1fc, 0x1fc}, {0x1fe, 0x1fe}, + {0x200, 0x200}, {0x202, 0x202}, {0x204, 0x204}, {0x206, 0x206}, + {0x208, 0x208}, {0x20a, 0x20a}, {0x20c, 0x20c}, {0x20e, 0x20e}, + {0x210, 0x210}, {0x212, 0x212}, {0x214, 0x214}, {0x216, 0x216}, + {0x218, 0x218}, {0x21a, 0x21a}, {0x21c, 0x21c}, {0x21e, 0x21e}, + {0x220, 0x220}, {0x222, 0x222}, {0x224, 0x224}, {0x226, 0x226}, + {0x228, 0x228}, {0x22a, 0x22a}, {0x22c, 0x22c}, {0x22e, 0x22e}, + {0x230, 0x230}, {0x232, 0x232}, {0x386, 0x386}, {0x388, 0x38a}, + {0x38c, 0x38c}, {0x38e, 0x38f}, {0x391, 0x3a1}, {0x3a3, 0x3ab}, + {0x3d2, 0x3d4}, {0x3d8, 0x3d8}, {0x3da, 0x3da}, {0x3dc, 0x3dc}, + {0x3de, 0x3de}, {0x3e0, 0x3e0}, {0x3e2, 0x3e2}, {0x3e4, 0x3e4}, + {0x3e6, 0x3e6}, {0x3e8, 0x3e8}, {0x3ea, 0x3ea}, {0x3ec, 0x3ec}, + {0x3ee, 0x3ee}, {0x3f4, 0x3f4}, {0x3f7, 0x3f7}, {0x3f9, 0x3fa}, + {0x400, 0x42f}, {0x460, 0x460}, {0x462, 0x462}, {0x464, 0x464}, + {0x466, 0x466}, {0x468, 0x468}, {0x46a, 0x46a}, {0x46c, 0x46c}, + {0x46e, 0x46e}, {0x470, 0x470}, {0x472, 0x472}, {0x474, 0x474}, + {0x476, 0x476}, {0x478, 0x478}, {0x47a, 0x47a}, {0x47c, 0x47c}, + {0x47e, 0x47e}, {0x480, 0x480}, {0x48a, 0x48a}, {0x48c, 0x48c}, + {0x48e, 0x48e}, {0x490, 0x490}, {0x492, 0x492}, {0x494, 0x494}, + {0x496, 0x496}, {0x498, 0x498}, {0x49a, 0x49a}, {0x49c, 0x49c}, + {0x49e, 0x49e}, {0x4a0, 0x4a0}, {0x4a2, 0x4a2}, {0x4a4, 0x4a4}, + {0x4a6, 0x4a6}, {0x4a8, 0x4a8}, {0x4aa, 0x4aa}, {0x4ac, 0x4ac}, + {0x4ae, 0x4ae}, {0x4b0, 0x4b0}, {0x4b2, 0x4b2}, {0x4b4, 0x4b4}, + {0x4b6, 0x4b6}, {0x4b8, 0x4b8}, {0x4ba, 0x4ba}, {0x4bc, 0x4bc}, + {0x4be, 0x4be}, {0x4c0, 0x4c1}, {0x4c3, 0x4c3}, {0x4c5, 0x4c5}, + {0x4c7, 0x4c7}, {0x4c9, 0x4c9}, {0x4cb, 0x4cb}, {0x4cd, 0x4cd}, + {0x4d0, 0x4d0}, {0x4d2, 0x4d2}, {0x4d4, 0x4d4}, {0x4d6, 0x4d6}, + {0x4d8, 0x4d8}, {0x4da, 0x4da}, {0x4dc, 0x4dc}, {0x4de, 0x4de}, + {0x4e0, 0x4e0}, {0x4e2, 0x4e2}, {0x4e4, 0x4e4}, {0x4e6, 0x4e6}, + {0x4e8, 0x4e8}, {0x4ea, 0x4ea}, {0x4ec, 0x4ec}, {0x4ee, 0x4ee}, + {0x4f0, 0x4f0}, {0x4f2, 0x4f2}, {0x4f4, 0x4f4}, {0x4f8, 0x4f8}, + {0x500, 0x500}, {0x502, 0x502}, {0x504, 0x504}, {0x506, 0x506}, + {0x508, 0x508}, {0x50a, 0x50a}, {0x50c, 0x50c}, {0x50e, 0x50e}, + {0x531, 0x556}, {0x10a0, 0x10c5}, {0x1e00, 0x1e00}, {0x1e02, 0x1e02}, + {0x1e04, 0x1e04}, {0x1e06, 0x1e06}, {0x1e08, 0x1e08}, {0x1e0a, 0x1e0a}, + {0x1e0c, 0x1e0c}, {0x1e0e, 0x1e0e}, {0x1e10, 0x1e10}, {0x1e12, 0x1e12}, + {0x1e14, 0x1e14}, {0x1e16, 0x1e16}, {0x1e18, 0x1e18}, {0x1e1a, 0x1e1a}, + {0x1e1c, 0x1e1c}, {0x1e1e, 0x1e1e}, {0x1e20, 0x1e20}, {0x1e22, 0x1e22}, + {0x1e24, 0x1e24}, {0x1e26, 0x1e26}, {0x1e28, 0x1e28}, {0x1e2a, 0x1e2a}, + {0x1e2c, 0x1e2c}, {0x1e2e, 0x1e2e}, {0x1e30, 0x1e30}, {0x1e32, 0x1e32}, + {0x1e34, 0x1e34}, {0x1e36, 0x1e36}, {0x1e38, 0x1e38}, {0x1e3a, 0x1e3a}, + {0x1e3c, 0x1e3c}, {0x1e3e, 0x1e3e}, {0x1e40, 0x1e40}, {0x1e42, 0x1e42}, + {0x1e44, 0x1e44}, {0x1e46, 0x1e46}, {0x1e48, 0x1e48}, {0x1e4a, 0x1e4a}, + {0x1e4c, 0x1e4c}, {0x1e4e, 0x1e4e}, {0x1e50, 0x1e50}, {0x1e52, 0x1e52}, + {0x1e54, 0x1e54}, {0x1e56, 0x1e56}, {0x1e58, 0x1e58}, {0x1e5a, 0x1e5a}, + {0x1e5c, 0x1e5c}, {0x1e5e, 0x1e5e}, {0x1e60, 0x1e60}, {0x1e62, 0x1e62}, + {0x1e64, 0x1e64}, {0x1e66, 0x1e66}, {0x1e68, 0x1e68}, {0x1e6a, 0x1e6a}, + {0x1e6c, 0x1e6c}, {0x1e6e, 0x1e6e}, {0x1e70, 0x1e70}, {0x1e72, 0x1e72}, + {0x1e74, 0x1e74}, {0x1e76, 0x1e76}, {0x1e78, 0x1e78}, {0x1e7a, 0x1e7a}, + {0x1e7c, 0x1e7c}, {0x1e7e, 0x1e7e}, {0x1e80, 0x1e80}, {0x1e82, 0x1e82}, + {0x1e84, 0x1e84}, {0x1e86, 0x1e86}, {0x1e88, 0x1e88}, {0x1e8a, 0x1e8a}, + {0x1e8c, 0x1e8c}, {0x1e8e, 0x1e8e}, {0x1e90, 0x1e90}, {0x1e92, 0x1e92}, + {0x1e94, 0x1e94}, {0x1ea0, 0x1ea0}, {0x1ea2, 0x1ea2}, {0x1ea4, 0x1ea4}, + {0x1ea6, 0x1ea6}, {0x1ea8, 0x1ea8}, {0x1eaa, 0x1eaa}, {0x1eac, 0x1eac}, + {0x1eae, 0x1eae}, {0x1eb0, 0x1eb0}, {0x1eb2, 0x1eb2}, {0x1eb4, 0x1eb4}, + {0x1eb6, 0x1eb6}, {0x1eb8, 0x1eb8}, {0x1eba, 0x1eba}, {0x1ebc, 0x1ebc}, + {0x1ebe, 0x1ebe}, {0x1ec0, 0x1ec0}, {0x1ec2, 0x1ec2}, {0x1ec4, 0x1ec4}, + {0x1ec6, 0x1ec6}, {0x1ec8, 0x1ec8}, {0x1eca, 0x1eca}, {0x1ecc, 0x1ecc}, + {0x1ece, 0x1ece}, {0x1ed0, 0x1ed0}, {0x1ed2, 0x1ed2}, {0x1ed4, 0x1ed4}, + {0x1ed6, 0x1ed6}, {0x1ed8, 0x1ed8}, {0x1eda, 0x1eda}, {0x1edc, 0x1edc}, + {0x1ede, 0x1ede}, {0x1ee0, 0x1ee0}, {0x1ee2, 0x1ee2}, {0x1ee4, 0x1ee4}, + {0x1ee6, 0x1ee6}, {0x1ee8, 0x1ee8}, {0x1eea, 0x1eea}, {0x1eec, 0x1eec}, + {0x1eee, 0x1eee}, {0x1ef0, 0x1ef0}, {0x1ef2, 0x1ef2}, {0x1ef4, 0x1ef4}, + {0x1ef6, 0x1ef6}, {0x1ef8, 0x1ef8}, {0x1f08, 0x1f0f}, {0x1f18, 0x1f1d}, + {0x1f28, 0x1f2f}, {0x1f38, 0x1f3f}, {0x1f48, 0x1f4d}, {0x1f59, 0x1f59}, + {0x1f5b, 0x1f5b}, {0x1f5d, 0x1f5d}, {0x1f5f, 0x1f5f}, {0x1f68, 0x1f6f}, + {0x1fb8, 0x1fbb}, {0x1fc8, 0x1fcb}, {0x1fd8, 0x1fdb}, {0x1fe8, 0x1fec}, + {0x1ff8, 0x1ffb}, {0x2102, 0x2102}, {0x2107, 0x2107}, {0x210b, 0x210d}, + {0x2110, 0x2112}, {0x2115, 0x2115}, {0x2119, 0x211d}, {0x2124, 0x2124}, + {0x2126, 0x2126}, {0x2128, 0x2128}, {0x212a, 0x212d}, {0x2130, 0x2131}, + {0x2133, 0x2133}, {0x213e, 0x213f}, {0x2145, 0x2145}, {0xff21, 0xff3a} }; +static const xmlChLRange xmlLuL[] = {{0x10400, 0x10427}, {0x1d400, 0x1d419}, + {0x1d434, 0x1d44d}, {0x1d468, 0x1d481}, {0x1d49c, 0x1d49c}, + {0x1d49e, 0x1d49f}, {0x1d4a2, 0x1d4a2}, {0x1d4a5, 0x1d4a6}, + {0x1d4a9, 0x1d4ac}, {0x1d4ae, 0x1d4b5}, {0x1d4d0, 0x1d4e9}, + {0x1d504, 0x1d505}, {0x1d507, 0x1d50a}, {0x1d50d, 0x1d514}, + {0x1d516, 0x1d51c}, {0x1d538, 0x1d539}, {0x1d53b, 0x1d53e}, + {0x1d540, 0x1d544}, {0x1d546, 0x1d546}, {0x1d54a, 0x1d550}, + {0x1d56c, 0x1d585}, {0x1d5a0, 0x1d5b9}, {0x1d5d4, 0x1d5ed}, + {0x1d608, 0x1d621}, {0x1d63c, 0x1d655}, {0x1d670, 0x1d689}, + {0x1d6a8, 0x1d6c0}, {0x1d6e2, 0x1d6fa}, {0x1d71c, 0x1d734}, + {0x1d756, 0x1d76e}, {0x1d790, 0x1d7a8} }; +static xmlChRangeGroup xmlLuG = {390,31,xmlLuS,xmlLuL}; + +static const xmlChSRange xmlMS[] = {{0x300, 0x357}, {0x35d, 0x36f}, + {0x483, 0x486}, {0x488, 0x489}, {0x591, 0x5a1}, {0x5a3, 0x5b9}, + {0x5bb, 0x5bd}, {0x5bf, 0x5bf}, {0x5c1, 0x5c2}, {0x5c4, 0x5c4}, + {0x610, 0x615}, {0x64b, 0x658}, {0x670, 0x670}, {0x6d6, 0x6dc}, + {0x6de, 0x6e4}, {0x6e7, 0x6e8}, {0x6ea, 0x6ed}, {0x711, 0x711}, + {0x730, 0x74a}, {0x7a6, 0x7b0}, {0x901, 0x903}, {0x93c, 0x93c}, + {0x93e, 0x94d}, {0x951, 0x954}, {0x962, 0x963}, {0x981, 0x983}, + {0x9bc, 0x9bc}, {0x9be, 0x9c4}, {0x9c7, 0x9c8}, {0x9cb, 0x9cd}, + {0x9d7, 0x9d7}, {0x9e2, 0x9e3}, {0xa01, 0xa03}, {0xa3c, 0xa3c}, + {0xa3e, 0xa42}, {0xa47, 0xa48}, {0xa4b, 0xa4d}, {0xa70, 0xa71}, + {0xa81, 0xa83}, {0xabc, 0xabc}, {0xabe, 0xac5}, {0xac7, 0xac9}, + {0xacb, 0xacd}, {0xae2, 0xae3}, {0xb01, 0xb03}, {0xb3c, 0xb3c}, + {0xb3e, 0xb43}, {0xb47, 0xb48}, {0xb4b, 0xb4d}, {0xb56, 0xb57}, + {0xb82, 0xb82}, {0xbbe, 0xbc2}, {0xbc6, 0xbc8}, {0xbca, 0xbcd}, + {0xbd7, 0xbd7}, {0xc01, 0xc03}, {0xc3e, 0xc44}, {0xc46, 0xc48}, + {0xc4a, 0xc4d}, {0xc55, 0xc56}, {0xc82, 0xc83}, {0xcbc, 0xcbc}, + {0xcbe, 0xcc4}, {0xcc6, 0xcc8}, {0xcca, 0xccd}, {0xcd5, 0xcd6}, + {0xd02, 0xd03}, {0xd3e, 0xd43}, {0xd46, 0xd48}, {0xd4a, 0xd4d}, + {0xd57, 0xd57}, {0xd82, 0xd83}, {0xdca, 0xdca}, {0xdcf, 0xdd4}, + {0xdd6, 0xdd6}, {0xdd8, 0xddf}, {0xdf2, 0xdf3}, {0xe31, 0xe31}, + {0xe34, 0xe3a}, {0xe47, 0xe4e}, {0xeb1, 0xeb1}, {0xeb4, 0xeb9}, + {0xebb, 0xebc}, {0xec8, 0xecd}, {0xf18, 0xf19}, {0xf35, 0xf35}, + {0xf37, 0xf37}, {0xf39, 0xf39}, {0xf3e, 0xf3f}, {0xf71, 0xf84}, + {0xf86, 0xf87}, {0xf90, 0xf97}, {0xf99, 0xfbc}, {0xfc6, 0xfc6}, + {0x102c, 0x1032}, {0x1036, 0x1039}, {0x1056, 0x1059}, {0x1712, 0x1714}, + {0x1732, 0x1734}, {0x1752, 0x1753}, {0x1772, 0x1773}, {0x17b6, 0x17d3}, + {0x17dd, 0x17dd}, {0x180b, 0x180d}, {0x18a9, 0x18a9}, {0x1920, 0x192b}, + {0x1930, 0x193b}, {0x20d0, 0x20ea}, {0x302a, 0x302f}, {0x3099, 0x309a}, + {0xfb1e, 0xfb1e}, {0xfe00, 0xfe0f}, {0xfe20, 0xfe23} }; +static const xmlChLRange xmlML[] = {{0x1d165, 0x1d169}, {0x1d16d, 0x1d172}, + {0x1d17b, 0x1d182}, {0x1d185, 0x1d18b}, {0x1d1aa, 0x1d1ad}, + {0xe0100, 0xe01ef} }; +static xmlChRangeGroup xmlMG = {113,6,xmlMS,xmlML}; + +static const xmlChSRange xmlMcS[] = {{0x903, 0x903}, {0x93e, 0x940}, + {0x949, 0x94c}, {0x982, 0x983}, {0x9be, 0x9c0}, {0x9c7, 0x9c8}, + {0x9cb, 0x9cc}, {0x9d7, 0x9d7}, {0xa03, 0xa03}, {0xa3e, 0xa40}, + {0xa83, 0xa83}, {0xabe, 0xac0}, {0xac9, 0xac9}, {0xacb, 0xacc}, + {0xb02, 0xb03}, {0xb3e, 0xb3e}, {0xb40, 0xb40}, {0xb47, 0xb48}, + {0xb4b, 0xb4c}, {0xb57, 0xb57}, {0xbbe, 0xbbf}, {0xbc1, 0xbc2}, + {0xbc6, 0xbc8}, {0xbca, 0xbcc}, {0xbd7, 0xbd7}, {0xc01, 0xc03}, + {0xc41, 0xc44}, {0xc82, 0xc83}, {0xcbe, 0xcbe}, {0xcc0, 0xcc4}, + {0xcc7, 0xcc8}, {0xcca, 0xccb}, {0xcd5, 0xcd6}, {0xd02, 0xd03}, + {0xd3e, 0xd40}, {0xd46, 0xd48}, {0xd4a, 0xd4c}, {0xd57, 0xd57}, + {0xd82, 0xd83}, {0xdcf, 0xdd1}, {0xdd8, 0xddf}, {0xdf2, 0xdf3}, + {0xf3e, 0xf3f}, {0xf7f, 0xf7f}, {0x102c, 0x102c}, {0x1031, 0x1031}, + {0x1038, 0x1038}, {0x1056, 0x1057}, {0x17b6, 0x17b6}, {0x17be, 0x17c5}, + {0x17c7, 0x17c8}, {0x1923, 0x1926}, {0x1929, 0x192b}, {0x1930, 0x1931}, + {0x1933, 0x1938} }; +static const xmlChLRange xmlMcL[] = {{0x1d165, 0x1d166}, {0x1d16d, 0x1d172} }; +static xmlChRangeGroup xmlMcG = {55,2,xmlMcS,xmlMcL}; + +static const xmlChSRange xmlMnS[] = {{0x300, 0x357}, {0x35d, 0x36f}, + {0x483, 0x486}, {0x591, 0x5a1}, {0x5a3, 0x5b9}, {0x5bb, 0x5bd}, + {0x5bf, 0x5bf}, {0x5c1, 0x5c2}, {0x5c4, 0x5c4}, {0x610, 0x615}, + {0x64b, 0x658}, {0x670, 0x670}, {0x6d6, 0x6dc}, {0x6df, 0x6e4}, + {0x6e7, 0x6e8}, {0x6ea, 0x6ed}, {0x711, 0x711}, {0x730, 0x74a}, + {0x7a6, 0x7b0}, {0x901, 0x902}, {0x93c, 0x93c}, {0x941, 0x948}, + {0x94d, 0x94d}, {0x951, 0x954}, {0x962, 0x963}, {0x981, 0x981}, + {0x9bc, 0x9bc}, {0x9c1, 0x9c4}, {0x9cd, 0x9cd}, {0x9e2, 0x9e3}, + {0xa01, 0xa02}, {0xa3c, 0xa3c}, {0xa41, 0xa42}, {0xa47, 0xa48}, + {0xa4b, 0xa4d}, {0xa70, 0xa71}, {0xa81, 0xa82}, {0xabc, 0xabc}, + {0xac1, 0xac5}, {0xac7, 0xac8}, {0xacd, 0xacd}, {0xae2, 0xae3}, + {0xb01, 0xb01}, {0xb3c, 0xb3c}, {0xb3f, 0xb3f}, {0xb41, 0xb43}, + {0xb4d, 0xb4d}, {0xb56, 0xb56}, {0xb82, 0xb82}, {0xbc0, 0xbc0}, + {0xbcd, 0xbcd}, {0xc3e, 0xc40}, {0xc46, 0xc48}, {0xc4a, 0xc4d}, + {0xc55, 0xc56}, {0xcbc, 0xcbc}, {0xcbf, 0xcbf}, {0xcc6, 0xcc6}, + {0xccc, 0xccd}, {0xd41, 0xd43}, {0xd4d, 0xd4d}, {0xdca, 0xdca}, + {0xdd2, 0xdd4}, {0xdd6, 0xdd6}, {0xe31, 0xe31}, {0xe34, 0xe3a}, + {0xe47, 0xe4e}, {0xeb1, 0xeb1}, {0xeb4, 0xeb9}, {0xebb, 0xebc}, + {0xec8, 0xecd}, {0xf18, 0xf19}, {0xf35, 0xf35}, {0xf37, 0xf37}, + {0xf39, 0xf39}, {0xf71, 0xf7e}, {0xf80, 0xf84}, {0xf86, 0xf87}, + {0xf90, 0xf97}, {0xf99, 0xfbc}, {0xfc6, 0xfc6}, {0x102d, 0x1030}, + {0x1032, 0x1032}, {0x1036, 0x1037}, {0x1039, 0x1039}, {0x1058, 0x1059}, + {0x1712, 0x1714}, {0x1732, 0x1734}, {0x1752, 0x1753}, {0x1772, 0x1773}, + {0x17b7, 0x17bd}, {0x17c6, 0x17c6}, {0x17c9, 0x17d3}, {0x17dd, 0x17dd}, + {0x180b, 0x180d}, {0x18a9, 0x18a9}, {0x1920, 0x1922}, {0x1927, 0x1928}, + {0x1932, 0x1932}, {0x1939, 0x193b}, {0x20d0, 0x20dc}, {0x20e1, 0x20e1}, + {0x20e5, 0x20ea}, {0x302a, 0x302f}, {0x3099, 0x309a}, {0xfb1e, 0xfb1e}, + {0xfe00, 0xfe0f}, {0xfe20, 0xfe23} }; +static const xmlChLRange xmlMnL[] = {{0x1d167, 0x1d169}, {0x1d17b, 0x1d182}, + {0x1d185, 0x1d18b}, {0x1d1aa, 0x1d1ad}, {0xe0100, 0xe01ef} }; +static xmlChRangeGroup xmlMnG = {108,5,xmlMnS,xmlMnL}; + +static const xmlChSRange xmlNS[] = {{0x30, 0x39}, {0xb2, 0xb3}, + {0xb9, 0xb9}, {0xbc, 0xbe}, {0x660, 0x669}, {0x6f0, 0x6f9}, + {0x966, 0x96f}, {0x9e6, 0x9ef}, {0x9f4, 0x9f9}, {0xa66, 0xa6f}, + {0xae6, 0xaef}, {0xb66, 0xb6f}, {0xbe7, 0xbf2}, {0xc66, 0xc6f}, + {0xce6, 0xcef}, {0xd66, 0xd6f}, {0xe50, 0xe59}, {0xed0, 0xed9}, + {0xf20, 0xf33}, {0x1040, 0x1049}, {0x1369, 0x137c}, {0x16ee, 0x16f0}, + {0x17e0, 0x17e9}, {0x17f0, 0x17f9}, {0x1810, 0x1819}, {0x1946, 0x194f}, + {0x2070, 0x2070}, {0x2074, 0x2079}, {0x2080, 0x2089}, {0x2153, 0x2183}, + {0x2460, 0x249b}, {0x24ea, 0x24ff}, {0x2776, 0x2793}, {0x3007, 0x3007}, + {0x3021, 0x3029}, {0x3038, 0x303a}, {0x3192, 0x3195}, {0x3220, 0x3229}, + {0x3251, 0x325f}, {0x3280, 0x3289}, {0x32b1, 0x32bf}, {0xff10, 0xff19} }; +static const xmlChLRange xmlNL[] = {{0x10107, 0x10133}, {0x10320, 0x10323}, + {0x1034a, 0x1034a}, {0x104a0, 0x104a9}, {0x1d7ce, 0x1d7ff} }; +static xmlChRangeGroup xmlNG = {42,5,xmlNS,xmlNL}; + +static const xmlChSRange xmlNdS[] = {{0x30, 0x39}, {0x660, 0x669}, + {0x6f0, 0x6f9}, {0x966, 0x96f}, {0x9e6, 0x9ef}, {0xa66, 0xa6f}, + {0xae6, 0xaef}, {0xb66, 0xb6f}, {0xbe7, 0xbef}, {0xc66, 0xc6f}, + {0xce6, 0xcef}, {0xd66, 0xd6f}, {0xe50, 0xe59}, {0xed0, 0xed9}, + {0xf20, 0xf29}, {0x1040, 0x1049}, {0x1369, 0x1371}, {0x17e0, 0x17e9}, + {0x1810, 0x1819}, {0x1946, 0x194f}, {0xff10, 0xff19} }; +static const xmlChLRange xmlNdL[] = {{0x104a0, 0x104a9}, {0x1d7ce, 0x1d7ff} }; +static xmlChRangeGroup xmlNdG = {21,2,xmlNdS,xmlNdL}; + +static const xmlChSRange xmlNoS[] = {{0xb2, 0xb3}, {0xb9, 0xb9}, + {0xbc, 0xbe}, {0x9f4, 0x9f9}, {0xbf0, 0xbf2}, {0xf2a, 0xf33}, + {0x1372, 0x137c}, {0x17f0, 0x17f9}, {0x2070, 0x2070}, {0x2074, 0x2079}, + {0x2080, 0x2089}, {0x2153, 0x215f}, {0x2460, 0x249b}, {0x24ea, 0x24ff}, + {0x2776, 0x2793}, {0x3192, 0x3195}, {0x3220, 0x3229}, {0x3251, 0x325f}, + {0x3280, 0x3289}, {0x32b1, 0x32bf} }; +static const xmlChLRange xmlNoL[] = {{0x10107, 0x10133}, {0x10320, 0x10323} }; +static xmlChRangeGroup xmlNoG = {20,2,xmlNoS,xmlNoL}; + +static const xmlChSRange xmlPS[] = {{0x21, 0x23}, {0x25, 0x2a}, + {0x2c, 0x2f}, {0x3a, 0x3b}, {0x3f, 0x40}, {0x5b, 0x5d}, {0x5f, 0x5f}, + {0x7b, 0x7b}, {0x7d, 0x7d}, {0xa1, 0xa1}, {0xab, 0xab}, {0xb7, 0xb7}, + {0xbb, 0xbb}, {0xbf, 0xbf}, {0x37e, 0x37e}, {0x387, 0x387}, + {0x55a, 0x55f}, {0x589, 0x58a}, {0x5be, 0x5be}, {0x5c0, 0x5c0}, + {0x5c3, 0x5c3}, {0x5f3, 0x5f4}, {0x60c, 0x60d}, {0x61b, 0x61b}, + {0x61f, 0x61f}, {0x66a, 0x66d}, {0x6d4, 0x6d4}, {0x700, 0x70d}, + {0x964, 0x965}, {0x970, 0x970}, {0xdf4, 0xdf4}, {0xe4f, 0xe4f}, + {0xe5a, 0xe5b}, {0xf04, 0xf12}, {0xf3a, 0xf3d}, {0xf85, 0xf85}, + {0x104a, 0x104f}, {0x10fb, 0x10fb}, {0x1361, 0x1368}, {0x166d, 0x166e}, + {0x169b, 0x169c}, {0x16eb, 0x16ed}, {0x1735, 0x1736}, {0x17d4, 0x17d6}, + {0x17d8, 0x17da}, {0x1800, 0x180a}, {0x1944, 0x1945}, {0x2010, 0x2027}, + {0x2030, 0x2043}, {0x2045, 0x2051}, {0x2053, 0x2054}, {0x2057, 0x2057}, + {0x207d, 0x207e}, {0x208d, 0x208e}, {0x2329, 0x232a}, {0x23b4, 0x23b6}, + {0x2768, 0x2775}, {0x27e6, 0x27eb}, {0x2983, 0x2998}, {0x29d8, 0x29db}, + {0x29fc, 0x29fd}, {0x3001, 0x3003}, {0x3008, 0x3011}, {0x3014, 0x301f}, + {0x3030, 0x3030}, {0x303d, 0x303d}, {0x30a0, 0x30a0}, {0x30fb, 0x30fb}, + {0xfd3e, 0xfd3f}, {0xfe30, 0xfe52}, {0xfe54, 0xfe61}, {0xfe63, 0xfe63}, + {0xfe68, 0xfe68}, {0xfe6a, 0xfe6b}, {0xff01, 0xff03}, {0xff05, 0xff0a}, + {0xff0c, 0xff0f}, {0xff1a, 0xff1b}, {0xff1f, 0xff20}, {0xff3b, 0xff3d}, + {0xff3f, 0xff3f}, {0xff5b, 0xff5b}, {0xff5d, 0xff5d}, {0xff5f, 0xff65} }; +static const xmlChLRange xmlPL[] = {{0x10100, 0x10101}, {0x1039f, 0x1039f} }; +static xmlChRangeGroup xmlPG = {84,2,xmlPS,xmlPL}; + +static const xmlChSRange xmlPdS[] = {{0x2d, 0x2d}, {0x58a, 0x58a}, + {0x1806, 0x1806}, {0x2010, 0x2015}, {0x301c, 0x301c}, {0x3030, 0x3030}, + {0x30a0, 0x30a0}, {0xfe31, 0xfe32}, {0xfe58, 0xfe58}, {0xfe63, 0xfe63}, + {0xff0d, 0xff0d} }; +static xmlChRangeGroup xmlPdG = {11,0,xmlPdS,NULL}; + +static const xmlChSRange xmlPeS[] = {{0x29, 0x29}, {0x5d, 0x5d}, + {0x7d, 0x7d}, {0xf3b, 0xf3b}, {0xf3d, 0xf3d}, {0x169c, 0x169c}, + {0x2046, 0x2046}, {0x207e, 0x207e}, {0x208e, 0x208e}, {0x232a, 0x232a}, + {0x23b5, 0x23b5}, {0x2769, 0x2769}, {0x276b, 0x276b}, {0x276d, 0x276d}, + {0x276f, 0x276f}, {0x2771, 0x2771}, {0x2773, 0x2773}, {0x2775, 0x2775}, + {0x27e7, 0x27e7}, {0x27e9, 0x27e9}, {0x27eb, 0x27eb}, {0x2984, 0x2984}, + {0x2986, 0x2986}, {0x2988, 0x2988}, {0x298a, 0x298a}, {0x298c, 0x298c}, + {0x298e, 0x298e}, {0x2990, 0x2990}, {0x2992, 0x2992}, {0x2994, 0x2994}, + {0x2996, 0x2996}, {0x2998, 0x2998}, {0x29d9, 0x29d9}, {0x29db, 0x29db}, + {0x29fd, 0x29fd}, {0x3009, 0x3009}, {0x300b, 0x300b}, {0x300d, 0x300d}, + {0x300f, 0x300f}, {0x3011, 0x3011}, {0x3015, 0x3015}, {0x3017, 0x3017}, + {0x3019, 0x3019}, {0x301b, 0x301b}, {0x301e, 0x301f}, {0xfd3f, 0xfd3f}, + {0xfe36, 0xfe36}, {0xfe38, 0xfe38}, {0xfe3a, 0xfe3a}, {0xfe3c, 0xfe3c}, + {0xfe3e, 0xfe3e}, {0xfe40, 0xfe40}, {0xfe42, 0xfe42}, {0xfe44, 0xfe44}, + {0xfe48, 0xfe48}, {0xfe5a, 0xfe5a}, {0xfe5c, 0xfe5c}, {0xfe5e, 0xfe5e}, + {0xff09, 0xff09}, {0xff3d, 0xff3d}, {0xff5d, 0xff5d}, {0xff60, 0xff60}, + {0xff63, 0xff63} }; +static xmlChRangeGroup xmlPeG = {63,0,xmlPeS,NULL}; + +static const xmlChSRange xmlPoS[] = {{0x21, 0x23}, {0x25, 0x27}, + {0x2a, 0x2a}, {0x2c, 0x2c}, {0x2e, 0x2f}, {0x3a, 0x3b}, {0x3f, 0x40}, + {0x5c, 0x5c}, {0xa1, 0xa1}, {0xb7, 0xb7}, {0xbf, 0xbf}, {0x37e, 0x37e}, + {0x387, 0x387}, {0x55a, 0x55f}, {0x589, 0x589}, {0x5be, 0x5be}, + {0x5c0, 0x5c0}, {0x5c3, 0x5c3}, {0x5f3, 0x5f4}, {0x60c, 0x60d}, + {0x61b, 0x61b}, {0x61f, 0x61f}, {0x66a, 0x66d}, {0x6d4, 0x6d4}, + {0x700, 0x70d}, {0x964, 0x965}, {0x970, 0x970}, {0xdf4, 0xdf4}, + {0xe4f, 0xe4f}, {0xe5a, 0xe5b}, {0xf04, 0xf12}, {0xf85, 0xf85}, + {0x104a, 0x104f}, {0x10fb, 0x10fb}, {0x1361, 0x1368}, {0x166d, 0x166e}, + {0x16eb, 0x16ed}, {0x1735, 0x1736}, {0x17d4, 0x17d6}, {0x17d8, 0x17da}, + {0x1800, 0x1805}, {0x1807, 0x180a}, {0x1944, 0x1945}, {0x2016, 0x2017}, + {0x2020, 0x2027}, {0x2030, 0x2038}, {0x203b, 0x203e}, {0x2041, 0x2043}, + {0x2047, 0x2051}, {0x2053, 0x2053}, {0x2057, 0x2057}, {0x23b6, 0x23b6}, + {0x3001, 0x3003}, {0x303d, 0x303d}, {0xfe30, 0xfe30}, {0xfe45, 0xfe46}, + {0xfe49, 0xfe4c}, {0xfe50, 0xfe52}, {0xfe54, 0xfe57}, {0xfe5f, 0xfe61}, + {0xfe68, 0xfe68}, {0xfe6a, 0xfe6b}, {0xff01, 0xff03}, {0xff05, 0xff07}, + {0xff0a, 0xff0a}, {0xff0c, 0xff0c}, {0xff0e, 0xff0f}, {0xff1a, 0xff1b}, + {0xff1f, 0xff20}, {0xff3c, 0xff3c}, {0xff61, 0xff61}, {0xff64, 0xff64} }; +static const xmlChLRange xmlPoL[] = {{0x10100, 0x10101}, {0x1039f, 0x1039f} }; +static xmlChRangeGroup xmlPoG = {72,2,xmlPoS,xmlPoL}; + +static const xmlChSRange xmlPsS[] = {{0x28, 0x28}, {0x5b, 0x5b}, + {0x7b, 0x7b}, {0xf3a, 0xf3a}, {0xf3c, 0xf3c}, {0x169b, 0x169b}, + {0x201a, 0x201a}, {0x201e, 0x201e}, {0x2045, 0x2045}, {0x207d, 0x207d}, + {0x208d, 0x208d}, {0x2329, 0x2329}, {0x23b4, 0x23b4}, {0x2768, 0x2768}, + {0x276a, 0x276a}, {0x276c, 0x276c}, {0x276e, 0x276e}, {0x2770, 0x2770}, + {0x2772, 0x2772}, {0x2774, 0x2774}, {0x27e6, 0x27e6}, {0x27e8, 0x27e8}, + {0x27ea, 0x27ea}, {0x2983, 0x2983}, {0x2985, 0x2985}, {0x2987, 0x2987}, + {0x2989, 0x2989}, {0x298b, 0x298b}, {0x298d, 0x298d}, {0x298f, 0x298f}, + {0x2991, 0x2991}, {0x2993, 0x2993}, {0x2995, 0x2995}, {0x2997, 0x2997}, + {0x29d8, 0x29d8}, {0x29da, 0x29da}, {0x29fc, 0x29fc}, {0x3008, 0x3008}, + {0x300a, 0x300a}, {0x300c, 0x300c}, {0x300e, 0x300e}, {0x3010, 0x3010}, + {0x3014, 0x3014}, {0x3016, 0x3016}, {0x3018, 0x3018}, {0x301a, 0x301a}, + {0x301d, 0x301d}, {0xfd3e, 0xfd3e}, {0xfe35, 0xfe35}, {0xfe37, 0xfe37}, + {0xfe39, 0xfe39}, {0xfe3b, 0xfe3b}, {0xfe3d, 0xfe3d}, {0xfe3f, 0xfe3f}, + {0xfe41, 0xfe41}, {0xfe43, 0xfe43}, {0xfe47, 0xfe47}, {0xfe59, 0xfe59}, + {0xfe5b, 0xfe5b}, {0xfe5d, 0xfe5d}, {0xff08, 0xff08}, {0xff3b, 0xff3b}, + {0xff5b, 0xff5b}, {0xff5f, 0xff5f}, {0xff62, 0xff62} }; +static xmlChRangeGroup xmlPsG = {65,0,xmlPsS,NULL}; + +static const xmlChSRange xmlSS[] = {{0x24, 0x24}, {0x2b, 0x2b}, + {0x3c, 0x3e}, {0x5e, 0x5e}, {0x60, 0x60}, {0x7c, 0x7c}, {0x7e, 0x7e}, + {0xa2, 0xa9}, {0xac, 0xac}, {0xae, 0xb1}, {0xb4, 0xb4}, {0xb6, 0xb6}, + {0xb8, 0xb8}, {0xd7, 0xd7}, {0xf7, 0xf7}, {0x2c2, 0x2c5}, + {0x2d2, 0x2df}, {0x2e5, 0x2ed}, {0x2ef, 0x2ff}, {0x374, 0x375}, + {0x384, 0x385}, {0x3f6, 0x3f6}, {0x482, 0x482}, {0x60e, 0x60f}, + {0x6e9, 0x6e9}, {0x6fd, 0x6fe}, {0x9f2, 0x9f3}, {0x9fa, 0x9fa}, + {0xaf1, 0xaf1}, {0xb70, 0xb70}, {0xbf3, 0xbfa}, {0xe3f, 0xe3f}, + {0xf01, 0xf03}, {0xf13, 0xf17}, {0xf1a, 0xf1f}, {0xf34, 0xf34}, + {0xf36, 0xf36}, {0xf38, 0xf38}, {0xfbe, 0xfc5}, {0xfc7, 0xfcc}, + {0xfcf, 0xfcf}, {0x17db, 0x17db}, {0x1940, 0x1940}, {0x19e0, 0x19ff}, + {0x1fbd, 0x1fbd}, {0x1fbf, 0x1fc1}, {0x1fcd, 0x1fcf}, {0x1fdd, 0x1fdf}, + {0x1fed, 0x1fef}, {0x1ffd, 0x1ffe}, {0x2044, 0x2044}, {0x2052, 0x2052}, + {0x207a, 0x207c}, {0x208a, 0x208c}, {0x20a0, 0x20b1}, {0x2100, 0x2101}, + {0x2103, 0x2106}, {0x2108, 0x2109}, {0x2114, 0x2114}, {0x2116, 0x2118}, + {0x211e, 0x2123}, {0x2125, 0x2125}, {0x2127, 0x2127}, {0x2129, 0x2129}, + {0x212e, 0x212e}, {0x2132, 0x2132}, {0x213a, 0x213b}, {0x2140, 0x2144}, + {0x214a, 0x214b}, {0x2190, 0x2328}, {0x232b, 0x23b3}, {0x23b7, 0x23d0}, + {0x2400, 0x2426}, {0x2440, 0x244a}, {0x249c, 0x24e9}, {0x2500, 0x2617}, + {0x2619, 0x267d}, {0x2680, 0x2691}, {0x26a0, 0x26a1}, {0x2701, 0x2704}, + {0x2706, 0x2709}, {0x270c, 0x2727}, {0x2729, 0x274b}, {0x274d, 0x274d}, + {0x274f, 0x2752}, {0x2756, 0x2756}, {0x2758, 0x275e}, {0x2761, 0x2767}, + {0x2794, 0x2794}, {0x2798, 0x27af}, {0x27b1, 0x27be}, {0x27d0, 0x27e5}, + {0x27f0, 0x2982}, {0x2999, 0x29d7}, {0x29dc, 0x29fb}, {0x29fe, 0x2b0d}, + {0x2e80, 0x2e99}, {0x2e9b, 0x2ef3}, {0x2f00, 0x2fd5}, {0x2ff0, 0x2ffb}, + {0x3004, 0x3004}, {0x3012, 0x3013}, {0x3020, 0x3020}, {0x3036, 0x3037}, + {0x303e, 0x303f}, {0x309b, 0x309c}, {0x3190, 0x3191}, {0x3196, 0x319f}, + {0x3200, 0x321e}, {0x322a, 0x3243}, {0x3250, 0x3250}, {0x3260, 0x327d}, + {0x327f, 0x327f}, {0x328a, 0x32b0}, {0x32c0, 0x32fe}, {0x3300, 0x33ff}, + {0x4dc0, 0x4dff}, {0xa490, 0xa4c6}, {0xfb29, 0xfb29}, {0xfdfc, 0xfdfd}, + {0xfe62, 0xfe62}, {0xfe64, 0xfe66}, {0xfe69, 0xfe69}, {0xff04, 0xff04}, + {0xff0b, 0xff0b}, {0xff1c, 0xff1e}, {0xff3e, 0xff3e}, {0xff40, 0xff40}, + {0xff5c, 0xff5c}, {0xff5e, 0xff5e}, {0xffe0, 0xffe6}, {0xffe8, 0xffee}, + {0xfffc, 0xfffd} }; +static const xmlChLRange xmlSL[] = {{0x10102, 0x10102}, {0x10137, 0x1013f}, + {0x1d000, 0x1d0f5}, {0x1d100, 0x1d126}, {0x1d12a, 0x1d164}, + {0x1d16a, 0x1d16c}, {0x1d183, 0x1d184}, {0x1d18c, 0x1d1a9}, + {0x1d1ae, 0x1d1dd}, {0x1d300, 0x1d356}, {0x1d6c1, 0x1d6c1}, + {0x1d6db, 0x1d6db}, {0x1d6fb, 0x1d6fb}, {0x1d715, 0x1d715}, + {0x1d735, 0x1d735}, {0x1d74f, 0x1d74f}, {0x1d76f, 0x1d76f}, + {0x1d789, 0x1d789}, {0x1d7a9, 0x1d7a9}, {0x1d7c3, 0x1d7c3} }; +static xmlChRangeGroup xmlSG = {133,20,xmlSS,xmlSL}; + +static const xmlChSRange xmlScS[] = {{0x24, 0x24}, {0xa2, 0xa5}, + {0x9f2, 0x9f3}, {0xaf1, 0xaf1}, {0xbf9, 0xbf9}, {0xe3f, 0xe3f}, + {0x17db, 0x17db}, {0x20a0, 0x20b1}, {0xfdfc, 0xfdfc}, {0xfe69, 0xfe69}, + {0xff04, 0xff04}, {0xffe0, 0xffe1}, {0xffe5, 0xffe6} }; +static xmlChRangeGroup xmlScG = {13,0,xmlScS,NULL}; + +static const xmlChSRange xmlSkS[] = {{0x5e, 0x5e}, {0x60, 0x60}, + {0xa8, 0xa8}, {0xaf, 0xaf}, {0xb4, 0xb4}, {0xb8, 0xb8}, {0x2c2, 0x2c5}, + {0x2d2, 0x2df}, {0x2e5, 0x2ed}, {0x2ef, 0x2ff}, {0x374, 0x375}, + {0x384, 0x385}, {0x1fbd, 0x1fbd}, {0x1fbf, 0x1fc1}, {0x1fcd, 0x1fcf}, + {0x1fdd, 0x1fdf}, {0x1fed, 0x1fef}, {0x1ffd, 0x1ffe}, {0x309b, 0x309c}, + {0xff3e, 0xff3e}, {0xff40, 0xff40}, {0xffe3, 0xffe3} }; +static xmlChRangeGroup xmlSkG = {22,0,xmlSkS,NULL}; + +static const xmlChSRange xmlSmS[] = {{0x2b, 0x2b}, {0x3c, 0x3e}, + {0x7c, 0x7c}, {0x7e, 0x7e}, {0xac, 0xac}, {0xb1, 0xb1}, {0xd7, 0xd7}, + {0xf7, 0xf7}, {0x3f6, 0x3f6}, {0x2044, 0x2044}, {0x2052, 0x2052}, + {0x207a, 0x207c}, {0x208a, 0x208c}, {0x2140, 0x2144}, {0x214b, 0x214b}, + {0x2190, 0x2194}, {0x219a, 0x219b}, {0x21a0, 0x21a0}, {0x21a3, 0x21a3}, + {0x21a6, 0x21a6}, {0x21ae, 0x21ae}, {0x21ce, 0x21cf}, {0x21d2, 0x21d2}, + {0x21d4, 0x21d4}, {0x21f4, 0x22ff}, {0x2308, 0x230b}, {0x2320, 0x2321}, + {0x237c, 0x237c}, {0x239b, 0x23b3}, {0x25b7, 0x25b7}, {0x25c1, 0x25c1}, + {0x25f8, 0x25ff}, {0x266f, 0x266f}, {0x27d0, 0x27e5}, {0x27f0, 0x27ff}, + {0x2900, 0x2982}, {0x2999, 0x29d7}, {0x29dc, 0x29fb}, {0x29fe, 0x2aff}, + {0xfb29, 0xfb29}, {0xfe62, 0xfe62}, {0xfe64, 0xfe66}, {0xff0b, 0xff0b}, + {0xff1c, 0xff1e}, {0xff5c, 0xff5c}, {0xff5e, 0xff5e}, {0xffe2, 0xffe2}, + {0xffe9, 0xffec} }; +static const xmlChLRange xmlSmL[] = {{0x1d6c1, 0x1d6c1}, {0x1d6db, 0x1d6db}, + {0x1d6fb, 0x1d6fb}, {0x1d715, 0x1d715}, {0x1d735, 0x1d735}, + {0x1d74f, 0x1d74f}, {0x1d76f, 0x1d76f}, {0x1d789, 0x1d789}, + {0x1d7a9, 0x1d7a9}, {0x1d7c3, 0x1d7c3} }; +static xmlChRangeGroup xmlSmG = {48,10,xmlSmS,xmlSmL}; + +static const xmlChSRange xmlSoS[] = {{0xa6, 0xa7}, {0xa9, 0xa9}, + {0xae, 0xae}, {0xb0, 0xb0}, {0xb6, 0xb6}, {0x482, 0x482}, + {0x60e, 0x60f}, {0x6e9, 0x6e9}, {0x6fd, 0x6fe}, {0x9fa, 0x9fa}, + {0xb70, 0xb70}, {0xbf3, 0xbf8}, {0xbfa, 0xbfa}, {0xf01, 0xf03}, + {0xf13, 0xf17}, {0xf1a, 0xf1f}, {0xf34, 0xf34}, {0xf36, 0xf36}, + {0xf38, 0xf38}, {0xfbe, 0xfc5}, {0xfc7, 0xfcc}, {0xfcf, 0xfcf}, + {0x1940, 0x1940}, {0x19e0, 0x19ff}, {0x2100, 0x2101}, {0x2103, 0x2106}, + {0x2108, 0x2109}, {0x2114, 0x2114}, {0x2116, 0x2118}, {0x211e, 0x2123}, + {0x2125, 0x2125}, {0x2127, 0x2127}, {0x2129, 0x2129}, {0x212e, 0x212e}, + {0x2132, 0x2132}, {0x213a, 0x213b}, {0x214a, 0x214a}, {0x2195, 0x2199}, + {0x219c, 0x219f}, {0x21a1, 0x21a2}, {0x21a4, 0x21a5}, {0x21a7, 0x21ad}, + {0x21af, 0x21cd}, {0x21d0, 0x21d1}, {0x21d3, 0x21d3}, {0x21d5, 0x21f3}, + {0x2300, 0x2307}, {0x230c, 0x231f}, {0x2322, 0x2328}, {0x232b, 0x237b}, + {0x237d, 0x239a}, {0x23b7, 0x23d0}, {0x2400, 0x2426}, {0x2440, 0x244a}, + {0x249c, 0x24e9}, {0x2500, 0x25b6}, {0x25b8, 0x25c0}, {0x25c2, 0x25f7}, + {0x2600, 0x2617}, {0x2619, 0x266e}, {0x2670, 0x267d}, {0x2680, 0x2691}, + {0x26a0, 0x26a1}, {0x2701, 0x2704}, {0x2706, 0x2709}, {0x270c, 0x2727}, + {0x2729, 0x274b}, {0x274d, 0x274d}, {0x274f, 0x2752}, {0x2756, 0x2756}, + {0x2758, 0x275e}, {0x2761, 0x2767}, {0x2794, 0x2794}, {0x2798, 0x27af}, + {0x27b1, 0x27be}, {0x2800, 0x28ff}, {0x2b00, 0x2b0d}, {0x2e80, 0x2e99}, + {0x2e9b, 0x2ef3}, {0x2f00, 0x2fd5}, {0x2ff0, 0x2ffb}, {0x3004, 0x3004}, + {0x3012, 0x3013}, {0x3020, 0x3020}, {0x3036, 0x3037}, {0x303e, 0x303f}, + {0x3190, 0x3191}, {0x3196, 0x319f}, {0x3200, 0x321e}, {0x322a, 0x3243}, + {0x3250, 0x3250}, {0x3260, 0x327d}, {0x327f, 0x327f}, {0x328a, 0x32b0}, + {0x32c0, 0x32fe}, {0x3300, 0x33ff}, {0x4dc0, 0x4dff}, {0xa490, 0xa4c6}, + {0xfdfd, 0xfdfd}, {0xffe4, 0xffe4}, {0xffe8, 0xffe8}, {0xffed, 0xffee}, + {0xfffc, 0xfffd} }; +static const xmlChLRange xmlSoL[] = {{0x10102, 0x10102}, {0x10137, 0x1013f}, + {0x1d000, 0x1d0f5}, {0x1d100, 0x1d126}, {0x1d12a, 0x1d164}, + {0x1d16a, 0x1d16c}, {0x1d183, 0x1d184}, {0x1d18c, 0x1d1a9}, + {0x1d1ae, 0x1d1dd}, {0x1d300, 0x1d356} }; +static xmlChRangeGroup xmlSoG = {103,10,xmlSoS,xmlSoL}; + +static const xmlChSRange xmlZS[] = {{0x20, 0x20}, {0xa0, 0xa0}, + {0x1680, 0x1680}, {0x180e, 0x180e}, {0x2000, 0x200a}, {0x2028, 0x2029}, + {0x202f, 0x202f}, {0x205f, 0x205f}, {0x3000, 0x3000} }; +static xmlChRangeGroup xmlZG = {9,0,xmlZS,NULL}; + +static xmlUnicodeNameTable xmlUnicodeBlockTbl = {xmlUnicodeBlocks, 128}; +static xmlUnicodeNameTable xmlUnicodeCatTbl = {xmlUnicodeCats, 36}; + +/** + * xmlUnicodeLookup: + * @tptr: pointer to the name table + * @name: name to be found + * + * binary table lookup for user-supplied name + * + * Returns pointer to range function if found, otherwise NULL + */ +static xmlIntFunc +*xmlUnicodeLookup(xmlUnicodeNameTable *tptr, const char *tname) { + int low, high, mid, cmp; + xmlUnicodeRange *sptr; + + if ((tptr == NULL) || (tname == NULL)) return(NULL); + + low = 0; + high = tptr->numentries - 1; + sptr = tptr->table; + while (low <= high) { + mid = (low + high) / 2; + if ((cmp=strcmp(tname, sptr[mid].rangename)) == 0) + return (sptr[mid].func); + if (cmp < 0) + high = mid - 1; + else + low = mid + 1; + } + return (NULL); +} + +/** + * xmlUCSIsAegeanNumbers: + * @code: UCS code point + * + * Check whether the character is part of AegeanNumbers UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsAegeanNumbers(int code) { + return(((code >= 0x10100) && (code <= 0x1013F))); +} + +/** + * xmlUCSIsAlphabeticPresentationForms: + * @code: UCS code point + * + * Check whether the character is part of AlphabeticPresentationForms UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsAlphabeticPresentationForms(int code) { + return(((code >= 0xFB00) && (code <= 0xFB4F))); +} + +/** + * xmlUCSIsArabic: + * @code: UCS code point + * + * Check whether the character is part of Arabic UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsArabic(int code) { + return(((code >= 0x0600) && (code <= 0x06FF))); +} + +/** + * xmlUCSIsArabicPresentationFormsA: + * @code: UCS code point + * + * Check whether the character is part of ArabicPresentationForms-A UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsArabicPresentationFormsA(int code) { + return(((code >= 0xFB50) && (code <= 0xFDFF))); +} + +/** + * xmlUCSIsArabicPresentationFormsB: + * @code: UCS code point + * + * Check whether the character is part of ArabicPresentationForms-B UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsArabicPresentationFormsB(int code) { + return(((code >= 0xFE70) && (code <= 0xFEFF))); +} + +/** + * xmlUCSIsArmenian: + * @code: UCS code point + * + * Check whether the character is part of Armenian UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsArmenian(int code) { + return(((code >= 0x0530) && (code <= 0x058F))); +} + +/** + * xmlUCSIsArrows: + * @code: UCS code point + * + * Check whether the character is part of Arrows UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsArrows(int code) { + return(((code >= 0x2190) && (code <= 0x21FF))); +} + +/** + * xmlUCSIsBasicLatin: + * @code: UCS code point + * + * Check whether the character is part of BasicLatin UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsBasicLatin(int code) { + return(((code >= 0x0000) && (code <= 0x007F))); +} + +/** + * xmlUCSIsBengali: + * @code: UCS code point + * + * Check whether the character is part of Bengali UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsBengali(int code) { + return(((code >= 0x0980) && (code <= 0x09FF))); +} + +/** + * xmlUCSIsBlockElements: + * @code: UCS code point + * + * Check whether the character is part of BlockElements UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsBlockElements(int code) { + return(((code >= 0x2580) && (code <= 0x259F))); +} + +/** + * xmlUCSIsBopomofo: + * @code: UCS code point + * + * Check whether the character is part of Bopomofo UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsBopomofo(int code) { + return(((code >= 0x3100) && (code <= 0x312F))); +} + +/** + * xmlUCSIsBopomofoExtended: + * @code: UCS code point + * + * Check whether the character is part of BopomofoExtended UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsBopomofoExtended(int code) { + return(((code >= 0x31A0) && (code <= 0x31BF))); +} + +/** + * xmlUCSIsBoxDrawing: + * @code: UCS code point + * + * Check whether the character is part of BoxDrawing UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsBoxDrawing(int code) { + return(((code >= 0x2500) && (code <= 0x257F))); +} + +/** + * xmlUCSIsBraillePatterns: + * @code: UCS code point + * + * Check whether the character is part of BraillePatterns UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsBraillePatterns(int code) { + return(((code >= 0x2800) && (code <= 0x28FF))); +} + +/** + * xmlUCSIsBuhid: + * @code: UCS code point + * + * Check whether the character is part of Buhid UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsBuhid(int code) { + return(((code >= 0x1740) && (code <= 0x175F))); +} + +/** + * xmlUCSIsByzantineMusicalSymbols: + * @code: UCS code point + * + * Check whether the character is part of ByzantineMusicalSymbols UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsByzantineMusicalSymbols(int code) { + return(((code >= 0x1D000) && (code <= 0x1D0FF))); +} + +/** + * xmlUCSIsCJKCompatibility: + * @code: UCS code point + * + * Check whether the character is part of CJKCompatibility UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCJKCompatibility(int code) { + return(((code >= 0x3300) && (code <= 0x33FF))); +} + +/** + * xmlUCSIsCJKCompatibilityForms: + * @code: UCS code point + * + * Check whether the character is part of CJKCompatibilityForms UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCJKCompatibilityForms(int code) { + return(((code >= 0xFE30) && (code <= 0xFE4F))); +} + +/** + * xmlUCSIsCJKCompatibilityIdeographs: + * @code: UCS code point + * + * Check whether the character is part of CJKCompatibilityIdeographs UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCJKCompatibilityIdeographs(int code) { + return(((code >= 0xF900) && (code <= 0xFAFF))); +} + +/** + * xmlUCSIsCJKCompatibilityIdeographsSupplement: + * @code: UCS code point + * + * Check whether the character is part of CJKCompatibilityIdeographsSupplement UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCJKCompatibilityIdeographsSupplement(int code) { + return(((code >= 0x2F800) && (code <= 0x2FA1F))); +} + +/** + * xmlUCSIsCJKRadicalsSupplement: + * @code: UCS code point + * + * Check whether the character is part of CJKRadicalsSupplement UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCJKRadicalsSupplement(int code) { + return(((code >= 0x2E80) && (code <= 0x2EFF))); +} + +/** + * xmlUCSIsCJKSymbolsandPunctuation: + * @code: UCS code point + * + * Check whether the character is part of CJKSymbolsandPunctuation UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCJKSymbolsandPunctuation(int code) { + return(((code >= 0x3000) && (code <= 0x303F))); +} + +/** + * xmlUCSIsCJKUnifiedIdeographs: + * @code: UCS code point + * + * Check whether the character is part of CJKUnifiedIdeographs UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCJKUnifiedIdeographs(int code) { + return(((code >= 0x4E00) && (code <= 0x9FFF))); +} + +/** + * xmlUCSIsCJKUnifiedIdeographsExtensionA: + * @code: UCS code point + * + * Check whether the character is part of CJKUnifiedIdeographsExtensionA UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCJKUnifiedIdeographsExtensionA(int code) { + return(((code >= 0x3400) && (code <= 0x4DBF))); +} + +/** + * xmlUCSIsCJKUnifiedIdeographsExtensionB: + * @code: UCS code point + * + * Check whether the character is part of CJKUnifiedIdeographsExtensionB UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCJKUnifiedIdeographsExtensionB(int code) { + return(((code >= 0x20000) && (code <= 0x2A6DF))); +} + +/** + * xmlUCSIsCherokee: + * @code: UCS code point + * + * Check whether the character is part of Cherokee UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCherokee(int code) { + return(((code >= 0x13A0) && (code <= 0x13FF))); +} + +/** + * xmlUCSIsCombiningDiacriticalMarks: + * @code: UCS code point + * + * Check whether the character is part of CombiningDiacriticalMarks UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCombiningDiacriticalMarks(int code) { + return(((code >= 0x0300) && (code <= 0x036F))); +} + +/** + * xmlUCSIsCombiningDiacriticalMarksforSymbols: + * @code: UCS code point + * + * Check whether the character is part of CombiningDiacriticalMarksforSymbols UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCombiningDiacriticalMarksforSymbols(int code) { + return(((code >= 0x20D0) && (code <= 0x20FF))); +} + +/** + * xmlUCSIsCombiningHalfMarks: + * @code: UCS code point + * + * Check whether the character is part of CombiningHalfMarks UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCombiningHalfMarks(int code) { + return(((code >= 0xFE20) && (code <= 0xFE2F))); +} + +/** + * xmlUCSIsCombiningMarksforSymbols: + * @code: UCS code point + * + * Check whether the character is part of CombiningMarksforSymbols UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCombiningMarksforSymbols(int code) { + return(((code >= 0x20D0) && (code <= 0x20FF))); +} + +/** + * xmlUCSIsControlPictures: + * @code: UCS code point + * + * Check whether the character is part of ControlPictures UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsControlPictures(int code) { + return(((code >= 0x2400) && (code <= 0x243F))); +} + +/** + * xmlUCSIsCurrencySymbols: + * @code: UCS code point + * + * Check whether the character is part of CurrencySymbols UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCurrencySymbols(int code) { + return(((code >= 0x20A0) && (code <= 0x20CF))); +} + +/** + * xmlUCSIsCypriotSyllabary: + * @code: UCS code point + * + * Check whether the character is part of CypriotSyllabary UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCypriotSyllabary(int code) { + return(((code >= 0x10800) && (code <= 0x1083F))); +} + +/** + * xmlUCSIsCyrillic: + * @code: UCS code point + * + * Check whether the character is part of Cyrillic UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCyrillic(int code) { + return(((code >= 0x0400) && (code <= 0x04FF))); +} + +/** + * xmlUCSIsCyrillicSupplement: + * @code: UCS code point + * + * Check whether the character is part of CyrillicSupplement UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCyrillicSupplement(int code) { + return(((code >= 0x0500) && (code <= 0x052F))); +} + +/** + * xmlUCSIsDeseret: + * @code: UCS code point + * + * Check whether the character is part of Deseret UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsDeseret(int code) { + return(((code >= 0x10400) && (code <= 0x1044F))); +} + +/** + * xmlUCSIsDevanagari: + * @code: UCS code point + * + * Check whether the character is part of Devanagari UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsDevanagari(int code) { + return(((code >= 0x0900) && (code <= 0x097F))); +} + +/** + * xmlUCSIsDingbats: + * @code: UCS code point + * + * Check whether the character is part of Dingbats UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsDingbats(int code) { + return(((code >= 0x2700) && (code <= 0x27BF))); +} + +/** + * xmlUCSIsEnclosedAlphanumerics: + * @code: UCS code point + * + * Check whether the character is part of EnclosedAlphanumerics UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsEnclosedAlphanumerics(int code) { + return(((code >= 0x2460) && (code <= 0x24FF))); +} + +/** + * xmlUCSIsEnclosedCJKLettersandMonths: + * @code: UCS code point + * + * Check whether the character is part of EnclosedCJKLettersandMonths UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsEnclosedCJKLettersandMonths(int code) { + return(((code >= 0x3200) && (code <= 0x32FF))); +} + +/** + * xmlUCSIsEthiopic: + * @code: UCS code point + * + * Check whether the character is part of Ethiopic UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsEthiopic(int code) { + return(((code >= 0x1200) && (code <= 0x137F))); +} + +/** + * xmlUCSIsGeneralPunctuation: + * @code: UCS code point + * + * Check whether the character is part of GeneralPunctuation UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsGeneralPunctuation(int code) { + return(((code >= 0x2000) && (code <= 0x206F))); +} + +/** + * xmlUCSIsGeometricShapes: + * @code: UCS code point + * + * Check whether the character is part of GeometricShapes UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsGeometricShapes(int code) { + return(((code >= 0x25A0) && (code <= 0x25FF))); +} + +/** + * xmlUCSIsGeorgian: + * @code: UCS code point + * + * Check whether the character is part of Georgian UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsGeorgian(int code) { + return(((code >= 0x10A0) && (code <= 0x10FF))); +} + +/** + * xmlUCSIsGothic: + * @code: UCS code point + * + * Check whether the character is part of Gothic UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsGothic(int code) { + return(((code >= 0x10330) && (code <= 0x1034F))); +} + +/** + * xmlUCSIsGreek: + * @code: UCS code point + * + * Check whether the character is part of Greek UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsGreek(int code) { + return(((code >= 0x0370) && (code <= 0x03FF))); +} + +/** + * xmlUCSIsGreekExtended: + * @code: UCS code point + * + * Check whether the character is part of GreekExtended UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsGreekExtended(int code) { + return(((code >= 0x1F00) && (code <= 0x1FFF))); +} + +/** + * xmlUCSIsGreekandCoptic: + * @code: UCS code point + * + * Check whether the character is part of GreekandCoptic UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsGreekandCoptic(int code) { + return(((code >= 0x0370) && (code <= 0x03FF))); +} + +/** + * xmlUCSIsGujarati: + * @code: UCS code point + * + * Check whether the character is part of Gujarati UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsGujarati(int code) { + return(((code >= 0x0A80) && (code <= 0x0AFF))); +} + +/** + * xmlUCSIsGurmukhi: + * @code: UCS code point + * + * Check whether the character is part of Gurmukhi UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsGurmukhi(int code) { + return(((code >= 0x0A00) && (code <= 0x0A7F))); +} + +/** + * xmlUCSIsHalfwidthandFullwidthForms: + * @code: UCS code point + * + * Check whether the character is part of HalfwidthandFullwidthForms UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsHalfwidthandFullwidthForms(int code) { + return(((code >= 0xFF00) && (code <= 0xFFEF))); +} + +/** + * xmlUCSIsHangulCompatibilityJamo: + * @code: UCS code point + * + * Check whether the character is part of HangulCompatibilityJamo UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsHangulCompatibilityJamo(int code) { + return(((code >= 0x3130) && (code <= 0x318F))); +} + +/** + * xmlUCSIsHangulJamo: + * @code: UCS code point + * + * Check whether the character is part of HangulJamo UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsHangulJamo(int code) { + return(((code >= 0x1100) && (code <= 0x11FF))); +} + +/** + * xmlUCSIsHangulSyllables: + * @code: UCS code point + * + * Check whether the character is part of HangulSyllables UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsHangulSyllables(int code) { + return(((code >= 0xAC00) && (code <= 0xD7AF))); +} + +/** + * xmlUCSIsHanunoo: + * @code: UCS code point + * + * Check whether the character is part of Hanunoo UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsHanunoo(int code) { + return(((code >= 0x1720) && (code <= 0x173F))); +} + +/** + * xmlUCSIsHebrew: + * @code: UCS code point + * + * Check whether the character is part of Hebrew UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsHebrew(int code) { + return(((code >= 0x0590) && (code <= 0x05FF))); +} + +/** + * xmlUCSIsHighPrivateUseSurrogates: + * @code: UCS code point + * + * Check whether the character is part of HighPrivateUseSurrogates UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsHighPrivateUseSurrogates(int code) { + return(((code >= 0xDB80) && (code <= 0xDBFF))); +} + +/** + * xmlUCSIsHighSurrogates: + * @code: UCS code point + * + * Check whether the character is part of HighSurrogates UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsHighSurrogates(int code) { + return(((code >= 0xD800) && (code <= 0xDB7F))); +} + +/** + * xmlUCSIsHiragana: + * @code: UCS code point + * + * Check whether the character is part of Hiragana UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsHiragana(int code) { + return(((code >= 0x3040) && (code <= 0x309F))); +} + +/** + * xmlUCSIsIPAExtensions: + * @code: UCS code point + * + * Check whether the character is part of IPAExtensions UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsIPAExtensions(int code) { + return(((code >= 0x0250) && (code <= 0x02AF))); +} + +/** + * xmlUCSIsIdeographicDescriptionCharacters: + * @code: UCS code point + * + * Check whether the character is part of IdeographicDescriptionCharacters UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsIdeographicDescriptionCharacters(int code) { + return(((code >= 0x2FF0) && (code <= 0x2FFF))); +} + +/** + * xmlUCSIsKanbun: + * @code: UCS code point + * + * Check whether the character is part of Kanbun UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsKanbun(int code) { + return(((code >= 0x3190) && (code <= 0x319F))); +} + +/** + * xmlUCSIsKangxiRadicals: + * @code: UCS code point + * + * Check whether the character is part of KangxiRadicals UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsKangxiRadicals(int code) { + return(((code >= 0x2F00) && (code <= 0x2FDF))); +} + +/** + * xmlUCSIsKannada: + * @code: UCS code point + * + * Check whether the character is part of Kannada UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsKannada(int code) { + return(((code >= 0x0C80) && (code <= 0x0CFF))); +} + +/** + * xmlUCSIsKatakana: + * @code: UCS code point + * + * Check whether the character is part of Katakana UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsKatakana(int code) { + return(((code >= 0x30A0) && (code <= 0x30FF))); +} + +/** + * xmlUCSIsKatakanaPhoneticExtensions: + * @code: UCS code point + * + * Check whether the character is part of KatakanaPhoneticExtensions UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsKatakanaPhoneticExtensions(int code) { + return(((code >= 0x31F0) && (code <= 0x31FF))); +} + +/** + * xmlUCSIsKhmer: + * @code: UCS code point + * + * Check whether the character is part of Khmer UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsKhmer(int code) { + return(((code >= 0x1780) && (code <= 0x17FF))); +} + +/** + * xmlUCSIsKhmerSymbols: + * @code: UCS code point + * + * Check whether the character is part of KhmerSymbols UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsKhmerSymbols(int code) { + return(((code >= 0x19E0) && (code <= 0x19FF))); +} + +/** + * xmlUCSIsLao: + * @code: UCS code point + * + * Check whether the character is part of Lao UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsLao(int code) { + return(((code >= 0x0E80) && (code <= 0x0EFF))); +} + +/** + * xmlUCSIsLatin1Supplement: + * @code: UCS code point + * + * Check whether the character is part of Latin-1Supplement UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsLatin1Supplement(int code) { + return(((code >= 0x0080) && (code <= 0x00FF))); +} + +/** + * xmlUCSIsLatinExtendedA: + * @code: UCS code point + * + * Check whether the character is part of LatinExtended-A UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsLatinExtendedA(int code) { + return(((code >= 0x0100) && (code <= 0x017F))); +} + +/** + * xmlUCSIsLatinExtendedB: + * @code: UCS code point + * + * Check whether the character is part of LatinExtended-B UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsLatinExtendedB(int code) { + return(((code >= 0x0180) && (code <= 0x024F))); +} + +/** + * xmlUCSIsLatinExtendedAdditional: + * @code: UCS code point + * + * Check whether the character is part of LatinExtendedAdditional UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsLatinExtendedAdditional(int code) { + return(((code >= 0x1E00) && (code <= 0x1EFF))); +} + +/** + * xmlUCSIsLetterlikeSymbols: + * @code: UCS code point + * + * Check whether the character is part of LetterlikeSymbols UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsLetterlikeSymbols(int code) { + return(((code >= 0x2100) && (code <= 0x214F))); +} + +/** + * xmlUCSIsLimbu: + * @code: UCS code point + * + * Check whether the character is part of Limbu UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsLimbu(int code) { + return(((code >= 0x1900) && (code <= 0x194F))); +} + +/** + * xmlUCSIsLinearBIdeograms: + * @code: UCS code point + * + * Check whether the character is part of LinearBIdeograms UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsLinearBIdeograms(int code) { + return(((code >= 0x10080) && (code <= 0x100FF))); +} + +/** + * xmlUCSIsLinearBSyllabary: + * @code: UCS code point + * + * Check whether the character is part of LinearBSyllabary UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsLinearBSyllabary(int code) { + return(((code >= 0x10000) && (code <= 0x1007F))); +} + +/** + * xmlUCSIsLowSurrogates: + * @code: UCS code point + * + * Check whether the character is part of LowSurrogates UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsLowSurrogates(int code) { + return(((code >= 0xDC00) && (code <= 0xDFFF))); +} + +/** + * xmlUCSIsMalayalam: + * @code: UCS code point + * + * Check whether the character is part of Malayalam UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsMalayalam(int code) { + return(((code >= 0x0D00) && (code <= 0x0D7F))); +} + +/** + * xmlUCSIsMathematicalAlphanumericSymbols: + * @code: UCS code point + * + * Check whether the character is part of MathematicalAlphanumericSymbols UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsMathematicalAlphanumericSymbols(int code) { + return(((code >= 0x1D400) && (code <= 0x1D7FF))); +} + +/** + * xmlUCSIsMathematicalOperators: + * @code: UCS code point + * + * Check whether the character is part of MathematicalOperators UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsMathematicalOperators(int code) { + return(((code >= 0x2200) && (code <= 0x22FF))); +} + +/** + * xmlUCSIsMiscellaneousMathematicalSymbolsA: + * @code: UCS code point + * + * Check whether the character is part of MiscellaneousMathematicalSymbols-A UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsMiscellaneousMathematicalSymbolsA(int code) { + return(((code >= 0x27C0) && (code <= 0x27EF))); +} + +/** + * xmlUCSIsMiscellaneousMathematicalSymbolsB: + * @code: UCS code point + * + * Check whether the character is part of MiscellaneousMathematicalSymbols-B UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsMiscellaneousMathematicalSymbolsB(int code) { + return(((code >= 0x2980) && (code <= 0x29FF))); +} + +/** + * xmlUCSIsMiscellaneousSymbols: + * @code: UCS code point + * + * Check whether the character is part of MiscellaneousSymbols UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsMiscellaneousSymbols(int code) { + return(((code >= 0x2600) && (code <= 0x26FF))); +} + +/** + * xmlUCSIsMiscellaneousSymbolsandArrows: + * @code: UCS code point + * + * Check whether the character is part of MiscellaneousSymbolsandArrows UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsMiscellaneousSymbolsandArrows(int code) { + return(((code >= 0x2B00) && (code <= 0x2BFF))); +} + +/** + * xmlUCSIsMiscellaneousTechnical: + * @code: UCS code point + * + * Check whether the character is part of MiscellaneousTechnical UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsMiscellaneousTechnical(int code) { + return(((code >= 0x2300) && (code <= 0x23FF))); +} + +/** + * xmlUCSIsMongolian: + * @code: UCS code point + * + * Check whether the character is part of Mongolian UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsMongolian(int code) { + return(((code >= 0x1800) && (code <= 0x18AF))); +} + +/** + * xmlUCSIsMusicalSymbols: + * @code: UCS code point + * + * Check whether the character is part of MusicalSymbols UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsMusicalSymbols(int code) { + return(((code >= 0x1D100) && (code <= 0x1D1FF))); +} + +/** + * xmlUCSIsMyanmar: + * @code: UCS code point + * + * Check whether the character is part of Myanmar UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsMyanmar(int code) { + return(((code >= 0x1000) && (code <= 0x109F))); +} + +/** + * xmlUCSIsNumberForms: + * @code: UCS code point + * + * Check whether the character is part of NumberForms UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsNumberForms(int code) { + return(((code >= 0x2150) && (code <= 0x218F))); +} + +/** + * xmlUCSIsOgham: + * @code: UCS code point + * + * Check whether the character is part of Ogham UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsOgham(int code) { + return(((code >= 0x1680) && (code <= 0x169F))); +} + +/** + * xmlUCSIsOldItalic: + * @code: UCS code point + * + * Check whether the character is part of OldItalic UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsOldItalic(int code) { + return(((code >= 0x10300) && (code <= 0x1032F))); +} + +/** + * xmlUCSIsOpticalCharacterRecognition: + * @code: UCS code point + * + * Check whether the character is part of OpticalCharacterRecognition UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsOpticalCharacterRecognition(int code) { + return(((code >= 0x2440) && (code <= 0x245F))); +} + +/** + * xmlUCSIsOriya: + * @code: UCS code point + * + * Check whether the character is part of Oriya UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsOriya(int code) { + return(((code >= 0x0B00) && (code <= 0x0B7F))); +} + +/** + * xmlUCSIsOsmanya: + * @code: UCS code point + * + * Check whether the character is part of Osmanya UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsOsmanya(int code) { + return(((code >= 0x10480) && (code <= 0x104AF))); +} + +/** + * xmlUCSIsPhoneticExtensions: + * @code: UCS code point + * + * Check whether the character is part of PhoneticExtensions UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsPhoneticExtensions(int code) { + return(((code >= 0x1D00) && (code <= 0x1D7F))); +} + +/** + * xmlUCSIsPrivateUse: + * @code: UCS code point + * + * Check whether the character is part of PrivateUse UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsPrivateUse(int code) { + return(((code >= 0xE000) && (code <= 0xF8FF)) || + ((code >= 0xF0000) && (code <= 0xFFFFF)) || + ((code >= 0x100000) && (code <= 0x10FFFF))); +} + +/** + * xmlUCSIsPrivateUseArea: + * @code: UCS code point + * + * Check whether the character is part of PrivateUseArea UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsPrivateUseArea(int code) { + return(((code >= 0xE000) && (code <= 0xF8FF))); +} + +/** + * xmlUCSIsRunic: + * @code: UCS code point + * + * Check whether the character is part of Runic UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsRunic(int code) { + return(((code >= 0x16A0) && (code <= 0x16FF))); +} + +/** + * xmlUCSIsShavian: + * @code: UCS code point + * + * Check whether the character is part of Shavian UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsShavian(int code) { + return(((code >= 0x10450) && (code <= 0x1047F))); +} + +/** + * xmlUCSIsSinhala: + * @code: UCS code point + * + * Check whether the character is part of Sinhala UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsSinhala(int code) { + return(((code >= 0x0D80) && (code <= 0x0DFF))); +} + +/** + * xmlUCSIsSmallFormVariants: + * @code: UCS code point + * + * Check whether the character is part of SmallFormVariants UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsSmallFormVariants(int code) { + return(((code >= 0xFE50) && (code <= 0xFE6F))); +} + +/** + * xmlUCSIsSpacingModifierLetters: + * @code: UCS code point + * + * Check whether the character is part of SpacingModifierLetters UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsSpacingModifierLetters(int code) { + return(((code >= 0x02B0) && (code <= 0x02FF))); +} + +/** + * xmlUCSIsSpecials: + * @code: UCS code point + * + * Check whether the character is part of Specials UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsSpecials(int code) { + return(((code >= 0xFFF0) && (code <= 0xFFFF))); +} + +/** + * xmlUCSIsSuperscriptsandSubscripts: + * @code: UCS code point + * + * Check whether the character is part of SuperscriptsandSubscripts UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsSuperscriptsandSubscripts(int code) { + return(((code >= 0x2070) && (code <= 0x209F))); +} + +/** + * xmlUCSIsSupplementalArrowsA: + * @code: UCS code point + * + * Check whether the character is part of SupplementalArrows-A UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsSupplementalArrowsA(int code) { + return(((code >= 0x27F0) && (code <= 0x27FF))); +} + +/** + * xmlUCSIsSupplementalArrowsB: + * @code: UCS code point + * + * Check whether the character is part of SupplementalArrows-B UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsSupplementalArrowsB(int code) { + return(((code >= 0x2900) && (code <= 0x297F))); +} + +/** + * xmlUCSIsSupplementalMathematicalOperators: + * @code: UCS code point + * + * Check whether the character is part of SupplementalMathematicalOperators UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsSupplementalMathematicalOperators(int code) { + return(((code >= 0x2A00) && (code <= 0x2AFF))); +} + +/** + * xmlUCSIsSupplementaryPrivateUseAreaA: + * @code: UCS code point + * + * Check whether the character is part of SupplementaryPrivateUseArea-A UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsSupplementaryPrivateUseAreaA(int code) { + return(((code >= 0xF0000) && (code <= 0xFFFFF))); +} + +/** + * xmlUCSIsSupplementaryPrivateUseAreaB: + * @code: UCS code point + * + * Check whether the character is part of SupplementaryPrivateUseArea-B UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsSupplementaryPrivateUseAreaB(int code) { + return(((code >= 0x100000) && (code <= 0x10FFFF))); +} + +/** + * xmlUCSIsSyriac: + * @code: UCS code point + * + * Check whether the character is part of Syriac UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsSyriac(int code) { + return(((code >= 0x0700) && (code <= 0x074F))); +} + +/** + * xmlUCSIsTagalog: + * @code: UCS code point + * + * Check whether the character is part of Tagalog UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsTagalog(int code) { + return(((code >= 0x1700) && (code <= 0x171F))); +} + +/** + * xmlUCSIsTagbanwa: + * @code: UCS code point + * + * Check whether the character is part of Tagbanwa UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsTagbanwa(int code) { + return(((code >= 0x1760) && (code <= 0x177F))); +} + +/** + * xmlUCSIsTags: + * @code: UCS code point + * + * Check whether the character is part of Tags UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsTags(int code) { + return(((code >= 0xE0000) && (code <= 0xE007F))); +} + +/** + * xmlUCSIsTaiLe: + * @code: UCS code point + * + * Check whether the character is part of TaiLe UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsTaiLe(int code) { + return(((code >= 0x1950) && (code <= 0x197F))); +} + +/** + * xmlUCSIsTaiXuanJingSymbols: + * @code: UCS code point + * + * Check whether the character is part of TaiXuanJingSymbols UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsTaiXuanJingSymbols(int code) { + return(((code >= 0x1D300) && (code <= 0x1D35F))); +} + +/** + * xmlUCSIsTamil: + * @code: UCS code point + * + * Check whether the character is part of Tamil UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsTamil(int code) { + return(((code >= 0x0B80) && (code <= 0x0BFF))); +} + +/** + * xmlUCSIsTelugu: + * @code: UCS code point + * + * Check whether the character is part of Telugu UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsTelugu(int code) { + return(((code >= 0x0C00) && (code <= 0x0C7F))); +} + +/** + * xmlUCSIsThaana: + * @code: UCS code point + * + * Check whether the character is part of Thaana UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsThaana(int code) { + return(((code >= 0x0780) && (code <= 0x07BF))); +} + +/** + * xmlUCSIsThai: + * @code: UCS code point + * + * Check whether the character is part of Thai UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsThai(int code) { + return(((code >= 0x0E00) && (code <= 0x0E7F))); +} + +/** + * xmlUCSIsTibetan: + * @code: UCS code point + * + * Check whether the character is part of Tibetan UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsTibetan(int code) { + return(((code >= 0x0F00) && (code <= 0x0FFF))); +} + +/** + * xmlUCSIsUgaritic: + * @code: UCS code point + * + * Check whether the character is part of Ugaritic UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsUgaritic(int code) { + return(((code >= 0x10380) && (code <= 0x1039F))); +} + +/** + * xmlUCSIsUnifiedCanadianAboriginalSyllabics: + * @code: UCS code point + * + * Check whether the character is part of UnifiedCanadianAboriginalSyllabics UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsUnifiedCanadianAboriginalSyllabics(int code) { + return(((code >= 0x1400) && (code <= 0x167F))); +} + +/** + * xmlUCSIsVariationSelectors: + * @code: UCS code point + * + * Check whether the character is part of VariationSelectors UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsVariationSelectors(int code) { + return(((code >= 0xFE00) && (code <= 0xFE0F))); +} + +/** + * xmlUCSIsVariationSelectorsSupplement: + * @code: UCS code point + * + * Check whether the character is part of VariationSelectorsSupplement UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsVariationSelectorsSupplement(int code) { + return(((code >= 0xE0100) && (code <= 0xE01EF))); +} + +/** + * xmlUCSIsYiRadicals: + * @code: UCS code point + * + * Check whether the character is part of YiRadicals UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsYiRadicals(int code) { + return(((code >= 0xA490) && (code <= 0xA4CF))); +} + +/** + * xmlUCSIsYiSyllables: + * @code: UCS code point + * + * Check whether the character is part of YiSyllables UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsYiSyllables(int code) { + return(((code >= 0xA000) && (code <= 0xA48F))); +} + +/** + * xmlUCSIsYijingHexagramSymbols: + * @code: UCS code point + * + * Check whether the character is part of YijingHexagramSymbols UCS Block + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsYijingHexagramSymbols(int code) { + return(((code >= 0x4DC0) && (code <= 0x4DFF))); +} + +/** + * xmlUCSIsBlock: + * @code: UCS code point + * @block: UCS block name + * + * Check whether the character is part of the UCS Block + * + * Returns 1 if true, 0 if false and -1 on unknown block + */ +int +xmlUCSIsBlock(int code, const char *block) { + xmlIntFunc *func; + + func = xmlUnicodeLookup(&xmlUnicodeBlockTbl, block); + if (func == NULL) + return (-1); + return (func(code)); +} + +/** + * xmlUCSIsCatC: + * @code: UCS code point + * + * Check whether the character is part of C UCS Category + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCatC(int code) { + return(xmlCharInRange((unsigned int)code, &xmlCG)); +} + +/** + * xmlUCSIsCatCc: + * @code: UCS code point + * + * Check whether the character is part of Cc UCS Category + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCatCc(int code) { + return(((code >= 0x0) && (code <= 0x1f)) || + ((code >= 0x7f) && (code <= 0x9f))); +} + +/** + * xmlUCSIsCatCf: + * @code: UCS code point + * + * Check whether the character is part of Cf UCS Category + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCatCf(int code) { + return(xmlCharInRange((unsigned int)code, &xmlCfG)); +} + +/** + * xmlUCSIsCatCo: + * @code: UCS code point + * + * Check whether the character is part of Co UCS Category + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCatCo(int code) { + return((code == 0xe000) || + (code == 0xf8ff) || + (code == 0xf0000) || + (code == 0xffffd) || + (code == 0x100000) || + (code == 0x10fffd)); +} + +/** + * xmlUCSIsCatCs: + * @code: UCS code point + * + * Check whether the character is part of Cs UCS Category + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCatCs(int code) { + return((code == 0xd800) || + ((code >= 0xdb7f) && (code <= 0xdb80)) || + ((code >= 0xdbff) && (code <= 0xdc00)) || + (code == 0xdfff)); +} + +/** + * xmlUCSIsCatL: + * @code: UCS code point + * + * Check whether the character is part of L UCS Category + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCatL(int code) { + return(xmlCharInRange((unsigned int)code, &xmlLG)); +} + +/** + * xmlUCSIsCatLl: + * @code: UCS code point + * + * Check whether the character is part of Ll UCS Category + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCatLl(int code) { + return(xmlCharInRange((unsigned int)code, &xmlLlG)); +} + +/** + * xmlUCSIsCatLm: + * @code: UCS code point + * + * Check whether the character is part of Lm UCS Category + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCatLm(int code) { + return(xmlCharInRange((unsigned int)code, &xmlLmG)); +} + +/** + * xmlUCSIsCatLo: + * @code: UCS code point + * + * Check whether the character is part of Lo UCS Category + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCatLo(int code) { + return(xmlCharInRange((unsigned int)code, &xmlLoG)); +} + +/** + * xmlUCSIsCatLt: + * @code: UCS code point + * + * Check whether the character is part of Lt UCS Category + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCatLt(int code) { + return(xmlCharInRange((unsigned int)code, &xmlLtG)); +} + +/** + * xmlUCSIsCatLu: + * @code: UCS code point + * + * Check whether the character is part of Lu UCS Category + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCatLu(int code) { + return(xmlCharInRange((unsigned int)code, &xmlLuG)); +} + +/** + * xmlUCSIsCatM: + * @code: UCS code point + * + * Check whether the character is part of M UCS Category + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCatM(int code) { + return(xmlCharInRange((unsigned int)code, &xmlMG)); +} + +/** + * xmlUCSIsCatMc: + * @code: UCS code point + * + * Check whether the character is part of Mc UCS Category + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCatMc(int code) { + return(xmlCharInRange((unsigned int)code, &xmlMcG)); +} + +/** + * xmlUCSIsCatMe: + * @code: UCS code point + * + * Check whether the character is part of Me UCS Category + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCatMe(int code) { + return(((code >= 0x488) && (code <= 0x489)) || + (code == 0x6de) || + ((code >= 0x20dd) && (code <= 0x20e0)) || + ((code >= 0x20e2) && (code <= 0x20e4))); +} + +/** + * xmlUCSIsCatMn: + * @code: UCS code point + * + * Check whether the character is part of Mn UCS Category + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCatMn(int code) { + return(xmlCharInRange((unsigned int)code, &xmlMnG)); +} + +/** + * xmlUCSIsCatN: + * @code: UCS code point + * + * Check whether the character is part of N UCS Category + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCatN(int code) { + return(xmlCharInRange((unsigned int)code, &xmlNG)); +} + +/** + * xmlUCSIsCatNd: + * @code: UCS code point + * + * Check whether the character is part of Nd UCS Category + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCatNd(int code) { + return(xmlCharInRange((unsigned int)code, &xmlNdG)); +} + +/** + * xmlUCSIsCatNl: + * @code: UCS code point + * + * Check whether the character is part of Nl UCS Category + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCatNl(int code) { + return(((code >= 0x16ee) && (code <= 0x16f0)) || + ((code >= 0x2160) && (code <= 0x2183)) || + (code == 0x3007) || + ((code >= 0x3021) && (code <= 0x3029)) || + ((code >= 0x3038) && (code <= 0x303a)) || + (code == 0x1034a)); +} + +/** + * xmlUCSIsCatNo: + * @code: UCS code point + * + * Check whether the character is part of No UCS Category + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCatNo(int code) { + return(xmlCharInRange((unsigned int)code, &xmlNoG)); +} + +/** + * xmlUCSIsCatP: + * @code: UCS code point + * + * Check whether the character is part of P UCS Category + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCatP(int code) { + return(xmlCharInRange((unsigned int)code, &xmlPG)); +} + +/** + * xmlUCSIsCatPc: + * @code: UCS code point + * + * Check whether the character is part of Pc UCS Category + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCatPc(int code) { + return((code == 0x5f) || + ((code >= 0x203f) && (code <= 0x2040)) || + (code == 0x2054) || + (code == 0x30fb) || + ((code >= 0xfe33) && (code <= 0xfe34)) || + ((code >= 0xfe4d) && (code <= 0xfe4f)) || + (code == 0xff3f) || + (code == 0xff65)); +} + +/** + * xmlUCSIsCatPd: + * @code: UCS code point + * + * Check whether the character is part of Pd UCS Category + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCatPd(int code) { + return(xmlCharInRange((unsigned int)code, &xmlPdG)); +} + +/** + * xmlUCSIsCatPe: + * @code: UCS code point + * + * Check whether the character is part of Pe UCS Category + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCatPe(int code) { + return(xmlCharInRange((unsigned int)code, &xmlPeG)); +} + +/** + * xmlUCSIsCatPf: + * @code: UCS code point + * + * Check whether the character is part of Pf UCS Category + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCatPf(int code) { + return((code == 0xbb) || + (code == 0x2019) || + (code == 0x201d) || + (code == 0x203a)); +} + +/** + * xmlUCSIsCatPi: + * @code: UCS code point + * + * Check whether the character is part of Pi UCS Category + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCatPi(int code) { + return((code == 0xab) || + (code == 0x2018) || + ((code >= 0x201b) && (code <= 0x201c)) || + (code == 0x201f) || + (code == 0x2039)); +} + +/** + * xmlUCSIsCatPo: + * @code: UCS code point + * + * Check whether the character is part of Po UCS Category + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCatPo(int code) { + return(xmlCharInRange((unsigned int)code, &xmlPoG)); +} + +/** + * xmlUCSIsCatPs: + * @code: UCS code point + * + * Check whether the character is part of Ps UCS Category + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCatPs(int code) { + return(xmlCharInRange((unsigned int)code, &xmlPsG)); +} + +/** + * xmlUCSIsCatS: + * @code: UCS code point + * + * Check whether the character is part of S UCS Category + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCatS(int code) { + return(xmlCharInRange((unsigned int)code, &xmlSG)); +} + +/** + * xmlUCSIsCatSc: + * @code: UCS code point + * + * Check whether the character is part of Sc UCS Category + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCatSc(int code) { + return(xmlCharInRange((unsigned int)code, &xmlScG)); +} + +/** + * xmlUCSIsCatSk: + * @code: UCS code point + * + * Check whether the character is part of Sk UCS Category + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCatSk(int code) { + return(xmlCharInRange((unsigned int)code, &xmlSkG)); +} + +/** + * xmlUCSIsCatSm: + * @code: UCS code point + * + * Check whether the character is part of Sm UCS Category + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCatSm(int code) { + return(xmlCharInRange((unsigned int)code, &xmlSmG)); +} + +/** + * xmlUCSIsCatSo: + * @code: UCS code point + * + * Check whether the character is part of So UCS Category + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCatSo(int code) { + return(xmlCharInRange((unsigned int)code, &xmlSoG)); +} + +/** + * xmlUCSIsCatZ: + * @code: UCS code point + * + * Check whether the character is part of Z UCS Category + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCatZ(int code) { + return(xmlCharInRange((unsigned int)code, &xmlZG)); +} + +/** + * xmlUCSIsCatZl: + * @code: UCS code point + * + * Check whether the character is part of Zl UCS Category + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCatZl(int code) { + return((code == 0x2028)); +} + +/** + * xmlUCSIsCatZp: + * @code: UCS code point + * + * Check whether the character is part of Zp UCS Category + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCatZp(int code) { + return((code == 0x2029)); +} + +/** + * xmlUCSIsCatZs: + * @code: UCS code point + * + * Check whether the character is part of Zs UCS Category + * + * Returns 1 if true 0 otherwise + */ +int +xmlUCSIsCatZs(int code) { + return((code == 0x20) || + (code == 0xa0) || + (code == 0x1680) || + (code == 0x180e) || + ((code >= 0x2000) && (code <= 0x200a)) || + (code == 0x202f) || + (code == 0x205f) || + (code == 0x3000)); +} + +/** + * xmlUCSIsCat: + * @code: UCS code point + * @cat: UCS Category name + * + * Check whether the character is part of the UCS Category + * + * Returns 1 if true, 0 if false and -1 on unknown category + */ +int +xmlUCSIsCat(int code, const char *cat) { + xmlIntFunc *func; + + func = xmlUnicodeLookup(&xmlUnicodeCatTbl, cat); + if (func == NULL) + return (-1); + return (func(code)); +} + +#define bottom_xmlunicode +#include "elfgcchack.h" +#endif /* LIBXML_UNICODE_ENABLED */ diff --git a/vendors/libxml/src/xmlwriter.c b/vendors/libxml/src/xmlwriter.c new file mode 100644 index 0000000..d3f29f8 --- /dev/null +++ b/vendors/libxml/src/xmlwriter.c @@ -0,0 +1,4737 @@ + +/* + * xmlwriter.c: XML text writer implementation + * + * For license and disclaimer see the license and disclaimer of + * libxml2. + * + * alfred@mickautsch.de + */ + +#define IN_LIBXML +#include "libxml.h" +#include + +#include +#include +#include +#include + +#ifdef LIBXML_WRITER_ENABLED + +#include + +#include "buf.h" +#include "enc.h" +#include "save.h" + +#define B64LINELEN 72 +#define B64CRLF "\r\n" + +/* + * The following VA_COPY was coded following an example in + * the Samba project. It may not be sufficient for some + * esoteric implementations of va_list (i.e. it may need + * something involving a memcpy) but (hopefully) will be + * sufficient for libxml2. + */ +#ifndef VA_COPY + #ifdef HAVE_VA_COPY + #define VA_COPY(dest, src) va_copy(dest, src) + #else + #ifdef HAVE___VA_COPY + #define VA_COPY(dest,src) __va_copy(dest, src) + #else + #define VA_COPY(dest,src) (dest) = (src) + #endif + #endif +#endif + +/* + * Types are kept private + */ +typedef enum { + XML_TEXTWRITER_NONE = 0, + XML_TEXTWRITER_NAME, + XML_TEXTWRITER_ATTRIBUTE, + XML_TEXTWRITER_TEXT, + XML_TEXTWRITER_PI, + XML_TEXTWRITER_PI_TEXT, + XML_TEXTWRITER_CDATA, + XML_TEXTWRITER_DTD, + XML_TEXTWRITER_DTD_TEXT, + XML_TEXTWRITER_DTD_ELEM, + XML_TEXTWRITER_DTD_ELEM_TEXT, + XML_TEXTWRITER_DTD_ATTL, + XML_TEXTWRITER_DTD_ATTL_TEXT, + XML_TEXTWRITER_DTD_ENTY, /* entity */ + XML_TEXTWRITER_DTD_ENTY_TEXT, + XML_TEXTWRITER_DTD_PENT, /* parameter entity */ + XML_TEXTWRITER_COMMENT +} xmlTextWriterState; + +typedef struct _xmlTextWriterStackEntry xmlTextWriterStackEntry; + +struct _xmlTextWriterStackEntry { + xmlChar *name; + xmlTextWriterState state; +}; + +typedef struct _xmlTextWriterNsStackEntry xmlTextWriterNsStackEntry; +struct _xmlTextWriterNsStackEntry { + xmlChar *prefix; + xmlChar *uri; + xmlLinkPtr elem; +}; + +struct _xmlTextWriter { + xmlOutputBufferPtr out; /* output buffer */ + xmlListPtr nodes; /* element name stack */ + xmlListPtr nsstack; /* name spaces stack */ + int level; + int indent; /* enable indent */ + int doindent; /* internal indent flag */ + xmlChar *ichar; /* indent character */ + char qchar; /* character used for quoting attribute values */ + xmlParserCtxtPtr ctxt; + int no_doc_free; + xmlDocPtr doc; +}; + +static void xmlFreeTextWriterStackEntry(xmlLinkPtr lk); +static int xmlCmpTextWriterStackEntry(const void *data0, + const void *data1); +static int xmlTextWriterOutputNSDecl(xmlTextWriterPtr writer); +static void xmlFreeTextWriterNsStackEntry(xmlLinkPtr lk); +static int xmlCmpTextWriterNsStackEntry(const void *data0, + const void *data1); +static int xmlTextWriterWriteDocCallback(void *context, + const xmlChar * str, int len); +static int xmlTextWriterCloseDocCallback(void *context); + +static xmlChar *xmlTextWriterVSprintf(const char *format, va_list argptr); +static int xmlOutputBufferWriteBase64(xmlOutputBufferPtr out, int len, + const unsigned char *data); +static void xmlTextWriterStartDocumentCallback(void *ctx); +static int xmlTextWriterWriteIndent(xmlTextWriterPtr writer); +static int + xmlTextWriterHandleStateDependencies(xmlTextWriterPtr writer, + xmlTextWriterStackEntry * p); + +/** + * xmlWriterErrMsg: + * @ctxt: a writer context + * @error: the error number + * @msg: the error message + * + * Handle a writer error + */ +static void +xmlWriterErrMsg(xmlTextWriterPtr ctxt, xmlParserErrors error, + const char *msg) +{ + if (ctxt != NULL) { + __xmlRaiseError(NULL, NULL, NULL, ctxt->ctxt, + NULL, XML_FROM_WRITER, error, XML_ERR_FATAL, + NULL, 0, NULL, NULL, NULL, 0, 0, "%s", msg); + } else { + __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_WRITER, error, + XML_ERR_FATAL, NULL, 0, NULL, NULL, NULL, 0, 0, "%s", msg); + } +} + +/** + * xmlWriterErrMsgInt: + * @ctxt: a writer context + * @error: the error number + * @msg: the error message + * @val: an int + * + * Handle a writer error + */ +static void +xmlWriterErrMsgInt(xmlTextWriterPtr ctxt, xmlParserErrors error, + const char *msg, int val) +{ + if (ctxt != NULL) { + __xmlRaiseError(NULL, NULL, NULL, ctxt->ctxt, + NULL, XML_FROM_WRITER, error, XML_ERR_FATAL, + NULL, 0, NULL, NULL, NULL, val, 0, msg, val); + } else { + __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_WRITER, error, + XML_ERR_FATAL, NULL, 0, NULL, NULL, NULL, val, 0, msg, val); + } +} + +/** + * xmlNewTextWriter: + * @out: an xmlOutputBufferPtr + * + * Create a new xmlNewTextWriter structure using an xmlOutputBufferPtr + * NOTE: the @out parameter will be deallocated when the writer is closed + * (if the call succeed.) + * + * Returns the new xmlTextWriterPtr or NULL in case of error + */ +xmlTextWriterPtr +xmlNewTextWriter(xmlOutputBufferPtr out) +{ + xmlTextWriterPtr ret; + + ret = (xmlTextWriterPtr) xmlMalloc(sizeof(xmlTextWriter)); + if (ret == NULL) { + xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY, + "xmlNewTextWriter : out of memory!\n"); + return NULL; + } + memset(ret, 0, (size_t) sizeof(xmlTextWriter)); + + ret->nodes = xmlListCreate((xmlListDeallocator) + xmlFreeTextWriterStackEntry, + (xmlListDataCompare) + xmlCmpTextWriterStackEntry); + if (ret->nodes == NULL) { + xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY, + "xmlNewTextWriter : out of memory!\n"); + xmlFree(ret); + return NULL; + } + + ret->nsstack = xmlListCreate((xmlListDeallocator) + xmlFreeTextWriterNsStackEntry, + (xmlListDataCompare) + xmlCmpTextWriterNsStackEntry); + if (ret->nsstack == NULL) { + xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY, + "xmlNewTextWriter : out of memory!\n"); + xmlListDelete(ret->nodes); + xmlFree(ret); + return NULL; + } + + ret->out = out; + ret->ichar = xmlStrdup(BAD_CAST " "); + ret->qchar = '"'; + + if (!ret->ichar) { + xmlListDelete(ret->nodes); + xmlListDelete(ret->nsstack); + xmlFree(ret); + xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY, + "xmlNewTextWriter : out of memory!\n"); + return NULL; + } + + ret->doc = xmlNewDoc(NULL); + + ret->no_doc_free = 0; + + return ret; +} + +/** + * xmlNewTextWriterFilename: + * @uri: the URI of the resource for the output + * @compression: compress the output? + * + * Create a new xmlNewTextWriter structure with @uri as output + * + * Returns the new xmlTextWriterPtr or NULL in case of error + */ +xmlTextWriterPtr +xmlNewTextWriterFilename(const char *uri, int compression) +{ + xmlTextWriterPtr ret; + xmlOutputBufferPtr out; + + out = xmlOutputBufferCreateFilename(uri, NULL, compression); + if (out == NULL) { + xmlWriterErrMsg(NULL, XML_IO_EIO, + "xmlNewTextWriterFilename : cannot open uri\n"); + return NULL; + } + + ret = xmlNewTextWriter(out); + if (ret == NULL) { + xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY, + "xmlNewTextWriterFilename : out of memory!\n"); + xmlOutputBufferClose(out); + return NULL; + } + + ret->indent = 0; + ret->doindent = 0; + return ret; +} + +/** + * xmlNewTextWriterMemory: + * @buf: xmlBufferPtr + * @compression: compress the output? + * + * Create a new xmlNewTextWriter structure with @buf as output + * TODO: handle compression + * + * Returns the new xmlTextWriterPtr or NULL in case of error + */ +xmlTextWriterPtr +xmlNewTextWriterMemory(xmlBufferPtr buf, int compression ATTRIBUTE_UNUSED) +{ + xmlTextWriterPtr ret; + xmlOutputBufferPtr out; + +/*::todo handle compression */ + out = xmlOutputBufferCreateBuffer(buf, NULL); + + if (out == NULL) { + xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY, + "xmlNewTextWriterMemory : out of memory!\n"); + return NULL; + } + + ret = xmlNewTextWriter(out); + if (ret == NULL) { + xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY, + "xmlNewTextWriterMemory : out of memory!\n"); + xmlOutputBufferClose(out); + return NULL; + } + + return ret; +} + +/** + * xmlNewTextWriterPushParser: + * @ctxt: xmlParserCtxtPtr to hold the new XML document tree + * @compression: compress the output? + * + * Create a new xmlNewTextWriter structure with @ctxt as output + * NOTE: the @ctxt context will be freed with the resulting writer + * (if the call succeeds). + * TODO: handle compression + * + * Returns the new xmlTextWriterPtr or NULL in case of error + */ +xmlTextWriterPtr +xmlNewTextWriterPushParser(xmlParserCtxtPtr ctxt, + int compression ATTRIBUTE_UNUSED) +{ + xmlTextWriterPtr ret; + xmlOutputBufferPtr out; + + if (ctxt == NULL) { + xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR, + "xmlNewTextWriterPushParser : invalid context!\n"); + return NULL; + } + + out = xmlOutputBufferCreateIO((xmlOutputWriteCallback) + xmlTextWriterWriteDocCallback, + (xmlOutputCloseCallback) + xmlTextWriterCloseDocCallback, + (void *) ctxt, NULL); + if (out == NULL) { + xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR, + "xmlNewTextWriterPushParser : error at xmlOutputBufferCreateIO!\n"); + return NULL; + } + + ret = xmlNewTextWriter(out); + if (ret == NULL) { + xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR, + "xmlNewTextWriterPushParser : error at xmlNewTextWriter!\n"); + xmlOutputBufferClose(out); + return NULL; + } + + ret->ctxt = ctxt; + + return ret; +} + +/** + * xmlNewTextWriterDoc: + * @doc: address of a xmlDocPtr to hold the new XML document tree + * @compression: compress the output? + * + * Create a new xmlNewTextWriter structure with @*doc as output + * + * Returns the new xmlTextWriterPtr or NULL in case of error + */ +xmlTextWriterPtr +xmlNewTextWriterDoc(xmlDocPtr * doc, int compression) +{ + xmlTextWriterPtr ret; + xmlSAXHandler saxHandler; + xmlParserCtxtPtr ctxt; + + memset(&saxHandler, '\0', sizeof(saxHandler)); + xmlSAX2InitDefaultSAXHandler(&saxHandler, 1); + saxHandler.startDocument = xmlTextWriterStartDocumentCallback; + saxHandler.startElement = xmlSAX2StartElement; + saxHandler.endElement = xmlSAX2EndElement; + + ctxt = xmlCreatePushParserCtxt(&saxHandler, NULL, NULL, 0, NULL); + if (ctxt == NULL) { + xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR, + "xmlNewTextWriterDoc : error at xmlCreatePushParserCtxt!\n"); + return NULL; + } + /* + * For some reason this seems to completely break if node names + * are interned. + */ + ctxt->dictNames = 0; + + ctxt->myDoc = xmlNewDoc(BAD_CAST XML_DEFAULT_VERSION); + if (ctxt->myDoc == NULL) { + xmlFreeParserCtxt(ctxt); + xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR, + "xmlNewTextWriterDoc : error at xmlNewDoc!\n"); + return NULL; + } + + ret = xmlNewTextWriterPushParser(ctxt, compression); + if (ret == NULL) { + xmlFreeDoc(ctxt->myDoc); + xmlFreeParserCtxt(ctxt); + xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR, + "xmlNewTextWriterDoc : error at xmlNewTextWriterPushParser!\n"); + return NULL; + } + + xmlSetDocCompressMode(ctxt->myDoc, compression); + + if (doc != NULL) { + *doc = ctxt->myDoc; + ret->no_doc_free = 1; + } + + return ret; +} + +/** + * xmlNewTextWriterTree: + * @doc: xmlDocPtr + * @node: xmlNodePtr or NULL for doc->children + * @compression: compress the output? + * + * Create a new xmlNewTextWriter structure with @doc as output + * starting at @node + * + * Returns the new xmlTextWriterPtr or NULL in case of error + */ +xmlTextWriterPtr +xmlNewTextWriterTree(xmlDocPtr doc, xmlNodePtr node, int compression) +{ + xmlTextWriterPtr ret; + xmlSAXHandler saxHandler; + xmlParserCtxtPtr ctxt; + + if (doc == NULL) { + xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR, + "xmlNewTextWriterTree : invalid document tree!\n"); + return NULL; + } + + memset(&saxHandler, '\0', sizeof(saxHandler)); + xmlSAX2InitDefaultSAXHandler(&saxHandler, 1); + saxHandler.startDocument = xmlTextWriterStartDocumentCallback; + saxHandler.startElement = xmlSAX2StartElement; + saxHandler.endElement = xmlSAX2EndElement; + + ctxt = xmlCreatePushParserCtxt(&saxHandler, NULL, NULL, 0, NULL); + if (ctxt == NULL) { + xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR, + "xmlNewTextWriterDoc : error at xmlCreatePushParserCtxt!\n"); + return NULL; + } + /* + * For some reason this seems to completely break if node names + * are interned. + */ + ctxt->dictNames = 0; + + ret = xmlNewTextWriterPushParser(ctxt, compression); + if (ret == NULL) { + xmlFreeParserCtxt(ctxt); + xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR, + "xmlNewTextWriterDoc : error at xmlNewTextWriterPushParser!\n"); + return NULL; + } + + ctxt->myDoc = doc; + ctxt->node = node; + ret->no_doc_free = 1; + + xmlSetDocCompressMode(doc, compression); + + return ret; +} + +/** + * xmlFreeTextWriter: + * @writer: the xmlTextWriterPtr + * + * Deallocate all the resources associated to the writer + */ +void +xmlFreeTextWriter(xmlTextWriterPtr writer) +{ + if (writer == NULL) + return; + + if (writer->out != NULL) + xmlOutputBufferClose(writer->out); + + if (writer->nodes != NULL) + xmlListDelete(writer->nodes); + + if (writer->nsstack != NULL) + xmlListDelete(writer->nsstack); + + if (writer->ctxt != NULL) { + if ((writer->ctxt->myDoc != NULL) && (writer->no_doc_free == 0)) { + xmlFreeDoc(writer->ctxt->myDoc); + writer->ctxt->myDoc = NULL; + } + xmlFreeParserCtxt(writer->ctxt); + } + + if (writer->doc != NULL) + xmlFreeDoc(writer->doc); + + if (writer->ichar != NULL) + xmlFree(writer->ichar); + xmlFree(writer); +} + +/** + * xmlTextWriterStartDocument: + * @writer: the xmlTextWriterPtr + * @version: the xml version ("1.0") or NULL for default ("1.0") + * @encoding: the encoding or NULL for default + * @standalone: "yes" or "no" or NULL for default + * + * Start a new xml document + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterStartDocument(xmlTextWriterPtr writer, const char *version, + const char *encoding, const char *standalone) +{ + int count; + int sum; + xmlLinkPtr lk; + xmlCharEncodingHandlerPtr encoder; + + if ((writer == NULL) || (writer->out == NULL)) { + xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, + "xmlTextWriterStartDocument : invalid writer!\n"); + return -1; + } + + lk = xmlListFront(writer->nodes); + if ((lk != NULL) && (xmlLinkGetData(lk) != NULL)) { + xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, + "xmlTextWriterStartDocument : not allowed in this context!\n"); + return -1; + } + + encoder = NULL; + if (encoding != NULL) { + encoder = xmlFindCharEncodingHandler(encoding); + if (encoder == NULL) { + xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, + "xmlTextWriterStartDocument : out of memory!\n"); + return -1; + } + } + + writer->out->encoder = encoder; + if (encoder != NULL) { + if (writer->out->conv == NULL) { + writer->out->conv = xmlBufCreateSize(4000); + } + xmlCharEncOutput(writer->out, 1); + if ((writer->doc != NULL) && (writer->doc->encoding == NULL)) + writer->doc->encoding = xmlStrdup((xmlChar *)writer->out->encoder->name); + } else + writer->out->conv = NULL; + + sum = 0; + count = xmlOutputBufferWriteString(writer->out, "out, 1, &writer->qchar); + if (count < 0) + return -1; + sum += count; + if (version != 0) + count = xmlOutputBufferWriteString(writer->out, version); + else + count = xmlOutputBufferWriteString(writer->out, "1.0"); + if (count < 0) + return -1; + sum += count; + count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); + if (count < 0) + return -1; + sum += count; + if (writer->out->encoder != 0) { + count = xmlOutputBufferWriteString(writer->out, " encoding="); + if (count < 0) + return -1; + sum += count; + count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); + if (count < 0) + return -1; + sum += count; + count = + xmlOutputBufferWriteString(writer->out, + writer->out->encoder->name); + if (count < 0) + return -1; + sum += count; + count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); + if (count < 0) + return -1; + sum += count; + } + + if (standalone != 0) { + count = xmlOutputBufferWriteString(writer->out, " standalone="); + if (count < 0) + return -1; + sum += count; + count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); + if (count < 0) + return -1; + sum += count; + count = xmlOutputBufferWriteString(writer->out, standalone); + if (count < 0) + return -1; + sum += count; + count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); + if (count < 0) + return -1; + sum += count; + } + + count = xmlOutputBufferWriteString(writer->out, "?>\n"); + if (count < 0) + return -1; + sum += count; + + return sum; +} + +/** + * xmlTextWriterEndDocument: + * @writer: the xmlTextWriterPtr + * + * End an xml document. All open elements are closed, and + * the content is flushed to the output. + * + * Returns the bytes written or -1 in case of error + */ +int +xmlTextWriterEndDocument(xmlTextWriterPtr writer) +{ + int count; + int sum; + xmlLinkPtr lk; + xmlTextWriterStackEntry *p; + + if (writer == NULL) { + xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, + "xmlTextWriterEndDocument : invalid writer!\n"); + return -1; + } + + sum = 0; + while ((lk = xmlListFront(writer->nodes)) != NULL) { + p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); + if (p == 0) + break; + switch (p->state) { + case XML_TEXTWRITER_NAME: + case XML_TEXTWRITER_ATTRIBUTE: + case XML_TEXTWRITER_TEXT: + count = xmlTextWriterEndElement(writer); + if (count < 0) + return -1; + sum += count; + break; + case XML_TEXTWRITER_PI: + case XML_TEXTWRITER_PI_TEXT: + count = xmlTextWriterEndPI(writer); + if (count < 0) + return -1; + sum += count; + break; + case XML_TEXTWRITER_CDATA: + count = xmlTextWriterEndCDATA(writer); + if (count < 0) + return -1; + sum += count; + break; + case XML_TEXTWRITER_DTD: + case XML_TEXTWRITER_DTD_TEXT: + case XML_TEXTWRITER_DTD_ELEM: + case XML_TEXTWRITER_DTD_ELEM_TEXT: + case XML_TEXTWRITER_DTD_ATTL: + case XML_TEXTWRITER_DTD_ATTL_TEXT: + case XML_TEXTWRITER_DTD_ENTY: + case XML_TEXTWRITER_DTD_ENTY_TEXT: + case XML_TEXTWRITER_DTD_PENT: + count = xmlTextWriterEndDTD(writer); + if (count < 0) + return -1; + sum += count; + break; + case XML_TEXTWRITER_COMMENT: + count = xmlTextWriterEndComment(writer); + if (count < 0) + return -1; + sum += count; + break; + default: + break; + } + } + + if (!writer->indent) { + count = xmlOutputBufferWriteString(writer->out, "\n"); + if (count < 0) + return -1; + sum += count; + } + + sum += xmlTextWriterFlush(writer); + + return sum; +} + +/** + * xmlTextWriterStartComment: + * @writer: the xmlTextWriterPtr + * + * Start an xml comment. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterStartComment(xmlTextWriterPtr writer) +{ + int count; + int sum; + xmlLinkPtr lk; + xmlTextWriterStackEntry *p; + + if (writer == NULL) { + xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, + "xmlTextWriterStartComment : invalid writer!\n"); + return -1; + } + + sum = 0; + lk = xmlListFront(writer->nodes); + if (lk != 0) { + p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); + if (p != 0) { + switch (p->state) { + case XML_TEXTWRITER_TEXT: + case XML_TEXTWRITER_NONE: + break; + case XML_TEXTWRITER_NAME: + /* Output namespace declarations */ + count = xmlTextWriterOutputNSDecl(writer); + if (count < 0) + return -1; + sum += count; + count = xmlOutputBufferWriteString(writer->out, ">"); + if (count < 0) + return -1; + sum += count; + if (writer->indent) { + count = + xmlOutputBufferWriteString(writer->out, "\n"); + if (count < 0) + return -1; + sum += count; + } + p->state = XML_TEXTWRITER_TEXT; + break; + default: + return -1; + } + } + } + + p = (xmlTextWriterStackEntry *) + xmlMalloc(sizeof(xmlTextWriterStackEntry)); + if (p == 0) { + xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, + "xmlTextWriterStartElement : out of memory!\n"); + return -1; + } + + p->name = NULL; + p->state = XML_TEXTWRITER_COMMENT; + + xmlListPushFront(writer->nodes, p); + + if (writer->indent) { + count = xmlTextWriterWriteIndent(writer); + if (count < 0) + return -1; + sum += count; + } + + count = xmlOutputBufferWriteString(writer->out, ""); + if (count < 0) + return -1; + sum += count; + break; + default: + return -1; + } + + if (writer->indent) { + count = xmlOutputBufferWriteString(writer->out, "\n"); + if (count < 0) + return -1; + sum += count; + } + + xmlListPopFront(writer->nodes); + return sum; +} + +/** + * xmlTextWriterWriteFormatComment: + * @writer: the xmlTextWriterPtr + * @format: format string (see printf) + * @...: extra parameters for the format + * + * Write an xml comment. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int XMLCDECL +xmlTextWriterWriteFormatComment(xmlTextWriterPtr writer, + const char *format, ...) +{ + int rc; + va_list ap; + + va_start(ap, format); + + rc = xmlTextWriterWriteVFormatComment(writer, format, ap); + + va_end(ap); + return rc; +} + +/** + * xmlTextWriterWriteVFormatComment: + * @writer: the xmlTextWriterPtr + * @format: format string (see printf) + * @argptr: pointer to the first member of the variable argument list. + * + * Write an xml comment. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterWriteVFormatComment(xmlTextWriterPtr writer, + const char *format, va_list argptr) +{ + int rc; + xmlChar *buf; + + if (writer == NULL) { + xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, + "xmlTextWriterWriteVFormatComment : invalid writer!\n"); + return -1; + } + + buf = xmlTextWriterVSprintf(format, argptr); + if (buf == NULL) + return -1; + + rc = xmlTextWriterWriteComment(writer, buf); + + xmlFree(buf); + return rc; +} + +/** + * xmlTextWriterWriteComment: + * @writer: the xmlTextWriterPtr + * @content: comment string + * + * Write an xml comment. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterWriteComment(xmlTextWriterPtr writer, const xmlChar * content) +{ + int count; + int sum; + + sum = 0; + count = xmlTextWriterStartComment(writer); + if (count < 0) + return -1; + sum += count; + count = xmlTextWriterWriteString(writer, content); + if (count < 0) + return -1; + sum += count; + count = xmlTextWriterEndComment(writer); + if (count < 0) + return -1; + sum += count; + + return sum; +} + +/** + * xmlTextWriterStartElement: + * @writer: the xmlTextWriterPtr + * @name: element name + * + * Start an xml element. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterStartElement(xmlTextWriterPtr writer, const xmlChar * name) +{ + int count; + int sum; + xmlLinkPtr lk; + xmlTextWriterStackEntry *p; + + if ((writer == NULL) || (name == NULL) || (*name == '\0')) + return -1; + + sum = 0; + lk = xmlListFront(writer->nodes); + if (lk != 0) { + p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); + if (p != 0) { + switch (p->state) { + case XML_TEXTWRITER_PI: + case XML_TEXTWRITER_PI_TEXT: + return -1; + case XML_TEXTWRITER_NONE: + break; + case XML_TEXTWRITER_ATTRIBUTE: + count = xmlTextWriterEndAttribute(writer); + if (count < 0) + return -1; + sum += count; + /* fallthrough */ + case XML_TEXTWRITER_NAME: + /* Output namespace declarations */ + count = xmlTextWriterOutputNSDecl(writer); + if (count < 0) + return -1; + sum += count; + count = xmlOutputBufferWriteString(writer->out, ">"); + if (count < 0) + return -1; + sum += count; + if (writer->indent) + count = + xmlOutputBufferWriteString(writer->out, "\n"); + p->state = XML_TEXTWRITER_TEXT; + break; + default: + break; + } + } + } + + p = (xmlTextWriterStackEntry *) + xmlMalloc(sizeof(xmlTextWriterStackEntry)); + if (p == 0) { + xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, + "xmlTextWriterStartElement : out of memory!\n"); + return -1; + } + + p->name = xmlStrdup(name); + if (p->name == 0) { + xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, + "xmlTextWriterStartElement : out of memory!\n"); + xmlFree(p); + return -1; + } + p->state = XML_TEXTWRITER_NAME; + + xmlListPushFront(writer->nodes, p); + + if (writer->indent) { + count = xmlTextWriterWriteIndent(writer); + sum += count; + } + + count = xmlOutputBufferWriteString(writer->out, "<"); + if (count < 0) + return -1; + sum += count; + count = + xmlOutputBufferWriteString(writer->out, (const char *) p->name); + if (count < 0) + return -1; + sum += count; + + return sum; +} + +/** + * xmlTextWriterStartElementNS: + * @writer: the xmlTextWriterPtr + * @prefix: namespace prefix or NULL + * @name: element local name + * @namespaceURI: namespace URI or NULL + * + * Start an xml element with namespace support. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterStartElementNS(xmlTextWriterPtr writer, + const xmlChar * prefix, const xmlChar * name, + const xmlChar * namespaceURI) +{ + int count; + int sum; + xmlChar *buf; + + if ((writer == NULL) || (name == NULL) || (*name == '\0')) + return -1; + + buf = NULL; + if (prefix != 0) { + buf = xmlStrdup(prefix); + buf = xmlStrcat(buf, BAD_CAST ":"); + } + buf = xmlStrcat(buf, name); + + sum = 0; + count = xmlTextWriterStartElement(writer, buf); + xmlFree(buf); + if (count < 0) + return -1; + sum += count; + + if (namespaceURI != 0) { + xmlTextWriterNsStackEntry *p = (xmlTextWriterNsStackEntry *) + xmlMalloc(sizeof(xmlTextWriterNsStackEntry)); + if (p == 0) { + xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, + "xmlTextWriterStartElementNS : out of memory!\n"); + return -1; + } + + buf = xmlStrdup(BAD_CAST "xmlns"); + if (prefix != 0) { + buf = xmlStrcat(buf, BAD_CAST ":"); + buf = xmlStrcat(buf, prefix); + } + + p->prefix = buf; + p->uri = xmlStrdup(namespaceURI); + if (p->uri == 0) { + xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, + "xmlTextWriterStartElementNS : out of memory!\n"); + xmlFree(p); + return -1; + } + p->elem = xmlListFront(writer->nodes); + + xmlListPushFront(writer->nsstack, p); + } + + return sum; +} + +/** + * xmlTextWriterEndElement: + * @writer: the xmlTextWriterPtr + * + * End the current xml element. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterEndElement(xmlTextWriterPtr writer) +{ + int count; + int sum; + xmlLinkPtr lk; + xmlTextWriterStackEntry *p; + + if (writer == NULL) + return -1; + + lk = xmlListFront(writer->nodes); + if (lk == 0) { + xmlListDelete(writer->nsstack); + writer->nsstack = NULL; + return -1; + } + + p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); + if (p == 0) { + xmlListDelete(writer->nsstack); + writer->nsstack = NULL; + return -1; + } + + sum = 0; + switch (p->state) { + case XML_TEXTWRITER_ATTRIBUTE: + count = xmlTextWriterEndAttribute(writer); + if (count < 0) { + xmlListDelete(writer->nsstack); + writer->nsstack = NULL; + return -1; + } + sum += count; + /* fallthrough */ + case XML_TEXTWRITER_NAME: + /* Output namespace declarations */ + count = xmlTextWriterOutputNSDecl(writer); + if (count < 0) + return -1; + sum += count; + + if (writer->indent) /* next element needs indent */ + writer->doindent = 1; + count = xmlOutputBufferWriteString(writer->out, "/>"); + if (count < 0) + return -1; + sum += count; + break; + case XML_TEXTWRITER_TEXT: + if ((writer->indent) && (writer->doindent)) { + count = xmlTextWriterWriteIndent(writer); + sum += count; + writer->doindent = 1; + } else + writer->doindent = 1; + count = xmlOutputBufferWriteString(writer->out, "out, + (const char *) p->name); + if (count < 0) + return -1; + sum += count; + count = xmlOutputBufferWriteString(writer->out, ">"); + if (count < 0) + return -1; + sum += count; + break; + default: + return -1; + } + + if (writer->indent) { + count = xmlOutputBufferWriteString(writer->out, "\n"); + sum += count; + } + + xmlListPopFront(writer->nodes); + return sum; +} + +/** + * xmlTextWriterFullEndElement: + * @writer: the xmlTextWriterPtr + * + * End the current xml element. Writes an end tag even if the element is empty + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterFullEndElement(xmlTextWriterPtr writer) +{ + int count; + int sum; + xmlLinkPtr lk; + xmlTextWriterStackEntry *p; + + if (writer == NULL) + return -1; + + lk = xmlListFront(writer->nodes); + if (lk == 0) + return -1; + + p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); + if (p == 0) + return -1; + + sum = 0; + switch (p->state) { + case XML_TEXTWRITER_ATTRIBUTE: + count = xmlTextWriterEndAttribute(writer); + if (count < 0) + return -1; + sum += count; + /* fallthrough */ + case XML_TEXTWRITER_NAME: + /* Output namespace declarations */ + count = xmlTextWriterOutputNSDecl(writer); + if (count < 0) + return -1; + sum += count; + + count = xmlOutputBufferWriteString(writer->out, ">"); + if (count < 0) + return -1; + sum += count; + if (writer->indent) + writer->doindent = 0; + /* fallthrough */ + case XML_TEXTWRITER_TEXT: + if ((writer->indent) && (writer->doindent)) { + count = xmlTextWriterWriteIndent(writer); + sum += count; + writer->doindent = 1; + } else + writer->doindent = 1; + count = xmlOutputBufferWriteString(writer->out, "out, + (const char *) p->name); + if (count < 0) + return -1; + sum += count; + count = xmlOutputBufferWriteString(writer->out, ">"); + if (count < 0) + return -1; + sum += count; + break; + default: + return -1; + } + + if (writer->indent) { + count = xmlOutputBufferWriteString(writer->out, "\n"); + sum += count; + } + + xmlListPopFront(writer->nodes); + return sum; +} + +/** + * xmlTextWriterWriteFormatRaw: + * @writer: the xmlTextWriterPtr + * @format: format string (see printf) + * @...: extra parameters for the format + * + * Write a formatted raw xml text. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int XMLCDECL +xmlTextWriterWriteFormatRaw(xmlTextWriterPtr writer, const char *format, + ...) +{ + int rc; + va_list ap; + + va_start(ap, format); + + rc = xmlTextWriterWriteVFormatRaw(writer, format, ap); + + va_end(ap); + return rc; +} + +/** + * xmlTextWriterWriteVFormatRaw: + * @writer: the xmlTextWriterPtr + * @format: format string (see printf) + * @argptr: pointer to the first member of the variable argument list. + * + * Write a formatted raw xml text. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterWriteVFormatRaw(xmlTextWriterPtr writer, const char *format, + va_list argptr) +{ + int rc; + xmlChar *buf; + + if (writer == NULL) + return -1; + + buf = xmlTextWriterVSprintf(format, argptr); + if (buf == NULL) + return -1; + + rc = xmlTextWriterWriteRaw(writer, buf); + + xmlFree(buf); + return rc; +} + +/** + * xmlTextWriterWriteRawLen: + * @writer: the xmlTextWriterPtr + * @content: text string + * @len: length of the text string + * + * Write an xml text. + * TODO: what about entities and special chars?? + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterWriteRawLen(xmlTextWriterPtr writer, const xmlChar * content, + int len) +{ + int count; + int sum; + xmlLinkPtr lk; + xmlTextWriterStackEntry *p; + + if (writer == NULL) { + xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, + "xmlTextWriterWriteRawLen : invalid writer!\n"); + return -1; + } + + if ((content == NULL) || (len < 0)) { + xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, + "xmlTextWriterWriteRawLen : invalid content!\n"); + return -1; + } + + sum = 0; + lk = xmlListFront(writer->nodes); + if (lk != 0) { + p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); + count = xmlTextWriterHandleStateDependencies(writer, p); + if (count < 0) + return -1; + sum += count; + } + + if (writer->indent) + writer->doindent = 0; + + if (content != NULL) { + count = + xmlOutputBufferWrite(writer->out, len, (const char *) content); + if (count < 0) + return -1; + sum += count; + } + + return sum; +} + +/** + * xmlTextWriterWriteRaw: + * @writer: the xmlTextWriterPtr + * @content: text string + * + * Write a raw xml text. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterWriteRaw(xmlTextWriterPtr writer, const xmlChar * content) +{ + return xmlTextWriterWriteRawLen(writer, content, xmlStrlen(content)); +} + +/** + * xmlTextWriterWriteFormatString: + * @writer: the xmlTextWriterPtr + * @format: format string (see printf) + * @...: extra parameters for the format + * + * Write a formatted xml text. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int XMLCDECL +xmlTextWriterWriteFormatString(xmlTextWriterPtr writer, const char *format, + ...) +{ + int rc; + va_list ap; + + if ((writer == NULL) || (format == NULL)) + return -1; + + va_start(ap, format); + + rc = xmlTextWriterWriteVFormatString(writer, format, ap); + + va_end(ap); + return rc; +} + +/** + * xmlTextWriterWriteVFormatString: + * @writer: the xmlTextWriterPtr + * @format: format string (see printf) + * @argptr: pointer to the first member of the variable argument list. + * + * Write a formatted xml text. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterWriteVFormatString(xmlTextWriterPtr writer, + const char *format, va_list argptr) +{ + int rc; + xmlChar *buf; + + if ((writer == NULL) || (format == NULL)) + return -1; + + buf = xmlTextWriterVSprintf(format, argptr); + if (buf == NULL) + return -1; + + rc = xmlTextWriterWriteString(writer, buf); + + xmlFree(buf); + return rc; +} + +/** + * xmlTextWriterWriteString: + * @writer: the xmlTextWriterPtr + * @content: text string + * + * Write an xml text. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterWriteString(xmlTextWriterPtr writer, const xmlChar * content) +{ + int count; + int sum; + xmlLinkPtr lk; + xmlTextWriterStackEntry *p; + xmlChar *buf; + + if ((writer == NULL) || (content == NULL)) + return -1; + + sum = 0; + buf = (xmlChar *) content; + lk = xmlListFront(writer->nodes); + if (lk != 0) { + p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); + if (p != 0) { + switch (p->state) { + case XML_TEXTWRITER_NAME: + case XML_TEXTWRITER_TEXT: +#if 0 + buf = NULL; + xmlOutputBufferWriteEscape(writer->out, content, NULL); +#endif + buf = xmlEncodeSpecialChars(NULL, content); + break; + case XML_TEXTWRITER_ATTRIBUTE: + buf = NULL; + xmlBufAttrSerializeTxtContent(writer->out->buffer, + writer->doc, NULL, content); + break; + default: + break; + } + } + } + + if (buf != NULL) { + count = xmlTextWriterWriteRaw(writer, buf); + + if (buf != content) /* buf was allocated by us, so free it */ + xmlFree(buf); + + if (count < 0) + return -1; + sum += count; + } + + return sum; +} + +/** + * xmlOutputBufferWriteBase64: + * @out: the xmlOutputBufferPtr + * @data: binary data + * @len: the number of bytes to encode + * + * Write base64 encoded data to an xmlOutputBuffer. + * Adapted from John Walker's base64.c (http://www.fourmilab.ch/). + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +static int +xmlOutputBufferWriteBase64(xmlOutputBufferPtr out, int len, + const unsigned char *data) +{ + static unsigned char dtable[64] = + {'A','B','C','D','E','F','G','H','I','J','K','L','M', + 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z', + 'a','b','c','d','e','f','g','h','i','j','k','l','m', + 'n','o','p','q','r','s','t','u','v','w','x','y','z', + '0','1','2','3','4','5','6','7','8','9','+','/'}; + + int i; + int linelen; + int count; + int sum; + + if ((out == NULL) || (len < 0) || (data == NULL)) + return(-1); + + linelen = 0; + sum = 0; + + i = 0; + while (1) { + unsigned char igroup[3]; + unsigned char ogroup[4]; + int c; + int n; + + igroup[0] = igroup[1] = igroup[2] = 0; + for (n = 0; n < 3 && i < len; n++, i++) { + c = data[i]; + igroup[n] = (unsigned char) c; + } + + if (n > 0) { + ogroup[0] = dtable[igroup[0] >> 2]; + ogroup[1] = dtable[((igroup[0] & 3) << 4) | (igroup[1] >> 4)]; + ogroup[2] = + dtable[((igroup[1] & 0xF) << 2) | (igroup[2] >> 6)]; + ogroup[3] = dtable[igroup[2] & 0x3F]; + + if (n < 3) { + ogroup[3] = '='; + if (n < 2) { + ogroup[2] = '='; + } + } + + if (linelen >= B64LINELEN) { + count = xmlOutputBufferWrite(out, 2, B64CRLF); + if (count == -1) + return -1; + sum += count; + linelen = 0; + } + count = xmlOutputBufferWrite(out, 4, (const char *) ogroup); + if (count == -1) + return -1; + sum += count; + + linelen += 4; + } + + if (i >= len) + break; + } + + return sum; +} + +/** + * xmlTextWriterWriteBase64: + * @writer: the xmlTextWriterPtr + * @data: binary data + * @start: the position within the data of the first byte to encode + * @len: the number of bytes to encode + * + * Write an base64 encoded xml text. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterWriteBase64(xmlTextWriterPtr writer, const char *data, + int start, int len) +{ + int count; + int sum; + xmlLinkPtr lk; + xmlTextWriterStackEntry *p; + + if ((writer == NULL) || (data == NULL) || (start < 0) || (len < 0)) + return -1; + + sum = 0; + lk = xmlListFront(writer->nodes); + if (lk != 0) { + p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); + if (p != 0) { + count = xmlTextWriterHandleStateDependencies(writer, p); + if (count < 0) + return -1; + sum += count; + } + } + + if (writer->indent) + writer->doindent = 0; + + count = + xmlOutputBufferWriteBase64(writer->out, len, + (unsigned char *) data + start); + if (count < 0) + return -1; + sum += count; + + return sum; +} + +/** + * xmlOutputBufferWriteBinHex: + * @out: the xmlOutputBufferPtr + * @data: binary data + * @len: the number of bytes to encode + * + * Write hqx encoded data to an xmlOutputBuffer. + * ::todo + * + * Returns the bytes written (may be 0 because of buffering) + * or -1 in case of error + */ +static int +xmlOutputBufferWriteBinHex(xmlOutputBufferPtr out, + int len, const unsigned char *data) +{ + int count; + int sum; + static char hex[16] = + {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; + int i; + + if ((out == NULL) || (data == NULL) || (len < 0)) { + return -1; + } + + sum = 0; + for (i = 0; i < len; i++) { + count = + xmlOutputBufferWrite(out, 1, + (const char *) &hex[data[i] >> 4]); + if (count == -1) + return -1; + sum += count; + count = + xmlOutputBufferWrite(out, 1, + (const char *) &hex[data[i] & 0xF]); + if (count == -1) + return -1; + sum += count; + } + + return sum; +} + +/** + * xmlTextWriterWriteBinHex: + * @writer: the xmlTextWriterPtr + * @data: binary data + * @start: the position within the data of the first byte to encode + * @len: the number of bytes to encode + * + * Write a BinHex encoded xml text. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterWriteBinHex(xmlTextWriterPtr writer, const char *data, + int start, int len) +{ + int count; + int sum; + xmlLinkPtr lk; + xmlTextWriterStackEntry *p; + + if ((writer == NULL) || (data == NULL) || (start < 0) || (len < 0)) + return -1; + + sum = 0; + lk = xmlListFront(writer->nodes); + if (lk != 0) { + p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); + if (p != 0) { + count = xmlTextWriterHandleStateDependencies(writer, p); + if (count < 0) + return -1; + sum += count; + } + } + + if (writer->indent) + writer->doindent = 0; + + count = + xmlOutputBufferWriteBinHex(writer->out, len, + (unsigned char *) data + start); + if (count < 0) + return -1; + sum += count; + + return sum; +} + +/** + * xmlTextWriterStartAttribute: + * @writer: the xmlTextWriterPtr + * @name: element name + * + * Start an xml attribute. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterStartAttribute(xmlTextWriterPtr writer, const xmlChar * name) +{ + int count; + int sum; + xmlLinkPtr lk; + xmlTextWriterStackEntry *p; + + if ((writer == NULL) || (name == NULL) || (*name == '\0')) + return -1; + + sum = 0; + lk = xmlListFront(writer->nodes); + if (lk == 0) + return -1; + + p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); + if (p == 0) + return -1; + + switch (p->state) { + case XML_TEXTWRITER_ATTRIBUTE: + count = xmlTextWriterEndAttribute(writer); + if (count < 0) + return -1; + sum += count; + /* fallthrough */ + case XML_TEXTWRITER_NAME: + count = xmlOutputBufferWriteString(writer->out, " "); + if (count < 0) + return -1; + sum += count; + count = + xmlOutputBufferWriteString(writer->out, + (const char *) name); + if (count < 0) + return -1; + sum += count; + count = xmlOutputBufferWriteString(writer->out, "="); + if (count < 0) + return -1; + sum += count; + count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); + if (count < 0) + return -1; + sum += count; + p->state = XML_TEXTWRITER_ATTRIBUTE; + break; + default: + return -1; + } + + return sum; +} + +/** + * xmlTextWriterStartAttributeNS: + * @writer: the xmlTextWriterPtr + * @prefix: namespace prefix or NULL + * @name: element local name + * @namespaceURI: namespace URI or NULL + * + * Start an xml attribute with namespace support. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterStartAttributeNS(xmlTextWriterPtr writer, + const xmlChar * prefix, const xmlChar * name, + const xmlChar * namespaceURI) +{ + int count; + int sum; + xmlChar *buf; + xmlTextWriterNsStackEntry *p; + + if ((writer == NULL) || (name == NULL) || (*name == '\0')) + return -1; + + /* Handle namespace first in case of error */ + if (namespaceURI != 0) { + xmlTextWriterNsStackEntry nsentry, *curns; + + buf = xmlStrdup(BAD_CAST "xmlns"); + if (prefix != 0) { + buf = xmlStrcat(buf, BAD_CAST ":"); + buf = xmlStrcat(buf, prefix); + } + + nsentry.prefix = buf; + nsentry.uri = (xmlChar *)namespaceURI; + nsentry.elem = xmlListFront(writer->nodes); + + curns = (xmlTextWriterNsStackEntry *)xmlListSearch(writer->nsstack, + (void *)&nsentry); + if ((curns != NULL)) { + xmlFree(buf); + if (xmlStrcmp(curns->uri, namespaceURI) == 0) { + /* Namespace already defined on element skip */ + buf = NULL; + } else { + /* Prefix mismatch so error out */ + return -1; + } + } + + /* Do not add namespace decl to list - it is already there */ + if (buf != NULL) { + p = (xmlTextWriterNsStackEntry *) + xmlMalloc(sizeof(xmlTextWriterNsStackEntry)); + if (p == 0) { + xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, + "xmlTextWriterStartAttributeNS : out of memory!\n"); + return -1; + } + + p->prefix = buf; + p->uri = xmlStrdup(namespaceURI); + if (p->uri == 0) { + xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, + "xmlTextWriterStartAttributeNS : out of memory!\n"); + xmlFree(p); + return -1; + } + p->elem = xmlListFront(writer->nodes); + + xmlListPushFront(writer->nsstack, p); + } + } + + buf = NULL; + if (prefix != 0) { + buf = xmlStrdup(prefix); + buf = xmlStrcat(buf, BAD_CAST ":"); + } + buf = xmlStrcat(buf, name); + + sum = 0; + count = xmlTextWriterStartAttribute(writer, buf); + xmlFree(buf); + if (count < 0) + return -1; + sum += count; + + return sum; +} + +/** + * xmlTextWriterEndAttribute: + * @writer: the xmlTextWriterPtr + * + * End the current xml element. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterEndAttribute(xmlTextWriterPtr writer) +{ + int count; + int sum; + xmlLinkPtr lk; + xmlTextWriterStackEntry *p; + + if (writer == NULL) + return -1; + + lk = xmlListFront(writer->nodes); + if (lk == 0) { + return -1; + } + + p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); + if (p == 0) { + return -1; + } + + sum = 0; + switch (p->state) { + case XML_TEXTWRITER_ATTRIBUTE: + p->state = XML_TEXTWRITER_NAME; + + count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); + if (count < 0) { + return -1; + } + sum += count; + break; + default: + return -1; + } + + return sum; +} + +/** + * xmlTextWriterWriteFormatAttribute: + * @writer: the xmlTextWriterPtr + * @name: attribute name + * @format: format string (see printf) + * @...: extra parameters for the format + * + * Write a formatted xml attribute. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int XMLCDECL +xmlTextWriterWriteFormatAttribute(xmlTextWriterPtr writer, + const xmlChar * name, const char *format, + ...) +{ + int rc; + va_list ap; + + va_start(ap, format); + + rc = xmlTextWriterWriteVFormatAttribute(writer, name, format, ap); + + va_end(ap); + return rc; +} + +/** + * xmlTextWriterWriteVFormatAttribute: + * @writer: the xmlTextWriterPtr + * @name: attribute name + * @format: format string (see printf) + * @argptr: pointer to the first member of the variable argument list. + * + * Write a formatted xml attribute. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterWriteVFormatAttribute(xmlTextWriterPtr writer, + const xmlChar * name, + const char *format, va_list argptr) +{ + int rc; + xmlChar *buf; + + if (writer == NULL) + return -1; + + buf = xmlTextWriterVSprintf(format, argptr); + if (buf == NULL) + return -1; + + rc = xmlTextWriterWriteAttribute(writer, name, buf); + + xmlFree(buf); + return rc; +} + +/** + * xmlTextWriterWriteAttribute: + * @writer: the xmlTextWriterPtr + * @name: attribute name + * @content: attribute content + * + * Write an xml attribute. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterWriteAttribute(xmlTextWriterPtr writer, const xmlChar * name, + const xmlChar * content) +{ + int count; + int sum; + + sum = 0; + count = xmlTextWriterStartAttribute(writer, name); + if (count < 0) + return -1; + sum += count; + count = xmlTextWriterWriteString(writer, content); + if (count < 0) + return -1; + sum += count; + count = xmlTextWriterEndAttribute(writer); + if (count < 0) + return -1; + sum += count; + + return sum; +} + +/** + * xmlTextWriterWriteFormatAttributeNS: + * @writer: the xmlTextWriterPtr + * @prefix: namespace prefix + * @name: attribute local name + * @namespaceURI: namespace URI + * @format: format string (see printf) + * @...: extra parameters for the format + * + * Write a formatted xml attribute.with namespace support + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int XMLCDECL +xmlTextWriterWriteFormatAttributeNS(xmlTextWriterPtr writer, + const xmlChar * prefix, + const xmlChar * name, + const xmlChar * namespaceURI, + const char *format, ...) +{ + int rc; + va_list ap; + + va_start(ap, format); + + rc = xmlTextWriterWriteVFormatAttributeNS(writer, prefix, name, + namespaceURI, format, ap); + + va_end(ap); + return rc; +} + +/** + * xmlTextWriterWriteVFormatAttributeNS: + * @writer: the xmlTextWriterPtr + * @prefix: namespace prefix + * @name: attribute local name + * @namespaceURI: namespace URI + * @format: format string (see printf) + * @argptr: pointer to the first member of the variable argument list. + * + * Write a formatted xml attribute.with namespace support + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterWriteVFormatAttributeNS(xmlTextWriterPtr writer, + const xmlChar * prefix, + const xmlChar * name, + const xmlChar * namespaceURI, + const char *format, va_list argptr) +{ + int rc; + xmlChar *buf; + + if (writer == NULL) + return -1; + + buf = xmlTextWriterVSprintf(format, argptr); + if (buf == NULL) + return -1; + + rc = xmlTextWriterWriteAttributeNS(writer, prefix, name, namespaceURI, + buf); + + xmlFree(buf); + return rc; +} + +/** + * xmlTextWriterWriteAttributeNS: + * @writer: the xmlTextWriterPtr + * @prefix: namespace prefix + * @name: attribute local name + * @namespaceURI: namespace URI + * @content: attribute content + * + * Write an xml attribute. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterWriteAttributeNS(xmlTextWriterPtr writer, + const xmlChar * prefix, const xmlChar * name, + const xmlChar * namespaceURI, + const xmlChar * content) +{ + int count; + int sum; + + if ((writer == NULL) || (name == NULL) || (*name == '\0')) + return -1; + + sum = 0; + count = xmlTextWriterStartAttributeNS(writer, prefix, name, namespaceURI); + if (count < 0) + return -1; + sum += count; + count = xmlTextWriterWriteString(writer, content); + if (count < 0) + return -1; + sum += count; + count = xmlTextWriterEndAttribute(writer); + if (count < 0) + return -1; + sum += count; + + return sum; +} + +/** + * xmlTextWriterWriteFormatElement: + * @writer: the xmlTextWriterPtr + * @name: element name + * @format: format string (see printf) + * @...: extra parameters for the format + * + * Write a formatted xml element. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int XMLCDECL +xmlTextWriterWriteFormatElement(xmlTextWriterPtr writer, + const xmlChar * name, const char *format, + ...) +{ + int rc; + va_list ap; + + va_start(ap, format); + + rc = xmlTextWriterWriteVFormatElement(writer, name, format, ap); + + va_end(ap); + return rc; +} + +/** + * xmlTextWriterWriteVFormatElement: + * @writer: the xmlTextWriterPtr + * @name: element name + * @format: format string (see printf) + * @argptr: pointer to the first member of the variable argument list. + * + * Write a formatted xml element. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterWriteVFormatElement(xmlTextWriterPtr writer, + const xmlChar * name, const char *format, + va_list argptr) +{ + int rc; + xmlChar *buf; + + if (writer == NULL) + return -1; + + buf = xmlTextWriterVSprintf(format, argptr); + if (buf == NULL) + return -1; + + rc = xmlTextWriterWriteElement(writer, name, buf); + + xmlFree(buf); + return rc; +} + +/** + * xmlTextWriterWriteElement: + * @writer: the xmlTextWriterPtr + * @name: element name + * @content: element content + * + * Write an xml element. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterWriteElement(xmlTextWriterPtr writer, const xmlChar * name, + const xmlChar * content) +{ + int count; + int sum; + + sum = 0; + count = xmlTextWriterStartElement(writer, name); + if (count == -1) + return -1; + sum += count; + count = xmlTextWriterWriteString(writer, content); + if (count == -1) + return -1; + sum += count; + count = xmlTextWriterEndElement(writer); + if (count == -1) + return -1; + sum += count; + + return sum; +} + +/** + * xmlTextWriterWriteFormatElementNS: + * @writer: the xmlTextWriterPtr + * @prefix: namespace prefix + * @name: element local name + * @namespaceURI: namespace URI + * @format: format string (see printf) + * @...: extra parameters for the format + * + * Write a formatted xml element with namespace support. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int XMLCDECL +xmlTextWriterWriteFormatElementNS(xmlTextWriterPtr writer, + const xmlChar * prefix, + const xmlChar * name, + const xmlChar * namespaceURI, + const char *format, ...) +{ + int rc; + va_list ap; + + va_start(ap, format); + + rc = xmlTextWriterWriteVFormatElementNS(writer, prefix, name, + namespaceURI, format, ap); + + va_end(ap); + return rc; +} + +/** + * xmlTextWriterWriteVFormatElementNS: + * @writer: the xmlTextWriterPtr + * @prefix: namespace prefix + * @name: element local name + * @namespaceURI: namespace URI + * @format: format string (see printf) + * @argptr: pointer to the first member of the variable argument list. + * + * Write a formatted xml element with namespace support. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterWriteVFormatElementNS(xmlTextWriterPtr writer, + const xmlChar * prefix, + const xmlChar * name, + const xmlChar * namespaceURI, + const char *format, va_list argptr) +{ + int rc; + xmlChar *buf; + + if (writer == NULL) + return -1; + + buf = xmlTextWriterVSprintf(format, argptr); + if (buf == NULL) + return -1; + + rc = xmlTextWriterWriteElementNS(writer, prefix, name, namespaceURI, + buf); + + xmlFree(buf); + return rc; +} + +/** + * xmlTextWriterWriteElementNS: + * @writer: the xmlTextWriterPtr + * @prefix: namespace prefix + * @name: element local name + * @namespaceURI: namespace URI + * @content: element content + * + * Write an xml element with namespace support. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterWriteElementNS(xmlTextWriterPtr writer, + const xmlChar * prefix, const xmlChar * name, + const xmlChar * namespaceURI, + const xmlChar * content) +{ + int count; + int sum; + + if ((writer == NULL) || (name == NULL) || (*name == '\0')) + return -1; + + sum = 0; + count = + xmlTextWriterStartElementNS(writer, prefix, name, namespaceURI); + if (count < 0) + return -1; + sum += count; + count = xmlTextWriterWriteString(writer, content); + if (count == -1) + return -1; + sum += count; + count = xmlTextWriterEndElement(writer); + if (count == -1) + return -1; + sum += count; + + return sum; +} + +/** + * xmlTextWriterStartPI: + * @writer: the xmlTextWriterPtr + * @target: PI target + * + * Start an xml PI. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterStartPI(xmlTextWriterPtr writer, const xmlChar * target) +{ + int count; + int sum; + xmlLinkPtr lk; + xmlTextWriterStackEntry *p; + + if ((writer == NULL) || (target == NULL) || (*target == '\0')) + return -1; + + if (xmlStrcasecmp(target, (const xmlChar *) "xml") == 0) { + xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, + "xmlTextWriterStartPI : target name [Xx][Mm][Ll] is reserved for xml standardization!\n"); + return -1; + } + + sum = 0; + lk = xmlListFront(writer->nodes); + if (lk != 0) { + p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); + if (p != 0) { + switch (p->state) { + case XML_TEXTWRITER_ATTRIBUTE: + count = xmlTextWriterEndAttribute(writer); + if (count < 0) + return -1; + sum += count; + /* fallthrough */ + case XML_TEXTWRITER_NAME: + /* Output namespace declarations */ + count = xmlTextWriterOutputNSDecl(writer); + if (count < 0) + return -1; + sum += count; + count = xmlOutputBufferWriteString(writer->out, ">"); + if (count < 0) + return -1; + sum += count; + p->state = XML_TEXTWRITER_TEXT; + break; + case XML_TEXTWRITER_NONE: + case XML_TEXTWRITER_TEXT: + case XML_TEXTWRITER_DTD: + break; + case XML_TEXTWRITER_PI: + case XML_TEXTWRITER_PI_TEXT: + xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, + "xmlTextWriterStartPI : nested PI!\n"); + return -1; + default: + return -1; + } + } + } + + p = (xmlTextWriterStackEntry *) + xmlMalloc(sizeof(xmlTextWriterStackEntry)); + if (p == 0) { + xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, + "xmlTextWriterStartPI : out of memory!\n"); + return -1; + } + + p->name = xmlStrdup(target); + if (p->name == 0) { + xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, + "xmlTextWriterStartPI : out of memory!\n"); + xmlFree(p); + return -1; + } + p->state = XML_TEXTWRITER_PI; + + xmlListPushFront(writer->nodes, p); + + count = xmlOutputBufferWriteString(writer->out, "out, (const char *) p->name); + if (count < 0) + return -1; + sum += count; + + return sum; +} + +/** + * xmlTextWriterEndPI: + * @writer: the xmlTextWriterPtr + * + * End the current xml PI. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterEndPI(xmlTextWriterPtr writer) +{ + int count; + int sum; + xmlLinkPtr lk; + xmlTextWriterStackEntry *p; + + if (writer == NULL) + return -1; + + lk = xmlListFront(writer->nodes); + if (lk == 0) + return 0; + + p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); + if (p == 0) + return 0; + + sum = 0; + switch (p->state) { + case XML_TEXTWRITER_PI: + case XML_TEXTWRITER_PI_TEXT: + count = xmlOutputBufferWriteString(writer->out, "?>"); + if (count < 0) + return -1; + sum += count; + break; + default: + return -1; + } + + if (writer->indent) { + count = xmlOutputBufferWriteString(writer->out, "\n"); + if (count < 0) + return -1; + sum += count; + } + + xmlListPopFront(writer->nodes); + return sum; +} + +/** + * xmlTextWriterWriteFormatPI: + * @writer: the xmlTextWriterPtr + * @target: PI target + * @format: format string (see printf) + * @...: extra parameters for the format + * + * Write a formatted PI. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int XMLCDECL +xmlTextWriterWriteFormatPI(xmlTextWriterPtr writer, const xmlChar * target, + const char *format, ...) +{ + int rc; + va_list ap; + + va_start(ap, format); + + rc = xmlTextWriterWriteVFormatPI(writer, target, format, ap); + + va_end(ap); + return rc; +} + +/** + * xmlTextWriterWriteVFormatPI: + * @writer: the xmlTextWriterPtr + * @target: PI target + * @format: format string (see printf) + * @argptr: pointer to the first member of the variable argument list. + * + * Write a formatted xml PI. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterWriteVFormatPI(xmlTextWriterPtr writer, + const xmlChar * target, const char *format, + va_list argptr) +{ + int rc; + xmlChar *buf; + + if (writer == NULL) + return -1; + + buf = xmlTextWriterVSprintf(format, argptr); + if (buf == NULL) + return -1; + + rc = xmlTextWriterWritePI(writer, target, buf); + + xmlFree(buf); + return rc; +} + +/** + * xmlTextWriterWritePI: + * @writer: the xmlTextWriterPtr + * @target: PI target + * @content: PI content + * + * Write an xml PI. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterWritePI(xmlTextWriterPtr writer, const xmlChar * target, + const xmlChar * content) +{ + int count; + int sum; + + sum = 0; + count = xmlTextWriterStartPI(writer, target); + if (count == -1) + return -1; + sum += count; + if (content != 0) { + count = xmlTextWriterWriteString(writer, content); + if (count == -1) + return -1; + sum += count; + } + count = xmlTextWriterEndPI(writer); + if (count == -1) + return -1; + sum += count; + + return sum; +} + +/** + * xmlTextWriterStartCDATA: + * @writer: the xmlTextWriterPtr + * + * Start an xml CDATA section. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterStartCDATA(xmlTextWriterPtr writer) +{ + int count; + int sum; + xmlLinkPtr lk; + xmlTextWriterStackEntry *p; + + if (writer == NULL) + return -1; + + sum = 0; + lk = xmlListFront(writer->nodes); + if (lk != 0) { + p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); + if (p != 0) { + switch (p->state) { + case XML_TEXTWRITER_NONE: + case XML_TEXTWRITER_TEXT: + case XML_TEXTWRITER_PI: + case XML_TEXTWRITER_PI_TEXT: + break; + case XML_TEXTWRITER_ATTRIBUTE: + count = xmlTextWriterEndAttribute(writer); + if (count < 0) + return -1; + sum += count; + /* fallthrough */ + case XML_TEXTWRITER_NAME: + /* Output namespace declarations */ + count = xmlTextWriterOutputNSDecl(writer); + if (count < 0) + return -1; + sum += count; + count = xmlOutputBufferWriteString(writer->out, ">"); + if (count < 0) + return -1; + sum += count; + p->state = XML_TEXTWRITER_TEXT; + break; + case XML_TEXTWRITER_CDATA: + xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, + "xmlTextWriterStartCDATA : CDATA not allowed in this context!\n"); + return -1; + default: + return -1; + } + } + } + + p = (xmlTextWriterStackEntry *) + xmlMalloc(sizeof(xmlTextWriterStackEntry)); + if (p == 0) { + xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, + "xmlTextWriterStartCDATA : out of memory!\n"); + return -1; + } + + p->name = NULL; + p->state = XML_TEXTWRITER_CDATA; + + xmlListPushFront(writer->nodes, p); + + count = xmlOutputBufferWriteString(writer->out, "nodes); + if (lk == 0) + return -1; + + p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); + if (p == 0) + return -1; + + sum = 0; + switch (p->state) { + case XML_TEXTWRITER_CDATA: + count = xmlOutputBufferWriteString(writer->out, "]]>"); + if (count < 0) + return -1; + sum += count; + break; + default: + return -1; + } + + xmlListPopFront(writer->nodes); + return sum; +} + +/** + * xmlTextWriterWriteFormatCDATA: + * @writer: the xmlTextWriterPtr + * @format: format string (see printf) + * @...: extra parameters for the format + * + * Write a formatted xml CDATA. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int XMLCDECL +xmlTextWriterWriteFormatCDATA(xmlTextWriterPtr writer, const char *format, + ...) +{ + int rc; + va_list ap; + + va_start(ap, format); + + rc = xmlTextWriterWriteVFormatCDATA(writer, format, ap); + + va_end(ap); + return rc; +} + +/** + * xmlTextWriterWriteVFormatCDATA: + * @writer: the xmlTextWriterPtr + * @format: format string (see printf) + * @argptr: pointer to the first member of the variable argument list. + * + * Write a formatted xml CDATA. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterWriteVFormatCDATA(xmlTextWriterPtr writer, const char *format, + va_list argptr) +{ + int rc; + xmlChar *buf; + + if (writer == NULL) + return -1; + + buf = xmlTextWriterVSprintf(format, argptr); + if (buf == NULL) + return -1; + + rc = xmlTextWriterWriteCDATA(writer, buf); + + xmlFree(buf); + return rc; +} + +/** + * xmlTextWriterWriteCDATA: + * @writer: the xmlTextWriterPtr + * @content: CDATA content + * + * Write an xml CDATA. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterWriteCDATA(xmlTextWriterPtr writer, const xmlChar * content) +{ + int count; + int sum; + + sum = 0; + count = xmlTextWriterStartCDATA(writer); + if (count == -1) + return -1; + sum += count; + if (content != 0) { + count = xmlTextWriterWriteString(writer, content); + if (count == -1) + return -1; + sum += count; + } + count = xmlTextWriterEndCDATA(writer); + if (count == -1) + return -1; + sum += count; + + return sum; +} + +/** + * xmlTextWriterStartDTD: + * @writer: the xmlTextWriterPtr + * @name: the name of the DTD + * @pubid: the public identifier, which is an alternative to the system identifier + * @sysid: the system identifier, which is the URI of the DTD + * + * Start an xml DTD. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterStartDTD(xmlTextWriterPtr writer, + const xmlChar * name, + const xmlChar * pubid, const xmlChar * sysid) +{ + int count; + int sum; + xmlLinkPtr lk; + xmlTextWriterStackEntry *p; + + if (writer == NULL || name == NULL || *name == '\0') + return -1; + + sum = 0; + lk = xmlListFront(writer->nodes); + if ((lk != NULL) && (xmlLinkGetData(lk) != NULL)) { + xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, + "xmlTextWriterStartDTD : DTD allowed only in prolog!\n"); + return -1; + } + + p = (xmlTextWriterStackEntry *) + xmlMalloc(sizeof(xmlTextWriterStackEntry)); + if (p == 0) { + xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, + "xmlTextWriterStartDTD : out of memory!\n"); + return -1; + } + + p->name = xmlStrdup(name); + if (p->name == 0) { + xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, + "xmlTextWriterStartDTD : out of memory!\n"); + xmlFree(p); + return -1; + } + p->state = XML_TEXTWRITER_DTD; + + xmlListPushFront(writer->nodes, p); + + count = xmlOutputBufferWriteString(writer->out, "out, (const char *) name); + if (count < 0) + return -1; + sum += count; + + if (pubid != 0) { + if (sysid == 0) { + xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, + "xmlTextWriterStartDTD : system identifier needed!\n"); + return -1; + } + + if (writer->indent) + count = xmlOutputBufferWrite(writer->out, 1, "\n"); + else + count = xmlOutputBufferWrite(writer->out, 1, " "); + if (count < 0) + return -1; + sum += count; + + count = xmlOutputBufferWriteString(writer->out, "PUBLIC "); + if (count < 0) + return -1; + sum += count; + + count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); + if (count < 0) + return -1; + sum += count; + + count = + xmlOutputBufferWriteString(writer->out, (const char *) pubid); + if (count < 0) + return -1; + sum += count; + + count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); + if (count < 0) + return -1; + sum += count; + } + + if (sysid != 0) { + if (pubid == 0) { + if (writer->indent) + count = xmlOutputBufferWrite(writer->out, 1, "\n"); + else + count = xmlOutputBufferWrite(writer->out, 1, " "); + if (count < 0) + return -1; + sum += count; + count = xmlOutputBufferWriteString(writer->out, "SYSTEM "); + if (count < 0) + return -1; + sum += count; + } else { + if (writer->indent) + count = xmlOutputBufferWriteString(writer->out, "\n "); + else + count = xmlOutputBufferWrite(writer->out, 1, " "); + if (count < 0) + return -1; + sum += count; + } + + count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); + if (count < 0) + return -1; + sum += count; + + count = + xmlOutputBufferWriteString(writer->out, (const char *) sysid); + if (count < 0) + return -1; + sum += count; + + count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); + if (count < 0) + return -1; + sum += count; + } + + return sum; +} + +/** + * xmlTextWriterEndDTD: + * @writer: the xmlTextWriterPtr + * + * End an xml DTD. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterEndDTD(xmlTextWriterPtr writer) +{ + int loop; + int count; + int sum; + xmlLinkPtr lk; + xmlTextWriterStackEntry *p; + + if (writer == NULL) + return -1; + + sum = 0; + loop = 1; + while (loop) { + lk = xmlListFront(writer->nodes); + if (lk == NULL) + break; + p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); + if (p == 0) + break; + switch (p->state) { + case XML_TEXTWRITER_DTD_TEXT: + count = xmlOutputBufferWriteString(writer->out, "]"); + if (count < 0) + return -1; + sum += count; + /* fallthrough */ + case XML_TEXTWRITER_DTD: + count = xmlOutputBufferWriteString(writer->out, ">"); + + if (writer->indent) { + if (count < 0) + return -1; + sum += count; + count = xmlOutputBufferWriteString(writer->out, "\n"); + } + + xmlListPopFront(writer->nodes); + break; + case XML_TEXTWRITER_DTD_ELEM: + case XML_TEXTWRITER_DTD_ELEM_TEXT: + count = xmlTextWriterEndDTDElement(writer); + break; + case XML_TEXTWRITER_DTD_ATTL: + case XML_TEXTWRITER_DTD_ATTL_TEXT: + count = xmlTextWriterEndDTDAttlist(writer); + break; + case XML_TEXTWRITER_DTD_ENTY: + case XML_TEXTWRITER_DTD_PENT: + case XML_TEXTWRITER_DTD_ENTY_TEXT: + count = xmlTextWriterEndDTDEntity(writer); + break; + case XML_TEXTWRITER_COMMENT: + count = xmlTextWriterEndComment(writer); + break; + default: + loop = 0; + continue; + } + + if (count < 0) + return -1; + sum += count; + } + + return sum; +} + +/** + * xmlTextWriterWriteFormatDTD: + * @writer: the xmlTextWriterPtr + * @name: the name of the DTD + * @pubid: the public identifier, which is an alternative to the system identifier + * @sysid: the system identifier, which is the URI of the DTD + * @format: format string (see printf) + * @...: extra parameters for the format + * + * Write a DTD with a formatted markup declarations part. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int XMLCDECL +xmlTextWriterWriteFormatDTD(xmlTextWriterPtr writer, + const xmlChar * name, + const xmlChar * pubid, + const xmlChar * sysid, const char *format, ...) +{ + int rc; + va_list ap; + + va_start(ap, format); + + rc = xmlTextWriterWriteVFormatDTD(writer, name, pubid, sysid, format, + ap); + + va_end(ap); + return rc; +} + +/** + * xmlTextWriterWriteVFormatDTD: + * @writer: the xmlTextWriterPtr + * @name: the name of the DTD + * @pubid: the public identifier, which is an alternative to the system identifier + * @sysid: the system identifier, which is the URI of the DTD + * @format: format string (see printf) + * @argptr: pointer to the first member of the variable argument list. + * + * Write a DTD with a formatted markup declarations part. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterWriteVFormatDTD(xmlTextWriterPtr writer, + const xmlChar * name, + const xmlChar * pubid, + const xmlChar * sysid, + const char *format, va_list argptr) +{ + int rc; + xmlChar *buf; + + if (writer == NULL) + return -1; + + buf = xmlTextWriterVSprintf(format, argptr); + if (buf == NULL) + return -1; + + rc = xmlTextWriterWriteDTD(writer, name, pubid, sysid, buf); + + xmlFree(buf); + return rc; +} + +/** + * xmlTextWriterWriteDTD: + * @writer: the xmlTextWriterPtr + * @name: the name of the DTD + * @pubid: the public identifier, which is an alternative to the system identifier + * @sysid: the system identifier, which is the URI of the DTD + * @subset: string content of the DTD + * + * Write a DTD. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterWriteDTD(xmlTextWriterPtr writer, + const xmlChar * name, + const xmlChar * pubid, + const xmlChar * sysid, const xmlChar * subset) +{ + int count; + int sum; + + sum = 0; + count = xmlTextWriterStartDTD(writer, name, pubid, sysid); + if (count == -1) + return -1; + sum += count; + if (subset != 0) { + count = xmlTextWriterWriteString(writer, subset); + if (count == -1) + return -1; + sum += count; + } + count = xmlTextWriterEndDTD(writer); + if (count == -1) + return -1; + sum += count; + + return sum; +} + +/** + * xmlTextWriterStartDTDElement: + * @writer: the xmlTextWriterPtr + * @name: the name of the DTD element + * + * Start an xml DTD element. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterStartDTDElement(xmlTextWriterPtr writer, const xmlChar * name) +{ + int count; + int sum; + xmlLinkPtr lk; + xmlTextWriterStackEntry *p; + + if (writer == NULL || name == NULL || *name == '\0') + return -1; + + sum = 0; + lk = xmlListFront(writer->nodes); + if (lk == 0) { + return -1; + } + + p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); + if (p != 0) { + switch (p->state) { + case XML_TEXTWRITER_DTD: + count = xmlOutputBufferWriteString(writer->out, " ["); + if (count < 0) + return -1; + sum += count; + if (writer->indent) { + count = xmlOutputBufferWriteString(writer->out, "\n"); + if (count < 0) + return -1; + sum += count; + } + p->state = XML_TEXTWRITER_DTD_TEXT; + /* fallthrough */ + case XML_TEXTWRITER_DTD_TEXT: + case XML_TEXTWRITER_NONE: + break; + default: + return -1; + } + } + + p = (xmlTextWriterStackEntry *) + xmlMalloc(sizeof(xmlTextWriterStackEntry)); + if (p == 0) { + xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, + "xmlTextWriterStartDTDElement : out of memory!\n"); + return -1; + } + + p->name = xmlStrdup(name); + if (p->name == 0) { + xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, + "xmlTextWriterStartDTDElement : out of memory!\n"); + xmlFree(p); + return -1; + } + p->state = XML_TEXTWRITER_DTD_ELEM; + + xmlListPushFront(writer->nodes, p); + + if (writer->indent) { + count = xmlTextWriterWriteIndent(writer); + if (count < 0) + return -1; + sum += count; + } + + count = xmlOutputBufferWriteString(writer->out, "out, (const char *) name); + if (count < 0) + return -1; + sum += count; + + return sum; +} + +/** + * xmlTextWriterEndDTDElement: + * @writer: the xmlTextWriterPtr + * + * End an xml DTD element. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterEndDTDElement(xmlTextWriterPtr writer) +{ + int count; + int sum; + xmlLinkPtr lk; + xmlTextWriterStackEntry *p; + + if (writer == NULL) + return -1; + + sum = 0; + lk = xmlListFront(writer->nodes); + if (lk == 0) + return -1; + + p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); + if (p == 0) + return -1; + + switch (p->state) { + case XML_TEXTWRITER_DTD_ELEM: + case XML_TEXTWRITER_DTD_ELEM_TEXT: + count = xmlOutputBufferWriteString(writer->out, ">"); + if (count < 0) + return -1; + sum += count; + break; + default: + return -1; + } + + if (writer->indent) { + count = xmlOutputBufferWriteString(writer->out, "\n"); + if (count < 0) + return -1; + sum += count; + } + + xmlListPopFront(writer->nodes); + return sum; +} + +/** + * xmlTextWriterWriteFormatDTDElement: + * @writer: the xmlTextWriterPtr + * @name: the name of the DTD element + * @format: format string (see printf) + * @...: extra parameters for the format + * + * Write a formatted DTD element. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int XMLCDECL +xmlTextWriterWriteFormatDTDElement(xmlTextWriterPtr writer, + const xmlChar * name, + const char *format, ...) +{ + int rc; + va_list ap; + + va_start(ap, format); + + rc = xmlTextWriterWriteVFormatDTDElement(writer, name, format, ap); + + va_end(ap); + return rc; +} + +/** + * xmlTextWriterWriteVFormatDTDElement: + * @writer: the xmlTextWriterPtr + * @name: the name of the DTD element + * @format: format string (see printf) + * @argptr: pointer to the first member of the variable argument list. + * + * Write a formatted DTD element. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterWriteVFormatDTDElement(xmlTextWriterPtr writer, + const xmlChar * name, + const char *format, va_list argptr) +{ + int rc; + xmlChar *buf; + + if (writer == NULL) + return -1; + + buf = xmlTextWriterVSprintf(format, argptr); + if (buf == NULL) + return -1; + + rc = xmlTextWriterWriteDTDElement(writer, name, buf); + + xmlFree(buf); + return rc; +} + +/** + * xmlTextWriterWriteDTDElement: + * @writer: the xmlTextWriterPtr + * @name: the name of the DTD element + * @content: content of the element + * + * Write a DTD element. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterWriteDTDElement(xmlTextWriterPtr writer, + const xmlChar * name, const xmlChar * content) +{ + int count; + int sum; + + if (content == NULL) + return -1; + + sum = 0; + count = xmlTextWriterStartDTDElement(writer, name); + if (count == -1) + return -1; + sum += count; + + count = xmlTextWriterWriteString(writer, content); + if (count == -1) + return -1; + sum += count; + + count = xmlTextWriterEndDTDElement(writer); + if (count == -1) + return -1; + sum += count; + + return sum; +} + +/** + * xmlTextWriterStartDTDAttlist: + * @writer: the xmlTextWriterPtr + * @name: the name of the DTD ATTLIST + * + * Start an xml DTD ATTLIST. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterStartDTDAttlist(xmlTextWriterPtr writer, const xmlChar * name) +{ + int count; + int sum; + xmlLinkPtr lk; + xmlTextWriterStackEntry *p; + + if (writer == NULL || name == NULL || *name == '\0') + return -1; + + sum = 0; + lk = xmlListFront(writer->nodes); + if (lk == 0) { + return -1; + } + + p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); + if (p != 0) { + switch (p->state) { + case XML_TEXTWRITER_DTD: + count = xmlOutputBufferWriteString(writer->out, " ["); + if (count < 0) + return -1; + sum += count; + if (writer->indent) { + count = xmlOutputBufferWriteString(writer->out, "\n"); + if (count < 0) + return -1; + sum += count; + } + p->state = XML_TEXTWRITER_DTD_TEXT; + /* fallthrough */ + case XML_TEXTWRITER_DTD_TEXT: + case XML_TEXTWRITER_NONE: + break; + default: + return -1; + } + } + + p = (xmlTextWriterStackEntry *) + xmlMalloc(sizeof(xmlTextWriterStackEntry)); + if (p == 0) { + xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, + "xmlTextWriterStartDTDAttlist : out of memory!\n"); + return -1; + } + + p->name = xmlStrdup(name); + if (p->name == 0) { + xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, + "xmlTextWriterStartDTDAttlist : out of memory!\n"); + xmlFree(p); + return -1; + } + p->state = XML_TEXTWRITER_DTD_ATTL; + + xmlListPushFront(writer->nodes, p); + + if (writer->indent) { + count = xmlTextWriterWriteIndent(writer); + if (count < 0) + return -1; + sum += count; + } + + count = xmlOutputBufferWriteString(writer->out, "out, (const char *) name); + if (count < 0) + return -1; + sum += count; + + return sum; +} + +/** + * xmlTextWriterEndDTDAttlist: + * @writer: the xmlTextWriterPtr + * + * End an xml DTD attribute list. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterEndDTDAttlist(xmlTextWriterPtr writer) +{ + int count; + int sum; + xmlLinkPtr lk; + xmlTextWriterStackEntry *p; + + if (writer == NULL) + return -1; + + sum = 0; + lk = xmlListFront(writer->nodes); + if (lk == 0) + return -1; + + p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); + if (p == 0) + return -1; + + switch (p->state) { + case XML_TEXTWRITER_DTD_ATTL: + case XML_TEXTWRITER_DTD_ATTL_TEXT: + count = xmlOutputBufferWriteString(writer->out, ">"); + if (count < 0) + return -1; + sum += count; + break; + default: + return -1; + } + + if (writer->indent) { + count = xmlOutputBufferWriteString(writer->out, "\n"); + if (count < 0) + return -1; + sum += count; + } + + xmlListPopFront(writer->nodes); + return sum; +} + +/** + * xmlTextWriterWriteFormatDTDAttlist: + * @writer: the xmlTextWriterPtr + * @name: the name of the DTD ATTLIST + * @format: format string (see printf) + * @...: extra parameters for the format + * + * Write a formatted DTD ATTLIST. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int XMLCDECL +xmlTextWriterWriteFormatDTDAttlist(xmlTextWriterPtr writer, + const xmlChar * name, + const char *format, ...) +{ + int rc; + va_list ap; + + va_start(ap, format); + + rc = xmlTextWriterWriteVFormatDTDAttlist(writer, name, format, ap); + + va_end(ap); + return rc; +} + +/** + * xmlTextWriterWriteVFormatDTDAttlist: + * @writer: the xmlTextWriterPtr + * @name: the name of the DTD ATTLIST + * @format: format string (see printf) + * @argptr: pointer to the first member of the variable argument list. + * + * Write a formatted DTD ATTLIST. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterWriteVFormatDTDAttlist(xmlTextWriterPtr writer, + const xmlChar * name, + const char *format, va_list argptr) +{ + int rc; + xmlChar *buf; + + if (writer == NULL) + return -1; + + buf = xmlTextWriterVSprintf(format, argptr); + if (buf == NULL) + return -1; + + rc = xmlTextWriterWriteDTDAttlist(writer, name, buf); + + xmlFree(buf); + return rc; +} + +/** + * xmlTextWriterWriteDTDAttlist: + * @writer: the xmlTextWriterPtr + * @name: the name of the DTD ATTLIST + * @content: content of the ATTLIST + * + * Write a DTD ATTLIST. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterWriteDTDAttlist(xmlTextWriterPtr writer, + const xmlChar * name, const xmlChar * content) +{ + int count; + int sum; + + if (content == NULL) + return -1; + + sum = 0; + count = xmlTextWriterStartDTDAttlist(writer, name); + if (count == -1) + return -1; + sum += count; + + count = xmlTextWriterWriteString(writer, content); + if (count == -1) + return -1; + sum += count; + + count = xmlTextWriterEndDTDAttlist(writer); + if (count == -1) + return -1; + sum += count; + + return sum; +} + +/** + * xmlTextWriterStartDTDEntity: + * @writer: the xmlTextWriterPtr + * @pe: TRUE if this is a parameter entity, FALSE if not + * @name: the name of the DTD ATTLIST + * + * Start an xml DTD ATTLIST. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterStartDTDEntity(xmlTextWriterPtr writer, + int pe, const xmlChar * name) +{ + int count; + int sum; + xmlLinkPtr lk; + xmlTextWriterStackEntry *p; + + if (writer == NULL || name == NULL || *name == '\0') + return -1; + + sum = 0; + lk = xmlListFront(writer->nodes); + if (lk != 0) { + + p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); + if (p != 0) { + switch (p->state) { + case XML_TEXTWRITER_DTD: + count = xmlOutputBufferWriteString(writer->out, " ["); + if (count < 0) + return -1; + sum += count; + if (writer->indent) { + count = + xmlOutputBufferWriteString(writer->out, "\n"); + if (count < 0) + return -1; + sum += count; + } + p->state = XML_TEXTWRITER_DTD_TEXT; + /* fallthrough */ + case XML_TEXTWRITER_DTD_TEXT: + case XML_TEXTWRITER_NONE: + break; + default: + return -1; + } + } + } + + p = (xmlTextWriterStackEntry *) + xmlMalloc(sizeof(xmlTextWriterStackEntry)); + if (p == 0) { + xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, + "xmlTextWriterStartDTDElement : out of memory!\n"); + return -1; + } + + p->name = xmlStrdup(name); + if (p->name == 0) { + xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY, + "xmlTextWriterStartDTDElement : out of memory!\n"); + xmlFree(p); + return -1; + } + + if (pe != 0) + p->state = XML_TEXTWRITER_DTD_PENT; + else + p->state = XML_TEXTWRITER_DTD_ENTY; + + xmlListPushFront(writer->nodes, p); + + if (writer->indent) { + count = xmlTextWriterWriteIndent(writer); + if (count < 0) + return -1; + sum += count; + } + + count = xmlOutputBufferWriteString(writer->out, "out, "% "); + if (count < 0) + return -1; + sum += count; + } + + count = xmlOutputBufferWriteString(writer->out, (const char *) name); + if (count < 0) + return -1; + sum += count; + + return sum; +} + +/** + * xmlTextWriterEndDTDEntity: + * @writer: the xmlTextWriterPtr + * + * End an xml DTD entity. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterEndDTDEntity(xmlTextWriterPtr writer) +{ + int count; + int sum; + xmlLinkPtr lk; + xmlTextWriterStackEntry *p; + + if (writer == NULL) + return -1; + + sum = 0; + lk = xmlListFront(writer->nodes); + if (lk == 0) + return -1; + + p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); + if (p == 0) + return -1; + + switch (p->state) { + case XML_TEXTWRITER_DTD_ENTY_TEXT: + count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); + if (count < 0) + return -1; + sum += count; + case XML_TEXTWRITER_DTD_ENTY: + case XML_TEXTWRITER_DTD_PENT: + count = xmlOutputBufferWriteString(writer->out, ">"); + if (count < 0) + return -1; + sum += count; + break; + default: + return -1; + } + + if (writer->indent) { + count = xmlOutputBufferWriteString(writer->out, "\n"); + if (count < 0) + return -1; + sum += count; + } + + xmlListPopFront(writer->nodes); + return sum; +} + +/** + * xmlTextWriterWriteFormatDTDInternalEntity: + * @writer: the xmlTextWriterPtr + * @pe: TRUE if this is a parameter entity, FALSE if not + * @name: the name of the DTD entity + * @format: format string (see printf) + * @...: extra parameters for the format + * + * Write a formatted DTD internal entity. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int XMLCDECL +xmlTextWriterWriteFormatDTDInternalEntity(xmlTextWriterPtr writer, + int pe, + const xmlChar * name, + const char *format, ...) +{ + int rc; + va_list ap; + + va_start(ap, format); + + rc = xmlTextWriterWriteVFormatDTDInternalEntity(writer, pe, name, + format, ap); + + va_end(ap); + return rc; +} + +/** + * xmlTextWriterWriteVFormatDTDInternalEntity: + * @writer: the xmlTextWriterPtr + * @pe: TRUE if this is a parameter entity, FALSE if not + * @name: the name of the DTD entity + * @format: format string (see printf) + * @argptr: pointer to the first member of the variable argument list. + * + * Write a formatted DTD internal entity. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterWriteVFormatDTDInternalEntity(xmlTextWriterPtr writer, + int pe, + const xmlChar * name, + const char *format, + va_list argptr) +{ + int rc; + xmlChar *buf; + + if (writer == NULL) + return -1; + + buf = xmlTextWriterVSprintf(format, argptr); + if (buf == NULL) + return -1; + + rc = xmlTextWriterWriteDTDInternalEntity(writer, pe, name, buf); + + xmlFree(buf); + return rc; +} + +/** + * xmlTextWriterWriteDTDEntity: + * @writer: the xmlTextWriterPtr + * @pe: TRUE if this is a parameter entity, FALSE if not + * @name: the name of the DTD entity + * @pubid: the public identifier, which is an alternative to the system identifier + * @sysid: the system identifier, which is the URI of the DTD + * @ndataid: the xml notation name. + * @content: content of the entity + * + * Write a DTD entity. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterWriteDTDEntity(xmlTextWriterPtr writer, + int pe, + const xmlChar * name, + const xmlChar * pubid, + const xmlChar * sysid, + const xmlChar * ndataid, + const xmlChar * content) +{ + if ((content == NULL) && (pubid == NULL) && (sysid == NULL)) + return -1; + if ((pe != 0) && (ndataid != NULL)) + return -1; + + if ((pubid == NULL) && (sysid == NULL)) + return xmlTextWriterWriteDTDInternalEntity(writer, pe, name, + content); + + return xmlTextWriterWriteDTDExternalEntity(writer, pe, name, pubid, + sysid, ndataid); +} + +/** + * xmlTextWriterWriteDTDInternalEntity: + * @writer: the xmlTextWriterPtr + * @pe: TRUE if this is a parameter entity, FALSE if not + * @name: the name of the DTD entity + * @content: content of the entity + * + * Write a DTD internal entity. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterWriteDTDInternalEntity(xmlTextWriterPtr writer, + int pe, + const xmlChar * name, + const xmlChar * content) +{ + int count; + int sum; + + if ((name == NULL) || (*name == '\0') || (content == NULL)) + return -1; + + sum = 0; + count = xmlTextWriterStartDTDEntity(writer, pe, name); + if (count == -1) + return -1; + sum += count; + + count = xmlTextWriterWriteString(writer, content); + if (count == -1) + return -1; + sum += count; + + count = xmlTextWriterEndDTDEntity(writer); + if (count == -1) + return -1; + sum += count; + + return sum; +} + +/** + * xmlTextWriterWriteDTDExternalEntity: + * @writer: the xmlTextWriterPtr + * @pe: TRUE if this is a parameter entity, FALSE if not + * @name: the name of the DTD entity + * @pubid: the public identifier, which is an alternative to the system identifier + * @sysid: the system identifier, which is the URI of the DTD + * @ndataid: the xml notation name. + * + * Write a DTD external entity. The entity must have been started with xmlTextWriterStartDTDEntity + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterWriteDTDExternalEntity(xmlTextWriterPtr writer, + int pe, + const xmlChar * name, + const xmlChar * pubid, + const xmlChar * sysid, + const xmlChar * ndataid) +{ + int count; + int sum; + + if (((pubid == NULL) && (sysid == NULL))) + return -1; + if ((pe != 0) && (ndataid != NULL)) + return -1; + + sum = 0; + count = xmlTextWriterStartDTDEntity(writer, pe, name); + if (count == -1) + return -1; + sum += count; + + count = + xmlTextWriterWriteDTDExternalEntityContents(writer, pubid, sysid, + ndataid); + if (count < 0) + return -1; + sum += count; + + count = xmlTextWriterEndDTDEntity(writer); + if (count == -1) + return -1; + sum += count; + + return sum; +} + +/** + * xmlTextWriterWriteDTDExternalEntityContents: + * @writer: the xmlTextWriterPtr + * @pubid: the public identifier, which is an alternative to the system identifier + * @sysid: the system identifier, which is the URI of the DTD + * @ndataid: the xml notation name. + * + * Write the contents of a DTD external entity. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterWriteDTDExternalEntityContents(xmlTextWriterPtr writer, + const xmlChar * pubid, + const xmlChar * sysid, + const xmlChar * ndataid) +{ + int count; + int sum; + xmlLinkPtr lk; + xmlTextWriterStackEntry *p; + + if (writer == NULL) { + xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, + "xmlTextWriterWriteDTDExternalEntityContents: xmlTextWriterPtr invalid!\n"); + return -1; + } + + sum = 0; + lk = xmlListFront(writer->nodes); + if (lk == 0) { + xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, + "xmlTextWriterWriteDTDExternalEntityContents: you must call xmlTextWriterStartDTDEntity before the call to this function!\n"); + return -1; + } + + p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); + if (p == 0) + return -1; + + switch (p->state) { + case XML_TEXTWRITER_DTD_ENTY: + break; + case XML_TEXTWRITER_DTD_PENT: + if (ndataid != NULL) { + xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, + "xmlTextWriterWriteDTDExternalEntityContents: notation not allowed with parameter entities!\n"); + return -1; + } + break; + default: + xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, + "xmlTextWriterWriteDTDExternalEntityContents: you must call xmlTextWriterStartDTDEntity before the call to this function!\n"); + return -1; + } + + if (pubid != 0) { + if (sysid == 0) { + xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR, + "xmlTextWriterWriteDTDExternalEntityContents: system identifier needed!\n"); + return -1; + } + + count = xmlOutputBufferWriteString(writer->out, " PUBLIC "); + if (count < 0) + return -1; + sum += count; + + count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); + if (count < 0) + return -1; + sum += count; + + count = + xmlOutputBufferWriteString(writer->out, (const char *) pubid); + if (count < 0) + return -1; + sum += count; + + count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); + if (count < 0) + return -1; + sum += count; + } + + if (sysid != 0) { + if (pubid == 0) { + count = xmlOutputBufferWriteString(writer->out, " SYSTEM"); + if (count < 0) + return -1; + sum += count; + } + + count = xmlOutputBufferWriteString(writer->out, " "); + if (count < 0) + return -1; + sum += count; + + count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); + if (count < 0) + return -1; + sum += count; + + count = + xmlOutputBufferWriteString(writer->out, (const char *) sysid); + if (count < 0) + return -1; + sum += count; + + count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); + if (count < 0) + return -1; + sum += count; + } + + if (ndataid != NULL) { + count = xmlOutputBufferWriteString(writer->out, " NDATA "); + if (count < 0) + return -1; + sum += count; + + count = + xmlOutputBufferWriteString(writer->out, + (const char *) ndataid); + if (count < 0) + return -1; + sum += count; + } + + return sum; +} + +/** + * xmlTextWriterWriteDTDNotation: + * @writer: the xmlTextWriterPtr + * @name: the name of the xml notation + * @pubid: the public identifier, which is an alternative to the system identifier + * @sysid: the system identifier, which is the URI of the DTD + * + * Write a DTD entity. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterWriteDTDNotation(xmlTextWriterPtr writer, + const xmlChar * name, + const xmlChar * pubid, const xmlChar * sysid) +{ + int count; + int sum; + xmlLinkPtr lk; + xmlTextWriterStackEntry *p; + + if (writer == NULL || name == NULL || *name == '\0') + return -1; + + sum = 0; + lk = xmlListFront(writer->nodes); + if (lk == 0) { + return -1; + } + + p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); + if (p != 0) { + switch (p->state) { + case XML_TEXTWRITER_DTD: + count = xmlOutputBufferWriteString(writer->out, " ["); + if (count < 0) + return -1; + sum += count; + if (writer->indent) { + count = xmlOutputBufferWriteString(writer->out, "\n"); + if (count < 0) + return -1; + sum += count; + } + p->state = XML_TEXTWRITER_DTD_TEXT; + /* fallthrough */ + case XML_TEXTWRITER_DTD_TEXT: + break; + default: + return -1; + } + } + + if (writer->indent) { + count = xmlTextWriterWriteIndent(writer); + if (count < 0) + return -1; + sum += count; + } + + count = xmlOutputBufferWriteString(writer->out, "out, (const char *) name); + if (count < 0) + return -1; + sum += count; + + if (pubid != 0) { + count = xmlOutputBufferWriteString(writer->out, " PUBLIC "); + if (count < 0) + return -1; + sum += count; + count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); + if (count < 0) + return -1; + sum += count; + count = + xmlOutputBufferWriteString(writer->out, (const char *) pubid); + if (count < 0) + return -1; + sum += count; + count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); + if (count < 0) + return -1; + sum += count; + } + + if (sysid != 0) { + if (pubid == 0) { + count = xmlOutputBufferWriteString(writer->out, " SYSTEM"); + if (count < 0) + return -1; + sum += count; + } + count = xmlOutputBufferWriteString(writer->out, " "); + if (count < 0) + return -1; + sum += count; + count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); + if (count < 0) + return -1; + sum += count; + count = + xmlOutputBufferWriteString(writer->out, (const char *) sysid); + if (count < 0) + return -1; + sum += count; + count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar); + if (count < 0) + return -1; + sum += count; + } + + count = xmlOutputBufferWriteString(writer->out, ">"); + if (count < 0) + return -1; + sum += count; + + return sum; +} + +/** + * xmlTextWriterFlush: + * @writer: the xmlTextWriterPtr + * + * Flush the output buffer. + * + * Returns the bytes written (may be 0 because of buffering) or -1 in case of error + */ +int +xmlTextWriterFlush(xmlTextWriterPtr writer) +{ + int count; + + if (writer == NULL) + return -1; + + if (writer->out == NULL) + count = 0; + else + count = xmlOutputBufferFlush(writer->out); + + return count; +} + +/** + * misc + */ + +/** + * xmlFreeTextWriterStackEntry: + * @lk: the xmlLinkPtr + * + * Free callback for the xmlList. + */ +static void +xmlFreeTextWriterStackEntry(xmlLinkPtr lk) +{ + xmlTextWriterStackEntry *p; + + p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk); + if (p == 0) + return; + + if (p->name != 0) + xmlFree(p->name); + xmlFree(p); +} + +/** + * xmlCmpTextWriterStackEntry: + * @data0: the first data + * @data1: the second data + * + * Compare callback for the xmlList. + * + * Returns -1, 0, 1 + */ +static int +xmlCmpTextWriterStackEntry(const void *data0, const void *data1) +{ + xmlTextWriterStackEntry *p0; + xmlTextWriterStackEntry *p1; + + if (data0 == data1) + return 0; + + if (data0 == 0) + return -1; + + if (data1 == 0) + return 1; + + p0 = (xmlTextWriterStackEntry *) data0; + p1 = (xmlTextWriterStackEntry *) data1; + + return xmlStrcmp(p0->name, p1->name); +} + +/** + * misc + */ + +/** + * xmlTextWriterOutputNSDecl: + * @writer: the xmlTextWriterPtr + * + * Output the current namespace declarations. + */ +static int +xmlTextWriterOutputNSDecl(xmlTextWriterPtr writer) +{ + xmlLinkPtr lk; + xmlTextWriterNsStackEntry *np; + int count; + int sum; + + sum = 0; + while (!xmlListEmpty(writer->nsstack)) { + xmlChar *namespaceURI = NULL; + xmlChar *prefix = NULL; + + lk = xmlListFront(writer->nsstack); + np = (xmlTextWriterNsStackEntry *) xmlLinkGetData(lk); + + if (np != 0) { + namespaceURI = xmlStrdup(np->uri); + prefix = xmlStrdup(np->prefix); + } + + xmlListPopFront(writer->nsstack); + + if (np != 0) { + count = xmlTextWriterWriteAttribute(writer, prefix, namespaceURI); + xmlFree(namespaceURI); + xmlFree(prefix); + + if (count < 0) { + xmlListDelete(writer->nsstack); + writer->nsstack = NULL; + return -1; + } + sum += count; + } + } + return sum; +} + +/** + * xmlFreeTextWriterNsStackEntry: + * @lk: the xmlLinkPtr + * + * Free callback for the xmlList. + */ +static void +xmlFreeTextWriterNsStackEntry(xmlLinkPtr lk) +{ + xmlTextWriterNsStackEntry *p; + + p = (xmlTextWriterNsStackEntry *) xmlLinkGetData(lk); + if (p == 0) + return; + + if (p->prefix != 0) + xmlFree(p->prefix); + if (p->uri != 0) + xmlFree(p->uri); + + xmlFree(p); +} + +/** + * xmlCmpTextWriterNsStackEntry: + * @data0: the first data + * @data1: the second data + * + * Compare callback for the xmlList. + * + * Returns -1, 0, 1 + */ +static int +xmlCmpTextWriterNsStackEntry(const void *data0, const void *data1) +{ + xmlTextWriterNsStackEntry *p0; + xmlTextWriterNsStackEntry *p1; + int rc; + + if (data0 == data1) + return 0; + + if (data0 == 0) + return -1; + + if (data1 == 0) + return 1; + + p0 = (xmlTextWriterNsStackEntry *) data0; + p1 = (xmlTextWriterNsStackEntry *) data1; + + rc = xmlStrcmp(p0->prefix, p1->prefix); + + if ((rc != 0) || (p0->elem != p1->elem)) + rc = -1; + + return rc; +} + +/** + * xmlTextWriterWriteDocCallback: + * @context: the xmlBufferPtr + * @str: the data to write + * @len: the length of the data + * + * Write callback for the xmlOutputBuffer with target xmlBuffer + * + * Returns -1, 0, 1 + */ +static int +xmlTextWriterWriteDocCallback(void *context, const xmlChar * str, int len) +{ + xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) context; + int rc; + + if ((rc = xmlParseChunk(ctxt, (const char *) str, len, 0)) != 0) { + xmlWriterErrMsgInt(NULL, XML_ERR_INTERNAL_ERROR, + "xmlTextWriterWriteDocCallback : XML error %d !\n", + rc); + return -1; + } + + return len; +} + +/** + * xmlTextWriterCloseDocCallback: + * @context: the xmlBufferPtr + * + * Close callback for the xmlOutputBuffer with target xmlBuffer + * + * Returns -1, 0, 1 + */ +static int +xmlTextWriterCloseDocCallback(void *context) +{ + xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) context; + int rc; + + if ((rc = xmlParseChunk(ctxt, NULL, 0, 1)) != 0) { + xmlWriterErrMsgInt(NULL, XML_ERR_INTERNAL_ERROR, + "xmlTextWriterWriteDocCallback : XML error %d !\n", + rc); + return -1; + } + + return 0; +} + +/** + * xmlTextWriterVSprintf: + * @format: see printf + * @argptr: pointer to the first member of the variable argument list. + * + * Utility function for formatted output + * + * Returns a new xmlChar buffer with the data or NULL on error. This buffer must be freed. + */ +static xmlChar * +xmlTextWriterVSprintf(const char *format, va_list argptr) +{ + int size; + int count; + xmlChar *buf; + va_list locarg; + + size = BUFSIZ; + buf = (xmlChar *) xmlMalloc(size); + if (buf == NULL) { + xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY, + "xmlTextWriterVSprintf : out of memory!\n"); + return NULL; + } + + VA_COPY(locarg, argptr); + while (((count = vsnprintf((char *) buf, size, format, locarg)) < 0) + || (count == size - 1) || (count == size) || (count > size)) { + va_end(locarg); + xmlFree(buf); + size += BUFSIZ; + buf = (xmlChar *) xmlMalloc(size); + if (buf == NULL) { + xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY, + "xmlTextWriterVSprintf : out of memory!\n"); + return NULL; + } + VA_COPY(locarg, argptr); + } + va_end(locarg); + + return buf; +} + +/** + * xmlTextWriterStartDocumentCallback: + * @ctx: the user data (XML parser context) + * + * called at the start of document processing. + */ +static void +xmlTextWriterStartDocumentCallback(void *ctx) +{ + xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; + xmlDocPtr doc; + + if (ctxt->html) { +#ifdef LIBXML_HTML_ENABLED + if (ctxt->myDoc == NULL) + ctxt->myDoc = htmlNewDocNoDtD(NULL, NULL); + if (ctxt->myDoc == NULL) { + if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) + ctxt->sax->error(ctxt->userData, + "SAX.startDocument(): out of memory\n"); + ctxt->errNo = XML_ERR_NO_MEMORY; + ctxt->instate = XML_PARSER_EOF; + ctxt->disableSAX = 1; + return; + } +#else + xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR, + "libxml2 built without HTML support\n"); + ctxt->errNo = XML_ERR_INTERNAL_ERROR; + ctxt->instate = XML_PARSER_EOF; + ctxt->disableSAX = 1; + return; +#endif + } else { + doc = ctxt->myDoc; + if (doc == NULL) + doc = ctxt->myDoc = xmlNewDoc(ctxt->version); + if (doc != NULL) { + if (doc->children == NULL) { + if (ctxt->encoding != NULL) + doc->encoding = xmlStrdup(ctxt->encoding); + else + doc->encoding = NULL; + doc->standalone = ctxt->standalone; + } + } else { + if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) + ctxt->sax->error(ctxt->userData, + "SAX.startDocument(): out of memory\n"); + ctxt->errNo = XML_ERR_NO_MEMORY; + ctxt->instate = XML_PARSER_EOF; + ctxt->disableSAX = 1; + return; + } + } + if ((ctxt->myDoc != NULL) && (ctxt->myDoc->URL == NULL) && + (ctxt->input != NULL) && (ctxt->input->filename != NULL)) { + ctxt->myDoc->URL = + xmlCanonicPath((const xmlChar *) ctxt->input->filename); + if (ctxt->myDoc->URL == NULL) + ctxt->myDoc->URL = + xmlStrdup((const xmlChar *) ctxt->input->filename); + } +} + +/** + * xmlTextWriterSetIndent: + * @writer: the xmlTextWriterPtr + * @indent: do indentation? + * + * Set indentation output. indent = 0 do not indentation. indent > 0 do indentation. + * + * Returns -1 on error or 0 otherwise. + */ +int +xmlTextWriterSetIndent(xmlTextWriterPtr writer, int indent) +{ + if ((writer == NULL) || (indent < 0)) + return -1; + + writer->indent = indent; + writer->doindent = 1; + + return 0; +} + +/** + * xmlTextWriterSetIndentString: + * @writer: the xmlTextWriterPtr + * @str: the xmlChar string + * + * Set string indentation. + * + * Returns -1 on error or 0 otherwise. + */ +int +xmlTextWriterSetIndentString(xmlTextWriterPtr writer, const xmlChar * str) +{ + if ((writer == NULL) || (!str)) + return -1; + + if (writer->ichar != NULL) + xmlFree(writer->ichar); + writer->ichar = xmlStrdup(str); + + if (!writer->ichar) + return -1; + else + return 0; +} + +/** + * xmlTextWriterSetQuoteChar: + * @writer: the xmlTextWriterPtr + * @quotechar: the quote character + * + * Set the character used for quoting attributes. + * + * Returns -1 on error or 0 otherwise. + */ +int +xmlTextWriterSetQuoteChar(xmlTextWriterPtr writer, xmlChar quotechar) +{ + if ((writer == NULL) || ((quotechar != '\'') && (quotechar != '"'))) + return -1; + + writer->qchar = quotechar; + + return 0; +} + +/** + * xmlTextWriterWriteIndent: + * @writer: the xmlTextWriterPtr + * + * Write indent string. + * + * Returns -1 on error or the number of strings written. + */ +static int +xmlTextWriterWriteIndent(xmlTextWriterPtr writer) +{ + int lksize; + int i; + int ret; + + lksize = xmlListSize(writer->nodes); + if (lksize < 1) + return (-1); /* list is empty */ + for (i = 0; i < (lksize - 1); i++) { + ret = xmlOutputBufferWriteString(writer->out, + (const char *) writer->ichar); + if (ret == -1) + return (-1); + } + + return (lksize - 1); +} + +/** + * xmlTextWriterHandleStateDependencies: + * @writer: the xmlTextWriterPtr + * @p: the xmlTextWriterStackEntry + * + * Write state dependent strings. + * + * Returns -1 on error or the number of characters written. + */ +static int +xmlTextWriterHandleStateDependencies(xmlTextWriterPtr writer, + xmlTextWriterStackEntry * p) +{ + int count; + int sum; + char extra[3]; + + if (writer == NULL) + return -1; + + if (p == NULL) + return 0; + + sum = 0; + extra[0] = extra[1] = extra[2] = '\0'; + if (p != 0) { + sum = 0; + switch (p->state) { + case XML_TEXTWRITER_NAME: + /* Output namespace declarations */ + count = xmlTextWriterOutputNSDecl(writer); + if (count < 0) + return -1; + sum += count; + extra[0] = '>'; + p->state = XML_TEXTWRITER_TEXT; + break; + case XML_TEXTWRITER_PI: + extra[0] = ' '; + p->state = XML_TEXTWRITER_PI_TEXT; + break; + case XML_TEXTWRITER_DTD: + extra[0] = ' '; + extra[1] = '['; + p->state = XML_TEXTWRITER_DTD_TEXT; + break; + case XML_TEXTWRITER_DTD_ELEM: + extra[0] = ' '; + p->state = XML_TEXTWRITER_DTD_ELEM_TEXT; + break; + case XML_TEXTWRITER_DTD_ATTL: + extra[0] = ' '; + p->state = XML_TEXTWRITER_DTD_ATTL_TEXT; + break; + case XML_TEXTWRITER_DTD_ENTY: + case XML_TEXTWRITER_DTD_PENT: + extra[0] = ' '; + extra[1] = writer->qchar; + p->state = XML_TEXTWRITER_DTD_ENTY_TEXT; + break; + default: + break; + } + } + + if (*extra != '\0') { + count = xmlOutputBufferWriteString(writer->out, extra); + if (count < 0) + return -1; + sum += count; + } + + return sum; +} + +#define bottom_xmlwriter +#include "elfgcchack.h" +#endif diff --git a/vendors/libxml/src/xpath.c b/vendors/libxml/src/xpath.c new file mode 100644 index 0000000..97410e7 --- /dev/null +++ b/vendors/libxml/src/xpath.c @@ -0,0 +1,15356 @@ +/* + * xpath.c: XML Path Language implementation + * XPath is a language for addressing parts of an XML document, + * designed to be used by both XSLT and XPointer + *f + * Reference: W3C Recommendation 16 November 1999 + * http://www.w3.org/TR/1999/REC-xpath-19991116 + * Public reference: + * http://www.w3.org/TR/xpath + * + * See Copyright for the status of this software + * + * Author: daniel@veillard.com + * + */ + +#define IN_LIBXML +#include "libxml.h" + +#include + +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_MATH_H +#include +#endif +#ifdef HAVE_FLOAT_H +#include +#endif +#ifdef HAVE_CTYPE_H +#include +#endif +#ifdef HAVE_SIGNAL_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#ifdef LIBXML_XPTR_ENABLED +#include +#endif +#ifdef LIBXML_DEBUG_ENABLED +#include +#endif +#include +#include +#include +#ifdef LIBXML_PATTERN_ENABLED +#include +#endif + +#include "buf.h" + +#ifdef LIBXML_PATTERN_ENABLED +#define XPATH_STREAMING +#endif + +#define TODO \ + xmlGenericError(xmlGenericErrorContext, \ + "Unimplemented block at %s:%d\n", \ + __FILE__, __LINE__); + +/** + * WITH_TIM_SORT: + * + * Use the Timsort algorithm provided in timsort.h to sort + * nodeset as this is a great improvement over the old Shell sort + * used in xmlXPathNodeSetSort() + */ +#define WITH_TIM_SORT + +/* +* XP_OPTIMIZED_NON_ELEM_COMPARISON: +* If defined, this will use xmlXPathCmpNodesExt() instead of +* xmlXPathCmpNodes(). The new function is optimized comparison of +* non-element nodes; actually it will speed up comparison only if +* xmlXPathOrderDocElems() was called in order to index the elements of +* a tree in document order; Libxslt does such an indexing, thus it will +* benefit from this optimization. +*/ +#define XP_OPTIMIZED_NON_ELEM_COMPARISON + +/* +* XP_OPTIMIZED_FILTER_FIRST: +* If defined, this will optimize expressions like "key('foo', 'val')[b][1]" +* in a way, that it stop evaluation at the first node. +*/ +#define XP_OPTIMIZED_FILTER_FIRST + +/* +* XP_DEBUG_OBJ_USAGE: +* Internal flag to enable tracking of how much XPath objects have been +* created. +*/ +/* #define XP_DEBUG_OBJ_USAGE */ + +/* + * XPATH_MAX_STEPS: + * when compiling an XPath expression we arbitrary limit the maximum + * number of step operation in the compiled expression. 1000000 is + * an insanely large value which should never be reached under normal + * circumstances + */ +#define XPATH_MAX_STEPS 1000000 + +/* + * XPATH_MAX_STACK_DEPTH: + * when evaluating an XPath expression we arbitrary limit the maximum + * number of object allowed to be pushed on the stack. 1000000 is + * an insanely large value which should never be reached under normal + * circumstances + */ +#define XPATH_MAX_STACK_DEPTH 1000000 + +/* + * XPATH_MAX_NODESET_LENGTH: + * when evaluating an XPath expression nodesets are created and we + * arbitrary limit the maximum length of those node set. 10000000 is + * an insanely large value which should never be reached under normal + * circumstances, one would first need to construct an in memory tree + * with more than 10 millions nodes. + */ +#define XPATH_MAX_NODESET_LENGTH 10000000 + +/* + * TODO: + * There are a few spots where some tests are done which depend upon ascii + * data. These should be enhanced for full UTF8 support (see particularly + * any use of the macros IS_ASCII_CHARACTER and IS_ASCII_DIGIT) + */ + +/* + * Wrapper for the Timsort argorithm from timsort.h + */ +#ifdef WITH_TIM_SORT +#define SORT_NAME libxml_domnode +#define SORT_TYPE xmlNodePtr +/** + * wrap_cmp: + * @x: a node + * @y: another node + * + * Comparison function for the Timsort implementation + * + * Returns -2 in case of error -1 if first point < second point, 0 if + * it's the same node, +1 otherwise + */ +static +int wrap_cmp( xmlNodePtr x, xmlNodePtr y ); +#ifdef XP_OPTIMIZED_NON_ELEM_COMPARISON + static int xmlXPathCmpNodesExt(xmlNodePtr, xmlNodePtr); + static int wrap_cmp( xmlNodePtr x, xmlNodePtr y ) + { + int res = xmlXPathCmpNodesExt(x, y); + return res == -2 ? res : -res; + } +#else + static int wrap_cmp( xmlNodePtr x, xmlNodePtr y ) + { + int res = xmlXPathCmpNodes(x, y); + return res == -2 ? res : -res; + } +#endif +#define SORT_CMP(x, y) (wrap_cmp(x, y)) +#include "timsort.h" +#endif /* WITH_TIM_SORT */ + +#if defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) + +/************************************************************************ + * * + * Floating point stuff * + * * + ************************************************************************/ + +#ifndef TRIO_REPLACE_STDIO +#define TRIO_PUBLIC static +#endif +#include "trionan.c" + +/* + * The lack of portability of this section of the libc is annoying ! + */ +double xmlXPathNAN = 0; +double xmlXPathPINF = 1; +double xmlXPathNINF = -1; +static double xmlXPathNZERO = 0; /* not exported from headers */ +static int xmlXPathInitialized = 0; + +/** + * xmlXPathInit: + * + * Initialize the XPath environment + */ +void +xmlXPathInit(void) { + if (xmlXPathInitialized) return; + + xmlXPathPINF = trio_pinf(); + xmlXPathNINF = trio_ninf(); + xmlXPathNAN = trio_nan(); + xmlXPathNZERO = trio_nzero(); + + xmlXPathInitialized = 1; +} + +/** + * xmlXPathIsNaN: + * @val: a double value + * + * Provides a portable isnan() function to detect whether a double + * is a NotaNumber. Based on trio code + * http://sourceforge.net/projects/ctrio/ + * + * Returns 1 if the value is a NaN, 0 otherwise + */ +int +xmlXPathIsNaN(double val) { + return(trio_isnan(val)); +} + +/** + * xmlXPathIsInf: + * @val: a double value + * + * Provides a portable isinf() function to detect whether a double + * is a +Infinite or -Infinite. Based on trio code + * http://sourceforge.net/projects/ctrio/ + * + * Returns 1 vi the value is +Infinite, -1 if -Infinite, 0 otherwise + */ +int +xmlXPathIsInf(double val) { + return(trio_isinf(val)); +} + +#endif /* SCHEMAS or XPATH */ +#ifdef LIBXML_XPATH_ENABLED +/** + * xmlXPathGetSign: + * @val: a double value + * + * Provides a portable function to detect the sign of a double + * Modified from trio code + * http://sourceforge.net/projects/ctrio/ + * + * Returns 1 if the value is Negative, 0 if positive + */ +static int +xmlXPathGetSign(double val) { + return(trio_signbit(val)); +} + + +/* + * TODO: when compatibility allows remove all "fake node libxslt" strings + * the test should just be name[0] = ' ' + */ +#ifdef DEBUG_XPATH_EXPRESSION +#define DEBUG_STEP +#define DEBUG_EXPR +#define DEBUG_EVAL_COUNTS +#endif + +static xmlNs xmlXPathXMLNamespaceStruct = { + NULL, + XML_NAMESPACE_DECL, + XML_XML_NAMESPACE, + BAD_CAST "xml", + NULL, + NULL +}; +static xmlNsPtr xmlXPathXMLNamespace = &xmlXPathXMLNamespaceStruct; +#ifndef LIBXML_THREAD_ENABLED +/* + * Optimizer is disabled only when threaded apps are detected while + * the library ain't compiled for thread safety. + */ +static int xmlXPathDisableOptimizer = 0; +#endif + +/************************************************************************ + * * + * Error handling routines * + * * + ************************************************************************/ + +/** + * XP_ERRORNULL: + * @X: the error code + * + * Macro to raise an XPath error and return NULL. + */ +#define XP_ERRORNULL(X) \ + { xmlXPathErr(ctxt, X); return(NULL); } + +/* + * The array xmlXPathErrorMessages corresponds to the enum xmlXPathError + */ +static const char *xmlXPathErrorMessages[] = { + "Ok\n", + "Number encoding\n", + "Unfinished literal\n", + "Start of literal\n", + "Expected $ for variable reference\n", + "Undefined variable\n", + "Invalid predicate\n", + "Invalid expression\n", + "Missing closing curly brace\n", + "Unregistered function\n", + "Invalid operand\n", + "Invalid type\n", + "Invalid number of arguments\n", + "Invalid context size\n", + "Invalid context position\n", + "Memory allocation error\n", + "Syntax error\n", + "Resource error\n", + "Sub resource error\n", + "Undefined namespace prefix\n", + "Encoding error\n", + "Char out of XML range\n", + "Invalid or incomplete context\n", + "Stack usage errror\n", + "Forbidden variable\n", + "?? Unknown error ??\n" /* Must be last in the list! */ +}; +#define MAXERRNO ((int)(sizeof(xmlXPathErrorMessages) / \ + sizeof(xmlXPathErrorMessages[0])) - 1) +/** + * xmlXPathErrMemory: + * @ctxt: an XPath context + * @extra: extra informations + * + * Handle a redefinition of attribute error + */ +static void +xmlXPathErrMemory(xmlXPathContextPtr ctxt, const char *extra) +{ + if (ctxt != NULL) { + if (extra) { + xmlChar buf[200]; + + xmlStrPrintf(buf, 200, + BAD_CAST "Memory allocation failed : %s\n", + extra); + ctxt->lastError.message = (char *) xmlStrdup(buf); + } else { + ctxt->lastError.message = (char *) + xmlStrdup(BAD_CAST "Memory allocation failed\n"); + } + ctxt->lastError.domain = XML_FROM_XPATH; + ctxt->lastError.code = XML_ERR_NO_MEMORY; + if (ctxt->error != NULL) + ctxt->error(ctxt->userData, &ctxt->lastError); + } else { + if (extra) + __xmlRaiseError(NULL, NULL, NULL, + NULL, NULL, XML_FROM_XPATH, + XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, + extra, NULL, NULL, 0, 0, + "Memory allocation failed : %s\n", extra); + else + __xmlRaiseError(NULL, NULL, NULL, + NULL, NULL, XML_FROM_XPATH, + XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, + NULL, NULL, NULL, 0, 0, + "Memory allocation failed\n"); + } +} + +/** + * xmlXPathPErrMemory: + * @ctxt: an XPath parser context + * @extra: extra informations + * + * Handle a redefinition of attribute error + */ +static void +xmlXPathPErrMemory(xmlXPathParserContextPtr ctxt, const char *extra) +{ + if (ctxt == NULL) + xmlXPathErrMemory(NULL, extra); + else { + ctxt->error = XPATH_MEMORY_ERROR; + xmlXPathErrMemory(ctxt->context, extra); + } +} + +/** + * xmlXPathErr: + * @ctxt: a XPath parser context + * @error: the error code + * + * Handle an XPath error + */ +void +xmlXPathErr(xmlXPathParserContextPtr ctxt, int error) +{ + if ((error < 0) || (error > MAXERRNO)) + error = MAXERRNO; + if (ctxt == NULL) { + __xmlRaiseError(NULL, NULL, NULL, + NULL, NULL, XML_FROM_XPATH, + error + XML_XPATH_EXPRESSION_OK - XPATH_EXPRESSION_OK, + XML_ERR_ERROR, NULL, 0, + NULL, NULL, NULL, 0, 0, + "%s", xmlXPathErrorMessages[error]); + return; + } + ctxt->error = error; + if (ctxt->context == NULL) { + __xmlRaiseError(NULL, NULL, NULL, + NULL, NULL, XML_FROM_XPATH, + error + XML_XPATH_EXPRESSION_OK - XPATH_EXPRESSION_OK, + XML_ERR_ERROR, NULL, 0, + (const char *) ctxt->base, NULL, NULL, + ctxt->cur - ctxt->base, 0, + "%s", xmlXPathErrorMessages[error]); + return; + } + + /* cleanup current last error */ + xmlResetError(&ctxt->context->lastError); + + ctxt->context->lastError.domain = XML_FROM_XPATH; + ctxt->context->lastError.code = error + XML_XPATH_EXPRESSION_OK - + XPATH_EXPRESSION_OK; + ctxt->context->lastError.level = XML_ERR_ERROR; + ctxt->context->lastError.str1 = (char *) xmlStrdup(ctxt->base); + ctxt->context->lastError.int1 = ctxt->cur - ctxt->base; + ctxt->context->lastError.node = ctxt->context->debugNode; + if (ctxt->context->error != NULL) { + ctxt->context->error(ctxt->context->userData, + &ctxt->context->lastError); + } else { + __xmlRaiseError(NULL, NULL, NULL, + NULL, ctxt->context->debugNode, XML_FROM_XPATH, + error + XML_XPATH_EXPRESSION_OK - XPATH_EXPRESSION_OK, + XML_ERR_ERROR, NULL, 0, + (const char *) ctxt->base, NULL, NULL, + ctxt->cur - ctxt->base, 0, + "%s", xmlXPathErrorMessages[error]); + } + +} + +/** + * xmlXPatherror: + * @ctxt: the XPath Parser context + * @file: the file name + * @line: the line number + * @no: the error number + * + * Formats an error message. + */ +void +xmlXPatherror(xmlXPathParserContextPtr ctxt, const char *file ATTRIBUTE_UNUSED, + int line ATTRIBUTE_UNUSED, int no) { + xmlXPathErr(ctxt, no); +} + +/************************************************************************ + * * + * Utilities * + * * + ************************************************************************/ + +/** + * xsltPointerList: + * + * Pointer-list for various purposes. + */ +typedef struct _xmlPointerList xmlPointerList; +typedef xmlPointerList *xmlPointerListPtr; +struct _xmlPointerList { + void **items; + int number; + int size; +}; +/* +* TODO: Since such a list-handling is used in xmlschemas.c and libxslt +* and here, we should make the functions public. +*/ +static int +xmlPointerListAddSize(xmlPointerListPtr list, + void *item, + int initialSize) +{ + if (list->items == NULL) { + if (initialSize <= 0) + initialSize = 1; + list->items = (void **) xmlMalloc(initialSize * sizeof(void *)); + if (list->items == NULL) { + xmlXPathErrMemory(NULL, + "xmlPointerListCreate: allocating item\n"); + return(-1); + } + list->number = 0; + list->size = initialSize; + } else if (list->size <= list->number) { + if (list->size > 50000000) { + xmlXPathErrMemory(NULL, + "xmlPointerListAddSize: re-allocating item\n"); + return(-1); + } + list->size *= 2; + list->items = (void **) xmlRealloc(list->items, + list->size * sizeof(void *)); + if (list->items == NULL) { + xmlXPathErrMemory(NULL, + "xmlPointerListAddSize: re-allocating item\n"); + list->size = 0; + return(-1); + } + } + list->items[list->number++] = item; + return(0); +} + +/** + * xsltPointerListCreate: + * + * Creates an xsltPointerList structure. + * + * Returns a xsltPointerList structure or NULL in case of an error. + */ +static xmlPointerListPtr +xmlPointerListCreate(int initialSize) +{ + xmlPointerListPtr ret; + + ret = xmlMalloc(sizeof(xmlPointerList)); + if (ret == NULL) { + xmlXPathErrMemory(NULL, + "xmlPointerListCreate: allocating item\n"); + return (NULL); + } + memset(ret, 0, sizeof(xmlPointerList)); + if (initialSize > 0) { + xmlPointerListAddSize(ret, NULL, initialSize); + ret->number = 0; + } + return (ret); +} + +/** + * xsltPointerListFree: + * + * Frees the xsltPointerList structure. This does not free + * the content of the list. + */ +static void +xmlPointerListFree(xmlPointerListPtr list) +{ + if (list == NULL) + return; + if (list->items != NULL) + xmlFree(list->items); + xmlFree(list); +} + +/************************************************************************ + * * + * Parser Types * + * * + ************************************************************************/ + +/* + * Types are private: + */ + +typedef enum { + XPATH_OP_END=0, + XPATH_OP_AND, + XPATH_OP_OR, + XPATH_OP_EQUAL, + XPATH_OP_CMP, + XPATH_OP_PLUS, + XPATH_OP_MULT, + XPATH_OP_UNION, + XPATH_OP_ROOT, + XPATH_OP_NODE, + XPATH_OP_RESET, /* 10 */ + XPATH_OP_COLLECT, + XPATH_OP_VALUE, /* 12 */ + XPATH_OP_VARIABLE, + XPATH_OP_FUNCTION, + XPATH_OP_ARG, + XPATH_OP_PREDICATE, + XPATH_OP_FILTER, /* 17 */ + XPATH_OP_SORT /* 18 */ +#ifdef LIBXML_XPTR_ENABLED + ,XPATH_OP_RANGETO +#endif +} xmlXPathOp; + +typedef enum { + AXIS_ANCESTOR = 1, + AXIS_ANCESTOR_OR_SELF, + AXIS_ATTRIBUTE, + AXIS_CHILD, + AXIS_DESCENDANT, + AXIS_DESCENDANT_OR_SELF, + AXIS_FOLLOWING, + AXIS_FOLLOWING_SIBLING, + AXIS_NAMESPACE, + AXIS_PARENT, + AXIS_PRECEDING, + AXIS_PRECEDING_SIBLING, + AXIS_SELF +} xmlXPathAxisVal; + +typedef enum { + NODE_TEST_NONE = 0, + NODE_TEST_TYPE = 1, + NODE_TEST_PI = 2, + NODE_TEST_ALL = 3, + NODE_TEST_NS = 4, + NODE_TEST_NAME = 5 +} xmlXPathTestVal; + +typedef enum { + NODE_TYPE_NODE = 0, + NODE_TYPE_COMMENT = XML_COMMENT_NODE, + NODE_TYPE_TEXT = XML_TEXT_NODE, + NODE_TYPE_PI = XML_PI_NODE +} xmlXPathTypeVal; + +typedef struct _xmlXPathStepOp xmlXPathStepOp; +typedef xmlXPathStepOp *xmlXPathStepOpPtr; +struct _xmlXPathStepOp { + xmlXPathOp op; /* The identifier of the operation */ + int ch1; /* First child */ + int ch2; /* Second child */ + int value; + int value2; + int value3; + void *value4; + void *value5; + void *cache; + void *cacheURI; +}; + +struct _xmlXPathCompExpr { + int nbStep; /* Number of steps in this expression */ + int maxStep; /* Maximum number of steps allocated */ + xmlXPathStepOp *steps; /* ops for computation of this expression */ + int last; /* index of last step in expression */ + xmlChar *expr; /* the expression being computed */ + xmlDictPtr dict; /* the dictionnary to use if any */ +#ifdef DEBUG_EVAL_COUNTS + int nb; + xmlChar *string; +#endif +#ifdef XPATH_STREAMING + xmlPatternPtr stream; +#endif +}; + +/************************************************************************ + * * + * Forward declarations * + * * + ************************************************************************/ +static void +xmlXPathFreeValueTree(xmlNodeSetPtr obj); +static void +xmlXPathReleaseObject(xmlXPathContextPtr ctxt, xmlXPathObjectPtr obj); +static int +xmlXPathCompOpEvalFirst(xmlXPathParserContextPtr ctxt, + xmlXPathStepOpPtr op, xmlNodePtr *first); +static int +xmlXPathCompOpEvalToBoolean(xmlXPathParserContextPtr ctxt, + xmlXPathStepOpPtr op, + int isPredicate); + +/************************************************************************ + * * + * Parser Type functions * + * * + ************************************************************************/ + +/** + * xmlXPathNewCompExpr: + * + * Create a new Xpath component + * + * Returns the newly allocated xmlXPathCompExprPtr or NULL in case of error + */ +static xmlXPathCompExprPtr +xmlXPathNewCompExpr(void) { + xmlXPathCompExprPtr cur; + + cur = (xmlXPathCompExprPtr) xmlMalloc(sizeof(xmlXPathCompExpr)); + if (cur == NULL) { + xmlXPathErrMemory(NULL, "allocating component\n"); + return(NULL); + } + memset(cur, 0, sizeof(xmlXPathCompExpr)); + cur->maxStep = 10; + cur->nbStep = 0; + cur->steps = (xmlXPathStepOp *) xmlMalloc(cur->maxStep * + sizeof(xmlXPathStepOp)); + if (cur->steps == NULL) { + xmlXPathErrMemory(NULL, "allocating steps\n"); + xmlFree(cur); + return(NULL); + } + memset(cur->steps, 0, cur->maxStep * sizeof(xmlXPathStepOp)); + cur->last = -1; +#ifdef DEBUG_EVAL_COUNTS + cur->nb = 0; +#endif + return(cur); +} + +/** + * xmlXPathFreeCompExpr: + * @comp: an XPATH comp + * + * Free up the memory allocated by @comp + */ +void +xmlXPathFreeCompExpr(xmlXPathCompExprPtr comp) +{ + xmlXPathStepOpPtr op; + int i; + + if (comp == NULL) + return; + if (comp->dict == NULL) { + for (i = 0; i < comp->nbStep; i++) { + op = &comp->steps[i]; + if (op->value4 != NULL) { + if (op->op == XPATH_OP_VALUE) + xmlXPathFreeObject(op->value4); + else + xmlFree(op->value4); + } + if (op->value5 != NULL) + xmlFree(op->value5); + } + } else { + for (i = 0; i < comp->nbStep; i++) { + op = &comp->steps[i]; + if (op->value4 != NULL) { + if (op->op == XPATH_OP_VALUE) + xmlXPathFreeObject(op->value4); + } + } + xmlDictFree(comp->dict); + } + if (comp->steps != NULL) { + xmlFree(comp->steps); + } +#ifdef DEBUG_EVAL_COUNTS + if (comp->string != NULL) { + xmlFree(comp->string); + } +#endif +#ifdef XPATH_STREAMING + if (comp->stream != NULL) { + xmlFreePatternList(comp->stream); + } +#endif + if (comp->expr != NULL) { + xmlFree(comp->expr); + } + + xmlFree(comp); +} + +/** + * xmlXPathCompExprAdd: + * @comp: the compiled expression + * @ch1: first child index + * @ch2: second child index + * @op: an op + * @value: the first int value + * @value2: the second int value + * @value3: the third int value + * @value4: the first string value + * @value5: the second string value + * + * Add a step to an XPath Compiled Expression + * + * Returns -1 in case of failure, the index otherwise + */ +static int +xmlXPathCompExprAdd(xmlXPathCompExprPtr comp, int ch1, int ch2, + xmlXPathOp op, int value, + int value2, int value3, void *value4, void *value5) { + if (comp->nbStep >= comp->maxStep) { + xmlXPathStepOp *real; + + if (comp->maxStep >= XPATH_MAX_STEPS) { + xmlXPathErrMemory(NULL, "adding step\n"); + return(-1); + } + comp->maxStep *= 2; + real = (xmlXPathStepOp *) xmlRealloc(comp->steps, + comp->maxStep * sizeof(xmlXPathStepOp)); + if (real == NULL) { + comp->maxStep /= 2; + xmlXPathErrMemory(NULL, "adding step\n"); + return(-1); + } + comp->steps = real; + } + comp->last = comp->nbStep; + comp->steps[comp->nbStep].ch1 = ch1; + comp->steps[comp->nbStep].ch2 = ch2; + comp->steps[comp->nbStep].op = op; + comp->steps[comp->nbStep].value = value; + comp->steps[comp->nbStep].value2 = value2; + comp->steps[comp->nbStep].value3 = value3; + if ((comp->dict != NULL) && + ((op == XPATH_OP_FUNCTION) || (op == XPATH_OP_VARIABLE) || + (op == XPATH_OP_COLLECT))) { + if (value4 != NULL) { + comp->steps[comp->nbStep].value4 = (xmlChar *) + (void *)xmlDictLookup(comp->dict, value4, -1); + xmlFree(value4); + } else + comp->steps[comp->nbStep].value4 = NULL; + if (value5 != NULL) { + comp->steps[comp->nbStep].value5 = (xmlChar *) + (void *)xmlDictLookup(comp->dict, value5, -1); + xmlFree(value5); + } else + comp->steps[comp->nbStep].value5 = NULL; + } else { + comp->steps[comp->nbStep].value4 = value4; + comp->steps[comp->nbStep].value5 = value5; + } + comp->steps[comp->nbStep].cache = NULL; + return(comp->nbStep++); +} + +/** + * xmlXPathCompSwap: + * @comp: the compiled expression + * @op: operation index + * + * Swaps 2 operations in the compiled expression + */ +static void +xmlXPathCompSwap(xmlXPathStepOpPtr op) { + int tmp; + +#ifndef LIBXML_THREAD_ENABLED + /* + * Since this manipulates possibly shared variables, this is + * disabled if one detects that the library is used in a multithreaded + * application + */ + if (xmlXPathDisableOptimizer) + return; +#endif + + tmp = op->ch1; + op->ch1 = op->ch2; + op->ch2 = tmp; +} + +#define PUSH_FULL_EXPR(op, op1, op2, val, val2, val3, val4, val5) \ + xmlXPathCompExprAdd(ctxt->comp, (op1), (op2), \ + (op), (val), (val2), (val3), (val4), (val5)) +#define PUSH_LONG_EXPR(op, val, val2, val3, val4, val5) \ + xmlXPathCompExprAdd(ctxt->comp, ctxt->comp->last, -1, \ + (op), (val), (val2), (val3), (val4), (val5)) + +#define PUSH_LEAVE_EXPR(op, val, val2) \ +xmlXPathCompExprAdd(ctxt->comp, -1, -1, (op), (val), (val2), 0 ,NULL ,NULL) + +#define PUSH_UNARY_EXPR(op, ch, val, val2) \ +xmlXPathCompExprAdd(ctxt->comp, (ch), -1, (op), (val), (val2), 0 ,NULL ,NULL) + +#define PUSH_BINARY_EXPR(op, ch1, ch2, val, val2) \ +xmlXPathCompExprAdd(ctxt->comp, (ch1), (ch2), (op), \ + (val), (val2), 0 ,NULL ,NULL) + +/************************************************************************ + * * + * XPath object cache structures * + * * + ************************************************************************/ + +/* #define XP_DEFAULT_CACHE_ON */ + +#define XP_HAS_CACHE(c) ((c != NULL) && ((c)->cache != NULL)) + +typedef struct _xmlXPathContextCache xmlXPathContextCache; +typedef xmlXPathContextCache *xmlXPathContextCachePtr; +struct _xmlXPathContextCache { + xmlPointerListPtr nodesetObjs; /* contains xmlXPathObjectPtr */ + xmlPointerListPtr stringObjs; /* contains xmlXPathObjectPtr */ + xmlPointerListPtr booleanObjs; /* contains xmlXPathObjectPtr */ + xmlPointerListPtr numberObjs; /* contains xmlXPathObjectPtr */ + xmlPointerListPtr miscObjs; /* contains xmlXPathObjectPtr */ + int maxNodeset; + int maxString; + int maxBoolean; + int maxNumber; + int maxMisc; +#ifdef XP_DEBUG_OBJ_USAGE + int dbgCachedAll; + int dbgCachedNodeset; + int dbgCachedString; + int dbgCachedBool; + int dbgCachedNumber; + int dbgCachedPoint; + int dbgCachedRange; + int dbgCachedLocset; + int dbgCachedUsers; + int dbgCachedXSLTTree; + int dbgCachedUndefined; + + + int dbgReusedAll; + int dbgReusedNodeset; + int dbgReusedString; + int dbgReusedBool; + int dbgReusedNumber; + int dbgReusedPoint; + int dbgReusedRange; + int dbgReusedLocset; + int dbgReusedUsers; + int dbgReusedXSLTTree; + int dbgReusedUndefined; + +#endif +}; + +/************************************************************************ + * * + * Debugging related functions * + * * + ************************************************************************/ + +#define STRANGE \ + xmlGenericError(xmlGenericErrorContext, \ + "Internal error at %s:%d\n", \ + __FILE__, __LINE__); + +#ifdef LIBXML_DEBUG_ENABLED +static void +xmlXPathDebugDumpNode(FILE *output, xmlNodePtr cur, int depth) { + int i; + char shift[100]; + + for (i = 0;((i < depth) && (i < 25));i++) + shift[2 * i] = shift[2 * i + 1] = ' '; + shift[2 * i] = shift[2 * i + 1] = 0; + if (cur == NULL) { + fprintf(output, "%s", shift); + fprintf(output, "Node is NULL !\n"); + return; + + } + + if ((cur->type == XML_DOCUMENT_NODE) || + (cur->type == XML_HTML_DOCUMENT_NODE)) { + fprintf(output, "%s", shift); + fprintf(output, " /\n"); + } else if (cur->type == XML_ATTRIBUTE_NODE) + xmlDebugDumpAttr(output, (xmlAttrPtr)cur, depth); + else + xmlDebugDumpOneNode(output, cur, depth); +} +static void +xmlXPathDebugDumpNodeList(FILE *output, xmlNodePtr cur, int depth) { + xmlNodePtr tmp; + int i; + char shift[100]; + + for (i = 0;((i < depth) && (i < 25));i++) + shift[2 * i] = shift[2 * i + 1] = ' '; + shift[2 * i] = shift[2 * i + 1] = 0; + if (cur == NULL) { + fprintf(output, "%s", shift); + fprintf(output, "Node is NULL !\n"); + return; + + } + + while (cur != NULL) { + tmp = cur; + cur = cur->next; + xmlDebugDumpOneNode(output, tmp, depth); + } +} + +static void +xmlXPathDebugDumpNodeSet(FILE *output, xmlNodeSetPtr cur, int depth) { + int i; + char shift[100]; + + for (i = 0;((i < depth) && (i < 25));i++) + shift[2 * i] = shift[2 * i + 1] = ' '; + shift[2 * i] = shift[2 * i + 1] = 0; + + if (cur == NULL) { + fprintf(output, "%s", shift); + fprintf(output, "NodeSet is NULL !\n"); + return; + + } + + if (cur != NULL) { + fprintf(output, "Set contains %d nodes:\n", cur->nodeNr); + for (i = 0;i < cur->nodeNr;i++) { + fprintf(output, "%s", shift); + fprintf(output, "%d", i + 1); + xmlXPathDebugDumpNode(output, cur->nodeTab[i], depth + 1); + } + } +} + +static void +xmlXPathDebugDumpValueTree(FILE *output, xmlNodeSetPtr cur, int depth) { + int i; + char shift[100]; + + for (i = 0;((i < depth) && (i < 25));i++) + shift[2 * i] = shift[2 * i + 1] = ' '; + shift[2 * i] = shift[2 * i + 1] = 0; + + if ((cur == NULL) || (cur->nodeNr == 0) || (cur->nodeTab[0] == NULL)) { + fprintf(output, "%s", shift); + fprintf(output, "Value Tree is NULL !\n"); + return; + + } + + fprintf(output, "%s", shift); + fprintf(output, "%d", i + 1); + xmlXPathDebugDumpNodeList(output, cur->nodeTab[0]->children, depth + 1); +} +#if defined(LIBXML_XPTR_ENABLED) +static void +xmlXPathDebugDumpLocationSet(FILE *output, xmlLocationSetPtr cur, int depth) { + int i; + char shift[100]; + + for (i = 0;((i < depth) && (i < 25));i++) + shift[2 * i] = shift[2 * i + 1] = ' '; + shift[2 * i] = shift[2 * i + 1] = 0; + + if (cur == NULL) { + fprintf(output, "%s", shift); + fprintf(output, "LocationSet is NULL !\n"); + return; + + } + + for (i = 0;i < cur->locNr;i++) { + fprintf(output, "%s", shift); + fprintf(output, "%d : ", i + 1); + xmlXPathDebugDumpObject(output, cur->locTab[i], depth + 1); + } +} +#endif /* LIBXML_XPTR_ENABLED */ + +/** + * xmlXPathDebugDumpObject: + * @output: the FILE * to dump the output + * @cur: the object to inspect + * @depth: indentation level + * + * Dump the content of the object for debugging purposes + */ +void +xmlXPathDebugDumpObject(FILE *output, xmlXPathObjectPtr cur, int depth) { + int i; + char shift[100]; + + if (output == NULL) return; + + for (i = 0;((i < depth) && (i < 25));i++) + shift[2 * i] = shift[2 * i + 1] = ' '; + shift[2 * i] = shift[2 * i + 1] = 0; + + + fprintf(output, "%s", shift); + + if (cur == NULL) { + fprintf(output, "Object is empty (NULL)\n"); + return; + } + switch(cur->type) { + case XPATH_UNDEFINED: + fprintf(output, "Object is uninitialized\n"); + break; + case XPATH_NODESET: + fprintf(output, "Object is a Node Set :\n"); + xmlXPathDebugDumpNodeSet(output, cur->nodesetval, depth); + break; + case XPATH_XSLT_TREE: + fprintf(output, "Object is an XSLT value tree :\n"); + xmlXPathDebugDumpValueTree(output, cur->nodesetval, depth); + break; + case XPATH_BOOLEAN: + fprintf(output, "Object is a Boolean : "); + if (cur->boolval) fprintf(output, "true\n"); + else fprintf(output, "false\n"); + break; + case XPATH_NUMBER: + switch (xmlXPathIsInf(cur->floatval)) { + case 1: + fprintf(output, "Object is a number : Infinity\n"); + break; + case -1: + fprintf(output, "Object is a number : -Infinity\n"); + break; + default: + if (xmlXPathIsNaN(cur->floatval)) { + fprintf(output, "Object is a number : NaN\n"); + } else if (cur->floatval == 0 && xmlXPathGetSign(cur->floatval) != 0) { + fprintf(output, "Object is a number : 0\n"); + } else { + fprintf(output, "Object is a number : %0g\n", cur->floatval); + } + } + break; + case XPATH_STRING: + fprintf(output, "Object is a string : "); + xmlDebugDumpString(output, cur->stringval); + fprintf(output, "\n"); + break; + case XPATH_POINT: + fprintf(output, "Object is a point : index %d in node", cur->index); + xmlXPathDebugDumpNode(output, (xmlNodePtr) cur->user, depth + 1); + fprintf(output, "\n"); + break; + case XPATH_RANGE: + if ((cur->user2 == NULL) || + ((cur->user2 == cur->user) && (cur->index == cur->index2))) { + fprintf(output, "Object is a collapsed range :\n"); + fprintf(output, "%s", shift); + if (cur->index >= 0) + fprintf(output, "index %d in ", cur->index); + fprintf(output, "node\n"); + xmlXPathDebugDumpNode(output, (xmlNodePtr) cur->user, + depth + 1); + } else { + fprintf(output, "Object is a range :\n"); + fprintf(output, "%s", shift); + fprintf(output, "From "); + if (cur->index >= 0) + fprintf(output, "index %d in ", cur->index); + fprintf(output, "node\n"); + xmlXPathDebugDumpNode(output, (xmlNodePtr) cur->user, + depth + 1); + fprintf(output, "%s", shift); + fprintf(output, "To "); + if (cur->index2 >= 0) + fprintf(output, "index %d in ", cur->index2); + fprintf(output, "node\n"); + xmlXPathDebugDumpNode(output, (xmlNodePtr) cur->user2, + depth + 1); + fprintf(output, "\n"); + } + break; + case XPATH_LOCATIONSET: +#if defined(LIBXML_XPTR_ENABLED) + fprintf(output, "Object is a Location Set:\n"); + xmlXPathDebugDumpLocationSet(output, + (xmlLocationSetPtr) cur->user, depth); +#endif + break; + case XPATH_USERS: + fprintf(output, "Object is user defined\n"); + break; + } +} + +static void +xmlXPathDebugDumpStepOp(FILE *output, xmlXPathCompExprPtr comp, + xmlXPathStepOpPtr op, int depth) { + int i; + char shift[100]; + + for (i = 0;((i < depth) && (i < 25));i++) + shift[2 * i] = shift[2 * i + 1] = ' '; + shift[2 * i] = shift[2 * i + 1] = 0; + + fprintf(output, "%s", shift); + if (op == NULL) { + fprintf(output, "Step is NULL\n"); + return; + } + switch (op->op) { + case XPATH_OP_END: + fprintf(output, "END"); break; + case XPATH_OP_AND: + fprintf(output, "AND"); break; + case XPATH_OP_OR: + fprintf(output, "OR"); break; + case XPATH_OP_EQUAL: + if (op->value) + fprintf(output, "EQUAL ="); + else + fprintf(output, "EQUAL !="); + break; + case XPATH_OP_CMP: + if (op->value) + fprintf(output, "CMP <"); + else + fprintf(output, "CMP >"); + if (!op->value2) + fprintf(output, "="); + break; + case XPATH_OP_PLUS: + if (op->value == 0) + fprintf(output, "PLUS -"); + else if (op->value == 1) + fprintf(output, "PLUS +"); + else if (op->value == 2) + fprintf(output, "PLUS unary -"); + else if (op->value == 3) + fprintf(output, "PLUS unary - -"); + break; + case XPATH_OP_MULT: + if (op->value == 0) + fprintf(output, "MULT *"); + else if (op->value == 1) + fprintf(output, "MULT div"); + else + fprintf(output, "MULT mod"); + break; + case XPATH_OP_UNION: + fprintf(output, "UNION"); break; + case XPATH_OP_ROOT: + fprintf(output, "ROOT"); break; + case XPATH_OP_NODE: + fprintf(output, "NODE"); break; + case XPATH_OP_RESET: + fprintf(output, "RESET"); break; + case XPATH_OP_SORT: + fprintf(output, "SORT"); break; + case XPATH_OP_COLLECT: { + xmlXPathAxisVal axis = (xmlXPathAxisVal)op->value; + xmlXPathTestVal test = (xmlXPathTestVal)op->value2; + xmlXPathTypeVal type = (xmlXPathTypeVal)op->value3; + const xmlChar *prefix = op->value4; + const xmlChar *name = op->value5; + + fprintf(output, "COLLECT "); + switch (axis) { + case AXIS_ANCESTOR: + fprintf(output, " 'ancestors' "); break; + case AXIS_ANCESTOR_OR_SELF: + fprintf(output, " 'ancestors-or-self' "); break; + case AXIS_ATTRIBUTE: + fprintf(output, " 'attributes' "); break; + case AXIS_CHILD: + fprintf(output, " 'child' "); break; + case AXIS_DESCENDANT: + fprintf(output, " 'descendant' "); break; + case AXIS_DESCENDANT_OR_SELF: + fprintf(output, " 'descendant-or-self' "); break; + case AXIS_FOLLOWING: + fprintf(output, " 'following' "); break; + case AXIS_FOLLOWING_SIBLING: + fprintf(output, " 'following-siblings' "); break; + case AXIS_NAMESPACE: + fprintf(output, " 'namespace' "); break; + case AXIS_PARENT: + fprintf(output, " 'parent' "); break; + case AXIS_PRECEDING: + fprintf(output, " 'preceding' "); break; + case AXIS_PRECEDING_SIBLING: + fprintf(output, " 'preceding-sibling' "); break; + case AXIS_SELF: + fprintf(output, " 'self' "); break; + } + switch (test) { + case NODE_TEST_NONE: + fprintf(output, "'none' "); break; + case NODE_TEST_TYPE: + fprintf(output, "'type' "); break; + case NODE_TEST_PI: + fprintf(output, "'PI' "); break; + case NODE_TEST_ALL: + fprintf(output, "'all' "); break; + case NODE_TEST_NS: + fprintf(output, "'namespace' "); break; + case NODE_TEST_NAME: + fprintf(output, "'name' "); break; + } + switch (type) { + case NODE_TYPE_NODE: + fprintf(output, "'node' "); break; + case NODE_TYPE_COMMENT: + fprintf(output, "'comment' "); break; + case NODE_TYPE_TEXT: + fprintf(output, "'text' "); break; + case NODE_TYPE_PI: + fprintf(output, "'PI' "); break; + } + if (prefix != NULL) + fprintf(output, "%s:", prefix); + if (name != NULL) + fprintf(output, "%s", (const char *) name); + break; + + } + case XPATH_OP_VALUE: { + xmlXPathObjectPtr object = (xmlXPathObjectPtr) op->value4; + + fprintf(output, "ELEM "); + xmlXPathDebugDumpObject(output, object, 0); + goto finish; + } + case XPATH_OP_VARIABLE: { + const xmlChar *prefix = op->value5; + const xmlChar *name = op->value4; + + if (prefix != NULL) + fprintf(output, "VARIABLE %s:%s", prefix, name); + else + fprintf(output, "VARIABLE %s", name); + break; + } + case XPATH_OP_FUNCTION: { + int nbargs = op->value; + const xmlChar *prefix = op->value5; + const xmlChar *name = op->value4; + + if (prefix != NULL) + fprintf(output, "FUNCTION %s:%s(%d args)", + prefix, name, nbargs); + else + fprintf(output, "FUNCTION %s(%d args)", name, nbargs); + break; + } + case XPATH_OP_ARG: fprintf(output, "ARG"); break; + case XPATH_OP_PREDICATE: fprintf(output, "PREDICATE"); break; + case XPATH_OP_FILTER: fprintf(output, "FILTER"); break; +#ifdef LIBXML_XPTR_ENABLED + case XPATH_OP_RANGETO: fprintf(output, "RANGETO"); break; +#endif + default: + fprintf(output, "UNKNOWN %d\n", op->op); return; + } + fprintf(output, "\n"); +finish: + if (op->ch1 >= 0) + xmlXPathDebugDumpStepOp(output, comp, &comp->steps[op->ch1], depth + 1); + if (op->ch2 >= 0) + xmlXPathDebugDumpStepOp(output, comp, &comp->steps[op->ch2], depth + 1); +} + +/** + * xmlXPathDebugDumpCompExpr: + * @output: the FILE * for the output + * @comp: the precompiled XPath expression + * @depth: the indentation level. + * + * Dumps the tree of the compiled XPath expression. + */ +void +xmlXPathDebugDumpCompExpr(FILE *output, xmlXPathCompExprPtr comp, + int depth) { + int i; + char shift[100]; + + if ((output == NULL) || (comp == NULL)) return; + + for (i = 0;((i < depth) && (i < 25));i++) + shift[2 * i] = shift[2 * i + 1] = ' '; + shift[2 * i] = shift[2 * i + 1] = 0; + + fprintf(output, "%s", shift); + + fprintf(output, "Compiled Expression : %d elements\n", + comp->nbStep); + i = comp->last; + xmlXPathDebugDumpStepOp(output, comp, &comp->steps[i], depth + 1); +} + +#ifdef XP_DEBUG_OBJ_USAGE + +/* +* XPath object usage related debugging variables. +*/ +static int xmlXPathDebugObjCounterUndefined = 0; +static int xmlXPathDebugObjCounterNodeset = 0; +static int xmlXPathDebugObjCounterBool = 0; +static int xmlXPathDebugObjCounterNumber = 0; +static int xmlXPathDebugObjCounterString = 0; +static int xmlXPathDebugObjCounterPoint = 0; +static int xmlXPathDebugObjCounterRange = 0; +static int xmlXPathDebugObjCounterLocset = 0; +static int xmlXPathDebugObjCounterUsers = 0; +static int xmlXPathDebugObjCounterXSLTTree = 0; +static int xmlXPathDebugObjCounterAll = 0; + +static int xmlXPathDebugObjTotalUndefined = 0; +static int xmlXPathDebugObjTotalNodeset = 0; +static int xmlXPathDebugObjTotalBool = 0; +static int xmlXPathDebugObjTotalNumber = 0; +static int xmlXPathDebugObjTotalString = 0; +static int xmlXPathDebugObjTotalPoint = 0; +static int xmlXPathDebugObjTotalRange = 0; +static int xmlXPathDebugObjTotalLocset = 0; +static int xmlXPathDebugObjTotalUsers = 0; +static int xmlXPathDebugObjTotalXSLTTree = 0; +static int xmlXPathDebugObjTotalAll = 0; + +static int xmlXPathDebugObjMaxUndefined = 0; +static int xmlXPathDebugObjMaxNodeset = 0; +static int xmlXPathDebugObjMaxBool = 0; +static int xmlXPathDebugObjMaxNumber = 0; +static int xmlXPathDebugObjMaxString = 0; +static int xmlXPathDebugObjMaxPoint = 0; +static int xmlXPathDebugObjMaxRange = 0; +static int xmlXPathDebugObjMaxLocset = 0; +static int xmlXPathDebugObjMaxUsers = 0; +static int xmlXPathDebugObjMaxXSLTTree = 0; +static int xmlXPathDebugObjMaxAll = 0; + +/* REVISIT TODO: Make this static when committing */ +static void +xmlXPathDebugObjUsageReset(xmlXPathContextPtr ctxt) +{ + if (ctxt != NULL) { + if (ctxt->cache != NULL) { + xmlXPathContextCachePtr cache = + (xmlXPathContextCachePtr) ctxt->cache; + + cache->dbgCachedAll = 0; + cache->dbgCachedNodeset = 0; + cache->dbgCachedString = 0; + cache->dbgCachedBool = 0; + cache->dbgCachedNumber = 0; + cache->dbgCachedPoint = 0; + cache->dbgCachedRange = 0; + cache->dbgCachedLocset = 0; + cache->dbgCachedUsers = 0; + cache->dbgCachedXSLTTree = 0; + cache->dbgCachedUndefined = 0; + + cache->dbgReusedAll = 0; + cache->dbgReusedNodeset = 0; + cache->dbgReusedString = 0; + cache->dbgReusedBool = 0; + cache->dbgReusedNumber = 0; + cache->dbgReusedPoint = 0; + cache->dbgReusedRange = 0; + cache->dbgReusedLocset = 0; + cache->dbgReusedUsers = 0; + cache->dbgReusedXSLTTree = 0; + cache->dbgReusedUndefined = 0; + } + } + + xmlXPathDebugObjCounterUndefined = 0; + xmlXPathDebugObjCounterNodeset = 0; + xmlXPathDebugObjCounterBool = 0; + xmlXPathDebugObjCounterNumber = 0; + xmlXPathDebugObjCounterString = 0; + xmlXPathDebugObjCounterPoint = 0; + xmlXPathDebugObjCounterRange = 0; + xmlXPathDebugObjCounterLocset = 0; + xmlXPathDebugObjCounterUsers = 0; + xmlXPathDebugObjCounterXSLTTree = 0; + xmlXPathDebugObjCounterAll = 0; + + xmlXPathDebugObjTotalUndefined = 0; + xmlXPathDebugObjTotalNodeset = 0; + xmlXPathDebugObjTotalBool = 0; + xmlXPathDebugObjTotalNumber = 0; + xmlXPathDebugObjTotalString = 0; + xmlXPathDebugObjTotalPoint = 0; + xmlXPathDebugObjTotalRange = 0; + xmlXPathDebugObjTotalLocset = 0; + xmlXPathDebugObjTotalUsers = 0; + xmlXPathDebugObjTotalXSLTTree = 0; + xmlXPathDebugObjTotalAll = 0; + + xmlXPathDebugObjMaxUndefined = 0; + xmlXPathDebugObjMaxNodeset = 0; + xmlXPathDebugObjMaxBool = 0; + xmlXPathDebugObjMaxNumber = 0; + xmlXPathDebugObjMaxString = 0; + xmlXPathDebugObjMaxPoint = 0; + xmlXPathDebugObjMaxRange = 0; + xmlXPathDebugObjMaxLocset = 0; + xmlXPathDebugObjMaxUsers = 0; + xmlXPathDebugObjMaxXSLTTree = 0; + xmlXPathDebugObjMaxAll = 0; + +} + +static void +xmlXPathDebugObjUsageRequested(xmlXPathContextPtr ctxt, + xmlXPathObjectType objType) +{ + int isCached = 0; + + if (ctxt != NULL) { + if (ctxt->cache != NULL) { + xmlXPathContextCachePtr cache = + (xmlXPathContextCachePtr) ctxt->cache; + + isCached = 1; + + cache->dbgReusedAll++; + switch (objType) { + case XPATH_UNDEFINED: + cache->dbgReusedUndefined++; + break; + case XPATH_NODESET: + cache->dbgReusedNodeset++; + break; + case XPATH_BOOLEAN: + cache->dbgReusedBool++; + break; + case XPATH_NUMBER: + cache->dbgReusedNumber++; + break; + case XPATH_STRING: + cache->dbgReusedString++; + break; + case XPATH_POINT: + cache->dbgReusedPoint++; + break; + case XPATH_RANGE: + cache->dbgReusedRange++; + break; + case XPATH_LOCATIONSET: + cache->dbgReusedLocset++; + break; + case XPATH_USERS: + cache->dbgReusedUsers++; + break; + case XPATH_XSLT_TREE: + cache->dbgReusedXSLTTree++; + break; + default: + break; + } + } + } + + switch (objType) { + case XPATH_UNDEFINED: + if (! isCached) + xmlXPathDebugObjTotalUndefined++; + xmlXPathDebugObjCounterUndefined++; + if (xmlXPathDebugObjCounterUndefined > + xmlXPathDebugObjMaxUndefined) + xmlXPathDebugObjMaxUndefined = + xmlXPathDebugObjCounterUndefined; + break; + case XPATH_NODESET: + if (! isCached) + xmlXPathDebugObjTotalNodeset++; + xmlXPathDebugObjCounterNodeset++; + if (xmlXPathDebugObjCounterNodeset > + xmlXPathDebugObjMaxNodeset) + xmlXPathDebugObjMaxNodeset = + xmlXPathDebugObjCounterNodeset; + break; + case XPATH_BOOLEAN: + if (! isCached) + xmlXPathDebugObjTotalBool++; + xmlXPathDebugObjCounterBool++; + if (xmlXPathDebugObjCounterBool > + xmlXPathDebugObjMaxBool) + xmlXPathDebugObjMaxBool = + xmlXPathDebugObjCounterBool; + break; + case XPATH_NUMBER: + if (! isCached) + xmlXPathDebugObjTotalNumber++; + xmlXPathDebugObjCounterNumber++; + if (xmlXPathDebugObjCounterNumber > + xmlXPathDebugObjMaxNumber) + xmlXPathDebugObjMaxNumber = + xmlXPathDebugObjCounterNumber; + break; + case XPATH_STRING: + if (! isCached) + xmlXPathDebugObjTotalString++; + xmlXPathDebugObjCounterString++; + if (xmlXPathDebugObjCounterString > + xmlXPathDebugObjMaxString) + xmlXPathDebugObjMaxString = + xmlXPathDebugObjCounterString; + break; + case XPATH_POINT: + if (! isCached) + xmlXPathDebugObjTotalPoint++; + xmlXPathDebugObjCounterPoint++; + if (xmlXPathDebugObjCounterPoint > + xmlXPathDebugObjMaxPoint) + xmlXPathDebugObjMaxPoint = + xmlXPathDebugObjCounterPoint; + break; + case XPATH_RANGE: + if (! isCached) + xmlXPathDebugObjTotalRange++; + xmlXPathDebugObjCounterRange++; + if (xmlXPathDebugObjCounterRange > + xmlXPathDebugObjMaxRange) + xmlXPathDebugObjMaxRange = + xmlXPathDebugObjCounterRange; + break; + case XPATH_LOCATIONSET: + if (! isCached) + xmlXPathDebugObjTotalLocset++; + xmlXPathDebugObjCounterLocset++; + if (xmlXPathDebugObjCounterLocset > + xmlXPathDebugObjMaxLocset) + xmlXPathDebugObjMaxLocset = + xmlXPathDebugObjCounterLocset; + break; + case XPATH_USERS: + if (! isCached) + xmlXPathDebugObjTotalUsers++; + xmlXPathDebugObjCounterUsers++; + if (xmlXPathDebugObjCounterUsers > + xmlXPathDebugObjMaxUsers) + xmlXPathDebugObjMaxUsers = + xmlXPathDebugObjCounterUsers; + break; + case XPATH_XSLT_TREE: + if (! isCached) + xmlXPathDebugObjTotalXSLTTree++; + xmlXPathDebugObjCounterXSLTTree++; + if (xmlXPathDebugObjCounterXSLTTree > + xmlXPathDebugObjMaxXSLTTree) + xmlXPathDebugObjMaxXSLTTree = + xmlXPathDebugObjCounterXSLTTree; + break; + default: + break; + } + if (! isCached) + xmlXPathDebugObjTotalAll++; + xmlXPathDebugObjCounterAll++; + if (xmlXPathDebugObjCounterAll > + xmlXPathDebugObjMaxAll) + xmlXPathDebugObjMaxAll = + xmlXPathDebugObjCounterAll; +} + +static void +xmlXPathDebugObjUsageReleased(xmlXPathContextPtr ctxt, + xmlXPathObjectType objType) +{ + int isCached = 0; + + if (ctxt != NULL) { + if (ctxt->cache != NULL) { + xmlXPathContextCachePtr cache = + (xmlXPathContextCachePtr) ctxt->cache; + + isCached = 1; + + cache->dbgCachedAll++; + switch (objType) { + case XPATH_UNDEFINED: + cache->dbgCachedUndefined++; + break; + case XPATH_NODESET: + cache->dbgCachedNodeset++; + break; + case XPATH_BOOLEAN: + cache->dbgCachedBool++; + break; + case XPATH_NUMBER: + cache->dbgCachedNumber++; + break; + case XPATH_STRING: + cache->dbgCachedString++; + break; + case XPATH_POINT: + cache->dbgCachedPoint++; + break; + case XPATH_RANGE: + cache->dbgCachedRange++; + break; + case XPATH_LOCATIONSET: + cache->dbgCachedLocset++; + break; + case XPATH_USERS: + cache->dbgCachedUsers++; + break; + case XPATH_XSLT_TREE: + cache->dbgCachedXSLTTree++; + break; + default: + break; + } + + } + } + switch (objType) { + case XPATH_UNDEFINED: + xmlXPathDebugObjCounterUndefined--; + break; + case XPATH_NODESET: + xmlXPathDebugObjCounterNodeset--; + break; + case XPATH_BOOLEAN: + xmlXPathDebugObjCounterBool--; + break; + case XPATH_NUMBER: + xmlXPathDebugObjCounterNumber--; + break; + case XPATH_STRING: + xmlXPathDebugObjCounterString--; + break; + case XPATH_POINT: + xmlXPathDebugObjCounterPoint--; + break; + case XPATH_RANGE: + xmlXPathDebugObjCounterRange--; + break; + case XPATH_LOCATIONSET: + xmlXPathDebugObjCounterLocset--; + break; + case XPATH_USERS: + xmlXPathDebugObjCounterUsers--; + break; + case XPATH_XSLT_TREE: + xmlXPathDebugObjCounterXSLTTree--; + break; + default: + break; + } + xmlXPathDebugObjCounterAll--; +} + +/* REVISIT TODO: Make this static when committing */ +static void +xmlXPathDebugObjUsageDisplay(xmlXPathContextPtr ctxt) +{ + int reqAll, reqNodeset, reqString, reqBool, reqNumber, + reqXSLTTree, reqUndefined; + int caAll = 0, caNodeset = 0, caString = 0, caBool = 0, + caNumber = 0, caXSLTTree = 0, caUndefined = 0; + int reAll = 0, reNodeset = 0, reString = 0, reBool = 0, + reNumber = 0, reXSLTTree = 0, reUndefined = 0; + int leftObjs = xmlXPathDebugObjCounterAll; + + reqAll = xmlXPathDebugObjTotalAll; + reqNodeset = xmlXPathDebugObjTotalNodeset; + reqString = xmlXPathDebugObjTotalString; + reqBool = xmlXPathDebugObjTotalBool; + reqNumber = xmlXPathDebugObjTotalNumber; + reqXSLTTree = xmlXPathDebugObjTotalXSLTTree; + reqUndefined = xmlXPathDebugObjTotalUndefined; + + printf("# XPath object usage:\n"); + + if (ctxt != NULL) { + if (ctxt->cache != NULL) { + xmlXPathContextCachePtr cache = + (xmlXPathContextCachePtr) ctxt->cache; + + reAll = cache->dbgReusedAll; + reqAll += reAll; + reNodeset = cache->dbgReusedNodeset; + reqNodeset += reNodeset; + reString = cache->dbgReusedString; + reqString += reString; + reBool = cache->dbgReusedBool; + reqBool += reBool; + reNumber = cache->dbgReusedNumber; + reqNumber += reNumber; + reXSLTTree = cache->dbgReusedXSLTTree; + reqXSLTTree += reXSLTTree; + reUndefined = cache->dbgReusedUndefined; + reqUndefined += reUndefined; + + caAll = cache->dbgCachedAll; + caBool = cache->dbgCachedBool; + caNodeset = cache->dbgCachedNodeset; + caString = cache->dbgCachedString; + caNumber = cache->dbgCachedNumber; + caXSLTTree = cache->dbgCachedXSLTTree; + caUndefined = cache->dbgCachedUndefined; + + if (cache->nodesetObjs) + leftObjs -= cache->nodesetObjs->number; + if (cache->stringObjs) + leftObjs -= cache->stringObjs->number; + if (cache->booleanObjs) + leftObjs -= cache->booleanObjs->number; + if (cache->numberObjs) + leftObjs -= cache->numberObjs->number; + if (cache->miscObjs) + leftObjs -= cache->miscObjs->number; + } + } + + printf("# all\n"); + printf("# total : %d\n", reqAll); + printf("# left : %d\n", leftObjs); + printf("# created: %d\n", xmlXPathDebugObjTotalAll); + printf("# reused : %d\n", reAll); + printf("# max : %d\n", xmlXPathDebugObjMaxAll); + + printf("# node-sets\n"); + printf("# total : %d\n", reqNodeset); + printf("# created: %d\n", xmlXPathDebugObjTotalNodeset); + printf("# reused : %d\n", reNodeset); + printf("# max : %d\n", xmlXPathDebugObjMaxNodeset); + + printf("# strings\n"); + printf("# total : %d\n", reqString); + printf("# created: %d\n", xmlXPathDebugObjTotalString); + printf("# reused : %d\n", reString); + printf("# max : %d\n", xmlXPathDebugObjMaxString); + + printf("# booleans\n"); + printf("# total : %d\n", reqBool); + printf("# created: %d\n", xmlXPathDebugObjTotalBool); + printf("# reused : %d\n", reBool); + printf("# max : %d\n", xmlXPathDebugObjMaxBool); + + printf("# numbers\n"); + printf("# total : %d\n", reqNumber); + printf("# created: %d\n", xmlXPathDebugObjTotalNumber); + printf("# reused : %d\n", reNumber); + printf("# max : %d\n", xmlXPathDebugObjMaxNumber); + + printf("# XSLT result tree fragments\n"); + printf("# total : %d\n", reqXSLTTree); + printf("# created: %d\n", xmlXPathDebugObjTotalXSLTTree); + printf("# reused : %d\n", reXSLTTree); + printf("# max : %d\n", xmlXPathDebugObjMaxXSLTTree); + + printf("# undefined\n"); + printf("# total : %d\n", reqUndefined); + printf("# created: %d\n", xmlXPathDebugObjTotalUndefined); + printf("# reused : %d\n", reUndefined); + printf("# max : %d\n", xmlXPathDebugObjMaxUndefined); + +} + +#endif /* XP_DEBUG_OBJ_USAGE */ + +#endif /* LIBXML_DEBUG_ENABLED */ + +/************************************************************************ + * * + * XPath object caching * + * * + ************************************************************************/ + +/** + * xmlXPathNewCache: + * + * Create a new object cache + * + * Returns the xmlXPathCache just allocated. + */ +static xmlXPathContextCachePtr +xmlXPathNewCache(void) +{ + xmlXPathContextCachePtr ret; + + ret = (xmlXPathContextCachePtr) xmlMalloc(sizeof(xmlXPathContextCache)); + if (ret == NULL) { + xmlXPathErrMemory(NULL, "creating object cache\n"); + return(NULL); + } + memset(ret, 0 , (size_t) sizeof(xmlXPathContextCache)); + ret->maxNodeset = 100; + ret->maxString = 100; + ret->maxBoolean = 100; + ret->maxNumber = 100; + ret->maxMisc = 100; + return(ret); +} + +static void +xmlXPathCacheFreeObjectList(xmlPointerListPtr list) +{ + int i; + xmlXPathObjectPtr obj; + + if (list == NULL) + return; + + for (i = 0; i < list->number; i++) { + obj = list->items[i]; + /* + * Note that it is already assured that we don't need to + * look out for namespace nodes in the node-set. + */ + if (obj->nodesetval != NULL) { + if (obj->nodesetval->nodeTab != NULL) + xmlFree(obj->nodesetval->nodeTab); + xmlFree(obj->nodesetval); + } + xmlFree(obj); +#ifdef XP_DEBUG_OBJ_USAGE + xmlXPathDebugObjCounterAll--; +#endif + } + xmlPointerListFree(list); +} + +static void +xmlXPathFreeCache(xmlXPathContextCachePtr cache) +{ + if (cache == NULL) + return; + if (cache->nodesetObjs) + xmlXPathCacheFreeObjectList(cache->nodesetObjs); + if (cache->stringObjs) + xmlXPathCacheFreeObjectList(cache->stringObjs); + if (cache->booleanObjs) + xmlXPathCacheFreeObjectList(cache->booleanObjs); + if (cache->numberObjs) + xmlXPathCacheFreeObjectList(cache->numberObjs); + if (cache->miscObjs) + xmlXPathCacheFreeObjectList(cache->miscObjs); + xmlFree(cache); +} + +/** + * xmlXPathContextSetCache: + * + * @ctxt: the XPath context + * @active: enables/disables (creates/frees) the cache + * @value: a value with semantics dependant on @options + * @options: options (currently only the value 0 is used) + * + * Creates/frees an object cache on the XPath context. + * If activates XPath objects (xmlXPathObject) will be cached internally + * to be reused. + * @options: + * 0: This will set the XPath object caching: + * @value: + * This will set the maximum number of XPath objects + * to be cached per slot + * There are 5 slots for: node-set, string, number, boolean, and + * misc objects. Use <0 for the default number (100). + * Other values for @options have currently no effect. + * + * Returns 0 if the setting succeeded, and -1 on API or internal errors. + */ +int +xmlXPathContextSetCache(xmlXPathContextPtr ctxt, + int active, + int value, + int options) +{ + if (ctxt == NULL) + return(-1); + if (active) { + xmlXPathContextCachePtr cache; + + if (ctxt->cache == NULL) { + ctxt->cache = xmlXPathNewCache(); + if (ctxt->cache == NULL) + return(-1); + } + cache = (xmlXPathContextCachePtr) ctxt->cache; + if (options == 0) { + if (value < 0) + value = 100; + cache->maxNodeset = value; + cache->maxString = value; + cache->maxNumber = value; + cache->maxBoolean = value; + cache->maxMisc = value; + } + } else if (ctxt->cache != NULL) { + xmlXPathFreeCache((xmlXPathContextCachePtr) ctxt->cache); + ctxt->cache = NULL; + } + return(0); +} + +/** + * xmlXPathCacheWrapNodeSet: + * @ctxt: the XPath context + * @val: the NodePtr value + * + * This is the cached version of xmlXPathWrapNodeSet(). + * Wrap the Nodeset @val in a new xmlXPathObjectPtr + * + * Returns the created or reused object. + */ +static xmlXPathObjectPtr +xmlXPathCacheWrapNodeSet(xmlXPathContextPtr ctxt, xmlNodeSetPtr val) +{ + if ((ctxt != NULL) && (ctxt->cache != NULL)) { + xmlXPathContextCachePtr cache = + (xmlXPathContextCachePtr) ctxt->cache; + + if ((cache->miscObjs != NULL) && + (cache->miscObjs->number != 0)) + { + xmlXPathObjectPtr ret; + + ret = (xmlXPathObjectPtr) + cache->miscObjs->items[--cache->miscObjs->number]; + ret->type = XPATH_NODESET; + ret->nodesetval = val; +#ifdef XP_DEBUG_OBJ_USAGE + xmlXPathDebugObjUsageRequested(ctxt, XPATH_NODESET); +#endif + return(ret); + } + } + + return(xmlXPathWrapNodeSet(val)); + +} + +/** + * xmlXPathCacheWrapString: + * @ctxt: the XPath context + * @val: the xmlChar * value + * + * This is the cached version of xmlXPathWrapString(). + * Wraps the @val string into an XPath object. + * + * Returns the created or reused object. + */ +static xmlXPathObjectPtr +xmlXPathCacheWrapString(xmlXPathContextPtr ctxt, xmlChar *val) +{ + if ((ctxt != NULL) && (ctxt->cache != NULL)) { + xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache; + + if ((cache->stringObjs != NULL) && + (cache->stringObjs->number != 0)) + { + + xmlXPathObjectPtr ret; + + ret = (xmlXPathObjectPtr) + cache->stringObjs->items[--cache->stringObjs->number]; + ret->type = XPATH_STRING; + ret->stringval = val; +#ifdef XP_DEBUG_OBJ_USAGE + xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING); +#endif + return(ret); + } else if ((cache->miscObjs != NULL) && + (cache->miscObjs->number != 0)) + { + xmlXPathObjectPtr ret; + /* + * Fallback to misc-cache. + */ + ret = (xmlXPathObjectPtr) + cache->miscObjs->items[--cache->miscObjs->number]; + + ret->type = XPATH_STRING; + ret->stringval = val; +#ifdef XP_DEBUG_OBJ_USAGE + xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING); +#endif + return(ret); + } + } + return(xmlXPathWrapString(val)); +} + +/** + * xmlXPathCacheNewNodeSet: + * @ctxt: the XPath context + * @val: the NodePtr value + * + * This is the cached version of xmlXPathNewNodeSet(). + * Acquire an xmlXPathObjectPtr of type NodeSet and initialize + * it with the single Node @val + * + * Returns the created or reused object. + */ +static xmlXPathObjectPtr +xmlXPathCacheNewNodeSet(xmlXPathContextPtr ctxt, xmlNodePtr val) +{ + if ((ctxt != NULL) && (ctxt->cache)) { + xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache; + + if ((cache->nodesetObjs != NULL) && + (cache->nodesetObjs->number != 0)) + { + xmlXPathObjectPtr ret; + /* + * Use the nodset-cache. + */ + ret = (xmlXPathObjectPtr) + cache->nodesetObjs->items[--cache->nodesetObjs->number]; + ret->type = XPATH_NODESET; + ret->boolval = 0; + if (val) { + if ((ret->nodesetval->nodeMax == 0) || + (val->type == XML_NAMESPACE_DECL)) + { + xmlXPathNodeSetAddUnique(ret->nodesetval, val); + } else { + ret->nodesetval->nodeTab[0] = val; + ret->nodesetval->nodeNr = 1; + } + } +#ifdef XP_DEBUG_OBJ_USAGE + xmlXPathDebugObjUsageRequested(ctxt, XPATH_NODESET); +#endif + return(ret); + } else if ((cache->miscObjs != NULL) && + (cache->miscObjs->number != 0)) + { + xmlXPathObjectPtr ret; + /* + * Fallback to misc-cache. + */ + + ret = (xmlXPathObjectPtr) + cache->miscObjs->items[--cache->miscObjs->number]; + + ret->type = XPATH_NODESET; + ret->boolval = 0; + ret->nodesetval = xmlXPathNodeSetCreate(val); + if (ret->nodesetval == NULL) { + ctxt->lastError.domain = XML_FROM_XPATH; + ctxt->lastError.code = XML_ERR_NO_MEMORY; + return(NULL); + } +#ifdef XP_DEBUG_OBJ_USAGE + xmlXPathDebugObjUsageRequested(ctxt, XPATH_NODESET); +#endif + return(ret); + } + } + return(xmlXPathNewNodeSet(val)); +} + +/** + * xmlXPathCacheNewCString: + * @ctxt: the XPath context + * @val: the char * value + * + * This is the cached version of xmlXPathNewCString(). + * Acquire an xmlXPathObjectPtr of type string and of value @val + * + * Returns the created or reused object. + */ +static xmlXPathObjectPtr +xmlXPathCacheNewCString(xmlXPathContextPtr ctxt, const char *val) +{ + if ((ctxt != NULL) && (ctxt->cache)) { + xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache; + + if ((cache->stringObjs != NULL) && + (cache->stringObjs->number != 0)) + { + xmlXPathObjectPtr ret; + + ret = (xmlXPathObjectPtr) + cache->stringObjs->items[--cache->stringObjs->number]; + + ret->type = XPATH_STRING; + ret->stringval = xmlStrdup(BAD_CAST val); +#ifdef XP_DEBUG_OBJ_USAGE + xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING); +#endif + return(ret); + } else if ((cache->miscObjs != NULL) && + (cache->miscObjs->number != 0)) + { + xmlXPathObjectPtr ret; + + ret = (xmlXPathObjectPtr) + cache->miscObjs->items[--cache->miscObjs->number]; + + ret->type = XPATH_STRING; + ret->stringval = xmlStrdup(BAD_CAST val); +#ifdef XP_DEBUG_OBJ_USAGE + xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING); +#endif + return(ret); + } + } + return(xmlXPathNewCString(val)); +} + +/** + * xmlXPathCacheNewString: + * @ctxt: the XPath context + * @val: the xmlChar * value + * + * This is the cached version of xmlXPathNewString(). + * Acquire an xmlXPathObjectPtr of type string and of value @val + * + * Returns the created or reused object. + */ +static xmlXPathObjectPtr +xmlXPathCacheNewString(xmlXPathContextPtr ctxt, const xmlChar *val) +{ + if ((ctxt != NULL) && (ctxt->cache)) { + xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache; + + if ((cache->stringObjs != NULL) && + (cache->stringObjs->number != 0)) + { + xmlXPathObjectPtr ret; + + ret = (xmlXPathObjectPtr) + cache->stringObjs->items[--cache->stringObjs->number]; + ret->type = XPATH_STRING; + if (val != NULL) + ret->stringval = xmlStrdup(val); + else + ret->stringval = xmlStrdup((const xmlChar *)""); +#ifdef XP_DEBUG_OBJ_USAGE + xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING); +#endif + return(ret); + } else if ((cache->miscObjs != NULL) && + (cache->miscObjs->number != 0)) + { + xmlXPathObjectPtr ret; + + ret = (xmlXPathObjectPtr) + cache->miscObjs->items[--cache->miscObjs->number]; + + ret->type = XPATH_STRING; + if (val != NULL) + ret->stringval = xmlStrdup(val); + else + ret->stringval = xmlStrdup((const xmlChar *)""); +#ifdef XP_DEBUG_OBJ_USAGE + xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING); +#endif + return(ret); + } + } + return(xmlXPathNewString(val)); +} + +/** + * xmlXPathCacheNewBoolean: + * @ctxt: the XPath context + * @val: the boolean value + * + * This is the cached version of xmlXPathNewBoolean(). + * Acquires an xmlXPathObjectPtr of type boolean and of value @val + * + * Returns the created or reused object. + */ +static xmlXPathObjectPtr +xmlXPathCacheNewBoolean(xmlXPathContextPtr ctxt, int val) +{ + if ((ctxt != NULL) && (ctxt->cache)) { + xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache; + + if ((cache->booleanObjs != NULL) && + (cache->booleanObjs->number != 0)) + { + xmlXPathObjectPtr ret; + + ret = (xmlXPathObjectPtr) + cache->booleanObjs->items[--cache->booleanObjs->number]; + ret->type = XPATH_BOOLEAN; + ret->boolval = (val != 0); +#ifdef XP_DEBUG_OBJ_USAGE + xmlXPathDebugObjUsageRequested(ctxt, XPATH_BOOLEAN); +#endif + return(ret); + } else if ((cache->miscObjs != NULL) && + (cache->miscObjs->number != 0)) + { + xmlXPathObjectPtr ret; + + ret = (xmlXPathObjectPtr) + cache->miscObjs->items[--cache->miscObjs->number]; + + ret->type = XPATH_BOOLEAN; + ret->boolval = (val != 0); +#ifdef XP_DEBUG_OBJ_USAGE + xmlXPathDebugObjUsageRequested(ctxt, XPATH_BOOLEAN); +#endif + return(ret); + } + } + return(xmlXPathNewBoolean(val)); +} + +/** + * xmlXPathCacheNewFloat: + * @ctxt: the XPath context + * @val: the double value + * + * This is the cached version of xmlXPathNewFloat(). + * Acquires an xmlXPathObjectPtr of type double and of value @val + * + * Returns the created or reused object. + */ +static xmlXPathObjectPtr +xmlXPathCacheNewFloat(xmlXPathContextPtr ctxt, double val) +{ + if ((ctxt != NULL) && (ctxt->cache)) { + xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache; + + if ((cache->numberObjs != NULL) && + (cache->numberObjs->number != 0)) + { + xmlXPathObjectPtr ret; + + ret = (xmlXPathObjectPtr) + cache->numberObjs->items[--cache->numberObjs->number]; + ret->type = XPATH_NUMBER; + ret->floatval = val; +#ifdef XP_DEBUG_OBJ_USAGE + xmlXPathDebugObjUsageRequested(ctxt, XPATH_NUMBER); +#endif + return(ret); + } else if ((cache->miscObjs != NULL) && + (cache->miscObjs->number != 0)) + { + xmlXPathObjectPtr ret; + + ret = (xmlXPathObjectPtr) + cache->miscObjs->items[--cache->miscObjs->number]; + + ret->type = XPATH_NUMBER; + ret->floatval = val; +#ifdef XP_DEBUG_OBJ_USAGE + xmlXPathDebugObjUsageRequested(ctxt, XPATH_NUMBER); +#endif + return(ret); + } + } + return(xmlXPathNewFloat(val)); +} + +/** + * xmlXPathCacheConvertString: + * @ctxt: the XPath context + * @val: an XPath object + * + * This is the cached version of xmlXPathConvertString(). + * Converts an existing object to its string() equivalent + * + * Returns a created or reused object, the old one is freed (cached) + * (or the operation is done directly on @val) + */ + +static xmlXPathObjectPtr +xmlXPathCacheConvertString(xmlXPathContextPtr ctxt, xmlXPathObjectPtr val) { + xmlChar *res = NULL; + + if (val == NULL) + return(xmlXPathCacheNewCString(ctxt, "")); + + switch (val->type) { + case XPATH_UNDEFINED: +#ifdef DEBUG_EXPR + xmlGenericError(xmlGenericErrorContext, "STRING: undefined\n"); +#endif + break; + case XPATH_NODESET: + case XPATH_XSLT_TREE: + res = xmlXPathCastNodeSetToString(val->nodesetval); + break; + case XPATH_STRING: + return(val); + case XPATH_BOOLEAN: + res = xmlXPathCastBooleanToString(val->boolval); + break; + case XPATH_NUMBER: + res = xmlXPathCastNumberToString(val->floatval); + break; + case XPATH_USERS: + case XPATH_POINT: + case XPATH_RANGE: + case XPATH_LOCATIONSET: + TODO; + break; + } + xmlXPathReleaseObject(ctxt, val); + if (res == NULL) + return(xmlXPathCacheNewCString(ctxt, "")); + return(xmlXPathCacheWrapString(ctxt, res)); +} + +/** + * xmlXPathCacheObjectCopy: + * @ctxt: the XPath context + * @val: the original object + * + * This is the cached version of xmlXPathObjectCopy(). + * Acquire a copy of a given object + * + * Returns a created or reused created object. + */ +static xmlXPathObjectPtr +xmlXPathCacheObjectCopy(xmlXPathContextPtr ctxt, xmlXPathObjectPtr val) +{ + if (val == NULL) + return(NULL); + + if (XP_HAS_CACHE(ctxt)) { + switch (val->type) { + case XPATH_NODESET: + return(xmlXPathCacheWrapNodeSet(ctxt, + xmlXPathNodeSetMerge(NULL, val->nodesetval))); + case XPATH_STRING: + return(xmlXPathCacheNewString(ctxt, val->stringval)); + case XPATH_BOOLEAN: + return(xmlXPathCacheNewBoolean(ctxt, val->boolval)); + case XPATH_NUMBER: + return(xmlXPathCacheNewFloat(ctxt, val->floatval)); + default: + break; + } + } + return(xmlXPathObjectCopy(val)); +} + +/** + * xmlXPathCacheConvertBoolean: + * @ctxt: the XPath context + * @val: an XPath object + * + * This is the cached version of xmlXPathConvertBoolean(). + * Converts an existing object to its boolean() equivalent + * + * Returns a created or reused object, the old one is freed (or the operation + * is done directly on @val) + */ +static xmlXPathObjectPtr +xmlXPathCacheConvertBoolean(xmlXPathContextPtr ctxt, xmlXPathObjectPtr val) { + xmlXPathObjectPtr ret; + + if (val == NULL) + return(xmlXPathCacheNewBoolean(ctxt, 0)); + if (val->type == XPATH_BOOLEAN) + return(val); + ret = xmlXPathCacheNewBoolean(ctxt, xmlXPathCastToBoolean(val)); + xmlXPathReleaseObject(ctxt, val); + return(ret); +} + +/** + * xmlXPathCacheConvertNumber: + * @ctxt: the XPath context + * @val: an XPath object + * + * This is the cached version of xmlXPathConvertNumber(). + * Converts an existing object to its number() equivalent + * + * Returns a created or reused object, the old one is freed (or the operation + * is done directly on @val) + */ +static xmlXPathObjectPtr +xmlXPathCacheConvertNumber(xmlXPathContextPtr ctxt, xmlXPathObjectPtr val) { + xmlXPathObjectPtr ret; + + if (val == NULL) + return(xmlXPathCacheNewFloat(ctxt, 0.0)); + if (val->type == XPATH_NUMBER) + return(val); + ret = xmlXPathCacheNewFloat(ctxt, xmlXPathCastToNumber(val)); + xmlXPathReleaseObject(ctxt, val); + return(ret); +} + +/************************************************************************ + * * + * Parser stacks related functions and macros * + * * + ************************************************************************/ + +/** + * xmlXPathSetFrame: + * @ctxt: an XPath parser context + * + * Set the callee evaluation frame + * + * Returns the previous frame value to be restored once done + */ +static int +xmlXPathSetFrame(xmlXPathParserContextPtr ctxt) { + int ret; + + if (ctxt == NULL) + return(0); + ret = ctxt->valueFrame; + ctxt->valueFrame = ctxt->valueNr; + return(ret); +} + +/** + * xmlXPathPopFrame: + * @ctxt: an XPath parser context + * @frame: the previous frame value + * + * Remove the callee evaluation frame + */ +static void +xmlXPathPopFrame(xmlXPathParserContextPtr ctxt, int frame) { + if (ctxt == NULL) + return; + if (ctxt->valueNr < ctxt->valueFrame) { + xmlXPatherror(ctxt, __FILE__, __LINE__, XPATH_STACK_ERROR); + } + ctxt->valueFrame = frame; +} + +/** + * valuePop: + * @ctxt: an XPath evaluation context + * + * Pops the top XPath object from the value stack + * + * Returns the XPath object just removed + */ +xmlXPathObjectPtr +valuePop(xmlXPathParserContextPtr ctxt) +{ + xmlXPathObjectPtr ret; + + if ((ctxt == NULL) || (ctxt->valueNr <= 0)) + return (NULL); + + if (ctxt->valueNr <= ctxt->valueFrame) { + xmlXPatherror(ctxt, __FILE__, __LINE__, XPATH_STACK_ERROR); + return (NULL); + } + + ctxt->valueNr--; + if (ctxt->valueNr > 0) + ctxt->value = ctxt->valueTab[ctxt->valueNr - 1]; + else + ctxt->value = NULL; + ret = ctxt->valueTab[ctxt->valueNr]; + ctxt->valueTab[ctxt->valueNr] = NULL; + return (ret); +} +/** + * valuePush: + * @ctxt: an XPath evaluation context + * @value: the XPath object + * + * Pushes a new XPath object on top of the value stack + * + * returns the number of items on the value stack + */ +int +valuePush(xmlXPathParserContextPtr ctxt, xmlXPathObjectPtr value) +{ + if ((ctxt == NULL) || (value == NULL)) return(-1); + if (ctxt->valueNr >= ctxt->valueMax) { + xmlXPathObjectPtr *tmp; + + if (ctxt->valueMax >= XPATH_MAX_STACK_DEPTH) { + xmlXPathErrMemory(NULL, "XPath stack depth limit reached\n"); + ctxt->error = XPATH_MEMORY_ERROR; + return (0); + } + tmp = (xmlXPathObjectPtr *) xmlRealloc(ctxt->valueTab, + 2 * ctxt->valueMax * + sizeof(ctxt->valueTab[0])); + if (tmp == NULL) { + xmlXPathErrMemory(NULL, "pushing value\n"); + ctxt->error = XPATH_MEMORY_ERROR; + return (0); + } + ctxt->valueMax *= 2; + ctxt->valueTab = tmp; + } + ctxt->valueTab[ctxt->valueNr] = value; + ctxt->value = value; + return (ctxt->valueNr++); +} + +/** + * xmlXPathPopBoolean: + * @ctxt: an XPath parser context + * + * Pops a boolean from the stack, handling conversion if needed. + * Check error with #xmlXPathCheckError. + * + * Returns the boolean + */ +int +xmlXPathPopBoolean (xmlXPathParserContextPtr ctxt) { + xmlXPathObjectPtr obj; + int ret; + + obj = valuePop(ctxt); + if (obj == NULL) { + xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND); + return(0); + } + if (obj->type != XPATH_BOOLEAN) + ret = xmlXPathCastToBoolean(obj); + else + ret = obj->boolval; + xmlXPathReleaseObject(ctxt->context, obj); + return(ret); +} + +/** + * xmlXPathPopNumber: + * @ctxt: an XPath parser context + * + * Pops a number from the stack, handling conversion if needed. + * Check error with #xmlXPathCheckError. + * + * Returns the number + */ +double +xmlXPathPopNumber (xmlXPathParserContextPtr ctxt) { + xmlXPathObjectPtr obj; + double ret; + + obj = valuePop(ctxt); + if (obj == NULL) { + xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND); + return(0); + } + if (obj->type != XPATH_NUMBER) + ret = xmlXPathCastToNumber(obj); + else + ret = obj->floatval; + xmlXPathReleaseObject(ctxt->context, obj); + return(ret); +} + +/** + * xmlXPathPopString: + * @ctxt: an XPath parser context + * + * Pops a string from the stack, handling conversion if needed. + * Check error with #xmlXPathCheckError. + * + * Returns the string + */ +xmlChar * +xmlXPathPopString (xmlXPathParserContextPtr ctxt) { + xmlXPathObjectPtr obj; + xmlChar * ret; + + obj = valuePop(ctxt); + if (obj == NULL) { + xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND); + return(NULL); + } + ret = xmlXPathCastToString(obj); /* this does required strdup */ + /* TODO: needs refactoring somewhere else */ + if (obj->stringval == ret) + obj->stringval = NULL; + xmlXPathReleaseObject(ctxt->context, obj); + return(ret); +} + +/** + * xmlXPathPopNodeSet: + * @ctxt: an XPath parser context + * + * Pops a node-set from the stack, handling conversion if needed. + * Check error with #xmlXPathCheckError. + * + * Returns the node-set + */ +xmlNodeSetPtr +xmlXPathPopNodeSet (xmlXPathParserContextPtr ctxt) { + xmlXPathObjectPtr obj; + xmlNodeSetPtr ret; + + if (ctxt == NULL) return(NULL); + if (ctxt->value == NULL) { + xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND); + return(NULL); + } + if (!xmlXPathStackIsNodeSet(ctxt)) { + xmlXPathSetTypeError(ctxt); + return(NULL); + } + obj = valuePop(ctxt); + ret = obj->nodesetval; +#if 0 + /* to fix memory leak of not clearing obj->user */ + if (obj->boolval && obj->user != NULL) + xmlFreeNodeList((xmlNodePtr) obj->user); +#endif + obj->nodesetval = NULL; + xmlXPathReleaseObject(ctxt->context, obj); + return(ret); +} + +/** + * xmlXPathPopExternal: + * @ctxt: an XPath parser context + * + * Pops an external object from the stack, handling conversion if needed. + * Check error with #xmlXPathCheckError. + * + * Returns the object + */ +void * +xmlXPathPopExternal (xmlXPathParserContextPtr ctxt) { + xmlXPathObjectPtr obj; + void * ret; + + if ((ctxt == NULL) || (ctxt->value == NULL)) { + xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND); + return(NULL); + } + if (ctxt->value->type != XPATH_USERS) { + xmlXPathSetTypeError(ctxt); + return(NULL); + } + obj = valuePop(ctxt); + ret = obj->user; + obj->user = NULL; + xmlXPathReleaseObject(ctxt->context, obj); + return(ret); +} + +/* + * Macros for accessing the content. Those should be used only by the parser, + * and not exported. + * + * Dirty macros, i.e. one need to make assumption on the context to use them + * + * CUR_PTR return the current pointer to the xmlChar to be parsed. + * CUR returns the current xmlChar value, i.e. a 8 bit value + * in ISO-Latin or UTF-8. + * This should be used internally by the parser + * only to compare to ASCII values otherwise it would break when + * running with UTF-8 encoding. + * NXT(n) returns the n'th next xmlChar. Same as CUR is should be used only + * to compare on ASCII based substring. + * SKIP(n) Skip n xmlChar, and must also be used only to skip ASCII defined + * strings within the parser. + * CURRENT Returns the current char value, with the full decoding of + * UTF-8 if we are using this mode. It returns an int. + * NEXT Skip to the next character, this does the proper decoding + * in UTF-8 mode. It also pop-up unfinished entities on the fly. + * It returns the pointer to the current xmlChar. + */ + +#define CUR (*ctxt->cur) +#define SKIP(val) ctxt->cur += (val) +#define NXT(val) ctxt->cur[(val)] +#define CUR_PTR ctxt->cur +#define CUR_CHAR(l) xmlXPathCurrentChar(ctxt, &l) + +#define COPY_BUF(l,b,i,v) \ + if (l == 1) b[i++] = (xmlChar) v; \ + else i += xmlCopyChar(l,&b[i],v) + +#define NEXTL(l) ctxt->cur += l + +#define SKIP_BLANKS \ + while (IS_BLANK_CH(*(ctxt->cur))) NEXT + +#define CURRENT (*ctxt->cur) +#define NEXT ((*ctxt->cur) ? ctxt->cur++: ctxt->cur) + + +#ifndef DBL_DIG +#define DBL_DIG 16 +#endif +#ifndef DBL_EPSILON +#define DBL_EPSILON 1E-9 +#endif + +#define UPPER_DOUBLE 1E9 +#define LOWER_DOUBLE 1E-5 +#define LOWER_DOUBLE_EXP 5 + +#define INTEGER_DIGITS DBL_DIG +#define FRACTION_DIGITS (DBL_DIG + 1 + (LOWER_DOUBLE_EXP)) +#define EXPONENT_DIGITS (3 + 2) + +/** + * xmlXPathFormatNumber: + * @number: number to format + * @buffer: output buffer + * @buffersize: size of output buffer + * + * Convert the number into a string representation. + */ +static void +xmlXPathFormatNumber(double number, char buffer[], int buffersize) +{ + switch (xmlXPathIsInf(number)) { + case 1: + if (buffersize > (int)sizeof("Infinity")) + snprintf(buffer, buffersize, "Infinity"); + break; + case -1: + if (buffersize > (int)sizeof("-Infinity")) + snprintf(buffer, buffersize, "-Infinity"); + break; + default: + if (xmlXPathIsNaN(number)) { + if (buffersize > (int)sizeof("NaN")) + snprintf(buffer, buffersize, "NaN"); + } else if (number == 0 && xmlXPathGetSign(number) != 0) { + snprintf(buffer, buffersize, "0"); + } else if (number == ((int) number)) { + char work[30]; + char *ptr, *cur; + int value = (int) number; + + ptr = &buffer[0]; + if (value == 0) { + *ptr++ = '0'; + } else { + snprintf(work, 29, "%d", value); + cur = &work[0]; + while ((*cur) && (ptr - buffer < buffersize)) { + *ptr++ = *cur++; + } + } + if (ptr - buffer < buffersize) { + *ptr = 0; + } else if (buffersize > 0) { + ptr--; + *ptr = 0; + } + } else { + /* + For the dimension of work, + DBL_DIG is number of significant digits + EXPONENT is only needed for "scientific notation" + 3 is sign, decimal point, and terminating zero + LOWER_DOUBLE_EXP is max number of leading zeroes in fraction + Note that this dimension is slightly (a few characters) + larger than actually necessary. + */ + char work[DBL_DIG + EXPONENT_DIGITS + 3 + LOWER_DOUBLE_EXP]; + int integer_place, fraction_place; + char *ptr; + char *after_fraction; + double absolute_value; + int size; + + absolute_value = fabs(number); + + /* + * First choose format - scientific or regular floating point. + * In either case, result is in work, and after_fraction points + * just past the fractional part. + */ + if ( ((absolute_value > UPPER_DOUBLE) || + (absolute_value < LOWER_DOUBLE)) && + (absolute_value != 0.0) ) { + /* Use scientific notation */ + integer_place = DBL_DIG + EXPONENT_DIGITS + 1; + fraction_place = DBL_DIG - 1; + size = snprintf(work, sizeof(work),"%*.*e", + integer_place, fraction_place, number); + while ((size > 0) && (work[size] != 'e')) size--; + + } + else { + /* Use regular notation */ + if (absolute_value > 0.0) { + integer_place = (int)log10(absolute_value); + if (integer_place > 0) + fraction_place = DBL_DIG - integer_place - 1; + else + fraction_place = DBL_DIG - integer_place; + } else { + fraction_place = 1; + } + size = snprintf(work, sizeof(work), "%0.*f", + fraction_place, number); + } + + /* Remove fractional trailing zeroes */ + after_fraction = work + size; + ptr = after_fraction; + while (*(--ptr) == '0') + ; + if (*ptr != '.') + ptr++; + while ((*ptr++ = *after_fraction++) != 0); + + /* Finally copy result back to caller */ + size = strlen(work) + 1; + if (size > buffersize) { + work[buffersize - 1] = 0; + size = buffersize; + } + memmove(buffer, work, size); + } + break; + } +} + + +/************************************************************************ + * * + * Routines to handle NodeSets * + * * + ************************************************************************/ + +/** + * xmlXPathOrderDocElems: + * @doc: an input document + * + * Call this routine to speed up XPath computation on static documents. + * This stamps all the element nodes with the document order + * Like for line information, the order is kept in the element->content + * field, the value stored is actually - the node number (starting at -1) + * to be able to differentiate from line numbers. + * + * Returns the number of elements found in the document or -1 in case + * of error. + */ +long +xmlXPathOrderDocElems(xmlDocPtr doc) { + long count = 0; + xmlNodePtr cur; + + if (doc == NULL) + return(-1); + cur = doc->children; + while (cur != NULL) { + if (cur->type == XML_ELEMENT_NODE) { + cur->content = (void *) (-(++count)); + if (cur->children != NULL) { + cur = cur->children; + continue; + } + } + if (cur->next != NULL) { + cur = cur->next; + continue; + } + do { + cur = cur->parent; + if (cur == NULL) + break; + if (cur == (xmlNodePtr) doc) { + cur = NULL; + break; + } + if (cur->next != NULL) { + cur = cur->next; + break; + } + } while (cur != NULL); + } + return(count); +} + +/** + * xmlXPathCmpNodes: + * @node1: the first node + * @node2: the second node + * + * Compare two nodes w.r.t document order + * + * Returns -2 in case of error 1 if first point < second point, 0 if + * it's the same node, -1 otherwise + */ +int +xmlXPathCmpNodes(xmlNodePtr node1, xmlNodePtr node2) { + int depth1, depth2; + int attr1 = 0, attr2 = 0; + xmlNodePtr attrNode1 = NULL, attrNode2 = NULL; + xmlNodePtr cur, root; + + if ((node1 == NULL) || (node2 == NULL)) + return(-2); + /* + * a couple of optimizations which will avoid computations in most cases + */ + if (node1 == node2) /* trivial case */ + return(0); + if (node1->type == XML_ATTRIBUTE_NODE) { + attr1 = 1; + attrNode1 = node1; + node1 = node1->parent; + } + if (node2->type == XML_ATTRIBUTE_NODE) { + attr2 = 1; + attrNode2 = node2; + node2 = node2->parent; + } + if (node1 == node2) { + if (attr1 == attr2) { + /* not required, but we keep attributes in order */ + if (attr1 != 0) { + cur = attrNode2->prev; + while (cur != NULL) { + if (cur == attrNode1) + return (1); + cur = cur->prev; + } + return (-1); + } + return(0); + } + if (attr2 == 1) + return(1); + return(-1); + } + if ((node1->type == XML_NAMESPACE_DECL) || + (node2->type == XML_NAMESPACE_DECL)) + return(1); + if (node1 == node2->prev) + return(1); + if (node1 == node2->next) + return(-1); + + /* + * Speedup using document order if availble. + */ + if ((node1->type == XML_ELEMENT_NODE) && + (node2->type == XML_ELEMENT_NODE) && + (0 > (long) node1->content) && + (0 > (long) node2->content) && + (node1->doc == node2->doc)) { + long l1, l2; + + l1 = -((long) node1->content); + l2 = -((long) node2->content); + if (l1 < l2) + return(1); + if (l1 > l2) + return(-1); + } + + /* + * compute depth to root + */ + for (depth2 = 0, cur = node2;cur->parent != NULL;cur = cur->parent) { + if (cur == node1) + return(1); + depth2++; + } + root = cur; + for (depth1 = 0, cur = node1;cur->parent != NULL;cur = cur->parent) { + if (cur == node2) + return(-1); + depth1++; + } + /* + * Distinct document (or distinct entities :-( ) case. + */ + if (root != cur) { + return(-2); + } + /* + * get the nearest common ancestor. + */ + while (depth1 > depth2) { + depth1--; + node1 = node1->parent; + } + while (depth2 > depth1) { + depth2--; + node2 = node2->parent; + } + while (node1->parent != node2->parent) { + node1 = node1->parent; + node2 = node2->parent; + /* should not happen but just in case ... */ + if ((node1 == NULL) || (node2 == NULL)) + return(-2); + } + /* + * Find who's first. + */ + if (node1 == node2->prev) + return(1); + if (node1 == node2->next) + return(-1); + /* + * Speedup using document order if availble. + */ + if ((node1->type == XML_ELEMENT_NODE) && + (node2->type == XML_ELEMENT_NODE) && + (0 > (long) node1->content) && + (0 > (long) node2->content) && + (node1->doc == node2->doc)) { + long l1, l2; + + l1 = -((long) node1->content); + l2 = -((long) node2->content); + if (l1 < l2) + return(1); + if (l1 > l2) + return(-1); + } + + for (cur = node1->next;cur != NULL;cur = cur->next) + if (cur == node2) + return(1); + return(-1); /* assume there is no sibling list corruption */ +} + +#ifdef XP_OPTIMIZED_NON_ELEM_COMPARISON +/** + * xmlXPathCmpNodesExt: + * @node1: the first node + * @node2: the second node + * + * Compare two nodes w.r.t document order. + * This one is optimized for handling of non-element nodes. + * + * Returns -2 in case of error 1 if first point < second point, 0 if + * it's the same node, -1 otherwise + */ +static int +xmlXPathCmpNodesExt(xmlNodePtr node1, xmlNodePtr node2) { + int depth1, depth2; + int misc = 0, precedence1 = 0, precedence2 = 0; + xmlNodePtr miscNode1 = NULL, miscNode2 = NULL; + xmlNodePtr cur, root; + long l1, l2; + + if ((node1 == NULL) || (node2 == NULL)) + return(-2); + + if (node1 == node2) + return(0); + + /* + * a couple of optimizations which will avoid computations in most cases + */ + switch (node1->type) { + case XML_ELEMENT_NODE: + if (node2->type == XML_ELEMENT_NODE) { + if ((0 > (long) node1->content) && /* TODO: Would a != 0 suffice here? */ + (0 > (long) node2->content) && + (node1->doc == node2->doc)) + { + l1 = -((long) node1->content); + l2 = -((long) node2->content); + if (l1 < l2) + return(1); + if (l1 > l2) + return(-1); + } else + goto turtle_comparison; + } + break; + case XML_ATTRIBUTE_NODE: + precedence1 = 1; /* element is owner */ + miscNode1 = node1; + node1 = node1->parent; + misc = 1; + break; + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + case XML_COMMENT_NODE: + case XML_PI_NODE: { + miscNode1 = node1; + /* + * Find nearest element node. + */ + if (node1->prev != NULL) { + do { + node1 = node1->prev; + if (node1->type == XML_ELEMENT_NODE) { + precedence1 = 3; /* element in prev-sibl axis */ + break; + } + if (node1->prev == NULL) { + precedence1 = 2; /* element is parent */ + /* + * URGENT TODO: Are there any cases, where the + * parent of such a node is not an element node? + */ + node1 = node1->parent; + break; + } + } while (1); + } else { + precedence1 = 2; /* element is parent */ + node1 = node1->parent; + } + if ((node1 == NULL) || (node1->type != XML_ELEMENT_NODE) || + (0 <= (long) node1->content)) { + /* + * Fallback for whatever case. + */ + node1 = miscNode1; + precedence1 = 0; + } else + misc = 1; + } + break; + case XML_NAMESPACE_DECL: + /* + * TODO: why do we return 1 for namespace nodes? + */ + return(1); + default: + break; + } + switch (node2->type) { + case XML_ELEMENT_NODE: + break; + case XML_ATTRIBUTE_NODE: + precedence2 = 1; /* element is owner */ + miscNode2 = node2; + node2 = node2->parent; + misc = 1; + break; + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + case XML_COMMENT_NODE: + case XML_PI_NODE: { + miscNode2 = node2; + if (node2->prev != NULL) { + do { + node2 = node2->prev; + if (node2->type == XML_ELEMENT_NODE) { + precedence2 = 3; /* element in prev-sibl axis */ + break; + } + if (node2->prev == NULL) { + precedence2 = 2; /* element is parent */ + node2 = node2->parent; + break; + } + } while (1); + } else { + precedence2 = 2; /* element is parent */ + node2 = node2->parent; + } + if ((node2 == NULL) || (node2->type != XML_ELEMENT_NODE) || + (0 <= (long) node1->content)) + { + node2 = miscNode2; + precedence2 = 0; + } else + misc = 1; + } + break; + case XML_NAMESPACE_DECL: + return(1); + default: + break; + } + if (misc) { + if (node1 == node2) { + if (precedence1 == precedence2) { + /* + * The ugly case; but normally there aren't many + * adjacent non-element nodes around. + */ + cur = miscNode2->prev; + while (cur != NULL) { + if (cur == miscNode1) + return(1); + if (cur->type == XML_ELEMENT_NODE) + return(-1); + cur = cur->prev; + } + return (-1); + } else { + /* + * Evaluate based on higher precedence wrt to the element. + * TODO: This assumes attributes are sorted before content. + * Is this 100% correct? + */ + if (precedence1 < precedence2) + return(1); + else + return(-1); + } + } + /* + * Special case: One of the helper-elements is contained by the other. + * + * + * Text-1(precedence1 == 2) + * + * Text-6(precedence2 == 3) + * + */ + if ((precedence2 == 3) && (precedence1 > 1)) { + cur = node1->parent; + while (cur) { + if (cur == node2) + return(1); + cur = cur->parent; + } + } + if ((precedence1 == 3) && (precedence2 > 1)) { + cur = node2->parent; + while (cur) { + if (cur == node1) + return(-1); + cur = cur->parent; + } + } + } + + /* + * Speedup using document order if availble. + */ + if ((node1->type == XML_ELEMENT_NODE) && + (node2->type == XML_ELEMENT_NODE) && + (0 > (long) node1->content) && + (0 > (long) node2->content) && + (node1->doc == node2->doc)) { + + l1 = -((long) node1->content); + l2 = -((long) node2->content); + if (l1 < l2) + return(1); + if (l1 > l2) + return(-1); + } + +turtle_comparison: + + if (node1 == node2->prev) + return(1); + if (node1 == node2->next) + return(-1); + /* + * compute depth to root + */ + for (depth2 = 0, cur = node2;cur->parent != NULL;cur = cur->parent) { + if (cur == node1) + return(1); + depth2++; + } + root = cur; + for (depth1 = 0, cur = node1;cur->parent != NULL;cur = cur->parent) { + if (cur == node2) + return(-1); + depth1++; + } + /* + * Distinct document (or distinct entities :-( ) case. + */ + if (root != cur) { + return(-2); + } + /* + * get the nearest common ancestor. + */ + while (depth1 > depth2) { + depth1--; + node1 = node1->parent; + } + while (depth2 > depth1) { + depth2--; + node2 = node2->parent; + } + while (node1->parent != node2->parent) { + node1 = node1->parent; + node2 = node2->parent; + /* should not happen but just in case ... */ + if ((node1 == NULL) || (node2 == NULL)) + return(-2); + } + /* + * Find who's first. + */ + if (node1 == node2->prev) + return(1); + if (node1 == node2->next) + return(-1); + /* + * Speedup using document order if availble. + */ + if ((node1->type == XML_ELEMENT_NODE) && + (node2->type == XML_ELEMENT_NODE) && + (0 > (long) node1->content) && + (0 > (long) node2->content) && + (node1->doc == node2->doc)) { + + l1 = -((long) node1->content); + l2 = -((long) node2->content); + if (l1 < l2) + return(1); + if (l1 > l2) + return(-1); + } + + for (cur = node1->next;cur != NULL;cur = cur->next) + if (cur == node2) + return(1); + return(-1); /* assume there is no sibling list corruption */ +} +#endif /* XP_OPTIMIZED_NON_ELEM_COMPARISON */ + +/** + * xmlXPathNodeSetSort: + * @set: the node set + * + * Sort the node set in document order + */ +void +xmlXPathNodeSetSort(xmlNodeSetPtr set) { +#ifndef WITH_TIM_SORT + int i, j, incr, len; + xmlNodePtr tmp; +#endif + + if (set == NULL) + return; + +#ifndef WITH_TIM_SORT + /* + * Use the old Shell's sort implementation to sort the node-set + * Timsort ought to be quite faster + */ + len = set->nodeNr; + for (incr = len / 2; incr > 0; incr /= 2) { + for (i = incr; i < len; i++) { + j = i - incr; + while (j >= 0) { +#ifdef XP_OPTIMIZED_NON_ELEM_COMPARISON + if (xmlXPathCmpNodesExt(set->nodeTab[j], + set->nodeTab[j + incr]) == -1) +#else + if (xmlXPathCmpNodes(set->nodeTab[j], + set->nodeTab[j + incr]) == -1) +#endif + { + tmp = set->nodeTab[j]; + set->nodeTab[j] = set->nodeTab[j + incr]; + set->nodeTab[j + incr] = tmp; + j -= incr; + } else + break; + } + } + } +#else /* WITH_TIM_SORT */ + libxml_domnode_tim_sort(set->nodeTab, set->nodeNr); +#endif /* WITH_TIM_SORT */ +} + +#define XML_NODESET_DEFAULT 10 +/** + * xmlXPathNodeSetDupNs: + * @node: the parent node of the namespace XPath node + * @ns: the libxml namespace declaration node. + * + * Namespace node in libxml don't match the XPath semantic. In a node set + * the namespace nodes are duplicated and the next pointer is set to the + * parent node in the XPath semantic. + * + * Returns the newly created object. + */ +static xmlNodePtr +xmlXPathNodeSetDupNs(xmlNodePtr node, xmlNsPtr ns) { + xmlNsPtr cur; + + if ((ns == NULL) || (ns->type != XML_NAMESPACE_DECL)) + return(NULL); + if ((node == NULL) || (node->type == XML_NAMESPACE_DECL)) + return((xmlNodePtr) ns); + + /* + * Allocate a new Namespace and fill the fields. + */ + cur = (xmlNsPtr) xmlMalloc(sizeof(xmlNs)); + if (cur == NULL) { + xmlXPathErrMemory(NULL, "duplicating namespace\n"); + return(NULL); + } + memset(cur, 0, sizeof(xmlNs)); + cur->type = XML_NAMESPACE_DECL; + if (ns->href != NULL) + cur->href = xmlStrdup(ns->href); + if (ns->prefix != NULL) + cur->prefix = xmlStrdup(ns->prefix); + cur->next = (xmlNsPtr) node; + return((xmlNodePtr) cur); +} + +/** + * xmlXPathNodeSetFreeNs: + * @ns: the XPath namespace node found in a nodeset. + * + * Namespace nodes in libxml don't match the XPath semantic. In a node set + * the namespace nodes are duplicated and the next pointer is set to the + * parent node in the XPath semantic. Check if such a node needs to be freed + */ +void +xmlXPathNodeSetFreeNs(xmlNsPtr ns) { + if ((ns == NULL) || (ns->type != XML_NAMESPACE_DECL)) + return; + + if ((ns->next != NULL) && (ns->next->type != XML_NAMESPACE_DECL)) { + if (ns->href != NULL) + xmlFree((xmlChar *)ns->href); + if (ns->prefix != NULL) + xmlFree((xmlChar *)ns->prefix); + xmlFree(ns); + } +} + +/** + * xmlXPathNodeSetCreate: + * @val: an initial xmlNodePtr, or NULL + * + * Create a new xmlNodeSetPtr of type double and of value @val + * + * Returns the newly created object. + */ +xmlNodeSetPtr +xmlXPathNodeSetCreate(xmlNodePtr val) { + xmlNodeSetPtr ret; + + ret = (xmlNodeSetPtr) xmlMalloc(sizeof(xmlNodeSet)); + if (ret == NULL) { + xmlXPathErrMemory(NULL, "creating nodeset\n"); + return(NULL); + } + memset(ret, 0 , (size_t) sizeof(xmlNodeSet)); + if (val != NULL) { + ret->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT * + sizeof(xmlNodePtr)); + if (ret->nodeTab == NULL) { + xmlXPathErrMemory(NULL, "creating nodeset\n"); + xmlFree(ret); + return(NULL); + } + memset(ret->nodeTab, 0 , + XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr)); + ret->nodeMax = XML_NODESET_DEFAULT; + if (val->type == XML_NAMESPACE_DECL) { + xmlNsPtr ns = (xmlNsPtr) val; + + ret->nodeTab[ret->nodeNr++] = + xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns); + } else + ret->nodeTab[ret->nodeNr++] = val; + } + return(ret); +} + +/** + * xmlXPathNodeSetCreateSize: + * @size: the initial size of the set + * + * Create a new xmlNodeSetPtr of type double and of value @val + * + * Returns the newly created object. + */ +static xmlNodeSetPtr +xmlXPathNodeSetCreateSize(int size) { + xmlNodeSetPtr ret; + + ret = (xmlNodeSetPtr) xmlMalloc(sizeof(xmlNodeSet)); + if (ret == NULL) { + xmlXPathErrMemory(NULL, "creating nodeset\n"); + return(NULL); + } + memset(ret, 0 , (size_t) sizeof(xmlNodeSet)); + if (size < XML_NODESET_DEFAULT) + size = XML_NODESET_DEFAULT; + ret->nodeTab = (xmlNodePtr *) xmlMalloc(size * sizeof(xmlNodePtr)); + if (ret->nodeTab == NULL) { + xmlXPathErrMemory(NULL, "creating nodeset\n"); + xmlFree(ret); + return(NULL); + } + memset(ret->nodeTab, 0 , size * (size_t) sizeof(xmlNodePtr)); + ret->nodeMax = size; + return(ret); +} + +/** + * xmlXPathNodeSetContains: + * @cur: the node-set + * @val: the node + * + * checks whether @cur contains @val + * + * Returns true (1) if @cur contains @val, false (0) otherwise + */ +int +xmlXPathNodeSetContains (xmlNodeSetPtr cur, xmlNodePtr val) { + int i; + + if ((cur == NULL) || (val == NULL)) return(0); + if (val->type == XML_NAMESPACE_DECL) { + for (i = 0; i < cur->nodeNr; i++) { + if (cur->nodeTab[i]->type == XML_NAMESPACE_DECL) { + xmlNsPtr ns1, ns2; + + ns1 = (xmlNsPtr) val; + ns2 = (xmlNsPtr) cur->nodeTab[i]; + if (ns1 == ns2) + return(1); + if ((ns1->next != NULL) && (ns2->next == ns1->next) && + (xmlStrEqual(ns1->prefix, ns2->prefix))) + return(1); + } + } + } else { + for (i = 0; i < cur->nodeNr; i++) { + if (cur->nodeTab[i] == val) + return(1); + } + } + return(0); +} + +/** + * xmlXPathNodeSetAddNs: + * @cur: the initial node set + * @node: the hosting node + * @ns: a the namespace node + * + * add a new namespace node to an existing NodeSet + * + * Returns 0 in case of success and -1 in case of error + */ +int +xmlXPathNodeSetAddNs(xmlNodeSetPtr cur, xmlNodePtr node, xmlNsPtr ns) { + int i; + + + if ((cur == NULL) || (ns == NULL) || (node == NULL) || + (ns->type != XML_NAMESPACE_DECL) || + (node->type != XML_ELEMENT_NODE)) + return(-1); + + /* @@ with_ns to check whether namespace nodes should be looked at @@ */ + /* + * prevent duplicates + */ + for (i = 0;i < cur->nodeNr;i++) { + if ((cur->nodeTab[i] != NULL) && + (cur->nodeTab[i]->type == XML_NAMESPACE_DECL) && + (((xmlNsPtr)cur->nodeTab[i])->next == (xmlNsPtr) node) && + (xmlStrEqual(ns->prefix, ((xmlNsPtr)cur->nodeTab[i])->prefix))) + return(0); + } + + /* + * grow the nodeTab if needed + */ + if (cur->nodeMax == 0) { + cur->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT * + sizeof(xmlNodePtr)); + if (cur->nodeTab == NULL) { + xmlXPathErrMemory(NULL, "growing nodeset\n"); + return(-1); + } + memset(cur->nodeTab, 0 , + XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr)); + cur->nodeMax = XML_NODESET_DEFAULT; + } else if (cur->nodeNr == cur->nodeMax) { + xmlNodePtr *temp; + + if (cur->nodeMax >= XPATH_MAX_NODESET_LENGTH) { + xmlXPathErrMemory(NULL, "growing nodeset hit limit\n"); + return(-1); + } + temp = (xmlNodePtr *) xmlRealloc(cur->nodeTab, cur->nodeMax * 2 * + sizeof(xmlNodePtr)); + if (temp == NULL) { + xmlXPathErrMemory(NULL, "growing nodeset\n"); + return(-1); + } + cur->nodeMax *= 2; + cur->nodeTab = temp; + } + cur->nodeTab[cur->nodeNr++] = xmlXPathNodeSetDupNs(node, ns); + return(0); +} + +/** + * xmlXPathNodeSetAdd: + * @cur: the initial node set + * @val: a new xmlNodePtr + * + * add a new xmlNodePtr to an existing NodeSet + * + * Returns 0 in case of success, and -1 in case of error + */ +int +xmlXPathNodeSetAdd(xmlNodeSetPtr cur, xmlNodePtr val) { + int i; + + if ((cur == NULL) || (val == NULL)) return(-1); + + /* @@ with_ns to check whether namespace nodes should be looked at @@ */ + /* + * prevent duplcates + */ + for (i = 0;i < cur->nodeNr;i++) + if (cur->nodeTab[i] == val) return(0); + + /* + * grow the nodeTab if needed + */ + if (cur->nodeMax == 0) { + cur->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT * + sizeof(xmlNodePtr)); + if (cur->nodeTab == NULL) { + xmlXPathErrMemory(NULL, "growing nodeset\n"); + return(-1); + } + memset(cur->nodeTab, 0 , + XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr)); + cur->nodeMax = XML_NODESET_DEFAULT; + } else if (cur->nodeNr == cur->nodeMax) { + xmlNodePtr *temp; + + if (cur->nodeMax >= XPATH_MAX_NODESET_LENGTH) { + xmlXPathErrMemory(NULL, "growing nodeset hit limit\n"); + return(-1); + } + temp = (xmlNodePtr *) xmlRealloc(cur->nodeTab, cur->nodeMax * 2 * + sizeof(xmlNodePtr)); + if (temp == NULL) { + xmlXPathErrMemory(NULL, "growing nodeset\n"); + return(-1); + } + cur->nodeMax *= 2; + cur->nodeTab = temp; + } + if (val->type == XML_NAMESPACE_DECL) { + xmlNsPtr ns = (xmlNsPtr) val; + + cur->nodeTab[cur->nodeNr++] = + xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns); + } else + cur->nodeTab[cur->nodeNr++] = val; + return(0); +} + +/** + * xmlXPathNodeSetAddUnique: + * @cur: the initial node set + * @val: a new xmlNodePtr + * + * add a new xmlNodePtr to an existing NodeSet, optimized version + * when we are sure the node is not already in the set. + * + * Returns 0 in case of success and -1 in case of failure + */ +int +xmlXPathNodeSetAddUnique(xmlNodeSetPtr cur, xmlNodePtr val) { + if ((cur == NULL) || (val == NULL)) return(-1); + + /* @@ with_ns to check whether namespace nodes should be looked at @@ */ + /* + * grow the nodeTab if needed + */ + if (cur->nodeMax == 0) { + cur->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT * + sizeof(xmlNodePtr)); + if (cur->nodeTab == NULL) { + xmlXPathErrMemory(NULL, "growing nodeset\n"); + return(-1); + } + memset(cur->nodeTab, 0 , + XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr)); + cur->nodeMax = XML_NODESET_DEFAULT; + } else if (cur->nodeNr == cur->nodeMax) { + xmlNodePtr *temp; + + if (cur->nodeMax >= XPATH_MAX_NODESET_LENGTH) { + xmlXPathErrMemory(NULL, "growing nodeset hit limit\n"); + return(-1); + } + temp = (xmlNodePtr *) xmlRealloc(cur->nodeTab, cur->nodeMax * 2 * + sizeof(xmlNodePtr)); + if (temp == NULL) { + xmlXPathErrMemory(NULL, "growing nodeset\n"); + return(-1); + } + cur->nodeTab = temp; + cur->nodeMax *= 2; + } + if (val->type == XML_NAMESPACE_DECL) { + xmlNsPtr ns = (xmlNsPtr) val; + + cur->nodeTab[cur->nodeNr++] = + xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns); + } else + cur->nodeTab[cur->nodeNr++] = val; + return(0); +} + +/** + * xmlXPathNodeSetMerge: + * @val1: the first NodeSet or NULL + * @val2: the second NodeSet + * + * Merges two nodesets, all nodes from @val2 are added to @val1 + * if @val1 is NULL, a new set is created and copied from @val2 + * + * Returns @val1 once extended or NULL in case of error. + */ +xmlNodeSetPtr +xmlXPathNodeSetMerge(xmlNodeSetPtr val1, xmlNodeSetPtr val2) { + int i, j, initNr, skip; + xmlNodePtr n1, n2; + + if (val2 == NULL) return(val1); + if (val1 == NULL) { + val1 = xmlXPathNodeSetCreate(NULL); + if (val1 == NULL) + return (NULL); +#if 0 + /* + * TODO: The optimization won't work in every case, since + * those nasty namespace nodes need to be added with + * xmlXPathNodeSetDupNs() to the set; thus a pure + * memcpy is not possible. + * If there was a flag on the nodesetval, indicating that + * some temporary nodes are in, that would be helpfull. + */ + /* + * Optimization: Create an equally sized node-set + * and memcpy the content. + */ + val1 = xmlXPathNodeSetCreateSize(val2->nodeNr); + if (val1 == NULL) + return(NULL); + if (val2->nodeNr != 0) { + if (val2->nodeNr == 1) + *(val1->nodeTab) = *(val2->nodeTab); + else { + memcpy(val1->nodeTab, val2->nodeTab, + val2->nodeNr * sizeof(xmlNodePtr)); + } + val1->nodeNr = val2->nodeNr; + } + return(val1); +#endif + } + + /* @@ with_ns to check whether namespace nodes should be looked at @@ */ + initNr = val1->nodeNr; + + for (i = 0;i < val2->nodeNr;i++) { + n2 = val2->nodeTab[i]; + /* + * check against duplicates + */ + skip = 0; + for (j = 0; j < initNr; j++) { + n1 = val1->nodeTab[j]; + if (n1 == n2) { + skip = 1; + break; + } else if ((n1->type == XML_NAMESPACE_DECL) && + (n2->type == XML_NAMESPACE_DECL)) { + if ((((xmlNsPtr) n1)->next == ((xmlNsPtr) n2)->next) && + (xmlStrEqual(((xmlNsPtr) n1)->prefix, + ((xmlNsPtr) n2)->prefix))) + { + skip = 1; + break; + } + } + } + if (skip) + continue; + + /* + * grow the nodeTab if needed + */ + if (val1->nodeMax == 0) { + val1->nodeTab = (xmlNodePtr *) xmlMalloc(XML_NODESET_DEFAULT * + sizeof(xmlNodePtr)); + if (val1->nodeTab == NULL) { + xmlXPathErrMemory(NULL, "merging nodeset\n"); + return(NULL); + } + memset(val1->nodeTab, 0 , + XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr)); + val1->nodeMax = XML_NODESET_DEFAULT; + } else if (val1->nodeNr == val1->nodeMax) { + xmlNodePtr *temp; + + if (val1->nodeMax >= XPATH_MAX_NODESET_LENGTH) { + xmlXPathErrMemory(NULL, "merging nodeset hit limit\n"); + return(NULL); + } + temp = (xmlNodePtr *) xmlRealloc(val1->nodeTab, val1->nodeMax * 2 * + sizeof(xmlNodePtr)); + if (temp == NULL) { + xmlXPathErrMemory(NULL, "merging nodeset\n"); + return(NULL); + } + val1->nodeTab = temp; + val1->nodeMax *= 2; + } + if (n2->type == XML_NAMESPACE_DECL) { + xmlNsPtr ns = (xmlNsPtr) n2; + + val1->nodeTab[val1->nodeNr++] = + xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns); + } else + val1->nodeTab[val1->nodeNr++] = n2; + } + + return(val1); +} + + +/** + * xmlXPathNodeSetMergeAndClear: + * @set1: the first NodeSet or NULL + * @set2: the second NodeSet + * @hasSet2NsNodes: 1 if set2 contains namespaces nodes + * + * Merges two nodesets, all nodes from @set2 are added to @set1 + * if @set1 is NULL, a new set is created and copied from @set2. + * Checks for duplicate nodes. Clears set2. + * + * Returns @set1 once extended or NULL in case of error. + */ +static xmlNodeSetPtr +xmlXPathNodeSetMergeAndClear(xmlNodeSetPtr set1, xmlNodeSetPtr set2, + int hasNullEntries) +{ + if ((set1 == NULL) && (hasNullEntries == 0)) { + /* + * Note that doing a memcpy of the list, namespace nodes are + * just assigned to set1, since set2 is cleared anyway. + */ + set1 = xmlXPathNodeSetCreateSize(set2->nodeNr); + if (set1 == NULL) + return(NULL); + if (set2->nodeNr != 0) { + memcpy(set1->nodeTab, set2->nodeTab, + set2->nodeNr * sizeof(xmlNodePtr)); + set1->nodeNr = set2->nodeNr; + } + } else { + int i, j, initNbSet1; + xmlNodePtr n1, n2; + + if (set1 == NULL) + set1 = xmlXPathNodeSetCreate(NULL); + if (set1 == NULL) + return (NULL); + + initNbSet1 = set1->nodeNr; + for (i = 0;i < set2->nodeNr;i++) { + n2 = set2->nodeTab[i]; + /* + * Skip NULLed entries. + */ + if (n2 == NULL) + continue; + /* + * Skip duplicates. + */ + for (j = 0; j < initNbSet1; j++) { + n1 = set1->nodeTab[j]; + if (n1 == n2) { + goto skip_node; + } else if ((n1->type == XML_NAMESPACE_DECL) && + (n2->type == XML_NAMESPACE_DECL)) + { + if ((((xmlNsPtr) n1)->next == ((xmlNsPtr) n2)->next) && + (xmlStrEqual(((xmlNsPtr) n1)->prefix, + ((xmlNsPtr) n2)->prefix))) + { + /* + * Free the namespace node. + */ + set2->nodeTab[i] = NULL; + xmlXPathNodeSetFreeNs((xmlNsPtr) n2); + goto skip_node; + } + } + } + /* + * grow the nodeTab if needed + */ + if (set1->nodeMax == 0) { + set1->nodeTab = (xmlNodePtr *) xmlMalloc( + XML_NODESET_DEFAULT * sizeof(xmlNodePtr)); + if (set1->nodeTab == NULL) { + xmlXPathErrMemory(NULL, "merging nodeset\n"); + return(NULL); + } + memset(set1->nodeTab, 0, + XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr)); + set1->nodeMax = XML_NODESET_DEFAULT; + } else if (set1->nodeNr >= set1->nodeMax) { + xmlNodePtr *temp; + + if (set1->nodeMax >= XPATH_MAX_NODESET_LENGTH) { + xmlXPathErrMemory(NULL, "merging nodeset hit limit\n"); + return(NULL); + } + temp = (xmlNodePtr *) xmlRealloc( + set1->nodeTab, set1->nodeMax * 2 * sizeof(xmlNodePtr)); + if (temp == NULL) { + xmlXPathErrMemory(NULL, "merging nodeset\n"); + return(NULL); + } + set1->nodeTab = temp; + set1->nodeMax *= 2; + } + if (n2->type == XML_NAMESPACE_DECL) { + xmlNsPtr ns = (xmlNsPtr) n2; + + set1->nodeTab[set1->nodeNr++] = + xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns); + } else + set1->nodeTab[set1->nodeNr++] = n2; +skip_node: + {} + } + } + set2->nodeNr = 0; + return(set1); +} + +/** + * xmlXPathNodeSetMergeAndClearNoDupls: + * @set1: the first NodeSet or NULL + * @set2: the second NodeSet + * @hasSet2NsNodes: 1 if set2 contains namespaces nodes + * + * Merges two nodesets, all nodes from @set2 are added to @set1 + * if @set1 is NULL, a new set is created and copied from @set2. + * Doesn't chack for duplicate nodes. Clears set2. + * + * Returns @set1 once extended or NULL in case of error. + */ +static xmlNodeSetPtr +xmlXPathNodeSetMergeAndClearNoDupls(xmlNodeSetPtr set1, xmlNodeSetPtr set2, + int hasNullEntries) +{ + if (set2 == NULL) + return(set1); + if ((set1 == NULL) && (hasNullEntries == 0)) { + /* + * Note that doing a memcpy of the list, namespace nodes are + * just assigned to set1, since set2 is cleared anyway. + */ + set1 = xmlXPathNodeSetCreateSize(set2->nodeNr); + if (set1 == NULL) + return(NULL); + if (set2->nodeNr != 0) { + memcpy(set1->nodeTab, set2->nodeTab, + set2->nodeNr * sizeof(xmlNodePtr)); + set1->nodeNr = set2->nodeNr; + } + } else { + int i; + xmlNodePtr n2; + + if (set1 == NULL) + set1 = xmlXPathNodeSetCreate(NULL); + if (set1 == NULL) + return (NULL); + + for (i = 0;i < set2->nodeNr;i++) { + n2 = set2->nodeTab[i]; + /* + * Skip NULLed entries. + */ + if (n2 == NULL) + continue; + if (set1->nodeMax == 0) { + set1->nodeTab = (xmlNodePtr *) xmlMalloc( + XML_NODESET_DEFAULT * sizeof(xmlNodePtr)); + if (set1->nodeTab == NULL) { + xmlXPathErrMemory(NULL, "merging nodeset\n"); + return(NULL); + } + memset(set1->nodeTab, 0, + XML_NODESET_DEFAULT * (size_t) sizeof(xmlNodePtr)); + set1->nodeMax = XML_NODESET_DEFAULT; + } else if (set1->nodeNr >= set1->nodeMax) { + xmlNodePtr *temp; + + if (set1->nodeMax >= XPATH_MAX_NODESET_LENGTH) { + xmlXPathErrMemory(NULL, "merging nodeset hit limit\n"); + return(NULL); + } + temp = (xmlNodePtr *) xmlRealloc( + set1->nodeTab, set1->nodeMax * 2 * sizeof(xmlNodePtr)); + if (temp == NULL) { + xmlXPathErrMemory(NULL, "merging nodeset\n"); + return(NULL); + } + set1->nodeTab = temp; + set1->nodeMax *= 2; + } + set1->nodeTab[set1->nodeNr++] = n2; + } + } + set2->nodeNr = 0; + return(set1); +} + +/** + * xmlXPathNodeSetDel: + * @cur: the initial node set + * @val: an xmlNodePtr + * + * Removes an xmlNodePtr from an existing NodeSet + */ +void +xmlXPathNodeSetDel(xmlNodeSetPtr cur, xmlNodePtr val) { + int i; + + if (cur == NULL) return; + if (val == NULL) return; + + /* + * find node in nodeTab + */ + for (i = 0;i < cur->nodeNr;i++) + if (cur->nodeTab[i] == val) break; + + if (i >= cur->nodeNr) { /* not found */ +#ifdef DEBUG + xmlGenericError(xmlGenericErrorContext, + "xmlXPathNodeSetDel: Node %s wasn't found in NodeList\n", + val->name); +#endif + return; + } + if ((cur->nodeTab[i] != NULL) && + (cur->nodeTab[i]->type == XML_NAMESPACE_DECL)) + xmlXPathNodeSetFreeNs((xmlNsPtr) cur->nodeTab[i]); + cur->nodeNr--; + for (;i < cur->nodeNr;i++) + cur->nodeTab[i] = cur->nodeTab[i + 1]; + cur->nodeTab[cur->nodeNr] = NULL; +} + +/** + * xmlXPathNodeSetRemove: + * @cur: the initial node set + * @val: the index to remove + * + * Removes an entry from an existing NodeSet list. + */ +void +xmlXPathNodeSetRemove(xmlNodeSetPtr cur, int val) { + if (cur == NULL) return; + if (val >= cur->nodeNr) return; + if ((cur->nodeTab[val] != NULL) && + (cur->nodeTab[val]->type == XML_NAMESPACE_DECL)) + xmlXPathNodeSetFreeNs((xmlNsPtr) cur->nodeTab[val]); + cur->nodeNr--; + for (;val < cur->nodeNr;val++) + cur->nodeTab[val] = cur->nodeTab[val + 1]; + cur->nodeTab[cur->nodeNr] = NULL; +} + +/** + * xmlXPathFreeNodeSet: + * @obj: the xmlNodeSetPtr to free + * + * Free the NodeSet compound (not the actual nodes !). + */ +void +xmlXPathFreeNodeSet(xmlNodeSetPtr obj) { + if (obj == NULL) return; + if (obj->nodeTab != NULL) { + int i; + + /* @@ with_ns to check whether namespace nodes should be looked at @@ */ + for (i = 0;i < obj->nodeNr;i++) + if ((obj->nodeTab[i] != NULL) && + (obj->nodeTab[i]->type == XML_NAMESPACE_DECL)) + xmlXPathNodeSetFreeNs((xmlNsPtr) obj->nodeTab[i]); + xmlFree(obj->nodeTab); + } + xmlFree(obj); +} + +/** + * xmlXPathNodeSetClear: + * @set: the node set to clear + * + * Clears the list from all temporary XPath objects (e.g. namespace nodes + * are feed), but does *not* free the list itself. Sets the length of the + * list to 0. + */ +static void +xmlXPathNodeSetClear(xmlNodeSetPtr set, int hasNsNodes) +{ + if ((set == NULL) || (set->nodeNr <= 0)) + return; + else if (hasNsNodes) { + int i; + xmlNodePtr node; + + for (i = 0; i < set->nodeNr; i++) { + node = set->nodeTab[i]; + if ((node != NULL) && + (node->type == XML_NAMESPACE_DECL)) + xmlXPathNodeSetFreeNs((xmlNsPtr) node); + } + } + set->nodeNr = 0; +} + +/** + * xmlXPathNodeSetClearFromPos: + * @set: the node set to be cleared + * @pos: the start position to clear from + * + * Clears the list from temporary XPath objects (e.g. namespace nodes + * are feed) starting with the entry at @pos, but does *not* free the list + * itself. Sets the length of the list to @pos. + */ +static void +xmlXPathNodeSetClearFromPos(xmlNodeSetPtr set, int pos, int hasNsNodes) +{ + if ((set == NULL) || (set->nodeNr <= 0) || (pos >= set->nodeNr)) + return; + else if ((hasNsNodes)) { + int i; + xmlNodePtr node; + + for (i = pos; i < set->nodeNr; i++) { + node = set->nodeTab[i]; + if ((node != NULL) && + (node->type == XML_NAMESPACE_DECL)) + xmlXPathNodeSetFreeNs((xmlNsPtr) node); + } + } + set->nodeNr = pos; +} + +/** + * xmlXPathFreeValueTree: + * @obj: the xmlNodeSetPtr to free + * + * Free the NodeSet compound and the actual tree, this is different + * from xmlXPathFreeNodeSet() + */ +static void +xmlXPathFreeValueTree(xmlNodeSetPtr obj) { + int i; + + if (obj == NULL) return; + + if (obj->nodeTab != NULL) { + for (i = 0;i < obj->nodeNr;i++) { + if (obj->nodeTab[i] != NULL) { + if (obj->nodeTab[i]->type == XML_NAMESPACE_DECL) { + xmlXPathNodeSetFreeNs((xmlNsPtr) obj->nodeTab[i]); + } else { + xmlFreeNodeList(obj->nodeTab[i]); + } + } + } + xmlFree(obj->nodeTab); + } + xmlFree(obj); +} + +#if defined(DEBUG) || defined(DEBUG_STEP) +/** + * xmlGenericErrorContextNodeSet: + * @output: a FILE * for the output + * @obj: the xmlNodeSetPtr to display + * + * Quick display of a NodeSet + */ +void +xmlGenericErrorContextNodeSet(FILE *output, xmlNodeSetPtr obj) { + int i; + + if (output == NULL) output = xmlGenericErrorContext; + if (obj == NULL) { + fprintf(output, "NodeSet == NULL !\n"); + return; + } + if (obj->nodeNr == 0) { + fprintf(output, "NodeSet is empty\n"); + return; + } + if (obj->nodeTab == NULL) { + fprintf(output, " nodeTab == NULL !\n"); + return; + } + for (i = 0; i < obj->nodeNr; i++) { + if (obj->nodeTab[i] == NULL) { + fprintf(output, " NULL !\n"); + return; + } + if ((obj->nodeTab[i]->type == XML_DOCUMENT_NODE) || + (obj->nodeTab[i]->type == XML_HTML_DOCUMENT_NODE)) + fprintf(output, " /"); + else if (obj->nodeTab[i]->name == NULL) + fprintf(output, " noname!"); + else fprintf(output, " %s", obj->nodeTab[i]->name); + } + fprintf(output, "\n"); +} +#endif + +/** + * xmlXPathNewNodeSet: + * @val: the NodePtr value + * + * Create a new xmlXPathObjectPtr of type NodeSet and initialize + * it with the single Node @val + * + * Returns the newly created object. + */ +xmlXPathObjectPtr +xmlXPathNewNodeSet(xmlNodePtr val) { + xmlXPathObjectPtr ret; + + ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); + if (ret == NULL) { + xmlXPathErrMemory(NULL, "creating nodeset\n"); + return(NULL); + } + memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); + ret->type = XPATH_NODESET; + ret->boolval = 0; + ret->nodesetval = xmlXPathNodeSetCreate(val); + /* @@ with_ns to check whether namespace nodes should be looked at @@ */ +#ifdef XP_DEBUG_OBJ_USAGE + xmlXPathDebugObjUsageRequested(NULL, XPATH_NODESET); +#endif + return(ret); +} + +/** + * xmlXPathNewValueTree: + * @val: the NodePtr value + * + * Create a new xmlXPathObjectPtr of type Value Tree (XSLT) and initialize + * it with the tree root @val + * + * Returns the newly created object. + */ +xmlXPathObjectPtr +xmlXPathNewValueTree(xmlNodePtr val) { + xmlXPathObjectPtr ret; + + ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); + if (ret == NULL) { + xmlXPathErrMemory(NULL, "creating result value tree\n"); + return(NULL); + } + memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); + ret->type = XPATH_XSLT_TREE; + ret->boolval = 1; + ret->user = (void *) val; + ret->nodesetval = xmlXPathNodeSetCreate(val); +#ifdef XP_DEBUG_OBJ_USAGE + xmlXPathDebugObjUsageRequested(NULL, XPATH_XSLT_TREE); +#endif + return(ret); +} + +/** + * xmlXPathNewNodeSetList: + * @val: an existing NodeSet + * + * Create a new xmlXPathObjectPtr of type NodeSet and initialize + * it with the Nodeset @val + * + * Returns the newly created object. + */ +xmlXPathObjectPtr +xmlXPathNewNodeSetList(xmlNodeSetPtr val) +{ + xmlXPathObjectPtr ret; + int i; + + if (val == NULL) + ret = NULL; + else if (val->nodeTab == NULL) + ret = xmlXPathNewNodeSet(NULL); + else { + ret = xmlXPathNewNodeSet(val->nodeTab[0]); + if (ret) { + for (i = 1; i < val->nodeNr; ++i) { + if (xmlXPathNodeSetAddUnique(ret->nodesetval, val->nodeTab[i]) + < 0) break; + } + } + } + + return (ret); +} + +/** + * xmlXPathWrapNodeSet: + * @val: the NodePtr value + * + * Wrap the Nodeset @val in a new xmlXPathObjectPtr + * + * Returns the newly created object. + */ +xmlXPathObjectPtr +xmlXPathWrapNodeSet(xmlNodeSetPtr val) { + xmlXPathObjectPtr ret; + + ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); + if (ret == NULL) { + xmlXPathErrMemory(NULL, "creating node set object\n"); + return(NULL); + } + memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); + ret->type = XPATH_NODESET; + ret->nodesetval = val; +#ifdef XP_DEBUG_OBJ_USAGE + xmlXPathDebugObjUsageRequested(NULL, XPATH_NODESET); +#endif + return(ret); +} + +/** + * xmlXPathFreeNodeSetList: + * @obj: an existing NodeSetList object + * + * Free up the xmlXPathObjectPtr @obj but don't deallocate the objects in + * the list contrary to xmlXPathFreeObject(). + */ +void +xmlXPathFreeNodeSetList(xmlXPathObjectPtr obj) { + if (obj == NULL) return; +#ifdef XP_DEBUG_OBJ_USAGE + xmlXPathDebugObjUsageReleased(NULL, obj->type); +#endif + xmlFree(obj); +} + +/** + * xmlXPathDifference: + * @nodes1: a node-set + * @nodes2: a node-set + * + * Implements the EXSLT - Sets difference() function: + * node-set set:difference (node-set, node-set) + * + * Returns the difference between the two node sets, or nodes1 if + * nodes2 is empty + */ +xmlNodeSetPtr +xmlXPathDifference (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) { + xmlNodeSetPtr ret; + int i, l1; + xmlNodePtr cur; + + if (xmlXPathNodeSetIsEmpty(nodes2)) + return(nodes1); + + ret = xmlXPathNodeSetCreate(NULL); + if (xmlXPathNodeSetIsEmpty(nodes1)) + return(ret); + + l1 = xmlXPathNodeSetGetLength(nodes1); + + for (i = 0; i < l1; i++) { + cur = xmlXPathNodeSetItem(nodes1, i); + if (!xmlXPathNodeSetContains(nodes2, cur)) { + if (xmlXPathNodeSetAddUnique(ret, cur) < 0) + break; + } + } + return(ret); +} + +/** + * xmlXPathIntersection: + * @nodes1: a node-set + * @nodes2: a node-set + * + * Implements the EXSLT - Sets intersection() function: + * node-set set:intersection (node-set, node-set) + * + * Returns a node set comprising the nodes that are within both the + * node sets passed as arguments + */ +xmlNodeSetPtr +xmlXPathIntersection (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) { + xmlNodeSetPtr ret = xmlXPathNodeSetCreate(NULL); + int i, l1; + xmlNodePtr cur; + + if (ret == NULL) + return(ret); + if (xmlXPathNodeSetIsEmpty(nodes1)) + return(ret); + if (xmlXPathNodeSetIsEmpty(nodes2)) + return(ret); + + l1 = xmlXPathNodeSetGetLength(nodes1); + + for (i = 0; i < l1; i++) { + cur = xmlXPathNodeSetItem(nodes1, i); + if (xmlXPathNodeSetContains(nodes2, cur)) { + if (xmlXPathNodeSetAddUnique(ret, cur) < 0) + break; + } + } + return(ret); +} + +/** + * xmlXPathDistinctSorted: + * @nodes: a node-set, sorted by document order + * + * Implements the EXSLT - Sets distinct() function: + * node-set set:distinct (node-set) + * + * Returns a subset of the nodes contained in @nodes, or @nodes if + * it is empty + */ +xmlNodeSetPtr +xmlXPathDistinctSorted (xmlNodeSetPtr nodes) { + xmlNodeSetPtr ret; + xmlHashTablePtr hash; + int i, l; + xmlChar * strval; + xmlNodePtr cur; + + if (xmlXPathNodeSetIsEmpty(nodes)) + return(nodes); + + ret = xmlXPathNodeSetCreate(NULL); + if (ret == NULL) + return(ret); + l = xmlXPathNodeSetGetLength(nodes); + hash = xmlHashCreate (l); + for (i = 0; i < l; i++) { + cur = xmlXPathNodeSetItem(nodes, i); + strval = xmlXPathCastNodeToString(cur); + if (xmlHashLookup(hash, strval) == NULL) { + xmlHashAddEntry(hash, strval, strval); + if (xmlXPathNodeSetAddUnique(ret, cur) < 0) + break; + } else { + xmlFree(strval); + } + } + xmlHashFree(hash, (xmlHashDeallocator) xmlFree); + return(ret); +} + +/** + * xmlXPathDistinct: + * @nodes: a node-set + * + * Implements the EXSLT - Sets distinct() function: + * node-set set:distinct (node-set) + * @nodes is sorted by document order, then #exslSetsDistinctSorted + * is called with the sorted node-set + * + * Returns a subset of the nodes contained in @nodes, or @nodes if + * it is empty + */ +xmlNodeSetPtr +xmlXPathDistinct (xmlNodeSetPtr nodes) { + if (xmlXPathNodeSetIsEmpty(nodes)) + return(nodes); + + xmlXPathNodeSetSort(nodes); + return(xmlXPathDistinctSorted(nodes)); +} + +/** + * xmlXPathHasSameNodes: + * @nodes1: a node-set + * @nodes2: a node-set + * + * Implements the EXSLT - Sets has-same-nodes function: + * boolean set:has-same-node(node-set, node-set) + * + * Returns true (1) if @nodes1 shares any node with @nodes2, false (0) + * otherwise + */ +int +xmlXPathHasSameNodes (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) { + int i, l; + xmlNodePtr cur; + + if (xmlXPathNodeSetIsEmpty(nodes1) || + xmlXPathNodeSetIsEmpty(nodes2)) + return(0); + + l = xmlXPathNodeSetGetLength(nodes1); + for (i = 0; i < l; i++) { + cur = xmlXPathNodeSetItem(nodes1, i); + if (xmlXPathNodeSetContains(nodes2, cur)) + return(1); + } + return(0); +} + +/** + * xmlXPathNodeLeadingSorted: + * @nodes: a node-set, sorted by document order + * @node: a node + * + * Implements the EXSLT - Sets leading() function: + * node-set set:leading (node-set, node-set) + * + * Returns the nodes in @nodes that precede @node in document order, + * @nodes if @node is NULL or an empty node-set if @nodes + * doesn't contain @node + */ +xmlNodeSetPtr +xmlXPathNodeLeadingSorted (xmlNodeSetPtr nodes, xmlNodePtr node) { + int i, l; + xmlNodePtr cur; + xmlNodeSetPtr ret; + + if (node == NULL) + return(nodes); + + ret = xmlXPathNodeSetCreate(NULL); + if (ret == NULL) + return(ret); + if (xmlXPathNodeSetIsEmpty(nodes) || + (!xmlXPathNodeSetContains(nodes, node))) + return(ret); + + l = xmlXPathNodeSetGetLength(nodes); + for (i = 0; i < l; i++) { + cur = xmlXPathNodeSetItem(nodes, i); + if (cur == node) + break; + if (xmlXPathNodeSetAddUnique(ret, cur) < 0) + break; + } + return(ret); +} + +/** + * xmlXPathNodeLeading: + * @nodes: a node-set + * @node: a node + * + * Implements the EXSLT - Sets leading() function: + * node-set set:leading (node-set, node-set) + * @nodes is sorted by document order, then #exslSetsNodeLeadingSorted + * is called. + * + * Returns the nodes in @nodes that precede @node in document order, + * @nodes if @node is NULL or an empty node-set if @nodes + * doesn't contain @node + */ +xmlNodeSetPtr +xmlXPathNodeLeading (xmlNodeSetPtr nodes, xmlNodePtr node) { + xmlXPathNodeSetSort(nodes); + return(xmlXPathNodeLeadingSorted(nodes, node)); +} + +/** + * xmlXPathLeadingSorted: + * @nodes1: a node-set, sorted by document order + * @nodes2: a node-set, sorted by document order + * + * Implements the EXSLT - Sets leading() function: + * node-set set:leading (node-set, node-set) + * + * Returns the nodes in @nodes1 that precede the first node in @nodes2 + * in document order, @nodes1 if @nodes2 is NULL or empty or + * an empty node-set if @nodes1 doesn't contain @nodes2 + */ +xmlNodeSetPtr +xmlXPathLeadingSorted (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) { + if (xmlXPathNodeSetIsEmpty(nodes2)) + return(nodes1); + return(xmlXPathNodeLeadingSorted(nodes1, + xmlXPathNodeSetItem(nodes2, 1))); +} + +/** + * xmlXPathLeading: + * @nodes1: a node-set + * @nodes2: a node-set + * + * Implements the EXSLT - Sets leading() function: + * node-set set:leading (node-set, node-set) + * @nodes1 and @nodes2 are sorted by document order, then + * #exslSetsLeadingSorted is called. + * + * Returns the nodes in @nodes1 that precede the first node in @nodes2 + * in document order, @nodes1 if @nodes2 is NULL or empty or + * an empty node-set if @nodes1 doesn't contain @nodes2 + */ +xmlNodeSetPtr +xmlXPathLeading (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) { + if (xmlXPathNodeSetIsEmpty(nodes2)) + return(nodes1); + if (xmlXPathNodeSetIsEmpty(nodes1)) + return(xmlXPathNodeSetCreate(NULL)); + xmlXPathNodeSetSort(nodes1); + xmlXPathNodeSetSort(nodes2); + return(xmlXPathNodeLeadingSorted(nodes1, + xmlXPathNodeSetItem(nodes2, 1))); +} + +/** + * xmlXPathNodeTrailingSorted: + * @nodes: a node-set, sorted by document order + * @node: a node + * + * Implements the EXSLT - Sets trailing() function: + * node-set set:trailing (node-set, node-set) + * + * Returns the nodes in @nodes that follow @node in document order, + * @nodes if @node is NULL or an empty node-set if @nodes + * doesn't contain @node + */ +xmlNodeSetPtr +xmlXPathNodeTrailingSorted (xmlNodeSetPtr nodes, xmlNodePtr node) { + int i, l; + xmlNodePtr cur; + xmlNodeSetPtr ret; + + if (node == NULL) + return(nodes); + + ret = xmlXPathNodeSetCreate(NULL); + if (ret == NULL) + return(ret); + if (xmlXPathNodeSetIsEmpty(nodes) || + (!xmlXPathNodeSetContains(nodes, node))) + return(ret); + + l = xmlXPathNodeSetGetLength(nodes); + for (i = l - 1; i >= 0; i--) { + cur = xmlXPathNodeSetItem(nodes, i); + if (cur == node) + break; + if (xmlXPathNodeSetAddUnique(ret, cur) < 0) + break; + } + xmlXPathNodeSetSort(ret); /* bug 413451 */ + return(ret); +} + +/** + * xmlXPathNodeTrailing: + * @nodes: a node-set + * @node: a node + * + * Implements the EXSLT - Sets trailing() function: + * node-set set:trailing (node-set, node-set) + * @nodes is sorted by document order, then #xmlXPathNodeTrailingSorted + * is called. + * + * Returns the nodes in @nodes that follow @node in document order, + * @nodes if @node is NULL or an empty node-set if @nodes + * doesn't contain @node + */ +xmlNodeSetPtr +xmlXPathNodeTrailing (xmlNodeSetPtr nodes, xmlNodePtr node) { + xmlXPathNodeSetSort(nodes); + return(xmlXPathNodeTrailingSorted(nodes, node)); +} + +/** + * xmlXPathTrailingSorted: + * @nodes1: a node-set, sorted by document order + * @nodes2: a node-set, sorted by document order + * + * Implements the EXSLT - Sets trailing() function: + * node-set set:trailing (node-set, node-set) + * + * Returns the nodes in @nodes1 that follow the first node in @nodes2 + * in document order, @nodes1 if @nodes2 is NULL or empty or + * an empty node-set if @nodes1 doesn't contain @nodes2 + */ +xmlNodeSetPtr +xmlXPathTrailingSorted (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) { + if (xmlXPathNodeSetIsEmpty(nodes2)) + return(nodes1); + return(xmlXPathNodeTrailingSorted(nodes1, + xmlXPathNodeSetItem(nodes2, 0))); +} + +/** + * xmlXPathTrailing: + * @nodes1: a node-set + * @nodes2: a node-set + * + * Implements the EXSLT - Sets trailing() function: + * node-set set:trailing (node-set, node-set) + * @nodes1 and @nodes2 are sorted by document order, then + * #xmlXPathTrailingSorted is called. + * + * Returns the nodes in @nodes1 that follow the first node in @nodes2 + * in document order, @nodes1 if @nodes2 is NULL or empty or + * an empty node-set if @nodes1 doesn't contain @nodes2 + */ +xmlNodeSetPtr +xmlXPathTrailing (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) { + if (xmlXPathNodeSetIsEmpty(nodes2)) + return(nodes1); + if (xmlXPathNodeSetIsEmpty(nodes1)) + return(xmlXPathNodeSetCreate(NULL)); + xmlXPathNodeSetSort(nodes1); + xmlXPathNodeSetSort(nodes2); + return(xmlXPathNodeTrailingSorted(nodes1, + xmlXPathNodeSetItem(nodes2, 0))); +} + +/************************************************************************ + * * + * Routines to handle extra functions * + * * + ************************************************************************/ + +/** + * xmlXPathRegisterFunc: + * @ctxt: the XPath context + * @name: the function name + * @f: the function implementation or NULL + * + * Register a new function. If @f is NULL it unregisters the function + * + * Returns 0 in case of success, -1 in case of error + */ +int +xmlXPathRegisterFunc(xmlXPathContextPtr ctxt, const xmlChar *name, + xmlXPathFunction f) { + return(xmlXPathRegisterFuncNS(ctxt, name, NULL, f)); +} + +/** + * xmlXPathRegisterFuncNS: + * @ctxt: the XPath context + * @name: the function name + * @ns_uri: the function namespace URI + * @f: the function implementation or NULL + * + * Register a new function. If @f is NULL it unregisters the function + * + * Returns 0 in case of success, -1 in case of error + */ +int +xmlXPathRegisterFuncNS(xmlXPathContextPtr ctxt, const xmlChar *name, + const xmlChar *ns_uri, xmlXPathFunction f) { + if (ctxt == NULL) + return(-1); + if (name == NULL) + return(-1); + + if (ctxt->funcHash == NULL) + ctxt->funcHash = xmlHashCreate(0); + if (ctxt->funcHash == NULL) + return(-1); + if (f == NULL) + return(xmlHashRemoveEntry2(ctxt->funcHash, name, ns_uri, NULL)); + return(xmlHashAddEntry2(ctxt->funcHash, name, ns_uri, XML_CAST_FPTR(f))); +} + +/** + * xmlXPathRegisterFuncLookup: + * @ctxt: the XPath context + * @f: the lookup function + * @funcCtxt: the lookup data + * + * Registers an external mechanism to do function lookup. + */ +void +xmlXPathRegisterFuncLookup (xmlXPathContextPtr ctxt, + xmlXPathFuncLookupFunc f, + void *funcCtxt) { + if (ctxt == NULL) + return; + ctxt->funcLookupFunc = f; + ctxt->funcLookupData = funcCtxt; +} + +/** + * xmlXPathFunctionLookup: + * @ctxt: the XPath context + * @name: the function name + * + * Search in the Function array of the context for the given + * function. + * + * Returns the xmlXPathFunction or NULL if not found + */ +xmlXPathFunction +xmlXPathFunctionLookup(xmlXPathContextPtr ctxt, const xmlChar *name) { + if (ctxt == NULL) + return (NULL); + + if (ctxt->funcLookupFunc != NULL) { + xmlXPathFunction ret; + xmlXPathFuncLookupFunc f; + + f = ctxt->funcLookupFunc; + ret = f(ctxt->funcLookupData, name, NULL); + if (ret != NULL) + return(ret); + } + return(xmlXPathFunctionLookupNS(ctxt, name, NULL)); +} + +/** + * xmlXPathFunctionLookupNS: + * @ctxt: the XPath context + * @name: the function name + * @ns_uri: the function namespace URI + * + * Search in the Function array of the context for the given + * function. + * + * Returns the xmlXPathFunction or NULL if not found + */ +xmlXPathFunction +xmlXPathFunctionLookupNS(xmlXPathContextPtr ctxt, const xmlChar *name, + const xmlChar *ns_uri) { + xmlXPathFunction ret; + + if (ctxt == NULL) + return(NULL); + if (name == NULL) + return(NULL); + + if (ctxt->funcLookupFunc != NULL) { + xmlXPathFuncLookupFunc f; + + f = ctxt->funcLookupFunc; + ret = f(ctxt->funcLookupData, name, ns_uri); + if (ret != NULL) + return(ret); + } + + if (ctxt->funcHash == NULL) + return(NULL); + + XML_CAST_FPTR(ret) = xmlHashLookup2(ctxt->funcHash, name, ns_uri); + return(ret); +} + +/** + * xmlXPathRegisteredFuncsCleanup: + * @ctxt: the XPath context + * + * Cleanup the XPath context data associated to registered functions + */ +void +xmlXPathRegisteredFuncsCleanup(xmlXPathContextPtr ctxt) { + if (ctxt == NULL) + return; + + xmlHashFree(ctxt->funcHash, NULL); + ctxt->funcHash = NULL; +} + +/************************************************************************ + * * + * Routines to handle Variables * + * * + ************************************************************************/ + +/** + * xmlXPathRegisterVariable: + * @ctxt: the XPath context + * @name: the variable name + * @value: the variable value or NULL + * + * Register a new variable value. If @value is NULL it unregisters + * the variable + * + * Returns 0 in case of success, -1 in case of error + */ +int +xmlXPathRegisterVariable(xmlXPathContextPtr ctxt, const xmlChar *name, + xmlXPathObjectPtr value) { + return(xmlXPathRegisterVariableNS(ctxt, name, NULL, value)); +} + +/** + * xmlXPathRegisterVariableNS: + * @ctxt: the XPath context + * @name: the variable name + * @ns_uri: the variable namespace URI + * @value: the variable value or NULL + * + * Register a new variable value. If @value is NULL it unregisters + * the variable + * + * Returns 0 in case of success, -1 in case of error + */ +int +xmlXPathRegisterVariableNS(xmlXPathContextPtr ctxt, const xmlChar *name, + const xmlChar *ns_uri, + xmlXPathObjectPtr value) { + if (ctxt == NULL) + return(-1); + if (name == NULL) + return(-1); + + if (ctxt->varHash == NULL) + ctxt->varHash = xmlHashCreate(0); + if (ctxt->varHash == NULL) + return(-1); + if (value == NULL) + return(xmlHashRemoveEntry2(ctxt->varHash, name, ns_uri, + (xmlHashDeallocator)xmlXPathFreeObject)); + return(xmlHashUpdateEntry2(ctxt->varHash, name, ns_uri, + (void *) value, + (xmlHashDeallocator)xmlXPathFreeObject)); +} + +/** + * xmlXPathRegisterVariableLookup: + * @ctxt: the XPath context + * @f: the lookup function + * @data: the lookup data + * + * register an external mechanism to do variable lookup + */ +void +xmlXPathRegisterVariableLookup(xmlXPathContextPtr ctxt, + xmlXPathVariableLookupFunc f, void *data) { + if (ctxt == NULL) + return; + ctxt->varLookupFunc = f; + ctxt->varLookupData = data; +} + +/** + * xmlXPathVariableLookup: + * @ctxt: the XPath context + * @name: the variable name + * + * Search in the Variable array of the context for the given + * variable value. + * + * Returns a copy of the value or NULL if not found + */ +xmlXPathObjectPtr +xmlXPathVariableLookup(xmlXPathContextPtr ctxt, const xmlChar *name) { + if (ctxt == NULL) + return(NULL); + + if (ctxt->varLookupFunc != NULL) { + xmlXPathObjectPtr ret; + + ret = ((xmlXPathVariableLookupFunc)ctxt->varLookupFunc) + (ctxt->varLookupData, name, NULL); + return(ret); + } + return(xmlXPathVariableLookupNS(ctxt, name, NULL)); +} + +/** + * xmlXPathVariableLookupNS: + * @ctxt: the XPath context + * @name: the variable name + * @ns_uri: the variable namespace URI + * + * Search in the Variable array of the context for the given + * variable value. + * + * Returns the a copy of the value or NULL if not found + */ +xmlXPathObjectPtr +xmlXPathVariableLookupNS(xmlXPathContextPtr ctxt, const xmlChar *name, + const xmlChar *ns_uri) { + if (ctxt == NULL) + return(NULL); + + if (ctxt->varLookupFunc != NULL) { + xmlXPathObjectPtr ret; + + ret = ((xmlXPathVariableLookupFunc)ctxt->varLookupFunc) + (ctxt->varLookupData, name, ns_uri); + if (ret != NULL) return(ret); + } + + if (ctxt->varHash == NULL) + return(NULL); + if (name == NULL) + return(NULL); + + return(xmlXPathCacheObjectCopy(ctxt, (xmlXPathObjectPtr) + xmlHashLookup2(ctxt->varHash, name, ns_uri))); +} + +/** + * xmlXPathRegisteredVariablesCleanup: + * @ctxt: the XPath context + * + * Cleanup the XPath context data associated to registered variables + */ +void +xmlXPathRegisteredVariablesCleanup(xmlXPathContextPtr ctxt) { + if (ctxt == NULL) + return; + + xmlHashFree(ctxt->varHash, (xmlHashDeallocator)xmlXPathFreeObject); + ctxt->varHash = NULL; +} + +/** + * xmlXPathRegisterNs: + * @ctxt: the XPath context + * @prefix: the namespace prefix cannot be NULL or empty string + * @ns_uri: the namespace name + * + * Register a new namespace. If @ns_uri is NULL it unregisters + * the namespace + * + * Returns 0 in case of success, -1 in case of error + */ +int +xmlXPathRegisterNs(xmlXPathContextPtr ctxt, const xmlChar *prefix, + const xmlChar *ns_uri) { + if (ctxt == NULL) + return(-1); + if (prefix == NULL) + return(-1); + if (prefix[0] == 0) + return(-1); + + if (ctxt->nsHash == NULL) + ctxt->nsHash = xmlHashCreate(10); + if (ctxt->nsHash == NULL) + return(-1); + if (ns_uri == NULL) + return(xmlHashRemoveEntry(ctxt->nsHash, prefix, + (xmlHashDeallocator)xmlFree)); + return(xmlHashUpdateEntry(ctxt->nsHash, prefix, (void *) xmlStrdup(ns_uri), + (xmlHashDeallocator)xmlFree)); +} + +/** + * xmlXPathNsLookup: + * @ctxt: the XPath context + * @prefix: the namespace prefix value + * + * Search in the namespace declaration array of the context for the given + * namespace name associated to the given prefix + * + * Returns the value or NULL if not found + */ +const xmlChar * +xmlXPathNsLookup(xmlXPathContextPtr ctxt, const xmlChar *prefix) { + if (ctxt == NULL) + return(NULL); + if (prefix == NULL) + return(NULL); + +#ifdef XML_XML_NAMESPACE + if (xmlStrEqual(prefix, (const xmlChar *) "xml")) + return(XML_XML_NAMESPACE); +#endif + + if (ctxt->namespaces != NULL) { + int i; + + for (i = 0;i < ctxt->nsNr;i++) { + if ((ctxt->namespaces[i] != NULL) && + (xmlStrEqual(ctxt->namespaces[i]->prefix, prefix))) + return(ctxt->namespaces[i]->href); + } + } + + return((const xmlChar *) xmlHashLookup(ctxt->nsHash, prefix)); +} + +/** + * xmlXPathRegisteredNsCleanup: + * @ctxt: the XPath context + * + * Cleanup the XPath context data associated to registered variables + */ +void +xmlXPathRegisteredNsCleanup(xmlXPathContextPtr ctxt) { + if (ctxt == NULL) + return; + + xmlHashFree(ctxt->nsHash, (xmlHashDeallocator)xmlFree); + ctxt->nsHash = NULL; +} + +/************************************************************************ + * * + * Routines to handle Values * + * * + ************************************************************************/ + +/* Allocations are terrible, one needs to optimize all this !!! */ + +/** + * xmlXPathNewFloat: + * @val: the double value + * + * Create a new xmlXPathObjectPtr of type double and of value @val + * + * Returns the newly created object. + */ +xmlXPathObjectPtr +xmlXPathNewFloat(double val) { + xmlXPathObjectPtr ret; + + ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); + if (ret == NULL) { + xmlXPathErrMemory(NULL, "creating float object\n"); + return(NULL); + } + memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); + ret->type = XPATH_NUMBER; + ret->floatval = val; +#ifdef XP_DEBUG_OBJ_USAGE + xmlXPathDebugObjUsageRequested(NULL, XPATH_NUMBER); +#endif + return(ret); +} + +/** + * xmlXPathNewBoolean: + * @val: the boolean value + * + * Create a new xmlXPathObjectPtr of type boolean and of value @val + * + * Returns the newly created object. + */ +xmlXPathObjectPtr +xmlXPathNewBoolean(int val) { + xmlXPathObjectPtr ret; + + ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); + if (ret == NULL) { + xmlXPathErrMemory(NULL, "creating boolean object\n"); + return(NULL); + } + memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); + ret->type = XPATH_BOOLEAN; + ret->boolval = (val != 0); +#ifdef XP_DEBUG_OBJ_USAGE + xmlXPathDebugObjUsageRequested(NULL, XPATH_BOOLEAN); +#endif + return(ret); +} + +/** + * xmlXPathNewString: + * @val: the xmlChar * value + * + * Create a new xmlXPathObjectPtr of type string and of value @val + * + * Returns the newly created object. + */ +xmlXPathObjectPtr +xmlXPathNewString(const xmlChar *val) { + xmlXPathObjectPtr ret; + + ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); + if (ret == NULL) { + xmlXPathErrMemory(NULL, "creating string object\n"); + return(NULL); + } + memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); + ret->type = XPATH_STRING; + if (val != NULL) + ret->stringval = xmlStrdup(val); + else + ret->stringval = xmlStrdup((const xmlChar *)""); +#ifdef XP_DEBUG_OBJ_USAGE + xmlXPathDebugObjUsageRequested(NULL, XPATH_STRING); +#endif + return(ret); +} + +/** + * xmlXPathWrapString: + * @val: the xmlChar * value + * + * Wraps the @val string into an XPath object. + * + * Returns the newly created object. + */ +xmlXPathObjectPtr +xmlXPathWrapString (xmlChar *val) { + xmlXPathObjectPtr ret; + + ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); + if (ret == NULL) { + xmlXPathErrMemory(NULL, "creating string object\n"); + return(NULL); + } + memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); + ret->type = XPATH_STRING; + ret->stringval = val; +#ifdef XP_DEBUG_OBJ_USAGE + xmlXPathDebugObjUsageRequested(NULL, XPATH_STRING); +#endif + return(ret); +} + +/** + * xmlXPathNewCString: + * @val: the char * value + * + * Create a new xmlXPathObjectPtr of type string and of value @val + * + * Returns the newly created object. + */ +xmlXPathObjectPtr +xmlXPathNewCString(const char *val) { + xmlXPathObjectPtr ret; + + ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); + if (ret == NULL) { + xmlXPathErrMemory(NULL, "creating string object\n"); + return(NULL); + } + memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); + ret->type = XPATH_STRING; + ret->stringval = xmlStrdup(BAD_CAST val); +#ifdef XP_DEBUG_OBJ_USAGE + xmlXPathDebugObjUsageRequested(NULL, XPATH_STRING); +#endif + return(ret); +} + +/** + * xmlXPathWrapCString: + * @val: the char * value + * + * Wraps a string into an XPath object. + * + * Returns the newly created object. + */ +xmlXPathObjectPtr +xmlXPathWrapCString (char * val) { + return(xmlXPathWrapString((xmlChar *)(val))); +} + +/** + * xmlXPathWrapExternal: + * @val: the user data + * + * Wraps the @val data into an XPath object. + * + * Returns the newly created object. + */ +xmlXPathObjectPtr +xmlXPathWrapExternal (void *val) { + xmlXPathObjectPtr ret; + + ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); + if (ret == NULL) { + xmlXPathErrMemory(NULL, "creating user object\n"); + return(NULL); + } + memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); + ret->type = XPATH_USERS; + ret->user = val; +#ifdef XP_DEBUG_OBJ_USAGE + xmlXPathDebugObjUsageRequested(NULL, XPATH_USERS); +#endif + return(ret); +} + +/** + * xmlXPathObjectCopy: + * @val: the original object + * + * allocate a new copy of a given object + * + * Returns the newly created object. + */ +xmlXPathObjectPtr +xmlXPathObjectCopy(xmlXPathObjectPtr val) { + xmlXPathObjectPtr ret; + + if (val == NULL) + return(NULL); + + ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); + if (ret == NULL) { + xmlXPathErrMemory(NULL, "copying object\n"); + return(NULL); + } + memcpy(ret, val , (size_t) sizeof(xmlXPathObject)); +#ifdef XP_DEBUG_OBJ_USAGE + xmlXPathDebugObjUsageRequested(NULL, val->type); +#endif + switch (val->type) { + case XPATH_BOOLEAN: + case XPATH_NUMBER: + case XPATH_POINT: + case XPATH_RANGE: + break; + case XPATH_STRING: + ret->stringval = xmlStrdup(val->stringval); + break; + case XPATH_XSLT_TREE: +#if 0 +/* + Removed 11 July 2004 - the current handling of xslt tmpRVT nodes means that + this previous handling is no longer correct, and can cause some serious + problems (ref. bug 145547) +*/ + if ((val->nodesetval != NULL) && + (val->nodesetval->nodeTab != NULL)) { + xmlNodePtr cur, tmp; + xmlDocPtr top; + + ret->boolval = 1; + top = xmlNewDoc(NULL); + top->name = (char *) + xmlStrdup(val->nodesetval->nodeTab[0]->name); + ret->user = top; + if (top != NULL) { + top->doc = top; + cur = val->nodesetval->nodeTab[0]->children; + while (cur != NULL) { + tmp = xmlDocCopyNode(cur, top, 1); + xmlAddChild((xmlNodePtr) top, tmp); + cur = cur->next; + } + } + + ret->nodesetval = xmlXPathNodeSetCreate((xmlNodePtr) top); + } else + ret->nodesetval = xmlXPathNodeSetCreate(NULL); + /* Deallocate the copied tree value */ + break; +#endif + case XPATH_NODESET: + ret->nodesetval = xmlXPathNodeSetMerge(NULL, val->nodesetval); + /* Do not deallocate the copied tree value */ + ret->boolval = 0; + break; + case XPATH_LOCATIONSET: +#ifdef LIBXML_XPTR_ENABLED + { + xmlLocationSetPtr loc = val->user; + ret->user = (void *) xmlXPtrLocationSetMerge(NULL, loc); + break; + } +#endif + case XPATH_USERS: + ret->user = val->user; + break; + case XPATH_UNDEFINED: + xmlGenericError(xmlGenericErrorContext, + "xmlXPathObjectCopy: unsupported type %d\n", + val->type); + break; + } + return(ret); +} + +/** + * xmlXPathFreeObject: + * @obj: the object to free + * + * Free up an xmlXPathObjectPtr object. + */ +void +xmlXPathFreeObject(xmlXPathObjectPtr obj) { + if (obj == NULL) return; + if ((obj->type == XPATH_NODESET) || (obj->type == XPATH_XSLT_TREE)) { + if (obj->boolval) { +#if 0 + if (obj->user != NULL) { + xmlXPathFreeNodeSet(obj->nodesetval); + xmlFreeNodeList((xmlNodePtr) obj->user); + } else +#endif + obj->type = XPATH_XSLT_TREE; /* TODO: Just for debugging. */ + if (obj->nodesetval != NULL) + xmlXPathFreeValueTree(obj->nodesetval); + } else { + if (obj->nodesetval != NULL) + xmlXPathFreeNodeSet(obj->nodesetval); + } +#ifdef LIBXML_XPTR_ENABLED + } else if (obj->type == XPATH_LOCATIONSET) { + if (obj->user != NULL) + xmlXPtrFreeLocationSet(obj->user); +#endif + } else if (obj->type == XPATH_STRING) { + if (obj->stringval != NULL) + xmlFree(obj->stringval); + } +#ifdef XP_DEBUG_OBJ_USAGE + xmlXPathDebugObjUsageReleased(NULL, obj->type); +#endif + xmlFree(obj); +} + +/** + * xmlXPathReleaseObject: + * @obj: the xmlXPathObjectPtr to free or to cache + * + * Depending on the state of the cache this frees the given + * XPath object or stores it in the cache. + */ +static void +xmlXPathReleaseObject(xmlXPathContextPtr ctxt, xmlXPathObjectPtr obj) +{ +#define XP_CACHE_ADD(sl, o) if (sl == NULL) { \ + sl = xmlPointerListCreate(10); if (sl == NULL) goto free_obj; } \ + if (xmlPointerListAddSize(sl, obj, 0) == -1) goto free_obj; + +#define XP_CACHE_WANTS(sl, n) ((sl == NULL) || ((sl)->number < n)) + + if (obj == NULL) + return; + if ((ctxt == NULL) || (ctxt->cache == NULL)) { + xmlXPathFreeObject(obj); + } else { + xmlXPathContextCachePtr cache = + (xmlXPathContextCachePtr) ctxt->cache; + + switch (obj->type) { + case XPATH_NODESET: + case XPATH_XSLT_TREE: + if (obj->nodesetval != NULL) { + if (obj->boolval) { + /* + * It looks like the @boolval is used for + * evaluation if this an XSLT Result Tree Fragment. + * TODO: Check if this assumption is correct. + */ + obj->type = XPATH_XSLT_TREE; /* just for debugging */ + xmlXPathFreeValueTree(obj->nodesetval); + obj->nodesetval = NULL; + } else if ((obj->nodesetval->nodeMax <= 40) && + (XP_CACHE_WANTS(cache->nodesetObjs, + cache->maxNodeset))) + { + XP_CACHE_ADD(cache->nodesetObjs, obj); + goto obj_cached; + } else { + xmlXPathFreeNodeSet(obj->nodesetval); + obj->nodesetval = NULL; + } + } + break; + case XPATH_STRING: + if (obj->stringval != NULL) + xmlFree(obj->stringval); + + if (XP_CACHE_WANTS(cache->stringObjs, cache->maxString)) { + XP_CACHE_ADD(cache->stringObjs, obj); + goto obj_cached; + } + break; + case XPATH_BOOLEAN: + if (XP_CACHE_WANTS(cache->booleanObjs, cache->maxBoolean)) { + XP_CACHE_ADD(cache->booleanObjs, obj); + goto obj_cached; + } + break; + case XPATH_NUMBER: + if (XP_CACHE_WANTS(cache->numberObjs, cache->maxNumber)) { + XP_CACHE_ADD(cache->numberObjs, obj); + goto obj_cached; + } + break; +#ifdef LIBXML_XPTR_ENABLED + case XPATH_LOCATIONSET: + if (obj->user != NULL) { + xmlXPtrFreeLocationSet(obj->user); + } + goto free_obj; +#endif + default: + goto free_obj; + } + + /* + * Fallback to adding to the misc-objects slot. + */ + if (XP_CACHE_WANTS(cache->miscObjs, cache->maxMisc)) { + XP_CACHE_ADD(cache->miscObjs, obj); + } else + goto free_obj; + +obj_cached: + +#ifdef XP_DEBUG_OBJ_USAGE + xmlXPathDebugObjUsageReleased(ctxt, obj->type); +#endif + + if (obj->nodesetval != NULL) { + xmlNodeSetPtr tmpset = obj->nodesetval; + + /* + * TODO: Due to those nasty ns-nodes, we need to traverse + * the list and free the ns-nodes. + * URGENT TODO: Check if it's actually slowing things down. + * Maybe we shouldn't try to preserve the list. + */ + if (tmpset->nodeNr > 1) { + int i; + xmlNodePtr node; + + for (i = 0; i < tmpset->nodeNr; i++) { + node = tmpset->nodeTab[i]; + if ((node != NULL) && + (node->type == XML_NAMESPACE_DECL)) + { + xmlXPathNodeSetFreeNs((xmlNsPtr) node); + } + } + } else if (tmpset->nodeNr == 1) { + if ((tmpset->nodeTab[0] != NULL) && + (tmpset->nodeTab[0]->type == XML_NAMESPACE_DECL)) + xmlXPathNodeSetFreeNs((xmlNsPtr) tmpset->nodeTab[0]); + } + tmpset->nodeNr = 0; + memset(obj, 0, sizeof(xmlXPathObject)); + obj->nodesetval = tmpset; + } else + memset(obj, 0, sizeof(xmlXPathObject)); + + return; + +free_obj: + /* + * Cache is full; free the object. + */ + if (obj->nodesetval != NULL) + xmlXPathFreeNodeSet(obj->nodesetval); +#ifdef XP_DEBUG_OBJ_USAGE + xmlXPathDebugObjUsageReleased(NULL, obj->type); +#endif + xmlFree(obj); + } + return; +} + + +/************************************************************************ + * * + * Type Casting Routines * + * * + ************************************************************************/ + +/** + * xmlXPathCastBooleanToString: + * @val: a boolean + * + * Converts a boolean to its string value. + * + * Returns a newly allocated string. + */ +xmlChar * +xmlXPathCastBooleanToString (int val) { + xmlChar *ret; + if (val) + ret = xmlStrdup((const xmlChar *) "true"); + else + ret = xmlStrdup((const xmlChar *) "false"); + return(ret); +} + +/** + * xmlXPathCastNumberToString: + * @val: a number + * + * Converts a number to its string value. + * + * Returns a newly allocated string. + */ +xmlChar * +xmlXPathCastNumberToString (double val) { + xmlChar *ret; + switch (xmlXPathIsInf(val)) { + case 1: + ret = xmlStrdup((const xmlChar *) "Infinity"); + break; + case -1: + ret = xmlStrdup((const xmlChar *) "-Infinity"); + break; + default: + if (xmlXPathIsNaN(val)) { + ret = xmlStrdup((const xmlChar *) "NaN"); + } else if (val == 0 && xmlXPathGetSign(val) != 0) { + ret = xmlStrdup((const xmlChar *) "0"); + } else { + /* could be improved */ + char buf[100]; + xmlXPathFormatNumber(val, buf, 99); + buf[99] = 0; + ret = xmlStrdup((const xmlChar *) buf); + } + } + return(ret); +} + +/** + * xmlXPathCastNodeToString: + * @node: a node + * + * Converts a node to its string value. + * + * Returns a newly allocated string. + */ +xmlChar * +xmlXPathCastNodeToString (xmlNodePtr node) { +xmlChar *ret; + if ((ret = xmlNodeGetContent(node)) == NULL) + ret = xmlStrdup((const xmlChar *) ""); + return(ret); +} + +/** + * xmlXPathCastNodeSetToString: + * @ns: a node-set + * + * Converts a node-set to its string value. + * + * Returns a newly allocated string. + */ +xmlChar * +xmlXPathCastNodeSetToString (xmlNodeSetPtr ns) { + if ((ns == NULL) || (ns->nodeNr == 0) || (ns->nodeTab == NULL)) + return(xmlStrdup((const xmlChar *) "")); + + if (ns->nodeNr > 1) + xmlXPathNodeSetSort(ns); + return(xmlXPathCastNodeToString(ns->nodeTab[0])); +} + +/** + * xmlXPathCastToString: + * @val: an XPath object + * + * Converts an existing object to its string() equivalent + * + * Returns the allocated string value of the object, NULL in case of error. + * It's up to the caller to free the string memory with xmlFree(). + */ +xmlChar * +xmlXPathCastToString(xmlXPathObjectPtr val) { + xmlChar *ret = NULL; + + if (val == NULL) + return(xmlStrdup((const xmlChar *) "")); + switch (val->type) { + case XPATH_UNDEFINED: +#ifdef DEBUG_EXPR + xmlGenericError(xmlGenericErrorContext, "String: undefined\n"); +#endif + ret = xmlStrdup((const xmlChar *) ""); + break; + case XPATH_NODESET: + case XPATH_XSLT_TREE: + ret = xmlXPathCastNodeSetToString(val->nodesetval); + break; + case XPATH_STRING: + return(xmlStrdup(val->stringval)); + case XPATH_BOOLEAN: + ret = xmlXPathCastBooleanToString(val->boolval); + break; + case XPATH_NUMBER: { + ret = xmlXPathCastNumberToString(val->floatval); + break; + } + case XPATH_USERS: + case XPATH_POINT: + case XPATH_RANGE: + case XPATH_LOCATIONSET: + TODO + ret = xmlStrdup((const xmlChar *) ""); + break; + } + return(ret); +} + +/** + * xmlXPathConvertString: + * @val: an XPath object + * + * Converts an existing object to its string() equivalent + * + * Returns the new object, the old one is freed (or the operation + * is done directly on @val) + */ +xmlXPathObjectPtr +xmlXPathConvertString(xmlXPathObjectPtr val) { + xmlChar *res = NULL; + + if (val == NULL) + return(xmlXPathNewCString("")); + + switch (val->type) { + case XPATH_UNDEFINED: +#ifdef DEBUG_EXPR + xmlGenericError(xmlGenericErrorContext, "STRING: undefined\n"); +#endif + break; + case XPATH_NODESET: + case XPATH_XSLT_TREE: + res = xmlXPathCastNodeSetToString(val->nodesetval); + break; + case XPATH_STRING: + return(val); + case XPATH_BOOLEAN: + res = xmlXPathCastBooleanToString(val->boolval); + break; + case XPATH_NUMBER: + res = xmlXPathCastNumberToString(val->floatval); + break; + case XPATH_USERS: + case XPATH_POINT: + case XPATH_RANGE: + case XPATH_LOCATIONSET: + TODO; + break; + } + xmlXPathFreeObject(val); + if (res == NULL) + return(xmlXPathNewCString("")); + return(xmlXPathWrapString(res)); +} + +/** + * xmlXPathCastBooleanToNumber: + * @val: a boolean + * + * Converts a boolean to its number value + * + * Returns the number value + */ +double +xmlXPathCastBooleanToNumber(int val) { + if (val) + return(1.0); + return(0.0); +} + +/** + * xmlXPathCastStringToNumber: + * @val: a string + * + * Converts a string to its number value + * + * Returns the number value + */ +double +xmlXPathCastStringToNumber(const xmlChar * val) { + return(xmlXPathStringEvalNumber(val)); +} + +/** + * xmlXPathCastNodeToNumber: + * @node: a node + * + * Converts a node to its number value + * + * Returns the number value + */ +double +xmlXPathCastNodeToNumber (xmlNodePtr node) { + xmlChar *strval; + double ret; + + if (node == NULL) + return(xmlXPathNAN); + strval = xmlXPathCastNodeToString(node); + if (strval == NULL) + return(xmlXPathNAN); + ret = xmlXPathCastStringToNumber(strval); + xmlFree(strval); + + return(ret); +} + +/** + * xmlXPathCastNodeSetToNumber: + * @ns: a node-set + * + * Converts a node-set to its number value + * + * Returns the number value + */ +double +xmlXPathCastNodeSetToNumber (xmlNodeSetPtr ns) { + xmlChar *str; + double ret; + + if (ns == NULL) + return(xmlXPathNAN); + str = xmlXPathCastNodeSetToString(ns); + ret = xmlXPathCastStringToNumber(str); + xmlFree(str); + return(ret); +} + +/** + * xmlXPathCastToNumber: + * @val: an XPath object + * + * Converts an XPath object to its number value + * + * Returns the number value + */ +double +xmlXPathCastToNumber(xmlXPathObjectPtr val) { + double ret = 0.0; + + if (val == NULL) + return(xmlXPathNAN); + switch (val->type) { + case XPATH_UNDEFINED: +#ifdef DEGUB_EXPR + xmlGenericError(xmlGenericErrorContext, "NUMBER: undefined\n"); +#endif + ret = xmlXPathNAN; + break; + case XPATH_NODESET: + case XPATH_XSLT_TREE: + ret = xmlXPathCastNodeSetToNumber(val->nodesetval); + break; + case XPATH_STRING: + ret = xmlXPathCastStringToNumber(val->stringval); + break; + case XPATH_NUMBER: + ret = val->floatval; + break; + case XPATH_BOOLEAN: + ret = xmlXPathCastBooleanToNumber(val->boolval); + break; + case XPATH_USERS: + case XPATH_POINT: + case XPATH_RANGE: + case XPATH_LOCATIONSET: + TODO; + ret = xmlXPathNAN; + break; + } + return(ret); +} + +/** + * xmlXPathConvertNumber: + * @val: an XPath object + * + * Converts an existing object to its number() equivalent + * + * Returns the new object, the old one is freed (or the operation + * is done directly on @val) + */ +xmlXPathObjectPtr +xmlXPathConvertNumber(xmlXPathObjectPtr val) { + xmlXPathObjectPtr ret; + + if (val == NULL) + return(xmlXPathNewFloat(0.0)); + if (val->type == XPATH_NUMBER) + return(val); + ret = xmlXPathNewFloat(xmlXPathCastToNumber(val)); + xmlXPathFreeObject(val); + return(ret); +} + +/** + * xmlXPathCastNumberToBoolean: + * @val: a number + * + * Converts a number to its boolean value + * + * Returns the boolean value + */ +int +xmlXPathCastNumberToBoolean (double val) { + if (xmlXPathIsNaN(val) || (val == 0.0)) + return(0); + return(1); +} + +/** + * xmlXPathCastStringToBoolean: + * @val: a string + * + * Converts a string to its boolean value + * + * Returns the boolean value + */ +int +xmlXPathCastStringToBoolean (const xmlChar *val) { + if ((val == NULL) || (xmlStrlen(val) == 0)) + return(0); + return(1); +} + +/** + * xmlXPathCastNodeSetToBoolean: + * @ns: a node-set + * + * Converts a node-set to its boolean value + * + * Returns the boolean value + */ +int +xmlXPathCastNodeSetToBoolean (xmlNodeSetPtr ns) { + if ((ns == NULL) || (ns->nodeNr == 0)) + return(0); + return(1); +} + +/** + * xmlXPathCastToBoolean: + * @val: an XPath object + * + * Converts an XPath object to its boolean value + * + * Returns the boolean value + */ +int +xmlXPathCastToBoolean (xmlXPathObjectPtr val) { + int ret = 0; + + if (val == NULL) + return(0); + switch (val->type) { + case XPATH_UNDEFINED: +#ifdef DEBUG_EXPR + xmlGenericError(xmlGenericErrorContext, "BOOLEAN: undefined\n"); +#endif + ret = 0; + break; + case XPATH_NODESET: + case XPATH_XSLT_TREE: + ret = xmlXPathCastNodeSetToBoolean(val->nodesetval); + break; + case XPATH_STRING: + ret = xmlXPathCastStringToBoolean(val->stringval); + break; + case XPATH_NUMBER: + ret = xmlXPathCastNumberToBoolean(val->floatval); + break; + case XPATH_BOOLEAN: + ret = val->boolval; + break; + case XPATH_USERS: + case XPATH_POINT: + case XPATH_RANGE: + case XPATH_LOCATIONSET: + TODO; + ret = 0; + break; + } + return(ret); +} + + +/** + * xmlXPathConvertBoolean: + * @val: an XPath object + * + * Converts an existing object to its boolean() equivalent + * + * Returns the new object, the old one is freed (or the operation + * is done directly on @val) + */ +xmlXPathObjectPtr +xmlXPathConvertBoolean(xmlXPathObjectPtr val) { + xmlXPathObjectPtr ret; + + if (val == NULL) + return(xmlXPathNewBoolean(0)); + if (val->type == XPATH_BOOLEAN) + return(val); + ret = xmlXPathNewBoolean(xmlXPathCastToBoolean(val)); + xmlXPathFreeObject(val); + return(ret); +} + +/************************************************************************ + * * + * Routines to handle XPath contexts * + * * + ************************************************************************/ + +/** + * xmlXPathNewContext: + * @doc: the XML document + * + * Create a new xmlXPathContext + * + * Returns the xmlXPathContext just allocated. The caller will need to free it. + */ +xmlXPathContextPtr +xmlXPathNewContext(xmlDocPtr doc) { + xmlXPathContextPtr ret; + + ret = (xmlXPathContextPtr) xmlMalloc(sizeof(xmlXPathContext)); + if (ret == NULL) { + xmlXPathErrMemory(NULL, "creating context\n"); + return(NULL); + } + memset(ret, 0 , (size_t) sizeof(xmlXPathContext)); + ret->doc = doc; + ret->node = NULL; + + ret->varHash = NULL; + + ret->nb_types = 0; + ret->max_types = 0; + ret->types = NULL; + + ret->funcHash = xmlHashCreate(0); + + ret->nb_axis = 0; + ret->max_axis = 0; + ret->axis = NULL; + + ret->nsHash = NULL; + ret->user = NULL; + + ret->contextSize = -1; + ret->proximityPosition = -1; + +#ifdef XP_DEFAULT_CACHE_ON + if (xmlXPathContextSetCache(ret, 1, -1, 0) == -1) { + xmlXPathFreeContext(ret); + return(NULL); + } +#endif + + xmlXPathRegisterAllFunctions(ret); + + return(ret); +} + +/** + * xmlXPathFreeContext: + * @ctxt: the context to free + * + * Free up an xmlXPathContext + */ +void +xmlXPathFreeContext(xmlXPathContextPtr ctxt) { + if (ctxt == NULL) return; + + if (ctxt->cache != NULL) + xmlXPathFreeCache((xmlXPathContextCachePtr) ctxt->cache); + xmlXPathRegisteredNsCleanup(ctxt); + xmlXPathRegisteredFuncsCleanup(ctxt); + xmlXPathRegisteredVariablesCleanup(ctxt); + xmlResetError(&ctxt->lastError); + xmlFree(ctxt); +} + +/************************************************************************ + * * + * Routines to handle XPath parser contexts * + * * + ************************************************************************/ + +#define CHECK_CTXT(ctxt) \ + if (ctxt == NULL) { \ + __xmlRaiseError(NULL, NULL, NULL, \ + NULL, NULL, XML_FROM_XPATH, \ + XML_ERR_INTERNAL_ERROR, XML_ERR_FATAL, \ + __FILE__, __LINE__, \ + NULL, NULL, NULL, 0, 0, \ + "NULL context pointer\n"); \ + return(NULL); \ + } \ + +#define CHECK_CTXT_NEG(ctxt) \ + if (ctxt == NULL) { \ + __xmlRaiseError(NULL, NULL, NULL, \ + NULL, NULL, XML_FROM_XPATH, \ + XML_ERR_INTERNAL_ERROR, XML_ERR_FATAL, \ + __FILE__, __LINE__, \ + NULL, NULL, NULL, 0, 0, \ + "NULL context pointer\n"); \ + return(-1); \ + } \ + + +#define CHECK_CONTEXT(ctxt) \ + if ((ctxt == NULL) || (ctxt->doc == NULL) || \ + (ctxt->doc->children == NULL)) { \ + xmlXPatherror(ctxt, __FILE__, __LINE__, XPATH_INVALID_CTXT); \ + return(NULL); \ + } + + +/** + * xmlXPathNewParserContext: + * @str: the XPath expression + * @ctxt: the XPath context + * + * Create a new xmlXPathParserContext + * + * Returns the xmlXPathParserContext just allocated. + */ +xmlXPathParserContextPtr +xmlXPathNewParserContext(const xmlChar *str, xmlXPathContextPtr ctxt) { + xmlXPathParserContextPtr ret; + + ret = (xmlXPathParserContextPtr) xmlMalloc(sizeof(xmlXPathParserContext)); + if (ret == NULL) { + xmlXPathErrMemory(ctxt, "creating parser context\n"); + return(NULL); + } + memset(ret, 0 , (size_t) sizeof(xmlXPathParserContext)); + ret->cur = ret->base = str; + ret->context = ctxt; + + ret->comp = xmlXPathNewCompExpr(); + if (ret->comp == NULL) { + xmlFree(ret->valueTab); + xmlFree(ret); + return(NULL); + } + if ((ctxt != NULL) && (ctxt->dict != NULL)) { + ret->comp->dict = ctxt->dict; + xmlDictReference(ret->comp->dict); + } + + return(ret); +} + +/** + * xmlXPathCompParserContext: + * @comp: the XPath compiled expression + * @ctxt: the XPath context + * + * Create a new xmlXPathParserContext when processing a compiled expression + * + * Returns the xmlXPathParserContext just allocated. + */ +static xmlXPathParserContextPtr +xmlXPathCompParserContext(xmlXPathCompExprPtr comp, xmlXPathContextPtr ctxt) { + xmlXPathParserContextPtr ret; + + ret = (xmlXPathParserContextPtr) xmlMalloc(sizeof(xmlXPathParserContext)); + if (ret == NULL) { + xmlXPathErrMemory(ctxt, "creating evaluation context\n"); + return(NULL); + } + memset(ret, 0 , (size_t) sizeof(xmlXPathParserContext)); + + /* Allocate the value stack */ + ret->valueTab = (xmlXPathObjectPtr *) + xmlMalloc(10 * sizeof(xmlXPathObjectPtr)); + if (ret->valueTab == NULL) { + xmlFree(ret); + xmlXPathErrMemory(ctxt, "creating evaluation context\n"); + return(NULL); + } + ret->valueNr = 0; + ret->valueMax = 10; + ret->value = NULL; + ret->valueFrame = 0; + + ret->context = ctxt; + ret->comp = comp; + + return(ret); +} + +/** + * xmlXPathFreeParserContext: + * @ctxt: the context to free + * + * Free up an xmlXPathParserContext + */ +void +xmlXPathFreeParserContext(xmlXPathParserContextPtr ctxt) { + if (ctxt->valueTab != NULL) { + xmlFree(ctxt->valueTab); + } + if (ctxt->comp != NULL) { +#ifdef XPATH_STREAMING + if (ctxt->comp->stream != NULL) { + xmlFreePatternList(ctxt->comp->stream); + ctxt->comp->stream = NULL; + } +#endif + xmlXPathFreeCompExpr(ctxt->comp); + } + xmlFree(ctxt); +} + +/************************************************************************ + * * + * The implicit core function library * + * * + ************************************************************************/ + +/** + * xmlXPathNodeValHash: + * @node: a node pointer + * + * Function computing the beginning of the string value of the node, + * used to speed up comparisons + * + * Returns an int usable as a hash + */ +static unsigned int +xmlXPathNodeValHash(xmlNodePtr node) { + int len = 2; + const xmlChar * string = NULL; + xmlNodePtr tmp = NULL; + unsigned int ret = 0; + + if (node == NULL) + return(0); + + if (node->type == XML_DOCUMENT_NODE) { + tmp = xmlDocGetRootElement((xmlDocPtr) node); + if (tmp == NULL) + node = node->children; + else + node = tmp; + + if (node == NULL) + return(0); + } + + switch (node->type) { + case XML_COMMENT_NODE: + case XML_PI_NODE: + case XML_CDATA_SECTION_NODE: + case XML_TEXT_NODE: + string = node->content; + if (string == NULL) + return(0); + if (string[0] == 0) + return(0); + return(((unsigned int) string[0]) + + (((unsigned int) string[1]) << 8)); + case XML_NAMESPACE_DECL: + string = ((xmlNsPtr)node)->href; + if (string == NULL) + return(0); + if (string[0] == 0) + return(0); + return(((unsigned int) string[0]) + + (((unsigned int) string[1]) << 8)); + case XML_ATTRIBUTE_NODE: + tmp = ((xmlAttrPtr) node)->children; + break; + case XML_ELEMENT_NODE: + tmp = node->children; + break; + default: + return(0); + } + while (tmp != NULL) { + switch (tmp->type) { + case XML_COMMENT_NODE: + case XML_PI_NODE: + case XML_CDATA_SECTION_NODE: + case XML_TEXT_NODE: + string = tmp->content; + break; + case XML_NAMESPACE_DECL: + string = ((xmlNsPtr)tmp)->href; + break; + default: + break; + } + if ((string != NULL) && (string[0] != 0)) { + if (len == 1) { + return(ret + (((unsigned int) string[0]) << 8)); + } + if (string[1] == 0) { + len = 1; + ret = (unsigned int) string[0]; + } else { + return(((unsigned int) string[0]) + + (((unsigned int) string[1]) << 8)); + } + } + /* + * Skip to next node + */ + if ((tmp->children != NULL) && (tmp->type != XML_DTD_NODE)) { + if (tmp->children->type != XML_ENTITY_DECL) { + tmp = tmp->children; + continue; + } + } + if (tmp == node) + break; + + if (tmp->next != NULL) { + tmp = tmp->next; + continue; + } + + do { + tmp = tmp->parent; + if (tmp == NULL) + break; + if (tmp == node) { + tmp = NULL; + break; + } + if (tmp->next != NULL) { + tmp = tmp->next; + break; + } + } while (tmp != NULL); + } + return(ret); +} + +/** + * xmlXPathStringHash: + * @string: a string + * + * Function computing the beginning of the string value of the node, + * used to speed up comparisons + * + * Returns an int usable as a hash + */ +static unsigned int +xmlXPathStringHash(const xmlChar * string) { + if (string == NULL) + return((unsigned int) 0); + if (string[0] == 0) + return(0); + return(((unsigned int) string[0]) + + (((unsigned int) string[1]) << 8)); +} + +/** + * xmlXPathCompareNodeSetFloat: + * @ctxt: the XPath Parser context + * @inf: less than (1) or greater than (0) + * @strict: is the comparison strict + * @arg: the node set + * @f: the value + * + * Implement the compare operation between a nodeset and a number + * @ns < @val (1, 1, ... + * @ns <= @val (1, 0, ... + * @ns > @val (0, 1, ... + * @ns >= @val (0, 0, ... + * + * If one object to be compared is a node-set and the other is a number, + * then the comparison will be true if and only if there is a node in the + * node-set such that the result of performing the comparison on the number + * to be compared and on the result of converting the string-value of that + * node to a number using the number function is true. + * + * Returns 0 or 1 depending on the results of the test. + */ +static int +xmlXPathCompareNodeSetFloat(xmlXPathParserContextPtr ctxt, int inf, int strict, + xmlXPathObjectPtr arg, xmlXPathObjectPtr f) { + int i, ret = 0; + xmlNodeSetPtr ns; + xmlChar *str2; + + if ((f == NULL) || (arg == NULL) || + ((arg->type != XPATH_NODESET) && (arg->type != XPATH_XSLT_TREE))) { + xmlXPathReleaseObject(ctxt->context, arg); + xmlXPathReleaseObject(ctxt->context, f); + return(0); + } + ns = arg->nodesetval; + if (ns != NULL) { + for (i = 0;i < ns->nodeNr;i++) { + str2 = xmlXPathCastNodeToString(ns->nodeTab[i]); + if (str2 != NULL) { + valuePush(ctxt, + xmlXPathCacheNewString(ctxt->context, str2)); + xmlFree(str2); + xmlXPathNumberFunction(ctxt, 1); + valuePush(ctxt, xmlXPathCacheObjectCopy(ctxt->context, f)); + ret = xmlXPathCompareValues(ctxt, inf, strict); + if (ret) + break; + } + } + } + xmlXPathReleaseObject(ctxt->context, arg); + xmlXPathReleaseObject(ctxt->context, f); + return(ret); +} + +/** + * xmlXPathCompareNodeSetString: + * @ctxt: the XPath Parser context + * @inf: less than (1) or greater than (0) + * @strict: is the comparison strict + * @arg: the node set + * @s: the value + * + * Implement the compare operation between a nodeset and a string + * @ns < @val (1, 1, ... + * @ns <= @val (1, 0, ... + * @ns > @val (0, 1, ... + * @ns >= @val (0, 0, ... + * + * If one object to be compared is a node-set and the other is a string, + * then the comparison will be true if and only if there is a node in + * the node-set such that the result of performing the comparison on the + * string-value of the node and the other string is true. + * + * Returns 0 or 1 depending on the results of the test. + */ +static int +xmlXPathCompareNodeSetString(xmlXPathParserContextPtr ctxt, int inf, int strict, + xmlXPathObjectPtr arg, xmlXPathObjectPtr s) { + int i, ret = 0; + xmlNodeSetPtr ns; + xmlChar *str2; + + if ((s == NULL) || (arg == NULL) || + ((arg->type != XPATH_NODESET) && (arg->type != XPATH_XSLT_TREE))) { + xmlXPathReleaseObject(ctxt->context, arg); + xmlXPathReleaseObject(ctxt->context, s); + return(0); + } + ns = arg->nodesetval; + if (ns != NULL) { + for (i = 0;i < ns->nodeNr;i++) { + str2 = xmlXPathCastNodeToString(ns->nodeTab[i]); + if (str2 != NULL) { + valuePush(ctxt, + xmlXPathCacheNewString(ctxt->context, str2)); + xmlFree(str2); + valuePush(ctxt, xmlXPathCacheObjectCopy(ctxt->context, s)); + ret = xmlXPathCompareValues(ctxt, inf, strict); + if (ret) + break; + } + } + } + xmlXPathReleaseObject(ctxt->context, arg); + xmlXPathReleaseObject(ctxt->context, s); + return(ret); +} + +/** + * xmlXPathCompareNodeSets: + * @inf: less than (1) or greater than (0) + * @strict: is the comparison strict + * @arg1: the first node set object + * @arg2: the second node set object + * + * Implement the compare operation on nodesets: + * + * If both objects to be compared are node-sets, then the comparison + * will be true if and only if there is a node in the first node-set + * and a node in the second node-set such that the result of performing + * the comparison on the string-values of the two nodes is true. + * .... + * When neither object to be compared is a node-set and the operator + * is <=, <, >= or >, then the objects are compared by converting both + * objects to numbers and comparing the numbers according to IEEE 754. + * .... + * The number function converts its argument to a number as follows: + * - a string that consists of optional whitespace followed by an + * optional minus sign followed by a Number followed by whitespace + * is converted to the IEEE 754 number that is nearest (according + * to the IEEE 754 round-to-nearest rule) to the mathematical value + * represented by the string; any other string is converted to NaN + * + * Conclusion all nodes need to be converted first to their string value + * and then the comparison must be done when possible + */ +static int +xmlXPathCompareNodeSets(int inf, int strict, + xmlXPathObjectPtr arg1, xmlXPathObjectPtr arg2) { + int i, j, init = 0; + double val1; + double *values2; + int ret = 0; + xmlNodeSetPtr ns1; + xmlNodeSetPtr ns2; + + if ((arg1 == NULL) || + ((arg1->type != XPATH_NODESET) && (arg1->type != XPATH_XSLT_TREE))) { + xmlXPathFreeObject(arg2); + return(0); + } + if ((arg2 == NULL) || + ((arg2->type != XPATH_NODESET) && (arg2->type != XPATH_XSLT_TREE))) { + xmlXPathFreeObject(arg1); + xmlXPathFreeObject(arg2); + return(0); + } + + ns1 = arg1->nodesetval; + ns2 = arg2->nodesetval; + + if ((ns1 == NULL) || (ns1->nodeNr <= 0)) { + xmlXPathFreeObject(arg1); + xmlXPathFreeObject(arg2); + return(0); + } + if ((ns2 == NULL) || (ns2->nodeNr <= 0)) { + xmlXPathFreeObject(arg1); + xmlXPathFreeObject(arg2); + return(0); + } + + values2 = (double *) xmlMalloc(ns2->nodeNr * sizeof(double)); + if (values2 == NULL) { + xmlXPathErrMemory(NULL, "comparing nodesets\n"); + xmlXPathFreeObject(arg1); + xmlXPathFreeObject(arg2); + return(0); + } + for (i = 0;i < ns1->nodeNr;i++) { + val1 = xmlXPathCastNodeToNumber(ns1->nodeTab[i]); + if (xmlXPathIsNaN(val1)) + continue; + for (j = 0;j < ns2->nodeNr;j++) { + if (init == 0) { + values2[j] = xmlXPathCastNodeToNumber(ns2->nodeTab[j]); + } + if (xmlXPathIsNaN(values2[j])) + continue; + if (inf && strict) + ret = (val1 < values2[j]); + else if (inf && !strict) + ret = (val1 <= values2[j]); + else if (!inf && strict) + ret = (val1 > values2[j]); + else if (!inf && !strict) + ret = (val1 >= values2[j]); + if (ret) + break; + } + if (ret) + break; + init = 1; + } + xmlFree(values2); + xmlXPathFreeObject(arg1); + xmlXPathFreeObject(arg2); + return(ret); +} + +/** + * xmlXPathCompareNodeSetValue: + * @ctxt: the XPath Parser context + * @inf: less than (1) or greater than (0) + * @strict: is the comparison strict + * @arg: the node set + * @val: the value + * + * Implement the compare operation between a nodeset and a value + * @ns < @val (1, 1, ... + * @ns <= @val (1, 0, ... + * @ns > @val (0, 1, ... + * @ns >= @val (0, 0, ... + * + * If one object to be compared is a node-set and the other is a boolean, + * then the comparison will be true if and only if the result of performing + * the comparison on the boolean and on the result of converting + * the node-set to a boolean using the boolean function is true. + * + * Returns 0 or 1 depending on the results of the test. + */ +static int +xmlXPathCompareNodeSetValue(xmlXPathParserContextPtr ctxt, int inf, int strict, + xmlXPathObjectPtr arg, xmlXPathObjectPtr val) { + if ((val == NULL) || (arg == NULL) || + ((arg->type != XPATH_NODESET) && (arg->type != XPATH_XSLT_TREE))) + return(0); + + switch(val->type) { + case XPATH_NUMBER: + return(xmlXPathCompareNodeSetFloat(ctxt, inf, strict, arg, val)); + case XPATH_NODESET: + case XPATH_XSLT_TREE: + return(xmlXPathCompareNodeSets(inf, strict, arg, val)); + case XPATH_STRING: + return(xmlXPathCompareNodeSetString(ctxt, inf, strict, arg, val)); + case XPATH_BOOLEAN: + valuePush(ctxt, arg); + xmlXPathBooleanFunction(ctxt, 1); + valuePush(ctxt, val); + return(xmlXPathCompareValues(ctxt, inf, strict)); + default: + TODO + } + return(0); +} + +/** + * xmlXPathEqualNodeSetString: + * @arg: the nodeset object argument + * @str: the string to compare to. + * @neq: flag to show whether for '=' (0) or '!=' (1) + * + * Implement the equal operation on XPath objects content: @arg1 == @arg2 + * If one object to be compared is a node-set and the other is a string, + * then the comparison will be true if and only if there is a node in + * the node-set such that the result of performing the comparison on the + * string-value of the node and the other string is true. + * + * Returns 0 or 1 depending on the results of the test. + */ +static int +xmlXPathEqualNodeSetString(xmlXPathObjectPtr arg, const xmlChar * str, int neq) +{ + int i; + xmlNodeSetPtr ns; + xmlChar *str2; + unsigned int hash; + + if ((str == NULL) || (arg == NULL) || + ((arg->type != XPATH_NODESET) && (arg->type != XPATH_XSLT_TREE))) + return (0); + ns = arg->nodesetval; + /* + * A NULL nodeset compared with a string is always false + * (since there is no node equal, and no node not equal) + */ + if ((ns == NULL) || (ns->nodeNr <= 0) ) + return (0); + hash = xmlXPathStringHash(str); + for (i = 0; i < ns->nodeNr; i++) { + if (xmlXPathNodeValHash(ns->nodeTab[i]) == hash) { + str2 = xmlNodeGetContent(ns->nodeTab[i]); + if ((str2 != NULL) && (xmlStrEqual(str, str2))) { + xmlFree(str2); + if (neq) + continue; + return (1); + } else if ((str2 == NULL) && (xmlStrEqual(str, BAD_CAST ""))) { + if (neq) + continue; + return (1); + } else if (neq) { + if (str2 != NULL) + xmlFree(str2); + return (1); + } + if (str2 != NULL) + xmlFree(str2); + } else if (neq) + return (1); + } + return (0); +} + +/** + * xmlXPathEqualNodeSetFloat: + * @arg: the nodeset object argument + * @f: the float to compare to + * @neq: flag to show whether to compare '=' (0) or '!=' (1) + * + * Implement the equal operation on XPath objects content: @arg1 == @arg2 + * If one object to be compared is a node-set and the other is a number, + * then the comparison will be true if and only if there is a node in + * the node-set such that the result of performing the comparison on the + * number to be compared and on the result of converting the string-value + * of that node to a number using the number function is true. + * + * Returns 0 or 1 depending on the results of the test. + */ +static int +xmlXPathEqualNodeSetFloat(xmlXPathParserContextPtr ctxt, + xmlXPathObjectPtr arg, double f, int neq) { + int i, ret=0; + xmlNodeSetPtr ns; + xmlChar *str2; + xmlXPathObjectPtr val; + double v; + + if ((arg == NULL) || + ((arg->type != XPATH_NODESET) && (arg->type != XPATH_XSLT_TREE))) + return(0); + + ns = arg->nodesetval; + if (ns != NULL) { + for (i=0;inodeNr;i++) { + str2 = xmlXPathCastNodeToString(ns->nodeTab[i]); + if (str2 != NULL) { + valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, str2)); + xmlFree(str2); + xmlXPathNumberFunction(ctxt, 1); + val = valuePop(ctxt); + v = val->floatval; + xmlXPathReleaseObject(ctxt->context, val); + if (!xmlXPathIsNaN(v)) { + if ((!neq) && (v==f)) { + ret = 1; + break; + } else if ((neq) && (v!=f)) { + ret = 1; + break; + } + } else { /* NaN is unequal to any value */ + if (neq) + ret = 1; + } + } + } + } + + return(ret); +} + + +/** + * xmlXPathEqualNodeSets: + * @arg1: first nodeset object argument + * @arg2: second nodeset object argument + * @neq: flag to show whether to test '=' (0) or '!=' (1) + * + * Implement the equal / not equal operation on XPath nodesets: + * @arg1 == @arg2 or @arg1 != @arg2 + * If both objects to be compared are node-sets, then the comparison + * will be true if and only if there is a node in the first node-set and + * a node in the second node-set such that the result of performing the + * comparison on the string-values of the two nodes is true. + * + * (needless to say, this is a costly operation) + * + * Returns 0 or 1 depending on the results of the test. + */ +static int +xmlXPathEqualNodeSets(xmlXPathObjectPtr arg1, xmlXPathObjectPtr arg2, int neq) { + int i, j; + unsigned int *hashs1; + unsigned int *hashs2; + xmlChar **values1; + xmlChar **values2; + int ret = 0; + xmlNodeSetPtr ns1; + xmlNodeSetPtr ns2; + + if ((arg1 == NULL) || + ((arg1->type != XPATH_NODESET) && (arg1->type != XPATH_XSLT_TREE))) + return(0); + if ((arg2 == NULL) || + ((arg2->type != XPATH_NODESET) && (arg2->type != XPATH_XSLT_TREE))) + return(0); + + ns1 = arg1->nodesetval; + ns2 = arg2->nodesetval; + + if ((ns1 == NULL) || (ns1->nodeNr <= 0)) + return(0); + if ((ns2 == NULL) || (ns2->nodeNr <= 0)) + return(0); + + /* + * for equal, check if there is a node pertaining to both sets + */ + if (neq == 0) + for (i = 0;i < ns1->nodeNr;i++) + for (j = 0;j < ns2->nodeNr;j++) + if (ns1->nodeTab[i] == ns2->nodeTab[j]) + return(1); + + values1 = (xmlChar **) xmlMalloc(ns1->nodeNr * sizeof(xmlChar *)); + if (values1 == NULL) { + xmlXPathErrMemory(NULL, "comparing nodesets\n"); + return(0); + } + hashs1 = (unsigned int *) xmlMalloc(ns1->nodeNr * sizeof(unsigned int)); + if (hashs1 == NULL) { + xmlXPathErrMemory(NULL, "comparing nodesets\n"); + xmlFree(values1); + return(0); + } + memset(values1, 0, ns1->nodeNr * sizeof(xmlChar *)); + values2 = (xmlChar **) xmlMalloc(ns2->nodeNr * sizeof(xmlChar *)); + if (values2 == NULL) { + xmlXPathErrMemory(NULL, "comparing nodesets\n"); + xmlFree(hashs1); + xmlFree(values1); + return(0); + } + hashs2 = (unsigned int *) xmlMalloc(ns2->nodeNr * sizeof(unsigned int)); + if (hashs2 == NULL) { + xmlXPathErrMemory(NULL, "comparing nodesets\n"); + xmlFree(hashs1); + xmlFree(values1); + xmlFree(values2); + return(0); + } + memset(values2, 0, ns2->nodeNr * sizeof(xmlChar *)); + for (i = 0;i < ns1->nodeNr;i++) { + hashs1[i] = xmlXPathNodeValHash(ns1->nodeTab[i]); + for (j = 0;j < ns2->nodeNr;j++) { + if (i == 0) + hashs2[j] = xmlXPathNodeValHash(ns2->nodeTab[j]); + if (hashs1[i] != hashs2[j]) { + if (neq) { + ret = 1; + break; + } + } + else { + if (values1[i] == NULL) + values1[i] = xmlNodeGetContent(ns1->nodeTab[i]); + if (values2[j] == NULL) + values2[j] = xmlNodeGetContent(ns2->nodeTab[j]); + ret = xmlStrEqual(values1[i], values2[j]) ^ neq; + if (ret) + break; + } + } + if (ret) + break; + } + for (i = 0;i < ns1->nodeNr;i++) + if (values1[i] != NULL) + xmlFree(values1[i]); + for (j = 0;j < ns2->nodeNr;j++) + if (values2[j] != NULL) + xmlFree(values2[j]); + xmlFree(values1); + xmlFree(values2); + xmlFree(hashs1); + xmlFree(hashs2); + return(ret); +} + +static int +xmlXPathEqualValuesCommon(xmlXPathParserContextPtr ctxt, + xmlXPathObjectPtr arg1, xmlXPathObjectPtr arg2) { + int ret = 0; + /* + *At this point we are assured neither arg1 nor arg2 + *is a nodeset, so we can just pick the appropriate routine. + */ + switch (arg1->type) { + case XPATH_UNDEFINED: +#ifdef DEBUG_EXPR + xmlGenericError(xmlGenericErrorContext, + "Equal: undefined\n"); +#endif + break; + case XPATH_BOOLEAN: + switch (arg2->type) { + case XPATH_UNDEFINED: +#ifdef DEBUG_EXPR + xmlGenericError(xmlGenericErrorContext, + "Equal: undefined\n"); +#endif + break; + case XPATH_BOOLEAN: +#ifdef DEBUG_EXPR + xmlGenericError(xmlGenericErrorContext, + "Equal: %d boolean %d \n", + arg1->boolval, arg2->boolval); +#endif + ret = (arg1->boolval == arg2->boolval); + break; + case XPATH_NUMBER: + ret = (arg1->boolval == + xmlXPathCastNumberToBoolean(arg2->floatval)); + break; + case XPATH_STRING: + if ((arg2->stringval == NULL) || + (arg2->stringval[0] == 0)) ret = 0; + else + ret = 1; + ret = (arg1->boolval == ret); + break; + case XPATH_USERS: + case XPATH_POINT: + case XPATH_RANGE: + case XPATH_LOCATIONSET: + TODO + break; + case XPATH_NODESET: + case XPATH_XSLT_TREE: + break; + } + break; + case XPATH_NUMBER: + switch (arg2->type) { + case XPATH_UNDEFINED: +#ifdef DEBUG_EXPR + xmlGenericError(xmlGenericErrorContext, + "Equal: undefined\n"); +#endif + break; + case XPATH_BOOLEAN: + ret = (arg2->boolval== + xmlXPathCastNumberToBoolean(arg1->floatval)); + break; + case XPATH_STRING: + valuePush(ctxt, arg2); + xmlXPathNumberFunction(ctxt, 1); + arg2 = valuePop(ctxt); + /* no break on purpose */ + case XPATH_NUMBER: + /* Hand check NaN and Infinity equalities */ + if (xmlXPathIsNaN(arg1->floatval) || + xmlXPathIsNaN(arg2->floatval)) { + ret = 0; + } else if (xmlXPathIsInf(arg1->floatval) == 1) { + if (xmlXPathIsInf(arg2->floatval) == 1) + ret = 1; + else + ret = 0; + } else if (xmlXPathIsInf(arg1->floatval) == -1) { + if (xmlXPathIsInf(arg2->floatval) == -1) + ret = 1; + else + ret = 0; + } else if (xmlXPathIsInf(arg2->floatval) == 1) { + if (xmlXPathIsInf(arg1->floatval) == 1) + ret = 1; + else + ret = 0; + } else if (xmlXPathIsInf(arg2->floatval) == -1) { + if (xmlXPathIsInf(arg1->floatval) == -1) + ret = 1; + else + ret = 0; + } else { + ret = (arg1->floatval == arg2->floatval); + } + break; + case XPATH_USERS: + case XPATH_POINT: + case XPATH_RANGE: + case XPATH_LOCATIONSET: + TODO + break; + case XPATH_NODESET: + case XPATH_XSLT_TREE: + break; + } + break; + case XPATH_STRING: + switch (arg2->type) { + case XPATH_UNDEFINED: +#ifdef DEBUG_EXPR + xmlGenericError(xmlGenericErrorContext, + "Equal: undefined\n"); +#endif + break; + case XPATH_BOOLEAN: + if ((arg1->stringval == NULL) || + (arg1->stringval[0] == 0)) ret = 0; + else + ret = 1; + ret = (arg2->boolval == ret); + break; + case XPATH_STRING: + ret = xmlStrEqual(arg1->stringval, arg2->stringval); + break; + case XPATH_NUMBER: + valuePush(ctxt, arg1); + xmlXPathNumberFunction(ctxt, 1); + arg1 = valuePop(ctxt); + /* Hand check NaN and Infinity equalities */ + if (xmlXPathIsNaN(arg1->floatval) || + xmlXPathIsNaN(arg2->floatval)) { + ret = 0; + } else if (xmlXPathIsInf(arg1->floatval) == 1) { + if (xmlXPathIsInf(arg2->floatval) == 1) + ret = 1; + else + ret = 0; + } else if (xmlXPathIsInf(arg1->floatval) == -1) { + if (xmlXPathIsInf(arg2->floatval) == -1) + ret = 1; + else + ret = 0; + } else if (xmlXPathIsInf(arg2->floatval) == 1) { + if (xmlXPathIsInf(arg1->floatval) == 1) + ret = 1; + else + ret = 0; + } else if (xmlXPathIsInf(arg2->floatval) == -1) { + if (xmlXPathIsInf(arg1->floatval) == -1) + ret = 1; + else + ret = 0; + } else { + ret = (arg1->floatval == arg2->floatval); + } + break; + case XPATH_USERS: + case XPATH_POINT: + case XPATH_RANGE: + case XPATH_LOCATIONSET: + TODO + break; + case XPATH_NODESET: + case XPATH_XSLT_TREE: + break; + } + break; + case XPATH_USERS: + case XPATH_POINT: + case XPATH_RANGE: + case XPATH_LOCATIONSET: + TODO + break; + case XPATH_NODESET: + case XPATH_XSLT_TREE: + break; + } + xmlXPathReleaseObject(ctxt->context, arg1); + xmlXPathReleaseObject(ctxt->context, arg2); + return(ret); +} + +/** + * xmlXPathEqualValues: + * @ctxt: the XPath Parser context + * + * Implement the equal operation on XPath objects content: @arg1 == @arg2 + * + * Returns 0 or 1 depending on the results of the test. + */ +int +xmlXPathEqualValues(xmlXPathParserContextPtr ctxt) { + xmlXPathObjectPtr arg1, arg2, argtmp; + int ret = 0; + + if ((ctxt == NULL) || (ctxt->context == NULL)) return(0); + arg2 = valuePop(ctxt); + arg1 = valuePop(ctxt); + if ((arg1 == NULL) || (arg2 == NULL)) { + if (arg1 != NULL) + xmlXPathReleaseObject(ctxt->context, arg1); + else + xmlXPathReleaseObject(ctxt->context, arg2); + XP_ERROR0(XPATH_INVALID_OPERAND); + } + + if (arg1 == arg2) { +#ifdef DEBUG_EXPR + xmlGenericError(xmlGenericErrorContext, + "Equal: by pointer\n"); +#endif + xmlXPathFreeObject(arg1); + return(1); + } + + /* + *If either argument is a nodeset, it's a 'special case' + */ + if ((arg2->type == XPATH_NODESET) || (arg2->type == XPATH_XSLT_TREE) || + (arg1->type == XPATH_NODESET) || (arg1->type == XPATH_XSLT_TREE)) { + /* + *Hack it to assure arg1 is the nodeset + */ + if ((arg1->type != XPATH_NODESET) && (arg1->type != XPATH_XSLT_TREE)) { + argtmp = arg2; + arg2 = arg1; + arg1 = argtmp; + } + switch (arg2->type) { + case XPATH_UNDEFINED: +#ifdef DEBUG_EXPR + xmlGenericError(xmlGenericErrorContext, + "Equal: undefined\n"); +#endif + break; + case XPATH_NODESET: + case XPATH_XSLT_TREE: + ret = xmlXPathEqualNodeSets(arg1, arg2, 0); + break; + case XPATH_BOOLEAN: + if ((arg1->nodesetval == NULL) || + (arg1->nodesetval->nodeNr == 0)) ret = 0; + else + ret = 1; + ret = (ret == arg2->boolval); + break; + case XPATH_NUMBER: + ret = xmlXPathEqualNodeSetFloat(ctxt, arg1, arg2->floatval, 0); + break; + case XPATH_STRING: + ret = xmlXPathEqualNodeSetString(arg1, arg2->stringval, 0); + break; + case XPATH_USERS: + case XPATH_POINT: + case XPATH_RANGE: + case XPATH_LOCATIONSET: + TODO + break; + } + xmlXPathReleaseObject(ctxt->context, arg1); + xmlXPathReleaseObject(ctxt->context, arg2); + return(ret); + } + + return (xmlXPathEqualValuesCommon(ctxt, arg1, arg2)); +} + +/** + * xmlXPathNotEqualValues: + * @ctxt: the XPath Parser context + * + * Implement the equal operation on XPath objects content: @arg1 == @arg2 + * + * Returns 0 or 1 depending on the results of the test. + */ +int +xmlXPathNotEqualValues(xmlXPathParserContextPtr ctxt) { + xmlXPathObjectPtr arg1, arg2, argtmp; + int ret = 0; + + if ((ctxt == NULL) || (ctxt->context == NULL)) return(0); + arg2 = valuePop(ctxt); + arg1 = valuePop(ctxt); + if ((arg1 == NULL) || (arg2 == NULL)) { + if (arg1 != NULL) + xmlXPathReleaseObject(ctxt->context, arg1); + else + xmlXPathReleaseObject(ctxt->context, arg2); + XP_ERROR0(XPATH_INVALID_OPERAND); + } + + if (arg1 == arg2) { +#ifdef DEBUG_EXPR + xmlGenericError(xmlGenericErrorContext, + "NotEqual: by pointer\n"); +#endif + xmlXPathReleaseObject(ctxt->context, arg1); + return(0); + } + + /* + *If either argument is a nodeset, it's a 'special case' + */ + if ((arg2->type == XPATH_NODESET) || (arg2->type == XPATH_XSLT_TREE) || + (arg1->type == XPATH_NODESET) || (arg1->type == XPATH_XSLT_TREE)) { + /* + *Hack it to assure arg1 is the nodeset + */ + if ((arg1->type != XPATH_NODESET) && (arg1->type != XPATH_XSLT_TREE)) { + argtmp = arg2; + arg2 = arg1; + arg1 = argtmp; + } + switch (arg2->type) { + case XPATH_UNDEFINED: +#ifdef DEBUG_EXPR + xmlGenericError(xmlGenericErrorContext, + "NotEqual: undefined\n"); +#endif + break; + case XPATH_NODESET: + case XPATH_XSLT_TREE: + ret = xmlXPathEqualNodeSets(arg1, arg2, 1); + break; + case XPATH_BOOLEAN: + if ((arg1->nodesetval == NULL) || + (arg1->nodesetval->nodeNr == 0)) ret = 0; + else + ret = 1; + ret = (ret != arg2->boolval); + break; + case XPATH_NUMBER: + ret = xmlXPathEqualNodeSetFloat(ctxt, arg1, arg2->floatval, 1); + break; + case XPATH_STRING: + ret = xmlXPathEqualNodeSetString(arg1, arg2->stringval,1); + break; + case XPATH_USERS: + case XPATH_POINT: + case XPATH_RANGE: + case XPATH_LOCATIONSET: + TODO + break; + } + xmlXPathReleaseObject(ctxt->context, arg1); + xmlXPathReleaseObject(ctxt->context, arg2); + return(ret); + } + + return (!xmlXPathEqualValuesCommon(ctxt, arg1, arg2)); +} + +/** + * xmlXPathCompareValues: + * @ctxt: the XPath Parser context + * @inf: less than (1) or greater than (0) + * @strict: is the comparison strict + * + * Implement the compare operation on XPath objects: + * @arg1 < @arg2 (1, 1, ... + * @arg1 <= @arg2 (1, 0, ... + * @arg1 > @arg2 (0, 1, ... + * @arg1 >= @arg2 (0, 0, ... + * + * When neither object to be compared is a node-set and the operator is + * <=, <, >=, >, then the objects are compared by converted both objects + * to numbers and comparing the numbers according to IEEE 754. The < + * comparison will be true if and only if the first number is less than the + * second number. The <= comparison will be true if and only if the first + * number is less than or equal to the second number. The > comparison + * will be true if and only if the first number is greater than the second + * number. The >= comparison will be true if and only if the first number + * is greater than or equal to the second number. + * + * Returns 1 if the comparison succeeded, 0 if it failed + */ +int +xmlXPathCompareValues(xmlXPathParserContextPtr ctxt, int inf, int strict) { + int ret = 0, arg1i = 0, arg2i = 0; + xmlXPathObjectPtr arg1, arg2; + + if ((ctxt == NULL) || (ctxt->context == NULL)) return(0); + arg2 = valuePop(ctxt); + arg1 = valuePop(ctxt); + if ((arg1 == NULL) || (arg2 == NULL)) { + if (arg1 != NULL) + xmlXPathReleaseObject(ctxt->context, arg1); + else + xmlXPathReleaseObject(ctxt->context, arg2); + XP_ERROR0(XPATH_INVALID_OPERAND); + } + + if ((arg2->type == XPATH_NODESET) || (arg2->type == XPATH_XSLT_TREE) || + (arg1->type == XPATH_NODESET) || (arg1->type == XPATH_XSLT_TREE)) { + /* + * If either argument is a XPATH_NODESET or XPATH_XSLT_TREE the two arguments + * are not freed from within this routine; they will be freed from the + * called routine, e.g. xmlXPathCompareNodeSets or xmlXPathCompareNodeSetValue + */ + if (((arg2->type == XPATH_NODESET) || (arg2->type == XPATH_XSLT_TREE)) && + ((arg1->type == XPATH_NODESET) || (arg1->type == XPATH_XSLT_TREE))){ + ret = xmlXPathCompareNodeSets(inf, strict, arg1, arg2); + } else { + if ((arg1->type == XPATH_NODESET) || (arg1->type == XPATH_XSLT_TREE)) { + ret = xmlXPathCompareNodeSetValue(ctxt, inf, strict, + arg1, arg2); + } else { + ret = xmlXPathCompareNodeSetValue(ctxt, !inf, strict, + arg2, arg1); + } + } + return(ret); + } + + if (arg1->type != XPATH_NUMBER) { + valuePush(ctxt, arg1); + xmlXPathNumberFunction(ctxt, 1); + arg1 = valuePop(ctxt); + } + if (arg1->type != XPATH_NUMBER) { + xmlXPathFreeObject(arg1); + xmlXPathFreeObject(arg2); + XP_ERROR0(XPATH_INVALID_OPERAND); + } + if (arg2->type != XPATH_NUMBER) { + valuePush(ctxt, arg2); + xmlXPathNumberFunction(ctxt, 1); + arg2 = valuePop(ctxt); + } + if (arg2->type != XPATH_NUMBER) { + xmlXPathReleaseObject(ctxt->context, arg1); + xmlXPathReleaseObject(ctxt->context, arg2); + XP_ERROR0(XPATH_INVALID_OPERAND); + } + /* + * Add tests for infinity and nan + * => feedback on 3.4 for Inf and NaN + */ + /* Hand check NaN and Infinity comparisons */ + if (xmlXPathIsNaN(arg1->floatval) || xmlXPathIsNaN(arg2->floatval)) { + ret=0; + } else { + arg1i=xmlXPathIsInf(arg1->floatval); + arg2i=xmlXPathIsInf(arg2->floatval); + if (inf && strict) { + if ((arg1i == -1 && arg2i != -1) || + (arg2i == 1 && arg1i != 1)) { + ret = 1; + } else if (arg1i == 0 && arg2i == 0) { + ret = (arg1->floatval < arg2->floatval); + } else { + ret = 0; + } + } + else if (inf && !strict) { + if (arg1i == -1 || arg2i == 1) { + ret = 1; + } else if (arg1i == 0 && arg2i == 0) { + ret = (arg1->floatval <= arg2->floatval); + } else { + ret = 0; + } + } + else if (!inf && strict) { + if ((arg1i == 1 && arg2i != 1) || + (arg2i == -1 && arg1i != -1)) { + ret = 1; + } else if (arg1i == 0 && arg2i == 0) { + ret = (arg1->floatval > arg2->floatval); + } else { + ret = 0; + } + } + else if (!inf && !strict) { + if (arg1i == 1 || arg2i == -1) { + ret = 1; + } else if (arg1i == 0 && arg2i == 0) { + ret = (arg1->floatval >= arg2->floatval); + } else { + ret = 0; + } + } + } + xmlXPathReleaseObject(ctxt->context, arg1); + xmlXPathReleaseObject(ctxt->context, arg2); + return(ret); +} + +/** + * xmlXPathValueFlipSign: + * @ctxt: the XPath Parser context + * + * Implement the unary - operation on an XPath object + * The numeric operators convert their operands to numbers as if + * by calling the number function. + */ +void +xmlXPathValueFlipSign(xmlXPathParserContextPtr ctxt) { + if ((ctxt == NULL) || (ctxt->context == NULL)) return; + CAST_TO_NUMBER; + CHECK_TYPE(XPATH_NUMBER); + if (xmlXPathIsNaN(ctxt->value->floatval)) + ctxt->value->floatval=xmlXPathNAN; + else if (xmlXPathIsInf(ctxt->value->floatval) == 1) + ctxt->value->floatval=xmlXPathNINF; + else if (xmlXPathIsInf(ctxt->value->floatval) == -1) + ctxt->value->floatval=xmlXPathPINF; + else if (ctxt->value->floatval == 0) { + if (xmlXPathGetSign(ctxt->value->floatval) == 0) + ctxt->value->floatval = xmlXPathNZERO; + else + ctxt->value->floatval = 0; + } + else + ctxt->value->floatval = - ctxt->value->floatval; +} + +/** + * xmlXPathAddValues: + * @ctxt: the XPath Parser context + * + * Implement the add operation on XPath objects: + * The numeric operators convert their operands to numbers as if + * by calling the number function. + */ +void +xmlXPathAddValues(xmlXPathParserContextPtr ctxt) { + xmlXPathObjectPtr arg; + double val; + + arg = valuePop(ctxt); + if (arg == NULL) + XP_ERROR(XPATH_INVALID_OPERAND); + val = xmlXPathCastToNumber(arg); + xmlXPathReleaseObject(ctxt->context, arg); + CAST_TO_NUMBER; + CHECK_TYPE(XPATH_NUMBER); + ctxt->value->floatval += val; +} + +/** + * xmlXPathSubValues: + * @ctxt: the XPath Parser context + * + * Implement the subtraction operation on XPath objects: + * The numeric operators convert their operands to numbers as if + * by calling the number function. + */ +void +xmlXPathSubValues(xmlXPathParserContextPtr ctxt) { + xmlXPathObjectPtr arg; + double val; + + arg = valuePop(ctxt); + if (arg == NULL) + XP_ERROR(XPATH_INVALID_OPERAND); + val = xmlXPathCastToNumber(arg); + xmlXPathReleaseObject(ctxt->context, arg); + CAST_TO_NUMBER; + CHECK_TYPE(XPATH_NUMBER); + ctxt->value->floatval -= val; +} + +/** + * xmlXPathMultValues: + * @ctxt: the XPath Parser context + * + * Implement the multiply operation on XPath objects: + * The numeric operators convert their operands to numbers as if + * by calling the number function. + */ +void +xmlXPathMultValues(xmlXPathParserContextPtr ctxt) { + xmlXPathObjectPtr arg; + double val; + + arg = valuePop(ctxt); + if (arg == NULL) + XP_ERROR(XPATH_INVALID_OPERAND); + val = xmlXPathCastToNumber(arg); + xmlXPathReleaseObject(ctxt->context, arg); + CAST_TO_NUMBER; + CHECK_TYPE(XPATH_NUMBER); + ctxt->value->floatval *= val; +} + +/** + * xmlXPathDivValues: + * @ctxt: the XPath Parser context + * + * Implement the div operation on XPath objects @arg1 / @arg2: + * The numeric operators convert their operands to numbers as if + * by calling the number function. + */ +void +xmlXPathDivValues(xmlXPathParserContextPtr ctxt) { + xmlXPathObjectPtr arg; + double val; + + arg = valuePop(ctxt); + if (arg == NULL) + XP_ERROR(XPATH_INVALID_OPERAND); + val = xmlXPathCastToNumber(arg); + xmlXPathReleaseObject(ctxt->context, arg); + CAST_TO_NUMBER; + CHECK_TYPE(XPATH_NUMBER); + if (xmlXPathIsNaN(val) || xmlXPathIsNaN(ctxt->value->floatval)) + ctxt->value->floatval = xmlXPathNAN; + else if (val == 0 && xmlXPathGetSign(val) != 0) { + if (ctxt->value->floatval == 0) + ctxt->value->floatval = xmlXPathNAN; + else if (ctxt->value->floatval > 0) + ctxt->value->floatval = xmlXPathNINF; + else if (ctxt->value->floatval < 0) + ctxt->value->floatval = xmlXPathPINF; + } + else if (val == 0) { + if (ctxt->value->floatval == 0) + ctxt->value->floatval = xmlXPathNAN; + else if (ctxt->value->floatval > 0) + ctxt->value->floatval = xmlXPathPINF; + else if (ctxt->value->floatval < 0) + ctxt->value->floatval = xmlXPathNINF; + } else + ctxt->value->floatval /= val; +} + +/** + * xmlXPathModValues: + * @ctxt: the XPath Parser context + * + * Implement the mod operation on XPath objects: @arg1 / @arg2 + * The numeric operators convert their operands to numbers as if + * by calling the number function. + */ +void +xmlXPathModValues(xmlXPathParserContextPtr ctxt) { + xmlXPathObjectPtr arg; + double arg1, arg2; + + arg = valuePop(ctxt); + if (arg == NULL) + XP_ERROR(XPATH_INVALID_OPERAND); + arg2 = xmlXPathCastToNumber(arg); + xmlXPathReleaseObject(ctxt->context, arg); + CAST_TO_NUMBER; + CHECK_TYPE(XPATH_NUMBER); + arg1 = ctxt->value->floatval; + if (arg2 == 0) + ctxt->value->floatval = xmlXPathNAN; + else { + ctxt->value->floatval = fmod(arg1, arg2); + } +} + +/************************************************************************ + * * + * The traversal functions * + * * + ************************************************************************/ + +/* + * A traversal function enumerates nodes along an axis. + * Initially it must be called with NULL, and it indicates + * termination on the axis by returning NULL. + */ +typedef xmlNodePtr (*xmlXPathTraversalFunction) + (xmlXPathParserContextPtr ctxt, xmlNodePtr cur); + +/* + * xmlXPathTraversalFunctionExt: + * A traversal function enumerates nodes along an axis. + * Initially it must be called with NULL, and it indicates + * termination on the axis by returning NULL. + * The context node of the traversal is specified via @contextNode. + */ +typedef xmlNodePtr (*xmlXPathTraversalFunctionExt) + (xmlNodePtr cur, xmlNodePtr contextNode); + +/* + * xmlXPathNodeSetMergeFunction: + * Used for merging node sets in xmlXPathCollectAndTest(). + */ +typedef xmlNodeSetPtr (*xmlXPathNodeSetMergeFunction) + (xmlNodeSetPtr, xmlNodeSetPtr, int); + + +/** + * xmlXPathNextSelf: + * @ctxt: the XPath Parser context + * @cur: the current node in the traversal + * + * Traversal function for the "self" direction + * The self axis contains just the context node itself + * + * Returns the next element following that axis + */ +xmlNodePtr +xmlXPathNextSelf(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { + if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); + if (cur == NULL) + return(ctxt->context->node); + return(NULL); +} + +/** + * xmlXPathNextChild: + * @ctxt: the XPath Parser context + * @cur: the current node in the traversal + * + * Traversal function for the "child" direction + * The child axis contains the children of the context node in document order. + * + * Returns the next element following that axis + */ +xmlNodePtr +xmlXPathNextChild(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { + if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); + if (cur == NULL) { + if (ctxt->context->node == NULL) return(NULL); + switch (ctxt->context->node->type) { + case XML_ELEMENT_NODE: + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + case XML_ENTITY_REF_NODE: + case XML_ENTITY_NODE: + case XML_PI_NODE: + case XML_COMMENT_NODE: + case XML_NOTATION_NODE: + case XML_DTD_NODE: + return(ctxt->context->node->children); + case XML_DOCUMENT_NODE: + case XML_DOCUMENT_TYPE_NODE: + case XML_DOCUMENT_FRAG_NODE: + case XML_HTML_DOCUMENT_NODE: +#ifdef LIBXML_DOCB_ENABLED + case XML_DOCB_DOCUMENT_NODE: +#endif + return(((xmlDocPtr) ctxt->context->node)->children); + case XML_ELEMENT_DECL: + case XML_ATTRIBUTE_DECL: + case XML_ENTITY_DECL: + case XML_ATTRIBUTE_NODE: + case XML_NAMESPACE_DECL: + case XML_XINCLUDE_START: + case XML_XINCLUDE_END: + return(NULL); + } + return(NULL); + } + if ((cur->type == XML_DOCUMENT_NODE) || + (cur->type == XML_HTML_DOCUMENT_NODE)) + return(NULL); + return(cur->next); +} + +/** + * xmlXPathNextChildElement: + * @ctxt: the XPath Parser context + * @cur: the current node in the traversal + * + * Traversal function for the "child" direction and nodes of type element. + * The child axis contains the children of the context node in document order. + * + * Returns the next element following that axis + */ +static xmlNodePtr +xmlXPathNextChildElement(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { + if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); + if (cur == NULL) { + cur = ctxt->context->node; + if (cur == NULL) return(NULL); + /* + * Get the first element child. + */ + switch (cur->type) { + case XML_ELEMENT_NODE: + case XML_DOCUMENT_FRAG_NODE: + case XML_ENTITY_REF_NODE: /* URGENT TODO: entify-refs as well? */ + case XML_ENTITY_NODE: + cur = cur->children; + if (cur != NULL) { + if (cur->type == XML_ELEMENT_NODE) + return(cur); + do { + cur = cur->next; + } while ((cur != NULL) && + (cur->type != XML_ELEMENT_NODE)); + return(cur); + } + return(NULL); + case XML_DOCUMENT_NODE: + case XML_HTML_DOCUMENT_NODE: +#ifdef LIBXML_DOCB_ENABLED + case XML_DOCB_DOCUMENT_NODE: +#endif + return(xmlDocGetRootElement((xmlDocPtr) cur)); + default: + return(NULL); + } + return(NULL); + } + /* + * Get the next sibling element node. + */ + switch (cur->type) { + case XML_ELEMENT_NODE: + case XML_TEXT_NODE: + case XML_ENTITY_REF_NODE: + case XML_ENTITY_NODE: + case XML_CDATA_SECTION_NODE: + case XML_PI_NODE: + case XML_COMMENT_NODE: + case XML_XINCLUDE_END: + break; + /* case XML_DTD_NODE: */ /* URGENT TODO: DTD-node as well? */ + default: + return(NULL); + } + if (cur->next != NULL) { + if (cur->next->type == XML_ELEMENT_NODE) + return(cur->next); + cur = cur->next; + do { + cur = cur->next; + } while ((cur != NULL) && (cur->type != XML_ELEMENT_NODE)); + return(cur); + } + return(NULL); +} + +#if 0 +/** + * xmlXPathNextDescendantOrSelfElemParent: + * @ctxt: the XPath Parser context + * @cur: the current node in the traversal + * + * Traversal function for the "descendant-or-self" axis. + * Additionally it returns only nodes which can be parents of + * element nodes. + * + * + * Returns the next element following that axis + */ +static xmlNodePtr +xmlXPathNextDescendantOrSelfElemParent(xmlNodePtr cur, + xmlNodePtr contextNode) +{ + if (cur == NULL) { + if (contextNode == NULL) + return(NULL); + switch (contextNode->type) { + case XML_ELEMENT_NODE: + case XML_XINCLUDE_START: + case XML_DOCUMENT_FRAG_NODE: + case XML_DOCUMENT_NODE: +#ifdef LIBXML_DOCB_ENABLED + case XML_DOCB_DOCUMENT_NODE: +#endif + case XML_HTML_DOCUMENT_NODE: + return(contextNode); + default: + return(NULL); + } + return(NULL); + } else { + xmlNodePtr start = cur; + + while (cur != NULL) { + switch (cur->type) { + case XML_ELEMENT_NODE: + /* TODO: OK to have XInclude here? */ + case XML_XINCLUDE_START: + case XML_DOCUMENT_FRAG_NODE: + if (cur != start) + return(cur); + if (cur->children != NULL) { + cur = cur->children; + continue; + } + break; + /* Not sure if we need those here. */ + case XML_DOCUMENT_NODE: +#ifdef LIBXML_DOCB_ENABLED + case XML_DOCB_DOCUMENT_NODE: +#endif + case XML_HTML_DOCUMENT_NODE: + if (cur != start) + return(cur); + return(xmlDocGetRootElement((xmlDocPtr) cur)); + default: + break; + } + +next_sibling: + if ((cur == NULL) || (cur == contextNode)) + return(NULL); + if (cur->next != NULL) { + cur = cur->next; + } else { + cur = cur->parent; + goto next_sibling; + } + } + } + return(NULL); +} +#endif + +/** + * xmlXPathNextDescendant: + * @ctxt: the XPath Parser context + * @cur: the current node in the traversal + * + * Traversal function for the "descendant" direction + * the descendant axis contains the descendants of the context node in document + * order; a descendant is a child or a child of a child and so on. + * + * Returns the next element following that axis + */ +xmlNodePtr +xmlXPathNextDescendant(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { + if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); + if (cur == NULL) { + if (ctxt->context->node == NULL) + return(NULL); + if ((ctxt->context->node->type == XML_ATTRIBUTE_NODE) || + (ctxt->context->node->type == XML_NAMESPACE_DECL)) + return(NULL); + + if (ctxt->context->node == (xmlNodePtr) ctxt->context->doc) + return(ctxt->context->doc->children); + return(ctxt->context->node->children); + } + + if (cur->type == XML_NAMESPACE_DECL) + return(NULL); + if (cur->children != NULL) { + /* + * Do not descend on entities declarations + */ + if (cur->children->type != XML_ENTITY_DECL) { + cur = cur->children; + /* + * Skip DTDs + */ + if (cur->type != XML_DTD_NODE) + return(cur); + } + } + + if (cur == ctxt->context->node) return(NULL); + + while (cur->next != NULL) { + cur = cur->next; + if ((cur->type != XML_ENTITY_DECL) && + (cur->type != XML_DTD_NODE)) + return(cur); + } + + do { + cur = cur->parent; + if (cur == NULL) break; + if (cur == ctxt->context->node) return(NULL); + if (cur->next != NULL) { + cur = cur->next; + return(cur); + } + } while (cur != NULL); + return(cur); +} + +/** + * xmlXPathNextDescendantOrSelf: + * @ctxt: the XPath Parser context + * @cur: the current node in the traversal + * + * Traversal function for the "descendant-or-self" direction + * the descendant-or-self axis contains the context node and the descendants + * of the context node in document order; thus the context node is the first + * node on the axis, and the first child of the context node is the second node + * on the axis + * + * Returns the next element following that axis + */ +xmlNodePtr +xmlXPathNextDescendantOrSelf(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { + if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); + if (cur == NULL) { + if (ctxt->context->node == NULL) + return(NULL); + if ((ctxt->context->node->type == XML_ATTRIBUTE_NODE) || + (ctxt->context->node->type == XML_NAMESPACE_DECL)) + return(NULL); + return(ctxt->context->node); + } + + return(xmlXPathNextDescendant(ctxt, cur)); +} + +/** + * xmlXPathNextParent: + * @ctxt: the XPath Parser context + * @cur: the current node in the traversal + * + * Traversal function for the "parent" direction + * The parent axis contains the parent of the context node, if there is one. + * + * Returns the next element following that axis + */ +xmlNodePtr +xmlXPathNextParent(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { + if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); + /* + * the parent of an attribute or namespace node is the element + * to which the attribute or namespace node is attached + * Namespace handling !!! + */ + if (cur == NULL) { + if (ctxt->context->node == NULL) return(NULL); + switch (ctxt->context->node->type) { + case XML_ELEMENT_NODE: + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + case XML_ENTITY_REF_NODE: + case XML_ENTITY_NODE: + case XML_PI_NODE: + case XML_COMMENT_NODE: + case XML_NOTATION_NODE: + case XML_DTD_NODE: + case XML_ELEMENT_DECL: + case XML_ATTRIBUTE_DECL: + case XML_XINCLUDE_START: + case XML_XINCLUDE_END: + case XML_ENTITY_DECL: + if (ctxt->context->node->parent == NULL) + return((xmlNodePtr) ctxt->context->doc); + if ((ctxt->context->node->parent->type == XML_ELEMENT_NODE) && + ((ctxt->context->node->parent->name[0] == ' ') || + (xmlStrEqual(ctxt->context->node->parent->name, + BAD_CAST "fake node libxslt")))) + return(NULL); + return(ctxt->context->node->parent); + case XML_ATTRIBUTE_NODE: { + xmlAttrPtr att = (xmlAttrPtr) ctxt->context->node; + + return(att->parent); + } + case XML_DOCUMENT_NODE: + case XML_DOCUMENT_TYPE_NODE: + case XML_DOCUMENT_FRAG_NODE: + case XML_HTML_DOCUMENT_NODE: +#ifdef LIBXML_DOCB_ENABLED + case XML_DOCB_DOCUMENT_NODE: +#endif + return(NULL); + case XML_NAMESPACE_DECL: { + xmlNsPtr ns = (xmlNsPtr) ctxt->context->node; + + if ((ns->next != NULL) && + (ns->next->type != XML_NAMESPACE_DECL)) + return((xmlNodePtr) ns->next); + return(NULL); + } + } + } + return(NULL); +} + +/** + * xmlXPathNextAncestor: + * @ctxt: the XPath Parser context + * @cur: the current node in the traversal + * + * Traversal function for the "ancestor" direction + * the ancestor axis contains the ancestors of the context node; the ancestors + * of the context node consist of the parent of context node and the parent's + * parent and so on; the nodes are ordered in reverse document order; thus the + * parent is the first node on the axis, and the parent's parent is the second + * node on the axis + * + * Returns the next element following that axis + */ +xmlNodePtr +xmlXPathNextAncestor(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { + if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); + /* + * the parent of an attribute or namespace node is the element + * to which the attribute or namespace node is attached + * !!!!!!!!!!!!! + */ + if (cur == NULL) { + if (ctxt->context->node == NULL) return(NULL); + switch (ctxt->context->node->type) { + case XML_ELEMENT_NODE: + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + case XML_ENTITY_REF_NODE: + case XML_ENTITY_NODE: + case XML_PI_NODE: + case XML_COMMENT_NODE: + case XML_DTD_NODE: + case XML_ELEMENT_DECL: + case XML_ATTRIBUTE_DECL: + case XML_ENTITY_DECL: + case XML_NOTATION_NODE: + case XML_XINCLUDE_START: + case XML_XINCLUDE_END: + if (ctxt->context->node->parent == NULL) + return((xmlNodePtr) ctxt->context->doc); + if ((ctxt->context->node->parent->type == XML_ELEMENT_NODE) && + ((ctxt->context->node->parent->name[0] == ' ') || + (xmlStrEqual(ctxt->context->node->parent->name, + BAD_CAST "fake node libxslt")))) + return(NULL); + return(ctxt->context->node->parent); + case XML_ATTRIBUTE_NODE: { + xmlAttrPtr tmp = (xmlAttrPtr) ctxt->context->node; + + return(tmp->parent); + } + case XML_DOCUMENT_NODE: + case XML_DOCUMENT_TYPE_NODE: + case XML_DOCUMENT_FRAG_NODE: + case XML_HTML_DOCUMENT_NODE: +#ifdef LIBXML_DOCB_ENABLED + case XML_DOCB_DOCUMENT_NODE: +#endif + return(NULL); + case XML_NAMESPACE_DECL: { + xmlNsPtr ns = (xmlNsPtr) ctxt->context->node; + + if ((ns->next != NULL) && + (ns->next->type != XML_NAMESPACE_DECL)) + return((xmlNodePtr) ns->next); + /* Bad, how did that namespace end up here ? */ + return(NULL); + } + } + return(NULL); + } + if (cur == ctxt->context->doc->children) + return((xmlNodePtr) ctxt->context->doc); + if (cur == (xmlNodePtr) ctxt->context->doc) + return(NULL); + switch (cur->type) { + case XML_ELEMENT_NODE: + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + case XML_ENTITY_REF_NODE: + case XML_ENTITY_NODE: + case XML_PI_NODE: + case XML_COMMENT_NODE: + case XML_NOTATION_NODE: + case XML_DTD_NODE: + case XML_ELEMENT_DECL: + case XML_ATTRIBUTE_DECL: + case XML_ENTITY_DECL: + case XML_XINCLUDE_START: + case XML_XINCLUDE_END: + if (cur->parent == NULL) + return(NULL); + if ((cur->parent->type == XML_ELEMENT_NODE) && + ((cur->parent->name[0] == ' ') || + (xmlStrEqual(cur->parent->name, + BAD_CAST "fake node libxslt")))) + return(NULL); + return(cur->parent); + case XML_ATTRIBUTE_NODE: { + xmlAttrPtr att = (xmlAttrPtr) ctxt->context->node; + + return(att->parent); + } + case XML_NAMESPACE_DECL: { + xmlNsPtr ns = (xmlNsPtr) ctxt->context->node; + + if ((ns->next != NULL) && + (ns->next->type != XML_NAMESPACE_DECL)) + return((xmlNodePtr) ns->next); + /* Bad, how did that namespace end up here ? */ + return(NULL); + } + case XML_DOCUMENT_NODE: + case XML_DOCUMENT_TYPE_NODE: + case XML_DOCUMENT_FRAG_NODE: + case XML_HTML_DOCUMENT_NODE: +#ifdef LIBXML_DOCB_ENABLED + case XML_DOCB_DOCUMENT_NODE: +#endif + return(NULL); + } + return(NULL); +} + +/** + * xmlXPathNextAncestorOrSelf: + * @ctxt: the XPath Parser context + * @cur: the current node in the traversal + * + * Traversal function for the "ancestor-or-self" direction + * he ancestor-or-self axis contains the context node and ancestors of + * the context node in reverse document order; thus the context node is + * the first node on the axis, and the context node's parent the second; + * parent here is defined the same as with the parent axis. + * + * Returns the next element following that axis + */ +xmlNodePtr +xmlXPathNextAncestorOrSelf(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { + if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); + if (cur == NULL) + return(ctxt->context->node); + return(xmlXPathNextAncestor(ctxt, cur)); +} + +/** + * xmlXPathNextFollowingSibling: + * @ctxt: the XPath Parser context + * @cur: the current node in the traversal + * + * Traversal function for the "following-sibling" direction + * The following-sibling axis contains the following siblings of the context + * node in document order. + * + * Returns the next element following that axis + */ +xmlNodePtr +xmlXPathNextFollowingSibling(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { + if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); + if ((ctxt->context->node->type == XML_ATTRIBUTE_NODE) || + (ctxt->context->node->type == XML_NAMESPACE_DECL)) + return(NULL); + if (cur == (xmlNodePtr) ctxt->context->doc) + return(NULL); + if (cur == NULL) + return(ctxt->context->node->next); + return(cur->next); +} + +/** + * xmlXPathNextPrecedingSibling: + * @ctxt: the XPath Parser context + * @cur: the current node in the traversal + * + * Traversal function for the "preceding-sibling" direction + * The preceding-sibling axis contains the preceding siblings of the context + * node in reverse document order; the first preceding sibling is first on the + * axis; the sibling preceding that node is the second on the axis and so on. + * + * Returns the next element following that axis + */ +xmlNodePtr +xmlXPathNextPrecedingSibling(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { + if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); + if ((ctxt->context->node->type == XML_ATTRIBUTE_NODE) || + (ctxt->context->node->type == XML_NAMESPACE_DECL)) + return(NULL); + if (cur == (xmlNodePtr) ctxt->context->doc) + return(NULL); + if (cur == NULL) + return(ctxt->context->node->prev); + if ((cur->prev != NULL) && (cur->prev->type == XML_DTD_NODE)) { + cur = cur->prev; + if (cur == NULL) + return(ctxt->context->node->prev); + } + return(cur->prev); +} + +/** + * xmlXPathNextFollowing: + * @ctxt: the XPath Parser context + * @cur: the current node in the traversal + * + * Traversal function for the "following" direction + * The following axis contains all nodes in the same document as the context + * node that are after the context node in document order, excluding any + * descendants and excluding attribute nodes and namespace nodes; the nodes + * are ordered in document order + * + * Returns the next element following that axis + */ +xmlNodePtr +xmlXPathNextFollowing(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { + if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); + if ((cur != NULL) && (cur->type != XML_ATTRIBUTE_NODE) && + (cur->type != XML_NAMESPACE_DECL) && (cur->children != NULL)) + return(cur->children); + + if (cur == NULL) { + cur = ctxt->context->node; + if (cur->type == XML_NAMESPACE_DECL) + return(NULL); + if (cur->type == XML_ATTRIBUTE_NODE) + cur = cur->parent; + } + if (cur == NULL) return(NULL) ; /* ERROR */ + if (cur->next != NULL) return(cur->next) ; + do { + cur = cur->parent; + if (cur == NULL) break; + if (cur == (xmlNodePtr) ctxt->context->doc) return(NULL); + if (cur->next != NULL) return(cur->next); + } while (cur != NULL); + return(cur); +} + +/* + * xmlXPathIsAncestor: + * @ancestor: the ancestor node + * @node: the current node + * + * Check that @ancestor is a @node's ancestor + * + * returns 1 if @ancestor is a @node's ancestor, 0 otherwise. + */ +static int +xmlXPathIsAncestor(xmlNodePtr ancestor, xmlNodePtr node) { + if ((ancestor == NULL) || (node == NULL)) return(0); + if (node->type == XML_NAMESPACE_DECL) + return(0); + if (ancestor->type == XML_NAMESPACE_DECL) + return(0); + /* nodes need to be in the same document */ + if (ancestor->doc != node->doc) return(0); + /* avoid searching if ancestor or node is the root node */ + if (ancestor == (xmlNodePtr) node->doc) return(1); + if (node == (xmlNodePtr) ancestor->doc) return(0); + while (node->parent != NULL) { + if (node->parent == ancestor) + return(1); + node = node->parent; + } + return(0); +} + +/** + * xmlXPathNextPreceding: + * @ctxt: the XPath Parser context + * @cur: the current node in the traversal + * + * Traversal function for the "preceding" direction + * the preceding axis contains all nodes in the same document as the context + * node that are before the context node in document order, excluding any + * ancestors and excluding attribute nodes and namespace nodes; the nodes are + * ordered in reverse document order + * + * Returns the next element following that axis + */ +xmlNodePtr +xmlXPathNextPreceding(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) +{ + if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); + if (cur == NULL) { + cur = ctxt->context->node; + if (cur->type == XML_NAMESPACE_DECL) + return(NULL); + if (cur->type == XML_ATTRIBUTE_NODE) + return(cur->parent); + } + if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL)) + return (NULL); + if ((cur->prev != NULL) && (cur->prev->type == XML_DTD_NODE)) + cur = cur->prev; + do { + if (cur->prev != NULL) { + for (cur = cur->prev; cur->last != NULL; cur = cur->last) ; + return (cur); + } + + cur = cur->parent; + if (cur == NULL) + return (NULL); + if (cur == ctxt->context->doc->children) + return (NULL); + } while (xmlXPathIsAncestor(cur, ctxt->context->node)); + return (cur); +} + +/** + * xmlXPathNextPrecedingInternal: + * @ctxt: the XPath Parser context + * @cur: the current node in the traversal + * + * Traversal function for the "preceding" direction + * the preceding axis contains all nodes in the same document as the context + * node that are before the context node in document order, excluding any + * ancestors and excluding attribute nodes and namespace nodes; the nodes are + * ordered in reverse document order + * This is a faster implementation but internal only since it requires a + * state kept in the parser context: ctxt->ancestor. + * + * Returns the next element following that axis + */ +static xmlNodePtr +xmlXPathNextPrecedingInternal(xmlXPathParserContextPtr ctxt, + xmlNodePtr cur) +{ + if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); + if (cur == NULL) { + cur = ctxt->context->node; + if (cur == NULL) + return (NULL); + if (cur->type == XML_NAMESPACE_DECL) + return (NULL); + ctxt->ancestor = cur->parent; + } + if (cur->type == XML_NAMESPACE_DECL) + return(NULL); + if ((cur->prev != NULL) && (cur->prev->type == XML_DTD_NODE)) + cur = cur->prev; + while (cur->prev == NULL) { + cur = cur->parent; + if (cur == NULL) + return (NULL); + if (cur == ctxt->context->doc->children) + return (NULL); + if (cur != ctxt->ancestor) + return (cur); + ctxt->ancestor = cur->parent; + } + cur = cur->prev; + while (cur->last != NULL) + cur = cur->last; + return (cur); +} + +/** + * xmlXPathNextNamespace: + * @ctxt: the XPath Parser context + * @cur: the current attribute in the traversal + * + * Traversal function for the "namespace" direction + * the namespace axis contains the namespace nodes of the context node; + * the order of nodes on this axis is implementation-defined; the axis will + * be empty unless the context node is an element + * + * We keep the XML namespace node at the end of the list. + * + * Returns the next element following that axis + */ +xmlNodePtr +xmlXPathNextNamespace(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { + if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); + if (ctxt->context->node->type != XML_ELEMENT_NODE) return(NULL); + if (ctxt->context->tmpNsList == NULL && cur != (xmlNodePtr) xmlXPathXMLNamespace) { + if (ctxt->context->tmpNsList != NULL) + xmlFree(ctxt->context->tmpNsList); + ctxt->context->tmpNsList = + xmlGetNsList(ctxt->context->doc, ctxt->context->node); + ctxt->context->tmpNsNr = 0; + if (ctxt->context->tmpNsList != NULL) { + while (ctxt->context->tmpNsList[ctxt->context->tmpNsNr] != NULL) { + ctxt->context->tmpNsNr++; + } + } + return((xmlNodePtr) xmlXPathXMLNamespace); + } + if (ctxt->context->tmpNsNr > 0) { + return (xmlNodePtr)ctxt->context->tmpNsList[--ctxt->context->tmpNsNr]; + } else { + if (ctxt->context->tmpNsList != NULL) + xmlFree(ctxt->context->tmpNsList); + ctxt->context->tmpNsList = NULL; + return(NULL); + } +} + +/** + * xmlXPathNextAttribute: + * @ctxt: the XPath Parser context + * @cur: the current attribute in the traversal + * + * Traversal function for the "attribute" direction + * TODO: support DTD inherited default attributes + * + * Returns the next element following that axis + */ +xmlNodePtr +xmlXPathNextAttribute(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) { + if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); + if (ctxt->context->node == NULL) + return(NULL); + if (ctxt->context->node->type != XML_ELEMENT_NODE) + return(NULL); + if (cur == NULL) { + if (ctxt->context->node == (xmlNodePtr) ctxt->context->doc) + return(NULL); + return((xmlNodePtr)ctxt->context->node->properties); + } + return((xmlNodePtr)cur->next); +} + +/************************************************************************ + * * + * NodeTest Functions * + * * + ************************************************************************/ + +#define IS_FUNCTION 200 + + +/************************************************************************ + * * + * Implicit tree core function library * + * * + ************************************************************************/ + +/** + * xmlXPathRoot: + * @ctxt: the XPath Parser context + * + * Initialize the context to the root of the document + */ +void +xmlXPathRoot(xmlXPathParserContextPtr ctxt) { + if ((ctxt == NULL) || (ctxt->context == NULL)) + return; + ctxt->context->node = (xmlNodePtr) ctxt->context->doc; + valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, + ctxt->context->node)); +} + +/************************************************************************ + * * + * The explicit core function library * + *http://www.w3.org/Style/XSL/Group/1999/07/xpath-19990705.html#corelib * + * * + ************************************************************************/ + + +/** + * xmlXPathLastFunction: + * @ctxt: the XPath Parser context + * @nargs: the number of arguments + * + * Implement the last() XPath function + * number last() + * The last function returns the number of nodes in the context node list. + */ +void +xmlXPathLastFunction(xmlXPathParserContextPtr ctxt, int nargs) { + CHECK_ARITY(0); + if (ctxt->context->contextSize >= 0) { + valuePush(ctxt, + xmlXPathCacheNewFloat(ctxt->context, + (double) ctxt->context->contextSize)); +#ifdef DEBUG_EXPR + xmlGenericError(xmlGenericErrorContext, + "last() : %d\n", ctxt->context->contextSize); +#endif + } else { + XP_ERROR(XPATH_INVALID_CTXT_SIZE); + } +} + +/** + * xmlXPathPositionFunction: + * @ctxt: the XPath Parser context + * @nargs: the number of arguments + * + * Implement the position() XPath function + * number position() + * The position function returns the position of the context node in the + * context node list. The first position is 1, and so the last position + * will be equal to last(). + */ +void +xmlXPathPositionFunction(xmlXPathParserContextPtr ctxt, int nargs) { + CHECK_ARITY(0); + if (ctxt->context->proximityPosition >= 0) { + valuePush(ctxt, + xmlXPathCacheNewFloat(ctxt->context, + (double) ctxt->context->proximityPosition)); +#ifdef DEBUG_EXPR + xmlGenericError(xmlGenericErrorContext, "position() : %d\n", + ctxt->context->proximityPosition); +#endif + } else { + XP_ERROR(XPATH_INVALID_CTXT_POSITION); + } +} + +/** + * xmlXPathCountFunction: + * @ctxt: the XPath Parser context + * @nargs: the number of arguments + * + * Implement the count() XPath function + * number count(node-set) + */ +void +xmlXPathCountFunction(xmlXPathParserContextPtr ctxt, int nargs) { + xmlXPathObjectPtr cur; + + CHECK_ARITY(1); + if ((ctxt->value == NULL) || + ((ctxt->value->type != XPATH_NODESET) && + (ctxt->value->type != XPATH_XSLT_TREE))) + XP_ERROR(XPATH_INVALID_TYPE); + cur = valuePop(ctxt); + + if ((cur == NULL) || (cur->nodesetval == NULL)) + valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, (double) 0)); + else if ((cur->type == XPATH_NODESET) || (cur->type == XPATH_XSLT_TREE)) { + valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, + (double) cur->nodesetval->nodeNr)); + } else { + if ((cur->nodesetval->nodeNr != 1) || + (cur->nodesetval->nodeTab == NULL)) { + valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, (double) 0)); + } else { + xmlNodePtr tmp; + int i = 0; + + tmp = cur->nodesetval->nodeTab[0]; + if ((tmp != NULL) && (tmp->type != XML_NAMESPACE_DECL)) { + tmp = tmp->children; + while (tmp != NULL) { + tmp = tmp->next; + i++; + } + } + valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, (double) i)); + } + } + xmlXPathReleaseObject(ctxt->context, cur); +} + +/** + * xmlXPathGetElementsByIds: + * @doc: the document + * @ids: a whitespace separated list of IDs + * + * Selects elements by their unique ID. + * + * Returns a node-set of selected elements. + */ +static xmlNodeSetPtr +xmlXPathGetElementsByIds (xmlDocPtr doc, const xmlChar *ids) { + xmlNodeSetPtr ret; + const xmlChar *cur = ids; + xmlChar *ID; + xmlAttrPtr attr; + xmlNodePtr elem = NULL; + + if (ids == NULL) return(NULL); + + ret = xmlXPathNodeSetCreate(NULL); + if (ret == NULL) + return(ret); + + while (IS_BLANK_CH(*cur)) cur++; + while (*cur != 0) { + while ((!IS_BLANK_CH(*cur)) && (*cur != 0)) + cur++; + + ID = xmlStrndup(ids, cur - ids); + if (ID != NULL) { + /* + * We used to check the fact that the value passed + * was an NCName, but this generated much troubles for + * me and Aleksey Sanin, people blatantly violated that + * constaint, like Visa3D spec. + * if (xmlValidateNCName(ID, 1) == 0) + */ + attr = xmlGetID(doc, ID); + if (attr != NULL) { + if (attr->type == XML_ATTRIBUTE_NODE) + elem = attr->parent; + else if (attr->type == XML_ELEMENT_NODE) + elem = (xmlNodePtr) attr; + else + elem = NULL; + if (elem != NULL) + xmlXPathNodeSetAdd(ret, elem); + } + xmlFree(ID); + } + + while (IS_BLANK_CH(*cur)) cur++; + ids = cur; + } + return(ret); +} + +/** + * xmlXPathIdFunction: + * @ctxt: the XPath Parser context + * @nargs: the number of arguments + * + * Implement the id() XPath function + * node-set id(object) + * The id function selects elements by their unique ID + * (see [5.2.1 Unique IDs]). When the argument to id is of type node-set, + * then the result is the union of the result of applying id to the + * string value of each of the nodes in the argument node-set. When the + * argument to id is of any other type, the argument is converted to a + * string as if by a call to the string function; the string is split + * into a whitespace-separated list of tokens (whitespace is any sequence + * of characters matching the production S); the result is a node-set + * containing the elements in the same document as the context node that + * have a unique ID equal to any of the tokens in the list. + */ +void +xmlXPathIdFunction(xmlXPathParserContextPtr ctxt, int nargs) { + xmlChar *tokens; + xmlNodeSetPtr ret; + xmlXPathObjectPtr obj; + + CHECK_ARITY(1); + obj = valuePop(ctxt); + if (obj == NULL) XP_ERROR(XPATH_INVALID_OPERAND); + if ((obj->type == XPATH_NODESET) || (obj->type == XPATH_XSLT_TREE)) { + xmlNodeSetPtr ns; + int i; + + ret = xmlXPathNodeSetCreate(NULL); + /* + * FIXME -- in an out-of-memory condition this will behave badly. + * The solution is not clear -- we already popped an item from + * ctxt, so the object is in a corrupt state. + */ + + if (obj->nodesetval != NULL) { + for (i = 0; i < obj->nodesetval->nodeNr; i++) { + tokens = + xmlXPathCastNodeToString(obj->nodesetval->nodeTab[i]); + ns = xmlXPathGetElementsByIds(ctxt->context->doc, tokens); + ret = xmlXPathNodeSetMerge(ret, ns); + xmlXPathFreeNodeSet(ns); + if (tokens != NULL) + xmlFree(tokens); + } + } + xmlXPathReleaseObject(ctxt->context, obj); + valuePush(ctxt, xmlXPathCacheWrapNodeSet(ctxt->context, ret)); + return; + } + obj = xmlXPathCacheConvertString(ctxt->context, obj); + ret = xmlXPathGetElementsByIds(ctxt->context->doc, obj->stringval); + valuePush(ctxt, xmlXPathCacheWrapNodeSet(ctxt->context, ret)); + xmlXPathReleaseObject(ctxt->context, obj); + return; +} + +/** + * xmlXPathLocalNameFunction: + * @ctxt: the XPath Parser context + * @nargs: the number of arguments + * + * Implement the local-name() XPath function + * string local-name(node-set?) + * The local-name function returns a string containing the local part + * of the name of the node in the argument node-set that is first in + * document order. If the node-set is empty or the first node has no + * name, an empty string is returned. If the argument is omitted it + * defaults to the context node. + */ +void +xmlXPathLocalNameFunction(xmlXPathParserContextPtr ctxt, int nargs) { + xmlXPathObjectPtr cur; + + if (ctxt == NULL) return; + + if (nargs == 0) { + valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, + ctxt->context->node)); + nargs = 1; + } + + CHECK_ARITY(1); + if ((ctxt->value == NULL) || + ((ctxt->value->type != XPATH_NODESET) && + (ctxt->value->type != XPATH_XSLT_TREE))) + XP_ERROR(XPATH_INVALID_TYPE); + cur = valuePop(ctxt); + + if ((cur->nodesetval == NULL) || (cur->nodesetval->nodeNr == 0)) { + valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); + } else { + int i = 0; /* Should be first in document order !!!!! */ + switch (cur->nodesetval->nodeTab[i]->type) { + case XML_ELEMENT_NODE: + case XML_ATTRIBUTE_NODE: + case XML_PI_NODE: + if (cur->nodesetval->nodeTab[i]->name[0] == ' ') + valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); + else + valuePush(ctxt, + xmlXPathCacheNewString(ctxt->context, + cur->nodesetval->nodeTab[i]->name)); + break; + case XML_NAMESPACE_DECL: + valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, + ((xmlNsPtr)cur->nodesetval->nodeTab[i])->prefix)); + break; + default: + valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); + } + } + xmlXPathReleaseObject(ctxt->context, cur); +} + +/** + * xmlXPathNamespaceURIFunction: + * @ctxt: the XPath Parser context + * @nargs: the number of arguments + * + * Implement the namespace-uri() XPath function + * string namespace-uri(node-set?) + * The namespace-uri function returns a string containing the + * namespace URI of the expanded name of the node in the argument + * node-set that is first in document order. If the node-set is empty, + * the first node has no name, or the expanded name has no namespace + * URI, an empty string is returned. If the argument is omitted it + * defaults to the context node. + */ +void +xmlXPathNamespaceURIFunction(xmlXPathParserContextPtr ctxt, int nargs) { + xmlXPathObjectPtr cur; + + if (ctxt == NULL) return; + + if (nargs == 0) { + valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, + ctxt->context->node)); + nargs = 1; + } + CHECK_ARITY(1); + if ((ctxt->value == NULL) || + ((ctxt->value->type != XPATH_NODESET) && + (ctxt->value->type != XPATH_XSLT_TREE))) + XP_ERROR(XPATH_INVALID_TYPE); + cur = valuePop(ctxt); + + if ((cur->nodesetval == NULL) || (cur->nodesetval->nodeNr == 0)) { + valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); + } else { + int i = 0; /* Should be first in document order !!!!! */ + switch (cur->nodesetval->nodeTab[i]->type) { + case XML_ELEMENT_NODE: + case XML_ATTRIBUTE_NODE: + if (cur->nodesetval->nodeTab[i]->ns == NULL) + valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); + else + valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, + cur->nodesetval->nodeTab[i]->ns->href)); + break; + default: + valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); + } + } + xmlXPathReleaseObject(ctxt->context, cur); +} + +/** + * xmlXPathNameFunction: + * @ctxt: the XPath Parser context + * @nargs: the number of arguments + * + * Implement the name() XPath function + * string name(node-set?) + * The name function returns a string containing a QName representing + * the name of the node in the argument node-set that is first in document + * order. The QName must represent the name with respect to the namespace + * declarations in effect on the node whose name is being represented. + * Typically, this will be the form in which the name occurred in the XML + * source. This need not be the case if there are namespace declarations + * in effect on the node that associate multiple prefixes with the same + * namespace. However, an implementation may include information about + * the original prefix in its representation of nodes; in this case, an + * implementation can ensure that the returned string is always the same + * as the QName used in the XML source. If the argument it omitted it + * defaults to the context node. + * Libxml keep the original prefix so the "real qualified name" used is + * returned. + */ +static void +xmlXPathNameFunction(xmlXPathParserContextPtr ctxt, int nargs) +{ + xmlXPathObjectPtr cur; + + if (nargs == 0) { + valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, + ctxt->context->node)); + nargs = 1; + } + + CHECK_ARITY(1); + if ((ctxt->value == NULL) || + ((ctxt->value->type != XPATH_NODESET) && + (ctxt->value->type != XPATH_XSLT_TREE))) + XP_ERROR(XPATH_INVALID_TYPE); + cur = valuePop(ctxt); + + if ((cur->nodesetval == NULL) || (cur->nodesetval->nodeNr == 0)) { + valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); + } else { + int i = 0; /* Should be first in document order !!!!! */ + + switch (cur->nodesetval->nodeTab[i]->type) { + case XML_ELEMENT_NODE: + case XML_ATTRIBUTE_NODE: + if (cur->nodesetval->nodeTab[i]->name[0] == ' ') + valuePush(ctxt, + xmlXPathCacheNewCString(ctxt->context, "")); + else if ((cur->nodesetval->nodeTab[i]->ns == NULL) || + (cur->nodesetval->nodeTab[i]->ns->prefix == NULL)) { + valuePush(ctxt, + xmlXPathCacheNewString(ctxt->context, + cur->nodesetval->nodeTab[i]->name)); + } else { + xmlChar *fullname; + + fullname = xmlBuildQName(cur->nodesetval->nodeTab[i]->name, + cur->nodesetval->nodeTab[i]->ns->prefix, + NULL, 0); + if (fullname == cur->nodesetval->nodeTab[i]->name) + fullname = xmlStrdup(cur->nodesetval->nodeTab[i]->name); + if (fullname == NULL) { + XP_ERROR(XPATH_MEMORY_ERROR); + } + valuePush(ctxt, xmlXPathCacheWrapString( + ctxt->context, fullname)); + } + break; + default: + valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, + cur->nodesetval->nodeTab[i])); + xmlXPathLocalNameFunction(ctxt, 1); + } + } + xmlXPathReleaseObject(ctxt->context, cur); +} + + +/** + * xmlXPathStringFunction: + * @ctxt: the XPath Parser context + * @nargs: the number of arguments + * + * Implement the string() XPath function + * string string(object?) + * The string function converts an object to a string as follows: + * - A node-set is converted to a string by returning the value of + * the node in the node-set that is first in document order. + * If the node-set is empty, an empty string is returned. + * - A number is converted to a string as follows + * + NaN is converted to the string NaN + * + positive zero is converted to the string 0 + * + negative zero is converted to the string 0 + * + positive infinity is converted to the string Infinity + * + negative infinity is converted to the string -Infinity + * + if the number is an integer, the number is represented in + * decimal form as a Number with no decimal point and no leading + * zeros, preceded by a minus sign (-) if the number is negative + * + otherwise, the number is represented in decimal form as a + * Number including a decimal point with at least one digit + * before the decimal point and at least one digit after the + * decimal point, preceded by a minus sign (-) if the number + * is negative; there must be no leading zeros before the decimal + * point apart possibly from the one required digit immediately + * before the decimal point; beyond the one required digit + * after the decimal point there must be as many, but only as + * many, more digits as are needed to uniquely distinguish the + * number from all other IEEE 754 numeric values. + * - The boolean false value is converted to the string false. + * The boolean true value is converted to the string true. + * + * If the argument is omitted, it defaults to a node-set with the + * context node as its only member. + */ +void +xmlXPathStringFunction(xmlXPathParserContextPtr ctxt, int nargs) { + xmlXPathObjectPtr cur; + + if (ctxt == NULL) return; + if (nargs == 0) { + valuePush(ctxt, + xmlXPathCacheWrapString(ctxt->context, + xmlXPathCastNodeToString(ctxt->context->node))); + return; + } + + CHECK_ARITY(1); + cur = valuePop(ctxt); + if (cur == NULL) XP_ERROR(XPATH_INVALID_OPERAND); + valuePush(ctxt, xmlXPathCacheConvertString(ctxt->context, cur)); +} + +/** + * xmlXPathStringLengthFunction: + * @ctxt: the XPath Parser context + * @nargs: the number of arguments + * + * Implement the string-length() XPath function + * number string-length(string?) + * The string-length returns the number of characters in the string + * (see [3.6 Strings]). If the argument is omitted, it defaults to + * the context node converted to a string, in other words the value + * of the context node. + */ +void +xmlXPathStringLengthFunction(xmlXPathParserContextPtr ctxt, int nargs) { + xmlXPathObjectPtr cur; + + if (nargs == 0) { + if ((ctxt == NULL) || (ctxt->context == NULL)) + return; + if (ctxt->context->node == NULL) { + valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, 0)); + } else { + xmlChar *content; + + content = xmlXPathCastNodeToString(ctxt->context->node); + valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, + xmlUTF8Strlen(content))); + xmlFree(content); + } + return; + } + CHECK_ARITY(1); + CAST_TO_STRING; + CHECK_TYPE(XPATH_STRING); + cur = valuePop(ctxt); + valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, + xmlUTF8Strlen(cur->stringval))); + xmlXPathReleaseObject(ctxt->context, cur); +} + +/** + * xmlXPathConcatFunction: + * @ctxt: the XPath Parser context + * @nargs: the number of arguments + * + * Implement the concat() XPath function + * string concat(string, string, string*) + * The concat function returns the concatenation of its arguments. + */ +void +xmlXPathConcatFunction(xmlXPathParserContextPtr ctxt, int nargs) { + xmlXPathObjectPtr cur, newobj; + xmlChar *tmp; + + if (ctxt == NULL) return; + if (nargs < 2) { + CHECK_ARITY(2); + } + + CAST_TO_STRING; + cur = valuePop(ctxt); + if ((cur == NULL) || (cur->type != XPATH_STRING)) { + xmlXPathReleaseObject(ctxt->context, cur); + return; + } + nargs--; + + while (nargs > 0) { + CAST_TO_STRING; + newobj = valuePop(ctxt); + if ((newobj == NULL) || (newobj->type != XPATH_STRING)) { + xmlXPathReleaseObject(ctxt->context, newobj); + xmlXPathReleaseObject(ctxt->context, cur); + XP_ERROR(XPATH_INVALID_TYPE); + } + tmp = xmlStrcat(newobj->stringval, cur->stringval); + newobj->stringval = cur->stringval; + cur->stringval = tmp; + xmlXPathReleaseObject(ctxt->context, newobj); + nargs--; + } + valuePush(ctxt, cur); +} + +/** + * xmlXPathContainsFunction: + * @ctxt: the XPath Parser context + * @nargs: the number of arguments + * + * Implement the contains() XPath function + * boolean contains(string, string) + * The contains function returns true if the first argument string + * contains the second argument string, and otherwise returns false. + */ +void +xmlXPathContainsFunction(xmlXPathParserContextPtr ctxt, int nargs) { + xmlXPathObjectPtr hay, needle; + + CHECK_ARITY(2); + CAST_TO_STRING; + CHECK_TYPE(XPATH_STRING); + needle = valuePop(ctxt); + CAST_TO_STRING; + hay = valuePop(ctxt); + + if ((hay == NULL) || (hay->type != XPATH_STRING)) { + xmlXPathReleaseObject(ctxt->context, hay); + xmlXPathReleaseObject(ctxt->context, needle); + XP_ERROR(XPATH_INVALID_TYPE); + } + if (xmlStrstr(hay->stringval, needle->stringval)) + valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 1)); + else + valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 0)); + xmlXPathReleaseObject(ctxt->context, hay); + xmlXPathReleaseObject(ctxt->context, needle); +} + +/** + * xmlXPathStartsWithFunction: + * @ctxt: the XPath Parser context + * @nargs: the number of arguments + * + * Implement the starts-with() XPath function + * boolean starts-with(string, string) + * The starts-with function returns true if the first argument string + * starts with the second argument string, and otherwise returns false. + */ +void +xmlXPathStartsWithFunction(xmlXPathParserContextPtr ctxt, int nargs) { + xmlXPathObjectPtr hay, needle; + int n; + + CHECK_ARITY(2); + CAST_TO_STRING; + CHECK_TYPE(XPATH_STRING); + needle = valuePop(ctxt); + CAST_TO_STRING; + hay = valuePop(ctxt); + + if ((hay == NULL) || (hay->type != XPATH_STRING)) { + xmlXPathReleaseObject(ctxt->context, hay); + xmlXPathReleaseObject(ctxt->context, needle); + XP_ERROR(XPATH_INVALID_TYPE); + } + n = xmlStrlen(needle->stringval); + if (xmlStrncmp(hay->stringval, needle->stringval, n)) + valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 0)); + else + valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 1)); + xmlXPathReleaseObject(ctxt->context, hay); + xmlXPathReleaseObject(ctxt->context, needle); +} + +/** + * xmlXPathSubstringFunction: + * @ctxt: the XPath Parser context + * @nargs: the number of arguments + * + * Implement the substring() XPath function + * string substring(string, number, number?) + * The substring function returns the substring of the first argument + * starting at the position specified in the second argument with + * length specified in the third argument. For example, + * substring("12345",2,3) returns "234". If the third argument is not + * specified, it returns the substring starting at the position specified + * in the second argument and continuing to the end of the string. For + * example, substring("12345",2) returns "2345". More precisely, each + * character in the string (see [3.6 Strings]) is considered to have a + * numeric position: the position of the first character is 1, the position + * of the second character is 2 and so on. The returned substring contains + * those characters for which the position of the character is greater than + * or equal to the second argument and, if the third argument is specified, + * less than the sum of the second and third arguments; the comparisons + * and addition used for the above follow the standard IEEE 754 rules. Thus: + * - substring("12345", 1.5, 2.6) returns "234" + * - substring("12345", 0, 3) returns "12" + * - substring("12345", 0 div 0, 3) returns "" + * - substring("12345", 1, 0 div 0) returns "" + * - substring("12345", -42, 1 div 0) returns "12345" + * - substring("12345", -1 div 0, 1 div 0) returns "" + */ +void +xmlXPathSubstringFunction(xmlXPathParserContextPtr ctxt, int nargs) { + xmlXPathObjectPtr str, start, len; + double le=0, in; + int i, l, m; + xmlChar *ret; + + if (nargs < 2) { + CHECK_ARITY(2); + } + if (nargs > 3) { + CHECK_ARITY(3); + } + /* + * take care of possible last (position) argument + */ + if (nargs == 3) { + CAST_TO_NUMBER; + CHECK_TYPE(XPATH_NUMBER); + len = valuePop(ctxt); + le = len->floatval; + xmlXPathReleaseObject(ctxt->context, len); + } + + CAST_TO_NUMBER; + CHECK_TYPE(XPATH_NUMBER); + start = valuePop(ctxt); + in = start->floatval; + xmlXPathReleaseObject(ctxt->context, start); + CAST_TO_STRING; + CHECK_TYPE(XPATH_STRING); + str = valuePop(ctxt); + m = xmlUTF8Strlen((const unsigned char *)str->stringval); + + /* + * If last pos not present, calculate last position + */ + if (nargs != 3) { + le = (double)m; + if (in < 1.0) + in = 1.0; + } + + /* Need to check for the special cases where either + * the index is NaN, the length is NaN, or both + * arguments are infinity (relying on Inf + -Inf = NaN) + */ + if (!xmlXPathIsInf(in) && !xmlXPathIsNaN(in + le)) { + /* + * To meet the requirements of the spec, the arguments + * must be converted to integer format before + * initial index calculations are done + * + * First we go to integer form, rounding up + * and checking for special cases + */ + i = (int) in; + if (((double)i)+0.5 <= in) i++; + + if (xmlXPathIsInf(le) == 1) { + l = m; + if (i < 1) + i = 1; + } + else if (xmlXPathIsInf(le) == -1 || le < 0.0) + l = 0; + else { + l = (int) le; + if (((double)l)+0.5 <= le) l++; + } + + /* Now we normalize inidices */ + i -= 1; + l += i; + if (i < 0) + i = 0; + if (l > m) + l = m; + + /* number of chars to copy */ + l -= i; + + ret = xmlUTF8Strsub(str->stringval, i, l); + } + else { + ret = NULL; + } + if (ret == NULL) + valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context, "")); + else { + valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, ret)); + xmlFree(ret); + } + xmlXPathReleaseObject(ctxt->context, str); +} + +/** + * xmlXPathSubstringBeforeFunction: + * @ctxt: the XPath Parser context + * @nargs: the number of arguments + * + * Implement the substring-before() XPath function + * string substring-before(string, string) + * The substring-before function returns the substring of the first + * argument string that precedes the first occurrence of the second + * argument string in the first argument string, or the empty string + * if the first argument string does not contain the second argument + * string. For example, substring-before("1999/04/01","/") returns 1999. + */ +void +xmlXPathSubstringBeforeFunction(xmlXPathParserContextPtr ctxt, int nargs) { + xmlXPathObjectPtr str; + xmlXPathObjectPtr find; + xmlBufPtr target; + const xmlChar *point; + int offset; + + CHECK_ARITY(2); + CAST_TO_STRING; + find = valuePop(ctxt); + CAST_TO_STRING; + str = valuePop(ctxt); + + target = xmlBufCreate(); + if (target) { + point = xmlStrstr(str->stringval, find->stringval); + if (point) { + offset = (int)(point - str->stringval); + xmlBufAdd(target, str->stringval, offset); + } + valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, + xmlBufContent(target))); + xmlBufFree(target); + } + xmlXPathReleaseObject(ctxt->context, str); + xmlXPathReleaseObject(ctxt->context, find); +} + +/** + * xmlXPathSubstringAfterFunction: + * @ctxt: the XPath Parser context + * @nargs: the number of arguments + * + * Implement the substring-after() XPath function + * string substring-after(string, string) + * The substring-after function returns the substring of the first + * argument string that follows the first occurrence of the second + * argument string in the first argument string, or the empty stringi + * if the first argument string does not contain the second argument + * string. For example, substring-after("1999/04/01","/") returns 04/01, + * and substring-after("1999/04/01","19") returns 99/04/01. + */ +void +xmlXPathSubstringAfterFunction(xmlXPathParserContextPtr ctxt, int nargs) { + xmlXPathObjectPtr str; + xmlXPathObjectPtr find; + xmlBufPtr target; + const xmlChar *point; + int offset; + + CHECK_ARITY(2); + CAST_TO_STRING; + find = valuePop(ctxt); + CAST_TO_STRING; + str = valuePop(ctxt); + + target = xmlBufCreate(); + if (target) { + point = xmlStrstr(str->stringval, find->stringval); + if (point) { + offset = (int)(point - str->stringval) + xmlStrlen(find->stringval); + xmlBufAdd(target, &str->stringval[offset], + xmlStrlen(str->stringval) - offset); + } + valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, + xmlBufContent(target))); + xmlBufFree(target); + } + xmlXPathReleaseObject(ctxt->context, str); + xmlXPathReleaseObject(ctxt->context, find); +} + +/** + * xmlXPathNormalizeFunction: + * @ctxt: the XPath Parser context + * @nargs: the number of arguments + * + * Implement the normalize-space() XPath function + * string normalize-space(string?) + * The normalize-space function returns the argument string with white + * space normalized by stripping leading and trailing whitespace + * and replacing sequences of whitespace characters by a single + * space. Whitespace characters are the same allowed by the S production + * in XML. If the argument is omitted, it defaults to the context + * node converted to a string, in other words the value of the context node. + */ +void +xmlXPathNormalizeFunction(xmlXPathParserContextPtr ctxt, int nargs) { + xmlXPathObjectPtr obj = NULL; + xmlChar *source = NULL; + xmlBufPtr target; + xmlChar blank; + + if (ctxt == NULL) return; + if (nargs == 0) { + /* Use current context node */ + valuePush(ctxt, + xmlXPathCacheWrapString(ctxt->context, + xmlXPathCastNodeToString(ctxt->context->node))); + nargs = 1; + } + + CHECK_ARITY(1); + CAST_TO_STRING; + CHECK_TYPE(XPATH_STRING); + obj = valuePop(ctxt); + source = obj->stringval; + + target = xmlBufCreate(); + if (target && source) { + + /* Skip leading whitespaces */ + while (IS_BLANK_CH(*source)) + source++; + + /* Collapse intermediate whitespaces, and skip trailing whitespaces */ + blank = 0; + while (*source) { + if (IS_BLANK_CH(*source)) { + blank = 0x20; + } else { + if (blank) { + xmlBufAdd(target, &blank, 1); + blank = 0; + } + xmlBufAdd(target, source, 1); + } + source++; + } + valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, + xmlBufContent(target))); + xmlBufFree(target); + } + xmlXPathReleaseObject(ctxt->context, obj); +} + +/** + * xmlXPathTranslateFunction: + * @ctxt: the XPath Parser context + * @nargs: the number of arguments + * + * Implement the translate() XPath function + * string translate(string, string, string) + * The translate function returns the first argument string with + * occurrences of characters in the second argument string replaced + * by the character at the corresponding position in the third argument + * string. For example, translate("bar","abc","ABC") returns the string + * BAr. If there is a character in the second argument string with no + * character at a corresponding position in the third argument string + * (because the second argument string is longer than the third argument + * string), then occurrences of that character in the first argument + * string are removed. For example, translate("--aaa--","abc-","ABC") + * returns "AAA". If a character occurs more than once in second + * argument string, then the first occurrence determines the replacement + * character. If the third argument string is longer than the second + * argument string, then excess characters are ignored. + */ +void +xmlXPathTranslateFunction(xmlXPathParserContextPtr ctxt, int nargs) { + xmlXPathObjectPtr str; + xmlXPathObjectPtr from; + xmlXPathObjectPtr to; + xmlBufPtr target; + int offset, max; + xmlChar ch; + const xmlChar *point; + xmlChar *cptr; + + CHECK_ARITY(3); + + CAST_TO_STRING; + to = valuePop(ctxt); + CAST_TO_STRING; + from = valuePop(ctxt); + CAST_TO_STRING; + str = valuePop(ctxt); + + target = xmlBufCreate(); + if (target) { + max = xmlUTF8Strlen(to->stringval); + for (cptr = str->stringval; (ch=*cptr); ) { + offset = xmlUTF8Strloc(from->stringval, cptr); + if (offset >= 0) { + if (offset < max) { + point = xmlUTF8Strpos(to->stringval, offset); + if (point) + xmlBufAdd(target, point, xmlUTF8Strsize(point, 1)); + } + } else + xmlBufAdd(target, cptr, xmlUTF8Strsize(cptr, 1)); + + /* Step to next character in input */ + cptr++; + if ( ch & 0x80 ) { + /* if not simple ascii, verify proper format */ + if ( (ch & 0xc0) != 0xc0 ) { + xmlGenericError(xmlGenericErrorContext, + "xmlXPathTranslateFunction: Invalid UTF8 string\n"); + /* not asserting an XPath error is probably better */ + break; + } + /* then skip over remaining bytes for this char */ + while ( (ch <<= 1) & 0x80 ) + if ( (*cptr++ & 0xc0) != 0x80 ) { + xmlGenericError(xmlGenericErrorContext, + "xmlXPathTranslateFunction: Invalid UTF8 string\n"); + /* not asserting an XPath error is probably better */ + break; + } + if (ch & 0x80) /* must have had error encountered */ + break; + } + } + } + valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, + xmlBufContent(target))); + xmlBufFree(target); + xmlXPathReleaseObject(ctxt->context, str); + xmlXPathReleaseObject(ctxt->context, from); + xmlXPathReleaseObject(ctxt->context, to); +} + +/** + * xmlXPathBooleanFunction: + * @ctxt: the XPath Parser context + * @nargs: the number of arguments + * + * Implement the boolean() XPath function + * boolean boolean(object) + * The boolean function converts its argument to a boolean as follows: + * - a number is true if and only if it is neither positive or + * negative zero nor NaN + * - a node-set is true if and only if it is non-empty + * - a string is true if and only if its length is non-zero + */ +void +xmlXPathBooleanFunction(xmlXPathParserContextPtr ctxt, int nargs) { + xmlXPathObjectPtr cur; + + CHECK_ARITY(1); + cur = valuePop(ctxt); + if (cur == NULL) XP_ERROR(XPATH_INVALID_OPERAND); + cur = xmlXPathCacheConvertBoolean(ctxt->context, cur); + valuePush(ctxt, cur); +} + +/** + * xmlXPathNotFunction: + * @ctxt: the XPath Parser context + * @nargs: the number of arguments + * + * Implement the not() XPath function + * boolean not(boolean) + * The not function returns true if its argument is false, + * and false otherwise. + */ +void +xmlXPathNotFunction(xmlXPathParserContextPtr ctxt, int nargs) { + CHECK_ARITY(1); + CAST_TO_BOOLEAN; + CHECK_TYPE(XPATH_BOOLEAN); + ctxt->value->boolval = ! ctxt->value->boolval; +} + +/** + * xmlXPathTrueFunction: + * @ctxt: the XPath Parser context + * @nargs: the number of arguments + * + * Implement the true() XPath function + * boolean true() + */ +void +xmlXPathTrueFunction(xmlXPathParserContextPtr ctxt, int nargs) { + CHECK_ARITY(0); + valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 1)); +} + +/** + * xmlXPathFalseFunction: + * @ctxt: the XPath Parser context + * @nargs: the number of arguments + * + * Implement the false() XPath function + * boolean false() + */ +void +xmlXPathFalseFunction(xmlXPathParserContextPtr ctxt, int nargs) { + CHECK_ARITY(0); + valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 0)); +} + +/** + * xmlXPathLangFunction: + * @ctxt: the XPath Parser context + * @nargs: the number of arguments + * + * Implement the lang() XPath function + * boolean lang(string) + * The lang function returns true or false depending on whether the + * language of the context node as specified by xml:lang attributes + * is the same as or is a sublanguage of the language specified by + * the argument string. The language of the context node is determined + * by the value of the xml:lang attribute on the context node, or, if + * the context node has no xml:lang attribute, by the value of the + * xml:lang attribute on the nearest ancestor of the context node that + * has an xml:lang attribute. If there is no such attribute, then lang + * returns false. If there is such an attribute, then lang returns + * true if the attribute value is equal to the argument ignoring case, + * or if there is some suffix starting with - such that the attribute + * value is equal to the argument ignoring that suffix of the attribute + * value and ignoring case. + */ +void +xmlXPathLangFunction(xmlXPathParserContextPtr ctxt, int nargs) { + xmlXPathObjectPtr val = NULL; + const xmlChar *theLang = NULL; + const xmlChar *lang; + int ret = 0; + int i; + + CHECK_ARITY(1); + CAST_TO_STRING; + CHECK_TYPE(XPATH_STRING); + val = valuePop(ctxt); + lang = val->stringval; + theLang = xmlNodeGetLang(ctxt->context->node); + if ((theLang != NULL) && (lang != NULL)) { + for (i = 0;lang[i] != 0;i++) + if (toupper(lang[i]) != toupper(theLang[i])) + goto not_equal; + if ((theLang[i] == 0) || (theLang[i] == '-')) + ret = 1; + } +not_equal: + if (theLang != NULL) + xmlFree((void *)theLang); + + xmlXPathReleaseObject(ctxt->context, val); + valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, ret)); +} + +/** + * xmlXPathNumberFunction: + * @ctxt: the XPath Parser context + * @nargs: the number of arguments + * + * Implement the number() XPath function + * number number(object?) + */ +void +xmlXPathNumberFunction(xmlXPathParserContextPtr ctxt, int nargs) { + xmlXPathObjectPtr cur; + double res; + + if (ctxt == NULL) return; + if (nargs == 0) { + if (ctxt->context->node == NULL) { + valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, 0.0)); + } else { + xmlChar* content = xmlNodeGetContent(ctxt->context->node); + + res = xmlXPathStringEvalNumber(content); + valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, res)); + xmlFree(content); + } + return; + } + + CHECK_ARITY(1); + cur = valuePop(ctxt); + valuePush(ctxt, xmlXPathCacheConvertNumber(ctxt->context, cur)); +} + +/** + * xmlXPathSumFunction: + * @ctxt: the XPath Parser context + * @nargs: the number of arguments + * + * Implement the sum() XPath function + * number sum(node-set) + * The sum function returns the sum of the values of the nodes in + * the argument node-set. + */ +void +xmlXPathSumFunction(xmlXPathParserContextPtr ctxt, int nargs) { + xmlXPathObjectPtr cur; + int i; + double res = 0.0; + + CHECK_ARITY(1); + if ((ctxt->value == NULL) || + ((ctxt->value->type != XPATH_NODESET) && + (ctxt->value->type != XPATH_XSLT_TREE))) + XP_ERROR(XPATH_INVALID_TYPE); + cur = valuePop(ctxt); + + if ((cur->nodesetval != NULL) && (cur->nodesetval->nodeNr != 0)) { + for (i = 0; i < cur->nodesetval->nodeNr; i++) { + res += xmlXPathCastNodeToNumber(cur->nodesetval->nodeTab[i]); + } + } + valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, res)); + xmlXPathReleaseObject(ctxt->context, cur); +} + +/* + * To assure working code on multiple platforms, we want to only depend + * upon the characteristic truncation of converting a floating point value + * to an integer. Unfortunately, because of the different storage sizes + * of our internal floating point value (double) and integer (int), we + * can't directly convert (see bug 301162). This macro is a messy + * 'workaround' + */ +#define XTRUNC(f, v) \ + f = fmod((v), INT_MAX); \ + f = (v) - (f) + (double)((int)(f)); + +/** + * xmlXPathFloorFunction: + * @ctxt: the XPath Parser context + * @nargs: the number of arguments + * + * Implement the floor() XPath function + * number floor(number) + * The floor function returns the largest (closest to positive infinity) + * number that is not greater than the argument and that is an integer. + */ +void +xmlXPathFloorFunction(xmlXPathParserContextPtr ctxt, int nargs) { + double f; + + CHECK_ARITY(1); + CAST_TO_NUMBER; + CHECK_TYPE(XPATH_NUMBER); + + XTRUNC(f, ctxt->value->floatval); + if (f != ctxt->value->floatval) { + if (ctxt->value->floatval > 0) + ctxt->value->floatval = f; + else + ctxt->value->floatval = f - 1; + } +} + +/** + * xmlXPathCeilingFunction: + * @ctxt: the XPath Parser context + * @nargs: the number of arguments + * + * Implement the ceiling() XPath function + * number ceiling(number) + * The ceiling function returns the smallest (closest to negative infinity) + * number that is not less than the argument and that is an integer. + */ +void +xmlXPathCeilingFunction(xmlXPathParserContextPtr ctxt, int nargs) { + double f; + + CHECK_ARITY(1); + CAST_TO_NUMBER; + CHECK_TYPE(XPATH_NUMBER); + +#if 0 + ctxt->value->floatval = ceil(ctxt->value->floatval); +#else + XTRUNC(f, ctxt->value->floatval); + if (f != ctxt->value->floatval) { + if (ctxt->value->floatval > 0) + ctxt->value->floatval = f + 1; + else { + if (ctxt->value->floatval < 0 && f == 0) + ctxt->value->floatval = xmlXPathNZERO; + else + ctxt->value->floatval = f; + } + + } +#endif +} + +/** + * xmlXPathRoundFunction: + * @ctxt: the XPath Parser context + * @nargs: the number of arguments + * + * Implement the round() XPath function + * number round(number) + * The round function returns the number that is closest to the + * argument and that is an integer. If there are two such numbers, + * then the one that is even is returned. + */ +void +xmlXPathRoundFunction(xmlXPathParserContextPtr ctxt, int nargs) { + double f; + + CHECK_ARITY(1); + CAST_TO_NUMBER; + CHECK_TYPE(XPATH_NUMBER); + + if ((xmlXPathIsNaN(ctxt->value->floatval)) || + (xmlXPathIsInf(ctxt->value->floatval) == 1) || + (xmlXPathIsInf(ctxt->value->floatval) == -1) || + (ctxt->value->floatval == 0.0)) + return; + + XTRUNC(f, ctxt->value->floatval); + if (ctxt->value->floatval < 0) { + if (ctxt->value->floatval < f - 0.5) + ctxt->value->floatval = f - 1; + else + ctxt->value->floatval = f; + if (ctxt->value->floatval == 0) + ctxt->value->floatval = xmlXPathNZERO; + } else { + if (ctxt->value->floatval < f + 0.5) + ctxt->value->floatval = f; + else + ctxt->value->floatval = f + 1; + } +} + +/************************************************************************ + * * + * The Parser * + * * + ************************************************************************/ + +/* + * a few forward declarations since we use a recursive call based + * implementation. + */ +static void xmlXPathCompileExpr(xmlXPathParserContextPtr ctxt, int sort); +static void xmlXPathCompPredicate(xmlXPathParserContextPtr ctxt, int filter); +static void xmlXPathCompLocationPath(xmlXPathParserContextPtr ctxt); +static void xmlXPathCompRelativeLocationPath(xmlXPathParserContextPtr ctxt); +static xmlChar * xmlXPathParseNameComplex(xmlXPathParserContextPtr ctxt, + int qualified); + +/** + * xmlXPathCurrentChar: + * @ctxt: the XPath parser context + * @cur: pointer to the beginning of the char + * @len: pointer to the length of the char read + * + * The current char value, if using UTF-8 this may actually span multiple + * bytes in the input buffer. + * + * Returns the current char value and its length + */ + +static int +xmlXPathCurrentChar(xmlXPathParserContextPtr ctxt, int *len) { + unsigned char c; + unsigned int val; + const xmlChar *cur; + + if (ctxt == NULL) + return(0); + cur = ctxt->cur; + + /* + * We are supposed to handle UTF8, check it's valid + * From rfc2044: encoding of the Unicode values on UTF-8: + * + * UCS-4 range (hex.) UTF-8 octet sequence (binary) + * 0000 0000-0000 007F 0xxxxxxx + * 0000 0080-0000 07FF 110xxxxx 10xxxxxx + * 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx + * + * Check for the 0x110000 limit too + */ + c = *cur; + if (c & 0x80) { + if ((cur[1] & 0xc0) != 0x80) + goto encoding_error; + if ((c & 0xe0) == 0xe0) { + + if ((cur[2] & 0xc0) != 0x80) + goto encoding_error; + if ((c & 0xf0) == 0xf0) { + if (((c & 0xf8) != 0xf0) || + ((cur[3] & 0xc0) != 0x80)) + goto encoding_error; + /* 4-byte code */ + *len = 4; + val = (cur[0] & 0x7) << 18; + val |= (cur[1] & 0x3f) << 12; + val |= (cur[2] & 0x3f) << 6; + val |= cur[3] & 0x3f; + } else { + /* 3-byte code */ + *len = 3; + val = (cur[0] & 0xf) << 12; + val |= (cur[1] & 0x3f) << 6; + val |= cur[2] & 0x3f; + } + } else { + /* 2-byte code */ + *len = 2; + val = (cur[0] & 0x1f) << 6; + val |= cur[1] & 0x3f; + } + if (!IS_CHAR(val)) { + XP_ERROR0(XPATH_INVALID_CHAR_ERROR); + } + return(val); + } else { + /* 1-byte code */ + *len = 1; + return((int) *cur); + } +encoding_error: + /* + * If we detect an UTF8 error that probably means that the + * input encoding didn't get properly advertised in the + * declaration header. Report the error and switch the encoding + * to ISO-Latin-1 (if you don't like this policy, just declare the + * encoding !) + */ + *len = 0; + XP_ERROR0(XPATH_ENCODING_ERROR); +} + +/** + * xmlXPathParseNCName: + * @ctxt: the XPath Parser context + * + * parse an XML namespace non qualified name. + * + * [NS 3] NCName ::= (Letter | '_') (NCNameChar)* + * + * [NS 4] NCNameChar ::= Letter | Digit | '.' | '-' | '_' | + * CombiningChar | Extender + * + * Returns the namespace name or NULL + */ + +xmlChar * +xmlXPathParseNCName(xmlXPathParserContextPtr ctxt) { + const xmlChar *in; + xmlChar *ret; + int count = 0; + + if ((ctxt == NULL) || (ctxt->cur == NULL)) return(NULL); + /* + * Accelerator for simple ASCII names + */ + in = ctxt->cur; + if (((*in >= 0x61) && (*in <= 0x7A)) || + ((*in >= 0x41) && (*in <= 0x5A)) || + (*in == '_')) { + in++; + while (((*in >= 0x61) && (*in <= 0x7A)) || + ((*in >= 0x41) && (*in <= 0x5A)) || + ((*in >= 0x30) && (*in <= 0x39)) || + (*in == '_') || (*in == '.') || + (*in == '-')) + in++; + if ((*in == ' ') || (*in == '>') || (*in == '/') || + (*in == '[') || (*in == ']') || (*in == ':') || + (*in == '@') || (*in == '*')) { + count = in - ctxt->cur; + if (count == 0) + return(NULL); + ret = xmlStrndup(ctxt->cur, count); + ctxt->cur = in; + return(ret); + } + } + return(xmlXPathParseNameComplex(ctxt, 0)); +} + + +/** + * xmlXPathParseQName: + * @ctxt: the XPath Parser context + * @prefix: a xmlChar ** + * + * parse an XML qualified name + * + * [NS 5] QName ::= (Prefix ':')? LocalPart + * + * [NS 6] Prefix ::= NCName + * + * [NS 7] LocalPart ::= NCName + * + * Returns the function returns the local part, and prefix is updated + * to get the Prefix if any. + */ + +static xmlChar * +xmlXPathParseQName(xmlXPathParserContextPtr ctxt, xmlChar **prefix) { + xmlChar *ret = NULL; + + *prefix = NULL; + ret = xmlXPathParseNCName(ctxt); + if (ret && CUR == ':') { + *prefix = ret; + NEXT; + ret = xmlXPathParseNCName(ctxt); + } + return(ret); +} + +/** + * xmlXPathParseName: + * @ctxt: the XPath Parser context + * + * parse an XML name + * + * [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | + * CombiningChar | Extender + * + * [5] Name ::= (Letter | '_' | ':') (NameChar)* + * + * Returns the namespace name or NULL + */ + +xmlChar * +xmlXPathParseName(xmlXPathParserContextPtr ctxt) { + const xmlChar *in; + xmlChar *ret; + size_t count = 0; + + if ((ctxt == NULL) || (ctxt->cur == NULL)) return(NULL); + /* + * Accelerator for simple ASCII names + */ + in = ctxt->cur; + if (((*in >= 0x61) && (*in <= 0x7A)) || + ((*in >= 0x41) && (*in <= 0x5A)) || + (*in == '_') || (*in == ':')) { + in++; + while (((*in >= 0x61) && (*in <= 0x7A)) || + ((*in >= 0x41) && (*in <= 0x5A)) || + ((*in >= 0x30) && (*in <= 0x39)) || + (*in == '_') || (*in == '-') || + (*in == ':') || (*in == '.')) + in++; + if ((*in > 0) && (*in < 0x80)) { + count = in - ctxt->cur; + if (count > XML_MAX_NAME_LENGTH) { + ctxt->cur = in; + XP_ERRORNULL(XPATH_EXPR_ERROR); + } + ret = xmlStrndup(ctxt->cur, count); + ctxt->cur = in; + return(ret); + } + } + return(xmlXPathParseNameComplex(ctxt, 1)); +} + +static xmlChar * +xmlXPathParseNameComplex(xmlXPathParserContextPtr ctxt, int qualified) { + xmlChar buf[XML_MAX_NAMELEN + 5]; + int len = 0, l; + int c; + + /* + * Handler for more complex cases + */ + c = CUR_CHAR(l); + if ((c == ' ') || (c == '>') || (c == '/') || /* accelerators */ + (c == '[') || (c == ']') || (c == '@') || /* accelerators */ + (c == '*') || /* accelerators */ + (!IS_LETTER(c) && (c != '_') && + ((qualified) && (c != ':')))) { + return(NULL); + } + + while ((c != ' ') && (c != '>') && (c != '/') && /* test bigname.xml */ + ((IS_LETTER(c)) || (IS_DIGIT(c)) || + (c == '.') || (c == '-') || + (c == '_') || ((qualified) && (c == ':')) || + (IS_COMBINING(c)) || + (IS_EXTENDER(c)))) { + COPY_BUF(l,buf,len,c); + NEXTL(l); + c = CUR_CHAR(l); + if (len >= XML_MAX_NAMELEN) { + /* + * Okay someone managed to make a huge name, so he's ready to pay + * for the processing speed. + */ + xmlChar *buffer; + int max = len * 2; + + if (len > XML_MAX_NAME_LENGTH) { + XP_ERRORNULL(XPATH_EXPR_ERROR); + } + buffer = (xmlChar *) xmlMallocAtomic(max * sizeof(xmlChar)); + if (buffer == NULL) { + XP_ERRORNULL(XPATH_MEMORY_ERROR); + } + memcpy(buffer, buf, len); + while ((IS_LETTER(c)) || (IS_DIGIT(c)) || /* test bigname.xml */ + (c == '.') || (c == '-') || + (c == '_') || ((qualified) && (c == ':')) || + (IS_COMBINING(c)) || + (IS_EXTENDER(c))) { + if (len + 10 > max) { + if (max > XML_MAX_NAME_LENGTH) { + XP_ERRORNULL(XPATH_EXPR_ERROR); + } + max *= 2; + buffer = (xmlChar *) xmlRealloc(buffer, + max * sizeof(xmlChar)); + if (buffer == NULL) { + XP_ERRORNULL(XPATH_MEMORY_ERROR); + } + } + COPY_BUF(l,buffer,len,c); + NEXTL(l); + c = CUR_CHAR(l); + } + buffer[len] = 0; + return(buffer); + } + } + if (len == 0) + return(NULL); + return(xmlStrndup(buf, len)); +} + +#define MAX_FRAC 20 + +/* + * These are used as divisors for the fractional part of a number. + * Since the table includes 1.0 (representing '0' fractional digits), + * it must be dimensioned at MAX_FRAC+1 (bug 133921) + */ +static double my_pow10[MAX_FRAC+1] = { + 1.0, 10.0, 100.0, 1000.0, 10000.0, + 100000.0, 1000000.0, 10000000.0, 100000000.0, 1000000000.0, + 10000000000.0, 100000000000.0, 1000000000000.0, 10000000000000.0, + 100000000000000.0, + 1000000000000000.0, 10000000000000000.0, 100000000000000000.0, + 1000000000000000000.0, 10000000000000000000.0, 100000000000000000000.0 +}; + +/** + * xmlXPathStringEvalNumber: + * @str: A string to scan + * + * [30a] Float ::= Number ('e' Digits?)? + * + * [30] Number ::= Digits ('.' Digits?)? + * | '.' Digits + * [31] Digits ::= [0-9]+ + * + * Compile a Number in the string + * In complement of the Number expression, this function also handles + * negative values : '-' Number. + * + * Returns the double value. + */ +double +xmlXPathStringEvalNumber(const xmlChar *str) { + const xmlChar *cur = str; + double ret; + int ok = 0; + int isneg = 0; + int exponent = 0; + int is_exponent_negative = 0; +#ifdef __GNUC__ + unsigned long tmp = 0; + double temp; +#endif + if (cur == NULL) return(0); + while (IS_BLANK_CH(*cur)) cur++; + if ((*cur != '.') && ((*cur < '0') || (*cur > '9')) && (*cur != '-')) { + return(xmlXPathNAN); + } + if (*cur == '-') { + isneg = 1; + cur++; + } + +#ifdef __GNUC__ + /* + * tmp/temp is a workaround against a gcc compiler bug + * http://veillard.com/gcc.bug + */ + ret = 0; + while ((*cur >= '0') && (*cur <= '9')) { + ret = ret * 10; + tmp = (*cur - '0'); + ok = 1; + cur++; + temp = (double) tmp; + ret = ret + temp; + } +#else + ret = 0; + while ((*cur >= '0') && (*cur <= '9')) { + ret = ret * 10 + (*cur - '0'); + ok = 1; + cur++; + } +#endif + + if (*cur == '.') { + int v, frac = 0; + double fraction = 0; + + cur++; + if (((*cur < '0') || (*cur > '9')) && (!ok)) { + return(xmlXPathNAN); + } + while (((*cur >= '0') && (*cur <= '9')) && (frac < MAX_FRAC)) { + v = (*cur - '0'); + fraction = fraction * 10 + v; + frac = frac + 1; + cur++; + } + fraction /= my_pow10[frac]; + ret = ret + fraction; + while ((*cur >= '0') && (*cur <= '9')) + cur++; + } + if ((*cur == 'e') || (*cur == 'E')) { + cur++; + if (*cur == '-') { + is_exponent_negative = 1; + cur++; + } else if (*cur == '+') { + cur++; + } + while ((*cur >= '0') && (*cur <= '9')) { + exponent = exponent * 10 + (*cur - '0'); + cur++; + } + } + while (IS_BLANK_CH(*cur)) cur++; + if (*cur != 0) return(xmlXPathNAN); + if (isneg) ret = -ret; + if (is_exponent_negative) exponent = -exponent; + ret *= pow(10.0, (double)exponent); + return(ret); +} + +/** + * xmlXPathCompNumber: + * @ctxt: the XPath Parser context + * + * [30] Number ::= Digits ('.' Digits?)? + * | '.' Digits + * [31] Digits ::= [0-9]+ + * + * Compile a Number, then push it on the stack + * + */ +static void +xmlXPathCompNumber(xmlXPathParserContextPtr ctxt) +{ + double ret = 0.0; + int ok = 0; + int exponent = 0; + int is_exponent_negative = 0; +#ifdef __GNUC__ + unsigned long tmp = 0; + double temp; +#endif + + CHECK_ERROR; + if ((CUR != '.') && ((CUR < '0') || (CUR > '9'))) { + XP_ERROR(XPATH_NUMBER_ERROR); + } +#ifdef __GNUC__ + /* + * tmp/temp is a workaround against a gcc compiler bug + * http://veillard.com/gcc.bug + */ + ret = 0; + while ((CUR >= '0') && (CUR <= '9')) { + ret = ret * 10; + tmp = (CUR - '0'); + ok = 1; + NEXT; + temp = (double) tmp; + ret = ret + temp; + } +#else + ret = 0; + while ((CUR >= '0') && (CUR <= '9')) { + ret = ret * 10 + (CUR - '0'); + ok = 1; + NEXT; + } +#endif + if (CUR == '.') { + int v, frac = 0; + double fraction = 0; + + NEXT; + if (((CUR < '0') || (CUR > '9')) && (!ok)) { + XP_ERROR(XPATH_NUMBER_ERROR); + } + while ((CUR >= '0') && (CUR <= '9') && (frac < MAX_FRAC)) { + v = (CUR - '0'); + fraction = fraction * 10 + v; + frac = frac + 1; + NEXT; + } + fraction /= my_pow10[frac]; + ret = ret + fraction; + while ((CUR >= '0') && (CUR <= '9')) + NEXT; + } + if ((CUR == 'e') || (CUR == 'E')) { + NEXT; + if (CUR == '-') { + is_exponent_negative = 1; + NEXT; + } else if (CUR == '+') { + NEXT; + } + while ((CUR >= '0') && (CUR <= '9')) { + exponent = exponent * 10 + (CUR - '0'); + NEXT; + } + if (is_exponent_negative) + exponent = -exponent; + ret *= pow(10.0, (double) exponent); + } + PUSH_LONG_EXPR(XPATH_OP_VALUE, XPATH_NUMBER, 0, 0, + xmlXPathCacheNewFloat(ctxt->context, ret), NULL); +} + +/** + * xmlXPathParseLiteral: + * @ctxt: the XPath Parser context + * + * Parse a Literal + * + * [29] Literal ::= '"' [^"]* '"' + * | "'" [^']* "'" + * + * Returns the value found or NULL in case of error + */ +static xmlChar * +xmlXPathParseLiteral(xmlXPathParserContextPtr ctxt) { + const xmlChar *q; + xmlChar *ret = NULL; + + if (CUR == '"') { + NEXT; + q = CUR_PTR; + while ((IS_CHAR_CH(CUR)) && (CUR != '"')) + NEXT; + if (!IS_CHAR_CH(CUR)) { + XP_ERRORNULL(XPATH_UNFINISHED_LITERAL_ERROR); + } else { + ret = xmlStrndup(q, CUR_PTR - q); + NEXT; + } + } else if (CUR == '\'') { + NEXT; + q = CUR_PTR; + while ((IS_CHAR_CH(CUR)) && (CUR != '\'')) + NEXT; + if (!IS_CHAR_CH(CUR)) { + XP_ERRORNULL(XPATH_UNFINISHED_LITERAL_ERROR); + } else { + ret = xmlStrndup(q, CUR_PTR - q); + NEXT; + } + } else { + XP_ERRORNULL(XPATH_START_LITERAL_ERROR); + } + return(ret); +} + +/** + * xmlXPathCompLiteral: + * @ctxt: the XPath Parser context + * + * Parse a Literal and push it on the stack. + * + * [29] Literal ::= '"' [^"]* '"' + * | "'" [^']* "'" + * + * TODO: xmlXPathCompLiteral memory allocation could be improved. + */ +static void +xmlXPathCompLiteral(xmlXPathParserContextPtr ctxt) { + const xmlChar *q; + xmlChar *ret = NULL; + + if (CUR == '"') { + NEXT; + q = CUR_PTR; + while ((IS_CHAR_CH(CUR)) && (CUR != '"')) + NEXT; + if (!IS_CHAR_CH(CUR)) { + XP_ERROR(XPATH_UNFINISHED_LITERAL_ERROR); + } else { + ret = xmlStrndup(q, CUR_PTR - q); + NEXT; + } + } else if (CUR == '\'') { + NEXT; + q = CUR_PTR; + while ((IS_CHAR_CH(CUR)) && (CUR != '\'')) + NEXT; + if (!IS_CHAR_CH(CUR)) { + XP_ERROR(XPATH_UNFINISHED_LITERAL_ERROR); + } else { + ret = xmlStrndup(q, CUR_PTR - q); + NEXT; + } + } else { + XP_ERROR(XPATH_START_LITERAL_ERROR); + } + if (ret == NULL) return; + PUSH_LONG_EXPR(XPATH_OP_VALUE, XPATH_STRING, 0, 0, + xmlXPathCacheNewString(ctxt->context, ret), NULL); + xmlFree(ret); +} + +/** + * xmlXPathCompVariableReference: + * @ctxt: the XPath Parser context + * + * Parse a VariableReference, evaluate it and push it on the stack. + * + * The variable bindings consist of a mapping from variable names + * to variable values. The value of a variable is an object, which can be + * of any of the types that are possible for the value of an expression, + * and may also be of additional types not specified here. + * + * Early evaluation is possible since: + * The variable bindings [...] used to evaluate a subexpression are + * always the same as those used to evaluate the containing expression. + * + * [36] VariableReference ::= '$' QName + */ +static void +xmlXPathCompVariableReference(xmlXPathParserContextPtr ctxt) { + xmlChar *name; + xmlChar *prefix; + + SKIP_BLANKS; + if (CUR != '$') { + XP_ERROR(XPATH_VARIABLE_REF_ERROR); + } + NEXT; + name = xmlXPathParseQName(ctxt, &prefix); + if (name == NULL) { + XP_ERROR(XPATH_VARIABLE_REF_ERROR); + } + ctxt->comp->last = -1; + PUSH_LONG_EXPR(XPATH_OP_VARIABLE, 0, 0, 0, + name, prefix); + SKIP_BLANKS; + if ((ctxt->context != NULL) && (ctxt->context->flags & XML_XPATH_NOVAR)) { + XP_ERROR(XPATH_FORBID_VARIABLE_ERROR); + } +} + +/** + * xmlXPathIsNodeType: + * @name: a name string + * + * Is the name given a NodeType one. + * + * [38] NodeType ::= 'comment' + * | 'text' + * | 'processing-instruction' + * | 'node' + * + * Returns 1 if true 0 otherwise + */ +int +xmlXPathIsNodeType(const xmlChar *name) { + if (name == NULL) + return(0); + + if (xmlStrEqual(name, BAD_CAST "node")) + return(1); + if (xmlStrEqual(name, BAD_CAST "text")) + return(1); + if (xmlStrEqual(name, BAD_CAST "comment")) + return(1); + if (xmlStrEqual(name, BAD_CAST "processing-instruction")) + return(1); + return(0); +} + +/** + * xmlXPathCompFunctionCall: + * @ctxt: the XPath Parser context + * + * [16] FunctionCall ::= FunctionName '(' ( Argument ( ',' Argument)*)? ')' + * [17] Argument ::= Expr + * + * Compile a function call, the evaluation of all arguments are + * pushed on the stack + */ +static void +xmlXPathCompFunctionCall(xmlXPathParserContextPtr ctxt) { + xmlChar *name; + xmlChar *prefix; + int nbargs = 0; + int sort = 1; + + name = xmlXPathParseQName(ctxt, &prefix); + if (name == NULL) { + xmlFree(prefix); + XP_ERROR(XPATH_EXPR_ERROR); + } + SKIP_BLANKS; +#ifdef DEBUG_EXPR + if (prefix == NULL) + xmlGenericError(xmlGenericErrorContext, "Calling function %s\n", + name); + else + xmlGenericError(xmlGenericErrorContext, "Calling function %s:%s\n", + prefix, name); +#endif + + if (CUR != '(') { + XP_ERROR(XPATH_EXPR_ERROR); + } + NEXT; + SKIP_BLANKS; + + /* + * Optimization for count(): we don't need the node-set to be sorted. + */ + if ((prefix == NULL) && (name[0] == 'c') && + xmlStrEqual(name, BAD_CAST "count")) + { + sort = 0; + } + ctxt->comp->last = -1; + if (CUR != ')') { + while (CUR != 0) { + int op1 = ctxt->comp->last; + ctxt->comp->last = -1; + xmlXPathCompileExpr(ctxt, sort); + if (ctxt->error != XPATH_EXPRESSION_OK) { + xmlFree(name); + xmlFree(prefix); + return; + } + PUSH_BINARY_EXPR(XPATH_OP_ARG, op1, ctxt->comp->last, 0, 0); + nbargs++; + if (CUR == ')') break; + if (CUR != ',') { + XP_ERROR(XPATH_EXPR_ERROR); + } + NEXT; + SKIP_BLANKS; + } + } + PUSH_LONG_EXPR(XPATH_OP_FUNCTION, nbargs, 0, 0, + name, prefix); + NEXT; + SKIP_BLANKS; +} + +/** + * xmlXPathCompPrimaryExpr: + * @ctxt: the XPath Parser context + * + * [15] PrimaryExpr ::= VariableReference + * | '(' Expr ')' + * | Literal + * | Number + * | FunctionCall + * + * Compile a primary expression. + */ +static void +xmlXPathCompPrimaryExpr(xmlXPathParserContextPtr ctxt) { + SKIP_BLANKS; + if (CUR == '$') xmlXPathCompVariableReference(ctxt); + else if (CUR == '(') { + NEXT; + SKIP_BLANKS; + xmlXPathCompileExpr(ctxt, 1); + CHECK_ERROR; + if (CUR != ')') { + XP_ERROR(XPATH_EXPR_ERROR); + } + NEXT; + SKIP_BLANKS; + } else if (IS_ASCII_DIGIT(CUR) || (CUR == '.' && IS_ASCII_DIGIT(NXT(1)))) { + xmlXPathCompNumber(ctxt); + } else if ((CUR == '\'') || (CUR == '"')) { + xmlXPathCompLiteral(ctxt); + } else { + xmlXPathCompFunctionCall(ctxt); + } + SKIP_BLANKS; +} + +/** + * xmlXPathCompFilterExpr: + * @ctxt: the XPath Parser context + * + * [20] FilterExpr ::= PrimaryExpr + * | FilterExpr Predicate + * + * Compile a filter expression. + * Square brackets are used to filter expressions in the same way that + * they are used in location paths. It is an error if the expression to + * be filtered does not evaluate to a node-set. The context node list + * used for evaluating the expression in square brackets is the node-set + * to be filtered listed in document order. + */ + +static void +xmlXPathCompFilterExpr(xmlXPathParserContextPtr ctxt) { + xmlXPathCompPrimaryExpr(ctxt); + CHECK_ERROR; + SKIP_BLANKS; + + while (CUR == '[') { + xmlXPathCompPredicate(ctxt, 1); + SKIP_BLANKS; + } + + +} + +/** + * xmlXPathScanName: + * @ctxt: the XPath Parser context + * + * Trickery: parse an XML name but without consuming the input flow + * Needed to avoid insanity in the parser state. + * + * [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | + * CombiningChar | Extender + * + * [5] Name ::= (Letter | '_' | ':') (NameChar)* + * + * [6] Names ::= Name (S Name)* + * + * Returns the Name parsed or NULL + */ + +static xmlChar * +xmlXPathScanName(xmlXPathParserContextPtr ctxt) { + int len = 0, l; + int c; + const xmlChar *cur; + xmlChar *ret; + + cur = ctxt->cur; + + c = CUR_CHAR(l); + if ((c == ' ') || (c == '>') || (c == '/') || /* accelerators */ + (!IS_LETTER(c) && (c != '_') && + (c != ':'))) { + return(NULL); + } + + while ((c != ' ') && (c != '>') && (c != '/') && /* test bigname.xml */ + ((IS_LETTER(c)) || (IS_DIGIT(c)) || + (c == '.') || (c == '-') || + (c == '_') || (c == ':') || + (IS_COMBINING(c)) || + (IS_EXTENDER(c)))) { + len += l; + NEXTL(l); + c = CUR_CHAR(l); + } + ret = xmlStrndup(cur, ctxt->cur - cur); + ctxt->cur = cur; + return(ret); +} + +/** + * xmlXPathCompPathExpr: + * @ctxt: the XPath Parser context + * + * [19] PathExpr ::= LocationPath + * | FilterExpr + * | FilterExpr '/' RelativeLocationPath + * | FilterExpr '//' RelativeLocationPath + * + * Compile a path expression. + * The / operator and // operators combine an arbitrary expression + * and a relative location path. It is an error if the expression + * does not evaluate to a node-set. + * The / operator does composition in the same way as when / is + * used in a location path. As in location paths, // is short for + * /descendant-or-self::node()/. + */ + +static void +xmlXPathCompPathExpr(xmlXPathParserContextPtr ctxt) { + int lc = 1; /* Should we branch to LocationPath ? */ + xmlChar *name = NULL; /* we may have to preparse a name to find out */ + + SKIP_BLANKS; + if ((CUR == '$') || (CUR == '(') || + (IS_ASCII_DIGIT(CUR)) || + (CUR == '\'') || (CUR == '"') || + (CUR == '.' && IS_ASCII_DIGIT(NXT(1)))) { + lc = 0; + } else if (CUR == '*') { + /* relative or absolute location path */ + lc = 1; + } else if (CUR == '/') { + /* relative or absolute location path */ + lc = 1; + } else if (CUR == '@') { + /* relative abbreviated attribute location path */ + lc = 1; + } else if (CUR == '.') { + /* relative abbreviated attribute location path */ + lc = 1; + } else { + /* + * Problem is finding if we have a name here whether it's: + * - a nodetype + * - a function call in which case it's followed by '(' + * - an axis in which case it's followed by ':' + * - a element name + * We do an a priori analysis here rather than having to + * maintain parsed token content through the recursive function + * calls. This looks uglier but makes the code easier to + * read/write/debug. + */ + SKIP_BLANKS; + name = xmlXPathScanName(ctxt); + if ((name != NULL) && (xmlStrstr(name, (xmlChar *) "::") != NULL)) { +#ifdef DEBUG_STEP + xmlGenericError(xmlGenericErrorContext, + "PathExpr: Axis\n"); +#endif + lc = 1; + xmlFree(name); + } else if (name != NULL) { + int len =xmlStrlen(name); + + + while (NXT(len) != 0) { + if (NXT(len) == '/') { + /* element name */ +#ifdef DEBUG_STEP + xmlGenericError(xmlGenericErrorContext, + "PathExpr: AbbrRelLocation\n"); +#endif + lc = 1; + break; + } else if (IS_BLANK_CH(NXT(len))) { + /* ignore blanks */ + ; + } else if (NXT(len) == ':') { +#ifdef DEBUG_STEP + xmlGenericError(xmlGenericErrorContext, + "PathExpr: AbbrRelLocation\n"); +#endif + lc = 1; + break; + } else if ((NXT(len) == '(')) { + /* Note Type or Function */ + if (xmlXPathIsNodeType(name)) { +#ifdef DEBUG_STEP + xmlGenericError(xmlGenericErrorContext, + "PathExpr: Type search\n"); +#endif + lc = 1; + } else { +#ifdef DEBUG_STEP + xmlGenericError(xmlGenericErrorContext, + "PathExpr: function call\n"); +#endif + lc = 0; + } + break; + } else if ((NXT(len) == '[')) { + /* element name */ +#ifdef DEBUG_STEP + xmlGenericError(xmlGenericErrorContext, + "PathExpr: AbbrRelLocation\n"); +#endif + lc = 1; + break; + } else if ((NXT(len) == '<') || (NXT(len) == '>') || + (NXT(len) == '=')) { + lc = 1; + break; + } else { + lc = 1; + break; + } + len++; + } + if (NXT(len) == 0) { +#ifdef DEBUG_STEP + xmlGenericError(xmlGenericErrorContext, + "PathExpr: AbbrRelLocation\n"); +#endif + /* element name */ + lc = 1; + } + xmlFree(name); + } else { + /* make sure all cases are covered explicitly */ + XP_ERROR(XPATH_EXPR_ERROR); + } + } + + if (lc) { + if (CUR == '/') { + PUSH_LEAVE_EXPR(XPATH_OP_ROOT, 0, 0); + } else { + PUSH_LEAVE_EXPR(XPATH_OP_NODE, 0, 0); + } + xmlXPathCompLocationPath(ctxt); + } else { + xmlXPathCompFilterExpr(ctxt); + CHECK_ERROR; + if ((CUR == '/') && (NXT(1) == '/')) { + SKIP(2); + SKIP_BLANKS; + + PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_DESCENDANT_OR_SELF, + NODE_TEST_TYPE, NODE_TYPE_NODE, NULL, NULL); + PUSH_UNARY_EXPR(XPATH_OP_RESET, ctxt->comp->last, 1, 0); + + xmlXPathCompRelativeLocationPath(ctxt); + } else if (CUR == '/') { + xmlXPathCompRelativeLocationPath(ctxt); + } + } + SKIP_BLANKS; +} + +/** + * xmlXPathCompUnionExpr: + * @ctxt: the XPath Parser context + * + * [18] UnionExpr ::= PathExpr + * | UnionExpr '|' PathExpr + * + * Compile an union expression. + */ + +static void +xmlXPathCompUnionExpr(xmlXPathParserContextPtr ctxt) { + xmlXPathCompPathExpr(ctxt); + CHECK_ERROR; + SKIP_BLANKS; + while (CUR == '|') { + int op1 = ctxt->comp->last; + PUSH_LEAVE_EXPR(XPATH_OP_NODE, 0, 0); + + NEXT; + SKIP_BLANKS; + xmlXPathCompPathExpr(ctxt); + + PUSH_BINARY_EXPR(XPATH_OP_UNION, op1, ctxt->comp->last, 0, 0); + + SKIP_BLANKS; + } +} + +/** + * xmlXPathCompUnaryExpr: + * @ctxt: the XPath Parser context + * + * [27] UnaryExpr ::= UnionExpr + * | '-' UnaryExpr + * + * Compile an unary expression. + */ + +static void +xmlXPathCompUnaryExpr(xmlXPathParserContextPtr ctxt) { + int minus = 0; + int found = 0; + + SKIP_BLANKS; + while (CUR == '-') { + minus = 1 - minus; + found = 1; + NEXT; + SKIP_BLANKS; + } + + xmlXPathCompUnionExpr(ctxt); + CHECK_ERROR; + if (found) { + if (minus) + PUSH_UNARY_EXPR(XPATH_OP_PLUS, ctxt->comp->last, 2, 0); + else + PUSH_UNARY_EXPR(XPATH_OP_PLUS, ctxt->comp->last, 3, 0); + } +} + +/** + * xmlXPathCompMultiplicativeExpr: + * @ctxt: the XPath Parser context + * + * [26] MultiplicativeExpr ::= UnaryExpr + * | MultiplicativeExpr MultiplyOperator UnaryExpr + * | MultiplicativeExpr 'div' UnaryExpr + * | MultiplicativeExpr 'mod' UnaryExpr + * [34] MultiplyOperator ::= '*' + * + * Compile an Additive expression. + */ + +static void +xmlXPathCompMultiplicativeExpr(xmlXPathParserContextPtr ctxt) { + xmlXPathCompUnaryExpr(ctxt); + CHECK_ERROR; + SKIP_BLANKS; + while ((CUR == '*') || + ((CUR == 'd') && (NXT(1) == 'i') && (NXT(2) == 'v')) || + ((CUR == 'm') && (NXT(1) == 'o') && (NXT(2) == 'd'))) { + int op = -1; + int op1 = ctxt->comp->last; + + if (CUR == '*') { + op = 0; + NEXT; + } else if (CUR == 'd') { + op = 1; + SKIP(3); + } else if (CUR == 'm') { + op = 2; + SKIP(3); + } + SKIP_BLANKS; + xmlXPathCompUnaryExpr(ctxt); + CHECK_ERROR; + PUSH_BINARY_EXPR(XPATH_OP_MULT, op1, ctxt->comp->last, op, 0); + SKIP_BLANKS; + } +} + +/** + * xmlXPathCompAdditiveExpr: + * @ctxt: the XPath Parser context + * + * [25] AdditiveExpr ::= MultiplicativeExpr + * | AdditiveExpr '+' MultiplicativeExpr + * | AdditiveExpr '-' MultiplicativeExpr + * + * Compile an Additive expression. + */ + +static void +xmlXPathCompAdditiveExpr(xmlXPathParserContextPtr ctxt) { + + xmlXPathCompMultiplicativeExpr(ctxt); + CHECK_ERROR; + SKIP_BLANKS; + while ((CUR == '+') || (CUR == '-')) { + int plus; + int op1 = ctxt->comp->last; + + if (CUR == '+') plus = 1; + else plus = 0; + NEXT; + SKIP_BLANKS; + xmlXPathCompMultiplicativeExpr(ctxt); + CHECK_ERROR; + PUSH_BINARY_EXPR(XPATH_OP_PLUS, op1, ctxt->comp->last, plus, 0); + SKIP_BLANKS; + } +} + +/** + * xmlXPathCompRelationalExpr: + * @ctxt: the XPath Parser context + * + * [24] RelationalExpr ::= AdditiveExpr + * | RelationalExpr '<' AdditiveExpr + * | RelationalExpr '>' AdditiveExpr + * | RelationalExpr '<=' AdditiveExpr + * | RelationalExpr '>=' AdditiveExpr + * + * A <= B > C is allowed ? Answer from James, yes with + * (AdditiveExpr <= AdditiveExpr) > AdditiveExpr + * which is basically what got implemented. + * + * Compile a Relational expression, then push the result + * on the stack + */ + +static void +xmlXPathCompRelationalExpr(xmlXPathParserContextPtr ctxt) { + xmlXPathCompAdditiveExpr(ctxt); + CHECK_ERROR; + SKIP_BLANKS; + while ((CUR == '<') || + (CUR == '>') || + ((CUR == '<') && (NXT(1) == '=')) || + ((CUR == '>') && (NXT(1) == '='))) { + int inf, strict; + int op1 = ctxt->comp->last; + + if (CUR == '<') inf = 1; + else inf = 0; + if (NXT(1) == '=') strict = 0; + else strict = 1; + NEXT; + if (!strict) NEXT; + SKIP_BLANKS; + xmlXPathCompAdditiveExpr(ctxt); + CHECK_ERROR; + PUSH_BINARY_EXPR(XPATH_OP_CMP, op1, ctxt->comp->last, inf, strict); + SKIP_BLANKS; + } +} + +/** + * xmlXPathCompEqualityExpr: + * @ctxt: the XPath Parser context + * + * [23] EqualityExpr ::= RelationalExpr + * | EqualityExpr '=' RelationalExpr + * | EqualityExpr '!=' RelationalExpr + * + * A != B != C is allowed ? Answer from James, yes with + * (RelationalExpr = RelationalExpr) = RelationalExpr + * (RelationalExpr != RelationalExpr) != RelationalExpr + * which is basically what got implemented. + * + * Compile an Equality expression. + * + */ +static void +xmlXPathCompEqualityExpr(xmlXPathParserContextPtr ctxt) { + xmlXPathCompRelationalExpr(ctxt); + CHECK_ERROR; + SKIP_BLANKS; + while ((CUR == '=') || ((CUR == '!') && (NXT(1) == '='))) { + int eq; + int op1 = ctxt->comp->last; + + if (CUR == '=') eq = 1; + else eq = 0; + NEXT; + if (!eq) NEXT; + SKIP_BLANKS; + xmlXPathCompRelationalExpr(ctxt); + CHECK_ERROR; + PUSH_BINARY_EXPR(XPATH_OP_EQUAL, op1, ctxt->comp->last, eq, 0); + SKIP_BLANKS; + } +} + +/** + * xmlXPathCompAndExpr: + * @ctxt: the XPath Parser context + * + * [22] AndExpr ::= EqualityExpr + * | AndExpr 'and' EqualityExpr + * + * Compile an AND expression. + * + */ +static void +xmlXPathCompAndExpr(xmlXPathParserContextPtr ctxt) { + xmlXPathCompEqualityExpr(ctxt); + CHECK_ERROR; + SKIP_BLANKS; + while ((CUR == 'a') && (NXT(1) == 'n') && (NXT(2) == 'd')) { + int op1 = ctxt->comp->last; + SKIP(3); + SKIP_BLANKS; + xmlXPathCompEqualityExpr(ctxt); + CHECK_ERROR; + PUSH_BINARY_EXPR(XPATH_OP_AND, op1, ctxt->comp->last, 0, 0); + SKIP_BLANKS; + } +} + +/** + * xmlXPathCompileExpr: + * @ctxt: the XPath Parser context + * + * [14] Expr ::= OrExpr + * [21] OrExpr ::= AndExpr + * | OrExpr 'or' AndExpr + * + * Parse and compile an expression + */ +static void +xmlXPathCompileExpr(xmlXPathParserContextPtr ctxt, int sort) { + xmlXPathCompAndExpr(ctxt); + CHECK_ERROR; + SKIP_BLANKS; + while ((CUR == 'o') && (NXT(1) == 'r')) { + int op1 = ctxt->comp->last; + SKIP(2); + SKIP_BLANKS; + xmlXPathCompAndExpr(ctxt); + CHECK_ERROR; + PUSH_BINARY_EXPR(XPATH_OP_OR, op1, ctxt->comp->last, 0, 0); + SKIP_BLANKS; + } + if ((sort) && (ctxt->comp->steps[ctxt->comp->last].op != XPATH_OP_VALUE)) { + /* more ops could be optimized too */ + /* + * This is the main place to eliminate sorting for + * operations which don't require a sorted node-set. + * E.g. count(). + */ + PUSH_UNARY_EXPR(XPATH_OP_SORT, ctxt->comp->last , 0, 0); + } +} + +/** + * xmlXPathCompPredicate: + * @ctxt: the XPath Parser context + * @filter: act as a filter + * + * [8] Predicate ::= '[' PredicateExpr ']' + * [9] PredicateExpr ::= Expr + * + * Compile a predicate expression + */ +static void +xmlXPathCompPredicate(xmlXPathParserContextPtr ctxt, int filter) { + int op1 = ctxt->comp->last; + + SKIP_BLANKS; + if (CUR != '[') { + XP_ERROR(XPATH_INVALID_PREDICATE_ERROR); + } + NEXT; + SKIP_BLANKS; + + ctxt->comp->last = -1; + /* + * This call to xmlXPathCompileExpr() will deactivate sorting + * of the predicate result. + * TODO: Sorting is still activated for filters, since I'm not + * sure if needed. Normally sorting should not be needed, since + * a filter can only diminish the number of items in a sequence, + * but won't change its order; so if the initial sequence is sorted, + * subsequent sorting is not needed. + */ + if (! filter) + xmlXPathCompileExpr(ctxt, 0); + else + xmlXPathCompileExpr(ctxt, 1); + CHECK_ERROR; + + if (CUR != ']') { + XP_ERROR(XPATH_INVALID_PREDICATE_ERROR); + } + + if (filter) + PUSH_BINARY_EXPR(XPATH_OP_FILTER, op1, ctxt->comp->last, 0, 0); + else + PUSH_BINARY_EXPR(XPATH_OP_PREDICATE, op1, ctxt->comp->last, 0, 0); + + NEXT; + SKIP_BLANKS; +} + +/** + * xmlXPathCompNodeTest: + * @ctxt: the XPath Parser context + * @test: pointer to a xmlXPathTestVal + * @type: pointer to a xmlXPathTypeVal + * @prefix: placeholder for a possible name prefix + * + * [7] NodeTest ::= NameTest + * | NodeType '(' ')' + * | 'processing-instruction' '(' Literal ')' + * + * [37] NameTest ::= '*' + * | NCName ':' '*' + * | QName + * [38] NodeType ::= 'comment' + * | 'text' + * | 'processing-instruction' + * | 'node' + * + * Returns the name found and updates @test, @type and @prefix appropriately + */ +static xmlChar * +xmlXPathCompNodeTest(xmlXPathParserContextPtr ctxt, xmlXPathTestVal *test, + xmlXPathTypeVal *type, const xmlChar **prefix, + xmlChar *name) { + int blanks; + + if ((test == NULL) || (type == NULL) || (prefix == NULL)) { + STRANGE; + return(NULL); + } + *type = (xmlXPathTypeVal) 0; + *test = (xmlXPathTestVal) 0; + *prefix = NULL; + SKIP_BLANKS; + + if ((name == NULL) && (CUR == '*')) { + /* + * All elements + */ + NEXT; + *test = NODE_TEST_ALL; + return(NULL); + } + + if (name == NULL) + name = xmlXPathParseNCName(ctxt); + if (name == NULL) { + XP_ERRORNULL(XPATH_EXPR_ERROR); + } + + blanks = IS_BLANK_CH(CUR); + SKIP_BLANKS; + if (CUR == '(') { + NEXT; + /* + * NodeType or PI search + */ + if (xmlStrEqual(name, BAD_CAST "comment")) + *type = NODE_TYPE_COMMENT; + else if (xmlStrEqual(name, BAD_CAST "node")) + *type = NODE_TYPE_NODE; + else if (xmlStrEqual(name, BAD_CAST "processing-instruction")) + *type = NODE_TYPE_PI; + else if (xmlStrEqual(name, BAD_CAST "text")) + *type = NODE_TYPE_TEXT; + else { + if (name != NULL) + xmlFree(name); + XP_ERRORNULL(XPATH_EXPR_ERROR); + } + + *test = NODE_TEST_TYPE; + + SKIP_BLANKS; + if (*type == NODE_TYPE_PI) { + /* + * Specific case: search a PI by name. + */ + if (name != NULL) + xmlFree(name); + name = NULL; + if (CUR != ')') { + name = xmlXPathParseLiteral(ctxt); + CHECK_ERROR NULL; + *test = NODE_TEST_PI; + SKIP_BLANKS; + } + } + if (CUR != ')') { + if (name != NULL) + xmlFree(name); + XP_ERRORNULL(XPATH_UNCLOSED_ERROR); + } + NEXT; + return(name); + } + *test = NODE_TEST_NAME; + if ((!blanks) && (CUR == ':')) { + NEXT; + + /* + * Since currently the parser context don't have a + * namespace list associated: + * The namespace name for this prefix can be computed + * only at evaluation time. The compilation is done + * outside of any context. + */ +#if 0 + *prefix = xmlXPathNsLookup(ctxt->context, name); + if (name != NULL) + xmlFree(name); + if (*prefix == NULL) { + XP_ERROR0(XPATH_UNDEF_PREFIX_ERROR); + } +#else + *prefix = name; +#endif + + if (CUR == '*') { + /* + * All elements + */ + NEXT; + *test = NODE_TEST_ALL; + return(NULL); + } + + name = xmlXPathParseNCName(ctxt); + if (name == NULL) { + XP_ERRORNULL(XPATH_EXPR_ERROR); + } + } + return(name); +} + +/** + * xmlXPathIsAxisName: + * @name: a preparsed name token + * + * [6] AxisName ::= 'ancestor' + * | 'ancestor-or-self' + * | 'attribute' + * | 'child' + * | 'descendant' + * | 'descendant-or-self' + * | 'following' + * | 'following-sibling' + * | 'namespace' + * | 'parent' + * | 'preceding' + * | 'preceding-sibling' + * | 'self' + * + * Returns the axis or 0 + */ +static xmlXPathAxisVal +xmlXPathIsAxisName(const xmlChar *name) { + xmlXPathAxisVal ret = (xmlXPathAxisVal) 0; + switch (name[0]) { + case 'a': + if (xmlStrEqual(name, BAD_CAST "ancestor")) + ret = AXIS_ANCESTOR; + if (xmlStrEqual(name, BAD_CAST "ancestor-or-self")) + ret = AXIS_ANCESTOR_OR_SELF; + if (xmlStrEqual(name, BAD_CAST "attribute")) + ret = AXIS_ATTRIBUTE; + break; + case 'c': + if (xmlStrEqual(name, BAD_CAST "child")) + ret = AXIS_CHILD; + break; + case 'd': + if (xmlStrEqual(name, BAD_CAST "descendant")) + ret = AXIS_DESCENDANT; + if (xmlStrEqual(name, BAD_CAST "descendant-or-self")) + ret = AXIS_DESCENDANT_OR_SELF; + break; + case 'f': + if (xmlStrEqual(name, BAD_CAST "following")) + ret = AXIS_FOLLOWING; + if (xmlStrEqual(name, BAD_CAST "following-sibling")) + ret = AXIS_FOLLOWING_SIBLING; + break; + case 'n': + if (xmlStrEqual(name, BAD_CAST "namespace")) + ret = AXIS_NAMESPACE; + break; + case 'p': + if (xmlStrEqual(name, BAD_CAST "parent")) + ret = AXIS_PARENT; + if (xmlStrEqual(name, BAD_CAST "preceding")) + ret = AXIS_PRECEDING; + if (xmlStrEqual(name, BAD_CAST "preceding-sibling")) + ret = AXIS_PRECEDING_SIBLING; + break; + case 's': + if (xmlStrEqual(name, BAD_CAST "self")) + ret = AXIS_SELF; + break; + } + return(ret); +} + +/** + * xmlXPathCompStep: + * @ctxt: the XPath Parser context + * + * [4] Step ::= AxisSpecifier NodeTest Predicate* + * | AbbreviatedStep + * + * [12] AbbreviatedStep ::= '.' | '..' + * + * [5] AxisSpecifier ::= AxisName '::' + * | AbbreviatedAxisSpecifier + * + * [13] AbbreviatedAxisSpecifier ::= '@'? + * + * Modified for XPtr range support as: + * + * [4xptr] Step ::= AxisSpecifier NodeTest Predicate* + * | AbbreviatedStep + * | 'range-to' '(' Expr ')' Predicate* + * + * Compile one step in a Location Path + * A location step of . is short for self::node(). This is + * particularly useful in conjunction with //. For example, the + * location path .//para is short for + * self::node()/descendant-or-self::node()/child::para + * and so will select all para descendant elements of the context + * node. + * Similarly, a location step of .. is short for parent::node(). + * For example, ../title is short for parent::node()/child::title + * and so will select the title children of the parent of the context + * node. + */ +static void +xmlXPathCompStep(xmlXPathParserContextPtr ctxt) { +#ifdef LIBXML_XPTR_ENABLED + int rangeto = 0; + int op2 = -1; +#endif + + SKIP_BLANKS; + if ((CUR == '.') && (NXT(1) == '.')) { + SKIP(2); + SKIP_BLANKS; + PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_PARENT, + NODE_TEST_TYPE, NODE_TYPE_NODE, NULL, NULL); + } else if (CUR == '.') { + NEXT; + SKIP_BLANKS; + } else { + xmlChar *name = NULL; + const xmlChar *prefix = NULL; + xmlXPathTestVal test = (xmlXPathTestVal) 0; + xmlXPathAxisVal axis = (xmlXPathAxisVal) 0; + xmlXPathTypeVal type = (xmlXPathTypeVal) 0; + int op1; + + /* + * The modification needed for XPointer change to the production + */ +#ifdef LIBXML_XPTR_ENABLED + if (ctxt->xptr) { + name = xmlXPathParseNCName(ctxt); + if ((name != NULL) && (xmlStrEqual(name, BAD_CAST "range-to"))) { + op2 = ctxt->comp->last; + xmlFree(name); + SKIP_BLANKS; + if (CUR != '(') { + XP_ERROR(XPATH_EXPR_ERROR); + } + NEXT; + SKIP_BLANKS; + + xmlXPathCompileExpr(ctxt, 1); + /* PUSH_BINARY_EXPR(XPATH_OP_RANGETO, op2, ctxt->comp->last, 0, 0); */ + CHECK_ERROR; + + SKIP_BLANKS; + if (CUR != ')') { + XP_ERROR(XPATH_EXPR_ERROR); + } + NEXT; + rangeto = 1; + goto eval_predicates; + } + } +#endif + if (CUR == '*') { + axis = AXIS_CHILD; + } else { + if (name == NULL) + name = xmlXPathParseNCName(ctxt); + if (name != NULL) { + axis = xmlXPathIsAxisName(name); + if (axis != 0) { + SKIP_BLANKS; + if ((CUR == ':') && (NXT(1) == ':')) { + SKIP(2); + xmlFree(name); + name = NULL; + } else { + /* an element name can conflict with an axis one :-\ */ + axis = AXIS_CHILD; + } + } else { + axis = AXIS_CHILD; + } + } else if (CUR == '@') { + NEXT; + axis = AXIS_ATTRIBUTE; + } else { + axis = AXIS_CHILD; + } + } + + if (ctxt->error != XPATH_EXPRESSION_OK) { + xmlFree(name); + return; + } + + name = xmlXPathCompNodeTest(ctxt, &test, &type, &prefix, name); + if (test == 0) + return; + + if ((prefix != NULL) && (ctxt->context != NULL) && + (ctxt->context->flags & XML_XPATH_CHECKNS)) { + if (xmlXPathNsLookup(ctxt->context, prefix) == NULL) { + xmlXPathErr(ctxt, XPATH_UNDEF_PREFIX_ERROR); + } + } +#ifdef DEBUG_STEP + xmlGenericError(xmlGenericErrorContext, + "Basis : computing new set\n"); +#endif + +#ifdef DEBUG_STEP + xmlGenericError(xmlGenericErrorContext, "Basis : "); + if (ctxt->value == NULL) + xmlGenericError(xmlGenericErrorContext, "no value\n"); + else if (ctxt->value->nodesetval == NULL) + xmlGenericError(xmlGenericErrorContext, "Empty\n"); + else + xmlGenericErrorContextNodeSet(stdout, ctxt->value->nodesetval); +#endif + +#ifdef LIBXML_XPTR_ENABLED +eval_predicates: +#endif + op1 = ctxt->comp->last; + ctxt->comp->last = -1; + + SKIP_BLANKS; + while (CUR == '[') { + xmlXPathCompPredicate(ctxt, 0); + } + +#ifdef LIBXML_XPTR_ENABLED + if (rangeto) { + PUSH_BINARY_EXPR(XPATH_OP_RANGETO, op2, op1, 0, 0); + } else +#endif + PUSH_FULL_EXPR(XPATH_OP_COLLECT, op1, ctxt->comp->last, axis, + test, type, (void *)prefix, (void *)name); + + } +#ifdef DEBUG_STEP + xmlGenericError(xmlGenericErrorContext, "Step : "); + if (ctxt->value == NULL) + xmlGenericError(xmlGenericErrorContext, "no value\n"); + else if (ctxt->value->nodesetval == NULL) + xmlGenericError(xmlGenericErrorContext, "Empty\n"); + else + xmlGenericErrorContextNodeSet(xmlGenericErrorContext, + ctxt->value->nodesetval); +#endif +} + +/** + * xmlXPathCompRelativeLocationPath: + * @ctxt: the XPath Parser context + * + * [3] RelativeLocationPath ::= Step + * | RelativeLocationPath '/' Step + * | AbbreviatedRelativeLocationPath + * [11] AbbreviatedRelativeLocationPath ::= RelativeLocationPath '//' Step + * + * Compile a relative location path. + */ +static void +xmlXPathCompRelativeLocationPath +(xmlXPathParserContextPtr ctxt) { + SKIP_BLANKS; + if ((CUR == '/') && (NXT(1) == '/')) { + SKIP(2); + SKIP_BLANKS; + PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_DESCENDANT_OR_SELF, + NODE_TEST_TYPE, NODE_TYPE_NODE, NULL, NULL); + } else if (CUR == '/') { + NEXT; + SKIP_BLANKS; + } + xmlXPathCompStep(ctxt); + CHECK_ERROR; + SKIP_BLANKS; + while (CUR == '/') { + if ((CUR == '/') && (NXT(1) == '/')) { + SKIP(2); + SKIP_BLANKS; + PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_DESCENDANT_OR_SELF, + NODE_TEST_TYPE, NODE_TYPE_NODE, NULL, NULL); + xmlXPathCompStep(ctxt); + } else if (CUR == '/') { + NEXT; + SKIP_BLANKS; + xmlXPathCompStep(ctxt); + } + SKIP_BLANKS; + } +} + +/** + * xmlXPathCompLocationPath: + * @ctxt: the XPath Parser context + * + * [1] LocationPath ::= RelativeLocationPath + * | AbsoluteLocationPath + * [2] AbsoluteLocationPath ::= '/' RelativeLocationPath? + * | AbbreviatedAbsoluteLocationPath + * [10] AbbreviatedAbsoluteLocationPath ::= + * '//' RelativeLocationPath + * + * Compile a location path + * + * // is short for /descendant-or-self::node()/. For example, + * //para is short for /descendant-or-self::node()/child::para and + * so will select any para element in the document (even a para element + * that is a document element will be selected by //para since the + * document element node is a child of the root node); div//para is + * short for div/descendant-or-self::node()/child::para and so will + * select all para descendants of div children. + */ +static void +xmlXPathCompLocationPath(xmlXPathParserContextPtr ctxt) { + SKIP_BLANKS; + if (CUR != '/') { + xmlXPathCompRelativeLocationPath(ctxt); + } else { + while (CUR == '/') { + if ((CUR == '/') && (NXT(1) == '/')) { + SKIP(2); + SKIP_BLANKS; + PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_DESCENDANT_OR_SELF, + NODE_TEST_TYPE, NODE_TYPE_NODE, NULL, NULL); + xmlXPathCompRelativeLocationPath(ctxt); + } else if (CUR == '/') { + NEXT; + SKIP_BLANKS; + if ((CUR != 0 ) && + ((IS_ASCII_LETTER(CUR)) || (CUR == '_') || (CUR == '.') || + (CUR == '@') || (CUR == '*'))) + xmlXPathCompRelativeLocationPath(ctxt); + } + CHECK_ERROR; + } + } +} + +/************************************************************************ + * * + * XPath precompiled expression evaluation * + * * + ************************************************************************/ + +static int +xmlXPathCompOpEval(xmlXPathParserContextPtr ctxt, xmlXPathStepOpPtr op); + +#ifdef DEBUG_STEP +static void +xmlXPathDebugDumpStepAxis(xmlXPathStepOpPtr op, + int nbNodes) +{ + xmlGenericError(xmlGenericErrorContext, "new step : "); + switch (op->value) { + case AXIS_ANCESTOR: + xmlGenericError(xmlGenericErrorContext, "axis 'ancestors' "); + break; + case AXIS_ANCESTOR_OR_SELF: + xmlGenericError(xmlGenericErrorContext, + "axis 'ancestors-or-self' "); + break; + case AXIS_ATTRIBUTE: + xmlGenericError(xmlGenericErrorContext, "axis 'attributes' "); + break; + case AXIS_CHILD: + xmlGenericError(xmlGenericErrorContext, "axis 'child' "); + break; + case AXIS_DESCENDANT: + xmlGenericError(xmlGenericErrorContext, "axis 'descendant' "); + break; + case AXIS_DESCENDANT_OR_SELF: + xmlGenericError(xmlGenericErrorContext, + "axis 'descendant-or-self' "); + break; + case AXIS_FOLLOWING: + xmlGenericError(xmlGenericErrorContext, "axis 'following' "); + break; + case AXIS_FOLLOWING_SIBLING: + xmlGenericError(xmlGenericErrorContext, + "axis 'following-siblings' "); + break; + case AXIS_NAMESPACE: + xmlGenericError(xmlGenericErrorContext, "axis 'namespace' "); + break; + case AXIS_PARENT: + xmlGenericError(xmlGenericErrorContext, "axis 'parent' "); + break; + case AXIS_PRECEDING: + xmlGenericError(xmlGenericErrorContext, "axis 'preceding' "); + break; + case AXIS_PRECEDING_SIBLING: + xmlGenericError(xmlGenericErrorContext, + "axis 'preceding-sibling' "); + break; + case AXIS_SELF: + xmlGenericError(xmlGenericErrorContext, "axis 'self' "); + break; + } + xmlGenericError(xmlGenericErrorContext, + " context contains %d nodes\n", nbNodes); + switch (op->value2) { + case NODE_TEST_NONE: + xmlGenericError(xmlGenericErrorContext, + " searching for none !!!\n"); + break; + case NODE_TEST_TYPE: + xmlGenericError(xmlGenericErrorContext, + " searching for type %d\n", op->value3); + break; + case NODE_TEST_PI: + xmlGenericError(xmlGenericErrorContext, + " searching for PI !!!\n"); + break; + case NODE_TEST_ALL: + xmlGenericError(xmlGenericErrorContext, + " searching for *\n"); + break; + case NODE_TEST_NS: + xmlGenericError(xmlGenericErrorContext, + " searching for namespace %s\n", + op->value5); + break; + case NODE_TEST_NAME: + xmlGenericError(xmlGenericErrorContext, + " searching for name %s\n", op->value5); + if (op->value4) + xmlGenericError(xmlGenericErrorContext, + " with namespace %s\n", op->value4); + break; + } + xmlGenericError(xmlGenericErrorContext, "Testing : "); +} +#endif /* DEBUG_STEP */ + +static int +xmlXPathCompOpEvalPredicate(xmlXPathParserContextPtr ctxt, + xmlXPathStepOpPtr op, + xmlNodeSetPtr set, + int contextSize, + int hasNsNodes) +{ + if (op->ch1 != -1) { + xmlXPathCompExprPtr comp = ctxt->comp; + /* + * Process inner predicates first. + */ + if (comp->steps[op->ch1].op != XPATH_OP_PREDICATE) { + /* + * TODO: raise an internal error. + */ + } + contextSize = xmlXPathCompOpEvalPredicate(ctxt, + &comp->steps[op->ch1], set, contextSize, hasNsNodes); + CHECK_ERROR0; + if (contextSize <= 0) + return(0); + } + if (op->ch2 != -1) { + xmlXPathContextPtr xpctxt = ctxt->context; + xmlNodePtr contextNode, oldContextNode; + xmlDocPtr oldContextDoc; + int i, res, contextPos = 0, newContextSize; + xmlXPathStepOpPtr exprOp; + xmlXPathObjectPtr contextObj = NULL, exprRes = NULL; + +#ifdef LIBXML_XPTR_ENABLED + /* + * URGENT TODO: Check the following: + * We don't expect location sets if evaluating prediates, right? + * Only filters should expect location sets, right? + */ +#endif + /* + * SPEC XPath 1.0: + * "For each node in the node-set to be filtered, the + * PredicateExpr is evaluated with that node as the + * context node, with the number of nodes in the + * node-set as the context size, and with the proximity + * position of the node in the node-set with respect to + * the axis as the context position;" + * @oldset is the node-set" to be filtered. + * + * SPEC XPath 1.0: + * "only predicates change the context position and + * context size (see [2.4 Predicates])." + * Example: + * node-set context pos + * nA 1 + * nB 2 + * nC 3 + * After applying predicate [position() > 1] : + * node-set context pos + * nB 1 + * nC 2 + */ + oldContextNode = xpctxt->node; + oldContextDoc = xpctxt->doc; + /* + * Get the expression of this predicate. + */ + exprOp = &ctxt->comp->steps[op->ch2]; + newContextSize = 0; + for (i = 0; i < set->nodeNr; i++) { + if (set->nodeTab[i] == NULL) + continue; + + contextNode = set->nodeTab[i]; + xpctxt->node = contextNode; + xpctxt->contextSize = contextSize; + xpctxt->proximityPosition = ++contextPos; + + /* + * Also set the xpath document in case things like + * key() are evaluated in the predicate. + */ + if ((contextNode->type != XML_NAMESPACE_DECL) && + (contextNode->doc != NULL)) + xpctxt->doc = contextNode->doc; + /* + * Evaluate the predicate expression with 1 context node + * at a time; this node is packaged into a node set; this + * node set is handed over to the evaluation mechanism. + */ + if (contextObj == NULL) + contextObj = xmlXPathCacheNewNodeSet(xpctxt, contextNode); + else { + if (xmlXPathNodeSetAddUnique(contextObj->nodesetval, + contextNode) < 0) { + ctxt->error = XPATH_MEMORY_ERROR; + goto evaluation_exit; + } + } + + valuePush(ctxt, contextObj); + + res = xmlXPathCompOpEvalToBoolean(ctxt, exprOp, 1); + + if ((ctxt->error != XPATH_EXPRESSION_OK) || (res == -1)) { + xmlXPathNodeSetClear(set, hasNsNodes); + newContextSize = 0; + goto evaluation_exit; + } + + if (res != 0) { + newContextSize++; + } else { + /* + * Remove the entry from the initial node set. + */ + set->nodeTab[i] = NULL; + if (contextNode->type == XML_NAMESPACE_DECL) + xmlXPathNodeSetFreeNs((xmlNsPtr) contextNode); + } + if (ctxt->value == contextObj) { + /* + * Don't free the temporary XPath object holding the + * context node, in order to avoid massive recreation + * inside this loop. + */ + valuePop(ctxt); + xmlXPathNodeSetClear(contextObj->nodesetval, hasNsNodes); + } else { + /* + * TODO: The object was lost in the evaluation machinery. + * Can this happen? Maybe in internal-error cases. + */ + contextObj = NULL; + } + } + + if (contextObj != NULL) { + if (ctxt->value == contextObj) + valuePop(ctxt); + xmlXPathReleaseObject(xpctxt, contextObj); + } +evaluation_exit: + if (exprRes != NULL) + xmlXPathReleaseObject(ctxt->context, exprRes); + /* + * Reset/invalidate the context. + */ + xpctxt->node = oldContextNode; + xpctxt->doc = oldContextDoc; + xpctxt->contextSize = -1; + xpctxt->proximityPosition = -1; + return(newContextSize); + } + return(contextSize); +} + +static int +xmlXPathCompOpEvalPositionalPredicate(xmlXPathParserContextPtr ctxt, + xmlXPathStepOpPtr op, + xmlNodeSetPtr set, + int contextSize, + int minPos, + int maxPos, + int hasNsNodes) +{ + if (op->ch1 != -1) { + xmlXPathCompExprPtr comp = ctxt->comp; + if (comp->steps[op->ch1].op != XPATH_OP_PREDICATE) { + /* + * TODO: raise an internal error. + */ + } + contextSize = xmlXPathCompOpEvalPredicate(ctxt, + &comp->steps[op->ch1], set, contextSize, hasNsNodes); + CHECK_ERROR0; + if (contextSize <= 0) + return(0); + } + /* + * Check if the node set contains a sufficient number of nodes for + * the requested range. + */ + if (contextSize < minPos) { + xmlXPathNodeSetClear(set, hasNsNodes); + return(0); + } + if (op->ch2 == -1) { + /* + * TODO: Can this ever happen? + */ + return (contextSize); + } else { + xmlDocPtr oldContextDoc; + int i, pos = 0, newContextSize = 0, contextPos = 0, res; + xmlXPathStepOpPtr exprOp; + xmlXPathObjectPtr contextObj = NULL, exprRes = NULL; + xmlNodePtr oldContextNode, contextNode = NULL; + xmlXPathContextPtr xpctxt = ctxt->context; + int frame; + +#ifdef LIBXML_XPTR_ENABLED + /* + * URGENT TODO: Check the following: + * We don't expect location sets if evaluating prediates, right? + * Only filters should expect location sets, right? + */ +#endif /* LIBXML_XPTR_ENABLED */ + + /* + * Save old context. + */ + oldContextNode = xpctxt->node; + oldContextDoc = xpctxt->doc; + /* + * Get the expression of this predicate. + */ + exprOp = &ctxt->comp->steps[op->ch2]; + for (i = 0; i < set->nodeNr; i++) { + xmlXPathObjectPtr tmp; + + if (set->nodeTab[i] == NULL) + continue; + + contextNode = set->nodeTab[i]; + xpctxt->node = contextNode; + xpctxt->contextSize = contextSize; + xpctxt->proximityPosition = ++contextPos; + + /* + * Initialize the new set. + * Also set the xpath document in case things like + * key() evaluation are attempted on the predicate + */ + if ((contextNode->type != XML_NAMESPACE_DECL) && + (contextNode->doc != NULL)) + xpctxt->doc = contextNode->doc; + /* + * Evaluate the predicate expression with 1 context node + * at a time; this node is packaged into a node set; this + * node set is handed over to the evaluation mechanism. + */ + if (contextObj == NULL) + contextObj = xmlXPathCacheNewNodeSet(xpctxt, contextNode); + else { + if (xmlXPathNodeSetAddUnique(contextObj->nodesetval, + contextNode) < 0) { + ctxt->error = XPATH_MEMORY_ERROR; + goto evaluation_exit; + } + } + + frame = xmlXPathSetFrame(ctxt); + valuePush(ctxt, contextObj); + res = xmlXPathCompOpEvalToBoolean(ctxt, exprOp, 1); + tmp = valuePop(ctxt); + xmlXPathPopFrame(ctxt, frame); + + if ((ctxt->error != XPATH_EXPRESSION_OK) || (res == -1)) { + while (tmp != contextObj) { + /* + * Free up the result + * then pop off contextObj, which will be freed later + */ + xmlXPathReleaseObject(xpctxt, tmp); + tmp = valuePop(ctxt); + } + goto evaluation_error; + } + /* push the result back onto the stack */ + valuePush(ctxt, tmp); + + if (res) + pos++; + + if (res && (pos >= minPos) && (pos <= maxPos)) { + /* + * Fits in the requested range. + */ + newContextSize++; + if (minPos == maxPos) { + /* + * Only 1 node was requested. + */ + if (contextNode->type == XML_NAMESPACE_DECL) { + /* + * As always: take care of those nasty + * namespace nodes. + */ + set->nodeTab[i] = NULL; + } + xmlXPathNodeSetClear(set, hasNsNodes); + set->nodeNr = 1; + set->nodeTab[0] = contextNode; + goto evaluation_exit; + } + if (pos == maxPos) { + /* + * We are done. + */ + xmlXPathNodeSetClearFromPos(set, i +1, hasNsNodes); + goto evaluation_exit; + } + } else { + /* + * Remove the entry from the initial node set. + */ + set->nodeTab[i] = NULL; + if (contextNode->type == XML_NAMESPACE_DECL) + xmlXPathNodeSetFreeNs((xmlNsPtr) contextNode); + } + if (exprRes != NULL) { + xmlXPathReleaseObject(ctxt->context, exprRes); + exprRes = NULL; + } + if (ctxt->value == contextObj) { + /* + * Don't free the temporary XPath object holding the + * context node, in order to avoid massive recreation + * inside this loop. + */ + valuePop(ctxt); + xmlXPathNodeSetClear(contextObj->nodesetval, hasNsNodes); + } else { + /* + * The object was lost in the evaluation machinery. + * Can this happen? Maybe in case of internal-errors. + */ + contextObj = NULL; + } + } + goto evaluation_exit; + +evaluation_error: + xmlXPathNodeSetClear(set, hasNsNodes); + newContextSize = 0; + +evaluation_exit: + if (contextObj != NULL) { + if (ctxt->value == contextObj) + valuePop(ctxt); + xmlXPathReleaseObject(xpctxt, contextObj); + } + if (exprRes != NULL) + xmlXPathReleaseObject(ctxt->context, exprRes); + /* + * Reset/invalidate the context. + */ + xpctxt->node = oldContextNode; + xpctxt->doc = oldContextDoc; + xpctxt->contextSize = -1; + xpctxt->proximityPosition = -1; + return(newContextSize); + } + return(contextSize); +} + +static int +xmlXPathIsPositionalPredicate(xmlXPathParserContextPtr ctxt, + xmlXPathStepOpPtr op, + int *maxPos) +{ + + xmlXPathStepOpPtr exprOp; + + /* + * BIG NOTE: This is not intended for XPATH_OP_FILTER yet! + */ + + /* + * If not -1, then ch1 will point to: + * 1) For predicates (XPATH_OP_PREDICATE): + * - an inner predicate operator + * 2) For filters (XPATH_OP_FILTER): + * - an inner filter operater OR + * - an expression selecting the node set. + * E.g. "key('a', 'b')" or "(//foo | //bar)". + */ + if ((op->op != XPATH_OP_PREDICATE) && (op->op != XPATH_OP_FILTER)) + return(0); + + if (op->ch2 != -1) { + exprOp = &ctxt->comp->steps[op->ch2]; + } else + return(0); + + if ((exprOp != NULL) && + (exprOp->op == XPATH_OP_VALUE) && + (exprOp->value4 != NULL) && + (((xmlXPathObjectPtr) exprOp->value4)->type == XPATH_NUMBER)) + { + /* + * We have a "[n]" predicate here. + * TODO: Unfortunately this simplistic test here is not + * able to detect a position() predicate in compound + * expressions like "[@attr = 'a" and position() = 1], + * and even not the usage of position() in + * "[position() = 1]"; thus - obviously - a position-range, + * like it "[position() < 5]", is also not detected. + * Maybe we could rewrite the AST to ease the optimization. + */ + *maxPos = (int) ((xmlXPathObjectPtr) exprOp->value4)->floatval; + + if (((xmlXPathObjectPtr) exprOp->value4)->floatval == + (float) *maxPos) + { + return(1); + } + } + return(0); +} + +static int +xmlXPathNodeCollectAndTest(xmlXPathParserContextPtr ctxt, + xmlXPathStepOpPtr op, + xmlNodePtr * first, xmlNodePtr * last, + int toBool) +{ + +#define XP_TEST_HIT \ + if (hasAxisRange != 0) { \ + if (++pos == maxPos) { \ + if (addNode(seq, cur) < 0) \ + ctxt->error = XPATH_MEMORY_ERROR; \ + goto axis_range_end; } \ + } else { \ + if (addNode(seq, cur) < 0) \ + ctxt->error = XPATH_MEMORY_ERROR; \ + if (breakOnFirstHit) goto first_hit; } + +#define XP_TEST_HIT_NS \ + if (hasAxisRange != 0) { \ + if (++pos == maxPos) { \ + hasNsNodes = 1; \ + if (xmlXPathNodeSetAddNs(seq, xpctxt->node, (xmlNsPtr) cur) < 0) \ + ctxt->error = XPATH_MEMORY_ERROR; \ + goto axis_range_end; } \ + } else { \ + hasNsNodes = 1; \ + if (xmlXPathNodeSetAddNs(seq, xpctxt->node, (xmlNsPtr) cur) < 0) \ + ctxt->error = XPATH_MEMORY_ERROR; \ + if (breakOnFirstHit) goto first_hit; } + + xmlXPathAxisVal axis = (xmlXPathAxisVal) op->value; + xmlXPathTestVal test = (xmlXPathTestVal) op->value2; + xmlXPathTypeVal type = (xmlXPathTypeVal) op->value3; + const xmlChar *prefix = op->value4; + const xmlChar *name = op->value5; + const xmlChar *URI = NULL; + +#ifdef DEBUG_STEP + int nbMatches = 0, prevMatches = 0; +#endif + int total = 0, hasNsNodes = 0; + /* The popped object holding the context nodes */ + xmlXPathObjectPtr obj; + /* The set of context nodes for the node tests */ + xmlNodeSetPtr contextSeq; + int contextIdx; + xmlNodePtr contextNode; + /* The final resulting node set wrt to all context nodes */ + xmlNodeSetPtr outSeq; + /* + * The temporary resulting node set wrt 1 context node. + * Used to feed predicate evaluation. + */ + xmlNodeSetPtr seq; + xmlNodePtr cur; + /* First predicate operator */ + xmlXPathStepOpPtr predOp; + int maxPos; /* The requested position() (when a "[n]" predicate) */ + int hasPredicateRange, hasAxisRange, pos, size, newSize; + int breakOnFirstHit; + + xmlXPathTraversalFunction next = NULL; + int (*addNode) (xmlNodeSetPtr, xmlNodePtr); + xmlXPathNodeSetMergeFunction mergeAndClear; + xmlNodePtr oldContextNode; + xmlXPathContextPtr xpctxt = ctxt->context; + + + CHECK_TYPE0(XPATH_NODESET); + obj = valuePop(ctxt); + /* + * Setup namespaces. + */ + if (prefix != NULL) { + URI = xmlXPathNsLookup(xpctxt, prefix); + if (URI == NULL) { + xmlXPathReleaseObject(xpctxt, obj); + XP_ERROR0(XPATH_UNDEF_PREFIX_ERROR); + } + } + /* + * Setup axis. + * + * MAYBE FUTURE TODO: merging optimizations: + * - If the nodes to be traversed wrt to the initial nodes and + * the current axis cannot overlap, then we could avoid searching + * for duplicates during the merge. + * But the question is how/when to evaluate if they cannot overlap. + * Example: if we know that for two initial nodes, the one is + * not in the ancestor-or-self axis of the other, then we could safely + * avoid a duplicate-aware merge, if the axis to be traversed is e.g. + * the descendant-or-self axis. + */ + mergeAndClear = xmlXPathNodeSetMergeAndClear; + switch (axis) { + case AXIS_ANCESTOR: + first = NULL; + next = xmlXPathNextAncestor; + break; + case AXIS_ANCESTOR_OR_SELF: + first = NULL; + next = xmlXPathNextAncestorOrSelf; + break; + case AXIS_ATTRIBUTE: + first = NULL; + last = NULL; + next = xmlXPathNextAttribute; + mergeAndClear = xmlXPathNodeSetMergeAndClearNoDupls; + break; + case AXIS_CHILD: + last = NULL; + if (((test == NODE_TEST_NAME) || (test == NODE_TEST_ALL)) && + (type == NODE_TYPE_NODE)) + { + /* + * Optimization if an element node type is 'element'. + */ + next = xmlXPathNextChildElement; + } else + next = xmlXPathNextChild; + mergeAndClear = xmlXPathNodeSetMergeAndClearNoDupls; + break; + case AXIS_DESCENDANT: + last = NULL; + next = xmlXPathNextDescendant; + break; + case AXIS_DESCENDANT_OR_SELF: + last = NULL; + next = xmlXPathNextDescendantOrSelf; + break; + case AXIS_FOLLOWING: + last = NULL; + next = xmlXPathNextFollowing; + break; + case AXIS_FOLLOWING_SIBLING: + last = NULL; + next = xmlXPathNextFollowingSibling; + break; + case AXIS_NAMESPACE: + first = NULL; + last = NULL; + next = (xmlXPathTraversalFunction) xmlXPathNextNamespace; + mergeAndClear = xmlXPathNodeSetMergeAndClearNoDupls; + break; + case AXIS_PARENT: + first = NULL; + next = xmlXPathNextParent; + break; + case AXIS_PRECEDING: + first = NULL; + next = xmlXPathNextPrecedingInternal; + break; + case AXIS_PRECEDING_SIBLING: + first = NULL; + next = xmlXPathNextPrecedingSibling; + break; + case AXIS_SELF: + first = NULL; + last = NULL; + next = xmlXPathNextSelf; + mergeAndClear = xmlXPathNodeSetMergeAndClearNoDupls; + break; + } + +#ifdef DEBUG_STEP + xmlXPathDebugDumpStepAxis(op, + (obj->nodesetval != NULL) ? obj->nodesetval->nodeNr : 0); +#endif + + if (next == NULL) { + xmlXPathReleaseObject(xpctxt, obj); + return(0); + } + contextSeq = obj->nodesetval; + if ((contextSeq == NULL) || (contextSeq->nodeNr <= 0)) { + xmlXPathReleaseObject(xpctxt, obj); + valuePush(ctxt, xmlXPathCacheWrapNodeSet(xpctxt, NULL)); + return(0); + } + /* + * Predicate optimization --------------------------------------------- + * If this step has a last predicate, which contains a position(), + * then we'll optimize (although not exactly "position()", but only + * the short-hand form, i.e., "[n]". + * + * Example - expression "/foo[parent::bar][1]": + * + * COLLECT 'child' 'name' 'node' foo -- op (we are here) + * ROOT -- op->ch1 + * PREDICATE -- op->ch2 (predOp) + * PREDICATE -- predOp->ch1 = [parent::bar] + * SORT + * COLLECT 'parent' 'name' 'node' bar + * NODE + * ELEM Object is a number : 1 -- predOp->ch2 = [1] + * + */ + maxPos = 0; + predOp = NULL; + hasPredicateRange = 0; + hasAxisRange = 0; + if (op->ch2 != -1) { + /* + * There's at least one predicate. 16 == XPATH_OP_PREDICATE + */ + predOp = &ctxt->comp->steps[op->ch2]; + if (xmlXPathIsPositionalPredicate(ctxt, predOp, &maxPos)) { + if (predOp->ch1 != -1) { + /* + * Use the next inner predicate operator. + */ + predOp = &ctxt->comp->steps[predOp->ch1]; + hasPredicateRange = 1; + } else { + /* + * There's no other predicate than the [n] predicate. + */ + predOp = NULL; + hasAxisRange = 1; + } + } + } + breakOnFirstHit = ((toBool) && (predOp == NULL)) ? 1 : 0; + /* + * Axis traversal ----------------------------------------------------- + */ + /* + * 2.3 Node Tests + * - For the attribute axis, the principal node type is attribute. + * - For the namespace axis, the principal node type is namespace. + * - For other axes, the principal node type is element. + * + * A node test * is true for any node of the + * principal node type. For example, child::* will + * select all element children of the context node + */ + oldContextNode = xpctxt->node; + addNode = xmlXPathNodeSetAddUnique; + outSeq = NULL; + seq = NULL; + contextNode = NULL; + contextIdx = 0; + + + while (((contextIdx < contextSeq->nodeNr) || (contextNode != NULL)) && + (ctxt->error == XPATH_EXPRESSION_OK)) { + xpctxt->node = contextSeq->nodeTab[contextIdx++]; + + if (seq == NULL) { + seq = xmlXPathNodeSetCreate(NULL); + if (seq == NULL) { + total = 0; + goto error; + } + } + /* + * Traverse the axis and test the nodes. + */ + pos = 0; + cur = NULL; + hasNsNodes = 0; + do { + cur = next(ctxt, cur); + if (cur == NULL) + break; + + /* + * QUESTION TODO: What does the "first" and "last" stuff do? + */ + if ((first != NULL) && (*first != NULL)) { + if (*first == cur) + break; + if (((total % 256) == 0) && +#ifdef XP_OPTIMIZED_NON_ELEM_COMPARISON + (xmlXPathCmpNodesExt(*first, cur) >= 0)) +#else + (xmlXPathCmpNodes(*first, cur) >= 0)) +#endif + { + break; + } + } + if ((last != NULL) && (*last != NULL)) { + if (*last == cur) + break; + if (((total % 256) == 0) && +#ifdef XP_OPTIMIZED_NON_ELEM_COMPARISON + (xmlXPathCmpNodesExt(cur, *last) >= 0)) +#else + (xmlXPathCmpNodes(cur, *last) >= 0)) +#endif + { + break; + } + } + + total++; + +#ifdef DEBUG_STEP + xmlGenericError(xmlGenericErrorContext, " %s", cur->name); +#endif + + switch (test) { + case NODE_TEST_NONE: + total = 0; + STRANGE + goto error; + case NODE_TEST_TYPE: + /* + * TODO: Don't we need to use + * xmlXPathNodeSetAddNs() for namespace nodes here? + * Surprisingly, some c14n tests fail, if we do this. + */ + if (type == NODE_TYPE_NODE) { + switch (cur->type) { + case XML_DOCUMENT_NODE: + case XML_HTML_DOCUMENT_NODE: +#ifdef LIBXML_DOCB_ENABLED + case XML_DOCB_DOCUMENT_NODE: +#endif + case XML_ELEMENT_NODE: + case XML_ATTRIBUTE_NODE: + case XML_PI_NODE: + case XML_COMMENT_NODE: + case XML_CDATA_SECTION_NODE: + case XML_TEXT_NODE: + case XML_NAMESPACE_DECL: + XP_TEST_HIT + break; + default: + break; + } + } else if (cur->type == type) { + if (cur->type == XML_NAMESPACE_DECL) + XP_TEST_HIT_NS + else + XP_TEST_HIT + } else if ((type == NODE_TYPE_TEXT) && + (cur->type == XML_CDATA_SECTION_NODE)) + { + XP_TEST_HIT + } + break; + case NODE_TEST_PI: + if ((cur->type == XML_PI_NODE) && + ((name == NULL) || xmlStrEqual(name, cur->name))) + { + XP_TEST_HIT + } + break; + case NODE_TEST_ALL: + if (axis == AXIS_ATTRIBUTE) { + if (cur->type == XML_ATTRIBUTE_NODE) + { + XP_TEST_HIT + } + } else if (axis == AXIS_NAMESPACE) { + if (cur->type == XML_NAMESPACE_DECL) + { + XP_TEST_HIT_NS + } + } else { + if (cur->type == XML_ELEMENT_NODE) { + if (prefix == NULL) + { + XP_TEST_HIT + + } else if ((cur->ns != NULL) && + (xmlStrEqual(URI, cur->ns->href))) + { + XP_TEST_HIT + } + } + } + break; + case NODE_TEST_NS:{ + TODO; + break; + } + case NODE_TEST_NAME: + if (axis == AXIS_ATTRIBUTE) { + if (cur->type != XML_ATTRIBUTE_NODE) + break; + } else if (axis == AXIS_NAMESPACE) { + if (cur->type != XML_NAMESPACE_DECL) + break; + } else { + if (cur->type != XML_ELEMENT_NODE) + break; + } + switch (cur->type) { + case XML_ELEMENT_NODE: + if (xmlStrEqual(name, cur->name)) { + if (prefix == NULL) { + if (cur->ns == NULL) + { + XP_TEST_HIT + } + } else { + if ((cur->ns != NULL) && + (xmlStrEqual(URI, cur->ns->href))) + { + XP_TEST_HIT + } + } + } + break; + case XML_ATTRIBUTE_NODE:{ + xmlAttrPtr attr = (xmlAttrPtr) cur; + + if (xmlStrEqual(name, attr->name)) { + if (prefix == NULL) { + if ((attr->ns == NULL) || + (attr->ns->prefix == NULL)) + { + XP_TEST_HIT + } + } else { + if ((attr->ns != NULL) && + (xmlStrEqual(URI, + attr->ns->href))) + { + XP_TEST_HIT + } + } + } + break; + } + case XML_NAMESPACE_DECL: + if (cur->type == XML_NAMESPACE_DECL) { + xmlNsPtr ns = (xmlNsPtr) cur; + + if ((ns->prefix != NULL) && (name != NULL) + && (xmlStrEqual(ns->prefix, name))) + { + XP_TEST_HIT_NS + } + } + break; + default: + break; + } + break; + } /* switch(test) */ + } while ((cur != NULL) && (ctxt->error == XPATH_EXPRESSION_OK)); + + goto apply_predicates; + +axis_range_end: /* ----------------------------------------------------- */ + /* + * We have a "/foo[n]", and position() = n was reached. + * Note that we can have as well "/foo/::parent::foo[1]", so + * a duplicate-aware merge is still needed. + * Merge with the result. + */ + if (outSeq == NULL) { + outSeq = seq; + seq = NULL; + } else + outSeq = mergeAndClear(outSeq, seq, 0); + /* + * Break if only a true/false result was requested. + */ + if (toBool) + break; + continue; + +first_hit: /* ---------------------------------------------------------- */ + /* + * Break if only a true/false result was requested and + * no predicates existed and a node test succeeded. + */ + if (outSeq == NULL) { + outSeq = seq; + seq = NULL; + } else + outSeq = mergeAndClear(outSeq, seq, 0); + break; + +#ifdef DEBUG_STEP + if (seq != NULL) + nbMatches += seq->nodeNr; +#endif + +apply_predicates: /* --------------------------------------------------- */ + if (ctxt->error != XPATH_EXPRESSION_OK) + goto error; + + /* + * Apply predicates. + */ + if ((predOp != NULL) && (seq->nodeNr > 0)) { + /* + * E.g. when we have a "/foo[some expression][n]". + */ + /* + * QUESTION TODO: The old predicate evaluation took into + * account location-sets. + * (E.g. ctxt->value->type == XPATH_LOCATIONSET) + * Do we expect such a set here? + * All what I learned now from the evaluation semantics + * does not indicate that a location-set will be processed + * here, so this looks OK. + */ + /* + * Iterate over all predicates, starting with the outermost + * predicate. + * TODO: Problem: we cannot execute the inner predicates first + * since we cannot go back *up* the operator tree! + * Options we have: + * 1) Use of recursive functions (like is it currently done + * via xmlXPathCompOpEval()) + * 2) Add a predicate evaluation information stack to the + * context struct + * 3) Change the way the operators are linked; we need a + * "parent" field on xmlXPathStepOp + * + * For the moment, I'll try to solve this with a recursive + * function: xmlXPathCompOpEvalPredicate(). + */ + size = seq->nodeNr; + if (hasPredicateRange != 0) + newSize = xmlXPathCompOpEvalPositionalPredicate(ctxt, + predOp, seq, size, maxPos, maxPos, hasNsNodes); + else + newSize = xmlXPathCompOpEvalPredicate(ctxt, + predOp, seq, size, hasNsNodes); + + if (ctxt->error != XPATH_EXPRESSION_OK) { + total = 0; + goto error; + } + /* + * Add the filtered set of nodes to the result node set. + */ + if (newSize == 0) { + /* + * The predicates filtered all nodes out. + */ + xmlXPathNodeSetClear(seq, hasNsNodes); + } else if (seq->nodeNr > 0) { + /* + * Add to result set. + */ + if (outSeq == NULL) { + if (size != newSize) { + /* + * We need to merge and clear here, since + * the sequence will contained NULLed entries. + */ + outSeq = mergeAndClear(NULL, seq, 1); + } else { + outSeq = seq; + seq = NULL; + } + } else + outSeq = mergeAndClear(outSeq, seq, + (size != newSize) ? 1: 0); + /* + * Break if only a true/false result was requested. + */ + if (toBool) + break; + } + } else if (seq->nodeNr > 0) { + /* + * Add to result set. + */ + if (outSeq == NULL) { + outSeq = seq; + seq = NULL; + } else { + outSeq = mergeAndClear(outSeq, seq, 0); + } + } + } + +error: + if ((obj->boolval) && (obj->user != NULL)) { + /* + * QUESTION TODO: What does this do and why? + * TODO: Do we have to do this also for the "error" + * cleanup further down? + */ + ctxt->value->boolval = 1; + ctxt->value->user = obj->user; + obj->user = NULL; + obj->boolval = 0; + } + xmlXPathReleaseObject(xpctxt, obj); + + /* + * Ensure we return at least an emtpy set. + */ + if (outSeq == NULL) { + if ((seq != NULL) && (seq->nodeNr == 0)) + outSeq = seq; + else + outSeq = xmlXPathNodeSetCreate(NULL); + /* XXX what if xmlXPathNodeSetCreate returned NULL here? */ + } + if ((seq != NULL) && (seq != outSeq)) { + xmlXPathFreeNodeSet(seq); + } + /* + * Hand over the result. Better to push the set also in + * case of errors. + */ + valuePush(ctxt, xmlXPathCacheWrapNodeSet(xpctxt, outSeq)); + /* + * Reset the context node. + */ + xpctxt->node = oldContextNode; + +#ifdef DEBUG_STEP + xmlGenericError(xmlGenericErrorContext, + "\nExamined %d nodes, found %d nodes at that step\n", + total, nbMatches); +#endif + + return(total); +} + +static int +xmlXPathCompOpEvalFilterFirst(xmlXPathParserContextPtr ctxt, + xmlXPathStepOpPtr op, xmlNodePtr * first); + +/** + * xmlXPathCompOpEvalFirst: + * @ctxt: the XPath parser context with the compiled expression + * @op: an XPath compiled operation + * @first: the first elem found so far + * + * Evaluate the Precompiled XPath operation searching only the first + * element in document order + * + * Returns the number of examined objects. + */ +static int +xmlXPathCompOpEvalFirst(xmlXPathParserContextPtr ctxt, + xmlXPathStepOpPtr op, xmlNodePtr * first) +{ + int total = 0, cur; + xmlXPathCompExprPtr comp; + xmlXPathObjectPtr arg1, arg2; + + CHECK_ERROR0; + comp = ctxt->comp; + switch (op->op) { + case XPATH_OP_END: + return (0); + case XPATH_OP_UNION: + total = + xmlXPathCompOpEvalFirst(ctxt, &comp->steps[op->ch1], + first); + CHECK_ERROR0; + if ((ctxt->value != NULL) + && (ctxt->value->type == XPATH_NODESET) + && (ctxt->value->nodesetval != NULL) + && (ctxt->value->nodesetval->nodeNr >= 1)) { + /* + * limit tree traversing to first node in the result + */ + /* + * OPTIMIZE TODO: This implicitely sorts + * the result, even if not needed. E.g. if the argument + * of the count() function, no sorting is needed. + * OPTIMIZE TODO: How do we know if the node-list wasn't + * aready sorted? + */ + if (ctxt->value->nodesetval->nodeNr > 1) + xmlXPathNodeSetSort(ctxt->value->nodesetval); + *first = ctxt->value->nodesetval->nodeTab[0]; + } + cur = + xmlXPathCompOpEvalFirst(ctxt, &comp->steps[op->ch2], + first); + CHECK_ERROR0; + CHECK_TYPE0(XPATH_NODESET); + arg2 = valuePop(ctxt); + + CHECK_TYPE0(XPATH_NODESET); + arg1 = valuePop(ctxt); + + arg1->nodesetval = xmlXPathNodeSetMerge(arg1->nodesetval, + arg2->nodesetval); + valuePush(ctxt, arg1); + xmlXPathReleaseObject(ctxt->context, arg2); + /* optimizer */ + if (total > cur) + xmlXPathCompSwap(op); + return (total + cur); + case XPATH_OP_ROOT: + xmlXPathRoot(ctxt); + return (0); + case XPATH_OP_NODE: + if (op->ch1 != -1) + total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); + CHECK_ERROR0; + if (op->ch2 != -1) + total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); + CHECK_ERROR0; + valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, + ctxt->context->node)); + return (total); + case XPATH_OP_RESET: + if (op->ch1 != -1) + total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); + CHECK_ERROR0; + if (op->ch2 != -1) + total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); + CHECK_ERROR0; + ctxt->context->node = NULL; + return (total); + case XPATH_OP_COLLECT:{ + if (op->ch1 == -1) + return (total); + + total = xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); + CHECK_ERROR0; + + total += xmlXPathNodeCollectAndTest(ctxt, op, first, NULL, 0); + return (total); + } + case XPATH_OP_VALUE: + valuePush(ctxt, + xmlXPathCacheObjectCopy(ctxt->context, + (xmlXPathObjectPtr) op->value4)); + return (0); + case XPATH_OP_SORT: + if (op->ch1 != -1) + total += + xmlXPathCompOpEvalFirst(ctxt, &comp->steps[op->ch1], + first); + CHECK_ERROR0; + if ((ctxt->value != NULL) + && (ctxt->value->type == XPATH_NODESET) + && (ctxt->value->nodesetval != NULL) + && (ctxt->value->nodesetval->nodeNr > 1)) + xmlXPathNodeSetSort(ctxt->value->nodesetval); + return (total); +#ifdef XP_OPTIMIZED_FILTER_FIRST + case XPATH_OP_FILTER: + total += xmlXPathCompOpEvalFilterFirst(ctxt, op, first); + return (total); +#endif + default: + return (xmlXPathCompOpEval(ctxt, op)); + } +} + +/** + * xmlXPathCompOpEvalLast: + * @ctxt: the XPath parser context with the compiled expression + * @op: an XPath compiled operation + * @last: the last elem found so far + * + * Evaluate the Precompiled XPath operation searching only the last + * element in document order + * + * Returns the number of nodes traversed + */ +static int +xmlXPathCompOpEvalLast(xmlXPathParserContextPtr ctxt, xmlXPathStepOpPtr op, + xmlNodePtr * last) +{ + int total = 0, cur; + xmlXPathCompExprPtr comp; + xmlXPathObjectPtr arg1, arg2; + xmlNodePtr bak; + xmlDocPtr bakd; + int pp; + int cs; + + CHECK_ERROR0; + comp = ctxt->comp; + switch (op->op) { + case XPATH_OP_END: + return (0); + case XPATH_OP_UNION: + bakd = ctxt->context->doc; + bak = ctxt->context->node; + pp = ctxt->context->proximityPosition; + cs = ctxt->context->contextSize; + total = + xmlXPathCompOpEvalLast(ctxt, &comp->steps[op->ch1], last); + CHECK_ERROR0; + if ((ctxt->value != NULL) + && (ctxt->value->type == XPATH_NODESET) + && (ctxt->value->nodesetval != NULL) + && (ctxt->value->nodesetval->nodeNr >= 1)) { + /* + * limit tree traversing to first node in the result + */ + if (ctxt->value->nodesetval->nodeNr > 1) + xmlXPathNodeSetSort(ctxt->value->nodesetval); + *last = + ctxt->value->nodesetval->nodeTab[ctxt->value-> + nodesetval->nodeNr - + 1]; + } + ctxt->context->doc = bakd; + ctxt->context->node = bak; + ctxt->context->proximityPosition = pp; + ctxt->context->contextSize = cs; + cur = + xmlXPathCompOpEvalLast(ctxt, &comp->steps[op->ch2], last); + CHECK_ERROR0; + if ((ctxt->value != NULL) + && (ctxt->value->type == XPATH_NODESET) + && (ctxt->value->nodesetval != NULL) + && (ctxt->value->nodesetval->nodeNr >= 1)) { /* TODO: NOP ? */ + } + CHECK_TYPE0(XPATH_NODESET); + arg2 = valuePop(ctxt); + + CHECK_TYPE0(XPATH_NODESET); + arg1 = valuePop(ctxt); + + arg1->nodesetval = xmlXPathNodeSetMerge(arg1->nodesetval, + arg2->nodesetval); + valuePush(ctxt, arg1); + xmlXPathReleaseObject(ctxt->context, arg2); + /* optimizer */ + if (total > cur) + xmlXPathCompSwap(op); + return (total + cur); + case XPATH_OP_ROOT: + xmlXPathRoot(ctxt); + return (0); + case XPATH_OP_NODE: + if (op->ch1 != -1) + total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); + CHECK_ERROR0; + if (op->ch2 != -1) + total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); + CHECK_ERROR0; + valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, + ctxt->context->node)); + return (total); + case XPATH_OP_RESET: + if (op->ch1 != -1) + total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); + CHECK_ERROR0; + if (op->ch2 != -1) + total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); + CHECK_ERROR0; + ctxt->context->node = NULL; + return (total); + case XPATH_OP_COLLECT:{ + if (op->ch1 == -1) + return (0); + + total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); + CHECK_ERROR0; + + total += xmlXPathNodeCollectAndTest(ctxt, op, NULL, last, 0); + return (total); + } + case XPATH_OP_VALUE: + valuePush(ctxt, + xmlXPathCacheObjectCopy(ctxt->context, + (xmlXPathObjectPtr) op->value4)); + return (0); + case XPATH_OP_SORT: + if (op->ch1 != -1) + total += + xmlXPathCompOpEvalLast(ctxt, &comp->steps[op->ch1], + last); + CHECK_ERROR0; + if ((ctxt->value != NULL) + && (ctxt->value->type == XPATH_NODESET) + && (ctxt->value->nodesetval != NULL) + && (ctxt->value->nodesetval->nodeNr > 1)) + xmlXPathNodeSetSort(ctxt->value->nodesetval); + return (total); + default: + return (xmlXPathCompOpEval(ctxt, op)); + } +} + +#ifdef XP_OPTIMIZED_FILTER_FIRST +static int +xmlXPathCompOpEvalFilterFirst(xmlXPathParserContextPtr ctxt, + xmlXPathStepOpPtr op, xmlNodePtr * first) +{ + int total = 0; + xmlXPathCompExprPtr comp; + xmlXPathObjectPtr res; + xmlXPathObjectPtr obj; + xmlNodeSetPtr oldset; + xmlNodePtr oldnode; + xmlDocPtr oldDoc; + int i; + + CHECK_ERROR0; + comp = ctxt->comp; + /* + * Optimization for ()[last()] selection i.e. the last elem + */ + if ((op->ch1 != -1) && (op->ch2 != -1) && + (comp->steps[op->ch1].op == XPATH_OP_SORT) && + (comp->steps[op->ch2].op == XPATH_OP_SORT)) { + int f = comp->steps[op->ch2].ch1; + + if ((f != -1) && + (comp->steps[f].op == XPATH_OP_FUNCTION) && + (comp->steps[f].value5 == NULL) && + (comp->steps[f].value == 0) && + (comp->steps[f].value4 != NULL) && + (xmlStrEqual + (comp->steps[f].value4, BAD_CAST "last"))) { + xmlNodePtr last = NULL; + + total += + xmlXPathCompOpEvalLast(ctxt, + &comp->steps[op->ch1], + &last); + CHECK_ERROR0; + /* + * The nodeset should be in document order, + * Keep only the last value + */ + if ((ctxt->value != NULL) && + (ctxt->value->type == XPATH_NODESET) && + (ctxt->value->nodesetval != NULL) && + (ctxt->value->nodesetval->nodeTab != NULL) && + (ctxt->value->nodesetval->nodeNr > 1)) { + ctxt->value->nodesetval->nodeTab[0] = + ctxt->value->nodesetval->nodeTab[ctxt-> + value-> + nodesetval-> + nodeNr - + 1]; + ctxt->value->nodesetval->nodeNr = 1; + *first = *(ctxt->value->nodesetval->nodeTab); + } + return (total); + } + } + + if (op->ch1 != -1) + total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); + CHECK_ERROR0; + if (op->ch2 == -1) + return (total); + if (ctxt->value == NULL) + return (total); + +#ifdef LIBXML_XPTR_ENABLED + oldnode = ctxt->context->node; + /* + * Hum are we filtering the result of an XPointer expression + */ + if (ctxt->value->type == XPATH_LOCATIONSET) { + xmlXPathObjectPtr tmp = NULL; + xmlLocationSetPtr newlocset = NULL; + xmlLocationSetPtr oldlocset; + + /* + * Extract the old locset, and then evaluate the result of the + * expression for all the element in the locset. use it to grow + * up a new locset. + */ + CHECK_TYPE0(XPATH_LOCATIONSET); + obj = valuePop(ctxt); + oldlocset = obj->user; + ctxt->context->node = NULL; + + if ((oldlocset == NULL) || (oldlocset->locNr == 0)) { + ctxt->context->contextSize = 0; + ctxt->context->proximityPosition = 0; + if (op->ch2 != -1) + total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); + res = valuePop(ctxt); + if (res != NULL) { + xmlXPathReleaseObject(ctxt->context, res); + } + valuePush(ctxt, obj); + CHECK_ERROR0; + return (total); + } + newlocset = xmlXPtrLocationSetCreate(NULL); + + for (i = 0; i < oldlocset->locNr; i++) { + /* + * Run the evaluation with a node list made of a + * single item in the nodelocset. + */ + ctxt->context->node = oldlocset->locTab[i]->user; + ctxt->context->contextSize = oldlocset->locNr; + ctxt->context->proximityPosition = i + 1; + if (tmp == NULL) { + tmp = xmlXPathCacheNewNodeSet(ctxt->context, + ctxt->context->node); + } else { + if (xmlXPathNodeSetAddUnique(tmp->nodesetval, + ctxt->context->node) < 0) { + ctxt->error = XPATH_MEMORY_ERROR; + } + } + valuePush(ctxt, tmp); + if (op->ch2 != -1) + total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); + if (ctxt->error != XPATH_EXPRESSION_OK) { + xmlXPathFreeObject(obj); + return(0); + } + /* + * The result of the evaluation need to be tested to + * decided whether the filter succeeded or not + */ + res = valuePop(ctxt); + if (xmlXPathEvaluatePredicateResult(ctxt, res)) { + xmlXPtrLocationSetAdd(newlocset, + xmlXPathCacheObjectCopy(ctxt->context, + oldlocset->locTab[i])); + } + /* + * Cleanup + */ + if (res != NULL) { + xmlXPathReleaseObject(ctxt->context, res); + } + if (ctxt->value == tmp) { + valuePop(ctxt); + xmlXPathNodeSetClear(tmp->nodesetval, 1); + /* + * REVISIT TODO: Don't create a temporary nodeset + * for everly iteration. + */ + /* OLD: xmlXPathFreeObject(res); */ + } else + tmp = NULL; + ctxt->context->node = NULL; + /* + * Only put the first node in the result, then leave. + */ + if (newlocset->locNr > 0) { + *first = (xmlNodePtr) oldlocset->locTab[i]->user; + break; + } + } + if (tmp != NULL) { + xmlXPathReleaseObject(ctxt->context, tmp); + } + /* + * The result is used as the new evaluation locset. + */ + xmlXPathReleaseObject(ctxt->context, obj); + ctxt->context->node = NULL; + ctxt->context->contextSize = -1; + ctxt->context->proximityPosition = -1; + valuePush(ctxt, xmlXPtrWrapLocationSet(newlocset)); + ctxt->context->node = oldnode; + return (total); + } +#endif /* LIBXML_XPTR_ENABLED */ + + /* + * Extract the old set, and then evaluate the result of the + * expression for all the element in the set. use it to grow + * up a new set. + */ + CHECK_TYPE0(XPATH_NODESET); + obj = valuePop(ctxt); + oldset = obj->nodesetval; + + oldnode = ctxt->context->node; + oldDoc = ctxt->context->doc; + ctxt->context->node = NULL; + + if ((oldset == NULL) || (oldset->nodeNr == 0)) { + ctxt->context->contextSize = 0; + ctxt->context->proximityPosition = 0; + /* QUESTION TODO: Why was this code commented out? + if (op->ch2 != -1) + total += + xmlXPathCompOpEval(ctxt, + &comp->steps[op->ch2]); + CHECK_ERROR0; + res = valuePop(ctxt); + if (res != NULL) + xmlXPathFreeObject(res); + */ + valuePush(ctxt, obj); + ctxt->context->node = oldnode; + CHECK_ERROR0; + } else { + xmlNodeSetPtr newset; + xmlXPathObjectPtr tmp = NULL; + /* + * Initialize the new set. + * Also set the xpath document in case things like + * key() evaluation are attempted on the predicate + */ + newset = xmlXPathNodeSetCreate(NULL); + /* XXX what if xmlXPathNodeSetCreate returned NULL? */ + + for (i = 0; i < oldset->nodeNr; i++) { + /* + * Run the evaluation with a node list made of + * a single item in the nodeset. + */ + ctxt->context->node = oldset->nodeTab[i]; + if ((oldset->nodeTab[i]->type != XML_NAMESPACE_DECL) && + (oldset->nodeTab[i]->doc != NULL)) + ctxt->context->doc = oldset->nodeTab[i]->doc; + if (tmp == NULL) { + tmp = xmlXPathCacheNewNodeSet(ctxt->context, + ctxt->context->node); + } else { + if (xmlXPathNodeSetAddUnique(tmp->nodesetval, + ctxt->context->node) < 0) { + ctxt->error = XPATH_MEMORY_ERROR; + } + } + valuePush(ctxt, tmp); + ctxt->context->contextSize = oldset->nodeNr; + ctxt->context->proximityPosition = i + 1; + if (op->ch2 != -1) + total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); + if (ctxt->error != XPATH_EXPRESSION_OK) { + xmlXPathFreeNodeSet(newset); + xmlXPathFreeObject(obj); + return(0); + } + /* + * The result of the evaluation needs to be tested to + * decide whether the filter succeeded or not + */ + res = valuePop(ctxt); + if (xmlXPathEvaluatePredicateResult(ctxt, res)) { + if (xmlXPathNodeSetAdd(newset, oldset->nodeTab[i]) < 0) + ctxt->error = XPATH_MEMORY_ERROR; + } + /* + * Cleanup + */ + if (res != NULL) { + xmlXPathReleaseObject(ctxt->context, res); + } + if (ctxt->value == tmp) { + valuePop(ctxt); + /* + * Don't free the temporary nodeset + * in order to avoid massive recreation inside this + * loop. + */ + xmlXPathNodeSetClear(tmp->nodesetval, 1); + } else + tmp = NULL; + ctxt->context->node = NULL; + /* + * Only put the first node in the result, then leave. + */ + if (newset->nodeNr > 0) { + *first = *(newset->nodeTab); + break; + } + } + if (tmp != NULL) { + xmlXPathReleaseObject(ctxt->context, tmp); + } + /* + * The result is used as the new evaluation set. + */ + xmlXPathReleaseObject(ctxt->context, obj); + ctxt->context->node = NULL; + ctxt->context->contextSize = -1; + ctxt->context->proximityPosition = -1; + /* may want to move this past the '}' later */ + ctxt->context->doc = oldDoc; + valuePush(ctxt, xmlXPathCacheWrapNodeSet(ctxt->context, newset)); + } + ctxt->context->node = oldnode; + return(total); +} +#endif /* XP_OPTIMIZED_FILTER_FIRST */ + +/** + * xmlXPathCompOpEval: + * @ctxt: the XPath parser context with the compiled expression + * @op: an XPath compiled operation + * + * Evaluate the Precompiled XPath operation + * Returns the number of nodes traversed + */ +static int +xmlXPathCompOpEval(xmlXPathParserContextPtr ctxt, xmlXPathStepOpPtr op) +{ + int total = 0; + int equal, ret; + xmlXPathCompExprPtr comp; + xmlXPathObjectPtr arg1, arg2; + xmlNodePtr bak; + xmlDocPtr bakd; + int pp; + int cs; + + CHECK_ERROR0; + comp = ctxt->comp; + switch (op->op) { + case XPATH_OP_END: + return (0); + case XPATH_OP_AND: + bakd = ctxt->context->doc; + bak = ctxt->context->node; + pp = ctxt->context->proximityPosition; + cs = ctxt->context->contextSize; + total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); + CHECK_ERROR0; + xmlXPathBooleanFunction(ctxt, 1); + if ((ctxt->value == NULL) || (ctxt->value->boolval == 0)) + return (total); + arg2 = valuePop(ctxt); + ctxt->context->doc = bakd; + ctxt->context->node = bak; + ctxt->context->proximityPosition = pp; + ctxt->context->contextSize = cs; + total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); + if (ctxt->error) { + xmlXPathFreeObject(arg2); + return(0); + } + xmlXPathBooleanFunction(ctxt, 1); + arg1 = valuePop(ctxt); + arg1->boolval &= arg2->boolval; + valuePush(ctxt, arg1); + xmlXPathReleaseObject(ctxt->context, arg2); + return (total); + case XPATH_OP_OR: + bakd = ctxt->context->doc; + bak = ctxt->context->node; + pp = ctxt->context->proximityPosition; + cs = ctxt->context->contextSize; + total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); + CHECK_ERROR0; + xmlXPathBooleanFunction(ctxt, 1); + if ((ctxt->value == NULL) || (ctxt->value->boolval == 1)) + return (total); + arg2 = valuePop(ctxt); + ctxt->context->doc = bakd; + ctxt->context->node = bak; + ctxt->context->proximityPosition = pp; + ctxt->context->contextSize = cs; + total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); + if (ctxt->error) { + xmlXPathFreeObject(arg2); + return(0); + } + xmlXPathBooleanFunction(ctxt, 1); + arg1 = valuePop(ctxt); + arg1->boolval |= arg2->boolval; + valuePush(ctxt, arg1); + xmlXPathReleaseObject(ctxt->context, arg2); + return (total); + case XPATH_OP_EQUAL: + bakd = ctxt->context->doc; + bak = ctxt->context->node; + pp = ctxt->context->proximityPosition; + cs = ctxt->context->contextSize; + total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); + CHECK_ERROR0; + ctxt->context->doc = bakd; + ctxt->context->node = bak; + ctxt->context->proximityPosition = pp; + ctxt->context->contextSize = cs; + total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); + CHECK_ERROR0; + if (op->value) + equal = xmlXPathEqualValues(ctxt); + else + equal = xmlXPathNotEqualValues(ctxt); + valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, equal)); + return (total); + case XPATH_OP_CMP: + bakd = ctxt->context->doc; + bak = ctxt->context->node; + pp = ctxt->context->proximityPosition; + cs = ctxt->context->contextSize; + total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); + CHECK_ERROR0; + ctxt->context->doc = bakd; + ctxt->context->node = bak; + ctxt->context->proximityPosition = pp; + ctxt->context->contextSize = cs; + total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); + CHECK_ERROR0; + ret = xmlXPathCompareValues(ctxt, op->value, op->value2); + valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, ret)); + return (total); + case XPATH_OP_PLUS: + bakd = ctxt->context->doc; + bak = ctxt->context->node; + pp = ctxt->context->proximityPosition; + cs = ctxt->context->contextSize; + total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); + CHECK_ERROR0; + if (op->ch2 != -1) { + ctxt->context->doc = bakd; + ctxt->context->node = bak; + ctxt->context->proximityPosition = pp; + ctxt->context->contextSize = cs; + total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); + } + CHECK_ERROR0; + if (op->value == 0) + xmlXPathSubValues(ctxt); + else if (op->value == 1) + xmlXPathAddValues(ctxt); + else if (op->value == 2) + xmlXPathValueFlipSign(ctxt); + else if (op->value == 3) { + CAST_TO_NUMBER; + CHECK_TYPE0(XPATH_NUMBER); + } + return (total); + case XPATH_OP_MULT: + bakd = ctxt->context->doc; + bak = ctxt->context->node; + pp = ctxt->context->proximityPosition; + cs = ctxt->context->contextSize; + total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); + CHECK_ERROR0; + ctxt->context->doc = bakd; + ctxt->context->node = bak; + ctxt->context->proximityPosition = pp; + ctxt->context->contextSize = cs; + total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); + CHECK_ERROR0; + if (op->value == 0) + xmlXPathMultValues(ctxt); + else if (op->value == 1) + xmlXPathDivValues(ctxt); + else if (op->value == 2) + xmlXPathModValues(ctxt); + return (total); + case XPATH_OP_UNION: + bakd = ctxt->context->doc; + bak = ctxt->context->node; + pp = ctxt->context->proximityPosition; + cs = ctxt->context->contextSize; + total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); + CHECK_ERROR0; + ctxt->context->doc = bakd; + ctxt->context->node = bak; + ctxt->context->proximityPosition = pp; + ctxt->context->contextSize = cs; + total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); + CHECK_ERROR0; + CHECK_TYPE0(XPATH_NODESET); + arg2 = valuePop(ctxt); + + CHECK_TYPE0(XPATH_NODESET); + arg1 = valuePop(ctxt); + + if ((arg1->nodesetval == NULL) || + ((arg2->nodesetval != NULL) && + (arg2->nodesetval->nodeNr != 0))) + { + arg1->nodesetval = xmlXPathNodeSetMerge(arg1->nodesetval, + arg2->nodesetval); + } + + valuePush(ctxt, arg1); + xmlXPathReleaseObject(ctxt->context, arg2); + return (total); + case XPATH_OP_ROOT: + xmlXPathRoot(ctxt); + return (total); + case XPATH_OP_NODE: + if (op->ch1 != -1) + total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); + CHECK_ERROR0; + if (op->ch2 != -1) + total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); + CHECK_ERROR0; + valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context, + ctxt->context->node)); + return (total); + case XPATH_OP_RESET: + if (op->ch1 != -1) + total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); + CHECK_ERROR0; + if (op->ch2 != -1) + total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); + CHECK_ERROR0; + ctxt->context->node = NULL; + return (total); + case XPATH_OP_COLLECT:{ + if (op->ch1 == -1) + return (total); + + total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); + CHECK_ERROR0; + + total += xmlXPathNodeCollectAndTest(ctxt, op, NULL, NULL, 0); + return (total); + } + case XPATH_OP_VALUE: + valuePush(ctxt, + xmlXPathCacheObjectCopy(ctxt->context, + (xmlXPathObjectPtr) op->value4)); + return (total); + case XPATH_OP_VARIABLE:{ + xmlXPathObjectPtr val; + + if (op->ch1 != -1) + total += + xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); + if (op->value5 == NULL) { + val = xmlXPathVariableLookup(ctxt->context, op->value4); + if (val == NULL) { + ctxt->error = XPATH_UNDEF_VARIABLE_ERROR; + return(0); + } + valuePush(ctxt, val); + } else { + const xmlChar *URI; + + URI = xmlXPathNsLookup(ctxt->context, op->value5); + if (URI == NULL) { + xmlGenericError(xmlGenericErrorContext, + "xmlXPathCompOpEval: variable %s bound to undefined prefix %s\n", + (char *) op->value4, (char *)op->value5); + ctxt->error = XPATH_UNDEF_PREFIX_ERROR; + return (total); + } + val = xmlXPathVariableLookupNS(ctxt->context, + op->value4, URI); + if (val == NULL) { + ctxt->error = XPATH_UNDEF_VARIABLE_ERROR; + return(0); + } + valuePush(ctxt, val); + } + return (total); + } + case XPATH_OP_FUNCTION:{ + xmlXPathFunction func; + const xmlChar *oldFunc, *oldFuncURI; + int i; + int frame; + + frame = xmlXPathSetFrame(ctxt); + if (op->ch1 != -1) + total += + xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); + if (ctxt->valueNr < op->value) { + xmlGenericError(xmlGenericErrorContext, + "xmlXPathCompOpEval: parameter error\n"); + ctxt->error = XPATH_INVALID_OPERAND; + xmlXPathPopFrame(ctxt, frame); + return (total); + } + for (i = 0; i < op->value; i++) { + if (ctxt->valueTab[(ctxt->valueNr - 1) - i] == NULL) { + xmlGenericError(xmlGenericErrorContext, + "xmlXPathCompOpEval: parameter error\n"); + ctxt->error = XPATH_INVALID_OPERAND; + xmlXPathPopFrame(ctxt, frame); + return (total); + } + } + if (op->cache != NULL) + XML_CAST_FPTR(func) = op->cache; + else { + const xmlChar *URI = NULL; + + if (op->value5 == NULL) + func = + xmlXPathFunctionLookup(ctxt->context, + op->value4); + else { + URI = xmlXPathNsLookup(ctxt->context, op->value5); + if (URI == NULL) { + xmlGenericError(xmlGenericErrorContext, + "xmlXPathCompOpEval: function %s bound to undefined prefix %s\n", + (char *)op->value4, (char *)op->value5); + xmlXPathPopFrame(ctxt, frame); + ctxt->error = XPATH_UNDEF_PREFIX_ERROR; + return (total); + } + func = xmlXPathFunctionLookupNS(ctxt->context, + op->value4, URI); + } + if (func == NULL) { + xmlGenericError(xmlGenericErrorContext, + "xmlXPathCompOpEval: function %s not found\n", + (char *)op->value4); + XP_ERROR0(XPATH_UNKNOWN_FUNC_ERROR); + } + op->cache = XML_CAST_FPTR(func); + op->cacheURI = (void *) URI; + } + oldFunc = ctxt->context->function; + oldFuncURI = ctxt->context->functionURI; + ctxt->context->function = op->value4; + ctxt->context->functionURI = op->cacheURI; + func(ctxt, op->value); + ctxt->context->function = oldFunc; + ctxt->context->functionURI = oldFuncURI; + xmlXPathPopFrame(ctxt, frame); + return (total); + } + case XPATH_OP_ARG: + bakd = ctxt->context->doc; + bak = ctxt->context->node; + pp = ctxt->context->proximityPosition; + cs = ctxt->context->contextSize; + if (op->ch1 != -1) + total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); + ctxt->context->contextSize = cs; + ctxt->context->proximityPosition = pp; + ctxt->context->node = bak; + ctxt->context->doc = bakd; + CHECK_ERROR0; + if (op->ch2 != -1) { + total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); + ctxt->context->doc = bakd; + ctxt->context->node = bak; + CHECK_ERROR0; + } + return (total); + case XPATH_OP_PREDICATE: + case XPATH_OP_FILTER:{ + xmlXPathObjectPtr res; + xmlXPathObjectPtr obj, tmp; + xmlNodeSetPtr newset = NULL; + xmlNodeSetPtr oldset; + xmlNodePtr oldnode; + xmlDocPtr oldDoc; + int i; + + /* + * Optimization for ()[1] selection i.e. the first elem + */ + if ((op->ch1 != -1) && (op->ch2 != -1) && +#ifdef XP_OPTIMIZED_FILTER_FIRST + /* + * FILTER TODO: Can we assume that the inner processing + * will result in an ordered list if we have an + * XPATH_OP_FILTER? + * What about an additional field or flag on + * xmlXPathObject like @sorted ? This way we wouln'd need + * to assume anything, so it would be more robust and + * easier to optimize. + */ + ((comp->steps[op->ch1].op == XPATH_OP_SORT) || /* 18 */ + (comp->steps[op->ch1].op == XPATH_OP_FILTER)) && /* 17 */ +#else + (comp->steps[op->ch1].op == XPATH_OP_SORT) && +#endif + (comp->steps[op->ch2].op == XPATH_OP_VALUE)) { /* 12 */ + xmlXPathObjectPtr val; + + val = comp->steps[op->ch2].value4; + if ((val != NULL) && (val->type == XPATH_NUMBER) && + (val->floatval == 1.0)) { + xmlNodePtr first = NULL; + + total += + xmlXPathCompOpEvalFirst(ctxt, + &comp->steps[op->ch1], + &first); + CHECK_ERROR0; + /* + * The nodeset should be in document order, + * Keep only the first value + */ + if ((ctxt->value != NULL) && + (ctxt->value->type == XPATH_NODESET) && + (ctxt->value->nodesetval != NULL) && + (ctxt->value->nodesetval->nodeNr > 1)) + ctxt->value->nodesetval->nodeNr = 1; + return (total); + } + } + /* + * Optimization for ()[last()] selection i.e. the last elem + */ + if ((op->ch1 != -1) && (op->ch2 != -1) && + (comp->steps[op->ch1].op == XPATH_OP_SORT) && + (comp->steps[op->ch2].op == XPATH_OP_SORT)) { + int f = comp->steps[op->ch2].ch1; + + if ((f != -1) && + (comp->steps[f].op == XPATH_OP_FUNCTION) && + (comp->steps[f].value5 == NULL) && + (comp->steps[f].value == 0) && + (comp->steps[f].value4 != NULL) && + (xmlStrEqual + (comp->steps[f].value4, BAD_CAST "last"))) { + xmlNodePtr last = NULL; + + total += + xmlXPathCompOpEvalLast(ctxt, + &comp->steps[op->ch1], + &last); + CHECK_ERROR0; + /* + * The nodeset should be in document order, + * Keep only the last value + */ + if ((ctxt->value != NULL) && + (ctxt->value->type == XPATH_NODESET) && + (ctxt->value->nodesetval != NULL) && + (ctxt->value->nodesetval->nodeTab != NULL) && + (ctxt->value->nodesetval->nodeNr > 1)) { + ctxt->value->nodesetval->nodeTab[0] = + ctxt->value->nodesetval->nodeTab[ctxt-> + value-> + nodesetval-> + nodeNr - + 1]; + ctxt->value->nodesetval->nodeNr = 1; + } + return (total); + } + } + /* + * Process inner predicates first. + * Example "index[parent::book][1]": + * ... + * PREDICATE <-- we are here "[1]" + * PREDICATE <-- process "[parent::book]" first + * SORT + * COLLECT 'parent' 'name' 'node' book + * NODE + * ELEM Object is a number : 1 + */ + if (op->ch1 != -1) + total += + xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); + CHECK_ERROR0; + if (op->ch2 == -1) + return (total); + if (ctxt->value == NULL) + return (total); + + oldnode = ctxt->context->node; + +#ifdef LIBXML_XPTR_ENABLED + /* + * Hum are we filtering the result of an XPointer expression + */ + if (ctxt->value->type == XPATH_LOCATIONSET) { + xmlLocationSetPtr newlocset = NULL; + xmlLocationSetPtr oldlocset; + + /* + * Extract the old locset, and then evaluate the result of the + * expression for all the element in the locset. use it to grow + * up a new locset. + */ + CHECK_TYPE0(XPATH_LOCATIONSET); + obj = valuePop(ctxt); + oldlocset = obj->user; + ctxt->context->node = NULL; + + if ((oldlocset == NULL) || (oldlocset->locNr == 0)) { + ctxt->context->contextSize = 0; + ctxt->context->proximityPosition = 0; + if (op->ch2 != -1) + total += + xmlXPathCompOpEval(ctxt, + &comp->steps[op->ch2]); + res = valuePop(ctxt); + if (res != NULL) { + xmlXPathReleaseObject(ctxt->context, res); + } + valuePush(ctxt, obj); + CHECK_ERROR0; + return (total); + } + newlocset = xmlXPtrLocationSetCreate(NULL); + + for (i = 0; i < oldlocset->locNr; i++) { + /* + * Run the evaluation with a node list made of a + * single item in the nodelocset. + */ + ctxt->context->node = oldlocset->locTab[i]->user; + ctxt->context->contextSize = oldlocset->locNr; + ctxt->context->proximityPosition = i + 1; + tmp = xmlXPathCacheNewNodeSet(ctxt->context, + ctxt->context->node); + valuePush(ctxt, tmp); + + if (op->ch2 != -1) + total += + xmlXPathCompOpEval(ctxt, + &comp->steps[op->ch2]); + if (ctxt->error != XPATH_EXPRESSION_OK) { + xmlXPathFreeObject(obj); + return(0); + } + + /* + * The result of the evaluation need to be tested to + * decided whether the filter succeeded or not + */ + res = valuePop(ctxt); + if (xmlXPathEvaluatePredicateResult(ctxt, res)) { + xmlXPtrLocationSetAdd(newlocset, + xmlXPathObjectCopy + (oldlocset->locTab[i])); + } + + /* + * Cleanup + */ + if (res != NULL) { + xmlXPathReleaseObject(ctxt->context, res); + } + if (ctxt->value == tmp) { + res = valuePop(ctxt); + xmlXPathReleaseObject(ctxt->context, res); + } + + ctxt->context->node = NULL; + } + + /* + * The result is used as the new evaluation locset. + */ + xmlXPathReleaseObject(ctxt->context, obj); + ctxt->context->node = NULL; + ctxt->context->contextSize = -1; + ctxt->context->proximityPosition = -1; + valuePush(ctxt, xmlXPtrWrapLocationSet(newlocset)); + ctxt->context->node = oldnode; + return (total); + } +#endif /* LIBXML_XPTR_ENABLED */ + + /* + * Extract the old set, and then evaluate the result of the + * expression for all the element in the set. use it to grow + * up a new set. + */ + CHECK_TYPE0(XPATH_NODESET); + obj = valuePop(ctxt); + oldset = obj->nodesetval; + + oldnode = ctxt->context->node; + oldDoc = ctxt->context->doc; + ctxt->context->node = NULL; + + if ((oldset == NULL) || (oldset->nodeNr == 0)) { + ctxt->context->contextSize = 0; + ctxt->context->proximityPosition = 0; +/* + if (op->ch2 != -1) + total += + xmlXPathCompOpEval(ctxt, + &comp->steps[op->ch2]); + CHECK_ERROR0; + res = valuePop(ctxt); + if (res != NULL) + xmlXPathFreeObject(res); +*/ + valuePush(ctxt, obj); + ctxt->context->node = oldnode; + CHECK_ERROR0; + } else { + tmp = NULL; + /* + * Initialize the new set. + * Also set the xpath document in case things like + * key() evaluation are attempted on the predicate + */ + newset = xmlXPathNodeSetCreate(NULL); + /* + * SPEC XPath 1.0: + * "For each node in the node-set to be filtered, the + * PredicateExpr is evaluated with that node as the + * context node, with the number of nodes in the + * node-set as the context size, and with the proximity + * position of the node in the node-set with respect to + * the axis as the context position;" + * @oldset is the node-set" to be filtered. + * + * SPEC XPath 1.0: + * "only predicates change the context position and + * context size (see [2.4 Predicates])." + * Example: + * node-set context pos + * nA 1 + * nB 2 + * nC 3 + * After applying predicate [position() > 1] : + * node-set context pos + * nB 1 + * nC 2 + * + * removed the first node in the node-set, then + * the context position of the + */ + for (i = 0; i < oldset->nodeNr; i++) { + /* + * Run the evaluation with a node list made of + * a single item in the nodeset. + */ + ctxt->context->node = oldset->nodeTab[i]; + if ((oldset->nodeTab[i]->type != XML_NAMESPACE_DECL) && + (oldset->nodeTab[i]->doc != NULL)) + ctxt->context->doc = oldset->nodeTab[i]->doc; + if (tmp == NULL) { + tmp = xmlXPathCacheNewNodeSet(ctxt->context, + ctxt->context->node); + } else { + if (xmlXPathNodeSetAddUnique(tmp->nodesetval, + ctxt->context->node) < 0) { + ctxt->error = XPATH_MEMORY_ERROR; + } + } + valuePush(ctxt, tmp); + ctxt->context->contextSize = oldset->nodeNr; + ctxt->context->proximityPosition = i + 1; + /* + * Evaluate the predicate against the context node. + * Can/should we optimize position() predicates + * here (e.g. "[1]")? + */ + if (op->ch2 != -1) + total += + xmlXPathCompOpEval(ctxt, + &comp->steps[op->ch2]); + if (ctxt->error != XPATH_EXPRESSION_OK) { + xmlXPathFreeNodeSet(newset); + xmlXPathFreeObject(obj); + return(0); + } + + /* + * The result of the evaluation needs to be tested to + * decide whether the filter succeeded or not + */ + /* + * OPTIMIZE TODO: Can we use + * xmlXPathNodeSetAdd*Unique()* instead? + */ + res = valuePop(ctxt); + if (xmlXPathEvaluatePredicateResult(ctxt, res)) { + if (xmlXPathNodeSetAdd(newset, oldset->nodeTab[i]) + < 0) + ctxt->error = XPATH_MEMORY_ERROR; + } + + /* + * Cleanup + */ + if (res != NULL) { + xmlXPathReleaseObject(ctxt->context, res); + } + if (ctxt->value == tmp) { + valuePop(ctxt); + xmlXPathNodeSetClear(tmp->nodesetval, 1); + /* + * Don't free the temporary nodeset + * in order to avoid massive recreation inside this + * loop. + */ + } else + tmp = NULL; + ctxt->context->node = NULL; + } + if (tmp != NULL) + xmlXPathReleaseObject(ctxt->context, tmp); + /* + * The result is used as the new evaluation set. + */ + xmlXPathReleaseObject(ctxt->context, obj); + ctxt->context->node = NULL; + ctxt->context->contextSize = -1; + ctxt->context->proximityPosition = -1; + /* may want to move this past the '}' later */ + ctxt->context->doc = oldDoc; + valuePush(ctxt, + xmlXPathCacheWrapNodeSet(ctxt->context, newset)); + } + ctxt->context->node = oldnode; + return (total); + } + case XPATH_OP_SORT: + if (op->ch1 != -1) + total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); + CHECK_ERROR0; + if ((ctxt->value != NULL) && + (ctxt->value->type == XPATH_NODESET) && + (ctxt->value->nodesetval != NULL) && + (ctxt->value->nodesetval->nodeNr > 1)) + { + xmlXPathNodeSetSort(ctxt->value->nodesetval); + } + return (total); +#ifdef LIBXML_XPTR_ENABLED + case XPATH_OP_RANGETO:{ + xmlXPathObjectPtr range; + xmlXPathObjectPtr res, obj; + xmlXPathObjectPtr tmp; + xmlLocationSetPtr newlocset = NULL; + xmlLocationSetPtr oldlocset; + xmlNodeSetPtr oldset; + int i, j; + + if (op->ch1 != -1) + total += + xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]); + if (op->ch2 == -1) + return (total); + + if (ctxt->value->type == XPATH_LOCATIONSET) { + /* + * Extract the old locset, and then evaluate the result of the + * expression for all the element in the locset. use it to grow + * up a new locset. + */ + CHECK_TYPE0(XPATH_LOCATIONSET); + obj = valuePop(ctxt); + oldlocset = obj->user; + + if ((oldlocset == NULL) || (oldlocset->locNr == 0)) { + ctxt->context->node = NULL; + ctxt->context->contextSize = 0; + ctxt->context->proximityPosition = 0; + total += xmlXPathCompOpEval(ctxt,&comp->steps[op->ch2]); + res = valuePop(ctxt); + if (res != NULL) { + xmlXPathReleaseObject(ctxt->context, res); + } + valuePush(ctxt, obj); + CHECK_ERROR0; + return (total); + } + newlocset = xmlXPtrLocationSetCreate(NULL); + + for (i = 0; i < oldlocset->locNr; i++) { + /* + * Run the evaluation with a node list made of a + * single item in the nodelocset. + */ + ctxt->context->node = oldlocset->locTab[i]->user; + ctxt->context->contextSize = oldlocset->locNr; + ctxt->context->proximityPosition = i + 1; + tmp = xmlXPathCacheNewNodeSet(ctxt->context, + ctxt->context->node); + valuePush(ctxt, tmp); + + if (op->ch2 != -1) + total += + xmlXPathCompOpEval(ctxt, + &comp->steps[op->ch2]); + if (ctxt->error != XPATH_EXPRESSION_OK) { + xmlXPathFreeObject(obj); + return(0); + } + + res = valuePop(ctxt); + if (res->type == XPATH_LOCATIONSET) { + xmlLocationSetPtr rloc = + (xmlLocationSetPtr)res->user; + for (j=0; jlocNr; j++) { + range = xmlXPtrNewRange( + oldlocset->locTab[i]->user, + oldlocset->locTab[i]->index, + rloc->locTab[j]->user2, + rloc->locTab[j]->index2); + if (range != NULL) { + xmlXPtrLocationSetAdd(newlocset, range); + } + } + } else { + range = xmlXPtrNewRangeNodeObject( + (xmlNodePtr)oldlocset->locTab[i]->user, res); + if (range != NULL) { + xmlXPtrLocationSetAdd(newlocset,range); + } + } + + /* + * Cleanup + */ + if (res != NULL) { + xmlXPathReleaseObject(ctxt->context, res); + } + if (ctxt->value == tmp) { + res = valuePop(ctxt); + xmlXPathReleaseObject(ctxt->context, res); + } + + ctxt->context->node = NULL; + } + } else { /* Not a location set */ + CHECK_TYPE0(XPATH_NODESET); + obj = valuePop(ctxt); + oldset = obj->nodesetval; + ctxt->context->node = NULL; + + newlocset = xmlXPtrLocationSetCreate(NULL); + + if (oldset != NULL) { + for (i = 0; i < oldset->nodeNr; i++) { + /* + * Run the evaluation with a node list made of a single item + * in the nodeset. + */ + ctxt->context->node = oldset->nodeTab[i]; + /* + * OPTIMIZE TODO: Avoid recreation for every iteration. + */ + tmp = xmlXPathCacheNewNodeSet(ctxt->context, + ctxt->context->node); + valuePush(ctxt, tmp); + + if (op->ch2 != -1) + total += + xmlXPathCompOpEval(ctxt, + &comp->steps[op->ch2]); + if (ctxt->error != XPATH_EXPRESSION_OK) { + xmlXPathFreeObject(obj); + return(0); + } + + res = valuePop(ctxt); + range = + xmlXPtrNewRangeNodeObject(oldset->nodeTab[i], + res); + if (range != NULL) { + xmlXPtrLocationSetAdd(newlocset, range); + } + + /* + * Cleanup + */ + if (res != NULL) { + xmlXPathReleaseObject(ctxt->context, res); + } + if (ctxt->value == tmp) { + res = valuePop(ctxt); + xmlXPathReleaseObject(ctxt->context, res); + } + + ctxt->context->node = NULL; + } + } + } + + /* + * The result is used as the new evaluation set. + */ + xmlXPathReleaseObject(ctxt->context, obj); + ctxt->context->node = NULL; + ctxt->context->contextSize = -1; + ctxt->context->proximityPosition = -1; + valuePush(ctxt, xmlXPtrWrapLocationSet(newlocset)); + return (total); + } +#endif /* LIBXML_XPTR_ENABLED */ + } + xmlGenericError(xmlGenericErrorContext, + "XPath: unknown precompiled operation %d\n", op->op); + ctxt->error = XPATH_INVALID_OPERAND; + return (total); +} + +/** + * xmlXPathCompOpEvalToBoolean: + * @ctxt: the XPath parser context + * + * Evaluates if the expression evaluates to true. + * + * Returns 1 if true, 0 if false and -1 on API or internal errors. + */ +static int +xmlXPathCompOpEvalToBoolean(xmlXPathParserContextPtr ctxt, + xmlXPathStepOpPtr op, + int isPredicate) +{ + xmlXPathObjectPtr resObj = NULL; + +start: + /* comp = ctxt->comp; */ + switch (op->op) { + case XPATH_OP_END: + return (0); + case XPATH_OP_VALUE: + resObj = (xmlXPathObjectPtr) op->value4; + if (isPredicate) + return(xmlXPathEvaluatePredicateResult(ctxt, resObj)); + return(xmlXPathCastToBoolean(resObj)); + case XPATH_OP_SORT: + /* + * We don't need sorting for boolean results. Skip this one. + */ + if (op->ch1 != -1) { + op = &ctxt->comp->steps[op->ch1]; + goto start; + } + return(0); + case XPATH_OP_COLLECT: + if (op->ch1 == -1) + return(0); + + xmlXPathCompOpEval(ctxt, &ctxt->comp->steps[op->ch1]); + if (ctxt->error != XPATH_EXPRESSION_OK) + return(-1); + + xmlXPathNodeCollectAndTest(ctxt, op, NULL, NULL, 1); + if (ctxt->error != XPATH_EXPRESSION_OK) + return(-1); + + resObj = valuePop(ctxt); + if (resObj == NULL) + return(-1); + break; + default: + /* + * Fallback to call xmlXPathCompOpEval(). + */ + xmlXPathCompOpEval(ctxt, op); + if (ctxt->error != XPATH_EXPRESSION_OK) + return(-1); + + resObj = valuePop(ctxt); + if (resObj == NULL) + return(-1); + break; + } + + if (resObj) { + int res; + + if (resObj->type == XPATH_BOOLEAN) { + res = resObj->boolval; + } else if (isPredicate) { + /* + * For predicates a result of type "number" is handled + * differently: + * SPEC XPath 1.0: + * "If the result is a number, the result will be converted + * to true if the number is equal to the context position + * and will be converted to false otherwise;" + */ + res = xmlXPathEvaluatePredicateResult(ctxt, resObj); + } else { + res = xmlXPathCastToBoolean(resObj); + } + xmlXPathReleaseObject(ctxt->context, resObj); + return(res); + } + + return(0); +} + +#ifdef XPATH_STREAMING +/** + * xmlXPathRunStreamEval: + * @ctxt: the XPath parser context with the compiled expression + * + * Evaluate the Precompiled Streamable XPath expression in the given context. + */ +static int +xmlXPathRunStreamEval(xmlXPathContextPtr ctxt, xmlPatternPtr comp, + xmlXPathObjectPtr *resultSeq, int toBool) +{ + int max_depth, min_depth; + int from_root; + int ret, depth; + int eval_all_nodes; + xmlNodePtr cur = NULL, limit = NULL; + xmlStreamCtxtPtr patstream = NULL; + + int nb_nodes = 0; + + if ((ctxt == NULL) || (comp == NULL)) + return(-1); + max_depth = xmlPatternMaxDepth(comp); + if (max_depth == -1) + return(-1); + if (max_depth == -2) + max_depth = 10000; + min_depth = xmlPatternMinDepth(comp); + if (min_depth == -1) + return(-1); + from_root = xmlPatternFromRoot(comp); + if (from_root < 0) + return(-1); +#if 0 + printf("stream eval: depth %d from root %d\n", max_depth, from_root); +#endif + + if (! toBool) { + if (resultSeq == NULL) + return(-1); + *resultSeq = xmlXPathCacheNewNodeSet(ctxt, NULL); + if (*resultSeq == NULL) + return(-1); + } + + /* + * handle the special cases of "/" amd "." being matched + */ + if (min_depth == 0) { + if (from_root) { + /* Select "/" */ + if (toBool) + return(1); + xmlXPathNodeSetAddUnique((*resultSeq)->nodesetval, + (xmlNodePtr) ctxt->doc); + } else { + /* Select "self::node()" */ + if (toBool) + return(1); + xmlXPathNodeSetAddUnique((*resultSeq)->nodesetval, ctxt->node); + } + } + if (max_depth == 0) { + return(0); + } + + if (from_root) { + cur = (xmlNodePtr)ctxt->doc; + } else if (ctxt->node != NULL) { + switch (ctxt->node->type) { + case XML_ELEMENT_NODE: + case XML_DOCUMENT_NODE: + case XML_DOCUMENT_FRAG_NODE: + case XML_HTML_DOCUMENT_NODE: +#ifdef LIBXML_DOCB_ENABLED + case XML_DOCB_DOCUMENT_NODE: +#endif + cur = ctxt->node; + break; + case XML_ATTRIBUTE_NODE: + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + case XML_ENTITY_REF_NODE: + case XML_ENTITY_NODE: + case XML_PI_NODE: + case XML_COMMENT_NODE: + case XML_NOTATION_NODE: + case XML_DTD_NODE: + case XML_DOCUMENT_TYPE_NODE: + case XML_ELEMENT_DECL: + case XML_ATTRIBUTE_DECL: + case XML_ENTITY_DECL: + case XML_NAMESPACE_DECL: + case XML_XINCLUDE_START: + case XML_XINCLUDE_END: + break; + } + limit = cur; + } + if (cur == NULL) { + return(0); + } + + patstream = xmlPatternGetStreamCtxt(comp); + if (patstream == NULL) { + /* + * QUESTION TODO: Is this an error? + */ + return(0); + } + + eval_all_nodes = xmlStreamWantsAnyNode(patstream); + + if (from_root) { + ret = xmlStreamPush(patstream, NULL, NULL); + if (ret < 0) { + } else if (ret == 1) { + if (toBool) + goto return_1; + xmlXPathNodeSetAddUnique((*resultSeq)->nodesetval, cur); + } + } + depth = 0; + goto scan_children; +next_node: + do { + nb_nodes++; + + switch (cur->type) { + case XML_ELEMENT_NODE: + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + case XML_COMMENT_NODE: + case XML_PI_NODE: + if (cur->type == XML_ELEMENT_NODE) { + ret = xmlStreamPush(patstream, cur->name, + (cur->ns ? cur->ns->href : NULL)); + } else if (eval_all_nodes) + ret = xmlStreamPushNode(patstream, NULL, NULL, cur->type); + else + break; + + if (ret < 0) { + /* NOP. */ + } else if (ret == 1) { + if (toBool) + goto return_1; + if (xmlXPathNodeSetAddUnique((*resultSeq)->nodesetval, cur) + < 0) { + ctxt->lastError.domain = XML_FROM_XPATH; + ctxt->lastError.code = XML_ERR_NO_MEMORY; + } + } + if ((cur->children == NULL) || (depth >= max_depth)) { + ret = xmlStreamPop(patstream); + while (cur->next != NULL) { + cur = cur->next; + if ((cur->type != XML_ENTITY_DECL) && + (cur->type != XML_DTD_NODE)) + goto next_node; + } + } + default: + break; + } + +scan_children: + if (cur->type == XML_NAMESPACE_DECL) break; + if ((cur->children != NULL) && (depth < max_depth)) { + /* + * Do not descend on entities declarations + */ + if (cur->children->type != XML_ENTITY_DECL) { + cur = cur->children; + depth++; + /* + * Skip DTDs + */ + if (cur->type != XML_DTD_NODE) + continue; + } + } + + if (cur == limit) + break; + + while (cur->next != NULL) { + cur = cur->next; + if ((cur->type != XML_ENTITY_DECL) && + (cur->type != XML_DTD_NODE)) + goto next_node; + } + + do { + cur = cur->parent; + depth--; + if ((cur == NULL) || (cur == limit)) + goto done; + if (cur->type == XML_ELEMENT_NODE) { + ret = xmlStreamPop(patstream); + } else if ((eval_all_nodes) && + ((cur->type == XML_TEXT_NODE) || + (cur->type == XML_CDATA_SECTION_NODE) || + (cur->type == XML_COMMENT_NODE) || + (cur->type == XML_PI_NODE))) + { + ret = xmlStreamPop(patstream); + } + if (cur->next != NULL) { + cur = cur->next; + break; + } + } while (cur != NULL); + + } while ((cur != NULL) && (depth >= 0)); + +done: + +#if 0 + printf("stream eval: checked %d nodes selected %d\n", + nb_nodes, retObj->nodesetval->nodeNr); +#endif + + if (patstream) + xmlFreeStreamCtxt(patstream); + return(0); + +return_1: + if (patstream) + xmlFreeStreamCtxt(patstream); + return(1); +} +#endif /* XPATH_STREAMING */ + +/** + * xmlXPathRunEval: + * @ctxt: the XPath parser context with the compiled expression + * @toBool: evaluate to a boolean result + * + * Evaluate the Precompiled XPath expression in the given context. + */ +static int +xmlXPathRunEval(xmlXPathParserContextPtr ctxt, int toBool) +{ + xmlXPathCompExprPtr comp; + + if ((ctxt == NULL) || (ctxt->comp == NULL)) + return(-1); + + if (ctxt->valueTab == NULL) { + /* Allocate the value stack */ + ctxt->valueTab = (xmlXPathObjectPtr *) + xmlMalloc(10 * sizeof(xmlXPathObjectPtr)); + if (ctxt->valueTab == NULL) { + xmlXPathPErrMemory(ctxt, "creating evaluation context\n"); + xmlFree(ctxt); + } + ctxt->valueNr = 0; + ctxt->valueMax = 10; + ctxt->value = NULL; + ctxt->valueFrame = 0; + } +#ifdef XPATH_STREAMING + if (ctxt->comp->stream) { + int res; + + if (toBool) { + /* + * Evaluation to boolean result. + */ + res = xmlXPathRunStreamEval(ctxt->context, + ctxt->comp->stream, NULL, 1); + if (res != -1) + return(res); + } else { + xmlXPathObjectPtr resObj = NULL; + + /* + * Evaluation to a sequence. + */ + res = xmlXPathRunStreamEval(ctxt->context, + ctxt->comp->stream, &resObj, 0); + + if ((res != -1) && (resObj != NULL)) { + valuePush(ctxt, resObj); + return(0); + } + if (resObj != NULL) + xmlXPathReleaseObject(ctxt->context, resObj); + } + /* + * QUESTION TODO: This falls back to normal XPath evaluation + * if res == -1. Is this intended? + */ + } +#endif + comp = ctxt->comp; + if (comp->last < 0) { + xmlGenericError(xmlGenericErrorContext, + "xmlXPathRunEval: last is less than zero\n"); + return(-1); + } + if (toBool) + return(xmlXPathCompOpEvalToBoolean(ctxt, + &comp->steps[comp->last], 0)); + else + xmlXPathCompOpEval(ctxt, &comp->steps[comp->last]); + + return(0); +} + +/************************************************************************ + * * + * Public interfaces * + * * + ************************************************************************/ + +/** + * xmlXPathEvalPredicate: + * @ctxt: the XPath context + * @res: the Predicate Expression evaluation result + * + * Evaluate a predicate result for the current node. + * A PredicateExpr is evaluated by evaluating the Expr and converting + * the result to a boolean. If the result is a number, the result will + * be converted to true if the number is equal to the position of the + * context node in the context node list (as returned by the position + * function) and will be converted to false otherwise; if the result + * is not a number, then the result will be converted as if by a call + * to the boolean function. + * + * Returns 1 if predicate is true, 0 otherwise + */ +int +xmlXPathEvalPredicate(xmlXPathContextPtr ctxt, xmlXPathObjectPtr res) { + if ((ctxt == NULL) || (res == NULL)) return(0); + switch (res->type) { + case XPATH_BOOLEAN: + return(res->boolval); + case XPATH_NUMBER: + return(res->floatval == ctxt->proximityPosition); + case XPATH_NODESET: + case XPATH_XSLT_TREE: + if (res->nodesetval == NULL) + return(0); + return(res->nodesetval->nodeNr != 0); + case XPATH_STRING: + return((res->stringval != NULL) && + (xmlStrlen(res->stringval) != 0)); + default: + STRANGE + } + return(0); +} + +/** + * xmlXPathEvaluatePredicateResult: + * @ctxt: the XPath Parser context + * @res: the Predicate Expression evaluation result + * + * Evaluate a predicate result for the current node. + * A PredicateExpr is evaluated by evaluating the Expr and converting + * the result to a boolean. If the result is a number, the result will + * be converted to true if the number is equal to the position of the + * context node in the context node list (as returned by the position + * function) and will be converted to false otherwise; if the result + * is not a number, then the result will be converted as if by a call + * to the boolean function. + * + * Returns 1 if predicate is true, 0 otherwise + */ +int +xmlXPathEvaluatePredicateResult(xmlXPathParserContextPtr ctxt, + xmlXPathObjectPtr res) { + if ((ctxt == NULL) || (res == NULL)) return(0); + switch (res->type) { + case XPATH_BOOLEAN: + return(res->boolval); + case XPATH_NUMBER: +#if defined(__BORLANDC__) || (defined(_MSC_VER) && (_MSC_VER == 1200)) + return((res->floatval == ctxt->context->proximityPosition) && + (!xmlXPathIsNaN(res->floatval))); /* MSC pbm Mark Vakoc !*/ +#else + return(res->floatval == ctxt->context->proximityPosition); +#endif + case XPATH_NODESET: + case XPATH_XSLT_TREE: + if (res->nodesetval == NULL) + return(0); + return(res->nodesetval->nodeNr != 0); + case XPATH_STRING: + return((res->stringval != NULL) && (res->stringval[0] != 0)); +#ifdef LIBXML_XPTR_ENABLED + case XPATH_LOCATIONSET:{ + xmlLocationSetPtr ptr = res->user; + if (ptr == NULL) + return(0); + return (ptr->locNr != 0); + } +#endif + default: + STRANGE + } + return(0); +} + +#ifdef XPATH_STREAMING +/** + * xmlXPathTryStreamCompile: + * @ctxt: an XPath context + * @str: the XPath expression + * + * Try to compile the XPath expression as a streamable subset. + * + * Returns the compiled expression or NULL if failed to compile. + */ +static xmlXPathCompExprPtr +xmlXPathTryStreamCompile(xmlXPathContextPtr ctxt, const xmlChar *str) { + /* + * Optimization: use streaming patterns when the XPath expression can + * be compiled to a stream lookup + */ + xmlPatternPtr stream; + xmlXPathCompExprPtr comp; + xmlDictPtr dict = NULL; + const xmlChar **namespaces = NULL; + xmlNsPtr ns; + int i, j; + + if ((!xmlStrchr(str, '[')) && (!xmlStrchr(str, '(')) && + (!xmlStrchr(str, '@'))) { + const xmlChar *tmp; + + /* + * We don't try to handle expressions using the verbose axis + * specifiers ("::"), just the simplied form at this point. + * Additionally, if there is no list of namespaces available and + * there's a ":" in the expression, indicating a prefixed QName, + * then we won't try to compile either. xmlPatterncompile() needs + * to have a list of namespaces at compilation time in order to + * compile prefixed name tests. + */ + tmp = xmlStrchr(str, ':'); + if ((tmp != NULL) && + ((ctxt == NULL) || (ctxt->nsNr == 0) || (tmp[1] == ':'))) + return(NULL); + + if (ctxt != NULL) { + dict = ctxt->dict; + if (ctxt->nsNr > 0) { + namespaces = xmlMalloc(2 * (ctxt->nsNr + 1) * sizeof(xmlChar*)); + if (namespaces == NULL) { + xmlXPathErrMemory(ctxt, "allocating namespaces array\n"); + return(NULL); + } + for (i = 0, j = 0; (j < ctxt->nsNr); j++) { + ns = ctxt->namespaces[j]; + namespaces[i++] = ns->href; + namespaces[i++] = ns->prefix; + } + namespaces[i++] = NULL; + namespaces[i] = NULL; + } + } + + stream = xmlPatterncompile(str, dict, XML_PATTERN_XPATH, + &namespaces[0]); + if (namespaces != NULL) { + xmlFree((xmlChar **)namespaces); + } + if ((stream != NULL) && (xmlPatternStreamable(stream) == 1)) { + comp = xmlXPathNewCompExpr(); + if (comp == NULL) { + xmlXPathErrMemory(ctxt, "allocating streamable expression\n"); + return(NULL); + } + comp->stream = stream; + comp->dict = dict; + if (comp->dict) + xmlDictReference(comp->dict); + return(comp); + } + xmlFreePattern(stream); + } + return(NULL); +} +#endif /* XPATH_STREAMING */ + +static void +xmlXPathOptimizeExpression(xmlXPathCompExprPtr comp, xmlXPathStepOpPtr op) +{ + /* + * Try to rewrite "descendant-or-self::node()/foo" to an optimized + * internal representation. + */ + + if ((op->ch1 != -1) && + (op->op == XPATH_OP_COLLECT /* 11 */)) + { + xmlXPathStepOpPtr prevop = &comp->steps[op->ch1]; + + if ((prevop->op == XPATH_OP_COLLECT /* 11 */) && + ((xmlXPathAxisVal) prevop->value == + AXIS_DESCENDANT_OR_SELF) && + (prevop->ch2 == -1) && + ((xmlXPathTestVal) prevop->value2 == NODE_TEST_TYPE) && + ((xmlXPathTypeVal) prevop->value3 == NODE_TYPE_NODE)) + { + /* + * This is a "descendant-or-self::node()" without predicates. + * Try to eliminate it. + */ + + switch ((xmlXPathAxisVal) op->value) { + case AXIS_CHILD: + case AXIS_DESCENDANT: + /* + * Convert "descendant-or-self::node()/child::" or + * "descendant-or-self::node()/descendant::" to + * "descendant::" + */ + op->ch1 = prevop->ch1; + op->value = AXIS_DESCENDANT; + break; + case AXIS_SELF: + case AXIS_DESCENDANT_OR_SELF: + /* + * Convert "descendant-or-self::node()/self::" or + * "descendant-or-self::node()/descendant-or-self::" to + * to "descendant-or-self::" + */ + op->ch1 = prevop->ch1; + op->value = AXIS_DESCENDANT_OR_SELF; + break; + default: + break; + } + } + } + + /* Recurse */ + if (op->ch1 != -1) + xmlXPathOptimizeExpression(comp, &comp->steps[op->ch1]); + if (op->ch2 != -1) + xmlXPathOptimizeExpression(comp, &comp->steps[op->ch2]); +} + +/** + * xmlXPathCtxtCompile: + * @ctxt: an XPath context + * @str: the XPath expression + * + * Compile an XPath expression + * + * Returns the xmlXPathCompExprPtr resulting from the compilation or NULL. + * the caller has to free the object. + */ +xmlXPathCompExprPtr +xmlXPathCtxtCompile(xmlXPathContextPtr ctxt, const xmlChar *str) { + xmlXPathParserContextPtr pctxt; + xmlXPathCompExprPtr comp; + +#ifdef XPATH_STREAMING + comp = xmlXPathTryStreamCompile(ctxt, str); + if (comp != NULL) + return(comp); +#endif + + xmlXPathInit(); + + pctxt = xmlXPathNewParserContext(str, ctxt); + if (pctxt == NULL) + return NULL; + xmlXPathCompileExpr(pctxt, 1); + + if( pctxt->error != XPATH_EXPRESSION_OK ) + { + xmlXPathFreeParserContext(pctxt); + return(NULL); + } + + if (*pctxt->cur != 0) { + /* + * aleksey: in some cases this line prints *second* error message + * (see bug #78858) and probably this should be fixed. + * However, we are not sure that all error messages are printed + * out in other places. It's not critical so we leave it as-is for now + */ + xmlXPatherror(pctxt, __FILE__, __LINE__, XPATH_EXPR_ERROR); + comp = NULL; + } else { + comp = pctxt->comp; + pctxt->comp = NULL; + } + xmlXPathFreeParserContext(pctxt); + + if (comp != NULL) { + comp->expr = xmlStrdup(str); +#ifdef DEBUG_EVAL_COUNTS + comp->string = xmlStrdup(str); + comp->nb = 0; +#endif + if ((comp->nbStep > 1) && (comp->last >= 0)) { + xmlXPathOptimizeExpression(comp, &comp->steps[comp->last]); + } + } + return(comp); +} + +/** + * xmlXPathCompile: + * @str: the XPath expression + * + * Compile an XPath expression + * + * Returns the xmlXPathCompExprPtr resulting from the compilation or NULL. + * the caller has to free the object. + */ +xmlXPathCompExprPtr +xmlXPathCompile(const xmlChar *str) { + return(xmlXPathCtxtCompile(NULL, str)); +} + +/** + * xmlXPathCompiledEvalInternal: + * @comp: the compiled XPath expression + * @ctxt: the XPath context + * @resObj: the resulting XPath object or NULL + * @toBool: 1 if only a boolean result is requested + * + * Evaluate the Precompiled XPath expression in the given context. + * The caller has to free @resObj. + * + * Returns the xmlXPathObjectPtr resulting from the evaluation or NULL. + * the caller has to free the object. + */ +static int +xmlXPathCompiledEvalInternal(xmlXPathCompExprPtr comp, + xmlXPathContextPtr ctxt, + xmlXPathObjectPtr *resObj, + int toBool) +{ + xmlXPathParserContextPtr pctxt; +#ifndef LIBXML_THREAD_ENABLED + static int reentance = 0; +#endif + int res; + + CHECK_CTXT_NEG(ctxt) + + if (comp == NULL) + return(-1); + xmlXPathInit(); + +#ifndef LIBXML_THREAD_ENABLED + reentance++; + if (reentance > 1) + xmlXPathDisableOptimizer = 1; +#endif + +#ifdef DEBUG_EVAL_COUNTS + comp->nb++; + if ((comp->string != NULL) && (comp->nb > 100)) { + fprintf(stderr, "100 x %s\n", comp->string); + comp->nb = 0; + } +#endif + pctxt = xmlXPathCompParserContext(comp, ctxt); + res = xmlXPathRunEval(pctxt, toBool); + + if (resObj) { + if (pctxt->value == NULL) { + xmlGenericError(xmlGenericErrorContext, + "xmlXPathCompiledEval: evaluation failed\n"); + *resObj = NULL; + } else { + *resObj = valuePop(pctxt); + } + } + + /* + * Pop all remaining objects from the stack. + */ + if (pctxt->valueNr > 0) { + xmlXPathObjectPtr tmp; + int stack = 0; + + do { + tmp = valuePop(pctxt); + if (tmp != NULL) { + stack++; + xmlXPathReleaseObject(ctxt, tmp); + } + } while (tmp != NULL); + if ((stack != 0) && + ((toBool) || ((resObj) && (*resObj)))) + { + xmlGenericError(xmlGenericErrorContext, + "xmlXPathCompiledEval: %d objects left on the stack.\n", + stack); + } + } + + if ((pctxt->error != XPATH_EXPRESSION_OK) && (resObj) && (*resObj)) { + xmlXPathFreeObject(*resObj); + *resObj = NULL; + } + pctxt->comp = NULL; + xmlXPathFreeParserContext(pctxt); +#ifndef LIBXML_THREAD_ENABLED + reentance--; +#endif + + return(res); +} + +/** + * xmlXPathCompiledEval: + * @comp: the compiled XPath expression + * @ctx: the XPath context + * + * Evaluate the Precompiled XPath expression in the given context. + * + * Returns the xmlXPathObjectPtr resulting from the evaluation or NULL. + * the caller has to free the object. + */ +xmlXPathObjectPtr +xmlXPathCompiledEval(xmlXPathCompExprPtr comp, xmlXPathContextPtr ctx) +{ + xmlXPathObjectPtr res = NULL; + + xmlXPathCompiledEvalInternal(comp, ctx, &res, 0); + return(res); +} + +/** + * xmlXPathCompiledEvalToBoolean: + * @comp: the compiled XPath expression + * @ctxt: the XPath context + * + * Applies the XPath boolean() function on the result of the given + * compiled expression. + * + * Returns 1 if the expression evaluated to true, 0 if to false and + * -1 in API and internal errors. + */ +int +xmlXPathCompiledEvalToBoolean(xmlXPathCompExprPtr comp, + xmlXPathContextPtr ctxt) +{ + return(xmlXPathCompiledEvalInternal(comp, ctxt, NULL, 1)); +} + +/** + * xmlXPathEvalExpr: + * @ctxt: the XPath Parser context + * + * Parse and evaluate an XPath expression in the given context, + * then push the result on the context stack + */ +void +xmlXPathEvalExpr(xmlXPathParserContextPtr ctxt) { +#ifdef XPATH_STREAMING + xmlXPathCompExprPtr comp; +#endif + + if (ctxt == NULL) return; + +#ifdef XPATH_STREAMING + comp = xmlXPathTryStreamCompile(ctxt->context, ctxt->base); + if (comp != NULL) { + if (ctxt->comp != NULL) + xmlXPathFreeCompExpr(ctxt->comp); + ctxt->comp = comp; + if (ctxt->cur != NULL) + while (*ctxt->cur != 0) ctxt->cur++; + } else +#endif + { + xmlXPathCompileExpr(ctxt, 1); + if ((ctxt->error == XPATH_EXPRESSION_OK) && + (ctxt->comp != NULL) && + (ctxt->comp->nbStep > 1) && + (ctxt->comp->last >= 0)) + { + xmlXPathOptimizeExpression(ctxt->comp, + &ctxt->comp->steps[ctxt->comp->last]); + } + } + CHECK_ERROR; + xmlXPathRunEval(ctxt, 0); +} + +/** + * xmlXPathEval: + * @str: the XPath expression + * @ctx: the XPath context + * + * Evaluate the XPath Location Path in the given context. + * + * Returns the xmlXPathObjectPtr resulting from the evaluation or NULL. + * the caller has to free the object. + */ +xmlXPathObjectPtr +xmlXPathEval(const xmlChar *str, xmlXPathContextPtr ctx) { + xmlXPathParserContextPtr ctxt; + xmlXPathObjectPtr res, tmp, init = NULL; + int stack = 0; + + CHECK_CTXT(ctx) + + xmlXPathInit(); + + ctxt = xmlXPathNewParserContext(str, ctx); + if (ctxt == NULL) + return NULL; + xmlXPathEvalExpr(ctxt); + + if (ctxt->value == NULL) { + xmlGenericError(xmlGenericErrorContext, + "xmlXPathEval: evaluation failed\n"); + res = NULL; + } else if ((*ctxt->cur != 0) && (ctxt->comp != NULL) +#ifdef XPATH_STREAMING + && (ctxt->comp->stream == NULL) +#endif + ) { + xmlXPatherror(ctxt, __FILE__, __LINE__, XPATH_EXPR_ERROR); + res = NULL; + } else { + res = valuePop(ctxt); + } + + do { + tmp = valuePop(ctxt); + if (tmp != NULL) { + if (tmp != init) + stack++; + xmlXPathReleaseObject(ctx, tmp); + } + } while (tmp != NULL); + if ((stack != 0) && (res != NULL)) { + xmlGenericError(xmlGenericErrorContext, + "xmlXPathEval: %d object left on the stack\n", + stack); + } + if (ctxt->error != XPATH_EXPRESSION_OK) { + xmlXPathFreeObject(res); + res = NULL; + } + + xmlXPathFreeParserContext(ctxt); + return(res); +} + +/** + * xmlXPathSetContextNode: + * @node: the node to to use as the context node + * @ctx: the XPath context + * + * Sets 'node' as the context node. The node must be in the same + * document as that associated with the context. + * + * Returns -1 in case of error or 0 if successful + */ +int +xmlXPathSetContextNode(xmlNodePtr node, xmlXPathContextPtr ctx) { + if ((node == NULL) || (ctx == NULL)) + return(-1); + + if (node->doc == ctx->doc) { + ctx->node = node; + return(0); + } + return(-1); +} + +/** + * xmlXPathNodeEval: + * @node: the node to to use as the context node + * @str: the XPath expression + * @ctx: the XPath context + * + * Evaluate the XPath Location Path in the given context. The node 'node' + * is set as the context node. The context node is not restored. + * + * Returns the xmlXPathObjectPtr resulting from the evaluation or NULL. + * the caller has to free the object. + */ +xmlXPathObjectPtr +xmlXPathNodeEval(xmlNodePtr node, const xmlChar *str, xmlXPathContextPtr ctx) { + if (str == NULL) + return(NULL); + if (xmlXPathSetContextNode(node, ctx) < 0) + return(NULL); + return(xmlXPathEval(str, ctx)); +} + +/** + * xmlXPathEvalExpression: + * @str: the XPath expression + * @ctxt: the XPath context + * + * Evaluate the XPath expression in the given context. + * + * Returns the xmlXPathObjectPtr resulting from the evaluation or NULL. + * the caller has to free the object. + */ +xmlXPathObjectPtr +xmlXPathEvalExpression(const xmlChar *str, xmlXPathContextPtr ctxt) { + xmlXPathParserContextPtr pctxt; + xmlXPathObjectPtr res, tmp; + int stack = 0; + + CHECK_CTXT(ctxt) + + xmlXPathInit(); + + pctxt = xmlXPathNewParserContext(str, ctxt); + if (pctxt == NULL) + return NULL; + xmlXPathEvalExpr(pctxt); + + if ((*pctxt->cur != 0) || (pctxt->error != XPATH_EXPRESSION_OK)) { + xmlXPatherror(pctxt, __FILE__, __LINE__, XPATH_EXPR_ERROR); + res = NULL; + } else { + res = valuePop(pctxt); + } + do { + tmp = valuePop(pctxt); + if (tmp != NULL) { + xmlXPathReleaseObject(ctxt, tmp); + stack++; + } + } while (tmp != NULL); + if ((stack != 0) && (res != NULL)) { + xmlGenericError(xmlGenericErrorContext, + "xmlXPathEvalExpression: %d object left on the stack\n", + stack); + } + xmlXPathFreeParserContext(pctxt); + return(res); +} + +/************************************************************************ + * * + * Extra functions not pertaining to the XPath spec * + * * + ************************************************************************/ +/** + * xmlXPathEscapeUriFunction: + * @ctxt: the XPath Parser context + * @nargs: the number of arguments + * + * Implement the escape-uri() XPath function + * string escape-uri(string $str, bool $escape-reserved) + * + * This function applies the URI escaping rules defined in section 2 of [RFC + * 2396] to the string supplied as $uri-part, which typically represents all + * or part of a URI. The effect of the function is to replace any special + * character in the string by an escape sequence of the form %xx%yy..., + * where xxyy... is the hexadecimal representation of the octets used to + * represent the character in UTF-8. + * + * The set of characters that are escaped depends on the setting of the + * boolean argument $escape-reserved. + * + * If $escape-reserved is true, all characters are escaped other than lower + * case letters a-z, upper case letters A-Z, digits 0-9, and the characters + * referred to in [RFC 2396] as "marks": specifically, "-" | "_" | "." | "!" + * | "~" | "*" | "'" | "(" | ")". The "%" character itself is escaped only + * if it is not followed by two hexadecimal digits (that is, 0-9, a-f, and + * A-F). + * + * If $escape-reserved is false, the behavior differs in that characters + * referred to in [RFC 2396] as reserved characters are not escaped. These + * characters are ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ",". + * + * [RFC 2396] does not define whether escaped URIs should use lower case or + * upper case for hexadecimal digits. To ensure that escaped URIs can be + * compared using string comparison functions, this function must always use + * the upper-case letters A-F. + * + * Generally, $escape-reserved should be set to true when escaping a string + * that is to form a single part of a URI, and to false when escaping an + * entire URI or URI reference. + * + * In the case of non-ascii characters, the string is encoded according to + * utf-8 and then converted according to RFC 2396. + * + * Examples + * xf:escape-uri ("gopher://spinaltap.micro.umn.edu/00/Weather/California/Los%20Angeles#ocean"), true()) + * returns "gopher%3A%2F%2Fspinaltap.micro.umn.edu%2F00%2FWeather%2FCalifornia%2FLos%20Angeles%23ocean" + * xf:escape-uri ("gopher://spinaltap.micro.umn.edu/00/Weather/California/Los%20Angeles#ocean"), false()) + * returns "gopher://spinaltap.micro.umn.edu/00/Weather/California/Los%20Angeles%23ocean" + * + */ +static void +xmlXPathEscapeUriFunction(xmlXPathParserContextPtr ctxt, int nargs) { + xmlXPathObjectPtr str; + int escape_reserved; + xmlBufPtr target; + xmlChar *cptr; + xmlChar escape[4]; + + CHECK_ARITY(2); + + escape_reserved = xmlXPathPopBoolean(ctxt); + + CAST_TO_STRING; + str = valuePop(ctxt); + + target = xmlBufCreate(); + + escape[0] = '%'; + escape[3] = 0; + + if (target) { + for (cptr = str->stringval; *cptr; cptr++) { + if ((*cptr >= 'A' && *cptr <= 'Z') || + (*cptr >= 'a' && *cptr <= 'z') || + (*cptr >= '0' && *cptr <= '9') || + *cptr == '-' || *cptr == '_' || *cptr == '.' || + *cptr == '!' || *cptr == '~' || *cptr == '*' || + *cptr == '\''|| *cptr == '(' || *cptr == ')' || + (*cptr == '%' && + ((cptr[1] >= 'A' && cptr[1] <= 'F') || + (cptr[1] >= 'a' && cptr[1] <= 'f') || + (cptr[1] >= '0' && cptr[1] <= '9')) && + ((cptr[2] >= 'A' && cptr[2] <= 'F') || + (cptr[2] >= 'a' && cptr[2] <= 'f') || + (cptr[2] >= '0' && cptr[2] <= '9'))) || + (!escape_reserved && + (*cptr == ';' || *cptr == '/' || *cptr == '?' || + *cptr == ':' || *cptr == '@' || *cptr == '&' || + *cptr == '=' || *cptr == '+' || *cptr == '$' || + *cptr == ','))) { + xmlBufAdd(target, cptr, 1); + } else { + if ((*cptr >> 4) < 10) + escape[1] = '0' + (*cptr >> 4); + else + escape[1] = 'A' - 10 + (*cptr >> 4); + if ((*cptr & 0xF) < 10) + escape[2] = '0' + (*cptr & 0xF); + else + escape[2] = 'A' - 10 + (*cptr & 0xF); + + xmlBufAdd(target, &escape[0], 3); + } + } + } + valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, + xmlBufContent(target))); + xmlBufFree(target); + xmlXPathReleaseObject(ctxt->context, str); +} + +/** + * xmlXPathRegisterAllFunctions: + * @ctxt: the XPath context + * + * Registers all default XPath functions in this context + */ +void +xmlXPathRegisterAllFunctions(xmlXPathContextPtr ctxt) +{ + xmlXPathRegisterFunc(ctxt, (const xmlChar *)"boolean", + xmlXPathBooleanFunction); + xmlXPathRegisterFunc(ctxt, (const xmlChar *)"ceiling", + xmlXPathCeilingFunction); + xmlXPathRegisterFunc(ctxt, (const xmlChar *)"count", + xmlXPathCountFunction); + xmlXPathRegisterFunc(ctxt, (const xmlChar *)"concat", + xmlXPathConcatFunction); + xmlXPathRegisterFunc(ctxt, (const xmlChar *)"contains", + xmlXPathContainsFunction); + xmlXPathRegisterFunc(ctxt, (const xmlChar *)"id", + xmlXPathIdFunction); + xmlXPathRegisterFunc(ctxt, (const xmlChar *)"false", + xmlXPathFalseFunction); + xmlXPathRegisterFunc(ctxt, (const xmlChar *)"floor", + xmlXPathFloorFunction); + xmlXPathRegisterFunc(ctxt, (const xmlChar *)"last", + xmlXPathLastFunction); + xmlXPathRegisterFunc(ctxt, (const xmlChar *)"lang", + xmlXPathLangFunction); + xmlXPathRegisterFunc(ctxt, (const xmlChar *)"local-name", + xmlXPathLocalNameFunction); + xmlXPathRegisterFunc(ctxt, (const xmlChar *)"not", + xmlXPathNotFunction); + xmlXPathRegisterFunc(ctxt, (const xmlChar *)"name", + xmlXPathNameFunction); + xmlXPathRegisterFunc(ctxt, (const xmlChar *)"namespace-uri", + xmlXPathNamespaceURIFunction); + xmlXPathRegisterFunc(ctxt, (const xmlChar *)"normalize-space", + xmlXPathNormalizeFunction); + xmlXPathRegisterFunc(ctxt, (const xmlChar *)"number", + xmlXPathNumberFunction); + xmlXPathRegisterFunc(ctxt, (const xmlChar *)"position", + xmlXPathPositionFunction); + xmlXPathRegisterFunc(ctxt, (const xmlChar *)"round", + xmlXPathRoundFunction); + xmlXPathRegisterFunc(ctxt, (const xmlChar *)"string", + xmlXPathStringFunction); + xmlXPathRegisterFunc(ctxt, (const xmlChar *)"string-length", + xmlXPathStringLengthFunction); + xmlXPathRegisterFunc(ctxt, (const xmlChar *)"starts-with", + xmlXPathStartsWithFunction); + xmlXPathRegisterFunc(ctxt, (const xmlChar *)"substring", + xmlXPathSubstringFunction); + xmlXPathRegisterFunc(ctxt, (const xmlChar *)"substring-before", + xmlXPathSubstringBeforeFunction); + xmlXPathRegisterFunc(ctxt, (const xmlChar *)"substring-after", + xmlXPathSubstringAfterFunction); + xmlXPathRegisterFunc(ctxt, (const xmlChar *)"sum", + xmlXPathSumFunction); + xmlXPathRegisterFunc(ctxt, (const xmlChar *)"true", + xmlXPathTrueFunction); + xmlXPathRegisterFunc(ctxt, (const xmlChar *)"translate", + xmlXPathTranslateFunction); + + xmlXPathRegisterFuncNS(ctxt, (const xmlChar *)"escape-uri", + (const xmlChar *)"http://www.w3.org/2002/08/xquery-functions", + xmlXPathEscapeUriFunction); +} + +#endif /* LIBXML_XPATH_ENABLED */ +#define bottom_xpath +#include "elfgcchack.h" diff --git a/vendors/libxml/src/xpointer.c b/vendors/libxml/src/xpointer.c new file mode 100644 index 0000000..46f11e8 --- /dev/null +++ b/vendors/libxml/src/xpointer.c @@ -0,0 +1,3005 @@ +/* + * xpointer.c : Code to handle XML Pointer + * + * Base implementation was made accordingly to + * W3C Candidate Recommendation 7 June 2000 + * http://www.w3.org/TR/2000/CR-xptr-20000607 + * + * Added support for the element() scheme described in: + * W3C Proposed Recommendation 13 November 2002 + * http://www.w3.org/TR/2002/PR-xptr-element-20021113/ + * + * See Copyright for the status of this software. + * + * daniel@veillard.com + */ + +#define IN_LIBXML +#include "libxml.h" + +/* + * TODO: better handling of error cases, the full expression should + * be parsed beforehand instead of a progressive evaluation + * TODO: Access into entities references are not supported now ... + * need a start to be able to pop out of entities refs since + * parent is the endity declaration, not the ref. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef LIBXML_XPTR_ENABLED + +/* Add support of the xmlns() xpointer scheme to initialize the namespaces */ +#define XPTR_XMLNS_SCHEME + +/* #define DEBUG_RANGES */ +#ifdef DEBUG_RANGES +#ifdef LIBXML_DEBUG_ENABLED +#include +#endif +#endif + +#define TODO \ + xmlGenericError(xmlGenericErrorContext, \ + "Unimplemented block at %s:%d\n", \ + __FILE__, __LINE__); + +#define STRANGE \ + xmlGenericError(xmlGenericErrorContext, \ + "Internal error at %s:%d\n", \ + __FILE__, __LINE__); + +/************************************************************************ + * * + * Some factorized error routines * + * * + ************************************************************************/ + +/** + * xmlXPtrErrMemory: + * @extra: extra informations + * + * Handle a redefinition of attribute error + */ +static void +xmlXPtrErrMemory(const char *extra) +{ + __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_XPOINTER, + XML_ERR_NO_MEMORY, XML_ERR_ERROR, NULL, 0, extra, + NULL, NULL, 0, 0, + "Memory allocation failed : %s\n", extra); +} + +/** + * xmlXPtrErr: + * @ctxt: an XPTR evaluation context + * @extra: extra informations + * + * Handle a redefinition of attribute error + */ +static void +xmlXPtrErr(xmlXPathParserContextPtr ctxt, int error, + const char * msg, const xmlChar *extra) +{ + if (ctxt != NULL) + ctxt->error = error; + if ((ctxt == NULL) || (ctxt->context == NULL)) { + __xmlRaiseError(NULL, NULL, NULL, + NULL, NULL, XML_FROM_XPOINTER, error, + XML_ERR_ERROR, NULL, 0, + (const char *) extra, NULL, NULL, 0, 0, + msg, extra); + return; + } + ctxt->context->lastError.domain = XML_FROM_XPOINTER; + ctxt->context->lastError.code = error; + ctxt->context->lastError.level = XML_ERR_ERROR; + ctxt->context->lastError.str1 = (char *) xmlStrdup(ctxt->base); + ctxt->context->lastError.int1 = ctxt->cur - ctxt->base; + ctxt->context->lastError.node = ctxt->context->debugNode; + if (ctxt->context->error != NULL) { + ctxt->context->error(ctxt->context->userData, + &ctxt->context->lastError); + } else { + __xmlRaiseError(NULL, NULL, NULL, + NULL, ctxt->context->debugNode, XML_FROM_XPOINTER, + error, XML_ERR_ERROR, NULL, 0, + (const char *) extra, (const char *) ctxt->base, NULL, + ctxt->cur - ctxt->base, 0, + msg, extra); + } +} + +/************************************************************************ + * * + * A few helper functions for child sequences * + * * + ************************************************************************/ +/* xmlXPtrAdvanceNode is a private function, but used by xinclude.c */ +xmlNodePtr xmlXPtrAdvanceNode(xmlNodePtr cur, int *level); +/** + * xmlXPtrGetArity: + * @cur: the node + * + * Returns the number of child for an element, -1 in case of error + */ +static int +xmlXPtrGetArity(xmlNodePtr cur) { + int i; + if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL)) + return(-1); + cur = cur->children; + for (i = 0;cur != NULL;cur = cur->next) { + if ((cur->type == XML_ELEMENT_NODE) || + (cur->type == XML_DOCUMENT_NODE) || + (cur->type == XML_HTML_DOCUMENT_NODE)) { + i++; + } + } + return(i); +} + +/** + * xmlXPtrGetIndex: + * @cur: the node + * + * Returns the index of the node in its parent children list, -1 + * in case of error + */ +static int +xmlXPtrGetIndex(xmlNodePtr cur) { + int i; + if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL)) + return(-1); + for (i = 1;cur != NULL;cur = cur->prev) { + if ((cur->type == XML_ELEMENT_NODE) || + (cur->type == XML_DOCUMENT_NODE) || + (cur->type == XML_HTML_DOCUMENT_NODE)) { + i++; + } + } + return(i); +} + +/** + * xmlXPtrGetNthChild: + * @cur: the node + * @no: the child number + * + * Returns the @no'th element child of @cur or NULL + */ +static xmlNodePtr +xmlXPtrGetNthChild(xmlNodePtr cur, int no) { + int i; + if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL)) + return(cur); + cur = cur->children; + for (i = 0;i <= no;cur = cur->next) { + if (cur == NULL) + return(cur); + if ((cur->type == XML_ELEMENT_NODE) || + (cur->type == XML_DOCUMENT_NODE) || + (cur->type == XML_HTML_DOCUMENT_NODE)) { + i++; + if (i == no) + break; + } + } + return(cur); +} + +/************************************************************************ + * * + * Handling of XPointer specific types * + * * + ************************************************************************/ + +/** + * xmlXPtrCmpPoints: + * @node1: the first node + * @index1: the first index + * @node2: the second node + * @index2: the second index + * + * Compare two points w.r.t document order + * + * Returns -2 in case of error 1 if first point < second point, 0 if + * that's the same point, -1 otherwise + */ +static int +xmlXPtrCmpPoints(xmlNodePtr node1, int index1, xmlNodePtr node2, int index2) { + if ((node1 == NULL) || (node2 == NULL)) + return(-2); + /* + * a couple of optimizations which will avoid computations in most cases + */ + if (node1 == node2) { + if (index1 < index2) + return(1); + if (index1 > index2) + return(-1); + return(0); + } + return(xmlXPathCmpNodes(node1, node2)); +} + +/** + * xmlXPtrNewPoint: + * @node: the xmlNodePtr + * @indx: the indx within the node + * + * Create a new xmlXPathObjectPtr of type point + * + * Returns the newly created object. + */ +static xmlXPathObjectPtr +xmlXPtrNewPoint(xmlNodePtr node, int indx) { + xmlXPathObjectPtr ret; + + if (node == NULL) + return(NULL); + if (indx < 0) + return(NULL); + + ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); + if (ret == NULL) { + xmlXPtrErrMemory("allocating point"); + return(NULL); + } + memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); + ret->type = XPATH_POINT; + ret->user = (void *) node; + ret->index = indx; + return(ret); +} + +/** + * xmlXPtrRangeCheckOrder: + * @range: an object range + * + * Make sure the points in the range are in the right order + */ +static void +xmlXPtrRangeCheckOrder(xmlXPathObjectPtr range) { + int tmp; + xmlNodePtr tmp2; + if (range == NULL) + return; + if (range->type != XPATH_RANGE) + return; + if (range->user2 == NULL) + return; + tmp = xmlXPtrCmpPoints(range->user, range->index, + range->user2, range->index2); + if (tmp == -1) { + tmp2 = range->user; + range->user = range->user2; + range->user2 = tmp2; + tmp = range->index; + range->index = range->index2; + range->index2 = tmp; + } +} + +/** + * xmlXPtrRangesEqual: + * @range1: the first range + * @range2: the second range + * + * Compare two ranges + * + * Returns 1 if equal, 0 otherwise + */ +static int +xmlXPtrRangesEqual(xmlXPathObjectPtr range1, xmlXPathObjectPtr range2) { + if (range1 == range2) + return(1); + if ((range1 == NULL) || (range2 == NULL)) + return(0); + if (range1->type != range2->type) + return(0); + if (range1->type != XPATH_RANGE) + return(0); + if (range1->user != range2->user) + return(0); + if (range1->index != range2->index) + return(0); + if (range1->user2 != range2->user2) + return(0); + if (range1->index2 != range2->index2) + return(0); + return(1); +} + +/** + * xmlXPtrNewRange: + * @start: the starting node + * @startindex: the start index + * @end: the ending point + * @endindex: the ending index + * + * Create a new xmlXPathObjectPtr of type range + * + * Returns the newly created object. + */ +xmlXPathObjectPtr +xmlXPtrNewRange(xmlNodePtr start, int startindex, + xmlNodePtr end, int endindex) { + xmlXPathObjectPtr ret; + + if (start == NULL) + return(NULL); + if (end == NULL) + return(NULL); + if (startindex < 0) + return(NULL); + if (endindex < 0) + return(NULL); + + ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); + if (ret == NULL) { + xmlXPtrErrMemory("allocating range"); + return(NULL); + } + memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); + ret->type = XPATH_RANGE; + ret->user = start; + ret->index = startindex; + ret->user2 = end; + ret->index2 = endindex; + xmlXPtrRangeCheckOrder(ret); + return(ret); +} + +/** + * xmlXPtrNewRangePoints: + * @start: the starting point + * @end: the ending point + * + * Create a new xmlXPathObjectPtr of type range using 2 Points + * + * Returns the newly created object. + */ +xmlXPathObjectPtr +xmlXPtrNewRangePoints(xmlXPathObjectPtr start, xmlXPathObjectPtr end) { + xmlXPathObjectPtr ret; + + if (start == NULL) + return(NULL); + if (end == NULL) + return(NULL); + if (start->type != XPATH_POINT) + return(NULL); + if (end->type != XPATH_POINT) + return(NULL); + + ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); + if (ret == NULL) { + xmlXPtrErrMemory("allocating range"); + return(NULL); + } + memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); + ret->type = XPATH_RANGE; + ret->user = start->user; + ret->index = start->index; + ret->user2 = end->user; + ret->index2 = end->index; + xmlXPtrRangeCheckOrder(ret); + return(ret); +} + +/** + * xmlXPtrNewRangePointNode: + * @start: the starting point + * @end: the ending node + * + * Create a new xmlXPathObjectPtr of type range from a point to a node + * + * Returns the newly created object. + */ +xmlXPathObjectPtr +xmlXPtrNewRangePointNode(xmlXPathObjectPtr start, xmlNodePtr end) { + xmlXPathObjectPtr ret; + + if (start == NULL) + return(NULL); + if (end == NULL) + return(NULL); + if (start->type != XPATH_POINT) + return(NULL); + + ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); + if (ret == NULL) { + xmlXPtrErrMemory("allocating range"); + return(NULL); + } + memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); + ret->type = XPATH_RANGE; + ret->user = start->user; + ret->index = start->index; + ret->user2 = end; + ret->index2 = -1; + xmlXPtrRangeCheckOrder(ret); + return(ret); +} + +/** + * xmlXPtrNewRangeNodePoint: + * @start: the starting node + * @end: the ending point + * + * Create a new xmlXPathObjectPtr of type range from a node to a point + * + * Returns the newly created object. + */ +xmlXPathObjectPtr +xmlXPtrNewRangeNodePoint(xmlNodePtr start, xmlXPathObjectPtr end) { + xmlXPathObjectPtr ret; + + if (start == NULL) + return(NULL); + if (end == NULL) + return(NULL); + if (start->type != XPATH_POINT) + return(NULL); + if (end->type != XPATH_POINT) + return(NULL); + + ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); + if (ret == NULL) { + xmlXPtrErrMemory("allocating range"); + return(NULL); + } + memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); + ret->type = XPATH_RANGE; + ret->user = start; + ret->index = -1; + ret->user2 = end->user; + ret->index2 = end->index; + xmlXPtrRangeCheckOrder(ret); + return(ret); +} + +/** + * xmlXPtrNewRangeNodes: + * @start: the starting node + * @end: the ending node + * + * Create a new xmlXPathObjectPtr of type range using 2 nodes + * + * Returns the newly created object. + */ +xmlXPathObjectPtr +xmlXPtrNewRangeNodes(xmlNodePtr start, xmlNodePtr end) { + xmlXPathObjectPtr ret; + + if (start == NULL) + return(NULL); + if (end == NULL) + return(NULL); + + ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); + if (ret == NULL) { + xmlXPtrErrMemory("allocating range"); + return(NULL); + } + memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); + ret->type = XPATH_RANGE; + ret->user = start; + ret->index = -1; + ret->user2 = end; + ret->index2 = -1; + xmlXPtrRangeCheckOrder(ret); + return(ret); +} + +/** + * xmlXPtrNewCollapsedRange: + * @start: the starting and ending node + * + * Create a new xmlXPathObjectPtr of type range using a single nodes + * + * Returns the newly created object. + */ +xmlXPathObjectPtr +xmlXPtrNewCollapsedRange(xmlNodePtr start) { + xmlXPathObjectPtr ret; + + if (start == NULL) + return(NULL); + + ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); + if (ret == NULL) { + xmlXPtrErrMemory("allocating range"); + return(NULL); + } + memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); + ret->type = XPATH_RANGE; + ret->user = start; + ret->index = -1; + ret->user2 = NULL; + ret->index2 = -1; + return(ret); +} + +/** + * xmlXPtrNewRangeNodeObject: + * @start: the starting node + * @end: the ending object + * + * Create a new xmlXPathObjectPtr of type range from a not to an object + * + * Returns the newly created object. + */ +xmlXPathObjectPtr +xmlXPtrNewRangeNodeObject(xmlNodePtr start, xmlXPathObjectPtr end) { + xmlXPathObjectPtr ret; + + if (start == NULL) + return(NULL); + if (end == NULL) + return(NULL); + switch (end->type) { + case XPATH_POINT: + case XPATH_RANGE: + break; + case XPATH_NODESET: + /* + * Empty set ... + */ + if (end->nodesetval->nodeNr <= 0) + return(NULL); + break; + default: + /* TODO */ + return(NULL); + } + + ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); + if (ret == NULL) { + xmlXPtrErrMemory("allocating range"); + return(NULL); + } + memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); + ret->type = XPATH_RANGE; + ret->user = start; + ret->index = -1; + switch (end->type) { + case XPATH_POINT: + ret->user2 = end->user; + ret->index2 = end->index; + break; + case XPATH_RANGE: + ret->user2 = end->user2; + ret->index2 = end->index2; + break; + case XPATH_NODESET: { + ret->user2 = end->nodesetval->nodeTab[end->nodesetval->nodeNr - 1]; + ret->index2 = -1; + break; + } + default: + STRANGE + return(NULL); + } + xmlXPtrRangeCheckOrder(ret); + return(ret); +} + +#define XML_RANGESET_DEFAULT 10 + +/** + * xmlXPtrLocationSetCreate: + * @val: an initial xmlXPathObjectPtr, or NULL + * + * Create a new xmlLocationSetPtr of type double and of value @val + * + * Returns the newly created object. + */ +xmlLocationSetPtr +xmlXPtrLocationSetCreate(xmlXPathObjectPtr val) { + xmlLocationSetPtr ret; + + ret = (xmlLocationSetPtr) xmlMalloc(sizeof(xmlLocationSet)); + if (ret == NULL) { + xmlXPtrErrMemory("allocating locationset"); + return(NULL); + } + memset(ret, 0 , (size_t) sizeof(xmlLocationSet)); + if (val != NULL) { + ret->locTab = (xmlXPathObjectPtr *) xmlMalloc(XML_RANGESET_DEFAULT * + sizeof(xmlXPathObjectPtr)); + if (ret->locTab == NULL) { + xmlXPtrErrMemory("allocating locationset"); + xmlFree(ret); + return(NULL); + } + memset(ret->locTab, 0 , + XML_RANGESET_DEFAULT * (size_t) sizeof(xmlXPathObjectPtr)); + ret->locMax = XML_RANGESET_DEFAULT; + ret->locTab[ret->locNr++] = val; + } + return(ret); +} + +/** + * xmlXPtrLocationSetAdd: + * @cur: the initial range set + * @val: a new xmlXPathObjectPtr + * + * add a new xmlXPathObjectPtr to an existing LocationSet + * If the location already exist in the set @val is freed. + */ +void +xmlXPtrLocationSetAdd(xmlLocationSetPtr cur, xmlXPathObjectPtr val) { + int i; + + if ((cur == NULL) || (val == NULL)) return; + + /* + * check against doublons + */ + for (i = 0;i < cur->locNr;i++) { + if (xmlXPtrRangesEqual(cur->locTab[i], val)) { + xmlXPathFreeObject(val); + return; + } + } + + /* + * grow the locTab if needed + */ + if (cur->locMax == 0) { + cur->locTab = (xmlXPathObjectPtr *) xmlMalloc(XML_RANGESET_DEFAULT * + sizeof(xmlXPathObjectPtr)); + if (cur->locTab == NULL) { + xmlXPtrErrMemory("adding location to set"); + return; + } + memset(cur->locTab, 0 , + XML_RANGESET_DEFAULT * (size_t) sizeof(xmlXPathObjectPtr)); + cur->locMax = XML_RANGESET_DEFAULT; + } else if (cur->locNr == cur->locMax) { + xmlXPathObjectPtr *temp; + + cur->locMax *= 2; + temp = (xmlXPathObjectPtr *) xmlRealloc(cur->locTab, cur->locMax * + sizeof(xmlXPathObjectPtr)); + if (temp == NULL) { + xmlXPtrErrMemory("adding location to set"); + return; + } + cur->locTab = temp; + } + cur->locTab[cur->locNr++] = val; +} + +/** + * xmlXPtrLocationSetMerge: + * @val1: the first LocationSet + * @val2: the second LocationSet + * + * Merges two rangesets, all ranges from @val2 are added to @val1 + * + * Returns val1 once extended or NULL in case of error. + */ +xmlLocationSetPtr +xmlXPtrLocationSetMerge(xmlLocationSetPtr val1, xmlLocationSetPtr val2) { + int i; + + if (val1 == NULL) return(NULL); + if (val2 == NULL) return(val1); + + /* + * !!!!! this can be optimized a lot, knowing that both + * val1 and val2 already have unicity of their values. + */ + + for (i = 0;i < val2->locNr;i++) + xmlXPtrLocationSetAdd(val1, val2->locTab[i]); + + return(val1); +} + +/** + * xmlXPtrLocationSetDel: + * @cur: the initial range set + * @val: an xmlXPathObjectPtr + * + * Removes an xmlXPathObjectPtr from an existing LocationSet + */ +void +xmlXPtrLocationSetDel(xmlLocationSetPtr cur, xmlXPathObjectPtr val) { + int i; + + if (cur == NULL) return; + if (val == NULL) return; + + /* + * check against doublons + */ + for (i = 0;i < cur->locNr;i++) + if (cur->locTab[i] == val) break; + + if (i >= cur->locNr) { +#ifdef DEBUG + xmlGenericError(xmlGenericErrorContext, + "xmlXPtrLocationSetDel: Range wasn't found in RangeList\n"); +#endif + return; + } + cur->locNr--; + for (;i < cur->locNr;i++) + cur->locTab[i] = cur->locTab[i + 1]; + cur->locTab[cur->locNr] = NULL; +} + +/** + * xmlXPtrLocationSetRemove: + * @cur: the initial range set + * @val: the index to remove + * + * Removes an entry from an existing LocationSet list. + */ +void +xmlXPtrLocationSetRemove(xmlLocationSetPtr cur, int val) { + if (cur == NULL) return; + if (val >= cur->locNr) return; + cur->locNr--; + for (;val < cur->locNr;val++) + cur->locTab[val] = cur->locTab[val + 1]; + cur->locTab[cur->locNr] = NULL; +} + +/** + * xmlXPtrFreeLocationSet: + * @obj: the xmlLocationSetPtr to free + * + * Free the LocationSet compound (not the actual ranges !). + */ +void +xmlXPtrFreeLocationSet(xmlLocationSetPtr obj) { + int i; + + if (obj == NULL) return; + if (obj->locTab != NULL) { + for (i = 0;i < obj->locNr; i++) { + xmlXPathFreeObject(obj->locTab[i]); + } + xmlFree(obj->locTab); + } + xmlFree(obj); +} + +/** + * xmlXPtrNewLocationSetNodes: + * @start: the start NodePtr value + * @end: the end NodePtr value or NULL + * + * Create a new xmlXPathObjectPtr of type LocationSet and initialize + * it with the single range made of the two nodes @start and @end + * + * Returns the newly created object. + */ +xmlXPathObjectPtr +xmlXPtrNewLocationSetNodes(xmlNodePtr start, xmlNodePtr end) { + xmlXPathObjectPtr ret; + + ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); + if (ret == NULL) { + xmlXPtrErrMemory("allocating locationset"); + return(NULL); + } + memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); + ret->type = XPATH_LOCATIONSET; + if (end == NULL) + ret->user = xmlXPtrLocationSetCreate(xmlXPtrNewCollapsedRange(start)); + else + ret->user = xmlXPtrLocationSetCreate(xmlXPtrNewRangeNodes(start,end)); + return(ret); +} + +/** + * xmlXPtrNewLocationSetNodeSet: + * @set: a node set + * + * Create a new xmlXPathObjectPtr of type LocationSet and initialize + * it with all the nodes from @set + * + * Returns the newly created object. + */ +xmlXPathObjectPtr +xmlXPtrNewLocationSetNodeSet(xmlNodeSetPtr set) { + xmlXPathObjectPtr ret; + + ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); + if (ret == NULL) { + xmlXPtrErrMemory("allocating locationset"); + return(NULL); + } + memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); + ret->type = XPATH_LOCATIONSET; + if (set != NULL) { + int i; + xmlLocationSetPtr newset; + + newset = xmlXPtrLocationSetCreate(NULL); + if (newset == NULL) + return(ret); + + for (i = 0;i < set->nodeNr;i++) + xmlXPtrLocationSetAdd(newset, + xmlXPtrNewCollapsedRange(set->nodeTab[i])); + + ret->user = (void *) newset; + } + return(ret); +} + +/** + * xmlXPtrWrapLocationSet: + * @val: the LocationSet value + * + * Wrap the LocationSet @val in a new xmlXPathObjectPtr + * + * Returns the newly created object. + */ +xmlXPathObjectPtr +xmlXPtrWrapLocationSet(xmlLocationSetPtr val) { + xmlXPathObjectPtr ret; + + ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); + if (ret == NULL) { + xmlXPtrErrMemory("allocating locationset"); + return(NULL); + } + memset(ret, 0 , (size_t) sizeof(xmlXPathObject)); + ret->type = XPATH_LOCATIONSET; + ret->user = (void *) val; + return(ret); +} + +/************************************************************************ + * * + * The parser * + * * + ************************************************************************/ + +static void xmlXPtrEvalChildSeq(xmlXPathParserContextPtr ctxt, xmlChar *name); + +/* + * Macros for accessing the content. Those should be used only by the parser, + * and not exported. + * + * Dirty macros, i.e. one need to make assumption on the context to use them + * + * CUR_PTR return the current pointer to the xmlChar to be parsed. + * CUR returns the current xmlChar value, i.e. a 8 bit value + * in ISO-Latin or UTF-8. + * This should be used internally by the parser + * only to compare to ASCII values otherwise it would break when + * running with UTF-8 encoding. + * NXT(n) returns the n'th next xmlChar. Same as CUR is should be used only + * to compare on ASCII based substring. + * SKIP(n) Skip n xmlChar, and must also be used only to skip ASCII defined + * strings within the parser. + * CURRENT Returns the current char value, with the full decoding of + * UTF-8 if we are using this mode. It returns an int. + * NEXT Skip to the next character, this does the proper decoding + * in UTF-8 mode. It also pop-up unfinished entities on the fly. + * It returns the pointer to the current xmlChar. + */ + +#define CUR (*ctxt->cur) +#define SKIP(val) ctxt->cur += (val) +#define NXT(val) ctxt->cur[(val)] +#define CUR_PTR ctxt->cur + +#define SKIP_BLANKS \ + while (IS_BLANK_CH(*(ctxt->cur))) NEXT + +#define CURRENT (*ctxt->cur) +#define NEXT ((*ctxt->cur) ? ctxt->cur++: ctxt->cur) + +/* + * xmlXPtrGetChildNo: + * @ctxt: the XPointer Parser context + * @index: the child number + * + * Move the current node of the nodeset on the stack to the + * given child if found + */ +static void +xmlXPtrGetChildNo(xmlXPathParserContextPtr ctxt, int indx) { + xmlNodePtr cur = NULL; + xmlXPathObjectPtr obj; + xmlNodeSetPtr oldset; + + CHECK_TYPE(XPATH_NODESET); + obj = valuePop(ctxt); + oldset = obj->nodesetval; + if ((indx <= 0) || (oldset == NULL) || (oldset->nodeNr != 1)) { + xmlXPathFreeObject(obj); + valuePush(ctxt, xmlXPathNewNodeSet(NULL)); + return; + } + cur = xmlXPtrGetNthChild(oldset->nodeTab[0], indx); + if (cur == NULL) { + xmlXPathFreeObject(obj); + valuePush(ctxt, xmlXPathNewNodeSet(NULL)); + return; + } + oldset->nodeTab[0] = cur; + valuePush(ctxt, obj); +} + +/** + * xmlXPtrEvalXPtrPart: + * @ctxt: the XPointer Parser context + * @name: the preparsed Scheme for the XPtrPart + * + * XPtrPart ::= 'xpointer' '(' XPtrExpr ')' + * | Scheme '(' SchemeSpecificExpr ')' + * + * Scheme ::= NCName - 'xpointer' [VC: Non-XPointer schemes] + * + * SchemeSpecificExpr ::= StringWithBalancedParens + * + * StringWithBalancedParens ::= + * [^()]* ('(' StringWithBalancedParens ')' [^()]*)* + * [VC: Parenthesis escaping] + * + * XPtrExpr ::= Expr [VC: Parenthesis escaping] + * + * VC: Parenthesis escaping: + * The end of an XPointer part is signaled by the right parenthesis ")" + * character that is balanced with the left parenthesis "(" character + * that began the part. Any unbalanced parenthesis character inside the + * expression, even within literals, must be escaped with a circumflex (^) + * character preceding it. If the expression contains any literal + * occurrences of the circumflex, each must be escaped with an additional + * circumflex (that is, ^^). If the unescaped parentheses in the expression + * are not balanced, a syntax error results. + * + * Parse and evaluate an XPtrPart. Basically it generates the unescaped + * string and if the scheme is 'xpointer' it will call the XPath interpreter. + * + * TODO: there is no new scheme registration mechanism + */ + +static void +xmlXPtrEvalXPtrPart(xmlXPathParserContextPtr ctxt, xmlChar *name) { + xmlChar *buffer, *cur; + int len; + int level; + + if (name == NULL) + name = xmlXPathParseName(ctxt); + if (name == NULL) + XP_ERROR(XPATH_EXPR_ERROR); + + if (CUR != '(') + XP_ERROR(XPATH_EXPR_ERROR); + NEXT; + level = 1; + + len = xmlStrlen(ctxt->cur); + len++; + buffer = (xmlChar *) xmlMallocAtomic(len * sizeof (xmlChar)); + if (buffer == NULL) { + xmlXPtrErrMemory("allocating buffer"); + return; + } + + cur = buffer; + while (CUR != 0) { + if (CUR == ')') { + level--; + if (level == 0) { + NEXT; + break; + } + } else if (CUR == '(') { + level++; + } else if (CUR == '^') { + if ((NXT(1) == ')') || (NXT(1) == '(') || (NXT(1) == '^')) { + NEXT; + } + } + *cur++ = CUR; + NEXT; + } + *cur = 0; + + if ((level != 0) && (CUR == 0)) { + xmlFree(buffer); + XP_ERROR(XPTR_SYNTAX_ERROR); + } + + if (xmlStrEqual(name, (xmlChar *) "xpointer")) { + const xmlChar *left = CUR_PTR; + + CUR_PTR = buffer; + /* + * To evaluate an xpointer scheme element (4.3) we need: + * context initialized to the root + * context position initalized to 1 + * context size initialized to 1 + */ + ctxt->context->node = (xmlNodePtr)ctxt->context->doc; + ctxt->context->proximityPosition = 1; + ctxt->context->contextSize = 1; + xmlXPathEvalExpr(ctxt); + CUR_PTR=left; + } else if (xmlStrEqual(name, (xmlChar *) "element")) { + const xmlChar *left = CUR_PTR; + xmlChar *name2; + + CUR_PTR = buffer; + if (buffer[0] == '/') { + xmlXPathRoot(ctxt); + xmlXPtrEvalChildSeq(ctxt, NULL); + } else { + name2 = xmlXPathParseName(ctxt); + if (name2 == NULL) { + CUR_PTR = left; + xmlFree(buffer); + XP_ERROR(XPATH_EXPR_ERROR); + } + xmlXPtrEvalChildSeq(ctxt, name2); + } + CUR_PTR = left; +#ifdef XPTR_XMLNS_SCHEME + } else if (xmlStrEqual(name, (xmlChar *) "xmlns")) { + const xmlChar *left = CUR_PTR; + xmlChar *prefix; + xmlChar *URI; + xmlURIPtr value; + + CUR_PTR = buffer; + prefix = xmlXPathParseNCName(ctxt); + if (prefix == NULL) { + xmlFree(buffer); + xmlFree(name); + XP_ERROR(XPTR_SYNTAX_ERROR); + } + SKIP_BLANKS; + if (CUR != '=') { + xmlFree(prefix); + xmlFree(buffer); + xmlFree(name); + XP_ERROR(XPTR_SYNTAX_ERROR); + } + NEXT; + SKIP_BLANKS; + /* @@ check escaping in the XPointer WD */ + + value = xmlParseURI((const char *)ctxt->cur); + if (value == NULL) { + xmlFree(prefix); + xmlFree(buffer); + xmlFree(name); + XP_ERROR(XPTR_SYNTAX_ERROR); + } + URI = xmlSaveUri(value); + xmlFreeURI(value); + if (URI == NULL) { + xmlFree(prefix); + xmlFree(buffer); + xmlFree(name); + XP_ERROR(XPATH_MEMORY_ERROR); + } + + xmlXPathRegisterNs(ctxt->context, prefix, URI); + CUR_PTR = left; + xmlFree(URI); + xmlFree(prefix); +#endif /* XPTR_XMLNS_SCHEME */ + } else { + xmlXPtrErr(ctxt, XML_XPTR_UNKNOWN_SCHEME, + "unsupported scheme '%s'\n", name); + } + xmlFree(buffer); + xmlFree(name); +} + +/** + * xmlXPtrEvalFullXPtr: + * @ctxt: the XPointer Parser context + * @name: the preparsed Scheme for the first XPtrPart + * + * FullXPtr ::= XPtrPart (S? XPtrPart)* + * + * As the specs says: + * ----------- + * When multiple XPtrParts are provided, they must be evaluated in + * left-to-right order. If evaluation of one part fails, the nexti + * is evaluated. The following conditions cause XPointer part failure: + * + * - An unknown scheme + * - A scheme that does not locate any sub-resource present in the resource + * - A scheme that is not applicable to the media type of the resource + * + * The XPointer application must consume a failed XPointer part and + * attempt to evaluate the next one, if any. The result of the first + * XPointer part whose evaluation succeeds is taken to be the fragment + * located by the XPointer as a whole. If all the parts fail, the result + * for the XPointer as a whole is a sub-resource error. + * ----------- + * + * Parse and evaluate a Full XPtr i.e. possibly a cascade of XPath based + * expressions or other schemes. + */ +static void +xmlXPtrEvalFullXPtr(xmlXPathParserContextPtr ctxt, xmlChar *name) { + if (name == NULL) + name = xmlXPathParseName(ctxt); + if (name == NULL) + XP_ERROR(XPATH_EXPR_ERROR); + while (name != NULL) { + ctxt->error = XPATH_EXPRESSION_OK; + xmlXPtrEvalXPtrPart(ctxt, name); + + /* in case of syntax error, break here */ + if ((ctxt->error != XPATH_EXPRESSION_OK) && + (ctxt->error != XML_XPTR_UNKNOWN_SCHEME)) + return; + + /* + * If the returned value is a non-empty nodeset + * or location set, return here. + */ + if (ctxt->value != NULL) { + xmlXPathObjectPtr obj = ctxt->value; + + switch (obj->type) { + case XPATH_LOCATIONSET: { + xmlLocationSetPtr loc = ctxt->value->user; + if ((loc != NULL) && (loc->locNr > 0)) + return; + break; + } + case XPATH_NODESET: { + xmlNodeSetPtr loc = ctxt->value->nodesetval; + if ((loc != NULL) && (loc->nodeNr > 0)) + return; + break; + } + default: + break; + } + + /* + * Evaluating to improper values is equivalent to + * a sub-resource error, clean-up the stack + */ + do { + obj = valuePop(ctxt); + if (obj != NULL) { + xmlXPathFreeObject(obj); + } + } while (obj != NULL); + } + + /* + * Is there another XPointer part. + */ + SKIP_BLANKS; + name = xmlXPathParseName(ctxt); + } +} + +/** + * xmlXPtrEvalChildSeq: + * @ctxt: the XPointer Parser context + * @name: a possible ID name of the child sequence + * + * ChildSeq ::= '/1' ('/' [0-9]*)* + * | Name ('/' [0-9]*)+ + * + * Parse and evaluate a Child Sequence. This routine also handle the + * case of a Bare Name used to get a document ID. + */ +static void +xmlXPtrEvalChildSeq(xmlXPathParserContextPtr ctxt, xmlChar *name) { + /* + * XPointer don't allow by syntax to address in mutirooted trees + * this might prove useful in some cases, warn about it. + */ + if ((name == NULL) && (CUR == '/') && (NXT(1) != '1')) { + xmlXPtrErr(ctxt, XML_XPTR_CHILDSEQ_START, + "warning: ChildSeq not starting by /1\n", NULL); + } + + if (name != NULL) { + valuePush(ctxt, xmlXPathNewString(name)); + xmlFree(name); + xmlXPathIdFunction(ctxt, 1); + CHECK_ERROR; + } + + while (CUR == '/') { + int child = 0; + NEXT; + + while ((CUR >= '0') && (CUR <= '9')) { + child = child * 10 + (CUR - '0'); + NEXT; + } + xmlXPtrGetChildNo(ctxt, child); + } +} + + +/** + * xmlXPtrEvalXPointer: + * @ctxt: the XPointer Parser context + * + * XPointer ::= Name + * | ChildSeq + * | FullXPtr + * + * Parse and evaluate an XPointer + */ +static void +xmlXPtrEvalXPointer(xmlXPathParserContextPtr ctxt) { + if (ctxt->valueTab == NULL) { + /* Allocate the value stack */ + ctxt->valueTab = (xmlXPathObjectPtr *) + xmlMalloc(10 * sizeof(xmlXPathObjectPtr)); + if (ctxt->valueTab == NULL) { + xmlXPtrErrMemory("allocating evaluation context"); + return; + } + ctxt->valueNr = 0; + ctxt->valueMax = 10; + ctxt->value = NULL; + ctxt->valueFrame = 0; + } + SKIP_BLANKS; + if (CUR == '/') { + xmlXPathRoot(ctxt); + xmlXPtrEvalChildSeq(ctxt, NULL); + } else { + xmlChar *name; + + name = xmlXPathParseName(ctxt); + if (name == NULL) + XP_ERROR(XPATH_EXPR_ERROR); + if (CUR == '(') { + xmlXPtrEvalFullXPtr(ctxt, name); + /* Short evaluation */ + return; + } else { + /* this handle both Bare Names and Child Sequences */ + xmlXPtrEvalChildSeq(ctxt, name); + } + } + SKIP_BLANKS; + if (CUR != 0) + XP_ERROR(XPATH_EXPR_ERROR); +} + + +/************************************************************************ + * * + * General routines * + * * + ************************************************************************/ + +static +void xmlXPtrStringRangeFunction(xmlXPathParserContextPtr ctxt, int nargs); +static +void xmlXPtrStartPointFunction(xmlXPathParserContextPtr ctxt, int nargs); +static +void xmlXPtrEndPointFunction(xmlXPathParserContextPtr ctxt, int nargs); +static +void xmlXPtrHereFunction(xmlXPathParserContextPtr ctxt, int nargs); +static +void xmlXPtrOriginFunction(xmlXPathParserContextPtr ctxt, int nargs); +static +void xmlXPtrRangeInsideFunction(xmlXPathParserContextPtr ctxt, int nargs); +static +void xmlXPtrRangeFunction(xmlXPathParserContextPtr ctxt, int nargs); + +/** + * xmlXPtrNewContext: + * @doc: the XML document + * @here: the node that directly contains the XPointer being evaluated or NULL + * @origin: the element from which a user or program initiated traversal of + * the link, or NULL. + * + * Create a new XPointer context + * + * Returns the xmlXPathContext just allocated. + */ +xmlXPathContextPtr +xmlXPtrNewContext(xmlDocPtr doc, xmlNodePtr here, xmlNodePtr origin) { + xmlXPathContextPtr ret; + + ret = xmlXPathNewContext(doc); + if (ret == NULL) + return(ret); + ret->xptr = 1; + ret->here = here; + ret->origin = origin; + + xmlXPathRegisterFunc(ret, (xmlChar *)"range-to", + xmlXPtrRangeToFunction); + xmlXPathRegisterFunc(ret, (xmlChar *)"range", + xmlXPtrRangeFunction); + xmlXPathRegisterFunc(ret, (xmlChar *)"range-inside", + xmlXPtrRangeInsideFunction); + xmlXPathRegisterFunc(ret, (xmlChar *)"string-range", + xmlXPtrStringRangeFunction); + xmlXPathRegisterFunc(ret, (xmlChar *)"start-point", + xmlXPtrStartPointFunction); + xmlXPathRegisterFunc(ret, (xmlChar *)"end-point", + xmlXPtrEndPointFunction); + xmlXPathRegisterFunc(ret, (xmlChar *)"here", + xmlXPtrHereFunction); + xmlXPathRegisterFunc(ret, (xmlChar *)" origin", + xmlXPtrOriginFunction); + + return(ret); +} + +/** + * xmlXPtrEval: + * @str: the XPointer expression + * @ctx: the XPointer context + * + * Evaluate the XPath Location Path in the given context. + * + * Returns the xmlXPathObjectPtr resulting from the evaluation or NULL. + * the caller has to free the object. + */ +xmlXPathObjectPtr +xmlXPtrEval(const xmlChar *str, xmlXPathContextPtr ctx) { + xmlXPathParserContextPtr ctxt; + xmlXPathObjectPtr res = NULL, tmp; + xmlXPathObjectPtr init = NULL; + int stack = 0; + + xmlXPathInit(); + + if ((ctx == NULL) || (str == NULL)) + return(NULL); + + ctxt = xmlXPathNewParserContext(str, ctx); + ctxt->xptr = 1; + xmlXPtrEvalXPointer(ctxt); + + if ((ctxt->value != NULL) && + (ctxt->value->type != XPATH_NODESET) && + (ctxt->value->type != XPATH_LOCATIONSET)) { + xmlXPtrErr(ctxt, XML_XPTR_EVAL_FAILED, + "xmlXPtrEval: evaluation failed to return a node set\n", + NULL); + } else { + res = valuePop(ctxt); + } + + do { + tmp = valuePop(ctxt); + if (tmp != NULL) { + if (tmp != init) { + if (tmp->type == XPATH_NODESET) { + /* + * Evaluation may push a root nodeset which is unused + */ + xmlNodeSetPtr set; + set = tmp->nodesetval; + if ((set->nodeNr != 1) || + (set->nodeTab[0] != (xmlNodePtr) ctx->doc)) + stack++; + } else + stack++; + } + xmlXPathFreeObject(tmp); + } + } while (tmp != NULL); + if (stack != 0) { + xmlXPtrErr(ctxt, XML_XPTR_EXTRA_OBJECTS, + "xmlXPtrEval: object(s) left on the eval stack\n", + NULL); + } + if (ctxt->error != XPATH_EXPRESSION_OK) { + xmlXPathFreeObject(res); + res = NULL; + } + + xmlXPathFreeParserContext(ctxt); + return(res); +} + +/** + * xmlXPtrBuildRangeNodeList: + * @range: a range object + * + * Build a node list tree copy of the range + * + * Returns an xmlNodePtr list or NULL. + * the caller has to free the node tree. + */ +static xmlNodePtr +xmlXPtrBuildRangeNodeList(xmlXPathObjectPtr range) { + /* pointers to generated nodes */ + xmlNodePtr list = NULL, last = NULL, parent = NULL, tmp; + /* pointers to traversal nodes */ + xmlNodePtr start, cur, end; + int index1, index2; + + if (range == NULL) + return(NULL); + if (range->type != XPATH_RANGE) + return(NULL); + start = (xmlNodePtr) range->user; + + if ((start == NULL) || (start->type == XML_NAMESPACE_DECL)) + return(NULL); + end = range->user2; + if (end == NULL) + return(xmlCopyNode(start, 1)); + if (end->type == XML_NAMESPACE_DECL) + return(NULL); + + cur = start; + index1 = range->index; + index2 = range->index2; + while (cur != NULL) { + if (cur == end) { + if (cur->type == XML_TEXT_NODE) { + const xmlChar *content = cur->content; + int len; + + if (content == NULL) { + tmp = xmlNewTextLen(NULL, 0); + } else { + len = index2; + if ((cur == start) && (index1 > 1)) { + content += (index1 - 1); + len -= (index1 - 1); + index1 = 0; + } else { + len = index2; + } + tmp = xmlNewTextLen(content, len); + } + /* single sub text node selection */ + if (list == NULL) + return(tmp); + /* prune and return full set */ + if (last != NULL) + xmlAddNextSibling(last, tmp); + else + xmlAddChild(parent, tmp); + return(list); + } else { + tmp = xmlCopyNode(cur, 0); + if (list == NULL) + list = tmp; + else { + if (last != NULL) + xmlAddNextSibling(last, tmp); + else + xmlAddChild(parent, tmp); + } + last = NULL; + parent = tmp; + + if (index2 > 1) { + end = xmlXPtrGetNthChild(cur, index2 - 1); + index2 = 0; + } + if ((cur == start) && (index1 > 1)) { + cur = xmlXPtrGetNthChild(cur, index1 - 1); + index1 = 0; + } else { + cur = cur->children; + } + /* + * Now gather the remaining nodes from cur to end + */ + continue; /* while */ + } + } else if ((cur == start) && + (list == NULL) /* looks superfluous but ... */ ) { + if ((cur->type == XML_TEXT_NODE) || + (cur->type == XML_CDATA_SECTION_NODE)) { + const xmlChar *content = cur->content; + + if (content == NULL) { + tmp = xmlNewTextLen(NULL, 0); + } else { + if (index1 > 1) { + content += (index1 - 1); + } + tmp = xmlNewText(content); + } + last = list = tmp; + } else { + if ((cur == start) && (index1 > 1)) { + tmp = xmlCopyNode(cur, 0); + list = tmp; + parent = tmp; + last = NULL; + cur = xmlXPtrGetNthChild(cur, index1 - 1); + index1 = 0; + /* + * Now gather the remaining nodes from cur to end + */ + continue; /* while */ + } + tmp = xmlCopyNode(cur, 1); + list = tmp; + parent = NULL; + last = tmp; + } + } else { + tmp = NULL; + switch (cur->type) { + case XML_DTD_NODE: + case XML_ELEMENT_DECL: + case XML_ATTRIBUTE_DECL: + case XML_ENTITY_NODE: + /* Do not copy DTD informations */ + break; + case XML_ENTITY_DECL: + TODO /* handle crossing entities -> stack needed */ + break; + case XML_XINCLUDE_START: + case XML_XINCLUDE_END: + /* don't consider it part of the tree content */ + break; + case XML_ATTRIBUTE_NODE: + /* Humm, should not happen ! */ + STRANGE + break; + default: + tmp = xmlCopyNode(cur, 1); + break; + } + if (tmp != NULL) { + if ((list == NULL) || ((last == NULL) && (parent == NULL))) { + STRANGE + return(NULL); + } + if (last != NULL) + xmlAddNextSibling(last, tmp); + else { + xmlAddChild(parent, tmp); + last = tmp; + } + } + } + /* + * Skip to next node in document order + */ + if ((list == NULL) || ((last == NULL) && (parent == NULL))) { + STRANGE + return(NULL); + } + cur = xmlXPtrAdvanceNode(cur, NULL); + } + return(list); +} + +/** + * xmlXPtrBuildNodeList: + * @obj: the XPointer result from the evaluation. + * + * Build a node list tree copy of the XPointer result. + * This will drop Attributes and Namespace declarations. + * + * Returns an xmlNodePtr list or NULL. + * the caller has to free the node tree. + */ +xmlNodePtr +xmlXPtrBuildNodeList(xmlXPathObjectPtr obj) { + xmlNodePtr list = NULL, last = NULL; + int i; + + if (obj == NULL) + return(NULL); + switch (obj->type) { + case XPATH_NODESET: { + xmlNodeSetPtr set = obj->nodesetval; + if (set == NULL) + return(NULL); + for (i = 0;i < set->nodeNr;i++) { + if (set->nodeTab[i] == NULL) + continue; + switch (set->nodeTab[i]->type) { + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + case XML_ELEMENT_NODE: + case XML_ENTITY_REF_NODE: + case XML_ENTITY_NODE: + case XML_PI_NODE: + case XML_COMMENT_NODE: + case XML_DOCUMENT_NODE: + case XML_HTML_DOCUMENT_NODE: +#ifdef LIBXML_DOCB_ENABLED + case XML_DOCB_DOCUMENT_NODE: +#endif + case XML_XINCLUDE_START: + case XML_XINCLUDE_END: + break; + case XML_ATTRIBUTE_NODE: + case XML_NAMESPACE_DECL: + case XML_DOCUMENT_TYPE_NODE: + case XML_DOCUMENT_FRAG_NODE: + case XML_NOTATION_NODE: + case XML_DTD_NODE: + case XML_ELEMENT_DECL: + case XML_ATTRIBUTE_DECL: + case XML_ENTITY_DECL: + continue; /* for */ + } + if (last == NULL) + list = last = xmlCopyNode(set->nodeTab[i], 1); + else { + xmlAddNextSibling(last, xmlCopyNode(set->nodeTab[i], 1)); + if (last->next != NULL) + last = last->next; + } + } + break; + } + case XPATH_LOCATIONSET: { + xmlLocationSetPtr set = (xmlLocationSetPtr) obj->user; + if (set == NULL) + return(NULL); + for (i = 0;i < set->locNr;i++) { + if (last == NULL) + list = last = xmlXPtrBuildNodeList(set->locTab[i]); + else + xmlAddNextSibling(last, + xmlXPtrBuildNodeList(set->locTab[i])); + if (last != NULL) { + while (last->next != NULL) + last = last->next; + } + } + break; + } + case XPATH_RANGE: + return(xmlXPtrBuildRangeNodeList(obj)); + case XPATH_POINT: + return(xmlCopyNode(obj->user, 0)); + default: + break; + } + return(list); +} + +/************************************************************************ + * * + * XPointer functions * + * * + ************************************************************************/ + +/** + * xmlXPtrNbLocChildren: + * @node: an xmlNodePtr + * + * Count the number of location children of @node or the length of the + * string value in case of text/PI/Comments nodes + * + * Returns the number of location children + */ +static int +xmlXPtrNbLocChildren(xmlNodePtr node) { + int ret = 0; + if (node == NULL) + return(-1); + switch (node->type) { + case XML_HTML_DOCUMENT_NODE: + case XML_DOCUMENT_NODE: + case XML_ELEMENT_NODE: + node = node->children; + while (node != NULL) { + if (node->type == XML_ELEMENT_NODE) + ret++; + node = node->next; + } + break; + case XML_ATTRIBUTE_NODE: + return(-1); + + case XML_PI_NODE: + case XML_COMMENT_NODE: + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + case XML_ENTITY_REF_NODE: + ret = xmlStrlen(node->content); + break; + default: + return(-1); + } + return(ret); +} + +/** + * xmlXPtrHereFunction: + * @ctxt: the XPointer Parser context + * @nargs: the number of args + * + * Function implementing here() operation + * as described in 5.4.3 + */ +static void +xmlXPtrHereFunction(xmlXPathParserContextPtr ctxt, int nargs) { + CHECK_ARITY(0); + + if (ctxt->context->here == NULL) + XP_ERROR(XPTR_SYNTAX_ERROR); + + valuePush(ctxt, xmlXPtrNewLocationSetNodes(ctxt->context->here, NULL)); +} + +/** + * xmlXPtrOriginFunction: + * @ctxt: the XPointer Parser context + * @nargs: the number of args + * + * Function implementing origin() operation + * as described in 5.4.3 + */ +static void +xmlXPtrOriginFunction(xmlXPathParserContextPtr ctxt, int nargs) { + CHECK_ARITY(0); + + if (ctxt->context->origin == NULL) + XP_ERROR(XPTR_SYNTAX_ERROR); + + valuePush(ctxt, xmlXPtrNewLocationSetNodes(ctxt->context->origin, NULL)); +} + +/** + * xmlXPtrStartPointFunction: + * @ctxt: the XPointer Parser context + * @nargs: the number of args + * + * Function implementing start-point() operation + * as described in 5.4.3 + * ---------------- + * location-set start-point(location-set) + * + * For each location x in the argument location-set, start-point adds a + * location of type point to the result location-set. That point represents + * the start point of location x and is determined by the following rules: + * + * - If x is of type point, the start point is x. + * - If x is of type range, the start point is the start point of x. + * - If x is of type root, element, text, comment, or processing instruction, + * - the container node of the start point is x and the index is 0. + * - If x is of type attribute or namespace, the function must signal a + * syntax error. + * ---------------- + * + */ +static void +xmlXPtrStartPointFunction(xmlXPathParserContextPtr ctxt, int nargs) { + xmlXPathObjectPtr tmp, obj, point; + xmlLocationSetPtr newset = NULL; + xmlLocationSetPtr oldset = NULL; + + CHECK_ARITY(1); + if ((ctxt->value == NULL) || + ((ctxt->value->type != XPATH_LOCATIONSET) && + (ctxt->value->type != XPATH_NODESET))) + XP_ERROR(XPATH_INVALID_TYPE) + + obj = valuePop(ctxt); + if (obj->type == XPATH_NODESET) { + /* + * First convert to a location set + */ + tmp = xmlXPtrNewLocationSetNodeSet(obj->nodesetval); + xmlXPathFreeObject(obj); + obj = tmp; + } + + newset = xmlXPtrLocationSetCreate(NULL); + if (newset == NULL) { + xmlXPathFreeObject(obj); + XP_ERROR(XPATH_MEMORY_ERROR); + } + oldset = (xmlLocationSetPtr) obj->user; + if (oldset != NULL) { + int i; + + for (i = 0; i < oldset->locNr; i++) { + tmp = oldset->locTab[i]; + if (tmp == NULL) + continue; + point = NULL; + switch (tmp->type) { + case XPATH_POINT: + point = xmlXPtrNewPoint(tmp->user, tmp->index); + break; + case XPATH_RANGE: { + xmlNodePtr node = tmp->user; + if (node != NULL) { + if (node->type == XML_ATTRIBUTE_NODE) { + /* TODO: Namespace Nodes ??? */ + xmlXPathFreeObject(obj); + xmlXPtrFreeLocationSet(newset); + XP_ERROR(XPTR_SYNTAX_ERROR); + } + point = xmlXPtrNewPoint(node, tmp->index); + } + break; + } + default: + /*** Should we raise an error ? + xmlXPathFreeObject(obj); + xmlXPathFreeObject(newset); + XP_ERROR(XPATH_INVALID_TYPE) + ***/ + break; + } + if (point != NULL) + xmlXPtrLocationSetAdd(newset, point); + } + } + xmlXPathFreeObject(obj); + valuePush(ctxt, xmlXPtrWrapLocationSet(newset)); +} + +/** + * xmlXPtrEndPointFunction: + * @ctxt: the XPointer Parser context + * @nargs: the number of args + * + * Function implementing end-point() operation + * as described in 5.4.3 + * ---------------------------- + * location-set end-point(location-set) + * + * For each location x in the argument location-set, end-point adds a + * location of type point to the result location-set. That point represents + * the end point of location x and is determined by the following rules: + * + * - If x is of type point, the resulting point is x. + * - If x is of type range, the resulting point is the end point of x. + * - If x is of type root or element, the container node of the resulting + * point is x and the index is the number of location children of x. + * - If x is of type text, comment, or processing instruction, the container + * node of the resulting point is x and the index is the length of the + * string-value of x. + * - If x is of type attribute or namespace, the function must signal a + * syntax error. + * ---------------------------- + */ +static void +xmlXPtrEndPointFunction(xmlXPathParserContextPtr ctxt, int nargs) { + xmlXPathObjectPtr tmp, obj, point; + xmlLocationSetPtr newset = NULL; + xmlLocationSetPtr oldset = NULL; + + CHECK_ARITY(1); + if ((ctxt->value == NULL) || + ((ctxt->value->type != XPATH_LOCATIONSET) && + (ctxt->value->type != XPATH_NODESET))) + XP_ERROR(XPATH_INVALID_TYPE) + + obj = valuePop(ctxt); + if (obj->type == XPATH_NODESET) { + /* + * First convert to a location set + */ + tmp = xmlXPtrNewLocationSetNodeSet(obj->nodesetval); + xmlXPathFreeObject(obj); + obj = tmp; + } + + newset = xmlXPtrLocationSetCreate(NULL); + oldset = (xmlLocationSetPtr) obj->user; + if (oldset != NULL) { + int i; + + for (i = 0; i < oldset->locNr; i++) { + tmp = oldset->locTab[i]; + if (tmp == NULL) + continue; + point = NULL; + switch (tmp->type) { + case XPATH_POINT: + point = xmlXPtrNewPoint(tmp->user, tmp->index); + break; + case XPATH_RANGE: { + xmlNodePtr node = tmp->user2; + if (node != NULL) { + if (node->type == XML_ATTRIBUTE_NODE) { + /* TODO: Namespace Nodes ??? */ + xmlXPathFreeObject(obj); + xmlXPtrFreeLocationSet(newset); + XP_ERROR(XPTR_SYNTAX_ERROR); + } + point = xmlXPtrNewPoint(node, tmp->index2); + } else if (tmp->user == NULL) { + point = xmlXPtrNewPoint(node, + xmlXPtrNbLocChildren(node)); + } + break; + } + default: + /*** Should we raise an error ? + xmlXPathFreeObject(obj); + xmlXPathFreeObject(newset); + XP_ERROR(XPATH_INVALID_TYPE) + ***/ + break; + } + if (point != NULL) + xmlXPtrLocationSetAdd(newset, point); + } + } + xmlXPathFreeObject(obj); + valuePush(ctxt, xmlXPtrWrapLocationSet(newset)); +} + + +/** + * xmlXPtrCoveringRange: + * @ctxt: the XPointer Parser context + * @loc: the location for which the covering range must be computed + * + * A covering range is a range that wholly encompasses a location + * Section 5.3.3. Covering Ranges for All Location Types + * http://www.w3.org/TR/xptr#N2267 + * + * Returns a new location or NULL in case of error + */ +static xmlXPathObjectPtr +xmlXPtrCoveringRange(xmlXPathParserContextPtr ctxt, xmlXPathObjectPtr loc) { + if (loc == NULL) + return(NULL); + if ((ctxt == NULL) || (ctxt->context == NULL) || + (ctxt->context->doc == NULL)) + return(NULL); + switch (loc->type) { + case XPATH_POINT: + return(xmlXPtrNewRange(loc->user, loc->index, + loc->user, loc->index)); + case XPATH_RANGE: + if (loc->user2 != NULL) { + return(xmlXPtrNewRange(loc->user, loc->index, + loc->user2, loc->index2)); + } else { + xmlNodePtr node = (xmlNodePtr) loc->user; + if (node == (xmlNodePtr) ctxt->context->doc) { + return(xmlXPtrNewRange(node, 0, node, + xmlXPtrGetArity(node))); + } else { + switch (node->type) { + case XML_ATTRIBUTE_NODE: + /* !!! our model is slightly different than XPath */ + return(xmlXPtrNewRange(node, 0, node, + xmlXPtrGetArity(node))); + case XML_ELEMENT_NODE: + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + case XML_ENTITY_REF_NODE: + case XML_PI_NODE: + case XML_COMMENT_NODE: + case XML_DOCUMENT_NODE: + case XML_NOTATION_NODE: + case XML_HTML_DOCUMENT_NODE: { + int indx = xmlXPtrGetIndex(node); + + node = node->parent; + return(xmlXPtrNewRange(node, indx - 1, + node, indx + 1)); + } + default: + return(NULL); + } + } + } + default: + TODO /* missed one case ??? */ + } + return(NULL); +} + +/** + * xmlXPtrRangeFunction: + * @ctxt: the XPointer Parser context + * @nargs: the number of args + * + * Function implementing the range() function 5.4.3 + * location-set range(location-set ) + * + * The range function returns ranges covering the locations in + * the argument location-set. For each location x in the argument + * location-set, a range location representing the covering range of + * x is added to the result location-set. + */ +static void +xmlXPtrRangeFunction(xmlXPathParserContextPtr ctxt, int nargs) { + int i; + xmlXPathObjectPtr set; + xmlLocationSetPtr oldset; + xmlLocationSetPtr newset; + + CHECK_ARITY(1); + if ((ctxt->value == NULL) || + ((ctxt->value->type != XPATH_LOCATIONSET) && + (ctxt->value->type != XPATH_NODESET))) + XP_ERROR(XPATH_INVALID_TYPE) + + set = valuePop(ctxt); + if (set->type == XPATH_NODESET) { + xmlXPathObjectPtr tmp; + + /* + * First convert to a location set + */ + tmp = xmlXPtrNewLocationSetNodeSet(set->nodesetval); + xmlXPathFreeObject(set); + set = tmp; + } + oldset = (xmlLocationSetPtr) set->user; + + /* + * The loop is to compute the covering range for each item and add it + */ + newset = xmlXPtrLocationSetCreate(NULL); + for (i = 0;i < oldset->locNr;i++) { + xmlXPtrLocationSetAdd(newset, + xmlXPtrCoveringRange(ctxt, oldset->locTab[i])); + } + + /* + * Save the new value and cleanup + */ + valuePush(ctxt, xmlXPtrWrapLocationSet(newset)); + xmlXPathFreeObject(set); +} + +/** + * xmlXPtrInsideRange: + * @ctxt: the XPointer Parser context + * @loc: the location for which the inside range must be computed + * + * A inside range is a range described in the range-inside() description + * + * Returns a new location or NULL in case of error + */ +static xmlXPathObjectPtr +xmlXPtrInsideRange(xmlXPathParserContextPtr ctxt, xmlXPathObjectPtr loc) { + if (loc == NULL) + return(NULL); + if ((ctxt == NULL) || (ctxt->context == NULL) || + (ctxt->context->doc == NULL)) + return(NULL); + switch (loc->type) { + case XPATH_POINT: { + xmlNodePtr node = (xmlNodePtr) loc->user; + switch (node->type) { + case XML_PI_NODE: + case XML_COMMENT_NODE: + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: { + if (node->content == NULL) { + return(xmlXPtrNewRange(node, 0, node, 0)); + } else { + return(xmlXPtrNewRange(node, 0, node, + xmlStrlen(node->content))); + } + } + case XML_ATTRIBUTE_NODE: + case XML_ELEMENT_NODE: + case XML_ENTITY_REF_NODE: + case XML_DOCUMENT_NODE: + case XML_NOTATION_NODE: + case XML_HTML_DOCUMENT_NODE: { + return(xmlXPtrNewRange(node, 0, node, + xmlXPtrGetArity(node))); + } + default: + break; + } + return(NULL); + } + case XPATH_RANGE: { + xmlNodePtr node = (xmlNodePtr) loc->user; + if (loc->user2 != NULL) { + return(xmlXPtrNewRange(node, loc->index, + loc->user2, loc->index2)); + } else { + switch (node->type) { + case XML_PI_NODE: + case XML_COMMENT_NODE: + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: { + if (node->content == NULL) { + return(xmlXPtrNewRange(node, 0, node, 0)); + } else { + return(xmlXPtrNewRange(node, 0, node, + xmlStrlen(node->content))); + } + } + case XML_ATTRIBUTE_NODE: + case XML_ELEMENT_NODE: + case XML_ENTITY_REF_NODE: + case XML_DOCUMENT_NODE: + case XML_NOTATION_NODE: + case XML_HTML_DOCUMENT_NODE: { + return(xmlXPtrNewRange(node, 0, node, + xmlXPtrGetArity(node))); + } + default: + break; + } + return(NULL); + } + } + default: + TODO /* missed one case ??? */ + } + return(NULL); +} + +/** + * xmlXPtrRangeInsideFunction: + * @ctxt: the XPointer Parser context + * @nargs: the number of args + * + * Function implementing the range-inside() function 5.4.3 + * location-set range-inside(location-set ) + * + * The range-inside function returns ranges covering the contents of + * the locations in the argument location-set. For each location x in + * the argument location-set, a range location is added to the result + * location-set. If x is a range location, then x is added to the + * result location-set. If x is not a range location, then x is used + * as the container location of the start and end points of the range + * location to be added; the index of the start point of the range is + * zero; if the end point is a character point then its index is the + * length of the string-value of x, and otherwise is the number of + * location children of x. + * + */ +static void +xmlXPtrRangeInsideFunction(xmlXPathParserContextPtr ctxt, int nargs) { + int i; + xmlXPathObjectPtr set; + xmlLocationSetPtr oldset; + xmlLocationSetPtr newset; + + CHECK_ARITY(1); + if ((ctxt->value == NULL) || + ((ctxt->value->type != XPATH_LOCATIONSET) && + (ctxt->value->type != XPATH_NODESET))) + XP_ERROR(XPATH_INVALID_TYPE) + + set = valuePop(ctxt); + if (set->type == XPATH_NODESET) { + xmlXPathObjectPtr tmp; + + /* + * First convert to a location set + */ + tmp = xmlXPtrNewLocationSetNodeSet(set->nodesetval); + xmlXPathFreeObject(set); + set = tmp; + } + oldset = (xmlLocationSetPtr) set->user; + + /* + * The loop is to compute the covering range for each item and add it + */ + newset = xmlXPtrLocationSetCreate(NULL); + for (i = 0;i < oldset->locNr;i++) { + xmlXPtrLocationSetAdd(newset, + xmlXPtrInsideRange(ctxt, oldset->locTab[i])); + } + + /* + * Save the new value and cleanup + */ + valuePush(ctxt, xmlXPtrWrapLocationSet(newset)); + xmlXPathFreeObject(set); +} + +/** + * xmlXPtrRangeToFunction: + * @ctxt: the XPointer Parser context + * @nargs: the number of args + * + * Implement the range-to() XPointer function + */ +void +xmlXPtrRangeToFunction(xmlXPathParserContextPtr ctxt, int nargs) { + xmlXPathObjectPtr range; + const xmlChar *cur; + xmlXPathObjectPtr res, obj; + xmlXPathObjectPtr tmp; + xmlLocationSetPtr newset = NULL; + xmlNodeSetPtr oldset; + int i; + + if (ctxt == NULL) return; + CHECK_ARITY(1); + /* + * Save the expression pointer since we will have to evaluate + * it multiple times. Initialize the new set. + */ + CHECK_TYPE(XPATH_NODESET); + obj = valuePop(ctxt); + oldset = obj->nodesetval; + ctxt->context->node = NULL; + + cur = ctxt->cur; + newset = xmlXPtrLocationSetCreate(NULL); + + for (i = 0; i < oldset->nodeNr; i++) { + ctxt->cur = cur; + + /* + * Run the evaluation with a node list made of a single item + * in the nodeset. + */ + ctxt->context->node = oldset->nodeTab[i]; + tmp = xmlXPathNewNodeSet(ctxt->context->node); + valuePush(ctxt, tmp); + + xmlXPathEvalExpr(ctxt); + CHECK_ERROR; + + /* + * The result of the evaluation need to be tested to + * decided whether the filter succeeded or not + */ + res = valuePop(ctxt); + range = xmlXPtrNewRangeNodeObject(oldset->nodeTab[i], res); + if (range != NULL) { + xmlXPtrLocationSetAdd(newset, range); + } + + /* + * Cleanup + */ + if (res != NULL) + xmlXPathFreeObject(res); + if (ctxt->value == tmp) { + res = valuePop(ctxt); + xmlXPathFreeObject(res); + } + + ctxt->context->node = NULL; + } + + /* + * The result is used as the new evaluation set. + */ + xmlXPathFreeObject(obj); + ctxt->context->node = NULL; + ctxt->context->contextSize = -1; + ctxt->context->proximityPosition = -1; + valuePush(ctxt, xmlXPtrWrapLocationSet(newset)); +} + +/** + * xmlXPtrAdvanceNode: + * @cur: the node + * @level: incremented/decremented to show level in tree + * + * Advance to the next element or text node in document order + * TODO: add a stack for entering/exiting entities + * + * Returns -1 in case of failure, 0 otherwise + */ +xmlNodePtr +xmlXPtrAdvanceNode(xmlNodePtr cur, int *level) { +next: + if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL)) + return(NULL); + if (cur->children != NULL) { + cur = cur->children ; + if (level != NULL) + (*level)++; + goto found; + } +skip: /* This label should only be needed if something is wrong! */ + if (cur->next != NULL) { + cur = cur->next; + goto found; + } + do { + cur = cur->parent; + if (level != NULL) + (*level)--; + if (cur == NULL) return(NULL); + if (cur->next != NULL) { + cur = cur->next; + goto found; + } + } while (cur != NULL); + +found: + if ((cur->type != XML_ELEMENT_NODE) && + (cur->type != XML_TEXT_NODE) && + (cur->type != XML_DOCUMENT_NODE) && + (cur->type != XML_HTML_DOCUMENT_NODE) && + (cur->type != XML_CDATA_SECTION_NODE)) { + if (cur->type == XML_ENTITY_REF_NODE) { /* Shouldn't happen */ + TODO + goto skip; + } + goto next; + } + return(cur); +} + +/** + * xmlXPtrAdvanceChar: + * @node: the node + * @indx: the indx + * @bytes: the number of bytes + * + * Advance a point of the associated number of bytes (not UTF8 chars) + * + * Returns -1 in case of failure, 0 otherwise + */ +static int +xmlXPtrAdvanceChar(xmlNodePtr *node, int *indx, int bytes) { + xmlNodePtr cur; + int pos; + int len; + + if ((node == NULL) || (indx == NULL)) + return(-1); + cur = *node; + if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL)) + return(-1); + pos = *indx; + + while (bytes >= 0) { + /* + * First position to the beginning of the first text node + * corresponding to this point + */ + while ((cur != NULL) && + ((cur->type == XML_ELEMENT_NODE) || + (cur->type == XML_DOCUMENT_NODE) || + (cur->type == XML_HTML_DOCUMENT_NODE))) { + if (pos > 0) { + cur = xmlXPtrGetNthChild(cur, pos); + pos = 0; + } else { + cur = xmlXPtrAdvanceNode(cur, NULL); + pos = 0; + } + } + + if (cur == NULL) { + *node = NULL; + *indx = 0; + return(-1); + } + + /* + * if there is no move needed return the current value. + */ + if (pos == 0) pos = 1; + if (bytes == 0) { + *node = cur; + *indx = pos; + return(0); + } + /* + * We should have a text (or cdata) node ... + */ + len = 0; + if ((cur->type != XML_ELEMENT_NODE) && + (cur->content != NULL)) { + len = xmlStrlen(cur->content); + } + if (pos > len) { + /* Strange, the indx in the text node is greater than it's len */ + STRANGE + pos = len; + } + if (pos + bytes >= len) { + bytes -= (len - pos); + cur = xmlXPtrAdvanceNode(cur, NULL); + pos = 0; + } else if (pos + bytes < len) { + pos += bytes; + *node = cur; + *indx = pos; + return(0); + } + } + return(-1); +} + +/** + * xmlXPtrMatchString: + * @string: the string to search + * @start: the start textnode + * @startindex: the start index + * @end: the end textnode IN/OUT + * @endindex: the end index IN/OUT + * + * Check whether the document contains @string at the position + * (@start, @startindex) and limited by the (@end, @endindex) point + * + * Returns -1 in case of failure, 0 if not found, 1 if found in which case + * (@start, @startindex) will indicate the position of the beginning + * of the range and (@end, @endindex) will indicate the end + * of the range + */ +static int +xmlXPtrMatchString(const xmlChar *string, xmlNodePtr start, int startindex, + xmlNodePtr *end, int *endindex) { + xmlNodePtr cur; + int pos; /* 0 based */ + int len; /* in bytes */ + int stringlen; /* in bytes */ + int match; + + if (string == NULL) + return(-1); + if ((start == NULL) || (start->type == XML_NAMESPACE_DECL)) + return(-1); + if ((end == NULL) || (*end == NULL) || + ((*end)->type == XML_NAMESPACE_DECL) || (endindex == NULL)) + return(-1); + cur = start; + if (cur == NULL) + return(-1); + pos = startindex - 1; + stringlen = xmlStrlen(string); + + while (stringlen > 0) { + if ((cur == *end) && (pos + stringlen > *endindex)) + return(0); + + if ((cur->type != XML_ELEMENT_NODE) && (cur->content != NULL)) { + len = xmlStrlen(cur->content); + if (len >= pos + stringlen) { + match = (!xmlStrncmp(&cur->content[pos], string, stringlen)); + if (match) { +#ifdef DEBUG_RANGES + xmlGenericError(xmlGenericErrorContext, + "found range %d bytes at index %d of ->", + stringlen, pos + 1); + xmlDebugDumpString(stdout, cur->content); + xmlGenericError(xmlGenericErrorContext, "\n"); +#endif + *end = cur; + *endindex = pos + stringlen; + return(1); + } else { + return(0); + } + } else { + int sub = len - pos; + match = (!xmlStrncmp(&cur->content[pos], string, sub)); + if (match) { +#ifdef DEBUG_RANGES + xmlGenericError(xmlGenericErrorContext, + "found subrange %d bytes at index %d of ->", + sub, pos + 1); + xmlDebugDumpString(stdout, cur->content); + xmlGenericError(xmlGenericErrorContext, "\n"); +#endif + string = &string[sub]; + stringlen -= sub; + } else { + return(0); + } + } + } + cur = xmlXPtrAdvanceNode(cur, NULL); + if (cur == NULL) + return(0); + pos = 0; + } + return(1); +} + +/** + * xmlXPtrSearchString: + * @string: the string to search + * @start: the start textnode IN/OUT + * @startindex: the start index IN/OUT + * @end: the end textnode + * @endindex: the end index + * + * Search the next occurrence of @string within the document content + * until the (@end, @endindex) point is reached + * + * Returns -1 in case of failure, 0 if not found, 1 if found in which case + * (@start, @startindex) will indicate the position of the beginning + * of the range and (@end, @endindex) will indicate the end + * of the range + */ +static int +xmlXPtrSearchString(const xmlChar *string, xmlNodePtr *start, int *startindex, + xmlNodePtr *end, int *endindex) { + xmlNodePtr cur; + const xmlChar *str; + int pos; /* 0 based */ + int len; /* in bytes */ + xmlChar first; + + if (string == NULL) + return(-1); + if ((start == NULL) || (*start == NULL) || + ((*start)->type == XML_NAMESPACE_DECL) || (startindex == NULL)) + return(-1); + if ((end == NULL) || (endindex == NULL)) + return(-1); + cur = *start; + pos = *startindex - 1; + first = string[0]; + + while (cur != NULL) { + if ((cur->type != XML_ELEMENT_NODE) && (cur->content != NULL)) { + len = xmlStrlen(cur->content); + while (pos <= len) { + if (first != 0) { + str = xmlStrchr(&cur->content[pos], first); + if (str != NULL) { + pos = (str - (xmlChar *)(cur->content)); +#ifdef DEBUG_RANGES + xmlGenericError(xmlGenericErrorContext, + "found '%c' at index %d of ->", + first, pos + 1); + xmlDebugDumpString(stdout, cur->content); + xmlGenericError(xmlGenericErrorContext, "\n"); +#endif + if (xmlXPtrMatchString(string, cur, pos + 1, + end, endindex)) { + *start = cur; + *startindex = pos + 1; + return(1); + } + pos++; + } else { + pos = len + 1; + } + } else { + /* + * An empty string is considered to match before each + * character of the string-value and after the final + * character. + */ +#ifdef DEBUG_RANGES + xmlGenericError(xmlGenericErrorContext, + "found '' at index %d of ->", + pos + 1); + xmlDebugDumpString(stdout, cur->content); + xmlGenericError(xmlGenericErrorContext, "\n"); +#endif + *start = cur; + *startindex = pos + 1; + *end = cur; + *endindex = pos + 1; + return(1); + } + } + } + if ((cur == *end) && (pos >= *endindex)) + return(0); + cur = xmlXPtrAdvanceNode(cur, NULL); + if (cur == NULL) + return(0); + pos = 1; + } + return(0); +} + +/** + * xmlXPtrGetLastChar: + * @node: the node + * @index: the index + * + * Computes the point coordinates of the last char of this point + * + * Returns -1 in case of failure, 0 otherwise + */ +static int +xmlXPtrGetLastChar(xmlNodePtr *node, int *indx) { + xmlNodePtr cur; + int pos, len = 0; + + if ((node == NULL) || (*node == NULL) || + ((*node)->type == XML_NAMESPACE_DECL) || (indx == NULL)) + return(-1); + cur = *node; + pos = *indx; + + if ((cur->type == XML_ELEMENT_NODE) || + (cur->type == XML_DOCUMENT_NODE) || + (cur->type == XML_HTML_DOCUMENT_NODE)) { + if (pos > 0) { + cur = xmlXPtrGetNthChild(cur, pos); + } + } + while (cur != NULL) { + if (cur->last != NULL) + cur = cur->last; + else if ((cur->type != XML_ELEMENT_NODE) && + (cur->content != NULL)) { + len = xmlStrlen(cur->content); + break; + } else { + return(-1); + } + } + if (cur == NULL) + return(-1); + *node = cur; + *indx = len; + return(0); +} + +/** + * xmlXPtrGetStartPoint: + * @obj: an range + * @node: the resulting node + * @indx: the resulting index + * + * read the object and return the start point coordinates. + * + * Returns -1 in case of failure, 0 otherwise + */ +static int +xmlXPtrGetStartPoint(xmlXPathObjectPtr obj, xmlNodePtr *node, int *indx) { + if ((obj == NULL) || (node == NULL) || (indx == NULL)) + return(-1); + + switch (obj->type) { + case XPATH_POINT: + *node = obj->user; + if (obj->index <= 0) + *indx = 0; + else + *indx = obj->index; + return(0); + case XPATH_RANGE: + *node = obj->user; + if (obj->index <= 0) + *indx = 0; + else + *indx = obj->index; + return(0); + default: + break; + } + return(-1); +} + +/** + * xmlXPtrGetEndPoint: + * @obj: an range + * @node: the resulting node + * @indx: the resulting indx + * + * read the object and return the end point coordinates. + * + * Returns -1 in case of failure, 0 otherwise + */ +static int +xmlXPtrGetEndPoint(xmlXPathObjectPtr obj, xmlNodePtr *node, int *indx) { + if ((obj == NULL) || (node == NULL) || (indx == NULL)) + return(-1); + + switch (obj->type) { + case XPATH_POINT: + *node = obj->user; + if (obj->index <= 0) + *indx = 0; + else + *indx = obj->index; + return(0); + case XPATH_RANGE: + *node = obj->user; + if (obj->index <= 0) + *indx = 0; + else + *indx = obj->index; + return(0); + default: + break; + } + return(-1); +} + +/** + * xmlXPtrStringRangeFunction: + * @ctxt: the XPointer Parser context + * @nargs: the number of args + * + * Function implementing the string-range() function + * range as described in 5.4.2 + * + * ------------------------------ + * [Definition: For each location in the location-set argument, + * string-range returns a set of string ranges, a set of substrings in a + * string. Specifically, the string-value of the location is searched for + * substrings that match the string argument, and the resulting location-set + * will contain a range location for each non-overlapping match.] + * An empty string is considered to match before each character of the + * string-value and after the final character. Whitespace in a string + * is matched literally, with no normalization except that provided by + * XML for line ends. The third argument gives the position of the first + * character to be in the resulting range, relative to the start of the + * match. The default value is 1, which makes the range start immediately + * before the first character of the matched string. The fourth argument + * gives the number of characters in the range; the default is that the + * range extends to the end of the matched string. + * + * Element boundaries, as well as entire embedded nodes such as processing + * instructions and comments, are ignored as defined in [XPath]. + * + * If the string in the second argument is not found in the string-value + * of the location, or if a value in the third or fourth argument indicates + * a string that is beyond the beginning or end of the document, the + * expression fails. + * + * The points of the range-locations in the returned location-set will + * all be character points. + * ------------------------------ + */ +static void +xmlXPtrStringRangeFunction(xmlXPathParserContextPtr ctxt, int nargs) { + int i, startindex, endindex = 0, fendindex; + xmlNodePtr start, end = 0, fend; + xmlXPathObjectPtr set; + xmlLocationSetPtr oldset; + xmlLocationSetPtr newset; + xmlXPathObjectPtr string; + xmlXPathObjectPtr position = NULL; + xmlXPathObjectPtr number = NULL; + int found, pos = 0, num = 0; + + /* + * Grab the arguments + */ + if ((nargs < 2) || (nargs > 4)) + XP_ERROR(XPATH_INVALID_ARITY); + + if (nargs >= 4) { + CHECK_TYPE(XPATH_NUMBER); + number = valuePop(ctxt); + if (number != NULL) + num = (int) number->floatval; + } + if (nargs >= 3) { + CHECK_TYPE(XPATH_NUMBER); + position = valuePop(ctxt); + if (position != NULL) + pos = (int) position->floatval; + } + CHECK_TYPE(XPATH_STRING); + string = valuePop(ctxt); + if ((ctxt->value == NULL) || + ((ctxt->value->type != XPATH_LOCATIONSET) && + (ctxt->value->type != XPATH_NODESET))) + XP_ERROR(XPATH_INVALID_TYPE) + + set = valuePop(ctxt); + newset = xmlXPtrLocationSetCreate(NULL); + if (set->nodesetval == NULL) { + goto error; + } + if (set->type == XPATH_NODESET) { + xmlXPathObjectPtr tmp; + + /* + * First convert to a location set + */ + tmp = xmlXPtrNewLocationSetNodeSet(set->nodesetval); + xmlXPathFreeObject(set); + set = tmp; + } + oldset = (xmlLocationSetPtr) set->user; + + /* + * The loop is to search for each element in the location set + * the list of location set corresponding to that search + */ + for (i = 0;i < oldset->locNr;i++) { +#ifdef DEBUG_RANGES + xmlXPathDebugDumpObject(stdout, oldset->locTab[i], 0); +#endif + + xmlXPtrGetStartPoint(oldset->locTab[i], &start, &startindex); + xmlXPtrGetEndPoint(oldset->locTab[i], &end, &endindex); + xmlXPtrAdvanceChar(&start, &startindex, 0); + xmlXPtrGetLastChar(&end, &endindex); + +#ifdef DEBUG_RANGES + xmlGenericError(xmlGenericErrorContext, + "from index %d of ->", startindex); + xmlDebugDumpString(stdout, start->content); + xmlGenericError(xmlGenericErrorContext, "\n"); + xmlGenericError(xmlGenericErrorContext, + "to index %d of ->", endindex); + xmlDebugDumpString(stdout, end->content); + xmlGenericError(xmlGenericErrorContext, "\n"); +#endif + do { + fend = end; + fendindex = endindex; + found = xmlXPtrSearchString(string->stringval, &start, &startindex, + &fend, &fendindex); + if (found == 1) { + if (position == NULL) { + xmlXPtrLocationSetAdd(newset, + xmlXPtrNewRange(start, startindex, fend, fendindex)); + } else if (xmlXPtrAdvanceChar(&start, &startindex, + pos - 1) == 0) { + if ((number != NULL) && (num > 0)) { + int rindx; + xmlNodePtr rend; + rend = start; + rindx = startindex - 1; + if (xmlXPtrAdvanceChar(&rend, &rindx, + num) == 0) { + xmlXPtrLocationSetAdd(newset, + xmlXPtrNewRange(start, startindex, + rend, rindx)); + } + } else if ((number != NULL) && (num <= 0)) { + xmlXPtrLocationSetAdd(newset, + xmlXPtrNewRange(start, startindex, + start, startindex)); + } else { + xmlXPtrLocationSetAdd(newset, + xmlXPtrNewRange(start, startindex, + fend, fendindex)); + } + } + start = fend; + startindex = fendindex; + if (string->stringval[0] == 0) + startindex++; + } + } while (found == 1); + } + + /* + * Save the new value and cleanup + */ +error: + valuePush(ctxt, xmlXPtrWrapLocationSet(newset)); + xmlXPathFreeObject(set); + xmlXPathFreeObject(string); + if (position) xmlXPathFreeObject(position); + if (number) xmlXPathFreeObject(number); +} + +/** + * xmlXPtrEvalRangePredicate: + * @ctxt: the XPointer Parser context + * + * [8] Predicate ::= '[' PredicateExpr ']' + * [9] PredicateExpr ::= Expr + * + * Evaluate a predicate as in xmlXPathEvalPredicate() but for + * a Location Set instead of a node set + */ +void +xmlXPtrEvalRangePredicate(xmlXPathParserContextPtr ctxt) { + const xmlChar *cur; + xmlXPathObjectPtr res; + xmlXPathObjectPtr obj, tmp; + xmlLocationSetPtr newset = NULL; + xmlLocationSetPtr oldset; + int i; + + if (ctxt == NULL) return; + + SKIP_BLANKS; + if (CUR != '[') { + XP_ERROR(XPATH_INVALID_PREDICATE_ERROR); + } + NEXT; + SKIP_BLANKS; + + /* + * Extract the old set, and then evaluate the result of the + * expression for all the element in the set. use it to grow + * up a new set. + */ + CHECK_TYPE(XPATH_LOCATIONSET); + obj = valuePop(ctxt); + oldset = obj->user; + ctxt->context->node = NULL; + + if ((oldset == NULL) || (oldset->locNr == 0)) { + ctxt->context->contextSize = 0; + ctxt->context->proximityPosition = 0; + xmlXPathEvalExpr(ctxt); + res = valuePop(ctxt); + if (res != NULL) + xmlXPathFreeObject(res); + valuePush(ctxt, obj); + CHECK_ERROR; + } else { + /* + * Save the expression pointer since we will have to evaluate + * it multiple times. Initialize the new set. + */ + cur = ctxt->cur; + newset = xmlXPtrLocationSetCreate(NULL); + + for (i = 0; i < oldset->locNr; i++) { + ctxt->cur = cur; + + /* + * Run the evaluation with a node list made of a single item + * in the nodeset. + */ + ctxt->context->node = oldset->locTab[i]->user; + tmp = xmlXPathNewNodeSet(ctxt->context->node); + valuePush(ctxt, tmp); + ctxt->context->contextSize = oldset->locNr; + ctxt->context->proximityPosition = i + 1; + + xmlXPathEvalExpr(ctxt); + CHECK_ERROR; + + /* + * The result of the evaluation need to be tested to + * decided whether the filter succeeded or not + */ + res = valuePop(ctxt); + if (xmlXPathEvaluatePredicateResult(ctxt, res)) { + xmlXPtrLocationSetAdd(newset, + xmlXPathObjectCopy(oldset->locTab[i])); + } + + /* + * Cleanup + */ + if (res != NULL) + xmlXPathFreeObject(res); + if (ctxt->value == tmp) { + res = valuePop(ctxt); + xmlXPathFreeObject(res); + } + + ctxt->context->node = NULL; + } + + /* + * The result is used as the new evaluation set. + */ + xmlXPathFreeObject(obj); + ctxt->context->node = NULL; + ctxt->context->contextSize = -1; + ctxt->context->proximityPosition = -1; + valuePush(ctxt, xmlXPtrWrapLocationSet(newset)); + } + if (CUR != ']') { + XP_ERROR(XPATH_INVALID_PREDICATE_ERROR); + } + + NEXT; + SKIP_BLANKS; +} + +#define bottom_xpointer +#include "elfgcchack.h" +#endif + diff --git a/vendors/libxml2/lib/libxml2.lib b/vendors/libxml2/lib/libxml2.lib deleted file mode 100644 index 485869d1873d2faea90858a6d49940cd1799c882..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 377216 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

  • cp_< zAS>rJcO&<0-V--dQ<6Yk$*>FL`QUi9j zUv`*{MteiU!*-c2vCN)RgQ{0>orgPCZMLHMn;vVTI>|IWeDy{#j<%r)Z_A=vAqTNF zL8sETljjUK$hqM4Psiql-?e%CS{2{ej)mnbqIKo*Sm<+fWSzE6*JMv?4DjGB{ZwnOJU>du}dl< zc`u8+t&>rZJ2=MytkQd1Om&mMM3j%NXGT@+lKVJ$eXASegaC4L@9U(G*XhX>Md`w% zMmG3?DYX2CS}wH-eaP-+7EP4Yst#g<@BsK zfBcz*%`UPS5Aw0|Ls95hqch5bEpk^@CphXle#m~v;nm^Lh(FY(_qsbriJp0K-c&V@ zhq=hz=vjFD2(09XySNU;magQDo)g(RlJyZzX5Jc)Uc+{apvD+)bpQHD*Jm)&U!^jm zcTA76d9gYldPaH;jr5}}s=X14rSzOSRRrfT7SDA_B_@KM_pur=fAB-yZWsF7ewb}W z{`uov+>z1Yx#2)2*a08!WIEDg#TFTP=TC4^&E|DtB07gW(LN3c(Bh}MsIDQF%L**v(_GYP9&8ocCBS>S#TyImyoEfr zXV|<>twy#m&d34};+YniT;p-NeKHcoq@#=cv}gI55i&r~I6vDat8TE7b{upPdCq>w zQ?rBHd7kTL$Jp<{-u^rfHOh|Xi6y8vFVA;#!}mOoy->GqFYq#>?0SIwLND26I>f8k z6C+X;DqrL$N7(t$PXA&LIm+G#H2NiOu4|yhyC1SzFNNG-%K=UVFLRRvcU~mx%PnGl zF8Ci<=vVBA96Zk8mg1Fewz^Z^u#RmE(iMz6$X9u&)%un+F!vL9kgs-A2fQ1-#zP(S zZuD9=cc8n`>%7cC??$ipl3hkps>{f3yunY7u^V}Ig^Oq(e50St3e&M=EZ!eBdREk> z^ahT1KgoDqU6LhqrlFTp`@+To`PpyreuAltE;y*;LKquG z0^aIoyHsC3>cA6w8{~%WTN^x@r*byl?j}>EHfkOnYtIJy_KsEYgGa!Vk9`h}z&p_= zh_I)jO6~80>=-*6vbgU?^zi-7<1MLN<@fA|9A%dS{P*sM?^^KEy$*GeeBXZfQEjc~ zq^)l4-;X|rYY^mC57?d$tb!iA^1+?o2N8dOC!`M{?o1N+K7E7dG^jFAKa9u`B6sL* z=||k`z;Q-*L?3k%gGU&h$Uf#}QvD6)xJc~@qJG>>jWDCA7uYA<)T@y5Ae9>Rc=_b& z_=X9Qegd?fJ_SF4?L3Itp18ltcKtMFJDdkG9YifZ1L>yoASMHk@w59QyPOC4z6CzP z=l1srqU@X-J#&8v&Hd;1_X&UlA)X7*=TJKM1^78!!yu*uFYb%0p@*)1aBBM!&=N?kzXJjd@?53R09^X!AlFvA> zFyCaKg5E9fNSbw`7Y_h!yj0s!Jm_1D-n~>;h4U%Hx6ui#HG|>;-)7t^)3jUR*e`U{ zG5-#umygr@c(JiDy^41FicXILLYZsMQXGTo-|_^+Wz?(gmu3S*;Y~ zk-q`9O@RCpfW7ud>=VpHw!r9A_hUv@W#Xr@{0;J4vdFIhr1Ot7?)F_G(0=zbPWM%ai=b_2$N4$?6l$;O?m96%D-UF&AKf+mk}+$IrDQ%;i<{bPQSw@T)uTcQT-C*E8`Zo275fCuWWHJn ziqW9@7{9hzmZUs+S-h%&AN8A6&^HCizTV@vt1cA3<#ehiTn+4yie~k9oYu_taut$} zD|*N9d!0qu9@WYODQ;M#Z=Gj9JdsB74~$2RoauQen>P9S@I>fU?bJUq8a3V99mYZy z=uZ}_7eC;WCzcQC<)0ZdYh=sWE?$;MtSg>)g?h>S7Z;73Tk2A5lsXhsJ^srYqW+ar zS4Nx3Uh~PGnCHy=AdPbWLH z_>7APt53je9oN3OV1b%`XCGhe0lFgz_oI;$uv<6npxVV6et4F5*#@r5*7 zY$lB*KIBr_H+t6XZAqj5vpW84r_rcUH`36&drwS8!ztsXuD&l=1AuNok|Wc=-cbnUDb3U*6e%ir+O`U;Qq+D1#eMa zQkeIKUThw;>dz47!=e6w2eZ#G$V$tH7^D&AbV#)d?HY%gB<}u;*AHSHX0mwWq^PXJ zO%``*qOy)KS=HD!JYk>CY7A7myW`Nl`&R|UsY_^U!NdsJ4w=`J;)Qnr1tO2g$ z6HL|seVP+Z)&S#PCz-5JjR&^yWRo>O|7nfEnjP5cI>jUnaCMz(vI3)&$nM_SWDU?) zJI!Q;Y9X+@ryH!h3`{d_W0D5AbDd$bc+*R{p8?kKnIhP`NPm@V=cc8TBb=*0t;_u3uQDUzs5A0m$C)twJcG*K9 zo&nG5RC$)?Ik`F0Bes-|YG<9#>GgIqt4&w)i}}D=N7M@#HE%ys*%xJoQFQ%6M%_oP z-m~`XzFIArPnu!Tb+n!@;?ySHnS|a%dv0S@t-G}@nkR%T)gyFwd9ltNrAz*18W<5k zH?!+FZBJ597Lz7-8l}>qIb6?pWFY60HeVi68oH0!pwp*>c*ZiJe_a8o_;vJ=Q_xYTVACHWvq(t8sfq%V;Y3K|#7^knes6#-h}!z;go1 zX1Jrpa$fYySB1w*P<5v7WHD(ej${q;(Sp2rv=T34%+9q*lkNcrMjPg|=5lBEQWy>0 zJ8#ly%E{YXU1*bmT^OU%Zu!^t#kW*nQ9k4d=hqiIHFnv5MY0@tB1HS=s7<$kQfZO3 z+idf?j#n+z+9980%%FDaS>TwW%(TlHEuC)~&8Vg0iSFySFjjSOX}Ve6LmBMbTj?x$ z)7c_@&7A}(9rYg`H|epMVCTAmGn?e^)p>bvv4ozNP^wDZl{#&Fdbpnkzz0=q;Wv8T z18pGY1Y;JNFVzY;({vUmL!Z@ESAnFW{IDP^jI?-C{}fjy_4y9Jz7dZy*wdyA*5XRF zNO}pA59C;GHJJ5efvb^tPSFlJ&1vmqcc|8)J#CwdHocV9Rpzxvg{AX}e6ShDU!tQ5 zn@0J_dRB|7hCOSsT;T(;bRL^T2j);9 z{k?2->2BxNaS{GV14;mwXOx#KfNiW$aeGpTngF(pA3E^MdtaT5k*cBhwLnm`*^(vmm+j z9^XS%T1vg2VJ@vK)zz&T+q9(eqqV<_v9tPORx?9*Vp)+_u*i7+XAn{u(YbwzG500) zrk|? z!MOcM6PrTm`bReBIyY~aiZlcN4JYm7jo5hV&Dl z2=#r~C)h`Zg_~+I3s~y=>MW|vlGL)meyAu~d_RLWpVaqqQ!SRw6a7-}t?qBoxXBQc zK=$MVIH@|p(;4N~$+JRK{?h{u*43S)eg*9XG0vsPe|Qk*E?4;xP%I-_0S{)ZwANYV z!94NYdEQ5#K;!uk##%~3?=RK?jeMxV3cLMBKGDM%sY<13jFKhd`9kaZ;W}-*N>mHY z+CWv#9>Hkcr_>`fZ42aq4bNxI>SC3m>fOkwnMx+r9CTWFr2aW_2T;ZHXVY3*v4V9{ zF500Ug}JeAQarE9*U*}IwEhY19Oq6GbrF3G=S9k_K(W}za^kgQV5uolLbV!}U4~Y? znvj)vT*00h-`uKDzFd%}jjY7uO%fIAVlc5>sD}CzO4{~1-T9Mbj>2Hlm4fz>Cl5NcdlGef`Xr5Il~omwBif0dtdrVJD(M(DXNdI_gOzbtR4y0TiJ!_@ z^@YHW+DNXaaaJSa&S6x!p3YgV(3-nQu4fpm&ivqXGxS9RvK!Ct(^_eJsx{rr0__Iy37@00f=MWH_1qqbia=HuHg&2sO0T81SoJoA zke?LS0I9oA-SE6HpoE=}d`DL9CG_8il4|K&86^ zy0d?QLC(kCSsG4CMOh~=)Tsj*Z6x!HbUNi}_GfuCt#CDy%8a!8#Xf2T-9o4p1AhOhlNTD*S>I?CMJ-x|8rI!wDX~vZF%?5L8z1*Z3R4%FKgsd_N-(pi;W>(GwbNW`Bsf=EW z?oavf%Beuow;9ywtPw|2V2|EzGCQrMk$&|paVFt=G- zn3RTgly@1lnJf!^^9?M)yL+^&$LU3MXCWP5!itDxp`wXvk`?@N_3b1en7RBrI?J?C?w`>PXUR_sDZuH))nBvRGb3{)Ct8xFC^}J+}C4 z(&SH?WMw5tq2{ul@J#5KtM^l0@}Nii(_V6n(MFM*&$!4=^^%S>qJGv*bqFh^BAx!6 zMa?_%xD`vT(;gpDWypNqM;@@mUog2{-v2=2FZ#%ir6iqW>T+xo?W9cSII$fdKkm6!#;>q+4-S9Vy%%d2+qapxOMfPR!e}j&_zC3cGow5t{b}*2_u+MhCNb=NK`*jP7$zT&mw@j6vx@@JgaqM{atcw!o`20wSv zX0v8Hv=b%X@b&^^PBI*+KD@JSvt_hUm`D;cB^$Czy_ZyRB zE%umt`CAu_g1eL$&6c{D33iO%nM~?Tsyd6c19xMTVe@;FNgc$}K6fTk`3Er zB5-WE$cbP-{;P*LQEi3lEZC3#W>OsvfOsZ>xAS+C*KNBV=XMM1%>Q8AUeJ0X%XSB5 zGouLKKmE+9S*A$h5eBRCUpjS5(we1<^$0NophN%GiQ`ns)Nv&sl@RUH|6x3;>oBmf z{4Xb|3W($#hwhpvQ+(*qZb!_k)t%0GYrHJaZ22yU_fQ}q!uqcQ%w=eJw z4T|y{r1K^cPoPe!m56vSC$`*&RVfk0%?@G2lwR7^LthC4PvcMr&2hAmYYo^f4r9!W zYPzVz5~qQYbHSPFaGgte_%Tj6sM5(1j7LtY11Q!U&s?fkQAZwn#L&)_F=k?`^@or@BMjU~-nDX7& z5hVw1vftbzF25+pE8LffEG_W(>#GttxeK8MsqQ|&-mYXkTf{6T04W{4e7E^&0 zy_rFEsHxm)1JC#71}`_F!MRRo&p(zESK7lA%WTmz^DrytSsUsW{T4pr)+Rl1=gy*d zEnuGG2jyIY4yD&Dia{U1-^Oh!0l|WDH3sgahL8ar0cCB0a znFF5D6HM}0R;y)ugMCOO?TKFIY;|5;rw5HQ%85A1B=83dLNFVHL}WX7m&2)H?c?+C zoVkG3o^EpK5}lGu!?YIc+P87@rUG+ZfH!o8o4CDRy{^MAC&a50#COkhP*vDdB}cHq z6|YZZ6V7r`sZv|;z6~_!YzK4Hc*-swS>T(T(rTak!1vhXA}cJLQYjJn9wR>D zfcL9WA2&2F0j$o=E~eq4OUD*vUyQkUc|Fj1<9UIUit52%j;Il46=~BJ#15QUB=fk7 zo91~Str7J|G%&{oy=S|^&7N|C#nu>gJ-pIQE;P*f0i>FSe4`1*H%lN$NhpRe$w?j6 ztk{v_BOhIl|E}&irgY|PJ88CCJF4v^Cs-^i*z>k>Zj*wi>TQtYd4-q?&JWWzHHxHY zpWS9NC(`<2tT6_D%nT!U<{ilna$WN5>#A?otify1%~gGIco+E8`99D~|=lkheSOPNBskj!sioaqe;?qQ_pS+khQ9F-pt`)$+L7MH_Iu=*|YS-l|a) zH`2&@R*$Nvb{Ed=xRGLO=vg!BuKBJyF*golwQ6Iwy2u|Z$Tb#N;Ja}qb@w1IF@nE_ zJk-1UnStIKTATOKsXLlU!<9ZHA6uY7J58c96d=|h5PP`BB)UQYav8ztCNYVQ!?{#K zlqWo|^HOR&$x}|`vVr-l^jYm@UZ7ZwW^ld|dhxZO5v`}$a@oKRnHr=SN);|&46%d1 zoD1yDE{&`1swOD8wcDqHU#>`X2Kn)e8dKw$m%DN~fj_SqdN9BUbXB6zFdo*UQv~!vBU?g3m=nS}5V=6aVGY@QR F{|^VXF3bP` diff --git a/vendors/libxml2/lib/libxml2_a.lib b/vendors/libxml2/lib/libxml2_a.lib deleted file mode 100644 index abd0c71b538bc11c0ecf382897f42c4c7002caab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3098346 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 z zmRu8TYG0&}iwi@1(3e<@V+Nj-gZ~BR##BAUYvjb&gGg zpzM22g()gI=xN<46sWDVxq_TbryfdF=x2V?07y74zOQ?eo}dZy44?W1BM#gnTnu_S z=009oq@ERvg-EbA`lL4bVZJDB@(L#|`Fh5;i=sV*!3gU@VtRK)NT?|=kSG;ngAd5h zRO{#X5@q*@x^cg`*($IuW9QW#@x5JD6G&=Oqj4rk%gGq`!5nalwFOl0c!Y@EXK1oE z!}%*>q!J}1barY<<`m$M;Oq5Uz>()z8U`!?*^}?vY@AXXrVT;oGgk!0h?|dzR=E$o zWGJ0qU0QABYa1dGYqh_`Ya=QvT`7^sl~ksta3(SD)`QAoTA{{0A>r5(iK7nF59{v@ zX#u4W|2E)-eEhR4uE)ACdqxth8^A@ZC0g#Z|B6Rrok$vqVa;8qT>CpLR6?cWwjbzJ zE==Pfg@m{hKrDMI`%$Y#l0q3`ysdg)bWb71N65aMTxmVOH+wG&kT1cn(X-(4U6Wpn zw~jBsA_mM7NmPV_E=iZ7Un*NYB&)@XscGN^bIGk#x&F=O3y5K@Iv`W^3yhBy*LE*W$PCJ>WeZOJ5o`&-(g5ZR(C$+2>U=R? zIB0!5yAkHvF@u0p0i1 zFDPM{;!wJlJen$!R>uMNhj!ug3Z!Y+RalYZ{%BHjV{XYKwMfF*IJk^iCSEQ>j%k54 zSG#yZf9j7LxvHu2Ow*=1gydi`M-P9%mI{K!j%hQbl6QhDjO;x%2MLVr0k+gqUL-Ny zk`N1skm{e&m<<6cr3@#zTB=`O{3MqCIe#!X>m;mWZ$@(ij~<(hYOk`yzxaZwf7(+N zgS2U7k~MT~S3=jCvR1C_fJMfD#he3))c3jN?YWN!W{UC+q*9PT@*}An1S!A9(vM?C z&zlmAm7s8Pq@+&>MG0(=vd1K6>R~$ei5{VhT~1DuZViQq+uY!2lgyy=Y&g_KDw!rO zBVSWe+tE{WYq1-fgV0x1F%dPwKA7By-(?g<2+ja8;S%1ejxNPljQ5~9_htjW!|WX& z8mUdtyn1>60g6T^i9=1t5RPLu#_-ru6jx>HJ#!!~ZW`-774WdkQY|}0f>wK z1}Y>cn9Pc_{AA1pfG*TZ34jh>U>*)Mz%(2@>3Lod_2#v=*K|LGhL4JdaU@%vkwQ`8 zG_vim#=e&!A`0p3ongSj8_d25q5)!ju$WnNYtG(4`cqTporF`$*)-2D97hu}`P2^B z1S01NC)wMHV^IMS#=r?4mW8ZQ&CIScE`53r)KKDhjwxZ2++tuu4-?WcJ)A zsFhO5U!=3})M`f}JhDDmt%Ih?@OCjcvtdCQfkKKtX=S*UJHI*;tf;0h%Y6`IWRRp+SUmCEiJFvw&qNW}pnVV?>Ucs%dHo>5fYTj|j`r zWC1mLR?K@y&6!Rg+9e^u$_XI$kN2My%a`-!dMhSoS;t-w$KogMNLFS1PTB(RP8kIv zg`QiJ9$jc^N5&-F76TVwIjo71k3*T;(PAn`-PDlcAqkmTV1ju$)S*@ck+H{jRugp2 zez#6fDBpZRg?x~TM0q9z*gHRd)TYCvNPH_PGQc~lm-O6T>*?a18yU=rMrX|3Tu%mRe}{CHFb_y%OL^3?vKZ@yYwIgf4mL*11XZ0{t__){&yfgF zQa-Zs)FVPH7@ic2?|a;NERCnzr-!SP1M>wWWq_W7VDTg6Ib?t$0Ldc*7xx<-6(x(R zG5(kyAWHi=(pGD;&(226Ef@0GgKSj zAB zl94DUnihX_b0S8mq>%S{I^(nqJ&Aox1BHm%4Yx8!j=!ai@v!Tzci4~34DwI{NGO4s&sgO{6&(1@G-hDc zNWbC#dJ~N?F|5sq1;p}b?qPgx4Tv>IXQ{A&Sj&;msHst(sQ9}&cDeufdFrWO808wLe_1Zs8p^06r{UC^$SI1> zL7hF9mCz6=Z6^?+)6(E>#bhk51hXa85SzN7NTGR}I7gBpPAM9nELzkQr&ec0oxlD# z8h3>ucgnamhiBT+BFF9t-=vrl!K>Ipm+j?-fgC1bhu@m7X%XfrmEMlUDVU!za8^oE z^g%+L?TX%~wxL&(%mzFzhsA=KM+@*sSfWgtt||()P_>iD^}*n9a>Q*g*`x}pZ2z9x zmFA+A=&4ic(w7Ml(ttPqY<+(#?DpVfCF~cgesAcXtmo?~^aQL~dhGxi6*Ik%M8Au_ zEEv)hoFXC=>z+m(`Wm<8C{Iu0jXhG!W6T#@42$ za9s&e2H{Efd2%%7$U~JzLnV|8`Alu`w&7kNqDpb0-T)vbBcVxRFT*~(SkQI`HaKxm zs`yYmHKqVm&kRNz^z!Gzi_EU6T?oi`N#D;g{12+!g4wRc>X*jY4Zqkfo{m&pog^B> zWfgBF907cC3B0t^98l3$DEnO075oMMGZiHta0m)07GMJpG?Id#tDy|QV(fK z#v`W!6%b|I1}*E;Y4BZ1uWn)mR20++_M>%u8hI7XhI7 zYTFxYYaWYQHqe@n*_c|G8R058O`h2ZfrM9v6U%@!NR%%rW;2(3%uYvupQ*>%>#!b1 zCAbSea*`VlNGMFtN&{Xm+QSdcxsB38yI5B zr1sLkmI+NVm^KldQ71Q<%?a2d^#avp_Yr6lrihJ%2uvi6b(xgU0;tjcG+Efm;{hRo zTT}Nn7G_kn1Uqe_oJNcg*<1LI7EPEc#iJ#jh>u!7nQb#7)UY^&#v1qWVM@3hHlPmA zvl@1B5#&JL_9yPd?VjVXs2gp76rL4Uv9v=amIe3jgC`Z$a1vMsxUS|Ow)5Z zj9&lhIsbTfdQ(e`J7%pAROlZ&ZD`X#fcq`Sss8!}f#QiOcW$3MMir3x<(c9x%$N@dxdjj(vMvs3Bp|64*PK3E98S6IA!CGx(e-KpOaz z*a2}x1b8ykkcaA0OG7SwkVSAvs|S18W^ocq-bc1nZKcxM!>Y?VB??8yR7l2^Xqjws zW%9R%N2&F=AYx3LpJltKbVBnPfSeG&sMo<^`2$YdA)RQX9MZI~9buNy6}Cpy()lFt zWLHzaK>-?3M0+d}J0k_bpe`{RQW?Zj1kGuH!BCtrBDBLZc)qYiMe^UDp~!YhtG}!Gjfr%+SP~VS(dQP{<&Vv$w6!JKR##g+=FQfT~3M~)t)E*l`vVt<<`s$&-Y zmRemxwsJO#yrUvxHf!a}l9(ytGL*3aIcRLz;AD#ds|SnW>Nb}Ys0Yz}%FO6sn@s5+384MkKq2d09Xd@#0W zyP6FKm9_%_P*%s(8l5SZp5sr;UnyyU0Al%8c z1O}=fQw&0pn3^lN$s`#fe^^gr-}D95!c)n1Bl)Wq_Ja*|Dy7oU!d7+*C;&}hedS}K}? zv9hCf8rrBgL@q5bSF+i`uk$MmIb#5@vg|k?OU=0|2UkIM5FBxewz3D7M>$6_KEG4t z%v43D7tR+@qYU(QmG(y7eo`mdXA+u2i%><$3s_MZ}T#|x&q=3ut7Y8 z7EJ^x)M*d5B*?j?%Ib8Er!&UTp@vmKP!RAtcH9G_Id8+{hGCmTM8|$)Q4J*;P;1y& z+DNOm4O`%oe2YD}7T`vZv2~FaZ9%j4m;2>i4zP$y({l=@Ig&|7&DuJm_8WOa3p)&j zPOfTJvv^qka-q%d$Bk|ZnrFwI->*-zBm%d3oYm5VE z-R}D7y?y2D+dJpl&QGQQi0=MWv8pGO!P(dI%<{AhH`+U~1er5A+=H32YT;W9YPJrh{C$yiAZ9&Fe9K~cnI1(G(TA6olxKWjRPb5y5M zYTwGkA_nAN1Sg=P&E30Cv<9yv_?$Y5#{S=@ZjxVRZ0faj{Z*JyU(P2qOtC+)?wHM9 zB@`~lx1V|Ec7=miV6;+g9P{@F=SGfiJV=qe8Cx^^s)K~A>9j@8y}bI~>gpg1C}@Ud z4H3^C`vJIdRl`vMgR?7o9RPp>B$5&YC~)Bn{s3@H@<=hbX-@C3>;vqz#NcKKK{xNM zp&XK+2#6H`P1zZ6cIJc}qN0^G$F*LtmDJU6x;+G|l+xH#SK;eZ(fge>I%H1KcS%Sj z&cI%dLxOWj_a`LcX5$njKCFnr!=|8mPTw!Qw!xCna%8A}={q`}ciqIq4^h#=`v7*S z{bdwg4j_<#1HviUdDt~MNbSt?hsPUx1y%&qlKQF&{*gFiy>UfNi5#jcy|2%blVe*= zUB%>+1E#D@b&z)$?SC~J?g}w40Q*&`{rVveD`z@a#LOV!;Tsid+dnzvJJwQ<#JOrfFVAxPl5K0Z&K0UhB!hGx3Qn9=K)MTVIG7=XUl1oiKONjx8W)RLo7!{&+j{5)I?e-(8 z5~UZmT9M=VnL-O!NbtdAA?~&5TOZaMybnqJ5hd6DmYhH{5FdRUrik%sZbb9f>A`f^ z?;Km?A~r6=$Q1;Hz>jq{jp(}XRY=pU4Y)6um`Dkl#x{M=(nO;TP?wp~E-^DO+50z2 zF&MzjX5F+Tn~_Njhwn8w1GN?t-r2WZ>~LbXMgT-TS|5CA2d3Em@$oUWjAjf7-))tX z##l+Yd!9Ji|Jgw(|B22bg8vi)Un!=r;^>tM+}s1pcQ}E;(gP+XB{B$c?Ag3F-Jq61xU__O_q(eoCh=2WFiEGzQow z`=hjm^2@lvARwp8GLGCcePa; zn5emm^&O}7Y0Ck1v^qXHwhLtuis=K245!qi9Numm0oW{ITVcl~MF1xUJDI7#`QYrN zmNyBva08fWKQQBc4RuXPfFt)#eHx4=5Ir@F{4-zvp#?Q`_)+i>6-dl_rvQbbq5Q$- z?9*faekFk-y^gw3|8G1k1RbL;P&3bb#=IWiYN5ApGJjZKF&@*c$G$`g9)IKyYBQ?N z8r;0&jp0YD&IEn`K_d9&3FG1^37+Bg_MsQK`NhE0<8o(`#rq$_u!fsw+v!=1q#veV zx>(^T%S-$5lJ%DHs_`y#5Se3*fU3&E2`5`THwnk3#7!I^V(EeRW1(;` zUhetu#Yam_dW3_`%yiU=>kprA&e0RxzGRcs>Juj-(!WPTf&SU@acbiA&r|ifVevr!^^EoAd7BUjp zSG!%8U}mF0F{91kMPY)}OQ@we6D#bkK#5Qyt@hu#pSz-Bx{z<>Z51Gm-LeWO!y(8g zAny`aX}y(%6vTWy6bpvE*QE5s1hE7%i3|zVNB(1v{WX?<(ibsbo}T${&)mCMyL~DJ zlP;0N^xeC}24UnvuMJ3Mb3f`ezE?1PIl$YqEPm^@rI1<{q?kH6gQb9o^0o4l zjv~tBtp(V8y-e$8Gd!)w!r2rLS zNDLPx)&w=!p8n&Q_mC~rD6X(oS$5Xf9D_+lR)U{-a!L+;8S8&c;XbM%kWtQb^tEX1 zH6b_XAPJHyoc!0j?yAcAhzD0BUtr>7oFTGoHx)wy^uq|B_xQ5KWHfvuZXm2? zupgpF@_!t~9sVqPBSu8dk+3Dp-t)d{i%oY~w~PFZfZ~y-2n03*l~(T&v=AT+1P5CR z>7X%c;^~VSP=@|ec@l;n&O^%aZ0DGdB1}Jh29|@I-lPDromq4()8eYj1u$=&D zmyx;Fp|5hpjB(P%P---!C={YQ+t_!wi!a9C3Z)Sld&z!aAKi4njXzofY@z21Xy)U& zs2!b~$>=3E|Jeduy&F^{6@Ui!iwN28?(b}=SD<5NBuAi6>Mvl$G+iB735*g%HD>m> zIXTb}CRpz#UpZJABi6mx_Z606dOEr;c6ogNasQVWD=pt{?G4;DH4 z2&(G2SqQQUDsiLIBf|xb@g86T&J_t^U>g?DaWIt%KJ8`T zq^2&j5hWjlI=K=L61K=Yg%JICC4j}okxUS3%eQD6tb4Y6`t8ujGq(k2j}l@x5gC6O zKC`8WC3AR4t+B<<){vvCN8fLu$BK|7p~tVZAQ6QY@~VjWL%~wRidGX;LefzJ@w&pF zE$xE&_Web*sDAI?UtV3vtjQ++8d&RwP%TWkX-y6WJpN4^axnKI;5uHDKalHH`0bf+nBCF^?LlCuAU7QcMsbrXxS??stzm zddaMS4y&I{Te7rFq)}+I7|pH{nYC4aXFCys|++SgHLNk8c9a~;DphctrICd{D^J1A>|-m z#R>f(-H~j{G~0BRu@+)6)ae?mtH}HHW{uBH^V-^$7iiNuR-@w-7Z#pAXyO3Gge42S zkIs^PRt&kx0uDt1sP=u$QCAJZwq8xEteP`kghyKv0-u2R$5&jC2MR{(Y0&4R4GLWF zM})G#3L)lv3K5FnYK1pyK{oVB<=SRermn3IIDQ0_XtjmZ1Pvgm>^Im^my_Qfi3A8@ z*3S?2+%LC#4TX9L&_xyvhLlZ11}ZCQbvfrwEHn>re^LK?Iyi=cFkH+*it|467$>Z&i-B26fQUp5 zEy>_(&!D6BBankDL_z^_5ZS50#A8P*KznNf9ybN{I&-WX9ps)dL6s%L%tV1ufCo^^ zSw*`{67gVLV6y;CV$TK#-q)A7b~}y`_9N2A-m5v4G5zH|lH6Dn^p|*!p4o~?HB#uA z(KsO7HBeJE7KTeP{isdc-Kh7aNt7yQs^ktRwCUa56}yLlYPk|zFXTME;rx zdNkwC?|R?f-rY$)c=trJ{eJcEhxMcIgiH!%nY%4>!2vGK-Odc6`EeogE_(KI_rLC! z>W=OQag^>)@$KJ#O26vz`NJMewmu?X=w_l`kQUjAufJ8h+Fi36YZ#g0OD*cwzXefY z`qDnwbJ8)D#?OYUW-xhJYOYYV{Ri7?{AVZYkrl|FG$((EyYZ4V&&xxu3=a&Kp?R#Q zH=dl&>ZI*JD79ib2WBRQc!(R^<0Dcd~CCxb<(cv4AGe?>;{g3L<&A#&5`un%yZ$>|n4Ypo(79Ztr);pXjjz4@+O{ zB>N;XC%d)W?)~@X&F0?NxXErtRQz2&+v|NLXn+`0A3hT0gK4PKsw4?`)`~c$B9u8a zd*%Am!=tW=i#mIiy?L;oHV+SfJb(3#$x1im0=RncJ#zf+U=n1d2lK$(AMYS@Z!XF6 zj#n>=&Y>qpmbCxU;cAvQWnU@m3pn;pEP7cDBA7=m`R*B;zEY;X$Lxye87T{t?a-~DaqHhgvJw)0m)fQO0x6 zx$vRaEc843$g#n3+ky2Zy=Xgt=I|6wz9l-@%h_zY#BHX!@|-w<$U5?BMp^-2=Sr|O zf6l@uFiow96&GumV9}#;pwHI?69Wp-xHsOa+8N(X`YIGDp*Ducp!;K}B$IrqCs4nf zh~om@yZ5sT0$Ka6Zm-fR;0@{tx~|qUwQSldtlDd;n3E{*Kt<&BS!Q`mQED8I-{tVy9!`DuG~fveWcSke27yWRHw`D>&cFRuB4s-r7ee}ok;7O3b^ zGbhBHaC^He`NP%#+>}a=pwwYyxo7j+Zyz9__@JXYD$|`;Qn@P<4IGQ zyJ6?L`x%z zIVDO9CLYKmG6?Z&Qg}|W3oyf8F!D+5ub0Fz)=L1YeRr9?aSatXoIvWR*$fK8zqKq} zyA_KVbpkPI5MmSnDvA4edHy=}x4bFfX9Qk96?9gZ!f`LYAwP0YVrv4vTwp@d?l(X# zs|EwE`CJa@$?do76JX*bg1Hl!7AJUiL^XjK7MA5ZEr`F>j>VQ-aq*U1y=;BZ2m3VCEpwCCjG;jTM{-vX{XLP&M8N$<-)aeL43 zVa&RkUHsGEhrjx)(YPG|mY@DUTpcfgbZ1%sa)cHbiHhg-<`x1`4hktiS)LTO2N2TY z?z%xAWxEl>eopwnlla4@;P`Pm(Bu2(YuLa6j411G{3U|^DrPHE?yV*lyFF(kHnj(e z+-)C05@(NsK)}5RqnC%G)NHtB|H~f*R9t|)3*Z=Dh~XfM@1y>@A>y@%>Q}#hcmMGG zNvO*QtXHTx0QkvMK&Crqrg4oGw{X$`@|Kd+kAF4*nPj@a9((vxa%kxd3$Fp;;i1w{*=764!YMTZw#!43F2@NA6s0K9+f^|eqRhiSzAu)X{I07@*K zPnat~a?Mc2q!;LX*+-ZOe*%;cvv=AG$m7@Tyn{8L&J`Hciw6_#I5rX`ma=8FsSGc; z&6Z$iLgw@1eQ+_&A+?399YmHzYru?sy^|e2=?ci?NfrYrUh=$aziNg7EG$gM>{$|y z!eqK!0IYhxXE4AN$w!^s@1DLrJpPfs7|yJsA>@|`fYL7m6R|?kEGzf4>a+k=o z{i5kRO#F!Sd+OEXaS$;buo!^!;R~N`F=(MX(Ur+JV#k~Vxsga}KjC*-gl1L%sC`Kg z^?WiD(iR@ zIP#zVpLiY%9Vjaaq-Wd>B1xDTknA8=lJA0D9*=&z23>X`o7$NHP@B)&|FtK_N?w4V zUGiUv)13h~nMaR&8^nwt8KJKvou&(1bLK&@G=KUV3ZbM)BpV`cL;=_$s==*;vF@uU zBIby+ONL%`SZ2bPTTbuUv_)O7;4}~#GZmsLku1hV^z576pSQ3?C(Qz}wj^w@BJ|M* z^&+c{sQ$S9f*&gr>PQ`^2Vkfh2}>4{r8`+t2Ys|6K_^h0iKb`QiNh*=xW7fbNK_WN zAF^{4p|;D4*c6oW`SZP@Y_n0o!U-jEIsbezllJ6vB+*LPLhL7-oMra2lC~k5R|HXT z&OtU|k9d4Gd1*iTN@-%Mr6D2buy-R^4KKdgtjydJ4y^;5Aq>gWia16zKQ^w1=SPNu zA=%!D@D$nkaC?(~5)qlCJ>Nj1DaWWnX6EkypbtyvoT9Dt2!!O7Wp$JHAvsBBoxqfR zu-a=mP%W>ndO3kTJwGxjFlh_kE$Nh&%&b#@k6j$1Zi=}XJ37$dWEuim$OSj~fa#rf zDbJ^o4O;jA;bb?u{eT6TlKxZz$@tQ`liGe$ZIRVvzE43(%3CYY3;E*|UrIJ_cn_(e zX26URIH}3);=bJW{-7vfEK>l8obb#Ec@Hj4C#!eI=?A^LNCVw)|I`FqbS2pN143Q3 zo)N(VBCmoTZUM_*G%FBKUmqT~kGGOr>G|GotNxryF?ggkdzN&Un-ZMKoHUAh%}4Gq zLBbn=gc~xD0tp7B85yb@qBRb{kWT=lGKm4}}2)%EBn%IgP%*5*p~6K`ZW_u`$SejLSC#NNG~o z{dk(lCqPBRgbU>X7S4d*O5VWwo=(COK&Y|6DKWk8fd){cnfA!vKx>EvpaSeWg&xw) zG1tS`Wn{5<@T!)ND+=^V z!?KVc2@gFHOna0^gWhi8V4GGj)H%PhG|&tWrxk3+BD@jA%E2g|6l$#rs9<=gIV@*& zxeeBI%2StgGI`#rDO8(iLH3*Vw52QZ@4MR%u8;S8H!`9MDcZ2x2@NHrV#Q>d0ePPV zxGC+oYa5B?+f4{R5%|Q_!2#mMP}*)ILxKc~`16T^fIS$zA?zo%!GgEb5OlNW#S87) z*9r=A-9xiZ5QCdEA0=ElmdT(iYcfxvMNiC;b3}J;*vmn8)nvh(Jqp@{t@Spe#pM~v zcv(O>rW&8y>(ja#vPCUx(u#QCWG?dvP-0}-mSBpxN(v>iPSr42M^ShLglP}{qiyc6 z1TTa`Q@!V-0#@it0X=tws%fL$8jBkZc_!c0)g&VF;SKxUE>+gSXcC9E*kGwB!FY)R zY2;n{rXH3UvJ>_3E|zxym_?yef>%~>m3j)^vyo?9HDD&!gdDE0z36Fi|NIrno~thM z6wJWvfD>6>I#-76>cC^rPjif`L4o-2yifHrAdAxmipqk1@R2HbnbMBnDGV;eTLF8Q z1A-tVhBbm(0F_ergfo~yK5)_|wrokv2c*9K>^gSJ=SWA=6Jl>U1fd%ov>Wgo;a#A6 zS&c{>qhF0Eul=N77b~(zL98CmQu3|IJbZDoTJ^O=QF9KNPW4cuhP-%zy*R;!B2*N@ zN;I9S6C`@*{d+Of)*Z|G7xVXqf!aNW-<=+5MKRkw8bwXI>|PN8TG+UP^Z-2m6cwnf zir=L6&cRjHRFS^n?%?Hm%di6aW>A4%5fP^CFb^5qvtB6Bbw6yKP1stcO?%Q?@@*;? z^%e4~**;wxzrXzAuxdPu@-2YV{D$}2#HvQ?V z(_g+mqejL><6Y%hDkJr`oQas9` zg~?S__sv|_h9#5d-iL?phd`~9FLdewx@ zjNgkKy=KBNLA-TEiwx$GU36xq9lGnf<;Z>CH$QkL?w|vY+Fm+vmvh{)FA*R3t?}jz zUI00&@uLjx2;g%3t$rT&4_`+XJ2**@%ezPWSwDWljB+X#+)HHL^q39D?;d&g*h}#s zrOVFB21ox=6D$i^F!b&ZndR|KgKcZNCTW(XkdL?dQ&_H0O$atK%3yx>X7lNZGlr^8 z%~ymk$aAXnp6MQwZS~li8er+To6vc6!~IbKHgpKyDozoR)8pH>Z|ASSy*hvW@c8Nc zMa=S*nqYCxLMw^pgmpW(Oh!v+;D^hY;e=qJt@82Y)E5P zK~L!IoAKD$r&x<5IUN zmW@evhG|3}L&4>*gb^=qAn_64Bp{3{BD3TVD%IW?zOyYEBw! zU?X--*}OpL;peBfLe@_g660yi{#jvy$NGkNOCZt`zixBwh$TyK3~Ia(ty53x`DaS( zQU^2{74`StawusepVQq$|CxGq#5jKg@ug6-1%M3ax&?({T zcQOyH%fue=)6e(kQz!v(6D%?7Db87Dmu9v2g7@tfW2^wGjoxTSF3M*`S)$G%D#FJZ z>fYm@xqjk3oB?FNHO{lB`nc{MlL>-C4x`UzopIb!D?K%bcbcvX1<6_1^+Ykj6cio` z6*E%+z!^lbT8tR?P#Av*nOevqs%*pZ#h!&y16HkHN<&t|<+LDk=mRxlocY^=eh(36%sEd%Shx36**6QpK47YN=UFFQH(~N+wyrlC?GRy)j>< z2&zyH%L3tbScn>-b2YIBP`ApP2k5JsGg=pE{{o4+7>G-BeOwH?X?gvHFl#U zkYTKp$9rdmu4vcT^K$)QP5$PfHk1id%E5ccfdR9Va&Ey07x&%^7-?&0P-H`a4=%p- za)HyS>DHF+BemJTB)ecmK65$l1HwzUnpdkiVY)~yKxj3)LF9^j1?N)9{-qS#!;-J- zSutNhJT34w3G{fKls-Xi!N7>o%(7QTZ+=5+Ixv_lCo-ZNZp--YY9%Rih0K~JT~zbr zy>B|G4-k>U!ZdCFGxAAq$wv+Y6Q~7S{xW&N+iFwJh;~=@>9QZz|8}u~^jKIrFtoN1 z!ca-nytjZ1VXYAWmhPbQ`gcHj@e`-yuB=E#BcBJygOnfi`{`-}k_c)zo@tw_4(vg?FT%dbYvr-)scp2T>|p_w45R%NLAjGJR-L z+~~6gdm<6}?0e>`>neR2a1a9h88zTjBCH-C#1_czrofSORuN*3KNG$;K#>-3tV(Iv z0OP7rHVbl&ua|`Dde5wTvB}<+y?)8-iNCL5ET2i5Mr(4$t0|;IUl97KNtpu+T+Vn0 zh18~WqL+Nf*c}9ZazpURJ*T3q8n^)J8JtSw=P_i$M28rhj0HVtp!8@t7;4u9?q2Nl z)rKTUX&?M|jcQ&*`>&wEMoL1)V7v{!fa*~M{uy;JYif(j6+$ok?i0amhk-Hri*Dk? zx9F!2BJv2;$8&F5M1Bh~ z8}L*$fSO92s-|h0>;xNC_XLAXD#Ee^Lo@c-GEY@ml4&tsJ^V!s6~WjTt!=$O*W*}> zdngc?vtd^JR7sRv9HBrF5fDD8AR4e^<4oCZHC>U>s|?AMo(yCM#q=1B3nw|8nZlf^ zj;iU+4J!d<;L4O%EmKbxRzqg6{N7Gka)`}2Itpmang%G_sO%G}C$bPpS6fg)C3N%3k2JAspxWqtC&`g`;U;yXMPMD!3Wx`uF)oRZJN zXkul&s+N8>7$L!u3?&I)W#eJ>X63^~9HJ(;A@PB* z=hK{#43afh!crDy%e=T>4z} zELMSeL8u+-r}=6HOjIKP7$Ub4B&N!q7vxwFq-9(dx>%TGNqKHN%L|U12SG*XWWL@$ zf|s<1kWd(>XA9#cPbx}>D zp$>JD!xFkO(iVbzNF@v1^P>h+7^e;il2-A;HG*7)yZMu@_J#<=|2C;z^0yRlU7FQk z+u(XSU5jx!umkYsqMS3j&vFcvX%tR%RyszFkj%T`1?*(A`Fho`caK)=`$~nRnO{M* zFT^Fg!G485&J?$+nE%)WS|=v%z(|p}UJ`j@2*8rySCLZG-2S>H+a3*xgs8UoQ2 za}cNprp7LvZOjo_PjQeFVYY=> zhpc*sW)^Q1)0&)d?M#m=C*v`cgyi9lSFr6bbK+NdXV-CDvL+#zP&NLr*4W~>L1Mz7FJvk13nT!aN|M0@>9~UVxwZk<(42%stt)a z%vpJ4Q@|Nvq%_NT8>~}eUIJ?Z4J~NrR64m-zI?)$EjzcInam)Bn$hfLG5aB<%pD$r(P|%bbN&b)z z*0(JKYlM;Xn=v_@JbjL9?x!70F8`JA5L+T7Z9Slpe>SJ*6Eb*Vy<|%Z$I8K4j#?gc zaqwl3aTW_f?OgtK|0Ha+B9#6-qWy%=#TB(Ao$C~J$r^A5lPMabbWxxU3paL+m*^)d z{*I&3TJA`s1Nrv~B1O)3Vm1;3%JF(bStM)O;^X8HosVvGfHqs3?lda2LizPXatstx z;uZ4pUUWqI?Z=0^NcOBrDK(v9af^@t!*TMHI^G*F5=&N9lD-Zq{+X4$!CgbNoP?_U z!`>!-bwNb^dr$`-*x>RRsG5K*VD{2%ly2e|G}w3>w&efv1)PW_8ckmCPrf4pVI#i? zqhyOj3gjO#zH3CzP+^taz@>?u{wM2~En-0Fnu0FsX2c zVofJiGMiLq3mOj=?0$u)7m@x?TA%jfTwEy?00yy!swX>_U2;)@P85L9YR zAo$Om=jo#Q*Sq>6b3L(x5<%3E^;~>UvCkm&J+f1B2rGzH^M?eO7jDyFPGX7xRb$XA z$p0%wZ1IExU%W{iRPf0zS2)EQSXeWHzSx=66OLg~|6=`DlfXx{5k}qzaWrG-^vA)H zle{{0xoB5Xe5o$o&Da3tu3hX56=ebQvVWsmrt}H9j49T>wjc%tCzZc*{Bru1>K=Qp zu{Zegu0he0ilxn;6^aSpIR9s=s(PdZmhqJ_2R%_ZMO$yHZJ_VB;tK4oh+ zy`@)v_+l(%zD_@LwP<{Y3vp|>MHj16B{U+ssGgSe&XWOYyEikDh7ZN#=^nJ#22E>m zKMh+YS0h?I_mcL@lf*`iJa2A{6|r8>Va4_a)HTT$cK4wp^BZFy#`D@*iP%n_2dh2y zyr8@b51VmcCRfLvz5tZq4&*Oj6Ci2^6Y=@~RHRRhFdQ#xaytVaK(R<66))B>UVs1u z)RJP5UlIgal3_q^q_-`K)*zl3fkDnYqGC-yTM?wmh6Q*qz@D%Oc%3xvH2e;qv9Ih3LDT0grj*S z2&2Q#o;8~mfFAMU`e8KSy);lkqf!BdrIM&$XB)_R=RKA^<)xMUt1tvoI^-|@q7+9% zq{VszX+R6Yo2^-;hIkKtToByDqQ*xAP=p2B1-83nRabw0Uaqg7aVh$4mgxsC3w(uhHf0 z#!`Ra78fQ29~tC(UGK_{&4=mVUVwAKKdvDl?g{tfVjIPWaFb2TSiAK-QugY>ml5`8 z_ruOkeT-{SjE?_B-@4mrcRLyLlK4YBV3;eVhq86~dX1+TYr|?H^aJ!=v{FuHEktSL z&XScshpXz>eR?0`5D8upH+t%#usSK?H(&**$@xZ5=Kj6hPSxd;Zqt%F2cG94UC*16 zf&|&Rx0`q86}(xtf_inJ*HIR#8K(47a!5vBk+zhoxKr@s1iti3`sPExNq zx#R8WZ}3THd~i2g;Pm%Q<(5D(?pejD^_!|9)60hl95&=O7tWx5jR1gZEIjG4uE|Rw z*aK$-Z#mH6+wUouEgd=DN*YNZitrnK+C3S56%Cj$>>t@{@tsbg6e~?qH=LH73%_h3 zafCiBV{Re;SJkf}{a!`Q-Fjqq@?x;);OR)12ko2hgh#hDlBp)#LeNJx4YXR}*2knBwjeO9r-@ut2dxu8<0Dp<2+>EAPkbmz?=dQ z9J;}2)Nod~jn@~Ke))F0Gl(g0}6W*%#^GR zPt+kqo7oFMK(SWo=(tX`9zgDSu=|L+UM^rKffOK&izI!M%um2S4h$z~b>awS5RxX< zg)urbzi@BE@&}I>2yTldlfEgt=KSp2qp&v|3fmx&Bk3pYI2CE zIfNr>NxmWcr7)cf*N;s*Cn`Vr^P+E5-`WemudyLEq_~}v-5}KYdG~!gUT-MJq#+3} ze4Pq~;p2Ye(+EpNF9l$xLn$N3e(F0R6vo&GNCP0Y>No$euwWfQXtqowcFTWO7_$s8 z%bF-UyCWExJr@N|BtNNt%#~<|Xb2x5$Evup{v|rMFt_El7x)I?{({o0i{@CL8*%Vk zLPLkK=h|hLQh^rFatLwO(}G8Pha9Y(64wUP-HZjq}Zz5=-6|ESxH%$9M zeLRKZyCFea^wc2e4UpylPfO2KkMttMd3P^Ia!^f9oin*|R>k3|4- z6E5!}LmkGz980k*=>b;t3HM{;Gw6W21GXEpWb+LC)qiG};-4m7n&J!K>d)`O0dM#gItx)I)2^dXS6$s-4sn!xCu1$8o2t!;F=@-j-FFC@R)UbCflaY z0WGeBXOEmr?GplV0V=f96 zK3pdsMi05)zV%$gd?V-e_#Dqw206c~1op1)#R{ZfAWe6DuYcRVm%n{e+z(%`UNDU} ze!C$OXyBVA4VG3*Lpj zZ<+qSfn36_75PonvZXH8U-7g4@8xzMy@g-?PQ9PqZSVi^eI~6L^tMb2F~ca4vVNaj zVIesqq5gDZBR@|@>`H9%^SL_U;bX;zvVw;6Q9t{2He`T!M6sw@v;I6T;pME&cAs zC*BUEnX<7&B0at2%kv;}nW>UL%Oy#GVfuro#vk#yRpj+Naw)bvmutb7t@q)Bcur<0 z&oU&&VBw#$H?pfpfutq;&Knyp#UIAiq<#DjGlq8Xd)QvtXm1~$_jcCDz3L>NP@dUQ zH`30J<;4yz@#`RRF7;ewpLIWGe=Skh^`mLQ5lO<`fh6JDm?Yt{be>yT{PdObmv0}} zq(H9YYQ1`f(rfL57EAv}zOYurJ!^A+!*n6pCt}+bcH~d5}&&kjBfp~hYL#H~M zi`7fyXS0LgSZ}_&7gh$T%l_QUNBYls2Yx$zoHGs+ljvlGztn`BbpBfYklF05stU+& z#mNMAMK!qbVT-#5QkIL(qgj(5TtWh4(F|t<$Z;3zB~+FQJvF72#~xth_l+=MCbl}5 zDwH%Sdk|L%*$|gz}lML z>K7|=iGx0W&WKn}2-8?#V_#1=z-IT}6yT4bmoG6SNV==!oo_g&0L8__KrV2i64ILu z8SSChZZM<>t6FmNEx|i5;uC{|lE&bscQO3RePGGh@iigao_rL*;z`(i{@O-f+YZEb z1~6+4f7r|(Gb3Cp0Xj@vbIi=558=oz>iM!>tq2X}5bgZ;9N!166>4nU9`&5VR{HSB zcZ1Y|s(eAjo0vJHAUVZTh=V^LP(nQ`a_utOWSNhw80MovI^@Gl0iuw)MYSgD?nr^b z2xHGBUJ4Ep2-L>gG%~s{>53}~%EV^07N(e(t&(vC9nHafRn4H#MBUT-2AM4%uI=*i zxAE*Gr$Yfut5~csis|=9P|2*|g5Ya#!a{F{Ai*yo79dC2aqmtv>FNS31G(v} zpRMhB2(`Hhd7wggD2k4(JA{y=E!~2yF_hwFz+CwtWg$7Af<0g2#mhK>w)^Yr^VhJd znj`}++;k6RNg@p`=}G`grWbWKMRjJ)4khPc4{?gL;8{YgU!NcEATheWqgtghy4l~{ zo!feovTy<}OHA@{aM88N(qd;Obe+r|A*f9X!m7|f-7~q86!LB=`!#Um!;*Ib4G1M! zJuAXRTXM`qA1brQ&5L^p&#|kN$rKk|v*@5qUy8Bn(u)jryNDo&12DcuF>XuH#IQrH z36dij9>K~wgYdqmpHk8{Ec_fh^&Q}gMdw}X6ZM&W$f3berBi<`yuffEg7uip;S>! z{Gkgj54L1kNxn4XS#W4EbwNwV)v{LHaB5Uw7|>7@t`&H7AgCuwTjr43okwf*xKoDg zcmD$7=1GdOmY8KHit^1s3@>4xh;pHuetJo#&!aalq&HPF8@Y#SfW~^TsHhRUFUM{l zyLYHkEt7o#s??}%h@Q&T7-(W{=(Fru-_x#mu>ilER$8)ou_d&B-N zZ%5C5bf?_3%@7s=10?KUqdWbxbhaXM(ucuAl9ZibA=hebFX|pLMzg`gEeVk;lQ`JF z*`5mX&m_tOGNILy2zA>dl?`(odpF1k2#Xe-M*pEU_|#nLNwZd!hGskY3hA+f@9`2$ zI1GBQp>v3?>;jGH4(N>xFB-xvDB2ewoNG=NcBrFeLdnn1LW8cVH*bmdG*%6h8rB8a zk(}}*B}jYc8G5q(5skbQ!vJi;OVyEibq+I30h7?@W=$GQHp?G~`VABE6E7_dD8n3qpCkrVRwz%e45B>e+n5bf?wzbVkMigkfC$yZf&~4tg`v zjiKs(vL+=Kn7|z1?}y1xx(MqZ`kwfiz9*#%Vf*7V2VKSNqre0n|B!%E4J5!!HLAsk zN$8jNqgsr)#oQQZG5!vpAM^<6b)#@`HFGw|gF)tory?hVJYu)%tNJ+H$$*EZpjAb zU!iKKyP00iCs3@hMpJ0Gs@-dB-^TgqX`}mT75x|MrPv#YK15fYCHm^C*|H-0E*3+! zyYx;spY~+SmU}Cnjk{H zl$>s{3F$Q<%y322{p3E+>+!lHT8+GxiYRSRfzpDInq!o#g-Ln)1=*dn>1{<0*!ddfO-4-i`}FRDWO{9h zDO7rKq%YpCVZ|l$rkv=?<_@nD|IN81-xB6ECsh+MVL~_fLWg+x6u4qCrI4r*%h!jz z(@$s3QZhbbtJZfMsOq%p3GZJsIP%!o2cIri5KGfl=79%Ew>@afX$^W1zK*F*x~IRg z3^I^3_6xqrbc>yQ!#^SJHD!^-~ndZ$YHd;_;aOgDTO@xaauE6^zByier5D~>mGb7&#%ex4qx(gqR~`_ z@7R2FDkphV7zQM-YlQbQO&&biZD983Fk*`Ml9^Tep5%Hbl8*Wc;~$bY_$sU}jU~PYNR*pP?85 zpvP?I82;(wE!5?og|S7<4P(Pjc>H{Zt1o-EmC9MOiDL(xxfDFMa<6gZycG)pF=4Z9NskNn97AWn>dM32-icvA^S8bEl8#vYl%L$1^>nWjP z`O4R%n<|h7^tv#olCHknKt;g0l3G*n7TMoXM;+au7C#u z^t@^We6|MV(-m5chzbn%St-2GP%e~kx=ze8`RQVt9{O3l*uGs}93A>9xFUKIca{(; z+Eb4-O|=fq7BIR_@vaHWo+yo(x610wqo0Kt5BvL~1Y@n z+vFPN^ThFP9h7PiMWi1e z6~OX!<6<83@q7Vm3Owzx@7PeKI$3PD{Xv!OirfV=GS&K?x$!ohgHo0nNr_3Uj87IL z9tUw&qu4RAMOPlL5Ux=OdPvQ@3Bur*aVl#sGKaj9>p3)ymIXq69aaMUsA>XV2-Je2 zM@3{GGuck;lMqRWE$qE#qNzM zH?TRIwG@(YjIJ%sH(3#s(Ye!UXeeipV6)9X5yD&v^66pi3jl^RmD0;!fBjXV6LOe| zcT$P9h3ab^Q_w~G+hIx2LIgJjW+mNY_LHIPjfN`gqYm1=azT1jgwJp{a_aVh$%qu` z0Wsh|i-nNi&W)l>4vtUagfqVe)vp@Tt4iuctXB5m(`yzdB(5oP_|tLSZJ5n#0*1`# z3wC;4Kc8h9a=NoJUbxw_iXlAVL@o(oqKf6j6(cX=R3d}&I5!q03N~4IT+*7zCQQy1 zF`OL|Ik2R{utrX?5s4EYvBrCi(q&IRO`@x%lT7vj0^HA{?NB#4E739QNb=@0Jq#za zPLhVe)3lV7n?Baj%y!SRd_Y@*Qm5_~s{-U(z5_XZPRCt$-9hj5ErINWAq9^o3yYdQ zVu_W6J|gzV4uiyp&o*p*)SGl2$0t8uM3%Daf@677`t`JO-cVGS==o@K82K-R8Sj9h zZrVs{EuY6_54k3|TP9t$XASCyxv}iYi28%6Gk)}cCow!!8tyQkj=BMY2oWnh-g)33TdH& z<}`7!;Zm@#+nEs68O7Fanm$rA2>EzVieG>MtF3w{x_tj(`I~}{`X-JUzopqdA}(2W zob%eM&9uBYIg(W_t<;MP1N0!46TDd|eo?CAD5h90{u_ExS)|zBkY`ayXTj_*2{6Yu zn)JBSHq$>!Arkls6?zlK}W=*vRXtHpw}a=00Z)bhOY?tC0H zezOMSf}C@KgORkxs(wE+VsUw}BbbFT^IS#x5y-CH{{H-wUKC&(?r*19x|tBaf<)re z4c@`gwzF?~DqoQwX~B-fHp;UsEWse}44A~G9Ehx9Mr6ljd#pC=DX!pX$aHvhnj`Mz zbmrEF+xEf>O00D~X{&*?c^|5mb$*uW$IHBRn^63Ms=%#Dw0N}F`AybYyA9}ttv4>X zC}C^u$k|{LJj(l}t$$rhwzdSCV!JLbOqzM@Nl>?1wcDZ_A^=`!y;B=Q`3kbN>6{!O zfKyBw0$>p?ftZH^>QVN^`HRQ{3=K%d^n^NL9jRfDVpL^AHXu^8FATO8XLcS1K4bEM z&;!?xVzzRHWT+g(?cLNhUi)Cbbs$^84aVBG==o8?HIi{a@e2DR{CHyfA4mb6CRU!9 zRT|gYR+tbgNv-|kUb;)Fh4X}c1YB`^>TwI1VYVBi;+agN;(DQlA&)i0-hNUJcW|e` zhH?62m0*uSan1rtFOe_?cP*8~|MXf`cr$(1=SLiJ^&8qVuQ`B8Z>3PE7ezJdJYBGuwkK zKDAX?r7-MJbeb%PxO795OfM8CKhxr@WHXzQv%nE0=KI26HYU~L6PaN`4wJ%5s>49C z@B++vQe%3krfy(VHE=i9>eGpUQi?QDsrq< zB4|w_-Uxhe@`?CWMEPi-I7>CFsweb|qQ=cACvvxm{7F+k5I6IOJ5|J$;&qv=#r1i3 z?Wck(F02^lO{@6R$oVQN6@V40wY+L(6(uF>wgFrj<#;fM5v?mZ4j{ZjK_GJVxG?*rPm zvJN!+j5D%?TA}MFSub>V z=UJl;0ikJx`Y=AMA!qjDMe`XO84!hY$mu4oxZKo|oL&jl)# z_n%OtqG?2Q4!Si~J0`>7l5R|IBg8ei#ldGVk&en?T|X~yV#HtBtY(XK$DIGc24}`8 zE(sC(v@fyb{+uX`=OFHjiiGQeeF*c&u9aw`wkO_DDdm6>6(mkP)hewQ&PB@f);3? z$va~2MiD0<$^`Jl6;q7Fxv&)l%dZjlx@)kxdb>WFZc=d5wA~8FuFA1|Y|yb3dFPgV z(oI;{p_K<-cVzC4jtr-rt`e{H&}d_Xwj74N+?5^-EyiclVYXS($N#p#^)a>XTCi?v zu#|l!E#5A1%O6$dM_SDhi?|ZV)j)**c&WzmiOpn94&QQN(PrL;q+*F(7=Rq&_|$qS z0q<*uu=CTXuQ|;2SR5*j?}vto87g>_BI=sTS=S3fi^iRrQ-3-SSrPNpNq1=q7pORC}aV3mg!PdnjE2{J?yBAXAgV7##O z$80R2Zqoh{($$b!ejto>OaDg9JPwnf-J<)&r5CHsyb*3e$7Z946K4^U^{4u&Im3UC zOD;g|y*QQzN z%Kn~j?@8fBS(94)=*k@~d8w5kJNN=Pm_=v7pveZWh-pn+r;szxAv-qy+4D2e66JtH z%N?30IzhxGs}^SB8PQNj$0ymfOexjpchTW?bb{IFI3|S*HqS4oH11A8E^8|^>tkP({+DA^SyQVs8WD47(pqpK5Ig+^%gj06^o`9{>3 zT*mO3qR=`kzFJm`V1F(t+SMyLIS-bOn|U%ypMj+r1MNfDr76sT40sM%pdL(m-N-8t z^{==r8E^?;j!uLW$J}2^?yY|~x}-F(@Nr7k^Uzs8F}ebZ+yJphn>GzL!k4zi>*s#A zyBTjT%HpP+(^W?%qwBSJbRfIz!5R2E;^{A zYKa3_?Bqs4Kyf#@Wka15Sc8Qt0Jhq;4(oJ?a;Y>f$xJFBizRg2pK+{iY9!mZWrD_T zW-CMli89T1wU~N}J3`#8|AhZO+}{x$rymg4*q}(j3ZXH!`B5WwoXLVs%8AQmicQeC zZM-On)@PJGP5l_5IPlJL3g(NYeq=aDWD7(nRa+DU@wtMoC!+y%m+0KMO7cu^3POU9 zNbXz(N{X|qV^Z)+rkgfy(lI5xMjq8$v19bbnm~iR#S!8plngZzY)EEZ{;y|DJt>52 zZSd2hnwgLU(Th#2Mc7sG2$6QH7mm_=jfzxDj=k~89)+LmvTK-L{c4dlaeH$E(n4*~ zLboCa48_-nrc$n(0i?zqnaPCEIaF+Zgkso*v8G`!@%TbBy`w4QZAx?j96n;43+3xc z+m@t1VlsqkBe|U%HdKU%vS8*G#FVVrq>jwM;isZ~bG*?U>-iGp3%#$=?lY0ZB^qf1 zHVj=$WAN=#i&~pnLS&sj1&tJ2R1c_l!*O~1TL+~Pul{Q}f^q=GQ_@fV-aS5yL`U#M zx0zuxCg}ne3v~FANQ4b8%Vty048c9Y5e{-bh#1(AQ3$TtSx-!gv3Va2@!)aDp&FD} ziPD)`UwsT|A@Z0go)zwOX`WLahEX6w8L$Q|h`T@@Jbz(!8UD`WMF8uO!I^<90V6u} zcLLrbU1DDW0|r4KFPXSmk|VqWcVdH6&R-mE8R?&ZhjcZ$s-$I*jS@E>*+)JGfSsf)CY_yqI9f4-FDD1& ztm4f-JN5lwT;ZM(y~q4m%7VyqHQbV zN{id0f&Ad+RmvL#uy4XwR33^K(u)h!++0Q9J z)a+7Ah(>hjx9$DYeu`czmu)Eb>joNqJTSOwi_4dZlzKyyAAVFxSUuzTo(2lN!E4yz zh$D{TU2%T4>eHg@wge!HHu3Iietz~M6>Fy)q*fAp=I(B)r1WXKSuX)G5x8SY&(iy6 z3*D0tNJo| z0hwDrINDyINb9V)jJ(gZn~7Q<#=fP*4(8sC;wW&+=|$|xsC zR@;iWL(HfPOt8bR`Usi3DD0!{BrP{Yg{1!>GR=3ie&zo8t2?_KDA`t+^J~&F4C}Og zbGTO2Pr$Bt5k8Ju20tjRf8ICjnoAO;73ey`5ORL<>vs;4eoNHTy7cnn_8yj|tdH14 zH~p+{z-;U}@d9BJ18?|f=_1jy%n+r8(P=B3JPTH?uUR_f_n)nu7u1r&g1pLd5W3U` zTs>62%YRV2#=rw$1Q2BAU@)Q{pBlo2g(;PQj8OKL-IgqiWL&UwIZP~n_Cf@K3noo3 zCbzNfqO-K?BvFhgS)pJxS;HsQRB$xT{t`WjM}Pe;z4hx$`s?VQ;Vpz_63wx~V+45s z$ld^|H6REMn(?gLNA7yzPMl3QI7?%5RI*ru;X;wFq1q)DDU@DpOEOID&Qh4yA|=co zAqQL&q>kd&#w7vZ<5DoeBb2PP#-wDB7;#BNMYAM!83=tJ;@iVYawZoQiJ zhQ{wr}f zHV~E7=yYsV`zrK7K_H)DZjdtkPzp4|(=iT)mjuS?-Bhlm^MXjjsKR#UU{?|Mu z7yDEvcb{z@i2FcRpt<@CPW+xs16!lcP&rJR50<=JRJv%UYKaluU)1!xJ#sB;PQBld z4Q*#CTJLsWHR;5@G)!&!@<5A}Tpn9C`aC!4E^nb+lu0it<(wh(Plna%E@dsGB&(Ux z9KKSrG1xvbg-EpEzFFU9uFhFZKe$}q-&p!}Q$*|XnQ)?O7cjs@uQqK8DQ^1R4JxMO zQj~*O+>7QLifm|wlM>AYxTT7q+g;MdX6s2Np1Gvej$9ABl+$isfGuA^Q_0bFN;0Y_ zaPSobJIFD37?Af63gy<1*KT5T zKo+8EUt`&9*F>VCP5hDar<{lt8`IHBUU+`?Iw^O8CQ7s!n=`M>)akeQ(J`FkXuALK zhdNE-8s9c^6m{YW*pLw@51*3vo>l}47mcHACFM$Xe?CW_gsVWh0UA$Bp$D_8Nk^8x ztP|AFiif>ijazcIM9o}v7(I{}=dTP5yz7|D?iEkP?W@=AW9UgDyq}nUl z`1>jV-i|yj#Imp=Ad~+Ti@^B_S;dU`G<&tAhOdZJB1hN5cF#_ACT%_&>q4f8L~P6o z29-nFS5?+-%@!xk9)#9QU<%akL_kkCI9pyj*$hXcYGK}}=QCk4nDigm1irc|%)3w8 z%Upe=#AZ>!$AHb50R{IdPCwZ;OjuMhW}Hbjt2Ib!0+TK!XUg%XX);)G$zdG92~-Jp zDs3{L!a^}!FIrgXvk?;gRZXZ_$AeeK1P^b80z)tr;QW&T1qEW9G<-)^1di^-e7;_z z-WyHE$1*(9A-G zjTHnaEN5q&O_sCLz-n1Z8#^q{p?E3j810AJVT@diQZwm`M`~^$T7!23^FZ9SFx0}m z&)hUkmLAIn1$@H{_tTQp6n?s(Lus~33lEXw}n8N}WCYlogbMtivmwE%#b4?0ixBxTJ77ePzb(g)! z>p?$>I|-EAT95%fuwu!xQN^PLH5<$vvee@63G+1Y`u%=8G#_vh=;0R! z%ALq6M9ELgL5O!DOR51F$u6ymoLR4S8XuC|kU!KtN!-aJlWikEH!{T3cECuWKpT?} zvFXJOR@PPczSxyeWt99lYPPcG^67`#jWZ1A+O&XYuCV%%Dh2z$h?@HD28I`yIWeeK ztV%>7DxgrS6^%l~wp0kU-6v9hjBa#P+yW1p5wrEi zD>t)MvKwHT^~2<4Ni58{0!;xMyU{C0cHqnZTwYbpaGtSuaz2|j%(Jp9uKv?k$Xaq% zik(P6R)=*cO2TDGVDIWkwf(!<27kt2O~GSL{7YXUr^mZ&Z@%P^CW^ndTTO`yfCBvB zH#2R@dHs7;j@1uBpVaHpcqLNaz<>NGu|^d7iS1EnNy=slU+%E}4?CbntkUz-@wLs- zvM9REihRk2wNGV<2o)v?6UW=GZBSRb*rYU;!44ek1ioNns{;G*;T9JM1NH^mPy`H! z4+&DV#(vwwh;q2sDo8x5_G-{)lm=!5!;+8_j3~`FF5~x@_AG_hC2Bh8#lsWa3z}?- zQ+inyi}jkI-=7iTy6T3KoYx2?P1Ay2V9N#ZE;1(Q#$Lz3kjzJnr{mxyK$n*71~T1C zVN|s`eb5G7NaKi3MqvOhgl~Z}h=mJyGLg-Q2Z`W3fa;(y@PJi61D_r=hJSRXVAGyU zln98|!xO;oH>_H3yrd+-#}av|n6J&l_Qq%{1#yEYz;b$0ubJ+VNwEfNG70R|u8~Re zxW`!lnUy)I9ad!m{AhUJ%djanA_@+~)~gT<1RKYUAC7+hfA&Z;9FN3AHtu%ES8_0@l50fl}L@mj)lh^lzF=iLk33OS9-!+5*| zcZ~K_qCWAtl3Yv9D&_=<184u)D8%ALJoz<>NGianR^$U=*5x*Gy3)-hJnoYFHz|ji zj5u9vcVvcer$*mhKF-nhTin_nrZD(dl{HHxys=A;YPg{sKJI3^o)z$U+>0mngIHDe zpiv*UU)6DeWR-=Y=Pg;htn|1vku}qDg_B35sftze8sj;nKq_0~qRX0^3*x7gG{(4= zh>BoI`gN(x9VT%O@q?N33uDB~x&R&b|A*V~ifV~7#Gdx-pE_$)S1<&_vzempDO zx{O;*9;hBAQ==|fNL$MaWq?rkVfI+^(nuz!z5d&+{OfC_R@i7lvs9JiG^2;8{ zPCC7V<`=aZn8jg;n#>f9UxL+DV4hzSFP>OM3p1-(-nJ#qh9Sr7xO^v@IeTKW zyQJQS~5H&4Qeh zVvip92coIQbn8s#5`zyj13Be*)yT&BdG~!AZ?17cl042jNKPhd4`3bMC=;$IGO2u! zPl*ezrZsa1u4XI0Rjt>qF-Ht*9}p|Fw-UtViMW8f6_s-X)v)#qpVVETJ@UfPh)WSt zaXG?kIRu(CVv$^kH$#TUXxgD1q`zPkNw)=NS)6>wD~!vDRg|+b3XdIFdeTBiMAhZ2 zZ5Wl@q&R;amjFdrXkpLMZz01cwj}Bx;+fx-V?7jC37I(% zPhw%1u_L=|yi0~+#2yrox?;|S$|w;)CUQQB{bZITB^ya<8Tadj!g(pJg`FELr%aNw^=q&5q-w`&%RCae>c zz~S=sME+-7CAcBdE|PQh$T|@LGZ$l_ik-N0M;HNFWf3lpG%;A-q*fC@W94RCki+P_ zK>zs%lA(aG(Mtx>EyD0iYzcO1r)OCsgw`veP~HP{vVRUGg*a5}Wsis3gCP&r+}s&agW8cjcLIxvLkYz`|#Zm5yravQkYVnab( z7yxSs;GTkPxf7+1sD&hY)PT{%rXa_Pxa1sD9!{}fj?)cv{8SQ`TabpdU$T}=Q>`lO zHF8}ja%*qS*FYlT(pZM^yfQ{cqf6pNgx>PmX0u{e#Oxs8T58%VY1O@orZw5cqe_SD z&!TpKbTnhVi-KiW5W2IJ*$<8nj=pvLH5p`8sMwP3tCPZU zNp=+kDRo9SY(jhnJO)(qFdH0zZTzU8 z@OntNz4+BV-14W-#Ar+Ksgi~ai=T5K$j)a|a~dn5KWxUGBnCPLMdfq(AlF0mmuP04XEOth}}@Ufi?(&Jv?h#+-y8)aXk(u+jv}@sSUF~ zblqCJDpF~2dJYp!Tzy=;Cy!B0T;p-s=cGv}2`xK$o@PV={Dawy(jLEoELg?D$^t!< z_4So;sKwJ+6c3hDTyV2m;DG1!@be1^@fg3M#iE5PK%uq6<4#=tb)Xx7EolZ|2*4=r zgP&f)?6#q1Qn*5Ef;AXE#bX+m2<@laXqO`Pxm=Oxs3|8Fm#OC)cFk+X_QUS!+fG7^ ztqnJ>aK1sUZO{fXxjEELRrEy%9~_CZa)Un0L6q=mb`juFYWw>ly0!Qp?Q&9EM_j3- zb_0Q;$)9y-jsDAfV*vu%P`*4}^mK1P3h?M2O@dL*?yizcGV| z3~^BTxF9H-ifG9OvUN3a+FU|niP!zse7;TF92e}{DMwjY6`b%t`SL7KVPiYu)CF`{ zw=!Y2N7tc~>l^<9u+~L^;SDZB5s(5&Gds244{ZH>1)ZD#tvR@mRH_huc%^B{+Zv4u zf5ug=(7uV$=)gG`c_jT~TwvxH=p>9yBv!hDW>5TKLC_cWze^V89r0 z#!PJCd_irCW<6cvB{`xB>N2xy#?e^^69@0WhK*Sc2o{quCeI$x=>*UcnvJ`E0dwgT z$l~QOC72!(=s_r0PGYUKKAQtRh+1#8h4|hNf2V+cX4y6JyYQ z-6{6oPqk^m1e(^>*6Y+1BS zWnTgX1~uYS!;y|l*KLpPL?cLjkW9S88v1UcF9bFLwv*8Jh_?4gQ+-Q0nq&7M8zNd_ z>!-@$lA$0}A7rs0lMF`|0p3YgaB_C4pIR4mHkU(5sKs0Il;cwiAaJXtAUTO~H7Iwy zDJo4xd>Ev9c*O#|F*u1Cel>PT2ene_&XL(1$}K0P{S~zsv$pfb(@x{39(;8uC(t^A z32F=pZdiUOk~WhL>Vl@8)|0RM-Sf?ZG6=`83&4fb23lwa&058jLot4Y83=r5PRth@ zh7jb)j;f+YY@I0pgh@y65xj}{qwU~P((sT4m-(qW-1*u5>94yTUSj4~Tss3)&g#XQ zxK`}D*oPjj85D!sOrK*ekl0x5@BW;s9tM5vy+QyqeA@h_q0^#^=r#SrTmqwFF3BG* zz*=LSHn`}Xfm+t3M!#6%0@Yki>`;NNS>xc%H6KcDt{bT_dP|~#MsJWlLa{g5t4t`= z=q+jT=na_6^XpIFNrStU9Q5Xc?C-gW?vXm>whvWu7wRr~Jc`RQPaq?r2ly4bkypOk z?>c2=G2{u$?S4+LVb;?!_JhkS)5jrNOYiCju-sJiCRfY?9J%Chfg`uX`WP3oj^2@hC>WF@p#kBE5obG`;|UIQnTcocMwYhUfwvh$&9(FlIi5 zd#=y4!KJZflzL&^8)kwcb6*amYrr(;+Yn+B=?dyxu9&W!pJ^Zn|54F18 zIen$OntpqvbA%W4b^Nz6<3v}UF`-$kW4Ow=7%zCZbXle?xD=l^PNnFH7&jR%3x*^u zYRx1Puo@n-7u)AA;Ti^owB+Lwbr-1}bgS_2V@mt+@Ks%r=04&%{EDToidrLi6R9gd zti+W+qY<7u@eivbanBt?`B5P#?X7b2monGnewG z*$5uBIq|#w#rQS5C(|N77v|6RX4=B@^88g_@;HBZoGF${`}y*ZTNB1BM{2XvTz&EJ&=u$;o&HRdbADJzqiFP6~|~ z$A{`FQEgr?yJdxD(@j48efu@NRZr&xAN7VAJl1ngFePD@Q7$Tt%(1#^RO1PWiEz4t zYFu7j^+a;TD@rBC=%!6d@uZGJh;cVqSPVY@{)BlEDe%L8^pn6su+;- zvuMyy?BW~@rlk5NhgU_@;sG*~7fa(u_N}yOzyrz|NtQt-#U(x?)y4BVUIb%B1@&h6 z!>)Ie+ID5siR6x06$>KA6{&NNlB)I@Yt_9~JfeV4lYYc#O^h%24VXKlAh}!PD#paF zU9Se0e8ONksNp0bhYmcs2IR%Gm3oaC3~!g2X>0&!&`G@tByXz~!3))RQBVL6VpbXq zJx*NcsNm@_34}+a8$u?%`gH zISNIv2hwz65qQ^kgz*wyYbU-H5OF`_vROb0x+awR(gvHE?@r&v!iJ0&AEJj$ou7@o zjkuS(UJ}UfBK1#l(Pu0hk+>#m0TR(dlCkc0cRDvlzXtP80re~oPDF4?K-+=mAn)l` z^JO&I?1TE>6;_^okKCW@kz6xYe6nobMbpo2y37 zmdPW{j!Yj$19Q)qOBcJFTXWF!*I6}Q;dK|q>YKb!E)2_x7MDCW_6P^!`vO%YdGHd7 z^7H~WY?b&9mG=q&1VRSF=Z{ahN`a3n^JLjq7bs>_h znwTgs*`V@HWAy#MRV!}EUZ=|T|*vK^>S^$bW8Npk!@@kBtgBIgV&S0qI- z!xL3kO~fiy^=}W4qA^4p9G(|o)FoLahuL1;N1rk{RfnyDat7qgW|b?{nKSN__II z7-tu=Ptw9a(Qv%fJ6a}IBqQVtUCa)DotYkNi8%9o^W=v`2J?%-nHVITEASJA>g9<;|#Dd&g4YVAItT{X<5fXsET8WpSH|4p-uW$Th&)rGhs0%s*~=TiZ4m;(;z#&7-UM!p zeHfQ7Rf~yVk|+eULrllz`ROTU9hh2DK-mFzIs zyKNn)IvnZieuk(jETbZbEzgShMXAx41>&A%O8B)wTmp!14$i>(epryz6Bh(7Uc>o> zbNWX$638~uj)Erb54zUdgroTlb-(9GB6J4_9pK?YYAMPLBcM(kue3P z_sLsE#!9@oD&EW<6IXyuYB`%ONT1bAKHWXQ&?2U8gAL1`Yi6(xL!Bj66%TjMU+%F3 ze{e$6b|=~s&;|I-!7+T=Vv5pbch9DJizPW}8=6m1mn*_l$n&?|XRh?5au#_B4v*uQ zJek`5(|4j90rFiz-_Mr!gaKHcHfoSV0wgcxQ5ekT6=zlL{g0SV4L;8t&9jG>#Z1WN z=gu80z6-n~V*AeD3p2(F8XmP}VMwJz@k@=24spp)NVioFFoq0>50Bzv{_QiQ1|tJd z!R7`nzC;!6JujdIvtW@;+W^*j-I3o0T|WD^ZPZ2)7E@Wa&u@P@&e2f9I&17cn@E;Tl+Do#f=aMjT{CZudB)92_e7dV;>dJ#nl7 zO`Wz3T+rjw=%}p8)c|9mqyo;$+*`oRux%*d8yFv3gh^J$L$k&TEoME^0+lfUTz zI6@W3r2$xUunMi2c1$L~!L@<|oe0FdCVX`2-nL+)r1Jp56oAHrs6K0-LELZe#!7)J zsvyAO)Ss97ftUrhUd##-AdZwfBFM2}7IQ-1fz0OxS=z@$B_%fyB@!1g7_}eBd9j=J z#Gf>r(6g>_;cf>cIqVs02)_DEyZ(F;1WzakcOat(EBOi{gYf)R;Dgu{)#&FvccB<)J#3;x^eUW9 z)NR@NIZtClBBWG+gT8Jn?LuK}Es%=TCL|p7e_?b7gw3Jip)3Ydp_M`7pmp!QLf(9{ z>+Wva!-eCrl9zy-;mW3BJk4$u9jMtC22fR#I&f3qL2^j3NZT1L9v3G2Jn3r;EjSV) za)%!H>QERvL&JD1rwbgHU+#XUbSMnbL01y%0nZ&~5B@>63oSmj0$~l(z)hJjVXWh_ z07BatsAm7k|9ZwtaARZRhr<=hE=bLa$+RZ760i0>rLN)j5**Fovy-xb*jkf8JS}Qy z1oMhRQSxFJYm(+dl{c)m7@MP^EFP;Km3j@H+KsSt z@Qthma7_mI1A9KvQ)_ZZi81BC{tNJMu^{Cv0T1J<3F2Q8j;tXn5|Q});qLajPOW-8 zvRD$1OXnI?_*X^3C7U*;AHt-Gx!p`|ZubgZ6akVwGoNG4>aaXgl?f*pR5f2!J(e1m z#(S_cO0qB;@t^4g*j+ciG;g@f(R3qfy<`PFi~eD=px(T0YwBi z>8$Lh5_fcPcLz-jO;ZU=C?~Q5ng+=&XB})xE4AVI$(i&GE~+`v~na_B5Ax!CL zGX3&CENuDP9S!(9(X4)XPtV0CT)kjMME?xEsy}_l=&wwRG1u%e)*o)6@gqHO|MGsI zb?K#4q2khD2l?gwh(f|eVO{YZ&F^SM{PI4Tv;2${=3m6CGd$P*^4_1=`8 zkyww=3u5pziB%3%?Z3=g;U5xFP274SE>4622vENSg#dp~?=>^<{t&i7o0CIHPH3mZ zVofL8{q^l_Qtl1g0%#jh2ONxZGsPSB!X-wgC40+frg>UYeI!H;a#L8%(wiNLc`M0a zzrTLG1-2B6y|>tGW?-8NBSSNx_!j=CCAc%x1#*|rsZH{l@YoNkbc>eE?E!k!tNfyDu+8(2Axo1kEL zJ#s)mL~+wj3;4((l5w8z?5j`F&p?ww#{EUIyL`=t_jE}b*eNu+#C}aLE(IHyA?;4d zk|5l8OLoicjfNz})t|9(L+XH*?_Pi(DtpCQT`pE2jzFN;Zyb4saN&vr^1?&@hR@(C zEgLeR3UBZ7s)5A-87{%3p0Fc_x-BNl4JUlYTpgn?jLBK}4`g#gjM_yg*(9RfAD<=M zU(*FvsKm=^Dg~sZJdPtsDU`2v!3<>bp8pU2wHJa4l-^LL7Chi4y$AnYs5e!7;&_nF zF7t4W^GG6aBfn-jv3Vup8EDBiAXVh)dOv%3 z5RaP#6q)A)*d1zczYJhjio{pq_xtOEk8yY6&k$Tmc&GbC<4hymg}8#t>;tS}`~^qt z0xRfp^1sQrz92gRL2Sst^fD|CFyCMTO{c+&ju5@YbW={AljmQ8AizEaB;Y>30ci%D zW-W^?D?vioIez8IQz~{|Vz?lqE}2`}tOPl+h}8x{)nqrSvh2wjJh{oDfC&g*SfkHNSx!ZrKqU{`n-Wqa*3|h6ydI zgwU!k^4km0dYl2iXD{qQgb=8{#BHCJ=*f4-IgFhqzkxB9q{hYM^XsfcwC8sEv^-~MlQXF~=VU^0`7~<6$iytPbA=k!&X)XSTWEFA$LjjfmeWR zVPC^hw*QQbczO4Wmq9(DYZMwEz5y1>a>AC`Xk>(zH#oU8S8x`s9 zF`YBq=_`1;d-lgavw9lXrpT%{0oIe=DTO8)XVheWo4t*cD^vV_4cbDwj9bd!e8>hHgs=eKq(igMSt7gZDL$*e z0GlLlL;YHjgteGloyb(>DyNLAr}~MXmu)WUabI+&9HDxK4voT)w*Z^H{g)OMw7m6J%<>r#n?fBTY3j7 zTNupnjAqXBS4j9~EoliK^K}JZCaJiaDQ@*_P61Z~BHg0+=bh8GtEWm4z><<#(whQCR^DgX~Nph%kmMWYud#e19P8$XUC{5TAckid4Kjr!6qaK zz>^;T5UaQ#%5Kqid6RzKLFi^U>YPsJ)u{Sc*w zm)>}17=~8^!v^eufmseP-ptCLg)x7_V3u#?bB&a3Am3fOh41Akmwy1oW^WD?mQ3{$Yn?m4%$x?u{L^zPkRp}3QQN`eqp#|(ZBW| zK8(6NDwc$RhT~ug5K{Xs2$ybwCy(AY>X#6QmSX&utuY*<6I>P;pVP06u!YXE2V3QY zs7m3YzctQ!M2zT$5YD<@$2fa?&f z>!?KtlR17pOSTpUER>{fO$Z{f9CPW6!EMNmc{R?KnEWKeR)Gv97R{(8S_kG^*iztq zh7Z@_o29t-j3Iw&2P*S@k%>l?`dGZgr#R?nGD-1;8&VOnV-7F^#;s{QFq9kg(V*QK| zZ<77zr%{(VR4iZxaGk@mh#tAT#Jy>jCkIE7KI|4c8Lk(2m9<8mXb96qt^nPwS2@VF zqaGLym#r3}?INBaCjhXuq84)7gn1Ygb$D_fwGdledWCG*i+j9C@oE7GIyvij#WWVW zz0%EMKpG2x$K|le`6R9i12ZTQ6O=!;x<#ZJi9qw@vh}Ly<4y>WP;%7Tki>xTML_R@ z<{@kb7nx&O`aiq`*Cc3QG3#rWMc~7JDtZOy!+2OQy)koMPWn?KTxZE?tAW7m;!ldh z=gGsk$4fdj11%?c+8V;;GzTOGnF~<4h+#TZj~>Wlj}=GKZ~RuD>pWNrf)X( zHAa-%KmR^DTx|^(Gl1E+;zaR_7iU-`fJph6?c&>GOpe2Mqcr7Ih(Qb#(SDbK@y|u? zy{9qZZjIRG*|u{{LqycPL%BpO$>i+d@F=3rF^Hgq%EQ<3+jt>wflb8KVwUvUGc?Aa z3s2*D!u=-Dn?d*FR)ht|G&y~K>>P3$XP2!pCzp8-3#f~u)iGZA9L~daE_YhdJ3P%&BE%&xjvhsa{;h0M zi~(+(0~6J*Z;B0Cp;?!KPE_WMNHG)m`aw(T+5)I%QQ(=2x?ulVM4gC61chc?4vsMa z2+KqPg^3;7#bJ9vPqBCaFd56Jj(4b3I864E%Z_)GKKtWxo`Am@ZPZ({bj*@Ql(=|& z8p#s8LoQ%fc(VWOSu_o^5wQ9oRiWJh5;5$;3`@EK9~d^thtZ|S7MfPo$I0gzKF(1- zfCI+(1+(EjiWdfO!7iFyv~a7oi26;yKQx56 zcAZ6RF7Nd~rPZ!+*jgwEjq@HGFtdj>e%J*J$U*6YaNAAE5dk?6PFRTr#zUPJTAZ58NQ62} zf;ryDYz}Z^%;-6&pPje!jdB)rK1=Y+XywBUcHHMG>gbt5kp{eM0n#c!q%+Pt3{3P6 zU<|Yd$+%5`xWKXa&|ECr+1N8MIR*3ns67qDFOvX2O9-zVvrd#D_}@chSn0nIa{wgq;l$?3DhC(#rEe2W5}g;I3AW5ev@Pj=iM&VumpT<&qwXtRHm`8c?C2mmL~Siu=zW3?ONNd#URy$QT@W7|zS^4FB?OPYwm^@66kQ{1 zEdd-Qbk!_5ZLbs#+GEf;lgDTK=iyr4Mn7Kk&{{a*Hu9d}C0-7weUk6n(!w@MOVB%* z_~XMTSh55J!%GhEW57o^tUQZ&h+aZ9u)%$dEkTFy$#A>RVUS3YisassP`1(dO;T;) z_d8z7i;fm2+KQird}JF_tpS(7IgSnODs}vTjba>ru#a0(*q#9}?_f><-O-hkm`msZ zQ69g*X(-AF+U$5qsmJ@z9zF`Gaht$L+KA_k;?Pw~bI0w&gknDF19r`xipyO85cJ(gfKxeP#~vMh3tB}uc-)L|hmGR-3`>M)V7Vpi@gJ0a;_UYV z@NT$>!LvDzwzYvu__poBVc$CIa07UKbs$ zB~~++i|DY99}_Mw6c4t+f#w_slYPp#$J2@G9OPz1BNkvRA#6{lD4At}ioFfvv5~1G#8B0_M)HR5LZmlO`UagWd?>fAOg(i1-vUf zU2YS(0iXqx*n*FZ)CSui*MnywN%fq7Euq3@d)~v3himtQqwZOB@a83e&0LJIf1xf5 zWvJ~rZUe-R;ZCn(KIh|pZ&V=tpLWnRQ1Qe5h)V&wa`a8a5x8Yw1o2|ax{6&Oob_bR zet7icX*4UqEG)Rn9>6cK4vJn9AD(RtfbXY3Xh-N?+uQ-?<2iR(=U8_}GSPNUxD^7* zVgB5~#EI#iOBrp!szNGRaEsAnEZ{2Bl@>ZlV* zbui=B0YZ3qd>OTtEtlgb;`X3pXO+*Z?5dKYV|j9j1Q~?m*^5IW^F-@tIY+zG2kMBc z&G?|Ty`1OZW1}RLXX;@%@VEO!yqzMh)7ozizmIMod7I7gq(Ia?Ilv}ARITuqQxlnW z3EQ$Qyxm6^H$$I&h=-}5(EM4u4M6#TIAQ>db3t_aINTs^4^qGxI3C(sium8{0s9Vf zGf(6r9h)@XPW!p^gBgngPW63wQ*j$@sp2})D)bNvUlz2A2;oEx0MetjN@I>Ii_zP- z*bcLau6#T564?otPmaj4QGXcTDPr@Oq6UCn?H?aLM!6N%i_R6JNS33nAmXd9+r-ry zvaw;ASS;=l-6zbOp`Rl{I0p`$0HO|Igz7e^I%0az-6;VI@wG0v=fbx>($n20EF^E) z-lc+XH3~0Vu6CffV{|Wq#^ZEmHB zn+sFiKRG~wpo=x1HaJPDUR3H`)4;->Px=Vyr}%>(MCZ`km~wG<%st=vC5o4`h;k6I z2J;DdA3kZH<97Oax+HF!&ITt>;8UR*ea8i}z!_8P*ZimaR_~-kxN3@`Pga?j(}u@~ zonep5Ky-Gx7-=ox9ei!@3`HBEId-5d!I1D?aT*9tK_s!`N6yC68?hbk>6TbIVMd0h zpG2TAH>cY1R7x{;3&f*{2kcCEjg=AyO4{~tA5XBLW2i(qh+~5x2oncm7QDuzAM_0Q zcpSOlEa9rz!5nAITw_eNFX)%U@4~`o=$~Yin#g3@1?mk7pACs)BLmvglgsweVF#BW zRK1vnvn4$_JB>K*&Ww0^+}lk}?HqH8oq2ye##qM1oaxAoEK2ZC89>{xg$-W-u#T=# znmQDp=h3C|&O+NEDi5ru+cw=hOCk_~nK03iUOs$wbP<%j%kB13p$By?euA#$EYtw( za`DpVejJm9{qK$q{?i||UE~HfFpMtTKJ@7HMK~wB2*mh&V{XE+;Id7Py8w$VQMh4! zjgGb5{9WAKAZ6_+0<}7fhJBZ#74)d(&5`%~oUJhI-g3rO2nsKmyPqP$MGTLF4vGj6 zr%>wEpch;C+Q6VfPN9^t_2w*+Fo7@J!YM77LkmSxrm!ny{hVtlC;6aW6`l)VdqL|+ z2~fjifX)JENynTBK2gK-w~FPCuLsB)V`akpRwq4B>a5__0WU4bUG8k5DJqvstA1e= zansAK&gn6YbXMMYYsFp+lt~@t-0ansE?23LV zh7Tojm`0JRa76~Hfh!WBqvBG>eH^T(0Aa9^9Q}zdDG0W1CEH1X3qvIj7p!>bR;dST z6`Ct9`iKqLufK~}`oJe(S3DjV5>%u^Vy9sKed08Xa*bpmu;}9f04;?ReF0Cb=E?+$uGu0jM_&|E zD1zk!CVv-!!n(#r!v+4_KtaX1bYcfUvb|zziOd1oaDn@FBInNs-|l@2U2>Kport;YHeZ2*m)K~{{1 zJG*DnBt{u9t;NJICHA`_!2G_B2BZKoD|zvlaCw|hIl#(hm^R%cJQ>E6^No!SzGiy` zw~66>Jv$5{JAfgW8al%%*dc1NI^)eA^(}^f2&ZifUTcpN3hJFw8{A|lYkD4;!BG(o zwV0@*RRrioJgSr-o%g-5;uKZeLf!KNis|U2ps`>gC#X$gg0W?g}4!G^#jOhPC+0v;awi>xD`-dwC|9^xd))h zARgZOo%KI#4)hN(H3U{HkEdJuJzRwS$BQ2jq-h_`laZuj+Yp+&yzX32Kw9^>?#l>w zgcAfxUuCz#{HNIA&s_3pVN z;&O|WW-cOV0+WL>jAaNUQ$k9yOX=2lt8_MQ=O}dD3xhBxw>!JG!iqiWe|Rp=w&nK0i(JBJ6F#~tC6CY-wV#+Bio$7Kbv?at`} zt*o}km2y`G2#Szeu(ucSm>RyJo|`L%F9THzm119xHw;@V+eY`OX9;HibL^ipQ8$R8 z$V+u)8#npN7+xF#;S{j-3?!xA+~J(x=jibKIepVoM=w+c3YYbGs3HKFZh%=YnvWp* zBgha(kII-Jv5O%%FoX|fKb2TBEFBNesq=i*3Je)HRA}Sgkq@f|Zog4$5R|eG zx~1FDh9YeYBR)2D_@r1=yM-dD^!vJ<8yoAxm1BbOGaf)(snuh`MHewby~P$z@(frA zS^A>lwit3PqS|$pwKy4Ctv*gBGqwz~F>8&A5pio&K!_!}7z~ZAlVESoHg8v_b>U08 z;f49MBrbBXV!(WpkF`_(M-oZbp=CzYF?8@FJiPp^UH-1+F7?=%$3>$L&^`u$a_e=6 zQdAgS4#cYDPEBv!C1_PE%#YyEgk`rzSo@hie8DnNqJ{mLVy7HJijW5s3% z1Q}Q1y%85@PC?8Zd%Nle7XaPsntaH)U|DnMT)9c!y2&=#-Y69eSr@Z-Ft($+u2|q; z-D5R5!SMl(`UDWz)&lAq3u=)HpifeS0Z--b9&EF)o1uC(Zr-AwEwKsMG;Dk^Kuehk z8IXiC!5UgMhYBtLj=DV6>fJJ!{hJ)oJNYFc)W_OK+1sn5l)J2}ntF31MZzO%Y>kRh z!T^&Uw%?W_uxv_cE*dRh>s3;`skQ+YqGoVg_pe0lj+b9KCA#Qze%8m5F z#c`+?Q9jHMxL}uE<|?_uX%-_MN&p-HkMN}-xM~H5Ev>tDy*pc2YTZMcyNTv)F#0-X z^_ZChe$M#~hYGCko&R{Ww2W!Amlnu9cv?x>ilwh)2K*xy^bUPcJxUuJCP;SWMn~nG zJ)IwcDXl89%>7+Q-<;Ni_pBKD>jQMj-s?#KhsSX1w|4OG`C7l4t2h=DJ| zbI?Y)t=__?0fk1Ld41P1chrlSzU}~|d8NOYJnF0!R!lLS%mSn(e1X!O15vr;WzH+5 zVqNj(P1}0gi=OzLi~a;5l^_YeWW}P;q1B1eS11xO)SGd#k_8A>?BAF5$D?hPw|Wh- z!wj>ErId?`%ELB{%U3*C9J|!-j@(!u;(!B~t2wF3fDyZgzzgq8!-??Tp_fv7e64pC98B z0dM6}(gIl+s)?OuTFr*X4$!}22FPWNqmM1csz%h|R+mz^a*1baMM zH#b*NH#l23i3vxo#2IN0qArGjW56ZWeb{acVKIo}!h>KAhziJoc=K;@oq~S4UK%$y zQxnynoPDzy$g|3x%Ml9yK&d1+vQSrRS+1wu%aZJ1S_1R~09si+SLD((q6^SXD?@?f zX0=3bZtkXW^~}};8w9*nw3DwI_HHtxdfd~T<^0O(0mksEAH>zqanbGN+$*}HC`%Ip zbB8`QFP;3HWmdY7uaY_wXUB>GbrWW{CwF#rqlt!>t4$|(Rkb2J8AEJwaheZDr2m-V z<70r;fsUxsxSa!^UpISWd)w$H-nW#WrZ0Qgn>vol`9QZqZ2{bN0vZrrHlZX*v5p~< zABIWQ#y3DXDYw0N#ndJOWE^7V19$Lu%yI|pSZaPoOk4o!dcZ?QJg>ls#0!l_HGB6!Oz1SSQ;|7T3X~PADAZdZjhOH@AHLS zXmw{6zC)9_cgwF?b~M8wmStiuD40xeZEc?QRP6_uxpG^gl<1tM>QbpZq-_To7fa%2 zVOvIj(dDDl?cRTe)i&T~o^cb(IcvFcu;lsg^>^LRoFku4$6SQgM{8XnE0FY^byJZ# zj?7{E@XXJLeF4G=%AuMfQAz0z4Z3piw}n9lWjKm2&!bI#E?qE_1^Zyt{5prkrp>#4 zR)8C(@`S?p7zN2W>#;*7TQ}hq*~rf-P)auWMY#~!;a8l7OiYM!WA=hC1h@Pp8<2C& zsaR3W2#k$Czx1odl$QT6t6SA&=Q6vZ%lIqdri*ZLL3^F;gIkW&e(E$Ew81t_O_^US zr;;4R$9^+Sdpbgu6BTlfARj7ytUL#PR3Up(S)9(Ao8 z2vc%cY2&EPY39V%okZZ*#?_BZehHhff=xIF&=q6KT_RgD`kKjdDXOiI8q0dLV%)`A zc_?!SGcKts`zzqHVUGnTq19AuPBTsYL1w)0oy(Laf#r41KF0q@iHhe?<>B6?QWg4{ zF-YSoo+V$Rw<*+U*YPhck8pn8DPc{y=P$H=E4p1TyZOx!ZFHGj=K{kLurFcAOJ>b|CaiAlMal*<1$K`>7LRY}8*I zKJu@QHa1G;)f6yF#$#?Hb0j!WAcTv_!TCs0JP~>Ht7`ay1vCL^S# zE480@w(bFra_-DQJjsR2;uHxRbCuxqD~Yf3`0u12zjCgP`}q{0=5ldGO%J5|zB@$w zxrt%G*+$W7Y-vWh!6~ce=q3PS5`p~O80}$ah8KY+RJ+}=tLZy#Yxc9xkO+i@zoK%^ zX-(w=zWS9tiGr2ilE#2M6 zbhOTVb8{eR+s}-n1K2C8njea~15I3z8ExrIjzd3U4+LbQUS@=eK_D9AG11-jP{tpK zt@)YRh2|JI>qfU$eXL|IEW0o>co+1%K2b+h6EAO{p>v_$pUzX_X8=@!pW>FeWpDk} zsl?oRw7EoNnMn)3b$8^qJ44gMLa+CdsOnJO9*8UYxiLfU=iD~{cLH z^miJuu9nlTa9R}o8iF6zevJ{#e@IL83Dd%6VrR?#V>rnTbNjmUwI0x0vxNE_0Q zIWOv3g&;V)I`_?y){37S&`iP?mM5!HgRpY4!_3^51Kx!9+bTMXWamCDZ>lCV5vWl3 zWdgV2j&r*xGk5KLhk^4qb)%W@Q8nLw_H>A^AIF_))LN&}fJ5!Vq5Rxn=7CR-t!6pq zt=s{N>Cy8bH=cWg9J8t5YGE~hW5)gLli?iIfkL`>vermG?!%e<+<31E#}b@C|1i9A z(%>#(ZcM)BnCo=c9Ubxd$eKa!843h>arqjjl~qR#$9=cT4tK6N z@}df6=&2OG2fv7_B79u$?9wvN<{=~*zsVSg_rS7ZeQ3BGm6iH~Fwf1KkchDrKl?%m z7!wY~wL#dAsT}B1&|EPojuz(;A>b~#LftxTlr}flx8SBt-2|i>P32p&Vyes;zh2v$ zeNSaVUU)bcp`I$hKVu@~Rf=VV-Ta{^=Ewks3Q zT1dO1-lvCtcSn70&oM{r&RT0~oN^$@mk;2dtJr6J++$y@cgkskLW~Pza3#B!gTY)h zeeDN*#g}#pXcPzQ6{nYwb@x2&(v;gTFg-gJn{eN{gJu`Ss0RX#qb*p4^Cr;+L}!C0$?f6jH4Me06XN`qJZGG$5f1WCByY*dX@|^6Na+E zK(15@sHyJZ-bYvpPROF`1_s`*b-cjXV~MS<)mm}fA69FY;sVP3IS~Sp^j(+nhd6Q< zGMM~G8N=As!yU93WFD~7K)fk+hyvk3lG05=HEvJ$pAq@P6HC0sj1fF=MhJVD7cXAix%Fc6&aKn4CwJC~^S*v}IJmQ` zLA`bJjz^|0J|Mv)Fa;{NnPy?u8%;56`o8Yb3RX5CCCU7I_yy+5bD}ZFYmw%U#hO&8?`xM?O9{^ zmsU-0`dwy@*H}YsWX2SYAfq_V0hy@u7d)=+~tTo4v#A*Sd8qp z&n%p;G2pIu9;%-chYB<3s_n7dUOFe%9rtz~*(%{B4ai${q5ska>eq~pACy-_gOV>* zuBsfkI4o>EJw4TJT73=bXO$6T!KEP{TIUCs##pXeWq#fV325E>4*f>&PA-2V~4?gsfxq@g*Fol+%6Ua~8;oyhH zOe>R*lFIj=Q!gFIiM(M+8v%{YF`foMp(fB)$7A8huU#Q|`*>%TwVREZU$>MCSJjSe zB+RE{fVpZm7bsAr(7m1$}Cu~BfVVwLU zv^RdkbK>b@*oRkjwHrCy3o+4VJHn(?DrWZeifH{N;24kc49o|^->VoKx8yqEH#%zE za;oee(dD!}TckY#1sFoZmi!%MiyVm%_O>d)Z$OqJabd1s3jm&ext8OJL&#%4o9t(C zdtJTA@lS&f^mhq!Y?U**y_0NDq_$B1UjN=v_ z($9~M@j87`GLtGl*wpB`pTpJb5}MovyLX1_iMz7scv|nCLcz0bA?){(Yqny>zXl1ptX|XN4LK+NNyrx5x`6KXU^?wSMjlzt}kt3O{CX z^}HLWrD6pQfJv@tELzyOWtJS-&bW2uYyf@00SD}yD@F_MZX0O1F8r(mbacHX`s{~i zr{Bn*LI^@-m#arQj+s#hFa6B0f9#{!MD~xLoyxJd(Mgs?I4IN$K!OgO%~vBM(Q0rm zW{cP z+MV^XYH(MrIa=Ha2x;9}vF@_Ic4Q@DuW<0{vu#8d_2hPBMf*FM>AIo2R=A1PY6vnx zUqL7u5Ien=exq8e#m5>E{#uxIHdqp4N4V3^h)VDbZd$m$#sZ_}qDSCLaPJb-P56m%hCBL-y6c(hSWAHJ z5H1)i+U{o8^wE)ZNjMJdQR{P3G~A5h%C*2XHJWZ!>Y$3Yd>cS z+DvZ1@NVh1a_&_*Mb&;zeADvfoGadPpjtVLDra0L0v~XT0-)}sM|fMgj-2MpuM>bq4NevBdajRnB^L zL{xrGrj$T1J!E?usn!@TsyelH{hY*eA`Aw`aObD8q5V9kL!Ci?ocKP3u+Q#I}SPFE!%+Y98# z>Sa?g=&4wzP19`E{!xo2CiD9_rKuX=>{U%tw0+bvLOUns5D5A;PmD6wn@2n26yTUT2-Z+rk!^oly`4Ypk;W(UP^g3&~GYwKM- z&PlA$38O{dJwTVK%KDB_mA80g4+r)HI|X(_58<@c8IV0yAzHC+7}vg*gf` zPl^$U#H$)yPfWX7fI_L2jibB4H7#`H1lDXg0H?M)C+O)Q_ifeE6OJ!_i-E(!^Jx`5 z)Fa%k7TCoJFu<#F)?^>&9CJPvK6cgI79G`mRI}PNb)0aY*GELH>8O>n=7w=jV7mxi zH>t(qR?d3Ah;vSGSjW7+rlVHQdQXjWV#f!}*#sa~4{*mJae4{?kV)iI>U_@pu44W% z0vfC446SNw_8nK76BCi^%hg@2H=8gg21=m3gGaY|JFdH`DQ#LyPC$2w3`8a`i@4w>Pd8xa=V=(i2l_)e>;!^FltWTxb)V!o7V8 z{0orrV7;rESv|gStusO@Vkx=0y)_ZWISGwafYq`(XHA4*P5>dMIZlxUwwbUV=bK_Z z!$aul>66+=sM@SR>O5==9ymv$S0OatbpAILO3^)XZwadPV8vM9t;X6#ualCdArCJ9 zSP6LPW7qCZosA)X*<-ul!oa1ELK8W2hLG zxXhZToYR+;IsE5rC4OFvhcjZqI@D}kW;o7Z^^6a>xI2;|GVm*CleWh24nJ>!BQ^$W zHD@jNb{c9UYZozPqc1^7^%f#7yBwDg4FqIWUF177XJ>Kl-#ubz;t+P4su!3&aQg&? zk{P|y!fF*Rt5JG>`a)CWX%+s^6o88&p)dyu2vptTtdKt4yxBVAi^nt6C7`Jvx6b;M(Dw1zljrUQo*Urs_z9u?Q_4Xf6cDVl1*o0-F| z@k(rWw`_LV;ZnqDvMv%rCLyEyj&Y05L|u8gyr^MLFRae$%W& zOdmlfPIJY=S=HNmb5Y*9P8`>zjs|YN-u7c+u2!-O{I%6E4zhxn&)x#E!KzB@eJMC( za?S&j6u3W$fX<+;IdoOJxbol^EfZl9jGNS?6_8l(f~;T za203$hwQdOcEkTGECtmCaOQ|v4muPFyC^&uo7MnqN{qo=Ku^Y8mnKmmvnl%45%BGk zd-s-ic8CAqe)jt)2?|Es8#s-uf-58f1>vmGU`{MBYZq20X+VITEI{0T2r|nzn#mBn zme?`#Gy`a!AoX?$?CySo#&C&=lPT!<3QyqxO&u_uKQ8RJ;5N?i>8Ofv(PP4Xb0J9x z#+j7)WjW6%D5?t48CNQp=miOyLO2x%JKF)%&c)+c4nde531_q7&0#6? z5gwUDW`U8jyPmW|cjXCig4h8e7?-Y+f+ULOQi+HatGG;MpL8D`^+`znL`EZiG_Aq8 z*j*(0tzi=egMu?QRYCZbF+(^us1`v7gP$TKxF&Z51_08&w;)h67es%x|1De&BlOZF z#e+j86%hdX3d$G=?m@Fj1hU1P5P$+r-hYnIXe+AfB0;UzV zG{$R;OT(iV<4YHDnwt$>BRYJ7C|QP^6!_*2NZAQSU9gXZz!HIN#}ue+TLmB*m9`|1 zLIHZ}RXDpqM+jOTr?8~|z1&SUD~Ot#8!<@DG9mgNW@q5RR(_mYsyZT8U0M=-9a7^$ z{@{=xG`j~V31Yl!lFb(BOiqAicO_s8V=w-Mf%AajP=R?v)mwIV6P1JR3YH=7_s7UQ zP3tscRImtZSBE>2aQdDFeOed*4z^?v(9?J zP~mh}KDfL%9UPyYAL12jPX^8ldxXJCJ-;pmW9cO* zht_}MMha90?^!dW0RgzlF8diyyna=auJ8VY@AbZ}T4PmI51Lw_;c8B>dYORV*?aVe z2|fFM?LqWlqxEF7elh?-r}=RvP=e@ZdUU{OltpUl>mO15_Oq$Xem7P9gD8FZyU9>K zXmZ?T`F(pBcFKF!4-)X^8i5 zv$7l80F4j3F+$?Ngv0%C3(Ms3Vu~y1#?9LxvpJ>;Lwj_3@Gw1mynlIo!OYv*I;%Kc z=L_J^zs~1>NCnHvIp-l@OczY-15I52QvSnY4F`KJ)KB@mEXZE(x&FHJofS|{^L#FB zzf;#D_q@_(ELehND#tadica|jj`79!&P4~grX$hVU@(WkS5*c3j|K)8RF*hCy!gZZ znQXGoJBrF265~B+wQ#<;Wv1ET;qyK?1>bb#nS(On*FDD)ZgD9e{m#^<`;Ug-U8EO} zI;yuyZCINfMu27hpcn^D4Uw8idl&NWwFigKAdyEBPDuIEMMj!x1q4g1e*UrrRwt~N zm!4d)xOmM*E;j30*s;u3J#Pr2wfHDBT4b(}=$SwLFI#q$c<<>MOUVd6*ca+|-qC$GEGqQLbHMvrs=4@;%dcDBkelq5aerm`g z;p-iOdg3pPMRuzTA$B2wnC6P~y-WsZd4R8pnz6$b%Zy-?L=149bY6EsLwAKZgz@^w z1yPl}7ZtIqn--8#X9->d&Z0gZ$=zu-K-C1UO6j#7w_Jy_Nl~BWJM`dKuxT6uDZK_bbdJW&MSLIf&wa^;4m66*^3>Z5qh8SvCq2WQd?!%#?w?}zX@l5av^1cFE~W6GIZQ-SFq>EDDDUs z7gaqk&tqN=|H)m&(rdE1pJA`qb^MOiUT4jXv_U@RthYbKgK&1JRJp%OWIo?={F zV#Edu0B!CBQzU^BD5q1o)OoMU$%;vdOi1i`WklP<>9fg*%D^eE3`Bi#-$PXcTb2R2u&L;{j>g974qHDZ+ zc!-jU1FBY&GB??{+{3_@v6(j2b!KDCylmWt09}Hsw3`ZRWjmYW21h5Ju_EOP=!V!XpF zq?ga0SG{x2?+jy&Xvp`bLN4n@m>h$z04b+Ab}sT)q;0YMI<0?A_Vj z2;OaTK}ifph0S_+0A@h&atEW~G1mTRa-WRtf_L$41F(hNdr0s;Y?pUQ=d+Vt%-^O8 zftl<*JrWqrG>Z}txNVuHFupy){odb)KB5&^>#Q70;h#NWu)P!&(d&QmI^_$zb zwrNMZrz9n2bDCoq(@uITXf}QoxQs7)gM5_ay{{h(fy}0j;|CLBJI{xA!#;3dL}ca3 zAm_TuVl(LCs|?ey`l~-q04vRBqm-C5eXSy9R~*cdA4;cE!^)Ci1<5wNv7H-$Dg|(w zV$vpH7oL1;iArz8^U56K@saG(`1!c8=3wE0uG%ZcnDkO-Ss`ai?QK;}mCXM5(yJ2( zQoQ)jWn{4Cs?Ryu;ldAw5ntLu=VpLc!IE2Nq-t4(?-_2-`1l`1UsO(wmf4qg1n_E#v_C)FAptO=B%rPdFDB= z95c>yKcb~r$S-n*AAVn&871@?IZ0D=dc!Ps}hwZm3O;G=ckx4t*<>OzuY_3ov&lfY);j}?HwQOn-W(y z;|R0Bg6O)pS#Ivaw-zQ#iXO>^U-}_GW&IGeB>#DK5@#=$uq85ma>r7!c9r_(puxIv zrG@FC$y6|)rXMM$2M58bb!kUOCyzSnaPQc{e&DMG+h3I>Xpwukie0#u-5k@sa_0lT z1@7q;Or*LQgD);8>4dmg0%ALO=nB%Q1o?ywb}+^G^$^1l3?;=}PIp ziA^Ee{j$_ybM0A4Jnl|j`P}bRDs=ys8(Qy?-GeJdHFI^A>VYNEGUEcfT!oG>-ESwj zMn6%U*H4Bn(oy}hzJyU`?;cw}3s6Vug#IPBUScGGww!3SbqaUUTC(Q#e#&;8qf!fl z7q0iS9;~0>C!>J9u4D9-jmFqK55wofkt})WD$=y)Zpk9yxGc#BU6r zvnNf4Dd)CO0kcjtUF`R9?+C@$bx9K;fvvj_=?38XPWcq zg$&WyT9bpY>J7q3_3-|kB>-53oAKtLx5y?bt%CC1x&P~+%*~YG>Og@H69rK9x7N+s zU{V0jiq#u#jNzLJa16wqN$%WopWr2u2XYc7l;4NrwwdGKFzpi<^v-W5I%!35B{vBj z3wRI z->+;d9RX&@igs$sR$I1a%gG3A`@#liv=dw9ZLy^c1sWlOX55^Z9@ao~82SVIuTr$< zZ!4dn($3i7xZn=QYAat16@;F}bo0(uZ}G>l@WmKRM7b`$IKw77c()BKJ;yc15!D@L zDd9_S;)V-Maa|BUYgxEdw?Xw+v|*@uYm|LG4432W@q95)1zMx?le>e7SJ3Ur6ySjr z0HFJK5e+oUN)py`d)`aYEd#oDCLKK<%l_=#&czK2&X8cci#mxud|q1v!lY>3R{38fu#n zP(s{x1+~>QsGXdXCrY(?Wt7PYA*XOG zt>nwmXbuo3AjGELcOgpAuFvD7gy33&+>0<$j!6IXR7b-VL&CrTJ~&0;fJ*_kv)s4h zE6adjX4Q&o*-zm50Q7PVT^3$8*A4g0Rwzr-7qc0=gznfha8Gp!D!mpGbGzYa!E@9j ztngq2s}4kC!uf>|4ubhA({EbQ=a+z>*+jK+O!L7EL^H0SWdX@Y?9UCQAq}-M;0`<_ z1Snx%zrHuTyXbLOx9r{BV?DwjmxVqUtJ}>F_RnZuJ#(jb4t%w_t`FxNSwwbqgdKMqn+t2A77}pV>=UIqa4S@3;p* zS#a<`UF;3~eL~uG550gd*okIy4#XjyJqMW*uGMPLIG=Mg7|@_C-Tu1WlPzD)RoapJ z_5ZD$bD&}dnWVgvZ%*V`V=k~|#+E3+74HIfVQ@v+Yb#Dn6%riy-)7sYjH&`SVlpJ^ zEkRD28DRua@H0Q{IU!=ta0YY;hpB*ASErwj_{{Nr^5)Qqpq;Zwgc}rmgE`+3`>-T%hxh*XZsW-Ash9uUGVda z?gE?OWcsdQm~yL@BHidjRPH?w%B_bBx$36a6HGba<%=FzY+Rz1t57p3Jc1H2aN)Lr z4rVkBA-mrV`o8e(P;Vu$; zAa4w{Kg=m>(Iu%Ua zydT!gWr4-bWX>V!w$xy)+(IH;-A#-Vh$jtN434hl^6{fjuN1GzhX5(Vi{v{TT!7n^ zIOd$LofGC60Hz?rw?wj>Da8YL4lsqYKGOc($OEP1@e~zpJRb|p?0V^f(~~t6`v&Mi zlwJ#g_+xXBY-d#LQC!SNO^qJ0URfnO;-Ub&C#tfx?*Op5yUID5k;PO8xXNPf2aPIl zy^Es2rIpVuaayQNEx*0d^0_+V>SolFzV+KW}WKah=2zL=eePnSB z@V83TYlHrjgFK3W?(SZhH^W+XyaYgixkCW}9YIBpkG?b6a5U!%@$Bf%Z$}7;D~O5) zFw|3a#1V2Y6ruLl^zo9(BC|9AsQI|RYGr;2aglie%+f;fn(Gx`v22slyIBPR&}P`W z4rheWxO3YnHCqc8s73<#V6uDhR9xL9@*+|o<7Yi28|0b+;4|8{jEP=FF7?e7JNiI4 zD+OYQZ4#=(j%iv{EfVl^f=N)I&SD9dr@?xgs?H{5ubWKVoXmP$XrmXvOc=cfzVFbn zh^hNn7Ff)2&f=sp1FpVoEF|(RN)~izCvKgHYy=G9?0WgD#o|{EV3=$aL?1eThkb1= z(IzKdL*RG(>bs_xa(R2kV`o;Sv6jM2Q9V-5%GomK55UW*{gfImJvH3V%<-wqEv zYZW916iO&|s?%K4>R{li<=wQJBU6!&MoZ8*JNmm{x%KKcm#{z{+7X}@!{u^{SvhCb z6svQg1C=04yv5S{?(AYp?VSuGM5dNUcMFZD026UfWZ~ z{NxaHepa}y$D4r%uVXOA=nTW5JGbkzam`3rA!1y_o2c^!Ru$O-%yL~|7-ct`spEW2 z$B*%tmAQXYG2*~7?dwYTN3IHie~tR-yxJS;I$u86XlZ0X!qpm`WlJ|g(@g~(K6nan z5#4lst!T_|FBb|rmSnNKZ+tQsB9U6175kB84`>;DRpL3mny$FP9CJ#TPG?#bx(%-9 zrTJFV^ugts)1z&@Xvhou<2n9L_>*(*eVafe&ui^FMV%k+pGgnvuF=F!rGjXhjfQeD zC(tv>QdX2IXF)l6x?WJtsCked4S`_uCtGr~vl{SHJ>iyRO`w&|LIhU#plQP#G%v!o z^$1~jFVIIJ+;T9!(5{3J35|~_J0&(oF`j{piG*A^T3sq4iRPHH@UC)bd+Zr|&N8#9 zwXiS|K#H)csG_Um1_xE1%FAXvZ;Dugu$6Q3$F(q|=FT`_#~E(-)C8!q_07;>wlTtx z6w?FoGibHEgDNSYX*^c(<&Ild&RSk(!yfhkn)T{>bL&j%B~Jn7t?DML^uUN-2##cJ zs4V_w)NU7N)rMaef(c2Vi#5Pybi6gudF$kyHmew~=~d1~CJ`JOc3SCpEZGx-kj}9` zf2v3$t_{$vxtce%BRyiPHJ?B;6mjIPh-1Qigk?OFCTONJ3q9DN+(Iy@@Hj$>?&FR( zzb$9Eddl84i=IM|at4@)suVkhxA>RiI%c(Lo;g75N+YhrL1=Z9vks@IlHjGL(CNHIMX;M=ve4r;SQVDo-)do`dPU0U z&j7cgAEc{~Z=n{7M1(Kx6ZX-iy1yU{RJMrjhe^b(8%`eRRw&9F!>CG>3lxQ+QF#j` zNxS3ziDYvCx7jKd?i5}p^XHyKSZ9rp(2~9Hff{|b`eGHqq(=t&Nu2!C(7;NHdcsP;*T z8j6fH!c}xJ3@-K9Eb*yA)Cqfqf}{r`B(@^S@TJ%8BqoXpj>T4mu1sB*YEDBP03?1=M=+E7%F(oLu4(>xwC^ z8Y^vgtA32b1{mCQT;Tge4>B44o15Zf zi}QP@QmC2HryyP&@J(8SOF8Rr9?K<4nzJTh^<<796F%iGJ9^MrTvf>gOsO#au+&q9 zPbKBIpR}t-^U+RfH(W0J{CvPY?nRwue(vYklg`_vbKm;==T@ovg}-_8Dm}8%aBtGf z=0)8k_hyb=WAo1Wv({C+1n!Y@`ET4#qZek%=9TioD{>D}u6gx)dB3u`H&5JQ*!>*f zNtB)3)%tV4vvYM%Potk>U_=eQge1oR5tZ+~r26V7L)G>WPh#QXKrkbGrAJSW zYy`7&_uYS~g%2K5)t2g~pCo&9cMt)_SDLcV6 zj=;6^;kd_rm|ye`LxnP7HcX1&5AWUu=QMmh9br^4%238vSGnQ)8Djz5Yp)!uEHowF zL7rq2hPhVV3TJBv;RU}rfr6W45@pBsb~z>PhzrWe zxSoTkoaJnR4h@^XdbCK*B5o^nmQJQb5@OrlaE9F*hZhHTHc+cMtPg)^v6A8pKrmwr_TbHWkAQk$o=(+H zSGq8e78~?QhHXI845quZv84}DLpX_XeK-Y|KS3k&0OZ~K;|CS}M6G}{M;u+#rexOa z6(!G6eM@w8C6{GBz>h= zWx+rWlkpVLckFl*IkGg(*1ZdeuC1am)6FoDs8{{Ul1I4gXI!o_kgMr-H3@TZfKNQ0 zkXbOQC1c*wNycM!+^9-#Ho!W&66dY`Tb!J~fkIa<750+xbU38<*(}80`&);N$AB{2QOUv zoW81D3N1p#nj7NAJ82rsakX-`1SuU(Gqi-GO^#Cl4kq8b8r*Uqxboo>r(o$Ez$r|N z4TGrn-4z+F1O%mxi`X+geDMV5ht|zouvf7IGA>c1rgGf3IXXL(+S4`mtb}mtShWOV z!SZiHh_oax+&@gTZ3sQPkUX$%&fqR8V}os*9? zD(7CD_$MoQ?v?yqA+m8v7U)mCXsx1X?RK2<@zCw*EfSwT8WyEHefNu zG6BVU!<9}?jxlC<;($Kuj>qhYwULe>8}Ka>2j1&u?}v{Z`H6^vSs*Tr*@?SsbLw~* zv$;E%@-%>Wv1)gsh^3T^+$~^P;Ue$2Mo1{F+imw78iTOwTnJ;21&9sz;pHY(t?_{S zqa?dDMpZ7KS~D$JA?c2X_@$Zixwa{st}h*^tTdutD_m|r?{I_daxn#fxlOY#&&@3uR~lJ? zkhDi=bJy%@Z8?J?^ZK=E+xufvtus78dxlQ%rRORpA__f(GNOW1 z_@yC!xLTUb3WAVfFoXyPT)o}u`TqRWR<36d4EFqd3tZPmoNazUzGa;c?mGlfV>rkC z0@dw0Adro&O96v^${Kpx?uA3;^H}cmV7T>yts4AhHLkf zh-&;edva$TOA>(Y>%4%A3`RYWZ)W%%y30?AE54w?&W20aVuB(1@zF#2%?a!gmwaKG zY*rLQVwEJaMJY!nN`n7B;c}<=XO|mzToc>C0N=nd)@5Z|N`~xLMSu-3f%*k~EfXzE z6F5)W#yqXSReOda#!-!J;zt6%^vgnPj88XG7oY-Vn>uRbT(e+mhCSj^l&Q*nCM*l& zniPHUj4F>>hYo4LdgZvV$2lET^;>Gw;DJHHM~~box$BuVrt6J$rt1wu?;b}jYJNIt z%}?T^5R}PEhVQ4UyHY06iKSJP;H~VcwuBk6jZtV;ZvXZR)ar7(vi~qUcdm8*BUec& z0Izx;b=n){vb7!g%SY{ol`q^3ghOd6qJfhmn%reys9b(T2X3N zHV3$!;54Vj5W+faj%L{sAR<6O_P-5Q<7SR85}pd&c_JqW^bL{GUt+gF$Sm+SL$H_6 zsGNdBfr8`ea12^4@@QECmv1hq#~W@h32eIHbc`Cd+%tk&cG3aiTfpOGBTXxV7{3`i z2;2Arg91<$V7{QCCpIcBLP;&S>jJzNT~T>02&O}*#w6VgNCLSgpnW|(08G?v$S2NH z%xgCZ^I5OA)J^1Lrrow}d0}Au?6*%oQ-g6j>fvdBAgqwpDboZ6tAf>}&TZZ$tgQhf zC!dsyQ1Ax1xK?-SYxoE49;FEovY5LA+gqP2YwNLAsd&mxb8uc=vBV1-?k(}>MYksJ zV!!`*#Q_O8;hfCHB~}tpxohzABkVR>qebe$WQmqE^@kt#iH-)N30mMe!IsgUf_B6p z8OIkze>MV@3Sq*v!PW1~c<_kDLM>?cC_(EZc*wCgAI|*End`*UH%hSn&G2kTD6f1r z4}H|)j;QqKSy5F>lak#9B-`&}kCi?3idnE=L8I_Rt0O2nQ)krrd0#eOv|oWl+m!?LLqL zd*LAwwuK=Qb^&p+V1Al_c3~WxS^A6oFuis0=ijL96bqF~U_46_uUCC02pIzjK zL+=2`AHgg&YtUO-9b|>u&vc5Ok2@NF1P-1Ob{0!Iy5wxUf?>uI7i5AQ#Ds(~er!wK zTWejTfa6#J_!Rn)re!b9vLG}op7wb|@eQ@;Y~C^25-o?>WP;U~-ygrKeUOSmG9Xi) zjfvz8+>FN!{gLa+v{-^BgHZ)C;W@!weh4ve>jY+8rgMKqJ~c&OMW|fq^wCR=F*It% z57U+Br)T?$Fjm?UABO$Hl?#3};=~t{(A6EoC`Yy$#5P3q#I)?xG>ZNZb_~2C)e*og z$CSq(LpHlRn`UBK*BUmGL$tz5bGuO5z?Nr8nY<8ISJ%k$t-#@E^;$tb2c-Zj95$a* zV-&bUo}L`>7qNr_YV}e;$%SJ6jlt|42aP5%l~-$^YY8lq0&!xJfxto)RXtucjxBev z9CR1lq>jfku2Y+t^vBk%Hz}^OgY{d8F_CGI3Rqy1)&rHJ9v)EeEA`3YcPJvt-Ph&! zI4ZgipeMNCqpTH)@-eVkz`$0TCu!;&bKfq8-&c#f@w%FOGDn z)^w*n@}V>#rqi5x9^gkLliL-`rS7?(6<;lwdMvC|%z(La%d;aZ*SO2cbSzu7myPz} zckC<&>rJ)XP7+fOs97RQzO=^AF3!R&QW5L`k*YRin?q_lI^88Jp900$r(X|Tokd=Klff|!yE5KKDRh4coRfb{f0 zXY1Sr(Xd0LJ*`cB%2fJ&&#>?Hq-^NgfACrO-}>gwovroF^_|<{^PA<*jm^#5>)ZPA zpS=Cm+S=NGcK6M-|M5S4bM4RmuQ%6D{>|HK|Led0>DvGH#XD>N=i$%SzWhfYto_UE zZ?E0>kNE$8|8VVJ{Pnf9fBwmzt^M`;AFWOQ{G+x1{vUs|_Fw+R$7}!Qzy5gb(O>*( z?Z2A+YAyX|zgqkBfBDr~^7W@{|MOpewszz1{rTFz`lo-s_8zN%dta>mi~sJ6 zwSV<5zgYWk|Ks1S{Wt&9@7CrgH`e~`Kf1B@&;IR=wTr+1)!J|V^RL$a`Tz0N+CTo_ z@2q|D_y5k?*?;kO*Ear#zq|I?Kl%69_C8!&dv)zgK5wnPvG&^9>wMGi*Vo>2-`?cg z8*6X!_N}$gc=i@)-r?IjyuHTn*LZiG-^%~4%l{_%e@3pi`TeF#tJ2@*$?LrTjCY^8 z^s3=?SL$c(-Rq=&m2a=QQdHurYaj4eZKVQ1%Z@cz=LS3&>_Lr_5nkSWDALZ0|s8o&bwX%i!^=ntJO0~Yc#@niHQOIYs z@@K9uude-qU+<9KQmRaAV>J(|;Tr!d*O#>AE&dfPD3_?G88>}zW?EycccQq@)_%hO zpS!&J^)b&s=HF{;KX<)Vi{DuLgkIWQSxFjSeY0m(NhuM2BmqMryua|tJI-? zKU@3A^+=R%Z89oUOYHM1 zrN6)Sh5MyaG+z3s-CCcbMD@H%ZzHAES&i8>mqP8)=XKI*zOT~`QBXCPua@okjG23% z@4t4rL5_b z8tt@RiqbwP=}E0tNpDhvY7{lTUyp`(m9@$0y}?_J`)?`D#zyVB!N{l{al&f!v;st5 z;)&JLQ*9HZ9XvSO?S zHvZzyw!+i{jfcv&nX}xsj@1(NM<4`8j{}sd^!9ZYedE8nLRB*BLjf;ceFaoAg2H ztOTu3{k}%s)>rXI<$c3F7ccpgwAZLldyi`Wob=*p%J(YoG$L;^vqlSAH)@kozRF*< zQ!7!eR>>dGHqF%MuFO~YtLGX8@gwzJJCjoCyEusG&uBq=jn=iwQhlHEUBAWC-gDo@ z*HoglL2Kw;N>(ql&h$<#5x*Ay|F!$2=UU@REiUv0?=%{(Q-`g)PkDNsanMd>eN!Fp zto@Yt8bOVx?Sr;1RGW5Em7#jYv5kwpOFEVP27j$x_FVmViyA)RxhVY&H*OkTwfJ?) zFur3{td_pwTJpLpO)KyhuFQ8_YHR;5D95Pvb?8we`iY~r+$r- zzJKo8pi$TS-JmXgdySEKn=+I}bMjMaeU)cw@imu2^=T%5O{z~^k3S-{Mq4#%lt1RJ zBopKA8m&)Bcb(Lli#I7vBlS5SqhHmhb*zu=fS1&Q!B;4DtQXd22hJxWGrGQh$_M>-S6Q(QFu< zXjXsX`k)n|nm*uPjg9DB`}EtS*7#|pu8~)Afvr1n5xvnUXs^{rxy0$zN_#8XQ2LK~ zqt+V@DbMH3lIYP^lc?F+u8~l^mj4~{X*Ft`KH$5Rr(bH(b^eMoXkJC(DqZVOb&1Z6 zp7dL@X>0NoH$#<_r}{NEO8Y6LYn9xfwUV_oj{5sHPec!|l2hZXy5FaKTNxjc=bHO` z$$PcqZ6qDdn_72+e}6#@`n*CZngjLbeLkXs_o-E_{G8sYS2q}k*Ln5{xit>&yOwKp zy~?|5jMy8L{yBL*h09yN#Em|1E9C~?e!{ztDMeKJDJ5z=)K)!Ht28@m^T+(Fc~Fm3 z&-=Vr{Te5Yh*qMcrgwOwUllDXy;}MXrE9it&?a#<&UF^hsm$ z5r4(KzvAgzuC+fU#SPl{>#{YX-mggc31w9jFAk&DYHZ%+?ay3`RQpf(Wpu6nsDEmy z+IEeUA5zALJky+A=ZR=UrVXu>0 z9A9awT2-^=Tr_)w|5cZMX^zzcwN3Te3Rk{Q`Tu=-s&Up+r8dqfdeLv4TCDY=bhYDS zo+_=$s-masjP9E*y?SVKr`2MqUw4wX_DQu!t6v|rTji<_Yl(K%k7<$U_8r=!J^54K zD(&0+ufA&?YpgU68uwS3&yV<4$*Q8dYvfkX^-cNI3Z*qpC<@WD>#iSGzMg0`hz_(* zTK`mwMp*s)z)_FrT{Q3!Z8KR_)cF?Alt)}Zva53Zg1R+-s>$eHGR7;kLGP{iHrpC` z)udKy1&IFD;@2rffj4m`TmR4gTZY|1EZ?#SA-uV!4&MUR>h^-3-J(8&&Zqgvl)1>A7$*BFZGMEQTq)%Fo(i5hG@ zE4@*m`lHn$ey$x`{m>JQyKx1rEY+tKtP&-GT7CNW1}*rCHKaA7Q4rNCzxr%#`pV6Q zogXC?XkW3u7$3HovAMPKZ3H#`+Hc>ZG;wX{)_`?T-8pS-BhIS0??V>6D{g6CW|1{T@Lt`weP@vmxCIjTYLM3dJkQB+`aC#hefrZTUS!+5J!#&x)~R)VfJ|x}UmIMRWS4 z9ZfCM3X$ZZR;UzFmgYz+O?lN4&7Q3ajf1}Fuhx@3qBcFzdKJ&o>}Uqx;JejTtyak; zw)0o=gW90C;zk-<(VIqIHQSE-A@yi&|BN?3<$sNo(TM8)CGSLMs!3~5`;T@9(^si3 zm88#yYriVXS4wFfZZO}fS0f<~Bpr-N*y^QPCK^-u*U7E1wlUDyo8Ce^Q*xoGP5rR` zN&?mzd!6znCD<7J!lhCBwGyRQQ?6@H(tFeOPE?{9QCm$CQ7c3ZN~d0F?!GKX!BXmP zwHDNi>(nV4(ZBlG`qfTtBW+`>F|nOS`;Vt7x@jR_3 z<+A6$awDo-YKPumW877y_@vUQ527w{9_3QI?0=2F%GUfFWxv8NYmd_Wl9X!KTeSBr z_sx2ta#f#7QHtw~sY*8Ojq=+lsWsw4U-0%LSFTd&qyB$Mo9skjId#fVPAf~)r&&-A zwZXVq^aE&t-0bIk(`;60#p$f|)u`K=Qmv9iRi4V$U)yCZr%JI_ zXascf*DQ)7X;mtReN1|`{MNz`C|RpZ{LW^;sM>m>G{2=JYjxEtjjL+YZ(E`EL>k_z z6D$YrAH}xVP1y?;6L~c&gs3e6?CVwwbgMH;Og75uGZP z=uM?qKQwp0b5F%HB-LtVs4R`N&5hFPiD>S+qxRR_w|B^UgWN`?l4-RAXdh7>`m1)T z2BSaqM{>niJdsqXk9uHh(RylgV)Yxfsr*XwD(+&u->6inRk}*J?&!*9OwT`}WYLFF zf;f`;u3lJuk~=g8HpVta8bOVQxVCmW?GpN}Z>rHKLhqIDccjtxcj2Hm%ld0HsTAT~ zwxd~3Y}HtuYMQs8$kzV6pYq9OZ)>e(DTCVXEb!eQ_57l6;vbUDoe_~@LS|n zNk)Upqf)dlX)Wtk#GWXb2flJyp8uiRQ}2$2g3=ui9hnP`j*s8Z))b{?{+RJo~O^s!P4E z-YUKSY2Nrx|7PERNLhBGmt-&9$LpM6Y(0toG)CH;zu=?QFU_z97S)&+x7bm zzDqv(+~qS`cprI2x>)6~nbCPlIRBd~t zNpWAe^{RERR!9dR9fGvg(t6np=$Y!#Jn8K4wrhvcp16tjJdKmec!gAw+H_+52H|Zix0#kdWL6xRk(y4Sg`u8nT+kB~y8cCgiq#u$@ zuC%7xk;JFA*-mMiY_&vlF8!9yKGFwhjMY9-j?uaOYnpcH!n7}oc64e{3DWPIKGUe( z^b$HxXk67M=@0ZyX;p*fPERy?>XBBAYSB~8vvyePpU&t;9XbtaRoXhdK`P_=8adlB zr2(?jwW!zDl(YewHR*~~uTBzbt1*St|K{i>dQPW}4*x%;bcqKP-WkAAnGD1~hnAHgx|n#^{@X? z`>Qm~x9W-h)x36nK6T~&nzdmcKaFlF^r`;Ux9a1kYkzN2eM+DIw)<%A)Dp?$`euKB z$+ z^V-t1s_UCLtbP7s?Qii>>#p5XucU><OAaup zS5&Prly2a2_f5a_v0o~w`H0uFKbn2f({Egh^!MNE_}ECj#pqTam8-o}ADa!G(>`_I zKYHo-+x*y!y+fUv3*D0^JVxWAe}DBi_!w=9+HO#;C_po=@#^|CZ+?PKQXg?PTb;UJ z`=KA*zFhrzn_k^0XUeG5=Ec5Oe>H#7fNEV-v{1bheTzCOI{&Go2H6GKN7N&oqoo(+ zRyo`MzDK&Z_`msR#HvrVuIyiFER2VR&wuJyrbqP4vX1*Je*PX~O9((A;d9Vq@(G$DQ}x>1Q%ew*wAYZTvpZcns&e$nwUY5m{*{jnqP3a8T_ z`YF9-Zw?mAMZY%@Dyioq@}ncH_oq`3;RX(2D)dHO9}MS20K;dAAm4-$^lKT+XSiz$ zTMe&`;Kg#@D^d_D_QK~Y1Gy8*lEClged`yrD#E*vkma-$y7{gT3w%8W1mw8$+hH%P zdR0vLaeoXx^)gLvM(OeY6bf4+029AS04x#^8fT+uobUo&fEcV0tCP_GbbXRd00PE8 zaXlQ}g;yZ`!yDB&<#d+O?kJ21YO_wJLHtUe6bc5u?r^ zI*)X}lOUq!IA4J`6}A@-6Tqbhn)JaedPR_DCLPal=Q19YR*aws+<0DuS&9J|&$SCKSH_FYKi+g z0HzU$Y&_lLM$G2J`6wp@WBdY`DxCLb$vk?I4#scW01$AH|*!2 z-hz@oAVjgZqBcM^B^VV$V@kghd}TXNcS%z8U#HN2rzaR;E96D0Y91yvz+x5zZlJO!uQS+ zVE4itW7aXbl7~^{qbZ@UA&mr_vM|SN0`fm=Uva$sF=T^E3Ev+obZh01jBR7Fl`AT8@T3Y%oj*V$5B2gC@V(uvMy(q>+IHMuU=*6@LA(08ZxiH6+Js~-ZCUBa;?+6f&Lwl5( z5W3(a^0vERxHpCsS4^;U)6q@L5>YtcRr4mjtE_e=B;~9}Hl}>OZnY{1OPy zj6pk&=yW!emo-2T3a1d2mo4xrM#lfksChF26%hNI@PBdh=Dk^wfp_zCBPt5g$i{$Q z(KMpUMlTmQi4&+v>nnOi_$0-&C6-gv1fbLVfEbUGr<-A6gasVT*fEnuoMYAlGLxd9 z_+_h}oLB{HsFG~sCKP?TiVV9Kb(RS8AYqDrq4?{uak&_<4+PK+7E zsrA;YVh$D2#LY;;-pGkKI3P?*@-!-K0Z37A3=O%(AHN(Aifr1OCtrsG_{Kt@FBy{7 zGJXLplH!zVo+7Rarh9K%fHDmVPOz{D<2nX{1S!;kH~MR?80s(xh~Lv_REuo5=ncuU z7b4hf0CtWH0BuF6#v9<^^yi!=)KP@DL3sY*^*9BFVxD{#wQf1cri3pO=^@ld0|Y!2 z?>L(kcf&p{fw{|v;JqBj#f@`ucA|C1FBZi35kSJzNJb%4%K$k1A|V{FKW>`@w;A?8 zgm47u+|E;Y_Jet5E@nDk%}Gk{*F)!lH>$g5P_Z{OQGCMQ>PY*~p@r zM{fX!Vym#ZzYN*?W*^Z0-V9KLyH7(V#+xji&HKsm{&!J%fHWghg5z=$7q;y60An8E z;vR}7o5bh=#$`SRV&?m>v;mmKlaw<6Q?K1(^mX*UPk?tI?vvrYN&E(oc7iG;7yFmd zn*l&f0|d*51Z4`wZ!j9MZa}ptVgKUJW*V*pm{(E z_NRT8?S4ERDJMd9oa8$}?1yF2TCGbpEa>PE=yEU^r!G8S_-d36*a;P*s3g{C0SG~hqb^W8M-i#8 zn%O9)S@QfmYU_x#nHFgZYInGWUjcJBn$bPM4ypOa5%t6P(!nGH&?T;E0XahF$uNQ( z-$Za91Lw-gc85udxY4*b;P@sqI|m9Hj>s5kv!729brdz)+afku8siK|YL-njwUgeG z@X?50)dM(CVMrpLG%Y4WG$Nx!kVQdh1o;FBYB(bV zPDEofPA${f49G5`5QceJQ(4|yvN?oDfX&&U0Lxd5-nR1?HFA?3luaLbsQ4xlMK+NI z(7U3qobN|F?2M?w|2JuOwjIZjWDEN|%y|GxL}IvN&hyj+Sf%P4Er5hbv`Byr0+Luy ze?Iew9Kt<7)xZ8$SCOiW(Zk)`Y}>YN^XOzY$X6;s?EyI5`aVhjG#@i&z!o$U3$+li ze7)>bKs4K)X>~QuTe3{Uh0s0Do38R@u8j_}7}mH`IIypw3dGwCz+>(v=c2 zHMn^{dPz16?SdYgK+Wrw6)`rs3}=8+Ex^?4)leE>EUtM~tX<6!bgi9qZ@xEU-@g_A zbO2qXvEBcV>ukD&F5$edCrcWca!*M3P@sh|HhDDuT9849i=6N?o#)0FP%GvoODa^k zfB!J|cu`W*=U!qcw~!Pu-sG;Ej8(=g}*BMI_yrhnm=yGK}u}KC^k7 z!C(tu-F9z2WXoYQ(p4~o=woIAaWa2uGbUUbVSd=XT*v#+wm;+b|O()pMUhPx&b;JPWO<>>NlK zV-+f;*;L(<9M?o;#$RpbHePG>F`Un%IpIz-_xLeREMyB(v~vIO(41F(0!^&=L#eTC z<4I0*qn(My2Hm75*u0{iI*ahozUM~lgtQ~Pfr{q4@~5@_6&uaG-flKcn}5>Rx>xVu z_%;b5@P*8=qYd|Dpb5%oOZjZ}kiGuNfOy-0N7a3zpO~Fx!-_tbUOj_7Pe2vgGm1b9 zaorOeC&zXR*}aRV=8eaIW3EF@u+SUE)Bwmug&FlLZovt zhw*n)Pn*WQ2&Hc4YdO-?%CY&ABw_N3V5WbFLmY$uD5fd?lePOUDb8ectsZDO(~unpbF#3$rP zvzet^F${G}Qd5h?=Btln?ewtNir=oY_oM5du$eV=#^y=m9w4({g&>30ZSh3Q>7KZ? z-;Lg^+1caax^Iccid=ckQe*ps;-YQLyzso)1CKSlpR5<_?)6QUpE%Kuqc;+T0pW7n z=eP9`^c*)G41pRs)^IZ3Z1v+3O3*NFZgnT2pvquzyEPeWzKgu?R{C6|`cqhy(zeJI z+3<|-b1@;M#GpsP)mg4YF|jf%;l!d}YZ^%f`Y|{EG8};*j=R^4 zMfP@*VG~^{&AEJTObGEx3eUSwp<>!tq|!(|V4UoGuKIg2)fafF*WKP_&N9R&Q$&i{ zl#jFBTxK?HIBGoc1}Ewx5!KCUiuy5`Ngcf~rN z3h*Wz+3rlAj(juHA8n&O2?&Cw2TRfR*Ffw0Dt{bQ_Ao4RPmaKdC_W7~tQ=ZJEGe*(1{I~mu zCJN!F`9x2^?#;u8Y|qpfE?Kw4dMWUglbQBxWS_@&!1v8q`fs}noXjLJ=O{ITm#2Jm zB=k5oDf-NR5`2z>3)3q;A2?tf$x_km`^+xMi`iK97JPj8Gu!NNJM^*h3SX|@XSQ{= zvB>7OEe(1zqwP+5n~Bih4K7cb^I?ucGZfCow9FoUzOwT(1e!JEi)#-0?N34wKHAzf zrqO&$!k^ulZv!qD@C{vRK2Gj|CRG8DxnAa>+2Xk*IgoeSen)_$TbwOn)6c!HNmHTx=$wqwsL4-e*_Ttz6&L zg&uTb+JJqJ?HkJ%-vESqogwNcOZm*Tq%#YU1w1FxPIEa|{F}mvE%l8U(w9%WUgY`n zT~CYD`6%pgYH8Sbn3b;X;~wblxtP_fJ|YB)R$zf^==%C`H}Xr)g)5It0- zn=j4;Z0uspE-@<9%^PF69-1w^naCz|;hR4pUt;?$ z{gk_=>lr%=NtR2`M`ewJGqcxp|5Z$fA2jFYAWtLvoERKAv`WxgBWEOu?sIX?P2UdG zgY6rTRS}$N^Pw?yP=bocGW>Y?C_O!*1w`Y;|AS89x`{6-&u_Xn#RouuL zuCfbHr+xfIj@R9NGevu{nQlkJpe+>rSWY&C(_szp^1IwpZ+NiVIl7uoB-w_s;p4-C zIox56=l1RtmZcUarfQTxQTzA2(H#JD~)Wff6pe(mhnWw zTAMVVv-Pqa_w*WPRjM22xsH?VSVDK86-JHM1b=dG zD;>D^lv4^ezW$K4n(y?rP6QS#xlwt)_)dR};y7(arw>td*hxDxME zJy4X5n%J$Hv%4dki1Ra+v!Kx5L@xXm{X30HOp7-sKfh|)?G7gSYA#e0$V8)q#sKI$ zx*cM5!!PbWHbbrs#wLEpD(xTnB?krou+)9lZ>#)my+X5<#1PGmo<1G;{`dDTt_xu9lS9_T8~7!anc*ozk~>3*e4PWA-A&vPj;cTioI0?|qL3?#u(FxM+Zh6nrHdEc&mTCo+38yilKTQYzF3A9bVhyDt)(USHMI|EOnIbn zv|@Ytx0~Xcz?Tu9QC};KOR{e=k^o=zFr=9CHy2HV-Wkb2FHuo%%I6%3u#tc`p?9~R zn+R108ph~an%+IRB|p6?{F2USvC$a@YJC0edxl?h7+51%HEXLb@Vey!C}ujfZ@TZ< z&1|)f^r4WU9CrUGw$#oTtQ;*%x_a#7hHQ)>VxwMkH;;GUv&A+ZY6(0tLm8E9o9+m- zxO^H(^m~`1+%}9MTuVWWZ6@CqI>7b?90y^h?KkXonYFHlB>4=~8hRuo4Ak^)nSIi+ z(hkw^28evM&5)4}dL%!YY4mLdRT4fUZ+6C*ow(jhpY}e(ll?YWOyHT}Ex)-qY0h1) zattlD=zX+M$$lIwbWw4TD13pR^6Y)pjLg?j!GlN3?BD*8J768%O!~mYZm(Q*6G5x_ zADz6ovQ3w!GvRZOCc4z#f4KhEB!+dAO^lJ(=iP^|8k%K~Jcq#cf?Z$@YjNax^OuSy z&lbTuD0?$B>P#fAmpyUClSW_J7n-aBuXodL|1RtYg9Mk_Ws+i)$=y&!$eufFp}@7=~DAOr#+OyR66u6CwX+HQN^%Q&9%Jya`T*>C&{c& z%(8nm-Du6-xZhM@C=%_n=Qp3Tl{Cd~U(GP)Jm)a}lLJp3Nc?ubgpALIdi!NphJJ(a zx{sw%Qn>&f1HwL|^kg3z1}%lJ%i#6rub;99njsL`m}Fs}zGpy}=99KTX)NB^O_pH% zj~Y{UOuf~TV;J#Z=HGRIk&FHk)2{#gDJxIt%qBpx=tueI-G_X4hFRI#EBf*H)k$uE zXQGLz&#f(U`L1(DZW9)V1DMSraSwEVvP`s?JiXnSEf(5}3%A~DiI(l80>8Q0?vvU= zV#6yuq}fI|J(oLpZ}ZCb=$Ueh4W=%R*7cWc5vI1H&^>1U`KI`7Dg$8Ef4Tch53pr(!0k3R?vXV?> z6H@5N;DHSw-nT91!L!8H2?v`bOg{rZI&*l+O24h{)5Gr>6{-U-hW&V=Coyg2OXJG) zg8A4TKR$fPZP;Qs;a33Io_>4C5Vp<&xG)e_eZ2niC0jEK88ORLUhC6!?&u*qj5ZNH z-F~^rzYC^J+|Tx_*Ju8mOC@{TNSg9>^WV@@)&s4jev=Z*=Feg~)x0&T5#pPT&%;(X zCc{$J3fI-J1O1u+ac9XhT1yxHcKtcGsr8@eK2)=@3C9&RI|x-E7rAeks)oM@q|0xIjk-UeeE1%5^m zR6@y@J&=jTT{!199fp3381y+yb#(ZKIOs6tkB<)-Z>D1xjQU0Ch3Ej<91D3|thF`t z{W;@FJ8iX$+|PCSIk|)zsdB3hHz2b>E70^-7PotO_c31~Hu;VCN}Kv(Vu8sd5;+II zUw{3YEiAurNrotB8hzyxnbleMWt6(+!c{MOyOnNcf~4-E<)WCCQ#)#ewh!6ti58a2 zDaTd_@KZMHR*Fwn*h`7;lv8gyt2G#OfHg5%j&kyv9~s~%Y5CSNG~4mqyo@w-5v}k= zVAxO@e4Y#{>97G)d6#)t;2%R{qBhp~dOV#^2ax5*Z{>Bzkvdx~y2F<1Vw%`%;f#+t znAVXhkcYIj-F>;vL;Lj%Wq?a8(VFu{I%>=~+T&i8gv`bj9NI?}>az3sw9(^!Bm1A0 zGO_U7SHgy3Ge-F8<76xa=z@yoH(ZPH$^@;$}x1rk}M`0F>86L zIlh<#v>@{RT@%9VD7(ZbR(jB4B2`q-*&!!dfFcP_ zkDsoa>5|SCq61+uQ)~1gT!NVK%jUeo@t6cf&OY%i^EGUAnw5hHez{y;+*|cI<$jXGTz7o1lKPI&j9niDYP^Nm2qx$h30^ss=wMG%>egB!5O6L#}&uR ziuqmwI;TO0pRU-4&$l0Mvt7=Q*eerzi>zXfYQ>L?3*Yqm<73WMI_=A7ukb{>4{i6H z0hnew)K^0-3suF-$LshMuX>7DHtfD@yTT&gD13;{m0Fi<%ul0{`wSVZdwJEvertMn zeznc07cK8Bx=U*THaXFOe|@FAj+6NDRtdcI5>^G z8aKF47U23Z+g48pVz-_$@}PAxiH*s3>LXEx0Oh^ulsoz9U_RiJs*E4CJ=bD6#s9_9 z`7_TKoN8N41%y3Jar0$%Pc>VZ!4ZMo=fu@hED)7yk%T`Fw>%Hu;`bQ=il{yNa`T~S zPEWbCk%|i<+rwREPyL9gzOk6D-#_KPNBoH0CBbKaC$?;keYQ?dhog;ZOnH-!AM=Hv zATLQDqZz--Recdv3#$#?z)cD^&6y)MlKh8&x zgs5q|%Rrn{9-Q*wsPXvzO#}Pvo<85qCeZz_ce5)$4%+yNPQkRer{R*Gp=>y-RqQX_Cn5@!(##xE^@1K+Heg9JvIP@dJvR>z(Z|^^5Xz=OG<}^d1 z==NF$Z$_v?)z6S@%pW&d0`wH1l z*wE@-<-13LSL5chAO?zYAnqUX#iQs)uwt*bo#$ZBsf;=~4iL8IqqLG;b`B^Zp2MRn zlNL_JtB_U$2|j+ziX2bpOB_?>LEZZnGXd~jThEj3-Tyx4#V)6aI3i9p9Je>`b2i7R zENq}tg#NxiTJFuq#n>G7qGt8uN-adTU>5_Gy~Dwd|F&kRqh}Wiz;U(oyzZ1G_f6id;jS+14aBud1HtO^Ylq!Ta!U_x>$|* z6`;cVhd&>)y4ceN+)@eUtV(ca_|~bS%|5pTj{nU)v+Ghsfi9p9p({LQgpgCP@svtK zkmvAWGnaAMUs6GgIoz@$(S3S$I)QYHtrSO(`eQ{;VRteX)hWPvFzBg7!AdGj3r~22 zC!91TW)<;06lK;&#djSg7^iMG>Qd?dn($Tj(Rc(pKk9ye#-oUs9B<*GvF6I z7E^RJP{T8mwcUGJKQpzti?vc8-;-GmErqWcf^f>Sn3_|wF1}-q>7K6GuW7(e2)2cD zxSHCxsc;1C>~qGYKjp|$!x8d;OF!ppa-}4Xh*7HN$P>}0n3}5zjj(E}W}*8E<8lyj z?wihd_RDD4Ts$iYo{6ocduj78woz+clnwJprD3Vu=y>I=w!m#rYj@ZZ46U{c@(K`o z!A5R2*R*}utV#DO>NoN<_Nm~F<_L;XgsOR%v8Hk%L1NFU*uh17M4AV@LsRIvWmZXy zQ#gPcRq2(?Si_I!f(wf(E@#)N8cE=ScyoL!cR3En^7d)X2Qqn#pham*$U3{_@wSyYA!2nsu7 z%bQP2&=ej?2;zn{$v=TDNjgm-&9{eVWRUF4$$YRLsdBw-c~2-50)uSGws-jt=N0}w z=J#YU#tnM-T1MxaB|D`gHyNX>mf;kabv*(oSOkxE`Gix2ERSrIzO^7D=&2J)ai#m6 zlv05AWb12x z9HhA8)fHj93a(lA>h|;V$LHclS#?>7K}#sV9Z0AzMJAh;9Wiu|JkYHB=j~n2h%0b)@IZxpzHSWSS-*z@Ae&tQA>z(Hc;d;o#2*5wdccc%~0ix zaVF+0d`^34wj23XWrNBGo9Gmb9ru4#{gG3l&jyrq21!<|Ltayku(^271_2KYK<7B0 zkmc-c#UH9eeWB<3-+5E{uQYS1w-9^$etrKX3ntEFy#c(apLXKUd0OR6ZQXpUP-f>J zUpA)(>^Zb5w-vSNv3P1fS@X;8AGeR+auo4w*jui*BOcZL&F@9V>}=Ry1y^`xXXJH$ zZz3XRLjyll(p~gg} z!*YYjcsynJG_VSsRiM&!jyarR_FIX_jklOg>M@(=k}tuUhnB@u$~9BYluVCj1fb*& z?xbq6ry9u*Zu+2(m_M&D0Dn4ZZYXD?RFxTWC9U@!Q9fAs66llnA8wkgh%*FLvb)2r zw|XyM+RUq*$%=%crL=vdJ)7qD3{Wb0iOka%;)<)YSC+h<4hTD5{%b{1HJ=}&C01vz zdMh5+VCaKnyXcu?aM{F;cW4j=q2AAmY1bi*==5!g%AX;Xj#y4m&;9qp4?RyOFO=GS^1<_`9WzrwxCIrnr z6e&^)DBn8H%p7Jqg($;S3z&K~nbPl^3Nvhn_t#mP;S3`<>dh!HJ$zBz-;6@eCQJ0S zb+C>*EkK>0NoI`9%r~7-Ci3*TBYTFxFLfrGzIjmZnr{SC`_n8GN^3+Ydw;|@wUgKv zLbLMWq#6;~1ccY0Z+}C0Zcgry&_y$fSn`X6boOHER~*1e4j?eEfV=$8PD!Vy;+qkyjRLz6T};H?JneKgCfe41JMqozx&-U4G{dy z37A+EZ=$U#(T>8mKZElCpgsJT+b<7~--~OYlUakJzVoz|7aw~8QJ~HjzECLoB=@%E zE^(39_M^*qreBBU}w>42;;_{wJEl7F^phs=bzY55nw{)HYhvE}pn-l#OX@vzt zizyFSOlG7&gTE|AltJug01QPD3X|1xzrZp$Q)Ls>i;ywo7Zq;_;p$D8?ocG7Ly;w@ z&aey>!r0W_wR!YNU5Fc8vik=--rSwA+Y0sM^{*e54P^2)XYkDtmP&9K9v<&LX1uO5 zC2g!baOV0REuiq|DR?Z@(+PN!NoNl z-b#t)p{!m7gs14mkoy$_WbwmxrBV`Q$7r`A2=ai+`8?ju$CAEwri!4inmBwsk2Nge z*E8WO77L5999;zop*eErgj2ca61MbxI1>4!J%|0t7o?UI<7LfrEYjSLQs6g)MHox+ z33=x1yiWmz@X<#4{#!7_o0;nKK6OIF91NfPkMOM~jOb_d#5HWJ+W%hIX3wLSNyw?h z^dG<572OC{3V{d;H zc`2r@6DRqIgG0s>Ab?IWpP%mX{KGkcVS?jIfB;jUiuztZD^FP?Gw-p9d;oD8HfSwD z=D@x!YE;jMJer^z#-we71I~w{cFYKs0k?n2AZE%<=Xg*EDyg{Z`cY0gpVmWy&x2@E zlicT+3N^()4}s2y$~v)&?d8h*%4%f4FJWC0yHy4%JY&7Evx7^*hN$9)tu zZbL94iimR{>zv$J}gQd>leDE5wsnJ8ihYx$Xj-7$*NQihmySwU0xs zfmk#(ON*nrN$`ca3As;yPVk8U7h4&hzL1JMr?0w%VUtvR`1BT%(Wwe$gvDA8&9Ax9n~25!{fw?B^;LY&}fQn@%fUa~|y~R^f)c zvm!VD%o9WBRski8{ytlk0}JO8IFor4=B4CB@$ul{pdLxIH=Qrq71Zl7+v-dZm{NF< zZ_bm_M(#eJPf0QiRYiptDYu*(9IlF;Gz64S)1bz{R{u0C57-M05J2qnmmI!xR4n4G zObZYD=KB86Ch~PY4G>s;SxqU)h2+ntD4@MLSbQ+;y-oc7d;<_ZDO*ugSdmgh&&_p> z+&rhLU>0|N0MndHmIkY{UQns@sfc{fMI(Bc&12b(mv!Md^8OfRGz&u1!*rW*f&&;{F9P59#+Tb#ss@Eoj4X&DRQc&k9a zGI!)5k^?*&UFJX28eQ^8HvbsCeLEZG7a!ubOhfYs#PEj|pSe8BRB$k4sd)SWp_?+z zyX$kN#~3@>Q3~_I+(iN7^@qmIGXB^d6;*uPu__l@I>G_-n5V62M%KZE10W=~WAfn*^?=o*?)2_az@Krf z&*!?MDHjT?^ZElKZssUUl1*uw&JU@fd}iRrnHf?`s#EXobA0d|#gnN+whr2H>7gv7 zV7EFNWYKH(;e){kQrdQBQSWt^)y|$TD5%@^BM}o{Og@Fzt8Ygkl&j(Bqfq-!r}Ob10?iMQPF`%#kDZ=NuCy zgT!)&+@qW8j2w1O#M0u9)((l3KFiF#pBF|k3GTH_MZA}ZVzHQtpIhFHS_LvQMWC4K zZ%$snY7=}o*ZB@j0uc}K=JU;UmQFuMLPLEQZ+&s zUinLISK9k=#P%pAW#u%XkM}!t*csnZfLM7`&HV_5r^3oWE^IZw7bZdV_FNfFD&T!{ z@zd!t+YV(t$!u}g*PE-}RjyQWuBtwS5~5n4TEsV@M`Iu)lQs9m)=4>xPSn2?&f*%D zr%80JBJ|T~KYxN?1M%~qj3rsBLff+Xg0{Q|H$-I zy(YI0j~@$Xn9~kP7r-Zwxyq_G6@$;=n7SKVlGHu#%Jr}jwE^sBARXjCfn7EaV2HX9 zNM66`M8RL!+?Vj?b84-QcPjjw^J+`q1y_FCz5I$RphiCXnV_t);8j=6>7q!VodW{tiwb|LTy`mI z;0PqAjqBI@^<{Sb%@Uf4w0db_YVDlOSh9d~Q(_wa+4IepOv&>C>sp_2+3w%iriVZC z1k;6NxDZ*P`kM~_HV~O?|GDT#1>lhAY6|mXi);?@MW5+|0!|MDP#mzpz(*F1GS77 zj|tlxtb8^Yp@1S4r|{wSuRdw7412#o=9KVcrRA|Uk1IfH^UICYMhva!x?~{NI=(1W;zmb-6s1Y0R#}1ovual9wzOboA3s0b z#FmjIyDlbjJ9d^HZ0Th%-%&!UB+1=*%RJ8BW@!FJ$h2X{FS>tTKi-G+D<62mM;v!I zpFhlO+1d7VL4lKeojM!XP)kYE1=ew57auui`6rTA)yW2@eW_S5?b!KzOIuvfO$&+5q*XTClOpp`#UHiVK!_5t^+QgaydY1cxjl20w zri`z2^=0puH=RR(jo51MHf2{Z7xX2Pq=>z+Lf0bYn|p7}^FRa)U)x6)*(2+w)Ps=f7d)$(eE9)O z6OT+uC4f|#NyPrGF_zP!i&lEo7qog+obexwM+b&vV2VXbCvvT|fckP0DNm8%&mKbG z60NpnbjDZPU$<{Jzx=Cdbrw+%4k&xL|MCFM&M4g%0(~rW1eJY4D8Ih4lyRtf)roFD zi)qt;j;F23=KEUfdoVG-jw+xf+@Sk5xH{`e%d46rXmFblw^^1&lot#2dps`UH`jl) z|E>-X&js$HM8;Rmmgqu;kwYE0Oa(DFUFr)(xsnG#hftsM?OWb>((hcEP`8YQ+p?aP zvc{yeddUP-xwXiL9FLNm(@LRCg7qps}V|ne$x%sv5ZDhn(W8~8` zm!qjo%Up)g+cE}$w?>IZ#@D)7QRPFoj*w=z$riglw*bdHNGBDAG{>DU!~}|3l+(nT zD+_}!R?(7u3-|i?@0W3r3q`k>T{cg%G>pgg*Q5b6G@`-Kk~PiuIz6O#2LQ9!#v;{X z`WMFpGato1fWgmg+g;R(N($NfZ=Xg=O*2&Pg3mPTK?#y=EWd%V9U^es(xU+U*L7Z5 zaA91eYJBh=lQM@~Et4`33p*PZNQ_B;5ICZheAG1$CUMgOh2QqV{!bg4#Q(_{w%;m;2sY93u( zS&P;S3@Hu{t=1G@7ZnQ^itUKG(iBLB`E!6CjitIlxaFzEHj@fIVr~p8PJ8C%=!!@N zq*mX1^HYr%mKzdz*i9c>ii=s3r(4pg7xboZdDSC5-`|8tUOsSJd_qdxn`DS%7QXNW zQ&Z2R!uRlaQ`T8uPyz}08&%ra#^3#?$%ytlg{qj$?osi{cmJL3$7F3qa0v4OGbf)X z+Znbq4xCCUPSI1V@2~|{kD`FoCMuXO499k%U|*6k8IFpcoj-$23Vf<}a2oPwP$4^0 z_$-va3{JpB5F?6k)^1MC6pzx{PGR<8Pdu{nTzATGBqjxFklp0_Muxs{5F7~JUd%$B za37g=DuJ%%^Tm;o!&Dd&ii!!%=-fR27NwxgSB)bD5A%tHJI-m0Ri||Y#(~kRIO@6A zQ8#*R6-mCom%(jjEaJ!oZfOvfD{;c=RTz(=6?z;C7TRbD5x1{6uLw17Iw_Oh93?`@ zv_usfyk`&-1-MgF4Ubn^TvCN<=&0>bgicad&Xa-;lvPBj^??%MH%``@8@YpU&U(fI{e|n-MLcpkof3cX;p5OYsic<(L zkSnR;{&lMl>AF+=B270G)~=Sn)`M5HmWksuouF|MMeK>X3y#8vw0up=;`O!hL*EPJ zVYEA@69gt>o5rj;hqMOhNiB<8DiMfIYuX{6VZM=4;Pl1pO$gsVE(^*2>Nq$mGXE}! znYFOg9XA_J@lvIm-sm9VpPz4^-oN>|jXE9&BZN@zsya1=MKGelIV)aX4ibag+s`gH zk}t1LPfp)lv`9b4HED|s<+8h@Bq!WSB`=+D=gO-pq}_6~)BH;{-<=BRE{;U1l!J$p zA8!W9KxK1pKC){>nd`xKy}14@=h1mg8Fi{=+Fn&!B`?mUs6vVIgQ~sb&y{RPeA724 zP3m4;Q~Ou#L05J4?ymxvXgd*eq&Yj}(O3G%M|ctVL%2_o`$(}&;ncYBLNb)1LM3mU zl+e?Xj?%OJU$R?JpeBi@HsVi`G)@Y8#FtR0D-?`r9isM#2Y;0Nr zzG|4SG>``)TnwfH?{)0+B&@jiX(%hdw&h5PN13;XX$B9UpTFF%OQk$7gdPhN-n0C6 z4^YeMm6u)gf}jw>61TVM{wZe6Dy`zWdic@*tw5IEJs&fWhZp9^x(CD$=Jw44#r{s3 z9X6u8<$%kE#w-Q()D(HQ>+o|bMriT0YUU$@ptWCaf==?~ML`7y7T7m`guA=Fd;j!| zpi~?;rTdO?d<00EE_yVTS5%NWj^@+LaI#{vN>Rf_uec<2(Jk^wH@Z^UdjOi3Ge}J_ z@9jtPsXABtiRdcEvppCwPFmgbM%BUX_uaZMEt~iojee908F_4|C;(MF+DSC>;_j$M zIzbcSNZR!g0Cg(i=awU*dIz>&$-GxlV&^@jnf%oQ-B2Df;@Bv$Ns})L^thyCTJb$4 ztq{k^W9^t_%exyb7Ye_5qg4n78qu^JgW;u3VyhMg9Yxtg^CQXRHO=pqi>n>%G7{-F zyvMuu3c|jY^MkvCfd{azfrP_56>meEp9YL(Cxawb_x}6k_b(PeG3B&5L--5uDQ(U+ z{c1-+;V!ll$yrbYa$*1R8ddz3N=WPzN{mFuq{!<3aog@15W3jZ$Pf_rZHf&$7=5 zWS^(sl|=1HEy@U_!unq&-%$FB(ioSeN{jD@yuM>M?-zSx5;+ieG`8`^lUB@*{Kz0? zK)K^cFCQRvwIAh)3%A#iOdA!O@s~SwbP;*RV!p~7Qpb^!XTpKYGVJPVlMtul z>F!9K0{Wct#*Iw^z}}{i#{;u^G>!_`J-|$B_)!C{k1$XKD&8 zlj$52t<5m>yP`gXDp^SfIApxE?S8tuskiVV)#?V$AnGVqJlg9`GA%|kbLLQq4G?zP zqT3y*|881~IAyM<;b<3A_3N_v*VQgxOtmo;7D6lYaB4&GLf|aWt7d*S+|<31!|W;t z%ig*J_q$_&;xw`0f;^ve^db7Ti%x~GY9I5-#3XB9_`&#L4>HpiV6-<)U`L_6cq1s~Ig)9dd(wIPKuo0Z^{$6~J*b$M0U=!c9FL-#Wyu4zc z@f27A%Pj$dnj-Q8fTk~Ulp#|Xz+5Z_A!qPpf_~1yX75ICAjI{g*z3a7&TQj>lQcy( zVi95yUtAsegLN*wcqs`^*kSa#V|{CG&_f`+R#kr0IiLf#r8W~Z>aJR050APGr5C&6 z9vutsx+QRPD0MfMLbrn2TkA0FCBr)2U%`Qjr)t63E~;4&-;Hy~>50D;$b{2${Y2rL z?W&r?oj#Y_DClci(gkz>=`Ee#c_js(yRqzC$#YP{^9u}_@@OM@c=82I>fm-+Ec&ACjDFP zojO+0-+aPiHf=*ogB?Sl+52ogHL|-;7nsk>UqUKaFE-Z>ry>#b>Is)lX__4T%&nwZ z|A1u-AKw4-`g2p{DxP7jY}Nkdd-<->kg2m16e+ PB)bwpoWTX%FrPomnw^Y;793Dq=Z>Cu%BlkW}9*s{-c`+F*%6kfXr2`Jt6wk#N%T2_-m1Bzqsx`<0`xMioUDJ+f(9yYkfv zD3Edx<#D?@qXkP3>=tvzX{Yf+xbOg0sU|rbP@?26}c4+}^ zKsZ&OwI4+mvJUj4CH3l2oqf2Ct^rvmKHaMNva#4hi|&}0S|!^m7cLj`O~>kos)nKp zIU%E$&mpr~)EdR1RIgND)Aov%aARZi50vKX`>d)W9jSw`wi*r3x(XAUySs}DCnt1c z?Pt}_%Jj)>;b!Gl#IXyY*gT3Q)2wAb!unPjh}g06CE*M;M{J4Gg^G~QoJ0$=djyzl z);I({D@EJi;RKZ)j1vl^z_Gy0{Q%s37@PYL1n)I{>610oRmHiLw2#nADmJ%h-4RKUG=DSmt_EgILWJ_EuL6hp zAV%h^-&e_k#vFDixDc|Kg!ZeviY^7UK1=EC(7&MUHw-A`pa1-)g7jw&Gv)%!K8ggg zYb$7+uA*~lZF`O-)WR60_vQu0-}6&vW5hZ1yQ6?j^8_@L;%kn8-T{u;pzX~{$fJ|a zeRTFLHnKsNsz8+T9?qLA24W1&4Vi|NAEG+&Zu0A{0w_OH)il14(6yqHSTqL@wiLee7?Zx9 z2BPw12wFXUrf%Je1jT`C)h<#hW$;&g4%PO`l#zwwyFU8{fBQ%F9$GWgndu!IvwyUD zW`nLy9tyLSfNbN7gCJrnCLo`aOT6inL_$b0kN&!i?--tU_;F=u<4|%}B7u;XsQ`_7 z-!`1>+Awi>l@$Q(W4}+;(8o5@it4$xVMg1gDD1g_s=c{rO?eFj6yA=!$x)R|&4Izy!tPjQZ!&x&f;DeNq|~bQnq8WaeIY7}B__kmK3epm!Rdy=}Ka zN^eC=rb{eP(OSe+0?`k_7_Es&oz3s%1CiP9YoMbaINt$G^Wa>o&w@e^$d)qIeM}&@ z=fQ5g5N{4VG4AVt^u+cdWDA9+6_i>7C&hVF9%OPgVYdV3i^VVuxuGM=&J&A zRJ>oP9Hkyl)aEa-_**t94tvOf%yc(^@{SJie=%$n zwL>$ixwE$63N8!@l|uzY*VR0g07_XIW!$2xi@r}mRBZbTKDv<`|n@5W#-dtqnc5ADpmqZ*qlExl! zFxL*g3>I#zm6tPl&Y-16a4b+QMpygGFdBbYz=Z%-Tz=D2lFUKcagJV_-9PY-hX`q~ z0h&Tdc0A3fef>x_qZ~_Jc{C&fb#;CB%k%a9-0`jcmqXR|VD!+}zkT8iCG>I`M8iyd z#WQmmwgmE2neXbKe*H@3@J|%B=In?=DctJU(A{0~2m73(xh--dtEy1tw`aob$>C~o zqGa!c2^;m^yH*5Y6wFVdg7MCugPQkZHe-?wsM&thiep2aQ9;d4k?N%w)*~#KuMM&W zZx8)^=M0PeuYYfO2AjTaK~)KVgR3Ggh$t<^WLdt&O{8a2#phAt;xNsNhezNbkI56E zAtwx6i~WO6n`7xk|8hRB?q&3^NRNa<6r< zUZ+|#s_E|s%#Iy>a3tG+LJy(dNPi?nS#(9Pyp?qkNfX?|OJ z>7|1yM=Ii|$)|kS=r!ERKOJ`GJ*}@$U5=>F75C%$@vdBtgqY{rcrK1j?~lS6*B`}) zf-CDA(GL?iZDQc(P9 zCmh?lCE$d~5=q(hY1pv9_qWQjJVW#>DW8I`jGAQ(S9jl1?+QmIP`(BHL!z0}3!iJ< zaGAP?|J}81k4x;-Z~>~??j5T+r_~I*us?lU$gUWTZ`=jw_1-BdrU(EAZVeBPQln(A z_Y1FB^WqFWs|gbZYhdRc?lJ`F>y*k%Mj8{SpBlF8Qx&{ijphP>E1!q$ULm;R4&6s| zxs6Tx*;bN?%fxk;BVCH|u@cZ5M_ktUeDUP#S#+y)PBoiNYv0{}iDGL3@!~<&3vEQ@ zp}RZ07xWvQQj0PiS5-4E?PXa(jEjHY?0#~ zG9|w<*-B5a8Iw#9iZ+goXqWqvn{M5j(1q}2LT5UL03OQE_g`;AocVJG@hA{Unm8G0w!kUwJ=pj^sWUl9^OAAq?Ef-N2BP1?= z1tGNCU#HMAu>I@3bRQ9>YR^b8N0Cu6oe7qzs-Fr{4jH`=4_3Dj$7a*h(W*^CXSJTu zDTwgY5=oU=ErJ??%PX1~TjZRor|(P-AIqaHk*{ZXZ`@Pkd=&b>)7HH`_;)nK4;)s} zR%Bg{lJtc$=jf2F>M4-iCW+o30`iVl6*a`6u7QPpl95LfbGsNA6@9pR-0f$51h17a zhDtE&`Xrpl66K@rc&mSQ@YcRb1hT8?!S{|wW3rGrC3!}43lxsed+=-d4o_&6#e-0< zmG`9$X3t`^ccfAEaA{M;nhXt;GC}D^q&rtpl)YQPW=*t)Xt9D0)`X4}_Yw9yh_)@` z)W{=ygXyTh5~|XFNQ!FTK2*DE?^kHym%3=gu1zlfA6;Ywg_SCjyg~Rb7 z2G~T0Y<=)e5^=HGor`zXbf+I`c7bmvH^crdUAFtTMDVVEDbEdAu%T~I^Q+0g;rCY@ zS_oABc`0UYD2)y(j!WcDeKrf6#V%(K?_J3=;jRvPJ2IL9bzBl|>< zQ#?PUZ>>p7THeZB!9RcZ@c^|0;?oDRRgPBR3s)Tfrx^dbHOLano zvW~ZY3<8Y0+lgGL6nJ;`#iO%{Z`2ooeWC)sDVNTWlY)SX&|$j2MTw}hAHR8H4Xoe% zlna_@R7BEq0$4q+?@y2Za=OYnBMi@wwy#jqBNwU#>vcHDdp@##zFakWlorjVmebd& z7DFuB+eg{x-kXUJDv8-xKn|z>v(*x`F+=v~WOgvx$pqJI#yP1vBOZ7{wZ$kNXMp=C zWi)R@{gvv{J~}T>(gIJI0mv!yr27PAmMR6Q4s=xIvc#Lb{ZIGd`)RB$GJ3S}l*j zF5Hi#{Z|eX!(Mco+hZT8|GKA(r&kY&dw+$(2~lbW&>4b$SWx z`M&k?Xvvb=|5?t24d2+SY>J$FYkOpgV#K{gi$>x1kY8VB!f?3jrSQ zA`g+jz(_PAjN_rz42}vf3lvFol4-kofibZhDn;sE2}&pf-%V)1l(Nkd(+uoq{A#);l?VLjWeq9QQbky<1&YnrhEY z?GT?|oe*WiW>w1zISvQw05yha1!4c)eG*Hl34mWeWgfSK7n`l*-7HVb>{4vmRG9_a zHpmQ_%W61AHy1e$a3WGDBQY<0(f)7yxDKAELEW=1ntQI}$!Z6fv%C6n{E(;X2-EdRe{I-Y4A1E3_@Vcin6~-?rK9hQYpYnmB?OCb z)@b)uDy3CaRv~=(!wfY#ApuF;b#H$5a9Y}{i?Pvl5umH^C##GIMChe66eWO3#p)R| z?f`yRE`$8pMgtUA+|#aXCOdCCs=Qmi)k~To`g$O&jD;VE0KAectKybSnhaJN%yV== zd)h8#8i4Ez(3-<(?Qt$bQapKKKWTIwEiVOG)1Wi%{qL6Sn6v3U(I5^7;FqXWR}#CP z{5sXUcsY7|S-d}$9W4`1oVF>)u!uTu3PWUFKE`1R{*v0r^>K529bz@SP96{Q2jf{gtSIQh;Xn z1Rq3|8(}R7N<{Dbg}tAYk!H;dh?M#^==(?G^aHng!bzf@q)$wDTr=L1y9jowbpHHs=nYf_~h#9-s%B1R3Z9N0)i{1qdm=e zKKT&~A{C9dfV~bEZRxu{&s~DrBd>SgWB1rODBg3(Q=n((yP6Z**}mu`eB|tPl;`<0 z*hKTiTg|&TrQZ(QO>r<;mNnM=VHMVaMO0O%5iXJuldfbHnv!HG9KQ~+_a0rR<-13( znP@UtRD{NUR+vT{(UoSiDxRLz(FUrIG*W%>I^UPQF!_%mXSR8Y0 zd(}E0Wovd0W+e$xo&fK`)7+&X69Q|}$0SUVUQ0IAC~a5^;xXZ2%;F=58%WJ>C1m^k z?(6RF)Jh$Y1@v(?ouKI2di(qsK_1BZuqFsZsAO}OzEX|m}}j6y8pWSA2VWl``2}pC$$E9ldg8T(eiCfV8`T7>-auND;UR0 z_#+GeP$Rs--L7=i#IzA(2P-Xn!BX1Qw87@!RGW6^ zD&@w0Olh2eGW#PS^(wJ^y!L*>jQX&1tbVEGw7f ztF(KWH=LM^+K>gstO6PLtNDcx$O*R7$yCwEDk|_Lg2PN!Ii!b73e--wCFD7kPdhA; z-iHqrC#S%g;^+`g@-TZ~%J8OEk%2wugTqNd2?HI4TN5ZO4S)(Li*mA}Xx-(v8=aBp zT^Z8mGo&we}dJ7W4tK^`2(Y?pAOsRV5g_`VNz;IWpDIfcIjVd%j(aR(s7geU zRh2zY{35Bv9cooPoDjpO9})va*Z3ILC+t;c&($tZpw*&pjFte=d|-cE2R<;WiU_ln zNV5%98%^vGS^f6;A!_N`L#t_bOybU#HalPrhtX}x0mTU`NKoj>9(_Y%_hBDodUM6M zDPpj8q<~80R25rhUoZ3SYW(IRxi3Yu5U0@;3sJ?vj-`223flSjZysUx@-%jB&sJfE zA?|AFTOtN}eW*@)T4){TeUkSa*64{d_eG&oxT2-E8D~Ym6`A%hIzC~fQqsvg0{BbT zXgY?Xss`Gr&K%7CC&GPLKIKZ&iF&nEU3?gby&`V9OBjnP6)g` z!;ew;-k46|hz4z}NDNO^QLd4%jE0Jn-Jn~jJ0lYQb@pI0l^F!&m%D9nmxB8doy~n% z1k4TEV0%Ty-Ok*pY)gI{wA^`LbX!pX7~7C6RJRf;W|ga(Kba=-n#_?rIIPwkMYk<) zHtkaG6s_nhwTDoDOVp<$UTP8G$5~@!R=#d+Gj@LGzP)oX2b2}a?}v04W+1L z=F-A2{hD(?wwH8Wq|@!ru{7*!`x5sZ(WkiEq8IJ@@D8G0@k96|hdAt~lb7}qFEkWX zjE?r)4<80QpSRfIROV|a!JLebe3YP9C9UFAv75cj0+XMX{yvC>;_h6H3V3XHpB7q5 zsEiMB-#6!nW@oz+w{Iy;m)$A}k<93yjjPXD58d84RDnV zLY{>R$Vgh0ic-?t;%L~pNO$?;)IrOF1l)c^VJmaEfd%M zEA8fg$3Srl@G+gx!}Qw93?Cq}> zjw7{W*d$fj#H83~2;0&FUV*-vI1;?Et0Kw-l8Obq9@(B|#wr)#}j9ik8biPcJ@9=yJg=Z>M1x{ z2P0Y4JJd71+OdoG&}=F?x#)I7Xz%V#@RH2)%5K-TJfG+r0$fXspsH}P_DySpT&>vr z!Q_s#*@hbLl=v$})i1m9?DDCo*2}G@GK)jf{z`MM`-s4cCyLsWxuOL=%-{>?l7Ca;nUJu7PUOSJjvtKS zQ?|Y>me~%5+Eq)4?&HLN)BwSMtwjR)AdpzZ7gy)@`C33x#Z^C49q~wuK4}iH@o%4Z z^p78J#1iSmMbQg5Y{ixZ=92`^w&~l z6zufT5U1Bp&OzENOw!8BD4uLM#r0h)HSg)W1)92OiMxtOgL4VgSj_-)S*)s#wv|Kb z4E@K(x-<%Gss=mNS`EBGv(1=2#j`1p2q8mVbjxVX%8emUW-gl$I&({fa!CRMtdN7w z=UYud)9U*`Z7gd}26=`k4^sQHJ%fnW?w{c?#ndAv@{jWI$Z{!kV|os*&$sJ8(i&Dp=w#B2{-CvF!R|MQlcDG#41o5~0LeSGOY|0BaJ+>E#c$$b^= zkClvn0=vm9N13YK?u7}Vm<-sjpz+8z*>j#ZCw z?%K7FCcukqT)am+HXYkW@obfg+XM2&^qJ}It5SbntMo^-zzSDttMltGS;{sPL!(Za z7|=K7*=*SAR-w`9an;&HyA$ZEr^apw_@hL3Ox{{$;mVJqUJOkZir7#=hs~y6H3XjcS; z7h+WB&^*NCCi7Mgcz_RZ@I5)ouI8)^gm=H&IOB4&3#Wk4!q z;6%0k*ne2NQVWB1)Q| zRm_Bcu%E4gM%SQTG5s{gT)<%lDax;G@FC29Wi;A+Ca*>OGd84>(Vt3#TM#qnY}RBS zsL}*B8-Ty7XL-Kj@e~|Wxlk||Tf|d{CPl{dOJKV%PKxD}w$BKjyJxuX9sA#|zmVC_ z8W50uLeN|FWzti>nNE<6Vgq6IQ%$jwhPl$4-Rl}$lyY-&08Oy1dcBF^~L|arm=&hvY?2ztFU%4p6aw7%5 z^qDI~jKn|KMMDWZ%78D&>nJz#|A9;Tnxgsrvitd!zgl)r;>mm*HuCR*1m~taK$$j8 zIZ#YbZGB%U^1=DpVa+c%KlYaChOo;~q+U(!BRsRk3DkB^86FVp-TgPbP&;#2)!QGH zqj@?c9I~~jYWE+mxLGD?P=tqCCIupw!j|7s=e6t`&AWZuMY^BC+gEGtG)dclTBoQ< zBVX2(UEN0@K5gEc#3^Kb<@gkSHgi4vXG!x)1g2paWJV~iEPE5o--@{LwuUpk+mB?B zoJd)6x(ygP3bd=z*zL2bie0KW| zuJyi|W<;6gcB2KAngR4?5+QHJPe|vOyt`>s-bqRJEc}$?FSLV*ZW2AGIltX!vzA&k ziH=;<_2#NqakZ1;SjSa%m|Gyv$fi! zBQsaIEy;T+CVQNV9DxA@Gkmt{QSbh;Q(^khn^K;=Jk z8l1Ki>(QZ=maLtueXiprx6Vl`z0t+5ffpb?nA1tE$-dSKfy}kxSjpfaB$-)tdN#7G zzT>W_717X(XJkU*A--LI6y4nJK7QJ2Wh6X)_wDvlKc6{Sn=hjBI|yCyF3ul_B-sZR;lHji6#bHnW?|wYS%`k^~;gMp4vW+TY(+6(Dq$T zLW~1X#%J$L*HK$-nhX8$xj>b5So1!{dqKLi)!v0W7J@AnUN%2xYgMCjd*@-RNp$*T zHwn`exfFN7@mh}o>(BQGvX;rDrm*jvQdMH56RN#W&BxBid62}3fUryHnxkdiaiQ#=z;s0KDm98#{c#y zX8EjWco%1=NaB0G{9&^?S*JuAC_d3;rN+4Dfpx0x*0oJz*@~AUr6)ZIS+xvilu|yY z>h~D2DAReqKm1RHS8Ya6jHIEtZj@<6R=2hot?-M}R*J(X`gQNeWCwVyccq=#R|dps z3dSNH!vV2JCi#lQ`;*7ZPtvy9oPxN2y8A7wyEg}0Fn5o(#hJ$Y>jpO{#n^SGC#-}x zV;A?fg8Yk6vY-bs`j5 z846ImlK)GQdN?vL(H9iJoU}lL+-g8s``y9)+ixvDpH~iV2_HHULZ>lm%I#LM+VJlB zeaLPy04*ZB&WKiHJs)lVnUi)aKQDmWtAK5@FBY+{)WEI@QF7(%|FI$Mih3fJDrd2> zFD>J;4)8m;2$mHfO@6b58WPe8Sj)raksAqfis;}`y``#Qah$w4EtCQd8OEx{Jmu%G%w%5mmK8*d& z>_h^g&Fq9aq<{uI{2YLVFZ=Z=V2h~WsQx7%K#J3bU6EF_@T@xN9cI$&lk`4qGijw9 zM`nVE@v-|w`lae8^P>O7m$aZ2c~zY-l6l{|7%z0ha1Kdw0jSXWMfUT_EBxn@0qxvH zPZMs6;Mo*mIv$^PaYQzUwUrx23x|Vmy^ro*GCIhzI5hCG9*cH}jO%c>wRPvBtFjxt zhaOJamX9FF*Woej0=B~5Q+-%~T@LO1_D@%(n_I2oI@nQBd471QzlpaNU8zp8Do7{U z*Z~WYlTtd%&O!Jm7uAvpiNS6?gLv(9AZ;E_Lp@+3k_3lFUEUvU7I&)=`C3hhsBRy> zT&BcJ!0x5Gsog+d%xIEiu}DREepRomLi<_;D%vkW0~fx(D?>u}U? z+4hseU9VNwHBEq%mck)?mtBh5zQ1R%);>UNoJFSEnSeYoz_IW~+P^BK`Gwp0(9qJdsxA^?=vp2UJ`*t(AjUDTP{+V?mz?lH5WWu3U!bm zP?fqdrK<=oyqx{<~=eA466gcEyKQB&^BnH@w9>uBy&bEQJk4pS&w|IXAjRJVhpDnkBhPvvZ^ z>UylQFEJ(;h_rdMar@e-c6Ja*cNrS1f`MT2;sXV$w~zX3!Ku_9Ruipww((RWmkqXh zG)egL?!yzQmJj3S&!5xZs}M4OHbmsL-V|Jzdp$Rss}JJzlJn>hmvnG6n$9LkLi=Hk9-1#IBh!F?q&+?pSE=5ztzs>Ct}sr3K9MTdP( zS91C---OP^A4OI#&L$yE;2{=HxYlOzQRm9n{^tV#o3C~G*D}6#Im_TL0-v^7CUu5PA`jLBu{M(~2`>6lXJoQD zGu1c&?O@wo$W{J+eSiIT%JIwYbTm>C220*`?)vrbSNFW9RFFbkgGRbrIW?)gjY+yB zJ| zq&^h#%z^^N4Lzo9NEpB~z9p*p;ma0}xzc+=u-4l%jB9Z&WBEgpvAZro%7J`GxtX2F zK2-5?XH{?ILR!%&SUFm7wkk|VOj9MT$~DDU$l-}y-<^O!68@@N6wXiXhLMA3C43_&E` zZ@x!bupNeQ>Q;-BWho;;xM4@!iwm{H2jptWw~2{CrJAlKaOF4}X^B%+tqev8J?QYq z6TOBE-LM8wig6(pPbpT*p3Kp3>nJ9zu%3J+3W-Th^0#-?d-<5uc=c}=#+Hht9>aEk zvzzZ8tNiCj-u5a&y+JButRKv>IEcWd519hQ>@}S?(#=@=-p0(?vA1?iqSnvhTpe0< z8&PbTm|@lf%VvBk$Yzf>m-pPD9TLqxvR7%59ogp6%(>lGLnMMW-K=%d5uA z(O|t@Fv|@K@<$zk{m^8o;-#-Wi|z~2HY@CDg)jtG7b&{^`m?K8Bw~PEw!94GCi+j6Y0rkk z&JnBUt89%kICT?kd4=@$H7S}&fQSGi-wj*OU)z?GT(s}nSo+)%k6Bj z=r>xS?6;E27Q!&ovkyF3bx{Wg;BZ81X3nNx7Ni_0-~nul|a2f5{!T zl@M<}8mdAwgQ)+7r1&05ZB%L$4?NX$Yb(QkFw#lQqbCIx%3nm0h;wA0k?PE7tEp01 zHidKXi_RA5fqL=h;!?u6@*v; zv_LXLw9)-0G!hOBKIw@hn)Q}GX#RdPr*NBtdvz>Al%e6p+tCikxIMblLE&nT+hs2{ zACAZ|Pr_fViUdRP@V&@tzvKP;Rti>y=uitW z>_6B}#Nfp#s$#g`U(XZ%mgY&6M;iRUi9uIgZPYh|Xi|ExP%wLi3D-eo3ZFh%&TM$3 zwWsnI>uxpgU;X^co6g_;HNON5YR&agfSnSngI#gP+uQdKAKO~5VU6g5Glrx#NoxCj zogpZpduMGaN9*y`5Zo{})h7PKWTq|;8m1}9mPKYY(p<=p_}*EX1_g7{sl&~@H?x9w z)-9Dz9QiDro5zRWqbMl+yB8x<7b1K=0b%VHVI964wy@T4#(6r*kcUdx`Zj9*DmS{$ z<;L7h-?msU8yONljOqJrowm)r$%+K^ez;3xCwkVN9K|9FFLs%}$gr{z*-VfTT+0|A zXU~(wK&lBE8Q3Un&(E=@5i8^?n_W5oQ@44;+|h12B4$)T=yve**VE?yAMrN9ho&fLhp(aeYRqCUEPj| zMF>CDHWw2yibeNGYk>~AfHn_0EHt%8j&FPY_;_9P!*kw>S>8$@rP&fyTxp{_RCm>U zifr1%i745UdfiV?PhX9VMDw42{`uzQ&)08G9v(lw`RS*N3z_M^D%Is<=RHGjRM z51T>Kt=v|HwNr9)!K`e|0p|oKB>K4SVaXklB>Z0$w5jl@h`60NA1hj*2)YX^_X{ie zv6Wr$9g8;{=;J|dL8$|Y#3-uXFN`Drc(gR~M}-cM*n!o9uzc{)wKjQn9G}=?YR@Y> zQM|sERy`tB{UdFWgMSPz6A!&4m#nERkg`|)(E!|PU_Dho#}~~JH>Y7z52$an^l8PE zs5$TXN1z+jA4EahzUOK)S@P=D_yq&$hN$v%fd)r44%GCMLFSeT9~elYQssA0xw@Qh zlz|*Jt=sUYs{~LY(}b8`@%@5~Aqlrj;@ZoPXpTRKvpg!1rwwDCEsDJ*NSP33s<OSj>(*gjow+oRM+eB;gUWgq+iWd_9|-n@BncUER<5uKc&s5Ajmp*qe3wh zsdsbyU@LZ0Ejig0DpEZ5SPqe_^1xdD^7%jCJJuo>JQBgnVI@lhzO5A_SJw(fv0w5@ zq{n=S%1&Rj9H_vrSdN6vXDehfpHBr8O%cAG&vj((iqkf-iB(?c=>1Z5t~Tp&a`{20 z%Ey<2(Vc#DC4;;-#D`5e#nO8IWH+9w)}Ae;J;U9-4dUj`J@|5S`+>2odWI!EjpDOt zJwR$=a~w}reW!Lvia;n;Kxa24hAuiH5H+{WNF6 zaqV8knmXVL$@Zn}O%$@nTlCA(nomOZ*WS1H@+F&*@8rJWC6a1uXu zRCPb{RsP1C^{f*h+#+WEZgA5Itx?7ok>9np>dIpV5jj=GjUrc{;()36m%{=oK8qfo z2%LzU%OMxulPVM{=zC&{6e9-`B=G$|5nC3@tPO^z_IvH~M z+O#g_^JTme>%qg;|I;3F{U6sniU$Km+TO=Ghm7oh%2y>7UQ z2Qk4z`E=d;t1%s&)mJYZJvn!P%HGkhXGfS2Jji4cvQ^;h0qxn@d>qT3)_Vldy(b-0 zvuBO1e;%8|aYWgZ=Vb%VFJiXJojH-^05Xay~T|aT)7PsFoZzXO+zAk&up`t$-k7k+Y zpLiGVt))O_cby#a^CA~Or0PYV?>Jigskp0Bm~oGr87#q_;ZBQv&#y}flYJROVb<+i zW18+8H643{v;QV+Kyu$|>SFWDB5G+>y-4E(k<|C|pNa#jC3o0DDhk!!FD%3ZHUZcZ z0)w8L6_t(L`9^Hr-G^ZI1SaSKUP|D>{e7s_{#H))N!i+DAteu#K0%Ch?nqyW3RsW!jlF4 z@4!&K=l444m^(vNd0=6dH>hH=aF}L0cTU0Bhh(Gnqm#Uc*v7Nroq(@Ir68;q3ycUf zUG>Us(_NPqLr*1W?L_XTQ1~}No35CiFPP+s4Q#c5W+cK>b?CwWtW5lMOM{w?ihoL$ z(bMyXUpDKC=(H(C0*vy*p2@(h6W+H+Kss$%N2jhx87vhw9(!(s^M}LjfmBKB`Tnm`gJ$YyA`!iTSxZySFo;OEGnd+{*K2*A!N-UmUzoq*wfYjk ztq`}fx6%DcWAfAx(+6d@aIA)8LBY7h6r1GaqNA7!b@&7B%-Vi$&`FOB(Es&4IJUTZ>U)TkI zr)=Z`^!r1`y}Q2sGtJh=lrZq&{sy9Os-8a6-X;Z;iD{Z*&U)tfY$+n(#;2vzN;utg z)#h{Fg%4@3*ss$)6XVVKJq177NilV^iNBuyKhn;1J&Ge)*ZX380T}Et{8D$4YaSs4Xd5Ig9SokU-|rWhl@(dtEzqpx$7`@qR9597G7evSLHPvXvSf6y=TgV2 ze-3urREWg#68qs`49Fcfw#!}+h}Y#J?^fWAygO>4TiL;;8Lnb>Z89!pQjm95J$Y%) zA-lBXjf4Avg1@_%VYaG>BA#44JG25R@?LGbPd@<9hG*Vnc4f| zQe5U`1pC`rB-y=WXMesZN{swBhcsDFo3)A(dadKle9W*}bIr!t;%%@&^&l3xXAAS1@G%KUe#=$;>2 zCw4rZDbRn%6O-o6pZNWO*G*GWA7w$EcV{x^bW_G%Ka_5T%+6kRuO~{f2I$I^Ld7t#}aI;M2!mG@5TtZF9X>z*vsvRJ?|kVovp zeK7zp1lx((WToL*gz-q*A2rrHq_KJT-B5317mH}Wjh5VZSS|@J$9?gRG8;}T) zI?~C0_jkB)F$DyIXC;S*FH^xC&4sPvBIs=^45CiMI51Q>F_=qxFR$b;9p7`pS!iBP zUVXi#q*xZ-AUhe8iXED(Pg+Z+Al|Ti`|b~Hrqzxv8&tZ6je)|jn<$;(bQc}HgedC9 z(~HK*~Bw}u}Jli1b%ryHb74JURJ%c`HPXd>FF0fM&BPy(4U46F>s zZ2a+LnpX9KYC7oExqCu!n>6)sCeo)8UAq2EW37FqyV|WVO`t2Ar`Af>S5jLaKVO5r zW_>~oeJ{vLF(jzOzT);eY{B1!C|e3R?QITB@0x-Y1%6nZJ2jq^j)nIK+FlDAJ;d`h z`RFxGJ=RMYe3PSN(N!6Cz>03Db1;zlbpK<{0QDd&?E?x5#F!bz;n7yU4#nS-5jTWD z+66UTI)Z}{VwV~lB1Vmp@|MD%j!hJ#Z5kRLCeTHSj|~UlaD1$X|9pi3NHX@go@b}S zefF=aJf!M3SSLWhXXOw*{$Wke@!R2x(z1xAB*!jfVn>HBL%I=UG9!?ueR)nlrSJnkS& zg46i>1*kI7eC3QqtV^ro4hhU5EGcr7N0K-v1V6?xvr|T zrxaqKBQra9gznG4lC>|qqXZaBYxEq^$gIT&D&;`9n0*{-b8}JZO&6623Gt!4%86U1W01~-$#Swy~b92e&4|T3A(OVAD=GlufP%wYI{qsepa3sDV0mgJ?mc2Rs z;aW5shB-&m-di+j|J~_MN_B+wKoOfg&fZ=s`)9oGL#b?DfCO!|sxhjESj3MSPFMDI7Tk2ja!cN~P`jCD7jOy?9YADKV%27c;ycRmk0=NGh`b40@JeI`5GtVLEZ! z5vX9NMn}V+D82g<_Ujt8W&2w;QmPro!m^ZRI+#;Y!XvO0J;s1HbjF$b>lzpWJo;uNYI=Vv#Uyn(77bf``kRTF8WKB`AGIHcoc z&CI*d)L>+Upz#qS3fUS?Tao8t3Ss#L^u-&>YkuUQu-K$n&=GoZ`5*|T%LZ4BcB;%^ z2;uB~HLVP3lt!TacocH{oIPo3VK9@q>{5b0*>bEDB3OnS!9v{zd1L#A96Dff1+pjG z4OCQ@v*=klk++aJJznMq>)W=imRrVu1b9Pv&ao}OT>(!7$1-}(Ahksg zVMXR#0fe&vg5?1UK6|^ViS^d&+11G_s~)_2pb423%?;Kl)L8*axd${yen%)C0@Zf0VCiJGcAQYK6PqlPZ#iJg zD=H(HY_Yx7f{=;^zi>sRn+ePB?jq8TbX=Grw>RBfyB(Chq`9(;4KKJ)L%yH0(HD0M zYOi5q(6;sQzO>7*DdDcgB8n&eV7!kfQPi?xv%unsiZQE-FQHzeLca^Ki3IC(AN&ztXuu~*HiUr-~%`q&;LR``@=VD^YzwIc8k;b~J_ zi;g&N=5^{$g*>;YPFO20`D`z-&v+-9(!{T$x4o zKKM!Hw0E%HnvU2YY1KC43M(l%9dDW~$eO{;FrPz7tjVk|fE<%%EU{tE2CP_&msqQG zYT9^+DBi3WK!s+Xu)X*u<|j;WcLq-#t?<{f@GTLg9y>Q?~9V+!wCg!GnvVCOBR%x9E=h|n7s%r1ZI(qI3AX*He2 z=g&ck#JENFfUbhn?y*Q~Dnh^k_ma3$tDSnAA2SD8mNfpe7xUjTVLEavJ9Si;1|m-Q zRW7_)l!Z!XQgZ(Cyu1i(*Mw~3+J(l5*@!zb-FOih^w+_5pkPo}%D6^ea#_(>yaug_ zuG(Cm#ly|{4Z-_JG;c0ZCRQ&tprg8@pLl=f?dAC|neYnAo|Y>Ac(P0<#1qFUH%q`m zXnQ*l9(J(8;#9+~9RB6T5_T`0GjsroD#Uc6BS7u6e*qC&^4r7B zSj>&j@bRL%y2ymKK-i!ZQM({2H?^HXU&WR)?682$k~3rf8gou2Pll!{&{@6FOpK0e zh)VFfF|jp10+d}g@f)f*X<8u2J*nJf z%pl~#I8Wr1vOx##Z8MO#qYfzAUDYl69pz_xxugjZ24rZv)AsZa<^HmPA+85u=*qRt zexGc|)34W=5KU}L62e$yzCBpLNgT%MW#ZT-)Y|r=%KE-3o5^=1?|Vu#Kwq8zX+Dd& z^?{>YWv*kK%gc3h>Z2AgZ1z2qzn}Mgfxws#0Q=PRTB7jb^KN3sx z?*K73Cjlq5yyTENDZ$51K`c#8_`_bWuM)z3K*2h z3q2BoP}FU^2@5d3ZUG1rhW3&x4UaVSELIXPT;CyZ8E~%;?#xSYOMD(*mQQ$<36I8q zK=km8Y{Z%fUw!mWxdi^?E|piAC`8&V&4P1>bg;a0mlW-~MbSbW!q5Ff=GX89_N{0D;-v4;LFSlc!X30FD-6`{>*^s}^3uy!oQWj{)P8vEEv~r>kYz&L zDoYU2-|OC)@fcYE9drm7UoWRGMFoI#RjeE zA5;@*A#LC=S_wTwILiTuG9e1a=(lKYkL4>E#<;{Eg0_!iGXiMhmedf;CeOA~Ut-?u2yk%6|FvS*Ec` z4bIz^5(UPk21mRCvb!vf&)9jLbT(>9ptvF0+eRD-C)FrFkm6YuS>txypcnH2n-z_c zsdx&m)DH!OvT@0SP_bN)5Ieh#;F8fyF#}v!RX*18ahd40uAmFg8?z)xnq^{M#SkVp zWG30yqC>Y0iK3$ng0DOcJ82K71ZFgsr5q7PbkMA%$Hg0BffCN}wfS|N%9p zdH{m>0mU0sE;uz#n}=D45Ye+??_)B#|>8_tfzcWF3C=@`qshQc=vGr=f!;{*h7EnTgm^32UbvFxP~lkI|j?WxqQ^8L9T&Zq9<1Mnt1eI zX5LTl*nskgR)&977-^_4q&k3AAVU>wYJbd(AM)TS+idBLfqObC26oTZ@RE4Pw+}e; zY{J{n6*L>OZx%#vDrnO}ODG5a;}Oc6T6iGxi+NGPrF1rBEnVd{YLrbFGa_BI$-L06 ztl-MyP;2)*`vnUJTo-?O{*eA)ghT!Z!{3N@D0>#w?nHYnW)%!^&H{c>-Ad>f-+EwV?ik^{H3OggbZ$3{G;up0I>;$Sum5%0@xv3IBeU2C;K}@7&vm7TD6JIRrw2kHQ3Z1cWP&7N`vrbb5z|!u$Jl`4(#Umj+Eo4qo$ zT^sfG8SY@k&#pd(;kBp;83KU_Y$ivuCCJDd0~nZ3Z3<)bdGIiXG{7iV!mbJG7_Pdb zOZzA0rC-}jxY^9r+MZwl1X9+u^Xv|z;{paZPpTF<@%^35$QugYm%tWB%f;wJl!V|T zkKR|MYVF{@T`l)ZE8}Ei9CCJr#g!A1`7TIz3%HXBTxQ&rhK&u~*E0%B|G7mE*J`_N z_G>DCWZbf$DMCTSHfG!eX&~jmg(LjM;PE|sRz{jgKQdg6IGgxeasx2>`7-oV@&`0u zdIf$QZ-`8I-J@Pr0XusC@r6e}dB~>?HA4OY73>eSBIK;pl$ihoL2X32oudDk!|Mt`Q`Oul{6Dr3#n;x(ZeK@v}2&P??+ciUOd=!_u`< z7~~v`=D2kzoPD=M}Jm=^t6uUyplPy`3 zil<+~Vx|eSa~r-rbbsAD41Qoz0Mul|#G3IzeP@cBMTt`f3mi7QO5SbAvyVE#vc2%z zJyIkat_0{yeUl4$NTK~rC79y5=|j^6mI`Z2>fAc#SIueu%4O@@0Xe2gXqzTMPBNdBI00Eiysa@96BcI9M^E zUE)ovOc1t8=wj@%F*II>3;u{_>IK&eaZD3?WWMC|hpW?eMWR-OR#Z0y)l4bxR>G|h zP76-9(YwrS3$9MpZ41t-nWt@xm!Akt zux1RKoJpc)sSIn6+DT_>P%>WQFTC(}LA4UilxA8fABdL1)GSk|Iy5#KV8EF?B_5RH zXH2-qbiP5)5^l@nt988*3mAXXUejhE6sLslw1c0ntrC6`fynt2@H#}QbSS<) zn7YZ>%p_^-NBe0rT>{OosU6PeQ0M)t&`J)w$J;B+l|7_`*sG=BfZZP4Gdr2)!W7*b zb2v-U#CailB=p?nFqm1Y!H9$-xgy_+!4;<-bjv|aNZU1N*ElIrXPOB=!lgbCqX>H~ z0;jUE8?Fq|G)ne=<(rlu6R8WNM24^;#?Ke66IYlhn#>krN={xV5)rn)2J~-2hfKNz zZwd#$3aJ4u0CxOnqi}SPH3U{BFB6VNS)vFMs|BtUY2CA{`8!&)eY{iw+TWtsx%5Jy zmFXEPKKG~isehf_26Q!t zB!F+TL5V4K6=`*kejN_?ND&$WXro|7-PsldCgl};fBTI<_0{#&?&2eM(O&>q??Ly- zC;4f)6_)Cq(wCVu{Z4D>9oS~EXPuCNMqbUUdwm*9IWu7p`Av;!eX3$+myjQP#8Drz z=9wg%=39kK#xEP!6}^Hn6C2CMh4sSJ{xncdt}$0}@2CQ1US+YSKI)N}O<<5ruAt2p zL|d6jW1+%C&O(d`~(P=+69W>3CIgUh|=YQ4^Nto(p<=sLIRo1|L*cVoWSxs zqUB~$JS=+eX-cx&X`bahVR3P}m6vDdP*n={wuO-4j%Ude$%fnRR?9i9^Db`gEKpO*qVPDF3+!kvb+rtq8|r~hG=9Wtu_GzOPLZ!&9 z8(}iq7MUOkF}eh=-8mQd;2X;57wdF^DF-@5LBj`f(azK2ZNYRx;2BC=f4P&6PH}F| zA!l)=>pY7C__6B>o^M!|!qFMG`xq_e%~5iu+by2#0wxs%7f@NPhz;4vOM%sNhiSzn z4jF*gPt^?ca!H@TZng~-mGNE)Gk1NiK3XiBg(7eG!#_^&=d+zf-wd!k#LSIthJ*gz zg5*MACX>}(S~|pkF)ZWMEki?+SuY_Xz)G108K8wwmh)y#9B%Q5N06q93X&ah1bet!J1JRd;ldwcBLlx zVokFt5zT~lWMNvEIE;-UnK<~j*5iJ-x0pCx)Y*ZcM-pBTgi1wN#8Mb=Gil|=aT0V3 z36Q6DH}PWeL$8XmgrNwcSa!Qv@X1;lUU<%>FnQrsrGE8TIsEc8xZ^LNkVo45#2W0-o&4AAuc~)0P(gV14P_N5fs&-W#@iF z>pYBD$LyT8gxSpCC2#xdn<}3mHc{U+B)X=?zBd=s>G7{h+0qISv2l&a*9oa;+E%F* zx3sy>M`wb4S#=u%oSTcYu!P+H-RtV)R}RCdAB|JY%kAi*3E2SZ{QE}1=WP2>QvfVO z40j`YOWXlYLn$MPj{6Mo;5`tci*MQBbOfn@`e#Ugmy8@kTfe&S4&3}S*}$T9$a^cv z3z`iI35=&99Q^$G^9Vii19wGB8(PaKPEUGV)(e*O3koEYf_|*6>8ck#lhrV_9CYsw z-kL!Ew^c>DKo_b4*m67U=HUX@br2b0eg(FieKUObP`pwHJFz(1lb<^U0ci<$jkXKe ztL&|5CS6u|aUnw+67Y6Ll?E{+oTvWEL}}&-iwq@QEMIulbm~~u@IdL)i*FpM^Gq4{ zBpGN}nsdDk&P4Q^f)3|NcHsTU)F`#w@bK*qRye=KM|u(rv#MywlF4lv`g0JU;Fy|+ z8+?j`q_UYD#v3HoG$npeAl9bGWi(73D)JDlq*1b-EpYDIZpyYeytPqurBr?{*NCSp zH9=42Loh>BO2ldkI$(F}B~6)~bI!ORDGTf`5zv9V(>6MK;{CYv*(7{U_H**V2s6_jm6<558q4TP~X=clr_giEx=tcucEgf@|=Uv_J@UOmJG`ENc^v8Nta$ zsApwE1!{{=s`DrnZPz}VAuLhY`S$a$u|0Mh=@z1dMidv(wZuBT4gq8F=3(N83RG!U z9qN-`{9BisUAfp227W|0n%S)!h;!B$x7*fr4?uW&0kD?N(2lmU9}{fes-uOo1#0qC z?XTAqtv!T{b$yrWf-x8?))!dJ9ho6L`-n4t56{R{u3#QqP`GEN?~?*)YH& zcTn>ti1L2a3GwC0&!&~Lfr&A!p{5JySZT_T&b5~`4TCdbnJc+zUUIpiZ#@oHIx^-- z*~BQ428J+Kokki4r+*_=%T)qzt?m$?kMC>j(Qfba*9gdwN5AKhS^Xc1fKQ0ZFmB=?gJ0-_beh{_j**dKaKEvq%w%tSY287o>MdBa_{nJOvp zY-Fm9>>6GY4B}#5LDAs7@emEb!;2S+ZiIUt!#ON6;q@Gz0(xZa$0SAv6n2Fwvp+Dt z2`Un1=8j}$IPTW@Fj_$vJ3c7rhm#k%fSF*g@Wt+ow8F85B$M1$J(ikT-kbeOUB7Qf zv1SJ5Ltx4EfhCnuaAugOw55Hv8d>J1fdCZ~INHjAVcx=y0|jE(yS6-jTo`gUbv2fM z-pOcC?dAdgu0^TKIg^I8v8Iap07xd3ZvJAWo2RL^(m5%Fr)ZI~qIGb{vy6CMU6iKz z4ZIR-o4ps<(2%#Rx8yP{(_)xB4h}jwkuXlCSI_7XL2fl2%lHRDet+ z9E?DK*~8`!vY$eWN(IHDqhtAqH-BV;;K;YDT`Jp{9EFToYEev=rK#w+T@kO9g4$!2 zviW6GC%b|*%En$+RLGJ!47o~sZCllRzStK=w}~y9Nv|-aRP5@!cFpGiOr(TdtYD&( z)b7Yccd*TtkYd=Lz!y4vS|}GY@AGTLkD6aOChj-@@m(}Hc`6Y^t?8hHz@EHyfk>owyC$3x`lIi$eywV zf-V|&1+K<`Q_N%m<}L9gS!r^>rx4D(>J@g-1>^H5H`!gfrV4ZoIpmQo1&{4;r#yR6@W=cf=lrhMEfq$| z!f)49x_QKrWF96X4EY8!lM>{D}j5K8D#yA{Opc9 zfVmJ3MarR2temE@@}(KyX4n?XS)WTv`oYkZ9G?`NdbomjNNoVfI1PLH^X0o+7zfAq zL=eQ}wxoP9exY6}ED8JXnf9P|BiJVXq-5H?s$cO{*m2sW$2yyO6FT!wn1o ztr7n7!v)x`L1jIE_To7z%Ri(57`EvXchlqs1!SVC}v+6NPn?E7*eEyNjf|rWmMvyIpCmXPN51 zLN}Y$k$EGe<2RYot6muRI4L;!X=7idqk%%cBNuLQjET}88G0IWd-ft5d84lmbfdAM z`G)gdD0yjS#2C8C#CA|419009$GUBuMP|9&{R3z<-;ibkNHJo+<%S$Im@+}SikCDf znEmJCmf!z+`ChzH|Bt9Q@x4(AJS#a#)j!Es)tPizHbf!topNU>GYjL9LEZTH=u(Y$ zmq5u^{++S$f+H0yJ9Me)SxDSxql%BMr@m)C<~YrZiA9w0&qI3d15id^XvfHqRzbI) zx2GEnTRbJuVxZm3M|atG$@L%#jWTmDXCH9PzZZdR$iHq2KgSkIlp`A|C;2KAx6Y)O z6uQwdSa%f1aACDn{|vo^+A9KvMATqZ;L^*aU=xI2-HPP};y6%RFei7;=)97YD;>CQCN^m%*;dNU=Bxn2 zf|!Acmam|84Z1KadaFgpfxpvtH)ZLnT zhRrN=(+t(_@~Cuf0+h&J!0y%$KCZN!(LKE*TP8yJbMAY^?Gke80K4Yowc*v=HmJD~ zmGKn|=-jMBr*m|c{0ozhfJ2_HVqr6fU~smJIeKO|=|agQp(DW+D6ktw70SkBMh`^4 zGf8;z0NeC4Ie+~6#9pB@SkiOPp4IZtGU;{$&WD!qLy#ijM;`94*=;B+OK6(D$^(;iIem29HwK2?}&oJof`3mFoSnXG^q=TN%-nS9OcVv8w#QsMw+v)TY6PYiF zHyWtbJ|@OhwNkt8bbi`)yP?`98{*+dpPMPFR2zDArth1)Bv~ox^*B3Aiw3ZzVo5IoffSYXWsXKB64DaXg_6gWt}P zB}U=}i+QtXFr`9w4A@JrPhN%c1nV{F?67*U!!q%biqCl{yqw(j#@3;^9_*E9q zC(`wb_UZw{PZjYlcB!?CUuzatETNd4L)79)t*BVS3eFOX)8MEuOaiB&dXsa(98NUvcZFQNMJ z-Gq(~J(+0^$Cj*Jm-;48Qj-IVzg=qCJ8xG23>t{XQRD`~V_{G?bUg;~u8RshH5JR# zYqX`^DX0cOE{4T1T`|~#I**ZMHimfph;V_emn7UX#D`tLk)(fgbv&+~FQ#AVt_3>i z4mz3Gvj@7D2s>&-1_OgZHuRRXApJnXwz8Wrl8EQ8`|KGvN(f2h;&h|iK&0P05dUcM zn%eV8Q7^mhK>E@^elMC4DhSM#!o|78zYG?X7v4}tM=8yrQlr8Ck-_)ROP2#~X?5Cg z`$9|4dFQFZe;Cmx$5d+@Pkkg^XNTQqS1|gfBA}a@DLw-U;;L zle9Xz_M&Qr>%@PfY-XA>=lx{OFR(osV0?+aFPFr>&)zd+Y~pvi=&6^Y2`t!le5m6n z20LpB;gt!)HN0EGgsTlKpw*L3z^-3yTctw|l;(Q(Sl{eN?H7>!Qu;jgHZLhfevqYc zJr;&M`}tQ+Q7+wV8={X#0k<(%WC<8SZZlyra}6CVb?pz8SUf+v%M3k~oSMU$NwzzB z&$4%;OM+!?o~=!;|5}-_qu`3FYx2@`L>=n4K70lTX8Phkq%jnU2qjJ^f7p&(8U<0H zcZA}P=zkc>Gd8ltFWImw2%zdmsdF)~i6q1zUa0#f43<5F5Ha=bj=9^LSNJ=S_n#{* zgM!<>bLWnC-;y4r`r&b3IeJ;yn4~gcH&x}Cfs;(71RP#)uU(?*ox5%6wAfI5O(y@y zd{IS7Qhx9g$h*Ao!xk-_f$=`a^;MQAI3q0Sq@u-30*$G##g-$8^pQ#W3RJ?2}l{N*F7m zaL0mhQ}#6SF)91Fnu*!BSW;ttID+?4U2ELJEV6}ZXs(8dZFG|H85gZ6u}FwTEXBjKtf>D;$E>N`!0Ap zw=%Pc3)#((d90L zh0q}%<)b-!B}5HOtA25A&IQi>NK}Frb=v(H2sE~wo9t*l9bLv*JEuEZUbR;Wqyh6!b56aEXvLSa3;l2_+x?|y> z92hWnbnvU$j#w-p^W?Wryum3i)54W`B21^Ewgc;WSOZ^wfd*z=pBIH|d9a#6;NNd` zl^+)7R?h8^?6o^6(gB=_m*{BU$DxI=n0p-(v#&U`F%AsRpaeec5 zczFUJLaOR`csVTT7VT>_WWgO|s}AWo1#wY?mULpeuyM0F>Pg(7!7UJs9>zmnun+%? zbyfTkJR!p=66e4&t62}PXvZAQRC0*Di~Ty$!upFl=yOMdI(z3eF}{{C-|;lc9$@CD zVvSGhGpW4CrXvp47!1PZtcc4x+|$uHLycs^Z^g1m+V)W!CT2J?L4em_&wyMeyma&e zLs)^;wLrXGMEGo@?3%Fo3i>^)wRDe@oU$%P+7ts2+RT3(`%JPZw!0n8ta5zbP#nU` zj2OLKu7ZkgLpknoeG!a3DGV=3Gq!n4H)FebRAhH?n}y*nmAjS>X4>} z)QVO8@k%gS9QpT#=%2GoVWW$u3}KYGKXioRA7iXFe*nf%K?}+sSt)0Z^YS|yg;wm1 zWK}<6B={j~T*G!vtM+5a$LG(Uu`LKK1-xx0TkW>=C~$0XN71+*mA=N7C!b#S7Bn9X zO}jZEB|DunM<~gd4e=v33&`d+kR{HQuD9bA&^mtwqwm=|o}D4C@?&QQ!)=GK&_0lG zMfXCZh=40Nze5St-UP#bLIqo>CCltR!*PER)fHEWXs&Xy$Ti_@=&5M^E-jNu4reD5 z_8-fI2LUU(^aF*R;5-$&xutGjWkOrL!*x#EDQcTEO7HQFT=Ls-SS&J5S#r?W5g2lz9+%5&%Ht!FTW!Y)kAdb&zc zeBN(DOnAISpJh4^0<|7v@=-*w8T>y}@!%%`f}Z)31|>&N|LN3g%yg9O%Y%%7Lf8oZr4~< zE7-X9yrC50?5eaG32}Pi9jT^b%>|nLb^Jr7O@%F>QXYac7CRGWf;-igLHHg&Fx_+? zTro||*7E`0H6ay1Yf#uB1$7GcxE2>f)Ud{;Yyy5NShRlFzAE~SSeOrc2l$Wg-h1D| zg#j3LMeq3ztwlv2+}dcU8^WV{bFrVjzr;g8_0d;8&DQhh&NtZrVxUn@RR?g4MdW$L zd=K*|N89a}@%?#1wZPBD`y36z7!$xm;TV}+XLg|{uSO0`J^@4H>CWBp?DPqXl?_L5 zsF;_JUW5m91>|XEELVFdvnTeuq3xnHHO^KcK{N(3nuxxz$ zpN9)y8-VZvY}=+?P;D~)Lu96V{Rf+c#`MMfv?}?lIHT~Yb7?`jn1VSxqrwf|LBA5W z`Cf#BLz20{nXr(is>glz@R>}K)=m3+=nNlQ?-|Yxs#oXj~ z{fJDMcm?%%u?gkbl}vis1pK?wwV~JndyK;#nMyKYIGY;Lv%MV{PTWyWnN73jIN_Nj zJ%I{N*|5qF11V~N`Fy&*CU<=Yg(@UoY!NStAymMJwfS%T7f$4o7E_!}bNA#P;YJ&o z65BEb=3_h~8yUI~3X>8yL?H7?aWv_^^dFutlMz>ID1|UwzQ9=g5F!YVS#W;ThR)95 z+PA~MFL5mdKEVB!IY{0+J7Fx6v%*N=zz%MY&m>uOX zXMWfvDjO>#-Bo*sc$y>1gx3IPfCSIxe_gAj-n}(pU2}%QF5w$q@Nc#|mgK%S4S`B` zH{A}V6dyW75d^64gVM|arHl14z0|*-Z-)p8nkw?c?JT(~x+@rMuK^i`%mwXPvXSe> zlFe}}n>L(`WZk=@4I?j`0w#4w3@4puV~;s|zpa&7&qn7M5}X|x225@70~)VHbO3P$Wqk`BIG{F;zwcx7JX6yIYZiS)##V0O*_AvN zeJ+}2r1Vz&68Io|CVptF>m?z;4A6D2dAWv%0g@s&Y{`X3bo2$@=JR_ zV^NVnX+6}yI2?)K-JPest@10zMK&<3S#*vCQ>bVXX%gd*BL04Cv`QA8n6mnB+jP)FaXJa0^J>e9OKp; zGbpBM(M)(<*7W~TM{bhjPwbpR$tsoSOS*;2rxeJ{OXc&TWQ4!KJ|S>$o4 zPyhTBZiy)!a?#RClpjY+t@4S8Xl|Z4)7(J@bhGAz#lyiQa}{ zJdSpi`PvBLxm$&d<ZtlE?Ps6m#OglmZesCrA_79d6{!wMP2zJ;S46ANr6OE8__wob_uMT6va&@0lzmuPFq$aUyhoPvQM zHf(mqoik|y5|~f(10C7}M~Hpf4fED`f!O^%Jd%mE>z+sk2#%*D60#?duUvuQ%PwQ3uwoE4l%{>myf;fkWTQ7LP$c?4>B!+4Z>_HZQ?h+n>$o}_R?e%fWMou z#PUW{hyMwH6VX1%dI}jeQ{1aYxP1c#mb`9keDps;ZRy3`{yUX`wyc+t*yX9Es@8XM%mZE9W$? zIy<)jvkt4aNtnEZs|tTROq+iIt|DpX2Al4?#<&-wIJju=dZeDm9cHKb_1V{rpjpAb zW4mN>1ghcnQ#7#D71R${L9xP^a zc+xPg5 ztM^|Fn3(n`PYqjd0S^^03{jM<>E_@6*4N@m%Wl3~pjBv+ZKN_`PYtmb!_lP@%uF9a z^Sy;da#lXvkoUEe2Ag>jzLs)G%t_go?@%U!6@RC^nVat>J0XeTDfgZ=Yi!3`-vkcFRzJKaNSuyrN)Tx6+yEB9*31&Yjbs z&L~BYIu>G(<`51wMaU5xrcTo|j@dnw^_x?ljVb>dUa>f{$8K^0Ibb2ZAX=7G45x_h zaNPR37ND6c2v`8#w%wE8b#Md)ZeW(9#i2XF#XJ?ls#D z82dvjrOy}NLR`()(d=dot*@8mrppqNk)$q}(eYlNNP^cbDHvi0bIKK|jfWj03sd0o zsvDYDp^>t<(r&g~Eehy4vJeAGOEFXFhs+~05_=UJ`uV1Gfwq1mja`f)M1^C=-;{WkIS%PcbqD<9;fM0 z9*@dmX26TK6_w43JI2E`oNG_45gccW3uU4J7v==;zJDbIYdS>UV*OM2kL+<^-8S>U zP&P%J4at4W3~S=Npt=PtTR1Y0MLVW3?o7CW-GkDP87VlZ$SkJ&9!8u&84%(P|Cxo0 zvnPPIUMQpZ<9;e+p4k&RdP7mkdw8RteS2i1uNO31f?4(GUON_C+R<6JE1HNGGMBt> zPXo;SMKWvyFoa3*ue*lKsK@D(@(Uh4{kjweLrZ#Z9(Cf`BWad2UsAROdYQi&?hzdx zb-qvvP~MxV6+7?lRzkFBKmikJKKU*Dr6rl7-GnQxT2vE_x+_!l)Tou~Ub%7yim)p! zVJLHr;J=oZNz|7^bdY@-Z+dBdAFk6Y^cWRbXCCjy8`tV)0@5a2`ALrqcol!=XXC9X z_V1uU{_*VuEY3ectSU68ncOko^8|L{reD$i z*_YPE+zaWokDssKWvdI&W{ZzoW#N)knax~VWX?1jT{N;GyER2yi}einIqdcuSjF$i(&O)bBh_ zWnsaLOE=rytgIJMU)pzLsRbs)9T=Nq7z95k6?QcRWYrLiGt0v*EZ>3&;NuZq8YFaE z&j~Htt(=UV5O5rCXH#2vEM6240-#{H6n_WzAF6f|DGlTbUoYg&M^%@}HBDO(xyXtx zqqP-?fMq)kN$O0JxYm|3;JpO3B}ro0{%CD-HZtiA1Yujsz?c!+nQ?y=;(@ukA4{y_ z@_N~3QEs4tq6Ll>2g$JuUyR}JeLS1|Ot9ulv3tfrEtEAV*cjMC6`0-UgVG(ygG~*q z7dSa%%u|5I#qJcf_tWJ^UD8*adax`d9xTIgc5?VbCS7APRg17CqA4WZXqy0Du|O+k zyI)oEUKA+ecE!befRcq8I(YGZkK98=CdDqQ)`jJ*9zFNNvE9AR#MOzoT0Yvaa5xaT z9GS@_SG`p)Mw$p*y3qH2bm>Cn=d~;C=w{G6*3|qovwJowiUsZ|zU)77TWGe1OP=TX zL1~@}v52V{g)+m!vr}UWON*ztMe?B_M(uz>Q{p{>jXXMueO&~8e{3CRymhnn9DtPI zB*WG>XYQ10Kt_)ILNbIzF5zF66d3?ftUlx(y#jyvH4u@0J)IYEueI|$F*3)ofyd{fIn0Y^@@cUH@8UZqp!vuOX z7$ArqxT5lqKsV!ZBJ2y6DS%CE35=0SJ5F0xE5dfRiY7kTRgU#kGZg^8I4(?53r+8V zfWqDWBq6te6_FlxW3c%6?i(iwInq724NI~;*D}&V!y276K$pV1@O8xCFkE!IWs(>I zWe-1dLi*lAudJ7|OaCu`zPe%tw~6Ou(mjba5mf}WFlY|VkC9KuGahi@Ua;6w0KVfU zW`drWW$I@ol}sY{&)nmrb)(^Nz=%hZb{Ex#$kcFUhLbF3C7K$1xn(>vWet~qL*jyn z>49C(rkLN~N0(UJ-hXF>KV4Ano}KP^fy)ga*!&5J+m+#EX-QQrN(w;sDeLTanL1f3 zp&TR=Y-{e|-Bee9Km69umNh*S)@aQXX5@>iO|_+_D=eyz6t}kzH-J3-m|#)o8|?3} zCV_HijJb={8&wvAD|T+=GiDFibfC^d2yUuBPs^xU;+gSsEseW2kcmDeuRM2_Y(Jwv z_i9P(gZY~5+o^pRO^ipn@0UZdOVU3Yt^U@kyWhum1jaK!QXF2=6Sn0Y_`Zf;j&S`CYT5 z+eB=;%9`As(Kv~*lIfr9IyQ4QG%U~HS#kQqj^Pte70KHdwBUy*;VOqQ>dC1<^tGkg z(-glZow1K5@w3%aMFQP9E*F_by>b zq>OEhSC*IL1RKUQ)hL&O+Sx1bXvzpbK3+}$Rtr{$0yaINIU^Lqo4-7H#Xsl}Cbb=3 z9nj38uKHT&nbNw6>iFr>ipSM%y%ZTD;QelVc?mZp9$`3p470Egv5?>rlW&P7WNZ6f zrcbS$BlXKzTtK;{&L6+StOm=TbCcwKF2!Fu$>x} zpl-F~L~t0N>bD>cdYBG38)EQ^S%r2!a=cmU*mNQoue!O2j|G+d3j@_F;0UBd_TX-0nZvl;84w0$ z-@2SHdKmlYD1T5iy)tlTI_Bh}&Ai${agrNW7Thea&kOF(&=pPk-M{UUMwFGR01prO z@YvgK@%Wecz=uUI9}%TQjPAbu3iHTFDw2}KK8AM_d+xM8p`|cpvK89;H*QNp)?hL9 zr9K}rm^OUi1=v;W(ELlW6X3oekCIHX;e2VpNmPU-%EsJmgyu^8FUK^@fi+#pK*!Ug z+igJB=xDw9n~nz9s?x4QmYSBV(zIigg5yfeo8})d9hhnyasvmh0q#WW! zYPv)fa4@Day2(_d-ou~=&H!uFw%dcw1)fESIuA~DHY9PNmWClSX<|}cM*A8R`4t6i z*$>ElhsL+r=Wb!D26<9NtKFzz#P~%1JfiDI%RR;?{0mV1+t)Y?oYaV}`F!^7f>JuR zik*a?VW+mtqsQy9Lhw0I?MOWIZS1XzfEKj0K0v`g7_4U9j5wBlTnv?U6Jb8DV;7Iju7FybY_QwP*)EROk!@zf zkN9uyfE3Tk^&c5GsnjoO*cBbG zfPK23aX?B+>Zac4#vAW}P@=#jDmI7?2jYuj)`2O;{8ou**RHlGsJ&!B3fQm-KN$}& zcQu>Rk6S`H-a&;FjBCf6pKYKK!sYBm*iZWvEz(E^5X?SQQ51}@7}~YOiyykef}&lS zkHxCRhK_m!1`$jRuFU8@@xAbW&sXG!-%wR%r^~bLq)V277@uvnplcC=ctb020?&f< z-F%g1+WRK~#LgdXRgBL58pA$%!WO0{m8QYq5E zw%HT->S7Z>6hCg=@y0!5;&eLuZWd@vQn0_)3(7bv+#xjTcNl5Dav%E_-K<;SL25e` zQJ^`TLWq%Z^@D%g{lGv?=KNO7S_h%=_M_7UV3-W=PkAy>mKDsN$Y zVnM0Kt^Bs*$(-26TP2&h~azH_X*^ zXHg)!g+%OFOoFgW^yG}~HXC!bA|iTUZ5N@F-)W-SihrlaM`e+_9x06s4=`}@n zOAX=u_fJB-g})Ya-?ENBqBpXy?mHYv>NdWcJwb6LPN=Ibd-&HYT8nk z6VT8*008tT$I2#^oI>nDC;I`p^a!P3vHQdAQE5&Qe03q>0{HP-Eq_wPXm4d<{~aBS zY)lxVXz87IPX9iC6JJR^TtP!L_>aohRc$WtfInkJg?vs?SN`le3?WOQ6#aLoi#~SX zk}8*X;@`KWY#tzd8SF1?YZ>h+wdy7)MCiRJSI2g@ox^w#f`EIIv>PT#j&dfsfogF{ zjU+pS*l>CO-mWbpb{%6znqUVh;4>-W0P|0l#4M4BDfH2c^x}6I{eHv^=;{TDcI+oz z$2!gh&=pOj!Vdgz;7`OGy32OLWxD~m0#f8|}>P5Xnhp%H+X6?k ze!Q9|E^Ia=9A&Vf95){RI5tbvdhd2~_}!1qQqn}zJ4TcR^slaCqFNh&w6twf6t(+u zMkCUPY)QM#s@)N9J33@q(&@SGfnTj_NK}u#Y?|3U$>oMoYl5j49J5!(xNKXOytw+I z&}RJnPe<65-NOJ|fwnf>4^NEImt^FCmC%J}%tVfqJOE-yL(YQIL!e2a0#7FEt4W-yaM9qdv)=Sca6Lc6>{3BlBfixS|L$xb_>m|DQ!K!l}+VCUP zq#u%i`5K@W6}G>fGn>MULqPk9|K)}Y|KI}|fFm#^UaJnpU9$`h+aKH~22{_yZv%h~ zDUo;VbaRCL=qs8ALq8quf;Yo#8ZiBkVUWopyyzyu6_;zL6D1VtCqEO3{`}wt=~)J& z`C`Al)L8%R?k{_dOnkkjp!f)QiW%clxr>>l>`c+WmTrKHVL?DNqHTdi9LxV|zQpolP^yv*gyy2L0 zE)VP*{owb@yGzMD1|okJh0gHX zf72^wV9>#a?)pWwQ!Cj(2KZe~`)4jpz^kNdQz~t*ViO=vIcqx7J1agtN>%_i`hv#0 zDKeQ(+M&tK1UnU55HHBjnL-_$6-KcfKl2=;0bW)W3l!EJ=c;@p)=)u{Nk7XKm7d0g z`igo*5u#?*DWXVyMQU{TOFwu83K~A=BY6C%AFsTE%%tf&t!}o%O*%;~qAP=D3>B_k z62c*9RB=G2NTLHFKQBjvL+)QTm0OXhUWSea#;4<*kW3zGN`Q~aP?@|jt99&+m!zHe zzaHCMooDQ1>SY5EI=J5C*N5Zi2L*Cl);j|CGU($;5AaB~%UCX&KFQ0r3)=k9!!p_` zllNt39eZE+9jL&EY31p`a&r1B^XnegBsZn-}jXKhde%4;lNf?SOF8ff=mglV~5Vsg^W@wFm z5M(mW3#w87yJfd2kJ6Q&ybOE7usr2a!yR0>g~VxdfO z(>Fw(3^Qx-4GyR^<{7Z8(rWC-0BIfZ)PP<|+m_f9$6#b>H-@~JACyd1OXLar_LcG! z-TY1aMt`vChv;Jb`ugJT`g0^b&xGL@qVHMCdk|q5xb0Gx2AZICw_6`P#ck*?OsUwJ z>a?V*Wl)6w@WavhaXs(wYT-;mBSZ?|2&jl9@M7G*6NX9kjG6EfPfcMU$bqk+nfoIN88x`AXVevm*lE$tr*MhsxOWve_*4 zJySfV{@~5uAj&}jNcF~V4sp;Sp%o6V+sO?n&Q(uWfp*x*-t@@pS};_mZO8xt)AF*Y za6OJpbh-u7j{f?|872)p`?yQTL+jWgqbW7cb3@${rYRKpGtj^%zhETrzt4jXC(-jc z-tj}Ih;R$@=H+Qix&ULCY?|ZoT-hdGvMH!}h9QC|$=6#`y*Wuu{GpxWgrdnFKn8=L zS^`w=4V?nQdqdOot*51Zmgi(!5a0*b&cXwdVuukESG2?FyJof|*Z^Nag(Z_w)4 zOskF3rY9M38N!YvqSWLq+mG*+O_7(Ht!+!?a!J5oMm6H)e^l;3&k6UJqgm#zbqd#5co`uRX-@+3l0TjBNVZoZS=ZXA-vOP;Q`&ZY46#In_5z&yJ6o0VK~tgA((qiRrt?c(m)fI;bkDU zOsK1~n@iizyl_OhemVO{d76vZ6UwBq4o#vh+mtUZD=yc6vbug;PzmJg0Z<(~vFQLz zr;7d=5K2Pgc1&_U9G$7;R?Trr!qvwllWLku(vY#N3v$q}p~x|t)D(pDzp6sXb;tr6 z`0o67_V6mgd-J3M%YS7LfW?X|;$n<1j!ms~F&Keu3%q~h3hBA=%63k@AbL2(C8Hd7 zJaX#5DM02H`_ZX2S;Qa~ewl0hO9k(D)H)$v`aYGN1D@UII@qXr7syj+C* zhWBSj6UkDN*+W*_x`3(d0Son>e9^E2QTm^*Ka!+H&FVmeeaRWck@fORp^@2JKVmR^ zbIxK5UI2<@`ag&3K7c>X+_=0)p?jWUXVvSEpwJ#OYLIU>?rvlZwK(v zlJ{0Q5&d&`em8GRl)Q|F)(=Ya-OajRS@5KM_;O=b6;M0-RvSHX>hR}>QIOo?a#75| zxgRqIEo1gY&0!&;{AgRo8M4T)0guhxtY?{$HYvfCUpaYPOK@ zOp|?AW877L^w7@i4M;|FA@A3yPAhtGQ@z|0U!$(6hA{Hvy*uXhaF#hRtl^EnWatk~ zZF{v{8JIjPj0I2;c6D%yu?{@rKOOEDlr2;Eh5azeZL(!Vhar|b74*-QF4E^BzF@u8v_@?TQrvVt4xI%`lPbcj|uo+j?J zGB5++5LUo{0z&YHlU{!$&AlI1qq*Cno71s}Qi$(6z5WhEIm}DK!-Q)qkRqUvsrlrU zZ^R$1t2k*?w3~D)-uC#uNP~l9&U50b0Hn1N_J@xubd-;77-28kQZTimp$H*8Q=p34 zrGutFoI#C_GB%&x3$93uH+>&(-J?|&W-(j63|l6-oxx1QCJcHo7=81w8d?e7K;q|u@Bup?M??G&y*=Hs<=sNo=|Hc&! zabN`&<7~W&M~l~~IlFItjschh%%vFl3p?^wpc>BUPi3#rmK1>^Tc-O1^J#4SssHe= z0IFxz&mpdbmYEg=7`|+IpEUMACs3Wq(zR|$i<=0_`Q5;nI&PL3Ip=?L28QUm09~2% zj`mU1KICZEf$f*=IC976IbL+x%;{SW`)&Z)^kl@dXI3 zfG}sq%WzzVbCN>$qomkT3xG+GLYY$r(BLs+D-#qQ8YFcPtFvtnLHh!@DjFpGjxKkH z8xyrEO}s0zigr&v#gQdwrxxIp$%VarBv9a-4b|-W*N34D?MqnLH5k*ByL&>1T>A5i zyK87;S*a@xAO3jQFcQ1_A*t=z?trmmDlnPhx;&C=6gR5ZgB^BeyH;E6aJ@;b7eR5@ zPD-mAsdvL)*`(`_{zaDbgP>-0za?if9^I?tUK(8$<_pbzu2kP%VZhy8#A<}n=S%#+ z0D$OTO0bsbLrT(*of^j$lkw#<*%g=(S_!2f*6h1b(HNp@RW-Y<7JBYObcnYw+BYw)7%8(paI$S zz3k-h&v;qkBVj-**yUxLj`r3|OxR(A9Rt;Bhk3ze1BKucL{wCQQ?19;=`D2COmzs~ zx}*x0+{=P)(NLzN+QYmE|7cEJ{$tGF+s|X59{C;MY-*LK>}~jf%rSTVK;IMbS>ubt zWC4TshLPU<9l*fF$PPi;h8R#!F;jY7;Bsp?Om09T4J#dIt`3F!IyMfEp zn6~#r*J-`YN7Y(5&BXj|Dq2;v;PSIv;{Df@)yRJCa*UFtv6;9BL;xIYUnNSkWTwB+ zsy-a<-&w$#HT8*O39{`oYXiWevV%4%QZ|^HC@#wahrA58!r@z;$xcomn`#`I%EtMc zQ>GH;L65})aqJSvgll4GG-Jz{X&AuDnd4{2P0ZuGBxG15v&aJfH^V~KK-C5Ct0OTC zHMKSeF`U~E<6X&=tvjg7TGE?oypIi96p^?u1iH1u;sv zk~RbYPky_NjUs-%RZu8mkxV_etrqU_MOqabxi6oR&Z za3}jYU>~Ad^V#%F7A}Bx1BmwbP__CURS@^hpi}*msCJo){BwBHVRd|vv<9vk7!o0c zS2Kyl^qW>H~}>2Gsy2sZf1N{<=*EWW0pM zi3sqx-Qzl$0@R<`OcU)f8aj+l`w#GUl%rQM!fP|_0Us|-Bg@amQ+MhKSy7{G7X?|@ zuUBe`$q9jMRd!?ujZjl=p=TM6e!8|e%3F}*|Mgo_MpLL(X)tzDWMMFO<`w(MAePbG z@xynth^?XinA+t?$o$q+hg;Y@^!QW7m;FO}{N6R)CI*)|tj~Z9OW}SCk|;33O>~vb zJdOeFy*5Wto3?@>tvLj7$MFHFVn;wpzdf*R`ap#8uQzQBF^qXwu!{}#u(UFUPLnF8!di z<1qS&Uw3||Gg9dSzH5sOt?FeO|G?evLs=9&!W|3vnN9bUlkO_jcmx4vD;@J)(L#J9 zyTkSV?mBE{)ZBxKqI~{T;kJnC{mz$<6Nfxm^}fX$35WYd&2|CWLc#H1d?j0CZ@+jsdhfO5 zz@z^hKRj5p7yxc$Y9QXLV~Q7sQ@(=;qn|1_mx|$uhZS7*9Qwl7%>RM48!m+7Yu8d4 z4nNYCSY-P4_#NTyKBLEiIfNE#lMOtM4HT+Gv}f7aq9dp#kley;AB!f5Rpvq<7Pi#6 z{OD$LDJ*=@dJ9wnP+bt;S4zpyPp6Lh3_m_*7(kWn0jo7)QKQ|;C8?Xqi>gqDvfXvU zh07~_2uxOXHnPUTUJ^78#$$b`*BPk!gEO_#v8B`S{Wa=ofML`OBj7Mz5q}SNRg$E?Ud>~@^7hssqEGMh<1qm zh#u4=NsM_v`~`qRa@27?+HY=cHc)(#x}dt@fSUi^CZhPgcthQ~<97k=05kduCf`|i z^_k%Z$Mj-QTTWYLgVnT;qjzIYhdYU9;Dmp;y!ecA9u|-TFiyn=pB&&|JFwC??RN6g z&)%SHyy%t|r<*zBmxE_8oZADYOnUP81Xga**ByO!4yC-u4TR}O<|vb+A_?w9i_+ya z>jOOe-NOfPo5Em@C}&hUTfc2fJmVkR`(fvKD}+aY^8p~$O@f>35DQ}(v_Y4lyhYO< z*_(IR5@45~P(fSKws%?Yb}Ja7+acWH!!)uw6l<|<#h8CPLz$U{5CuT^iV{L}{<#Wu z1=o*g083)BYI1t50%n|LD6%MVYuFvS2PQ2r_NUnk!sAJ~%;+CXs*`!y;Gl@~g_jyd z$%asGMj&9naWqE4xFe)eiZ_`Y)n;Ub==e2YWf;XWI0x(nFGzlY!w1XbsfDxSWM(~V zuv_jwseGO(97T!k*Be-!f$UB%SyR24+lO#w4-=&a%#9m#tgsHf9p;GoDf%AxVMT!r zU-;fdJD4Nh4)v4U<1wP2$PHK|?D7hui5UtdAM!4hKC;=eUEy{SEi+bRx0Ty`%DKrk zc1>^{nlG4Q*CAT181dB|QED_UNQdCZ*jA24O8RI-Nvu*}4Qgp*qe>bj(kOsM`gHjY zOstoKxu`_JRI~frzwO%utqAmmIx~hMXKh0JSWbYKB@In-l4fNmzrBCZwXn~ea`#E@ zwjC`N3UhwxDxbp zaCydgCX28DTmp*jvG7+oDA87qTh{F|sNGPMjpARYQnHcS?MXK=pMvpR5CYY!5OWf8 zk>Whf3ID`$K^|^<%|;l%0w$;(Wg04vnkEScCilohl_v|SS*26hk^&qEH!eSZ%DAfz zNcs`i(9{B0i_rwG5EY9BED>%NrC`xUx`#8)*{=)<_z)U?6j(G&s1d#X{Fl=1I-8uz z;&j+9y3_oiJ+0r0HT(fj+uRUWEQ|TNBbIIpgdMj@zM#3nKP`9Ke0GH=FP@JY2Zsm% zyITa|;TcKZ;ivSovr8eYFPtRR_(V>M9d+@Kon^T4=2xywD6SMmiPSa>1+Paf{p2uw zySqGjF}`vw)+iW^@kY}Pm0ml2<)LsqW3TAgL&;GwXnX|GaQZqH>P(m(!;c4PKPG&n zFy7EC;h4%x%0QaLO9I8~)_U6~>3Bj*7&vIIX}UQsr^_+NUHa(^YsYDN>Q&p-hP;;Y zuik1nY>AJrOabOnyafbjj)rdouvboqms`UOP0IIB`%QtZg@%B??V~v3uEuZ(CAAw; z>m(e4r(n7uU4yL4$xDcSV!w8%9mWw=7X@$yJVe;N?&6EBFr2m;2)#0KURM#%|5Chy zN)oW+Du|CaQ0%6nIMT_>t4r&}fsTIXhpyV)9L`pQBWOY}1OGiHXef*QY~c)>jPnOC z34d4z&Fm2PvtBTE+& zM%fi5P??!s_A;24?t5`g%iU_X8~Q~`S7F%*)Gk-vDmd==A^Iwvdlw0*DFE1#q@DxB zwZY?_cfT83v}nc^I~xyYV8MZ@m*nCT2Vm- zw^)!B=>75>+_3WJnrt{Fnc8!a_=RcKJA3)QuHYVL?BtD2#@8C_BwG4i0PInEH>+1v zneQNM4sTBQP~8tN)etAG5v14vzS&jI$iN*F_I?HE%de|Dwi0(vpdG0ZzEE=sfMc!a zzzppH=@7c`g5EnBO5R~<=*rR4uAWz)9fndlL^=0^a`em|>74UV*W*|4n2wlD3)oTd z++q8}YD2+>Tu^2qMD%5-+964E*I*%)%LaOUF4WPaO>-aOG}uQ<4SPNU40wo+N-ThQ z9#3BK*Z1S5OxFVI7LeEDpwy8<-UB)Q+@r0f4trn~groVrM`!Nx@S*yQ2j-+@M}P z#~n6`V+e1c$SG+sp*;~2dfE(rFNBPr{%)w>^bY`e-@t*)*}={-eRaf}{(N!u5f62= z9q=GGEyzjChp`SAHkBQP_@>*-;Wj(``tHyZyasbbTL7~8 z+$sn5gcVAMFOoJHKbb7T0*XNq!`V8!we{CxunmHD=!I$5zJ#C6^;;QBwvxHDfGL4` zbT3E95k{eD3%$oOZ0x6s!cI`*`!<$;Q;{f|6Fm;Mo%LkaN?<}yU6~zmKdKu=-#fZw z#%>+(!)~@vQE9}MU{YJOT?-?^V<&y8`LO}%YgAJ;(r6vW4Xj_}zq+u3L`6`|x^>UK z&^~?~7V(yPRRBF&Ou4AeH^2C1A&G$Kh~+4wD7os2dch?zcH0L*Lzq5^duKF^P^Wji z!Q}@p4kxxyNRQ=x^W8j{N8>{_T;0uTvBb~`?~ok8bo|q;BCdc@lEOpr=ha-DwZVjV z!$69dvh-)B*cImIqs~Sz3E&q6Mm3?F!mV*+RyK=tIJKb-gdcPX-|(W{#6+f7kq3_8 zC`g`bf$2_$;QMp^tKIZOGLtxaqsKJRwoKW($eb{koWt7(12n#u%waP~$0v1EI1^Q- zQ{9uNjZi_;!}!4+eDotQle8FVE2V+CkG3@(!V9jpr<@Pci?pFESnJt;E^e=ll#p`) zFZW=^@EeN_Zaz5llb2WmR`Q80G5sYPv=Sm-Q|4*BR-*BqJf?!bh%D)>ebdn)_T{hi zvi@cIJ1Soxw7t0gR^Fa{Rdjvw5DF3K(Hj_y|BVy-?eD$cSP?^H{&~fhcw(whJ@C5p z{e*CSJ6oLHU7l}L>^ptV4$?n5xy?prbMKp(@Vf2cXyNV)L%kOJQ$BkTF2hDr&p;Eu z`+WZS5*n8LHz0`JHuQp-nG5m8{MyNHK>9#by5$*Pu2GAm%BIg~u+d2Z`pNyr^mp3r z8pIU9ezFdBWMSJ0lswGA zx|;qhuMLcdbnf)cKzf$T3fIJKjo&6utDwuKyqybu+&<5zztcdYw4$qoIws4I63Q}L z4a%Cqbt)jPclt@CG}V?ewY~jZ(d=nnLyAIOUUxb_Z99wRW)EXc==4eG_~RdR6WL-O zLxG?F28`w~vxqpM-VEOHp((G4QK|{9|2lGAlZWjZ5-QvWzwpoV5YYc+I_tz*8rU9) zTw3xr+;iD;n#G20u7uemUPqwHEW4f$+i-u)6h}a-hhjS;$96;VXz~!s{-C5pH@yI8w z`j+h5AD6Gs-e2;KtW5Ss8?eQj?T(zREtH_s1k1D@`L8WEeN7_=`?Y7k04uRW_3SyP zD*r|3nE}ZYEf{BkC}aLRDxELG^|Ohqyte^Pp8YftgIIu$5EOl+9QX8Nw$S9W)S(De zXt=PR#cFTixooNxJZJ$Z6IOqEi0BL0V2IQ+*P3tgO2E6}k|7hD)t+Y`OQi&1SjvIn zT)}JtzQ6Y}T(PhWS{N=|eGIs1-|Sy~JJ`CR7nsk^-kX~K_3i8F*`OQ}cM}*7)*vv3 zU?)u9dbJ_lN6z8>#U0IN-=ATK|N6|f*oT{5?C*- z5;|J}5TEUmSDD?P(b)v_$$=%H3+w-9@7?3;I;uneBTJSQM~NIz5)({Nf}n8?d`+FxiKki z3F!mc6dGttLrqEuC74I+`(0~h_MZKc4Zq*-zu)#p$1`izUVENv)~s2x1`QB$+|jwo z(!`9Mt&C+BAz+)%OlF*n6=#mfFo|(hjtQZsW3EK2as_IcgvVsWUhX^Ols+tJY9CsK zja%=SK)>!+95}5^v;~weg&hNJBctv4;qF+c0tXxXZmdt;z@~cC1y?k~f(O6h8g1}8 z`(#s2D=8@nf!Wc~y{)rvpk>EE@4(F7 zYl}1D+h0nSm!aRC$CSuP*_;!NR|(g6!g@rN-Pt#`Pn5UgX)-ihP`E=XY-2}gpmb#4 znvXlG!a6X%N-Co=S#Zg+h1R9S8Ebc`KWZX~1 zsI+x**&^Cf85zOlyJ-U)_k~ClTpmVC59^&*iI(P?QWQu5=NUx4PSh4cP@xsQzwHJI zj@-|-=pYhmej7a7`F265j5J**eqB3zWC)^xD_Lh330A|#YzK?Rf?Rxr=U%h(93|A% z+t(ppcw4MR&D>G;Ut=G`PY9Q8a!dfWg(j>YyTsYve zJ~GUst1Z#LF|*=xM!d%w^{v^2jC~I8t_2o?98|>FwiGL_aA8HBXE`Zu6Kw4mz8$GV z?qulEi;hM*?nRmqiHId$>{B=b=oQh$L#wYof55kq`~_* zrPJGk#k0z18`p2#xOK}m)?-m5EZt-sNoBHt+aL=E(H*#Tn;x|2q^w zyh5vDEUpRdZ(&`@BAy9W+maj8)GRxipMLJW>10QzWoLc}*F1g72XwU?DcS)1O%G~| zb7aPy>`26mHh@Nj69!mWAWcr;=~dOo(a*8O;KCai;ajJMj~nSMK?Y{o-YH(NS#xbN z^2MgOe1Y?*&Ngm6WtbyYZf&9~TRo4QM2%*>J1@p3?W_+DPaY8AKBh88cIxfxEO1Gs zjG;jqR#yBnn9PDJWh7x5(ZS6nTtNy$J8IW2vCnd;A@|SFm0}1DrKMh=VzbN5jbpRPQk=++p2@kxXlgz3m}wQpd|^E3VC0eoV{V#>RRs zni(!g>+fo#4MlTgOiGf~HHbR1ho!$=CEgh}3S5jbSv)1-!Llv8MHG)I-QTaVfsgfng_?3I^xo z=q?GIF5CpRu>)Adlg;6F;}AObE!pM5v4wtY2f9djc}&T~GG-fhraG|j=i!&BG_ z$3@J793exHQ97Pvo9GFj1xGEStCWby1Dg&Y{(;{ouV;>wG;ND-|A{D-{!~_q)LY~G)h_ymzyO~2|;75BL zF5ox^$ZnQgn`(R~C8SGm@Q0Phe$I+&!-afXM{L3X32hc0J^NaE58_>L`1p~1Gcny5 zINYVn!UxGHYS$PUP8`_6Vfr?sK<^mX(cdv-_9UY9fdx%l9|nD>b&ux*W1kpKXIG(z zH3YWuti;;wIlCB6Z+{1N2&^TY^LH#y6V=3Ovkz`RfRu17t4nmW;Tz}1G#)bJgd^pc7rOd^@_IR@gnM3|eLjB4A(Zjzmi z0aS0a+on8*^6G8Q%mwi-fwQ?@acm{a8)xRi+^-iNM+?!3wi^vRJE3|5GS^wmO>sAC z6bV;m{XOj*XXB$Xn~Ab9(R;euSx~`3TBhcPy`kdGQaHtwO)-u@wG{exFmOxUDoY;2MK#P19 z&mOqaRY~&Tq@D?hRtC4T7W(m3CM!Z2?#Trf`yfUDdv6xpVwV@AMxP((Xzf7r-QO4J2NIOJ8FZZ(!W7Uo zpxlrJL3$VBdKokYw4TVyXc5ibfzfX=d|?gFQ6F`N6weihXt+Gy zh(9in<~Riu0}{5Ziwad9wvWgxU4>bIZiA7s5&C*X5D*=)F(#K zSSzs|@03)wOK9JSV#-D&emsm0Je?c&W6B2e=l+A4BV*E;lS1S`3qDBMj>h)JY3+?6 zVYJo}xRGh`O>GtbTj}26^RCQL^ zAQsK(m`EuHxa_pIpTqGxhC7CWPwHNridHG#?(RdohzoqX2Z5}R5G6QAfkh==DXnGF z7Q=C)MaDT?2aYcWoKT#y{J{>M6Wsmm=-_RHjZDN|Gon}_#EZ)XXC1Qr99cZaCkve6 zW6%#zkTr(vpW-?gT~7+y0GB9nQz-}9*ftYygRV6~1DpYD8S$qzfTL`qh=)ZCCq)gp zoF4bJqJT5{3z?~m`%?lsQ|bPwETkfBGuYGLhwmR>mKSL;hSblrj5x~xLP6n-TjRrw zBPy^6xwMEpgsRuH`GaFw+yuosIifU;*H8gZ0{GF`rk{mBn59tytFzOH4QL>;=8r;e zz7Lf}K{$Z8>yb$}(YiQ6gyFN&kj|{DniTniOK%1_+r_9rxSdO1i(%!6Efl92w*^bX zKI{r(m0B3==qaFAl{~3|QF52S>U)hDJLF zhhWaJ@(C6Pm&KARw09J(I9+0MtaE~ki=cKffUw3UGrES`8k^t+k3%yozu<^S^!H62 z-MS??Rzd4+!=D;1fCi+jIAyeVM8=B2+}DMLzbciq0g|i^THH;*ne(pDG%F#WgEY|5 z){XQTZULksb$2qCvPczUF~&5vVbe@;doidD_VgfXVWNk(|NA=Ro*KDUDVqDX*4Ca5 z?9-Im*fi&>xSK}r#*8C!b95_4I?h--h1>ovcEMsT zI*`($?OfPPC)w6A#Oc`5toZBMSDK45^ud<)4ovYeL{jsV4&&4zsv-afeI;JI%yvFQ zfa476K{CFQ0#nR+dhtpp6)a=U$acvJ=16-xdrsJrsD@`L;S;JjI&2fqxGZyq)6Jal zpwP+X#&RmiEU}&V6KyiQlw;n+k$B;|=w3y7>!gWkTJ_+vEio=SIDS8f!j=+6eMiO! z4-U4q4~ky`BZHcmh29X~%pGiD3B}eH7M#{}vVcAL)UjAQqiw+D0Hv{;a^u`ReIzc| zLaPg##9mb5?zWo_-9(CVOwc&x(Sah&&M3+>h7;_94NP3i;n>LXrL?WBLA=j#h70$9 zw&grK$i%V%U+1U@@ZupGsO|l}#c3LDduu-5Dt0^I`rG?yxE*Ny1`zN97kH}VjF+2D z9K3h2lVfXfKRfVD%+Xn%Tq3_=S1`~br}WJc$=R9shMk~sE=UB%K+2mCyMQ}lO~<}B zMxwHB$ruo~>oaQDnj8b&1v(b@f~iI{9PshnajhOkIV`D-xv@Y%gQC zH!MrNP=gY$6K*!_#H_xJrI6fvld9=NJC6{G@(|CE&M}XyF=>eui3RKdgmN)hb>f>! zW^pzG=jz3jsY7n?8Rhik=*W;LQKAE>hyAI7-1?~Nz3gJJEy~$;%++1bH#0}Pv|OFc zJc;d}lP2u7Hl9c{$cD_|HjW6RaWtEz2Pem5uP$E0+pvnnp0Bf|Z{~sF5(7=N*zrQr zlls}#?O}AQPl66}gJZOi*vYa<#o>*RMJ8-eFfC`GwQj>+#_-6c1T2s-_Qkb9cT0Zq zz~tDpF+)gXZUEI2qt{!7C6?8YLW$kqCYta-+nX{IF<`h2Q1p6M#DELlIRS>0ipJ)nYWytW6p2BfVGM&F^w zO;o;-8bXQ0ZzPYb)5KV)6V*>tPa4Hy=U|YX!4|G++1hke%_caH(G(|!ASx!I!8*wv zwTganFyGH?DPBamlwNMu6T7bIsLqUY7Hy~m`wOk2tLeirpxoC;wHEIW%Hg!IsdMlj-*eezDFDaz|%- zTRRiqBsXt!!=YK-fS54A0=Khc8#)IygJg)CT?sZIRO=aKyC8RCj3L)Ki}odJmI1AY zO&W1OC(F!nJspb!B=ksrU2{$~kC9jxLt%gMs5t~OO4}u{I=Z;ZK}%^}$e= z&60tUQMJsDcT2W9@q32tlk>-%vb)IDgmBModGyn99eZ5Q4l0K$IAVjw5}6RwKsT+$ zKP>l*izsXxrfqOwWN1*8aUO$*+&0bta%pJ`J3g(f>-#!JMvMY2h6d+hcV7Hm46FaK zf*7;K+K-bV1%$HBmVUI|7-^?%NAXE65#qFeZ_p&h8ZSnxi-V17QXvCXHy8Jt(>7?J z<7MsYMUN<^E4KM``x3pFXcUsj{ai@i&)1!@XOjqDG0}@1QK~P`>I5Iq`H}qSa7UY- z(20M#8~4aurKF%emTepY~ zJ#O*?8jip4Oa-GaO`FpvDRUQSz39jK5S?++rq{kXFCEd^?BQlXxp!B2XE0MIM zy5;e#?^jI4!DtE39XBAG-B%HHAay0Z*6^TV(hFNU#a>MGABo~dRWCd z9nF~f-bgeEMj`7mo_oR#?tG-HPvEk-{& z$1V`Pb)4NGh|DJa9qshhHVzqxt`ifDHc>Q04LS>QnRs57mx0R^(f`IJXwcXN!+9Hq zGR~4Fx=)!qz?KgN-Eeb%e=V-R<-2S?NMDWIUC!JbD+Y%7?Kq$43;JoQXejpw!S(UHs!B=Y z&X_)ysOQ0s{6L|X4bNT{6UWjImErn@y#nSu(L#&y&yw0iu)EM^_Hr4J!Cq3IC~jpi zQ4%g^B(Bkn5kEMHyYhC;1-g10F)F@^_E{jF!aIwWRU*`BUQyR`Lgk2v|*X5!F zh^}K<{c~Rkr#}#h8J%$*3hEbuUe>a0!=`N<8|>!_V5sEtx_sLwA-{8N*o29wSTKn6 zpU*!aKOWNPj*-sIBQxE_BZqS~JcXKVthgaJIyy>6-DkJdIrm`iFp-3V;AbYN>}+Qi zL7q80fr4^ZyI55sJ?@(l*J_f0h}Wvqh0IywDxpnUxFv3qhcQTq!lSu?PM8^8e9g=T z_|A**0K?v5?G(?b4q=Aa6!(-JZxgW;xhDmQ@z!AvUE9~XCb`CEYFr0m3P?+TtQe#e z?X}QzDa5-D&+HpJ+{2z~KaR_ewaXEa8CO5CL<)DGBN}~e$23*w(s~BTn8oX1qiwo4 z0-G2t6>*Jb!M&Kux2mChN|ySti}Z^YDyq^7(1!s#i`DkxL>eg)CuhU#m`s>KpN{;IixB8QpW3^OyrO9Y>B9kB^KUa4(rXJD)rY zF5~HXVhL!pSIQKlR#cO&22+|(`i<#9W=Ti+MFZ8cKK3|x)8ynG`#0~~w0ZMn)1905 z3l~v*;G6H*G`@Lk{rKdj4I8%v@cm62o9@_j=Utn(jO`nr*dM~TZ1A5DKDNn!Lij!( zyvc)a@t&~|J{c)N2;ZLyzhnKzJNyKP4}5bvyeR{IN94mHow4za9-$CExp~WYm=MDE zZ`$B}A%JffpBSIGbCY``giq`@k0BPq)5|-)KK|Wcv6mYSf?^Sn8x6fN5O!W5>8jCn zK5^sxCa2R%IQGpLYAXu6lnKYAgm=4!DYk$5%s+L85?*R(Dc27Aw}Hv_bo`qdZ##(R z1cRgT_L=c$OgAMwkZ>*&B}>s)9KfL1{Y_I{lQNi*BXXnOaRrUo)u@EsA!))^4QM37 z+$iGhzNra#x{_cQp-p$P%|1eI6o3wACXmPugGK|Ti^j+?Y!{up_kue*st9(^Xo84N zHs0&FG;{h%moY$2ml}W&6Y`i*+cjxU<%WEzIMa4`W^NLOW+3T(L1YY*(yu3NwSs3& zZwS-k{X|pfOG9YAv;loUCq;?GwE=xd&tMe8eA|sU1)Ia`btu=qB%EdMrg=u^*lpmxx~kY9s_1!UorNJ=;*- z9FvH^QR)>-a~@b%QPFamUeq@;b6?43z(90b^uh4~C`Ia;EcQbx_GJW(KqdyUMU`W7VcxP^MS&J|0 zzMSPwkGRl9c2waO%PEFFmUlVCHqYE5HwxRM{j@g)D=c8%lz`RZY=FZH5)FErI~#6T zg30^+vJBJAn~>)Im@Jp!2DYZ#nV-gCxG`{0#|rP6V}ZiVtr7Y~+Pfh*e3!||o_fwt zz&2<_7dK4Q0}L?*-A}DVKw3d*Ff)s$rI;x-ErsKV2F#rkjzO7vl5b8-w8=G54nre- zSbjJFZDXo702C*p0NWHkNylyTho{Dvz|41g;Cv=Dfaozig)50^=4lIx^eqF!-0uDu znlclU8cC65zQ4XRWaCgLMTDt_1$%2clSDNQvkGVZ{@~;YC)mw4j7dYtVAdRKL+7AO zN^)ai^sXKTt#DV{qBfz2)h(lw;|oE}+7#vmrp6KW=50NN@HR1dzf8);NS+|3FHKHl zzc$I7ad=r|z3Q09MAT_X@~UMIxVZ&H-NSv}IxH zLGEr5Cg@78u8XnE7)rp9BI2;^;yh}?t?`ux>_#_1EGkjCVOadHJ66>y=4?R(n+rzZ z98-j8m9`Cc48WE`c~c2lsLbf`_{dBE>CjC`i!nAmGcBr?BGV^1i?Qr5D)SP{(GaCg zp=x0nZy4Eui zmb8Nbc23RCsr{QF9s@E1`0$?T`0Gp}5m3+ckeE#cFVT@FT*E_~=yVuI%`38|NK*C% zAmW`*Czue_2gwrW;p~j4`e7rNX*qZ)Pzox5!C)s@W$%WN>4LV@>bBF$AGVH6dSoUR zRi+R$Nk#)40ck!xMPi8T#O@GcrrT6xGpqXFqD?2v#nCD|s8Tf~HF6NPHxcG!R@Nvz z`1u%~d}lyq)=)Leba~edxZy4w(HRdj1{LofftWKQVtN3Ux{5^lONWb7V$u~rVJm(( zsC6~N2vdrd5%H}I6bp`Kz?D4?g|p2n?+w0Sb*);=qsKj2I1UL!HMW9}OSJ_gBoa$C zCN|Np7qBP|-jPW7j?P8YNW9_|o>G<&emvuqSV8p#88NBo9G+IkUtxqOT(o5QgrP)5V~dw-5I3!aHn!0waN-XILPt6ANM2T`W-Mr=YSeOyomy zsF|~%AyiS*w_F?~=!5|jQ?}@f z>Es+V5a9v>uER#DMDr=17fAB+gMM|nyn9j&s~_HreM6@+BeDf@UdlpW3!kd9i=@cx zjm53a|KSK{x4@Jw$?OzWpV?$t3;R=v0pm~3mvq`CuA?PP)+pmKfOM#%qaYfHrt-4W zph&TZ4nANPJrda-OJt?z6b2SOtisFetO~v;Iz5Ky#lyBWBBaTx2^%$#H#&Jw`h*Xs z-u+jS$Oht}nYV?Gdl9}e!~rKeNjNBCP6BF2h-wvs6}B5C3Jux0fGx=gYGN)@L{ZK$ z5652j_6MXIp~$gNotq*g9WZ=bJ|gH^810+U(GUdI^cu!u(uU=pjWLzu3`1cO z^lFz~3E@No`(!O(zTzM<7R;)X@f^?W+gJ@7P_pR(F3Ve?TeC@1`@UHL!quHs7VQ=2wV!b z$_ztBW*1LT69k4=kVe>j#9KTomKC=ooPlD&VRuyAL>D*Es1zcwp7!XQDhE^3lVheO z1xIZtg4_o4h9pI%3CW~NQmWRRNGy<0wl<}L>|it^j)fk82=#ZbKl$Sz+c6p_gRi1-@v3JVAqH3E<$YDOf;^C=iKiP{ z@h!9L_FBJtY|gJxqF#oH1vwym5CuH1&YJA`fQ{N3KBOsth-?!^R0fMhMWhNqG8}`5 zCua$96AeFR;^C)!xlHhFJbb|d!Z(a6DOxBG7QX2L!?%aIkT}SzM50NZcn6Op3&2Bh zicQJtj-&Ww6e+~3T@My!!~+^qxSSm+gtMqd!)a8b!91$5U?RoH9DR@fs>J#n&J1qtleD;_`^k<&3U8Y;^hoseJc8`WR1%fR%h$CC%*;mth1m2Y7{1Cz z;%2YJpWj1hoOOgLu`%k@LTs_)$R-$kVN{Ptm~73djiDb7rsSSE?^Ox!`htsH) zD@V@0>-l2)@l`wbR}UV*e!PVS+@ql3TH?^yAUDMJ*G>01!nn%nsospkg4Z zua3c_c0G`sU=1@fG^z1nD#wcTl3@$oHFh}6W(*}*KMVdaN9BW0gl{1gxSeW~3cw%K zA~x8#VK7-Hx-cf2q$jhz*-^lvv>h&Sl08a${Jy@aeY3bSGv8)xvI80n>%KW(3DZ9& zJ64Klg0k$gqs#}OHSv&I={Wc4`9=>IpiCZ7-#Vsbu*vo*+^vq8+=S7fbpQo3D`8{= zLv-?ppSj5+u=6mllSe|qmzVHaVD{=H9PTXyF)weZ`^?}Vk^3Qnb*_o}FV9Sr{6!$* zEAcR^8V#l(lWLBfn*58gINvoLNtX)F2Aoz6lzuuX473IEax7sO0bR*O;o-*L0K0E8 z%ZhP4+eAlM)tgT463i}zrD1TzxGw=LM8I8&Pk`Q zaA=Xr5sFy!9h?cWBa`BoE%J#-)ydleNWL4XFhNU0Vc|60<`#(V ztHCaG0EpH#S|VRJBCXrbRH*F7&ZTngq^Hdxg?`}a%>hs}!oK#tWCvyt#GU`m9h$qCL$SIMW5Rd011o;IA8p$8=P)Zp+gKbKLcXXEWlmpr)M6R3lmfy6stbp05DvEN1(GPx};&8fk`sa?&PKe2R(L8YiW6xU^IEJ!cGxS#uz7V-o~0RV^TZO48TFQ^UA_9tXg=4hR-4$kAI8qF@Ak7=`E!zk* zS{;RssKlVCR`jsp5pfRU)s?E6`nY_2)>=g>Uc%5*p((_N+oPq|9o9(yFm{BAFUVvT zebwzZ>8FS=wT0Cp@rW>_Sk|&mG@c=<1#;9agmJPw`mtGNew|e#uf~rGyZ$RDldZ9a zes@;3SW{m2!J^+i7Up1<$-3Qn;qky`!y&cdW=&d3xo1^$HB+BG7H8H7CU?nHH{C6f z9?W@{!SN@)%b>tusUdrY1Obd;KP}55F;%heD2&dE_`r^Npf0h<;pRsGh!j-c#*MIFc!e2qfeEL5 zd)zyCQAj&2Z!(pZ;&rZ>quMzPu8l-(S&^pipPDJnr7RM(?t>~p{t9WC#aN&{Gf_`{ zCOyGT_!73_rUu=JlZfr+67*&ViRzWLJ_!YQbWGeQrVx*!#uH>&lSRn_h>(?dlq`@4 zS>kDAMZavtH&cQrAW)8yC}F4bbcTjg$n19IY$d@kpDGx7xzczf4+q5LpV1JE6C5K5 zNEU$FA&eTpLS?LbQg8ygQF{zvQ49*1ptoBX|4qsfY~}%iR7f0&R3ysa?2y41B=-&o z$@4-6O*@{$L)u1x?uoS4{yUOxS+91`X#a+yQm`0i^^lGts;|NfJ2EtnbunRzrv#Ru zE%Tkv{M|P_csM3qVtP&vj~yH6vie4mU|g#yJXloAK@#vJ9_RrqEYN>@al>W3Ce*hD zQ`u!a0TyT8Q05xR0ZIBwGDVb^i44;(=)>usH-jiMEi)lC%ZhD#gcgp)x1o^CX^_MK z@O^$n3JOw2L0!sHZ|kcJ=WqaPrW{x{^ZlibZ7P?{KHO5N3|-Zt`o#@iB{A`?sR;5d z2gK}KV!UjHeX~IqsM<^v(aK`7H8dXDIiu-EaTLgW8jbFfayWToU?>-emI96Geig*H z<_2?i{`6}K@|3j_x5bH2>ImBK$fo>U}P1hpyWzNz;yPgZwR=7g?mdo z3ki3DgB+Q0lrY+{FPP&+))2?S%!?D>Y%r3G^} z$Jo(1+*Zg|hNXCL@`xV79-EcPx?}|c_W};#9DLWo;+zr4T;kE=`i4g+5FiXnAS;B? zcvc0)%pZZ25F!UEmJp;9Q3`52Cqj1@O1$y0S+hPjBw(3xC>BdgwcZG>*6Aru9*KP| zL`^2N$&uIiCxx8{@OW*Js72S8@^d@nwk)sWNH(?Li4#GNL-Vd=PN0_xoHBmK?6fy7 ztsIr040UY6Omzs6c-!>ML4C@vzEpY3P$DV*eyRi(U=IwA=nb#&YUHid4gp-P9#Zg4 zhfYb*{KtBW68EZJ_}O85h}L8d2pl*D%WNR{fyr;Gz-B2XrM+lE;G{^HjJ6hJHTO$U zCEaulX*^jAc%@3Du_FhEi((kVa{6BK^Fhr8Ju_B~ir|T$Cf5!c?+Oukd~5`XZdDwm z#h%!K;=wG6UTPNI=upohgjG~zde&BOS<4)P4uNKJryPRZmnJ<^JP%5h=AHMWXoHkw z-!hLV6JyYPMU!N)?Y*I%b94`IXi~*!FAX1+=$GssuKBnFr4BEbs0E6(wWKlpn2|GI zU1F@;x0iY~>!bQktWZ}lFyxD_VFEEi4gH*uWh1S}yJzh}1hQtn&Wr9uk7{YH*+C_u zdhECYZ$LZ^Y(%X1?S&a^9zO_41|2&6JLiY!qa3?nXrh+6CEV6jr z5675@PfgbMVI6Un#IzGak}tj-#B;OxjD&*y>|u$qYZxY>X!jzeFf6(DViY`#sXiuT zU_w+u2)4z8;bKs~7A7E=bMV}wVolH#O~j@!$#sSh67K8{bETsiL5mK^*5&k3(HQTy z{J`$nnV03__|W=pIEWgJRv2%x=$V9yGq$P?A`+$CBmxU+!7Tv%gs_J}V~Up3??_%MI3LRR2t6|g9E z_2R1oGgImI;zwDU^MNU>0V8&T2BccY6!^$Y1SmB`hFsYt8rpVC%qXM-y-es}BTN*o z;Z`ypH13urObXY79!%~`N~c8rFjNoRKvU}2YqC&R!&|MASYoiQN`dP}aWd=rK_mk% zvrMB%8@pvzjAqy_v4ndu_jV>p$s~Wh?4_DfnX185?%1tV$bAUPZ2rrt0K zrB_hic(zGPYd6_rP^Sa2sYC&dVpX^78J2Dg0$kM5aP7r(B$|+&qOnQ0+nKV7rvGnIfBF@4{8PY*XlcPD1 zt-~A&$hT_rQkaN>b+->ThIXMBnlLSuQ2-2W4I{V;wtKa)idPenzydRTOL%Y$RX{=Y zq;+3G=)v%R7S@yUE}KYMNn!+GCYNXqQrVu}fj}%ZOOeEK-SBQDo&-;L-Uzot1%Sk5GBJDZ*vP#BEHh9BGXcpAL-GE*lX+lLkbB zB)#w^1?)**lA8eEsg2`6K5^KI?D4etnDvR7g-tR8%uk{5U4&pJHETW%zKR4boV#nHrp;rJKD&qZ1r=zG2l?Bzz@Nw$N&0XV%S zTxxpl1*zeY`1tqI+e2Smf~HMMFL$EBv_7+HGMbp6sL3*`-FZi>j!nwcbhowg3QMLb zX|-<>QpbQMC2QY-(`(L?Hrz9p#~6^EZ{r$4o7#X6A3Zp> zZ&I##l4aDiaTX<9$IOrhi8}_Yt+E$SypZ?E>Kh4+Rv!aR=9G1?VyR;G?0prvWoo>S zWuW1iiqpzI7W=6onedpZNk7bSW;@n>QZq+qj?7pydxK~pA{-#ynl+zIIo3WqCKr8r zUzr`l*_yZk62lpvaOt4k+%@kWe^9Q>n#Mzye|vIBh|3LSvx7pp8{+82`f5BS)&%k7 zz?+AcnQR;!92_-%Ga^|T8k>+ip64=>?cL8TwhG)GQ7nZka+l*B(^LDWCMPm7lStLd zmK(;rov=K(__UpuO!5bDNB%OwEjWVoUaI?ew~dK`y!P3%o5(=_L=S8 zAR49AXVln1s@bb?(f$bG{%98a&Ehq{^*T949f-U-;B`+)jAqd)jU1&y~Qq6!^VMw%i?gfQir32-xi_twrFABX3S?CrMLN+ zI5;`W;Um9D&Y@2G)EKwoz~sgb%b_R#r7V>FGqbk;d)aZw-D8LMXAx3(`rEjFnmJs+ z9aafm>ycIM^Z4=P_l~oNHd7ovj?K|N=ZnM?{rD^l$>+&!7LqoW@zcgZY_G4jPu@Q^ zJ$7Ks+C(YIb~xU?F}pBQ2>SryVK)jiq!=&fq?cJ12(^axl~*L&EHV$ZXLy17)w5={>|@ooY16+@rS@d+4P@ z7`Ya`4&POpJyN>wpa+pge_(2&NL@^bb+CqGY#JrjffD|}Jr=)h?1wtCl-+JHYndYm-fU$C#Nny?CX-p3 zI`PrXC1v#Y%{-9S*0}l^JIqhp5DXGIDs%v= zZaPocVFzcYj(dY(a87Pg_5e%u{cy~O^g>vEcG9CWRH8ycG&t-1k;)jJnm$OU@i6dn za9GN`llejH5WFOOJ1|Y)r%B|#S%v?L^3U`@$hSJ4X$bTVJS1; zTc-|D8z`s8a9MaHQY%9}o{=~wA5Dxkupv3rvtych3h}{P7CQ&3&bUP4f#O9Yp}mTW zTI(1u?Kn#D zCnjMrcIOu*z|@3ZNo4id;t$yL4^5K2yTDUPpfwCt2a1GhsK8A~EL4R@87~c5c`jA| zkF25sOyR^dWK?$8wJf1|d*^eMvSR!kl>p1uI zf&S2!dH{2tg?s?vSZQ>BJOylABV;CcmJtE{xbuW~0zzM;fY{##4G>RAs}S&m-TVlC z?0B2|uGq4L=h}Q|8uie`&tV1!weRg=ZBd#~Pk`E!txc|jV-c1HW?;ysE8VA+Phpu9~ejqn$U(1 zPMbI~V?+{@Hz5>B^jKc-rWBFybCky16&rmuNKK;~Bxcb~&yKt{GL!m_svonmViVI| zG_Z^pU1C}hGG0l~cuJ-xr(oa*Qrg7a&SJZwHiRtt+(93&k^wuLeA6ZdFwt?pl~NPX zv^=ZbU`jSvZexWtm!2|->5Uwy!3^KeklqfL><#7;t3)N*yRAY)Jeyzqp{9J5`A1g2 zkrD^@-be~Ia%QGhGC|VdzC+H9l1Z2n$5@kkODif;3&Vhu!4Z}Puc!(U7qV7|YccPS zk1nQ70x&95afN1*JX>o;=tT26nXJOj z!!t9pDPTBHvi{_BLWEIDPZXdXx?xp$z`**~WCQGY?F+KmRY?-J?8#WYdGsT2y9cQs z!02z7nNxD)4VNBtC~-z7r>jDWy8DM&c9a?7wtCvADV4Zb0UBkgiwg5`?w1rM)}YC6 z$${t;D5hMD_b?NE1`zLHfgxd%1QJ=io5|&Fao9lK%l1IeKxg>PU`j^1P10v-OpINb zF5_%7K7~rp07mz+nslukAc?LL!lFF|ct)onCFS#4q;X>KO6Vmr0Evo<{Tz3jPYOJZekX@IXM!D{;H3cU+b;&GK`VI;2g9X?oUK%V z3Jbu+T%=z~u>x=^{a7{7t!-cQz83=H9n>}|Vn!65`9OR}c>^)TWG(nkE6bX!Ltf?& zJI5plc^7c``1mbOpepxCel)ay_X!y91_>I0pYQ;e8+dhkj-onfvP!H6$CNR}1z2)& zBr!;5Qg{RxfXvL`IL-U2N-jyVhOGuSWN5wzXEB*(!6O2*S0RN62hd^WtxEJw19WQ; z1Hv18T&fe%-C8__IRuy(<^t1JFSDM+QD6{sZ|nB$@+?WGwn;0IycSvE~O*1CmBFXBs$V5IL=X(A%{=-lvz;C z2j|2ofUDN9{!HtL#1U^glaloYhDUP#Gcn_$kBj$tQPHWem*3B3cj_x9y>*gZt`q?# zAdvR%ktEQK*RYfh5+A|9r{@kMQ>76pr9ic8orkB64o@90s#mRe*Ff>U5rz9bLvF83 z%&-DX4mE)$#+m?43x%be3_P^lTPWhuk1aXRiHpEg(Id3Hd6+Y9w7#WcB6@XOAZ7+h z!gKZPf@o;%O(6nLmT@i4@dK=xae*Fd$e8)<%y>4vXk-7WF-_Bym z49|5l`wr#&1ifowayAJ^FiZfC9DV>zaSHa4!?K@1xl>-5)AQbQMe&K1ot&0}HB}1u zh+Yqok}#{D%~BKOFmOu35xuA)C81|90Th*O0?5Ks6jpIKV{vLC4lK=1#X&^|V*+OG znvR1_Ez0@pcnVGxQa~HyuvzguHhmxtK5DF&l3=cM!6ltoHnAd2PmV*Uanfz|JFE_@q?*72Ni;BB_*&o++jMy%G=%WcU-`6i94fQ z0`73aG~DMwcRHiOgc;icv8&AdNkafF^cS@eDcykEEsy>-0*t5-NhT2l? zI|)w7;$`J;3Nr5k=eaAO_g!#mrDOAC(YuAT8!V0@@{?8GyTI$Z482y~-ww`?d3ag$ zeh!@9@bJ?5-%Zf_Ul!+b`TI0@U$_jt_dw(VI7hBC)T;O|D}O%@&M#TKtor*B@BbD! zKmIa9Z}}4R&V%zAij#$2hQ6qUKYJOAhREw4|{l7<$VO4-}CU& z+C%952{L|&dbmng~&U=`BRIxRQ>%GIRA7R zdIzBQyv4a({zk6PS+N0&h zT&}>MJX!PxNPC;bQAB>S=zSEtk6nh|5#E0coZD9$YQgx3&F6>?xiO1lFlGK--;y>@ zp8)Uu7B{OLy%70{7`?1=d;z?#U54Ii=zRyAldmwjTdH4u2%JYOURM4dgv@V(vsM@! zkKkqHZzDLZ9$wnGlzE{KoZt8GvgrLOIG^(H(&(Lp-rs@qR%sZXO8&CwJpj&oEuJgy z?d=_%`5k>DeLbyr-`YRCvu$YP)`kdhu&;d}-`_EOYlGBfOYSQ9Om0it-EZ&4SoiHE z77uSfJhhK?=f*c}TzA*H&2LAO-n8-U{?gN5lWxwvd{quo)wyeOD|5?h&F?M!Q{%HU zb2Iyk4Qq#9-yjxrN2VS`{BE$@iL-pPVp(O?^6C{eSFOCd_L^(!R$ce9m)Bo^!;Pz7 zanmc;yz1sxH{5dTYZ_nsx*u5k`ZwJ6#y73Ief@@wO?Pa%^RCTX?ry&4&2QP-GPZAg zVsih1gHwm@JA7n%=IA?dD^t4vfn&!X{K2>H**p4_b2P6F>P=KmFmK`PrZQ`Cs_RFaEdx{>U%=@~?dKSAXr-|Hp6q z=5PJ>@BGi-{k`9R^nZQq5B~6f|Ir`+$)BG6_+#fD|36Qh|HPAj_Q^m0i@*HTQ=fkN zum1XP{`NDU{ky+^<{v)y`G0)&3t#-FfBu&*{p)jI{^WFdauS>%_%f-gp(=QcYQ+|8ns?*P$c;%V4iozx3QuB{jojzNtD-@oS)|r32 zW^dEk-RE|dKUx0t$G^O+eDUkQRQ|L1FI0a0k-ZJv$Z*eo zLh>w=HsTSPZAGr!*I0G>$@0fb73WTF$rWoB3l%M=o-SRy?c;^*?u+MMWzh{Gk#Oaa zo+gh#SLCD!HK$+NMHx;|hD(&8E3*uvO=tI>8*X~$^reSyD1YL%7tZwL7VED)_4NC$ zE3RzIH~-^_uRT$8GVMH5!u9{ymgN(9=tEvmrFnSf!29{I{hl$?WN; zOUvg!af!f7r4=8OqVGMoYw_B;N0-$-`mNi}x6($-J5N1X`U-g_F(+cXJj-&zaC5oW z@Td8!(TZyRTJZ+j`xU33EMC8O!(v6}-A|Qj^QX?1UbM93oATZ|`QdSN))EdXyYwcS zZeJk1TBfvItH0ddSbzF#@#|+M8gro6bl&~x(wACJJy~3S z@-4a2^NTetC%<)f>8~$TO5@zPSkp!N6Qq}39JP6re2MrkPo?b+Zz8-RXTS6=@-up_ zJkqFzUPWClr}vIZWmfN{HVM5{s@bdLM$Zk~>ioOg&PjFF3>LLUzr1_zs8+>x{ZRO+ zjru95UqMSyDsFZqvii2$Y<&|!&kp7eD&M#)xR)&bq|d7CKxOASqqY|KU15TvbIWvDR3NMkQ)9FH(3+;_PoJ$j^~)rj+?*?3qoc8JZAAxd z^i4^5KPji5uRC>$|CJ*#WUko}&IWtVEmp%xPn|7Zwb(=gv^itXxehXH z>ggaM;n&r<`}sAs^H7lbxgbO!_a*t^smv|c8rw{+9$RbhHUq!-F;3P&}4CdkTj0zuHobY zi0AG61x&a2I`XiJfpxQTxifu@tG5?+?Q}hB)f4S+xs-#4=xouzoBQ~y<}a7KLx00@ zIz~K&E>&Eww7*xnRd%q*nkg9njf<;Je*5HHwQ|{WFFn>$eA&ljwEs@SsZSSIKJ{hc z2HzmFI_TEh99G!>4=W{|vgmg!We9xpv#(@)FWw+TZxFyA2=exV8+NsO^&>a@fqdk* z8>B;@dWsJ{CsWZk=AXPI??ljl07PNt^*L#66C#k4rKCK|Y_Z-+m|_XTZ+hwU)5Tqj zE8%SY$J-WLD;m$VP?|HWLrp4A}3fKhTg?nBo-FWf~7w`T=>2-_SDo=jl z?8$GPEWL96v8oGK&p%dqp?dzYWfv-17gx&k{k!ESY|F`qr5@#}u#>oSUoxP~QODx0 zx>LUa?DR`@r+$n7%Ws*#R8jZ-4->3=wBpp+x`lrsIDctb-TQxt0KN3&7tc~}r5`Lm z_3ke|3+UvxpRGIn-xaCy#N^`kWftLWg7AVOyinRRf2rz3_iHZ_z5B7!*2R3K7Vgfb zv*)WteX>~5^fa_b_s&1N;^WU&&wp|2)sG1T(WIwR0AJXuFoIWqoGG_heO~+HsCH4I zB7E6W;hkmj!n1Xb6#tK2{c&OI=c}bnz0bYc;hY;iUoG9h2raV4mS^#lH0wxBi(l(1H20%Px#a$_rFdX^o`V zw(DCQSuYiZK$4$7TX|s}t$XrYFO=@^aMp%6uLA6v{kr+HRg1OjY3U!bLW~o%q|xN5 zu$}EBVKcSYoW4{(Us^V5rohuLy=$ckF-9<|8K4xmN;Xe2brtKM`ogIvk6&vzVzF9c z$6n->&+NVJypdvr)5zmGwNypG19lbnTIqS`@Gdi;%AfVu0y1yiVrH}#%zrgqyM({y zwqLqo{_)z~Mzl*T4s>Y%Q_|!cK$p+f=WgZKtQFP~`Voc6%>Ba}dJDg2_^Zyz!J(P) zhMD~huRT1`un(`44g0asnVc{i07pQQ#|h($gdP83a<|jgiA}{#i!}oxV%~QAHBx1a zg|nqsYn8nmCcX+tiwuuit+%hjaXw|F2_Y^stvu2N<@peQD{?z5@nXr$|HUK2yAD;D zNq_NXmP<{SPCdhfP+#oO27~$37j^`^3O2r}^VBoPZ(01LcCNFfo1gk8;@837zIe7% zGINapj(v6U<}PNCv!lC3aAg`iPiW6M6OkpCsZbFdLk1==d029-lK+32KgT~xB2)>N zuRVR~A(fLwB&a|A{6ow4h>R>O?$X0sWb$I}I$M16@wJOj*(%%c)U&6~9$#%m+QsVt z=OwGJ5csjLb~boi(5%F#qc^T~$`RmS4fy*mV4F!mr;BM4oE> zy05NW0W?avIzhQcaYW#ga_yb?cjkDPkGp}$Q470@W} zg^BzwZR*#v%plP`Uz?yT->s|=DM+3ZpX=NjQWm*Ro>d9T*8z=EUX`HyGR2YAmpq^P zQ1{nD%I`A3+{+S_W%ndX`DF>pGQuk>WaLZVc<9vgG^wk*G7x#{6O^w98l_yHpe!?R zWrgrOq5Mmm|InlC1d$sOly6K>z9B(brlQJf{njnOqTgyreCt-laa?Qh^=to6_^to6lyB8<`Q!98 z3Cg!7C^st39sE}C*Vgf$9}Fqi2#BXqDNE=E3z2ZN6vC^crD#li>vf9bzIFY!XBNY6 zt+kY2r{D5RA*;nG<<})BuT`A&{L1sQ|N34SiOcF;Hn289`SsvNDX&dXeuLtS^1F<` zPk*NH+acw4OZg26%C{vbzac?cX7qkOHh`1HCh|%5|pKeD=Qqw`sb-Z1P4nnH)jLu6O=b3D6daY7Rj)( zVt`+HI)DAq&xe%XZ7FX|P!@$wG|w9ol%>B_R>+b?#_6i!Z~RV3`Gc179fq>EMY>7f z5^g5XS65%Z#q%KlUM!X zJHtF*Wj>j^OTXn)mc>Yv@?8na6a$>o{0f=!SN>pkNO`rTyd^>T?gZs63Chii^B})c z^hc_G#;fNau#}q>#=-<+VlRdG(r zFMr?o*i#5i@(p?Nmh#pFavl^9 z^G2+sHEPP_Qb=$?oO5t(Om1|Pi{(Z~NAI7r7s(e`doM~inN+USKhvH zQ^XiFuq4MG)PJ0fXcLbyB^Mjf(`qAnBP)bowtd=PUP>32Dd-=Vb|O!Tjp(~Ts1Z5W zds@UsG-j(Q^xg~J?^;|LL2AR`F;*cV;??;$y$suvFM;=x#g$^D*-l&#qR7}6M9$`s z!JK6~aTQYaEBKQqi=LF@H5Nw^`N^U;2;S&r=!rNmb%pdk1l}W;p(j(wZ(bq2e+KVA zE<;bI_5T8AovbE!q+YVhyBVBr4==4fT6up6oDW&Npgm&!;5zXBr^O+tPnHdmSO)x+ z#m#EB?NIm}IO}A6!?R>L!0Gnz(#p{VjUkJp1o_FTm!AgjS1&{FJ-q+B;B2yMA6cX* zy_9;{V{zPfv+89UyoW7rR=qq7k@ta9ZRMHZyT%s0(|uzVfpy@##o}eryC1x6aQ@^9 z=zR&Cmo7u^gk*qK;R#t8@+_6VN5J_#i;ZL3{dS55)b>O^07$MI}{?ht^bfoK2_0umlV8hCvJXzn(lknXJjA?FF zG!(1Z-<`KO2GiC{N_jsF-mh8Qtna=VBEJXD*F3ze_WcexSHH%5HH+RplCQToE`M3{ z9suvXm!X%3$Oo^G-qYZH@iO!Z(EAEF_cWT^Rq|g}{@w=8A&Zw)-XG@uA~?%L3&0cf zmz4H+J2;0eUKYKdhQ|Hi)QQG`N0hc%`5Ogi#^Pnsdn@lB2j^*vw|ohDRp=Y)`I9G$ z-Wk$v2Ito;UNC-B%3FtS;?<&`;K`!*E2O<1oTn__3gTMc*f^K$-ym8G@5vf(_kh=D zakIWFi{hQ&oU?ercT>u7)f?bf{K=C=uZOhPfOFX5RT0l>w-15y$Q980O>n+>1@vBx zkafEVT0B|#+e^Y0aDGw*JRX_vvhsJ=n>c&HpFCOgc9F0hoR5meg+~c(Uk8{(cOc{hJhR$^88_IR9+%vgl2a z@bBOZ-DT)4)el|-XW3?hmqqWVNUjCv5sSA}zyEV^{=wp9(d#4OOW~+A+qu^Zqx$TRvd0vcCKKB-erSxW$up zOlx0hk3ShSwA^o6`wBmK;tKFqg7?WQz^euCZ>|9E8t}ewg?Rsd1$fe)-?;)j>3XTkkb^FXz83djAQ|H6pQ%X{$Z!wE25F>*TrF`2LSN6%Ieom%65&5dw zaWz6%ea>tiG^qAnuWhl0cnxB-cdd&?;XnB_UWNRx$VQI zLUtXx##9Xnt~&Od8{Xk6DMWJ+AFl<1_4@aR{9di0F9sn3xeM~cQ;}P-O8%D)M-`nd zRf!>VxloIl>eI!W%G;{uzg1COIsdJzip%G}bxo(Zr5=WgY# z*YhXUn9Hr#-|%NGLGt)a@zrGSm50_F+xPNQ(%es%u8}TanoUd`o6i1$@GnkO{QCK2 zGBYf^ZOy`LL;11Ma{^~sKnK5x-whfPRh0DD`kd?I92L}|2M|$3f5V@31j))v#lHEs zRF}HS1C123rQErO;{rR^?kYdrP~1SFtDC?5@ar$sh2@;Tc&W4+G+qF2p|i2v*|0FM zW?^T;Lg(7ibJ8kd`D3h;tycM{kkv*$N9)|lXE&BtHD6a0yUzJ}$?f%OtnZxn^OS z@;5H*U90156g&9cd-Q;WX`nnPEZ2QJC;ld<{!!}=Y&A>^3n_6TVYHg${lMcN4cMJG?a&F%Eoe=w5DGmX;)LA zErd*gL^wAEnj>TiL?HLD{O~x_&K|-XK%&xX$TIm44;_hp?Cx`t^Ou&)xuW^aU~}H4 zIq#L6FHAR{?_A3mycFbnk2!Q?^4&x(Oujc0GWoubP?+!giOJ*gEkfO8>b>g!Nxd&j zuQ}h@AUQ5eIU37Sj_;w?-%0+$+@FxF^SIm(6J9d+OICQI-^1T+m!BrD4GVi4V?CsS z@0pqw)?#W}>fF@yD4{T~hlt7J@_H}fz?Q$bB^Z#FF~0GjAnQ+o#|D`Enf?Xfm~gwC zNeFrge3ML%F3hf3Xl+<%U3-3+jM($7jY6#a*xqw8ahn{!l90)910f?i2p2OjS;Sw> zpW*383CZIuf%gzjujk@*<;wYs6~(&wi&YOVpTAiB@HJYk<+iH%&AEra{yjFplU@Tb zP%FDfi=*?;RTbO1i?7!%Uv?)O4h}4{)umOXCmdE8R#qNv)bS1HHa*Sot8(uem{@tZ zVPR(kyt}GgSssRwzURAiP}e)nJHiM|^$8a?Rn{q?tU$&C&Vn=$(7@v=W<`y->^^ZBTk<> zRBI<$%iO=GzSMNK{Fe(A_OQW1zG@*~Q`~)Mt)VEB#o2|lX^E7Yb_@3JnW|#&UIepyqsMmDJe6J@39$Ewjftnd(iwzMRk; zf7Mu?x^8((0Ba&-y5%lH=8gS9s<1ZG60?M)(^mU}0rnFr1FljG3d#<)0gT_H4;JoT!)bL{KJFgy)_qB*fR{}%I5QRrxtma>G!sBO>feakeRaYjaPE< zVAGQeH4EKU3*G$IE_AP2=&oPrUcJ!0W}&-bp}VnsZFy%{my6}nUwuw`w=nDK+&B3BK@EMIU&D4*P`L)yK*+T3824-;%(*seD9$vv zc9Wexc^oG_MmRRt+IB16T3#V%W6nOj`UB;znsV)LZy(mGDX*a9oy{+t`10P-^10o* zhaqGPyR#ZX`G9;!g%fuar}$PoG>U^e%Nyi`+QZkEx7Q4pFKxM-)1|Ly;jCcuxf3t$ zZhqpSH=fyfsrj*m>mIsM4mN^SF21MgO#OQnHkPlG)6mbCE6P1J=d0c=AF&75WeCdy zH`7NrN$~B>~KJLnel;5*9I zyP7UhW3O`kn>Mcfm^mO+uBK0QHD5gOZ*;sN*M+J^Ll&_2+*+ubMi;@<3_@X+CPYBb z&dUF8Hu)f7;aYBK@cnSDU zySmjl-vL#2SGSnbl|L(FpDDh<4T@LUF`+}E5RQym85#eyuxHKQ(cK(&|30|$+xcu* z1*Tf0mxp8Qr-{i!Cs-x_{|tXCazPDPDd;xkL;52!j}4?sK@lNH+I*pP&G}_gepx+M z@xNh8FC%0om>UTh2GkJ11Sgbx-bzd!!v=D>j}Vp_;)QaX9O}M*ese|Xox4oMN!`9w zzF6+6dbpjm7D;Q~Q9f8x?l9}y(`R>;Zqll@`UhL%^N+9E1KS*4uy}M%i5niCKqckS z)$WTmd(TO6ewDxaoXm}~fUj47B4!ARgz`~^_44~G8rmI%q&f|rw3We=1%bgkMd+9L zGd%GOA@fvfd;Jm-@vyL~e32usUn{+)Tzzu$?WNX}$0{}y?-9zmrf2^22=)J*gsGhi zuQNrmhrf3j_Hn4f9$oFMnSXpWlhL3d)NM{+Ub}c*(^<~SR^}J3Enjo zJo&9H53D}*BtALLRGmE2-t|wuVF$Gewrwo#9iRgnmm?e~MozY<=#5vDs zW3ya8a)6Vr4YzL)@xxHlfYlxTCXp36abE$O-CnhA{@b+=+*9}Hj|$GE#vhme%00ED zzTpq0t69#wWqXw<@bMUNJg)L5y%~pAMg1X;Xq6(zJ;NN!l8K0 zp;~uPmR^anuiR3gHLp3e$^#$DnIZ(||5xojCvu4CW^W8aTL=kHtk1RZYubiDu19`& z9N&~_?TWH8^8a~OKA~Be{|b_Tx@D?6B^#adCmQQ3imMLQ1|xPi!~2}FkGfN9z$oYD zFRmzF#hR(^bS?3nmYu*!kWs3DFL3M^DYC1|)ZH$-TvnkcPdR;xAB z^`ScV*;+<{et4v@w*26l)0cJ>Pn1`PJCTQrG6__DlqMW4*UW!;d9k^tw4;3Q8YYT? z`5&xWR$7M>g;iFk+upd^bwXiMLi2okV~ubG5%F@oS3cUH!w-Vjl9l?pg$+RnTN4+{=Fx;#}+{`{AmK&IiHS_K>0qkE0 ziSSXM`)-gbvgkU6$$2F+U#%l#sB9+m5l!7n$aKshLWVL4IWZFv0c%;VN@^wd7yPZr z`Tat^uynr=Qx3mhEGPcG_6yYCh6~aJ<>N>^Ri`iM(e^{O-S?Gu(eA%SGxeKxe|=A> zt$c4I?S8eid+|W|=-LZ6v5JBHyrJnyL+yp8XD(FJ#58o!$^}?J*ey&e|2J)A98Oum zainpz=|ag?rjsPF=vQgo>-+5xGO3vk@i-x2VD-7b;ny_uKNB(yE#1I0v^c2v2(kLy zHH1t<-%7}&zLAjWIBkSXNs7==76yr@qAh%Jl0_NslaF zCBRQhXx03`Ew4Kz^VPPU#UHTsZvM+1e0GJe<|v3G2RtpoaSM&?LflyHUb}q=C33lC z&5#?ZFxm3aHF*8Hk%eaW{KeV_{<7}T_d%YyN2m4j6H2|X^H9z)YkB7{buudFg$c2* zaZ&a)F0!xDTJDiP@ul+p^=Dcu3OlzA`EPa0x3?Dp?fELvTeB+>d8i#zJ=D=A!iV^) z*OT&78tUfvAb-{B68axCBolLe2}KgO@rUUlxn{K`yMpL>K~gZKAANGjdH zq>2BIziO501fx1vMRq=`Auhi;Vy~f{#CHX&&-*+D3@AAnoBs0|B5r+Fck1_vF}7&}EoJVG?J0)562lqVj;T=17*@5yL;-caEr5nl}mgnyXd4Bod%MYz_ zWBao@N9Y2#p*+ZN{vF}CrZElc4;H%5+BgHzdNneBFX%p_dr=xoc17?FvfDt!^z05o zhS}~W^fUa`=f?RpV_}w%8CyS0NUEbg_v8GU5%o)iKBBPS=GTm)M+upCKSjuVgFx=D zHc=C{7r1Ebgo5~xVEsVZFrP&PZj|iC&_Cx^tBB8JFSFO|k1q}(+=QZ>n{L09y&Ryj9-!vpL zj!9ib$fVX2GO3{C!~oELzD(r*A7NBNz3L65I{x1pVc*cIo&QR$D1qwH`!s*E?$q7X zKRj#=Jj|2naTxV@ErVi}XggmeD4UU3rR88=%5loiiPXQRYT;N_`Py9zhZ`HR z{6g`ymntvZQto8wUaTs=aN!1k_tzJfUAh{?K?DB^3X@KiBHHIKRu;F4C~-HUL~#?l zM8);<7nhfQRV%W5(fpS?xb~_j&%Tk$z3|hcdu8iX_nXfhBzK18NgYn{SFcKBfmi2F z@@rTg0o{6$|Cgz5hX5sorL;G)XhN%xE2X+qcK~xsH*qMiv%H>t@fCab(B`|(oqm2- zx%tF2WqO+}N+=M$1K&#<%J(4zTK=bG3Ez&z!_aPeMkKPAm1Qa_UhO(^Rr#~c z-+B18v5K5csmSto&eY!C{K*ryV@dO!ot0nJR~Vh-;`#CmC*DUjtp4(KG78xEUs%7; zOh%;QMYtf3t1JI=VZ*}R7HG2g9?36Rtj|43z)T$?3z!!AJR#FU!sbm2$&@q6Uv+M! z6iwgd|D4z_%TsA@Ly*OfICr{8X5b%1)-mc`7hka~bWcCIqwdsaL6=4p*Oz}z7{8w{ z76wd37@cR`5C3<;VV%;vxpXZe)|uL-=1De^*sSv8~)Cm3fb;%ro^($Y7}1 z`^$rCZ+ikhLq+T;RQ{#mPmFM6fW1;3m49*D=lJv*SY7?0oKbLMA~s(ivVnh?4kLaQr3zp!OtPcB3zB+jLzdPmR6{B9~$D%6A)2wkn! z_EAEn0!1n^FaceXAD+sb(b-8wugGmT6C6YNORmhJor8|KRe2o<{z%As5|v;zGFJ%gQje%ZEpU~yY5?T zZ(N0YL){|dbE`0+*=UG#lG!KZB#@il~-t~W}dlUGminM+7G-*0b2y}o314e8x z$PU436;)KmLjox^f_OyPpI&4wcRLothDS?;(P z?lFkIE!};Edki{Tma&LY+qDMN{afG^n-qs5w%ph;Nr{_Nlr|>gNCAIu+7ZWE(WxA& z+PKdGHk*42g^WKxy~N!M@3D*AQs?>zwN4y6-Xk_`t6VgAeXGtGmt1- zt!xVAsl~MUga1-*vAs=`9reWAQHw=(b(tJrE^n4lQKn&Y$9s*{564P<ee?^n2uY)!!`Pg?dL-jpf;{y){FU0mHkzRE1q@zoc#RRSt0h>JEP##J(P_ivuCQ%! zY#fU&#%XaRsWhuSrVI|Ml~8lV-WCEd0sUBa4=@O zQHX6WO0Ce+YC!*zO5&-Xa6wXud*OmpbNQG$0ZBk3ghB?2^ATQ3>Uup* z-FqG5+J{_Og? zxZR7Y9SyGB$Cr@!d=-BZQ0xQHV8iE^(;@M>q#Y8qdaLAsNv+i?wZf#4+$#MMCiOB_ z>2ENpU$jcUz)S(V6(4s{=Cv0?;yy}MX)Pp<+oZ%{vB6NRj(&xu+<%8*mdz14t52hGR>XSatbWcu z_^XyDaYohkFFL+jgr$>7o!(Jfi|T00GPwI=4e#d_e}2;O-;}N|#M){<0&pdSTUuX* zpsuZs%4@K15J_FeH>g=LSY%mRMgozz8G9f@S)|Ho5~6fjWB5K2R%<)oLYh!jqp;da zr?Y&yEK*Lv1u-MmFgT48`?9p=isd~HmSTC5J1Y&qwxxzL_d?z%2(TjaEV_Hq>^0X7^Epl zzPwY)@_|@ngMWE`%**prpEY0<{Wwn4wr!Ajo1*O%-lqNq=@Dov+Z5sTn0BH08j#j; z+y~XliO^Pw4kKtM+A7g5^hV~l1QM^?DH+K$F^4`dftE`SbnC>B; z$DqZ8D{f}2dvHotoLpY$HnAxitCz{*(h|)qajO>1Aj&xae_8h>3Y>hLB7qKpCAq_4 zSMIN{&DB{Lc0UgcC99APhBTOkHXh;&NxAVe$6T_A|YC_e$lcj z(c;}kvDjgt3e@c(LBF|xXA$^f1>b71QG`KPAwijyi~S}H;kI&jf9^|(%wp^d)yBrb zM^_9hHTn1(wc(;P;9^4;W<_R-gsWeeFe?EJKrP8Z0a&Gpka#1@fW#;4`H<-6PbRkg zp2ehE*hN6|1xN!Vlk^iz?w8IQ(;1GAvF1Trr5P}JGpBBYF4LJ9D|cOr_c_p3X${P$ z81n{5JXSYA;$hqbiHC6yB-&guNe{y0EU!bNeMGBt7$*1ekt&^l#Qk1`E`z%cS0(C3 zX!&H77OHl3RccTrngVbZHzeu|t1RmO;EKNmjLE?umKzsA5^+`~XI+!Cp`pIffm0*)T>7GmG(w3qgw|b0z?PeFN)sj1}ZI`oH0tzNbT98=_u)7tx!JDnPDb8 zZ>=;+1Lp{zO;yiXhj|6w5@mBX4)IQzoC9z^*A*rw6Q(zo3R`nE?2ZA-gwfb_QcUE7 z&2}_iEv=0hq&rNA2(K)IA@NKe4~Y_Em8u}|k!2kuKC;lM4fg?o-MXQtq6%0h(48y# zosP52=ay`Ya~x}F%m{u*tfHfnK1zt)wTx(LGMyPLmz9e~zWt8(ln$NkB$mI(T(z?e z(AQn2P6QP+vUxBK7-O9L3>`~o8b=&`HRV{*K@-m_piR;xFw0q;8wrW*O%i1wx0?;A zFSM0?O^LVEoAJ(D>T{5IR(3+7th2I{O9$e%Xqz@ofIQ>f_fnp*nXpFr6>E#Iy2brojbqKT~@-#TF0`^SNhvVbG1p8;+%*>xosyW?CwuCcYq{#W z7!u9LaLpVNb(ki04TbxquK91!CW-2LHFMnniMwus^geUl2Gh=5Z%|!tg4DrWcf(xH zT<=g_sl^;*t`ESZF54tMrn=hd8*5h8)JfI$M!RIMtD4Av5yvj7sWSe);;M=K_gBoE zSX0+jgYVdDtsFEn#a9ZMN!y6MnY0+;@p&EAMA(!tLr1dG#Sj;r^o^y3PA6!#PiI9` z5sS-|QIj^}Ix}Lyp!8PQiNR;!a0|-dh@q=c7qRli-N8DPAZNwiPFDo)X|PD40aVlN zIBay&av=TSG0}jp&SabA0ZFA;dS>z(+w~r{&#Ve*y+R5S%=B5?#Qvn(>0!@=bqYKH zN&|oui7_I-8@~ZliWh zR}xpOVPlU6u4(Z6k5kf(`bN9M*;r?*#6`v`JKe9RZjsLpXdJ?q%UEVyi_odSt@w6S zY5bX_4otnxjwn}x$=R2FxcGOPEIQ3}Mu4eL2mR3DZCZ;u2dp+It3UG+;f4*x23xuO z3-(*AbU@e@iH;;1dopyiU`wJsyVmUp9Q&GKmX=cpTG>~pNgK{5oJRTUu3@dm${c1s zsl$96<)joL?P5i<6B2|FwPj#i1HQ<@>JjQr3}POQFl_jF29@o3!O)B|h@*j%2qPLSl6?HsTZ|3I4$eX9&$;MK^XRF+z=f!dZE10yeI4d>8}npzwO??Z zAGqO4@5>1+P~|64QPo2+7FPq$jUskesB57YNU9#;1>zTqx~8cSrUr|h^H@4tq0t4u zW-LI~(KbK})nH{@_>`57rR6n_p~XJKJc)Nr0n*mBr8R;!y!O+*6RIy|q8MLeo7hfc zVPV(6q+gtolmp@84^tkbsMm>51sn%jj}u%mr2t8_1< zo0&uzcNw%*qSG=i(FIZNV=^Rem#o@RzfXUJ8ox7uxr<4+!KA6VNup`_P9{A7b2Vdr z98wLFUW8N)$t2M>(`QUNq~hLFai6F-nzZxtx^E%zSPexl!DBy%`U}`wrNxkV+L|Hp z_}#49Jqn5Ycm)!V)tiubtPVrsv7%`?5ACFi`$on6s^Tyx37i$ujfeq$I0i{(QVgUv zCfOkEU=rdf(ch%tV;TQRzZ))mnp0X9e}?W;Im7V59!#0>ORnPb4b{p;xs5n|bX4O8 z=X)p*C4Swg~M?d?WZ|< zVR9Runsjv2Q&8_O6A$cZ5g4sKPf?VyE>JFLQ}cm!fIH>{^i`D%>A*-HXWyF_Ie1A8eD)`wI@#n7se0IiD+=|f(r9Z+!FgSHl$I@Oe;2TX1y=M*1=L^JCWgQcoO^6w{~n z-uSSGnZ|Td{TVY!2gqQG)eTL~TVU&*3cYXl%p)Xp!&}QVIe(O~((O)`Kbk)X1`wFZ zB=tqsWtfO6wT|^ouq9V+H;9rUly^NG2wU$M`hNq6=GS3{1u%)`W6OY8Pi_ns%!7Cg zHEE}bp*Qm&HiT$vIBj@@88Ts#8Z-8JL|ut0?JQftx_+5>XtBZs$!g%K)-SPB}&qaRm8OAWwk|;j^t{YY2 zi4U!eNDbrh(d6O9u=Qrv`@YY5Ac?u{UF(+~X6oBX#rQE_0$Xopz3=5MnvArk##r%v3{2-Lx~}a!-vKCaM-; zyz3!A$V1x6BDJgcC6hhA%7ib%aB+*Ukyz;D<2ElFZNEAiuHK~+>z9Y+!Qnj3sHm;3156YZ?a|?-=@j zCx}LqFhdG*oyN9T_9w3N#E`D9kQ(n-7Bsqf;xoa#E8P>HNIuN7zdFSU<_H_&;x;*| zjm;;{boSsK=kb2II*DOs!$h>D%#xe2!$uOR3c);y$63<@px}L&^}Z9doH1dZc2_Qj z9ff&=V2<-+p5n)>_nn{=!FxtIM`3Ok%+vjtXZSHs_bb5!hPfT48M>(?6%U2^6TzI| z$BZGwrvwxHm}fG~RWN%)|9a_m6sE%bi(sDV$DHKHJkyVP7Q?i`q+V;+nnU+{m;Qz?P8W+4CgQmCRnU3r`|$;&rC`CBEdXI zjbVdVSnwpZc-d%Y=5rY{^^>HIy6f*yS~C8yqwqx-@BSwlHr{cb;}_=?hFJ@f`kznV zpNc|O;(SCfr?5E3=1z&5mKevrugiP^FG>ILiZjC`BubPM9K&s{U?&@@&6H_V;@Izy zH8ydH(lXVTHs|NT);kp`eyK=hm~5C7o$Qf2ay_Z|PQ)-(qPn4FPV-|<^|Q0acm8L;(^bGjdMCc{*KEDBP7*c>!>g?YGO&h%r>@?*~QW2V@K z8R*Oiot#vC`JLZ-m=gtawjXnjA9J=J^L&OG3}zb9*PWAp_AnO-=J|}7%6-PvIH?>s z=1XEW@d?tCJ~lI?|Iyk^nKnI+{U%rSHD%hg>5>^?avN>CKrthw!(ozo{lbgrB=`u2 zbc^^9#=BkQ!N$9E=KG~IpJDzEvoG{JyKhMGr1Vk2oX=9Ktx*Mj%=v!IY@{%ZLV9Rj z5m$9LCe(Og>J7nM$e1a|5~fULU%Thy3v8xLn=xIAga?hy^hCB3qT0aM73^318XL5) zn-GR-1DmbuuExyX+h3k-x_ zg)~P&T5;&pQcsS3BbZCT%u7Dp1Q1hXqYVq*d{R;37gia=+y;}njk&w-t@eaPd+Mah zSXf$Ss^#AKQ|8BfCBx(*71Yx{mSw%&!#q(iUkPUKK8i+CZ{{ogm=`ikH%!WmdkY6) zNrYgSN)gNp88cax>gEp?7(QVw^b2b-!_XZK%Acuw^P44O)?&Y~ zDj4P(m{hX2ztRK?C0*MDa|H`aTNX?Gm@E94moW^@f=J!{e)Ve}=34~wGC$@@V7<#? znIH3Vh6&94xL{uH$GpOidAT2R6~oX))fh+*9(+bqf8G$xRg8J*(v^<-+ADw}<=YDE zu=7qum0wsZ8HR4-41si8%cI*p`EyK!wURNzSvn_dcvxf;K~WX%sRZG1)v8`n>SFT(Kn{7aW-4dXGxB=zk1s*{Qze0WIs zA`IuTC_rBBn*6B+Cd|->NTBZAf4BvLyBb3LyK8fH`% zALe>L=5-8n0w%2{PW?3{*~5H~U|z?WHM!Bqd@1vd;%jERlyu@lP{J2syicfCRqTl~^~9mCKu?iff>&&@pJ zN&8QN`8uRMjIB7PCQg&iAZwT}vYC=FB|#dAsHrw_Qxm632ela3Op)jmQ^ib4xFS)a zV`h!blo?X2YJ;dq18J$ilue|4xS!2LKbx6;HhEq)+WbLxgsC&wsjJ2Y>%jzXX5{loEf0K6m#ivAn;WgbdDoT}mKzO7CGF?38&IC_D6{YF z7FE_X+3|7Z`bJ6ls&8R(T24k*eoDdoWd7BJxzm)}lJ#}!_k5?#jptwbZBjq&>j{Dd zhtDf3A6=%9@wwrY#u~@fYE)p6T~}q_sI|y95b*tu1W2e*NGsK9i=7Y-=zashr?CcxJ1&vj> zg{|CW3 zx2P@!$@4ODveV{gC(oUVe^)5?y5~+^@qhD+&y-EM;_nj|+a0Nm_DY9cjcQhMR(^JB zUSUd>S5_;392Xb&yfa+Glu}itp~=h6E6h*J0S)`}x^t%~6mzFJ>gP`LBGP`g`^rMp zK{^@{d8lNsCZIffBmS0u0EaYtZ6NC+``Y^T9uGvWVN-pez%|x>ZNSG3S*Q9eZ>((4 zIIH$(f~>ja*9$8o4V{6sl&(bE3!P2X9(#mNK{8tIT;HG)(LGG%PeFRTWLIT4>sB~w z>gzmqph3rg8@EbPq-G`;=4a*<oDx zfQ@z@1gMqIn^QH)!nI$YC^#Am*p*;E>tYIlwJ<-Y^t!6R4yh`ILmY$bZ zSeTyd^+&W2_gefFE&V2?)EGwR7mI9mE7`kEvp4SGhi7gj^*;7g!YHitjSZeIE~RRH zW!(z9SHC0d)UU%+cIH(&R#c19qqst>Q$8+F?!|U|Y~Ba3qS_M8c$MIB?!jl9)?jqrIvIf7@JXO-L?pr>XS~%FrXS0C)cFD!jD7S-v|7K(EH1VSiPb{e5(9NWZA9Dz*8Tpy>(sK(^GLz>{9+!2PKop8&(A2#&6%H!Ul7bqY@qpw7a%WreoEH7l&rkeWY$jw!sI9CXBDDb z$jt+W`i!}WjWpx%BFazBD4dsCm_2WPGIvbmKSl5YO-oJ9EXXXFmnSf+pm@$|sv0$W zB^MLsXJzN-q@-sltQg?DeQB~wTSlHTq$YtvL6gRjP^7%D$sZHE`|H#5O5a(mmdO-7XS7TaI_KZ3;|~a?hhg0DBK4_ zz|rB~^C949E2|>}+%Vui2>~|*xN{-kaQ-1h(yo$51u8d6$Jh{X1AvU7 z{Fa7*qjK960*)5?yF$Pb-~A!rE(7kx5OB0D{Ba043iosfILc><_VqL>P`Mf5J|INg z;1F=5z&A7yZg~^!-KvWEAz#%Tpx?*>XpS$Rl$@-+FiJd=psxq+Ie|sDr29R~*MT{# z!6iqbUsHd)No@Sfct?ThL%W<%y`c5Jk9i3&69taK4a7$qgEN3xDR8t&8tD6?w9|Z_ zz(8awIST33Y-^Gw^)HVB_g8_{3%3ZkeZUN%eOD;j)zeGIHNfl;I6Xc}$8KOc1Wrvy zfcSL-W1)crN{??C+=c=ZufgfXZ#FP_8eE`!UIxB$U|tlsVCD8UFvoh}`we_w0ds=( zlA&l=)r(&e_LAq*elnC^dTD$s1;(Ml>G5p=W~T-hD7`m>?>1n@(cUr?^$&V{-vQIB znNa%iqwG4tiZEKdK zJwkM9KB_BCUy-Ub0mEnm&nKG{>gbPEi&dw@Af`_fQqf8dkeFu3K??y^SdrK142 zr2?xLF4cn?U^Z!Rdg-_xm|HctK=pnX`1Sx3M?2S0YCq(Yj&X3S6&MDD5vbg7Dkj|; z2p6E-UIXrL0;`waJn(%8OzibMR3jdG>CFXZvB2r^(L84*FfM@$RuBFMn1_4dy9<2J z0F!qEj~|_Wv-tVsAI(etC@>ruIR9uq`CuSifc$#}xVHsXFTHEv@K0cp-8|HAJOag! z4mPhB7>*S23lQ!ffxBN|^};2-Cw=(z%I&Yfz10KX!{GY|FxS$F4it^=fzm$S(&7Ejz^s-jM1B=XFTFPdbDzNJ@pXdZ31FITWOPCM zmk$MoBLk;58jc@_fTRB9yFj=A`O>=$>rrS@dg*uoZkGbnA#i&2kLrD&oy6o(di~_3 zz)cody>MRvO(HNq2%KKHCg5h?DoZ~~l(KwhN0*>0z+7NJ*f9pcP^#g802sq+v2>~}4xE&$j zMgezE2sj!C_Jx3>dU_xPoDH~7LcmdZ{1yU^=1mvh3PYm;)dQ+8(?Y-zUtS0}YB#Gw zz)`u?g@B`Wb(gUJU_9`SOnta2DV` z4*^H@@0$>Cl-?ghz)^Yp90IN{aE5zfXjGtbBfiKGan=xU)St$LfTQ{{HUu2yUt9<{ zO2_mNadSez^#NZ-2)H4@6@-B651c&&9F<#B2sq-~5(19;wHrgg5#RkG;E3;;5OCB! z4u*iE{@}w9aKv{a1RRye*${A)UekRrG%8U0pn6~p0f%l^x+DY~)#s5R;D~Qbh`5O% z;3(WHLcmda6GFtLgn*-Vo)ZF&%6CBsIO<=Pg@B`Q*M^95gn;V>zH39kQ9f@D5$6g4 zN9ExT0Z0Ac%^~1u-{+1Ha5Ns>9U|`D5OCDq9t?yFuul04a2*0`fWJWdL)dzj{sv6e z{ScrizJcaBm%+Y4UwQ1y(QIGWdTIn6L*J6|T+(4ww4L5dy=J`r#%3 zmnE=z;jRKn5il-a8Ue(ixT7yf%ch&BgJit4Q%UmGxY3!Gm3Ho^bHz+Cna zu?0U*nE_0u!0GX2gJXffFhUr5@w)@K$9mvf5C6{rGwxx|W>okB?1vQz3`gphTNQ8) zfz?aL`d%2Pf%)N4&PMb7K=qWy!LJ`vLgY`q@#uUAI1?xgkN3<+xbP5g)W7ue!{OY@ zC;tdHI0PKBMY_Zf7w5-E<#cHvT!8j_8F29et5+V2!8hB7Pp@9x4&0+X@O_Se{t_bJ zAD=}30!>OUetXfOJPAzQGaN_bonHLT66RTs)8pF*=Lld9YjApeM}ax1!3FAfZw23X zz-<2u54SfSf$B5$e}5Gij?`~QM}RvauzKmp2T2z&iO+F1wcia;56XdAC2)Ft9iUkU z%+%*OAJyAH=@fdtse+rnWH;FAc-!NdtX>ft~7J_3cFgpb< zSikWEFt7H&HyeBhfC-}x1S(j1`vG%_1{WxP>EIX*Osxi|mw)Slxn6?{#8(8qUBG-H zaOylKK>0>sa2Q4d1Qews5MK`LV}Yp?I3wQm;&&@B4+)$e-vao58W_WV2v91Y&paXq zZes<80b%I%yXnA{3annZcKBZk%szn&!@FKOz5wPsfz#ug3;(|XlXL(Al*;Fmj$v@S zN?;fehF&_FfO83~UbutczYUl@8k}A_9s}mD8eE|ArEYm2Fq=Ag?0Vy&$M+O4uM3=B z{AhY}5E$pdp7|aI=0$HQP@mjd&>zy(Y1sJC!t z0ZmFTessPy7np?t*9-4@@v8%7OAmb0;eR_YuZO_*J}_VOz;_S$P6H#q4FM_~S}%S_ zfH@&>dg;9%{=0zL`3|uKUpKx5%*O(!$4B}1B{1Cr7cBn<{SE6&Xi|E7Q{grdm`Z^Q z#^(g4wFkbt!FLld6An|T!Sk;XnCk>iFMcb*aU(F_37pz*1n8fm-bGnKlhWh62yWv9 zh5=#dm2V1g3wq$A@naD%Pik;_d@lmislf$mZ#M890p?o`PLJi zQa`;DfSc6=-*q6#0Op{;neeU`KjRVX1w)h4i{A}!8xG8a0vD`*`4E`@^uQMjzHfmU z{62*md|zcOFo^=E7e5-eQh~Wn;MDr(Gj376+9NO&E-Afn>qX!?1y(QIH26OP%;3K> zD&6sND4gR3h9mXE%>{0;!0Ls&6eKHw*)MQv`TC@n{2TtEgvg($&wl$6(QxYJhr_-_ zfc85KxN!oj7e6YGslYS|oLU|M`2GOQy*=<{g70x)z7sfgeieXk*gp|JXi`Dr2TYT| z1&tpt_lCgtI57Y9Er>cwv?aESt|7r*;JkqXRL0%yj%UOzPLBdp`0N$K$wV&E$P z=AL65N9{_F@Agly&jn3NkB{yr{sox#1Wv67KKVlJ>uZ4_K2j`Sd~nn+{tyTkpq~B= zT%Y5NN;iH)H3*n*1g<~c_0oIorcnsy${S6J@93K?=&!1 zd`6*a);$6E76P+c;Pm465;z>dO!%DG=+9b<^!nuUaM%w#K?siuR33fd92W=|Abv@} z%@ye1Aha$aB{ zGNs4Y|4YnGph@Ya_b#}N0cM}T4Zyn|U)@(&&p?yXTyMOyeDMjF`pGi_ zqlBy%Zp2CKzd)1H3->lS!~*l`DUOT8L$5rh{uleo(4_SEXg?xfU>FdF9$z(Z8++ip z7y(@e%-vm_joP0c-x*+j7dXB6tqH>#>omUp_6_Hw{0x-OG=A@BFa&j?aNR+XLTP@cjbJs&9D&jdG9nGw<3XIKp1-IJq_G%J@6&Lzv)N(X=G?p6s{iM zd|(!7aDn>Cd*R;>jOiS)>EF{I2)8nUVL%vq^{N`UjRLEeFZAa>uLI_lpEz3-9(w6m zbRJ(vgeIlOHy&W{envr20z@!=p!T)=or zW_9!Ve}H*d;Pm*G!T&SB4Cur8)N$V@9kec~6c~t1vHsKtNB%d4fTMX=bBMUsK)3+& z&Kal9_hksUzQFwy0?q_nuK_*hGsVvw0&W0s14F>|0q(LuxB&Hj0&uegmSP%c zeozPd3}Bwq;PmSK>%bh=-~#cz1iqud>>9}P#)9`i^>irgFV}v-4DWjLu(`k$2&`T@ z4#NLcz>J{3j|mlQf9OeIUK2PyzD0281ZLzA&Zn1-kqGN0fnfo|2-Mzao%3-ZT!3=> z3Apf!c({7;vw?4bz(8b5uiT~pm(l~@gJ75s%vlXikM9>?BBF!G?+fr*fjK8|RB!e8 z3UMiE8C^_*(o1g>+*Si~T;PKBr@sQzcUW*fH~0nv^Cy7|#`h{P@ASY&%aad)d7Bo@ zP}D!@r8hjrAYBAaN-w?7!)*jG9|&A9zJZsZo2h0+I)8o4ie5-&tC2+yYH+&T8Gc+kZKH4uC0nAQ;3l_f@fH}|u-)iu^2h7aN zdrt3iU>XHZFMc$vZ33okH0KL8|FeuSNS8vB(&HNkx3Rz!3mm4Gy7grhFdKT{8wUT| zfVoqH)2n|E0`t5E7igSL0N)$H{G`F@@fpTq9RN*AFTGSA7X#BOaKXy=Nnl>VI>jK>LkElBH*mfhnCf_rQ|G5XzZahbk_*60n96a% z+EFqvg#t(DK=qXJWg#$+3S6*!IReay5cs-)nK_NeFBso)U>XHZFMjVJew%>Fn$G!x z)vKMr{7K;S_?E-r5nv){;|VHQz5fK5(*mc*NA=(wFy|9FU$Fh++h!W1N1#dR@$HA( zv%qXf;$S^cz;p?m9$yt4egx*K*_@Bo;d*@i<`|?)ph@ZRZHL=vVE!y{!QwY) zu0gsCIvAe~&J%&jOXfIQ*XzZvZ;C;>7&;i=GB}R{rga|2(K=j@Z*r}^GXg%=*vA4>FL1Okr}Ge6F9y2{T+NVFcl@7FIYeM05H!9oF3o1;CmgIw$h&Y{tnE)1Wu2y01jt> znMD;0D%g1WIxvR?PLJ;}IF17I(3PA|oges&mk$AV4w$>H;<#Yr<yD#Jxv9sSl|d9s2x$cEdgfy(w_NN0kc8i^!OxX*fwCcRdT*a@CWJ-DBeE{ z3`C~%`h#xZEHqJo(hK(+xD5ryyn^F`k4S+EM{V9=!W;x`2oxi!GtwT9!=aoVTfrG3GLwH(6;Vd&-a3gDUqRxjLQ zY*cIp=Dm8(skZX~>i}DWL5hPWrN{Rv9A*L&-N2%q(KgA@xLjF09UlYqHe z;DXiD$ANjJ2flm3w;!05ckpn7@!bZ@BLYY0K>0`eSI+|Tjs~Zfe;)wzZw)RGAC0SL zfwA4`$rnAoalp*f-~#d84!$&CjtiVRE(GW|O7AjAc4$(1>3tq<^}xj5&2j3u>eK&G z|Fm6Th>w)sJ%C-n?GaeLa8JVjW5C?}CmwFFd6V@X#1ER39v=;XlYqHt567wN!2sz< zy_aJcAq>5A%m;3f!0LsYf_}{o%tQBcPIZ67CtNg3Y1RY2;RgP_#$4bE1XeHHW;k30 z%tsG$&S2y8;D@l^4oymr?`6162Ii!|QGE64sp(;ZGz6NI9-k2oHeg~O;kaOY^MEN5 zI6b~+5Y}Q~`aRk+-*{k>1Wu3dIQY_m8TnYxe96ER3Y;F_r{G%%Ov2+m^OXU!QsDIX zXx-BQOzIOo^Hl<~PT=(TegxmOz%)F``GW0V-3H7f0;k7!DGKyiV2(V^`PB7lfPN_P zS%Z`fO-hfi9d55Dz`UZt1?qP%MnL<4 z`TRK^KjPQpYknU03ZO~p#qV>t-2u!sFK}G2d2H^B*nfd0rN=i54l9AV?~}AKV@|=eHZAulI6XuzAGEH?dC$9V~vt*Q*2Z+t)MSUHc8v z6VSojX}E0#X3hH?7py;c7nsikPLJ<1)R$Ah9Q-He8x8(I_5L&( zV*ZDihn?ZLzbZJN@q8@oxBS2{5Se20b|2h$xI7#JZVqtohkzReT-1*}hf93Z0^tIb zM-y-^fhFcZ^{*HXZNPkfj)$$zuLAJx{>dOc08L7dZw4Hm0_Lmp9H-9zeDaU-dDYJx z!w6yMt&esAw?|<0!d(N0$AB69E9X@Eai4IfA)Mz0#w%PO9L4XyA>e4gdC+g6rDH5` zi2|#aj?2N93QUa#r`P{A0prr(0+lbtuML>{H8?%KCxLlQgA2s>DEK;oY51L|IoSO4 z31D6oIKA}FhQk41!e~JXrS2d2ln1r9Ck2K9VFYTIBVd0t5H3J{{u#JF5;_nlz4(R0 zVGuCG3>>FdpQ&EmB`}N-hF*O>0^A9K)eH9`1lI*jFC!1P6nw1QeDa0%Z%V>B#w%PO z9Od8A5OCBV?+5`$^UU2L;HVwm76OjS{gDuG6u*~4z|lOZBLp1H2i^?nGh!AiT?t~CGaVKVaiL zzVoS7di~WEz|9j_CEUqr=@}`dxh1*T^Jb3BD=tedDj8|>vMk6=%TLKmFCJ;5P-d|& zV`1)+I&*PW{aX8CXOq2gac#|VeAD!biC0XTF)3m3hMKzgD;DDmx05O-t!-MrV)4cX zd{uT5zU7)A4T_?U+Jtks2&s1@H%H{vtZ1xns$c1_jVT&yD`;@ktgX2QUrM#5)~{`- zsl~T^g*rQz3uoV;C#C)WTcyM&HkrrcD*jBqi9fe@@aO9D?AhEhDMf;MZ{P~{Z29ni z*wg;EztPjSbWg8&c%EFJHG`h_?H;xk&*ZP}in|ZbUBmai`T?F(FaL2(WUAEs`HZVO zQc|ToM_bFMu1}Q?=C4}2_wiI|_8*pgdF6@JNzpb*v__@*tcfusF{uP5F_~DH zG^(1U#W1g6(lVHnnN$UH0+Xs?(rnEn)xx}-NewVBW0C`=jY%6}(rVHq(Op{F4>n27 zFzIHlNos*fXZV z!)s053e>n-yTfi1pM;K(=u_jidZ)uyztVPPUapOORXIXR2egXnC?krHO6#iZD{JcP zRkk{Orn;%2a)sU2&pxvkOORPStrrNHBB;a=~>SJyczH!7}q_OLXKSc$s&UlR*ZI3N)m&ru*w#7MF1I5cD{YmHtDI}?b&e*FqvPrZ4Ya<& zjx<(Lk{ZQF$C0X)_!u+~D6giei4wk|7GcxV*;sqEZFwV7?4h*dJO9g;#t}9-k;iP_ed^C=0~_Ikys@)5gc;k&zC3Oq~)@TZ2!bSJn~{GQFm$ z8s1d9e4bW#VI>qH6|9Mn&_7Al4oAbx$&)v1*f42B{G|HERg+PmlcyvmCQMcfO-def z+1S|Zs#sJQt_;1xjJ-|aThEGjOE*)^;#GMn?px1u2iIwH{Gs^v;x1F$on*5kW{Ty7 zT{P~bWVz0t-@e#t+}d?KE!Mcmwa?r^^ZPnz8V~tbOnWhj#y$MX9Xed{W2D0d$&d7; zN=hB%YG{*0+e04uDR|S;Qo`?{pepJIv}!Y60!L0cc`Snaf=%bGZb8b*}VO)D8%U1Zo>9(eaqrZk9Euct0Jzxc#T29g%R~1dUDr63Yi*m`yOpa5zRPw(*Bx?>cX^+_E>@of~U(TuQE= zu+pJ=mEttBZP1FVI$Q_4VaB(^FoXA2Xp=M#W;2suNXwuN(7i>!lRLvfHd~vukS!>i|k>%hf5SaskPnG+JYxGn1$%wlgUfChrMoUcwt3 z^;X=K+5wkn##0Gxl9FMzLR%&39hO1!*--W=9O1c?~4)x=xigKw1vX z=Q`9)Tczt@E@gJxVe;5RkZvYJqn>~qu$hF^p4e#Yr7-1kTOeZON%vElXW4BOJ5$WmVuXbmA_1*zp1~!&vXs%2|7;x}7l0Hlm6gkzVxwBSH}!UPU$mw78#HN< z(W$hab556yuMwOVKp82PmA$rgK5fJYy#tlNQbZ^tvbEj4#q1m|M>79%hEX1}KorXO z_lk(5u-czgL~H#>^)N6{wf6b_Lr2`76_#7cFhuMFCZ~OJdD(b2CIY#)R$@vXw_R z-&iCMVUd-aiDtDl{s@cm0-pHd)sego!sR5~L7cV-$);YGnxjb?1@l8DWx?cCgZc>W zx>|LmzT+RzR_QsIyjn#X6x>CSILjPJoMluKfVhed3sTs~WKXJX;S#$4C>i5>q0$U_ z_dt%`-2-x#sZU_Sn+5erKI_bHJ-4;@>%`naaKF)-*X%8|{@2`%ElZ zCMrueERe8PS<4n60g!$$u(FvLJ#qb&9;{JPyICD6pXKS1&%5>+Tf4opXes4Fe0%FT z`CYfconmySn70fpln;nHV-&e3ccSi?LCe!j;~h`)C6L;otpwvASu2M=xUlzb*37r|8j?UWsmz>vol6p;>FwZ~y*r`7PIpu27F~bTQ0!Xe-Ma?n(pk zZ_p+-Dd4WPc;{)?6myfq-hj?lV?%om^>tX1^Dg)<_~MGUwV&}4E|r$a-^%^V<@4x| z;?E=<+>{j7?#?i-X`fIiXPDI@FemLtFPLGxef*n8&cj`s`lS`9?n^q{8D`le=bPOb zk?`%VHII>pfMU)26VR5U+_}BbcdGAJyqlGG_pDxWf4R&|d6pI%?M@pIsdK{GvnPVXIPW=JFanc_jg3Ny8AiM=l6B4NjmNrvASF7i3Mdb@X<;EMRi58Nb(p) zW5kF}`rQ#LmswYLmlv@btpr^Tf1>)h_C#fFnhz!%Blq~-u`&!c63ic6nPcf9-`vr zvy9246R>fT~~#>Vq0H?7b1+%$7?Qs<_xThAeb`cN*JC1)&O&eF`1 z=Td3+2P{o^B9|(buxvUYua7P-ELAcC6P454h1LK(xl})Rq*bhCV8ER~IHeaW>i znq>lr$(o)M{#ct*^JG>Mhsa!BKuRHNdk+&QjIwYwG47>2uBwR;v4 zm9AA9RV5YM9c*K^vZk)dHVRv;N?iJepd9?YVPFA8oNd zZF60q)|BSx18vSo`hL^b=pr0Rd$;GpD%W9l%uh5sGUa459?9iuJBZ}DTiX3$Mj6X9 zNb+u;S@X=YSx$*;yVju8n;2vkD;26W5;ES*Gd@t2qg>?qNt;VNpUNTe+-ZbF)rT(z zIgaM79Jd?Nbe4-{m9=GdwwJ3n~^Z2v2H3u6@-Va#Z}e*7vuRmC6$lrj$~SO`%BevlSf6 zxZ>`Awrw$#E3(|eGqEH#R?adP$<}9zih0FriKXEYS^JY~Uu@F1n_gYIgat7Jwmc(J zAn}aIrm$E>(7Kwtu2)@YE===W6WavIfJ9XcOCc$@enlm1bqA$9R8DoGoFoJ4y@cg-u2r%j^^^0Z}n z3AR-tF%KHZa)fo+=A{*jAsQNGTpW?I9vI|4*Qp#VVmI-VNEHvk12b^yCAEjJ^#T;~mrYyF%9^NJmx z)F@?NXLP6@mEb)w^G%N@t{#jMd&NdhjV|Q*q1d3)Q?h=(P3ccRMB&QCF)1gJJhqji zjH{xMQe&~v)$$}9lTu@xk#eyusd$W~g(|PYixQ9a>%HYvn`>W8Yx|~1)d|I>coBi3 z`B+)NXh6|wj8stSm|zs}D;LKy?}`shn|w+hy;F3N;>_Y?4IU?CEzb)dA~`h%kuH=! zWdZuvKu?jNKL}M#2aq@C97w#eFNX9#tT|r`X*ZLaA>GU*s)ak5bU!2-2dwOih&!0w zo3NuE&?+5)bUm~C7bF*xeuUJ_q$rrT;LR#chD2LrR*8CmP0TePW;5(eQZ*#%DXfwM z($&oMCYbA)bT7;%CjA9w1C#c{tYs4JKuR^xR_Q~S#AK4_u45IG=vEgW4e8zycbyDr z8FQTliRVTdq$SL*9MVE2Er(RjBqt=!vK12daRa0h=6VMt?&Cp7+{bf}xQ~}1@o?XU zw1D|I3W>9HLE?VTLE?VR=nA=CE2KQ;V-zIHIjb}k674SFKpD~>nUo8O@(TybkZxd7 z38c+Tx)Rb_CM||!XVNlAl}xIFL?wYzfRw`|`q7olq=MzEamGmV1iH6i6GyfTFU*WBpp2mtS^n zOg^-P4YYTFF-Pl{*l;^S3u|&T(n%}ECatYF)17IXn9WW>9anq%Qr&xS9u>Dr$77t1 zeST$rgtW4tqR6QVCwHEmhXz)j#gL7C(_z!^axC&ZEPAXKgTfY z=sSXD)HYfs+0+hKeu7OhXaqjv9HjJutf!)RwWEXP(dP$QZg>Or%6|+#bt|gA#@DIq zecspOT~3e0_!p&xE%kvFsIYJb>*}qbF{UFnbdoaO$Ir!zAEy^JT|UGh>}~lCS_Bq- z-j*LT%P>nT-Tzj?Ltv-&;+;j>8;_sV_%q+)J@+fus`d)N8M4J)-J)x`(5uKCPQR~moJ=8x(8 zF_}Nc@W%-L7{(vGR&?=!*;6nG3iIM9*ZJNXrg;VTzwm8!oi}e7?d3aYXwj%gUXumH z022rwySrj(S->LCXOnU|Hd*CYV`<&6X)v}~+KLTDVVUN_az6XPoIqY{ZarhUk+wpx zx4P!cgw*1&lcgSazW76PSQ4!euf|^9N#G^4#YganFOd10zhe>oVJd;UfkZ4+BVuN=wldgl^Y$n|dX(p5I zgEXB<&qBI_NpC`$#H9Bj(cf4$Nnb#^oJqZ5j${(OU&Nrg-M*au?CYSS|(`)Ok8h=L^(!3VlYYTApOXsjgY=&5>2RRx@MAY zf%IP{(S+(GlkSD|C6gY3^f{CM4Cxaly#VPblU{@L4<`K`5_QEUi6&X^GU+o&Z!_uN zkUE)k1`_8pU{IoiZId(@5-)vPjq*ub9;7?qYL(WiQZuACn2#GF@s;qSkX~VSFGHd& zc9ZlGr01A)3eq!7`We!bOzLCAmnWDs6w-rC8ViZ0yC!KSB>E{a&ch+CL2NO(gS3iC zC6FkGaa#})4TQ*hNLMmx86+wllT-yMg-O+rW-zH1QaqCyAkk#lBsm~a4KPU?Azj9# zO_17I44NUm%A^)Z&ogN|q^Fp4BP1HtOwuk$4>4&sq|uD!Hb_)MP10SEhBLc8kcKho z0Z2ob^a!MZOnL%ReorTM8P*#$s0jlrxL_Y#}NYAt7K?aNY%vQy^erUNW#WMHK9-1Iz~G^%N) zG@5=SIoc+T#)%4DaU_vu)9i^`naY#h&ZHL{!qB5In@qX|$q+b;!P7Rn$zHpX3Anhp z0#_I7R!wZGSze2$w=I9G#2rNn(KcGWOUT|*HN z#))dc9&3hLQC(A8#iU9HRs_qP4m&5S#O=r?M}1?Hmv7Y;UQ!EkbJJ5xY*KMSQHfNP zUYuScmLYOTT6iF%hX;M0LG0sJl{aU`KABieNN03HoAlqA` zZpyP;8~=XNe;w6jxG3OA`p!{NEH94T6yKioak+M$@7XTr6MXEpu^l(h<{ItL_E)!U zanO%rFHCF7%td9&KJA#Li}*&ZXH%QDvUyKh25AFpueFePPbzMySJ`lbRa|<-+6PtI zUTYUOZGn|&UxM~r!^HWI12o~%>M_cZ7v^Km0cAAoDres8Jok|No;$*wV|3@3-8qr& zoG5pW)twXV&WUm7*xWg>FIT~XJIm_MigstkxU+2Ttk@2;RdH%L01^#KCMgGWU#M74r^^+s`VgFWv}YE93k_=vv^gaQ!H**u1b}v1VLIw zhDNpUD4%m=7R$pC^WJH;W-%gE6;uJ4Rr_PK&`@`39P4p%z$KjB#OsSvY&+*mh|LP}qZ$ z-yn=L32#xY?VEeQ#7aNY>duUIXWHDEG49OR`1Yk8W%7%R?3}~G$T}GnMF0oiOFLp9 zP|;f11viS1mE72sdU_fqG(M=EET#yIih7QmWyKNXjBMPi%Cc@5Di_AcB|Cm|7e>j+ zF>R6CWdqGc=<;MTYrsCXxNS+U$~GSl09!sR2x{20bM9ElF9$g)L- z&%+AUDuvqS9L~}tpXCp})Gg{Bg5?*x10m-}A35R9k9KFo;J{eUh;h%_g@b7KmMC_{ zn{Tb?SjujGP$7N=&3_4TH_L_@c)yEDb0FOb$t0n@pc7wV;}@xvLr6MHAcaE|_PmXy zgzkH~PRG)r-qZm5;nM)ZQryx)a{^!|h)c7Bi2@0rCgtijT6P}9do@{>mny9(66Z&; z;yyEZRkp~-dw5umaGJq^eZwCE$p^7QHXcK4wN%w~HRnfXp9ASqT$|I-mB{-_bfDJN zmxx;iJFvjS`mLqiaWU*8;}4DBpY-l#%MNSY_8~h;;tUxnE$=(e$OmBExw+2)lSJKV zYzGcx&mG9<7H<^jM<+gE$!2$g9sN8ny|2mU=Kvq=6=}RSf%54nd`+cOBV0gT-G4Pt z;p!N*ZeX3crRo`bLax#5Se(_`zV*khQV(m2bHqodKRWc$w=DgD_IbHK@^}2fuBeyk zHXDTS<40enis{Kvk$&uluZ}5F3L?6##Aue^WQSxsvbwXHe~xqf)co@#N3Y~vJ0iB5 zljpS@a-KuxnA-{sJIu*=`+5AEIDXz@+MYWrT<$ESj4SjhSXXx+%g!UpBGtFpUEL9u zoqy4D9fU~pt?2|vyP!?%a>}c${+8mMHg2(wfz-@gx5DI`)H0-(nCl-QaohutXcfY@ z#A!Wel0H>kC*%Ej=3^G5XPHEsxXnQD^&PEhOl-rO^U?Z_yFLI(FhhER;XZ}Lag*@= zD6>n0NvkBR7+`W&TA9+OG+%{rJ9YCDKjfj`f;g_0M#W7Uw^AB4Zqhir^lkOOwm*OV zOKQvb;|zaGiIcE-NiPy@!}Y;4Op0XP)qQvmmsqb%w+EDNw;&Ri_)^Q_&+(sexUM#0 zA5C5mnVjGHzI)vmhf#j3>r#0^bnE*}w947&Bpm~i-gWfjwqMI{wH|VIRxD-RADvT> zGKe1bO%^KMqAM=L_!@sMzCHd}>mf@^JMsh<+^ntdTUuzh6%QHoCe8IzEsajjjs=9fy;0VjPE(a-uCQLqO^3HaN#5 z{e+7YSC47!-h7GNIHvX7<{@&5Eoq+3+5e}{e)=@&!lv6TH=RPX-AB9fOj7LAuG)oVE?tRM#BIc_yjT5rKHU zghtT4s3WOsbCmr3_#elADtG52Bb>h^b!~|p-$mDB@{kkGUt};{V@>+WF+@JxdPx4z z@g@rCb;Z{CUnIrS@(b9I9LIcloss26(pl%&#Cb-)Bwb}oTBs(;a$_g_Z5<+KN29bY zNpD$NUVsIAb$*LTVtiTDp~e;IV9RrQ_L9O`ed}Z;?>Ze>TuKFh47a-8b>n6%bR@LZ z(vlN~GW*cdGLN2bIr}VKf)c_`S%;irENg4%c3l`?x#2BPT3)!Gn8l_cN=hWe(n^O^ ztY|E4pP{%|@mShuZ-Ez)rIq#ycrk76SFv;n^T`6)Qcq*#QrZ)X?4Z2>iS4syTXA#5 z+Epg6i)lSaHq3`3Mn0UFVs!Lp)_BmH^Sf6NbE(UW(s_kyEwXAL+4qyzQ8h7PpVo?t zULc7-)@8)VAI-?9svWrCx)8PDO3Mo`z#mffJU!%JP_FXHt~|LBfy=)j)DKWp2#((I zpf~4tuZd8LtgNk|&?Ct{oQ1k6O8zkZ45k~_)^nB?+Wth=W+okX#>oY&rI=8=k`N_J zOE*ds(Y3UE&x)2B&cBf%RJ4>QSbiM0+|^E5L@kA^T)&4oW0H<;iAE(uga*jnN#9vo zUL^19Vd4DN^=p{(;-r&XE|MDw5Vb4mTT9Dsk2~c~B1Lv8Z%`9?gSuSiwQo2tDa(yj z@UkUJ6B%CORH3us#MT9c%#W-hFrm0-Z5vFf6Frv#H;18$^l!R zb~L{Jyz!|`uP>Tj_W!2k?fhLtbTzhdFAH&l>f~S9&NdG`J{qSPBX%Ts(7HDZH zgh(x)T4JVR?fh1gL#W$o^mTq`W9Wt7*pL<~EC9}62n!=ERIe=5ppQ_wO;Q0Q+NCo| zBhgykXVO?mN0_t`mGVO-ZG!Xj2~BlZ>$y#{10A(xtHs4q z`79Q6Xopd3naxsAfhEHdx?X(P?|N}(hH)U+aQJ~)c_jZ80Q}Ph+O3foTO-SP9*|X} zdy;$rwXFl!tCw^z&Qb77!=6c^)%hvr&x&|hfs+8BD}3(q>Y zqGKEgetN|cY zP;Pb`cgW!=yks|~-}IZ2aJj(jp1Q4@znTygURG4kzGr21F{E~AtCS3ryHXqHu4Rzg zp{>#qm^|C=ghU0S*6h z#)0L|T-n4nnHHhu%Ep&m8&Q-ala4yZ%Y89NuI~+G|XDbJGtT#b&!{z+GSkMp3+h3@GJSF2A#= ziZ*6xi2y4Vl@(o7%WuHZ#D&J5vyiEyv9$i1B&-lDt)Gy)iSL*tcl8C-+V(&!Eb)UP zN*P+=NS3-7q$!%xRO*!`OY7~7fztIR+iG*>c(;`dv*^aeFJy2NvLpVG+w9JwyX5Yy zNOxA0&%Pi!G^#LNqY_Qd5$f+`@G}9#smSvi0>teh>f{jT1@eB@$Ke`1elcMDgKT1L z$V7py1r^V{osf8apo_aEbkHX00Z8r8R;df-SI{QOfE?uQV^t&D6X!R0mF6*&iVZ4E zGO#`_3`F?d3u+3shAb^d;3R%KW@(|O#LKsM%U~+tM9cq0-Mhe7Rh@bNJINtAK;Q&8 zYSgGvqoSbFhPFVWhC3=?AO=(}@m{1>Eu1505kpTh8n!S_FEeeYeS4YSX4;vtm$9}p zt-+wtUe(^PXw^W)h>iRNgoFXhjS1ueD0u(MPZz%B1@aWK98Xrg2Bl1R&u})VmrvGKTD!#f2ERSt zSoqg#RaT~`_XO2ai`aQU{_H!iS@(9+i%L6Gt*GR`B(_NmO?k8bSV}Ku{q|+c^EXq7 zdaC&x1a}<^x198$_pzBSS);;58kmk@>2~<;^oyV7XU}N%fXyXcR#DO$UfMU9WwNCu zM^B||hHW0lqB^c;NvdZ_I^1P%TNH#7#5^oXlKxz~`5#@)4i}}vsaqt{Uf~U*vh{hh z!Zujw>rD@3x@2lAVWAVIFHYr;frZA>{Vf~HLixo?LLJ37nP;J_%LlX2>~y9}^5FGY z$oJ3#1{*nffwV5jCpeqS;PP-1&%O`8= zQ=HRAP{SVYB9IhT_H=@r=XyZSbDHmVp3^D|Plcp{-TdM|oziGyvEz)zOl4zvU?t^9 zuj-2!4t~3d0L;+&X@~RL0a6*B*Wj_3-G;E*guz5uVPloSoHjQw?)h5S4p)60mFgzv zf*C`(Aos2}$N{IkZbhF)MKhReqb|2nmvaNSFLT$eHf$>`%rLn>4JvpIYGmg%BaP8( z@Lix@KH1=NeEZ!$fQk~r>qr)8kH^hmhAN0FRvb>UIxb2Ubw8^a7{TxPJ2 zU_{pz9-3a08x@`~uh5%f$ItIpH2wCrh1>{J_n`k|Og9@D3u-nSpC9gM+S`-4t!|(y zR^$->7k@FeE%n8ony_kK)80)l*r=jEwMCi1;42a09H)Ty=!+}vr?e_3QEzg~(H1p6 zZrXR-g^7xIST@Eg8~b|3-ga#4R|wrFy!dP6;%nr>)ZiCv2V|5Bdeu{TXE7IQExO`d zOdgbri+DA~KQ~rgPm9YME3Jp+$X@vjxkzSVQXQp($~W^afBQU;kCT=p2oPMRFRs`m z{wB*26*n!cVwUF329>YWPSoT5G<_l*Iv` zt43OSO+GO!S$(41i+3h(oyl9W!Ay`-cVU76hxsFFu{)>JJQT6VC! zvG;4$JRKf<@$(uAK$uo{nqyHU&*!B&P=)$N5X;-C=AgV4*MfTausworjdHX6b#HR| z8`t!_KRYi`Mn;lI|Gc!CJ(Ikzou$RRq;&PeEFSVKCF>wqwUNI*SF$!;qa>C!+IKO# z7g}~Bv69E>0JHM44dq95(21o)g&<5EOt^}Xn-W$n^GTV9HXknwrL@NE7m?AC8Yr^_ zn-2GG`qgSgCrRq-7?Kiovcbs-QoTyIby{A-FI_P$bz%|AN#bgKlq%|ee3%6#NzJ~( zhIcxzo>{5>auG6oprd5nh$?dhNmkl^w_bh?F>2If)rc05IJL9|R+rM!b%|w&SD=#Q zMu|X&PEmN@SiYQ7^;0j>6+d>lJ+?#@tu0ia=2l@^;9IBI45;z8)RM$pqH^};2N_GS zET#r(O7(cXU41l`hISTOOu{rc4^4!Oorhp~Ve|Cmm^Q1M8gEMz8aCfEP~Lb*n(y+& zvjy)MOFvQ*Z9cau`@^P3I+Rb8Uj_uw(p#pt21y2Q4bwrre6qn-zGYO%n!BZ9U8?P= z{K#a}F|KhM3@)R}FxW8y4K*IFM1}KpLhZTht%%p6c_BPID2ZmNmKUZ6xuxNfG=1TP zR_wXU2S%xwu9hB7g3{tMyMno+7&5Qv51Ulz8m2$UMkU$zf*%R;f*%L!<&zD%`SybU z9jI7v*{!_buD`Fff-@neo{%1(BRm1y(52SO$hz5Hau*bC!+Xyhb|zDQ=cs4cz4;W& z{M)EM>%pnN-ekkJT4=R)_3p+#D>E8@A`6lKK0nDFAh=0iT;HAr#YiML^-lsh^-l-&@^Mw!sjsR2BK7|dzjVcHmrF{T zj#lwgz0q#S!p`c|ed=6)X8b!Ir06b-j#VmLu}*P|C8QQX$xaW&geUttvAV+kvds)& zQgCxxImQWF0(l_SrviA&>f4I%c&j3F@p`*9Cz-{J=o5KN5@)&!-1XjelV~qH{TxyK zJg53JCwf#qtXXUhDcd|j{c%gGHK`F2~w}(#kxE}H-NnUZUuS$Z2|T2aT0$Fq$?(I!HPe07?MbgXn;FdF0S_BgLzUB zZL-~mBED=Bg%&%7=C>zQp!TMRRm?Qgx=vHym9(-VS3Z~<)9RbEq2=ORo{BMx73j%U z^<`y=W(cyl7{Ddii9{JFK&255Ju?KLB!~0fK+f7gx-rcUr;CDELO0RMCfL(ruPd z#H6Pglb+~IdJJQP(V@IF4bP(WWXIE;lpsK$+SV1b=zEi_8jDK$8;h!DokeerS#*{v z;2f`jw;sl#sJ`RHp}`=I{NG|w&2f0~G(vN9J;-ZuBgkt}D~NjeIC(z`(iJo4-z9~| zcx#Jk&?;T5=PP~rT{v$dO=(Qx)e4<*qJ`z2_AVS@jODdJK3;v$}1nu1LR zYtsEz+n^tXB0qv=MYiVM)ZMEBBBaB`x#ew34xxipQ^4BrW>z~;Xp6Tz+9Aa~78>`> zC-r|KZ71T==xq#S4QU%j^48oD5C=zQk-D4ipEpsFR`*F~xF<=YUV&V(V)(C?#^FU> z+0%M?pCS$|>c5q~boiRKxq73-0` zR(+u)15Uc)r|@HR$)H+QbMjghNB*8qWw4y@|FEK7m4vMYJ;=x1%4o@n6Z1WU>57T@ z^+DwtrV7_6b}YZtb){FBm{$>}QMsB=Z8l@e$prW$&N!xS+Tt?sO#W!%$QJihxcHLd z4OMlxjAy=%h|!NaUUdl{77Ot0rYadqS6G-P7d`Ao&;v=4?%FB`~%L7A3Ha~f_EL|DxUG|mn zBAWX<*I#dvtlh9o{W&9O8Xtn7zcNKC9l08B!9DY8(Iqs5HomiFPz)PER2R4!ApP9( zTMO#tlVzVp%<>u(K5ciUS9mihF7S^wj+d6EgJ`z_Ah>I zU4MC+{2xws?Zq3motdwLQXUvu882C8G=^kjggQ5tnHKpw8sQ8YV*7f8sL{O`{)uT5 z`K9UDa7(-h5kD$PHO;ME%`k-t`3qC{w2Xq&J#$mcvZyS9-(6AHR(iKCdZ?{#bx(Vp zMX^WYb^oKo8eg4lOaH4qHcQan=%t3`P3%NaHH=jmOa%4v$=W^z?P;tu3!3xKb==Vu zQ`VLWjNoq8=D9zLpveZG=dSM@_&1Q+MrH6YsKU^9Kvjkw1s$@w`eA~0fzozY3kUq} zGYR?yNQ_@;v`ZO!o-j`jAC#B0a>B+%wwq`6jW^vggWX!|^Ecge<2w1%*Ty#6j&~Ke zirao%xa}nwT{H)&5y3%Y1?e&DP4THm3{?BdmND$cSKQpfzN-9j;e4hzayKRwTwJDu z(HqC#`HRE(wZvGItSLwhisE|i3E>9TV)a*zWeED4dX~3N0%&~(*|7>fJ|40nhx(% zt%^F@8yr^Pa6G*%bBFx3#LT~*f@Qj%CYoEBj_R*aDXon7sssjmcJRey*~Ht&$^e}^ zj`3&H{OqRFeN;o&5Jyxd?^A8rC(Jtc;23G5sJqm9xq+vHD7eA#TCY)EdZBir8XtPhKoFZ>ch-flf4Qsypa-3i0= ziKcutYbazZXkKM9V&E8bZl*=b$lA~-?ws9}1q?I?ux_tU!L&)h>K8wc33j&lyU2Mq zp;q#{xRi=VlRS6y-A#sH_mY-(yftC<-OiiqK+ch}(ENr^HuxvLotst59;Rw=q$w{) zmn7&0(6jcernP;7KwGjL{So9XrW&^Ow`sGozvCp3_±1|4Vln*uu4&{WVdhNgk) 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%0Ab#$VcYk}r! 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

    6k@xDId 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˙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�U_ibC%+fa`jl;m-lwaDhpS)?vhauknyECkz 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

    ewxAxw{VYK}g*#cT9_3Zs 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

    eC`A$LuTxx!Nwbx0W(wJjQB-INYVme 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 z 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

    ^D6*oS7Omd6{egC~)i-VtJIn1i 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%0AHDbdam<@*Fp)hP8rpeiovOTsasSz26VX(g! z8xt`&okL_Ad-H8Z>>zgNgs{6gm&}%rZ7XzVuNg7wOQ!;5|t!VBN5#aJ0mTF0vQ>dM;Ci~DY0uX>yKyR*y3;5%qA@RUE67x6l3EO znTTi(Jtj<5*esOGg8j9X8(|wNTPUpRVyTEG5u-e?_rN%hO&8d&7$0ZYU$VE8=4eSz z+ZJF%gq1GfkEAo9M9{a6hHvgtDs=T2XSgax4Ek{XBNodI zW<`q$Wk>p1xlXjSbu8uChJMQ89J0tB|O{G#9n}ut1UREjuVICF0I9&IB+A5L?TP)RqRJ!Y44>$Huia;YhPh zaa_XviI})(fwnO0rhEG5h8hEtGW)0l~4=Hmpc%yf`IcZYe6=FbD)S} zDNx^cvPj3r&b?SX5ltlgY3n#B4`GzaIX8?6lRR|?b2$(DgflrD8^Hk%L#aSJfgiT* z?A(H_P+~5D9Ub3v=$cO{$zoBA;?6S!pebK4!GO zUIJ{ug@Gdgm%~z}vDsR573{x7TQbTjfL*-;GNsQlShHbyfKduPL##Slr%jl4Va}fM zhcGl6MbzfQVzy#i!PNvJ=7`xqFzk|C&FVQI?Tl9~>rb10Iu+m{^_xOOeY>G%qX`GPofkjQ~Wjq2CtjLdh1 zfs^En>@UR*$xH%Me61<06|*dy!7@)WgQI{Ni-=HbuVJrUQ?RbzMKE09KrNQ{EyLBe z?gCd1#T;EM%xdeouw)xKS)5L#Qt=qpl)A8Y$Sz57md&3?1u}`)IS|E=U=YRnPy!|~ ztj+~}5t#`n3!6K)ZpALYCHkgIxqSo61Y4{Tv1JnL!I&UV5K)?`up!nw7eR#x(@t30 zV-v*`1D!p|s4t8CsPPm`(C3n*X#>DQE=)$)?1bg^KdX>DGn0(vqR=fSh-ehj6j4xX zu>cnj`mt<2LCi9R41;I=kx&+j)C3X5bPm;;w-gczu|E)xCo!>_Af}PoJ!V^iC;jPU zJPk$TTw-oDW1^U_fn{)n@0?`0kJDjSQ!SavSOGJ4M5z+@ET__a8c9wH#5p&uIArj6caWFK5!)1R?m&Q3i9LkCYl5wMu9LHI5j?jdQw&nR)!#8Zb_K=XMmIG@;=zDV!mc%OX%-E6gFG5+ z1?Gr{u^t(MK~0OP<5^0lds&SV;NMIH2S=mW#9}qt$m<03O)nZ_*r!z(Wn$?VPR+wE zWsNE)Cg?Nk*1$B2Y;tBsv!0nn(!5voF)vKrNAq-snCjF?=>3kK3b94fXZ zDRT?vFgACT&oM4`Nd%%W9YW=>Y=$nAV@XT$K!6*$tXqX(6$-TVnq3K-L2xc4jU%wW zh}hpmfkPhBv`bFi#AYZ_8SVRw;)rdwSu8xKxoK`ocMlACh-$?hUnCoh(Sckr9K8 ziJ^qzUJwy;yr(z?QI@8?UTEaD5z^|*>Oa217-l6c+QqNWXZ6aXVJMr<1TnX^+|VG6 zJG*c?sS{hHFz`?WVt0|nAcPfN+=P%xWT3B$V=JOzEXP(jh3DNGU_&wCGL;{6A&5b2 zF~Ff|eSAV9qOVz&mF2K$@9|U(aGWI*4_QsvqG%>1$UpgF<2crbK$P1hEn}13D%dr? zy$9RIaU9K97cGZ|g*a`nx7M#tC4w1anP8E04*7zBFe*QS9RzVdmX)~=(zGykp&J;> z0H$3|P7;mo2cuFFmPDKsgLSEMA1$@SEobLg635|uOlNaA2uDQg%$n1ua3G95UDgS0 zyWH5n8|Hesr%XQ(U?z{v-H}WbTN8tp8$~P&!(wxWz4<7xgNY!{yGN{X&SD@4nrXty zkU@pP+-i+)NNGW6T$0eOcts2iw1(-~QY@OSg^mp+KzJL8(N+sB$?uPc%8e10oho8e zu@R4pgSbK=nZq%?@k(K(27-AN8+rl(Y={$gtDL18{XXmyN=DIxB=*@VFhj9uuNT-v z1K3!~8 zCVGqBi*%I-D?_PtCY!*)h(A-}po}q0w}LTj)T$I!KWibxmC=|`ms2^c)`ejss1y@y zL%Y8w=d4lFk#r9G^0F19N((_rR7|>E8jr_Atq+lA;T_hFz12d z8qQ@>rqXZiN`|=8v4 zG_3-5Jnv|G?Z!`3aEnbA7fEEo8RHTF&Y0;7H;mCHqf0Q5ay=iYi+ zhV;rrD`37HiYKxGt6b*(R&(2)NuBGovU_5k)}~2_4pB}W69GnYIP?{az+4A4xy%$p zU&9b*A$McfyU_s4a1Bl{6o{sLy<2!|g8hg+S za3CjzW%Lk)Uzzl+H@7i)ZN9svy=|+!z|trOj#Y-Exbp?~bDV{aoCNulsq>dKEcaU6 z!iELQmn>{pxNNb-6X3!H3zjZj>h&&Kv|vf22)cD@sw$~G*nB4K3*cK?igfd!d~V6( z;t0*n#or%H)8DkeQ{DP~qsGmp2M}~>9G*{c2j+3z%MyJ(;5~JU@+^LI)%bbcxm&IG zm(t&j-|v7krr}lL-RCZ)cN_etoQH2C<3~rlO7so@=Y9)bIeOP3{-=O5Y{9EU?`hz? zWWg&(Z#(Gy7jRPN1Av<-e=We-X2B~*Zw?6T2F|BlXQ%f?;QWgPuN=KDkoi7vu4jeA z;p*6m_2&o9Y7MVadxRW{vK}~}^9XXv#S_r`FfM6Uc~LW5C3?K2`;)+VV}`_I^;Bw) zeYn2*UhN9&O7wWI{l|dwzj22#-9+>{a4GRVUQ7&EiJk-W?gq|1`1UFtt4HL|@)ZpF zUya{2_-dEc`P>V9<@i1cy!9GxrF6HWp4)-*gDWLP{wbI4RQlIjQ)NFwy5sU!1C;B^ z;aTn#CKZ-%0q}epZl(Nv9QBd_&M&TEEP0c4rFL8P0Y!=8M^}m7RM1-uob~LWaFg+? zMDGxA{zk*AM2`aQ%fP9-j?^ZWL)QUkg@#v&-u0jn0?zH{K<}f#`P^CPZ2-Nm0H+Jthv2RL_Y zc$Mfa1sQ&!=`jrt*{ztr7l8BHS?CQQ{t4jZ7s&iE-Ad&>0G#_Rc;)KvZyXpGfU{(Y zq&H;(dLISO=QO-Z<)!%f3UEd&c$M<^L*V?vf>$no><_;N&KnlIO7ug# z>MZoKi2vJjq{lDDr}3k!RNe-JwQ4v55symw8v@>6pM@U9&)=UTz2|_ZfBn5u{?35j z8^HU`4KjCAC&*vsMn&0(A6+GSa}m}7oKINrDwX%M!1;y+uU!BAM=;1E!0GUdWW{$v zD$%0d)6FfxHEXZ*+B~x<+<=)5H(%)`FWxA=EukpO zf-7!`;m(CyaCJb>E!a(piN~Vr7tLEXZ}}~IJG&Yd-GV)8^V;U^>fN*D7H#Luyzb3A zmMa&!sVvqg=P6T_$#wF1MY?lKPj_$kw!C-tnrppT+>X4f^FvrU^m3;ij=}UOO3RM= zv5S~>^+f;Uj)ud7C-Y(TN5!h5-%<2Ci~hQz-(B>3ivF2J|E!|lyJO#x$V@hujD z4;QK%4v#b(9XzQ%Q=D2%IEo2pF;Q1cxQhu-F)_24n5Cxb9mQB(ad~l{BY(MiF_53j zyAS=nP>a;HKXUp9pDVmmjLjyX1Ye5^XRS}&**1$Fd4IX0rU z%zXA0)M>G0rW)}8Q(ar{0Cv%H(0F(9eeFSq;ZY|&oMRCWDvK@3LQ;=Zl?9Zjktq{TMvYhLVsgT;f8->xtkt4u<#L9$pcJyztd6N?>r?zC&2dzt|asaHRB2N zAFgY9cK=VuG9Im9*BQ%W~n=;JBmB&>(rfY{GIL)UiEcFyvk6g7K*>qoo1*2=S~-abKS+c z)AgXa?ri_-b;17Ox~4zg_1O)quol*R!_i{uZc%^Y6)#RBtXOw9VBh*8D-+q?g8DG4 zlaoHlBDHP=C|BTzmd!W^kLKs85p;+HA84w%>&D?@jxw!Vj36Dyv&V`N$LRZZc#lLJ z&}Eb(qNVg2a}eo#wZ*B1z}Jqa0Eg;PLT54blw+(04a^VS$Q(rgnJnCeH#!OxIu6XW zO8*<~hNG?Osm4_O%wnqEiC-OlZr8wRC>BkpT?4e1~w^eB8) z->gHaUCNVt=C;02UjUGF^pG5%$~s`3{i zbNTa;vHX<&Q|Gw`ZzDF-QTNul1~%Yr@T6;C9sVBrv`FXxa&ozfM!3x}lvY+a3m4?p znOSfR@@p~bo|%Iu3qLu28KNQUlU#!yoh(F<%(`n(fuA+|u7Tg4LE@qa7l|Uc2LCsG zL@^E!TJIcu$u;0&5}}F<)gAx^^!*#`-fEEjAE}%sMS^$U>h#F-vAkHLfl;wap zN3Bs-0-`!wqxb-E{w+kWLQ@(3L$W)CRG$O5R%u>`imz*FRny8))k<%^Zsn97$I7XD z94pT&OdU9!|FyrERz_b|?^F&!hUHp!DC#dIlR%xSJ9vfzh3n9lL973afB)qEGao## zvj0pQp${Ecbnwh!gzR@7Jo5tn9=P)0nV)IzC;5KC!851$e&?uDQ)M2|DLx8+Qk(*c z5T;0lRPpv9*Zs@zrcp)?NZED&Rl-kDhaaiC?so}4rr^5oZaj~l!J`8|rNz<*4#_0< zFUH>tGK1(}{2Zg-4#{@#OfBlyHP9~LD*!Y6TKe6;8h-s}Hem=5zzWyEDgc`{fH}5Xrj5l7%7*nL>d2fUxmJyqQ}-qF2J!PKZ{Zoh zuSQ`*_=VriXc+0Y36S*r0wABj`-g z;WtlL3J4E{c3rwErN+&_RM`LDV*W3H)_;Tf?A56L_C7{JsxJ^83FVe$N7u{Qjch_d7t6->(K=OMd4Us!e|9 zx&xig?=irb5gl>V(^qws$oeUe^{@MjuF+SUTV!umf2P(BIXVA*sj#T;^mVSmzeBR> zUUzfz4u>u~s0nbfV0 zfR)hmn(%j>mfq__)ktmSzQXN&AFkR}xUKKQlW<~pC|EskxUf;px>Y|Ek9>H?nBZhX z5J9)D(?bhWn~f>P;G3?&5f&C%yRNVwbIdy5nquv`H&`(GWMr>6t7{B*VMtsP^lbzjIq@S{RAKx_a6-CaX>O%%5oWc+VJDGF)QZJ$M*o{?QNKc8)N3< zGXV1!Ha0Gw&pis_m>d#@E&~=vEVwEm($j#z;w=p)F%c~0>z$+3hvE~nIvKq0^t{5w zEiI@j-;PPeT8$?#ype@{1uv@jq~AR$KTWGv27sjn9^qz#eZjmq_IiHL{>$yCJ^nN@*a1&n=WvXEOYd?yH9J#X`+LVaIrqS<#n$B( z8rks>(ewKqV{7zIRyXQWqchdI6Z({fz0NIq9fv5h*SS%enMPkZAELm$#^_;#FIjt@ zRer!~6DSpAXEkJ}D4}&4J#YZ!E>~l^#M340n}v&ngyo>H z&bLl54hMQ6L}vjoglHZwdee3gM$_JkzvG+MHFy9S6V1C%G;fb=-rJ1&T=Qo&@4yvu z8q7jhqqFG!ga(PZWd$2BN9CdA?q3p!RPowJW%SSp5-cQfv*&av6yGio~y4B**lH~vZwN& z^qII|%P(~eeuZeYs6s6xg{Zym|5Ah-SrK(#i}D}ZT3?QQ*wANpOg2kYSZis33G>9# zz{+Wf7csa(yj7|~RDW^=x4;3uFDUOyNUOK9|*=Nfzg zBv5^1ByZl;cX~?Cp+mum$)lQ?m8AOXyv@d}c-dGt25)eu<6!8aFvz zga3h2PFzLkRVW1;4arZmdet=I8W}%_HX{x+M61K)2)PQMj?eOyqjJS>0~Da1GPh7;)^cA3ioYhs2CY z8Z}e7fSGY}m9MUtajF?C+tsPVSPQFujEbed2p_K2y7A^L#`scK%mJ!XBaWCTxoiw3 zyg^G{mJxeZMF#rca5k@NQS(?1salw~}K&NGvh_`Ct^sC|8Vlg@qD|_Q+q&dF%pfKA6Om#iY-#JHB$Z#@ETs~|I=80i<+q${x7Uk zU)%5WBJI&N$f-8{H_-1RS!8r{2?9yb%;DhJ{@X>+rN}_xA~k}h z*Wz>RD`;G4w~%O~_v0Q8)pT5T{WR`nmzpHZ1+tf@x)!-U3K=^IeAD zKLhF)lpg`qC!j|G-6f#IfDQ`iaX|Y8^dz7=1@r?zcMIqlK%7v?r4;UN#DBEedBXJY zVZaca`koF`R&F$9rFEyt4lnka*aW7hWPb^S$B~E=gq0(aI*NxQ5s_B0#c?Du3!}l9 zeGAG$ph$@t0Az}|Jl^Q4@Q;o|81f3?;)F1r(<&E)AxN-Te4|yWngV=qOns;D3rKCs zElK$r0|FqH&G=VOy{d0Z&!_KCNbN^dl zs-|c5FHu`O+)ZH2$|-6u+O!eOwPB<<_XxIPU}fQ!VF%tYl1A#dy`T;|5)iLA_bD!9 zXFLoC28BZ7{`yd%8_!swvv{Yoc&ED<1wIiG4Ne z4I*h~;R9;gqlTSoe)zpZj$t)+3f16I)9$9I%i|4n>aJSl1M_HuaQlH{T z`-JL75_8p@L*4CEeRWME`Kz%04ylU#aa5U&cv!idb(~Z2{!?3BgBMExL(NRGKw&B& z_$i}{v305$I~`1)D?ug(G6Ua5c+Rp|$l|*OxY`Mfx&6l`4UWOfo9|$n_tJX<<+mpo zSTnjAnT>H%m+OL_*gi$-8(!;fl+1#@K8B_q{ z9Vo7wg;(w`n=MBin5=6!-W0eR?~WAlcXgeLG0Op)wfcnG!_74dRBTVXrGBn!upX(X z>t>#OtTz7vsv^@)K33xzJRiQJGdRv&Aht!EK~@+rz=bHJmuh-4FG2=>1&{vIXdjO3 zP<2jkE!1)uL>c`M@D`xFSDgJVZ?;zRWRWh2%~jv-e~nF>N7K$h@|UB^cT}B2ZDYWG$0uw1 zeC+abK*H95)4_;f@KnQ?x=U&Loon!sKaPz-T+|s;9Y2^3eRluh2XHgXt zQy%3?j5yMGa?pVO(ty4TNa8)r9w=hGVL)dLXb$9&!~=@LZRQl{4sA~W7XqOFazzEZ zsKCh%C}RePx`pye91nhqa;bQl+wPdxT7?z>u$v-Q6(l0(Ms!F`xG&&IxjP#v&BYcy z*z5P#F96R91pE~vook>E*;ZrNw&J?401!Iy=u{Q5SsSym4xy(~t`w%9jLxjWnoKSF zaw*EZqc^Bok2-gF@J+}&*L{-_l_D%FMA$nh3^L_W@2XS(&+uyyU^iL>*iRWs z@pyZk`tMS7&BP*)6kF&U=tZ-+X$w8zt3U<7&JM^bp%$P9200Sgq|~JvhsVv{07VV4 z^UKr`$|kU5^Gm@TCR7j)S09-V*RhZkL1%tAk!CdkAvzlm|b zWhUS1Z?*Yp@G)^*?4C^_~*YG5i|DmCUxsWBV2Y1UvXrG{(Zek4rE(IX^>m`5CF z(0g+uIxz+3Gp@l+RC&-xD3_Z7vroGQH-$XLR5++pz|0Tg=W=FEhSQ4QAmuuKktn>nsA|z#qpKS*8BLh;<31y563}_V~ zQ~dDM$5hm9wSps_a1Y@p#E%076*KMT7Ih5M*T&eaLM^s6qXEaT=gSeNxi;pE?|Z+R z^QgPsht@vjXk2u_rQYOB#`}K*iBY`CdFPv|0y>9bA0hE(KH%7xbYI8Mp4hh)AJ{VI z7)-bewIc3YBaaYW#HY$jr^o*%z=k5-id~}nF`*sHU(%wrjZoSO=c#+3XBU10?U^;X zapYn|n}eT}jMUocCMizwmvdK*C^S(FA0aiuvHAx2=X%4)0YC5HSiynuuSRthoiInY zxQn@&GP!5fBS=cF2_YZC0z);J%D+d6<4F}=W?>y5I&2jXe;>uus23+PJt9o3F)u3q zJh9KO@RqC<>2RE-Dpt^UmrmAq6 zzyAq$(^LE3ZhGdxB=s@%F6e!Q=QnN|;lPOJBj~62%LKA~!0FSBCjcX-7^McEdnD8L zC=9kVJ|vjai`2NI>B&1Msl%wLI(3Z`O5T652}ZPBlQZe`Tt5w1FLr*`x9Lw}IWIQa zpEnqD7wTl$-xNelwwNcVm~@^IbVTW?!2S-eD$VUy1C^|b>oAXj|5*)LXh1bO9y7|m zydL{X!Qt2p>RE?H*uw`_V#m2$_TCG%?lMR9+v5@-Gv=q7Q#-^A_m9*yy}tj4>o;J% z&aibMNs!)X$u*A%yjbCQLTfQ$o@dx3c$@>DM{G%?f>9&(u*kW24DZtKW&?V_fd1Bi zXnK)&KL8}-Qh$_w02Hc~bYKV}KbWS`CG%HkdkPO>KKLVb!RjLdm%}JmztJgQ+cls2%zE1t=oM+d_)ok@= zu&Q8fno}AL^^YcMn7s8Hq+>hXLKEIM;n{FheW5~2p`j|AaB&UnKvbp%o~g@W`@WGJ zN)I-xfj;aWodUTFyJr#eE=&$#FT+@WGUBeu*9vsl04-}Ku0bzoqSvWEE_dRl)i8q~ z*_qJ(v4i3WBq?5+j<^P?Pr}l5wNeekG5mC8U1kj9)_qJ8b!6G~!|GLk=o;KlO$4JO z@}1Enb3{KbBLvaHbMJjeqF$tX9O(w}W=#9IVBFJrL%t#hhs-V!CJ<)6Q)#IEHME z6>mjer{m{QdhlE+Al2~uTR_rIL=8tm?*fu`xNA|KZFuu2ivYC==vF|obuEc`wW z=n4US$q0SffKC9C{qiWi~0Tt(dArcohvMV!CWJis>A zQ~HcuEyNr1N>?pTqgzww{HnU@Hav+FfAEbL%+xP~58Y&ux|MPbeC?Dcmr$-1IM?Dy z%C7nU@wiEuwl%ui63R~a+9}tTP@W=iw&O|4n{Jx1(WI;o^iu?71S<$MoV|X8{%EV8 zDJ5x<@2acxV@<0s`MU*XT01nl(@ILgzF{xLv=YiN+yjTpZ*0fUCVv<+Dbt2bcU}o) zE=<`epI1WJC2+WDpBm%nXaDmtlQO4FbS^=;K84#>mMvHQ0M-++l=@WTf`-M4@=cr1 zqD456Xz^Lz*a#(P2Qse5THd$}u?|;ReU_rG+H5|Hmn+I?kvd8t^6_c$M`NFJGc~Q9g-d2x~pH+*zD++$(lSW9{VyzM2O zUQ*Hv1rB%gvZVJv`Wp0honTZ0E>yf|3oB(R_jbw`mQcP(;BX@)YkaCBgXxD(nS1o< zE)tXp_2@zHK_9f-=s^yxuDY5?aKj(D>>u@#Vfu_zhn`d)bd`^@}sKQ$e3?4_VNtGbF(k?!L5+!bal zj%akmv6lj*$CYAcNhvt>s;=TD4obaWed=2D1&yFm2Vc5big#QKz8}8!`k7TinbN(w ziVOK113vbp>wjcYzDlEfSqWuoy>`l%l~DEy9FDi_<3BjzZZs)#uQ{E!gz^>ewNv(% zP`*;&T+b(dbKdnGHz}tz%2x`?2v%;@e3+WO=C2|Jo8-T;B&~XZvjNX4{MMZQ<~Pi= zxJF1_~cmC6DPz4Clapjk8Zb_a6 z-`cotZVBaih*@1l<2w8M@cqjnBy`HJYLw@dP@XShQ4;I8^GYa#X+W7$h&Vsm`Prn2 z&0U>z3qaXk8(^AoEx4eBG6rnmP>PW9H@^5dI)R>#DQr}@MJ1HMSmP)!Dxths;Lz4b zz3|A^p;t}Hvoy+!ODLl=jHA4`gfh9Jx~dsZy1%^U{(UCp`5NV=C6pn2$5CEdLV3Bs zVeg>(S??qNVp6_AqrAL?GP>e8%F9bAuMjwFkt+Od{9f>Olk!@P@`@75O(m39lu+hO zuexd-o@9j9)@>H9Yu6~RETMcu3FVa~ly4L`lmm2+^>$)H#@y3!XE5E3C6rge*Dg11 zETQZZI9WXDZv4iXubGrTp;7jgQ1%1YPT5yNIUsPzpLBOW@WvXG@ zC6q$~hkcyxR^N;lP0EjIltU$y!@#vu4wX=j2%Ix`Qg`{*vCBScQhr9G94Vn3EukDK zp^Rw>Qm4eL!tcc={GT={AJZtuN+`!mD91`DCj<^>>=y!Bxo>OEq|6x!U800C#MZdl zNC?WckeQqz;}Z+|mD+rj->S8QhzmJ;#EqodXB*@#;Q7)3jSfC7p)9-1= z1)0{A0LxDX>o>*2!~C=>?urlJUTE7XC?TYIOIsJOU>5HP?Alt8Uu6#AvvKl*dJz=w z4dVj>U0d6G#MkFEKU`9?85hiVZMS-cI=6S`O^;wlTTi@eO zAQCL#ivO-WgKXIo-%S)g+NC&t{i^u2xGP@-fB-YD-!qFZ8Kpvgd?-Fy@nd5+leKCg z4`s;@)A#zU2{h;1ck6Yk(QJ(2YbpVM!g4LV^{VnEQGDSogxhU>^3rMJqJJ&Rpw^*N zBtK~0@lfz4El7SL7;J;Gw72adg2)otVw@M-Mp$4-$qWO7FynfKXhdjoA|4~HX~$Kp z?Oj`>kC|59!h#w--OGFx_GrM2hGy4LB-sdUq;H)-3 zzEcwBDX^@r%ssRBApG;=@O->yc5`p9H7dkbiR)7q9JX5Ni10D|uEB)i5&Y;V=f%BS zmf1A@IhN15h>+>Z-J?mp;HGkTW$w}ZIPkup;j&uF-3!M2eH}QfE|%%CT;=jd4RpJP zBQZ&@^qx=7G!K@;E0e#^1MeR-+)DY|3wr+soP{%Fs>G{wZ&?#?k`}yj(~-7SMYcI3XG?;3mpn1~?lnc;)Cl2pS#0IiulGv#XT93t-Z?50XLV>UZ^4N|!do#lTyxO_^%+ zbj#4o17|?Pt3>Z%#J?XnA#KuO@WD7axg2;m=@S#JAfnyMr27EyKCj_cN|zRiuL9?J z3tpxE_6y*=X~8SU&(9#CcYt$*gyFbeP^mrQ*9jEkQI7xEWF6;#$NE>#0gv{Hzc>fH zTHyWlIpC4r-d`*Gm>(t=m1J&ptCv<0tRd-y@G8pfdzest(A zW!u9G|IHc>K;bI!)!o4Rn1)-a98pmC3~*l6@QifJ)C;F+)2X1qRid{aVebRZUut-4 z?@IOZJaAq;3%wS^e-k)Cnz!I+2P(&>?6w6Bhj?_A>gChG`Xj{0nfttxcz? zo|H>>HvCl@$Skg0|Db&S);Zv@9Iu`O9*5m2Bx-Tx(j}krk{qimhevU-vK(F+KG*`h zUJbWW{i&dLCvcoJD8Ws|uU!4H96L1};?Y&g-#|IMGWq)&@V=wrR?6R%2>5s4{F(zI z+;sfPuvD}b}wf>(*&df?nx zKMZ;W4TtH{Ribx-c#Q(3V*a?BWGZl0u8??@t zhBwhT^DuCpI19b+AVbdpN2LiEj_fb^V4NOC{ouyFRHK3CM&Sy2eN^;E$yk|5VJ?Tp6 zo**6#_HdQbWwlKOPD;a@g!fAF`BvcUJ_|jH@DBm!pDcKl=sgOYA6W3nFSe`S&*47! zh;|?Rsz2{Oco^$p4VT}o?fviF3vXO=cT2tdk*}*Sb-Xh={BE84*6?pHuYQXsBp1Jq zI#JY9@(=b&wRF%UH#S2(j{rRShke4&xPI3A$mN5ht4V3HM(N<09|QNmTAtG9X!y}U`kdnZ;c z@H$nAwB_4&{uwb1N)*1*^vS!jpoxxs!}P$yTW^Que~x@JUW`E#8Czu zn3gBAFIMkidAZ}a|9h;CvHZGX%UbS@=8-ENF!1D7<33*g%V~vQ!?L$XKdtPs!IPWv z?^EybqUHt<<19Hy@obr(&f45KlEG7!lVM~VI=LAXrXRrK;*Cqy`$dk9nmNiHiLBLH z1Xsap^{Q2VHS$uDn-Gp4Oq7`sKTWP|p1GaFl&Hk_V~#elVQ2J#NoJA=jru#1e_k7tj&{dnfM+mCU>?Ww)^)DJl(zl*p{r}n1geJ5e&{J))Vao8#i!ZG}0mOl!JPR}w2 zcq7X=vVm9LVdEP3BB4wjza{Y30(28(bTx;za1BtBx6YY*@HBINU|#?5KN_cV%eO@h zPS3GYr=w1J56m47#@u^j#~;83@-&$$aBzuDBU|W2G*HGp=P4wpUQmQD|5iVXrd55s zp0paLKX4htNE~Ej^Ds|l^L!6)bUL50CTf*~Z+r@WThxE9|2+QkoXX3SAnv7L!wpq< zQ6u%Nf};fQXWKTniUZkAKSsWXrn?5ON65f)g=;%l0{tKyN`2Q1NoR8Ye7*NLj<1pw zk^8`-_z)P;;!$_;|k4X9n&>dP`g)}a zSbeXa>igq~!os1|)mrRp`h9ME#Ac|f;W=cc|5)wtv6}u@R!w`1?~_~)$E%OCqS1RZ zI2k$T#r}64`$K3r*Tb=D*TcCAqhoV%(*kSm3j@-j$;((^^;gvL-_(2i(#)FSD3nR!WK5H|COu9s7k-15FZu$4+ zRnvxV7<&=7xYXXD9K*Erq8t7+Cf`7|2cFPbdae?Qew%jX*YV@YE!_GUbN3HV8g<|= zjw8F(2cJX;+9^)s0ITUwp%-BPax z+9J z-X{Rv3jZ4A?*VNP&_4pYML--eI4*mXCji|n{C;HkaeHoy@CyUtVC7N14oFhw^)}3p zM`0I~e!m6OCj7X4#JgbM)i-(Z?R0PVHlg3_ZQttc;TDvsO1x_~{5yNS_{=Sp$lXv5 z*R73QzkIH@vukVT7VL2FVv9ugR_cyd{Mq<4C1yvTyrwy?t9nU zb6MZJckR98NSF*x&O&Ru9 zX-QGy8oY=RV%2>wAMQI1F;;`uhUZXD2b07{bcSM8{jbyxzaskQvwVkC@m15~*edqf zX8}%oMt%1n`f8Ojy0+mcVx#JmAt$YtL-2}sET`L03J(4f-q612XQPrSZf%BLPcw*t3Dxf_s_clQI5^6o)EQr^7; zNK$zl5T$92LP;R0Xwqvz1>ps3g)8I~8#r-KyK&QcO$2V-bcDSg{X_SG9H|z9UOA;vA3R<6QR6!JF6AL_+q~1IJ~e#0rtj$Cd!4?9lcVzy1o0=m>-vr!`(6$3 zM=zrHbmh)D#J-^K=!x%fE{`b9INtvA=l|IE>Z-n{`|h3T>;G-d9dE3k!z&;(5u{*F zZ2YU_t5N-IEB0aT zzJq-(UD%oLejb9o_@QouAxC`u5L2(Z8~Wh8f0{YF9J#kj zX6F(uiU)sj*iSs=;yu9+<0r41tHVVn{9XmGoY*j;Ru3L-!So5Oq{c9*!kte)%%86f z!u-}mv7?ScYXpDQYKV7SMT8qO1v);%;JSymcdKD&)2@L}AdT-cG4+Iyv<=U_{iXZ` z>IvcZ?OFsh9De&t1&)Tg#rcl#=cv3OwRtxN!>m=$Fq9U?}dPbmPl4?c0 zPNK5a1=ULh)!!8^0M+j>!ldsrLN#e8>(pMiT0Q6YP*Ga+vSHeTF&~G>MdPZ|cmf`G zw5k^td%P%VD=xKwgivpHP~AJDx5;(^AG2&f&< zJ%DPIEB5nvEm0FZbc+QD)=$ z1^jA6MajzIzG+c6YrDg`u5YawpbLut|H{22*m(s=lnXQVd=u{VLA%TBU4ruIGtD|n z_Oy>^nfW7MtQXg>Tnb`+_{j@KWcHTgU1kq}&=L4|5+866;b)j!^0(tEUSz|1^-6^K zvU%WUGP}ouaUPl3kSXU$n^{e6>{(P{`KyQ#AglD7$VCkf9O7uUfR-3g#DF>heFHy_ z5RwuPui|o2{?!dDUk6;P>{u!95mlc-A~4hOx)4VP@eB(IF1%?t-1==7{M2{f{+f`e z#lWm$!27qvD+ZSPScA%uz+x!NW9nm@#8Si~@Tw7q&pA`A5!YzaOzja@xl9v&)WjsT zrMs|mYu5+zx;?zz+ve?R-z)oyw^wY+mqS4d;?QY)ulzG$*)nywlVt|Y-y;8JyVI=M z`a0wE<0ks|3rJs=!4;rxX|50pDY#>KHfHKAYGgsI|J3BYv9bC=MidlB=Wvu!GmF(0 zpLwetKJ_vpgQXlAoh;sXrzq|_5s9H{#puZBvRZlJuLHL|y{<-l;0nzbe#NLm&CD)l z>(rLnMSLqIGPj6Nlw@YZIEpLeI3%lM%uqRZK0JShUkwgj>%7dN_ow*bLpylR6i@@6 zGX!)ao$6T1fJz)4+KtXm=rElN3S_>>%<3cj zsP87;4a^SzEBs_9mJNIr-X%L-4@k1pVnC9eRswn%zZ&t`0?7#L@h$~G8z3nF_5k`% z{5+y6w{`AA`-(vkl{l|q0oJ%=J)-h3dRprdf`H?xwH{RvqMM}2>R$kcHm7}s3_YGJ zT@zInzZ?p^uW^U|5u6jyeNbcb&yK>@638h zj2MOL*3qh*Uft@cW+|5NskDfL0>L(5Xd;Vp0+%V}r?yH-4Lr4`xX}rvONCXwPW!8y z*E6_P-lGn(@*&7B#PIFX8{JV9-s{=A8-$FOP058{*_70iWm8@O=pFoOlx29bzj~Ae zo^K1k9G>jW9r1ZL$OD6bs2+$ zmV{;+5L;dPtpY^t#G^DDe%lR*A9Iv=_Z!eB0i6*szG^^E7@@BjP!)QdjC+v*U28x$ z7!W_HEb+Di`jepCW%%J$;Z9sST@9w%A+0P8N1KN8{Ne^~!;Hxf5^x$rhkOWE1Hh02 z`KzJh+4=K`{7Q-ZSiN@rzEyK4kp+^JkpUX_@ZG^?G4MAWZaRgl>YVsm#4Yunrk~~4 zfuA4K6ULU-)Q=|xPY7nCuMYM@8mBormiB8gChTqo*ncJKW79T-U}Q=I6usF{Uo?NX96rYv3xp zQhB8%V+LS+^?7#dp#w4f+l85wxNflNKYEv{ksRt|{vpq&4>=xaoQ*r?Q`m7b9iKB< zjqB;~4G@?WoVeU~(+1pBhl%}qEWkmjt@SrOxhD&eS#zY8Eu_|}ncN{q-|(^O!J|1W zz*40Zt9Mh4-BOgW7k1F!khz;StOv0f&%RQOs~A`Ib5MsAsL7pLQ9*WzlJ zD4fOBPFOdJxS-f4tRj)rCf|l)B!#5wkr~#VN1=NB2!1u<9_vfsSEGCp@9Z}7~}YO_6>HU(ep zxLoHf4=y&Qb;GnTV9gqO-KAK!?pt2Qv=(to6(ML&5j@PhH^pNH6Btu7~dh3bIQsQ`T=XbH%x? zmU&qM@Awk@e>1fI!0f8R75IJ@`ZVga9x~)Y)khPGWo{gqS^O;7LDua5TtU{WKekk< z`oc!)e-pc^N!8U3$7F}2X0p{y9BEuAXgDU<=&sf|W$FijK^tR@G7r!$0Z|_(Kh%g% zJzs}6j}SCl;O9}OKW`SHoCmcD=nsH43g|ST^#Y>uAmd&Ds8#q;vdd744jIZW#KF8q zSz?6VV1#A>(a2pRaAaIQW!#;Bk|OkWJZ0z|M(7Zrs0gKjU55Up5&9S)sr|nMD1cv$ zatu$2_c|b%#%Vw|iqJDgXbt3`44naJg$SJmNXD%ApdDMvf*gJDuqwq@dTLqK@ z)FB{lBBdHrqud0D*54ZC7C>7CbSt230@@E~lYsgFQKPL<1^`iytx@g;loQZ>fKmc_ z08mUop8ymR(5CeRMs^I7kf8%(lWiZv#m=p4AeAu^cHsS?(WHB zQqJwB0(EC+KEIPj5Ic6E>$a}$yd3nQC%_d#pgG%nN0hnaP|M??oFVhsIvd@O1f!6 z2y}}rMg(mjK$I;IFbN5yvvn4d(Aia%5FkJhl1$RgA`pXFq*DaZaTw=2>gbF*j^n5^ zqYiE{7$oAjpyPtu28`r<-sjzS-+lM3 z^{NV=Q^Tiy&{wk|nbLelEJfE*$<{LXWS6G6e6s5RMV%V|sM}_y-b7qeBW#yw zYZPpC!oik%a%V5$`K6^Wawck$;2K$e`N}lC?D;$I<$R%_g1Zf-Cka?m!Y;WcaNCTp zO0&zPu2>+vR(64xMYGA1Cpu{nHmx-ysyYZln8kYmQ<}0$5Fr@JmJQ*20)#b8tUUnQ zMU~jsMdNgDg7QH=EF&Pu71!&UF$}D|mjrV2HO2axX84+71Y4ySp%*NlKWL(hj}v{7 z)P&CtQ=AxIlik-8Exs}3Yr4|cw9MD!@HMUUvE6#Uu7{DFuZy(&G%3=%a6_y%V=kw! zHpLqoD9&Gg zBJW9E)PgF(6yUv3laPwV?MO5zy+0yIGAudTx>wDXGgP1qwr9b*MZ|rr|lXtJnLnmczE#kYkFFvyC1bO)i zJ-)7H5S*utHug4U^38I-t``Z>b&QTprM|9yB3Qrf>!OJ;bdO`p;T+ZGmeaD^QdWtn z*RZfVxRVggE+yi41N`h#7N~YctpG)(WRW)F*v4WsfZ_vgsbnpB2<} z=2rlUX0^CW%2&JbLMcy8)yA4@t7$PE&&%+2_N};KnT@`I)~|yCpd0pPU^-(vosG`h z!4z|h^+$2$)mvGK9B4N1f|C~%i1p}cboo`VQ+!mqT* zX7oE3gBM?qNCb5&lZ^PM(*aJIsnEbjoo`p*D;Ml006szB%Bc{od0{@a<_8-`v8ib@ zrlv`Wo^bT4D|({A$)@tAl*lRH1i78@4to1}ID7kf;1f}+c})M&NzeEEUwI$8(tG;T z(!LW3R*Cn!nf-wpO7UeFN&AK*3NeMze2zMniS`>VRmu}j(h3e{$pOu1-}X!0pD8Rw zguip9I+b+C-8^w74ENh4eCWh|b_DonIa?573QHE@`zkxpk|>;a3tz%;zh{My#3ZDP z_kw)B4Divu3zfEz1il~8ERob&{ZQTE`XNnyG4($X0>;7IS#gdC($5Hl@OOq1WZoxE z+&@%uL7fOW!f?Mdg<%jMDic!}iiEj)TJA!{Q1}#!ScD0D_vlFY1m-IuC|^+wvjsc{I=cpjgbW7C~wjM`fbIUWw`u&{m7Mw?ebKrYvtwEee z2XUrG(iBD&j@TsLmybS3Fq9q3!8BWZWh9Z}!=Irj?AW5Ai~ z{&nFasXia8K7-4GmO}$m9}|?iondH=nfO2ddPR*t^?t$GuBN5Dz1pApRK+A1Mr+}; z0vMROJt%eR6HH+@;z&t-l{e#Sf9eT>^H??Y#fE9oydW^Gu|a83t7{7D!jah6Z!SV% zQmW*t1?T9XT+sX@kaO_+zQ-{PZA+!{KKtQoFZelc7o5kbxuA(9cT}d@_J?{OQ<#GX zNOBl{zneZY1Kt41GGKIxZ09>q321_ONO(GUyxZht@J`Uoesom7h1nPNQPzgF1 zhIaH)3v$&he?s%4lwh~u?BFG+d0)Xq7E5Wz{+agkpDEH{Q-g>_m_T_Zu~<~=l@uI7 z@=RtJGqOg#LUHj9G}8)t6gAm!lcm8qC0zyPbaD{qDGc)%j!bX={BN0`^JKw!3g@iJ z=~Na=8BaX-W(q1d*E{9}A{Jo+b4rU=f$~fVk|&m7F2j-Xw`}`%Sf-NGp9#*fK{+LS zAZMfZebcCu+V?NIbHDR*ZW5d?2WPa{nw(B&oRu=2{LpZ8^GZ&CC1MdK&{k)#SX64{ z&g@uU<&X8Ih(#FA$x7WZa}MD%EyyP+z(*_LOvLnmUEtq$+!LYj#rttZEW!jzNXv$% zFzTJjjoe=JtUuN|5sNT^v1Y@^6hi@QOdy4I&m{0%K8&;ZG~9{FUeZvF;JE z2*b7UobZu?N_h_Bqpc~y?_Q^N#uP?v7YbUs_iq%3D01%z&U1q}W8i{VTFypq8&4x7 z{?~pnuinr3Yr%OQI0xDf%{xqC4jjqZ+TUKMy~3)s^m0Va83xyDb?9P&Iv(vFo|Jk^h#_>qO&yPgk^$r661_usb2W-@>1Tz zN+IL|^R)mzfvG12rJl?%EzIY=8CnNt~`SRBb^ zUbUe^kq>h|QOO8HU%tUtZRXBn+mTu70eqam`1|GBnqwM18G;XC6h3p=H@SlOq%l5I zaU}QB(XpDAV3Fd8Y5oAA<4hy8hf zP4FR%NNdh~wxNjgA_6R`*rXyIA#3ACT!chkEVM#d4t3h9r3JdUaiV`A=Cg0oAt zpT8JNn2i{I9Tu(nRj*&dr$sEn1X^7Vi>2i2q3eSUGRAf zGYMHa57b{yEN}PcD^7GZd1}70l+H)>DGT!17~rEVoy9DzDL9g=Zl!PBE2Vs$h(#Fg z_mm-@d|>=_r@HX7lS&+HIu)@9!}$!S0%OiW`q9+o0{EK3XbexzGwq`)B@PzUL@dGt zYPAqPf!4y`R@KGiSt5y82L$*kpE3~V6hq9D#C3=@ZA82&|9e%S2i z{J!8^62!Tb#nM`DNf2iYe3ANg9LWtExqhXe^VfoNSrBLHrvhaz3*ubCFmoX=^=R4O zHjnjl9z7CXa21@h#-gr-ufHApYV!-j{T3A?ViAU0=2GE9yaH|PD#k~f_lh71uV$DF zSzPSxeYr$qW9tOxtC@s=NW0Xu9D~wY%J^v0x;iMWWelUA)^7#pWolZF8>Y29D6M5d zX{{I{t+xc{6>3`lHB75AD6JJiX{}@!7&;q|h3(w%pud#IMZp_xrJ7cp@R3xX>;NBa zy{JOWKpR^bl=>=$p{0KsJ4U|o`+9%sYXs+2EG=!TwVK6(VKMjHo|n26d%}J=5sNU? z3nwLBfkjU{QebHXw0>)V!PmkV7iK@fco71(3#lJ#C%uY2P!{mbd`6LKFgb{o&)tITvX9MFyHJ9AhXb+keMV?Z@hcJQ<^la7Ta}6;5 zR_kBePxtuwGzmV03G6*LvRF!gQFO(15BOsp5U~iuQ=f}+{|Z-J8&vLdq307CAB+zZ z=SZ~eLczc%VZL;q>I1O!FTt7DLE^r(9D~XWjSD!_iY~bs^A|?=bCD)u5hk!F`Wbuz z<*5sjr-5PU?TnK_ombp(pI@E^!MTCSgJ7vm`1o7V-v#+R9pv*ykk3~^K4Y!KpB&|# zTzr6!woDrlY6_dgP?*a+I(d{|8|fkzVK|>_1NcxRUx1I6vj?I6QDvT~5>r^t1vV&R z5hhU2UKWe$vQm-_L3-ZIFvU31nB@0U{)OtLppOa8n_1qq@@!$T95|BOAboY7U!KoI zEW!lJvlTvp<-R#co^1@1&f+3()mI(z%QKa-0=G>qiv_}mmyXuvuLUkJt!+VR(HPGZ zhOUL>cy#=RSbthMg7bEscg>m%8t6fsw=>R_h>=>e#+f=NHI+Y|qioE^q`50o=i|9a9M(u!*jj8joH;`E^-r1BoACIP|;`3c`2%`5k zIhEqf%y7DwxR$tbvqO(6%)PR)Rv5gJku2xpoPvykth5X#d#w}M0M85F?Q{+j1`l(0 z*VVHeunX-c&O{RFZs(GmY*%_lUb?C)&&dV)G%U|pirlkF#TVi4U;+(uRd_j%{(%TPsDl&+70d;h%(YgOM1(Zd_I8jN`GsrqK zoMaAzUT9#TaArA!pe!Z&su?R={=~5Ar)fO67Fh@$GS-3>k+Pi`ZdZ0*MxF~Bcj$ro z)I?NSW#1D2oz;FEJI`ay0^78W27CZe9X_J-EQ`$;H zJzqSkO(uI$_6Vyn zQEzm*EMBCU)vLVgm?$;XjfyZCIT$MB=VdI;FCe4RdzM^f4%V54Ja@naJu9u08lHGn zxKmb9uUt8~OSsJJ(QCyVgs`de@C5eY_94fapPruOF33p}Vg)6a3TvWgvnj_Kv6z+8 z=lopCmk^=jy4sr6_+p>(89>^Dh7Sp5)-+VF_S7|OW0JFhR8DEBn{iNbkl}I`=E4B7 z+)JEdcro9DMvWc}hGIkkYgLqy0Tr>K2bn;11I7yqGjwxHTzQ3Q8ENiNm_a{W+d);5 zH*Azcdbn6&pPuK;$tlc4Kb)mwA@sm;@Q?;&&OdKRI>}JJ0+~T?&aPWWA^8|x@z00m zR5h+AAEqt(yd=M1SV}n9ZS-}=fwLFbf4@Mn2JiTSe)TnvLqAz zG#>j%P0Diz^mj@5OBUz53UUga>eCoHXck#osTC|s1DP^CV|L&XGV4osuV`HY(T;q95yahA6gmIMio-WZ69nnz3{6>IaG53e)0u33YQSim&Z zRS7{eSSP;!ns(*f+;z2e4fL_riuE;kdun~vYE&oQlGG_NSc43Gi@G6_R9jYbu9==S zfq~E_nxH|mVKm73nTrcEvI}yZe9t*`K+2|b(f4AU$zJcWRg6%meG|h+DkG7MzkMS; zDRl+yZU*M0?u<;#Pie|Rd)9;aYPF2A;(B9BRt8gPPIpdP*5bvPemVUuSUqc-R4KLG zGN>Wd@FRhVadCBHHJ^a;Ky9l^U#v}<>(Ds$i?#DLo*=P9;EF4*a5(11CB!GqqcHkn z?TYYUmYglPw<26xAr^`CzF2#RZj@-9&KGNUBK*`KoKxqEwO9%aa_oz>ntNLe5QYaA z>Bfr2IVGoa)*5tb8owyen^t1=2Y+&iCOPQ~xP$o7@>9!795jx73B`lnU*p#a`sS5* zY(gYr#wWnp8vd*FaGJFvKqOjNx)!(&fepj8-WPEWVD0l3VDjlk z2OO;&>d7}A{x8tdzQ*avcNxO}9Rh9+a8_F4*El_Xl&&)b+~vS63judNaP1-BrUCb> z5O7p(-67zn0QYVPxESChx@DnpdU~NHDi-7xU2spCSuR_3) zUZUw%kH+ccm-wZGfTMc8It1Jd;P!-oBYp=$z)c74L(dLsKY_y^z=veGCKrZ9B}0! z;HVvH4*^H~?g;@$?eiNU;HcbAg@7ab8(ois#_8#W+N-1xaMZso3jsG4xUC`J$e#Cx zh`T2QoCExx3IS&Y?!6Fj)F1VQfTMIxKf^)e^z=;a+GIVP&Uh#rxC((a8V{`pzbask z2prx2)Ef_B*d)C#Fd&&@^68{|9Jo^gYn1Md;P5>#KDs3hr>3jJ?{;ARBydLjZUT?L z0h2=mI=G?uEdyqwz!~vd4IZ0;d0T@s`m)|fz5V(7i~b3i^-FXMh<&x2@rf^6Ns_`M_MI!5Q&e4NRj3rzhXl;I|W)w=_5-ekXwW zN`uqmmkoYD0FzF)*5QWIUp_F)G&ntew}Ho6V8XXBcG5(gjO5GT3V!&LGt%E(2wMxx zaJtnFHynS)Z_qr7#>E8!LpXAJ_1pq~EXf8qJ)9Yct$H|}db9($JpyZ#k23JvKZu`^ zUiyIh;T-&)1ixX}HqebfIg;0i-$`Kl1J(bx_i0`3`sHA?pdFgXIu&s#Y++TUYTZqEVphQJx|qoKhE zz$|Iw{7gge+XT!`fivQli}*JP4CiPp-%;R>pMxLutDgb0y`6I#hLfJ2li~j-f#FDF zJ)Z=wUtovINB9j2Cw?~4^J3tZ3ak;okHMlEnB3i**HC(12h0|MGvZecHoF9db2QfT zTflvC4t^B;6%N~coExg2pN1|)Mv{ld4vnfGvv zQM&X3n9;y=c5<8wPUVFSjY!RhrM z|3duBfw9uS94-ofy?jiD{|y2|IC6U9l47D8-@2 z5fU0L8#P>TM*L2p0T>5NNz6XrqM&YlgzlrdldM_dTPERkFAUHb& zTnup4dN`eY_<;MBz#8Sl1%AI9#Lvj?KLzg0Irz~_z)ZhKJ-?6VcLYvG{8j_gC~!vd z-HrG=1%`7p<~Q*Vc#ALo8Kv*&`(i@cQL~9fT`BtjPhFt%yk-^UVb-&pAVP;fs4SkUb#(%|B^>>&^V)VYXI(g zfi=npbq9NZnf@4OsE#Lf^zt)cb_tvjze~YJ2IhW&gE<=7K^HJDpM&36#6Jeie>6BF zJ@*3>@i(3iBl#i`JO-HY8k`ZoslZ&J!ReJ7jmMq9JRxxEI*pG0wjRL8-tZ@9B;R6$ z-3-k80;l#LI{Ydhm!vxU$rXBkaW4^naz^se@F5A94+Ksf9}KdqafIt7 zPJX91Zld@ldN>_>Sq9ujfi;qEI|^VkFkijE(hD&M}pW4#!Eaz^~-!a#<-h`Gwk z9Csd0M*L0y^Oe9E@p~HqKLGRkQO<9u{xbblj1llBXT&cJ`CSIg?XPp(B%GLhgUW;I z;a6{PjB?Z~4+{cMhk%O%?#B>t#Bau%N{alfm+o)`&DF!{*g+C-xdLmXms?=yCBS_0 z4o}m8lb&8k|I^;%80DxZAJv<=dN>{Vt^m#@utxIT3Vv>2P70jSIO0;^65m%O<7XzH zPP!GqtrJ+IbZubqGhlXUa7Okl1M_PQPOm*(0Q3J&rKRUrN%27|x z)K880P(kps9&S8>#_Qp9^pXf%j=&n}-lKNw-UJ8&w0AjaMIKBbohV!1;;2yJ^fKTcIkf<1V0`Az%S8 zt^FJqfs+xx*Ma$1;Eeb^i1_~j=C(7O-%$Pj6TrM6a7O&v!RB>fuKu3$3&+VwzFJ_K z1kQ-xObE0am`8u&{Gx~8ch6bi@F!=)Zx#yR8DPE$Cj{0i@i&t1D-+&lO)pG?Gvap~ z@{I(hZ#c(MyTten>bEX|zZ}6a#E+bjo&Ev1#|73X-5Zc@4={P+mBp%F2Bk~&cflx~ zbO+(6eO?>Ol#eoW=v}~^e?FIS3gpn!Up)NV?B~wMWZ({jfFpgq z8v>5np>OnXI{Cc>U$dHpKRKiPh9kd;z$~Bz0yvu28|63W;&bQsBE;XWhtrYo7U1p{ zSR?uB5%3@|mrUSktMkD@_7aP9?-Ur2%;~kyGZFH92)Jb6{;P-6$w%BJVUiPnaz^>s z1U=^g^S8+ycNwsHdZu|<5q*I`=j$II2gxLclEm?oK_NPJZ73?lXZk%C8yi z!MDKl$MU?8UFhZ43IDGz8=PM}zc8qLX8||&^1-;cAROs+We7N`mp(n5PJSN%?kRya z%C89>%VA)S%-}NG!Cx=GG`_fL=DG7h<#9j{rz79jz=hA^JdNa|H{V48(-OyV7Z}L5 z5dLLzbmY@X_h#UJE3iiCQd9K+Fx~XxHaK;BFsOVdBFq-gF${=FSm59QgmwLXH8+oL>FSM#$fT zaP-_x@O{KFi^8Ny_>(h|?~dV^4+8T-7RRLlt0&()_?PBz4DlnUCtp7NcL(A0<$E2t zj|J99KC-v}0Ar%>xxmqp$)}UwQNT>l;PlFurccv=G3Rl9Ms`K*MybGnWX{O0t_SXB zfi=p<0@%TAz`R+=)1`JqPtWt=KhMoEJXL)?ry{T>1RS*+_l1DF9Jp6Pz&U_BqleQe zkBf@Jq|5LpXQY>#(7wb2bEt&ljK+U7zkH-rM=v_*9tG~Wz#64H6X|{i%!L)4r_p*W zjho&O7|I7ZJ-erVm3>=|&cYel%OzK0e1$(bBl(U%zC>WcmU5g?KS<+}9|VRm#6eHK ziSUnI#(52eqj76)2sq+btB2Dmj~jvejlhxwdi8P}0{#HZq!nC7qwyN`({~FDNal?6 z{1R~Q3#?JP-y`4?U{0*$>C!x0uUH)6riaa6bsF zQ9ejt!&Ze!WAGo?a#(q%Z^= z)$?oga5{Rq0k~fZEJ>i3kC)+p7cg~exs2%E4fWCq%tE3q71pK1S>a zlPFFN_C0dAYX z8s*~x*i{QKx3+VhG2pLP9@O4TyLHkXBp;RMln`*#K4&wA344DfX3r-e>gV|W-qM>0cQnnbqF{Ia19~g zX#96`2sm0-c{l_djYD1u0Y~<7JOmu+&vO5{^+)~myby5IJ{N_6n+V)BdN>`s+5_Be z0!xzW_2-{szIrb(H~)p_B^Nk7yQ2EF@zHbVm)gI5A>tkl0Y~NWP6)U(;H1X}%cnn2 zP6Mt;U@3;4UW%ZXrNBJ!H0L=PI6b}4d^hr$!RZFChmjqO2?0mr!r39j;s|D6bFO6Wh37F$OJkM(XtHbY>Ls(bFpPUiDOVI&62+T`|Iga$Cr)R2f zU-ohg@gt|#u4Tc0!t;Z1!RweKfLj%W3obV*-)lm^p*xZqL%@+8Z3_WM<$GHQIBF;F z(!=SL$1}jaBCtl~aeOqMYXj!-x3~_C`Waf^c=DaWdJfhfjl=#G0*=<}Z10|%AFb1* zg@7Y_X$}ELAp{(y`&kG$8vjMVckcX>y(|a;HygO+A>gRo_JoLgECd|w zlQ|v&j_lO-{<-r@_w#0jfTMoDDg>MZxMn?^PW`wOxQ7LnB-QH|CZWB00+{zc;CWHU zb%Vx})Nk!Lu9IJ#bbkxnUj)`D-3+Ar6fgrH4oX*t-)}w&lODpKoDsjjp&fr5nEI0( zNAeoAyPto`F^nM&M)TxxpM^=6<4?{g-87^-4;b%%IBp`aEM1*^Jo6>mEBuGz*NFMx z+rZ?1b8de7zYUY_#eXP%*COy?U@reJ$5A_MB;PV%HVPb}_3ULS{5J#hY6$#Hr*Xd< ze{x3rCL(MCFpD%eBl&WGxl)7ElaKc0t^($zex5FkF8Kd#V6c3_{XVrrKLz1}`z_k{da(rMXq;Yt zX?|W1B5rdCI0yLsCIlSiDpR{Q{VQVVob$!;S3uT}!yshd((ZehCQpFEBGAIF8nZ_3UL4{O=YR;z!P? zUHcHYuLag9-5U__BQPzIJlzYyPcPj__}7f&7)q0zo?X%Sv{4VIqvsvK?Gacb`R1V> z?FZ%sD^HuoJ$mxR!v8~h*ihq)^b&bqxHJxbaz^RaqkLn4xrIKp1m~c?&AoE)z5;4r zUcW#m-9h~-)wcmXoQ_^%$A(LZ_>(h|@86Iw9hlg09A~7L$>8Cbwg*B=6o^m0+sx${fopM@ddsQ#`F0Y~<-Ne`!EFZ+PIQ(%qkVh zG&sHS8nu7Lz--sxjQF(y^9v15kKaq+_Zwg~X7PN`dWR9er+|4;;EeK1<@6>nr!+Vt ze%}KV=^9#p4}qT@m>z+ne$j~Eglv>A{^X40^C2t&m~Mf?GM^zoOHQ~n7JqU^{QigH z1M`Hy4aHB&4VP^ApNro(U>*^;q4<3dOl02B{AfIG2PR&FGt%EeUFR*_qrjotG0g7~VBS6lzfQ#e2$*{Jx#fEdn8N~RBpi1VYPQF&Yd z%oKq$;&%h$&j#i(fg8$REX8OK@F!=)Z#Tjmz}zQrL-FeeCW0Q6AA(;o!o~ozM&K}v zH_Y!IU~W4HzxxpXUSJAKdAdW%cLy*J3Y<}X8^P}YFw@I8zoF{KI$*X4oDn}S`0WDb zbO`+BmWNB}_>(i@w-sUez#I~|q2!bBUU?h-L-BJWa2zmK3*1oc)gEAO8^mvRW|k|h zEWb2AH+{jRf|Bx#;?hZu0M8})nT2TuStXMkB*{XFdOYkM%2=>0r*2dAGB3UrvTS3` zD!grf?##Kf5@sbX+fq{-KX+M8t!Gx%tWAxZS1;pl?VnY*YD1!QzKw=77Q6r?QW_S; zj}r@ORyWi&)~)q8Vv8?xEUEX@Y^u2yA3bnn)NQKA7h4)wn*6}i*LZN!F>%u5m?_e< z*vl@TK4a#r*>Q8`#?PC7MM7fIf@EpoqEu&EdIs{Eos*k~uly7)aTgVrl$MoOTzS>i zOP5J2DpyvmTD_)v?Yi|f8?M>7skW~EXZXC9ck`C5+pgWdV`tNKK?(l9_8^NAjw&4u z1T7M@KC{uYZDV!g`f7aTpzXA0oV@>a1hu{98PU@90H^_vx7Srl^O&|HZtukPAfzHV zcTv#>(}v48gcX(J>Lhu$9LnswtcW2t;QNysBzF-zGuQ^HoO=pr4idXqZg)Vgw(edR zEo?~M$li8Jon-BysSb7b7Kt93poy$qa^Xm~6fM$P)i2G1FBq-DXJ8yt8W&7ybTm|> z9PmMzHIb4wNb8Td61C)7M>|W0lLju7nG9{+o>4*r*4C?GbDik}E&Y|&8))Uu`dBl? z9f)b8(*Zhs+6RA5olq&d>%{$DQYpIA$o(EysfSdG_CxT{U#rwjDn-jOJanf@HL6sN zN>!>-cFUKV8L7#r(9GpECJrAwONgPqXQ)QpP!=mX&5`fQcS+`(jqsv>J5^x_2La-gH1j2T&6A$AW#4Qb_oe#;U@F2 z1jSi~M~p~_92q69M~zOfT5adyYRvfw_Jj+@UKo8*!nljaPe{1rQpd!ENeKy)6Jn-J zO+fpckbo9Cfi=+ybK?^d<|QP|zk=E)3ry1@(TIwS)WW{CZeo-ZexzcHl!qf3u0<-v z@jFJX!0{VKQPcG$qo~K|W7G~D$*e6>JB}YQY9EdtFpB0&?=tFc9N%KpgE*4WTbRMV z!l-9){5zvw#IcuAZ{pa)sN*?sUl|pF+|UftB8>q>6~-cs z2labKO$GHkM#X{p4Wkx-`Zc36K~Z(GNc4!o&lyFV%x`2AZTFQKwGq?}jM@x}Dw{=W z26Y{yIzVk_)GeU4FzOCajf}bvR2`$JLA!=gkAYgpsHZ`#W)y9rsASaNK`mv}YoIC^ z^){#yMjZ#Wgi)V>TFfZA(U#39x&@WNs2@S4GK!v;N@i3fs02ox2P&RX(V%8CiuP$t zXVg?sv5cajKksI?g6d~}^p$d&LqG?h5*gJB%8V2((r!@HSy`k#pnhbb`#@3IS)^M) zonq9jpgw2RZJ?SNbtkB0jJg{Xb&3}D1@w;@^#J^G81*oyd`3M2>KLOAfI7;kr$AAU zX_2}?k!@L|L!h2#)bpSoVbqJD9$?f_Q1>zFbx^l4>KLe781)_~vTloX9Mo<`eGICV zQ71vIXVmAQ)-dW6sEv&J7L`*VQ!QJC)UI9PHz;j!o5#jaBQa zBPD#Lb8TJ2CIqahUcC{Y%kWI&Uq;d6`QxO0RNfIq>=IhB|!b7_y=)Hr3SP!?g%z z-v``=4=yjzN|6kP&^i0IsDn*0AOL*`6(9C=@K2mMR#iLv%7~N*MP)`g)|4g$N?kNf z@TLSy!B-1_z^NE&Ps14WXI^|S6A)s7vc~7$U=CFq9gSoTFbpb7t_>8hPIzu%Mt)gl z7O5vUyKqTymgAc0ZCmOZ6y*``j5>U&7&gQ$v8I+=l9JU%d^fQg1#cw5w58gt_zPeW z^riW1^#TXXdR5IDd@0dEAB;sZo2nYF@z%49J8+2^99OQAqL3>S^}qq0&6wtxwu9T# zW!fYIVTCX#W(=`fOhL`o>NSDDX_N8oxU|x=bHS7(FV_O6K?0?49G*G{CJ;4^>m6yO znAw(;!Y)u-c-4)R3OAM3U4vY!szF|Lfzu$emMNb&?A;mq~h>epA-UItq!OV7{E zn8A$Cji8#IQ0UHq|szZ9+qERY_@90Tr?~PFZnoAPRK{%}ljp+VbVl z096#BC^9yZ1rzeP!7wR8zGYHC0Qm9%WX0c%xVaBVn3$5n?c@aUxU2SRf%rO->ax~pS3{} zeVUWCzcr%IU^b1GYOp_A)tXHx2cz)y)m!m7-~bGIV2M7 zXSjW?QaL}ytX-&3=5QNK?*GN~&4Cm~vteKwsPXvQr71Kb=A$J#Bb2$3AcjkFW{kN^ z-WU^A5kG)+hVpXxVJ78iNO^#UX#<``avWxj=k03R_)ymu|MZ&VrXBL;(!TKc(^z=o z;uaONb66RP?3SHocX`E0N~Psc&Wg(AJ^DZ;s|pf88h~@DX*q*a#D}H^)BO!@dh&{ z%kCmo?q1g#N@*#i@<-t_YYx^CzZ?;`&@^xHi+>Ywf(w&|G4Z3B_z-(+@EX@*Uty_S z8e?`tr|OIzX_<=t7xs{XMEzo{WJ2{L^ynlR|h6+H`)Ex-O3>0h{*i#FY2g)E@f@^_ zN&3gCEB#D)M@&>vad`#hs0fWzOfk=K7_GGq z%4mLN&mu7QXOw2eCZ4tCUBjXdcRA>`>)seH*LgP=~( z+DbUtf}UpLuC2UHj+S#gZAZMr<(#eP8)3k-JVX)Y_E?-Ym?%q<`y?IZz07ME^D6SS zCj!6&_OpN(7EtVKCqYFF!n7QUX*=R;cY^ecmiJO9(lWPodq<)cF<{G~h@M0wK}%8= ziOiW+sqJj3Cy)8jk`VVJb!Rg_QZ4uU6)2M2jt`@G>KDwOy=BXmSzF>~)itb}jrq;& zIY~*0vuS+8KaP#zZEYjn^guK`XTpyDLk1W@U)`QU-2KRFPIP#qI&-CtoG@qe8HeY) zj)>MHp2_<_d(T%r;bl7 zcP4q6k@}a@zjm44Dlg{ca0&`;JME2kmnrIA5#PPM2e@A3@f&&i^v~qyoNm)w#TCBk z1GKpZr53e9?p@v^zbPN)Ob&Ot!#X0Ih;(N9vp$o2c*Sz$X?f38Kwpha*rgg!yclSi z{wnxcq&q-S7VS9mHBCAzeKD;(4ws6`UMl~REUtJ%q>`PsZXXM_wtfKaotZIFZq>5dx;G4X$I3TSlyc<`Rg`=z{)@h; zoRM3oi9zIJXey)KDl%F=DgTm^E-UeC6Fs(f#)getRWj6TM*F`G=3Lgxy3<~l*$hFr z%q8x=D`b~B$+DxYGpf1M{t~rv#pV9UC>zh^Kp_6B$IE;!vrO;8kV+I`?QPvV#|b== z+8`<8q=@B9S6tPDftbCsG$yK8EnSi28z{?VswR=;?!FkV2sh`Au}*X`avX?^mPdC+ z`FzXvM#!Tv0EzCj`$~M7`=gk)-M-8iJC9Hz8U}{W+-n23@us7)rR9*#*=cU}+1usp zm2KU!#d85N-kZ5M8W~3mwA{JWXMy0Ic6ja=p3dby3+0BkN^gMNcD8^^_prApne#(fghI>fL@{h-z|iZ*#yGcKeT>Z&bLJdWICsh#0zkRkFkXz80% zwBXGtdWv>6{&wj})$cPXSyASQGYwPbnjH&$hrf}m<4)A z`pvgT-b?rj)f!MEV9pq%az@1!q8Om{9;#(rWwD@m#uk9$3M~aiFMQy2k@_-nBq6yv zCSA*p7;_kESZ0ikDk9Q}z=%V>o@6LeOv%=BDI$<|IIC%l0dBa6vzM__GU`bxUrzzT zT38NMPRPtSoRMOYss=I~g?>)DA|0V2i(WR@`=kK;6(( z+iPAEn%|D_l$w&i&h!pTygJNtaY`;H#-wcJ#E6tDy|D=LPVUSL?+8mtYcQu=y*VPK zs$qD_wOdSSeSID0#do*9X1%3*X^;GD=iM=sQb$DdnY4ys&1bIO9NB!PssWb(JNrJ7 zpP&9h%Ng^Ii(1Y^Sa19-glSHctZlynaR7g5X-~_UaO)l)Xx4^*w&3s9Hjsta?cd;w8we1BaT$HJ^0b+lEd{}QuS(pd*TV~_B`AnSk`r8mjdAi}}3>3~h zX}ZQdn?SU5oBC#)Lz-bbh9Q4V3z21S0qM@#djDBU+?(o@kDfE~I7Ghgf)1&*+uGWI zc=1OT^q`|&%KGS~tdpLDnoACvVy*=Q)m&;IP9Jix-r6%&-kXE#`0lnNP1rBt1}(pk zbdhIcOLut7!HDE`3f=J^xji3ebYrbFOp*5zt_>o~xJu%f0#mn-p$;AocNZxga0Kec zOwkZ_q>a~`y|*1eHgMrPT#*ICHO}07m%nM^5eUXaq3)lzv|B*&#^=AFcso1- z+2(%mk}ky+xiD$8jn2DqJzT1g`(>5|j05I!`I38g#+0y*M?S_+BP&>IQZ!)W2#gWr z{-tf**O}wHD|^}onquWwMBSA4QxW9l`q){1mg}U~d_5)UJt6m2_Rt%%ZU)FMIY7}C z3p=|HxDS*?a&hOqz7g_%3TrtyEcu0|)txCLI-{PZWQ*Ji z2bhRwmb{nZan=XctzEnJyDwk;UVirA$xBVo1{su1Gv-FARrdJ0D2>3hsjcOuMmI+} zMLjPs-CwH|^|$^qrKW&fnAqI)OYj{o(EC6eM^cBXg=(!9M za5<^tcNOs4`r5!)| z+%d8epgD8D{;qcxzKs=xGAvK zTm5xReC#!O_BQ+)n^y#|_2RxT9IK z8Mh8`LvTGU5i6^`3#f)*A0OQot8}LomtgQ4XLB8ZQSoO38f$C;A!jjsb!g0qYdG8^dsnPAmd9eL? zruo__oX6?3JLPtoryTq+yjWZDybcavjWTK#XC|~C0qvtXrg-vRN>tuYEPW{*GLu2x z%YraA=`=fiUDRj#>}Zl1R0)fqu+m)^=mmI3aqkH3O=Zba=$Q;AyfpJvY6B>L4gDBb z$wYnmaI7LFL#dd=w9avyGi}Rvc}YR1K!Wb4@4pJyJ_kY*y# z$^HCP7%SWOJ)Po#3(;lpbpSE9!83 zaz#(&Tr|=b0`L}OuuBs``9}wQ#6Y`=-bAQ{?K+}19t|Y?cvn*i>L1L{Ek+PEwe?;P zT1nm(UW;&YVWJzNoljyR2@oX zaQFV9@5(1=p`$N@3GgS79hKoNz2OM-ETlBSBx#ESGkoh~J)N2EqdH8E^_~C3aKwy1 z!b&c_n>dGMFC^>o?UWkFw)Br^7}nAsxp{U=|0vJpE&Yy$nSGNN4!niA=lF%valCVD z_`;tCa5Wlh{dh~Em8G&J0%IpT))?*U!CiWM1P&|(bc*raODk#J>c|rjiZ4898H*oJ z!#4(hJ6ntV0FqeP`&xPLSBq;Ns@x&xJ6wY9Um}?N`29<@#IHkiawu^do!`UtaA{x) z(KO*$!;+&beow|<&pu|zqH+w7+Xm#Xycax9s3(XY%ULBx6j$}|ak8dLh!OLW2!EA0 zU#$}IG3cZ1UGFd`0E@Ne#sUuZdD`sQw5MwBnZMhgtSYoeF? zGVHw>v6LIRhY1n|@++nYS_$IXo&<_l!x^A>HKfYNtKlM0|6wtx-|GWqmsWw|t2DKs zXnn>a?EuA_GFm(0%6b+vrHRo)ZR3jgx>(=^TYd1B1HP{LVhY{H!j-- z_@LYyL6%7&9oFVE3%pikt<+q}d`qm4z1{Y1S!W#-jdn!p%#RsA{Uy<_{II|?rseFK zo#S_pzs&mBa>(cVm8J^Q3e(Meb`s`m?F+Ny!`>W6Esd%t2l(&*}H>)wypRi(9+Dl4&WeH8>0y$2^O zd`A~6Ef*HzqjsI8inlYbbtd?qYt&$S-2o zS?U9tezxmuKV94V)-jPaw-dZ&JdGW(IAah;aqdC=ZCbeN?C?0;<(j|i>_nW&|1zAL zrnH=`^f-iN$d53&8PmsKKoUZ==B$0tzCF1g*0(HWJZX-V@Mp>Wq#5g;+ku7kf$lV? z>RTTaO*-+fr230Xeq{*jOM>-btT2@6B?g(^t7Lj@-DGv%F*LVFQH-zP_ee0nQp#48 z6Bdzyk7k)gIu3P}OJh>mkUau+X=nR$d87R_{CJ~19L36q>jj{A^G!`WkFitr+XITn zxDOP+GxY|j;oxkM-ckK#;M&Ym+l?db7`I4!aimwf*roSz3}b$u;5ZGj?9wF6o48cT zpm-YBgW^&>28yTlx*GZcC@v}6cZbK4#6DfxbxB_Ah9q{aZK~f`Q$_pMm^+1Nw90Lg zM%u{ZEQv3D*SsEQ8Y)=ZNT8Op4r}WnMl7}aq3U4W`!MrkRRVqk(1~^LZOpG8!ctY*iL-U@ZsvC#`N8}L zE`|AT-E}s~!LLW*+_Zkz*?Mt(<3wCviE4y?o$z1I#&yoFvtgq8&`_@_5#eWe_$xo* zI(FCDQ#ccz27gV_2uGc_?m58H9vB!cS#Nv*H1CHH3XSYcCoK#^gV1!68Us+*HvLoN z9Gs{jXnI-X8rQ55=n{=UH0Q+XthOPzgY(`IhqJaJXy*-qwe?!ebVOqS4N+rY-Mbck zXb`Ne%Nc<(C)lcYT(q2xqlPibx|c0Al3d)jAlD@ zehl3l87pHf*m_oo+Yq>?Y76rY-@R;xBa4{M&@eTfq;xST*oWAre#W*!X=9>Vep(|R z+c_W1DOmnSaQ6NQ!+>b`(y$6SbCebN5?L6;#Qb(?%b^{ZbBOIj|iyIiy7=Zr3$1Mr0?^?KbAeyKm|~tv8RhxBV{G&H(>%kPzn|oFQFv>&{IVxy!Ly!7 ze&zkPZ&vdn$#a=}c=|#A;8X6`V@AMf876Q^3+#)ELe)T1g`h3Ca2)2-d)AH>7;2QtB#*96Q6 zu~bvJ!dDPqv1WKV7KH=gJuwsF|M^V-?#D!mYK`BbZfJM0_1a6?#0Ij)4h zGZFWKq&pnQgKtHY_K|y02(0F^WV4iH(T4JS;At3^+oZPVXpP4^UEHMO>q(yRN_>b7 zLB})Em&-kBP6NecBG1`9D4mR9~aK zI1c+Gyiwebnu)$jncXvM>5uZV{RJXy0)=Ie?=(3h7W^G8XDptJH>9W&eaZvpGnKFx z${BGj{j~d|f7o?)9za8S(TGARiki@rLQSHCZBP`{#G2%*dgdbnReHOW0V*AoMJfO_ z5}L6~9iW!tZ;|f8k)*dvG_c~9{Vk|e7S{|k_bUR${is=5#6oGTNpCH)Nc%y}z~3(2 zsru0!q6I9Jy2u1ZodPwF#r+XfJoBSYoDAKO~*A)7cXF-XA0?wD*qEI^!y>7 zq{Ac#&)g^vuuPlMI1P_B;Taox_=G>yLVn7;N%N?W{!=&N9S~|Vc$!gp;!VR&c^FVD zPMyPBt9|}&8(Z_^PwP0C4D_s#`cjF&6<`iy&$i%sDgG!83P7UwIzdVJ^L-98aZODG zw$(+I#edQEE^8u4^RkHsB6~nJCr+`pwSdrXA+TcSVD_ZbLM-=<)HV>-)?G*&y9>vu zFSAfz=TR)0i4D9)@Xhn;ku?{%sTsJZ9-M}H$iQ#W!kSH@xuOvctL>B{o3{2}C_7i8 z=Ga8-$J#S?s(#_kWHlN$_%$_p+=h$G1tE zGJNZW@=b1#xPzE92k%Ka8Q$_K#(q1$##{h9WJk#P*PEM@B+n^1^LjIlq=Ihn(fg2w zOD&&Aly8W{>R|*efbia3?5g!%;HHj9ZD!fxZUmNncc6D!5+fJUigsMX#VJW!F09yX zVWlr;v)g=Ou!59Xo-yi>(9D-&BYH~8Dh|8CW<8C>MHgGa?)ya}2Hm_`OgFDw7;D-( zv%-=O(nxm4_)hZ(Hp*2OeQA_C8#|W~x_kVr3i%{YoC`IMvub?wuz8k*wJ`ZGRyrek zge=Nv71IS}i7ujt#t?ik83QU4dgVLdmqJXtR0Th73Ohk@zlTBb0p|0nA1$SG9PPd0 zTtKkbVo-kZQA;*hxteL7?PM#Ly)mfTk+KWDuxa6u$C{w`-Zi?>j_(u{L0Q5@Un5L7`V9E8i5lK#NvO$*Vy_G9W2bVLuxtj-I#ehG= zwUSBS_FB2M6+;oWU;a@#W54{Lh{5$SP#?-?Qp>fmVczj_UW}Y(mvf_Xk`FeFZca?` z3=+9&R?L z_-X8VlB0OQ25VW-(+is4jtv*}Bjfu~LY2L|Q3q zpf!#&bYI(gBdx~`=0R;SL_C#p+}id#uug)CtT!^>Qi%9$Om|ANwQUAsLga8oWNX_v z__Um`lGq=nj(lN|_>)xeb4dIQh;QBV306wjbE}_X74w{eKMu4a_@C66hY%Cu_NSbJ zM&S!_?baKqHjzemXU15$z}peV1U}mQVR!TQ$U+VIlrA!Lyu-C_ZL5G!{JR~?VyrDE zhVu*{FD)OXj{G~WMm|r67eskrC#@(CCuJy^WoRrI^u?X41Wx_r&&bE150IgS(dYnE z1{jpxbjozn^gPVTp8U0SPbVN`KFoOHyUB!rm!3trlV#$*A#2n&;Tpp$7$fdX^qOM` zgZrU0fx=GgQR)Wv2%kAdHpeLUjWFskW7J_12D)OF3d9)&GDfS9r8q?AZ z&Ye-tgD1j^dRsQaT<}xprDn`-TCRkTcf6a=w|IPI?q%a#XltaMwnlp7WLEo=`#q6j z5Cw_WH>)gZYG`g7@FjaM(Pvn>g0qb8e%ygr-~3TLF)SyuYtOL9X;=cijBo4y<{rGV zD#MH(G!|pY2;Y;BAgIrOqtw?z9$Z$@3tL;e;e`gH?QWcXO=jOLxeT3v4?RYKO+L?8 zZj(3Jc5}gr4B<+EgBWO4DE~4B~@;00N z_4EXJt8M!CumneOnOI=Uh>;`E*~^ipmwh==hz_vnEuY&)WQ3e+lZ(vq9N2~FO`qG| zH($N&i=uF0pZa3dOl?s>E=6a(Ev)dkgs>ajE>#K&7|h2|;H16lU|e>(Qz11mY7wZN zjG{e`7`K`U^Gm*Pv+G-Y!uGwuMpMpw_S$)a>)P z$3gM9{|3c5e-4VrrSaKj7B?Fd-viMK>NfoC5-l}(S*Qg^52I)}%i~hp%lT!3YGk3S zv7>>#mxj%V8WuR}uyYA-pxIQtsjdO*m#6dKot4&s(p$cD7_z-Sfh)UZ=kgr zAKQ*B-)JLxFC9@#(ZxzuBWUkZd6{>q;z7k}Q&uRU2-dQy8ycw%qQ(P{i7FAyY&jYG zIw=f~t!_qLZSb|z6^*Y^O_f?ttS=NTsgeTfvSA8Jyum3%A_WUi!QU>6w9ZGeyj(It z-OO}LmHsA1tpde0-w29pxg8X*qz|jOE>OJu4uRq^-T=j8kgj@b+pls5>EvMY;?WH(=ZkmTqTqr>GRIfbll064Yww!OmVX$5loR7Co-P_H%jH z;(aK(jn`&GC1(=N%xz2sOmkR$q!saBk@No14n$w@pyPM z9E%APtN`BPP zR4<9cWc`!~mKT!Af|n5EU3*L)q$BPZ4XT&?MDnLEMC@SbKMpc1&no(;(J;kVvptw|CP){;H5Yn}D z(6}cMGMp_ZQ^}gM}W?XdkGj}?YN1S{GGM+O8DR{HnA{7 zJWrI|+Z30R-0O42HlbqT>7QLc`pRSaOnA-+m!0NaazyegzC_PRWnY}R?+D*sk4R1Q zIFhgHb0p@m_p-qc-)HaJPa5m9_`2vUyX*u`^fk@%bv*?S{uGGk(&P_3qy57HbY!Cd z)okE%MN>SxF0e3K-B*RDMyO*XY_w-m5K}D3QgAU}Y(piG+mCa27y0YPUFd;cHsyV=tig zby25@35SopWyRO^I=fusYs&O>Jx_Gki|lxej!mV$u6`ogslNKU#`7_K2w^bV>B-M|e2;hF#sD8AO=mbmS zCs4;3Wy6tkxe(M2_}is9Dn;wgAK;H=MjZdiC7*u&$nZT2RIXqtDA)@U^|CIZcSg!1YDx@QR6%;3u64_dJT@h*_t zyOE}tW2=6Aiq%;2faWt{7brdxreQCchFzlWg-=3!pfZ`6-3W@0M*a$l4`-hR#m6di zSDuId2NWOIMI+vAEN%&oeCB#9C~m-afr?3E0qni}){+|4WZ1zwI4fxg1N? zOM8-k!o~zN#Lorm9ZH1epCCT1@1PE_Nzvkw&-(T|;K%1k=mQ?4E4Jv>dhGH4!`{0G zMp<5o|8Fh~Ap|GLh*6@97$g=D6s&{E`kFZeLG31&)%RD+V-b%Yj>d}j9h8GGm^4u8Lt#Ng@3 zWXCi)h!MRvwY+{{LKJO@nRnzse)73j4iv5E`O&~z@1;XscdyQ{sdu<;7H?-Wusx}NLKuK-9(Lu!$`6v%q&FF=`}x2%8b%8Z;4%x)Tq`Di4b)n6m=*5QVK zSL;bApB{^-MA-9`Yph7o8nlvxAkO^c5u1^$E6d1~PD|Cu)e<|xxtJsIO7zKCg3~1m zPPB3+1&|>BbcwSwivu2^B{m8lp(wSee8x-Y9l4w0k9>o7d9iElTJ|GYR*42GOd&Lp zs;UazVqW%Dm!?|E4$qHDr*_ul)GX*Y<<>Z1N|_@lGkkE9K8*@@ zTnn)F8m;X*vbXO2GLYTp3M#ek{XNib9c}>K#pG{}ldFsLH0@~R%n6~Qx2L|*&smNz zIb+QXJcB$nRiDp-xxi?g6z3OTCy>6*PdUq1Y?O=}`p^q3USl)9*Z#oQ$HaoOe7+wA zZQ9}{n~!3rql{tFnS?bWnZ=RG^~L*+9VfRv!z>4Q7T0u*Cct#}L^{t7x`Nm3T5}Q5 zS+pjkrvB~iRl(afpt1V)LqJ9md>Tk58X}zT4$Mv8fTWPA)nco7;zcv2vzbraQ9iNt z!r4)x!Y0vQWp!xhjnU4F|F)RBPP!^;0$(#;487P)oR@lk&Y;KKtsjvT(=E z1hD!dkZ&c6DtmXIhh#3fm-3uGLbA%k9j_3RH)7;Tr1Xkw<8NMaN9kzj`N-ZT8(fZ_ zi~Eo4tRav|RFKKIj3ufwaZ(-AL0LArCF4MjMyhf7cCWV*BX z$@~JxhT~Jxp8Y@Nm!+6?BXod(q4uFE+56BGqS|6o7fD(B&|*0}2%)|%?Jg;Kx1cS( zCoS&sO}!`^-k)!QTy$|)FgQU*S;;HzlbWXmOXoIi^&36tEQIFL!fd;(}8Gb5soAjXp-IFcS-wYsoy9mh2jRVOsJ>+}?$hP-afvkQ) zShbR8$O%zPD_30GKCLNM0;LIp5A&2yxGyw(F3+g_3o3%wB-?XmF-PkeueBfF8BWNt zy?s~ChHye|?%H?dZVxB^LP_nr@^*w1|E*B|rf}j_g@$bnC;mmD(3WuGr$DLwM<`3x z?DHN=>O&56yUtY(TcyU(ACqfvlyR!&0uA6Kkqaj!edMY0>G@ zVjrf<6>T{!%{(z(uAox=rVD(ktm$I<_*Rlvo@bl^)KWFUU7Phvv2W_t&Rl&NyTq%^ zje+Yf8N7ZKq8<|nZJW^D!5_ZG{^Rg+@R_HXW{p>prJ zuz%FK1EZcN6*;B54(VBc2~YAt_(nJ3 zGM)8^%FDb*(_E?GvzYWJ*0-?r77OvYeOUX6TXvp~Ns91o^U1dzW#HR|^VL>p$V~2h zMQ$U5w*keW0`DIU@B3RIzhR`-zKUr?sD0 z7aP%jVrn??w`9PMS|WH>cGPj~s7*pD`1n+JQ(<jfgGpggFbYo+fx!Jk5`x_mW zgHA&tomp_u;JjLe7HLMy}c-q z0v_@_v@Clck{OgeEeAah>Dr+Ra+6_5T&9H~$s2%d(#f5tA@P@kFwvy3O<@j@5qP4& zVQJR`8G_vpw18A0M+`fqC)m$<;y>T9I>9c~31;&PeSsOT&9ENxQ7rSJ{Wxg#0TOkt z%K6Tg*}n)UzQzMM_Bw`Lp*--Zh~T#G%5M!PQVIC zL$%O9CfVp8mt@%_#?xsPTS{0Dp!Qt2X=he!EW$32Bz;h19CXUb((TV{<5EMeMA7~M zQSZsBSZ@}hMgx{5;&oS=1iOmB{^ZPrbeGA#pk)Wge)&`tG}Y^Eghy(M|`6u%>RIXcbL^}0}V z>&FQ8X2fY!*7k>cfNZ~!y~Xw$5xxBhV;FIs4C4J3$o88;-q-@Y7|53XWk8l+LlD*s zB+E6T#%V3yZo=jg7INe=L)7gf&OxBr8usxZ?7KjhY1pGcBl$+OMusfJ>Wby}I*^qy zo}I|{syV?9^-QyZr#3!H;^DAH7{R=u~Y-)HCQL?0`H?XWY zi5SK`!thPrEx)PTiv`{~f8C)8duuXAp&LpLE z=Hc3_tARbE&&gV!w9Zd%Dd-uUtSgYKq3UAlqZ+%Zr3H=J;=u58F~!f|s75(sGsN3ld}pYrzGsv=7NUgRgnG#Uav0YuBm8+4XAM$hD-HqreMK4xnJf?a_z>{?Gfz+ z`K?&D(H&N?t{5_(n}_`pl)6h<>j&l6ETt#!zFJ_l=#E*$Yk9B^W6xMzEEIHpRn_;K z$laaNesj(=_k#X9j2peC`^t;SEi0RPrq1q)E$bh1Zoili_0445)|{#Bn8xB={d67a z70et}&M%5x-aqGxemUb`NA)MEi?zl-kyrN5v;uv~GgEad8LvViW@$eb0fpOw{T4*4 zyk)hv0@z)}@Guamwj!odd8}IIFTEU_TCuK(YZ#eyvGXccO^KDp_h6ZOY*WL5MVq}L zT-M40M2TQoYx0^%>ZX#)9`|v}E_oIAhmtg!s`jL@>$WxQO&9?F1$2eRdlsl(!(`X6c*lY4B0UP0U!-rR0!jLa^H)GG!E&aiKr^UM z$oU=6G=++YZM&c3YH!yEVZQ>Z;~Q~CgLZ2bS_ZUGp>04`gMC0&gKaxDxUE~aZ`~Sm zF1~0wMc}KGm%{SSbw(-8yMV;v(q_g>HbIe0bH^wS@o`PTTDd`CAd6uN5BDy2gkN8b zreDk9{UtPv|F&G2Td)Abh9MN2Nn#)Ot8|HS`P}g>R^E#yaza$n6(T?wO5XeT zYxD+V58V?{@zT}QHKg)i3$-&vu*dF~YJong@kGway5R#rpVoLTkX<2rz8OU$6s2s{ zCB=!n?UlP?L^JoI@;8@%@@du%VpifqA?T8>0`E;k<7iI;NjJ!6t)|h-FgrV-Jrqtn zOos4f=7kgARw#E@IPn#Q@@@(zKBG|n=5RvhNN4phZaj)TjrxMBQQ?FLi+iU989@KE z(DEMeW_;?GBG2`T9E%eF={gS{tf4d=EC$I2)_zs@9BqKpG@8ap_4Z8ij?B)fGox>s zlQ&PdluK8Vy(oip;5U#|~OowpYxJ#Z%AC7s(OjnF(|L*O|2m7y;=M(P~Z~ zLouaiWj9~0Z)~9bEih<)I5C=hGLA4^dx&i3hP#36-0%e;J2!Lz-NXtDIX?n2`dv6y zc1Cy^NH|3i=Qlux&tC^>(=gdrH)&eoXIa_{frJLe5G&C2`gU3Hb`_B2{3#%-mF#;~ zE8${Ut%P-P9p!}7=!{|U%UH5@mRJsCZ*Kvzw<5}EZ@Ynn)q%$fO1HOHnu|*m+CBHU zD7VM@Ifums<+kSagrjw5YR+f3m|i z7v7lh6hW20cSqrM@Imi5P|#I*jB@~f3^OU|dz7HOTdBuI8}}L5mJAFe<%vN^-%J)RohdS4>aU zHZ&v`SoBnFz2tK^Q^b8iy~odOw6c0dKdrd3*R80ag0Ya0?8&js$+~)4l&rIiW*lmy zfaC(hm~>oLEn2*+7WjUQI3pytM*T}yl$3_Nbk!?_)bhyWXXD57cVFJ=p#FzQx!z9B z7hS;7{zEPgr~40iVj!t4e>q{}v>A#uGX=nWR8r;6l%3DLsC^eEhs(K%xXGOWhitQ3 zYCBz~dD4uV12rpiF08{cj|Gp&vEchM9Paz|Y%o2*RRNmbGX$PO>a(TivW`Qs zs|Ti8JVct{yntiMOlt>&V0I*;eoDPk%`+<-ixBJEFHf0xec=#gw50QWU(W`WdgW z#-pt4qD+dO4S^a?5LK(Y{*hiqqf-CMM$u3_8TrEJlK04q)P5oTi97bd?d?Df2M)>~ zJ2^8KLdPiPA#oZE~`&9FG;p6NiA(iE<-o|R1;j-(`424LHg|@EaQliPZ372 zkB~CKUR)di8Npr-Wb|JPkP+-R0GVvl4j?1lZvisW{j)%p;yxfFoCU2L>HZ9mk?y@f zBPcE6)KCu-XIuufLu+-AU%{jiM>H9X#Q!yr5%I#@F%rKT$Pm12CHD4jgRm>1&KL3& zafFDsTHOU?wW150&+^11J?++&YF;vIzAfF*7eA^h!Gd=BDWn=uD2Cl4dqKdq1bqy>hdXjP?1Iv-F z7-ETWB}#Xv%c;8-JUXIcOF7mvdC@r^$)s?{w*VoW3#tmk`@bkKayz0OB<_Mf&fi8) z@YtuPutB8diQVn9tz=Jv#$(_tS3C6R8T_m3-%F;+u4;1hwh#ZJl+G%l5p5;ixxDnz zZY92!7$GZFe5}bXB<552BPv6UDA@Q^{O*b^rD6?w747rvAvL7xHnO@eOx0}@gs_nU zP`FP$t@e?u{!qqit~p%SDzDadwT(+XkG++L<;iC4*q(?o~jaAeV?T!C&ABi+cQ;D3=TLF%8?pZ-U7>Toe?pKmt_8*V#7hjs*?XldX>&`F~v8Xl| zJ&fYZls{hZHQANIiAM5__kj?v4+(%#*=rQQsO(Aw#Hef^7Pa+ip|3`su(mBHwRj%} zMgL6!-^6g=As#Uk+$X2IuzF_M*Y~0qc2vW@#qYj8$xY(*F(96a;l6EDMZz*n4ENnC zVFkn+&tUG_*H;v^=TZE{0Bqkj@A66Y5-+2}68p>1?!%Knfz}=Z68naax&?(am$sH-Otj%S~wrEdYU$siw zu%iqA!aI*=axT;~sgD~9@NyCE_&a+JoMR?@|5`$Hutv_YvDz;oI#k2w*htOMff_zX z$Ej`3yeR31&#C6m-mB;6pbej+W43gT4%zTII%3sxbil|(#_N(fI$Xo&=xCMA(ZMob zAbZEov7x$wn$5A1x*9O`!lL-`R=gVN;=phHkVmLIVbOczRG5Mim%&_GmfVycOa>B} z$-Ey5|D5eW_)b|P%1iHNg^ff;G;s;{v)w{|=#moLq)STf4C8%_Z4LmFkm15ob+DK^ z=)QQLSgY>4W$!KfY!NZ(Wsvr^c?*bV8KS*cd5b5~)1X_bab6b{DAMoYJEd3q_0M*% zf9UJ1{<*4uPHug??;=e4^i7S;mA?_x8pA>ljk8l-G@pg=^&{ltULkEEWhX0mc) z6v3OJhs{rg%==H<$?0i(e!Opb_|7%pt$1I>-g~>317VxFPgg&-nL9ij_4cQAFoKD> zzTg2QQK2vb`bJ@IORsDvcQw`r=3qq#Nl$+%br;?^xyy6A%r%4mioaYj$PsZW9bwz? zETE6DI3kYB4B6-+&JTbrYyr;}PYm(fTX|z|M}jc(n7$#sWf5vR;@m@+#rqPF#XBEN zZt*SzvUoQEouO%W1Yv&*6w$CR1!3O?8lz#~4Z@BCS*=#HQ(9>^09k4G0NHKUcLIn; zI#2UNMtll%Q@@LL$aRiNhI*4=sGVHcIID|0^Ke$1UvqZJ`yE$_-sN)@>1bFZdl}0kPeLW!)|-J6sc`evZ)(YS2&^0=DJoqi#9Y zCJuvxwNQ;7nUae+I&Yl(^m5-pM-j_0Ff@AsCD~Y93}n-E70@W=W5h`Sovx6KkHs5C zKt zNzy+|extd;b)NkW{%)c+)*>No zY-WB1NZMjE^FE&JV`deF|0AXa(nNUb#E^>?BI9!8A>de!ojn{UDspU%)-2-UCMu!s zZ`$WMZW#(wbGbfDD@}>}rqhVL4)Q}e*K59ug!u^ z`lL-Id*08mKcRgh(v8E}WwF`D%}coB5o!aSU*_2{CynfR`yOwnl3fSHpAXDi^6*UP z`{u6CZ178z`0R~d3cUF|DsI(cWo4-oSn5Bbp4HeWO48+b$oTzlc6v;;QKAQyieCVc zlWwFz&BvaW0?}42jMJvRoDeSuP@gChQg18T`tfWXSnzehm#h1!VEU z5EKk#FnLiCNK-v4l2j^q?>g<_s5dH1Jyj~&um|0?_d_@VOWu})bB2U>pVx? z-h8wf5kB|~DZE)xWV0fC@L>y+nL(IZs6F@QO8?w_yBHJOU(rq_=XFQDrV!3`>Zc$09zJ?w=e93Aj0~u?$8|Y~b8_sFd!gzEp;)(wZvk}Ml z5pTG&@3&RdSd>;g@^Qv%LVrDhh;hVSXp8Msszav2JQT^PQ`HuQuDbY%D$F?2te!kM z;GDPs_g_32;@fj}faaf%|ea@-GaVKUdfy5bvU4ZK7{n%`6Ew9HK_QOu?9`pvoiIxT_MrK%Dm|4K5+zkPjE zq~JSmBcqCoo?KW};>0#u4cu#+Qitg%)8XQ51%5djQStfpXiqFmHRrcL$(1f&ATi4`uf;t^YR*>)#ru|JD@mloa`isr1TCCCtju=S;)M}8$w0p zL(;=O@}uNaB0rfw?;)y|Nt1XM%z>WI2mjYQukx4Sj<3>v-W;7IbCeAjGYfJ%$2<*p zh&mo~b@vP-vSm^E+wcebP1yA|VP#tuWV?6yM$+PoIPEoBx1i$ALM8(C%x$AXFTXlU zuHNySX+1Q1Kcf!Sq)1~wqaWpnY4~WgRFfx60sl5OJFu(mr#2z3{CB!T4@IOg@Yx!&+W(YZZ3Bd zT&%7RC;km+Rzq$$A)H+oLtx0ZUQ>rh6t>oRS&tMnkt5`6UXS{KyV^`?f>rt>k+8?E}-_~4dKKy z0_@6Z3MXVM13%73%vhnkC5Ra-l)o4;V}*t-K+G5@bzi#Cze(!D|7(p_QY<-K+vUCk z8LYNNErIaW;kuQJ7{yol(r>cHvTPn;JW=Q%@MS4S?2gY1tV4?zkas5VYyb)e7Y+!?tLf?K9MOJk5?;mFM%s@}V7mseqiNUs zsga?VZvxqpmf2w_LO801BK`#QI14xAaI5JF&K6KZ6OBC$NXU_h^F<)b<@-REi^!l@ zE^;7!RC5tBYb4)@T2QlGgq<#?4I<8DAdw=$#0!w2wY!0SplOBRvb0|Vvb5g>vKssZ z=n+kO9LUm&+MS_JlaAfK;e+m`?TE~pe5|;YYH&ZWdDC^##jWD<>H19@w)?`h{o+n) zXqvxd@q$T1y>49HxU%+2Udu=B_2rZ2dEQV@d*YI^DS=r} z&((9J%ezHF6K?36?vmx%2(se=vflS58;Y~%eepNt4E|=}-op5sQvElhyXX2?y3o~{ zbE$rd)cj37RR23EUty9K?0ZuW)j#2xtmIjD^T!6(d}Y~`!073~nwJb+^J2f|*p0+Y zwmV7l#tgjNRlUkr%$*OCw|ALY6YrD8^%d@27w;PtyNc`2JxvKw-Y=JQPv(z?43@)5 z>QT)&oh^h%_s4jF+=1MEN6FCIY_bW(JWHGJ7r6u&3IB)tRCi?j&8hCT%3sDl)6*v4 zhRR>M>w|qLkfa?_{l6hw;=dti;y{#~am-@@Orb&3P+-PO&p& z9M|Z8RB!h;nb-6{xo3sfXEbmS!E&df5O2EO5==L)@`Xc%B+s1(y;kEfwz7VfuM>2Y zKe$XZZ*huvA*Y`4spr+4?8r~AEmDzZJ| zc;}!v;j#63I8AL+aL-q#Q6uAb)&SY*T4Ea7cY%zq6;A5UbQ}3^AfskQ(502>6&jSg z`dQvsif;f}ithqhidTSa!}}eOmGKv#pJ*8(c5DJ5h? zwrNc!j&Urm1u}~Mn?Tm0*MY3uH-W6&*{}y}GrtPR;%xx3x3>UU4Q>NkNFBKq2l^+{ zhnyoowy8b`WIU66?xZb6HIVhe5+Lh?1zT^riOn+Fx^=^jEt6u=9kKP>W6||nT7kB1 z6K9OFukOHEqvw^e(D9RqmpK$uZrZd3ExgufVbyt4r%t@+QnAA}c$7lNcU0xQpBLW=JowhO(gK-{$03e7}q_bL%aKY@W`T4C8YC9h(<_$U8W>D7mUwclh?oLiY@q zIbqdPpcx*E!yUs|H4Iz{DPb=OhR=JH-^hW6oXY2Rk3X<5r&ZnW zm1b=uzoi!?z4YTYQLNT|fpnz@s*2T{b=r^h4>d#aPF5l&+O)H15K8gV>d`tBr3-43 z_0nnDXQSLAy^AgkcL-JN-&lIAX}cxNvg9+UWjT%4De8@w_#DKtTres8{NKx)Pzql~ z`=+`#=n%|q|8Oos3?ffKXCY9X`jZkGvEhn|d+d*=7_2=KrQXshHrb;Jc7I2e5?-ab;*= z|K^RC)7kX!5n`|PW#B*2I*ozW42Yv^SmVefg}SboKPwi|Ry`;?oOfAGYf|5rrA@^j zV(mM5$CCPN3tJX7H_aZaAU!fVhA5YweEe!TtjQrmX}NbDHv-m1|hg zQv5lz=O9+K=5t zz%dw9Aql9>t=fz{7VI1mIU=?@g&6Lns?F~Cowa#rm?Y%t*d}c?(5rl5fOt0PG>ZFS z4A7n%kn(Ak(mxRu?nyO&hPoN5&YL=!&KeyT5L1t44!l#!qCA@S9Swrfs&rtmNX(v_G0>9KyBl z&mQ?vMnq+vbd4ayBv&>73855nwgTBK`6`g`IzrA5`885Ycp9TMOn4dwodNV)(ng$1 zfqFET*+66XMw~i+XEK{2&I%xr<`1c<3Nc$0ajx6CdFz(w`t2L=rMvwDn_6KiM6chz z^(OHTFOHsfsB`EvQPZ$^<@)V6Y>1_)8i^I%hD+*AyP}gIabPH{x^fAwq_5kI|LfQ$ z$sQ{PAA)+?x@Ggt(e)5iLTxDxhSN29Xx)09D-@dXBDPU8`Q&((>i>f}8$~3H*r**o zI!B8U$tpJ0;#T6yB>*Q(W;N6hh6^qQ@}&1v8?3SA5&FRK<@h|W8^YJ#Rm??sU0Keq zwBo(k4;oDQelYxKX9_{Q{%NPoI~_fT0^*RY;UJk(29%e%k2A&+rnJ0&^%%mm#ai<28Nwl^?RmkG2ose|C4rzrQR+o8E8}sA8UrrT2Zc+t87|SD8{#MCiHt+I zL*%B?8Ouq`&$yp^@2u*2oTO+!PLeO=@Hx9(x%HD2|m$=EZT4oo6-Jy7($JW(|;tbM$mm3MfeB)^jKi~si@!7k>mZ+ zGJic}&JDXQU@B zfsFhcMjRs!%YckCu^z~3wH3(n`v#D;=%0Wr#S6jP{{pi5{SL^=5X(l^-f=+I-lag6 z^9?}O-WZUz_W+O(h#}{%fNaD5TcAG?7ID4}6s6t~=ih*=jAAyi`|073QvqZIz}EFU zHtm?oK06h=K|il+TTx(UE!)_h*cI)Ppr#&uLO0cyMoyLhW z-sb1Jmt#+)crdi?b&hdu!yWB3FTkcdQ`KCR#F zXbkiv%rNXJEX!YRws(ZCI|Qbj2c_Qa2SMJ1JAO-i3?Wqr-?8WY8+kHI3g_Rl@o!2a2X@w|k*j;#2KB&Go^BWUV;{`YBwos1sw5uxg!N z7~2`3!c)^e?`|o}NycxB$Te#Pyy`D36Jm@&oG;7B*#Z^>k{ymIij{r(l8@l2_Ra~$YgU2JlYH=_W83}lClIOhY|!kPhO`3W0FXpNA{&D-+4 zmar1d?;}9AJVn{m>L+4~_V&MltbR-Nmc!fs;hxZIcW@J}n#z`u2jtod94^LG7tXHUpzEmwhS-EoO6B6CmWzF%8IG6Bi@v4DrHOm^d)x00*9<9|kfo#40E0C>M(RvXn@sKkM z$lhKLWNUcv#kpY%JT#Bvc8c}+pP_w=jCzwU zn5M%n-C`*D6(Ad8xxg397jfPKl0J@jW)S;JYWXPTPtHR3gZJ0WT9xaziNLAbI%`$FyUvp?m9yM?C|$a4ttxA-!6ND6 z`&Z!ahjwWVc1rn}63VM}Z^WQbox6b(UnA8}A3i4JI>4cio~(v2i+WP_4b`9n@nlFf zaC8BvmDnbgpm-`l@l?VuUVGs^EgoEA#k<8?bfGe%yKj^JIF6|A>DDnzWq@*5YR@dz zo>{3qvpT3+NCxOVt(r7edWKpEtB2~bW^Yr7n(U@~7P~v?o|W!4#%QtI#)(`iH9Q!u zM+&4;crHG|-<+F$7WDtka7iB}f z?Y{+YV@yv=djQDNiVnD?y$?tbP=tD7vY03NU_(j&&Q#PCPUkhg2hgh0sw?F{`_(%42fMIu}d$8JWOR5@Qvc zMF?dljMx&TX?+Yh>1(bM65iK%)bpdLA8ZDtDHxT2 z%%%mr@GQ|7rLCuXq#}PHR9IhZNIBS<*~IqDpdkNPH5Ap4uKqjnw^f^6Q0?0*C{4l( zTh5sBLVFpmdJM>Lm2lV$SBV;p(OyD}8O{|=xEioj$dNm7BhAGstC7+|kk3`@<_2M( z2*Mr;z8}aA{fmRJ%|KTBuL4<$mw~KSzX7sZm9VU>ZI=RB z+v=#_WJiaQ#1XnD@|M+LzfZfRlX`k0+H{Z|LiUv3x zRMuoUObK^tYU3=;$HPEeJy$pQ-hf|hPW5<&lyncH+J1>-zRpu6PBZF%3_;b;)@9rK z)9S?U_iG$5nAO;2IB_@WkTFj4n6)`z*tT5XC=sXVDq>l50zS!u>6R}Z({C)OB z0k|@)DeL!M72DxK8lPFjZi*mSlytlz*w@$`{hTNw+;JOk#j!-Kst`pnnzX16@GD{EPB^F4osZy?ya$%#K+ z(sPTyBBV=1tB*NLr&~`2v_Ua_Wy6a)n@+<;gHFS2@}|d|hKut1O~XYx4TtE7On=?) z-p_KHtcW4ynRqQ$$dn3sWQ^5~@d3#Zn9Me49fHv|vGuLHGZYBvrlXf&R8kl#gRaV;DyODoF3YY)urCByHmF7> z|1#*e=7NCP3Nfk}BcK*VjY?50NOH5(_ur{6NKkNP>gh)W7kX55yn^fN$0fK1su!WD zhWz+(kq9}S=R*JH!&e(LcrpHp+{bL5uxI&0T{StJxRub7iR%$TVi<^q!NI#nR38b)P zIiNaIDQ5|#h8*c#Q>>^1GP-9IkkL3&WuvX+v}9gvl~JAjfvR)a@@jQV^A$f(a3fh?CZ zAVmx+2U<)xvdcg==8J%=udWWDtwFq-gLq<2(nj?Nkd0~%j2%mR0Z?4Wd>N3vy)}6I zkpO}$^y+d~0QI9>7i`?Lxpn)7E!o8Dq>0x}il*gU-d38{4clTHqZ3=X*xCwtyJ6du zsJmlB6miyd4K*toYuD8`EvmH}u6wBslgr8TOa;i;sdoeMC6V8jleP@nHHv69v;fW- z^23Ljq@U%QP;`Ba^kw^PVcR`it8aaBs5~aO9T7wQ0g?q-pp(9CF)R>8Qz3S-$P>X@ju>aRlNA-C9U@U)ou(i?kn9b?KkH( zxEtGV=Az;QvsUNhI87~IJOoA&tu-@)@qaJise5P7p7!H4?pg|7>aLo#I@fKCD@!{s zUR|6=1>@DxJfG9lpSz>J*-kn*%82SYoBQr?Vh5N5@mGwt2CFC4>-D2|;9+5M))|-8 z#pyNM@l@5LWi!h?93ow*P@~AlHsH*&n75xyEr@{GKE}}^ zO`QcrTgAd1+k_z)FvO@-5TpJ0M1)Y(FUkbzSbw?;N**}fZ7B@EwYn6(Knmm32!67C z_9-CSU4@FdN%7qufQ(b~7a+rJxeUJT>T=E3rt!`NvUv4CmP-ss#7INV-r%iJJC@5Y zfvg5cfvg51bzy0%f$XiA?X$OXeQa+NK!O1y>Zi!^6A?>$dkDzFgfsPF>W!l~FrDqu z3xI3~zY3^T>(>fowHIf1hSkOXg~fX%fbxhf)M3aO1!O5i7-qfZa$ykG55EgHYIbx| z?UfBHS5KM}om8`Q^`z)le8pv@gK1ORK?nrCHUsY}L1-K@;^} z3}thpc1i7(wM$oe_q@_U^f83Q>HOlChUaXX*m99_a+Xf}tP5hpkXl;fJCyP80vvg< z#~C73wI-lZHZoyBZ(qZ7vV%oSt(IpJ zHk|0>rMdV@h30d0p#FPfjYz$LbkMCpU|uYfVcaslwkiko63JN$-D8YHbu&v7HQ56v8m2tr!DN_r?QPJ+Ra8z`w zM_ZmdNVGD-j6$mfvh`g9WLRt&kjumkIjezeRSVs}hHuFE7Qco$ej#DZ_K5Qakla#6 zoOz74K_Ztd@~07}9Y~CjhMa>y!o9}@aS-+_kWrAY0nOHUVui}W&gA(r4LhG-3zJix zNyLgQ>kNH+P4IRXkZ|vjt4)X9v{_~9Yq75ryLrWi>t`eQ<{<#8uKs)FFEXO?$JtKn z#VU5J40qcmxi~SL5Y--!+V+;DU3Ix<=%8m2S!>j>lp0B|jBO0oW10o?j}$W$3+5fH z$z7R(-#)_dmm705z2e087L%vH@2%CkVrFKom(->>rk!w27{m!z;?VAc8L>SgE6^7c#_gSLPzmPsN?gOruvMGa ztIK(W+5#M-uE)W-IAYb&qls-6kre3UIvdTiYdw z(-woQXj@2=f!cK;T?%9isa4|f4LJw+wT1K#62{DnI6_L8W2xalWB5j#^MWv8oY)dr z3AD$SD3HYy7Rs;rhMe8}cJqxmaeig1hfM<{H|!Bdv~(=2h%&F!u*KXGZQrt|rJwi9XU%7Rq!a-D=L)McH$eAO<;-LoH( zvcD%)&=;IrIau4dhkJWpnbF%-&+iwzNz(|DPbUj#dyw$%e+e!DhPW=t(1v4YW`nDI z#(kfhHrk3S+af#0nWE&?fsUjrI+EL%U3+d6)&XfMpWz%z^-=GyTpkJECRo;HBK1lk zl#SVlWKDUK$63gzF`F|5cA4{`(mBp65Raa_q0{CFn%n*9Icj|A6T*W?EiRT48!tIgmzWzE&CF-D z(Np1$6TGFjcF*koy~Gn6KH-D^sY#@{Bj<>Pt?)s~$(oEGD7EAB7$F&m=N-U3CO?LZ&Vu-!mqd?Su9P;EVa z7DzP7LeAHL?5%9ForFc4CxC3V3NPO_?LPyVmRtI8@c~M=6kh@o#$ZIre@ii%Wn{;P z@j#YV)U58%az*vZSb?%EEthXgJbn8xP#Gmg#177qt?OHD7xkEPX|?g|vMu2Z78&XE zZEh^OVf*&2+Xu}p)1jP3TCrh$>!vL?h)6ou*lgZW|FT-MGS;2wn(?1`ZJuZn)H_2s zU3m&@2s++AkD)~jXw<29c7KP5OH@oQPCpefmGd|$C%_h^w@G*^U#II7%c2RIllQ$$ z_PS2naxyfYIV(ryQVroC{8r1MxlTCaPIK}Huka^%@2~x2>PVAayfo$TJ2p6VD;?d~ zq?EMh42+xMHL)$Y;&>;@Q**LU11ub??#WLB0a9Z5AVwmoY_c^2*;!Qz9E{v+3C&Y&`wb!c)kRB~S_!aW(_lHtO$D3%6dk^5$(D zJn08EsfEiHtX$ntYp1*OZ1&ttGXC=&ufzXIojrj~>ysSUyorN89H-R150ayQguw%18HM@v8>m+9O-QX}=Lq(U_G2Tq55p+%&cgO% z*eh&57L~`jvFif*G`N?$btu~O9q^bc(^rE%)B4n{U|)6G1JiuZ0h6t-)3Rl#;(a-> za+breM`*F^bflBU>#9l}ZhmA554w`%=!io0x-}R%sIHRZQLrkCQwO!fn)6L3yC9gT zcy$t;?A;d8@34Y6uW4s4+|Jue?#=9O*?K{AG>ZN#NLkR=1p5R$OVbS znTQQEcgr@>K3@NU&BDfaoa2-xpBz~2^7$Nf&}$I{C$#@pcX4r|!6r{Cmm~7=(mCJM z1hD1PE{2BWe|U#;76^xV4o{s0?t=DXv)x(VROY-T`0+xW1!jch`A2?8VOkSrNeQz- zPTPmI^fg_^ryvW=6t5sGV*+?0K*~1Q>t!f5U4rcVxJ7OFfI*DXX>vzvJS_}to$Bp5 z-8AhQQ@wq94HSPoV!q_s`ht6V#3)m5WNMcRIdsiBrr=>g5Qs(lXG|QQeU<>PGI%>4 zSRKDo9C_L}KQ_iL^JFqqhcDGjxxU0q>40*f^^)aUvd7TSmRN-~sV|E-Fez0|zRyc4 zG^6BWTn%iVDd>0kd9=V5Lpjjj>H?_&O7j+epwswT!Y*b=B2E&>@b)KwEX8Mm3g6J2|nfLfLThxLif>CQaNi zoBuEkhkk#ummatAHxwhE9LJP?{+?!ub#thBM1-5sT>HH{(%UZBnNMlhxg~`QxJ9hG z4i-Wz;t4@uaCAgxeNOfKj;Gu|w9m%zRr{>j?m`J7-t)0h10s}n7Ra^|VS|Z`&klj5-S+)v&BE?rmb-40nUL?AOaWVT11v)!sOO*X#kZ9LJp zx7v0yE4gKbzwWq)aVJV3dt%j@b5lQbM=r{H2DfS5OXx6#>|*PEvIdD9&LRnVMmMDP z>yBq$%<0lox86goTBzqW;QtF$f={$Buq#2;9(LS8sDw)cDgk+yk*T_wkO2AN?{1ux zO)#W>G=OAS1Gl$&7tzZCia`wdis8TF6_$E=U_7?iC%fPskfcpfCo`Ev^;0GvK>_VF zq;&S>+0=DFcAT8LmO>^`gw6deKt_|?4rJ8C$AOF{`6iIeTw}@Fx{;k&)uz;*}u0WY6Gehio?zyz`uvx|`6s`{zhN8P`eKb@k@|K7y z2!}u{qGCe)s%W>2w()ab$l~WbWy}p6O~c&S`|v59(#%UMUC;BY7Ro6jZFr`b zHw<*`PtX4KiopK$HnD$wqnKO29?R(9qv9v?&vtAw$uNXF+L#|3fyBgp(1^fb1BTiB zoKI?h{qvsv^}k^&DT()9s8%l0X$!Hb$2 zpOHC&HL+cme^yP;=?!^L+m_~$Oj}J*V|#{);eU>j`~Y z&Qr*_4agAiKLJ_VUjSJ=kt48p!fv;CPXk%Jp95LEUjYfB8FKyrB$RT*nGF^GEci3z zh&GE|Nn8nJw6VxLnz62zfyR+4;!GvBZ9O*uSs5P&vNG-jvb4fFwK84^;*}yBWN#NN z#6nhd2bQkH2&LRmT)%0{rX3rxQsJ5Krs2+H;v;UzzGpV9end`bc3?|0d_FOL-=}EV z-*}*v+K=xDCxmy%P7@0!q0Kh#gT zLt3QJ@U7v5DE74PDj>lOg+^=$Cqy8^bAVGw{qhDlz5MVttPikclQy3vgqwJx$TLgF?dQpR88!e)_(kE_ZpIJa9a>7+u<(v6n_Jw znO2bkQI>2!)_)&239nt*e5b^rTd%ju(uqCzsq9bO)epM4w6rbF>O8Saaf;6K_s&VN zd44J3js$(>Dfxvvg!M9bX@~1pPN0Og3Eh8}?p$Uybv71k)dZ$z`jyTrHR;`c{QvKF zbEJ$fqAn({-}kZf)%xxE z$a1~{NGOevvmMCtlVvJ6BIJnXqvibP0FtXM%kLf_%TJCYmR}c;<@XyP%kN^4qvf{& zXp!dpF(7-(qw_tUs4!nULi~*9K)6a=+|3kZ6e#j$iIiqs_b4LyUv#a;#g52rrG>K6 zGwr*yX3&|2=G(Q|hsA4&I@FBWk-=!cVIvX!D|598R^v-k`pO7;hztz%6W<((3twY~kaGIg{34bO>dw&oN!iE--wD{z2`(%6;A-Gmu#`!rA)*d^k00Zrx`a^wo#@QHMJ18+l)7<&4x z#uMGTS2VvmpfP+SPD>Cb{9vPWZvrxU^a-F}Y6{UyvKqVybdly4VdmT0bAjw_4Uo~n zi-4@ABJd-)EaC`FZegDSGW;p)$MC0Ia~u8?orLSOMdK*RS|oD3hK1Jx+1uNLx6cJ{ z=WkxWY|#4TVnAmL2Z4ZCkgCKO9WW?hxV{7ByVvtjOlDZc^1e?wvdi z^vh%`pB!hB{{02b@KN&pQ*D@0U#N1&buQ0g1;x&v4b!sy_<3%j$m0*2wK^|W+|Q3- zCDBJi)y>1`vX6m!{+>u@dW${GV$XQ>$#krP%wX9={z$bV&hDwb!6(1_zcNksRaQJ~|AN{ZV zyyHF7tJZHnqw4w(jgG$=*;9mGDZvMJ5C2-vnN>C0tE%cgG)rF02tRN{Uxc4BM#9c~ zF`nt6P>=9t8P~QSs|+XBu`&0YhKUq8m+7F+P!T<$!7JUdeOwMJ?N8ObYhiARjWrUE zKSxKy9@&mlu)^^EKj;$zKyoM*H(~LA15lKYe6Dcv{7K`Peq<2C36U4D0Th#rCp~DK z41=Fk3?zHlhU#}3jFvgoO#Q4jeteJt8*01}=$O8JE(123p*m3X$bsFLKRZa*8?7&A zz}l)x_itpdg~wLe{RyZeMnHH-86#ltgar~%wCN4!%LEU#;iyfTW+RRvaSQxx2itJg zl23ZS>0ZVoHGjczc9t{9uOM(+uur`M?kwS%g&DqWvc(aJt=q=~!!+V{B%Bx{uo%c$ z-L;k?4M%6%6R;MjptR^p=Il&OCrHjlxUi7NtI7Mn~`o4%gG}*1V>H>)G zPtgq#P9TPpShu1*qOQpULEfUu!`Q2(&EW@@l+CJqv~y+I%y7p`UO-jlqv4Jpdk@v} zApTtAy)5syD2(P$ktObqmk!`+af*Kvj+DPCr8jinK^u-fmJ{xf!O_OVkt;pdn)QbL zA!W*0v5}ZgL*H0fftsJV5KX^-BXwH`WwOfRy{nTkT$OYz*UFG}J%Gr#zQs&PEv-*I zmUD;PcgFWl4`Et#XE_dWO2ZF~U2!0Pd?41J*L&c~Pgfr6zF*SBJbwgwOR8m3PPe$3 zO)V`K*JW}O-q$W;YuQ~0OL3+x#lQhWeuK=BYJYPq6_ZarMUuDALP;Ie90*^GUWPt| zI~G$)J6*D@v*3=R@r$YtG<~}AxZGLnok<5rBz@`yt&^-q5xYOId1`A@z^_C$Hryc+ z`^Fk3EB7Dhzv71OyJd_58xlJUQa_q}gmyidKmLM6@$S~jV_M2tgJk!rq*P9G;?Ulr zRA1-VJ0jy3)z!O4NnE+8Tg>~!dy&u=y6xy=x#5mE0M>B>Mwf9+iw(=@a$7T{L1v|m zuDpLEwXgr^?jT1Q)C>8WYOYT`n)4AE9vu*Ol(+4X2`$PTnMq{qjf^jGyris(NDa;Y zrEh8Kjh@^YM`eR(hX^oECoCw z>XLc(ME)nkHoKW}kc6@u2nPi5cYY1qegnvO*K*1f+awX^eT>@6d?U_ceoc_K5$K~D zCQP%BDI{Eyx4=*#=N2H5X^%Lv)PdvTOW_w-HCo$p{{Z zIARz?@(ekT09m~M2*M_TGpsHb16f^W0a;yS|LE1yRsqS$A>w=-NSM_Twcuy@9U;uh zJ%=||uJBc?+!a8rT7#WH)((-n^lAlUJ@jj!h1!mzK$aryjpd%zsk&z?T?H@u4&#egXk{k<-GDl6g+Tms0q^KM*48?8*Fcr=7!5 z>dkP+YZTo%zWv0+*qHVcY_K9{1>5L+n5IB_$GfPR_Lf`80ODM(0J9~-+UHfq&ImtX z>Ol{+5Zy5G{`)W7Vfyz zDCOb<^}}Q>R36zqp1a#7CQ-RBpr{-4c7~k5Qfyf7pTSA$y)%NvI!QYiqYr3e1oI8-KiP$4p1$6-ohgXVl7J8^kfOTVD9OKF4yI!f zBd-*5si#Zp-8JNTmg-1Z&6qSWIfSfwl5_f+WVwv2H)BpozL%xRcjx_1uk}JTMh#PYL8p!tM z?*rN1B1o3AAa5@OvbRft?Cl{S+o6sF*{*dN`<$K6#E++)%I*ZRliJq;=z-wv<3Lu^ zW5L_8`F@J?fh-rp%2~4drD8*ieMn5=?-w!&&^D$=}iKyQlR< z-NMc#)81Mpa-m0Q$rN$n=NHp{4Ef8y(C`5Hruh)pQnR7>5Eo=4;0q`_dzJ?~LO4-E zJ{f$75j>hqRaury)mW9O3g0=4y}^{m?wSf1@2v`VlmW%!M{^d^Houp z1E`P#)WX3&`k|mUZ-D3HZ(ZQ-VD(Nxnvp(v-+?QRRvz1X)`6?X6*dMqLGkm$Ow!b= zbk7Bgx~~U5(0H`+_@FUAnvO~I^B3_mLw;t-4`-ut-pjcqD!D8;3aLI=c~@vI%?FC6 zE%(IwAtmy9yTxFH_2wJYdwNRGJhWs!M-)5%JQnVFLV957Lf8#7Etx*+uCrR7Gf4Yh zk|eVCSXYP{=5p*FxaU&o3#8@)8?sJIDVMX)v_;*b`K`U^@zUzbnP^iy^qIERRN^7} zj`Jk`8yurz^E*TEk4IG%#zs_)hz+|Ve_9V`&}q>{)V6MjPL`X{)T^X+A7k1^yaSUz z&fSlK%F-v>rGoGw67dENb0EY4tt@t#ozunDU{J|se_!<~89P0F!A8~*nL_kXH1+i4 zBib$T?n0(Z`GKof^`9BHD+kwaXGhGlFSD?4_%p8xy?$~kbFodc(3oC9@u!v}Apo`Vdr@)ln0 z!Dc7*n(3mVXPoo{!8Lu7soV&ZrY!;&NTjtw{hcE>a61=PUMYQ6ms6%Y|wu3eT8I5rxknOoSjF!l>h4hqed#P|)gzXt|UI8*n zppf-wP(uK10y-0fj+!dac1@9{9j1cdY`+#4k(O2{2HV%g!m^zM#V()4`*rX(OkS4a zb|9lbz7T}{M-cXA5Ox*y*iHI~vk%CqraOVGmEQp}%Hj}^)!-)qG>UzDEKl4_0vTta z7HEuyiETX#YXP#JOaRH28*=UivR?Dq%GbeDUXNqQ?cx|J?eMAYgq+$azRi9%q?hDVEic0j z;lu{UP%eybDefFDlp<^Rz+$H=>UxDQs!7&I+vi1NZ?w-VbW1%9#|cD^Bz0wrk{hF) z!@=>d^*r4^k8Qg`^5ejCX8ZS~c}jKEpq&zape1KfwHN6AK3Sv5+_Swqwaok|DE7Oa zf2_L3J%^L|! z6wwfs(?047J(s6KCPX?CZH1;rRRS(b?Ux+lv-;f7VTV(pUbi(wH324cVrWX_H!W}I zd!AgZ`V3}-F*WfsB;{o>Ql0jBqudMSv|Lr_Mj4XiEj9$D(p>3l56O0an(~&>>GbxK zfK?a3Vvr{L+BY|Q9rJc)$a`m8*`G*N(d`9Qw}$tBjdN7hh;YZ}_$%Zm2syc01nq@r zP0o)lPpc$}1eWUOA*As7NW;hEiCvYe zfbRmvd*2Fo+$Uj6p@hA8PzRZZrt0E?<-wLmz!pt(o5ZCuD@4Yn3Lg-o-0h@I-3+hG zE#!7QgfHr8v9-az#b(Nw%#82K&w&S4&lN$>1V39Qkc)MfnW<{odq-skpX1G|aK~7g zAKu(zK3Jm%n^X_zq?+4@GY00=y2BxvS<*$)uxEw&V7WXOO5E>Q(6Pfc~tI954;4XB+6!a<>5)I_A+4y>j{FI_IbatB5tL z28^1l^fh2gX8ff6L>0@lgl_>~UE};M4kvCbfC;C@E7vO|#w%MC%EKt-l?vsf?6N>1 zao<&;kSM@RQ)u|=aAG1*OU2!SwOR7fx8q&cSH^mXq=80zTF~KL-p2}y@vLoSnPY&3f|Zn# zuD01eUs%@Uc%j|27OG$Th%i32Ht?Efat!v1mUT6tws6!qZK_ouImm}Q{+Ukp4!F6< zNgo;r7@kqA_YU=`+8Z3bGZ2^?Zh!Q=5mnp!RE7*bC za?RcaPLjAh^_&JM#c@`udX^5qPX~bV!X4*H?(*KfSYOI)6zt37tt)WHYM77rxU4d? zdAR!OYNC-Y_5U#UF7Q!R*Z%mK%n$+$%pjvgi8x3QG!Y^}O_+!YAq131LP!EdKol@U zUc!t(%S*#Vh9k7K)oNRkEA4|NXAD&p9)h zp!VM0|L1p<$vXS&z4qF#wbx#I?X_o>!rgr#l`k2%;jy*jzHq9BTg72AHBblL$ASh> z*K<2kW{$~c=-37XV1FSBKOP5U96p5ZDuY~n))9TP`ikV`PZ;~h+6`J5Z=roKzDNsl zQf@&)d&(iKd}6Y(&%_L!au=G06mu$bPI?+HV8-MkS;6*f918Uk{#ogh;WfATBfREr zhbrxY;v!b@bMXsNIhZ!={5aJDvuttGS7RJwrpHM^#aZSsG_CPXiKZGs|CcAY^sz#M z;(Hf211u^|XY7#!Klycr{We0-G5Uls_l!7BJKu}~si5>5K)R~sxKokoZ9pn0k+Z4o zY8c&V4#u3?*6M2Y420=w^=v>IuNKg3iFY0#v#JH8{ug*KnHuSQYqR^c6Oej-ybe&U zeC6&Yu}7>Q;a4%=4X9ea-VaDI=RuI8S~Vj6ByR(?`4)AGDxh5r=p3YoSYHNIC24tp zxl}Me1?X#%;sZdM;zZ!8loa%vtI#??)YV6t#Lot8cCTY(Eq-ie#q`AcbX>Oe3 zG&kxNG`B|pX^J!;%_9W-6+$1i1X{L}0BOlP0cji2Tfer^_W)@d{R+^T_?K@ziC<0o zdqA4@&w#Y-1El?LdV%AY^a4PteOd29yItrS7c!;^|3g2-j>Vs1QUAiS@w1KYcX);o+L?80 z*6Ur{t5;mQ%9^)oOBAlFqN~Muh}BfHD0=aRbsJa2*Icw_Eq$P^+puyKZs@ug*8{JQ zAMFO(88r)QV5Z&25AsE;uobl`I)0w{JbOKKL2FhO-jWn>=$jg|ShT+$u;^D*$ZJR6>) zb+7Cev=cfSHpum~=NPnnmZs{C2k}*Ix%Bt&B8HR%c&iuLdfr_*4(o)-|IqcD5oz>b z<7`=~{1}4D4?s%AVqYlv7PtnC#^I)b%SkxD$6W(|5-0%2L{AGe0P@VE0`aZ^+LIb9 zW%S&CrE$48kKw4OQoJO-ELZZ|a5QEZ92KathTnvR_BEofcVi-OxNtiWX zdLngpV_luy@zB}9$IZLrS`q^#>-13lV|41yx(~BF9RHtCx&Elu4niL6F9yUG7vo5b zsD9vRCzNb~z>@xFr1Gk)wyFAvwlPw

    fm+?O6_vt~HN6IoA9*txvD!=NH+n0o!U^ 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⋘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�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%0AVk{)T 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
    J4H%UA z&I>yQmId;*nuuV~h7BS8HB6)k)V~%Z|gP z6RulkNiY10+Y6%y_DmzN2|HevHOoB4fF%w)ec?RJ9%=MA3UmjFa%YB#v7n5keZxdM zrZsk&`XM$)BT8ZUNR|%Bjt5T%WTQZhz%MLorAHuH$zN2X^*ju|VR>VNZ8s=yb{s6c z%i;SLenENTMQa%chg$Rg1WI`lWZlB?ec=^aFIeoxSjlM-S}+L)&Tywa}Ku>vQbaF7}HThf1I^5xL+N6t@CxHqHZZ@uMh<4aI1(de5rJ%H>tpcSj?E+B4qz+yUO2fDnlh2Yu@cm=5(Xdlsg_ny$4F>=RHUI@3ra&njooO%(w9Tt+f+IIGui>77kY86?oAv5bf2xzelK5W)>A_ zQuVQe<6mn1=WQ$#LY#M6Sk%il&**lcBRF9THK7`RPj@!A5jC?3FUhRK8_RW}77jmj z=Lh=fL0lThZ_JAIkK%+%C3VCBhF+)S)3VQ(N-lMqkD$_~x+zh*wiF2}q)HM_IU0+6%9)-RS>u|wh& zgE;G`sh?GACVFiZnH>kk8wPP|fp@%X9Da}-cBEUQ@%YRfZ9=nV@2JRP4%;zeH@p=4 z2hfTUv$jfX&_v`kE7|w3NW=12f%}5O@*a_?kMK415tP=)<)9`?ePol@K7fn%DzP1u zN<0TjCH@KOM3MLil=chXITZUDT_y`V)Cm#~w)?T5RNo{}s;>gnSkbo(l=fwpIMfZG zw3XZmN^L>Wf(7g_um%2XEUmG3LDMjcZN06!RoLS9J^pUrf@T$otvGAN%5^JJDMPws zr5<5hX{NIojmVmff}s}X8n?JWRmTiGFo6k6f_xDxq>gqnuMAA6!?#wPnz=L{~PE`c`= zcEEGetazCl2~@6uCZM!`*4lBy*dVuY-qg8mGjkK8ct!3$sH#B>otR-cG}L-FD;xIK z?OmWm_TIT5V9a32LM<4iA;;ri{<#-~v3QZcA}iF&r&w;MM<62V{?MQK9eqHm1L4nvgB^@iY z&JgSr3@U51-cGdyZaEb-+tW3oMzK&)Iao=n&5#mx(OXGdBy?6n6mz!bMH%vfcJ56` zOYvrcV0xr{AE8b}FVxCq4R1+HlS-&Ud~z)%ee~5oP}B>4pr}jjME_t>Grv&Oc%jYC zRTOoo^+ddfp-CKrB<{`PEmDpAoEHC5>u+qLRxxAQrHUPA8WW0&if1`hRg~WGO=oBG zMY&@x>P6MDN08abVAoLnz*!0GW#@~fm-VRD_ z_)DNp6NwH`+DrF9O*|RAu*HW4hvFBu%H>MUGeM~q&IVP>d{7OdWfdsZav3PTyBfCc z0Hyl4?LqbNVTkgwfl(e;s5H(z@=$xFMWTV>t^{RzAW$0a#h_;47qo7|^<4ZAXEZ0( z%+({+Tmwoqp9V^EV<9Njw;Yt}TL+5kUqS0?P@0ZCpj6-2pj6*s>9)QyP#V)&pj7jz zpj7jGP^x)3D8ADhv|2%FO#ci@WnXo8nLS~c1;-cbxGIO8HVzdAHBWdspiU8LkmDNx zRV%zXtIuQ4Yxeuv@4sSHWIu~BK4;I5p1DNWMnd0ejrb($WGb$2$WrU-m`vYoRYt^C zH4M-EiDFo#3!@9qjAELydf}Nd%;@o!Bc>nrBT#$d&hwVXqVlC#{j%}Lsz4GlEFA*W z)^QNXk zC%;&U?7fX3>`wkosAex<=5HJj_u||UUH!fA`r!_Mqe|%jj^Xo-@9*s!f1nFEsY@=U z?(LZ)?CtFi00kX8O^yEqqz)N`-rXrf?FA;rzkD3V!OGu|g|j?p`|T0F^aBT(jCPhn z2*?zx{~T6C-7HUK^3%lydZdj(AZqlhK&jEc1Qbs;30iHSIGBYw1f>S=PEcx=?gOP} z=|NCxmYx8`CHp-a%b_8nv*%7F|8$qeQ_Z{AT zhsT9ajdK|&V^l#IqYBCxRZzyLf?9@O&}zoD4ZpDUB(5s^io@FvijOdGqza*d~)B+hlev>$`;7?Rg=F4Y4|BKg||;!T3xO zi-g6#qwO_+t5(En+;xY#hP|7CwihTf8w4QF1hVQHI-({Zdrd{gCs$HHw^GD)y%T|r zkibkp2s4Dm^g+(p5l2Hgs_Qs_#IjF%Z9_-c?A2DYnZ68rY8qEz`b=1*`?d!-oGg;xXC)8nuMcQ4k`CJUIw4t^0Wjr-ae$99nps{^8(#nT_ zVL7C05U8Lv4Lq%_CxbdfeBB8#Gf?Z}8c$0%O{@L$~RTVFwx~>ZEfY->W8mScceUmCc zbY&wk|E8HuP)rT?d~jc&HlUzBJ7NpUL9NO#&yo^bNT~I5B+h9jd$v$78rJgMoapgd zd)4@(`Spq0O@%dAcaqGK^A6EyKZ?H=>x}{V7p!|&>eHrR_AY&26Rqz?6V28pYL*7E z!k5+HZ=&Yan;Jg0%ffO-#~PDVXH7#IDW`}gQ6`}YO|*~GCXvW&ZTX&X|96`xXFun= zr#ZU&U9_>D(*9?5Rww{tGD8>^^vS9Xz!qZ1EaeCn&Wgd|;=V+1sk-p`cXr zNKmSI0w~qY7^#-&pwyOd0;jfwy|vnsW>9KNehf-pUBrvS=(5tLe$w?L^?2_gOJ z%L9*;Iti5GszB*D#MhG)TS1;jnpMbPTU;JE?6$x;)d9CHuAw*=-x_M+w-^n$xyoP}_z` z+lJh>4MXu%AUj@EfRhb+wVhMY2$MIjJ%2(p7`O5##JT% zEYF=Z+h@X8sYXx(@Y7cWON5Hz+5y?1oD?=lc$YZ5YeDJIk^@B@&VjJ@^8$w>LM8vN zmHd~@+u3=$@rrz?r3K!4gk^O77GlwKkI*c41}F8BVH}*G;m>QH5{MlcpILytZ|2b@ zwxwn@ALxvYYs%X#d%N`z&STwIAfYrz-i8_=Z$m}<*h`h^@m)+(AWJq1~a5a49Ns-+JX@)ePgaxuSlw4cDkz>3g)WR)D zc0Iy!&@x6(Iw^)TeaNA`9jgHbVP1mk4+sO@u`EfS6T3h)Ihy^Q>TYzZncBI{Vt-@zbJ)V0g&sG(uC^mwYd1npqGdGb z?yA9%F}~lsofu;_KEAK3>6mIP{Fp=we-w@(@pmUlhJa6U2RT{)rp{fA+>5ADD4N%1*O({11PoDSAbG$ z{bNw7k7GsEcRMK6cONM22c7_>*8gvyR38nU>U$rQ>iYiYte>f@#l)z=GkNv%I0 z#;Nr`9+X=D0#Mo#`0!c{$O=$u!8d?XOMjQ+yA9Ok_=V-Y6Mu`rDwC(haPu0SZN9g- zEv7E-Bfjv7-TpD`T8P@)%!9IG)4qjLFxOG@D#$)9qTSI5u>Ip!gVr$|h=k`V9f$g= zpFP}>M;&;{AI%Hqro5oR9uiOP_7gStm3P7gG5uLH&IH7tANe3>@UV`q%znaG7alaUE54;)G@ zRu{T7W0vlcOs?ZVIvbfx8+|dnjg3CfWNma%t!dQy$Jt`W!RK6>=s`5m#y}&>GMQyC z&>uA-%i8}Z26_(+G(^~x=5@nB|4DLgDx$2@d+zj51KkYDmvfkcOm)oj4e+J2&GR26 zA8J|0vYP+W$w45y(YftR+)=bK=zHai)*2j3<}ChXHN|($#T&?|Ia=wqMhgKP1P1oI z@!zbP_;!Ft)bdUQNo1??O$&3rp;W_|!Nohu57Um4Wk2eb{{# zD2_p~sR~!!2m(Tm1Log!B#e$n;@YQ%)keo+as>Ms9mW?+d*j7Yi5O~h;n*can>tTR zyfxPQA%tlm1DFf!DW^zmSiz6QFDS2Yrc1nVYZdbXht?~9w@JuSe=hzo6EHp}DFhSa z0X7IrLge|->8)G2_shbOOh?c|B2_~RXL%S7oPB~pigxOK1@hXGaYnVCL>_9r6$(U3 z6e30avv=@gp9qtI$ezj|ubwH14Pi8z)(z z)`PK*I?ueL*=18$BUV;fo8(=+EQA%b4#D-;U1)iE=);0DAgs-SNE}ln&V0fONpV z6_gIxcRIY?pmf0gEhsgL$09}=?qpD!%2H68L(@P#0BqPgZN!Mv@V$@I%u^X_`O-6R zYUP*_3zjdp_`C$z=$Pei-ppW?@rvC7dg=g&GXOF+;pw`?$c*ak#f9`4x-6{$&;(j_ej3_e=iV@JCX^O`u0V3#(`QKZ)esBG@r`sfv6DrGy|~QYq}*qP*#yyV&lY9q_;HwRO|89W zT|5;&yRAt3&*p7|WH!mgV;VNQCYU}wzRwdE^#52a)HjVav-%@6wL7jIa|e;f!&j}> z2vFKK$AVH>W~K5t7En7@3QB9(98hoJ7nG9%bo{;;_i9OHv#N>lI$$(##QhpLq+|*agWdyrC+^DK}DR z(bLSxWe#iOk@m>N^bO{i03aoA?ITKRoyy5d&D^n42uP{UZhqcA`A+pvK=au(M9D5ke0}lChX0%>MY=dCM=WYg?3&P`sQ-TC3~8zCS9H=$TZoQ zc<)mIneQP_FhPih8=Mt4-u7(X-^p`_@U$#hejJUMYJRXQ(EQ*70L_mQP&twx977x= zR3oSXLd8ItRfm;l;zS8&lIt$HRrx*K32_RKF4JP#J30g>E(D_Mn8mJCg?2`Mf2Bgj zkxH(%j6-fWkCJE64_6tT?N%U)Z76$f4|7eF?aILYOj;ahG9BYuvq z5bp`KT#s8Vb6p?K{{L`&_#zV#lk6@JUH@OK5Ay-xDK#B4bf=L#1^mCbMvO(qQCKIA zo}eobNty#T@c3E;9u~9jl(!;ruR%q1xiD^ z50r-X2q;~7eh!qbJih@-^}P>D_5C*})%O)B)yJJfs;?I))prmmU3rdx(v|0NpmgL~ z2})b<$)I%R%JpVldFD${y7K(63x7{L66{ zwtk?M>;45_E6;%}MDYu-xU6B)$~ln0>9}~KAddF|=PrmS% zFoE8=)aXZ8v&|~k=915#9beqSR>}yGq06`pEcD>jyy?unj(-wVWIVz$=y)WF2P;p< zZAm;r^k_@)==}(%S9|%gK@vYsg!ax#?#DUo-f_wO*iY|0G`SzA1$)26{_iB=aYViM zt>k{3g6w@Ni67pq1J}+_e$LA&UQ{W(GlnV^YGK{4+1n3S)SDr(o{zBRNvS(%mNRyQ zas^1s(mt0wlcoGP@JZNLfL+${K9)fvv%6}#ADWsE^o^c`ctrL9s3&mp0Lcgpu4hLE z7BaD98_kV$3~<&z)9pHu5Nd2ZUkONF-?03eJ*%T9;)B;_Of^S^M%v=2?V*;VBu)om zs~aZc{z&Ky0Ie%$@3V+&^MQWRD5Jl!`M|-U)<+qAl`c!pHW=%FsBtY zZ$kn@n=glq)_pu1iQ_kT>nH}|5A_&hiNGuU^>7`i1tLNsW zvG#-9IS6upym+krBuWCku$M|A!6qj;zGw0iG9BHL=cFuTPU~FJ?DU zpn~#g9kuZLz*D=gG%Iqx=?ue4v)_z&les~FH+n>Q0s(u zmczRkR8)A}f2z2fL7gMK+Z`VJ6F%V#T8}$C_9xU7l+)c*_EX$15#E=$Dvz(dGi-dR z6qNFg2UQ>`8tL$gKxxWnfYKad|EJVbp!iZn*m@I`_S>I>QVGr?m8t`!xbq!eGbk;E zKZ4TP<BRbdP&_guY<&fa8#iET(I2ShY*6aU&P26L2Bli2fl@7VK&iws zhdS4xu63x}9O{n_^)jdv5q8kp1u9>te}S4H)SIBj3pKO8Z1(J_r5x7d6cDfxSH!e8 z4W7kaF3y=9#ys$y-!z=Tv4w!z2G2RO_Dk^nU896gPVu?pvH%XT7n4@+evJYfb1yUp zWT3$rBsK=jh4Nm|t($Gw0q6=_E+}1L8w*PFr4ke)8I})xDv$GA^4YoRhdTM!-b7O( zNiwHfIR>fq3m$S6!#VS(v~LQwY^}u?Cn5#Iqk{?xqH79@&_|!THoIUx{+_=!(|ls$ z&5ij5=KU^jCcs*yV~?LF6YQ;%Rztlm74Sh8?A^nNmNJ|S%QRTC)+CFxl5adN5Q^~u z;$PPNpYM{I2&0rUX-CqnQc?3*525i;Kb%nD+cMR*rhsd|^PDKBn*%*KDAppI4oZuR zOLSUfi$H1doDWKiEDlNw>c1S{+d!%8y`WT5d~`O5}D@ zdM{#K*H~i(=$SI@HB+dFh0SuQh$DMp_Z!8O1UC}s@4^X%Xj zgVN>6sDnGt@x93LW#6QB?xR(Ag3+hN(zmCN9$7T$>Ghvt{9wMRH9^UWB)wQEOdF_QMz+rk7!j;8_ytVSU$$cOe3JIA|UWjyO|23i08&RU?)z z=$X}Ibpn%S6)svhKRRL*x1Jl$hy_?NiLMn@&F6 z_#!0J&OBsic;RW+Am2^E)@KeTV#2cHWLXj5N33=u9TYuB8HqcZw_vhQjdX_^g~UKg zOQ)PZh$KR1|7(ZYQ)1+eVWwb48_b-s_rBz!Im)5SM10bGn%S%RHD@MhrWsEQY{!*0 z;FV$jdC1kg#AxmQ*iyP zNS9pYT-mR=UxH?qW?Enpu2j?OoEvX;H4inKvlBGap8GXtCunBJm=<8oWld^(?2cz$ z&3vzmZh&Ye#k~aTB3*KRAlPXEUg_TX$@X=2E?d@8BSl{&uXFT}tSWZ~qzWhMo4) zjTA8&`UIqc{ZC>lP&^(zr=0NX_gy^~8$HArJ>!wjN%b5ldT83k>&(0F{0&1g^3?F7*ev0QF?x{C zb8wfa=NNF^a{qW+$!TtUPBMCkF?x{CGm`4b_33GhEI~7}^SR0BA;#!IK9?ueGeq>* z<^KALcdu~uY&3d^F?x{CQ(Xo z9vZrxt{p}XF-8yanZ3H^v$o3d@(E>=^PX|SP|?hu1;$O>Aqm#+c<|E#>8M}RK=r+N zc(aRs--LdAg7y26NU@)#OMCCwS~t$$8YyBV&UvGe@byTNgypkHCr~=TUX||WH~ewE zt0!U%9x;A=#cAu#U+(JpmC-|t=oyorkFget zF;NdHDB{Cjm2U4_@vmGx&l^3&_;Z7G$diW;y&H3-zA{q8n9$LhxYUpsIy^j~zcan} zv#y?_g7AbR#vghfIBvOLdi7;luGDlRMT~|%0XE^5q@lwDdV1kX_tcc~7hOH8j2>cC z4{aUat4mA;3JH2l#kDpR-2J$#=PILz7=J3z6g{DT`qRY^xKei+DPm0M$WAVQB!+&X z=;5fIE`3ieDz9w;o;G@j@rO=pk`}O~9z7}ZL09TMBSnl~3f0IXHSM_PkSsf_9!424 z$~($dZ$-N3!O#JEOhvJ7{k9HO-qthRND-sF%9MI0iJl?2(miq6k-xQN&@UM&V*IHn z0LLB4WHtVz+?Be)ND`kj#?M$2m~s%(7|pZ4r_@s-df3M4 zmbBmSOIrqWQzJ!;zebgUqw^F>{b$c7o-x}Iy~wlV`~nUA6vNTksCS-H2An_VixP4k zRUDWPaYYrdzP#kV58RwzU^JIY&ZFG(IDWndIFZ6%^uWH*1p}ip&%p=>=4y_ggDjcu zgf-gH%f>rYpCLb@siQ;REG=DyvJ?r_s}wTW{j(xrL$OJ6Fy zHDRjgiQr0i!%1rnbxZI8BSj2K&{O9*>hZ_0G9iXce_CKs09R0VEt&{zxDofM(L7yp zo~&SR_0du$-QUOY#<>cdBZ+8&PNz2V*GLD_}Cxk=?QVJ7EA%6$q~ly^D>@t z<6LSqS0m1*X8K|X0qd*;&Ls()%?X^F6F9$3;I#WV-rSfeakfW9zc_IJt8Q+5V5ErA zIA_~KIVTlEeH?Eo*NEn9T#+H-suOaIb~7z-JFaZ*XYcsa9WHvJ(L4)bu?}EEy%Uxl zpSeDcH(j%V*Ht4*E_!^(g|-YAJksu=Ef$Yd7cyJ+npFP=jrZqIChM-IvgAGg2U+=!$xTE=jyzK7&ZxJ7-D!Z zsD@|Xe$tKMyGC=9#L$~#r;AiiT;WOAd3TPBv1+_@x&3q}DvM^)If}S|de_ zUuvOGYV-U9@3~Uf87X4?Qj0{&9{OD0cRg~u2Y7T37%5`>Qj5WH=NF-ogQ38dddWx; z8U8%kt?!Xb_ms$pn8^asEdLJ_^JBB|p zQp7;Y)8n5dQeNBAlu%cf3+8lO)A9TLofrL=TURTL=H*gX;ccC6INIZT!#W$j{&ulE zA*>aGISSVRe!Uw1j)@B?x|K%r3JJ@rc_n=PnpY%fUL}|*xH4CE{-qI}gRS{;qj^<= z=5rD>uS(FoS}-yL1$D>kzaHgkzQt%>4bA?XUz4DDb%N%oU~b2ib?E%tGRj=dzcrep z37TUGnxhGtF;PK|v1ef(Jn)bAKXElbZZxkI&G5EfG8`)*tab49=lt4)u+9|>=fAYZ zLo#1`)D7zmqxoEDPJ=JL2j>fmoD6#q1lnKc&jTkdFn}Pq>9^hTgqAMv4l+{2_;dbz zaQtyTHzCd!2<8@C*>{hg_2T7joTnJg7dZJd+le7dnQp$1S4E~&U6Ar%`0!gUvN`#uhG0gQsHe)7bR%kkf3>^U{H|K ze~mnjQzwQ&x6NqYsG2=bcrS*p`@FKbIfwy>ZKHM@DPlN(A3b^$p0KpxZX>09E2Wo^ z6ZjFXbW`prMv>Zj`qG%e5o7BaCm*cY2##M5vL1S9ZRmb6dkKa(ww?;3hZtK=o`nXO zBt9+RrUeegmF}|3FCFRXxy0xp#?~`hULf8GPMV~2{P;04KUI#mELw^2J>A}zP!^X8 zhSrtSg0>6Red?CQgC_J#6UyQ;kvbMvx~p<7zut}WOGb(qe~UviKzwYeSN{DunzWr` zebBqn5#w)hEJc4RE=@?qCc$91Ao>nz`2uw#fIGTUqj{62!qW=k@bzonl%V+v!Enz% z^Jh@n-Wy!aCmYRIK(oJYY!)fIOh=tR8U3}L(&a{q7=KEy6e(t(9rr5|;&YW?o&tbl zzu9Z1BRg&MEk^TI3GumFqz2(iSFmx>J#KvdWTc4km)AAmX#P;@*}G;;bEVRZ;UvZ{ zg$^E4_Q?F3->mwTD|MogB1ZFLt>IXRvvQh!9Iy5Ju}|~00~(IAwcyAZBSnnrdDgGT zQ|{M_9&bKhm5|TZ35Fk5W2^mY=oP5pc0TViny-_5hPSoPAC|{zK@7PO!Ikd$msVEW z@xxbBjTABdn(z~F{5A8sgczbC0#nW_eqY}Ho8P!GEE)(F+znb2JZZlXT)*ZU5;Wf= zm}ijOBSDo-e;?+@PWwEg`6kuuN$F2T%C?93Lo@GlQyMc;#AxX}XgFH#-ctUV=s5&e zx{+fa`Noz(9W+wJsGgqeV#P(6ho1P{3~pM$uJaFG_XvioDue#rND<@D`JaoFw{F~& zkU#9%(*n05OPJb&Ui#)qH-Bas&9_MYz}s4yGKROp*X_}6c&GmmH-_gMDPsKT+9Fbi z<4Sk={J>~e>UTzp7{AnQ;J9J^yjS>MSL!1pMT|c;ZWk$UZrqZP8@~|DPUHs5?1Yua z{kNMNxyB6qLUO}fI(LW^>lfWIXPo}J8=vt;iWq+??gYneO>@?F{LPh$8YyD@Qoj_b z;keShuwxjy3%e#fV5ErgryXVsVR_U3i-fe_C7AnheJHA2%M@ESI)M&mdA??40 ze_CL$!Hphtf2JFsG@5ldV*K&B8ytUp?n;Oc%sMbUb$&dkb>nZvc-W556r=ebi4WGO z^C#rt5OR2nl&|feazKw=#}++Yl;g&*&gdb=pU*Hrkg{9u>Dfi;uGCdViWt8X%!DVb zJRI;5|-UBpEIM%YR$DQioc=g2m zF;*tZEm8CDfpcri?#q60rK|ZWqnQ|gZDF1C*Oq${YRdzH;rZUVpdO#U>J_)P{KaT~ z0BP58<^*g$$O&M+M=4)z`Ge>|6%lvFXZ&NA;JZc-F*1T3H5z(;=jcJ&!5ME|(uFhD zdK(gnVLb@0`;7kVE!Vu|hIP1!0x@=2qpZ!29_I6eG2`U)3Dqo|(c`Qvx2NLq|A;EAbIBV6S|9<~tHxH{#d>*oxhhFRVut?d~Z}!DHiUJdEiIF14Uwi)q zPFmm?g5Xw+`ud-4+J9-Ji1AB30!~`M4(sHDKSNsW(s|EF5#yJ7RHW>%n*MzI-(0C& zCKZktf35p7IR0AqP(qG9CKw)gI|S5+)s3xgj-6pNKbDYVkBgM4OxEcQp*!68Tx6t( z@uy;|NZDh6pT7A|1Zk)JK_f+sKNU}il(*a;OGw3&g4vHNrhV2G18$$^rs6ZB`AJQM zr$)6WXnrz5^ESbtBas!4>%LpM(be3OQyjQ$(Ckm?Q{cKQ10|2Ixz$bSQAUawe@eHD zlsBc@65_K%Fz*H|>j+TwJ72GM<1^D}-jNWWr$uT2u5@p0pATU>=a(8OV*K&h368)1 z>_~{uGlF4{z&`ib0sp$$jn9on^D_zY`HM&m#FZ{*>o+JiJ3jXsDPsJ&`Ybr^PTfB} z{4q?6E%ky zpJg=vH6iUUIGRCN$DQ@#s2iUpMv54Jd|q^9t1QW-#Cw^Hs>|O81=X#_0 zC5?}#6~L5qDdm?EG`}pEVqWq4v0{Evh@e8tfW!pfXK`D!;0|7xU&(c1Bi;Sj5wK6Z5w&EyaEalF05F8I1TRZjf) zrE6_17}psoV*Iu4pCVrgygNbjYl2Cx`DUZ}wFJ$WDs<8OT7u>`1Tz#@#`(qzcGbFZ ze$Z%sBSG__+nb=dLoh$$6~9;C zpIql^KE`P7NYMOYg656{%^wNoLR=Z=N6zYTuB&;1(fpBW_N-K3$cQ+b%(9O8x)LVJ zZn;%PiWq;({Y0d^dH7L6eD(=u6Rzwl|2pH&EpB`+Gn)4$#OG6yGJ_cFprY%>yYacj zNDxS7G>;$@E__JZ8MX}G7&Ur`@#n@@;P`Xn%Y-<8Ef}8favZ3Z zA$cJ;&ijn!ubnverid&Ts^~R{uVKm+32Wom__pKPm$ttkWpjvPqg@!k%xor&is0qmy>5LaX8*S z_d5xlt%UCL7s`I>rfZ!Eofw%{ju|t4yv4Wv9nE9Lj2&ma>u|hJVLBn@FP(1_($0jY z1=aw`x_VYsUr%p!y$Rh4M7rc^K%~66YRNug@7s%fa*-C`E7+{7v)>tckejRb8O=Qs zG^ZtK?vbFGZ-J%-?uOQZ_{|+S<#(>;twwWtg65tHn$r_B2LELJD4SUMB3C9OQTEY zFJF58!UdLxJtKw}TZK`&aMAqO@~DA(F*tX)9B(48@$wA1X7$2F3s)!cC|bUJ9q37>Y|y`3l%zL9FBd%p@dO<)pE+XMe`Bg1yjaN$-^(VqqG1fGDeUe7AYU!G2SC7j1YnDhF9M6)~co}?Q z^}=-~g(5+idN^rCoJ&fJrx#b27TWo^0tvNK?Bv}H@$DL}qgCGb_0+D?*x9RmnL4_x zY{s;r@~P7cyJX+EX=RnuW=<`sDwGl{(NfDT0l{)JnLKu8S!sDy)%4Or_@}^(DV<(2 zed^R|!JyN#Bi6RIjI%FBw%rWKllxx4s}D=#fCEvqR)*AR|y|TQl zthBVEu(YhItfFX6SHOui#Z@zErd1(+r_|0Vo6$x7#EPOB#YI&!OABl2imRrUbn(tF zD=MuhFRiF7te!ciXwKA`)m;H7@an3{>dL~ZsnyfxoKn*@{0Y;_i%X`KPep5+S(3y* ze|kl6NqNc4%0lGK)H$b6e@VIiJh^z{w3?YSORG@mF3fI>tRXN5rg~PdT(HnCoEe4H zl|?hEXG|+Cw7-9gFG~1|XC`WGO=XUwY=$1*u|FQ&?U-V`^C$;%ui~4S!dKr87#3N@}JR z7vgBv=)$v8Yn)kFQZl2oxT0#NoxUV7oG@c*RZ(@>v@%DXFTA{p;^Ly>8Plqnkv^XZ zu#&}N-SXdT23sGUxp9!XQyx0?yiL)>q4QG7O zR8mSL3dzH?_vX{N?9jlVvX@2vXe^cuhXVTg?wsr&f!ICNvpJpfUmXR1g&hd%kz~;4 zi-r^W=6rq-GewiPX~&Ko-bFi_y^98hHhG(1m)@o(T)*))QJ3dTH?%Mm3B;qZj9>5D z;1IVZ6^Umu5no*2G&E2cw4}u=h69`Xwu-42qT2;uk_v}2nHXGek-LTC4i5Ap>QA_3Bwrrz0CvNxxSpYnf2st&i8nmF-i92ul6>huli9U z=3Z)0euLr?4C^63>^vEd>)vJ50U2L=tet@1%AmIeQwOnV;TI4W#MEwf0tQ<+l!`{< z82uA^PzbYZV6eAeb|v1DvaK&~$spS#)rYBfd+$(Q%v5AEG()x_1lite^|?`6(GM8U3`-D_bn3iWtb3AK2E1ks;WTsVO*@?-tFM zW|F3{M}fC+;j9_x+M4y)##UZED25+Y8oH{`z17m7&Ex{GV@I#q%D}!)IGDCxD@=>! zI6tttduUz0d%e=RKdc9nX~a_5n4`_Yio7kcpw(bjudSjq^&Pv`{7}EL&R8zkx2Z25 zA-~6kRAa2at-F7dK#t}7@XM5I;m~`Vt?^{(L4|wiWHNx5G$EoVdt|mG81n_gp={I) zyzHe*Gs#Rg9!w*$QgNH3I7nVPk+H%)M`=0`j0F6FfE716inA$S8q0!|6*bw5m&79p ze;|$cM#W6_(#4TP((lX0GAb0Z7cPzYlF=w!s~Ha3OBaU{nWR4wj;d(SQ5X(J!LY1{QqwjQB*&E;7`Re(m-QxX^oR%!L_dlG>L>Xkc+U1o#x&t@2F9V?FG@I; z3vC3}Xd)zCB*Naqy)nd6rpc)a;v;J5nno0$A;N+d$L;%>^-vjAsg3NZ9Z3sm4h%XzA zWe`2TGhzE>j-@_JgIx$^UQ$T*H)hYrbw7e%1o1wHLzJpji+*!lu~W2sc&5MC9;W%R zdI@IYzE}V&UEY9@n+7f3rQ-KeZ_E0jfh!TAV9^xJ7VT6hJMqEVeQ|#}64Ci<_hOBO zfC_-gN=6ZiCXB6!STY`p#g0K!Oip9eUqF^rKNiVK146Z;cY2XA9XFl zV6?~VQ*5wh)96#|u6Bq)BX)dP{Goz1Ol<}a7F!XP%XSC+dL|vn211xhr1VM*hx7~3 zO`--l8m&1fpa*?{gg@lV=t0CJJ@^QTw*@Pv0>&|IJCl7Ys}kG2W%_~~tm+Q<=u|M1 ziX_vfdT8sZoNg3ZNXL>TnF?cam#twcM^kLN2#5%Q9AF8P$Y9MHNrZe@3CV4t7A!z{ z70}YVa}cX7HS`@GN@+HT&dH|ZF|5Rk$OXX!F6oY>sZ~EJPx)f$s6U{K@YMTmD-S0^ ze#C^u_cU%OyinMD$0u}$7e;07Ew|s()w&e$7xK(1*{LJ;gQ;Hi01N9Vky0v zM5bD0j@(nT^PqJde|OBD2}UAMwK%0G;@B<>VABz0Ja24}n_v^Ywtd{lYMGa8u2M7> zM*&|Vob+K6l*{E#C5GWU7=9cJvSc&`c}fr-!~PKsgu>}q6t4Q62pz+~F%8+9GNCtM zYpRol6|T$mt4n4>y*XSSF1{iy2;>!Mad|e7(Qz#=nDJp31RwMfJ9^fKySy!y^Q9Uc z(ji0nrgAlk@`*L31L1TSgLo1(W<`y>2(axxseWCG%aFlfG7-|%*AJ`_L3@it(q0(E z#<>``Y<5(jytSDz5kdaWY18K~TiWEYrKaWuOIwYB`#I#smoqrzaNG0=vIeHbz2x^AnA1rbo<>Ult*`f(A}g9B`$7+0AA^O zF9ObHiC3;(x<~L@i35;Rxq5E{-u)8ySoMA$I4?@Pa`ocY6zx@sBdaaj-pbQ(-w6&% z+2At_007!ICd#Q1GD)KM#;ABhX z`mNK0r-E=$Dp&7)C>!*^p3fvKaSvFjdTD4}CUF=Mr*iccfHx{}D;TfXAJE&SJ_ww< z&l23G<4>u2sl8Qa3mkRkdTsZxQa+8}(@Wu%=#OUL1te}c`BLDQ0?r*054YEql#l$? zQxXRtr*e9E5qN);xW}sZufXv&3SQ;vCHLJYaRg@h{ulw?Z4$R!z01JlF5vt`;#J{y zx&AmRao(xkQ_jKrDREFLS8prInk5b+;>7iq=(m30UH=aJ0;uR_;5>J(;70dCmud&e zGn;NlwI$43`owvV%(I~guk<{43GmVqw_JOBQE(}6zBxx!JPm(J$w%T>o-c6Jxtv{{ z54>d(w_LqTz$5^i_es2R{Y&b-SK>J8oiN^reqSlP68-iZ@LrO*<>Xrge!mCKDRgT* z65*AzgR_CtY{M%RZ+sK<7X#;Qi8n*>o6rurfAswq;ABgs{0sT_+b4l{9PsX(1YRZZ z?wD!3hzG^)K;D%XymLV*i`Grd{hk$snH2lWTNz1yBj^)I=! zWs|_8ak-`xUWs-L1MkBUw_H0e2ER`N=S7KUj>{7Krr=qK6LC-~$8Q*A4Z!)7#3MT^ zH;%puobSE^zaZ#;0-V{TU?i%y9KUmb(_+IbH7=)PAbEikqX`Fz?5tG3kzIZg_g>pm zseU8B@%2gIH39F>lfWYs4^2w8RH|O`2bWI*Zz}LsPXdp+zq=G(2|M^G@IE7P%h|y{ z!S6BPJaQ2Lq?tHM>G@3Lcaag=QmOWyjPjk6z$5#;Ws-QemclF5Uf_L3;+AV~81+5| zoHrz%3%^UXm*Vk-m*8Ye+};xP`hnLbam&>^3k9ozbCp*xEH}^0Lh(N(j;gwpp2?k^ zs4EQdw-g@rXJ`_5wBG8R1YQz&Hx}XPCD;4k1KuwrZaKZ&g@S{?dB0!dR4xv~qd?k^ zC62(9^UQ>K`a~4|z7$@Ge)~J{rUeAIa`K&xf|JM5U zojnP>DZuki63 zD)5#~0`C;yT~Z3KM0>k{w@KobYcD-}bro=aM~015uD!H=yCTgf=BZSBX&&7<3A|H* zcg-a5$PPX-2|VhLk4*xP_`gxl#PLN#N0VJFd&(MNlbzgx4?$Jd$tzB=Bh7@=gMe>^U$AJhJELB=Cq|_ayLW zyltEW9@**EN#Id?2PT0>{g#^q9@Tr(B=D%--IKs0e|$?Ryb|_&Kky!xxaI7bivJU* zS(gGpBE6TgXPT!Y5{K|8vHg{(cQx>~O5AewUW$V4!1>-~f>*hDhUUQsFBdrKT*~e} zD12fPc<%w;3zNV*9e9T)fk(@+8LM!zrBd?IzS+e^c%|cr-N3s;;+E4N#V_{*=Xr@o zevbRCM1TAaIDdTye)LT05yDx61Bv2_Qg%Rkd0gTU9;H(4rFs9rB=D#|UY!IU*~iqi zIN4G;`Z}aD8UOnQGSI=_KIl1XT5m)ROkSEHWR;J>L zvK5nE*(;VeVtR15A#O#;_YNJSMw)BieT}CV)rea9ySI9J=?UOtR5x2xx1yA4H{XK| z(-Mu0j?)B0L7w;&w$Lu!lL|e0`tV=ec1_N!Q%l!<@3HEh2TFV0 z9pV;2Pd~|!$3r2Wb2fN3(%p8)s2&@0MVgkDG-dOBrK=Z)wRl4HZM|DzPuqJv{3O?4 zcTcaUqwQTNqM0Qb-J7o*i_U3tbcGUV1wMSfV9Tr(!s;zMr!BWjSRC486g_cH4j?=c zpT#Z`fvq^EY2Z^e{HOZS{rN$Bu-=18HxKWuIG*t{)$(YUF%--dD-r zP~mF)4dQU~_dx}OpV|lxioGf!C#3+6Y1)>0+c)D27qEKxltq#Nya4^4J3zal zdG8Z6??QXmyCt+QTtiuhz^0~kMnT`xaNM4YK8YNy%T!l2XlH?|5q3K=3pMM$N|>u& zrZZ|8TU%qyFgoin7HY<-b^{JJ))}2{f?fK$G1sbbtKZek#5w$fdtYVSCamS)F03+S zLI$AqI9%G@CiDoPZqEA>&NM%{wO`=8mh*m#v*^gfX5MiacA_J@`4%p#n>_geX~(LB z{in(V2aPTrQ=<8l5=C?9z5V%F(AP|3=2)GvqG~K#WyGq-qSgOW%TEQ%EjV0!AB>Qm zB2ke?+7Qy`y0@1#GSZwqZNd+mm~~?_$+NAfGW6;(-@h&Db1NXf>R56l$;LG5kK3icG;8!y@k-f$)68TR=sPPR(sptwd14v3&-!C(Y$wLKmXi)^6rZ8^5+XRzLC9! z*Vw2H^0>S!@_)Pl(Zx9ul9D)Udm`cNL1{|R}DX1 zH{LqlnLo~m*0ern{G~AUKdG>Fd@PTt=mhj?>v-OU8LIkF%|4u|5W}*%_4WMm&HI>vJ7lwId|wvek|5LZxwem9ae2`VSO0 zTzlo7sweiuG-J-_EBUELs^-v?=KWC5OsJ=^`M}bdwYNQGd*6-&k*;lFabIs@8v8cPD7wl6GA3 zY2I&gq8{CiLrh?z&uI%pG+jViu9u$nFJ-cxITW^^ z4+6}_AfUMuXY!^zTO*!8xG?;un$ZJ=dEAA3YD1EM=upaNJ4jUAp~FwtjF0YZ=l&es zZ@f^L`gJNB-Ai4p!xbBcWfzaWgf6bhpRl{KdH={>C=VK*J^BVRTvi74WF7ZpH9^D* zy*awSqbnaa-kaL#+f(zov1DW2o(+wfu?*AaR3jt$?*-%ad}8#a!Uel$!l)0xsEudQ zQA-ge)uo1Ct{Q!X=&t(?I-y>42n63>n7*r(JMzDcqq|+yl}{DE%UvmWSCef}A99P~ zC|kg<(ePCPJPiu-7;SFD{UCg1Ti1%C&qEuEH~#V{LSNU6<45yehHB8FTXDGf(vs+L za+@NLoaMwGCqFIv{&cgSkJZh+J9|7wet{9L;f___h^Eci zM!K3aSI8cwOc%EU&S1P6#CPFv@q+A5KyH4+>>ZqUHqIiC-bb)}{(QVnV&0DCd3c$` zd^~h9pI#*~-;Ap@+yn~(O+~^zFvcKa*CfXMlZ8sujL4#D_}Qb>V^SO=hG@11 zeM<3d6_3jWpu8UkZN6bi%V%r8yAQwN3A>DI8*9+H*I=a9K@T}2QiDd$L-=A-2doN# z!3tsM&LV`phh`dSfo)sI08v(rj_QeY)$62R<%;;E!UyX|nW$nN`Qp>igeP#g zG}85#akw>Vw1AcZ`VSl~UPg$#1b%;!^CL+a-sAsPoMOnhZ*Yhz8}B#!7fdkySkEe$rfnd&Zf z5a4X=TrhgHcH}Fd`*-eC&x%gfK{c)WYDZ~6zy!Dg`%su=WQvADq1On|$gefpt2?{e zc)a6h#%OOa_DR`bxU>|T*=gh&x

    Sv5_S%aDdrm)&hBy{eWwMJf0hk)eJ909!(!T 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 diff --git a/vendors/libxml2/lib/libxml2_a_dll.lib b/vendors/libxml2/lib/libxml2_a_dll.lib deleted file mode 100644 index f4ef07b6c8c184ae230b7ed6dd53bcd48bb08e60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3099094 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


    8uEuOxA><%JXY3B!44; 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℘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%0DQ|M*Nrws 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%0Dj5`~Yz>NYWe6v9b%_X3O=FOmJ zY!IpZ0hExq8t650U zZ1sGW@M^qUKvAoTRBi)xGgEhg+Q`&>pmLbHA5=9{+d)lc>QPYTOg#>2I#W-9DrV|A zP?s?E4^VEVT0zw^^)jf@OziJX@# znEC?L2&S^Lvz3vFN#l}IYVkLve*PsR6O(=XHCdzRClCuykN9mcB=|Q0q<(|eAdb{B zmY@p05iLpcAC*@BGK^75^~ieP416l^$)Aj`V*WvqpQMcK*7wtY+_7qEN^X)#i zhgU&biN-*jHe5Xg8jodM*FOS6zL2L^v3CaE%r#Z)Z^xVi?@_|zWUM>HE&@s{Fwnp} zlJ8%Dc(wWEC-B3-JJL4=Qrh@KqJ^SpT~R0Y!8m;q*Vz|aW_&J9h}HDNQ*mvmCe`p2 zo9!ONW;kk5Ecf1`AD;%EXg~F!M6cWgO7z(+n(v*Ugv5Os?=PT)1YK|;B=jB~Eaeb= z!8zs5)!Pxe_Cy2^(v)`cjixU+bT{noF`&Fx1fn*a{0}%-ndj$jnV5chr_+oXQ{RY9 z4qk3<-*EDKfhmp;WPaLgr3+n1?CFfVH<1CD@yuwH#)IXki4NI4gtDE05dNyumqzv&asIBpiOQZ+z zk~408W9>Ze3RX^Br(=vNuKgW1zjm%~VZtP0psxUi9(|eJxJJH?iJ6EpF!3^H$NBSr z(y^4TR`Qo0Tx3TVaTbAdi;1%i9Lh0Wigr(IF>xLPXQPSp8aT}+P6s&aO`Iqc@0BLbNN`q}ICz1iQ@&Q*u=RWoO~1K&)|4WoK|qgn>ZhWlVReJ*+?;QXds+u;?U`eF(%F>;9Owh zOa&*w#90bXyouunXQ+vDJ2-JB&XeH8nmDh66Jz3Zf)j1x&@eg5#2E?>V1^P*1cw}P zoys_G?JBAla&^jy)YJ+9x&l(!$!Pg+;c^7#5}099FN8urMM5W)8kl4V4E! zeF$44)Ua-rntN+uJ*I^foUT5s$C$3(Az}4pObXOfKHe7i17>(?SUaWWz8qFUd1gks zTT#ezv6Mobv^3F91qWWrN2d5N2341K&gfF<$jHqGPLew*Ia#62b}9y(q)a8wz(H84 zxO5;$DoNRA<|Jh(hcu3{zo44ubexB8a@9+>!30tMlA~?RGlzN&ePgGITz==F+Nn9PRF_It0=dB z@mF*5-Y9u&%-I#LAvoGpl(eed3!kDGb2S+dEHTVDFGF|F? zDMc8w)F_ssKAqfz!znO?YPxcz6k*I#7l5P3aMFUtX}Z+qQi?EUsS8<3ts7rD{=8V1 zS}COnW0tyzrPMrpOW~n5WQu8qK^7bEesjH--0AZ;)KVU(}W4hFSDMc8w6oxO5 zQf=?Oy|!%BrRY6V=^xT+w(GBgolv_#> z#w>+_8lyND5RNO zk|`|WTx#OXUbVEou(7t5e8>r@2_}p&h7?V63=2YHSi~5b)lmJ2`um;e0M!`MmHXt1 zIED%3Nr{PWxAH!7pc%6*aFR2XJAyc=N>dOgNuiwJu!I!mL}QGcltgzT&zm$%N@8-F z^0kIBrmGlSbGnK`(pAD3x^#UusEeX^?9tQJBGXl(rz;~vNdlIoL<}?1`F-X_PMSh1 zSw>E(LPx`loD^kn5XY?y2;wC3gH@wclF};(lc+e%ob*fuU9d5%^bF;{L7a5u+aOLF zU+`xLD?L>~hhox`q8tq3xRnosILXR8L7XH$o@>;c$Y(hWoU}~kC9_mo1|JYGV$zi- zgD`2zUxGNP%AbQcDay7Wj+>7V8#N~@Fh0hVrX?xY2XPXWO=eDNrs5CcWbo>=L33)l zvN8yh#>bnDm{i^qY~-XU)O3v;H`h)hCt1OO#Dq!WyVZ=CM7|fsz)8vEwq@jG@J0e7 zC!IIB8aZj)w;MUB3XPbIoD}84AdXuZVdS9Yx|Q)-T{X7TQsB((v?QdRmNDjRe6x!g z1p@$O?Cz26v`h)Mz2)#XYc31XT)`NrLiz8|6-RZ=Pf2z~h~~-=%@rYTBlR`94VGQ+Ir1?)Bu1&h;AyV^{5Y1CVG*1c9JdH7GoZW{zp3^m_NzKzjG*1uF zJS{{swN^%zme>M%P>^HP2wpToW=AdF`F0L`^`yLt|beCs8@y$Vo|r6`d2r zN#~~wLdsY-ehZwr1ZRZA8PgwG7+tA%$0GzjN=S%Wu4?G%rS;_Ieg7w zT^177Ovcc>!->xf-#R4C0gBvpQuE9Z&D65YnrDV+re59Y_&q6t%e?y!3A$!_6E?Zo z(2VtY!Lp0YghUyHt?R|DH(>1>(HP?h_o(rs5b4`fmd5ob_BlpACjpyi^ zzml5gg=n4+tXcEC5Y5!DI353Vh%#M$b)&%|{UkNl3eAR<Rh#w@i699?SLmgbvvDUXyQj9IGAB(?takN&7jO_x%H ziNFWX;v^@ut}ceJIS*??@^A@b#CaGzdvITQu3kE8q~;}@ht!tcDJgs#KTC02b|ZP zxLKxRsi+Btc7ZA$ls`*DG&e9NHWIH(0`pYE6&0(zw2@A_2z>r;{5LUlC{!e;Xxl;2ggeB5C%Qmdl zAz`fw2@69Ighew=(srji6XivrlB<)N*KktSevAj6t~iOmZGo}S(~Jk#6)FrtdZkRO;u>cN??pn=r(Xz2#Q@- z&E19-k5^?_gb}6uljIOsaH7w|9tKS_g`S+5uH=Bb9vI}Rp;cZ@9ETd#Gg%XMs9NxH zHAs*nOa!MQIWd6kp zBxWiXm@pGf7z%xM2&cisp*Sa|rzzw57{l5Sia|>M)LX@{RBDQ{TH{byH-$>2q$^`g zm7yeO@RSW`MahkxZGPvkD~{H;Oe$r^QBtG zIN2+u2xG1-*MOrxhrOuyJVOuirIaF!s4e`KQT!q&IQ<5QUpi-~iGv(V%s`!|JvZwC z6036=nMummXd*^VqVkrRgO#@t2*iL%N>mB?Kss$7s_-I#@u^u1jpPLtPioPn;0_+-=uxRmCs_(q=w^> znl~x&L7F#*Xxa;uala$ zhG@PnMDx}V&DS%A&Pb8F`}h9yb2Y} zWxcNXOR4!*Xcm1_TAG_zI9ZB&tF)A4g?26)I9M(G3v?McDH*(z(8x*Qy>l8TB?WDV zE;BK3($bar8pk;Pp&72ZEN%@+*B=;j7VK9RsKbM=eo9Z*Ntv!cAYJC3`Zkt=8DzKQ zm%JL))?n8WMi%4Mv+V9ZPWyr~cx_AWow4cQXfTR?h@+(v>HIIBCjX zgE**$~7@ zR@NFhh)<%@s>R3HTm6x9Rc$G)KfZcWuRjN5t`f#vd;esTdj5umXX#QuNGZaYrS3OL z9a`N8q}o!Vp@AG>AZ4g^4}fE~65B%R#)FL6fNye_Kl^=wUN;h?<_DGdpuXVGz?wBb z7@~PQV|J2SxIIY&U|t>Khf*#zZx7M@5D;d~+e0)z%$S~1*_*q%Ht3q^?iX?ohiHBT zT(jnfLo`3im?ua9TtZFSQC;)hQuCuBn#tCiH9s1n`LB$j1C!*|o=6+0YkpB`{%eTl z$AC3!{%eS48gDrrbZ-pxxn2FDu)HdRQ9hQMA7{<*R=$@U1st??!BA*>Fgq4`gEA1L5 zB_lOap*s)_9Q63r8pqh;sOFfPlafH zGDI__&FM&yn!o?gQH>@~qw1I=? z?`;|egz}Ztqd*UjJd;zfh5c3ygO&m{Y5eA5O%FJ!3SFEmIL4a!A|%Z@_CiRyUSiBR zd_#pY(fh>Ddb<8AO0JF zZVS=e&KSB6ifZSes~^8g*PJFbw?nfii`2|iP}V`LR#mfCA#^&89FBw zc8q3A22O@s`3yMcTBm zl2ft1K`p?@aVs=mG;$JoUxDDjOPMNjL$6V(?o>W+rb!_c$;xu4s>fK$FGGX5EZRfL zf?BcDQG{<~mhxU&(;>YqYGvrJD8Vgm7fTuI&nqFCcQZz{KM#z!=vQ6yTB&(=h~_;Z zns-%A9T%kNX>g$Gxbdw87a!L-na#qq)aQEud<#V_$Iet&NdVo zOYtlYi<4rV1J0{6pro8on;+&E?`gpu*VdYv0X;?Vpd3n=Oj z$?V$rF1k}Sf3A~y2xAT%6GBLxNg{CnR1PQWQf*R-Ffw$siyJWr3Jv{jV4RNrqy%of zBN^SP8u|}X4`IxqzXOibA*ag9^q;P8(4{UKOqwuG!bgUV_0`WXDhLhzU10Rxs*Yj1 zk)3MjHBt{@%%T62rK0goZqO?;9?+#WODV$0(33Nidn`kL4;Xzv|CJ>_AZRu8r==dk zsCwMWJWD;LH#K-6@Nl6nXu^(1B}?^){E2aMBkj!>hF=`~`CuBTAyA&j|n z_OsNvQp(Y9S&lAsos=SsS?VK}Qu8qB`3DTGd!Ljdj9CgG#88#m_WQ(#^{|dfDZ+@9 zrek(|HVjc{jvZhM+rTXHV+^ii<-{?|TOQ}Qf zF-v_04sJBYH@WZA3Jo^=uTqLIGNmbr$|nGel#;|Qi6Ppo`7k(6?diZzhw7U3_`ENr z2xFG|oTXsU*v*=HWSTDZos=Ssi1ArNC6GBr8~z12`p*38ntpemDue4fq!eMyp?}Fz zs7UOdd*DSh5fKu0tw|}u$lORwRmM8h+%Sgz6)<|PKHuxcJ9IsZr5?fv-7Q)w;)CMz zFO#0%-1izfD>XhhNGZaI_@rf|@y=mUI@B|!;c3M~@YgvRINo`iiIavgcDH@*VZhbQCriPySk!bnRk)o26LK9ma#XX8KN>2+7vHBnY?;=ZRJvL!;;!%P5HG8 ztbHsz8oV5CR6r=YOic)Tsq0yShs9psNa-jO?3;G)y~gd?X^&-`c7KZ(CD=nE?L%%XL*BF zxYps>gk!1SS}&lr3u_xg<67CUtg?0?D#MCed(3G84a=$Tw?v zK`LtM>l@~oeJko+#jk&rV&|;LT30)AAuZbuL9AJJpLwG8ohP%a5<2SN^X^> zq@=Jgudp)T!-+>TUbZkh75xt5vQz0&poV3&%e>hMIXOmclvqkm6J;*mlT-2(~8Q< zb91Uos)Y9plj79kvZCtJ@@lEr8 z3lP;pH6Te!01x z;_AY(lA^Lo&ocBXqDqUVU*XpH8s?Qm@v60fdWACbMlbB z;10tCO(`iZLOzujd*-6+G1{%QH;`BlYb1x213?kP>4=|xq!RmByhIi9(qcQg5>i^eA8e7OUnyODm+a*pfq__dGad?^75)HimBxEUeyH3&+`-)78jRQ=aieehIx&+ z#jQ3wwPqPUUMQdIqn|75v`z(y$uBCX%*iRNHuVB4>+0vvt7$|Z6Vwan9a%+5X<=!8 zb(u+SX~X>5`s~z&jSar#23ak<^s1t&;?gphI;4jB5Rne*f~mvI;|Lo%t~?rS`Id{` zMn&11V5#@DFUcJhdcx#smQ9ZdBRW#KWQ7gh&OPg2HL~`80l$F=PyXb#%s+Pf}je5 zxjf~vw{h8gpQO1BOj}gvt(~+S1J#MO%j@w+#hGDw4fXXk%bRMg>Sm6&VQJkwD)LHm zlDRaepzAlp1=%3*Tp`pUWwEC^7yWQqfq6(NdadkK^`IJD)Sv zQDts1Y+p`QRZb491r5*T2o*it+&Wk^vpTBvm;!PfMU3SSwZtmrvc(kK!>UHO%2SbF zP?29BbPFvLv^p%tJXQx_goz9>&-?to!4UD{o<*UJ=38!v;$c&&k_15n;w0)ddkv7r2peEJmbbcnzY3NSn z!|DX<;S$3jjpo3@(86#Ub*38PO3|WR;<*U$nq?=CyqYHO4Ac%7a;v-$hEW7DFR?Zw zbDn0*wDhDTh1h0k`-AaX$TF)@NKLhkD^xQl44FkVRGiu3SpcQI3>P=wHbi|z&>|FG z9TI%5p&T3{?Tg z%oN^4OutqwFIZJ;T+uPXEka^7!C@fbc{P~$K^P5Jb{p>8+_Hk4l0w*_{A&F}Hc2AV z3vx?xs&cDy+1_D2Cj~d6n+zgN_VNpgiz*6)y`)>oMIVD($~9s#nM)%>^&y2?XnFab z%A%60!m|7d5#Ikn7Zz#C@=A;HD~h_)Wl9PbFbb;ka;i#YYAr+mtyv_`lSh;4T&(MK zm&A~jgo3i-l8VZTlJ2F%5CO|Z47J3hRhJhPmC(G%sLmLLfZ~-wg4mLj1|+x`Zq24P2^43(f0om=Km%l@?Z17nCC^|0_*e z_u@`=r=+H(XJppQoi`tkmt?n7Tbq%RIxnLpab9gI4o0eNCbc}Lx~j6g$ir9Vn-Z6T zrM%MIe5~cs1^Q+$tSuGh1EYeFvEHn<*W3jyfJ~wu@aP1jzJ*jz6lkA zO)APQ%Bd``&i5n=9dazRw07yz2HcLWnux-(%Djr4Tv1Vj!b{69EG{oDszjtrf$^Y5 z46SB2EnAL{{f)@sy~iu0-}3%I%_6qn0HYTdBOAX->U7)mim)Ff29Yo1Js*>|6dlhV`T z4KB%@n30N$gEKP?Opv%Y3lE^<<5LpT6O+@)Z%&_b$Ll>GoAhgi+tY*3*5WZM_W0|! z)YI=V`20YRzKyO=jCvMelFDuY5l@e#4bG#)bFlJz?Nnz|9K-M_V`=!@$J>w>1nL>3bjy9JVSb ztzqD3zuew1aAyJcaTqwt=VM{uNMA47P+)LY#klk0pmZ7zI&i=D=?$Kr%=VI z3#)oS<@*H)>)F)N%!`91;MPKmWkZ$IdJ9hi>{IJ@%w0+=5RIIDJf9`yYR z%&;Foz-jd*sNd=dzaoiYAik{9OY-Gm;HVu{hk>KbzSFF57Wuavxb+fimw&V1u^E^n z|Ak_>Gx4!2-2m=y%z(4fHx2R^0<+$Lv(vX3m^%zOD}6MsyC0aH2ArL~ z*MT`;z**_L0{XrJW*QCL;JQn14KP<2a8~+8LC5ca`J(}67r#e=`G)~#rEdWA?E+@M z0cWT0b6~zV;H>oh4hj4Pm{mVgYQ=k7SYJ^4rF?!$Vi<@otNKj!^j#~QMSD98+;TMe>LFj^gRd6 z9s|xw--GBF-UVjWuOhwU@W-k=$WG>S?G!lrwknTk@QcI1k-o`c;Q9bJ-3n(>zH@VV57tkj+|9`3Fiv~M|OLa70x0Zn}EArV(rpF`u+sW zQwE$}J$MnAHw`$edaw}s_5qU}A@U^>zwPw>4w!(%*~RbAkiQj}@lK)7ZhYzj?)MS{ zk{#!>MZP=$+|v?k7w!;fcqvGqT{=Dj?&xXs&4RukfSK4sq=Uu*cKU7uX1m1M#qSw- zJORw2NTHA7%ld-sAGMDabj7v7S=GP3@Lv-Kj_P?!7&vOb*N1_l@ztGS;3$6gg@Ge` z|410Pi-Fr~g|nzHUBE@ryP4tW+p6AE|JxrJzr<0x?8^6PU|ud)EqQQUBfp?hA>vE4K%r z@87`OOfP|i)8>~!^@YX}pGyn_@nu(Edb=FTV0_5gg-dU1905%6nF4nquvYbj>gnPB z0z>-9S=AR>FNqv*dK}e*5ne+1aJz1>oM0*zVHtAuzq=buM<{4o66%)GJ?36K)A`GbGk7T&jQbfLU+A+2!A6 zVD2#Btn%*~=(``7iw27F(8fbS?UL%j0*R5yuxuZ+F0jf9XHidY1a6ze+NJkS=z9d1 z!a+gtv(R@nFgHn@oxb~^?=E1*({;0OT6!(?tpaAF#M$XF^sN zF$~0)UH$tlaEm3@E?lYyUSMvNII`Dv_22~FhkB3>Co(fMZV+#GfCp? z;x`8RW&*QG;<}69-N5|iH2ThfzGs1X*?_Z4@0-AUV!&C|d+G;{0CVP$pmMWF@5R7m zOPpPLNnZ&tjbZ4!0hs$vqmR=2Ffh*=aCYf!1LhqA&MLjsE<;*8!Ga} zF1^*z7YEEDiR-Su+yKmdr_pyQr5BhZVd#rF$DzdIL(VRKG!MH77`Fjum)_q1Q(?f_ z<=-@5mK$((`qlum*?_asmyP({0?a=pPO}>p_3uBxIL_@py$#UU7nn5?*PUH^2AEx^ z(U%E*Zv)etUSkB;UHK*flOu6<<&gs&Wx#9+L*G-tynGscRPb*C^Jct=AI<0N%A@c+ zhcXo(a`bIg9y#F80cM-Tb(h|~!0Zo0-{-(23>V>cr>`8C%O%b(e)qv+0WgsXLf?6a zFQ+%CpDqW#dZfUBWao+TSgw2D1>B<&OA=Q3G94bz0Ml=j&>0JyT|R#R%vTa;r!NQc z$AC$?K?|dPAi;6J@_|pze=oKJ@^j#qQ*FsAMqh)H(#atTRJwpdQcq(j^=|i!obnG=%O%i zq;Itq&LUqn0(YCl+T}|u26BG{=9!B{nrU2XWrwJI4c3Zpfunr(hk>JTuL}c5<$GJ0xNTwJD1HxzfunqWIt(1;^YdZgDF1d^;Vjzu zo4|b{v3Bj8)>V!GGu$oO2z}f2`(uC^Z@^iNBPt*{Q%3NF1T9;z#wR3YZxNoLze70n=o_S?R+SRmxgmo{+fi#`kXnbLcesHbCD| zV3wqc^xBP^D4ah_3`ll%>kJPA_jif4%a`rY@G>y2ayhr_IZP<{#8wj*%FU?Cjc6 z7I0+}YZvZA&@csi;HcQyQm0CTs*X?86r9kf3Ayu^?`a(4N*54a-|YZvZ5$bSdSt2rWmT0IB~ zm*#6RxdKCBlCukUG;moGYZvZcAYTB?cM@k;ZZuv?$O|vrbl{34)-K#5&^G~?%zUBK zF1<7_yGmj}va?I?^}yXLv3B7ufrf{Gi7gP}YV{>3pW}fWFEJb_zU;!i9JqRkwF`GH z=L1i!X#%G zZaHw5ORQab$3uPrFn^RdJG(IoxK@dwFv;14`!C>5NUUABPea~Oiuo!&F{|&MSyiOxAfUx6q1mQ-*r!x%PMZgWL6k!T& z_W9xgu3BR4(n0;vZ-H59z}bx>HUM*@0cSP7p8u&s)J`w#EKIH85QTv?$ z%qofNZl1RVn7dA+?^Wn~5SZnYM7T7+w#t_r@IR3lknA{Lg6iKG_zasYbV-JB(A%5xdxccr_t8}eYXHJc$Ns)u0O8^E=OWOva_?#Hv+d!V(rp#4my@cfZ03f(tD-T9>wOU18wJ4!s@*j`nGN5C)F= z$FHq$7WL(4;G*Y?ys^t?dX6y=mD^$3vxr{+xH~1*E`GPb z;{jkY7l?Fd_8_QysXShh7!f-;ZVJMYy?QMS9NCGt!@yC#91H_T`O*;vj^g*d70x36 zx`2yXDDuTF|K5eZ{=j@8airhQo(^1u@iRW;?DRFmFHvF`h%Y;RPXYJxY4q(xg?kg2 z8@9!L6ygn=V{Q^LT}`qkVpaAyOzG7KE8tK1j{ zj_kqxVc=+-{*)EYqFy}<+-`}rs|U2s{|+#bSBSjU<^e(Njrz+3i2=#ZZl0G7T$RMy zg-iNo0OK{_?CRe-V6HRZtmZRYpzk(d5*kH1v~it9zN`c0I*GH3pA#Op0dr@Q&}TQF z8H;eUyaL0Sf-kH3JRJN*Vc=-~vDpe|k&Yd}wMnd9I<`XJYrstRi8$J=mz)ROJrV0MYz;YSoLpf!2gfLfMjPkeqOTHq5KXXa(3yM4UZOJzE~%4 zH2$zFx8keN&hhC^-vt;z&jn`lwE{=$KvwBU0l!B;U|1o(tn3=CA7q4qqx%%5g@L1e zK}}XT3%k(_+$|DIF}3O!$PV2Tq|Yw@-ui#!y?J0%MbA;NG0BdhV&JQ>Us<|`AXxuv+G7~f&GlDJAVA~VF@t5yGC$a2Q-y0-yfcJtzZ;G+`QWR zwZL7jv0nK&1NGxtU_Shj@O1j$6gz_U#KpS`bvPSNW+io zGYft4yBIh-4ZjD$?|NWn-H<-N3xQdoabEf5KJK-^+@FN=Dvv(_^K=r<)E=y-G=AC^~vw%n=-6>aM5|C?-hh?1;)NvaE`r^(jKt?XxA9>qcin0BjEp@ z58Pnj`u$YmBriG>KeppXn{bAHrUJOd8tau`wnHm`c}wHEtLI+=)8iINqZdEgFS!~6 zQaP{koeJFiH2ls7hqHirE(zzw?^R&lPr{k%5$olrz>K;zkq<9^&^~~0du3q5pCjk zJpBJlV?ZkBmEXSs_dyzd*MP(4z%<<<>Erl8@k^<1vVgd=t(fziWZJU1PoE$DzVKz#RWeNgvlGOzC5N{ZL~-DrZU`=bHk*5?&f6 z_1BQTV}L8xSg-W`2u$Vx^AC-4>=y&S;N2P4KwNZQ{MI5Y49pE0=gbSFv_o9q+Nv?+ zN2l^@i1$jKpeg$7wfxXu=ufe87F!=YfmPD}8q&Y&0-0 zXq;F2IFFh6YvDzHbS8bK9X8U0GovI7d$n>H7^ZkEh|scJe7; z-qyJ8>d`)6f)7YOywZ0v_~ij}s>XGf-?hM8o`&D);CC%BANb(c|F@VY#6{_Ndf`e)!*2F%$S=f&@3@M{3(qv ze6Zap_JQNLyUqtLAGq}bD&X$(l^O!;NK zY4w5Qe9m?sILhyBA2_Bj_^_co406c^E?;B4nYQH;D!KK>jTI3zR83$$mI^;eyg!wa#@dnM}Qgsg5;U`GL;+aW#}*I z<-+-hF+OnYZ%_1rV|zN)2af$msSh06(}gCSL4KQoyH;bpM@OO#VspkfMwYxK{^KsF6@%sV+ z7X#Dyy5P8e=A{S4|G>NouI~78e7Qhl6c9Hrei7iB)9^b1&tL76-;=<-oQB_V;P-}4 zexWz8-wYQW@1}ahdHyjPLmZt~ewP3jNyCrxryG3odjPm?Y4~wp+cQ4-?FOzR4L{m{ zUjlRJn<5vEAH4E=3^2tS=OsV(GjlWsq;g*T8i2bf4L|lD%|7}49Jq&k@N4zS?`_~d z^TF>spZpGc3+D*qqVtkp7-8czhB!Je`JE2jvNZfCztukZT?gEqKKT9GC%+efd(#KM z4}J2>c^m8Oxahi*-w_(4fVg?duN1hdH2gS@IvW@}3FpP{dSLEK!kOBaF!=pOV?ZkB z#qW9G-tfWi1E2hQy@U5jaM5)qzo8nVfVg?3uLQUXAN&^jJ;e*-h& zpCXs;_|*b)zQ%d!AJca+Fu(V~?+su+NyBdn_;b=Ed=H% zjq7e)@jftLrQyf*>5TU!Z6KBNN?$+V4%1jK`F(}~^$1`FeJngTgQMb?V#o4*p2E+% z#%r?MIgUNn2afZl6Mf(~-!jJsj{6ZSec-rHsm2G6{FeB@Q7$Wd;An?k>;uRA+CFfc zFS*_aj{0(^4;;r45BR`wob#v;9LsmR4;)In2AX^Q+eEl1Wp6y zgKvc2#5li{_G%pbkNUS@Kq_Y{56&ys`oM8L`A0r*EVn0o;06P?!w2pN;NJIv<2b7C z_v!On2;68NxM{$Zxo|kAH$~2z_qoo6bHA_4apQA7aI~Ml^nsfST(~nezwY#%4BR;` zoI8D-7r5OAj^p!JeBh`Dy)2H76V9t1^#$%wjb)BZde3t;h6B^Aan8DPN_lYo?IDec z$86Gj_HXZ-aEA6}FL4=?7q9gF1^jvgvs>f5=EG(HH#jp@F6Q%}mjSmiAN(!_ zrant}I`il$a^bwxA2kM~awfU(`4>$%gIxX&+=m+LmA*T{?+ajl5|H$HwYx0O?=(gw z4mU4-$>@=3^~Xi$6))E>4*_O;63(mLoeIqSB%DeA+Q9EDU=9yTytFI4_}vc70~+U* zzNhj0!@#uk6nyYndGJC$Mg*Mf#Z7W6dyRQFI1Uu2KhyR zYt~pV`Bfs|YGB^!FM09WFQC?O4oIJ0_A@(t;AmGr?*qqi!0SG69M62@6Sv<7j{BJc z2l~rzt`8jbJl_Y7{m~GgxKTcEjQ3a{IL15Kgfr;XG~iCtSTDWW3Vt=f9LNd^=QWO^ zzWq#N6c9I4JH&ka&IgX|`=dT^241uLp=+I36~& zSL@+_8@QV_)+>D{V!U-1FmDeMo^1b3>0^8Fhl132-FEgc z;Qs0Z$8y{614ljjw+|fci#~^@PapOE029t2zd^u_(pWF~J&2Be958zZOWd?)O!DJC zlsgO4r;q*2!#;3quio~7qdoAk4;<6?xepxq^&XZ!ADpMjGvN$!9t_+u8tWzJb>KG% znBQp}%h4of&KGALkv@I24^B4W4Cz}A+HpI{MN|y>7#w{ zi4Pp@*dC({{0#XR3ETvY^~%RV2q*#O%p--TS3A!1y{9oCl{2;DtmogEaEA0{jK;VJ z7oAu7&PTu@z+82d;JVw-P%|deT8XPWeg!aK)&XE%ANjzQ0r#W}=Z?1$xB(}o=EIF+ybUg#JAG^qe(D1^61Y2j z;LZf@85ho-KGy$XC#B}Yoj%S_9_0f^JGRURj^%cS4;=M=i4Pp(t@nZBcyhH*+yy3_ zp}t)N+?5*ZRp0&r5nl()>SB>K+Z$8;h`|5vQ&YS446^V z1?SZcjRlW~G)6JR%~UTrU-F(09Q8h{G&LV?y_yHyaW0%WzfHjXNMpV7yAlDn0Mlot z#LfQGBxly&tr`PTIj{MW-m@~TLAdC=;$<^h2u%4L!Lh!W;#~^=-^>*Z`O&F(Q^wQW zpFQxDRGeFWY&R-QID@{N0bIStdgY@hD##jOE-II}z19sF?_(9|)5m(b-3N~S!gD@w zLx9`k1E=h((+ue|$R!WBu*Q1Hr49D|C}2LW7M^T}P32n!|I2v@Op-H|FZ27l3+FCh z&a3SAf#W#7kRMe~a;p9s@;er|DH`jQ-_2k(8<=O#5}scAJR9+itVxa6-OtPcZjBEd z_2n@a4stQ%qaC{6M1HZ@5$+VuwMd!tD83ssy1E#n^a23Fs z^nl~PjVlC0esrex6zr^D`@kIm+*Thr+T*)@;7$cDdu3|++~sx^aMeC=v}50K;oSO6 z`|4{K&K>V4;ASEq@4);JT+pjS(QTdT2NdPQ@6 zGcfn9mbeFlze%syPk*&0efo|8Zg?a;E)3l1K5*3Mbtar4zrO(P_ZsV!-)q2c8!+Wj zNh9ll%CCXn4Z!?DE;AQFKT?T%q_`qER z+*TjB2H=jqJbk>hpKtVmk_E-UcQ!mPnsh`;r4pK@!fiuDc!ljsWIEje|L8%m@4F z>?>2t&1}Dn0q!J?^~wj=!Da$en}qYq$9ce9oP;yw<7-6J0?dZ1B#mrGOzq2A@IQ7- zYCcfk40>=iaJOo#S3a&rz%PM0{s+R-YrU)(@qVu{AeA%O&$KsAz9uz&Zhfu=uF{2b zw;LmXd&q@z^JBdKFyRbx`2x7WwUS0JxtxFrn0~-azfo|sQ%vQt1pZrpnwnpCJ~%Ep z_?A?hJ0HV=o9Y8cJEGnPZW3@e`M^=%UiN_-4BY!ZaO{7xZ%v;uPnnkRhVxbN!?A2`~bhuxMweT;XW4;;(w zJQL1Pk8S|&7aHqTkIn|a2Y~5+yQGo*n5iBufPaa`fK<+F-se`}eyy=y@%BP=e*k9N ze@VPvb|?Ky?o2PgX5h+PIJdr>0^Ca`oI!qr@4~teE;_G#`~qQcb%<@Z1Y9|p`ZzY^Smz?$^sH28m_ zG2};Q>W|nym)xCRE|lLdeBh1)F6*9Des1}l58QYc&Rrg?=f85{-26B`+GD~Q>(}2;BMy4Ezl8>j3UsjrA&z-Qd^bx0%+PxaerlnB>QG zf=7Or8n0VlSZ|*8fn)pkx(^)Jg+BCw<9OyvAGjRgI!!o({Q5kI{dKtLyyW*T4Dw;X z^!l^lrs9uDezXs6c{jcM76Z54g>&oaVBm)TGd(}nhnYTb#lW56!nxy}58O>YaI8lk znQ#Uw)RiIL_yr`-?zZr{fVTJ^;zY^z%PGqrZoZ=ofp4_2s;*-A81^6{l|U4 zJer2zG(^-6OrOsrUa$UR9pc@pF-#wwmz{Xj=b6@txahp{aWTSX0P}>#b(fDff!Uje z-<9C^4KU4LNW203_LB3xz&xUHUg^s~zz$&AzZ8C6^NuW!!TSUQQaO`7#C+qvzcJwq^4kYo@HGOq!MJbk6CXI1Q!pbvKbFUE6V4#NIlwK@STFe%fnOak zKS{!Q$?pzeew&0d$&c$Pj{wt=g!AI}B``fQCC^^z%j=1A@_{+Lm*ChxnaX1b{HOOx zFTVl6E%kw8JzwtwM|2N=Z6Qe` z*W*lb;rMd#fYf}r^?-VRuM6kyj}8H@&4e@L;~&8NOJlwAF$o6veqf4t@FpDFFH=4! zzg~x>=EI#nmfKh#IM(0Oec-t667`9@*$0mK*yaPreC+Xo8wy5_{_4BR#!INJSh z`@nIY=RF@djyu0I;SBnce@vD&0vDZ^z8r{vV}Y4|tl%8|OWE(p@_kfe6hquh{Q~Rd zZXdW?fy*pPEjQ?&As@E^cfZDZ<>OfJ`x7u9X&kLyuX<#S%d+xt(RuN^4-@QzfN7r~ zIO?OR9!-b;1DqU4a;E;g6yf`P;5eT>d2)JwwEwPg;oN%9_U|qqxIw@@=L1K(;e8*t z!N6I3=_<*2&A$u=?ih{rDvy&;pp$^P@MPiXWxt$*_|{BGjo00-O#|*_AGmVh4lXwE zGw5jpa2IK;S3cH&Uo$XYX<ds8_VxM@~(R*ImAB*Jheu6h~vT1Y3cJzxit8|aUDBm!Wr^$GjR84tXDo* z&$j~eO%l$leF;p@vO>7%y5n~kFpHCLUi?-7b4e1;G+t%;E(hk>B%Bw&SAcmh31{NR z^~=4$oLHL3hZnyYz*HyUO#Ci|AZmemXNK@&`6zxV{Y)nT4o;SA}!7q~|>)+>En7uo^L?WaiGH9nQZ3bq+sS>wWJ!knot}!5$GuaVbpZ>EC9Q(nq zeBd}P%PBL+#gN~jz!hn%SAK2i%Zb43oG(1X;BP9ADe%ueEj3--wfay40a9r0mj~T{ zAGiQ;YfU(VTrLLA)>tpOY(n{756plX$qV}@lU%5$mn<^m*AVZ|fqO_}z2f~H;%x}t_6wWWrq6E}xLbVS*#A6g!Wr`MG;n{{Sg(A%0DkWR^WZv3BkR2> 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⪙7*+)w&vX3@`J6+hjKsJKnk<8-V39=sgv9KgeouE6B!8 zd`R24iRUttJIzZ_E~k%8?o?zXP4099$Xa<5$mCANJimqA1v0tQFSxL8fK2Xmz=eGe zG(b(uyvJSGuR%BKoQyJqO=|W;kj;%VKsH9TAgldukk$V4AgleCK~|RvM%ikABFJig zD#)IS#G}>zA{TZg$ZEgYh4~<>{kvV*KY*e11N}Yxj&WbVzAFqn?OYpr1$FSmIJx?nx&*`N zqdEDQF5ld{<&t&l(%ZJrtl`Vr9l;kZbY|~*N~Z*JSNrU}cxzj~o{M0#*Hc>)GpYSd zUVlh(#A@P7Va=g++G?^znO7tJ18L)Y$`w$T zaV>hJGV*<6$;g|-F9%0Il;8%ARL}blbW^3)=OvB*lgxe9-TuS=kNpP_pR)U%0^7(+ z@1p+G2aP3!Nv^fr-=b~|9w&9kSZ(6CkL|nhQYWxyn#P@*Vb6>gU^#@%*Dh5S%d=-T zSKu+hA6cdqNi9LZRm(r-e<9az7-{AoWy9 zU1Y3}3rMzcV-3I3%6)`Auvn!78gpEwp%g9Q9g?uvP+unxSau}e@k6~*lWBid2`p0S z&WS3GWpFr+3~{%sOv!9;-$<(zAiC7KnHBAGD5-;_YB^p^yVf9r86&cvQ* zn6e+?p_a^SM^n!35v0rrlT#<9-?Cn2K!;?1$qw;MCSp+tk7v$1BHCXM76zG^A;FKl z#H<#0X>9KD@@T(Ex%oTeb9cm|{V~BTx_;{}?&jYy&gHf6>oG6Kl}B}_c(JUNezt`X zflHmG)+Gw?ukv>wlw5!WmqLd#Y%Ez{9)etm%mFOZD@FQ5B7n-Tk z`}20$$O^F#WJ|g0l&RQ!K(7sA^z*TViBK)P!uge>ZrykwybDQG%Qml@yhIMM+xc7R zw8wd|_?y3}n29uYru$@I8?68f18l*D!;L zY4qt4AUi)MKt@lV=EB|zGJ3M!g}gF6!i1h_*05C|D`P##YS0I=GQ90WNFvexx?_AgvsQ(he;+|-58XemNviw$qEWaMm`I_Grkma`>WclrMVRwKmzmJ1% zrra{`D-JyavQhXI$l4+N2W#7FF6>A+0{;mm5ckdk*?7zbSqkwuX(^Vvu#F%ak3JW+ z+r_)ph5ZxAbT5AaI!{})A7m7n@EVMtHik9}-8Ah&iE(SXPw2C;Hvb6220av+l3$_b zBqp{uSqd&gB)jzEdA~n7D;t3$j9rvmo`gy{R4|J5uXxM}Zak z$U5hLRF}F|tNlMwGOaIUuBET!=%IETY*F9M8ES86tJ`PobR<;vTC8#dRLWp;a0)XjZFv1ZGfHE3hej>S*exDYO>0kI0cmS+&u>R()zLyoS<1VM$J0WX@fk*skPo ziVSU5LIN~;%-7lq0&_Cvg zlALR3y5v5!%efekLn^n@IN{V$AwoQJ-jrzn4U%72AFP)6|Jk;8RjPfQ-IAs3*4&Y! zwinHct#+$pQ?Z60l6ugF+buZOM5v8if|KX(IeXY7p_e~zU+it?{(V?%{{-E=K-g48 zx_jP4-F=E{9^}IK?jHV~2mu-W@*9Okdi@c3Fk!F%i#!c_-ML8;(&!c*WDZP=_U{ES z>(^MXU0SUE3n!}o8Ls|bLG4XhFSnp4u<{-ZD_5>{Phl~AB$^d-V{=!+b`t%dB6I0b zjFKC|v|o|5MX0hjPeheP`^6TDmMh2cVlADRyE83JDh_$xV3mce&|=X;d!tnr(nZsX zwDB9OvPf5J(px3z_&4@Yy(~Ayns%wAePg}+4DYR`6@S=otjeDVlRhc$evvANLJ#AZ zQR%C+$d5|8BGsLkcUDKb)K$f*nY@$C$ZagEFLgfCzPinS#HqiEuk%FxtLb1RTbNre zoL2w9a1@EwTnpYkEM)i~s=~6q`P&xO|53J}X!bD3{JMi?dthV4ss5AW$@Q=1`bu*Z zFg107Tr)B$H`TwUwEmC&f%K1tfAkmfq9UET(dhQ#_I;5;K;ef~dytnLGw&fkiDM3C z-r0RLk=SA4)?gf0A)k6NJzx}Z2gvA)wIDOJex(b$24pnH4KD1xAfu~44YFK52eMl^ zVIt3E?TmX5fh<26b$cqzRJ-pxiAiKP_ae?>H}`Wvmf`}?Z;2cC+CVph$~+NyvlJf$ zS&C1BEQQp_QV6fxQpgKxZF|lkkz+6_PdtAZng!aVG?DnjGdjH$WVyWEp}zwe&)|I^ z%lS@__0Shw*nJ@58T<%zh2DgfKy}+q;#82Oje{)hNiIxoG<&r!OF%}SiMw{YN!$y% zLZ5!bJ>3T~8$XYNEN9`tSkAw7VUrjYqXAC<8FhII$Wq8Xx}})!!q$K+h1g*-`#awO znf;w17w?B4OZ%J)`!mSw?^LpPuhTl83o>d|BoM4zQNFdbB7tCGSA(qF_kxToAjTl< z>1RNe;%hGKhalq$ybQ8_e$73d28C@Yjs{sSXM?OydqEfSTjp(bPsK`;rO3Ike*!h~ zTjqV%g?$}l@$PqFzW}xHTju@Nh5Zp^@gTo~8dQSBE>xL!vI{#KWbx*?Fp)}_sqt31 zu&Z3W9WLw+&?y@4LoV!7F5Z`2*!Mw~XuKc0uwS}(V$I2VXhwul(0Fp2Xkl*#S^b1( zU|}twdX2ZlgUS8(>UT2e5q{%dioXxB5|nwL2CdOK`8m)pb*1?-=w@AM9tEw`r#}b1UC|#v zMenck*Vp3x0DeSMc##Yl&ew~!1oz7Fb?uH(PuK1!e45&tTDxgs@0Go&?Zmx83?y+^ z>;g7z*m5P@56yJ3!)tdqykSdv^M-BeNsw5o+}zoR>MdUaRbjn2AH(DM|5*LsxQhw# zC87SAU`nk;2^n4F#HQXYSHZMF)l<7mG7ULgX8dX#pXG2@@0D9@`l+HK?~*r(&5w21EA>j10oBdRg#Qkx_Im6n{Q)0@ z@o4`OMDQDH{~6w`7w!KQ-ynP%yj)|g-`LPUFw`iU6L!4XdiXG@^}Mx=z^!CvPD$#> zmm9ci!{XQUWT@d6@f*?IPQ^kS%W_SQj`o$#)wP%dOD%_Ow0?9@6G83aNsuUS<@WlhPyx5XpcTGbqcbL@wC$ap#@>O3F|&$xoME#DH>S6Cyt7bXn|jb61eDY z&n5M>y24xlN-1gr$*Cyrtp}MACpn4zfS!zd{h&TL4{`7BK_Y_`_dW{}?eMtw2uP%d z;@)$hXEcSVSqNvmz*VIhOzOnN*rp94dDEF%d*y~@*KYN2F0Kv|WuD0cQnHUz7yDrm z}u=A~sXrNz5 zWLSW!h;@UvnmDRj4pFPt+>Q*bxlQj5xrGr8y1`3L$1$EBiz9=9bPA~$*JySn6Gzx! zB7v6KJsWP&4Yb9doH;P%8)wpz)U>&s%cK3`xXxeHBTTz517X^gq6;U1D|?WkpElH_ z^&FYx|5WIPu0E6}MbaM;htg1?(BvSZ+23*C8Y-haFSn|}Z(5jZUg$4bQ#X(UE?tvr zT9Zrnh)FnHP1d~#6|1#Puw#y=&o%XhkoDLH$H9d2n zBz+|Lrw-SMk=)9j;ekoyw?y-6*ZkCkP&dlxfqJNnXGM|m^wX7MlP>kv%mv3%*wS*p zBy%8=IzkL$VHImCgiW)&N>ly$T*RjiA8MLSQJ&s)k8Gp@B`NU*8^Mok=DafOGc;Af zdMdGZUhe$ygkcUgWwctV+VAC<5OV5Dkv?ihbZUXr9wvA$U8x!SKM0B$iRky-lG$Q1 zxiodc+$E^#{*ZZd7m7Cz^GQUy(i{FaFb~tm_?@$JU9AxJe^_y+XJ_4ZumYf6`OeYGWM9!^OJF=OGhYXk}S_H zC`W>W-c+4V-06u`#P&-6Vxf>@2%F{FA|qu)$t^D*wO*voVbZnagZO6e#SEANFF#L- z-pDln&!Ku83;fYcks=eEZj>jwlC2VR+byxc6{?W@^_L*3agm4tw8TP}o^An~Pa(D+ zG=px_{a^{m_Jiv{wjapaFQOvmP4gSf$GEqcp|z*NBl>q;@#VHd*6X+@`t-i$_e;<% ziVo)`=vQBGbP5oYe054DpK<|XMVEAR_FJ) zuzeu0^cVM@0zIrd<{vtwrUK zy{^ZsDr`y2o<} zY?Dg7s-fKRofq^MMvu8_jaD zbP)>jqX09>eDcb+xJlyV(ugQpW|^+TLmx5gJQM{ zRJ5^}t%7?=G5l#s*45XU?C314Vf~=h@H<@B4M8PK)s)(mK2aCR(d=?YePl9@Urg-c zm||88sz;6q?#GH-#<2TOrn^a4+%r6xOy58X$Z~3EGseVHwQnoaZ{-!MMnzqeoU2l0 zH%6ope2*!PC{AFXhMwga@91z2X#VW{hi!_zB!dSDjje$Jq&c`fSx6i?tj^<8)zw81 zu!r6$blim1AIcX+=luQa{M z{2Y~xtQ#9Ey?AU0)RvgkCS4?rK1~FIv1H_oiDSjmhnoU?$;gyL>#px-s76keSBwtA z*;QzWpiTAGu@>gutx9=wL|9@Mwo#V$b(x}q(F@{VIE`Ufj?p-!5(_`6wor9X2LFcle{%~MP~C=lsb`|!|s5$fS!DTo-%?YG^mzr&$4Ax zOnM-9qkdElwR{q-YBf~IGC;W~F~>qrDzU)^T3-f>&aCp;9o-tj?4GR`WcO?-7f&b< z8I`z~=9M6OdM(H_GV^l1 z|3H{&WQr!T#S^2arjdD%3lmQ&16tZsE=+h%HXcGDeOmi|9_UNj%1)5=%iBRF1HBt$ z_n8@xm3BMGdgC8l*q1-|wD&0%R$^=)wj;AJ7y}fUKs&AgigE@VirMe}Hi<)xT~Gw(vv!=Hjl$=|D@Z)c>nLzZA~ppt zPxo$0oe6yz9PCpZh}CBUMCI0VDzcqwj4~O`iuqrb zh8Ud2tT@7y{Xq6!k#g@0Owk1fMX)B6Zk7WJ2gSG@6rYzOgpZ~R^XoVyuD(nZ5J#U7 z6QfRuPg4Wkm@v;y&hex;tq)j=Nc%-Nbbdn(Sp~kd5kwttp9+1z@rSfG>dpIOQj=g) z47%VN-45xV`Mg$oAWJnBDambz$+7BHsiQ}^^3FAuawL;2mOSljStTPON39|Uy;P{! z(mYNxu#Am9GP2Xoui5J*{rGN4op`4X*wS&^r6d=<7!mE|WIn$0QfCL-+4v?MMcT4t zcOYcfD2GfreeY*SgZHL0Lj-X{-(dL-eziY%*(ywW%8Zyr#cZwT5+_(`F9O+K)B&=+ zXr+rM^V{~KZ6I6wG9cTF-VL(7=x)$2StsM3=ssE*B9mh4(r-YvGQQx#gez)m%M^y$ z;>pp$c8nU3rI1snt)(KTVr!}J-YmsBkmb_n!m=P+OYZ`i+{PE&Q#sdJihVBZd5}qK z{N9EA#l@TIcAHZ`CS4)&ELH=NXR-VmU04!yuCBwIKzHkUC~H8`+wBQ&LuIr)?>(fG zpUHux&wtUiMd(s|DR3!-s1v?71Io0*sMD{r9<$ygggX74U=-GbI{g?}R;8LQ6ih4H zli_{GedWaL|01RMEq!pqD>^#clAWC*!Cnjb`=qWwnfsWwN=o(1JRln}jrThN!_f)3F@C{OV<-8AvLq6KwW54#wimJ-VNfVCORfP3`7;3lQl;Ef;E(lm%F0$>00jx?L=Qmb}583JFL$LN?=v3F8W@*TSrVsSAn?)vO6y9F-P_?KQ^Ca0{6YnR6(nu{3OC9=qsu zT4O3!r2Ul>wV#(l?Acz(>+vliBe_%!uMJtikQRjk)#agZXAWNCn16q`{IHV7^WQ>G zRIx$Xng5_C?X94D6@3k4cR2%~2Xtq70CXe2aqnUN+Fg$9!WJeh7rV>(8_0I>BTK^F zOZM48%|+&xo!4&ySs6ZPK%c%FbR+5Gp3sI?hR}u<_AQX5cmVV*P4PYV^amhIAy%($ z)Liz1tX8GGx>hTp4d?3}(uYB|(~InY1OM46_ z6SGuvf}`bTfh^wJTv!{(WFeC-Y@LhO=fdO;?i6Z@{;mtV)5Q}lQ7iX*AZv%*ms!{| zF5ZX>n+EYs*-7nr3H5G(xRyUvW=G z($rEs>cV~jk~0RbSwPlG(HylJ91gM+B5h(}XMxVpaTB{%*51qA(=DK&Rxa!#pl|3b z5lK_CLMAq>#+{F#(Izxr!!svP7Wyk|5gp1|vrhM#og<7*Ti2Q-*ZQsN5Z>d8P_L3i zEihE26dAzRmx5bGv0y{=W!w>_)^58JNw+P?b!}HEK+QQYN3T)WZ&-hJUdwVj*D#y8 zfD|Vt>wB+2>v6kXb&gNRHDs7jZX_*b@j_o;c|B|Ku!*lWZa^>JPA}wd2RCq6NvqZu zEmAKjx!fAtR9<3CQZZ!A5ss$QWAgoL4Cz#F&k?+E=X*GcyC zuqB%Gh7vudiR36-F8;*g^}kO~Q3^+7qr{$1EOp|`O%ORqsvR8=O(w7u2#n#`;DVA= z#mmhWC+hr0s<7J6<>Z^#KUfm&{{*%4n;JM6mHVx=`|n4->2`wZA4pF%J3oVn#ih$K zJC>iBigkutAsj$bJVP1j^30y)XQj&!sToK=a%*#Kc3@|Ne~k#&%=Mc~MW(JIyb_Cc zJJzO%%$>q>SgWDHlH~X<)v6q#Q#+QYXZZU@zPehu)PuxhYmCra;UtNz9$Z~F zFu0D=@^$Ky3h`6omBi%pXIdu&8%350(Z&>xV~!E2sj|#YTnUzkEbCGv|2mUSNe-77 zgK~i=$uVLG$`|og$(NrJ5uD@aSuG;-LZwWAYLs)^`d<`hHI+gdNCdI;9L+9aXQBAo zq>LqIyv)-jMnvx)-h6cJ7XDGS;B$}9Ga0Bgi~!>vO640 zCVez3YEek{(SCj__)Q?vUyJGia+-D(X5e1QM-SclwQsd64qY&b(Hdnvr>}Bz?5>QYvQN zWbC$x7jIVPwJCVcln(5~T&u_pPC=v(H<~Ry8dcjsR&QmfaXgrxjn7kEuATjd>9uP4 zqA{s75yfK?RCMK_RpZ6F2Vp|a5`)7|Ia@pzqM=+U6CB8nN-8Ll)Cv0=Ya^+t+BqXr z^uw)Y{yx8Rafhmj?`>S;_z6O8-mv>7d6UAIM!L3WAvHWWsBiFm&|g3pJq6j3btfoN zChxbrFSqj>_ddzr4=VZ>{+b%nH$nFFe)se-_w-rN%bN2`Aj?@yecACe?$B0{ttR~- zTTQ+KvYh2GY~>1r$;$n)d-{xfI_#bva8Knz#nP68ENuexC#{uSs93Eo1X-=x9a`s* zh?m{U-W>Pj8pY7}L4VL(egm>x4(9;+dkvFgv9bBi2bmejg&;Hecrj>%cyTrDDjq*g zNbPr;Rt#PJR?$r$6V7mg7)_ftY;F|4rZ|E^lm!=31>R=WOvBog$Z3Uw@kq~vZl*Zb ztlg3b?PCn+2+IWCPX49gf?pe7giT7tRLrfXuKd9*A8U1F_c?T8KdoK1mOay zxO}litEUG_k^k9X`VreUY{VOv$pA@bZ%^YMyf>9rONn-hUVFtAy_C^N~ z$r+*4OLpg)YlFp8q+_P%CCXQ?8a#!}B$K#z4(Kplk^o-4{NZO(aPF0*tU$VmGsf;p z|B@K&&z3l%MuT$BfR|f=#~pUpOL&>*E-%GM6`=m%^yJ*NF*_{;Cy?CAWhC@>l=>0) z95|#{%z0rK@;0~aqfqv)m|yxKp1o3W{j$s}NAGUV43}nJnGt>G$9O#2>2BZzWn^b~ z94Q^Sy32nlXmRPt`h57MVcaE|;p0;CZyf$AeVID>qVy7MvuOf#mR5Sc>>k{LK`U@H zuNpZkvm+8qAMYYzr9t-o>CXR3 zS?`yA*^lgP|7+$ihh5td{px#Y5dMSTCm)tEjWk>L9ZzH6b0(150toq45f*YwOQQ?EDu6G`yfAc0uS)&z@8OPRW6 z=ETyNwX53yosx9z{_n(6XZUS%a2Rk*=D`wJ#ktn1y{*;x%En#2<_DFzH^^HSbj@2$ zv?NS=NeBAw%$(Bn3H>{2(-lFZbr>SSFdQHu8+%oA{Y$$Z4Klka2ouVQOb7Oy_vITz z8mjbbk{9=2E9k=$vde2zGxBvScXj)xf-D~nvOHVDU_X=HQ+sN|_G^A8gal7KxN~$F ztsqfz{U3Kd5oGc^c1F$M9BUtE6@T6rGZ#kF$Joe?nqXoqJ#5*Jf*j-uNW!#LbsXQw z;7geck4wK<-2$eH%MFaB1nDqMa_X6=BuF z9y(0Ix+?tza>kw-`f9K_{s+lBtoFi@vY`LC6ZTu<{tkjIrPSu`8GTyWA&0KJJ`dqi}ooP#6*VrX5d~NbC z>c@i$x6~il^>r;PUF#ZfV)(wy`*P;ODJY%XZ>vKv3!m5cbitAs3zzubh_hr>`pxmW zgSliZ$FkO3Q9qPAqK85}cdE?osbC!9{d|;vP@kg5K(FY*u##70hlZ^OnI40XZI@}hwW2F8t~KM{ z%^>kI824m_yjjx5^l zW^VzB1O=7|K;?==E=2^7%e*^4;s>zI`+HECqPsxT6v;j3R7E1IBDT1&4+ol}h>r9g z;2TA=14{}pe^rnINj=eYqLwF8>+It#ZWf#-oBw*{Hmv7Ub{isb>#{&U^ZKX(DqU^GIW9_@-KN z!JLvrK+sOu49^MPR{Qb;A|#2~jCWM-Z+Q#ErIGRvh*T-2GPhMK!z>bz^&OQR{*SdB zdD|e=KP0(K_LoQe9pfFH?I#=Q}c&1?~65$4kW!`gemS5b8D z<9oTGg9N-%174bROrazMga8RaS|~|CdJi2Tks=@%0$i@xD~bYQuYiJzB1J?I6af(x zD=H1zVG+<`HyBfclJEboawW(GqX7F9+JXR4OMSV=rOVeW9f~{ zBA^1!osiU96MEyK{5C*RZ%wvAQp^V;5>H9fqmF(!;9)nWdZ&*aJz?AgHU6JHb3!{B zx;Li>lu_8XJqiB*X{=8V3`NKKGU;5*5S*V!F1Od&4cq(e)M#$ezF~@v!`Q!NaH5NY&>%6 zE!T})!x|y&(L$kJLPq0{+Hib#09P8Vm%$0^7^0`;gaxX#dfo-zBrL4 zGMyB|#o1cjkcshbc4lTyYn0`}E|@KerrnGvwzV!+uMpp>6Y6=x1 z`9f~F>`3p2K3w&BWp*a-${S0^69=;T=^#)O*-q7+dPFyf{>27SX)(=F=wJ}WYov*q zRAy(=i|deDl@?Pk^fuJcA)lc1qqFn>!M~ZA`2O{5e9tlmqnPZz6D#puG#(k5(&%Lk z3HL_(cvt>AK^&)_l{3G5CYyHh7r@mkf25o*FYEuFWNnL$PwrS9m%>5eYVO1%+Oyp2 zc}lB8(xjfb$Y7DLodAvUO2rXOySwE6Yug<1N zrZa=gec94geAatQmyzw^tQ`EtDR;6%ye{IZ8a8?v(SaMbSV)WT7jS6KT{Udm(L>=t zS>Bq*9|^Z6*i@H@evV%IPEbdFxP2F3)cr6ieTSrxZF?3^EOyE2(m!&X!+-BiU}Pii z4Bdb{^Hgjrrr_uR8mIR(oLYk|den1ybw=KVm)QJe6qEpm)+-6LXJdph5X!*k zQ7eS=0^X*tA_%EYr!*%m0R4Gm`D+8!Gy7rq79>7yywS+0#>DDJXk5zc-!OioKJUMb z-%`1|+8HjOE(DElylOJla1X!h!J_=_*lN=^GyEP0jTVzy%Np|Tps>!w7Rsc|9CRsY zjt~K|UhaqgNce)AJr|7Id~^uCC#A2KVJ`$ERVk==_vXrT8zfaJ?t-K$1wF|rKN<FeFZ00&iJp*Ql!s!FIwt$E?-vv|>sJ^62eNo+KI5Q{Ixp_D*C!E%tAA|CS z7Ad(MCOY}=#$-41t zD_|Ptl8Q@!xc|2VuxhKZ4K?y8g$JpVKO=j?ohIWHA$)-ptJIvldd4wAdgp;BTKL3n zZvFou`r%nvo|o57jfhm1$@vxkODLgPC|#Um85Qt_R~cmX!t46zMSs^s%H;hoHsH~A zMFG}H(hx9%Kh48yr13KY-&z$?JV>Kx4Z-c$zWr4E5xqVL!<{T^b#go9l6ng5x%@ne zCnoW7(~_nS%uR92?Ej^#(&A!-(Ewo-b_7As2I-k}jEJYO50JucJ&kx<=Xem{%R&EX zjj=m#fhmhHCiYT?gbJRg$V|yu)GJ8+(xN^=>Qvm%(#P(+6Ss?X0r<{F3sB0b0V$8A zdXQAJHxrU-g6Bb+!FO+kvHoy9$yD zttlkc825rSjYG?Yq%4>ZX$t$%^z9;W2ApM(lm)j({GNiOI)PUqsZN02^G;ywF-R)h zpCGAlOCiO^@!j%})ZG9ib(f~jA3&aza#}+=f^lrXp|RelkV-k-At?lXXGbCOAdLoJ zz*!Dy6f@ru(R(nWM+ajMXFVF%4P(7RNEEApb2U0a74ycBZs5BuAuZyV)5bg%^Q4I1 z2uKPs0a7+2rbX`NLQ;si5kERkNu|{jkW^ZI18FK_zlSuDr4te9CrE?Y?+l~?Ed3tw zlX(DoTgtCqWi*G00Qw>v`Y1g_jOg%W29Fj!Tf027CeHtbwCKzTcoi$gevsY4pV&2a zHl|`|+n8snqTkr@sk6t9&d8gY(;vO()ba5+lR+jbXiP{Hs82Z>G2--=cgv%5F#Uo!(c9t~k@&h8wz8PK zaMOieQoG}MdzPmQ9oUzOSUWUCpFmkmV+|U`(_q6*B)q(zF>P8diYdOPgQ8IZ|GKlh z{ZU{_)1VP+1+kb5+rFSckH!U;*^Ji>Q#3T&izn#Fu5QfDszLAn zycuthxf{?&-1WH4Jj~{f)Ro&-$6rNl?N{9{z#;EOngLcZM zgVgEr)g(j=?^TIvM7TC34e!L^9>O#I`X6`W{DlvtXXTtlkk)wMl6N|QK8rxF*5+X^ zJoW?7ZbF%WK7y_mTiY>9UTN`J^r87Z+WUBCVWq{7!z5mIpEs$PW%sm2!`j}EH@=uH z7x-AAy=wpekIjjd3Wm~KXFTCxDtg7t>iIikGHKJG3?#8JMm8?0;~LBp7jS5MJ~rs# zB(&zar5E*XPn{%#!|ve@SSi`N{kdHwa_e#4XJ_RUBB8M)?hnpc%03h{8mkmmaK{i) zpbHPKK%W(%8L|Ig4hvA}?%2o93@moTM;wB9qtJlkqqf)o zLQ%R9iBKUOC=qlI48Ute_4Rq|H?5BXq$-trP=RM>zADPm!v}}o9X50jZ)O~{lO~tc zPD5I2q4tem4@vE2><>xpW*ipL8w=?;{?u2wROeHG-)abO4L0 zh9SUtr}Xy2uOZ+41k!r$I)8+O*JMDP!Brusn^S%?;85LU9Z1a>+W^uc=mwl7kW@E$ zZN%?-NUED02uWE=1C#sMmd7Ef-I26gQiVoKYt?eCtr5R{kkn$XgAu>)AgNS45%K#I zlKO7&g@_+5KvV1Xt3py?(5^?dKl6G>3ekt|Mo~NlK~h$YfTZ?pj)SBum;$LgTfY>N zvh;RHD&HQ9=)D9fsVwpBfJE;f1I~Al)V_ifkd!TdKvMS6`&s2z71Acg(w+{rqoRG} zE`_cTdUpp6R;qG-EQF-?AKVQ|?Xq|p(v^IdzW1f>BFmgZ_=SXW{IXhlKKC(rKR~?< zzNUef1Q>?XKo^tY`|;Wlg&x(T(&Bd@Q(yBY`K1QXwN%Ka-%IJY+7(87!i#C-{>P1Q zltaa|hPnTBBitFprX=?i-+o?*n<|Ln#4l%R2ca`Wn^h;KxJm zCO3SB#_m*dGcOm%++=Xagy-W0kJ|v#loO2z@ZndoIu(z-l?vWNc}Sj*V|ICLfdCsv z0z6w>ZX{kVVppS}#7r!am4PrLM?h7;DzgxUS$L<~rM9Y=JkclVF-D5=PRe4tYtFs) za?!8KeJutMnr;_yDD$ZOD=y~omy3CBb;KIxVGJW@$)HC*Ia4#%W6>IA;P{uz6nZ{T zD5#@b;bcS2cIYz2xW$^w6l3~;Qcy>>!by5rA(5pg-QptK^0JYoH8VjS(F*GOrId8| z>_#!U+W4}Oq-~7BELodX*ahowXx1aZU(-UnR-K}w>K2A|+}Gz&U!C;AYWQ0K0sp6)1^Tps)$fK>I7VetsgB zF6dQ3g;g*(?Wliasr%2$wt`8hCxa39=;YME?$iMko7{3(VMfzds4loe3yDbNO*bUa z-0@v#{YyEdu6m)7kW@c2HR4Behqtrd-4VY>BYMw8{B}VKv)%_0KPnZ9?}v!rB}l4A zEQtary&oi{S3lyH0!it0i}>}A=#7Z@QQcBK=iQJhqYekSr&l(=6w!MVk_zMfh~L+c z`eC4hlZJp(sS$*vtZEKPA(A3~G;u+j#RAS$NGiU$k-M}iNFiu^pjh6Ar1m?06!AM6 z(K{LOy9i0`cdUUnS&aZ_T0^nWdQ8Qf81bWTfT-R+2T~tcRmzzfxl4=N6=GS$?=eU< z*?Kw;=^Dfw-%*I%-3Lh_K9BgFhD2k8fKvt|CAFvW3P{STnvfKtQN*tuB(^G zkfeZF%0g13=4z1CShOP~RjyJYsd!{UQeljW_|1i+%GG0#6!xWv)VQ(ilEhw4yjjD6 zIuP9bk`VRh1DZ6&_X8ULKkNksi#yc-K6jred@-TGi$_XN|FzOw1waa>CrWt$_$ zBGs@X1Cc;k!=HK`cPo+#(+spggqAO+;mtubEgFvrcf-gpoXsm6(TPW6JyHyoI?4fX zm`DhB352>uhqGcr3mSxbMB|LO&<$7`5{-7dmTIEq+-9^l@GHGLjjF8^o)irC52W@B zO$w^E_(=cACPrX!=r=tkf?{eQTOZ92hP*P#QvOA!Z z08iDaSQbAO{<~9y6bQbBof?BqD!Ol0R;YS76Vv{Q;a;&>cq`PLCjKMq)EZ#?R%tOc zpV-1Vjn?rdU#wKH5x>K!&9jg}f#i2-!9)-?1~YQ!Dl;#;Mh)rL9D)3mot2gIWhr}_ zB>AFunj|SNkXu`wt&jEo7_ef|;luw4P921A55)FCk}T6)wx}?+%n` zSen}${CTUx*@001=x}PQP!}AF9}^ndAe<8A>d~heDi!3SqjQh=kAfvdjL6DCa;TSa z-uG}|a;KV*@y^qn(@i1K7%kwWK)MpOBEZYr)Nuvt;in#a-+=TK5NIkPEy7>G*@dfm z@TJa9`BALZgYP*=s=kAo>`)7rx55Q}+tIeD~!$pqXxYCKeD1vCl z&|cIrU(?x28MMwnJF)~FZ^C%EhzX!fe$Dh3rq3q&!iNRf7@Um&iB5Pw`Ln$GkgE6X zo1H_Z=49iwN963P0KMxRtn5fikH)r_fze4l0=XxWdIa;1g?a}kb3SR8!s z>)T2*ku7L3eb<|QDz#`9Y7-ZiHjp;5)De;@I0GSd<*~xh$lWoKySG5<%mtf9g{tyw zf%G!7?1n@mxqw3rmny^w_^k>tEs}{GZh#`9KE;DMaoz2uoqKl;YJ2~;{G z#W-c=%&}9j>ZS9Xp8N$L9BqJi1?Kt4`kg;Q$2xC>jQ{b`8Cs!@73#QpR!1&b2S2<_ zJe|BF8=YN%mVrA9t_t728vllq@^6Xt=U&^{|3UKpd1sN@HSwK_Z3_bK?WEzcxs}!3 zUoqI06=mVw*v%9jo=xYuM(59o_2-RPUK$6@R%l;#MpXN9H$}CtnCI_SSh&3O;%(ut zD=ntsiggZc7hjjf+wx9eH_>8BP(0Rz)7ys+Hv6<+wmUOXA$%hIui9(zANX^}V9&ti z>FKn(qSPogF(`c*;m%R`-e*?$U#Sa0HJuR1?Yb}->l?7*&UYDv1`KP!_7C$?tH1yAgh>z%7Ne zo&9cuw3VfMAQfp1buq#MFK47GRP^#nom`PSl2=0EeGRr&@(GW4KQxmLYovw5dH6)m zOm*yf(Q_vFa1A;7UYBxgwao0-onq-c0b6Js<}Qoc0t=}bT>3n``e)+1si%>|S-H_k z-GyYE}Hpo*r1xD-&6!~y@OxBQv%21mu1*Uz7% z6-c!2A@_#-M648B4a?}PvuMRCQL8w=rdatP)N#0Zh1}ZVZbL$x!iaiV#5BY)9fnhk zIL#1|=J`oi#mvWu|%&y-jP`xJ8X!Wjq$$+Tz>1%s34GJ}1Bc6lbS1j#-q*hy;f}}=Z zzd`zf@BR&G5&i-W<%k-A(dbS2k+vG!b%I2zz+eHSBaEfZ4T_I;)~OY#+aWDtJ{s;Q zK3YYq{Jw1)*4Io$LYjqe*dvXbDNNw2Jt3hor0;3`vbR=Ru-ROX9dI zNcZu&i`O8nKrzAxz#z?pA3gvE>2CJ>8PZ1_8m*Jv%hGvBMcTEFFE_2h#VUgTsN*gsgkCXg|B79Sdf7Mc^fq37UC({m zrWgDCejW$uV*PAdxrP-b*EGZ;#x6Z;$I?+H>L zu`|@GLMSs>>Gu1ejpxqB`MaaSy|6bq@0y8?BfB=}$+nYvKHZ(#6`FX!O~<&E&hcWAXd&%qzFM>mD?R zV2TPsx|G@##x>}Yzq?HGkxIACK;wqr%`qTLr*8x-=nNBEJGBO>hL@X=s1v~_P9af= z3OI`){lzTw9Qg-JcS2HO&`a8%xs`Ys(yx4XGo)WwqHSAWBE*10E5&|dzsuFuX)|bT zP>MTwg)%>5Yztc9gy%{cW9b9PMopMX=Xl{*G1RO6DFeOj$^RJ;c}4(HI)7mY-!Pn! zOUrRk^LiJv?AWcLr1BqH9~B=_LK-;VBMHcrl_!dmNDg|Uz~NrlZB;!x;Zg>T|0Tom zj7Ae_c_U~rQ~`UhFaqXVsD1%1HpP#FXfX@^^GW9(**8^SEM-w=R1L#Z@Xr33yVHhH z!3?Ekgpb@w3nXYZTeTrn+{-4V4XL!^4p<-Vf|(T@7e*amIBQ7f@VlX`A#4wVNM~D5|01QI$4#Nep!>gM}8MJ{5Q+2c7zmTPmDUCX^kW-zON<>fuSvamH&F zzT$@JR5sj+&WMWUb6k;BVD41`4Gw*wPma9`_bG!IsG3U0J_WG=%B`u@VY=EUfKRO# zoX&ezDry*KkLNbYzk~@QS_)D8!^F_R<#*!^B2q^u!%!r{{LzItD%YP|i_RpfN}n0T z!9*qVdI`(P&&W!=M8flT#c)bw`F08>F{8pg@LidHSqTU59IZ0)F9d*147V*O6n!(V zQo+r%cx5tS~v50`TSH zGaR9Eg#K5B!f4SfEd5_0LkEW?xo84aO_;WTq=qOoPf)osH974eEyACgMpHwSZV|tc zkkk-m8YDGD*#SwKIuxxdz=DZdNUD*V3`sRow?a~l6g|pS}`Br3)_I2b(PoU}jl zOK}m$vn(nFHVw)n${BoEWhuRmMNLTzccX?S5blP_x!j8C`HP-8&J@-z`dP0(nHCi^ z|3kbj?KTjAYIsb>KhY7~?r!`JKpAi@&mW!@ODn^7q62lV;#X%^i><1_*M`*rCj)*l zTqrUj)nI8DBvm}-KvHwH%OJhNeX%Yw+%?hE6+XO|JCZ;Cr+528ABQIJl`cFCa;kDl zp>0Hel6wu>rZQ-o>g3Ns6H`5$5x|)&mBW35p^WOG^u$nl#z{h=so-U2gjH`j;>jBh z*}$$Iv&soV_zD|naIVKy zHA9pu%5O3x)eO;&Ow|nC2}!5MO8g>+w_^NnBX4Tpe7iIZRpn^K$qgFQ`>|H|giohj z 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�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 iJN-CQcLJCEw<_JToggIeQP)T!{Rgvst=&;Jm5k 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

    20bKRTS)S}rrS<-1Um#kK=#AiO3074; zUsEIyK(9qitUnc^h<_M(EG(s-h6aCQlh;iwUbD?nLRXKt%pkYtp*rQ-J3SfP7}XV4 zh30DxFC6L|j0}f62Mvd?5@E$qJhnz}X-~5YV`A77hz4w-#|$`?YdQyU1q~Tn4RMX$ z(A*UD)w`qLC1`{LU5D5@Z`_;$dZMn72XWtro??xB;I6A(hl&i+6?7N*j&)in!Ki|a zMlM4^JJLo$Urdob8!$6j(Yv0TUoX8aGBC8J9wSN&7l#}JX zKADBublN)QBoT`9-0H2d!9EP{#&<7Xr*7DoIcyZ87!p8-Yr^7zUd4(~bI|Q+2zgx? zGgg`%TC%p$*o+1mjtwEG$^cUBYYKWp9$(PaEiT1v9jGSMk4sEZ%=Qz?(Q1ZXP(@?2ufZ2YmrM-x>tnD~qACz^N3q1^bFI*4C8qXprv5Gj za9!a*y}P;D6OLG>FeWoEAT4MO>D(3Gu*cib(BO0RprhH8ukZvzAI*kFxq1-HO>~Nk;I(K|5sifC(w4N*XItb1WO9UVj)>-%A{)Xw%)rB1V~8DHy?wng z^k`l2YEL6(t$~Ip1?NCrMOg`7K1gMxEoyy%#;DsH2$_w?7Z#QvU+IZN>l^(rtp$h9 zla@xww4h}ajd^Z3>h^`h(Xb1#$v#7a7P_*2dC71GM3L+ug-2;Ph4_0HkdbDC(Zt&!?gBNy-ODn3ejn;zY?HizLKvY#_r4@78 zRNk=5@AKedC0bAOa#@lgjH-&uw(`14V~jE8-rlIo8}@n7l>Yw*VJuX8Jb{24!`I%I zT-+DyTpR1?N5zUuD@*XuVN0FaKr|Uvh(?=JjMJBZDUZwM-Z&Pz=65c~3+f1qsD#1c z*G`t#<91?XfTo%Q{dTGzW@*`p5DnP&QW=NR0G0LTek(X*uj#$vhK6 zaJJGECOS*#VkT)UyV$6#BhBQ)u_3wgOBaUb#RQF?SU3hPwJcg_3S+^v*Rz3Uu`nY7 z2o$r9QTR%7mb3KLI%WwOEE!t)_|n2yMgfayAymjZe(BaT3`SNU4Q%7JPGmjwFNTQS z#(FP_xI#X6!0X0kS{E=y=z;QP&>(Oqv3^+l8P{SeKO!}P- zo{KGf>Gazlcvpevb_-u7yt~2ku!S!j9@+01@aT_8{;vAw;aB^q^vgXGek<0};n8;f zS>W+VzVE_o2hWP{!8-tWgWwsp@MWs+h2Z&_g)g0cgm)8o?ziw|!h0AzFIf1};SB@t zP4FzB-|&%W^BLn=ZoeY>k@!3>dFVSOS3!v@t)GH#zdXT{$<7DjbP;&wNWLt5&s2{l z@GSlwJnEM#z;l`8qpcsA@SXwBo8N;++t)q-PnO(`_g#K)5P0;*LT0LO6YxsG_d|(? z{bgzGJOlJ!NgiZ5WwP_r;L{%!n5kT{!!GdY5B?**Om_JieEZPeB&1Auw29;Z@Ej-k zzRNCd@U(mn9{Ir{@SM6Ac%$IC^n38AS$_teTlNC)0q{KeJ$NI)dl5WK@{vIz_DuGB zA3R@5zD)L`8!odD%$HL@N1`s33GXTJye|1N;oSiFe}LzL$%H0u1#15?o%k7?*8xI_Grv_03r`ytZp`9GCx{-NSPRmanSOrW9bGAvT-s zi)~@!^Tcs_xVLL)V0d6f+&R1TC};Cvymw9SX_$aIY55W_)gGc(WAEA1zA9V1Qat$) zUP3?md1Bns?W;8UC&*(t$v-XKPSJuQe-7VnMq@JdYcYG^4BKDaG&(`!7paea9-orT zk?$*SH(p!5bUS%4jdD4RNbMuAXy!o4A+cz$;{*+_s?Q$X8s8_Wt=c2Owv&rfoDy=R z4JGmbO4IQ%U84}Zj!EMaJqK>yk-K!eRBx5m z&SW8om#HAdRVyT^VYC*(wRAf*Bh@K~L!Ie#ji43cZLi`j^M%^c$c31X>L?n)jhv9J zM=ro;!v?J#IbrN2$O&VwFwU+)PS_EBufA_!d1qg!zc(JnTI%{H>?z!Wp|{*7&4tBm2X|TePQ|5d(MJv^4s=LZedPTwu3q$l`Oo2%qG0! zFytEWDb$K_?8YaD&D+T|YS&m?G%a1O$I>=w6L>{JeUX;oGeO%klk!j=fl+TR(P%^$ zsTY5Y=4wxV6rUuUp8F}G(O{dymNI)RM->L38fn@9J_btM-epaU?{=IxWAqT5Fg82I zY51B0Y`wS8X=-+B+JG+;w9P*t+Mf7;wF4))10$>-+qNJ{p-o$u{5E-ba&7LG&8Ba( z?fL7%J%8Q2BM(E#>m5rLu@a_t%C@(5d2y1)qNP@i$<`F2a@cA@cdE6p9QhZycMeAc z;dj;eE_{*NP)M{Ie2bBD;gh2+$59|ti)~^WSzXY`0z&po^&c!E3E5%XB&NFfWnhUa>B*BkP|M}Z{(5&-;a@V;gf?8 zW|(}`Z=$cb2~I4wum zT&{S_o&&dBPF8K@lMAK8?I>7UzO`dJvy7c6h+HlT%o-ca9t-61*Y@bn0Qspl#^x4` zEG4o_lRG;&R8Z3va@~Zb$UlTdrz5wF&z9jxO(jCC2*5P#Ht^X9j@^8gEV_tk^j);Z zsmKX?Q+E^g-iVyA_ZH+txmOvqpCc#Q>X*m~+1rqF;Un7M_sCh(rT8M-K-4bDj#d81 zyr=Rn*_Pa9sVK!n(P^lnqSFu*DQitv;L8MU&I(MQCHdPuc;=a7&KzSxPF{mV+rtLu z^mdQW>%cUd9K*E&ds60#ky2T)GWs-Bx+06Wx{bdljS(ucAmaimk6_%r$pf) z0=4|H_%II<_=#<^ZIq+&t=L960pDmkDx|E-jD(kEyubS`=e@6jAQN>mO3Y(_$|a~- zj#)TTed=!WcbHT67EmaS*XZsTN=x}D4uX=fQLM{9wzYp?BJVU~UesFWre zrElf$;$Sa}x{1B4iAq^C*AVYJCf{m3v+^smtXBjmMpoUwJiU%#qYVwIi6;iVNc= z@>LRfDv&AK;(gJQA}nUD#bG#WFKen&7Dc%%2hD}Y<8yOu%X+h{2PE<|qpWA_Wm#JJ zaK@Q|Bc*G1+;x=RqFADqQp98L%T7@28ctI*oX$LCV+THW@AEdo5alS%6ehrOj_xg$ zl0s+gWsz?7vZgC#9l<>0Go#DA4|t5X)#6B{EHo<0 z8o`mG@F}O9`BPJ~%O&zrMp-vY3RqLxf@To*wm3>Di!M#F92ofd+U{!Yk>8tT-7Arg zL0KaEu&pczY0rbgy`ON1puMH=d}gCq+mz=(HftQCXm}hUJ8r;{#y_{?Xaq~Wou<&F z2I)A%8iz{?QALNSuu-g~&jF9!KF2Ag&t)DMg`XqsoBAliv|f5hBG2X0t;iIw?8tK! z(6?jt=9m+%MeJyL_l~ zXag;tX&ozhMXdvO5XL+B2AhtdM1KeNiD6%dIJY_`c1~lb1~0nldz!`eZzj22rDZx9 z8=-*1n+9mZi%nz&Z=4ZZqOm1uI2P>e@9vAaD#UgMeMwJ;TG-he$L_5*td94^nwPJ_ zov*GMlNGnla1{hzYYg=r7UfAmXxwTmpB4^rqZ&49d9fk7x2qHTP5I^$DL@L_C44}| z&grz=f>W4L=zz^fxa0RbnC&Vz(blIl?0olPnx#(NF1-DP>K?=XpEZNn<>p_HJH2ps zC$)pV5iIEP)i(x1O+F88$4Uc-&5@N@JH=rIHtu4lo+vlgAH#-Qz8{%4WMEr@dPXPN z*JF+9(Uy^v60tKTJ~SX)iR>&+^LigQDK@<0wqD~dXtZ4_huM18GkSHst_Iw@90&#j zTwU9OqP?cPPAoPiV%>2*|6&uuR(jEfAbG`2u=*KS2`fkqExQhX7nQYANI@ZlZGNfU zuS;zG^NL<+u!%zF_YIRxq#HJ)_Ysz^Qd?gvHc02zbmHeG)>l6TK{xd`(osNJoFmka z8!qT(D2eOq!!69cxI@<{6q|1NeiZ6f1`!qzMA0qnYqMPS5O&n}_KP}bb1TcR|He$; zw^OIAx~#I2*=eWFFz?ja-=k@(WhAv;ej~o|rEwn3)U7GaPMuMluSwx^(M}!QM%`(V zr3=FQ!1s{krGddkJ9R8mD`GzapBGc{XlFwTA5Am9NynG61IG!z>A0G3(-j30RX5Ww zsEy!RWZ_G$3etD!Hwiq4SoqT6y$OtB z@Z``{4H8W!S-%wf(WKiWd5Dh^?`%lnBRij*j?eOnACjf1+eYwRAbB&@7bC3p6Y#t% z`Dm2QWWRjOA`hpTBvK~49Go}`Jaef+NZ(c8)sjbWrmrte4$n@e~XIPRW-EZ#CpsgXcNPNAtRL?MoMJpGqENIc3_pvLCJjr_q%l zQl@fgqBa{m?UIlBZ>D;z0?%pRgVzfA5%4@G`3yfu@jvR~-%1{2Ic2Ix0V?gJiX&yJ zM?20P4W3Ps&+wNt?fXaYJhm5j&w=MyxjOn??Yk5_{gN+}eh)yu_28+dYhxrszZARB zCGW80VMZJ>+2tbeT`PGrl{*iPbTfF~rfXLun)0Xft68A`ayoICDP7#C!s*BNf{)^T z)(jJia_R7BsdCm{@R41P+Y3Hwr-r@YqjH<~g0C2S?R&vT%MhpS1s{!)TaruH2_4zUV650Iir)TPq3FS*G*6!a}AU3<{D_1C@NBRhYymwXO#E=x*RF2%c? zbbM*-G7)?SOWsU&IWh-x4)8S4bubc*@9FGP4f-m&61Ajs`Vq`^d%;Hw1CQ?oANj!- zd%;KTxo0oF9Dm!vvqJJ^!lPkr z5IpBgK5CzIeoyopB@eQk*k97r;}-DUD|s`OOAnEI2s|z20;>Rj(v?f~`&jY_&h+B~ z#g|Xg@ukskH~4ZZ1X?EjUcrg|!Sk<5!8Zke(&;xD^xJ5Vv!rzWh~)3zOTMS~f{(_J zzwZSf*>xNRElbMOZu^68hUCp;mr>vx3!dLdKKk)4on5dtr|nZ?DHPdEa?`YL3-~&}2alR{HF&O-e1_kr!Mh(kPkav^^~)C|kFI1U{qUwC&5aMG zO!dvhiAM0W9WVGY^$!{sK9M|vlkDtDdk4VR;M-@O;L23)6*zGKcz$();G>1!O!YYO z2biDYLn#y9^*HAS&)+3qCV!!M#EB;ol9|%=qv<#uOUIX{-Od5uWs*0OewPF9TJTiY ziE_!Fnd*BkcrKTGnefISe;s&^c6~qIY2Z0u@@2w%6EK&6XRR9It?^-H-9m&798RuC6)#vG`o9iOx04)>#Gc0ADDPTTurS)%(k=@Ob}U`8 z-49f{b`)hsk)xEQji(5~dsil4FI9Zf9#`H@SHU5eAEl^2*--y*2$VM__vQSN-_W`G;`TPN8J70V=VG(tVLhO0 zJ+EOpx1juy9Xly+Y_MP_m8c~f3PvAEOjx>P%u}#v`{r6Lp0_J& zOGryjL_YB)=#E9(SqYjn&{b}sM%{TNfZcotaqAkc@FzZrEwTE|1$HOUPv>@sMtUas@Yv+Bmh7>X z+_9Ftv6h0dmcp@?BJzW=DE%pr4zRvZcYxV&fbnCV*}L|m=AR&2e#}7*v(rTvHt>>c z@{$gCN%o@c$(HQVXX1IuJ;_iu=M$gfj2mZI2O6D9PPUt zWhjB|a;l?ri3iN2@fBL(q@?=_siXT!D|`ix0bdy}Y)+nIb&F(x{KV=vMRtZ1zxg%% zhL+r@{R=fGj>1PukP9%4I*XvuCP&kQ7U7#n!h=`G${l5bkyoa%6#cF~WJgQS3S{NJgmNSly|@?oP?TZ0U%_ z@^7JtS%$%IN6f*%?!rghwjwN5iSOhxg}gVJY*fe&x14if98HV1;~ORYww_Mp)9IR* zqHA$VS5R~>`Yv6`w!Qci@(x|04Ow+>G^9qwjYp9RXf$IL_8phdd`>t3_kyuNMSS+o z053xAawXf3O$JIfKR9mQQ)iTKdp$cU?+2o>72_qLVTUgMStlicfY8&gj|EC-(voa1 zTD7M|?2JxEj!m{#jAcJcqd1~8ZXRn9&4Yp>6=S}qF~AVZ<{d?@vB0rAvmc})h!&~X z>D$IJljDMLFq+fTK$gSz91U@f8b!DoMZW=j3VGwV$XNzV{Bn-l`kcmdp$G`;l6*90 zA=EFi)Bc0pg|sDnr>~fG$RBZ{6OmUIjeed#vOm7GiSQxjO3C-gL?0#!*hD<$w7>ti zahkU2hj{DkYzq}LvzO(JV}afd1xpq!?Et`bm}zRVc{Xm@inb&lN`Aq%qS0*Yn6J1n zvA-daZAi>7b|!~#n@9f0QWUo!|(+ za>f>B()eoJ|~(=}f!}L0j0+-#&(!s&E!*+&ng8`OEKTK>;#s{>Z&3Mz%mxaZ$9r zWtAiOkhB^Gp#0H)fWfrd`!C}w*Wqr`j|`JPavNpaMI9^_$RD``Co-Am;0!0?%fG7z z6J-r{`PeUJ@K@n2Y5ii?98tL_IYxVQ)wuVk;Rc=LQlTshCU=%UqR-d!xXt2GZhBNR zQ778ICT-j2kIwpb&z=nR$RC}Elfnn?q~44Ee;EEcO_if4`sMORq_y*OkEB8Hr}*UX z)b=vuMBuuVX;B<6=3FO^VkSe7BCMT<98EI{wJQwTUy-BXCr5h?#|!Z()OO)Wfh>pL z4ruPVtJ~`U$$c-XbsL`(6 znVfqHIid5X$c-@HSI7yxN$4}8+=Gx4v?Guc<(3#U7jmN9M&v}fCnG1y?LqD=M&5v& zu+=8yM7c@igjUxfw~_g1r>fw48abiC%g6~0b|ELNX3!2rBs-mDk3~+%(oE6W(>d(y zA8>XKBWA{t8*&cC1_zME7Ae|fqWSsV1avENXTQz{uFe!bCq2{`d(r5gO%hCjKOuqJIsQ)H_AJpC^12Bawn88IO*Df#cS7}kU zQ8GMrm6lxK!{LWm;Q(1oDL9<1Drk2v7z8^kN(FN+%Qsba4TZ{SdS>jV|^&e;}$7~HE6I9H?)b~T7&O5GYxBcvIjRKM-%x% zZ6%JPx6*hh`XlKi`Xgb9{`d!j_BL|A#3zSioZ#Dy??QGwT29cY4TbFC25l~KthWYmldjS3z6(%ha=`&iiC+ad9p_1&Q3HSiQkKXghkr zyzL9emQIcTVAVK%=?A?nZ{F8qXA~FYkDd<{(TcC+V2+ktnvE+u{n|dS!^A0=w>=(9 zMhXGbCMPGfa8M|K5^`vMhd|gBR17ZWJ*vX0J!ADj%zK%lPaz7%0@-6r^L8DY+?YG> z>->@9$763jEUJ;B)G5XSc?;ythnV1G&)bCw&(uVP(4H2s7Fr5MZz`tSdABAe>b)Wx z*Q*^%*({rXnC-|P?aRjKxuiIMqzjp(Kh3PHfli1{y+E0jP0Mr!^IejAmFvn=(SrPu zgNgL;SY&qchj|pieu=m#<{cf`i5jfTVa{19?)6K$a$Bv_zge=Ng^CJ!$uo-(H~;wl z$v~^^z+CeK7>vR4N8X@pv#6E0ir|@Q{>a00f-V7wGa1ZnwVX{%%XB7xuPh5cav2yt%_rYxrg@rm?KM5uYyg%e7Z(@fdSgMGXr%>m(GLENrD}9Q zTBiozBy-jd{7G%b;3!+68Wq6u>gF@E9SN6cfZDX~mOpwU1^Wy(Ld2l6>~_C>|4nKs zxBwQ5dZ=Z)1n}ZCZWpi55CfDGTKU!SCdu(eK=Kc(TJXn}^-ZXvI#(s>Pc~ zoA0S+JzW}PtmaX4maF+Y#1i~0;KY)^bX>4cMU3Re=W(yaPyjy%ICquvVs|u`CL`$3 zH6)6qOxRxAb&O4rR@;pjDcCKcisa~8tMO}S5t%yrNPLPO5wa1)^yrQyfnWs|A(nKE zMUUMXprKO}5l(3MDx%{1eP8Y24JUuc$wFScc?-E5Z6S_gxS~Pub$kjn8V=~PAxFCs zM{)L6YqvzrZ=V-h3Xp9IX&Jfie@hE{l>5_FLvQ0Ow^X)f(3RL&%9s2D*3{;BqfTPE1kmM^2zTjGRDz7CC|PhCw?VvH1zsfNl;Gd{xK^ zS+7BhA}3^*7_>FW{h4Ly#wjs{It{spnKok3euCUXOuGp=Ve$Ksdyr{Q8nh3QqZOP& z?Nj9XIkzuHCQ+k9ja(gaLO;53N9cSCazekA2JH&u$QN?7YYp0M$O+j$7_^1 z2~JA1jSsDjC1J6Ee+Tkd5-$H7(K3QC*MJ{*0&U5YoePuei^dM8Lvwc0Rb*Xj>sS;& zVsninF*zB;DtCMmem&YaJ{ihQmKrgV9<@Vj@iPIx3!g%MzQaE_hXb#$(_eiR{e9%H z?#rV=bn`YBhfiZMH*Y&Sv-TN2;;}BDa&CVdDdy#9^2b7QK5P02UvMd0{vk#3A0i@Q z^uSVg{s_gmw&Y2e2;`3}L%x0Cu8CW2C?;9_w&l&8ThK3qBsI@86MSXswoXH<~425u|<@6$sWl~J>u+&QJUi*4AGM}O7ce8Ei3Y&~QH=G>qFqz4c-XotJL#P*IZ;gVJxpO5 zg&?o9Z#?n*rrCQoed&xJvFXc6@kyJ$+!vFkFDE8u5iQ?Nn;4Ae5c{sT{**o2`6nL? zm0VN=>yG{klNHSQlMmsSD*Rft1Qoa$pBxSaBB;diT?Cr5kQ1~EkQ0H1hCxBQ1-Wss zZjMI7pa{hjn#pwvd4Lo_l$>J^)4s&pU}HA@_?q3^Td_+_x5 z;c}1f`P9Bbeu8$^2Ol7Aw)q@A>|0{5W!BZoDt)KcW1Y@<&iccJirRS;=q(p!3KmTa#-_;#s)N+OoK~kc^oN zDwjbkEA0zu`S{pq`PR*+XFG6qHqNfn@-N-GYTWp1^Re}K)l}>OSz!Dw;M;YWn89vo zDlTl<{Gf;)QXkCsji1!;lYcya-s!pVNoL={(v@!BR@CoM7_X4S(;=LTfp#!*InV%) zq2wHS;uJnhgB-1F6l%{QM=nyxA!#!6?Z)^0IQJjq#Keuh@540mzg*5O#!-YcdSb(& zjB*8XBH;bfID0#CBH+<=x$yQs8@ZXoPQ0rv=A7BreLPk!Cu#k7Y_)TR*l8ixD6J&9 z8o8jKU+_wUZmiq6obKDix+MUPpV>W0!y{_U@pVoYRMRxt`AOX+TRV_f94FvA^^EtZ zCv1(!F(eEoUD-EIO!UITkCj&tAF=x+wVq$4bMdowkTe{eT(V58yP-96*|X$0a2*v6 zcPnV!yj3)@v8!XMlqcJX7My{cXu&zii54tJPPAYIxg(%<4nHYIv;tL5SbPvU(H`rN z6Bdt(6(wO=PqkMAcY!LcRAyw$nZ86`m6r}OrZ|rY!Jg> zoFdWWcy4kVy83lW=P9wpFZAR9#oH`i#p+!)r%w<5w`vNgGT*YU3e3h*oF zD^rVQoPyaB&R5`U@Yq1XOYgt-`sX`*r%lY{zx|-lpkb^uQv8nh!ZQayeQbaz9|& z2INj)8coc_bm=MNsEZZyC1MSq{X1wb&XFQ@ocjQ|6FEooo?6b47YhlBMI!f&k%L!A z8qHb+9!?sG`URydZ8CRsTEdv1wX|VHgr`n4h9$l9v*pO?lnr7-QU1svW##2FT~;ET z@AT#oj%Z^HL@+cK74s5u>Ba~RThNtyh?5T({gU3i%{vM@Tw~rm@wm1{CvV66>_*3e z{L!1hM@3(UzsbhJWN$I;w0a-k(8O4>G*+k{Pj2Uu^%-6wd-U@$%%9>ROoH$?*I*B%2Et7%P5M-pu4WDsP%BZ($*=anN=Rc zH%fY&FXJk=uX5RY(LrXzOy-)Pb?MTZ!!$K8^+)PS(VaQtkkuO*L8eGHZ_!vJJK;5P z3K$3DB%o}Q53#!~-DIR=5tW(r9$UU=bnC{dWLrft@2k;Awq$=5$NYho31%c8Oy=!Q z&flHAC3`opTjXynkU>zbpSSyrM>`h5nEcdm;XYHKZVzgmqfJ9j*vOBZu;3!(gaua^ zXV)Uvi%%gxrBuv_F2Z+mzZ~sx93SAbmQJ@;yvm+79b0?co8Y5_>p%V*W9z4Vh-1nO z+4cYQ5J#G~*^_)oPa9FG;j$b&1F|t$pB_OI$}C5&Y<1jhaabl86Ja`0`<;fE?cg}J+aU?7M z*n2Jh2z$$|OrYjyPA(7k<>H%2PQtO=(J}#K`=f?(G%C$n7Fj0C5yg>8IN;H3XPIR^ z1`4HIqpa5i0msy`CW2-!D_1Ft7B9pj?x?H>EB;++mh}-RlqPXm)>`ZXsvQ|m<_FDM z3z|t~Io`yPY`1j$!JnGQw75YjPas?FfT4x8EPj9-oj>)ZmmfA;hklT!L_DI!qLM;X z*x7=!A1G!kU-8LFm@Vk7Od**P@d(-_29A?(EbWD>_>`LFDK(|ImE~y0k$iM{Zxhyh zbikWrra*H_-`J*~0%aUO28JG413^yq(kFvvw{w9~I;}2dIcV}hcK*?_ZMT}GKQGJL zA7$Z@X%_oX#4_zX<$>wwy}Erqlv2cFw`w6v&Bl>Z)9(9V9$jjh%n*;rF4Rw7fw;%X#z2F4z zZar}R7PIcNr4;el>rP7w_PQUYXy{~~b{xr{4}IYIUzi%UNn|H96w0o!X$S#Le{i50 z52xd-y>zEi`V8iw(#h+_KQZNYv-C4%Su>2%udDy;aou^6UBUxu_w4sP09-xbi_V|~VA@oXT)2gHt@jxF-y=ZQg<)|VNq)==M zJVBQ_RZ0<$UFv91vK&W{2+})G9rS`Jb*q#j9=p^rpkz5{bf$FQNoQKhdPhnTk0?KD zJhS28Ou?bqQIQ$fG*W6$;4xqqWECy{I_4c zY_aMpDMdU2>0BLN(RnW86yr$g-B-(3=`y%uRZ0<$z4Q`L#G|H3>R%P~#W^`sa7sZHvq3t2O6i$6>NrJGig-}ECDxUJV)s?`k)P$vL)+mf3Ku>3CmbF4 zP^yy1<%+LX;B1zIVkxD*M?S|<*QZ5F5s%#(m^ML*dIzO<+>fG%=u%@+ig@f&{2zLWI1Fw(DIgE9x$bLODW=kl*P`q zEJZUM-E!qhOgNr-=m*;kOl+j)hQA|AWc4?xLsP_L(S+KW%0YD(Q8rHIEabs{LHXV%Twe4i=xij*QA zQU2GGqQ-)2EezAVRN$v=M1f9}vx%y)hgk6oW2OU;r}rQZ^hTxhF!S)78M(EqKK#}!JtUFCM(Ow=&`5U6M;J%<)e~>O z1VKw!2Qx+~MLdE=Zwl2Da4Z&sq0#PEox_UG6a}*!^jsX`dvfEc2~+1QC34iz`S(Uy zPLyu-u@=VBwcPOPO>kuW+cqghJc9O8MjV>$o1@J6EtibwGI%se(Qq!nX z)A`Ipzq8V{;?q}Oy4Wg`9@8r?t`x~*=xE0RI@i-|JqA%I=!aHNh#v7OSQ8U zl}u@3WC-Cwm+F>M#ABCQ2uhYim+JZLbGMpOKbBI&BarTw6cN=y)}F9YtnGCYBhyt6 zrTf3V3j>j^&)=jJ@!0jDo+Uhrqy`(_88f90%OjfDg(Q$dl49!9WusVq^%O|jeRaOl zf{U1E6h{gh`&UH}$IzUd)=K0>+=AAcF2?yR$G(#9^r?5RGj+aLN)ZogYUw*mSjyUW z7Ag8HWuC(&@^PP)Uu){~M~S=?`q+^>6y&7}@-pVZAj*+yaq?43P2ZBp%M|2J1$mi* zyqtNc9Vrd0xZ?&>=RFd6xv-(d8eQPEx6X0}xtn?D=S{NO+drNBw26G6G=DcE7dO?` zR$y9sIrvygV@e5D)D4QY1!DpkM>FZZdaOhy9zpZzO^vd~F>-me_#NLYs~i(miU$@- znWoWbrc+8w%1bJ>*9{6XTAK}-D7`j{)qhsttleVWip5qk5B6~tmwB$ok@`;I1xIZ(%eqD)_i|ZQ%dcXoBXOj(q{aQNZe^?+ zODWq_;X zZd{C)7A)ZMdfdK9BE2SqR>2RrFQ9L(3%#U@)W6VkKHr{e& zK26>%msllJYiI9pEFDj~1Udy8MBV-|Y!Ey3F6Z>MBK@>niD< z)VgA~Tc{gm7G2hhTKj_aL7&^>63<`(|3F=(d|Zzdt~4IlBQW@fZEt*i+$)~ylVVg_ zkS7Jjqvn~JNW_fI*{FAFZCdFbJhL{D=3sNZzcG}yHgvz9sEz)}{gBJk(Aey2bbHfR zLH^oTCui;~Nk! z&#?3I=JX+Id6u#?t=QwBv}^=7Rt^t#LPt79S~m?0tWFFXDo0%P4GqCSV<2c#S?r*w zt27^qVVbNpCS2HF7^`M=ByT-IyBi`QkBgnA5}W&h2=5kKA}K#qS1Gnk!aMq0x>i1j zM*Y!f(BI@TZYO|PzbQ(Rou;rM>h-z2%^r6!6eM;U0Zb(*zgU#V! z$QO1=jg0n+V1p;U4}vz5;0AZSwIeQXQ#9hOZ$NAF-SBm04Y|)($|B z=0;D{(-^QyQoE#x;6*HEtHS`1fyi)lXuxou>W0Qfug4P(MG^41&lgZG)3zh z{PliWW45ZqtO)zV?uL3GlCRr}EA!WT8-k%`kE^#kW7YHq@daH`pWp8b_?ld}U8b%Q zx7pNH>bIZNRo2zi6?+52_*2=--2iV~fdijp=;#f*{J~~VBp3+_fMMgFlnglVYg4+> zRp03MxDmQjOrwW9yLAk~YHu*m?DjS`xO7It=QzBy##Z*?K@CIZu7tulPItEcrd0mL|mz7s=Psj*l5J(N>dOT ztvS%#81+&y)`qT(2Ak>|nj?)azGcXEuBtKQbvHIQH@Sq-Z6|4rZVbD_0gQ;;vXaN_ z?Pe>pEyM_i2#!9}IxrCT%O_)Sz>E)dTf(o$74kPnyl#Kcm3mu}U59#CBTN^lhnv|( zZ|+|7VjI3;i9#y;YOqtNfJogfCq#M=YIFtsk#H~=3GD?=-++k|ptq{pLq3OuZb3DM zBJqMIb9nM&-%pBMD?c!#IT0UBU>p-KoLMnAgqPZ^(0fyvuhH8W3ZaQbuMs{eSUY+L zmZu=%^-y?}r@$4b;zND0ejTl}p(zyg`GO5DSjup3gw(E1Bb-+>Mf?qchWZfogB}Z) z(F+B9TcWEA&ra0!?ilX3Ywq#5f{}1z#DlOQbg!h_1rPwx{rkG9sRX&o*1#T&Ti#G0 z7-~Qu!gy0xDefpRhB&J$gE`dT^@IY^Pztjgh>SYQCPI+yVY}da6SRp8=%&GF5cc`Q zzG&3%vfZLkSIPG%AV|TXgvPL)H_%;|qPW{d!$6ceR$T@Dm099eMVB<>fAvl&n}Z9h zqXPVFJn6;}S19Q7H3r=E#`uwHSG%i%Q5#OzS-?m<^W$WM{WYn$Hb5p0k*%3>5E2SE%G-JQQ- z&dU=XIn|`8qj=Su?m1qME8-0|1!#Vk?y^V6mU9CEZPOQ_$)d8o<|rNk^t(=*?IbG; zS8k~Hdg>eN12%;afO_%rCu}@4XE@wJCe5v^ta4h?_r0^KysW%ju+uxMa`~NA*XL;b z26tRSW3_MyFOpkJ3s0Pm#c{rV(JpCPns-)V;YHh&!pHBdvh3g^aV(!{--7Q+c}ZV{ z@0p$v{XiD@@S#M|>E6wBJ?Jlj=ZtLP5K;yhrm#{)oT$ArQNM zgT665Oc}RSeevR}pv~uVJL!wI(?yGO_`^ou>7pemeB*^yJSbUwD-?g0i9giN zU~!5+#p2IY@n^R9L#_sv67dHssr0Qz{5e7Vafv^)oQZQy^k*!1(pYfuShR2Z0r)lp zAF-EwI_FApbaD=>rF=hCj&>q)Scw9kAIHNuM^L0qj@E|bp`4?|`$IU_iQ~bXqk2I-DF(1x3~QkwPxP|F_~3--{norAd7EN?7W zFcw@k7AzVII>&;=crM9UaQ0ZxWou;Ff_u>}KGI>QOSVf;eB57VP^XZS-ShTOe ziBFE^#*uz)$l;Z0VP^V`PnfD5IbkaL?LwG}iV>!wwNzoMA>>5kZ$M6%Y7=rt;gh4C zi=!|anS%T+N4pfq>72vCa@PcX!_DvbsD``-RB1>U&uY2uv0#(Uc-e&V-CaZWiM_C| zOMpo;OZ%ob>|C%q@yX#E`h;Pr_Xt1tA}9R30XgC4EyxK!KM6U}0Q7T?@NQc27frDS zInfkx4qGiU#-va%KZi;HBgcf3!LHJ3&jk ziJn4Vmt@1A|Nl18Z!`;$IqUXnj5=7Tei}z=$nK4Qfp6*BbL-Q2w1w!K6mdk-Dby-< z3c0+9J0MgIu6;}PPtkq7*e`*$v1>PPbfU^E0k{)%Ki?Wq~pw1DDxBw-Pa?M zE=9L$*eM$o%1;!^9SUWqLU~o8e5O$J=d+pCpl4Z{`dEMRqL#G(bJ0vp9zI?XQZrH@xipTIoS!qiVUPC2s5Ed5l8 zJb_EMBIhc|6BzkNkl>dn(_(9EMQ5Tfj{YWIZ!Fi{-6xe{4UH}#@rcY2o`FdhB$%6u znLo~YeRxr+hwcwINajj2Pm;mp@9(y)Du9G{=nmPJ8U!Dv(fp_v1C1F~YAmkP@QT~c z_<*VJf_|RMcl-OXayj7rz>f^Xd1h@RO3iFExBeJU8#N6gu23=S$5I@w_rz&K zahyt_;BCPJeQRSW)L`eZe?46;;>FI1<#?a4fq*moVqEo1Xc%Vc@9yjy=$BV`WWDq# zX&}Ufiuo&&_`a}ns2{Ct6z}ap&AOl&t~-12X5XIpcex3!5cz?sdYgw^#RrF#<%O&n`!9JZuPZ=z`e z-(ty2cNSW$Oc!z^0X5st)n0puaD5|r6d_tDZf{_GSF=EsegG51y zTr?1r&25uFNHz&1D4KvIm|#dS*%ef-hJfoBZ&j#mKLZg*>#Vh~s_nb4cv)LIkeSiPo@ADp*$unoZ=Q+=L&U2n~nb|o`{5pZzY{5Cn z7X#*H3(kq(8^G+f;OzKu2=R%+upA6d{5}WH%W)clQ+a86+_BXfocNsp+^H`31zqy1 z2X2)MersLw+Ya0f!|)5Bptrf?w-dNmhT+HI@|!OCeF@wsj-U~o>Vy2oDU1N(f$tD)&>Mj%n9wv!R-E` zFcL|Bn!IB=CuH9w;etWyK#S=)SqdJ9xASo@ILXJwgR_9?wBVe|dl4`(3(n5JoSC9& z-vj1@i6UFE)?`=SQ*k?Vyu=u1yYkM&%?&PbKexkK-c4dY)XU$1`&eNiu5G_{9&UUC z%*shjCFl2c<(PweZz+rb;$&Bj6AERCZ2>N-uul2zMEcFZ%;(G-!HdH#-+aVhqAV8 z?*KFBbTCF>`R(jwKH|&Rh%LcR&$M6eIBE?7XCvQbz}={@PV$vQzB_>VN1^1Hg+F%k zQGah1S#!0wXWHL)b~qdP0>v0R;b3r*4=ab-TwtD4xKvyV`E2;T2h8UR=ftm{H%jo8 zyi)u{NXKDUUiQBQAtK_zu0FW1w9pP`Bi}i|tx;Gf`6$*pV18%8IhFTWU|zG}?8Z3_ z9!+~2n9~-@ar{>_P*INpQxcZkoa~<6Uu}(%qx@^9 z=i_nfVi!0RSG&apj`M)q?Qk~r_G{n<6xOM{w9{9CX{rT*fZ{va=|*7s6wZm?0;K;w zFz+ZF%jIMTqc9mbk`n?1Cw^R7Jsz0WB@##fYG(%=BIeagjB&QB58BZZJDiRF)&aLe zVV&e-{53=PIhFTX;O-cP-%jwmADH$A5C|i2IPv=tFb^o4lYGBI`bU9Tvy|Kp&hJ)W zey(s%{MZ~H1IBZvU>6_n+URd8F!L17iQh3`69T4L;ZWU<_i})lt#Ah`Zv`-C4#V#r z@LLJYA?Gkx`MAQ#UcL{^-3sR<-=W~~OJJT*xP!^J8<@Wh!|ze>`v90b8!4T9py4Fn z(k8TX91I7OuM3#X3U@I1z6Z>Yhw%G%-{zRF-sZ^vAH2;m@swkgi>6YE~>9@c;_xqTivyH5WR*K8}Sw_eiz z^Cv$13%@G8AzY(2=??3m_8Prvt=uK6cC|-r4{7WIR6Y=DW`4_>&gqXQsj+|siEj|@ zAq<;o0Z5O@viQYAe@XG~H9R4ts6ClD1rxh5Ls>~;*Ft1|FECsqcM#XYGS}4F)hQ5B zW@}`MqEFPf2cX5?o%k#uGf{#^N5>Vstp9Y}h|AMX972lv+4fPOAIXxGp@HJJXR!&CoH#5m^W;~MIxcGXYm^ORmW8g zVPX8-cEE%0)CTlW0H08%P})h@u9p2;sZ zyTAj`Ax}DSOKc>^zaFJm4nD>9Z007o{MIu+ikZu=rebTSD85XKeZUZ_hgwn6G5U5t zE_(4z;cG=?I>{Y^L~Ukl+dvYYIAdEEsi4>)h^v^`?YW_DNzH**s5`N{7{8zg-Q+?G zbxVv7U1IOCjvTpVajY_DmVPBgUG2vR+S^GHiSK^@KH}+ z&zGJJu+hxb9$DvM<72LwdYK2RNSE6Ozz||(p2xvbi*;tlIs;Nl|pQLb>IfYo!K1GSYlOW&aHt1&9V-}||~KQh|# zwRe4>sUNGUS{Dw#_z)4B1-{LUvlI}7c+-)8Q&lrq3)=j;JVn7rTDQNB$ljf73z^Ze zW>v$md*8zy;SL%i7xt{rO^L4Ud4lK>b~4 zKQF{vu>8y6Cc}0drfp?xTL8Y&w(wE&x+M)6y?p?{#BU5mr3ai0fyw-D4-B5n~VX=i-blE3E=FJc+*P6@+WiC;{>p4PSES5*P- zz17xX+K$EkRM`1<}piLu8$zk)8jRmQerkgz#!0w@%!8h?8Zh9De@9oO^ihzPb0Y*y-?`TTFP zVaJBTV~x#y=vKqVcm7|OhAiHrXJ__Q?1rl$M3iQn2cwxvv#!B~zZO?H(x5TksjICS zoFc63I>2!&4?uQpxy1SD@N;NqOKSC+yt;60-==mY>6PT)^K=e|OKEDR0kNm(Rjv4T zHa4K-jvYrMrCu`?`)!O1tIdY>s%FS{JT^9M25UaR8!>F9An&9WYgWj)SAJ)$~i%etI4v@V-anQ(I0WJwvTFhj#sF@g?5 zAUZg|*hc*!L0ymYgE+jR0+QRg{H-V7avWBn;G*5f6M`|E{yAuium2@3m5yi^l(qMH zT6pxB-rd+x6kFaHvU6Bw$lloBpo{TD&w-SvS155*&w&xqN|1SMP6t!oe5t&Avk|yZ zoHcVO?qtZa3x`)c7nDjO0a>`NW_9Wk zxzP#dDeT-%Gdj17ZM&IDOm3bd#ZC@e2a~K)9UbO3a5eFcE~EEHxXn2f`zCiC9$aIz zjviA8r#fC#D8>R1F0tqRfgxOEj_7%3%AR+sZO?1zNZGUvgA>xuMTG1~J3+~g^d3;M zgZxiWviqb{xE5D(+tlX;6+m24{U^V8JggOfnZ_3)7)GjY?OD)i;;aY$pS zWPXNROvf9r_!dHc7R}%Sjw+=uhPieK)AF;oAQ_v-4SW?pRbGum!qRQMHR&kjNl^S$zDzp?luWCJM2YXA z1Fi855C&r>4vx4iwZmReOj9D*y$kb`$nmn2*%%PO%^x1_3$+_%LvQVqy>%70+scy2 zv3htO{O0Ib`MiNp7PHbrd0=#kUX|PX{HBw1YBNUWeTWAzJtSi~HyS5-pO=z=O6`?+TJ4i3L|8O~BUAVj~xzef4q2F;K;CG0V}YMYnC8)p(VLgVhDv@ESW7a47 zYaVLP=shDt`P&d?%D)fx`! z)dSTYBUD=~eepcK+EXvoDmw>^eK%s1oGmbTUcs4C2GlPxQuRxOKEMpqcRm?Vmuxp+ z*DA(E)g0|k!!G9dGg*$3IC;#)ib>fltTXmix2wLQ8VxE74XU~s_cPU=kI*4@W*=fS z1(BSbjBQ6^JuJSc!p$FHuKn1ztoLPTi+$eJm=7-XR)n^)#K_ZQsEF0M zi&D#0sWuFSz}dR=Qqg0Pz4T4`i%+n}j~8&SSiQg!)7q)nYIPe|cVu@p6%M$@C_amF z6ygi^z%gUr`BE%{3-QIYGdfDYFbn&|Jv&&eFOs_j>wkRWq5)QgQ7E=? zjJ5jF8I)#XOK13n4+h052^bS&XR%gbxw*`qR z&Dh4?Ra9%nwiigU-^R|crfPn`D=b^L;;&{g zf=K@A6sx%yD?V7;I*N5G+dErpwQosXP0xT@5*VzI1v8!>uwUJ|B$5f36?MEsnP$f} zcGwVBPzWUBxXrRUfEe!XWr;D`&3F_*jt*vk`Y{f_R)upmbm0|GXymfMD#RTr;?{zi zByj6+9xvjyf}*L*iIrRexC_^k;sjIX@dr@jM2g*@GI4mtrn;Gk^K0ClNa89$Wr(=< zapthiuZ@NR4;9pjpy=$p+9FUK-g&h%L2>Bp*IGf16x3~?Jc4=zl$7N;llrqs@$E;M z2X{V^@?8u{4i$Sr$+TCS)B~VWMZUiSCAIM%prm|*pg6wpYF~hodN~9G>u*JQj{qg( z0-&VKGeAk1=Yx{DT>?r<-)F|%YEloG)Sp0o1vP*RpEQ2!KZ&jR%!C~Ue6N-j5T0QC=X_X<#Z1$BoR_e)T0{C;f!)cb;Z1C*3t z(4=hEitrhhD0WTm4zzWP70(qNfvVyv{Lpi>X0Aht+Z{aP3q5kpbF@Z`__ZSz>k+q} zxAA%fz6jLShE;egPcsej@4(K=co}0!ZG|<{bMb>wq!H^>3ITRpfn5<0ABtgu(OT)6 zwULVg9cIp?0;{lgV2WUH7$yVeoy6Tb0WyBZTXh&6N3%9} zbIl~zi>A(L&6NXby*!V-6&K3IEG}c)sUWf4@3v`-D#Ju9V;g6jdINe{pI$w$mdh!~ zQ9bs8cP$vm=zWxs>U{LRdf7bjKpZ32u+b4?7@pC~MLNAKA6_>gI|xf(0hev^^J5F! z2A`4CqrZ;stPTG9Y^0p7* z(hn&0u{FzrA0`-Cx<@?sp+=&IL$^uy4*gs_llNq7V}EfF?G_9~Fciz^-Dbj8&%m@a zJ8TU4QO(N}=C=hfRQChQf9Wo{6r-1y_t054E77Cfi&0?STWbKc3hBe^4O?ixW_6uF3ng z`6fkG@PW8rXSYFXBa4v}nKhBb(o4i+h7nB@S>;)yc95CbfMF$yo3MeTbr|lDgz^fqU-8(_id-%0o zpk!_zgOcSv0ZvBdI|Y=?H~zfT`qY5_TR3^RYkndD54Kiyb*@Q%tTh*zX&Ofe8Tjkb z4kuUbIEW=yP3W)uYyvZZpf}6rBIzVts4?;clAP);(K~0=i=~nZ;f10_a*YQoM|==8 zOKhnfJz0#W@l>0RDk?YPow*ZFu(;S2A3hG0iRJ^V515NF)jsilR}I|ZtUVNxdoO2; z{jdFC2x#I6&^iOf+_;I8WBNR97#~eHC+oh!(Qq$bELvphd-WYzC^=q}+u_4sE~a2A zRF(tAT#j5h_ z_J!-?b1$rMVSC+5$8W**^l5r2NAsgqYAWol$cA_+BPZZ)J4%UH2aN)l(m$Op3-IpX0-!=bi4Ft$ zm`i&#Tc5lPwlwRoKin6^cILjCzIE+#m56UG z`3iPz_F+M0V`{8gbYp4(iSv1`eO5OQ>|pZQNS&-6)2IN;b=VA;OC|O*BAz-wlIdB|Gi@hPh6aR6@w~_LY6aA8(Ln^fW z$i@bJ(=5DOGhGjrz%=llPL3W<$GcopUOjHggY#Sk8kh!u_V0#k79R35DS?~a>Uw6Ihip* z4vt+t&zS0aI6l<(VQJ^y4 zp7O;GJ``cM7@5=;nySC3zq)Jh2>mmC|0j3pFZ8^V`pKQpc_tY=>&emvH}rg+`rvV! z16#hF7|Go7<>bgATfUqZ9h<*+N($a#-NA%4sZ}f$pd51<=;+bu&2W%vwSUbh@k2Z zWU}75K|B>(1k`FAav_0Z2CsG&uIoVgwb?k=3X1Ot)ZoB09%o)*%87Hei0i~zHt~x= z$tH9Qs7i77Cpa&};n#j)QfhLu7|&eA=Tgr=dytY67hTVp+I%0Rdf?_7#FQEYh|y={ez?9T)GY#|f~@tH#Y zHNrBHQO^gnF!R}mYATtzo9|eU!(t=eE}5m?t))kPMSp;AqVmlrE|}<7uE&*Lnibp5 zXynFgm@k`z{_Q9C4U~FVBE4!>Y>^*rHC7skEy*z-(v3n-S`u628_YyamzZ;oSg8*w z^unp=14qW%rVbt<)(`PODVQaw=;yK4tXOIG?JR*!wJ#CXF5cU#%jmt867YrMjNa== zZpc}@Wj+Vu;Yc{F|8>gi(n0LKnm5JsL*%|1d;uvB*VaT5#s^%!<#V3fTLIS$-@>Kw zo~LK^b2|9)l;>*9xfe{Hi=cIwjx56W{Q@>Cq3;dOrZ6bSi5PS&4jTeN(6eE+=7MO3 zz9bL}2jsFS3Zcrhg;hZJn6WJ?NMxC@ZM7hgIAa?h;s^(sv2C%474t#91gH-n4>=#= z8;{Xi$g!Bc{}B|3b%4nx*Ddi7aqp{CPi0Pc$}Zz&YjI!S-=GlE^yqi9#bd_3gUn+4 za-1nf57RHk#2Q+~1c}cWhOC<6O%>+Yz(-ifabP=Z1gYi35k6$OE~4PY@tPl=W67U$ zfK_I}83LaHPB-gk!4Mm;vYFUdaACKqc`y597JkZpwx+g?wavs=kofPe+;XCs#hQJ`S46s^vSMd6+r&Ei^{O3)M60h0O=>^eUsb z6H{g}sI435@u94oLMv$wIzukWnFnFVe%|9pB2Ux@9{E$S^2fi(bSfRb&XV)p=#1Vi zQVHS*BT!g_^@$P66Ft5a0L^f5=(X?;$wFU)n)71h!9tT&bPj$-W^}sHSH`wOvCM^c zIu7XlVp1C!C0ObIIhZDhnY&eSP(7P+F(MB3Je#h6ix;^#z1)xG)K9Tar}ryVX3w+! z>gYS7ZA2=z{`NA6rRJK&zHnc6(p+;P=b8)CA+7oufKC;2uDP&zpohsh*EH;~9@lba zxeAnY4s?Oi89ob2I>T2?>TjT=(_}Bg;gwh8*iQ~Xxqv0-qFgU#_wU!()Z`rVPEc~j z=z|-R&u%zlWWVFrLZBp$Pp#x!^!uQsv;GMvHdU{7KPb5r_Jn!&PoN~{e}Uo*)~j)j z*&!%yNiAoklR?o7`L!@8IRiZ(l$?Ra=bdWR%XpNqZiRe8Af}e~PdkP{;1P`<$%uET z)FTAt7_UH<_>Ujc%4zBO5Giq5DyE~Hn?|sJ{J(r!il6$RESk1al!CKS{=Q{CnqB&q z{NwAx(L>DDputgGA`!NYN42m^eP6xdFVV`Pql~8HX>9605%(c z^@unS+5(;sj307bDrDjO7;YnD+X!6hrL)*RzW}OEUy4PtdNIEAV~m>>|9J$O`c!?< ztXN^XzGPOcD3f%#AGE%J!{yj5G~43F*e&!<%g*VS-u*LCq()r#T;fU1=wFY!^L zj9xJc?jxShR*uA9y*Rh8duqY6QT6KJfR{+TfN(vz7Ztn^JwB}W=7P379KhQ{3v-Pb ztS45StM?L3eP{Ri^S6Gr<%S!z3y=Pyw-vG6>@YgkDqNG0?)d{#UM|>`vEx!8bRkop zXU^$xvYXd+6}-A(x?Y#tH%qHGC%LSYWHzy1u{0C`|07s@cv*j(vZU_UcVW_x3IB6) z!Y?F5cahzcx+^9x>T(4xTxJ4%bY%A+oyaEv1FE-5y2|3qRVLw>gEmHN~+m8JB|V@8R%jluf3c2kL4OSB|sf%qhLR zdpoGB#NB($xW_?Vfy1vokF!kiig}ms0_fr{-vy8|9}7x0n50R5p!33(u2t=w>*(e# z#ILKcw@DIcZlE=K9)5;}r2;IlVQUoz;|tIDWt|wsfI;h65P+LQ$q4FL2BjBsX^=$T}gc~A~iV^UR+09#3?1BgUHYCwCS@F^oj4|EM(n#{My2 ze!mcF5-8a+@{SELen0>9rJB@%qm0e=wAc3^RDtY?6c4tS$3wWTHM$_7655|S)j;8 zelZ}P(+u)JFq#^BiZpycV-F*ZR_5!cTjsj1A7f905fRM58lDo#(EvR&pT~G%+fBGR zryOr$Uk&1a%|7?iB+t)Ol~ZeHy&P_o*u0wt^c22kU z0e&Jy-!BMt`h!RsuL#<(sEFG@h>BSLzi^`#qhj(Pq^y`zLCK0a9h7XLA{N`D}GlltFi~zvMMhJCEM*apk$@q2ufBZ zm*QmwvNMiX;G?)=U@bBHQPhH^Ey)Ue!>m98>?`nfk<@9Qml>9gUV_|dd0JcZ$n++x zd$6Mlu4-8knU=>gsTk`A{u!H^GL`Zr1od&|I!4m*q^8hmCWdL25Bt+6q^5|@1eE^V zsGr8MMy$Xj>>$`Fn_A zI3$U4I${$!ACknG1DezngY!>*v~O~pGn)a!p-G&_AU2Wnp-G(iY&g#O=DQECiF3Z6 zY!Nb&IAv;c5$AlS;(V;+Y}u9|AW|8%Gbin$CDIciS}cL`ZvY3q6MpBf_%Ke!a0(%V5yK%| zV$AOoVyqwGKMugeT0SHrc>79wbfnnE5uk`WFZ!M3bA5)ws2_53Lxd~`oWA8cUegg1`H8?3L zcerd|=0H656QLb32w}+jiQ+t2X~#l&MgiBVRK&=*UncNjil-7{taSl*JVYClle95KVCZkDgLl?7 zfSaL>Hx=h8LL0cPedd_gRNPI}{FJ1;P8Jxpe)j!8tQxU0o>w}DLI@{|ysY|}hS=1U zQ^j2jQn$Zwg`o><+oMtu13R>MlIbGVOqJ@vd+V={r)pBEh>=>oUB$@yvhvAG;B(Ur z`+sGm!OxskDqHc1uk;5Bi~RIWRr5G_IeK9MB=mFzezd z6_YG8OAQMbczhn}&H)U^42znsQV}ELIurOXQ7kFuM+q@j{lNVpFSa{|Tc*9+Z1B~z zpQ%*D$h`JA@|g`xY6{1n42v44{nJPTt5d0nN%S_fibSiMk)+kr1m-@RSvkMI>lpYt zs91z??3@rzOR~Cr#HOY&EyD-rAMr?Bp2;c|F|u6esTf%oOtCp3#@Z@bFNrdrmL&6B zf!T>O+1&cXH)G;5U#mFJO_CXdb#SIs442LP`U68gJnU1ch>!z6K3>u~#rcdRdFG2$Ov~{3 z_Sm^`c{)@oViM&EA|_FuGm_*f6c~sj!szdgoZ6z5{WnOVQ3V&WFHH!0@pq!=$+x(or9-Qo{R5S^NGxVpRPnaFK% zjg3{Qh>^B&Mj{_eNlOJEYe|cfN*WTF2Nk!%Jr7}+Y3Q(8aSoX!UFn!tSyEo1q`b-n zhQIx)0QK0u4Va=Cd2Ljj%aNDtxW1o|7ZPZ9B*bvcR?%HSMIcaz4EHBstXgHBsVVGz z7(RRAC*K(w#JZqLMU3S0SppxX@X-`RF!DMvDW)hXrY0%oyo4C5gbTnuHN_aWTy_3# zAf+_;grG`AOro_c6shR98Q%Tbx~h1p$5kp~B&RPObFTy@HDw~1Ak2T|&x1x9c(&0p zmYBrcxrh~)`NzM!1RbLxbGb@IOkygCh*UW^GmJWAXKp;z6)F`mlGC#)CSJ>bO^Vr@ z5M$M9HTcA5WRvUPhItthex_0plPFLD_g7|E$i#l$7toD_3o zQq1ECF;Km1cn8Z|KY;V>@ z_Voua88!4Xhl3jgViHp=Moemo(Jg)Y==xvAQ$k(P*5R*zJkl92|M3lGLXj6_USF>y;cH6g~TjWdxdv5%`y(#BZ=Qx0upf%@pzcDhFm_&;@2Qi5{JS$0ujRJEe&o~O+8IMj6%tZ((&W%Ec zO?=`X?p!PH1yo7TRG4_3u1$!s)@c)xCd$*8B+qhz;S&)WUFOx_jgQN-U2$Fxc_=Nu zUY3v-V;(VMgf=WAhZVRhb0_Z3GyA8-b@-A>MU1S$&rLo?Nk?QboeUB)){HSQfrJ=q z4W5gHsVRr4^!Hy=H`d4ro8PHa#3a_>N|DOy6P71wtXW_J;A>RH=xOaqlPcvB=yCOrk}tN|L!vVEC3Dedh7UpZs}T=Fb%8Hpral!&i$`=z2x) zPk8tWLmF5nD+Ga<#8l@aCN<@F-b6_K`qRtfsY+EUViHre6Kg(mx$o28PmZU$RHY(D zYU770Mz%Psjja)U&|pOP>pz~sYO|r$`&24o5^bylF^M{COVVMdz+A~Qj;9Nj_QrMi zhT_~Qb!e%bwMm>ilQ>@>Fbi;oQE6|?xn^6O^FI~m3j}A}wmg~+sFEFub|ixlb4)^v z)&Fz>m{`&alH}}YbKun`B-Y_LcxbBPQk&@oumyE z9(ft}6K9d{D$eVKHmsc2i&R$5>ykKMBrrR19*N_oKd*;j8u=VhoG%ibaa%juaGXhb z!NiBu=|xF-T_P~Q!kKv;-Fm%c9(R)Be2JOYT*tgNB;|EUQeGHVLY{><)1K$QI|d_0 zqg<7W^F}kTri8qZK)WCz#;Vm#xSMFb8c<8Q+m;6j8O73ZyjGo$WKCr&iJEZ5eg+ zYlpzxgEI#g)uGehjOTTv>I`=zalR~x^Nu9WF@fRmk)`M@dVhbMbAjRf$j~S9dIl-DGQ#h>m&i|9)VFkX<0Cxy0eQ5=yjR-QwWwuHXV*pA{P|7A!KS>T zl3-OuX{fvq#QdD%Q1|?q^Jin%D4bT!pDp)|nt$s2oWjDOU;+l>C+S*K6Z5NG(bnC9 zxXv#5Fl|L-MLYB8K2KaXtmx`6=&EkZjjC?zElOS15>X#RZZ@SwT-`<8k(M)M3(AWs3@s#P7}vrg>^0E2QgE+oS!a};Wvgw$ z*RU>Zk-G;7KxOBOW`mCpu(KW~pO-XFqF@LuB4vlO}sN|B)l}dP3>tXY2W0rWMec-!V zYfveu56UkDWV5k}7Um*QCHNkf(b!AMf~92(%8E*>i-SPSpQVge@*{GH_;PQEpqaiT zSXx|JSy)mPwlA*QBm(7@Urd`nyR8GdZ8L_Lu{MqNqjM3CfFNm%% zYxUHMMU_?M)r%IHY)o%0%pkrEfRS@ac`#H_RT3%-4Y7kbG`ZC6Es5n;KlL(oj8YGc zV)oV#;G6kZ1Q!)9T2!{6q&h+GR;-NxiTPW>hT0S23=3NntX>paw6Hv}j;+ukd9}b@ zDpjKZ$zOgqi%}h{C@d>L&2izif}kwxX|#;3EY)yZjG#I zmkFynOClwLk+7YP<^(wmn>QjuZ5^;fqxUq8-sl9y9oPkg6=X%XK_L>4aFme6)xqN8 zveE_B&JE#0j$#alJ-e-Y{_Kt+)*!y$C~^@(R&{o*!KZUBjyF$4tAUVFit3K|U6E3% zfS(HymuP6{3*lkeEt_2eKvmu0uFkckD|hgfgd=6@fpi_0TU|}m18Qws2mj0@aAj_Dx;!s za6zc3tT2RTXb3ChF%+Iu&LNT(RR$MUl!wczOXBH=EhPmJqXVN=N^5~Tgt3S|uB}Ci zE6j~!2uGV_^Q-7C>g;T9SXl3g)^j#S&UszERT3A*Z z6kqVP*a?R`9M{dC&5wA(0P@l~MVo$D-4KRn zIF8!RPU#_x2ynHyLO6_gTSTKSEGw)I7Zn|(QJWSj#!a$7aFKOw*d2zWaq)Zt<8C1Z zZiqpu(JJ7K>7a(VqvGOVWf()fP+@6MiHX@DnjAKqYiXudJ1`{1hs4+l@g*@DgWyRZw~H}3ICsU$ z^G)3q6$VSHD$1*?3abt4H#o=Z6wR)~==)?7H2pXG$;!^o^HtBt>1X2Hx0ps>zOV@H z4y~D09{)6yB?rXIW=+FMXxcKv%9akBW>0oZAU+JNJeP^Lb}EJ&D+!i|!sVr9m6e7x zmgI49%>Ktzx9HJT%~&k2B8bkYys9F!&}wWcF^I=fb! z+uqX9+7^-Bsc8uqmaJ?M8%b4kbVs_PEBP5_Lm#MsaD3Wa+_{DmQ_D?jj8IPrR&$Cl zUq9af6(`2Ph$~lgV}$@SW7F3~whwNLl%t!qL9q8tiZ+(9D#+CXzI@5S`QfJ)Zvh~g(xS*C0h+&dYVODs51UK@VBz+7*^*~v$Kw*vE_1?R-?3t-Zer8&uW z2KbEyrdr`VxOU>V4wxOo@S}X!0P|ND{L=7z{|FomPV({5;&H&-pm3?Uc9QR5V4fa^ zA0I8h1kCB@fj~GIzh%IjuW(NC@x`GiFfS?GNL)L~r?tWkaWFXXy9)Ov0CTUxnf!*> zJ)cIrr7+~jAliqGUHucd?-bT4Up{Q~;oXI8e18GKi^HiLJArvc;hgy0f%IuG9+KV*|AJvB+|J)Rs(mj!aC)91DI?BX2KfD&4)jB<)vR+tuPYlobScJU9PZB z`Cg41*8!8mhJs+`YhzatV74io6Td@n<4Ry|S}XaP^=8BGufTkya8CTL0h=#@x%>jj zk2oj0x(=8-EjT-W$`1AcU{bmyzk~U|6M>nda8B|~2b*GrksO`n>jLi5VfeAXyaJdJ zs#iAU8)AQaedMHsp4-_D&HxT`5)qurQHZ-shwyXK^G(3rI}E=G$mk(p{-6c}rhgey zjtt~Gica4WoZ4>|aJdTWR1Ui38Nl46a3gT-RF0nk^Y}3QSRVtxoK6D4sXoTyUW>vA zAWlx@xDdGQ3hPu3*2mRD_&Js1Rp8zkhTm8yVi1^b`1TCKVK@Z8A@xCj_Y1x~V+o=h zLvXpc|BwqD$7^r7z?}r#S9UlXzmbEta%S<(90Vu*@x~dzoWZwq5ZF%b%1eLe=UX+F zU{_w+Z?+2@`|pV^aO5}H1?~{wPIiGKzkC-s`r|WP;6?*i>H0K#F~V{jcK(2VT<^un672i|-n-L& z=mM7o+@mgVM*#PVOWgY|aD0vKI~O><%y;B=oGihvyg9gknhV?{;Fh_-vH#fO0(Sy% z_qf0@-|=pxWLg)uXBM50QaCv+-?`RT=4tY1&-}}LJTKM zu+t02?K529*nUGUa9lTA;Q~i~m$<;u|J~pMNBg_m1&)65c^5d&1ODy;NB{n55-u}n zeK8jhvHtfNa3e40mGd}pDeh$ebDqMP^L?9srWcs&hvByl{B8wiyv|(ZdaTp99sA2` za~001-{PlQN`U$73dt`Gf1LOg^x+2rI2fGxb>Q9-VEPsAVC8)Wn12n!?>O-L8kp=W znX9F|L*@&_H_BjuEqt9?ea_)IOf~x0(U5I z5tq2FE^$}7#NBL%v$4N>fO}M7o$Qb0eF~VDEI6lj`8qIrEI7M$DSrCuV_-&H2gV4j zA18jbz?`daPV$|O^zFdht8h;17GB_9RTz*W*x57f^gr!zHv0PuaQ{?TC;5Wlw;!1N z>qVCFbrl=|wFa1t3g^U+-?!WW z%%~p-cH(EWPW-k4bB)3|@f$x<({2Xlm$yoOa}4>0^dBc8e(-jQG0t{+X8HVg7zp`S z;B53a0l1SC)=9n>z+x6K-znTETsxI_>5t(9aWFXX`xy7SfN8!{z{JP3ocQeq=5Gq; z#P1Za`9NVLM`!ttz6)zfI2fGxeT93c0dvYv1Wb&hgnUEl1J$OzsxT6%`tu>UOx%3U z1&;jQv%}fc+aPdXE38vFUIV|8cN>z)zfO973%Egrb>hd*aeW3%)xDBe8vfYnh3))0 zg^@_-an4VH`;EdnP>m3I()W&;!WnPkXulwEl_FWaUt5@~OL>__i+f#dw>VHdawz`bmT zv$4~?zUxE8bVV&}Az>P0~3I9^^q93u#m+J!i6heIg_aW--9$>D2 zT8eiF{y6bVeFptL4u%vQcJoG-_h^M7j=_mv5V-I#{Ae#{x#XtcQ1o%Awh0Q~|E1}A>)xR(pebqaSd ze$N8)+A#d+zTZ|D=F8wD-*wO7y%rn{PVzOS;=LAN4*k8v<>QawH>91@Pn`ae#29Bg ze=r$0&vb#C1l$%ExD$Z8%LR^p@i>@}aj(0;u^s)F3tSp-+RHq}gPr~;Uz#1x z#&4tpm#wf)^_v5JCk)}|WG@SVJ8Kwzv%#;~CBK`1yLT9V9EUyRlHaSqy)z8I3E(#f z%*a+xxjJ${D2GGDBvD-fn$B_a)D#MzjuLS zd0%sZV|oAX68DJ<9P2lQgGx)VYj4!c7#BF&-w`fww1Z<^;-+|57y-n|uDqCTX}SxX2e>{LINH%QE^xG~AGyGBTz8Kh&PIQ~ z2ky@b>!iOz@OuxK$^Qicf&I4Axamw_+7!---`z;x4a|hUkel2Y(5^l>zTc!U0*I4c zebDajbb$*1*Kdcj(aXEQeWI{V<>0#Bx4^7<8;lW5e_+G!qqniG1P%r#e(kt7>K#1$ z!@)rNvC|9v!7U0y9D~q{O}_U6_n5+_2wd{-)$$SFKZKuC{eBJHA%A0z&gF>W-r>Mp zu5eD};JoKSg&{u%r*b?7-17?SRE`Zu|3_e|-xaLl>)tkc(Sf;H;hgvtg3VpPyl25V z>17`=|1I-%;`cM$9u3T|6)qLmPW=7@n7C-e0jgx@Q`ysdCf^3@~# zKNLoCbe1ppKGuD3FgWp>jC*GRv( zCW?dMVDfDM=EoMClYBn|=5Y(oPQK@m*8nhAeI&Bg((uQL-+ut}cZGA3Z}te(FEBYD zOMYg*Wn<5qfVooPocP@eHa7xu+9#6V!R&7dFf9t_#E}kz8uU^G%-YW-w}biJkAWHSg~U1WTaDZ43S-FURBsmow|y9XSAxma zz#Ow*ayyuw=K)ixa8B~EU#M4@;pBS?xZT6>yBbXX3{3l%lACF#L+b4?+1FaBq&n z2p~>Q{2G8eZy0`D54*r6zn=j2$T0ktf!|JGj`~(gXSO#Re^3leox(Yl_gb(y2bhl( z?qK7(~L z_j%ynP*_T8*B?EJ_;-Q1!zatadAL)3WR6PF0yr3)_+5v4Cjs+>!i~eV;5S6iEboTV zk{3u3?COJhzS|CGQ{Mjs?tO)Il5an5{0o@9=`wHA{)Wgm75Tn#=y{Xc5{_J}$a9-ek-~x9XaJRX@9R}PkJDiQ4{|MZ>3hSh2 zZYlC1FuyoL>X7UHPVG0Gm7*=j!QjM?{l{uxp0VJZ_`M9wUoAL0JGcPju)V;Xb(G9^ z4EWpG0sEEr6b7USc6Pw$wS#sz8~uF)TzdAw%X=Mej|b+bM@t;nPweF5`oWlEBt{5_ zlbw9j|H*bZ8~IKLZjr*0vz`9#MgP`7%tV>@5y08W$8pYk3IkFEJNZt;ozce+Uyh@I zn`wu$DMuA>jSA~jjyK^CT7fCbm3f~5{&wYI)QP_8K)M>I#>cHR5UM3;FZ0_*&M*q_80(TN{7r4aT>=O5k3mnHeAGyGB{C8}@ z@a5(BrPKwE`n$jdj^ni(T;S-3cDcZ@9DjF#qkME^w@mr7mzYf!p8$NB{hD7dYzgT^Bgo{h?n(Nu@a3TW<+{Y3=>kW)y4(eh_4|k&&c;9Q1@23QWr^&@ zB~vg^N)4uH(-z1w-v*qWe`dSv2oJ9p3=g!MT;OQWx46Jj&%0dU*q?vw0>^p9u{Fb& zgLEwiuN831}A95AmdoD)CJU;YM6V58)BF#XK}rbOWm#;*#PD-`ZvcKR?dPY=V7rt zIc}4b?_m5YfH_m)oaEaIek+0bZ-t{hI@QNXn^Uy8I2fGx&A^QkU@qJuaWEgrZ;0I= zhxl|p6tD!lc`g0;$u4m8e`mSCaU5}x9nPk`JpkMj3QI}t{Lt%&e-4=2_(N8NLvT3h zZ%j{$b_@;%Cw>>h;BtYvqgUe0bxa%iuH6nCj)U?08aM9;=I$L5cd+{X5SVWj&Pl#? z;Foq;ina*{!@-_!{ScV@70!v@E;QIjfLZrF$*&JQh5m-v3&&w!-Y7B5m%+|nxK4A- zO~d27z)f?3<2YxQ3mogI$pw!6{yG;pt_R)X0!R5Cc7fwK=dUhsd|o^D2gB=+>zyaK zzy*NIcY)*j-%=Mi>bcDYj_X5P?Qk~j=m)_4RAE_iyLSE(ZafUkr9YIqp`PsQl=ZRr zmf`hBzqZ*0j`M)~UE*GMf#Z16^P}PA<2ZYk9nMC7Ex<(;mYnVM_aWjp1Ji!1%==(| z=s{qfQaC4mkKxAef$66m8HJ^!cKUk*H(mzjo;zh(oXSgkS;dF3mS9(2j=QdPfn$4n*ahx*;C}A{=Lha1 zJDiPPQh$=7jl;pfvz=Z(!;PbXIqV*Zb845zA^m?V4EZtG>4kn{P?vp$ZHZD2q{uFIB z4hAQFevC^Zz+Co##BrW$*WPFcH~d^;$dAEJ&svf73(|Bo7Q>m>U?cnrUqtSyk$CC8<{T8$1Q4G+11(IxhfLKtvxYNy*ARertMC?@ey3U*4(LG)6F%s=+nSRQ&Jgt7_ z=QDTD+}ZnlWSm}@-n%p6(f19e>NOrc~f zU4fGC1m*@Nb#s!4nW{MRB&(RNF74n2&OBIw$GI->5ahp6U`jhwZYpaSxpVZ&oXm#0 z8vMzUif^bBe@8GXfAwKC)~YIR>@NjRsdnaA#S=oRCblWoxX3z8j+w*cIPTxek;_qO zTJPtPIeN$gD;ym@KzoK=dGwGE5u?J&&TyTXa9uBvXZDW)el`xT#z6rWr2OKwqBk%X z@N4mb9+D096*SZ;kM2DX$~kz`tEpAW3(nlx zufGx-9b4duE%3z_q{kLy#uoTv3$kJhvSSMZu?0E(9%LQF;ng_Sl`V21sJOXAab*qj zaRFfi|1X7gA!eslM$oi*)^Q}q2Q5}fL$lh|P&>&&lbrj|kToDOj#ok!E$ijL~1AneL7}K6B?| zY&7~;pWLU1Dv>tk-+BNH^LFKxCa>Mw_nJ)9Plv)w^@k{CY&_vu;F1 zO?B`H78en(20g8~;Pnmtje2#uS$xkjy^KD^T9pk_6KD3*)ydjmlao}5NwIchTstUP zlXTDV`rCjjYhVgGvW#svf$BLUEqbh8p95uQ=^;Oa7^|0Op|c&W2R*gn1F!Zx?Q76C z`JsW)J!g!Ijuf>ikWG=yo-@WqtwKvrXeqaJ1PKxJjR_I65D_G>W*Lk&5ah9U4Xy(?T0jqHJxXB;~LwKqK zn!-gQy`MKk&Jr#sdUES+h#m-4=HgE*RGy&TaCC`OuXH+tWqMWRoT~B-^LM?IT4Q$D z@HWwjR-9hvtCf7}40b*iD-56W>f7*aBJ0TOdR2KW`?3R}a#^?_B=Bl^ICD+XtDT0k zEL6Kqwmp1D(hF_sc5^u!8%vBLCNVP>q* zA1lm?6=uUqT4(Mqcp+BjkJV*GM?<_=YU~ovpf7d^M)9#?Pr=8rI$y?>51>qXadyE| z(KC9!^K2Y7P@L{T)L?3?J6&IxzU!S4aW9DmRGb|>%_@xE4{?MrbGp+v2KxNJqQc;} z4(DI^E|mRcq#`$n1TDn6eH)L`FUi(l>Wk!LesY&y?28p=#`)-l)YpWW&kuV0ZYC4G zE<5HK3$^v^LKBYe8=8RQkBvC|qBRCVd9^6cvTf4)N}KouR1k+(8vz5CcSnJecPE3A z76XWOHLm>lJ3>pR^U=s9O=Fd(_kI}lK>z)9942JyA=F|+ycR?8TAV+$7ROmlzNv8; zxg4wti?j8*^v8V2TK`P{`jfk;#=3NUk#FYb1ut#7u;AI~sd{O8pTCz9*2ap{4W)Yu zo@GVNg~t6NPhmGr(0n8Gd`^GCs~eBe7m2!!S5(2Xk(c!)>Bs?Tk%=D7MlGTK^toTW0$K}luO;RkVeHJXFG`x{X5?rWgpsy+m&W*DK3 z6so=yG{<27g3rW>wd=-nk4t&FMD|0-h8wi}oALkI|E>5$dHL*6|S$(wQb#Za3L*{{vV zc{UEOR$)>gv^t(dkbO%ZXt=A&98d4_s(*p&x+f*#>xo@~dnx7jjKH8m&?9>GjQHa9 zqjvT){dArXM#w)J`}H&pwV{VLpiqI;nFFEq9z+g==n^&4?%2a_h)mK$>*s_b8&1}% zHgKr9e&|pWplGJGF|gm(>my(vn|HMyiu9GI#5S#sRYjWmv%x=zLmHYin=r0_AmSQu zmP1TSf7{lvvOU_|B0Jm*fsjGg)c0`#r4&YbcWzF_TnD3$SYc$-k$TMreetE=#A?>+ z6&w1}x9TYa!Z7;>3fW0$Lt+_4%eRJGalwIkew}a>Gv6xcZ-`E8-HGUd&@3PR#2WKV zT@|2z%a7#68Zmm!)2n6`?AlP&=NY9}<;Oy^`aHp1Z>JhPKbqdtzJeEHRr%4wtZHjI zXXZ{AP$;j@AMC4qbx*8ns$Mm<;Kj&cdi}hDKSmDGFY*=4je6#s7}*R6BP^#&)8%?KGHl1doOmkqbN=?u5-wgfNc-K>^EA5UjNV(AUnm``l~@Xi)atJc*2FJ8xa498QngZw z)tc_b(U>C`$)&K?QK%ZVY*|xW8*9u_ZK9lGE;O}alAq|5{2ZBnb(XAeV_f%dipM2Y zlsjw@ZHW@FQsrPfo@j`j?-Mu-``{VSrn5M%+!-4;Q0!+biZ#xQ%#y6s@HH|?C`l?< z4C65KfG-FqM5pWhg6|SziI-L6JEtiYTF#y=1Y_BB3O#J7c~cflT3@{N8{Dm5KH%BP zI^b9WN^KtqE$5|*MNt?}&wm*XznHYVBq(-(f573@=*NlhYxm*&f{5e5LdH?5port} zVn9%QFGb$X2Q>?Eer-7@>1y~=h8#s+1L|p!;`^X>2^=3A$v8gz*eT*T7GbOKYfpl@ z3e!!$h7G;3s$a{6`>L|J#@cgBV2xa*Ue(zZKr<8T&sN;Z&S-mc0K2sZ+B;V?i`ykF z5$y8Z(i~XP5y1Y(EnOWez;{&udp}3Jy2Uy-m>CP%+>4JPMGd0ZOJF>*GwOYm(fzs> z?Ad>K#tt192XcBDCvW_3IA2Y1{%?elV9HweY8*yQ7t}GJP8L)Ss1pTs5~xXn$^&(r zpiTvKw4mmJI#N(Yp!lOLuUOC;E2t{O@yCQ-vFOG5gjYKYaU%t_98`*+R)P8!hgZz1 zzZ6s#&YuZtJL7zeML~iU z3}S#>K)K{X5-bu35DXC#8qNqPMCeSEaf{l%t@Y`}r+un#ZSBQgAAM>S3>wjTskIfW z)m}B}c&!zKw&wkQ*E;9S~AHM^0@;&>0-)pbE_S&Zi+7HCJ)h{jnH~8{f zkKld0nEf1RoS>(G#t3=_C`Zs?Aitm&fHDRB4(J1#i-L^z1hIb}5%enFe--p5-meS# z8{U5r)Q9)Wg8q*89|T2PuV`)C)@p5OY;W9bwYIfwvB1P=w=Ha+HMMVQYQ)v(m$$b? zw^-|%+cvIivf5gkmbEWwYj3iyYHDwDU>i2e+R&#M3?@BvEi0{?S?%}+TheN@?e>jp zqjriE2#(HF>l&rEtd|0l&HOP~M#O1@ltRgI_o@z~WVu*u* zxk_G(3}8@NqOIKga|ZapHMY%w_{|!ReQM z$Adu1c7IUJIHBAxs1fLAg02Rl2$bLAr0`=wUj+KTAT}lq<$FNi5wjn8W)A^NgADlqmCC0ld|WQ{jJzSp;uQ6;J$qUd+nyCIN*>5N{{VK>Nh( zYP=JI$YARf#Mt);qMXGpK@Z`*L(p@0M+Lozx2E6?piha}dw6da6vTj~u^kVzQOu@$ zX6FMniP=)1MnP+URtahcx>OKFZ)*kJ08}ODHlQVfz6+#r900ml%>Dp$2g)mCQGI&3 zn7s?6Da}UvpD$*)Kx$S1G*`?fdS>SW@x&bX^Pbs4phIG|80Zl}l|WsBmIHA>^;;`| z{zuSdKtB<*2IvQZ)&r4b^;^wA|69-|Adl`m~tc>Y05Rs6))Y3UrmA+ktQv0BN}ss9n&vfm#LK4b&p& zM?f0{-2>Dh=suuN3fd1;C+HwhwV+3UmJ0egP=%nUfEEaP2IwL|hk@1#dI9KLf_?{d zy`VnMGb|8VD!G&9LS=nW)^3?LxlRWJG>kJZ4JeAT?OU+cVs&t_<-~tER%4{= zj$u7{>(nrvfZQWvD&3VE0y2k$twkY|4or7}5@~JR+_ZH|02gTh{&C*d)=z zrcB;CB|S9h0@x5v1=kj}!)+TJ9zhN!6FfZ_ceqsI$jFCh<-sEp#+DbGrIdNl1bA|Ss~UES&3bRv;*|vZ$5Zy@0-gag_TD45WRixyasY+PjF%gi3H3! z_zGEz@lNqISKy0}&+_N-@6(bV?kyBAn_gp{+qJTG-_%8Q2mYL8w#~Y}^c-K-JJ@J| zs8$|0abuiaCbFEdSP|ic?s5rduw4;&MWIBw&s0ob5PK*eoWAchtm-_JST=p-HQC)2 zQyF*HS$JvEDm+AsZG7R$umTeJvy#ZztNBuH5mPpuJo&_BkX^Yf5((bOA--sTT>=GF zZ=$o1ys24l#*U5%?ju)BT!uR8%&u9+Z*ot~dcXKUbSAdui2^u)`FJx0A!`i~dk|LwpmpTU?KW+;zn4^^tk8gT z-%b`nUQ^>f-MfdoM#I}*;M8x82YN+6BEdj1?_>4e0_>jW)w%dd8-{2F;%SX8J zCxB}tX%4>{A`$_JNcdMGu2o%HO&kiN*$rw`Z+1os#77!8+aA^J=NQ|24#FGGvX_=) zk74;2TK)|Q9nNQxmd_r;@>N>?&oL}tqvcnQVfi{OcMoS7==O7=o!l@aHL!V;Hj9U| zd5bnPhO_xAZSsfMly&>xh7CJ0b|Gr&Aa>M)^nm|_K|VSKt)mdFBZAgZBj$Cc&#@1g z?$r(N9$tA8Bp$qu1PKVKGI>#mL)*wiAZ;VUg2h@&1-}b`{IbWr7cNu~>jW{|f^Rju z4v6bNzqQXZW8WJuX5aG64glqe8Mg-1FWIG|#q3X>+512_VwQoHpziX4vc>Ea&uj*e zPt3SVQg@4iGQ^DQ5jEoq<^%k|1oq6x;d)=pxXw^_w*&Rz7qafd`&~g?JsuHs*h8B) zwk~dJz1(iLHaBi}&?Yt5*1XYfsv&`CHML?@(k{aB;C9-ikE{*tji7kjT1z)xzR})l z*==^?CI=&^vhCPG-?|ZuRD3MrcDjCSY)!M-*qX9IIa#kFS$zDCi1<7B)?q~li%Yvm z%1lC$Xs6E=*C{E3(_oWr#a<1df#ucI$}TSE!Cd_Eg7Lq=H7J;H@k_xts|unxQ;XjS z#-9eRYi3Xy3k3rM#qZjM==D=O`=e(ew8Bd8r$SXVZqs9Pm00jM2m%N#5EDa1PaX2S6+ycWyWV^$=l(lD}b5TQA5W&qvFn;Se zAZ^8kKq%@o<~ z4)q=~hrdQ!NR64J!8mzso&CXhl7C+d#{bB_&j;hr<8NKP+t674r}ec1XA`@! z|9I?uJI%1GrNG%-GAt70 zp#JKs5)FBY*4#uLNObifWB;x*)c0Zilczl4>i+TdZaWFNvEwf{(zShejYQaNfqvPJ ztwbq>q&k)fs(=mob;=1{0_3-vU{)eNqIh$k!*5*$L@Fy}-G;Yv<9-69AwLCFA)&kg zq#?7EHDs21xrFi#5bG&q$@cBpODklBwiPUzwe5}VJDhVxT++8UU5@o;Q@gXab0lfG zJoH@W94izq2eCeEZ)#k>!waYh%pN}Dv=5*uj+2hL0O`qA2D;N|?2`pF)3w(+y4|KL z%t5P8a>2oNEPj5AeN)SV126OFw@w7Q1iz3q32$`=V95fDz-^CfRqsP?;uN#jH1%JYg3v6IiEE}u~X(U3w8_$njs$r6fm-@UJ54Bjw%>2$kC zV%(4byfi)5VCPae(U@Q9olh)Do4Id&#F0Zmr$f}i&dF&GPXI33?_`h(^GPlnx^6~t zhkr6MGc&R>`S?bR7~$iS=_`TTby9Qe6>9}m0<8oJSuqbC_0VZ3dbQYZaQ03%@pd#DLX*{YSR6Ozz|OS?2E9A=noDmY@FV(N42t1C4g zitR{nv4i=Vt|JvQN`mpwk3-j6pGGu;8l z*Ih9a=|n!La`IYWe5nz!z#@C?p zo7I3WR=Ye1RhVr|p%KR1vZK zCD>pmB^A`)ADuE!s}wMjoLX_q+^gn+Rnv@6tjYm>5Jl{EpG|O&5e+Ifn&|5$qf@Wfz-YKXZNJHjM ztA@;7S|?;6CuATeWFRMGAPt#IHgexW)+mIkaqt=v?uLRc!dpYx>Y>j7?GW1^dgzy) z?OUFimF2pd1f-!X@KB>?yTwEQ>DfN&nH}-Wruf|OW&>$>i-DLjh++Y40SZ~`Ja@)J zcL4oTa(NffX7TYOpiP2)3bawsGeB1hIt zHD+Zx>`fK}j!ux_m5T)>dhKUmtNgrRypwoL>}bdy5j*OOPSXMR`lT~4WRr+H1;oeJ41;n^A`l_A zFl_-2>}(m{BRz_*jLb8U0_`|UfV7g=0e9&pf3ml5P3iTbqPww1ZmYncI5huIOrxNSmuQ7 z+&LrLeRFcI^vxL^9drG>jCqha>XCfo;8YibIG3-q=j#%bF!#xpHsuj4w1aVSM?m+> z1mIFJB+*XP^)1fdn)!kBQ$jdeMX&Z2?DvQ-w>x+`q zXi4_jyDzfr6=I>iLReH>N|7tt8)=?De@MYkrC37|)H0<@zLG&f~ zM7YsA)4X%##hpBk#C}npu@_$f?3K_JV1XF7o6j7wgJezTv{%@g%}P zkLON=4Q9~72-=45f;x|wCxY>NU}Z95eZF9vb7rhBD;WQlfDys?*97>3@mmE1g7KRK zWC!Ed0&owZLkz~+XUF=++l8^darUHGU!HwRtS@Mv5bGO*<9vOi?O?1g7ssReMq#|{ z%ZZ+3=3xWE4w+w=N06NJ6O{#~B#d5rBsr=0344l}hY#pRc_bM!iwfZ4IGB!A)7R-G z*trl3oB^%(*GNeEbC2d1)GzW(7U=Uuui<#{Jee898hNxmo_QOCyxAj>)nMlhNQx*h2*z32 z<_T`21mj-?PAqgY+nc~A$DFUk=8lZs3cB*FmZ=YreKGK8LlGIF55QRG5Qpzm{Eur+ z$?C@uZA^PsRqC)WN^XHU4AxVAV&+|C-M+i%vG}hj)p9M>H&Lor7NBPw2h*`?`nsgA z^B>qfMDTKyU_hK+@Z{5y>qKg`1V6v^7~cC)*nW$nRX%

    s7p~@bimcklL1_l-2eU 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 z

    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

    tDTz}rOhNmcl7bdG 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

    -^6k!T2EE&o0U4EshX2WM^>Xx20H}9`te1 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

    +EOT + print $fh map {s/HREF=/target=\"main\" HREF=/; $_;} @stoc_lines; + print $fh "\n"; +} + +###################################################################### +# About page +# + +# T2H_PRE_ABOUT might be a function +$T2H_PRE_ABOUT = <texi2html +

    +EOT +$T2H_AFTER_ABOUT = ''; + +sub T2H_DEFAULT_about_body +{ + my $about; + if (ref($T2H_PRE_ABOUT) eq 'CODE') + { + $about = &$T2H_PRE_ABOUT(); + } + else + { + $about = $T2H_PRE_ABOUT; + } + $about .= <

    + + + + + + + +EOT + + for $button (@T2H_SECTION_BUTTONS) + { + next if $button eq ' ' || ref($button) eq 'CODE'; + $about .= < + + + + +EOT + } + + $about .= < +

    +where the Example assumes that the current position +is at Subsubsection One-Two-Three of a document of +the following structure: +
      +
    • 1. Section One
    • +
        +
      • 1.1 Subsection One-One
      • +
          +
        • ...
        • +
        +
      • 1.2 Subsection One-Two
      • +
          +
        • 1.2.1 Subsubsection One-Two-One +
        • 1.2.2 Subsubsection One-Two-Two +
        • 1.2.3 Subsubsection One-Two-Three     +<== Current Position +
        • 1.2.4 Subsubsection One-Two-Four +
        +
      • 1.3 Subsection One-Three
      • +
          +
        • ...
        • +
        +
      • 1.4 Subsection One-Four
      • +
      +
    +$T2H_AFTER_ABOUT +EOT + return $about; +} + + +%T2H_BUTTONS_GOTO = + ( + 'Top', 'cover (top) of document', + 'Contents', 'table of contents', + 'Overview', 'short table of contents', + 'Index', 'concept index', + 'Back', 'previous section in reading order', + 'FastBack', 'previous or up-and-previous section ', + 'Prev', 'previous section same level', + 'Up', 'up section', + 'Next', 'next section same level', + 'Forward', 'next section in reading order', + 'FastForward', 'next or up-and-next section', + 'About' , 'this page', + 'First', 'first section in reading order', + 'Last', 'last section in reading order', + ); + +%T2H_BUTTONS_EXAMPLE = +( + 'Top', '   ', + 'Contents', '   ', + 'Overview', '   ', + 'Index', '   ', + 'Back', '1.2.2', + 'FastBack', '1.1', + 'Prev', '1.2.2', + 'Up', '1.2', + 'Next', '1.2.4', + 'Forward', '1.2.4', + 'FastForward', '1.3', + 'About', '   ', + 'First', '1.', + 'Last', '1.2.4', +); + + +###################################################################### +# from here on, its l2h init stuff +# + +## initialization for latex2html as for Singular manual generation +## obachman 3/99 + +# +# Options controlling Titles, File-Names, Tracing and Sectioning +# +$TITLE = ''; + +$SHORTEXTN = 0; + +$LONG_TITLES = 0; + +$DESTDIR = ''; # should be overwritten by cmd-line argument + +$NO_SUBDIR = 0;# should be overwritten by cmd-line argument + +$PREFIX = ''; # should be overwritten by cmd-line argument + +$AUTO_PREFIX = 0; # this is needed, so that prefix settings are used + +$AUTO_LINK = 0; + +$SPLIT = 0; + +$MAX_LINK_DEPTH = 0; + +$TMP = ''; # should be overwritten by cmd-line argument + +$DEBUG = 0; + +$VERBOSE = 1; + +# +# Options controlling Extensions and Special Features +# +$HTML_VERSION = "3.2"; + +$TEXDEFS = 1; # we absolutely need that + +$EXTERNAL_FILE = ''; + +$SCALABLE_FONTS = 1; + +$NO_SIMPLE_MATH = 1; + +$LOCAL_ICONS = 1; + +$SHORT_INDEX = 0; + +$NO_FOOTNODE = 1; + +$ADDRESS = ''; + +$INFO = ''; + +# +# Switches controlling Image Generation +# +$ASCII_MODE = 0; + +$NOLATEX = 0; + +$EXTERNAL_IMAGES = 0; + +$PS_IMAGES = 0; + +$NO_IMAGES = 0; + +$IMAGES_ONLY = 0; + +$REUSE = 2; + +$ANTI_ALIAS = 1; + +$ANTI_ALIAS_TEXT = 1; + +# +#Switches controlling Navigation Panels +# +$NO_NAVIGATION = 1; +$ADDRESS = ''; +$INFO = 0; # 0 = do not make a "About this document..." section + +# +#Switches for Linking to other documents +# +# actuall -- we don't care + +$MAX_SPLIT_DEPTH = 0; # Stop making separate files at this depth + +$MAX_LINK_DEPTH = 0; # Stop showing child nodes at this depth + +$NOLATEX = 0; # 1 = do not pass unknown environments to Latex + +$EXTERNAL_IMAGES = 0; # 1 = leave the images outside the document + +$ASCII_MODE = 0; # 1 = do not use any icons or internal images + +# 1 = use links to external postscript images rather than inlined bitmap +# images. +$PS_IMAGES = 0; +$SHOW_SECTION_NUMBERS = 0; + +### Other global variables ############################################### +$CHILDLINE = ""; + +# This is the line width measured in pixels and it is used to right justify +# equations and equation arrays; +$LINE_WIDTH = 500; + +# Used in conjunction with AUTO_NAVIGATION +$WORDS_IN_PAGE = 300; + +# Affects ONLY the way accents are processed +$default_language = 'english'; + +# The value of this variable determines how many words to use in each +# title that is added to the navigation panel (see below) +# +$WORDS_IN_NAVIGATION_PANEL_TITLES = 0; + +# This number will determine the size of the equations, special characters, +# and anything which will be converted into an inlined image +# *except* "image generating environments" such as "figure", "table" +# or "minipage". +# Effective values are those greater than 0. +# Sensible values are between 0.1 - 4. +$MATH_SCALE_FACTOR = 1.5; + +# This number will determine the size of +# image generating environments such as "figure", "table" or "minipage". +# Effective values are those greater than 0. +# Sensible values are between 0.1 - 4. +$FIGURE_SCALE_FACTOR = 1.6; + + +# If both of the following two variables are set then the "Up" button +# of the navigation panel in the first node/page of a converted document +# will point to $EXTERNAL_UP_LINK. $EXTERNAL_UP_TITLE should be set +# to some text which describes this external link. +$EXTERNAL_UP_LINK = ""; +$EXTERNAL_UP_TITLE = ""; + +# If this is set then the resulting HTML will look marginally better if viewed +# with Netscape. +$NETSCAPE_HTML = 1; + +# Valid paper sizes are "letter", "legal", "a4","a3","a2" and "a0" +# Paper sizes has no effect other than in the time it takes to create inlined +# images and in whether large images can be created at all ie +# - larger paper sizes *MAY* help with large image problems +# - smaller paper sizes are quicker to handle +$PAPERSIZE = "a4"; + +# Replace "english" with another language in order to tell LaTeX2HTML that you +# want some generated section titles (eg "Table of Contents" or "References") +# to appear in a different language. Currently only "english" and "french" +# is supported but it is very easy to add your own. See the example in the +# file "latex2html.config" +$TITLES_LANGUAGE = "english"; + +1; # This must be the last non-comment line + +# End File texi2html.init +###################################################################### + + +require "$ENV{T2H_HOME}/texi2html.init" + if ($0 =~ /\.pl$/ && + -e "$ENV{T2H_HOME}/texi2html.init" && -r "$ENV{T2H_HOME}/texi2html.init"); + +#+++############################################################################ +# # +# Initialization # +# Pasted content of File $(srcdir)/MySimple.pm: Command-line processing # +# # +#---############################################################################ + +# leave this within comments, and keep the require statement +# This way, you can directly run texi2html.pl, if $ENV{T2H_HOME}/texi2html.init +# exists. + +# +package Getopt::MySimple; + +# Name: +# Getopt::MySimple. +# +# Documentation: +# POD-style (incomplete) documentation is in file MySimple.pod +# +# Tabs: +# 4 spaces || die. +# +# Author: +# Ron Savage rpsavage@ozemail.com.au. +# 1.00 19-Aug-97 Initial version. +# 1.10 13-Oct-97 Add arrays of switches (eg '=s@'). +# 1.20 3-Dec-97 Add 'Help' on a per-switch basis. +# 1.30 11-Dec-97 Change 'Help' to 'verbose'. Make all hash keys lowercase. +# 1.40 10-Nov-98 Change width of help report. Restructure tests. +# 1-Jul-00 Modifications for Texi2html + +# -------------------------------------------------------------------------- +# Locally modified by obachman (Display type instead of env, order by cmp) +# $Id: MySimple.pm,v 1.1 2000/07/03 08:44:13 obachman Exp $ + +# use strict; +# no strict 'refs'; + +use vars qw(@EXPORT @EXPORT_OK @ISA); +use vars qw($fieldWidth $opt $VERSION); + +use Exporter(); +use Getopt::Long; + +@ISA = qw(Exporter); +@EXPORT = qw(); +@EXPORT_OK = qw($opt); # An alias for $self -> {'opt'}. + +# -------------------------------------------------------------------------- + +$fieldWidth = 20; +$VERSION = '1.41'; + +# -------------------------------------------------------------------------- + +sub byOrder +{ + my($self) = @_; + + return uc($a) cmp (uc($b)); +} + +# -------------------------------------------------------------------------- + +sub dumpOptions +{ + my($self) = @_; + + print 'Option', ' ' x ($fieldWidth - length('Option') ), "Value\n"; + + for (sort byOrder keys(%{$self -> {'opt'} }) ) + { + print "-$_", ' ' x ($fieldWidth - (1 + length) ), "${$self->{'opt'} }{$_}\n"; + } + + print "\n"; + +} # End of dumpOptions. + +# -------------------------------------------------------------------------- +# Return: +# 0 -> Error. +# 1 -> Ok. + +sub getOptions +{ + push(@_, 0) if ($#_ == 2); # Default for $ignoreCase is 0. + push(@_, 1) if ($#_ == 3); # Default for $helpThenExit is 1. + + my($self, $default, $helpText, $versionText, + $helpThenExit, $versionThenExit, $ignoreCase) = @_; + + $helpThenExit = 1 unless (defined($helpThenExit)); + $versionThenExit = 1 unless (defined($versionThenExit)); + $ignoreCase = 0 unless (defined($ignoreCase)); + + $self -> {'default'} = $default; + $self -> {'helpText'} = $helpText; + $self -> {'versionText'} = $versionText; + $Getopt::Long::ignorecase = $ignoreCase; + + unless (defined($self -> {'default'}{'help'})) + { + $self -> {'default'}{'help'} = + { + type => ':i', + default => '', + linkage => sub {$self->helpOptions($_[1]); exit (0) if $helpThenExit;}, + verbose => "print help and exit" + }; + } + + unless (defined($self -> {'default'}{'version'})) + { + $self -> {'default'}{'version'} = + { + type => '', + default => '', + linkage => sub {print $self->{'versionText'}; exit (0) if versionTheExit;}, + verbose => "print version and exit" + }; + } + + for (keys(%{$self -> {'default'} }) ) + { + my $type = ${$self -> {'default'} }{$_}{'type'}; + push(@{$self -> {'type'} }, "$_$type"); + $self->{'opt'}->{$_} = ${$self -> {'default'} }{$_}{'linkage'} + if ${$self -> {'default'} }{$_}{'linkage'}; + } + + my($result) = &GetOptions($self -> {'opt'}, @{$self -> {'type'} }); + + return $result unless $result; + + for (keys(%{$self -> {'default'} }) ) + { + if (! defined(${$self -> {'opt'} }{$_})) #{ + { + ${$self -> {'opt'} }{$_} = ${$self -> {'default'} }{$_}{'default'}; + } + } + + $result; +} # End of getOptions. + +# -------------------------------------------------------------------------- + +sub helpOptions +{ + my($self) = shift; + my($noHelp) = shift; + $noHelp = 0 unless $noHelp; + my($optwidth, $typewidth, $defaultwidth, $maxlinewidth, $valind, $valwidth) + = (10, 5, 9, 78, 4, 11); + + print "$self->{'helpText'}" if ($self -> {'helpText'}); + + print ' Option', ' ' x ($optwidth - length('Option') -1 ), + 'Type', ' ' x ($typewidth - length('Type') + 1), + 'Default', ' ' x ($defaultwidth - length('Default') ), + "Description\n"; + + for (sort byOrder keys(%{$self -> {'default'} }) ) + { + my($line, $help, $option, $val); + $option = $_; + next if ${$self->{'default'} }{$_}{'noHelp'} && ${$self->{'default'} }{$_}{'noHelp'} > $noHelp; + $line = " -$_ " . ' ' x ($optwidth - (2 + length) ) . + "${$self->{'default'} }{$_}{'type'} ". + ' ' x ($typewidth - (1+length(${$self -> {'default'} }{$_}{'type'}) )); + + $val = ${$self->{'default'} }{$_}{'linkage'}; + if ($val) + { + if (ref($val) eq 'SCALAR') + { + $val = $$val; + } + else + { + $val = ''; + } + } + else + { + $val = ${$self->{'default'} }{$_}{'default'}; + } + $line .= "$val "; + $line .= ' ' x ($optwidth + $typewidth + $defaultwidth + 1 - length($line)); + + if (defined(${$self -> {'default'} }{$_}{'verbose'}) && + ${$self -> {'default'} }{$_}{'verbose'} ne '') + { + $help = "${$self->{'default'} }{$_}{'verbose'}"; + } + else + { + $help = ' '; + } + if ((length("$line") + length($help)) < $maxlinewidth) + { + print $line , $help, "\n"; + } + else + { + print $line, "\n", ' ' x $valind, $help, "\n"; + } + for $val (sort byOrder keys(%{${$self->{'default'}}{$option}{'values'}})) + { + print ' ' x ($valind + 2); + print $val, ' ', ' ' x ($valwidth - length($val) - 2); + print ${$self->{'default'}}{$option}{'values'}{$val}, "\n"; + } + } + + print <| ! no argument: variable is set to 1 on -foo (or, to 0 on -nofoo) + =s | :s mandatory (or, optional) string argument + =i | :i mandatory (or, optional) integer argument +EOT +} # End of helpOptions. + +#------------------------------------------------------------------- + +sub new +{ + my($class) = @_; + my($self) = {}; + $self -> {'default'} = {}; + $self -> {'helpText'} = ''; + $self -> {'opt'} = {}; + $opt = $self -> {'opt'}; # An alias for $self -> {'opt'}. + $self -> {'type'} = (); + + return bless $self, $class; + +} # End of new. + +# -------------------------------------------------------------------------- + +1; + +# End MySimple.pm + +require "$ENV{T2H_HOME}/MySimple.pm" + if ($0 =~ /\.pl$/ && + -e "$ENV{T2H_HOME}/texi2html.init" && -r "$ENV{T2H_HOME}/texi2html.init"); + +package main; + +#+++############################################################################ +# # +# Constants # +# # +#---############################################################################ + +$DEBUG_TOC = 1; +$DEBUG_INDEX = 2; +$DEBUG_BIB = 4; +$DEBUG_GLOSS = 8; +$DEBUG_DEF = 16; +$DEBUG_HTML = 32; +$DEBUG_USER = 64; +$DEBUG_L2H = 128; + + +$BIBRE = '\[[\w\/-]+\]'; # RE for a bibliography reference +$FILERE = '[\/\w.+-]+'; # RE for a file name +$VARRE = '[^\s\{\}]+'; # RE for a variable name +$NODERE = '[^,:]+'; # RE for a node name +$NODESRE = '[^:]+'; # RE for a list of node names + +$ERROR = "***"; # prefix for errors +$WARN = "**"; # prefix for warnings + + # program home page +$PROTECTTAG = "_ThisIsProtected_"; # tag to recognize protected sections + +$CHAPTEREND = "\n"; # to know where a chpater ends +$SECTIONEND = "\n"; # to know where section ends +$TOPEND = "\n"; # to know where top ends + + + +# +# pre-defined indices +# +$index_properties = +{ + 'c' => { name => 'cp'}, + 'f' => { name => 'fn', code => 1}, + 'v' => { name => 'vr', code => 1}, + 'k' => { name => 'ky', code => 1}, + 'p' => { name => 'pg', code => 1}, + 't' => { name => 'tp', code => 1} +}; + + +%predefined_index = ( + 'cp', 'c', + 'fn', 'f', + 'vr', 'v', + 'ky', 'k', + 'pg', 'p', + 'tp', 't', + ); + +# +# valid indices +# +%valid_index = ( + 'c', 1, + 'f', 1, + 'v', 1, + 'k', 1, + 'p', 1, + 't', 1, + ); + +# +# texinfo section names to level +# +%sec2level = ( + 'top', 0, + 'chapter', 1, + 'unnumbered', 1, + 'majorheading', 1, + 'chapheading', 1, + 'appendix', 1, + 'section', 2, + 'unnumberedsec', 2, + 'heading', 2, + 'appendixsec', 2, + 'appendixsection', 2, + 'subsection', 3, + 'unnumberedsubsec', 3, + 'subheading', 3, + 'appendixsubsec', 3, + 'subsubsection', 4, + 'unnumberedsubsubsec', 4, + 'subsubheading', 4, + 'appendixsubsubsec', 4, + ); + +# +# accent map, TeX command to ISO name +# +%accent_map = ( + '"', 'uml', + '~', 'tilde', + '^', 'circ', + '`', 'grave', + '\'', 'acute', + ); + +# +# texinfo "simple things" (@foo) to HTML ones +# +%simple_map = ( + # cf. makeinfo.c + "*", "
    ", # HTML+ + " ", " ", + "\t", " ", + "-", "­", # soft hyphen + "\n", "\n", + "|", "", + 'tab', '<\/TD>
    Button Name Go to From 1.2.3 go to
    +EOT + $about .= + ($T2H_ICONS && $T2H_ACTIVE_ICONS{$button} ? + &$T2H_button_icon_img($button, $T2H_ACTIVE_ICONS{$button}) : + " [" . $T2H_NAVIGATION_TEXT{$button} . "] "); + $about .= < + +$button + +$T2H_BUTTONS_GOTO{$button} + +$T2H_BUTTONS_EXAMPLE{$button} +
    ', + # spacing commands + ":", "", + "!", "!", + "?", "?", + ".", ".", + "-", "", + ); + +# +# texinfo "things" (@foo{}) to HTML ones +# +%things_map = ( + 'TeX', 'TeX', + 'br', '

    ', # paragraph break + 'bullet', '*', + 'copyright', '(C)', + 'dots', '...<\/small>', + 'enddots', '....<\/small>', + 'equiv', '==', + 'error', 'error-->', + 'expansion', '==>', + 'minus', '-', + 'point', '-!-', + 'print', '-|', + 'result', '=>', + 'today', $T2H_TODAY, + 'aa', 'å', + 'AA', 'Å', + 'ae', 'æ', + 'oe', 'œ', + 'AE', 'Æ', + 'OE', 'Œ', + 'o', 'ø', + 'O', 'Ø', + 'ss', 'ß', + 'l', '\/l', + 'L', '\/L', + 'exclamdown', '¡', + 'questiondown', '¿', + 'pounds', '£' + ); + +# +# texinfo styles (@foo{bar}) to HTML ones +# +%style_map = ( + 'acronym', '&do_acronym', + 'asis', '', + 'b', 'B', + 'cite', 'CITE', + 'code', 'CODE', + 'command', 'CODE', + 'ctrl', '&do_ctrl', # special case + 'dfn', 'EM', # DFN tag is illegal in the standard + 'dmn', '', # useless + 'email', '&do_email', # insert a clickable email address + 'emph', 'EM', + 'env', 'CODE', + 'file', '"TT', # will put quotes, cf. &apply_style + 'i', 'I', + 'kbd', 'KBD', + 'key', 'KBD', + 'math', '&do_math', + 'option', '"SAMP', # will put quotes, cf. &apply_style + 'r', '', # unsupported + 'samp', '"SAMP', # will put quotes, cf. &apply_style + 'sc', '&do_sc', # special case + 'strong', 'STRONG', + 't', 'TT', + 'titlefont', '', # useless + 'uref', '&do_uref', # insert a clickable URL + 'url', '&do_url', # insert a clickable URL + 'var', 'VAR', + 'w', '', # unsupported + 'H', '&do_accent', + 'dotaccent', '&do_accent', + 'ringaccent','&do_accent', + 'tieaccent', '&do_accent', + 'u','&do_accent', + 'ubaraccent','&do_accent', + 'udotaccent','&do_accent', + 'v', '&do_accent', + ',', '&do_accent', + 'dotless', '&do_accent' + ); + +# +# texinfo format (@foo/@end foo) to HTML ones +# +%format_map = ( + 'quotation', 'BLOCKQUOTE', + # lists + 'itemize', 'UL', + 'enumerate', 'OL', + # poorly supported + 'flushleft', 'PRE', + 'flushright', 'PRE', + ); + +# +# an eval of these $complex_format_map->{what}->[0] yields beginning +# an eval of these $complex_format_map->{what}->[1] yieleds end +$complex_format_map = +{ + example => + [ + q{"$T2H_EXAMPLE_INDENT_CELL
    "},
    +  q{'
    '} + ], + smallexample => + [ + q{"$T2H_SMALL_EXAMPLE_INDENT_CELL
    "},
    +  q{'
    '} + ], + display => + [ + q{"$T2H_EXAMPLE_INDENT_CELL
    '},
    +  q{'
    '} + ], + smalldisplay => + [ + q{"$T2H_SMALL_EXAMPLE_INDENT_CELL
    '},
    +  q{'
    '} + ] +}; + +$complex_format_map->{lisp} = $complex_format_map->{example}; +$complex_format_map->{smalllisp} = $complex_format_map->{smallexample}; +$complex_format_map->{format} = $complex_format_map->{display}; +$complex_format_map->{smallformat} = $complex_format_map->{smalldisplay}; + +# +# texinfo definition shortcuts to real ones +# +%def_map = ( + # basic commands + 'deffn', 0, + 'defvr', 0, + 'deftypefn', 0, + 'deftypevr', 0, + 'defcv', 0, + 'defop', 0, + 'deftp', 0, + # basic x commands + 'deffnx', 0, + 'defvrx', 0, + 'deftypefnx', 0, + 'deftypevrx', 0, + 'defcvx', 0, + 'defopx', 0, + 'deftpx', 0, + # shortcuts + 'defun', 'deffn Function', + 'defmac', 'deffn Macro', + 'defspec', 'deffn {Special Form}', + 'defvar', 'defvr Variable', + 'defopt', 'defvr {User Option}', + 'deftypefun', 'deftypefn Function', + 'deftypevar', 'deftypevr Variable', + 'defivar', 'defcv {Instance Variable}', + 'deftypeivar', 'defcv {Instance Variable}', # NEW: FIXME + 'defmethod', 'defop Method', + 'deftypemethod', 'defop Method', # NEW:FIXME + # x shortcuts + 'defunx', 'deffnx Function', + 'defmacx', 'deffnx Macro', + 'defspecx', 'deffnx {Special Form}', + 'defvarx', 'defvrx Variable', + 'defoptx', 'defvrx {User Option}', + 'deftypefunx', 'deftypefnx Function', + 'deftypevarx', 'deftypevrx Variable', + 'defivarx', 'defcvx {Instance Variable}', + 'defmethodx', 'defopx Method', + ); + +# +# things to skip +# +%to_skip = ( + # comments + 'c', 1, + 'comment', 1, + 'ifnotinfo', 1, + 'ifnottex', 1, + 'ifhtml', 1, + 'end ifhtml', 1, + 'end ifnotinfo', 1, + 'end ifnottex', 1, + # useless + 'detailmenu', 1, + 'direntry', 1, + 'contents', 1, + 'shortcontents', 1, + 'summarycontents', 1, + 'footnotestyle', 1, + 'end ifclear', 1, + 'end ifset', 1, + 'titlepage', 1, + 'end titlepage', 1, + # unsupported commands (formatting) + 'afourpaper', 1, + 'cropmarks', 1, + 'finalout', 1, + 'headings', 1, + 'sp', 1, + 'need', 1, + 'page', 1, + 'setchapternewpage', 1, + 'everyheading', 1, + 'everyfooting', 1, + 'evenheading', 1, + 'evenfooting', 1, + 'oddheading', 1, + 'oddfooting', 1, + 'smallbook', 1, + 'vskip', 1, + 'filbreak', 1, + 'paragraphindent', 1, + # unsupported formats + 'cartouche', 1, + 'end cartouche', 1, + 'group', 1, + 'end group', 1, + ); + +#+++############################################################################ +# # +# Argument parsing, initialisation # +# # +#---############################################################################ + +# +# flush stdout and stderr after every write +# +select(STDERR); +$| = 1; +select(STDOUT); +$| = 1; + + +%value = (); # hold texinfo variables, see also -D +$use_bibliography = 1; +$use_acc = 1; + +# +# called on -init-file +sub LoadInitFile +{ + my $init_file = shift; + # second argument is value of options + $init_file = shift; + if (-f $init_file) + { + print "# reading initialization file from $init_file\n" + if ($T2H_VERBOSE); + require($init_file); + } + else + { + print "$ERROR Error: can't read init file $int_file\n"; + $init_file = ''; + } +} + +# +# called on -lang +sub SetDocumentLanguage +{ + my $lang = shift; + if (! exists($T2H_WORDS->{$lang})) + { + warn "$ERROR: Language specs for '$lang' do not exists. Reverting to '" . + ($T2H_LANG ? T2H_LANG : "en") . "'\n"; + } + else + { + print "# using '$lang' as document language\n" if ($T2H_VERBOSE); + $T2H_LANG = $lang; + } +} + +## +## obsolete cmd line options +## +$T2H_OBSOLETE_OPTIONS -> {'no-section_navigation'} = +{ + type => '!', + linkage => sub {$main::T2H_SECTION_NAVIGATION = 0;}, + verbose => 'obsolete, use -nosec_nav', + noHelp => 2, +}; +$T2H_OBSOLETE_OPTIONS -> {use_acc} = +{ + type => '!', + linkage => \$use_acc, + verbose => 'obsolete', + noHelp => 2 +}; +$T2H_OBSOLETE_OPTIONS -> {expandinfo} = +{ + type => '!', + linkage => sub {$main::T2H_EXPAND = 'info';}, + verbose => 'obsolete, use "-expand info" instead', + noHelp => 2, +}; +$T2H_OBSOLETE_OPTIONS -> {expandtex} = +{ + type => '!', + linkage => sub {$main::T2H_EXPAND = 'tex';}, + verbose => 'obsolete, use "-expand tex" instead', + noHelp => 2, +}; +$T2H_OBSOLETE_OPTIONS -> {monolithic} = +{ + type => '!', + linkage => sub {$main::T2H_SPLIT = '';}, + verbose => 'obsolete, use "-split no" instead', + noHelp => 2 +}; +$T2H_OBSOLETE_OPTIONS -> {split_node} = +{ + type => '!', + linkage => sub{$main::T2H_SPLIT = 'section';}, + verbose => 'obsolete, use "-split section" instead', + noHelp => 2, +}; +$T2H_OBSOLETE_OPTIONS -> {split_chapter} = +{ + type => '!', + linkage => sub{$main::T2H_SPLIT = 'chapter';}, + verbose => 'obsolete, use "-split chapter" instead', + noHelp => 2, +}; +$T2H_OBSOLETE_OPTIONS -> {no_verbose} = +{ + type => '!', + linkage => sub {$main::T2H_VERBOSE = 0;}, + verbose => 'obsolete, use -noverbose instead', + noHelp => 2, +}; +$T2H_OBSOLETE_OPTIONS -> {output_file} = +{ + type => '=s', + linkage => sub {$main::T2H_OUT = @_[1]; $T2H_SPLIT = '';}, + verbose => 'obsolete, use -out_file instead', + noHelp => 2 +}; + +$T2H_OBSOLETE_OPTIONS -> {section_navigation} = +{ + type => '!', + linkage => \$T2H_SECTION_NAVIGATION, + verbose => 'obsolete, use -sec_nav instead', + noHelp => 2, +}; + +$T2H_OBSOLETE_OPTIONS -> {verbose} = +{ + type => '!', + linkage => \$T2H_VERBOSE, + verbose => 'obsolete, use -Verbose instead', + noHelp => 2 +}; + +# read initialzation from $sysconfdir/texi2htmlrc or $HOME/.texi2htmlrc +my $home = $ENV{HOME}; +defined($home) or $home = ''; +foreach $i ('/usr/local/etc/texi2htmlrc', "$home/.texi2htmlrc") { + if (-f $i) { + print "# reading initialization file from $i\n" + if ($T2H_VERBOSE); + require($i); + } +} + + +#+++############################################################################ +# # +# parse command-line options +# # +#---############################################################################ +$T2H_USAGE_TEXT = <getOptions($T2H_OPTIONS, $T2H_USAGE_TEXT, "$THISVERSION\n")) +{ + print $Configure_failed if $Configure_failed; + die $T2H_FAILURE_TEXT; +} + +if (@ARGV > 1) +{ + eval {Getopt::Long::Configure("no_pass_through");}; + if (! $options->getOptions($T2H_OBSOLETE_OPTIONS, $T2H_USAGE_TEXT, "$THISVERSION\n")) + { + print $Configure_failed if $Configure_failed; + die $T2H_FAILURE_TEXT; + } +} + +if ($T2H_CHECK) { + die "Need file to check\n$T2H_FAILURE_TEXT" unless @ARGV > 0; + ✓ + exit; +} + +#+++############################################################################ +# # +# evaluation of cmd line options +# # +#---############################################################################ + +if ($T2H_EXPAND eq 'info') +{ + $to_skip{'ifinfo'} = 1; + $to_skip{'end ifinfo'} = 1; +} +elsif ($T2H_EXPAND eq 'tex') +{ + $to_skip{'iftex'} = 1; + $to_skip{'end iftex'} = 1; + +} + +$T2H_INVISIBLE_MARK = '' if $T2H_INVISIBLE_MARK eq 'xbm'; + +# +# file name buisness +# +die "Need exactly one file to translate\n$T2H_FAILURE_TEXT" unless @ARGV == 1; +$docu = shift(@ARGV); +if ($docu =~ /.*\//) { + chop($docu_dir = $&); + $docu_name = $'; +} else { + $docu_dir = '.'; + $docu_name = $docu; +} +unshift(@T2H_INCLUDE_DIRS, $docu_dir); +$docu_name =~ s/\.te?x(i|info)?$//; # basename of the document +$docu_name = $T2H_PREFIX if ($T2H_PREFIX); + +# subdir +if ($T2H_SUBDIR && ! $T2H_OUT) +{ + $T2H_SUBDIR =~ s|/*$||; + unless (-d "$T2H_SUBDIR" && -w "$T2H_SUBDIR") + { + if ( mkdir($T2H_SUBDIR, oct(755))) + { + print "# created directory $T2H_SUBDIR\n" if ($T2H_VERBOSE); + } + else + { + warn "$ERROR can't create directory $T2H_SUBDIR. Put results into current directory\n"; + $T2H_SUBDIR = ''; + } + } +} + +if ($T2H_SUBDIR && ! $T2H_OUT) +{ + $docu_rdir = "$T2H_SUBDIR/"; + print "# putting result files into directory $docu_rdir\n" if ($T2H_VERBOSE); +} +else +{ + if ($T2H_OUT && $T2H_OUT =~ m|(.*)/|) + { + $docu_rdir = "$1/"; + print "# putting result files into directory $docu_rdir\n" if ($T2H_VERBOSE); + } + else + { + print "# putting result files into current directory \n" if ($T2H_VERBOSE); + $docu_rdir = ''; + } +} + +# extension +if ($T2H_SHORTEXTN) +{ + $docu_ext = "htm"; +} +else +{ + $docu_ext = "html"; +} +if ($T2H_TOP_FILE =~ /\..*$/) +{ + $T2H_TOP_FILE = $`.".$docu_ext"; +} + +# result files +if (! $T2H_OUT && ($T2H_SPLIT =~ /section/i || $T2H_SPLIT =~ /node/i)) +{ + $T2H_SPLIT = 'section'; +} +elsif (! $T2H_OUT && $T2H_SPLIT =~ /chapter/i) +{ + $T2H_SPLIT = 'chapter' +} +else +{ + undef $T2H_SPLIT; +} + +$docu_doc = "$docu_name.$docu_ext"; # document's contents +$docu_doc_file = "$docu_rdir$docu_doc"; +if ($T2H_SPLIT) +{ + $docu_toc = $T2H_TOC_FILE || "${docu_name}_toc.$docu_ext"; # document's table of contents + $docu_stoc = "${docu_name}_ovr.$docu_ext"; # document's short toc + $docu_foot = "${docu_name}_fot.$docu_ext"; # document's footnotes + $docu_about = "${docu_name}_abt.$docu_ext"; # about this document + $docu_top = $T2H_TOP_FILE || $docu_doc; +} +else +{ + if ($T2H_OUT) + { + $docu_doc = $T2H_OUT; + $docu_doc =~ s|.*/||; + } + $docu_toc = $docu_foot = $docu_stoc = $docu_about = $docu_top = $docu_doc; +} + +$docu_toc_file = "$docu_rdir$docu_toc"; +$docu_stoc_file = "$docu_rdir$docu_stoc"; +$docu_foot_file = "$docu_rdir$docu_foot"; +$docu_about_file = "$docu_rdir$docu_about"; +$docu_top_file = "$docu_rdir$docu_top"; + +$docu_frame_file = "$docu_rdir${docu_name}_frame.$docu_ext"; +$docu_toc_frame_file = "$docu_rdir${docu_name}_toc_frame.$docu_ext"; + +# +# variables +# +$value{'html'} = 1; # predefine html (the output format) +$value{'texi2html'} = $THISVERSION; # predefine texi2html (the translator) +# _foo: internal to track @foo +foreach ('_author', '_title', '_subtitle', + '_settitle', '_setfilename', '_shorttitle') { + $value{$_} = ''; # prevent -w warnings +} +%node2sec = (); # node to section name +%sec2node = (); # section to node name +%sec2number = (); # section to number +%number2sec = (); # number to section +%idx2node = (); # index keys to node +%node2href = (); # node to HREF +%node2next = (); # node to next +%node2prev = (); # node to prev +%node2up = (); # node to up +%bib2href = (); # bibliography reference to HREF +%gloss2href = (); # glossary term to HREF +@sections = (); # list of sections +%tag2pro = (); # protected sections + +# +# initial indexes +# +$bib_num = 0; +$foot_num = 0; +$gloss_num = 0; +$idx_num = 0; +$sec_num = 0; +$doc_num = 0; +$html_num = 0; + +# +# can I use ISO8879 characters? (HTML+) +# +if ($T2H_USE_ISO) { + $things_map{'bullet'} = "•"; + $things_map{'copyright'} = "©"; + $things_map{'dots'} = "…"; + $things_map{'equiv'} = "≡"; + $things_map{'expansion'} = "→"; + $things_map{'point'} = "∗"; + $things_map{'result'} = "⇒"; +} + +# +# read texi2html extensions (if any) +# +$extensions = 'texi2html.ext'; # extensions in working directory +if (-f $extensions) { + print "# reading extensions from $extensions\n" if $T2H_VERBOSE; + require($extensions); +} +($progdir = $0) =~ s/[^\/]+$//; +if ($progdir && ($progdir ne './')) { + $extensions = "${progdir}texi2html.ext"; # extensions in texi2html directory + if (-f $extensions) { + print "# reading extensions from $extensions\n" if $T2H_VERBOSE; + require($extensions); + } +} + + +print "# reading from $docu\n" if $T2H_VERBOSE; + +######################################################################### +# +# latex2html stuff +# +# latex2html conversions consist of three stages: +# 1) ToLatex: Put "latex" code into a latex file +# 2) ToHtml: Use latex2html to generate corresponding html code and images +# 3) FromHtml: Extract generated code and images from latex2html run +# + +########################## +# default settings +# + +# defaults for files and names + +sub l2h_Init +{ + local($root) = @_; + + return 0 unless ($root); + + $l2h_name = "${root}_l2h"; + + $l2h_latex_file = "$docu_rdir${l2h_name}.tex"; + $l2h_cache_file = "${docu_rdir}l2h_cache.pm"; + $T2H_L2H_L2H = "latex2html" unless ($T2H_L2H_L2H); + + # destination dir -- generated images are put there, should be the same + # as dir of enclosing html document -- + $l2h_html_file = "$docu_rdir${l2h_name}.html"; + $l2h_prefix = "${l2h_name}_"; + return 1; +} + + +########################## +# +# First stage: Generation of Latex file +# Initialize with: l2h_InitToLatex +# Add content with: l2h_ToLatex($text) --> HTML placeholder comment +# Finish with: l2h_FinishToLatex +# + +$l2h_latex_preample = <$l2h_latex_file")) + { + warn "$ERROR Error l2h: Can't open latex file '$latex_file' for writing\n"; + return 0; + } + print "# l2h: use ${l2h_latex_file} as latex file\n" if ($T2H_VERBOSE); + print L2H_LATEX $l2h_latex_preample; + } + # open database for caching + l2h_InitCache(); + $l2h_latex_count = 0; + $l2h_to_latex_count = 0; + $l2h_cached_count = 0; + return 1; +} + +# print text (1st arg) into latex file (if not already there), return +# HTML commentary which can be later on replaced by the latex2html +# generated text +sub l2h_ToLatex +{ + my($text) = @_; + my($count); + + $l2h_to_latex_count++; + $text =~ s/(\s*)$//; + + # try whether we can cache it + my $cached_text = l2h_FromCache($text); + if ($cached_text) + { + $l2h_cached_count++; + return $cached_text; + } + + # try whether we have text already on things to do + unless ($count = $l2h_to_latex{$text}) + { + $count = $l2h_latex_count; + $l2h_latex_count++; + $l2h_to_latex{$text} = $count; + $l2h_to_latex[$count] = $text; + unless ($T2H_L2H_SKIP) + { + print L2H_LATEX "\\begin{rawhtml}\n"; + print L2H_LATEX "\n"; + print L2H_LATEX "\\end{rawhtml}\n"; + + print L2H_LATEX "$text\n"; + + print L2H_LATEX "\\begin{rawhtml}\n"; + print L2H_LATEX "\n"; + print L2H_LATEX "\\end{rawhtml}\n"; + } + } + return ""; +} + +# print closing into latex file and close it +sub l2h_FinishToLatex +{ + local ($reused); + + $reused = $l2h_to_latex_count - $l2h_latex_count - $l2h_cached_count; + unless ($T2H_L2H_SKIP) + { + print L2H_LATEX $l2h_latex_closing; + close(L2H_LATEX); + } + print "# l2h: finished to latex ($l2h_cached_count cached, $reused reused, $l2h_latex_count contents)\n" if ($T2H_VERBOSE); + unless ($l2h_latex_count) + { + l2h_Finish(); + return 0; + } + return 1; +} + +################################### +# Second stage: Use latex2html to generate corresponding html code and images +# +# l2h_ToHtml([$l2h_latex_file, [$l2h_html_dir]]): +# Call latex2html on $l2h_latex_file +# Put images (prefixed with $l2h_name."_") and html file(s) in $l2h_html_dir +# Return 1, on success +# 0, otherwise +# +sub l2h_ToHtml +{ + local($call, $ext, $root, $dotbug); + + if ($T2H_L2H_SKIP) + { + print "# l2h: skipping latex2html run\n" if ($T2H_VERBOSE); + return 1; + } + + # Check for dot in directory where dvips will work + if ($T2H_L2H_TMP) + { + if ($T2H_L2H_TMP =~ /\./) + { + warn "$ERROR Warning l2h: l2h_tmp dir contains a dot. Use /tmp, instead\n"; + $dotbug = 1; + } + } + else + { + if (&getcwd =~ /\./) + { + warn "$ERROR Warning l2h: current dir contains a dot. Use /tmp as l2h_tmp dir \n"; + $dotbug = 1; + } + } + # fix it, if necessary and hope that it works + $T2H_L2H_TMP = "/tmp" if ($dotbug); + + $call = $T2H_L2H_L2H; + # use init file, if specified + $call = $call . " -init_file " . $init_file if ($init_file && -f $init_file); + # set output dir + $call .= ($docu_rdir ? " -dir $docu_rdir" : " -no_subdir"); + # use l2h_tmp, if specified + $call = $call . " -tmp $T2H_L2H_TMP" if ($T2H_L2H_TMP); + # options we want to be sure of + $call = $call ." -address 0 -info 0 -split 0 -no_navigation -no_auto_link"; + $call = $call ." -prefix ${l2h_prefix} $l2h_latex_file"; + + print "# l2h: executing '$call'\n" if ($T2H_VERBOSE); + if (system($call)) + { + warn "l2h ***Error: '${call}' did not succeed\n"; + return 0; + } + else + { + print "# l2h: latex2html finished successfully\n" if ($T2H_VERBOSE); + return 1; + } +} + +# this is directly pasted over from latex2html +sub getcwd { + local($_) = `pwd`; + + die "'pwd' failed (out of memory?)\n" + unless length; + chop; + $_; +} + + +########################## +# Third stage: Extract generated contents from latex2html run +# Initialize with: l2h_InitFromHtml +# open $l2h_html_file for reading +# reads in contents into array indexed by numbers +# return 1, on success -- 0, otherwise +# Extract Html code with: l2h_FromHtml($text) +# replaces in $text all previosuly inserted comments by generated html code +# returns (possibly changed) $text +# Finish with: l2h_FinishFromHtml +# closes $l2h_html_dir/$l2h_name.".$docu_ext" + +sub l2h_InitFromHtml +{ + local($h_line, $h_content, $count, %l2h_img); + + if (! open(L2H_HTML, "<${l2h_html_file}")) + { + print "$ERROR Error l2h: Can't open ${l2h_html_file} for reading\n"; + return 0; + } + print "# l2h: use ${l2h_html_file} as html file\n" if ($T2H_VERBOSE); + + $l2h_html_count = 0; + + while ($h_line = ) + { + if ($h_line =~ /^/) + { + $count = $1; + $h_content = ""; + while ($h_line = ) + { + if ($h_line =~ /^/) + { + chomp $h_content; + chomp $h_content; + $l2h_html_count++; + $h_content = l2h_ToCache($count, $h_content); + $l2h_from_html[$count] = $h_content; + $h_content = ''; + last; + } + $h_content = $h_content.$h_line; + } + if ($hcontent) + { + print "$ERROR Warning l2h: l2h_end $l2h_name $count not found\n" + if ($T2H_VERBOSE); + close(L2H_HTML); + return 0; + } + } + } + print "# l2h: Got $l2h_html_count of $l2h_latex_count html contents\n" + if ($T2H_VERBOSE); + + close(L2H_HTML); + return 1; +} + +sub l2h_FromHtml +{ + local($text) = @_; + local($done, $to_do, $count); + + $to_do = $text; + + while ($to_do =~ /([^\000]*)([^\000]*)/) + { + $to_do = $1; + $count = $2; + $done = $3.$done; + + $done = "".$done + if ($T2H_DEBUG & $DEBUG_L2H); + + $done = &l2h_ExtractFromHtml($count) . $done; + + $done = "".$done + if ($T2H_DEBUG & $DEBUG_L2H); + } + return $to_do.$done; +} + + +sub l2h_ExtractFromHtml +{ + local($count) = @_; + + return $l2h_from_html[$count] if ($l2h_from_html[$count]); + + if ($count >= 0 && $count < $l2h_latex_count) + { + # now we are in trouble + local($l_l2h, $_); + + $l2h_extract_error++; + print "$ERROR l2h: can't extract content $count from html\n" + if ($T2H_VERBOSE); + # try simple (ordinary) substition (without l2h) + $l_l2h = $T2H_L2H; + $T2H_L2H = 0; + $_ = $l2h_to_latex{$count}; + $_ = &substitute_style($_); + &unprotect_texi; + $_ = "" . $_ + if ($T2H_DEBUG & $DEBUG_L2H); + $T2H_L2H = $l_l2h; + return $_; + } + else + { + # now we have been incorrectly called + $l2h_range_error++; + print "$ERROR l2h: Request of $count content which is out of valide range [0,$l2h_latex_count)\n"; + return "" + if ($T2H_DEBUG & $DEBUG_L2H); + return ""; + } +} + +sub l2h_FinishFromHtml +{ + if ($T2H_VERBOSE) + { + if ($l2h_extract_error + $l2h_range_error) + { + print "# l2h: finished from html ($l2h_extract_error extract and $l2h_range_error errors)\n"; + } + else + { + print "# l2h: finished from html (no errors)\n"; + } + } +} + +sub l2h_Finish +{ + l2h_StoreCache(); + if ($T2H_L2H_CLEAN) + { + print "# l2h: removing temporary files generated by l2h extension\n" + if $T2H_VERBOSE; + while (<"$docu_rdir$l2h_name"*>) + { + unlink $_; + } + } + print "# l2h: Finished\n" if $T2H_VERBOSE; + return 1; +} + +############################## +# stuff for l2h caching +# + +# I tried doing this with a dbm data base, but it did not store all +# keys/values. Hence, I did as latex2html does it +sub l2h_InitCache +{ + if (-r "$l2h_cache_file") + { + my $rdo = do "$l2h_cache_file"; + warn("$ERROR l2h Error: could not load $docu_rdir$l2h_cache_file: $@\n") + unless ($rdo); + } +} + +sub l2h_StoreCache +{ + return unless $l2h_latex_count; + + my ($key, $value); + open(FH, ">$l2h_cache_file") || return warn"$ERROR l2h Error: could not open $docu_rdir$l2h_cache_file for writing: $!\n"; + + + while (($key, $value) = each %l2h_cache) + { + # escape stuff + $key =~ s|/|\\/|g; + $key =~ s|\\\\/|\\/|g; + # weird, a \ at the end of the key results in an error + # maybe this also broke the dbm database stuff + $key =~ s|\\$|\\\\|; + $value =~ s/\|/\\\|/g; + $value =~ s/\\\\\|/\\\|/g; + $value =~ s|\\\\|\\\\\\\\|g; + print FH "\n\$l2h_cache_key = q/$key/;\n"; + print FH "\$l2h_cache{\$l2h_cache_key} = q|$value|;\n"; + } + print FH "1;"; + close(FH); +} + +# return cached html, if it exists for text, and if all pictures +# are there, as well +sub l2h_FromCache +{ + my $text = shift; + my $cached = $l2h_cache{$text}; + if ($cached) + { + while ($cached =~ m/SRC="(.*?)"/g) + { + unless (-e "$docu_rdir$1") + { + return undef; + } + } + return $cached; + } + return undef; +} + +# insert generated html into cache, move away images, +# return transformed html +$maximage = 1; +sub l2h_ToCache +{ + my $count = shift; + my $content = shift; + my @images = ($content =~ /SRC="(.*?)"/g); + my ($src, $dest); + + for $src (@images) + { + $dest = $l2h_img{$src}; + unless ($dest) + { + my $ext; + if ($src =~ /.*\.(.*)$/ && $1 ne $docu_ext) + { + $ext = $1; + } + else + { + warn "$ERROR: L2h image $src has invalid extension\n"; + next; + } + while (-e "$docu_rdir${docu_name}_$maximage.$ext") { $maximage++;} + $dest = "${docu_name}_$maximage.$ext"; + system("cp -f $docu_rdir$src $docu_rdir$dest"); + $l2h_img{$src} = $dest; + unlink "$docu_rdir$src" unless ($DEBUG & DEBUG_L2H); + } + $content =~ s/$src/$dest/g; + } + $l2h_cache{$l2h_to_latex[$count]} = $content; + return $content; +} + + +#+++############################################################################ +# # +# Pass 1: read source, handle command, variable, simple substitution # +# # +#---############################################################################ + +@lines = (); # whole document +@toc_lines = (); # table of contents +@stoc_lines = (); # table of contents +$curlevel = 0; # current level in TOC +$node = ''; # current node name +$node_next = ''; # current node next name +$node_prev = ''; # current node prev name +$node_up = ''; # current node up name +$in_table = 0; # am I inside a table +$table_type = ''; # type of table ('', 'f', 'v', 'multi') +@tables = (); # nested table support +$in_bibliography = 0; # am I inside a bibliography +$in_glossary = 0; # am I inside a glossary +$in_top = 0; # am I inside the top node +$has_top = 0; # did I see a top node? +$has_top_command = 0; # did I see @top for automatic pointers? +$in_pre = 0; # am I inside a preformatted section +$in_list = 0; # am I inside a list +$in_html = 0; # am I inside an HTML section +$first_line = 1; # is it the first line +$dont_html = 0; # don't protect HTML on this line +$deferred_ref = ''; # deferred reference for indexes +@html_stack = (); # HTML elements stack +$html_element = ''; # current HTML element +&html_reset; +%macros = (); # macros + +# init l2h +$T2H_L2H = &l2h_Init($docu_name) if ($T2H_L2H); +$T2H_L2H = &l2h_InitToLatex if ($T2H_L2H); + +# build code for simple substitutions +# the maps used (%simple_map and %things_map) MUST be aware of this +# watch out for regexps, / and escaped characters! +$subst_code = ''; +foreach (keys(%simple_map)) { + ($re = $_) =~ s/(\W)/\\$1/g; # protect regexp chars + $subst_code .= "s/\\\@$re/$simple_map{$_}/g;\n"; +} +foreach (keys(%things_map)) { + $subst_code .= "s/\\\@$_\\{\\}/$things_map{$_}/g;\n"; +} +if ($use_acc) { + # accentuated characters + foreach (keys(%accent_map)) { + if ($_ eq "`") { + $subst_code .= "s/$;3"; + } elsif ($_ eq "'") { + $subst_code .= "s/$;4"; + } else { + $subst_code .= "s/\\\@\\$_"; + } + $subst_code .= "([a-z])/&\${1}$accent_map{$_};/gi;\n"; + } +} +eval("sub simple_substitutions { $subst_code }"); + +&init_input; +INPUT_LINE: while ($_ = &next_line) { + # + # remove \input on the first lines only + # + if ($first_line) { + next if /^\\input/; + $first_line = 0; + } + # non-@ substitutions cf. texinfmt.el + # + # parse texinfo tags + # + $tag = ''; + $end_tag = ''; + if (/^\s*\@end\s+(\w+)\b/) { + $end_tag = $1; + } elsif (/^\s*\@(\w+)\b/) { + $tag = $1; + } + # + # handle @html / @end html + # + if ($in_html) { + if ($end_tag eq 'html') { + $in_html = 0; + } else { + $tag2pro{$in_html} .= $_; + } + next; + } elsif ($tag eq 'html') { + $in_html = $PROTECTTAG . ++$html_num; + push(@lines, $in_html); + next; + } + + # + # try to remove inlined comments + # syntax from tex-mode.el comment-start-skip + # + s/((^|[^\@])(\@\@)*)\@c(omment | |\{|$).*/$1/; + +# Sometimes I use @c right at the end of a line ( to suppress the line feed ) +# s/((^|[^\@])(\@\@)*)\@c(omment)?$/$1/; +# s/((^|[^\@])(\@\@)*)\@c(omment)? .*/$1/; +# s/(.*)\@c{.*?}(.*)/$1$2/; +# s/(.*)\@comment{.*?}(.*)/$1$2/; +# s/^(.*)\@c /$1/; +# s/^(.*)\@comment /$1/; + + ############################################################# + # value substitution before macro expansion, so that + # it works in macro arguments + s/\@value{($VARRE)}/$value{$1}/eg; + + ############################################################# + # macro substitution + while (/\@(\w+)/g) + { + if (exists($macros->{$1})) + { + my $before = $`; + my $name = $1; + my $after = $'; + my @args; + my $args; + if ($after =~ /^\s*{(.*?[^\\])}(.*)/) + { + $args = $1; + $after = $2; + } + elsif (@{$macros->{$name}->{Args}} == 1) + { + $args = $after; + $args =~ s/^\s*//; + $args =~ s/\s*$//; + $after = ''; + } + $args =~ s|\\\\|\\|g; + $args =~ s|\\{|{|g; + $args =~ s|\\}|}|g; + if (@{$macros->{$name}->{Args}} > 1) + { + $args =~ s/(^|[^\\]),/$1$;/g ; + $args =~ s|\\,|,|g; + @args = split(/$;\s*/, $args) if (@{$macros->{$name}->{Args}} > 1); + } + else + { + $args =~ s|\\,|,|g; + @args = ($args); + } + my $macrobody = $macros->{$name}->{Body}; + for ($i=0; $i<=$#args; $i++) + { + $macrobody =~ s|\\$macros->{$name}->{Args}->[$i]\\|$args[$i]|g; + } + $macrobody =~ s|\\\\|\\|g; + $_ = $before . $macrobody . $after; + unshift @input_spool, map {$_ = $_."\n"} split(/\n/, $_); + next INPUT_LINE; + } + } # + + + # + # try to skip the line + # + if ($end_tag) { + $in_titlepage = 0 if $end_tag eq 'titlepage'; + next if $to_skip{"end $end_tag"}; + } elsif ($tag) { + $in_titlepage = 1 if $tag eq 'titlepage'; + next if $to_skip{$tag}; + last if $tag eq 'bye'; + } + if ($in_top) { + # parsing the top node + if ($tag eq 'node' || + ($sec2level{$tag} && $tag !~ /unnumbered/ && $tag !~ /heading/)) + { + # no more in top + $in_top = 0; + push(@lines, $TOPEND); + } + } + unless ($in_pre) { + s/``/\"/g; + s/''/\"/g; + s/([\w ])---([\w ])/$1--$2/g; + } + # + # analyze the tag + # + if ($tag) { + # skip lines + &skip_until($tag), next if $tag eq 'ignore'; + &skip_until($tag), next if $tag eq 'ifnothtml'; + if ($tag eq 'ifinfo') + { + &skip_until($tag), next unless $T2H_EXPAND eq 'info'; + } + if ($tag eq 'iftex') + { + &skip_until($tag), next unless $T2H_EXPAND eq 'tex'; + } + if ($tag eq 'tex') + { + # add to latex2html file + if ($T2H_EXPAND eq 'tex' && $T2H_L2H && ! $in_pre) + { + # add space to the end -- tex(i2dvi) does this, as well + push(@lines, &l2h_ToLatex(&string_until($tag) . " ")); + } + else + { + &skip_until($tag); + } + next; + } + if ($tag eq 'titlepage') + { + next; + } + # handle special tables + if ($tag =~ /^(|f|v|multi)table$/) { + $table_type = $1; + $tag = 'table'; + } + # special cases + if ($tag eq 'top' || ($tag eq 'node' && /^\@node\s+top\s*,/i)) { + $in_top = 1; + $has_top = 1; + $has_top_command = 1 if $tag eq 'top'; + @lines = (); # ignore all lines before top (title page garbage) + next; + } elsif ($tag eq 'node') { + if ($in_top) + { + $in_top = 0; + push(@lines, $TOPEND); + } + warn "$ERROR Bad node line: $_" unless $_ =~ /^\@node\s$NODESRE$/o; + # request of "Richard Y. Kim" + s/^\@node\s+//; + $_ = &protect_html($_); # if node contains '&' for instance + ($node, $node_next, $node_prev, $node_up) = split(/,/); + &normalise_node($node); + &normalise_node($node_next); + &normalise_node($node_prev); + &normalise_node($node_up); + $node =~ /\"/ ? + push @lines, &html_debug("\n", __LINE__) : + push @lines, &html_debug("\n", __LINE__); + next; + } elsif ($tag eq 'include') { + if (/^\@include\s+($FILERE)\s*$/o) { + $file = LocateIncludeFile($1); + if ($file && -e $file) { + &open($file); + print "# including $file\n" if $T2H_VERBOSE; + } else { + warn "$ERROR Can't find $1, skipping"; + } + } else { + warn "$ERROR Bad include line: $_"; + } + next; + } elsif ($tag eq 'ifclear') { + if (/^\@ifclear\s+($VARRE)\s*$/o) { + next unless defined($value{$1}); + &skip_until($tag); + } else { + warn "$ERROR Bad ifclear line: $_"; + } + next; + } elsif ($tag eq 'ifset') { + if (/^\@ifset\s+($VARRE)\s*$/o) { + next if defined($value{$1}); + &skip_until($tag); + } else { + warn "$ERROR Bad ifset line: $_"; + } + next; + } elsif ($tag eq 'menu') { + unless ($T2H_SHOW_MENU) { + &skip_until($tag); + next; + } + &html_push_if($tag); + push(@lines, &html_debug('', __LINE__)); + } elsif ($format_map{$tag}) { + $in_pre = 1 if $format_map{$tag} eq 'PRE'; + &html_push_if($format_map{$tag}); + push(@lines, &html_debug('', __LINE__)); + $in_list++ if $format_map{$tag} eq 'UL' || $format_map{$tag} eq 'OL' ; +# push(@lines, &debug("

    \n", __LINE__)) +# if $tag =~ /example/i; + # sunshine@sunshineco.com:
    bla
    looks better than + #
    \nbla
    (at least on NeXTstep browser + push(@lines, &debug("<$format_map{$tag}>" . + ($in_pre ? '' : "\n"), __LINE__)); + next; + } + elsif (exists $complex_format_map->{$tag}) + { + my $start = eval $complex_format_map->{$tag}->[0]; + if ($@) + { + print "$ERROR: eval of complex_format_map->{$tag}->[0] $complex_format_map->{$tag}->[0]: $@"; + $start = '
    '
    +	  }
    +	  $in_pre = 1 if $start =~ /
    \n", __LINE__));
    +		    &html_push_if('TABLE');
    +		} else {
    +		    push(@lines, &debug("
    \n", __LINE__)); + &html_push_if('DL'); + } + push(@lines, &html_debug('', __LINE__)); + } else { + warn "$ERROR Bad table line: $_"; + } + next; + } + elsif ($tag eq 'synindex' || $tag eq 'syncodeindex') + { + if (/^\@$tag\s+(\w+)\s+(\w+)\s*$/) + { + my $from = $1; + my $to = $2; + my $prefix_from = IndexName2Prefix($from); + my $prefix_to = IndexName2Prefix($to); + + warn("$ERROR unknown from index name $from ind syn*index line: $_"), next + unless $prefix_from; + warn("$ERROR unknown to index name $to ind syn*index line: $_"), next + unless $prefix_to; + + if ($tag eq 'syncodeindex') + { + $index_properties->{$prefix_to}->{'from_code'}->{$prefix_from} = 1; + } + else + { + $index_properties->{$prefix_to}->{'from'}->{$prefix_from} = 1; + } + } + else + { + warn "$ERROR Bad syn*index line: $_"; + } + next; + } + elsif ($tag eq 'defindex' || $tag eq 'defcodeindex') + { + if (/^\@$tag\s+(\w+)\s*$/) + { + my $name = $1; + $index_properties->{$name}->{name} = $name; + $index_properties->{$name}->{code} = 1 if $tag eq 'defcodeindex'; + } + else + { + warn "$ERROR Bad defindex line: $_"; + } + next; + } + elsif (/^\@printindex/) + { + push (@lines, "$_"); + next; + } + elsif ($tag eq 'sp') { + push(@lines, &debug("

    \n", __LINE__)); + next; + } elsif ($tag eq 'center') { + push(@lines, &debug("

    \n", __LINE__)); + s/\@center//; + } elsif ($tag eq 'setref') { + &protect_html; # if setref contains '&' for instance + if (/^\@$tag\s*{($NODERE)}\s*$/) { + $setref = $1; + $setref =~ s/\s+/ /g; # normalize + $setref =~ s/ $//; + $node2sec{$setref} = $name; + $sec2node{$name} = $setref; + $node2href{$setref} = "$docu_doc#$docid"; + } else { + warn "$ERROR Bad setref line: $_"; + } + next; + } elsif ($tag eq 'lowersections') { + local ($sec, $level); + while (($sec, $level) = each %sec2level) { + $sec2level{$sec} = $level + 1; + } + next; + } elsif ($tag eq 'raisesections') { + local ($sec, $level); + while (($sec, $level) = each %sec2level) { + $sec2level{$sec} = $level - 1; + } + next; + } + elsif ($tag eq 'macro' || $tag eq 'rmacro') + { + if (/^\@$tag\s*(\w+)\s*(.*)/) + { + my $name = $1; + my @args; + @args = split(/\s*,\s*/ , $1) + if ($2 =~ /^\s*{(.*)}\s*/); + + $macros->{$name}->{Args} = \@args; + $macros->{$name}->{Body} = ''; + while (($_ = &next_line) && $_ !~ /\@end $tag/) + { + $macros->{$name}->{Body} .= $_; + } + die "ERROR: No closing '\@end $tag' found for macro definition of '$name'\n" + unless (/\@end $tag/); + chomp $macros->{$name}->{Body}; + } + else + { + warn "$ERROR: Bad macro defintion $_" + } + next; + } + elsif ($tag eq 'unmacro') + { + delete $macros->{$1} if (/^\@unmacro\s*(\w+)/); + next; + } + elsif ($tag eq 'documentlanguage') + { + SetDocumentLanguage($1) if (!$T2H_LANG && /documentlanguage\s*(\w+)/); + } + elsif (defined($def_map{$tag})) { + if ($def_map{$tag}) { + s/^\@$tag\s+//; + $tag = $def_map{$tag}; + $_ = "\@$tag $_"; + $tag =~ s/\s.*//; + } + } elsif (defined($user_sub{$tag})) { + s/^\@$tag\s+//; + $sub = $user_sub{$tag}; + print "# user $tag = $sub, arg: $_" if $T2H_DEBUG & $DEBUG_USER; + if (defined(&$sub)) { + chop($_); + &$sub($_); + } else { + warn "$ERROR Bad user sub for $tag: $sub\n"; + } + next; + } + if (defined($def_map{$tag})) { + s/^\@$tag\s+//; + if ($tag =~ /x$/) { + # extra definition line + $tag = $`; + $is_extra = 1; + } else { + $is_extra = 0; + } + while (/\{([^\{\}]*)\}/) { + # this is a {} construct + ($before, $contents, $after) = ($`, $1, $'); + # protect spaces + $contents =~ s/\s+/$;9/g; + # restore $_ protecting {} + $_ = "$before$;7$contents$;8$after"; + } + @args = split(/\s+/, &protect_html($_)); + foreach (@args) { + s/$;9/ /g; # unprotect spaces + s/$;7/\{/g; # ... { + s/$;8/\}/g; # ... } + } + $type = shift(@args); + $type =~ s/^\{(.*)\}$/$1/; + print "# def ($tag): {$type} ", join(', ', @args), "\n" + if $T2H_DEBUG & $DEBUG_DEF; + $type .= ':'; # it's nicer like this + my $name = shift(@args); + $name =~ s/^\{(.*)\}$/$1/; + if ($is_extra) { + $_ = &debug("
    ", __LINE__); + } else { + $_ = &debug("
    \n
    ", __LINE__); + } + if ($tag eq 'deffn' || $tag eq 'defvr' || $tag eq 'deftp') { + $_ .= "$type $name"; + $_ .= " @args" if @args; + } elsif ($tag eq 'deftypefn' || $tag eq 'deftypevr' + || $tag eq 'defcv' || $tag eq 'defop') { + $ftype = $name; + $name = shift(@args); + $name =~ s/^\{(.*)\}$/$1/; + $_ .= "$type $ftype $name"; + $_ .= " @args" if @args; + } else { + warn "$ERROR Unknown definition type: $tag\n"; + $_ .= "$type $name"; + $_ .= " @args" if @args; + } + $_ .= &debug("\n
    ", __LINE__); + $name = &unprotect_html($name); + if ($tag eq 'deffn' || $tag eq 'deftypefn') { + EnterIndexEntry('f', $name, $docu_doc, $section, \@lines); +# unshift(@input_spool, "\@findex $name\n"); + } elsif ($tag eq 'defop') { + EnterIndexEntry('f', "$name on $ftype", $docu_doc, $section, \@lines); +# unshift(@input_spool, "\@findex $name on $ftype\n"); + } elsif ($tag eq 'defvr' || $tag eq 'deftypevr' || $tag eq 'defcv') { + EnterIndexEntry('v', $name, $docu_doc, $section, \@lines); +# unshift(@input_spool, "\@vindex $name\n"); + } else { + EnterIndexEntry('t', $name, $docu_doc, $section, \@lines); +# unshift(@input_spool, "\@tindex $name\n"); + } + $dont_html = 1; + } + } elsif ($end_tag) { + if ($format_map{$end_tag}) { + $in_pre = 0 if $format_map{$end_tag} eq 'PRE'; + $in_list-- if $format_map{$end_tag} eq 'UL' || $format_map{$end_tag} eq 'OL' ; + &html_pop_if('P'); + &html_pop_if('LI'); + &html_pop_if(); + push(@lines, &debug("\n", __LINE__)); + push(@lines, &html_debug('', __LINE__)); + } + elsif (exists $complex_format_map->{$end_tag}) + { + my $end = eval $complex_format_map->{$end_tag}->[1]; + if ($@) + { + print "$ERROR: eval of complex_format_map->{$end_tag}->[1] $complex_format_map->{$end_tag}->[0]: $@"; + $end = '
    ' + } + $in_pre = 0 if $end =~ m|
    |; + push(@lines, html_debug($end, __LINE__)); + } elsif ($end_tag =~ /^(|f|v|multi)table$/) { + unless (@tables) { + warn "$ERROR \@end $end_tag without \@*table\n"; + next; + } + &html_pop_if('P'); + ($table_type, $in_table) = split($;, shift(@tables)); + unless ($1 eq $table_type) { + warn "$ERROR \@end $end_tag without matching \@$end_tag\n"; + next; + } + if ($table_type eq "multi") { + push(@lines, "
    \n"); + &html_pop_if('TR'); + } else { + push(@lines, "

    |X5OQn$ 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

    `>$=+PpM%oS9s;GIJq1cv zo?ii_E6?wOQhgtTQhomdrTV@GrTVyYNcD9ArTUHpr7O=7P`dIw43v&sCxX(}dlo32 zxpKW(SDyJ2l&(BK>G=K;l(zCegBl?D!kMtP@=qMzXAX4$l;%(nnST}T!qyM8a^1h+ zYvs9+g(!Xj7MImuS~&+2I2{*n6vWXUpG-HUkA<5DLED`~dPNnFKBYFGt7 zbFyuTrAt3@mb5JWl(hb1ONqs`pNW8t9uUjjbZKA!p4^yCIeYOu<%xa$se-Fg*df^# ze;&(AVLTu*#wE&^htjbigE*xD2z>~pr#aNN>*#Kw#!nG_40zNBOHaP=moS0exzymN zShLM4*VYMNLOZ^=g{_nkB14)lB_LiA`# z@W^_K)2n@a*&vA@CqnyXCimkUcHgk%e(b0B9h2OT(}I29VgGlM@HnF0_kMCePC@oP zpTrMu)`4qhC_m@r6fde2-Wfxc3N^6qm+$M2E9y<3Sm&o$^Q6=rG|L$~Lb(E@Woe&F zp2<>v2KXfGtHCa5{TR!jky-6EJpxVjhq^`2L_8vU0n`&Xd4OaD2G_GA0}Gj0vW@0N zT90tnKhy0xkq~O^489VOyuM-iHD_jPXT%4u&6sMA3XQbIQQJceCrX@-#8x*<#{H4d z830;W?!K21*ZM= z8Lj(xHp+L#%_IX4sPUzP=n6=g1E-wBk1|`UutX4^X^>bV=F-b}4X=uumxkI8a%UsR zgYof0?I%$Z=%rm$5(zdr$?-jtpOES3mOLkAA#)nQ?Q;njoEQg|Gc&MsdB zrB96B0;Ln{k3sRskg)YNC~n+;QCyEf18gunh&J`7#j{BN>(td@7IgT=Lnu>4!S`*WN@kL6T%nw{i?p z;{hIW6~j66XSZw#HZ)h@ixZL21ERe~kB-)j9)~{qoV7Wl=i~3iYctI!Cf?grINH45 z<;?_Gt90z~^JId(b<(P?(xn1E$b!9l646qIlVO<#Yu1`%kyi4J#|1($K0y4l%K!6S zQX^rMa!2h*x>YJ_9_t}A9_oh^3Vd6pn(9V#?RTCN<#cnP2M5JkWK%$Ck#UJmi);}n zEuM=(X_3W2X+iy$<9jzKm3keq&aNw4RhqistTkrN@h>)VHlr)v9GvNs zyOTk&{s(1YQCGYN;GToYpjCjY&V)FxS01za2_zC9p#r6&_SvAAG5F52gIf$rmnWkR z?jpzcGRK#FliIx>Ilgx~z98f?h5TzDP&y4EIUk7*HQWoYO=B@;zYRnczI)N`L2Vfx z)Mhj^N6(M{Y4oUQZo-4wvOpOg)P5M>;XJ5C9~>9(5BIY z=f=`sNFO|C+^82fe1Y+U`KFRn#WOdJ#V4=Kya9R<-a$sKaS;ZsIPbg~F+4}|ZZjyR zBP>V8xYg}Z@agP_F+5B!!y3r5B-F$Dz76j}1n_XsJQy5!zIqhl!*i<#E?v+$yVhz0 zCe12Zv~YfOU_Q5=8_vK5STTvN6;1^OGU?w^4R7M>SdoX6!rG4W}ED_l=Q4Lq-| z&SoNl(DP}AeeeB?Uc%Z7AHj$R`>PLq95(Fte4JWv{^sMX24}aAQxDD?4rieAp&;oz z5uZ#Z5AMtFYJRK~udHEQ|7W}yCriFG$M)@VUIdq)KXcSS02=D{fxRDNuo)eA4z4hBL*{4RjV~j##Af=^KN*_cL zp|k(B!|W_E^2RVzFoO+d_Rt4+xoD1Z=rR$XG@oYns(#Ix37Tof(*iHxN*nNI|9?N> zYF=VAXNl%oEYFp$S!h?_c4?rF(DZ_*>nybBswxj6cU{mC^$2^XY#6(knl4 zr5-R+#Aq&lU^trdl=#-i@#ZS6oImYZ32A4F(*m51Qq3*Le!bRBd&m@AcPr8^S2+g;85jOLsK&9vu!%{d90*)gUCSaVsEnx4M*Wmhxb>!LeC zG?U_90(FsgIo}iPv;ePkfB(@7>+D>%tffYZzDnNY=po0O&n$6&oR3I|GbiV1fnr?Q z_Qv1v5ekPnPIs5ld?ezm&#!>IMUU_0T&%HM$Ztm zFWjk~ys3i+4;?;KK2-1FoH0T^qNg0n&$QKx9&e6u2$mM0^`Ps0&uy?9cG}N1Qp8B; zgA0+0jkrrp1&YU`=j_ve@v*Dta-)YBqo)A*oK(*VqK6ibF87x=cx><8Mh`JY4@@b0 zqr~{odb?#hr^iYJZl~)xqlXyPGolc!C8?f>=&|$XnKw>)%GL9((L;>UGaMgg!Chi} zP7*z||8xW1n!nuDBh3k1VvHW-^BmkI>gf$G`cqu#VyE}=)bJD8Ea8YTdXUevahIs) zWN_Vb|L67zbKUryY4i|d^dO(7CDoJX(^C^!f@WmrbFI-sjOrPVd@fC@r;q5d%l(~| zA71V1*<|z(WAq@O$0pTtis-S+YvuEcf9LAC%jhA-=s`Y@NUEo==&|#;*Kq}C=ytkx z7(K)oJ;-PF>YC5mDhuQj$|mPMq**i`+I>Gv#DwuTCugRdgT|S`RwSFI)&`(XU zey52P`&qiQk4~v@F&7Y@eQt?h%tD?`0ZhT zaMA+oRq2j+``SuZs>DbUe*`a5M%Vfit^yaL_LEn>j5>iN0RLyYRlKLcZ}Kr%h~qQ@Rb?R!7| zwX5eNzn8PdH-y zp`#K*$}aaSuiKpMN=-3R#F)?#kvo%yK2-E{!Ikd$v8AuOdR7}f#HgMTsE2&7E-@AG zKzvNawKk6aQ9WJy z-U?J++XB33^bq3@oz}#a`u&-ikGWDG87X4?QYc7|)a1UeAX#=;olF#nQQnDmq^w9g zJs3JbkEtluUEfur%G-Jd7%5_uH!-E2QKF|0u5{0CKH=B44EiM_MT|ccqrq`UGTAjh zDs`o9F;c|%rN)Sq$r`KjiF>YcrG8_ih|%&Iifm}aot75}>lI%r$oZ>};~njAwZ!c` zKYFpg)(z`pBSnnnPr7aX6Y`mTPg(%YL)^0U+tFz3eC}zah%s?SQ=5r9jWb7sL(%ld zc{muwjTmmd0TremdiskZ;QXWIQxp0N>Pic|i)&B(&boW)TDQMA!^CGCQh^QyZjvuu zAg(sIksY#Gc= zjTABd8dVIA&QmD$@4cUU#%#xTAVhmyq+Q;=p{0EA8f2 zS3LBIoAV2d=2FRdlzRck&kq16QuvD=*cZBBU>fH+7~#O^&h~Rqqo(*cBVf{)qpDd( zAce!N?GDGAt}<}_=_*Y~*F?co;L4V{f6woCxaqpi#CamprFr->Un;ycVUp;H;7WJP znRUmwCHSb3A_gVssq-B5_+vORA%;wUT3}HCS5Wsa8VPN<5%-1BJVkPztYDV^*dOO932~k-n9+zPM;H$mWIXT2x!7o)jyRi| z>5Cx*tmO%uD-t+c6F9dgaDJV@Y4LHqxiLfHY>$Y3dgzhAy1DU*ks?OpoMR8=oK*Dl zalEBmE}C<2MTUr*o{(d-n`wc2aAkA9V8`$7b6!(+ zt{PEt(KCH6wPmoPYov(LblvLHLy2D`a31qCupt`Ob;jvgZljMC&L8Un%_2>t3)%rt%FV~BJFB;wdnDdS5-n- zX9~50$4SK~!(oV8 zf@MCAw#!)-TVTIb@Azh9mYjyw9AAARR;SL!$;MT}qSJdrX6 z-P*kVn18uag+_`Pzts6YskUxQj&-HZGE&6&r55<4>RxL8qbs%6NDuy8^|_HE#xJ$h7uH|SSl`c;>c-&?95H^WW#G6myyfeU2fI?I87X2Q<>~R4iT(BjEM?z zj6DnU;L*Q){JE?78KZfvXok17%W$lOu-3uXpYv-I!dfpF&VOl*`((cTdpE3ijpp^x zoCaTf56%}BIT`jK2(-V>Uj$BC;0S`?rrdq!vs${mJJLuIskGTnS1$7{nkz}JoQx$~;)-8io?QpBj9JN$Y)Ef>S4 zcB!}|Ar%`1!pE=$n7F+uYt!Jr_e{~FYnQzwQ&x7}#o zq?$cXcrS;q`@FKgK8OK`ZAJGODPlN(A3Qi8Pgt68w~11|mC`H737m#2-Pi}lqeyK% z-Du3`fhSr0w5HgrFowFE;PTThwMLyWB_-$DaS5}yWe(*nofO1Jr{ zD+jrHt}uFtF?#Tv=w#e&!Y@rydd3-rGCx(0w=5co@jcz%lu#B|3WnB|(}Jc;)_viY z#bYM)D-+6Mvq+tSE8VrZSKaK!d6$tQ#^2)53=kh%>dk-r2Tj_}v99Rd=!o&RIF_P6 z6;~#tVvArfTo8RnHyl9S2;h#c*l6COsqnOdIDGw@w^G}!3bNBi-)S^o zn-HJtM5-6AbfY&ddccj(?~D{N{_?sW9L*m}y?p<)$*xqIF`UHsrO?4c${v}2`>WMI zccq3KDPlA~)*6n5I4h^#$MIUf8+@8?Jfga*meG~o1VgORb|k>8!2M^Ie&*pdF#fH6Y_^Wds^TwWC>Gy z_l#`%uZj`_g`*qD(()tY35|pLgy%ZhX!#QpEUEaUVEtYnr{G^}k)IsF5PZFZDB#8h|U^YdiX*yRd7* zqehAtf7)TT5SBOXKTSyc{epP}SB|kix%X>SaAbtIFO25<6Vm<*_@@PW8{FVtk7T;> zNuybZBgP+}UxMS0&;1GUfmsKJr_P@NYTX%kVLWWdXROiufW!xD)P;rlID{PDBIRp4 zs2tE^*Re%Uj>~mpSZVYS8{kZMv54}6wHJttQ9?*QBZd2Ja43k z;rOSpkh?zqqThW6mBJR8|`Nz)H4~-sTWCWW(7)&_7I?hCa7!%gu;nr415A%6M!4NrpLNyC#$PgHlq1XC7DN?ren|1m1xVLj`iIF14UweNiQYYg|w=(~mw_K^8 z87X4?Qcr=C7O=xQ>!>f0Ry(YZj1)0`so#r~9ailh?(taKJSG*67=Nw%133O#_e4UD zJuMg>c-sfmr_*a1-5fj5Xnr~&$DR=>Q<#-EC3Mao<5PbZ|}Il&yn71KWJ>Lc!%=ceLIqxm^ag{MZfBxrsvLGyOOpd*nL zkDI<GR;aD+3drsk_Tf>4`>)7=KD%5Gij;w9J-Hp!-qj^U{d|nhOGr+ape_=j^?VMj~q=@myXQxPcah|eEIswb{=xy|3A*zEW`Xrzeo=jzMgxI1-!_vAleT5PFzjTA9{saHhG zu5~Rpk1uegdYDd?7=PMd6)A7pUrI>(p9FIYt{M0}RC=h%P5Vrv`A-RHf6dVh!s@&H zhNv5#B}R%Ee|%ndq)_zY{*(}(U4n_@+8Mv>TlQ^m<8!moyi4QbX$3GP?X1ME1kG;< zW<0O>eSYJQX1SX0Gn(H>(ER5F&2J=V{)=F^JDa`U{l{%s>uP?|X#Pt=9=_>l24Q8+ zA9J0Xhkr6s#AxmK)^LbbPFK4+h-UJ8`#9d-VK;o;ohrlsx$8z-3&wRuiWq;bdrPG3 z78hGL2F6>%#$I$IMU20c|0+`6TKAWP9NQxp_5~QwS-+cjA{C0xocLmcASH}6)OLkYdaemBbem6n$dm`n{jdv3? zzb}~Nao%Y(zn`G_g9Od*Cush=U?$=k#P9gWF8R3|=XZ_fzb9z^FhTR*6EuG$7}n2R z{Az#u>w8_zpBv2|C20OQLGwomnm-ZDk8$me-?u-`-Q;Ti-e~?LLGxab^5*j=37Yo_ zW)!ZO_zit|Es8w=iY|v;5!}86&Hn(`U+eZIXl@nEX}se1*N?|kx|&Zmnp+bzf104V zH9_-dg1Hn|#`&q`oz}aWM;OhYsbv&k&$K?iWtAtmm<|0SGt?_RULArdYC~gG5)mw8ytTr?@vhke*`lJSN4?)9vt$OoAy~o z^M4Xb`9Ol^|0HOJB82`Vu08N;eSbA3Hvv#|7Z}Z7iDq)HFdWjFA2)!r7gdk7&p$7K zVTI;_gu;c7PCL(*!5gDS4>A7S_!=C4ZhVyx=WhhV^IiIaYUooCa^t+;X#U2Db7wAW z!6n8J#p8+L(qFud$ZD!A>og-pj6a6oij=pmev=Tx?*zlw;zxseJ+uzh*3Q-QjOOnU zLz#`{55p{yZ-0supM&HN%O7g-EhCpRv~aL|J*}n(4?5D#)rXAcP6?XR5;S*8(9E|$(*nPQ z)}Hvy={fc{uI6T=IXyvh=LF5^37Ug~c@$b%|NimB+L5m2*No<1g650_%|X%pJ|xCo zP`9{f?BKCueaD>X0Z2tfg++xa5PA@rBKQvG1U({c(#oaLrSn%Ty?EgQ%fp@)!;7uL zC|%sOMs?QwrF9FzT(!m;JGOR0QEmSC@}lC&r4y%*n=z$G zp<{>P*f$(X7{ymD#|~RGAMsrf&zH1KShZ5#G1fGDeUe6V>e9Msdyk3p>y}6w9M1`B@G|(q=?mAH6p934>fxjn zah^~-e#-cX#YJ{Lu0%rZ6gzo0O?=yj>u8nteLc0SICjBmU#1Q&DVa8TTvMnqb#*P310|+pO4_THk0rTd*4@;I5@P#bN zwu~(a&5Uirh5=FW{k-H|82jgn(nIV>gww1>V8)?o`igtcdQMirqHj5_)>mfG85FZo&IDjFr|1^ z$QO)+gORA7&aCyVjb+kP5zyi3WHcSsld*JS?d932^{gxNq z_@acPdor-vY|x)cM0D{z+hRaAhi% z^rb`bkjc(bUrWUA_xV%tG%3AN3`CX3HGK%R`xzFBOZ0WwEmm6(;?eU|PqE zJu#U$3&YWH#urT`r9`5TJWNM_KAp>s3=J!LS>}(%V%cygpl|NU$^H?DJtMu_(mDS% zQSevTfv_G)27SJ0IH7OL=Z7&4*a*V}?g zav*<=w*`GQh!QdPQiJk+ic2u8hy1YfWIV2WS5XIKd>ye40)lIU-d0Q<#G;j7KwJ=0 zyV(gCY~fHU8jWN0Pw7D+%&MW`{z2K5cuUI8fxIPyY?D+UrrursBY81Xkb!S0cs zVSId#*~3-!6^0c!*t^rT_YB;+KbT2iZs8sfJ_QEZVp&7BXC$YB8?%2o6TMp4i7sN! zoHK%#=mrPqO)(sK4Gh9QvW46>#t8Hb4h;_UW_$ADH~KL~2oSHoXD6eOtq4YeJYJPT zY7{>iajK<}p(vGQ^=u%HIWn2jhYERb>(CZ&>rM^;P4#fJBxBAF--o04D(VgycS4jY z)h35}`lz)WQBf1c#>cky=GVpKd3Zxb)jd6r9qp?1z^XHUbB^f z{eW;V?fq7m7RzydU|Y|~rhLz4rE`B+4<^%yrLr+cn}rp5TVp}1!K_|eMQQ3gcCGo5 zL1mq>TyS9PKt4i#j|-{B*kF6l;8uYg%lYA#Dc8cG_cmMO$xdZ6-*LD>*cDmFh0*P1@)Y5gdqq6a~~z@1GyfAt@d?cYa!ROwcoB6sR*mZa)&@QBBE#gu}n0T3hKbgJGqGfuz#=@($fT) z?KImEi0BbtHW{cOeU=8h5X!uyknC^Fo{#H(1iuL4eGZ2xRjU^L=D1>~ zX!-EWV81;~^JDcA%*1`M09LxZ0Ud9@0H%x%_BosAwt2TDVQzVsZe&}gSGqO z{&Xaw^Vjah8Vdmx0F#xBA{0#+TM@BjJQRx^ho+dE#;Cu5C>2W|p(-rLVAABbO*Mt} zcs!8`#4^4q4cpPvdld|@NGRe8CLHk+JVkM=HHqU4=n+XJV(~;Y7EkH1!Cja_v7>`O z1z5+Hp%HJZTrZT;M45`reUT|baBQTsM|(@zOf(sV#t}s*g|{NUZ5HWGwFygqIV7>^829lX+4QOpF}p6 zbaW5Y=WQ(vUNtzh8(MJ6Bb-&Re@Ag+5QQWo!E`K}3F*8dDJhQd`m#X|*9VSj*0%a6 zn@)xNA-JZsBiArL74@mj2BjybYWz_>7WZdT$uycKdQ=f&aoM}A3{_Ic5-*(0K(neo zv0LG7EmI$LEy7^5$Lv#Vuw~QeQ|zvGia{fGd|3REf;CKS1`ifH5SGh!2mE>_9mobk zm`bGdN(_heOVCZC200q7IVhk9eSw5OO1OeJiUH+r4G_ zf*h>s4*2L)Fq4WT)24c8>#3Y>6j?~ek|mi6V{(_RVJb&cY`O@D2!R}636scR%^FFB zd{_y|ZJ|~yKzS9=+P`NQt1UJ39Ue+)Hi*v2rsFZJ#EZxU!4xj(&ZMbTKPpf8V(F+q zpo{R-`#~!YCqjP2gvI3LD<=~xsS|tGz$3-NzE}$O{sGj1xj&o;M~X{_CZ^(pVnu2QmU=rcCp0?V|zNBOle>R8DBDscAGpfHJ6e{)f&{}L4Q1!g(p(-gQ8TuiXx?Ba!JEI zhs#owtg(a!>>cgXBiIH{XVGIy5ZE9Fp~KwmOfa!b=^)xI;;f>Tjj17@9t%d}>2M;T zdzX5b;onls$=;>CVsOgEi&*sJu(s|U#=;39Kx(KD9*!n#T6+8R=B2i5u@~agm#JzH zA7F)xGP0sT1lpH%_SA(MU>;SqD6}+sS{~^wxQ!Rrs4wDhtu## z?KVVn`6#iJUQHrXtujaMso8nZx{kj)X3qp8k*8Xm(i3rP7Y4BDh%%lx`s60qRIhCx zH?mshC7Y`hjm1&Gmk1|)*aYQrxl@T@_&$ao$AT;wO+lU#gvYUeL<6C4Iu?biem_FT zFmOym_NGkf4cMCMWMPGya)auU*+_p5mxqh5NDBgaMOs{*4PUfVsaluzUL>{56o`eOy~A`-Wpd@1l- z1Dv}g9&WEIDIfW(XCw|lPUZCSbKt!uagSH;+rSAm30~#uCHK8k;t0(0{c#KM?vS|U z>RkmU_X6i-iC2Z+<@%%YTvem^TduvQ183#SGP|>Zx zdHy^h8{G?CsvRWHnRGjWR?V$Td_g#dOEtT>wI$JaZoDPj-Nq+%YieeMc|Qrmud&~ z$1(~MY^hZLlH0p<8hA7=drIMzXvfXK`;5db*N#iU?;ha%T;iGIvIIXDo`sl?gHkzu zqbTzL=RS!?c2;g2Jqes2y$`=2=wAlTnWSJOs<#}!3xI={$Z{$t-z*HI0B}+?;UKYp zE#d#jF7Ls;*Y;GZ-^g!#ZyI>bz=1UE{;;;<1FN_BO|n>Qth3O^6RF7NA`RBH1R%N3a?aq zf%lNaE!W;K>U|72?@BxuewS)5#pBB_!^xJoy(Q`m1FuWsmaBIj3a$iB!7CV+n`h>s zxI(v83b2%($(_xg1|IciY#Mm9-nwEMcuC-Wv_GjSD4hU}Lz26X+Uvzc&;y*i<%CW1SgH1&hWy4jPPSC4y)?d7 zOat!(;9WWmyiw zI~900P6LnZ;Iq@fqyG5ZH1LSuH%sA_(BI?0dsgC>)8C75(pT;i6qXDWUQ zr&B%*0EzTo%ARSSPDmWWqr~=CqTVZkH!N|>)%#%-d;~a$FBiPZ%`-F)e)$T4qt2!5 z-h;yLP6O{l!27pp;GF@y|C|OMEyqq;hm$Rpl8^Syd_{PrQC{ z_Azs#s!{wcXMbk`Z?VKJr@t4#Vij;^ZW6r6AC_t_ZBIWaaRg@h_C7leyxCy#@1^ic z^xGeScTD1{b}W|9l_q2U)n}(Vx&rNM&-OSnGs$4umkM>9?ID}+@>>QF&jnVmj}GnZ zUth@ekF1y1%@;0Rv|`c9^|&{;W$Ai6IJl^15iX=J+L_zcyS}%1+2Ep~&D&RMC)aD> z>T(AE;@T~2mdfGdyZo1B zV8-?t+vlmQ?cz()qfZAXNz^$wT>JtUQj%K}559W%R)2o()gvBz^{n=so0|m`an+6i zd7|9vG8I>pt(a`fUa`Cx(}Oz>aXUi3f8;nd(tP{DYdoWW{a&cP2fwRGM0 z9{@!E-a{Y2b7Ns$rFo-V#-NXr%%U)2)sf<}_a zBXboB?ZpknbX%*{zc~*cTEe3Yl(KxbPBDPh+W1?A3oKE)koZ?u7X*dppp32~L`2@I z+qj{A{8;`RBVGICuVxrOdh(SSEeGCw*!aQduPWbs$OzYGO%)h7xQ~bFwlLB9pE_IL zh31=#Hce7!)`i0bKP(pJE`H5}$U7H#qWNn8buiwwCUmC>_4VV@oh?(OrmeMnT`M3-Pz>6XALRLUS;= z@naKVcfJ#}Yg!IGL31y(cY|9(2g9|LbrfuB+vXJX{f#sCU-AXyXx*l|YCt;=T#c~X zky)tS^f+Ozdxg%ZWnyEkF~{ht$5^PHsM-fO*i>(Hxe0dZnA9OsRk_ZytW?DM*rHxt87bYu_T#$|Pr zCqE?ZSe3B{U{T{lK@u3F#ZE>s#purt zx1^nvd|D2foTx|l;Sdv;7%;RABJwT*B>FrG=w`<2H=+LmL=ALnUNl`mTCSg-_%CI$ zo&^-PUjPEk#vq`%6KC?KJX<54K)5jahuZPOg+<(jd}>FMfap-lXg@+!+@YgS*G`Tf z=-~bwKV-aEIN{q=HhzG*ScfY%UYA`w{xZ6_Hh<#2%9cZ82cSG?__Xo2km0g2s3+^W zCu;~IR_M*~L!I6EuyJ8(k8gkNgA>W7`u%-Pnz0Jg=Ltqe^xuodoB71}%Y}>f&4p1P zhEW^OqN7$KN~%wdzEU;*D$!m419U=z=nx2gs4#198+YVC8^`v!s4Jf;{E)j+@U9`- zpg!al!%?<^Uz6dh0(d$U<}upchWjD-%=Ydz$6kOo6mR_HQG~v(oy3op0}R!oMYrQ{ z@#Q7al(5hLR9|KHtc7BNwuH}wZ z-iW5n(~NWtXReVwOqnij2b{rV4T$f;;o=3^=K#6+EwguW-Z?mnJbEX=>cxxkN{L0g zTNdGk5{vQR#bSD$#9}k9)^H;%2(Ts2XY2GCfH1}&V%H?b{gZ`C)QrfYYV_G-)MHW{ zBZg?U7JW+bZ55BpC7`??hX_HJNtSB9yN~&HbsN_;)uMB+#YnA(9&$#c7L8nl@WrMM zSQP?;HNw!HMF@M3&Nb2k+tia0Ayu6SqO2MnHB;$oHc7wA74d1>QNU^beEa;Q9zGyo`LgxhVC%) zz6MAb=_T4u))pLbhCp1 zXJgNj@ndyk-vZrVbEkUNbg2%iZ97;uP6Glaz!lhs!aO5WG!zQ`Mu0|sozYR#)!okH z9X~ThN2762$_B%wrP$mqBiGn1^72hhEOCJY%x<$5$fN8BTnps!+-R(3cp>t5`q;5! z#tsCev~Kgeu~c-EfY_4NdJ_3M(Zg0y0vTp4@a_aZh(1}!fAC36?Xf!}TOHm-0 zBPMAU52A@*o%~arG1YB=#gRIZ)k@Mm>pT>C< z;v8aVKhDC#d;*a0Ciemo9_9fv?|DFDINaKAa9+pIJ2*ef5WThTAVVoY&j501?IzT1 zLhDVa$Asu>w}N8OgmQpHZP%N5Hvu9uc58-&T-wJ0O>*9606oRfmjFG<5g~_b(|1->pY!zW!6uBHxl65Gci^EmRgOwDx>uU@oYD;j7G zon0+&wY^6}1BV+&L*3Y|z=VZ0wY^q1wwK^k6+5W5XY0m?@q1OoleZ19jp)`5wCHDJ zP)pvLwr9vN?IY1dG$KuH&vev{{R&d7T2eRmBK}hKaO`elS%s4i%<`nEIr&*FZ(&q4 zqE(vF>FMf}4*6#=%<-4=BgUIYP=aWqu+@l&k(sIK><}|CM&TNxyV00r90=*baJd+{ zCmOpOJ5^9h(H#aX#wPYcI+SauF#@$}oT{*~fHrUt-gBFGFj)#TIT2kOQtdcdy+)E9qWub64=g9-JT5Phdi(2|=K zn*4~FcOxJ%vyg)($fey5Xp*&d2cV}IdH|5<{YL?bndO^i-m`$j%yLejc)h7segd)9 z49A;>EG*Qo(e0!z{GFklz*Eg(z_ima3{R79#{L`|uyPm_9XA?XBBW9yoHDB)N0)12 zuYm@XnEg)zBy935Kw|bk-^>G`k?o5_^tihU2USnOA42^4w*M}iz(F&ubrA2bGQv$p zrU~nblM$<9on!j4noZaZ!B!>Kqi!rIu>N&zq6lUZJ`6w1sNGmogB7jix8GQ!A1?_ZQus!lL zG)JnU0GWEhh`^QBjXlaBwnjU)S4btvnXFK6`L}hfT%+6FX>50ozgjm&p$5wxhO@65 z`wD&fLdy)}7ifHgv6G}94`X7X$?}Uz zK$8p2DicJ~-6Y~<(*o){jMo+CD)fQaUOoa`ZG%vcS#g!6I9b#+RkR|Eq6|To&@q%^QUfGt zDP(_-DJWzYk`9@ry8(%I(5g|C?lVg%JQrL(3+T_xg>JeOcn<-3oAbV6=Ftcd6h8(; zJ8mwGCM)4=e{1Hw2S_+uoBzaGcs0F`)6A5JBRuPwp{Z82&_sh@fK?&?=)-N+Mnl^dHB6VPz_X%IhN84>2TfvOndjj zInWUOCUS7O5zG2V0AVwRmgo6B@W?87g!8yzGu)~Sq2UHFwDRkW`D)Stg5k=qXQNj{ zG?6qJb2!gFq%a{q!shDl^{0h%dB$4WqF z!cN>;%*^WsM7w$}`lhmW8kbUtb}HvxZRY(IAi?D}Kp$efdjL`R<s+T|e!@S_A!k0(U{T>0LMS<&pEb8MDA$ zG~;AIBG0-!vK)EsINTf|h{3xBZ%H7@Ve|Z+aTIG|I@wZ_ko9Gnh8yd~euN^L)yStA zA)277|DLdq&K|usS&=`5e{?+Y#cC-001FF4MI1lbwf$ltwINKmP-ofKMna%XrInf& z@cVb0{YmdsXkM14*D&Vytfq}e`q?#*8`zBZhUD<7>E5fvn||eeLbI$`SlPrB9=V~y z2yXsRugSpuD0$orJJtYnM*YWKmh_|h&ACaH!Dh*v! z+(sPuGUL?yC)Tl5;EI*;Y~9#G@ZSG9!ZrSM(d+v=-fDZ}hK9&E5~R;_Da zr?&UqOA4pc#gNfsl?C@R73cY$sn~%dkE89C!{D>`-OCE6*h;sWrH^sxd4;nSeS@Iy z0me=o!_0$R+TM51E}Q{JaVij=@l{;yLrDS05Du>C=v8~)omn^qDDwo5b5ODe$0{6c zM^k&>omHxo__Q5ey!YJ`3kx7b9mLGf8a-A)&6zQkRgjTq+%k7xXN50>Ye?fSzIW`{ zx{c3NXd5Q2Q7qI+CK`d3T>Ly%n4$BLHwTA{cjZN%AHRj^k~`nbr5^(}U4wIJpTt=V z6udQ?UW6&FNK?1ASvjE8C|VIoT)5Nm8xg&{rcpOW%Rz*;xUL~QnDYt*w&Qq@1FN&B zedqaxvk==F{#snrQ1O13xV)j}+} zb(XGrxv^w=_gbfzka3;5Qex9O&(&t%@>{yGL$y+x&U=D z9^Kg_@OGL|0T6||F6~+~Zvv1AqG@eI9pcs~I2JR{H%vV8+9L1!fM|8((w;L*X>Wyg zs9oBx0G)=ztdmCu);^2 z!GMywCX>W(aZ#VAz?PT0jko!Nc>^w*yK&UljU7dR*LJjS>^Jy3dOd}4F9PEJFxN}C zlu!G?Zma7y(WM!><~?adJQq!N)r~!ix}xGDPqc2l4?K**#bmTJNnpxafcbV%&TasE zv9WrJ5f+;V_L#5A`1#T8z{k3^Q2N>>Z8zg?A+aNPTB!{P7j1?gZL;lzcA5LfyeVv6 zFRC$iH9*Mmbz&0|Le`BvfR;eI(~OXt)j%_v*kYwMa}@>xU-aoPrIym3UQ9sfbdkrM zKZ$pl5hqw13$g`gl_$f7J_V43m=*C9MIbe#)k?}oh|y)n#t1J+P&B>qmEQu8>VJtq zxsi??X>-#-G@{FD1Sz8MlUE*6r1_=$@28PvQe#8;_-ZWt1d>ue51>i-gP6YxJ22~T z8)AEw)&s|WL^}Wn3Nc=x=lychB0GT>5s?q*8gaKpy|v~C!7S?+cUa*tb0|DbDiE=! zTwJVeS|B_eMDeJ`xi@aYr7t#D%iGXhEW*r7-Pd9ncq>%!I~*XV;re-&SI00BZoP35BG%xN6{B}` z%1hzzLoj!$7&T&*jSyC$_7By;$KWbXmH3sikZF|0u*MCwU6YWay1q z6Oo345jT2ULvNa0ro2bv@mE_NCGN%#S{kM06|J7#nhr=T-$Q_e_t*t!D-JjN2D%dM z((b`;5wB3xE#ew0zW6cnL|j8le}VUk3B3!5wr}0MX-6@=TRRb4Z)DCV;VkN{tFy~?Kahbi$yva#iz~?U{qHfesjap}Dd=IlW3|XqRHSAjI zaU0WMB!|)q1A%hKASY80X$qNXs*MimP_3jyk*+xqGrlT{BP65i9He7=; z$fK4L;RX0XBE1F?_O66S<#@zNbOR&(c>??O`Ah99VYSK9wvF1$r{k}MOGv)gi>Bwh zRRHt$MeprTyw"fC-oR*e^tRDNiG)e7w2H0+zT_ni~5eALdb!98am6pwxXS z?YJ6ERp_CyLxpb%ZGMXS!0=DCP~6I5YV~~9&MW_h1-zv?3o^}iigntRziJ}};{#wY zvB7;X#M^PkuG*FZ7#{Q5Ca;^@B`#kf#v}`Vvv3ql1o?)>Q1l5Q(=-SKlQpJoJl~pIWs%z*U(#)Eg>NOypghOy? z9|rUkLp^}V?Ya3%l2|N%0eQkzQvfWM$n^VrOz~|%Vv3-(3B_D4jT{7dKbLkCkf8mu z37v`(vDEhf5~ZsFMVKOrv)GtP0TP=vU1lDI&~g$0^mjO1S^;Mv!99RBqaK&`Dj>o6 zKLH7uU2yL-dAYP&K%(>vKr}7lhD|_Xqh|pi!FeGd!MP34R~Rn{NYHKrMAxKTJaK%9 zp=-?2PXQ7wx(|?O(F1@)i@s*&O#%`vdJYhU^)BrNK%(Ba0Bzw5$0^4vF$Fwgkqi}BrGnWZKB)5)=lCDMl4d!2dIfle+K9!hW-Q4i;Q>F z#CzSu`yUgk2F_0zuNG%vPN$f8G_m}cOV2e+X+S1bJ ztMBKltW(Oj?7%k%Y0K7eLCL|5><_omr-ITxLXs42sA$%>abB-nb~ zWIfpIF0!5mtK&`UVHW1Ejcf!IXHGQ&k!Kl!7n+y}Jhv7FMB5^6ep0-eY1bi-hM!C8 z!&&6*0wm1g^MHgo+zUvU!CWJeg@X=K6XtSTGbHzn+t5@;m z=Ha1{o{?)j^mQ!SII&p+xS?J?Qy+?stw8P7+9E=iCGTOOvbAE-BJpC9UYVOE(hMiBPpQmLm;W*_X+jhz` zvq+v=##zF&xQYJA=?P0eZzGpdZIL__c~(}?c%t-QAHV#dB~P8~48n2BL+;oqPi>Jr zmu1FrTfy#=raHjOky4P1*@@$t>gyWQFE^?gm)D_8d65}X& zo~W+F%pnxU!+t0~NrN&o$**~MRRDb@% zobx6>W?^3>lEf=udAV`u2UH&i!+UU@9+Nf1FNp}lJluWZ70uN zSwXavW?uac;sGTF?J`gz905L}ia5tUx*L(>?447KB&7StDl6b(*gJfC|FWAb3BM&d zpUx7}*OBOxMnL5RZP;EuP9v+bf@-9+D0ksrC7-7KMDigVrw++~Iwd^4NJ0gba)n1DIK15`inPP@|-KF2*=rqvzbbHt<_&V^>vHt3Q0vcqCxv) z4l<^+>m24|w+&BGyP6m$g>w~-&Ocp`^$!}!>C=*PQ&GFlMR{d~^7D6G`xBcV`hN|;-XfxFit-N zss=Rj(f#OlC0!M{KctqTRxCqqWd+$MrCr~@e2pc~*^-KIobu3Y;*_VQNS@`4Lt7Zs ztZkED`jaKkM#*`3kvxQ7SwSO+(vvrz@l{KnK}kh8Leme+91VP&dR_^fN;LqqhyU{* zF}zgoJT9pS$Js8jc4xbm7qtrm3^=3{(r#bFM-N-=IxIP_=60c2`*){=Hp?VScGk7J zsIE&G=esylBy{$7{?n$zKT6J*6zT9%rlM$p(r<6O>~~h%t0}xiA{?j2E<;WwEg(2~ z!e9TAMb#py2**j~MNVY}#i*3Ljdy;>qDo6D!f{gR$g!e}-z=#xEULVuA{-&jCuB}> zFZ-Aejao{#zwr-S6b-H!NGif{_Oc&2PR(CZr1=2j{Hj8%0dr3*Lc8#T)AN#ZK=VwA z;(|CipEX5wbubP+Ty-{}1($vi zZdJ8no8;UfT49Tp*D@8w!;~J|f6~iVf88Ld2*=sWoyZZMpQyaw)$g^az9p#$$4S-2 zRLw+!^v9O^4HnfKl8SJgRNcs_tf0Au($!a(7f1Byo#$KFC(lL}()uFXK=(kx zv$zzSwef#KRZ8>AB^BW~+qIFYXhlrvz4P9A#-bXORD>fq-6eBGf7$zD6L74!rRB_J zV~Pe>yd@Rk2tH4j<#VNj&l3;*{&huzOEHp)a0H)MoqTM1?qNQ5J+Cj)^Jd1O8Nr3) zj&J??6-&?WO3s^$^xSK52B2wr@I@sJR+_ZQghV*dvrV2pW{IA_>&Yb*;W()VkYnw^{`iGwhb*eYl8SJgRNI*PF-s0IVd^rDAMyzrmDl4((bS6w_B}PFR2K} z*$RXpkOz*5)9jwvwoy4MsR&1C@yjxYke%&<%BHkyM^U?m8Rs0di^lWHublrCt6krd zoQI3rbv09|sQWih`9ZAu^suBN9A~>mn5q$HN|pcmz}GFR_aqhJIH_`kYsTu={QSXl zEvjX6h!bw9#NnjMBgdk;w`uHC7F9}85sp)11*WolfZ-yI?P46dPv$&8H@625SsL3S zIqxdc*lwme4QEQ9ny7rolIKQAML0r>kI5Wsj{CkN$L>YPvd=c{ z#G*}EuOX=j$4PY~Q=N)4C0F*QnHJRpl8SJgRC|$Q+2Qr4ecxwM{i~!R94FOZF_p5G zJum(6zb&f&mQ;k}q`HZzR7;Ls^CpIc`gJiGH4@=~%I5t>k>l*0>xy~@6Ekq=MxG8p z_1kZUo38*wDIz(KX`U%7#Br1g&V+a1%2zg9@~o3ogfl~HO0HVDWCcE9i5j>r$A0fe znGYr#P9HzedA7x8RPrGl$)^=N;3fIo44le}lLZ^??ssl`&f@bG$%k+xpB7v*#wahA z=N1Q_dvZTnZ1H(X@*x~&?@Tb2EY`aEZpA8F^-h(X9tlU*-i*C$vv%lb#j2IK$IQ&J zdw_k+8BON2@Co|puj0H=awZ(7JO*+s4-o#&$=|c6l9GyWoK&|mmGS_a9{%D_EUKN7 zig27%`yF-dJ?WR2PL+grODe)~Qr*T>E}SX-NAtBmw5TQ}72&YPR;*ltooz4`{lylw z3Lm5~bL<-X7^o}{@WK;s3|gFzNX~@gl;^LRO6mD`&$h#9sa90W>6&nyR3B$5WxY3^ zd56cMS|F(i$4PZNQ=z*#J-hrXn3_~wU6P7$oK&AcjulZq^3#*xt`t>4QW1{O*z#ua zs8+Fsf0FsA2>;<*;}Asg`LyIiID${>QtZLvm#O&`t>C=gmeags#fqgG-7l$dkb~-< zHgoJA=~G-gjTGf$#)>@Brx~XkXPU#_j=zLyM`1rBCH!=eNBRs?&BK|}R`(z7v)c7@ zNkur&s?9^*fgGoY{B)5#pJg1n35v9K^X0!jXvuS;bUB}eJkI{Qlc}Ub*M8re`ddq$ z(QLiON$G1FqF!uS$@w19UpCJ7qTFc- z_Y`r4NdbrMJ|cs9Z`MtREzV<-^L>J|ZI|YLraA*>O0#x8YO{npB^BX_)*qHRqIZbm z=Z+kEfBg+gt*fPTYTiyOF8F+vq#_)r=21PUl(qceophr`b+H^kgd^nHpoUaYyS~JH zlqcD9((j*AG>F_uzd+dVY{`Uci~~UYq|wz|!;mlJkQ_@;t;;XW~q0 z_@dbbOP%>Lw2AWCdj@j-$Q&BcyxvU#ebW+u zRu9I*(X=m<&;_cuRlRRwXwcg#zNO@C^|s(>3WRgs<=!TrPq$Z*r4JyP3}brQA4~$*fNKsx_?xId7}H8Q0rNpEf!^YxzwgJL`a7PiCXRcqSRrWwE!FZm;*Y(npI# zO?^-$eYwcN-JwPGxuG=fdlSzn%PtC}^k~MHO{5cXT_K?Yh30MTY)2EUW;nR2_Ad=4 z0*P2G9n?iHI{Gk{qxQrG>747&bKibA+mqi$86Exk0N$0!A1yjmbNuXS0cLHW`fR))#7y%btdTQ(RwPpUE$w zr=zJvIF(81;$tZ`Ug*9dhqP+Qg!ND+<4=S`8H-4Cw-cX7T>tT!*U_`fve1|wPr`;W zp{Ooyg0;y~thVBIweu%REPhEnolON}zHmr4zh3eIS$5F(MQqB7Wuv}SFbVh(;>lPvtjm|fICN*%bhAGm4<(WTANh!Y zqZ3vp!jV)q8p-J1R>(D&^EL(3MOaH?$z;|a@d3+GOnsl>7i0PPy;$A&UO+$O$4%Qx zfh)49NH87nh0F?CoQ=scO0LtE+f>FkSbHj>24 z9)ftV8?R#|8R=(t&yK4!?_h3|d{eIOP3m4R3aJN53Zd((^i`@$aNn}YDmI9ZC<<@d z!QW!B*^5t)#ln$DA{H*=CFx0WOI)ZrZs~*M6z?$Ox}>F-6wcWczii9#C`5A{8t})3 z3Z_9OqKcKlKsXzUN63(ZQjrdO3WW4bHX4sa(&c6etNlFkdYdhW5YeOIcr=uWho;fl zOg&}X`tTA?)*SUI{csE{$|OG#9q8-pA4G72hv7_$XiqMkgQl&47arJC81~~`nT(_6 zh>RW}0aMwGLq^zU)2}R_`kENwUtMU(foYiBu{R z{=lROJ(>+>vgvqW+N3mK@RmKBHv9#=2BEV(rp7{Vk2!ZVCsM&gIvh#s@QZezv&_hj0=jw$CPi)|-d6P*OuJVxb?=X$+XC50EaTVVq3PY2Hau@DUfyaAU%IQ6)TBIq zI1$SRvuU4>_h(vIebtI)n#MJT0*0)ezY zR%6EH4IomA7b4r{%lTrc72@J(-B4Lg`3Wm#^wG>FoyW4?rWCY}lWS z>uOC!b|I@`RO&Mk0sHbpI|q7Ax5V=~`zEtLf_gBRgkOyYt*PAfBAAhFL6bkFr_zCF zIOGrOwim$Jybk6dMA zPL3i>U+F+38cCwREJL1-U{~u> z4DO&W5Jha$6iiKVfLJbt<8i;=pGrCurJn3WKUvbL?#N~{!E7W7Z`u^hIO-z32STxE z6cfp?`576TFDlvZsdPFV4`s7Lz*35EXuzjO{qW17NJ6(gi%!p`J7oz$@6l``lnL7L z)HCZ&+@PMxMB}L}1~>6^KFdB8H4zAe!kF&})A@+I6Vs7TVugcB$7=gblP+&gS0e~38muMAlpK=Nc5IOAQR8TD6Vb_isC7vqmz8e zKs4z~J4GKJC}qmgFih1K2urDnrA^|NR45V8MnW(oDe)8p%#-0zJe3Myuf*Y(=yd`1 z`qW$|{R^2NI|ilju&IBl48n2 z&qTt>RK(Fxdiom@%NI}Cn=Ca1OT=O<7>NZ_YSNQRp!rxl87_7>*d_K`vt=3~P&yWg z`l2NWr!)Z5rJ605rGrDgw4t$f$ehHG6U4*0at~7VT?QU697&`?nDO~pU^K-3FtBYF zHx-0vXt1v!qHepg0y~EAmU_iGr3d}dXv_y6t+r60DACL*lH1J|eMKHP5QzG16GSNj zvM1k;9Yei#8O-Vt1crmDa4HhjGE1p3lR;L8Ur$G4K}=NEL$fx0 z@RpQ4ez01e^d~ccNHS?_f%!l!>{UKdYt?UWfmlq2)l;`59-?R3ZNSb^E(MEMA|~}< QG!V%|G4AXdW^K;;KOU1D!TWIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) CompileAsCpp $(SolutionDir)\vendors\include;$(SolutionDir)\getopt;%(AdditionalIncludeDirectories) + MultiThreadedDebugDLL Windows diff --git a/vendors/thread/thread.vcxproj b/vendors/thread/thread.vcxproj index 056d31b..88d7feb 100644 --- a/vendors/thread/thread.vcxproj +++ b/vendors/thread/thread.vcxproj @@ -54,6 +54,7 @@ Disabled WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) CompileAsCpp + MultiThreadedDebugDLL Windows From 5ddc53a59dc58b3ac1601e396fe055304b2d950a Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 27 May 2014 19:02:37 +0400 Subject: [PATCH 5/9] idevicerestore submodule added --- .gitmodules | 3 +++ libimobiledevice-tools/idevicerestore/idevicerestore | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 libimobiledevice-tools/idevicerestore/idevicerestore diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..6c5b7f4 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "libimobiledevice-tools/idevicerestore/idevicerestore"] + path = libimobiledevice-tools/idevicerestore/idevicerestore + url = http://git.sukimashita.com/idevicerestore.git diff --git a/libimobiledevice-tools/idevicerestore/idevicerestore b/libimobiledevice-tools/idevicerestore/idevicerestore new file mode 160000 index 0000000..704afa3 --- /dev/null +++ b/libimobiledevice-tools/idevicerestore/idevicerestore @@ -0,0 +1 @@ +Subproject commit 704afa39c66a6e912f509112f543010b8234ec4d From 898243c2646ed99928ac11e34b2b0687241f8c4c Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 27 May 2014 19:09:00 +0400 Subject: [PATCH 6/9] libirecovery submodule added --- .gitmodules | 3 +++ libirecovery/libirecovery | 1 + 2 files changed, 4 insertions(+) create mode 160000 libirecovery/libirecovery diff --git a/.gitmodules b/.gitmodules index 6c5b7f4..72e19ff 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "libimobiledevice-tools/idevicerestore/idevicerestore"] path = libimobiledevice-tools/idevicerestore/idevicerestore url = http://git.sukimashita.com/idevicerestore.git +[submodule "libirecovery/libirecovery"] + path = libirecovery/libirecovery + url = http://git.sukimashita.com/libirecovery.git diff --git a/libirecovery/libirecovery b/libirecovery/libirecovery new file mode 160000 index 0000000..14a268c --- /dev/null +++ b/libirecovery/libirecovery @@ -0,0 +1 @@ +Subproject commit 14a268cd86e63a3160ddf30a65f8eb382922c83c From 639d6b584f56e787548bffedebd1c189072bc5dc Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 3 Jun 2014 19:14:30 +0400 Subject: [PATCH 7/9] fixed debug output for libusbmuxd --- libusbmuxd/libusbmuxd.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libusbmuxd/libusbmuxd.c b/libusbmuxd/libusbmuxd.c index aa4e5ff..8e39a3d 100644 --- a/libusbmuxd/libusbmuxd.c +++ b/libusbmuxd/libusbmuxd.c @@ -1049,15 +1049,15 @@ int usbmuxd_recv_timeout(int sfd, char *data, uint32_t len, uint32_t *recv_bytes } #if DEBUG_DATA - if (len > 0) { + if (num_recv > 0) { char *tmp = NULL; if (DEBUG_DATA_HEX && *data != '<') { - tmp = str2hexn(data, len); + tmp = str2hexn(data, num_recv); } else { // plist here, show as text - tmp = (char *)malloc((len+1) * sizeof(char)); - strncpy(tmp, data, len * sizeof(char)); - tmp[len] = 0x00; + tmp = (char *)malloc((num_recv+1) * sizeof(char)); + strncpy(tmp, data, num_recv * sizeof(char)); + tmp[num_recv] = 0x00; } DEBUG(1, "\n======================\nreceived: %d bytes\n%s\n======================\n\n", len, tmp); free(tmp); From 168b7e9ff4a746d214b73bba323a992a4ba6b01a Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 3 Jun 2014 19:16:57 +0400 Subject: [PATCH 8/9] zlib replaced, added libcurl and readline, made idevicerecovery buildable --- UpgradeLog.htm | Bin 0 -> 29056 bytes libcompat/libcompat.h | 4 + .../idevicerestore/idevicerestore.vcxproj | 124 + .../idevicerestore.vcxproj.filters | 116 + libimobiledevice-win32.sln | 71 + libirecovery/libirecovery.vcxproj | 85 + libirecovery/libirecovery.vcxproj.filters | 26 + libzip/libzip.vcxproj | 2 +- vendors/_bin/libcurl.dll | Bin 0 -> 270336 bytes vendors/_bin/zlib1.dll | Bin 0 -> 107520 bytes vendors/libcurl/CHANGES | 1792 ++++ vendors/libcurl/COPYING | 21 + vendors/libcurl/README | 57 + vendors/libcurl/RELEASE-NOTES | 94 + vendors/libcurl/docs/BINDINGS | 206 + vendors/libcurl/docs/BUGS | 82 + vendors/libcurl/docs/CONTRIBUTE | 233 + vendors/libcurl/docs/DISTRO-DILEMMA | 176 + vendors/libcurl/docs/FAQ | 1149 +++ vendors/libcurl/docs/FEATURES | 135 + vendors/libcurl/docs/HISTORY | 153 + vendors/libcurl/docs/INSTALL | 827 ++ vendors/libcurl/docs/INSTALL.devcpp | 302 + vendors/libcurl/docs/INTERNALS | 424 + vendors/libcurl/docs/KNOWN_BUGS | 167 + vendors/libcurl/docs/LICENSE-MIXING | 126 + vendors/libcurl/docs/MANUAL | 921 ++ vendors/libcurl/docs/Makefile.am | 41 + vendors/libcurl/docs/Makefile.in | 608 ++ vendors/libcurl/docs/README.netware | 27 + vendors/libcurl/docs/README.win32 | 26 + vendors/libcurl/docs/RESOURCES | 72 + vendors/libcurl/docs/SSLCERTS | 92 + vendors/libcurl/docs/THANKS | 603 ++ vendors/libcurl/docs/TODO | 572 ++ vendors/libcurl/docs/TheArtOfHttpScripting | 453 + vendors/libcurl/docs/VERSIONS | 67 + vendors/libcurl/docs/curl-config.1 | 98 + vendors/libcurl/docs/curl-config.html | 88 + vendors/libcurl/docs/curl-config.pdf | Bin 0 -> 5906 bytes vendors/libcurl/docs/curl.1 | 1621 ++++ vendors/libcurl/docs/curl.html | 779 ++ vendors/libcurl/docs/curl.pdf | Bin 0 -> 74117 bytes vendors/libcurl/docs/examples/10-at-a-time.c | 186 + vendors/libcurl/docs/examples/Makefile.am | 37 + .../libcurl/docs/examples/Makefile.example | 41 + vendors/libcurl/docs/examples/Makefile.in | 712 ++ vendors/libcurl/docs/examples/README | 76 + vendors/libcurl/docs/examples/anyauthput.c | 140 + vendors/libcurl/docs/examples/cacertinmem.c | 139 + .../libcurl/docs/examples/cookie_interface.c | 111 + vendors/libcurl/docs/examples/curlgtk.c | 106 + vendors/libcurl/docs/examples/curlx.c | 514 ++ vendors/libcurl/docs/examples/debug.c | 128 + vendors/libcurl/docs/examples/fileupload.c | 64 + vendors/libcurl/docs/examples/fopen.c | 564 ++ vendors/libcurl/docs/examples/ftpget.c | 87 + vendors/libcurl/docs/examples/ftpgetresp.c | 63 + vendors/libcurl/docs/examples/ftpupload.c | 101 + .../libcurl/docs/examples/ftpuploadresume.c | 156 + vendors/libcurl/docs/examples/getinfo.c | 42 + vendors/libcurl/docs/examples/getinmemory.c | 105 + vendors/libcurl/docs/examples/ghiper.c | 461 + vendors/libcurl/docs/examples/hiperfifo.c | 411 + vendors/libcurl/docs/examples/htmltidy.c | 118 + vendors/libcurl/docs/examples/htmltitle.cc | 301 + vendors/libcurl/docs/examples/http-post.c | 35 + vendors/libcurl/docs/examples/httpput.c | 106 + vendors/libcurl/docs/examples/https.c | 53 + vendors/libcurl/docs/examples/makefile.dj | 41 + vendors/libcurl/docs/examples/multi-app.c | 132 + .../docs/examples/multi-debugcallback.c | 182 + vendors/libcurl/docs/examples/multi-double.c | 99 + vendors/libcurl/docs/examples/multi-post.c | 128 + vendors/libcurl/docs/examples/multi-single.c | 94 + vendors/libcurl/docs/examples/multithread.c | 76 + .../libcurl/docs/examples/opensslthreadlock.c | 82 + vendors/libcurl/docs/examples/persistant.c | 41 + vendors/libcurl/docs/examples/post-callback.c | 117 + vendors/libcurl/docs/examples/postit2.c | 87 + vendors/libcurl/docs/examples/sampleconv.c | 95 + vendors/libcurl/docs/examples/sepheaders.c | 76 + vendors/libcurl/docs/examples/simple.c | 28 + vendors/libcurl/docs/examples/simplepost.c | 37 + vendors/libcurl/docs/examples/simplessl.c | 123 + vendors/libcurl/docs/examples/synctime.c | 354 + vendors/libcurl/docs/index.html | 20 + vendors/libcurl/docs/libcurl/ABI | 54 + vendors/libcurl/docs/libcurl/Makefile.am | 79 + vendors/libcurl/docs/libcurl/Makefile.in | 491 + .../libcurl/docs/libcurl/curl_easy_cleanup.3 | 51 + .../docs/libcurl/curl_easy_cleanup.html | 59 + .../docs/libcurl/curl_easy_cleanup.pdf | Bin 0 -> 3830 bytes .../docs/libcurl/curl_easy_duphandle.3 | 34 + .../docs/libcurl/curl_easy_duphandle.html | 59 + .../docs/libcurl/curl_easy_duphandle.pdf | Bin 0 -> 3940 bytes .../libcurl/docs/libcurl/curl_easy_escape.3 | 47 + .../docs/libcurl/curl_easy_escape.html | 58 + .../libcurl/docs/libcurl/curl_easy_escape.pdf | Bin 0 -> 3897 bytes .../libcurl/docs/libcurl/curl_easy_getinfo.3 | 211 + .../docs/libcurl/curl_easy_getinfo.html | 142 + .../docs/libcurl/curl_easy_getinfo.pdf | Bin 0 -> 12276 bytes vendors/libcurl/docs/libcurl/curl_easy_init.3 | 32 + .../libcurl/docs/libcurl/curl_easy_init.html | 58 + .../libcurl/docs/libcurl/curl_easy_init.pdf | Bin 0 -> 3976 bytes .../libcurl/docs/libcurl/curl_easy_pause.3 | 63 + .../libcurl/docs/libcurl/curl_easy_pause.html | 71 + .../libcurl/docs/libcurl/curl_easy_pause.pdf | Bin 0 -> 6003 bytes .../libcurl/docs/libcurl/curl_easy_perform.3 | 40 + .../docs/libcurl/curl_easy_perform.html | 58 + .../docs/libcurl/curl_easy_perform.pdf | Bin 0 -> 4322 bytes .../libcurl/docs/libcurl/curl_easy_reset.3 | 24 + .../libcurl/docs/libcurl/curl_easy_reset.html | 58 + .../libcurl/docs/libcurl/curl_easy_reset.pdf | Bin 0 -> 3594 bytes .../libcurl/docs/libcurl/curl_easy_setopt.3 | 1576 ++++ .../docs/libcurl/curl_easy_setopt.html | 618 ++ .../libcurl/docs/libcurl/curl_easy_setopt.pdf | Bin 0 -> 88033 bytes .../libcurl/docs/libcurl/curl_easy_strerror.3 | 20 + .../docs/libcurl/curl_easy_strerror.html | 58 + .../docs/libcurl/curl_easy_strerror.pdf | Bin 0 -> 3349 bytes .../libcurl/docs/libcurl/curl_easy_unescape.3 | 52 + .../docs/libcurl/curl_easy_unescape.html | 59 + .../docs/libcurl/curl_easy_unescape.pdf | Bin 0 -> 4020 bytes vendors/libcurl/docs/libcurl/curl_escape.3 | 31 + vendors/libcurl/docs/libcurl/curl_escape.html | 59 + vendors/libcurl/docs/libcurl/curl_escape.pdf | Bin 0 -> 3926 bytes vendors/libcurl/docs/libcurl/curl_formadd.3 | 223 + .../libcurl/docs/libcurl/curl_formadd.html | 174 + vendors/libcurl/docs/libcurl/curl_formadd.pdf | Bin 0 -> 11761 bytes vendors/libcurl/docs/libcurl/curl_formfree.3 | 20 + .../libcurl/docs/libcurl/curl_formfree.html | 55 + .../libcurl/docs/libcurl/curl_formfree.pdf | Bin 0 -> 3326 bytes vendors/libcurl/docs/libcurl/curl_formget.3 | 49 + .../libcurl/docs/libcurl/curl_formget.html | 80 + vendors/libcurl/docs/libcurl/curl_formget.pdf | Bin 0 -> 3995 bytes vendors/libcurl/docs/libcurl/curl_free.3 | 18 + vendors/libcurl/docs/libcurl/curl_free.html | 54 + vendors/libcurl/docs/libcurl/curl_free.pdf | Bin 0 -> 3195 bytes vendors/libcurl/docs/libcurl/curl_getdate.3 | 100 + .../libcurl/docs/libcurl/curl_getdate.html | 93 + vendors/libcurl/docs/libcurl/curl_getdate.pdf | Bin 0 -> 6868 bytes vendors/libcurl/docs/libcurl/curl_getenv.3 | 30 + vendors/libcurl/docs/libcurl/curl_getenv.html | 57 + vendors/libcurl/docs/libcurl/curl_getenv.pdf | Bin 0 -> 4130 bytes .../docs/libcurl/curl_global_cleanup.3 | 32 + .../docs/libcurl/curl_global_cleanup.html | 59 + .../docs/libcurl/curl_global_cleanup.pdf | Bin 0 -> 3796 bytes .../libcurl/docs/libcurl/curl_global_init.3 | 59 + .../docs/libcurl/curl_global_init.html | 65 + .../libcurl/docs/libcurl/curl_global_init.pdf | Bin 0 -> 4678 bytes .../docs/libcurl/curl_global_init_mem.3 | 42 + .../docs/libcurl/curl_global_init_mem.html | 74 + .../docs/libcurl/curl_global_init_mem.pdf | Bin 0 -> 3985 bytes vendors/libcurl/docs/libcurl/curl_mprintf.3 | 90 + .../libcurl/docs/libcurl/curl_mprintf.html | 70 + vendors/libcurl/docs/libcurl/curl_mprintf.pdf | Bin 0 -> 5830 bytes .../docs/libcurl/curl_multi_add_handle.3 | 36 + .../docs/libcurl/curl_multi_add_handle.html | 61 + .../docs/libcurl/curl_multi_add_handle.pdf | Bin 0 -> 3926 bytes .../libcurl/docs/libcurl/curl_multi_assign.3 | 44 + .../docs/libcurl/curl_multi_assign.html | 61 + .../docs/libcurl/curl_multi_assign.pdf | Bin 0 -> 4492 bytes .../libcurl/docs/libcurl/curl_multi_cleanup.3 | 27 + .../docs/libcurl/curl_multi_cleanup.html | 58 + .../docs/libcurl/curl_multi_cleanup.pdf | Bin 0 -> 3701 bytes .../libcurl/docs/libcurl/curl_multi_fdset.3 | 41 + .../docs/libcurl/curl_multi_fdset.html | 64 + .../libcurl/docs/libcurl/curl_multi_fdset.pdf | Bin 0 -> 4281 bytes .../docs/libcurl/curl_multi_info_read.3 | 57 + .../docs/libcurl/curl_multi_info_read.html | 74 + .../docs/libcurl/curl_multi_info_read.pdf | Bin 0 -> 4825 bytes .../libcurl/docs/libcurl/curl_multi_init.3 | 21 + .../libcurl/docs/libcurl/curl_multi_init.html | 56 + .../libcurl/docs/libcurl/curl_multi_init.pdf | Bin 0 -> 3334 bytes .../libcurl/docs/libcurl/curl_multi_perform.3 | 50 + .../docs/libcurl/curl_multi_perform.html | 59 + .../docs/libcurl/curl_multi_perform.pdf | Bin 0 -> 5134 bytes .../docs/libcurl/curl_multi_remove_handle.3 | 23 + .../libcurl/curl_multi_remove_handle.html | 57 + .../docs/libcurl/curl_multi_remove_handle.pdf | Bin 0 -> 3717 bytes .../libcurl/docs/libcurl/curl_multi_setopt.3 | 84 + .../docs/libcurl/curl_multi_setopt.html | 73 + .../docs/libcurl/curl_multi_setopt.pdf | Bin 0 -> 7260 bytes .../libcurl/docs/libcurl/curl_multi_socket.3 | 150 + .../docs/libcurl/curl_multi_socket.html | 110 + .../docs/libcurl/curl_multi_socket.pdf | Bin 0 -> 9777 bytes .../docs/libcurl/curl_multi_strerror.3 | 20 + .../docs/libcurl/curl_multi_strerror.html | 58 + .../docs/libcurl/curl_multi_strerror.pdf | Bin 0 -> 3345 bytes .../libcurl/docs/libcurl/curl_multi_timeout.3 | 42 + .../docs/libcurl/curl_multi_timeout.html | 61 + .../docs/libcurl/curl_multi_timeout.pdf | Bin 0 -> 4360 bytes .../libcurl/docs/libcurl/curl_share_cleanup.3 | 21 + .../docs/libcurl/curl_share_cleanup.html | 56 + .../docs/libcurl/curl_share_cleanup.pdf | Bin 0 -> 3539 bytes .../libcurl/docs/libcurl/curl_share_init.3 | 25 + .../libcurl/docs/libcurl/curl_share_init.html | 57 + .../libcurl/docs/libcurl/curl_share_init.pdf | Bin 0 -> 3728 bytes .../libcurl/docs/libcurl/curl_share_setopt.3 | 61 + .../docs/libcurl/curl_share_setopt.html | 79 + .../docs/libcurl/curl_share_setopt.pdf | Bin 0 -> 4630 bytes .../docs/libcurl/curl_share_strerror.3 | 20 + .../docs/libcurl/curl_share_strerror.html | 58 + .../docs/libcurl/curl_share_strerror.pdf | Bin 0 -> 3345 bytes .../libcurl/docs/libcurl/curl_slist_append.3 | 39 + .../docs/libcurl/curl_slist_append.html | 66 + .../docs/libcurl/curl_slist_append.pdf | Bin 0 -> 3729 bytes .../docs/libcurl/curl_slist_free_all.3 | 20 + .../docs/libcurl/curl_slist_free_all.html | 56 + .../docs/libcurl/curl_slist_free_all.pdf | Bin 0 -> 3175 bytes vendors/libcurl/docs/libcurl/curl_strequal.3 | 32 + .../libcurl/docs/libcurl/curl_strequal.html | 58 + .../libcurl/docs/libcurl/curl_strequal.pdf | Bin 0 -> 4057 bytes vendors/libcurl/docs/libcurl/curl_unescape.3 | 31 + .../libcurl/docs/libcurl/curl_unescape.html | 59 + .../libcurl/docs/libcurl/curl_unescape.pdf | Bin 0 -> 3889 bytes vendors/libcurl/docs/libcurl/curl_version.3 | 19 + .../libcurl/docs/libcurl/curl_version.html | 55 + vendors/libcurl/docs/libcurl/curl_version.pdf | Bin 0 -> 3135 bytes .../libcurl/docs/libcurl/curl_version_info.3 | 148 + .../docs/libcurl/curl_version_info.html | 119 + .../docs/libcurl/curl_version_info.pdf | Bin 0 -> 8129 bytes vendors/libcurl/docs/libcurl/index.html | 59 + vendors/libcurl/docs/libcurl/libcurl-easy.3 | 28 + .../libcurl/docs/libcurl/libcurl-easy.html | 54 + vendors/libcurl/docs/libcurl/libcurl-easy.pdf | Bin 0 -> 4142 bytes vendors/libcurl/docs/libcurl/libcurl-errors.3 | 251 + .../libcurl/docs/libcurl/libcurl-errors.html | 218 + .../libcurl/docs/libcurl/libcurl-errors.pdf | Bin 0 -> 14234 bytes vendors/libcurl/docs/libcurl/libcurl-multi.3 | 141 + .../libcurl/docs/libcurl/libcurl-multi.html | 80 + .../libcurl/docs/libcurl/libcurl-multi.pdf | Bin 0 -> 9104 bytes vendors/libcurl/docs/libcurl/libcurl-share.3 | 46 + .../libcurl/docs/libcurl/libcurl-share.html | 61 + .../libcurl/docs/libcurl/libcurl-share.pdf | Bin 0 -> 4763 bytes .../libcurl/docs/libcurl/libcurl-tutorial.3 | 1193 +++ .../docs/libcurl/libcurl-tutorial.html | 500 + .../libcurl/docs/libcurl/libcurl-tutorial.pdf | Bin 0 -> 59840 bytes vendors/libcurl/docs/libcurl/libcurl.3 | 203 + vendors/libcurl/docs/libcurl/libcurl.html | 103 + vendors/libcurl/docs/libcurl/libcurl.m4 | 240 + vendors/libcurl/docs/libcurl/libcurl.pdf | Bin 0 -> 12604 bytes vendors/libcurl/include/Makefile.am | 5 + vendors/libcurl/include/Makefile.in | 524 ++ vendors/libcurl/include/README | 38 + vendors/libcurl/include/curl/Makefile.am | 5 + vendors/libcurl/include/curl/Makefile.in | 445 + vendors/libcurl/include/curl/curl.h | 1794 ++++ vendors/libcurl/include/curl/curlver.h | 70 + vendors/libcurl/include/curl/easy.h | 81 + vendors/libcurl/include/curl/mprintf.h | 80 + vendors/libcurl/include/curl/multi.h | 346 + vendors/libcurl/include/curl/stdcheaders.h | 34 + vendors/libcurl/include/curl/types.h | 1 + vendors/libcurl/libcurl.dll | Bin 0 -> 270336 bytes vendors/libcurl/libcurl.exp | Bin 0 -> 7444 bytes vendors/libcurl/libcurl.lib | Bin 0 -> 13298 bytes .../readline/manifest/readline-5.0-1-src.mft | 144 + .../readline/manifest/readline-5.0-1-src.ver | 1 + vendors/readline/readline-32.vcproj | 406 + vendors/readline/readline-32.vcxproj | 149 + vendors/readline/readline-32.vcxproj.filters | 186 + vendors/readline/src/readline/CHANGELOG | 810 ++ vendors/readline/src/readline/CHANGES | 792 ++ vendors/readline/src/readline/COPYING | 339 + vendors/readline/src/readline/INSTALL | 273 + vendors/readline/src/readline/MANIFEST | 134 + vendors/readline/src/readline/Makefile.in | 554 ++ vendors/readline/src/readline/NEWS | 55 + vendors/readline/src/readline/README | 172 + vendors/readline/src/readline/USAGE | 37 + vendors/readline/src/readline/aclocal.m4 | 3913 ++++++++ vendors/readline/src/readline/ansi_stdlib.h | 58 + vendors/readline/src/readline/bind.c | 2325 +++++ vendors/readline/src/readline/callback.c | 156 + vendors/readline/src/readline/chardefs.h | 168 + vendors/readline/src/readline/compat.c | 113 + vendors/readline/src/readline/complete.c | 2253 +++++ vendors/readline/src/readline/config.h.in | 220 + vendors/readline/src/readline/configure | 8176 +++++++++++++++++ vendors/readline/src/readline/configure.in | 253 + vendors/readline/src/readline/display.c | 2378 +++++ vendors/readline/src/readline/doc/fdl.texi | 452 + vendors/readline/src/readline/doc/history.3 | 663 ++ .../readline/src/readline/doc/history.texi | 104 + vendors/readline/src/readline/doc/hstech.texi | 573 ++ vendors/readline/src/readline/doc/hsuser.texi | 457 + vendors/readline/src/readline/doc/readline.3 | 1287 +++ vendors/readline/src/readline/doc/rlman.texi | 101 + vendors/readline/src/readline/doc/rltech.texi | 2259 +++++ vendors/readline/src/readline/doc/rluser.texi | 1824 ++++ .../readline/src/readline/doc/rluserman.texi | 88 + vendors/readline/src/readline/doc/texi2dvi | 660 ++ vendors/readline/src/readline/doc/texi2html | 5429 +++++++++++ vendors/readline/src/readline/doc/texinfo.tex | 6688 ++++++++++++++ .../readline/src/readline/doc/version.texi | 10 + vendors/readline/src/readline/emacs_keymap.c | 873 ++ .../readline/src/readline/examples/Inputrc | 81 + .../src/readline/examples/Makefile.in | 104 + .../src/readline/examples/excallback.c | 188 + .../readline/src/readline/examples/fileman.c | 485 + .../src/readline/examples/histexamp.c | 122 + .../readline/src/readline/examples/manexamp.c | 112 + .../src/readline/examples/readlinebuf.h | 139 + .../readline/src/readline/examples/rl-fgets.c | 374 + vendors/readline/src/readline/examples/rl.c | 151 + .../readline/src/readline/examples/rlcat.c | 174 + vendors/readline/src/readline/examples/rlfe.c | 1042 +++ .../readline/src/readline/examples/rltest.c | 87 + .../src/readline/examples/rlversion.c | 43 + vendors/readline/src/readline/funmap.c | 256 + vendors/readline/src/readline/histexpand.c | 1591 ++++ vendors/readline/src/readline/histfile.c | 556 ++ vendors/readline/src/readline/histlib.h | 88 + vendors/readline/src/readline/history.c | 443 + vendors/readline/src/readline/history.h | 266 + vendors/readline/src/readline/histsearch.c | 195 + vendors/readline/src/readline/input.c | 781 ++ vendors/readline/src/readline/isearch.c | 560 ++ vendors/readline/src/readline/keymaps.c | 150 + vendors/readline/src/readline/keymaps.h | 104 + vendors/readline/src/readline/kill.c | 693 ++ vendors/readline/src/readline/macro.c | 262 + vendors/readline/src/readline/mbutil.c | 348 + vendors/readline/src/readline/misc.c | 508 + vendors/readline/src/readline/nls.c | 254 + vendors/readline/src/readline/parens.c | 212 + vendors/readline/src/readline/posixdir.h | 71 + vendors/readline/src/readline/posixjmp.h | 40 + vendors/readline/src/readline/posixstat.h | 142 + vendors/readline/src/readline/readline.c | 1001 ++ vendors/readline/src/readline/readline.h | 865 ++ vendors/readline/src/readline/rlconf.h | 60 + vendors/readline/src/readline/rldefs.h | 185 + vendors/readline/src/readline/rlmbutil.h | 121 + vendors/readline/src/readline/rlprivate.h | 288 + vendors/readline/src/readline/rlshell.h | 34 + vendors/readline/src/readline/rlstdc.h | 69 + vendors/readline/src/readline/rltty.c | 1095 +++ vendors/readline/src/readline/rltty.h | 82 + vendors/readline/src/readline/rltypedefs.h | 94 + vendors/readline/src/readline/rlwinsize.h | 57 + vendors/readline/src/readline/savestring.c | 38 + vendors/readline/src/readline/search.c | 475 + vendors/readline/src/readline/shell.c | 245 + .../readline/src/readline/shlib/Makefile.in | 451 + vendors/readline/src/readline/signals.c | 456 + .../src/readline/support/config.guess | 1403 +++ .../src/readline/support/config.rpath | 548 ++ .../readline/src/readline/support/config.sub | 1470 +++ .../readline/src/readline/support/install.sh | 247 + vendors/readline/src/readline/support/mkdirs | 48 + vendors/readline/src/readline/support/mkdist | 120 + .../src/readline/support/mkinstalldirs | 111 + .../src/readline/support/shlib-install | 169 + .../readline/src/readline/support/shobj-conf | 466 + .../readline/src/readline/support/wcwidth.c | 236 + vendors/readline/src/readline/tcap.h | 60 + vendors/readline/src/readline/terminal.c | 839 ++ vendors/readline/src/readline/text.c | 1547 ++++ vendors/readline/src/readline/tilde.c | 486 + vendors/readline/src/readline/tilde.h | 87 + vendors/readline/src/readline/undo.c | 263 + vendors/readline/src/readline/util.c | 338 + vendors/readline/src/readline/vi_keymap.c | 876 ++ vendors/readline/src/readline/vi_mode.c | 1505 +++ vendors/readline/src/readline/xmalloc.c | 88 + vendors/readline/src/readline/xmalloc.h | 46 + vendors/zlib/adler32.c | 179 + vendors/zlib/compress.c | 80 + vendors/zlib/crc32.c | 425 + vendors/zlib/crc32.h | 441 + vendors/zlib/deflate.c | 1967 ++++ vendors/zlib/deflate.h | 346 + vendors/zlib/gzclose.c | 25 + vendors/zlib/gzguts.h | 209 + vendors/zlib/gzlib.c | 634 ++ vendors/zlib/gzread.c | 594 ++ vendors/zlib/gzwrite.c | 577 ++ vendors/zlib/include/zlib.h | 1357 --- vendors/zlib/infback.c | 640 ++ vendors/zlib/inffast.c | 340 + vendors/zlib/inffast.h | 11 + vendors/zlib/inffixed.h | 94 + vendors/zlib/inflate.c | 1512 +++ vendors/zlib/inflate.h | 122 + vendors/zlib/inftrees.c | 306 + vendors/zlib/inftrees.h | 62 + vendors/zlib/lib/libz.a | Bin 77534 -> 0 bytes vendors/zlib/lib/libz.dll.a | Bin 43738 -> 0 bytes vendors/zlib/lib/zlib-bcc.lib | Bin 6656 -> 0 bytes vendors/zlib/lib/zlib.def | 75 - vendors/zlib/lib/zlib.lib | Bin 14778 -> 0 bytes vendors/zlib/manifest/zlib-1.2.3-lib.mft | 9 - vendors/zlib/manifest/zlib-1.2.3-lib.ver | 2 - vendors/zlib/trees.c | 1226 +++ vendors/zlib/trees.h | 128 + vendors/zlib/uncompr.c | 59 + vendors/zlib/{include => }/zconf.h | 289 +- vendors/zlib/zlib.h | 1768 ++++ vendors/zlib/zlib.vcxproj | 106 + vendors/zlib/zlib.vcxproj.filters | 95 + vendors/zlib/zutil.c | 324 + vendors/zlib/zutil.h | 253 + 404 files changed, 119261 insertions(+), 1499 deletions(-) create mode 100644 UpgradeLog.htm create mode 100644 libimobiledevice-tools/idevicerestore/idevicerestore.vcxproj create mode 100644 libimobiledevice-tools/idevicerestore/idevicerestore.vcxproj.filters create mode 100644 libirecovery/libirecovery.vcxproj create mode 100644 libirecovery/libirecovery.vcxproj.filters create mode 100644 vendors/_bin/libcurl.dll create mode 100644 vendors/_bin/zlib1.dll create mode 100644 vendors/libcurl/CHANGES create mode 100644 vendors/libcurl/COPYING create mode 100644 vendors/libcurl/README create mode 100644 vendors/libcurl/RELEASE-NOTES create mode 100644 vendors/libcurl/docs/BINDINGS create mode 100644 vendors/libcurl/docs/BUGS create mode 100644 vendors/libcurl/docs/CONTRIBUTE create mode 100644 vendors/libcurl/docs/DISTRO-DILEMMA create mode 100644 vendors/libcurl/docs/FAQ create mode 100644 vendors/libcurl/docs/FEATURES create mode 100644 vendors/libcurl/docs/HISTORY create mode 100644 vendors/libcurl/docs/INSTALL create mode 100644 vendors/libcurl/docs/INSTALL.devcpp create mode 100644 vendors/libcurl/docs/INTERNALS create mode 100644 vendors/libcurl/docs/KNOWN_BUGS create mode 100644 vendors/libcurl/docs/LICENSE-MIXING create mode 100644 vendors/libcurl/docs/MANUAL create mode 100644 vendors/libcurl/docs/Makefile.am create mode 100644 vendors/libcurl/docs/Makefile.in create mode 100644 vendors/libcurl/docs/README.netware create mode 100644 vendors/libcurl/docs/README.win32 create mode 100644 vendors/libcurl/docs/RESOURCES create mode 100644 vendors/libcurl/docs/SSLCERTS create mode 100644 vendors/libcurl/docs/THANKS create mode 100644 vendors/libcurl/docs/TODO create mode 100644 vendors/libcurl/docs/TheArtOfHttpScripting create mode 100644 vendors/libcurl/docs/VERSIONS create mode 100644 vendors/libcurl/docs/curl-config.1 create mode 100644 vendors/libcurl/docs/curl-config.html create mode 100644 vendors/libcurl/docs/curl-config.pdf create mode 100644 vendors/libcurl/docs/curl.1 create mode 100644 vendors/libcurl/docs/curl.html create mode 100644 vendors/libcurl/docs/curl.pdf create mode 100644 vendors/libcurl/docs/examples/10-at-a-time.c create mode 100644 vendors/libcurl/docs/examples/Makefile.am create mode 100644 vendors/libcurl/docs/examples/Makefile.example create mode 100644 vendors/libcurl/docs/examples/Makefile.in create mode 100644 vendors/libcurl/docs/examples/README create mode 100644 vendors/libcurl/docs/examples/anyauthput.c create mode 100644 vendors/libcurl/docs/examples/cacertinmem.c create mode 100644 vendors/libcurl/docs/examples/cookie_interface.c create mode 100644 vendors/libcurl/docs/examples/curlgtk.c create mode 100644 vendors/libcurl/docs/examples/curlx.c create mode 100644 vendors/libcurl/docs/examples/debug.c create mode 100644 vendors/libcurl/docs/examples/fileupload.c create mode 100644 vendors/libcurl/docs/examples/fopen.c create mode 100644 vendors/libcurl/docs/examples/ftpget.c create mode 100644 vendors/libcurl/docs/examples/ftpgetresp.c create mode 100644 vendors/libcurl/docs/examples/ftpupload.c create mode 100644 vendors/libcurl/docs/examples/ftpuploadresume.c create mode 100644 vendors/libcurl/docs/examples/getinfo.c create mode 100644 vendors/libcurl/docs/examples/getinmemory.c create mode 100644 vendors/libcurl/docs/examples/ghiper.c create mode 100644 vendors/libcurl/docs/examples/hiperfifo.c create mode 100644 vendors/libcurl/docs/examples/htmltidy.c create mode 100644 vendors/libcurl/docs/examples/htmltitle.cc create mode 100644 vendors/libcurl/docs/examples/http-post.c create mode 100644 vendors/libcurl/docs/examples/httpput.c create mode 100644 vendors/libcurl/docs/examples/https.c create mode 100644 vendors/libcurl/docs/examples/makefile.dj create mode 100644 vendors/libcurl/docs/examples/multi-app.c create mode 100644 vendors/libcurl/docs/examples/multi-debugcallback.c create mode 100644 vendors/libcurl/docs/examples/multi-double.c create mode 100644 vendors/libcurl/docs/examples/multi-post.c create mode 100644 vendors/libcurl/docs/examples/multi-single.c create mode 100644 vendors/libcurl/docs/examples/multithread.c create mode 100644 vendors/libcurl/docs/examples/opensslthreadlock.c create mode 100644 vendors/libcurl/docs/examples/persistant.c create mode 100644 vendors/libcurl/docs/examples/post-callback.c create mode 100644 vendors/libcurl/docs/examples/postit2.c create mode 100644 vendors/libcurl/docs/examples/sampleconv.c create mode 100644 vendors/libcurl/docs/examples/sepheaders.c create mode 100644 vendors/libcurl/docs/examples/simple.c create mode 100644 vendors/libcurl/docs/examples/simplepost.c create mode 100644 vendors/libcurl/docs/examples/simplessl.c create mode 100644 vendors/libcurl/docs/examples/synctime.c create mode 100644 vendors/libcurl/docs/index.html create mode 100644 vendors/libcurl/docs/libcurl/ABI create mode 100644 vendors/libcurl/docs/libcurl/Makefile.am create mode 100644 vendors/libcurl/docs/libcurl/Makefile.in create mode 100644 vendors/libcurl/docs/libcurl/curl_easy_cleanup.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_easy_cleanup.html create mode 100644 vendors/libcurl/docs/libcurl/curl_easy_cleanup.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_easy_duphandle.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_easy_duphandle.html create mode 100644 vendors/libcurl/docs/libcurl/curl_easy_duphandle.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_easy_escape.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_easy_escape.html create mode 100644 vendors/libcurl/docs/libcurl/curl_easy_escape.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_easy_getinfo.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_easy_getinfo.html create mode 100644 vendors/libcurl/docs/libcurl/curl_easy_getinfo.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_easy_init.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_easy_init.html create mode 100644 vendors/libcurl/docs/libcurl/curl_easy_init.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_easy_pause.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_easy_pause.html create mode 100644 vendors/libcurl/docs/libcurl/curl_easy_pause.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_easy_perform.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_easy_perform.html create mode 100644 vendors/libcurl/docs/libcurl/curl_easy_perform.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_easy_reset.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_easy_reset.html create mode 100644 vendors/libcurl/docs/libcurl/curl_easy_reset.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_easy_setopt.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_easy_setopt.html create mode 100644 vendors/libcurl/docs/libcurl/curl_easy_setopt.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_easy_strerror.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_easy_strerror.html create mode 100644 vendors/libcurl/docs/libcurl/curl_easy_strerror.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_easy_unescape.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_easy_unescape.html create mode 100644 vendors/libcurl/docs/libcurl/curl_easy_unescape.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_escape.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_escape.html create mode 100644 vendors/libcurl/docs/libcurl/curl_escape.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_formadd.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_formadd.html create mode 100644 vendors/libcurl/docs/libcurl/curl_formadd.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_formfree.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_formfree.html create mode 100644 vendors/libcurl/docs/libcurl/curl_formfree.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_formget.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_formget.html create mode 100644 vendors/libcurl/docs/libcurl/curl_formget.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_free.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_free.html create mode 100644 vendors/libcurl/docs/libcurl/curl_free.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_getdate.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_getdate.html create mode 100644 vendors/libcurl/docs/libcurl/curl_getdate.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_getenv.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_getenv.html create mode 100644 vendors/libcurl/docs/libcurl/curl_getenv.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_global_cleanup.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_global_cleanup.html create mode 100644 vendors/libcurl/docs/libcurl/curl_global_cleanup.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_global_init.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_global_init.html create mode 100644 vendors/libcurl/docs/libcurl/curl_global_init.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_global_init_mem.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_global_init_mem.html create mode 100644 vendors/libcurl/docs/libcurl/curl_global_init_mem.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_mprintf.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_mprintf.html create mode 100644 vendors/libcurl/docs/libcurl/curl_mprintf.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_multi_add_handle.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_multi_add_handle.html create mode 100644 vendors/libcurl/docs/libcurl/curl_multi_add_handle.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_multi_assign.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_multi_assign.html create mode 100644 vendors/libcurl/docs/libcurl/curl_multi_assign.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_multi_cleanup.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_multi_cleanup.html create mode 100644 vendors/libcurl/docs/libcurl/curl_multi_cleanup.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_multi_fdset.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_multi_fdset.html create mode 100644 vendors/libcurl/docs/libcurl/curl_multi_fdset.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_multi_info_read.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_multi_info_read.html create mode 100644 vendors/libcurl/docs/libcurl/curl_multi_info_read.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_multi_init.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_multi_init.html create mode 100644 vendors/libcurl/docs/libcurl/curl_multi_init.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_multi_perform.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_multi_perform.html create mode 100644 vendors/libcurl/docs/libcurl/curl_multi_perform.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_multi_remove_handle.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_multi_remove_handle.html create mode 100644 vendors/libcurl/docs/libcurl/curl_multi_remove_handle.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_multi_setopt.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_multi_setopt.html create mode 100644 vendors/libcurl/docs/libcurl/curl_multi_setopt.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_multi_socket.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_multi_socket.html create mode 100644 vendors/libcurl/docs/libcurl/curl_multi_socket.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_multi_strerror.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_multi_strerror.html create mode 100644 vendors/libcurl/docs/libcurl/curl_multi_strerror.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_multi_timeout.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_multi_timeout.html create mode 100644 vendors/libcurl/docs/libcurl/curl_multi_timeout.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_share_cleanup.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_share_cleanup.html create mode 100644 vendors/libcurl/docs/libcurl/curl_share_cleanup.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_share_init.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_share_init.html create mode 100644 vendors/libcurl/docs/libcurl/curl_share_init.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_share_setopt.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_share_setopt.html create mode 100644 vendors/libcurl/docs/libcurl/curl_share_setopt.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_share_strerror.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_share_strerror.html create mode 100644 vendors/libcurl/docs/libcurl/curl_share_strerror.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_slist_append.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_slist_append.html create mode 100644 vendors/libcurl/docs/libcurl/curl_slist_append.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_slist_free_all.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_slist_free_all.html create mode 100644 vendors/libcurl/docs/libcurl/curl_slist_free_all.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_strequal.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_strequal.html create mode 100644 vendors/libcurl/docs/libcurl/curl_strequal.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_unescape.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_unescape.html create mode 100644 vendors/libcurl/docs/libcurl/curl_unescape.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_version.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_version.html create mode 100644 vendors/libcurl/docs/libcurl/curl_version.pdf create mode 100644 vendors/libcurl/docs/libcurl/curl_version_info.3 create mode 100644 vendors/libcurl/docs/libcurl/curl_version_info.html create mode 100644 vendors/libcurl/docs/libcurl/curl_version_info.pdf create mode 100644 vendors/libcurl/docs/libcurl/index.html create mode 100644 vendors/libcurl/docs/libcurl/libcurl-easy.3 create mode 100644 vendors/libcurl/docs/libcurl/libcurl-easy.html create mode 100644 vendors/libcurl/docs/libcurl/libcurl-easy.pdf create mode 100644 vendors/libcurl/docs/libcurl/libcurl-errors.3 create mode 100644 vendors/libcurl/docs/libcurl/libcurl-errors.html create mode 100644 vendors/libcurl/docs/libcurl/libcurl-errors.pdf create mode 100644 vendors/libcurl/docs/libcurl/libcurl-multi.3 create mode 100644 vendors/libcurl/docs/libcurl/libcurl-multi.html create mode 100644 vendors/libcurl/docs/libcurl/libcurl-multi.pdf create mode 100644 vendors/libcurl/docs/libcurl/libcurl-share.3 create mode 100644 vendors/libcurl/docs/libcurl/libcurl-share.html create mode 100644 vendors/libcurl/docs/libcurl/libcurl-share.pdf create mode 100644 vendors/libcurl/docs/libcurl/libcurl-tutorial.3 create mode 100644 vendors/libcurl/docs/libcurl/libcurl-tutorial.html create mode 100644 vendors/libcurl/docs/libcurl/libcurl-tutorial.pdf create mode 100644 vendors/libcurl/docs/libcurl/libcurl.3 create mode 100644 vendors/libcurl/docs/libcurl/libcurl.html create mode 100644 vendors/libcurl/docs/libcurl/libcurl.m4 create mode 100644 vendors/libcurl/docs/libcurl/libcurl.pdf create mode 100644 vendors/libcurl/include/Makefile.am create mode 100644 vendors/libcurl/include/Makefile.in create mode 100644 vendors/libcurl/include/README create mode 100644 vendors/libcurl/include/curl/Makefile.am create mode 100644 vendors/libcurl/include/curl/Makefile.in create mode 100644 vendors/libcurl/include/curl/curl.h create mode 100644 vendors/libcurl/include/curl/curlver.h create mode 100644 vendors/libcurl/include/curl/easy.h create mode 100644 vendors/libcurl/include/curl/mprintf.h create mode 100644 vendors/libcurl/include/curl/multi.h create mode 100644 vendors/libcurl/include/curl/stdcheaders.h create mode 100644 vendors/libcurl/include/curl/types.h create mode 100644 vendors/libcurl/libcurl.dll create mode 100644 vendors/libcurl/libcurl.exp create mode 100644 vendors/libcurl/libcurl.lib create mode 100644 vendors/readline/manifest/readline-5.0-1-src.mft create mode 100644 vendors/readline/manifest/readline-5.0-1-src.ver create mode 100644 vendors/readline/readline-32.vcproj create mode 100644 vendors/readline/readline-32.vcxproj create mode 100644 vendors/readline/readline-32.vcxproj.filters create mode 100644 vendors/readline/src/readline/CHANGELOG create mode 100644 vendors/readline/src/readline/CHANGES create mode 100644 vendors/readline/src/readline/COPYING create mode 100644 vendors/readline/src/readline/INSTALL create mode 100644 vendors/readline/src/readline/MANIFEST create mode 100644 vendors/readline/src/readline/Makefile.in create mode 100644 vendors/readline/src/readline/NEWS create mode 100644 vendors/readline/src/readline/README create mode 100644 vendors/readline/src/readline/USAGE create mode 100644 vendors/readline/src/readline/aclocal.m4 create mode 100644 vendors/readline/src/readline/ansi_stdlib.h create mode 100644 vendors/readline/src/readline/bind.c create mode 100644 vendors/readline/src/readline/callback.c create mode 100644 vendors/readline/src/readline/chardefs.h create mode 100644 vendors/readline/src/readline/compat.c create mode 100644 vendors/readline/src/readline/complete.c create mode 100644 vendors/readline/src/readline/config.h.in create mode 100644 vendors/readline/src/readline/configure create mode 100644 vendors/readline/src/readline/configure.in create mode 100644 vendors/readline/src/readline/display.c create mode 100644 vendors/readline/src/readline/doc/fdl.texi create mode 100644 vendors/readline/src/readline/doc/history.3 create mode 100644 vendors/readline/src/readline/doc/history.texi create mode 100644 vendors/readline/src/readline/doc/hstech.texi create mode 100644 vendors/readline/src/readline/doc/hsuser.texi create mode 100644 vendors/readline/src/readline/doc/readline.3 create mode 100644 vendors/readline/src/readline/doc/rlman.texi create mode 100644 vendors/readline/src/readline/doc/rltech.texi create mode 100644 vendors/readline/src/readline/doc/rluser.texi create mode 100644 vendors/readline/src/readline/doc/rluserman.texi create mode 100644 vendors/readline/src/readline/doc/texi2dvi create mode 100644 vendors/readline/src/readline/doc/texi2html create mode 100644 vendors/readline/src/readline/doc/texinfo.tex create mode 100644 vendors/readline/src/readline/doc/version.texi create mode 100644 vendors/readline/src/readline/emacs_keymap.c create mode 100644 vendors/readline/src/readline/examples/Inputrc create mode 100644 vendors/readline/src/readline/examples/Makefile.in create mode 100644 vendors/readline/src/readline/examples/excallback.c create mode 100644 vendors/readline/src/readline/examples/fileman.c create mode 100644 vendors/readline/src/readline/examples/histexamp.c create mode 100644 vendors/readline/src/readline/examples/manexamp.c create mode 100644 vendors/readline/src/readline/examples/readlinebuf.h create mode 100644 vendors/readline/src/readline/examples/rl-fgets.c create mode 100644 vendors/readline/src/readline/examples/rl.c create mode 100644 vendors/readline/src/readline/examples/rlcat.c create mode 100644 vendors/readline/src/readline/examples/rlfe.c create mode 100644 vendors/readline/src/readline/examples/rltest.c create mode 100644 vendors/readline/src/readline/examples/rlversion.c create mode 100644 vendors/readline/src/readline/funmap.c create mode 100644 vendors/readline/src/readline/histexpand.c create mode 100644 vendors/readline/src/readline/histfile.c create mode 100644 vendors/readline/src/readline/histlib.h create mode 100644 vendors/readline/src/readline/history.c create mode 100644 vendors/readline/src/readline/history.h create mode 100644 vendors/readline/src/readline/histsearch.c create mode 100644 vendors/readline/src/readline/input.c create mode 100644 vendors/readline/src/readline/isearch.c create mode 100644 vendors/readline/src/readline/keymaps.c create mode 100644 vendors/readline/src/readline/keymaps.h create mode 100644 vendors/readline/src/readline/kill.c create mode 100644 vendors/readline/src/readline/macro.c create mode 100644 vendors/readline/src/readline/mbutil.c create mode 100644 vendors/readline/src/readline/misc.c create mode 100644 vendors/readline/src/readline/nls.c create mode 100644 vendors/readline/src/readline/parens.c create mode 100644 vendors/readline/src/readline/posixdir.h create mode 100644 vendors/readline/src/readline/posixjmp.h create mode 100644 vendors/readline/src/readline/posixstat.h create mode 100644 vendors/readline/src/readline/readline.c create mode 100644 vendors/readline/src/readline/readline.h create mode 100644 vendors/readline/src/readline/rlconf.h create mode 100644 vendors/readline/src/readline/rldefs.h create mode 100644 vendors/readline/src/readline/rlmbutil.h create mode 100644 vendors/readline/src/readline/rlprivate.h create mode 100644 vendors/readline/src/readline/rlshell.h create mode 100644 vendors/readline/src/readline/rlstdc.h create mode 100644 vendors/readline/src/readline/rltty.c create mode 100644 vendors/readline/src/readline/rltty.h create mode 100644 vendors/readline/src/readline/rltypedefs.h create mode 100644 vendors/readline/src/readline/rlwinsize.h create mode 100644 vendors/readline/src/readline/savestring.c create mode 100644 vendors/readline/src/readline/search.c create mode 100644 vendors/readline/src/readline/shell.c create mode 100644 vendors/readline/src/readline/shlib/Makefile.in create mode 100644 vendors/readline/src/readline/signals.c create mode 100644 vendors/readline/src/readline/support/config.guess create mode 100644 vendors/readline/src/readline/support/config.rpath create mode 100644 vendors/readline/src/readline/support/config.sub create mode 100644 vendors/readline/src/readline/support/install.sh create mode 100644 vendors/readline/src/readline/support/mkdirs create mode 100644 vendors/readline/src/readline/support/mkdist create mode 100644 vendors/readline/src/readline/support/mkinstalldirs create mode 100644 vendors/readline/src/readline/support/shlib-install create mode 100644 vendors/readline/src/readline/support/shobj-conf create mode 100644 vendors/readline/src/readline/support/wcwidth.c create mode 100644 vendors/readline/src/readline/tcap.h create mode 100644 vendors/readline/src/readline/terminal.c create mode 100644 vendors/readline/src/readline/text.c create mode 100644 vendors/readline/src/readline/tilde.c create mode 100644 vendors/readline/src/readline/tilde.h create mode 100644 vendors/readline/src/readline/undo.c create mode 100644 vendors/readline/src/readline/util.c create mode 100644 vendors/readline/src/readline/vi_keymap.c create mode 100644 vendors/readline/src/readline/vi_mode.c create mode 100644 vendors/readline/src/readline/xmalloc.c create mode 100644 vendors/readline/src/readline/xmalloc.h create mode 100644 vendors/zlib/adler32.c create mode 100644 vendors/zlib/compress.c create mode 100644 vendors/zlib/crc32.c create mode 100644 vendors/zlib/crc32.h create mode 100644 vendors/zlib/deflate.c create mode 100644 vendors/zlib/deflate.h create mode 100644 vendors/zlib/gzclose.c create mode 100644 vendors/zlib/gzguts.h create mode 100644 vendors/zlib/gzlib.c create mode 100644 vendors/zlib/gzread.c create mode 100644 vendors/zlib/gzwrite.c delete mode 100644 vendors/zlib/include/zlib.h create mode 100644 vendors/zlib/infback.c create mode 100644 vendors/zlib/inffast.c create mode 100644 vendors/zlib/inffast.h create mode 100644 vendors/zlib/inffixed.h create mode 100644 vendors/zlib/inflate.c create mode 100644 vendors/zlib/inflate.h create mode 100644 vendors/zlib/inftrees.c create mode 100644 vendors/zlib/inftrees.h delete mode 100644 vendors/zlib/lib/libz.a delete mode 100644 vendors/zlib/lib/libz.dll.a delete mode 100644 vendors/zlib/lib/zlib-bcc.lib delete mode 100644 vendors/zlib/lib/zlib.def delete mode 100644 vendors/zlib/lib/zlib.lib delete mode 100644 vendors/zlib/manifest/zlib-1.2.3-lib.mft delete mode 100644 vendors/zlib/manifest/zlib-1.2.3-lib.ver create mode 100644 vendors/zlib/trees.c create mode 100644 vendors/zlib/trees.h create mode 100644 vendors/zlib/uncompr.c rename vendors/zlib/{include => }/zconf.h (54%) create mode 100644 vendors/zlib/zlib.h create mode 100644 vendors/zlib/zlib.vcxproj create mode 100644 vendors/zlib/zlib.vcxproj.filters create mode 100644 vendors/zlib/zutil.c create mode 100644 vendors/zlib/zutil.h diff --git a/UpgradeLog.htm b/UpgradeLog.htm new file mode 100644 index 0000000000000000000000000000000000000000..c98590fc7f99a8fe7addf42ca050a43a11c67a04 GIT binary patch literal 29056 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 NK1-Va+uzUG{{uXrH)j9< literal 0 HcmV?d00001 diff --git a/libcompat/libcompat.h b/libcompat/libcompat.h index 45e0657..b47f3ef 100644 --- a/libcompat/libcompat.h +++ b/libcompat/libcompat.h @@ -21,4 +21,8 @@ struct timezone int gettimeofday(struct timeval *tv, struct timezone *tz); +#ifndef __func__ +# define __func__ __FUNCTION__ +#endif + #endif LIBCOMPAT_H diff --git a/libimobiledevice-tools/idevicerestore/idevicerestore.vcxproj b/libimobiledevice-tools/idevicerestore/idevicerestore.vcxproj new file mode 100644 index 0000000..09cb966 --- /dev/null +++ b/libimobiledevice-tools/idevicerestore/idevicerestore.vcxproj @@ -0,0 +1,124 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {2207096E-499F-4224-85BD-BD4FD1EFFB9E} + Win32Proj + idevicerestore + + + + Application + true + v110 + MultiByte + + + Application + false + v110 + true + Unicode + + + + + + + + + + + + + + + true + + + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;CURL_STATICLIB;ZIP_STATIC;%(PreprocessorDefinitions) + $(SolutionDir)\libirecovery\libirecovery\include;$(SolutionDir)\libzip;$(SolutionDir)\vendors\openssl\include;$(SolutionDir)\vendors\libcurl\include;$(SolutionDir)\vendors\zlib;%(AdditionalIncludeDirectories) + CompileAsCpp + + + Console + true + libirecovery.lib;libcurl.lib;zlib.lib;libzip.lib;Setupapi.lib;%(AdditionalDependencies) + $(SolutionDir)\vendors\libcurl;%(AdditionalLibraryDirectories) + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + + + Console + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libimobiledevice-tools/idevicerestore/idevicerestore.vcxproj.filters b/libimobiledevice-tools/idevicerestore/idevicerestore.vcxproj.filters new file mode 100644 index 0000000..20f693c --- /dev/null +++ b/libimobiledevice-tools/idevicerestore/idevicerestore.vcxproj.filters @@ -0,0 +1,116 @@ + + + + + {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 + + + + + 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 + + + \ No newline at end of file diff --git a/libimobiledevice-win32.sln b/libimobiledevice-win32.sln index d703b82..7961571 100644 --- a/libimobiledevice-win32.sln +++ b/libimobiledevice-win32.sln @@ -105,6 +105,26 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libxml2", "vendors\libxml\l EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libiconv", "vendors\libiconv\libiconv.vcxproj", "{0788DB65-CD86-4A0D-A245-F29C0114373B}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "idevicerestore", "libimobiledevice-tools\idevicerestore\idevicerestore.vcxproj", "{2207096E-499F-4224-85BD-BD4FD1EFFB9E}" + ProjectSection(ProjectDependencies) = postProject + {3AC1B24F-07D1-4574-8E1D-9D305C226D08} = {3AC1B24F-07D1-4574-8E1D-9D305C226D08} + {CA9DE663-102C-4953-B09E-BCFFEC17D7E4} = {CA9DE663-102C-4953-B09E-BCFFEC17D7E4} + {6F26C69D-46EE-40AE-92E3-CD205B2C18E0} = {6F26C69D-46EE-40AE-92E3-CD205B2C18E0} + {099792A3-A922-4694-A5BB-D3BC77C96F54} = {099792A3-A922-4694-A5BB-D3BC77C96F54} + {1C06E1E0-3FF7-4DAF-A9BA-7C8E2FA11B03} = {1C06E1E0-3FF7-4DAF-A9BA-7C8E2FA11B03} + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "vendors", "vendors", "{0990581B-51D6-40AF-B700-6FC0891F0273}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libirecovery", "libirecovery\libirecovery.vcxproj", "{3AC1B24F-07D1-4574-8E1D-9D305C226D08}" + ProjectSection(ProjectDependencies) = postProject + {A53373DC-C383-4A02-897A-161CE9BCADE4} = {A53373DC-C383-4A02-897A-161CE9BCADE4} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "readline", "vendors\readline\readline-32.vcxproj", "{A53373DC-C383-4A02-897A-161CE9BCADE4}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlib", "vendors\zlib\zlib.vcxproj", "{099792A3-A922-4694-A5BB-D3BC77C96F54}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -355,6 +375,46 @@ Global {0788DB65-CD86-4A0D-A245-F29C0114373B}.Release|Mixed Platforms.Build.0 = Release|Win32 {0788DB65-CD86-4A0D-A245-F29C0114373B}.Release|Win32.ActiveCfg = Release|Win32 {0788DB65-CD86-4A0D-A245-F29C0114373B}.Release|Win32.Build.0 = Release|Win32 + {2207096E-499F-4224-85BD-BD4FD1EFFB9E}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {2207096E-499F-4224-85BD-BD4FD1EFFB9E}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {2207096E-499F-4224-85BD-BD4FD1EFFB9E}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {2207096E-499F-4224-85BD-BD4FD1EFFB9E}.Debug|Win32.ActiveCfg = Debug|Win32 + {2207096E-499F-4224-85BD-BD4FD1EFFB9E}.Debug|Win32.Build.0 = Debug|Win32 + {2207096E-499F-4224-85BD-BD4FD1EFFB9E}.Release|Any CPU.ActiveCfg = Release|Win32 + {2207096E-499F-4224-85BD-BD4FD1EFFB9E}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {2207096E-499F-4224-85BD-BD4FD1EFFB9E}.Release|Mixed Platforms.Build.0 = Release|Win32 + {2207096E-499F-4224-85BD-BD4FD1EFFB9E}.Release|Win32.ActiveCfg = Release|Win32 + {2207096E-499F-4224-85BD-BD4FD1EFFB9E}.Release|Win32.Build.0 = Release|Win32 + {3AC1B24F-07D1-4574-8E1D-9D305C226D08}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {3AC1B24F-07D1-4574-8E1D-9D305C226D08}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {3AC1B24F-07D1-4574-8E1D-9D305C226D08}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {3AC1B24F-07D1-4574-8E1D-9D305C226D08}.Debug|Win32.ActiveCfg = Debug|Win32 + {3AC1B24F-07D1-4574-8E1D-9D305C226D08}.Debug|Win32.Build.0 = Debug|Win32 + {3AC1B24F-07D1-4574-8E1D-9D305C226D08}.Release|Any CPU.ActiveCfg = Release|Win32 + {3AC1B24F-07D1-4574-8E1D-9D305C226D08}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {3AC1B24F-07D1-4574-8E1D-9D305C226D08}.Release|Mixed Platforms.Build.0 = Release|Win32 + {3AC1B24F-07D1-4574-8E1D-9D305C226D08}.Release|Win32.ActiveCfg = Release|Win32 + {3AC1B24F-07D1-4574-8E1D-9D305C226D08}.Release|Win32.Build.0 = Release|Win32 + {A53373DC-C383-4A02-897A-161CE9BCADE4}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {A53373DC-C383-4A02-897A-161CE9BCADE4}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {A53373DC-C383-4A02-897A-161CE9BCADE4}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {A53373DC-C383-4A02-897A-161CE9BCADE4}.Debug|Win32.ActiveCfg = Debug|Win32 + {A53373DC-C383-4A02-897A-161CE9BCADE4}.Debug|Win32.Build.0 = Debug|Win32 + {A53373DC-C383-4A02-897A-161CE9BCADE4}.Release|Any CPU.ActiveCfg = Release|Win32 + {A53373DC-C383-4A02-897A-161CE9BCADE4}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {A53373DC-C383-4A02-897A-161CE9BCADE4}.Release|Mixed Platforms.Build.0 = Release|Win32 + {A53373DC-C383-4A02-897A-161CE9BCADE4}.Release|Win32.ActiveCfg = Release|Win32 + {A53373DC-C383-4A02-897A-161CE9BCADE4}.Release|Win32.Build.0 = Release|Win32 + {099792A3-A922-4694-A5BB-D3BC77C96F54}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {099792A3-A922-4694-A5BB-D3BC77C96F54}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {099792A3-A922-4694-A5BB-D3BC77C96F54}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {099792A3-A922-4694-A5BB-D3BC77C96F54}.Debug|Win32.ActiveCfg = Debug|Win32 + {099792A3-A922-4694-A5BB-D3BC77C96F54}.Debug|Win32.Build.0 = Debug|Win32 + {099792A3-A922-4694-A5BB-D3BC77C96F54}.Release|Any CPU.ActiveCfg = Release|Win32 + {099792A3-A922-4694-A5BB-D3BC77C96F54}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {099792A3-A922-4694-A5BB-D3BC77C96F54}.Release|Mixed Platforms.Build.0 = Release|Win32 + {099792A3-A922-4694-A5BB-D3BC77C96F54}.Release|Win32.ActiveCfg = Release|Win32 + {099792A3-A922-4694-A5BB-D3BC77C96F54}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -372,5 +432,16 @@ Global {B2F015FE-07F5-43AC-B6E6-DF8D0D4ADC66} = {054378B1-3FE2-4586-A94C-11424D95C913} {F3837EA2-E283-4D52-8955-0BD75A8F6CFB} = {054378B1-3FE2-4586-A94C-11424D95C913} {98E67352-7104-464C-8774-149B704660A1} = {054378B1-3FE2-4586-A94C-11424D95C913} + {2207096E-499F-4224-85BD-BD4FD1EFFB9E} = {054378B1-3FE2-4586-A94C-11424D95C913} + {1C06E1E0-3FF7-4DAF-A9BA-7C8E2FA11B03} = {0990581B-51D6-40AF-B700-6FC0891F0273} + {AA5715E5-75AA-4CCC-A3D7-819FC833603C} = {0990581B-51D6-40AF-B700-6FC0891F0273} + {3E2B717A-7A6F-4FF5-9025-738968045272} = {0990581B-51D6-40AF-B700-6FC0891F0273} + {0788DB65-CD86-4A0D-A245-F29C0114373B} = {0990581B-51D6-40AF-B700-6FC0891F0273} + {1D6039F6-5078-416F-A3AF-A36EFC7E6A1C} = {0990581B-51D6-40AF-B700-6FC0891F0273} + {CA9DE663-102C-4953-B09E-BCFFEC17D7E4} = {0990581B-51D6-40AF-B700-6FC0891F0273} + {6868442D-4090-4022-8BD0-49446B1C249F} = {0990581B-51D6-40AF-B700-6FC0891F0273} + {D945F0CD-6C29-47DC-8687-18A06CF7502E} = {0990581B-51D6-40AF-B700-6FC0891F0273} + {A53373DC-C383-4A02-897A-161CE9BCADE4} = {0990581B-51D6-40AF-B700-6FC0891F0273} + {099792A3-A922-4694-A5BB-D3BC77C96F54} = {0990581B-51D6-40AF-B700-6FC0891F0273} EndGlobalSection EndGlobal diff --git a/libirecovery/libirecovery.vcxproj b/libirecovery/libirecovery.vcxproj new file mode 100644 index 0000000..96c7452 --- /dev/null +++ b/libirecovery/libirecovery.vcxproj @@ -0,0 +1,85 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + + + + + + + + {3AC1B24F-07D1-4574-8E1D-9D305C226D08} + Win32Proj + libirecovery + + + + StaticLibrary + true + v110 + MultiByte + + + StaticLibrary + false + v110 + true + Unicode + + + + + + + + + + + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + $(ProjectDir)libirecovery\include;$(SolutionDir)vendors\include;$(SolutionDir)vendors\readline\src;$(SolutionDir)getopt;%(AdditionalIncludeDirectories) + CompileAsCpp + + + Windows + true + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + + + Windows + true + true + true + + + + + + \ No newline at end of file diff --git a/libirecovery/libirecovery.vcxproj.filters b/libirecovery/libirecovery.vcxproj.filters new file mode 100644 index 0000000..b70266e --- /dev/null +++ b/libirecovery/libirecovery.vcxproj.filters @@ -0,0 +1,26 @@ + + + + + {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 + + + + + Header Files + + + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/libzip/libzip.vcxproj b/libzip/libzip.vcxproj index 33bac24..a1904a7 100644 --- a/libzip/libzip.vcxproj +++ b/libzip/libzip.vcxproj @@ -131,7 +131,7 @@ TurnOffAllWarnings Disabled WIN32;_DEBUG;_LIB;ZIP_STATIC;__STDC_LIMIT_MACROS;HAVE__SNPRINTF;HAVE__STRICMP;HAVE__STRDUP;%(PreprocessorDefinitions) - $(SolutionDir)\vendors\zlib\include;$(SolutionDir)\getopt;$(SolutionDir)\vendors\include;%(AdditionalIncludeDirectories) + $(SolutionDir)\vendors\zlib;$(SolutionDir)\getopt;$(SolutionDir)\vendors\include;%(AdditionalIncludeDirectories) Default MultiThreadedDebugDLL diff --git a/vendors/_bin/libcurl.dll b/vendors/_bin/libcurl.dll new file mode 100644 index 0000000000000000000000000000000000000000..1077cd956900e791995496c36533ad76bce29365 GIT binary patch literal 270336 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

    rOJ)Lky;$Gp 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 literal 0 HcmV?d00001 diff --git a/vendors/_bin/zlib1.dll b/vendors/_bin/zlib1.dll new file mode 100644 index 0000000000000000000000000000000000000000..9ea38d5cf3e0ddbeaccc0122ce3cdb6c3741a3e1 GIT binary patch literal 107520 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

    |MhCkB4mr`;oB! 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 seeks (as fseek() doesn't allow that) + on systems that offer support for that. + +Daniel S (10 Jan 2008) +- Michal Marek made curl-config --libs not include /usr/lib64 in the output + (it already before skipped /usr/lib). /usr/lib64 is the default library + directory on many 64bit systems and it's unlikely that anyone would use the + path privately on systems where it's not. + +- Georg Lippitsch brought CURLOPT_SEEKFUNCTION and CURLOPT_SEEKDATA to allow + libcurl to seek in a given input stream. This is particularly important when + doing upload resumes when there's already a huge part of the file present + remotely. Before, and still if this callback isn't used, libcurl will read + and through away the entire file up to the point to where the resuming + begins (which of course can be a slow opereration depending on file size, + I/O bandwidth and more). This new function will also be preferred to get + used instead of the CURLOPT_IOCTLFUNCTION for seeking back in a stream when + doing multi-stage HTTP auth with POST/PUT. + +- Nikitinskit Dmitriy filed bug report #1868255 + (http://curl.haxx.se/bug/view.cgi?id=1868255) with a patch. It identifies + and fixes a problem with parsing WWW-Authenticate: headers with additional + spaces in the line that the parser wasn't written to deal with. + +Daniel S (8 Jan 2008) +- Introducing curl_easy_pause() and new magic return codes for both the read + and the write callbacks that now can make a connection's reading and/or + writing get paused. + +Daniel S (6 Jan 2008) +- Jeff Johnson filed bug report #1863171 + (http://curl.haxx.se/bug/view.cgi?id=1863171) where he pointed out that + libcurl's date parser didn't accept a +1300 time zone which actually is used + fairly often (like New Zealand's Dailight Savings Time), so I modified the + parser to now accept up to and including -1400 to +1400. + +Daniel S (5 Jan 2008) +- Based on further discussion on curl-library, I reverted yesterday's SOCKS5 + code to instead introduce support for a new proxy type called + CURLPROXY_SOCKS5_HOSTNAME that is used to send the host name to the proxy + instead of IP address and there's thus no longer any need for a new + curl_easy_setopt() option. + + The default SOCKS5 proxy is again back to sending the IP address to the + proxy. The new curl command line option for enabling sending host name to a + SOCKS5 proxy is now --socks5-hostname. + +Daniel S (4 Jan 2008) +- Based on Maxim Perenesenko's patch, we now do SOCKS5 operations and let the + proxy do the host name resolving and only if --socks5ip (or + CURLOPT_SOCKS5_RESOLVE_LOCAL) is used we resolve the host name locally and + pass on the IP address only to the proxy. + +Yang Tse (3 Jan 2008) +- Modified test harness to allow SCP, SFTP and SOCKS4 tests to run with + OpenSSH 2.9.9, SunSSH 1.0 or later versions. SOCKS5 tests need OpenSSH + 3.7, SunSSH 1.0 or later. + +Daniel S (2 Jan 2008) +- I fixed two cases of missing return code checks when handling chunked + decoding where a write error (or abort return from a callback) didn't stop + libcurl's processing. + +- I removed the socklen_t use from the public curl/curl.h header and instead + made it an unsigned int. The type was only used in the curl_sockaddr struct + definition (only used by the curl_opensocket_callback). On all platforms I + could find information about, socklen_t is 32 unsigned bits large so I don't + think this will break the API or ABI. The main reason for this change is of + course for all the platforms that don't have a socklen_t definition in their + headers to build fine again. Providing our own configure magic and custom + definition of socklen_t on those systems proved to work but was a lot of + cruft, code and extra magic needed - when this very small change of type + seems harmless and still solves the missing socklen_t problem. + +- Richard Atterer brought a patch that added support for SOCKS4a proxies, + which is an inofficial PROXY4 variant that sends the hostname to the proxy + instead of the resolved address (which is already supported by SOCKS5). + --socks4a is the curl command line option for it and CURLOPT_PROXYTYPE can + now be set to CURLPROXY_SOCKS4A as well. + +Daniel S (1 Jan 2008) +- Mohun Biswas pointed out that --libcurl generated a source code with an int + function but without a return statement. While fixing that, I also took care + about adding some better comments for the generated code. + +Daniel S (27 Dec 2007) +- Dmitry Kurochkin mentioned a flaw + (http://curl.haxx.se/mail/lib-2007-12/0252.html) in detect_proxy() which + failed to set the bits.proxy variable properly when an environment variable + told libcurl to use a http proxy. + +Daniel S (26 Dec 2007) +- In an attempt to repeat the problem in bug report #1850730 + (http://curl.haxx.se/bug/view.cgi?id=1850730) I wrote up test case 552. The + test is doing a 70K POST with a read callback and an ioctl callback over a + proxy requiring Digest auth. The test case code is more or less identical to + the test recipe code provided by Spacen Jasset (who submitted the bug + report). + +Daniel S (25 Dec 2007) +- Gary Maxwell filed bug report #1856628 + (http://curl.haxx.se/bug/view.cgi?id=1856628) and provided a fix for the + (small) memory leak in the SSL session ID caching code. It happened when a + previous entry in the cache was re-used. + +Daniel Fandrich (19 Dec 2007) +- Ensure that nroff doesn't put anything but ASCII characters into the + --manual text. + +Yang Tse (18 Dec 2007) +- MSVC 9.0 (VS2008) does not support Windows build targets prior to WinXP, + and makes wrong asumptions of build target when it isn't specified. So, + if no build target has been defined we will target WinXP when building + curl/libcurl with MSVC 9.0 (VS2008). + +- (http://curl.haxx.se/mail/archive-2007-12/0039.html) reported and fixed + a file truncation problem on Windows build targets triggered when retrying + a download with curl. + +Daniel S (17 Dec 2007) +- Mateusz Loskot pointed out that MSVC 9.0 (VS2008) has the pollfd struct and + defines in winsock2.h somehow differently than previous versions and that + curl 7.17.1 would fail to compile out of the box. + +Daniel S (13 Dec 2007) +- David Wright filed bug report #1849764 + (http://curl.haxx.se/bug/view.cgi?id=1849764) with an included fix. He + identified a problem for re-used connections that previously had sent + Expect: 100-continue and in some situations the subsequent POST (that didn't + use Expect:) still had the internal flag set for its use. David's fix (that + makes the setting of the flag in every single request unconditionally) is + fine and is now used! + +Daniel S (12 Dec 2007) +- Gilles Blanc made the curl tool enable SO_KEEPALIVE for the connections and + added the --no-keep-alive option that can disable that on demand. + +Daniel S (9 Dec 2007) +- Andrew Moise filed bug report #1847501 + (http://curl.haxx.se/bug/view.cgi?id=1847501) and pointed out a memcpy() + that should be memmove() in the convert_lineends() function. + +Daniel S (8 Dec 2007) +- Renamed all internal static functions that had Curl_ prefixes to no longer + have them. The Curl_ prefix is exclusively used for library internal global + symbols. Static functions can be named anything, except for using Curl_ or + curl_ prefixes. This is for consistency and for easier maintainance and + overview. + +- Cleaned up and reformatted the TODO document to look like the FAQ and + CONTRIBUTE, which makes nicer web pages + +- Added test cases 549 and 550 that test CURLOPT_PROXY_TRANSFER_MODE. + +- Added keywords on a bunch of test cases + +- Fixed an OOM problem in the curl code that would lead to fclose on a bad + handle and crash + +Daniel S (5 Dec 2007) +- Spacen Jasset reported a problem with doing POST (with data read with a + callback) over a proxy when NTLM is used as auth with the proxy. The bug + also concerned Digest and was limited to using callback only. Spacen worked + with us to provide a useful patch. I added the test case 547 and 548 to + verify two variations of POST over proxy with NTLM. + +Daniel S (3 Dec 2007) +- Ray Pekowski filed bug report #1842029 + (http://curl.haxx.se/bug/view.cgi?id=1842029) in which he identified a + problem with SSL session caching that prevent it from working, and provided + the associated fix! + +- Now libcurl (built with OpenSSL) doesn't return error anymore if the remote + SSL-based server doesn't present a certificate when the request is told to + ignore certificate verification anyway. + +- Michal Marek introduced CURLOPT_PROXY_TRANSFER_MODE which is used to control + the appending of the "type=" thing on FTP URLs when they are passed to a + HTTP proxy. Some proxies just don't like that appending (which is done + unconditionally in 7.17.1), and some proxies treat binary/ascii transfers + better with the appending done! + +Daniel S (29 Nov 2007) +- A bug report on the curl-library list showed a HTTP Digest session going on + with a 700+ letter nonce. Previously libcurl only support 127 letter ones + and now I bumped it to 1023. + +- Fixed the resumed FTP upload loop to not require that the read callback + returns a full buffer on each invoke. + +Daniel S (25 Nov 2007) +- Added test case 1015 that tests --data-urlencode in multiple ways + +- Fixed --data-urlencode for when no @ or = are used + +- Extended the user-agent buffer curl uses, since we can hit the 128 byte + border with plenty development libraries used. Like my current set: "curl + 7.17.2-CVS (i686-pc-linux-gnu) libcurl/7.17.2-CVS OpenSSL/0.9.8g + zlib/1.2.3.3 c-ares/1.5.2-CVS libidn/1.1 libssh2/0.19.0-CVS" + +Daniel S (24 Nov 2007) +- Internal rearrangements, so that the previous struct HandleData is no more. + It is now known as SingleRequest and the Curl_transfer_keeper struct within + that was remove entirely. This has the upside that there are less duplicate + struct members that made it hard to see and remember what struct that was + used to store what data. The transfer_keeper thing was once stored on a + per-connection basis and then it made sense to have the duplicate info but + since it was moved to the SessionHandle (in 7.16.0) it just added weirdness. + The SingleRequest struct is used by data that only is valid for this single + request. + +Yang Tse (22 Nov 2007) +- Provide a socklen_t definition in curl.h for Win32 API build targets + which don't have one. + +Daniel S (22 Nov 2007) +- Alessandro Vesely helped me improve the --data-urlencode's syntax, parser + and documentation. + +Daniel S (21 Nov 2007) +- While inspecting the Negotiate code, I noticed how the proxy auth was using + the same state struct as the host auth, so both could never be used at the + same time! I fixed it (without being able to check) to use two separate + structs to allow authentication using Negotiate on host and proxy + simultaneously. + +Daniel S (20 Nov 2007) +- Emil Romanus pointed out a bug that made an easy handle get the cookie + engine activated when set to use a share (even if the share doesn't share + cookies). I fixed it. + +- Fixed a very long-lasting mprintf() bug that occurred when we did "%.*s%s", + since the second %s would then wrongly used the numerical precision argument + instead and crash. + +- Introduced --data-urlencode to the curl tool for easier url encoding of the + data sent in a post. + +Daniel S (18 Nov 2007) +- Rob Crittenden fixed SSL connections with NSS done with the multi-interface + +Daniel S (17 Nov 2007) +- Michal Marek made the test suite remember what test servers that fail to + start so that subsequent tries are simply skipped. + +- Andres Garcia made the examples build fine on Windows (mingw + msys) when + the lib was built staticly. + +Daniel S (16 Nov 2007) +- Ates Goral identified a problem in http.c:add_buffer_send() when a debug + callback was used, as it could wrongly pass on a bad size for the outgoing + HTTP header. The bad size would be a very large value as it was a wrapped + size_t content. This happened when the whole HTTP request failed to get sent + in one single send. http://curl.haxx.se/mail/lib-2007-11/0165.html + +Daniel S (15 Nov 2007) +- Fixed yet another remaining problem with doing SFTP directory listings on a + re-used persistent connection. Mentioned by Immanuel Gregoire on the mailing + list. + +- Michal Marek fixed the test suite to better deal with the case when the HTTP + ipv6 server can't run. + +Yang Tse (14 Nov 2007) +- Fix a variable potential wrapping in add_buffer() when using absolutely + huge send buffer sizes. + +Daniel S (13 Nov 2007) +- Fixed a remaining problem with doing SFTP directory listings on a re-used + persistent connection. Mentioned by Immanuel Gregoire on the mailing list. + +Daniel S (12 Nov 2007) +- Bug report #1830637 (http://curl.haxx.se/bug/view.cgi?id=1830637), which was + forwarded from the Gentoo bug tracker by Daniel Black and was originally + submitted by Robin Johnson, pointed out that libcurl would do bad memory + references when it failed and bailed out before the handler thing was + setup. My fix is not done like the provided patch does it, but instead I + make sure that there's never any chance for a NULL pointer in that struct + member. + +Yang Tse (10 Nov 2007) +- Vikram Saxena (http://curl.haxx.se/mail/lib-2007-11/0096.html) pointed out + that the pollfd struct was being multi defined when using VS2008. This is + now fixed in /curl/lib/select.h + +Daniel S (8 Nov 2007) +- Bug report #1823487 (http://curl.haxx.se/bug/view.cgi?id=1823487) pointed + out that SFTP requests didn't use persistent connections. Neither did SCP + ones. I gave the SSH code a good beating and now both SCP and SFTP should + use persistent connections fine. I also did a bunch of indent changes as + well as a bug fix for the "keyboard interactive" auth. + +Dan F (6 Nov 2007) +- Improved telnet support by drastically reducing the number of write + callbacks needed to pass a buffer to the user. Instead one per byte it + is now as little as one per segment. + +Yang Tse (6 Nov 2007) +- Bug report #1824894 (http://curl.haxx.se/bug/view.cgi?id=1824894) pointed + out a problem in curl.h when building C++ apps with MSVC. To fix it, the + inclusion of header files in curl.h is moved outside of the C++ extern "C" + linkage block. + +Daniel S (1 Nov 2007) +- Toby Peterson patched a memory problem in the command line tool that + happened when a user had a home dir as an empty string. curl would then do + free() on a wrong area. + +Dan F (1 Nov 2007) +- Fixed curl-config --features to not display libz when it wasn't used + due to a missing header file. + +Dan F (31 October 2007) +- Fixed the output of curl-config --protocols which showed SCP and SFTP + always, except when --without-libssh2 was given + +- Added test cases 1013 and 1014 to check that curl-config --protocols and + curl-config --features matches the output of curl --version + +Dan F (30 October 2007) +- Fixed an OOM problem with file: URLs + +- Moved Curl_file_connect into the protocol handler struct + +Dan F (29 October 2007) +- Added test case 546 to check that subsequent FTP transfers work after a + failed one using the multi interface + +Daniel S (29 October 2007) +- Based on one of those bug reports that are intercepted by a distro's bug + tracker (https://bugzilla.redhat.com/show_bug.cgi?id=316191), I now made + curl-config --features and --protocols show the correct output when built + with NSS. + +Version 7.17.1 (29 October 2007) + +Dan F (25 October 2007) +- Added the --static-libs option to curl-config + +Daniel S (25 October 2007) +- Made libcurl built with NSS possible to ignore the peer verification. + Previously it would fail if the ca bundle wasn't present, even if the code + ignored the verification results. + +Patrick M (25 October 2007) +- Fixed test server to allow null bytes in binary posts. +_ Added tests 35, 544 & 545 to check binary data posts, both static (in place) + and dynamic (copied). + +Daniel S (25 October 2007) +- Michal Marek fixed the test script to be able to use valgrind even when the + lib is built shared with libtool. + +- Fixed a few memory leaks when the same easy handle is re-used to request + URLs with different protocols. FTP and TFTP related leaks. Caught thanks to + Dan F's new test cases. + +Dan F (24 October 2007) +- Fixed the test FTP and TFTP servers to support the >10000 test number + notation + +- Added test cases 2000 through 2003 which test multiple protocols using the + same easy handle + +- Fixed the filecheck: make target to work outside the source tree + +Daniel S (24 October 2007) +- Vladimir Lazarenko pointed out that we should do some 'mt' magic when + building with VC8 to get the "manifest" embedded to make fine stand-alone + binaries. The maketgz and the src/Makefile.vc6 files were adjusted + accordingly. + +Daniel S (23 October 2007) +- Bug report #1812190 (http://curl.haxx.se/bug/view.cgi?id=1812190) points out + that libcurl tried to re-use connections a bit too much when using non-SSL + protocols tunneled over a HTTP proxy. + +Daniel S (22 October 2007) +- Michal Marek forwarded the bug report + https://bugzilla.novell.com/show_bug.cgi?id=332917 about a HTTP redirect to + FTP that caused memory havoc. His work together with my efforts created two + fixes: + + #1 - FTP::file was moved to struct ftp_conn, because is has to be dealt with + at connection cleanup, at which time the struct HandleData could be + used by another connection. + Also, the unused char *urlpath member is removed from struct FTP. + + #2 - provide a Curl_reset_reqproto() function that frees + data->reqdata.proto.* on connection setup if needed (that is if the + SessionHandle was used by a different connection). + + A long-term goal is of course to somehow get rid of how the reqdata struct + is used, as it is too error-prone. + +- Bug report #1815530 (http://curl.haxx.se/bug/view.cgi?id=1815530) points out + that specifying a proxy with a trailing slash didn't work (unless it also + contained a port number). + +Patrick M (15 October 2007) +- Fixed the dynamic CURLOPT_POSTFIELDS problem: this option is now static again + and option CURLOPT_COPYPOSTFIELDS has been added to support dynamic mode. + +Patrick M (12 October 2007) +- Added per-protocol callback static tables, replacing callback ptr storage + in the connectdata structure by a single handler table ptr. + +Dan F (11 October 2007) +- Fixed the -l option of runtests.pl + +- Added support for skipping tests based on key words. + +Daniel S (9 October 2007) +- Michal Marek removed the no longer existing return codes from the curl.1 + man page. + +Daniel S (7 October 2007) +- Known bug #47, which confused libcurl if doing NTLM auth over a proxy with + a response that was larger than 16KB is now improved slightly so that now + the restriction at 16KB is for the headers only and it should be a rare + situation where the response-headers exceed 16KB. Thus, I consider #47 fixed + and the header limitation is now known as known bug #48. + +Daniel S (5 October 2007) +- Michael Wallner made the CULROPT_COOKIELIST option support a new magic + string: "FLUSH". Using that will cause libcurl to flush its cookies to the + CURLOPT_COOKIEJAR file. + +- The new file docs/libcurl/ABI describes how we view ABI breakages, soname + bumps and what the version number's significance to all that is. + +Daniel S (4 October 2007) +- I enabled test 1009 and made the --local-port use a wide range to reduce the + risk of failures. + +- Kim Rinnewitz reported that --local-port didn't work with TFTP transfers. + This happened because the tftp code always uncondionally did a bind() + without caring if one already had been done and then it failed. I wrote a + test case (1009) to verify this, but it is a bit error-prone since it will + have to pick a fixed local port number and since the tests are run on so + many different hosts in different situations I'll add it in disabled state. + +Yang Tse (3 October 2007) +- Fixed issue related with the use of ares_timeout() result. + +Daniel S (3 October 2007) +- Alexey Pesternikov introduced CURLOPT_OPENSOCKETFUNCTION and + CURLOPT_OPENSOCKETDATA to set a callback that allows an application to + replace the socket() call used by libcurl. It basically allows the app to + change address, protocol or whatever of the socket. + +- I renamed the CURLE_SSL_PEER_CERTIFICATE error code to + CURLE_PEER_FAILED_VERIFICATION (standard CURL_NO_OLDIES style), and made + this return code get used by the previous SSH MD5 fingerprint check in case + it fails. + +- Based on a patch brought by Johnny Luong, libcurl now offers + CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 and the curl tool --hostpubmd5. They both + make the SCP or SFTP connection verify the remote host's md5 checksum of the + public key before doing a connect, to reduce the risk of a man-in-the-middle + attack. + +Daniel S (2 October 2007) +- libcurl now handles chunked-encoded CONNECT responses + +Daniel S (1 October 2007) +- Alex Fishman reported a curl_easy_escape() problem that was made the + function do wrong on all input bytes that are >= 0x80 (decimal 128) due to a + signed / unsigned mistake in the code. I fixed it and added test case 543 to + verify. + +Daniel S (29 September 2007) +- Immanuel Gregoire fixed a problem with persistent transfers over SFTP. + +Daniel S (28 September 2007) +- Adapted the c-ares code to the API change c-ares 1.5.0 brings in the + notifier callback(s). + +Dan F (26 September 2007) +- Enabled a few more gcc warnings with --enable-debug. Renamed a few + variables to avoid shadowing global declarations. + +Daniel S (26 September 2007) +- Philip Langdale provided the new CURLOPT_POST301 option for + curl_easy_setopt() that alters how libcurl functions when following + redirects. It makes libcurl obey the RFC2616 when a 301 response is received + after a non-GET request is made. Default libcurl behaviour is to change + method to GET in the subsequent request (like it does for response code 302 + - because that's what many/most browsers do), but with this CURLOPT_POST301 + option enabled it will do what the spec says and do the next request using + the same method again. I.e keep POST after 301. + + The curl tool got this option as --post301 + + Test case 1011 and 1012 were added to verify. + +- Max Katsev reported that when doing a libcurl FTP request with + CURLOPT_NOBODY enabled but not CURLOPT_HEADER, libcurl wouldn't do TYPE + before it does SIZE which makes it less useful. I walked over the code and + made it do this properly, and added test case 542 to verify it. + +Daniel S (24 September 2007) +- Immanuel Gregoire fixed KNOWN_BUGS #44: --ftp-method nocwd did not handle + URLs ending with a slash properly (it should list the contents of that + directory). Test case 351 brought back and also test 1010 was added. + +Daniel S (21 September 2007) +- Mark Davies fixed Negotiate authentication over proxy, and also introduced + the --proxy-negotiate command line option to allow a user to explicitly + select it. + +Daniel S (19 September 2007) +- Rob Crittenden provided an NSS update with the following highlights: + + o It looks for the NSS database first in the environment variable SSL_DIR, + then in /etc/pki/nssdb, then it initializes with no database if neither of + those exist. + + o If the NSS PKCS#11 libnspsem.so driver is available then PEM files may be + loaded, including the ca-bundle. If it is not available then only + certificates already in the NSS database are used. + + o Tries to detect whether a file or nickname is being passed in so the right + thing is done + + o Added a bit of code to make the output more like the OpenSSL module, + including displaying the certificate information when connecting in + verbose mode + + o Improved handling of certificate errors (expired, untrusted, etc) + + The libnsspem.so PKCS#11 module is currently only available in Fedora + 8/rawhide. Work will be done soon to upstream it. The NSS module will work + with or without it, all that changes is the source of the certificates and + keys. + +Daniel S (18 September 2007) +- Immanuel Gregoire pointed out that public key SSH auth failed if no + public/private key was specified and there was no HOME environment variable, + and then it didn't continue to try the other auth methods. Now it will + instead try to get the files id_dsa.pub and id_dsa from the current + directory if none of the two conditions were met. + +Dan F (17 September 2007) +- Added hooks to the test suite to make it possible to test a curl running + on a remote host. + +- Changed some FTP tests to validate the format of the PORT and EPRT commands + sent by curl, if not the addresses themselves. + +Daniel S (15 September 2007) +- Michal Marek made libcurl automatically append ";type=" when using HTTP + proxies for FTP urls. + +- Gnter Knauf fixed LDAP builds in the Windows makefiles and fixed LDAPv3 + support on Windows. + +Dan F (13 September 2007) +- Added LDAPS, SCP and SFTP to curl-config --protocols. Removed and + fixed some AC_SUBST configure entries. + +Version 7.17.0 (13 September 2007) + +Daniel S (12 September 2007) +- Bug report #1792649 (http://curl.haxx.se/bug/view.cgi?id=1792649) pointed + out a problem with doing an empty upload over FTP on a re-used connection. + I added test case 541 to reproduce it and to verify the fix. + +- I noticed while writing test 541 that the FTP code wrongly did a CWD on the + second transfer as it didn't store and remember the "" path from the + previous transfer so it would instead CWD to the entry path as stored. This + worked, but did a superfluous command. Thus, test case 541 now also verifies + this fix. + +Dan F (5 September 2007) +- Added test case 1007 to test permission problem when uploading with TFTP + (to validate bug #1790403). + +- TFTP now reports the "not defined" TFTP error code 0 as an error, + not success. + +Daniel S (5 September 2007) +- Continued the work on a fix for #1779054 + (http://curl.haxx.se/bug/view.cgi?id=1779054). My previous fix from August + 24 was not complete (either) but could accidentally "forget" parts of a + server response which led to faulty server response time-out errors. + +Dan F (5 September 2007) +- Minix doesn't support getsockopt on UDP sockets or send/recv on TCP + sockets. + +Dan F (31 August 2007) +- Made some of the error strings returned by the *strerror functions more + generic, and more consistent with each other. + +- Renamed the curl_ftpssl enum to curl_usessl and its enumerated constants, + creating macros for backward compatibility: + + CURLFTPSSL_NONE => CURLUSESSL_NONE + CURLFTPSSL_TRY => CURLUSESSL_TRY + CURLFTPSSL_CONTROL => CURLUSESSL_CONTROL + CURLFTPSSL_ALL => CURLUSESSL_ALL + CURLFTPSSL_LAST => CURLUSESSL_LAST + +Dan F (30 August 2007) +- Renamed several libcurl error codes and options to make them more general + and allow reuse by multiple protocols. Several unused error codes were + removed. In all cases, macros were added to preserve source (and binary) + compatibility with the old names. These macros are subject to removal at + a future date, but probably not before 2009. An application can be + tested to see if it is using any obsolete code by compiling it with the + CURL_NO_OLDIES macro defined. + + The following unused error codes were removed: + + CURLE_BAD_CALLING_ORDER + CURLE_BAD_PASSWORD_ENTERED + CURLE_FTP_CANT_RECONNECT + CURLE_FTP_COULDNT_GET_SIZE + CURLE_FTP_COULDNT_SET_ASCII + CURLE_FTP_USER_PASSWORD_INCORRECT + CURLE_FTP_WEIRD_USER_REPLY + CURLE_FTP_WRITE_ERROR + CURLE_LIBRARY_NOT_FOUND + CURLE_MALFORMAT_USER + CURLE_OBSOLETE + CURLE_SHARE_IN_USE + CURLE_URL_MALFORMAT_USER + + The following error codes were renamed: + + CURLE_FTP_ACCESS_DENIED => CURLE_REMOTE_ACCESS_DENIED + CURLE_FTP_COULDNT_SET_BINARY => CURLE_FTP_COULDNT_SET_TYPE + CURLE_FTP_SSL_FAILED => CURLE_USE_SSL_FAILED + CURLE_FTP_QUOTE_ERROR => CURLE_QUOTE_ERROR + CURLE_TFTP_DISKFULL => CURLE_REMOTE_DISK_FULL + CURLE_TFTP_EXISTS => CURLE_REMOTE_FILE_EXISTS + CURLE_HTTP_RANGE_ERROR => CURLE_RANGE_ERROR + + The following options were renamed: + + CURLOPT_SSLKEYPASSWD => CURLOPT_KEYPASSWD + CURLOPT_FTPAPPEND => CURLOPT_APPEND + CURLOPT_FTPLISTONLY => CURLOPT_DIRLISTONLY + CURLOPT_FTP_SSL => CURLOPT_USE_SSL + + A few more changes will take place with the next SONAME bump of the + library. These are documented in docs/TODO + +- Documented some newer error codes in libcurl-error(3) + +- Added more accurate error code returns from SFTP operations. Added test + case 615 to test an SFTP upload failure. + +Dan F (28 August 2007) +- Some minor internal type and const changes based on a splint scan. + +Daniel S (24 August 2007) +- Bug report #1779054 (http://curl.haxx.se/bug/view.cgi?id=1779054) pointed + out that libcurl didn't deal with large responses from server commands, when + the single response was consisting of multiple lines but of a total size of + 16KB or more. Dan Fandrich improved the ftp test script and provided test + case 1006 to repeat the problem, and I fixed the code to make sure this new + test case runs fine. + +Patrick M (23 August 2007) +- OS/400 port: new files lib/config-os400.h lib/setup-os400.h packages/OS400/*. + See packages/OS400/README.OS400. + +Daniel S (23 August 2007) +- Bug report #1779751 (http://curl.haxx.se/bug/view.cgi?id=1779751) pointed + out that doing first a file:// upload and then an FTP upload crashed libcurl + or at best caused furious valgrind complaints. Fixed now! + +Daniel S (22 August 2007) +- Bug report #1779054 (http://curl.haxx.se/bug/view.cgi?id=1779054) pointed + out that libcurl didn't deal with very long (>16K) FTP server response lines + properly. Starting now, libcurl will chop them off (thus the client app will + not get the full line) but survive and deal with them fine otherwise. Test + case 1003 was added to verify this. + +Daniel S (20 August 2007) +- Based on a patch by Christian Vogt, the FTP code now sets the upcoming + download transfer size much earlier to be possible to get read with + CURLINFO_CONTENT_LENGTH_DOWNLOAD as soon as possible. This is very much in a + similar spirit to the HTTP size change from August 11 2007. + +Daniel S (18 August 2007) +- Robson Braga Araujo filed bug report #1776232 + (http://curl.haxx.se/bug/view.cgi?id=1776232) about libcurl calling + Curl_client_write(), passing on a const string that the caller may not + modify and yet it does (on some platforms). + +- Robson Braga Araujo filed bug report #1776235 + (http://curl.haxx.se/bug/view.cgi?id=1776235) about ftp requests with NOBODY + on a directory would do a "SIZE (null)" request. This is now fixed and test + case 1000 was added to verify. + +Daniel S (17 August 2007) +- Song Ma provided a patch that cures a problem libcurl has when doing resume + HTTP PUT using Digest authentication. Test case 5320 and 5322 were also + added to verify the functionality. + +Daniel S (14 August 2007) +- Andrew Wansink provided an NTLM bugfix: in the case the server sets the flag + NTLMFLAG_NEGOTIATE_UNICODE, we need to filter it off because libcurl doesn't + UNICODE encode the strings it packs into the NTLM authenticate packet. + +Daniel S (11 August 2007) +- Allen Pulsifer provided a patch that makes libcurl set the expected download + size earlier when doing HTTP downloads, so that applications and the + progress meter etc know get the info earlier in the flow than before. + +- Patrick Monnerat modified the LDAP code and approach in curl. Starting now, + the configure script checks for openldap and friends and we link with those + libs just like we link all other third party libraries, and we no longer + dlopen() those libraries. Our private header file lib/ldap.h was renamed to + lib/curl_ldap.h due to this. I set a tag in CVS (curl-7_17_0-preldapfix) + just before this commit, just in case. + +Dan F (8 August 2007) +- Song Ma noted a zlib memory leak in the illegal compressed header + countermeasures code path. + +Daniel S (4 August 2007) +- Patrick Monnerat fixed curl_easy_escape() and curlx_strtoll() to work on + non-ASCII systems. + +Daniel S (3 August 2007) +- I cut out support for libssh2 versions older than 0.16 to make our code a + lot simpler, and to avoid getting trouble with the LIBSSH2_APINO define + that 1) didn't work properly since it was >32 bits and 2) is removed in + libssh2 0.16... + +Daniel S (2 August 2007) +- Scott Cantor filed bug report #1766320 + (http://curl.haxx.se/bug/view.cgi?id=1766320) pointing out that the libcurl + code accessed two curl_easy_setopt() options (CURLOPT_DNS_CACHE_TIMEOUT and + CURLOPT_DNS_USE_GLOBAL_CACHE) as ints even though they're documented to be + passed in as longs, and that makes a difference on 64 bit architectures. + +- Dmitriy Sergeyev reported a regression: resumed file:// transfers broke + after 7.16.2. This is much due to the different treatment file:// gets + internally, but now I added test 231 to make it less likely to happen again + without us noticing! + +Daniel S (1 August 2007) +- Patrick Monnerat and I modified libcurl so that now it *copies* all strings + passed to it with curl_easy_setopt()! Previously it has always just refered + to the data, forcing the user to keep the data around until libcurl is done + with it. That is now history and libcurl will instead clone the given + strings and keep private copies. This is also part of Patrick Monnerat's + OS/400 port. + + Due to this being a somewhat interesting change API wise, I've decided to + bump the version of the upcoming release to 7.17.0. Older applications will + of course not notice this change nor do they have to care, but new + applications can be written to take advantage of this. + +- Greg Morse reported a problem with POSTing using ANYAUTH to a server + requiring NTLM, and he provided test code and a test server and we worked + out a bug fix. We failed to count sent body data at times, which then caused + internal confusions when libcurl tried to send the rest of the data in order + to maintain the same connection alive. + +Daniel S (31 July 2007) +- Peter O'Gorman pointed out (and fixed) that the non-blocking check in + configure made libcurl use blocking sockets on AIX 4 and 5, while that + wasn't the intention. + +Daniel S (29 July 2007) +- Jayesh A Shah filed bug report #1759542 + (http://curl.haxx.se/bug/view.cgi?id=1759542) identifying a rather serious + problem with FTPS: libcurl closed the data connection socket and then later + in the flow it would call the SSL layer to do SSL shutdown which then would + use a socket that had already been closed - so if the application had opened + a new one in the mean time, libcurl could send gibberish that way! I worked + with Greg Zavertnik to properly diagnose and fix this. The fix affects code + for all SSL libraries we support, but it has only been truly verified to + work fine for the OpenSSL version. The others have only been code reviewed. + +Daniel S (23 July 2007) +- Implemented the parts of Patrick Monnerat's OS/400 patch that introduces + support for the OS/400 Secure Sockets Layer library. + +Dan F (23 July 2007) +- Implemented only the parts of Patrick Monnerat's OS/400 patch that renamed + some few internal identifiers to avoid conflicts, which could be useful on + other platforms. + +Daniel S (22 July 2007) +- HTTP Digest bug fix by Chris Flerackers: + + Scenario + + - Perfoming a POST request with body + - With authentication (only Digest) + - Re-using a connection + + libcurl would send a HTTP POST with an Authorization header but without + body. Our server would return 400 Bad Request in that case (because + authentication passed, but the body was empty). + + Cause + + 1) http_digest.c -> Curl_output_digest + - Updates allocptr.userpwd/allocptr.proxyuserpwd *only* if d->nonce is + filled in (and no errors) + - authp->done = TRUE if d->nonce is filled in + 2) http.c -> Curl_http + - *Always* uses allocptr.userpwd/allocptr.proxyuserpwd if not NULL + 3) http.c -> Curl_http, Curl_http_output_auth + + So what happens is that Curl_output_digest cannot yet update the + Authorization header (allocptr.userpwd) which results in authhost->done=0 -> + authhost->multi=1 -> conn->bits.authneg = TRUE. The body is not + added. *However*, allocptr.userpwd is still used when building the request + +- Added test case 354 that makes a simple FTP retrieval without password, which + verifies the bug fix in #1757328. + +Daniel S (21 July 2007) +- To allow more flexibility in FTP test cases, I've removed the enforced states + from the test server code as they served no real purpose. The test server + is here to serve for the test cases, not to attempt to function as a real + server! While at it, I modified test case 141 to better test and verify + curl -I on a single FTP file. + +Daniel S (20 July 2007) +- James Housley fixed the SFTP PWD command to work. + +- Ralf S. Engelschall filed bug report #1757328 + (http://curl.haxx.se/bug/view.cgi?id=1757328) and submitted a patch. It + turns out we broke login to FTP servers that don't require (nor understand) + PASS after the USER command. The breakage was done as part of the krb5 + commit so a krb-using person needs to verify that the current version now + works or if we need to fix it (in a different way of course). + +Dan F (17 July 2007) +- Fixed test cases 613 and 614 by improving the log postprocessor to handle + a new directory listing format that newer libssh2's can provide. This + is probably NOT sufficient to handle all directory listing formats that + server's can provide, and should be revisited. + +Daniel S (17 July 2007) +- Daniel Johnson fixed a bug in how libssh2_session_last_error() was used, in + two places. + +- Jofell Gallardo posted a libcurl log using FTP that exposed a bug which made + a control connection that was deemed "dead" to yet be re-used in a following + request. + +Daniel S (13 July 2007) +- Colin Hogben filed bug report #1750274 + (http://curl.haxx.se/bug/view.cgi?id=1750274) and submitted a patch for the + case where libcurl did a connect attempt to a non-listening port and didn't + provide a human readable error string back. + +- Daniel Cater fixes: + 1 - made 'make vc8' work on windows. + 2 - made libcurl itself built with CURL_NO_OLDIES defined (which doesn't + define the symbols for backwards source compatibility) + 3 - updated libcurl-errors.3 + 4 - added CURL_DISABLE_TFTP to docs/INSTALL + +Daniel S (12 July 2007) +- Made the krb5 code build with Heimdal's GSSAPI lib. + +Dan F (12 July 2007) +- Compile most of the example apps in docs/examples when doing a 'make check'. + Fixed some compile warnings and errors in those examples. + +- Removed the example program ftp3rdparty.c since libcurl doesn't support + 3rd party FTP transfers any longer. + +Daniel S (12 July 2007) +- Shmulik Regev found an (albeit rare) case where the proxy CONNECT operation + could in fact get stuck in an endless loop. + +- Made CURLOPT_SSL_VERIFYHOST set to 1 acts as described in the documentation: + fail to connect if there is no Common Name field found in the remote cert. + We should deprecate the support for this set to 1 anyway soon, since the + feature is pointless and most likely never really used by anyone. + +Daniel S (11 July 2007) +- Shmulik Regev fixed a bug with transfer-encoding skipping during the 407 + error pages for proxy authentication. + +- Giancarlo Formicuccia reported and fixed a problem with a closed connection + to a proxy during CONNECT auth negotiation. + +Dan F (10 July 2007) +- Fixed a curl memory leak reported by Song Ma with a modified version + of the patch he suggested. Added his test case as test289 to verify. + +- Force the time zone to GMT in the cookie tests in case the user is + using one of the so-called 'right' time zones that take into account + leap seconds, which causes the tests to fail (as reported by + Daniel Black in bug report #1745964). + +Version 7.16.4 (10 July 2007) + +Daniel S (10 July 2007) +- Kees Cook notified us about a security flaw + (http://curl.haxx.se/docs/adv_20070710.html) in which libcurl failed to + properly reject some outdated or not yet valid server certificates when + built with GnuTLS. Kees also provided the patch. + +James H (5 July 2007) +- Gavrie Philipson provided a patch that will use a more specific error + message for an scp:// upload failure. If libssh2 has his matching + patch, then the error message return by the server will be used instead + of a more generic error. + +Daniel S (1 July 2007) +- Thomas J. Moore provided a patch that introduces Kerberos5 support in + libcurl. This also makes the options change name to --krb (from --krb4) and + CURLOPT_KRBLEVEL (from CURLOPT_KRB4LEVEL) but the old names are still + +- Song Ma helped me verify and extend a fix for doing FTP over a SOCKS4/5 + proxy. + +Daniel S (27 June 2007) +- James Housley: Add two new options for the SFTP/SCP/FILE protocols: + CURLOPT_NEW_FILE_PERMS and CURLOPT_NEW_DIRECTORY_PERMS. These control the + premissions for files and directories created on the remote + server. CURLOPT_NEW_FILE_PERMS defaults to 0644 and + CURLOPT_NEW_DIRECTORY_PERMS defaults to 0755 + +- I corrected the 10-at-a-time.c example and applied a patch for it by James + Bursa. + +Daniel S (26 June 2007) +- Robert Iakobashvili re-arranged the internal hash code to work with a custom + hash function for different hashes, and also expanded the default size for + the socket hash table used in multi handles to greatly enhance speed when + very many connections are added and the socket API is used. + +- James Housley made the CURLOPT_FTPLISTONLY mode work for SFTP directory + listings as well + +Daniel S (25 June 2007) +- Adjusted how libcurl treats HTTP 1.1 responses without content-lenth or + chunked encoding (that also lacks "Connection: close"). It now simply + assumes that the connection WILL be closed to signal the end, as that is how + RFC2616 section 4.4 point #5 says we should behave. + +Version 7.16.3 (25 June 2007) + +Daniel S (23 June 2007) +- As reported by "Tro" in http://curl.haxx.se/mail/lib-2007-06/0161.html and + http://curl.haxx.se/mail/lib-2007-06/0238.html, libcurl didn't properly do + no-body requests on FTP files on re-used connections properly, or at least + it didn't provide the info back in the header callback properly in the + subsequent requests. + +Daniel S (21 June 2007) +- Gerrit Bruchhuser pointed out a warning that the Intel(R) Thread Checker + tool reports and it was indeed a legitimate one and it is one fixed. It was + a use of a share without doing the proper locking first. + +Daniel S (20 June 2007) +- Adam Piggott filed bug report #1740263 + (http://curl.haxx.se/bug/view.cgi?id=1740263). Adam discovered that when + getting a large amount of URLs with curl, they were fetched slower and + slower... which turned out to be because the --libcurl data collecting which + wrongly always was enabled, but no longer is... + +Daniel S (18 June 2007) +- Robson Braga Araujo filed bug report #1739100 + (http://curl.haxx.se/bug/view.cgi?id=1739100) that mentioned that libcurl + could not actually list the contents of the root directory of a given FTP + server if the login directory isn't root. I fixed the problem and added + three test cases (one is disabled for now since I identified KNOWN_BUGS #44, + we cannot use --ftp-method nocwd and list ftp directories). + +Daniel S (14 June 2007) +- Shmulik Regev: + + I've encountered (and hopefully fixed) a problem involving proxy CONNECT + requests and easy handles state management. The problem isn't simple to + reproduce since it depends on socket state. It only manifests itself when + working with non-blocking sockets. + + Here is the scenario: + + 1. in multi_runsingle the easy handle is in the CURLM_STATE_WAITCONNECT and + calls Curl_protocol_connect + + 2. in Curl_proxyCONNECT, line 1247, if the socket isn't ready the function + returns and conn->bits.tunnel_connecting is TRUE + + 3. when the call to Curl_protocol_connect returns the protocol_connect flag + is false and the easy state is changed to CURLM_STATE_PROTOCONNECT which + isn't correct if a proxy is used. Rather CURLM_STATE_WAITPROXYCONNECT + should be used. + + I discovered this while performing an HTTPS request through a proxy (squid) + on my local network. The problem caused openssl to fail as it read the proxy + response to the CONNECT call ('HTTP/1.0 Established') rather than the SSL + handshake (the exact openssl error was 'wrong ssl version' but this isn't + very important) + +- Dave Vasilevsky filed bug report #1736875 + (http://curl.haxx.se/bug/view.cgi?id=1736875) almost simultanouesly as Dan + Fandrich mentioned a related build problem on the libcurl mailing list: + http://curl.haxx.se/mail/lib-2007-06/0131.html. Both problems had the same + reason: the definitions of the POLL* defines and the pollfd struct in the + libcurl code was depending on HAVE_POLL instead of HAVE_SYS_POLL_H. + +Daniel S (13 June 2007) +- Tom Regner provided a patch and worked together with James Housley, so now + CURLOPT_FTP_CREATE_MISSING_DIRS works for SFTP connections as well as FTP + ones. + +- Rich Rauenzahn filed bug report #1733119 + (http://curl.haxx.se/bug/view.cgi?id=1733119) and we collaborated on the + fix. The problem is that for 64bit HPUX builds, several socket-related + functions would still assume int (32 bit) arguments and not socklen_t (64 + bit) ones. + +Daniel S (12 June 2007) +- James Housley brought his revamped SSH code that is state-machine driven to + really take advantage of the now totally non-blocking libssh2 (in CVS). + +Dan F (8 June 2007) +- Incorporated Daniel Black's test706 and test707 SOCKS test cases. + +- Fixed a few problems when starting the SOCKS server. + +- Reverted some recent changes to runtests.pl that weren't compatible with + perl 5.0. + +- Fixed the test harness so that it actually kills the ssh being used as + the SOCKS server. + +Daniel S (6 June 2007) +- -s/--silent can now be used to toggle off the silence again if used a second + time. + +Daniel S (5 June 2007) +- Added Daniel Black's work that adds the first few SOCKS test cases. I also + fixed two minor SOCKS problems to make the test cases run fine. + +Daniel S (31 May 2007) +- Feng Tu made (lib)curl support "upload" resuming work for file:// URLs. + +Daniel S (30 May 2007) +- I modified the 10-at-a-time.c example to transfer 500 downloads in parallel + with a c-ares enabled build only to find that it crashed miserably, and this + was due to some select()isms left in the code. This was due to API + restrictions in c-ares 1.3.x, but with the upcoming c-ares 1.4.0 this is no + longer the case so now libcurl runs much better with c-ares and the multi + interface with > 1024 file descriptors in use. + + Extra note: starting now we require c-ares 1.4.0 for asynchronous name + resolves. + +- Added CURLMOPT_MAXCONNECTS which is a curl_multi_setopt() option for setting + the maximum size of the connection cache maximum size of the multi handle. + +Daniel S (27 May 2007) +- When working with a problem Stefan Becker had, I found an off-by-one buffer + overwrite in Curl_select(). While fixing it, I also improved its performance + somewhat by changing calloc to malloc and breaking out of a loop earlier + (when possible). + +Daniel S (25 May 2007) +- Rob Crittenden fixed bug #1705802 + (http://curl.haxx.se/bug/view.cgi?id=1705802), which was filed by Daniel + Black identifying several FTP-SSL test cases fail when we build libcurl with + NSS for TLS/SSL. Listed as #42 in KNOWN_BUGS. + +Daniel S (24 May 2007) +- Song Ma filed bug report #1724016 + (http://curl.haxx.se/bug/view.cgi?id=1724016) noticing that downloading + glob-ranges for TFTP was broken in CVS. Fixed now. + +- 'mytx' in bug report #1723194 (http://curl.haxx.se/bug/view.cgi?id=1723194) + pointed out that the warnf() function in the curl tool didn't properly deal + with the cases when excessively long words were used in the string to chop + up. + +Daniel S (22 May 2007) +- Andre Guibert de Bruet fixed a memory leak in the function that verifies the + peer's name in the SSL certificate when built for OpenSSL. The leak happens + for libcurls with CURL_DOES_CONVERSIONS enabled that fail to convert the CN + name from UTF8. He also fixed a leak when PKCS #12 parsing failed. + +Daniel S (18 May 2007) +- Feng Tu reported that curl -w did wrong on TFTP transfers in bug report + #1715394 (http://curl.haxx.se/bug/view.cgi?id=1715394), and the + transfer-related info "variables" were indeed overwritten with zeroes + wrongly and have now been adjusted. The upload size still isn't accurate. + +Daniel S (17 May 2007) +- Feng Tu pointed out a division by zero error in the TFTP connect timeout + code for timeouts less than five seconds, and also provided a fix for it. + Bug report #1715392 (http://curl.haxx.se/bug/view.cgi?id=1715392) + +Dan F (16 May 2007) +- Added support for compiling under Minix 3.1.3 using ACK. + +Dan F (14 May 2007) +- Added SFTP directory listing test case 613. + +- Added support for quote commands before a transfer using SFTP and test + case 614. + +- Changed the post-quote commands to occur after the transferred file is + closed. + +- Allow SFTP quote commands chmod, chown, chgrp to set a value of 0. + +Dan F (9 May 2007) +- Kristian Gunstone fixed a problem where overwriting an uploaded file with + sftp didn't truncate it first, which would corrupt the file if the new + file was shorter than the old. + +Dan F (8 May 2007) +- Added FTPS test cases 406 and 407 + +Daniel S (8 May 2007) +- CURLE_FTP_COULDNT_STOR_FILE is now known as CURLE_UPLOAD_FAILED. This is + because I just made SCP uploads return this value if the file size of + the upload file isn't given with CURLOPT_INFILESIZE*. Docs updated to + reflect this news, and a define for the old name was added to the public + header file. + +Daniel S (7 May 2007) +- James Bursa fixed a bug in the multi handle code that made the connection + cache grow a bit too much, beyond the normal 4 * easy_handles. + +Daniel S (2 May 2007) +- Anders Gustafsson remarked that requiring CURLOPT_HTTP_VERSION set to 1.0 + when CURLOPT_HTTP200ALIASES is used to avoid the problem mentioned below is + not very nice if the client wants to be able to use _either_ a HTTP 1.1 + server or one within the aliases list... so starting now, libcurl will + simply consider 200-alias matches the to be HTTP 1.0 compliant. + +- Tobias Rundstrm reported a problem they experienced with xmms2 and recent + libcurls, which turned out to be the 25-nov-2006 change which treats HTTP + responses without Content-Length or chunked encoding as without bodies. We + now added the conditional that the above mentioned response is only without + body if the response is HTTP 1.1. + +- Jeff Pohlmeyer improved the hiperfifo.c example to use the + CURLMOPT_TIMERFUNCTION callback option. + +- Set the timeout for easy handles to expire really soon after addition or + when CURLM_CALL_MULTI_PERFORM is returned from curl_multi_socket*/perform, + to make applications using only curl_multi_socket() to properly function + when adding easy handles "on the fly". Bug report and test app provided by + Michael Wallner. + +Dan F (30 April 2007) +- Improved the test harness to allow running test servers on other than + the default port numbers, allowing more than one test suite to run + simultaneously on the same host. + +Daniel S (28 April 2007) +- Peter O'Gorman fixed libcurl to not init GnuTLS as early as we did before, + since it then inits libgcrypt and libgcrypt is being evil and EXITS the + application if it fails to get a fine random seed. That's really not a nice + thing to do by a library. + +- Frank Hempel fixed a curl_easy_duphandle() crash on a handle that had + been removed from a multi handle, and then fixed another flaw that prevented + curl_easy_duphandle() to work even after the first fix - the handle was + still marked as using the multi interface. + +Daniel S (26 April 2007) +- Peter O'Gorman found a problem with SCP downloads when the downloaded file + was 16385 bytes (16K+1) and it turned out we didn't properly always "suck + out" all data from libssh2. The effect being that libcurl would hang on the + socket waiting for data when libssh2 had in fact already read it all... + +Dan F (25 April 2007) +- Added support in runtests.pl for "!n" test numbers to disable individual + tests. Changed -t to only keep log files around when -k is specified, + to have the same behaviour as without -t. + +Daniel S (25 April 2007) +- Sonia Subramanian brought our attention to a problem that happens if you set + the CURLOPT_RESUME_FROM or CURLOPT_RANGE options and an existing connection + in the connection cache is closed to make room for the new one when you call + curl_easy_perform(). It would then wrongly free range-related data in the + connection close funtion. + +Yang Tse (25 April 2007) +- Steve Little fixed compilation on VMS 64-bit mode + +Daniel S (24 April 2007) +- Robert Iakobashvili made the 'master_buffer' get allocated first once it is + can/will be used as it then makes the common cases save 16KB of data for each + easy handle that isn't used for pipelining. + +Dan F (23 April 2007) +- Added support to the test harness. + +- Added tests 610-612 to test more SFTP post-quote commands. + +Daniel S (22 April 2007) +- Song Ma's warning if -r/--range is given with a "bad" range, also noted in + the man page now. + +- Daniel Black filed bug #1705177 + (http://curl.haxx.se/bug/view.cgi?id=1705177) where --without-ssl + --with-gnutl outputs a warning about SSL not being enabled even though GnuTLS + was found and used. + +Daniel S (21 April 2007) +- Daniel Black filed bug #1704675 + (http://curl.haxx.se/bug/view.cgi?id=1704675) identifying a double-free + problem in the SSL-dealing layer, telling GnuTLS to free NULL credentials on + closedown after a failure and a bad #ifdef for NSS when closing down SSL. + +Yang Tse (20 April 2007) +- Save one call to curlx_tvnow(), which calls gettimeofday(), in each of + Curl_socket_ready(), Curl_poll() and Curl_select() when these are called + with a zero timeout or a timeout value indicating a blocking call should + be performed. + +Daniel S (18 April 2007) +- James Housley made SFTP uploads use libssh2's non-blocking API + +- Prevent the internal progress meter from updating more frequently than once + per second. + +Dan F (17 April 2007) +- Added test cases 296, 297 and 298 to test --ftp-method handling + +Daniel S (16 April 2007) +- Robert Iakobashvil added curl_multi_socket_action() to libcurl, which is a + function that deprecates the curl_multi_socket() function. Using the new + function the application tell libcurl what action that was found in the + socket that it passes in. This gives a significant performance boost as it + allows libcurl to avoid a call to poll()/select() for every call to + curl_multi_socket*(). + + I added a define in the public curl/multi.h header file that will make your + existing application automatically use curl_multi_socket_action() instead of + curl_multi_socket() when you recompile. But of course you'll get better + performance if you adjust your code manually and actually pass in the + correct action bitmask to this function. + +Daniel S (14 April 2007) +- Jay Austin added "DH PARAMETERS" to the stunnel.pem certificate for the test + suite to make stunnel run better in some (most?) environments. + +Dan F (13 April 2007) +- Added test cases 294 and 295 to test --ftp-account handling + +- Improved handling of out of memory in ftp. + +Yang Tse (13 April 2007) +- Fix test case 534 which started to fail 2007-04-13 due to the existance + of a new host on the net with the same silly domain the test was using + for a host which was supposed not to exist. + +Daniel S (12 April 2007) +- Song Ma found a memory leak in the if2ip code if you pass in an interface + name longer than the name field of the ifreq struct (typically 6 bytes), as + then it wouldn't close the used dummy socket. Bug #1698974 + (http://curl.haxx.se/bug/view.cgi?id=1698974) + +Version 7.16.2 (11 April 2007) + +Yang Tse (10 April 2007) +- Ravi Pratap provided some fixes for HTTP pipelining + +- configure script will ignore --enable-sspi option for non-native Windows. + +Daniel S (9 April 2007) +- Nick Zitzmann did ssh.c cleanups + +Daniel S (3 April 2007) +- Rob Jones fixed better #ifdef'ing for a bunch of #include lines. + +Daniel S (2 April 2007) +- Nick Zitzmann made the CURLOPT_POSTQUOTE option work for SFTP as well. The + accepted commands are as follows: + + chgrp (gid) (path) + Changes the group ID of the file or directory at (path) to (gid). (gid) + must be a number. + + chmod (perms) (path) + Changes the permissions of the file or directory at (path) to + (perms). (perms) must be a number in the format used by the chmod Unix + command. + + chown (uid) (path) + Changes the user ID of the file or directory at (path) to (uid). (uid) + must be a number. + + ln (source) (dest) + Creates a symbolic link at (dest) that points to the file located at + (source). + + mkdir (path) + Creates a new directory at (path). + + rename (source) (dest) + Moves the file or directory at (source) to (dest). + + rm (path) + Deletes the file located at (path). + + rmdir (path) + Deletes the directory located at (path). This command will raise an error + if the directory is not empty. + + symlink (source) (dest) + Same as ln. + +Daniel S (1 April 2007) +- Robert Iakobashvili made curl_multi_remove_handle() a lot faster when many + easy handles are added to a multi handle, by avoiding the looping over all + the handles to find which one to remove. + +- Matt Kraai provided a patch that makes curl build on QNX 6 fine again. + +Daniel S (31 March 2007) +- Fixed several minor issues detected by the coverity.com scanner. + +- "Pixel" fixed a problem that appeared when you used -f with user+password + embedded in the URL. + +Dan F (29 March 2007) +- Don't tear down the ftp connection if the maximum filesize was exceeded + and added tests 290 and 291 to check. + +- Added ftps upload and SSL required tests 401 and 402. + +- Send an EOF message before closing an SCP channel, as recommended by + RFC4254. Enable libssh2 tracing when ssh debugging is turned on. + +Yang Tse (27 March 2007) +- Internal function Curl_select() renamed to Curl_socket_ready() + + New Internal wrapper function Curl_select() around select (2), it + uses poll() when a fine poll() is available, so now libcurl can be + built without select() support at all if a fine poll() is available. + +Daniel S (25 March 2007) +- Daniel Johnson fixed multi code to traverse the easy handle list properly. + A left-over bug from the February 21 fix. + +Dan F (23 March 2007) +- Added --pubkey option to curl and made --key also work for SCP/SFTP, + plus made --pass work on an SSH private key as well. + +- Changed the test harness to attempt to gracefully shut down servers + before resorting to the kill -9 hammer. + +- Added test harness infrastructure to support scp/sftp tests, using + OpenSSH as the server. + +- Fixed a memory leak when specifying a proxy with a file: URL. + +Yang Tse (20 March 2007) +- Fixed: When a signal was caught awaiting for an event using Curl_select() + or Curl_poll() with a non-zero timeout both functions would restart the + specified timeout. This could even lead to the extreme case that if a + signal arrived with a frecuency lower to the specified timeout neither + function would ever exit. + + Added experimental symbol definition check CURL_ACKNOWLEDGE_EINTR in + Curl_select() and Curl_poll(). When compiled with CURL_ACKNOWLEDGE_EINTR + defined both functions will return as soon as a signal is caught. Use it + at your own risk, all calls to these functions in the library should be + revisited and checked before fully supporting this feature. + +Yang Tse (19 March 2007) +- Bryan Henderson fixed the progress function so that it can get called more + frequently allowing same calling frecuency for the client progress callback. + +Dan F (15 March 2007) +- Various memory leaks plugged and NULL pointer fixes made in the ssh code. + +Daniel (15 March 2007) +- Nick made the curl tool accept globbing ranges that only is one number, i.e + you can now use [1-1] without curl complaining. + +Daniel (10 March 2007) +- Eygene Ryabinkin: + + The problem is the following: when we're calling Curl_done and it decides to + keep the connection opened ('left intact'), then the caller is not notified + that the connection was done via the NULLifying of the pointer, so some easy + handle is keeping the pointer to this connection. + + Later ConnectionExists can select such connection for reuse even if we're + not pipelining: pipeLen is zero, so the (pipeLen > 0 && !canPipeline) is + false and we can reuse this connection for another easy handle. But thus the + connection will be shared between two easy handles if the handle that wants + to take the ownership is not the same as was not notified of the connection + was done in Curl_done. And when some of these easy handles will get their + connection really freed the another one will still keep the pointer. + + My fix was rather trivial: I just added the NULLification to the 'else' + branch in the Curl_done. My tests with Git and ElectricFence showed no + problems both for HTTP pulling and cloning. Repository size is about 250 Mb, + so it was a considerable amount of Curl's work. + +Dan F (9 March 2007) +- Updated the test harness to add a new "crypto" feature check and updated the + appropriate test case to use it. For now, this is treated the same as the + "SSL" feature because curl doesn't list it separately. + +Daniel (9 March 2007) +- Robert Iakobashvili fixed CURLOPT_INTERFACE for IPv6. + +- Robert A. Monat improved the maketgz and VC6/8 generating to set the correct + machine type too. + +- Justin Fletcher fixed a file descriptor leak in the curl tool when trying to + upload a file it couldn't open. Bug #1676581 + (http://curl.haxx.se/bug/view.cgi?id=1676581) + +Dan F (9 March 2007) +- Updated the test harness to check for protocol support before running each + test, fixing KNOWN_BUGS #11. + +Dan F (7 March 2007) +- Reintroduced (after a 3 year hiatus) an FTPS test case (400) into the test + harness. It is very limited as it supports only ftps:// URLs with + --ftp-ssl-control specified, which implicitly encrypts the control + channel but not the data channels. That allows stunnel to be used with + an unmodified ftp server in exactly the same way that the test https + server is set up. + +Dan F (7 March 2007) +- Honour --ftp-ssl-control on ftps:// URLs to allow encrypted control and + unencrypted data connections. + +Dan F (6 March 2007) +- Fixed a couple of improper pointer uses detected by valgrind in test + cases 181 & 216. + +Daniel (2 March 2007) +- Robert A. Monat and Shmulik Regev helped out to fix the new */Makefile.vc8 + makefiles that are included in the source release archives, generated from + the Makefile.vc6 files by the maketgz script. I also modified the root + Makefile to have a VC variable that defaults to vc6 but can be overridden to + allow it to be used for vc8 as well. Like this: + + nmake VC=vc8 vc + +Daniel (27 February 2007) +- Hang Kin Lau found and fixed: When I use libcurl to connect to an https + server through a proxy and have the remote https server port set using the + CURLOPT_PORT option, protocol gets reset to http from https after the first + request. + + User defined URL was modified internally by libcurl and subsequent reuse of + the easy handle may lead to connection using a different protocol (if not + originally http). + + I found that libcurl hardcoded the protocol to "http" when it tries to + regenerate the URL if CURLOPT_PORT is set. I tried to fix the problem as + follows and it's working fine so far + +Daniel (25 February 2007) +- Adam D. Moss made the HTTP CONNECT procedure less blocking when used from + the multi interface. Note that it still does a part of the connection in a + blocking manner. + +Daniel (23 February 2007) +- Added warning outputs if the command line uses more than one of the options + -v, --trace and --trace-ascii, since it could really confuse the user. + Clarified this fact in the man page. + +Daniel (21 February 2007) +- Ravi Pratap provided work on libcurl making pipelining more robust and + fixing some bugs: + o Don't mix GET and POST requests in a pipeline + o Fix the order in which requests are dispatched from the pipeline + o Fixed several curl bugs with pipelining when the server is returning + chunked encoding: + * Added states to chunked parsing for final CRLF + * Rewind buffer after parsing chunk with data remaining + * Moved chunked header initializing to a spot just before receiving + headers + +Daniel (20 February 2007) +- Linus Nielsen Feltzing changed the CURLOPT_FTP_SSL_CCC option to handle + active and passive CCC shutdown and added the --ftp-ssl-ccc-mode command + line option. + +Daniel (19 February 2007) +- Ian Turner fixed the libcurl.m4 macro's support for --with-libcurl. + +- Shmulik Regev found a memory leak in re-used HTTPS connections, at least + when the multi interface was used. + +- Robson Braga Araujo made passive FTP transfers work with SOCKS (both 4 and + 5). + +Daniel (18 February 2007) +- Jeff Pohlmeyer identified two problems: first a rather obscure problem with + the multi interface and connection re-use that could make a + curl_multi_remove_handle() ruin a pointer in another handle. + + The second problem was less of an actual problem but more of minor quirk: + the re-using of connections wasn't properly checking if the connection was + marked for closure. + +Daniel (16 February 2007) +- Duncan Mac-Vicar Prett and Michal Marek reported problems with resetting + CURLOPT_RANGE back to no range on an easy handle when using FTP. + +Dan F (14 February 2007) +- Fixed curl-config --libs so it doesn't list unnecessary libraries (and + therefore introduce unnecessary dependencies) when it's not needed. + Also, don't bother adding a library path of /usr/lib + +Daniel (13 February 2007) +- The default password for anonymous FTP connections is now changed to be + "ftp@example.com". + +- Robert A. Monat made libcurl build fine with VC2005 - it doesn't have + gmtime_r() like the older VC versions. He also made use of some machine- + specific defines to differentiate the "OS" define. + +Daniel (12 February 2007) +- Rob Crittenden added support for NSS (Network Security Service) for the + SSL/TLS layer. http://www.mozilla.org/projects/security/pki/nss/ + + This is the fourth supported library for TLS/SSL that libcurl supports! + +- Shmulik Regev fixed so that the final CRLF of HTTP response headers are sent + to the debug callback. + +- Shmulik Regev added CURLOPT_HTTP_CONTENT_DECODING and + CURLOPT_HTTP_TRANSFER_DECODING that if set to zero will disable libcurl's + internal decoding of content or transfer encoded content. This may be + preferable in cases where you use libcurl for proxy purposes or similar. The + command line tool got a --raw option to disable both at once. + +- release tarballs made with maketgz will from now on have a LIBCURL_TIMESTAMP + define set to hold the exact date and time of when the tarball was built, as + a human readable string using the UTC time zone. + +- Jeff Pohlmeyer fixed a flaw in curl_multi_add_handle() when adding a handle + that has an easy handle present in the "closure" list pending closure. + +Daniel (6 February 2007) +- Regular file downloads wiht SFTP and SCP are now done using the non-blocking + API of libssh2, if the libssh2 headers seem to support them. This will make + SCP and SFTP much more responsive and better libcurl citizens when used with + the multi interface etc. + +Daniel (5 February 2007) +- Michael Wallner added support for CURLOPT_TIMEOUT_MS and + CURLOPT_CONNECTTIMEOUT_MS that, as their names suggest, do the timeouts with + millisecond resolution. The only restriction to that is the alarm() + (sometimes) used to abort name resolves as that uses full seconds. I fixed + the FTP response timeout part of the patch. + + Internally we now count and keep the timeouts in milliseconds but it also + means we multiply set timeouts with 1000. The effect of this is that no + timeout can be set to more than 2^31 milliseconds (on 32 bit systems), which + equals 24.86 days. We probably couldn't before either since the code did + *1000 on the timeout values on several places already. + +Daniel (3 February 2007) +- Yang Tse fixed the cookie expiry date in several test cases that started to + fail since they used "1 feb 2007"... + +- Manfred Schwarb reported that socks5 support was broken and help us pinpoint + the problem. The code now tries harder to use httproxy and proxy where + apppropriate, as not all proxies are HTTP... + +Version 7.16.1 (29 January 2007) + +Daniel (29 January 2007) +- Michael Wallner reported that when doing a CONNECT with a custom User-Agent + header, you got _two_ User-Agent headers in the CONNECT request...! Added + test case 287 to verify the fix. + +Daniel (28 January 2007) +- curl_easy_reset() now resets the CA bundle path correctly. + +- David McCreedy fixed the Curl command line tool for HTTP on non-ASCII + platforms. + +Daniel (25 January 2007) +- Added the --libcurl [file] option to curl. Append this option to any + ordinary curl command line, and you will get a libcurl-using source code + written to the file that does the equivalent operation of what your command + line operation does! + +Dan F (24 January 2007) +- Fixed a dangling pointer problem that prevented the http_proxy environment + variable from being properly used in many cases (and caused test case 63 + to fail). + +Daniel (23 January 2007) +- David McCreedy did NTLM changes mainly for non-ASCII platforms: + + #1 + There's a compilation error in http_ntlm.c if USE_NTLM2SESSION is NOT + defined. I noticed this while testing various configurations. Line 867 of + the current http_ntlm.c is a closing bracket for an if/else pair that only + gets compiled in if USE_NTLM2SESSION is defined. But this closing bracket + wasn't in an #ifdef so the code fails to compile unless USE_NTLM2SESSION was + defined. Lines 198 and 140 of my patch wraps that closing bracket in an + #ifdef USE_NTLM2SESSION. + + #2 + I noticed several picky compiler warnings when DEBUG_ME is defined. I've + fixed them with casting. By the way, DEBUG_ME was a huge help in + understanding this code. + + #3 + Hopefully the last non-ASCII conversion patch for libcurl in a while. I + changed the "NTLMSSP" literal to hex since this signature must always be in + ASCII. + + Conversion code was strategically added where necessary. And the + Curl_base64_encode calls were changed so the binary "blobs" http_ntlm.c + creates are NOT translated on non-ASCII platforms. + +Dan F (22 January 2007) +- Converted (most of) the test data files into genuine XML. A handful still + are not, due mainly to the lack of support for XML character entities + (e.g. & => & ). This will make it easier to validate test files using + tools like xmllint, as well as to edit and view them using XML tools. + +Daniel (16 January 2007) +- Armel Asselin improved libcurl to behave a lot better when an easy handle + doing an FTP transfer is removed from a multi handle before completion. The + fix also fixed the "alive counter" to be correct on "premature removal" for + all protocols. + +Dan F (16 January 2007) +- Fixed a small memory leak in tftp uploads discovered by curl's memory leak + detector. Also changed tftp downloads to URL-unescape the downloaded + file name. + +Daniel (14 January 2007) +- David McCreedy provided libcurl changes for doing HTTP communication on + non-ASCII platforms. It does add some complexity, most notably with more + #ifdefs, but I want to see this supported added and I can't see how we can + add it without the extra stuff added. + +- Setting CURLOPT_COOKIELIST to "ALL" when no cookies at all was present, + libcurl would crash when trying to read a NULL pointer. + +Daniel (12 January 2007) +- Toby Peterson found a nasty bug that prevented (lib)curl from properly + downloading (most) things that were larger than 4GB on 32 bit systems. Matt + Witherspoon helped as narrow down the problem. + +Daniel (5 January 2007) +- Linus Nielsen Feltzing introduced the --ftp-ssl-ccc command line option to + curl that uses the new CURLOPT_FTP_SSL_CCC option in libcurl. If enabled, it + will make libcurl shutdown SSL/TLS after the authentication is done on a + FTP-SSL operation. + +Daniel (4 January 2007) +- David McCreedy made changes to allow base64 encoding/decoding to work on + non-ASCII platforms. + +Daniel (3 January 2007) +- Matt Witherspoon fixed the flaw which made libcurl 7.16.0 always store + downloaded data in two buffers, just to be able to deal with a special HTTP + pipelining case. That is now only activated for pipelined transfers. In + Matt's case, it showed as a considerable performance difference, + +Daniel (2 January 2007) +- Victor Snezhko helped us fix bug report #1603712 + (http://curl.haxx.se/bug/view.cgi?id=1603712) (known bug #36) --limit-rate + (CURLOPT_MAX_SEND_SPEED_LARGE and CURLOPT_MAX_RECV_SPEED_LARGE) are broken + on Windows (since 7.16.0, but that's when they were introduced as previous + to that the limiting logic was made in the application only and not in the + library). It was actually also broken on select()-based systems (as apposed + to poll()) but we haven't had any such reports. We now use select(), Sleep() + or delay() properly to sleep a while without waiting for anything input or + output when the rate limiting is activated with the easy interface. + +- Modified libcurl.pc.in to use Libs.private for the libs libcurl itself needs + to get built static. It has been mentioned before and was again brought to + our attention by Nathanael Nerode who filed debian bug report #405226 + (http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=405226). + diff --git a/vendors/libcurl/COPYING b/vendors/libcurl/COPYING new file mode 100644 index 0000000..8680f46 --- /dev/null +++ b/vendors/libcurl/COPYING @@ -0,0 +1,21 @@ +COPYRIGHT AND PERMISSION NOTICE + +Copyright (c) 1996 - 2008, Daniel Stenberg, . + +All rights reserved. + +Permission to use, copy, modify, and distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright +notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE +OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of a copyright holder shall not +be used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization of the copyright holder. diff --git a/vendors/libcurl/README b/vendors/libcurl/README new file mode 100644 index 0000000..db69d40 --- /dev/null +++ b/vendors/libcurl/README @@ -0,0 +1,57 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + +README + + Curl is a command line tool for transferring data specified with URL + syntax. Find out how to use curl by reading the curl.1 man page or the + MANUAL document. Find out how to install Curl by reading the INSTALL + document. + + libcurl is the library curl is using to do its job. It is readily + available to be used by your software. Read the libcurl.3 man page to + learn how! + + You find answers to the most frequent questions we get in the FAQ document. + + Study the COPYING file for distribution terms and similar. If you distribute + curl binaries or other binaries that involve libcurl, you might enjoy the + LICENSE-MIXING document. + + ! This version of libcurl requires zlib1.dll (zLib 1.2.3), available at + http://gnuwin32.sourceforge.net/packages/zlib.htm to work ! + +CONTACT + + If you have problems, questions, ideas or suggestions, please contact us + by posting to a suitable mailing list. See http://curl.haxx.se/mail/ + + All contributors to the project are listed in the THANKS document. + +WEB SITE + + Visit the curl web site or mirrors for the latest news and downloads: + + Sweden http://curl.haxx.se/ + Mirrors http://curlm.haxx.se/ + +CVS + + To download the very latest source off the CVS server do this: + + cvs -d :pserver:anonymous@cool.haxx.se:/cvsroot/curl login + + (just press enter when asked for password) + + cvs -d :pserver:anonymous@cool.haxx.se:/cvsroot/curl co curl + + (you'll get a directory named curl created, filled with the source code) + +NOTICE + + Curl contains pieces of source code that is Copyright (c) 1998, 1999 + Kungliga Tekniska Hgskolan. This notice is included here to comply with the + distribution terms. diff --git a/vendors/libcurl/RELEASE-NOTES b/vendors/libcurl/RELEASE-NOTES new file mode 100644 index 0000000..2152344 --- /dev/null +++ b/vendors/libcurl/RELEASE-NOTES @@ -0,0 +1,94 @@ +Curl and libcurl 7.18.0 + + Public curl releases: 103 + Command line options: 126 + curl_easy_setopt() options: 150 + Public functions in libcurl: 56 + Public web site mirrors: 43 + Known libcurl bindings: 36 + Contributors: 597 + +This release includes the following changes: + + o --data-urlencode + o CURLOPT_PROXY_TRANSFER_MODE + o --no-keepalive - now curl does connections with keep-alive enabled by + default + o --socks4a added (proxy type CURLPROXY_SOCKS4A for libcurl) + o --socks5-hostname added (CURLPROXY_SOCKS5_HOSTNAME for libcurl) + o curl_easy_pause() + o CURLOPT_SEEKFUNCTION and CURLOPT_SEEKDATA + o --keepalive-time + o curl --help output was re-ordered + +This release includes the following bugfixes: + + o curl-config --features and --protocols show the correct output when built + with NSS, and also when SCP, SFTP and libz are not available + o free problem in the curl tool for users with empty home dir + o curl.h version 7.17.1 problem when building C++ apps with MSVC + o SFTP and SCP use persistent connections + o segfault on bad URL + o variable wrapping when using absolutely huge send buffer sizes + o variable wrapping when using debug callback and the HTTP request wasn't sent + in one go + o SSL connections with NSS done with the multi-interface + o setting a share no longer activates cookies + o Negotiate now works on auth and proxy simultanouesly + o support HTTP Digest nonces up to 1023 letters + o resumed ftp upload no longer requires the read callback to return full + buffers + o no longer default-appends ;type= on FTP URLs thru proxies + o SSL session id caching + o POST with callback over proxy requiring NTLM or Digest + o Expect: 100-continue flaw on re-used connection with POSTs + o build fix for MSVC 9.0 (VS2008) + o Windows curl builds failed file truncation when retry downloading + o SSL session ID cache memory leak + o bad connection re-use check with environment variable-activated proxy use + o --libcurl now generates a return statement as well + o socklen_t is no longer used in the public includes + o time zone offsets from -1400 to +1400 are now accepted by the date parser + o allows more spaces in WWW/Proxy-Authenticate: headers + o curl-config --libs skips /usr/lib64 + o range support for file:// transfers + o libcurl hang with huge POST request and request-body read from callback + o removed extra newlines from many error messages + o improved pipelining + o improved OOM handling for data url encoded HTTP POSTs when read from a file + o test suite could pick wrong tool(s) if more than one existed in the PATH + o curl_multi_fdset() failed to return socket while doing CONNECT over proxy + o curl_multi_remove_handle() on a handle that is in used for a pipeline now + break that pipeline + o CURLOPT_COOKIELIST memory leaks + o progress meter/callback during http proxy CONNECT requests + o auth for http proxy when the proxy closes connection after first response + +This release includes the following known bugs: + + o see docs/KNOWN_BUGS (http://curl.haxx.se/docs/knownbugs.html) + +Other curl-related news: + + o TclCurl 7.17.1 => http://personal1.iddeo.es/andresgarci/tclcurl/english/ + o Ruby Curl::Multi 0.1 => http://curl-multi.rubyforge.org/ + o curl-java 0.2.1 => http://curl.haxx.se/libcurl/java/ + +New curl mirrors: + + o http://curl.gominet.net/ is new mirror in Vizcaya, Portugal + o http://curl.very-clever.com/ is a new mirror in Nuremberg, Germany + +This release would not have looked like this without help, code, reports and +advice from friends like these: + + Dan Fandrich, Gisle Vanem, Toby Peterson, Yang Tse, Daniel Black, + Robin Johnson, Michal Marek, Ates Goral, Andres Garcia, Rob Crittenden, + Emil Romanus, Alessandro Vesely, Ray Pekowski, Spacen Jasset, Andrew Moise, + Gilles Blanc, David Wright, Vikram Saxena, Mateusz Loskot, Gary Maxwell, + Dmitry Kurochkin, Mohun Biswas, Richard Atterer, Maxim Perenesenko, + Daniel Egger, Jeff Johnson, Nikitinskit Dmitriy, Georg Lippitsch, Eric Landes, + Joe Malicki, Nathan Coulter, Lau Hang Kin, Judson Bishop, Igor Franchuk, + Kevin Reed + + Thanks! (and sorry if I forgot to mention someone) diff --git a/vendors/libcurl/docs/BINDINGS b/vendors/libcurl/docs/BINDINGS new file mode 100644 index 0000000..2bb7587 --- /dev/null +++ b/vendors/libcurl/docs/BINDINGS @@ -0,0 +1,206 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + + libcurl bindings + +Creative people have written bindings or interfaces for various environments +and programming languages. Using one of these allows you to take advantage of +curl powers from within your favourite language or system. + +This is a list of all known interfaces as of this writing. + +The bindings listed below are not part of the curl/libcurl distribution +archives, but must be downloaded and installed separately. + +Ada95 + + Writtten by Andreas Almroth + http://www.almroth.com/adacurl/index.html + +Basic + + ScriptBasic bindings to libcurl. Writtten by Peter Verhas + http://scriptbasic.com/ + +C + libcurl is a C library in itself! + http://curl.haxx.se/libcurl/ + +C++ + + Written by Jean-Philippe Barrette-LaPierre + http://rrette.com/textpattern/index.php?s=cURLpp + +Ch + + Written by Stephen Nestinger and Jonathan Rogado + http://chcurl.sourceforge.net/ + +Cocoa + + Written by Dan Wood + http://curlhandle.sourceforge.net/ + +D + + Written by Kenneth Bogert + http://curl.haxx.se/libcurl/d/ + +Dylan + + Written by Chris Double + http://dylanlibs.sourceforge.net/ + +Euphoria + + Written by Ray Smith + http://rays-web.com/eulibcurl.htm + +Ferite + Written by Paul Querna + http://www.ferite.org/ + +Gambas + http://gambas.sourceforge.net + +glib/GTK+ + Written by Richard Atterer + http://atterer.net/glibcurl/ + +Java + + Maintained by [blank] + http://curl.haxx.se/libcurl/java/ + +Lisp + + Written by Liam Healy + http://common-lisp.net/project/cl-curl/ + +Lua + + luacurl by Alexander Marinov + http://luacurl.luaforge.net/ + + Lua-cURL by Jrgen Htzel + http://luaforge.net/projects/lua-curl/ + +Mono + + Written by Jeffrey Phillips + http://forge.novell.com/modules/xfmod/project/?libcurl-mono + +.NET + + libcurl-net by Jeffrey Phillips + http://sourceforge.net/projects/libcurl-net/ + +Object-Pascal + + Free Pascal, Delphi and Kylix binding written by Christophe Espern. + http://www.tekool.com/opcurl + +O'Caml + + Written by Lars Nilsson + http://sourceforge.net/projects/ocurl/ + +Pascal + + Free Pascal, Delphi and Kylix binding written by Jeffrey Pohlmeyer. + http://houston.quik.com/jkp/curlpas/ + +Perl + + Maintained by Cris Bailiff + http://curl.haxx.se/libcurl/perl/ + +PHP + + Written by Sterling Hughes + http://curl.haxx.se/libcurl/php/ + +PostgreSQL + + Written by Gian Paolo Ciceri + http://gborg.postgresql.org/project/pgcurl/projdisplay.php + +Python + + PycURL by Kjetil Jacobsen + http://pycurl.sourceforge.net/ + +R + + RCurl by Duncan Temple Lang + http://www.omegahat.org/RCurl/ + +Rexx + + Written Mark Hessling + http://rexxcurl.sourceforge.net/ + +RPG + + Support for ILE/RPG on OS/400 is included in source distribution + http://curl.haxx.se/libcurl/ + See packages/OS400/README.OS400 and packages/OS400/curl.inc.in + +Ruby + + curb - written by Ross Bamford + http://curb.rubyforge.org/ + + ruby-curl-multi - written by Kristjan Petursson and Keith Rarick + http://curl-multi.rubyforge.org/ + +Scheme + + Bigloo binding by Kirill Lisovsky + http://curl.haxx.se/libcurl/scheme/ + +S-Lang + + S-Lang binding by John E Davis + http://www.jedsoft.org/slang/modules/curl.html + +Smalltalk + + Smalltalk binding by Danil Osipchuk + http://www.squeaksource.com/CurlPlugin/ + +SP-Forth + SP-Forth binding by ygrek + http://www.forth.org.ru/~ac/lib/lin/curl/ + +SPL + + SPL binding by Clifford Wolf + http://www.clifford.at/spl/ + +Tcl + + Tclcurl by Andrs Garca + http://personal1.iddeo.es/andresgarci/tclcurl/english/docs.html + +Visual Basic + + libcurl-vb by Jeffrey Phillips + http://sourceforge.net/projects/libcurl-vb/ + +Q + The libcurl module is part of the default install + http://q-lang.sourceforge.net/ + +wxWidgets + + Written by Casey O'Donnell + http://wxcode.sourceforge.net/components/wxcurl/ + +XBLite + + Written by David Szafranski + http://perso.wanadoo.fr/xblite/libraries.html diff --git a/vendors/libcurl/docs/BUGS b/vendors/libcurl/docs/BUGS new file mode 100644 index 0000000..5393610 --- /dev/null +++ b/vendors/libcurl/docs/BUGS @@ -0,0 +1,82 @@ +$Id: BUGS,v 1.8 2007-07-19 21:35:36 bagder Exp $ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + +BUGS + + Curl and libcurl have grown substantially since the beginning. At the time + of writing (July 2007), there are about 47000 lines of source code, and by + the time you read this it has probably grown even more. + + Of course there are lots of bugs left. And lots of misfeatures. + + To help us make curl the stable and solid product we want it to be, we need + bug reports and bug fixes. + +WHERE TO REPORT + + If you can't fix a bug yourself and submit a fix for it, try to report an as + detailed report as possible to a curl mailing list to allow one of us to + have a go at a solution. You should also post your bug/problem at curl's bug + tracking system over at + + http://sourceforge.net/bugs/?group_id=976 + + (but please read the sections below first before doing that) + + If you feel you need to ask around first, find a suitable mailing list and + post there. The lists are available on http://curl.haxx.se/mail/ + +WHAT TO REPORT + + When reporting a bug, you should include all information that will help us + understand what's wrong, what you expected to happen and how to repeat the + bad behavior. You therefore need to tell us: + + - your operating system's name and version number (uname -a under a unix + is fine) + - what version of curl you're using (curl -V is fine) + - versions of the used libraries that libcurl is built to use + - what URL you were working with (if possible), at least which protocol + + and anything and everything else you think matters. Tell us what you + expected to happen, tell use what did happen, tell us how you could make it + work another way. Dig around, try out, test. Then include all the tiny bits + and pieces in your report. You will benefit from this yourself, as it will + enable us to help you quicker and more accurately. + + Since curl deals with networks, it often helps us if you include a protocol + debug dump with your bug report. The output you get by using the -v or + --trace options. + + If curl crashed, causing a core dump (in unix), there is hardly any use to + send that huge file to anyone of us. Unless we have an exact same system + setup as you, we can't do much with it. Instead we ask you to get a stack + trace and send that (much smaller) output to us instead! + + The address and how to subscribe to the mailing lists are detailed in the + MANUAL file. + +HOW TO GET A STACK TRACE + + First, you must make sure that you compile all sources with -g and that you + don't 'strip' the final executable. Try to avoid optimizing the code as + well, remove -O, -O2 etc from the compiler options. + + Run the program until it cores. + + Run your debugger on the core file, like ' curl core'. + should be replaced with the name of your debugger, in most cases that will + be 'gdb', but 'dbx' and others also occur. + + When the debugger has finished loading the core file and presents you a + prompt, enter 'where' (without the quotes) and press return. + + The list that is presented is the stack trace. If everything worked, it is + supposed to contain the chain of functions that were called when curl + crashed. Include the stack trace with your detailed bug report. It'll help a + lot. + diff --git a/vendors/libcurl/docs/CONTRIBUTE b/vendors/libcurl/docs/CONTRIBUTE new file mode 100644 index 0000000..94e9a6c --- /dev/null +++ b/vendors/libcurl/docs/CONTRIBUTE @@ -0,0 +1,233 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + + When Contributing Source Code + + This document is intended to offer guidelines that can be useful to keep in + mind when you decide to contribute to the project. This concerns new features + as well as corrections to existing flaws or bugs. + + 1. Learning cURL + 1.1 Join the Community + 1.2 License + 1.3 What To Read + + 2. cURL Coding Standards + 2.1 Naming + 2.2 Indenting + 2.3 Commenting + 2.4 Line Lengths + 2.5 General Style + 2.6 Non-clobbering All Over + 2.7 Platform Dependent Code + 2.8 Write Separate Patches + 2.9 Patch Against Recent Sources + 2.10 Document + 2.11 Test Cases + + 3. Pushing Out Your Changes + 3.1 Write Access to CVS Repository + 3.2 How To Make a Patch + 3.3 How to get your changes into the main sources + +============================================================================== + +1. Learning cURL + +1.1 Join the Community + + Skip over to http://curl.haxx.se/mail/ and join the appropriate mailing + list(s). Read up on details before you post questions. Read this file before + you start sending patches! We prefer patches and discussions being held on + the mailing list(s), not sent to individuals. + + Before posting to one of the curl mailing lists, please read up on the mailing + list etiquette: http://curl.haxx.se/mail/etiquette.html + + We also hang out on IRC in #curl on irc.freenode.net + +1.2. License + + When contributing with code, you agree to put your changes and new code under + the same license curl and libcurl is already using unless stated and agreed + otherwise. + + If you add a larger piece of code, you can opt to make that file or set of + files to use a different license as long as they don't enforce any changes to + the rest of the package and they make sense. Such "separate parts" can not be + GPL licensed (as we don't want copyleft to affect users of libcurl) but they + must use "GPL compatible" licenses (as we want to allow users to use libcurl + properly in GPL licensed environments). + + When changing existing source code, you do not alter the copyright of the + original file(s). The copyright will still be owned by the original + creator(s) or those who have been assigned copyright by the original + author(s). + + By submitting a patch to the curl project, you are assumed to have the right + to the code and to be allowed by your employer or whatever to hand over that + patch/code to us. We will credit you for your changes as far as possible, to + give credit but also to keep a trace back to who made what changes. Please + always provide us with your full real name when contributing! + +1.3 What To Read + + Source code, the man pages, the INTERNALS document, TODO, KNOWN_BUGS, the + most recent CHANGES. Just lurking on the libcurl mailing list is gonna give + you a lot of insights on what's going on right now. Asking there is a good + idea too. + +2. cURL Coding Standards + +2.1 Naming + + Try using a non-confusing naming scheme for your new functions and variable + names. It doesn't necessarily have to mean that you should use the same as in + other places of the code, just that the names should be logical, + understandable and be named according to what they're used for. File-local + functions should be made static. We like lower case names. + + See the INTERNALS document on how we name non-exported library-global + symbols. + +2.2 Indenting + + Please try using the same indenting levels and bracing method as all the + other code already does. It makes the source code a lot easier to follow if + all of it is written using the same style. We don't ask you to like it, we + just ask you to follow the tradition! ;-) This mainly means: 2-level indents, + using spaces only (no tabs) and having the opening brace ({) on the same line + as the if() or while(). + + Also note that we use if() and while() with no space before the parenthesis. + +2.3 Commenting + + Comment your source code extensively using C comments (/* comment */), DO NOT + use C++ comments (// this style). Commented code is quality code and enables + future modifications much more. Uncommented code risk having to be completely + replaced when someone wants to extend things, since other persons' source + code can get quite hard to read. + +2.4 Line Lengths + + We try to keep source lines shorter than 80 columns. + +2.5 General Style + + Keep your functions small. If they're small you avoid a lot of mistakes and + you don't accidentally mix up variables etc. + +2.6 Non-clobbering All Over + + When you write new functionality or fix bugs, it is important that you don't + fiddle all over the source files and functions. Remember that it is likely + that other people have done changes in the same source files as you have and + possibly even in the same functions. If you bring completely new + functionality, try writing it in a new source file. If you fix bugs, try to + fix one bug at a time and send them as separate patches. + +2.7 Platform Dependent Code + + Use #ifdef HAVE_FEATURE to do conditional code. We avoid checking for + particular operating systems or hardware in the #ifdef lines. The + HAVE_FEATURE shall be generated by the configure script for unix-like systems + and they are hard-coded in the config-[system].h files for the others. + +2.8 Write Separate Patches + + It is annoying when you get a huge patch from someone that is said to fix 511 + odd problems, but discussions and opinions don't agree with 510 of them - or + 509 of them were already fixed in a different way. Then the patcher needs to + extract the single interesting patch from somewhere within the huge pile of + source, and that gives a lot of extra work. Preferably, all fixes that + correct different problems should be in their own patch with an attached + description exactly what they correct so that all patches can be selectively + applied by the maintainer or other interested parties. + +2.9 Patch Against Recent Sources + + Please try to get the latest available sources to make your patches + against. It makes the life of the developers so much easier. The very best is + if you get the most up-to-date sources from the CVS repository, but the + latest release archive is quite OK as well! + +2.10 Document + + Writing docs is dead boring and one of the big problems with many open source + projects. Someone's gotta do it. It makes it a lot easier if you submit a + small description of your fix or your new features with every contribution so + that it can be swiftly added to the package documentation. + + The documentation is always made in man pages (nroff formatted) or plain + ASCII files. All HTML files on the web site and in the release archives are + generated from the nroff/ASCII versions. + +2.11 Test Cases + + Since the introduction of the test suite, we can quickly verify that the main + features are working as they're supposed to. To maintain this situation and + improve it, all new features and functions that are added need to be tested + in the test suite. Every feature that is added should get at least one valid + test case that verifies that it works as documented. If every submitter also + posts a few test cases, it won't end up as a heavy burden on a single person! + +3. Pushing Out Your Changes + +3.1 Write Access to CVS Repository + + If you are a frequent contributor, or have another good reason, you can of + course get write access to the CVS repository and then you'll be able to + check-in all your changes straight into the CVS tree instead of sending all + changes by mail as patches. Just ask if this is what you'd want. You will be + required to have posted a few quality patches first, before you can be + granted write access. + +3.2 How To Make a Patch + + Keep a copy of the unmodified curl sources. Make your changes in a separate + source tree. When you think you have something that you want to offer the + curl community, use GNU diff to generate patches. + + If you have modified a single file, try something like: + + diff -u unmodified-file.c my-changed-one.c > my-fixes.diff + + If you have modified several files, possibly in different directories, you + can use diff recursively: + + diff -ur curl-original-dir curl-modified-sources-dir > my-fixes.diff + + The GNU diff and GNU patch tools exist for virtually all platforms, including + all kinds of Unixes and Windows: + + For unix-like operating systems: + + http://www.gnu.org/software/patch/patch.html + http://www.gnu.org/directory/diffutils.html + + For Windows: + + http://gnuwin32.sourceforge.net/packages/patch.htm + http://gnuwin32.sourceforge.net/packages/diffutils.htm + +3.3 How to get your changes into the main sources + + 1. Submit your patch to the curl-library mailing list + + 2. Make the patch against as recent sources as possible. + + 3. Make sure your patch adheres to the source indent and coding style of + already existing source code. Failing to do so just adds more work for me. + + 4. Respond to replies on the list about the patch and answer questions and/or + fix nits/flaws. This is very important. I will take lack of replies as a + sign that you're not very anxious to get your patch accepted and I tend to + simply drop such patches from my TODO list. + + 5. If you've followed the above mentioned paragraphs and your patch still + hasn't been incorporated after some weeks, consider resubmitting it to the + list. diff --git a/vendors/libcurl/docs/DISTRO-DILEMMA b/vendors/libcurl/docs/DISTRO-DILEMMA new file mode 100644 index 0000000..0be5993 --- /dev/null +++ b/vendors/libcurl/docs/DISTRO-DILEMMA @@ -0,0 +1,176 @@ + Date: February 11, 2007 + Author: Daniel Stenberg + URL: http://curl.haxx.se/legal/distro-dilemma.html + +Condition + + This document is written to describe the situation as it is right now. + libcurl 7.16.1 is currently the latest version available. Things may of + course change in the future. + + This document reflects my view and understanding of these things. Please tell + me where and how you think I'm wrong, and I'll try to correct my mistakes. + +Background + + The Free Software Foundation has deemed the Original BSD license[1] to be + "incompatible"[2] with GPL[3]. I'd rather say it is the other way around, but + the point is the same: if you distribute a binary version of a GPL program, + it MUST NOT be linked with any Original BSD-licensed parts or libraries. + Doing so will violate the GPL license. For a long time, very many GPL + licensed programs have avoided this license mess by adding an exception[8] to + their license. And many others have just closed their eyes for this problem. + + libcurl is MIT-style[4] licensed - how on earth did this dilemma fall onto + our plates? + + libcurl is only a little library. libcurl can be built to use OpenSSL for its + SSL/TLS capabilities. OpenSSL is basically Original BSD licensed[5]. + + If libcurl built to use OpenSSL is used by a GPL-licensed application and you + decide to distribute a binary version of it (Linux distros - for example - + tend to), you have a clash. GPL vs Original BSD. + + This dilemma is not libcurl-specific nor is it specific to any particular + Linux distro. (This article mentions and refers to Debian several times, but + only because Debian seems to be the only Linux distro to have faced this + issue yet since no other distro is shipping libcurl built with two SSL + libraries.) + +Part of the Operating System + + This would not be a problem if the used lib would be considered part of the + underlying operating system, as then the GPL license has an exception + clause[6] that allows applications to use such libs without having to be + allowed to distribute it or its sources. Possibly some distros will claim + that OpenSSL is part of their operating system. + + Debian does however not take this stance and has officially(?) claimed that + OpenSSL is not a required part of the Debian operating system + + Some people claim that this paragraph cannot be exploited this way by a Linux + distro, but I am not a lawyer and that is a discussion left outside of this + document. + +GnuTLS + + Since May 2005 libcurl can get built to use GnuTLS instead of OpenSSL. GnuTLS + is an LGPL[7] licensed library that offers a matching set of features as + OpenSSL does. Now, you can build and distribute an TLS/SSL capable libcurl + without including any Original BSD licensed code. + + I believe Debian is the first (only?) distro that provides libcurl/GnutTLS + packages. + +yassl + + libcurl can get also get built to use yassl for the TLS/SSL layer. yassl is a + GPL[3] licensed library. + + +GnuTLS vs OpenSSL vs yassl + + While these three libraries offer similar features, they are not equal. + libcurl does not (yet) offer a standardized stable ABI if you decide to + switch from using libcurl-openssl to libcurl-gnutls or vice versa. The GnuTLS + and yassl support is very recent in libcurl and it has not been tested nor + used very extensively, while the OpenSSL equivalent code has been used and + thus matured since 1999. + + GnuTLS + - LGPL licensened + - supports SRP + - lacks SSLv2 support + - lacks MD2 support (used by at least some CA certs) + - lacks the crypto functions libcurl uses for NTLM + + OpenSSL + - Original BSD licensened + - lacks SRP + - supports SSLv2 + - older and more widely used + - provides crypto functions libcurl uses for NTLM + - libcurl can do non-blocking connects with it in 7.15.4 and later + + yassl + - GPL licensed + - much untested and unproven in the real work by (lib)curl users so we don't + know a lot about restrictions or benefits from using this + +The Better License, Original BSD, GPL or LGPL? + + It isn't obvious or without debate to any objective interested party that + either of these licenses are the "better" or even the "preferred" one in a + generic situation. + + Instead, I think we should accept the fact that the SSL/TLS libraries and + their different licenses will fit different applications and their authors + differently depending on the applications' licenses and their general usage + pattern (considering how GPL and LGPL libraries for example can be burdensome + for embedded systems usage). + + In Debian land, there seems to be a common opinion that LGPL is "maximally + compatible" with apps while Original BSD is not. Like this: + + http://lists.debian.org/debian-devel/2005/09/msg01417.html + +More SSL Libraries + + In libcurl, there's no stopping us here. There are more Open Source/Free + SSL/TLS libraries out there and we would very much like to support them as + well, to offer application authors an even wider scope of choice. + +Application Angle of this Problem + + libcurl is built to use one SSL/TLS library. It uses a single fixed name (by + default) on the built/created lib file, and applications are built/linked to + use that single lib. Replacing one libcurl instance with another one that + uses the other SSL/TLS library might break one or more applications (due to + ABI differences and/or different feature set). You want your application to + use the libcurl it was built for. + +Project cURL Angle of this Problem + + We distribute libcurl and everyone may build libcurl with either library at + their choice. This problem is not directly a problem of ours. It merely + affects users - GPL application authors only - of our lib as it comes + included and delivered on some distros. + + libcurl has different ABI when built with different SSL/TLS libraries due to + these reasons: + + 1. No one has worked on fixing this. The mutex/lock callbacks should be set + with a generic libcurl function that should use the proper underlying + functions. + + 2. The CURLOPT_SSL_CTX_FUNCTION option is not possible to "emulate" on GnuTLS + but simply requires OpenSSL. + + 3. There might be some other subtle differences just because nobody has yet + tried to make a fixed ABI like this. + +Distro Angle of this Problem + + To my knowledge there is only one distro that ships libcurl built with either + OpenSSL or GnuTLS. + + Debian Linux is now (since mid September 2005) providing two different + libcurl packages, one for libcurl built with OpenSSL and one built with + GnuTLS. They use different .so names and can this both be installed in a + single system simultaneously. This has been said to be a transitional system + not desired to keep in the long run. + +Footnotes + + [1] = http://www.xfree86.org/3.3.6/COPYRIGHT2.html#6 + [2] = http://www.fsf.org/licensing/essays/bsd.html + [3] = http://www.fsf.org/licensing/licenses/gpl.html + [4] = http://curl.haxx.se/docs/copyright.html + [5] = http://www.openssl.org/source/license.html + [6] = http://www.fsf.org/licensing/licenses/gpl.html end of section 3 + [7] = http://www.fsf.org/licensing/licenses/lgpl.html + [8] = http://en.wikipedia.org/wiki/OpenSSL_exception + +Feedback/Updates provided by + + Eric Cooper diff --git a/vendors/libcurl/docs/FAQ b/vendors/libcurl/docs/FAQ new file mode 100644 index 0000000..66c926d --- /dev/null +++ b/vendors/libcurl/docs/FAQ @@ -0,0 +1,1149 @@ +Updated: Dec 10, 2007 (http://curl.haxx.se/docs/faq.html) + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + +FAQ + + 1. Philosophy + 1.1 What is cURL? + 1.2 What is libcurl? + 1.3 What is curl not? + 1.4 When will you make curl do XXXX ? + 1.5 Who makes curl? + 1.6 What do you get for making curl? + 1.7 What about CURL from curl.com? + 1.8 I have a problem who do I mail? + 1.9 Where do I buy commercial support for curl? + 1.10 How many are using curl? + + 2. Install Related Problems + 2.1 configure doesn't find OpenSSL even when it is installed + 2.1.1 native linker doesn't find OpenSSL + 2.1.2 only the libssl lib is missing + 2.2 Does curl work/build with other SSL libraries? + 2.3 Where can I find a copy of LIBEAY32.DLL? + 2.4 Does curl support Socks (RFC 1928) ? + + 3. Usage Problems + 3.1 curl: (1) SSL is disabled, https: not supported + 3.2 How do I tell curl to resume a transfer? + 3.3 Why doesn't my posting using -F work? + 3.4 How do I tell curl to run custom FTP commands? + 3.5 How can I disable the Pragma: nocache header? + 3.6 Does curl support ASP, XML, XHTML or HTML version Y? + 3.7 Can I use curl to delete/rename a file through FTP? + 3.8 How do I tell curl to follow HTTP redirects? + 3.9 How do I use curl in my favorite programming language? + 3.10 What about SOAP, WebDAV, XML-RPC or similar protocols over HTTP? + 3.11 How do I POST with a different Content-Type? + 3.12 Why do FTP specific features over HTTP proxy fail? + 3.13 Why does my single/double quotes fail? + 3.14 Does curl support javascript or pac (automated proxy config)? + 3.15 Can I do recursive fetches with curl? + 3.16 What certificates do I need when I use SSL? + 3.17 How do I list the root dir of an FTP server? + 3.18 Can I use curl to send a POST/PUT and not wait for a response? + + 4. Running Problems + 4.1 Problems connecting to SSL servers. + 4.2 Why do I get problems when I use & or % in the URL? + 4.3 How can I use {, }, [ or ] to specify multiple URLs? + 4.4 Why do I get downloaded data even though the web page doesn't exist? + 4.5 Why do I get return code XXX from a HTTP server? + 4.5.1 "400 Bad Request" + 4.5.2 "401 Unauthorized" + 4.5.3 "403 Forbidden" + 4.5.4 "404 Not Found" + 4.5.5 "405 Method Not Allowed" + 4.5.6 "301 Moved Permanently" + 4.6 Can you tell me what error code 142 means? + 4.7 How do I keep user names and passwords secret in Curl command lines? + 4.8 I found a bug! + 4.9 Curl can't authenticate to the server that requires NTLM? + 4.10 My HTTP request using HEAD, PUT or DELETE doesn't work! + 4.11 Why does my HTTP range requests return the full document? + 4.12 Why do I get "certificate verify failed" ? + 4.13 Why is curl -R on Windows one hour off? + 4.14 Redirects work in browser but not with curl! + 4.15 FTPS doesn't work + + 5. libcurl Issues + 5.1 Is libcurl thread-safe? + 5.2 How can I receive all data into a large memory chunk? + 5.3 How do I fetch multiple files with libcurl? + 5.4 Does libcurl do Winsock initing on win32 systems? + 5.5 Does CURLOPT_WRITEDATA and CURLOPT_READDATA work on win32 ? + 5.6 What about Keep-Alive or persistent connections? + 5.7 Link errors when building libcurl on Windows! + 5.8 libcurl.so.3: open failed: No such file or directory + 5.9 How does libcurl resolve host names? + 5.10 How do I prevent libcurl from writing the response to stdout? + 5.11 How do I make libcurl not receive the whole HTTP response? + 5.12 Can I make libcurl fake or hide my real IP address? + 5.13 How do I stop an ongoing transfer? + + 6. License Issues + 6.1 I have a GPL program, can I use the libcurl library? + 6.2 I have a closed-source program, can I use the libcurl library? + 6.3 I have a BSD licensed program, can I use the libcurl library? + 6.4 I have a program that uses LGPL libraries, can I use libcurl? + 6.5 Can I modify curl/libcurl for my program and keep the changes secret? + 6.6 Can you please change the curl/libcurl license to XXXX? + 6.7 What are my obligations when using libcurl in my commerical apps? + + 7. PHP/CURL Issues + 7.1 What is PHP/CURL? + 7.2 Who write PHP/CURL? + 7.3 Can I perform multiple requests using the same handle? + +============================================================================== + +1. Philosophy + + 1.1 What is cURL? + + cURL is the name of the project. The name is a play on 'Client for URLs', + originally with URL spelled in uppercase to make it obvious it deals with + URLs. The fact it can also be pronounced 'see URL' also helped, it works as + an abbreviation for "Client URL Request Library" or why not the recursive + version: "Curl URL Request Library". + + The cURL project produces two products: + + libcurl + + A free and easy-to-use client-side URL transfer library, supporting FTP, + FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, FILE and LDAP. libcurl + supports HTTPS certificates, HTTP POST, HTTP PUT, FTP uploading, kerberos, + HTTP form based upload, proxies, cookies, user+password authentication, + file transfer resume, http proxy tunneling and more! + + libcurl is highly portable, it builds and works identically on numerous + platforms, including Solaris, NetBSD, FreeBSD, OpenBSD, Darwin, HPUX, + IRIX, AIX, Tru64, Linux, UnixWare, HURD, Windows, Amiga, OS/2, BeOs, Mac + OS X, Ultrix, QNX, OpenVMS, RISC OS, Novell NetWare, DOS and more... + + libcurl is free, thread-safe, IPv6 compatible, feature rich, well + supported and fast. + + curl + + A command line tool for getting or sending files using URL syntax. + + Since curl uses libcurl, it supports a range of common Internet protocols, + currently including HTTP, HTTPS, FTP, FTPS, SCP, SFTP, TFTP, LDAP, DICT, + TELNET and FILE. + + We pronounce curl and cURL with an initial k sound: [kurl]. + + There are numerous sub-projects and related projects that also use the word + curl in the project names in various combinations, but you should take + notice that this FAQ is directed at the command-line tool named curl (and + libcurl the library), and may therefore not be valid for other curl-related + projects. (There is however a small section for the PHP/CURL in this FAQ.) + + 1.2 What is libcurl? + + libcurl is a reliable and portable library which provides you with an easy + interface to a range of common Internet protocols. + + You can use libcurl for free in your application, be it open source, + commercial or closed-source. + + libcurl is most probably the most portable, most powerful and most often + used C-based multi-platform file transfer library on this planet - be it + open source or commercial. + + 1.3 What is curl not? + + Curl is not a wget clone. That is a common misconception. Never, during + curl's development, have we intended curl to replace wget or compete on its + market. Curl is targeted at single-shot file transfers. + + Curl is not a web site mirroring program. If you want to use curl to mirror + something: fine, go ahead and write a script that wraps around curl to make + it reality (like curlmirror.pl does). + + Curl is not an FTP site mirroring program. Sure, get and send FTP with curl + but if you want systematic and sequential behavior you should write a + script (or write a new program that interfaces libcurl) and do it. + + Curl is not a PHP tool, even though it works perfectly well when used from + or with PHP (when using the PHP/CURL module). + + Curl is not a program for a single operating system. Curl exists, compiles, + builds and runs under a wide range of operating systems, including all + modern Unixes (and a bunch of older ones too), Windows, Amiga, BeOS, OS/2, + OS X, QNX etc. + + 1.4 When will you make curl do XXXX ? + + We love suggestions of what to change in order to make curl and libcurl + better. We do however believe in a few rules when it comes to the future of + curl: + + * Curl -- the command line tool -- is to remain a non-graphical command line + tool. If you want GUIs or fancy scripting capabilities, you should look + for another tool that uses libcurl. + + * We do not add things to curl that other small and available tools already + do very fine at the side. Curl's output is fine to pipe into another + program or redirect to another file for the next program to interpret. + + * We focus on protocol related issues and improvements. If you wanna do more + magic with the supported protocols than curl currently does, chances are + big we will agree. If you wanna add more protocols, we may very well + agree. + + * If you want someone else to make all the work while you wait for us to + implement it for you, that is not a very friendly attitude. We spend a + considerable time already on maintaining and developing curl. In order to + get more out of us, you should consider trading in some of your time and + efforts in return. + + * If you write the code, chances are bigger that it will get into curl + faster. + + 1.5 Who makes curl? + + curl and libcurl are not made by any single individual. Daniel Stenberg is + project leader and main developer, but other persons' submissions are + important and crucial. Anyone can contribute and post their changes and + improvements and have them inserted in the main sources (of course on the + condition that developers agree on that the fixes are good). + + The full list of all contributors is found in the docs/THANKS file. + + curl is developed by a community, with Daniel at the wheel. + + 1.6 What do you get for making curl? + + Project cURL is entirely free and open. No person gets paid for developing + (lib)curl. We do this voluntarily on our spare time. + + We get some help from companies. Contactor Data hosts the curl web site, + Haxx owns the curl web site's domain and sourceforge.net hosts project + services we take advantage from, like the bug tracker. Also, some companies + have sponsored certain parts of the development in the past and I hope some + will continue to do so in the future. + + If you want to support our project, consider a donation or a banner-program + or even better: by helping us coding, documenting, testing etc. + + 1.7 What about CURL from curl.com? + + During the summer 2001, curl.com was busy advertising their client-side + programming language for the web, named CURL. + + We are in no way associated with curl.com or their CURL programming + language. + + Our project name curl has been in effective use since 1998. We were not the + first computer related project to use the name "curl" and do not claim any + first-hand rights to the name. + + We recognize that we will be living in parallel with curl.com and wish them + every success. + + 1.8 I have a problem who do I mail? + + Please do not mail any single individual unless you really need to. Keep + curl-related questions on a suitable mailing list. All available mailing + lists are listed in the MANUAL document and online at + http://curl.haxx.se/mail/ + + Keeping curl-related questions and discussions on mailing lists allows + others to join in and help, to share their ideas, contribute their + suggestions and spread their wisdom. Keeping discussions on public mailing + lists also allows for others to learn from this (both current and future + users thanks to the web based archives of the mailing lists), thus saving us + from having to repeat ourselves even more. Thanks for respecting this. + + If you have found or simply suspect a security problem in curl or libcurl, + mail curl-security at haxx.se (closed list of receivers, mails are not + disclosed) and tell. Then we can produce a fix in a timely manner before the + flaw is announced to the world, thus lessen the impact the problem will have + on existing users. + + 1.9 Where do I buy commercial support for curl? + + curl is fully open source. It means you can hire any skilled engineer to fix + your curl-related problems. + + We list available alternatives on the curl web site: + http://curl.haxx.se/support.html + + 1.10 How many are using curl? + + It is impossible to tell. + + We don't know how many users that knowingly have installed and use curl. + + We don't know how many users that use curl without knowing that they are in + fact using it. + + We don't know how many users that downloaded or installed curl and then + never use it. + + Some facts to use as input to the math: + + curl packages are downloaded from the curl.haxx.se and mirrors over a + million times per year. curl is installed by default with most Linux + distributions. curl is installed by default with Mac OS X. curl and libcurl + as used by numerous applications that include libcurl binaries in their + distribution packages (like Adobe Acrobat Reader and Google Earth). + + More than 70 known named companies use curl in commercial environments and + products. More than 100 known named open source projects depend on + (lib)curl. + + In a poll on the curl web site mid-2005, more than 50% of the 300+ answers + estimated a user base of one million users or more. + + In March 2005, the "Linux Counter project" estimated a total Linux user base + of some 29 millions, while Netcraft detected some 4 million "active" Linux + based web servers. A guess is that a fair amount of these Linux + installations have curl installed. + + All this taken together, there is no doubt that there are millions of + (lib)curl users. + + http://curl.haxx.se/docs/companies.html + http://curl.haxx.se/docs/programs.html + http://curl.haxx.se/libcurl/using/apps.html + http://counter.li.org/estimates.php + http://news.netcraft.com/archives/2005/03/14/fedora_makes_rapid_progress.html + + +2. Install Related Problems + + 2.1 configure doesn't find OpenSSL even when it is installed + + This may be because of several reasons. + + 2.1.1 native linker doesn't find openssl + + Affected platforms: + Solaris (native cc compiler) + HPUX (native cc compiler) + SGI IRIX (native cc compiler) + SCO UNIX (native cc compiler) + + When configuring curl, I specify --with-ssl. OpenSSL is installed in + /usr/local/ssl Configure reports SSL in /usr/local/ssl, but fails to find + CRYPTO_lock in -lcrypto + + Cause: The cc for this test places the -L/usr/local/ssl/lib AFTER + -lcrypto, so ld can't find the library. This is due to a bug in the GNU + autoconf tool. + + Workaround: Specifying "LDFLAGS=-L/usr/local/ssl/lib" in front of + ./configure places the -L/usr/local/ssl/lib early enough in the command + line to make things work + + 2.1.2 only the libssl lib is missing + + If all include files and the libcrypto lib is present, with only the + libssl being missing according to configure, this is mostly likely because + a few functions are left out from the libssl. + + If the function names missing include RSA or RSAREF you can be certain + that this is because libssl requires the RSA and RSAREF libs to build. + + See the INSTALL file section that explains how to add those libs to + configure. Make sure that you remove the config.cache file before you + rerun configure with the new flags. + + 2.2 Does curl work/build with other SSL libraries? + + Curl has been written to use OpenSSL, GnuTLS, yassl or NSS, although there + should not be many problems using a different library. If anyone does "port" + curl to use a different SSL library, we are of course very interested in + getting the patch! + + 2.3 Where can I find a copy of LIBEAY32.DLL? + + That is an OpenSSL binary built for Windows. + + Curl uses OpenSSL to do the SSL stuff. The LIBEAY32.DLL is what curl needs + on a windows machine to do https://. Check out the curl web site to find + accurate and up-to-date pointers to recent OpenSSL DLLs and other binary + packages. + + 2.4 Does curl support Socks (RFC 1928) ? + + Yes, SOCKS 4 and 5 are supported. + + +3. Usage problems + + 3.1 curl: (1) SSL is disabled, https: not supported + + If you get this output when trying to get anything from a https:// server, + it means that the configure script couldn't find all libs and include files + it requires for SSL to work. If the configure script fails to find them, + curl is simply built without SSL support. + + To get the https:// support into a curl that was previously built but that + reports that https:// is not supported, you should dig through the document + and logs and check out why the configure script doesn't find the SSL libs + and/or include files. + + Also, check out the other paragraph in this FAQ labeled "configure doesn't + find OpenSSL even when it is installed". + + 3.2 How do I tell curl to resume a transfer? + + Curl supports resumed transfers both ways on both FTP and HTTP. + + Try the -C option. + + 3.3 Why doesn't my posting using -F work? + + You can't simply use -F or -d at your choice. The web server that will + receive your post assumes one of the formats. If the form you're trying to + "fake" sets the type to 'multipart/form-data', then and only then you must + use the -F type. In all the most common cases, you should use -d which then + causes a posting with the type 'application/x-www-form-urlencoded'. + + This is described in some detail in the MANUAL and TheArtOfHttpScripting + documents, and if you don't understand it the first time, read it again + before you post questions about this to the mailing list. Also, try reading + through the mailing list archives for old postings and questions regarding + this. + + 3.4 How do I tell curl to run custom FTP commands? + + You can tell curl to perform optional commands both before and/or after a + file transfer. Study the -Q/--quote option. + + Since curl is used for file transfers, you don't use curl to just perform + FTP commands without transferring anything. Therefore you must always specify + a URL to transfer to/from even when doing custom FTP commands. + + 3.5 How can I disable the Pragma: nocache header? + + You can change all internally generated headers by adding a replacement with + the -H/--header option. By adding a header with empty contents you safely + disable that one. Use -H "Pragma:" to disable that specific header. + + 3.6 Does curl support ASP, XML, XHTML or HTML version Y? + + To curl, all contents are alike. It doesn't matter how the page was + generated. It may be ASP, PHP, Perl, shell-script, SSI or plain + HTML-files. There's no difference to curl and it doesn't even know what kind + of language that generated the page. + + See also item 3.14 regarding javascript. + + 3.7 Can I use curl to delete/rename a file through FTP? + + Yes. You specify custom FTP commands with -Q/--quote. + + One example would be to delete a file after you have downloaded it: + + curl -O ftp://download.com/coolfile -Q '-DELE coolfile' + + or rename a file after upload: + + curl -T infile ftp://upload.com/dir/ -Q "-RNFR infile" -Q "-RNTO newname" + + 3.8 How do I tell curl to follow HTTP redirects? + + Curl does not follow so-called redirects by default. The Location: header + that informs the client about this is only interpreted if you're using the + -L/--location option. As in: + + curl -L http://redirector.com + + Not all redirects are HTTP ones, see 4.14 + + 3.9 How do I use curl in my favorite programming language? + + There exist many language interfaces/bindings for curl that integrates it + better with various languages. If you are fluid in a script language, you + may very well opt to use such an interface instead of using the command line + tool. + + Find out more about which languages that support curl directly, and how to + install and use them, in the libcurl section of the curl web site: + http://curl.haxx.se/libcurl/ + + In February 2007, there are interfaces available for the following + languages: Ada95, Basic, C, C++, Ch, Cocoa, D, Dylan, Euphoria, Ferite, + Gambas, glib/GTK+, Java, Lisp, Lua, Mono, .NET, Object-Pascal, O'Caml, + Pascal, Perl, PHP, PostgreSQL, Python, R, Rexx, Ruby, Scheme, S-Lang, + Smalltalk, SPL, Tcl, Visual Basic, Q, wxwidgets and XBLite. By the time you + read this, additional ones may have appeared! + + 3.10 What about SOAP, WebDAV, XML-RPC or similar protocols over HTTP? + + Curl adheres to the HTTP spec, which basically means you can play with *any* + protocol that is built on top of HTTP. Protocols such as SOAP, WEBDAV and + XML-RPC are all such ones. You can use -X to set custom requests and -H to + set custom headers (or replace internally generated ones). + + Using libcurl is of course just as fine and you'd just use the proper + library options to do the same. + + 3.11 How do I POST with a different Content-Type? + + You can always replace the internally generated headers with -H/--header. + To make a simple HTTP POST with text/xml as content-type, do something like: + + curl -d "datatopost" -H "Content-Type: text/xml" [URL] + + 3.12 Why do FTP specific features over HTTP proxy fail? + + Because when you use a HTTP proxy, the protocol spoken on the network will + be HTTP, even if you specify a FTP URL. This effectively means that you + normally can't use FTP specific features such as FTP upload and FTP quote + etc. + + There is one exception to this rule, and that is if you can "tunnel through" + the given HTTP proxy. Proxy tunneling is enabled with a special option (-p) + and is generally not available as proxy admins usually disable tunneling to + other ports than 443 (which is used for HTTPS access through proxies). + + 3.13 Why does my single/double quotes fail? + + To specify a command line option that includes spaces, you might need to + put the entire option within quotes. Like in: + + curl -d " with spaces " url.com + + or perhaps + + curl -d ' with spaces ' url.com + + Exactly what kind of quotes and how to do this is entirely up to the shell + or command line interpreter that you are using. For most unix shells, you + can more or less pick either single (') or double (") quotes. For + Windows/DOS prompts I believe you're forced to use double (") quotes. + + Please study the documentation for your particular environment. Examples in + the curl docs will use a mix of both these ones as shown above. You must + adjust them to work in your environment. + + Remember that curl works and runs on more operating systems than most single + individuals have ever tried. + + 3.14 Does curl support javascript or pac (automated proxy config)? + + Many web pages do magic stuff using embedded javascript. Curl and libcurl + have no built-in support for that, so it will be treated just like any other + contents. + + .pac files are a netscape invention and are sometimes used by organizations + to allow them to differentiate which proxies to use. The .pac contents is + just a javascript program that gets invoked by the browser and that returns + the name of the proxy to connect to. Since curl doesn't support javascript, + it can't support .pac proxy configuration either. + + Some work-arounds usually suggested to overcome this javascript dependency: + + - Depending on the javascript complexity, write up a script that + translates it to another language and execute that. + + - Read the javascript code and rewrite the same logic in another language. + + - Implement a javascript interpreter, people have successfully used the + Mozilla javascript engine in the past. + + - Ask your admins to stop this, for a static proxy setup or similar. + + 3.15 Can I do recursive fetches with curl? + + No. curl itself has no code that performs recursive operations, such as + those performed by wget and similar tools. + + There exist wrapper scripts with that functionality (for example the + curlmirror perl script), and you can write programs based on libcurl to do + it, but the command line tool curl itself cannot. + + 3.16 What certificates do I need when I use SSL? + + There are three different kinds of "certificates" to keep track of when we + talk about using SSL-based protocols (HTTPS or FTPS) using curl or libcurl. + + - Client certificate. The server you communicate may require that you can + provide this in order to prove that you actually are who you claim to be. + If the server doesn't require this, you don't need a client certificate. + + - Server certificate. The server you communicate with has a server + certificate. You can and should verify this certificate to make sure that + you are truly talking to the real server and not a server impersonating + it. + + - Certificate Authority certificate ("CA cert"). You often have several CA + certs in a CA cert bundle that can be used to verify a server certificate + that was signed by one of the authorities in the bundle. curl comes with a + default CA cert bundle. You can override the default. + + The server certificate verification process is made by using a Certificate + Authority certificate ("CA cert") that was used to sign the server + certificate. Server certificate verification is enabled by default in curl + and libcurl and is often the reason for problems as explained in FAQ entry + 4.12 and the SSLCERTS document + (http://curl.haxx.se/docs/sslcerts.html). Server certificates that are + "self-signed" or otherwise signed by a CA that you do not have a CA cert + for, cannot be verified. If the verification during a connect fails, you + are refused access. You then need to explicitly disable the verification + to connect to the server. + + 3.17 How do I list the root dir of an FTP server? + + There are two ways. The way defined in the RFC is to use an encoded slash + in the first path part. List the "/tmp" dir like this: + + curl ftp://ftp.sunet.se/%2ftmp/ + + or the not-quite-kosher-but-more-readable way, by simply starting the path + section of the URL with a slash: + + curl ftp://ftp.sunet.se//tmp/ + + 3.18 Can I use curl to send a POST/PUT and not wait for a response? + + No. + + But you could easily write your own program using libcurl to do such stunts. + + +4. Running Problems + + 4.1 Problems connecting to SSL servers. + + It took a very long time before we could sort out why curl had problems to + connect to certain SSL servers when using SSLeay or OpenSSL v0.9+. The + error sometimes showed up similar to: + + 16570:error:1407D071:SSL routines:SSL2_READ:bad mac decode:s2_pkt.c:233: + + It turned out to be because many older SSL servers don't deal with SSLv3 + requests properly. To correct this problem, tell curl to select SSLv2 from + the command line (-2/--sslv2). + + There have also been examples where the remote server didn't like the SSLv2 + request and instead you had to force curl to use SSLv3 with -3/--sslv3. + + 4.2 Why do I get problems when I use & or % in the URL? + + In general unix shells, the & letter is treated special and when used, it + runs the specified command in the background. To safely send the & as a part + of a URL, you should quote the entire URL by using single (') or double (") + quotes around it. + + An example that would invoke a remote CGI that uses &-letters could be: + + curl 'http://www.altavista.com/cgi-bin/query?text=yes&q=curl' + + In Windows, the standard DOS shell treats the %-letter specially and you + need to use TWO %-letters for each single one you want to use in the URL. + + Also note that if you want the literal %-letter to be part of the data you + pass in a POST using -d/--data you must encode it as '%25' (which then also + needs the %-letter doubled on Windows machines). + + 4.3 How can I use {, }, [ or ] to specify multiple URLs? + + Because those letters have a special meaning to the shell, and to be used in + a URL specified to curl you must quote them. + + An example that downloads two URLs (sequentially) would do: + + curl '{curl,www}.haxx.se' + + To be able to use those letters as actual parts of the URL (without using + them for the curl URL "globbing" system), use the -g/--globoff option: + + curl -g 'www.site.com/weirdname[].html' + + 4.4 Why do I get downloaded data even though the web page doesn't exist? + + Curl asks remote servers for the page you specify. If the page doesn't exist + at the server, the HTTP protocol defines how the server should respond and + that means that headers and a "page" will be returned. That's simply how + HTTP works. + + By using the --fail option you can tell curl explicitly to not get any data + if the HTTP return code doesn't say success. + + 4.5 Why do I get return code XXX from a HTTP server? + + RFC2616 clearly explains the return codes. This is a short transcript. Go + read the RFC for exact details: + + 4.5.1 "400 Bad Request" + + The request could not be understood by the server due to malformed + syntax. The client SHOULD NOT repeat the request without modifications. + + 4.5.2 "401 Unauthorized" + + The request requires user authentication. + + 4.5.3 "403 Forbidden" + + The server understood the request, but is refusing to fulfill it. + Authorization will not help and the request SHOULD NOT be repeated. + + 4.5.4 "404 Not Found" + + The server has not found anything matching the Request-URI. No indication + is given of whether the condition is temporary or permanent. + + 4.5.5 "405 Method Not Allowed" + + The method specified in the Request-Line is not allowed for the resource + identified by the Request-URI. The response MUST include an Allow header + containing a list of valid methods for the requested resource. + + 4.5.6 "301 Moved Permanently" + + If you get this return code and an HTML output similar to this: + +

    Moved Permanently

    The document has moved
    here. + + it might be because you request a directory URL but without the trailing + slash. Try the same operation again _with_ the trailing URL, or use the + -L/--location option to follow the redirection. + + 4.6 Can you tell me what error code 142 means? + + All curl error codes are described at the end of the man page, in the + section called "EXIT CODES". + + Error codes that are larger than the highest documented error code means + that curl has exited due to a crash. This is a serious error, and we + appreciate a detailed bug report from you that describes how we could go + ahead and repeat this! + + 4.7 How do I keep user names and passwords secret in Curl command lines? + + This problem has two sides: + + The first part is to avoid having clear-text passwords in the command line + so that they don't appear in 'ps' outputs and similar. That is easily + avoided by using the "-K" option to tell curl to read parameters from a file + or stdin to which you can pass the secret info. curl itself will also + attempt to "hide" the given password by blanking out the option - this + doesn't work on all platforms. + + To keep the passwords in your account secret from the rest of the world is + not a task that curl addresses. You could of course encrypt them somehow to + at least hide them from being read by human eyes, but that is not what + anyone would call security. + + Also note that regular HTTP (using Basic authentication) and FTP passwords + are sent in clear across the network. All it takes for anyone to fetch them + is to listen on the network. Eavesdropping is very easy. Use more secure + authentication methods (like Digest, Negotiate or even NTLM) or consider the + SSL-based alternatives HTTPS and FTPS. + + 4.8 I found a bug! + + It is not a bug if the behavior is documented. Read the docs first. + Especially check out the KNOWN_BUGS file, it may be a documented bug! + + If it is a problem with a binary you've downloaded or a package for your + particular platform, try contacting the person who built the package/archive + you have. + + If there is a bug, read the BUGS document first. Then report it as described + in there. + + 4.9 Curl can't authenticate to the server that requires NTLM? + + This is supported in curl 7.10.6 or later. No earlier curl version knows + of this magic. Later versions require the OpenSSL or Microsoft Windows + libraries to provide this functionality. Using GnuTLS or NSS libraries will + not provide NTLM authentication functionality in curl. + + NTLM is a Microsoft proprietary protocol. Proprietary formats are evil. You + should not use such ones. + + 4.10 My HTTP request using HEAD, PUT or DELETE doesn't work! + + Many web servers allow or demand that the administrator configures the + server properly for these requests to work on the web server. + + Some servers seem to support HEAD only on certain kinds of URLs. + + To fully grasp this, try the documentation for the particular server + software you're trying to interact with. This is not anything curl can do + anything about. + + 4.11 Why does my HTTP range requests return the full document? + + Because the range may not be supported by the server, or the server may + choose to ignore it and return the full document anyway. + + 4.12 Why do I get "certificate verify failed" ? + + You invoke curl 7.10 or later to communicate on a https:// URL and get an + error back looking something similar to this: + + curl: (35) SSL: error:14090086:SSL routines: + SSL3_GET_SERVER_CERTIFICATE:certificate verify failed + + Then it means that curl couldn't verify that the server's certificate was + good. Curl verifies the certificate using the CA cert bundle that comes with + the curl installation. + + To disable the verification (which makes it act like curl did before 7.10), + use -k. This does however enable man-in-the-middle attacks. + + If you get this failure but are having a CA cert bundle installed and used, + the server's certificate is not signed by one of the CA's in the bundle. It + might for example be self-signed. You then correct this problem by obtaining + a valid CA cert for the server. Or again, decrease the security by disabling + this check. + + Details are also in the SSLCERTS file in the release archives, found online + here: http://curl.haxx.se/docs/sslcerts.html + + 4.13 Why is curl -R on Windows one hour off? + + During daylight savings time, when -R is used, curl will set a time that + appears one hour off. This happens due to a flaw in how Windows stores and + uses file modification times and it is not easily worked around. For details + on this problem, read this: http://www.codeproject.com/datetime/dstbugs.asp + + 4.14 Redirects work in browser but not with curl! + + curl supports HTTP redirects fine (see item 3.8). Browsers generally support + at least two other ways to perform directs that curl does not: + + - Meta tags. You can write a HTML tag that will cause the browser to + redirect to another given URL after a certain time. + + - Javascript. You can write a javascript program embeded in a HTML page + that redirects the browser to another given URL. + + There is no way to make curl follow these redirects. You must either + manually figure out what the page is set to do, or you write a script that + parses the results and fetches the new URL. + + 4.15 FTPS doesn't work + + curl supports FTPS (sometimes known as FTP-SSL) both implicit and explicit + mode. + + When a URL is used that starts with FTPS://, curl assumes implicit SSL on + the control connection and will therefore immediately connect and try to + speak SSL. FTPS:// connections default to port 990. + + To use explicit FTPS, you use a FTP:// URL and the --ftp-ssl option (or one + of its related flavours). This is the most common method, and the one + mandated by RFC4217. This kind of connection then of course uses the + standard FTP port 21 by default. + + +5. libcurl Issues + + 5.1 Is libcurl thread-safe? + + Yes. + + We have written the libcurl code specifically adjusted for multi-threaded + programs. libcurl will use thread-safe functions instead of non-safe ones if + your system has such. + + If you use a OpenSSL-powered libcurl in a multi-threaded environment, you + need to provide one or two locking functions: + + http://www.openssl.org/docs/crypto/threads.html#DESCRIPTION + + If you use a GnuTLS-powered libcurl in a multi-threaded environment, you + need to provide locking function(s) for libgcrypt (which is used by GnuTLS + for the crypto functions). + + http://www.gnu.org/software/gnutls/manual/html_node/Multi_002dthreaded-applications.html + + No special locking is needed with a NSS-powered libcurl. NSS is thread-safe. + + 5.2 How can I receive all data into a large memory chunk? + + [ See also the examples/getinmemory.c source ] + + You are in full control of the callback function that gets called every time + there is data received from the remote server. You can make that callback do + whatever you want. You do not have to write the received data to a file. + + One solution to this problem could be to have a pointer to a struct that you + pass to the callback function. You set the pointer using the + CURLOPT_WRITEDATA option. Then that pointer will be passed to the callback + instead of a FILE * to a file: + + /* imaginary struct */ + struct MemoryStruct { + char *memory; + size_t size; + }; + + /* imaginary callback function */ + size_t + WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data) + { + size_t realsize = size * nmemb; + struct MemoryStruct *mem = (struct MemoryStruct *)data; + + mem->memory = (char *)realloc(mem->memory, mem->size + realsize + 1); + if (mem->memory) { + memcpy(&(mem->memory[mem->size]), ptr, realsize); + mem->size += realsize; + mem->memory[mem->size] = 0; + } + return realsize; + } + + 5.3 How do I fetch multiple files with libcurl? + + libcurl has excellent support for transferring multiple files. You should + just repeatedly set new URLs with curl_easy_setopt() and then transfer it + with curl_easy_perform(). The handle you get from curl_easy_init() is not + only reusable, but you're even encouraged to reuse it if you can, as that + will enable libcurl to use persistent connections. + + 5.4 Does libcurl do Winsock initialization on win32 systems? + + Yes, if told to in the curl_global_init() call. + + 5.5 Does CURLOPT_WRITEDATA and CURLOPT_READDATA work on win32 ? + + Yes, but you cannot open a FILE * and pass the pointer to a DLL and have + that DLL use the FILE * (as the DLL and the client application cannot access + each others' variable memory areas). If you set CURLOPT_WRITEDATA you must + also use CURLOPT_WRITEFUNCTION as well to set a function that writes the + file, even if that simply writes the data to the specified FILE *. + Similarly, if you use CURLOPT_READDATA you must also specify + CURLOPT_READFUNCTION. + + 5.6 What about Keep-Alive or persistent connections? + + curl and libcurl have excellent support for persistent connections when + transferring several files from the same server. Curl will attempt to reuse + connections for all URLs specified on the same command line/config file, and + libcurl will reuse connections for all transfers that are made using the + same libcurl handle. + + 5.7 Link errors when building libcurl on Windows! + + You need to make sure that your project, and all the libraries (both static + and dynamic) that it links against, are compiled/linked against the same run + time library. + + This is determined by the /MD, /ML, /MT (and their corresponding /M?d) + options to the command line compiler. /MD (linking against MSVCRT dll) seems + to be the most commonly used option. + + When building an application that uses the static libcurl library, you must + add -DCURL_STATICLIB to your CFLAGS. Otherwise the linker will look for + dynamic import symbols. If you get linker error like "unknown symbol + __imp__curl_easy_init ..." you have linked against the wrong (static) + library. If you want to use the libcurl.dll and import lib, you don't need + any extra CFLAGS, but use one of the import libraries below. These are the + libraries produced by the various lib/Makefile.* files: + + Target: static lib. import lib for libcurl*.dll. + ----------------------------------------------------------- + MingW: libcurl.a libcurldll.a + MSVC (release): libcurl.lib libcurl_imp.lib + MSVC (debug): libcurld.lib libcurld_imp.lib + Borland: libcurl.lib libcurl_imp.lib + + + 5.8 libcurl.so.3: open failed: No such file or directory + + This is an error message you might get when you try to run a program linked + with a shared version of libcurl and your run-time linker (ld.so) couldn't + find the shared library named libcurl.so.3. + + You need to make sure that ld.so finds libcurl.so.3. You can do that + multiple ways, and it differs somewhat between different operating systems, + but they are usually: + + * Add an option to the linker command line that specify the hard-coded path + the run-time linker should check for the lib (usually -R) + + * Set an environment variable (LD_LIBRARY_PATH for example) where ld.so + should check for libs + + * Adjust the system's config to check for libs in the directory where you've + put the dir (like Linux's /etc/ld.so.conf) + + 'man ld.so' and 'man ld' will tell you more details + + 5.9 How does libcurl resolve host names? + + libcurl supports a large a number of different name resolve functions. One + of them is picked at build-time and will be used unconditionally. Thus, if + you want to change name resolver function you must rebuild libcurl and tell + it to use a different function. + + - The non-ipv6 resolver that can use one out of four host name resolve calls + (depending on what your system supports): + + A - gethostbyname() + B - gethostbyname_r() with 3 arguments + C - gethostbyname_r() with 5 arguments + D - gethostbyname_r() with 6 arguments + + - The ipv6-resolver that uses getaddrinfo() + + - The c-ares based name resolver that uses the c-ares library for resolves. + Using this offers asynchronous name resolves but it currently has no IPv6 + support. + + - The Windows threaded resolver. It use: + + A - gethostbyname() on plain ipv4 windows hosts + B - getaddrinfo() on ipv6-enabled windows hosts + + Also note that libcurl never resolves or reverse-lookups addresses given as + pure numbers, such as 127.0.0.1 or ::1. + + 5.10 How do I prevent libcurl from writing the response to stdout? + + libcurl provides a default built-in write function that writes received data + to stdout. Set the CURLOPT_WRITEFUNCTION to receive the data, or possibly + set CURLOPT_WRITEDATA to a different FILE * handle. + + 5.11 How do I make libcurl not receive the whole HTTP response? + + You make the write callback (or progress callback) return an error and + libcurl will then abort the transfer. + + 5.12 Can I make libcurl fake or hide my real IP address? + + No. libcurl operates on a higher level than so. Besides, faking IP address + would imply sending IP packages with a made-up source address, and then you + normally get a problem with intercepting the packages sent back as they + would then not be routed to you! + + If you use a proxy to access remote sites, the sites will not see your local + IP address but instead the address of the proxy. + + Also note that on many networks NATs or other IP-munging techniques are used + that makes you see and use a different IP address locally than what the + remote server will see you coming from. + + 5.13 How do I stop an ongoing transfer? + + There are several ways, but none of them are instant. There is no function + you can call from another thread or similar that will stop it immediately. + Instead you need to make sure that one of the callbacks you use return an + appropriate value that will stop the transfer. + + Suitable callbacks that you can do this with include the progress callback, + the read callback and the write callback. + + If you're using the multi interface, you also stop a transfer by removing + the particular easy handle from the multi stack. + +6. License Issues + + Curl and libcurl are released under a MIT/X derivate license. The license is + very liberal and should not impose a problem for your project. This section + is just a brief summary for the cases we get the most questions. (Parts of + this section was much enhanced by Bjorn Reese.) + + We are not lawyers and this is not legal advice. You should probably consult + one if you want true and accurate legal insights without our prejudice. + + 6.1 I have a GPL program, can I use the libcurl library? + + Yes! + + Since libcurl may be distributed under the MIT/X derivate license, it can be + used together with GPL in any software. + + 6.2 I have a closed-source program, can I use the libcurl library? + + Yes! + + libcurl does not put any restrictions on the program that uses the library. + + 6.3 I have a BSD licensed program, can I use the libcurl library? + + Yes! + + libcurl does not put any restrictions on the program that uses the library. + + 6.4 I have a program that uses LGPL libraries, can I use libcurl? + + Yes! + + The LGPL license doesn't clash with other licenses. + + 6.5 Can I modify curl/libcurl for my program and keep the changes secret? + + Yes! + + The MIT/X derivate license practically allows you to do almost anything with + the sources, on the condition that the copyright texts in the sources are + left intact. + + 6.6 Can you please change the curl/libcurl license to XXXX? + + No. + + We have carefully picked this license after years of development and + discussions and a large amount of people have contributed with source code + knowing that this is the license we use. This license puts the restrictions + we want on curl/libcurl and it does not spread to other programs or + libraries that use it. It should be possible for everyone to use libcurl or + curl in their projects, no matter what license they already have in use. + + 6.7 What are my obligations when using libcurl in my commerical apps? + + Next to none. All you need to adhere to is the MIT-style license (stated in + the COPYING file) which basically says you have to include the copyright + notice in "all copies" and that you may not use the copyright holder's name + when promoting your software. + + You do not have to release any of your source code. + + You do not have to reveal or make public any changes to the libcurl source + code. + + You do not have to reveal or make public that you are using libcurl within + your app. + + As can be seen here: http://curl.haxx.se/docs/companies.html and + elsewhere, more and more companies are dicovering the power + of libcurl and take advantage of it even in commercial environments. + + +7. PHP/CURL Issues + + 7.1 What is PHP/CURL? + + The module for PHP that makes it possible for PHP programs to access curl- + functions from within PHP. + + In the cURL project we call this module PHP/CURL to differentiate it from + curl the command line tool and libcurl the library. The PHP team however + does not refer to it like this (for unknown reasons). They call it plain + CURL (often using all caps) or sometimes ext/curl, but both cause much + confusion to users which in turn gives us a higher question load. + + 7.2 Who write PHP/CURL? + + PHP/CURL is a module that comes with the regular PHP package. It depends and + uses libcurl, so you need to have libcurl installed properly first before + PHP/CURL can be used. PHP/CURL was initially written by Sterling Hughes. + + 7.3 Can I perform multiple requests using the same handle? + + Yes - at least in PHP version 4.3.8 and later (this has been known to not + work in earlier versions, but the exact version when it started to work is + unknown to me). + + After a transfer, you just set new options in the handle and make another + transfer. This will make libcurl to re-use the same connection if it can. diff --git a/vendors/libcurl/docs/FEATURES b/vendors/libcurl/docs/FEATURES new file mode 100644 index 0000000..08f342c --- /dev/null +++ b/vendors/libcurl/docs/FEATURES @@ -0,0 +1,135 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + +FEATURES + +curl tool + - config file support + - multiple URLs in a single command line + - range "globbing" support: [0-13], {one,two,three} + - multiple file upload on a single command line + - custom maximum transfer rate + - redirectable stderr + +libcurl supports + - full URL syntax with no length limit + - custom maximum download time + - custom least download speed acceptable + - custom output result after completion + - guesses protocol from host name unless specified + - uses .netrc + - progress bar/time specs while downloading + - "standard" proxy environment variables support + - compiles on win32 (reported builds on 40+ operating systems) + - selectable network interface for outgoing traffic + - IPv6 support on unix and Windows + - persistant connections + - socks5 support + - supports user name + password in proxy environment variables + - operations through proxy "tunnel" (using CONNECT) + - supports large files (>2GB and >4GB) both upload/download + - replacable memory functions (malloc, free, realloc, etc) + - asynchronous name resolving (*6) + - both a push and a pull style interface + +HTTP + - HTTP/1.1 compliant (optionally uses 1.0) + - GET + - PUT + - HEAD + - POST + - Pipelining + - multipart formpost (RFC1867-style) + - authentication: Basic, Digest, NTLM(*1), GSS-Negotiate/Negotiate(*3) and + SPNEGO (*4) to server and proxy + - resume (both GET and PUT) + - follow redirects + - maximum amount of redirects to follow + - custom HTTP request + - cookie get/send fully parsed + - reads/writes the netscape cookie file format + - custom headers (replace/remove internally generated headers) + - custom user-agent string + - custom referer string + - range + - proxy authentication + - time conditions + - via http-proxy + - retrieve file modification date + - Content-Encoding support for deflate and gzip + - "Transfer-Encoding: chunked" support for "uploads" + +HTTPS (*1) + - (all the HTTP features) + - using client certificates + - verify server certificate + - via http-proxy + - select desired encryption + - force usage of a specific SSL version (SSLv2(*7), SSLv3 or TLSv1) + +FTP + - download + - authentication + - kerberos4 (*5), kerberos5 (*3) + - active/passive using PORT, EPRT, PASV or EPSV + - single file size information (compare to HTTP HEAD) + - 'type=' URL support + - dir listing + - dir listing names-only + - upload + - upload append + - upload via http-proxy as HTTP PUT + - download resume + - upload resume + - custom ftp commands (before and/or after the transfer) + - simple "range" support + - via http-proxy + - all operations can be tunneled through a http-proxy + - customizable to retrieve file modification date + - no dir depth limit + +FTPS (*1) + - implicit ftps:// support that use SSL on both connections + - explicit "AUTH TSL" and "AUTH SSL" usage to "upgrade" plain ftp:// + connection to use SSL for both or one of the connections + +SCP (*8) + - both password and public key auth + +SFTP (*8) + - both password and public key auth + - with custom commands sent before/after the transfer + +TFTP + - download / upload + +TELNET + - connection negotiation + - custom telnet options + - stdin/stdout I/O + +LDAP (*2) + - full LDAP URL support + +DICT + - extended DICT URL support + +FILE + - URL support + - "uploads" + - resume + +FOOTNOTES +========= + + *1 = requires OpenSSL, GnuTLS, NSS or yassl + *2 = requires OpenLDAP + *3 = requires a GSSAPI-compliant library, such as Heimdal or similar. + *4 = requires FBopenssl + *5 = requires a krb4 library, such as the MIT one or similar. + *6 = requires c-ares + *7 = requires OpenSSL or NSS, as GnuTLS only supports SSLv3 and TLSv1 + *8 = requires libssh2 diff --git a/vendors/libcurl/docs/HISTORY b/vendors/libcurl/docs/HISTORY new file mode 100644 index 0000000..00d5d6b --- /dev/null +++ b/vendors/libcurl/docs/HISTORY @@ -0,0 +1,153 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + + How cURL Became Like This + + +In the second half of 1997, Daniel Stenberg came up with the idea to make +currency-exchange calculations available to Internet Relay Chat (IRC) +users. All the necessary data are published on the Web; he just needed to +automate their retrieval. + +Daniel simply adopted an existing command-line open-source tool, httpget, that +Brazilian Rafael Sagula had written. After a few minor adjustments, it did +just what he needed. + +Soon, he found currencies on a GOPHER site, so support for that had to go in, +and not before long FTP download support was added as well. The name of the +project was changed to urlget to better fit what it actually did now, since +the http-only days were already passed. + +The project slowly grew bigger. When upload capabilities were added and the +name once again was misleading, a second name change was made and on March 20, +1998 curl 4 was released. (The version numbering from the previous names was +kept.) + +(Unrelated to this project a company called Curl Corporation registered a US +trademark on the name "CURL" on May 18 1998. That company had then already +registered the curl.com domain back in November of the previous year. All this +was revealed to us much later.) + +SSL support was added, powered by the SSLeay library. + +August 1998, first announcement of curl on freshmeat.net. + +October 1998, with the curl 4.9 release and the introduction of cookie +support, curl was no longer released under the GPL license. Now we're at 4000 +lines of code, we switched over to the MPL license to restrict the effects of +"copyleft". + +November 1998, configure script and reported successful compiles on several +major operating systems. The never-quite-understood -F option was added and +curl could now simulate quite a lot of a browser. TELNET support was added. + +Curl 5 was released in December 1998 and introduced the first ever curl man +page. People started making Linux RPM packages out of it. + +January 1999, DICT support added. + +OpenSSL took over where SSLeay was abandoned. + +May 1999, first Debian package. + +August 1999, LDAP:// and FILE:// support added. The curl web site gets 1300 +visits weekly. + +Released curl 6.0 in September. 15000 lines of code. + +December 28 1999, added the project on Sourceforge and started using its +services for managing the project. + +Spring 2000, major internal overhaul to provide a suitable library interface. +The first non-beta release was named 7.1 and arrived in August. This offered +the easy interface and turned out to be the beginning of actually getting +other software and programs to get based on and powered by libcurl. Almost +20000 lines of code. + +August 2000, the curl web site gets 4000 visits weekly. + +The PHP guys adopted libcurl already the same month, when the first ever third +party libcurl binding showed up. CURL has been a supported module in PHP since +the release of PHP 4.0.2. This would soon get followers. More than 16 +different bindings exist at the time of this writing. + +September 2000, kerberos4 support was added. + +In November 2000 started the work on a test suite for curl. It was later +re-written from scratch again. + +January 2001, Daniel released curl 7.5.2 under a new license again: MIT (or +MPL). The MIT license is extremely liberal and can be used combined with GPL +in other projects. This would finally put an end to the "complaints" from +people involved in GPLed projects that previously were prohibited from using +libcurl while it was released under MPL only. (Due to the fact that MPL is +deemed "GPL incompatible".) + +curl supports HTTP 1.1 starting with the release of 7.7, March 22 2001. This +also introduced libcurl's ability to do persistent connections. 24000 lines of +code. + +The first experimental ftps:// support was added in March 2001. + +August 2001. curl is bundled in Mac OS X, 10.1. It was already becoming more +and more of a standard utility of Linux distributions and a regular in the BSD +ports collections. The curl web site gets 8000 visits weekly. Curl Corporation +contacted Daniel to discuss "the name issue". After Daniel's reply, they have +never since got in touch again. + +September 2001, libcurl 7.9 introduces cookie jar and curl_formadd(). During +the forthcoming 7.9.x releases, we introduced the multi interface slowly and +without much whistles. + +June 2002, the curl web site gets 13000 visits weekly. curl and libcurl is +35000 lines of code. Reported successful compiles on more than 40 combinations +of CPUs and operating systems. + +To estimate number of users of the curl tool or libcurl library is next to +impossible. Around 5000 downloaded packages each week from the main site gives +a hint, but the packages are mirrored extensively, bundled with numerous OS +distributions and otherwise retrieved as part of other software. + +September 2002, with the release of curl 7.10 it is released under the MIT +license only. + +January 2003. Started working on the distributed curl tests. The autobuilds. + +February 2003, the curl site averages at 20000 visits weekly. At any given +moment, there's an average of 3 people browsing the curl.haxx.se site. + +Multiple new authentication schemes are supported: Digest (May), NTLM (June) +and Negotiate (June). + +November 2003: curl 7.10.8 is released. 45000 lines of code. ~55000 unique +visitors to the curl.haxx.se site. Five official web mirrors. + +December 2003, full-fledged SSL for FTP is supported. + +January 2004: curl 7.11.0 introduced large file support. + +June 2004: curl 7.12.0 introduced IDN support. 10 official web mirrors. + +August 2004: + Curl and libcurl 7.12.1 + + Public curl release number: 82 + Releases counted from the very beginning: 109 + Available command line options: 96 + Available curl_easy_setopt() options: 120 + Number of public functions in libcurl: 36 + Amount of public web site mirrors: 12 + Number of known libcurl bindings: 26 + +April 2005: + +GnuTLS can now optionally be used for the secure layer when curl is built. + +September 2005: + +TFTP support was added. + +More than 100,000 unique visitors of the curl web site. 25 mirrors. diff --git a/vendors/libcurl/docs/INSTALL b/vendors/libcurl/docs/INSTALL new file mode 100644 index 0000000..c3b18ec --- /dev/null +++ b/vendors/libcurl/docs/INSTALL @@ -0,0 +1,827 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + + How To Compile + +Installing Binary Packages +========================== + + Lots of people download binary distributions of curl and libcurl. This + document does not describe how to install curl or libcurl using such a + binary package. This document describes how to compile, build and install + curl and libcurl from source code. + +UNIX +==== + A normal unix installation is made in three or four steps (after you've + unpacked the source archive): + + ./configure + make + make test (optional) + make install + + You probably need to be root when doing the last command. + + If you have checked out the sources from the CVS repository, read the + CVS-INFO on how to proceed. + + Get a full listing of all available configure options by invoking it like: + + ./configure --help + + If you want to install curl in a different file hierarchy than /usr/local, + you need to specify that already when running configure: + + ./configure --prefix=/path/to/curl/tree + + If you happen to have write permission in that directory, you can do 'make + install' without being root. An example of this would be to make a local + install in your own home directory: + + ./configure --prefix=$HOME + make + make install + + The configure script always tries to find a working SSL library unless + explicitly told not to. If you have OpenSSL installed in the default search + path for your compiler/linker, you don't need to do anything special. If + you have OpenSSL installed in /usr/local/ssl, you can run configure like: + + ./configure --with-ssl + + If you have OpenSSL installed somewhere else (for example, /opt/OpenSSL,) + you can run configure like this: + + ./configure --with-ssl=/opt/OpenSSL + + If you insist on forcing a build without SSL support, even though you may + have OpenSSL installed in your system, you can run configure like this: + + ./configure --without-ssl + + If you have OpenSSL installed, but with the libraries in one place and the + header files somewhere else, you have to set the LDFLAGS and CPPFLAGS + environment variables prior to running configure. Something like this + should work: + + (with the Bourne shell and its clones): + + CPPFLAGS="-I/path/to/ssl/include" LDFLAGS="-L/path/to/ssl/lib" \ + ./configure + + (with csh, tcsh and their clones): + + env CPPFLAGS="-I/path/to/ssl/include" LDFLAGS="-L/path/to/ssl/lib" \ + ./configure + + If you have shared SSL libs installed in a directory where your run-time + linker doesn't find them (which usually causes configure failures), you can + provide the -R option to ld on some operating systems to set a hard-coded + path to the run-time linker: + + LDFLAGS=-R/usr/local/ssl/lib ./configure --with-ssl + + MORE OPTIONS + + To force configure to use the standard cc compiler if both cc and gcc are + present, run configure like + + CC=cc ./configure + or + env CC=cc ./configure + + To force a static library compile, disable the shared library creation + by running configure like: + + ./configure --disable-shared + + To tell the configure script to skip searching for thread-safe functions, + add an option like: + + ./configure --disable-thread + + To build curl with kerberos4 support enabled, curl requires the krb4 libs + and headers installed. You can then use a set of options to tell + configure where those are: + + --with-krb4-includes[=DIR] Specify location of kerberos4 headers + --with-krb4-libs[=DIR] Specify location of kerberos4 libs + --with-krb4[=DIR] where to look for Kerberos4 + + In most cases, /usr/athena is the install prefix and then it works with + + ./configure --with-krb4=/usr/athena + + If you're a curl developer and use gcc, you might want to enable more + debug options with the --enable-debug option. + + curl can be built to use a whole range of libraries to provide various + useful services, and configure will try to auto-detect a decent + default. But if you want to alter it, you can select how to deal with + each individual library. + + To build with GnuTLS support instead of OpenSSL for SSL/TLS, note that + you need to use both --without-ssl and --with-gnutls. + + To build with yassl support instead of OpenSSL or GunTLS, you must build + yassl with its OpenSSL emulation enabled and point to that directory root + with configure --with-ssl. + + To build with NSS support instead of OpenSSL for SSL/TLS, note that + you need to use both --without-ssl and --with-nss. + + To get GSSAPI support, build with --with-gssapi and have the MIT or + Heimdal Kerberos 5 packages installed. + + To get support for SCP and SFTP, build with --with-libssh2 and have + libssh2 0.16 or later installed. + + +Win32 +===== + + Building Windows DLLs and C run-time (CRT) linkage issues + --------------------------------------------------------- + + As a general rule, building a DLL with static CRT linkage is highly + discouraged, and intermixing CRTs in the same app is something to + avoid at any cost. + + Reading and comprehension of Microsoft Knowledge Base articles + KB94248 and KB140584 is a must for any Windows developer. Especially + important is full understanding if you are not going to follow the + advice given above. + + KB94248 - How To Use the C Run-Time + http://support.microsoft.com/kb/94248/en-us + + KB140584 - How to link with the correct C Run-Time (CRT) library + http://support.microsoft.com/kb/140584/en-us + + If your app is misbehaving in some strange way, or it is suffering + from memory corruption, before asking for further help, please try + first to rebuild every single library your app uses as well as your + app using the debug multithreaded dynamic C runtime. + + MingW32 + ------- + + Make sure that MinGW32's bin dir is in the search path, for example: + + set PATH=c:\mingw32\bin;%PATH% + + then run 'mingw32-make mingw32' in the root dir. There are other + make targets available to build libcurl with more features, use: + 'mingw32-make mingw32-zlib' to build with Zlib support; + 'mingw32-make mingw32-ssl-zlib' to build with SSL and Zlib enabled; + 'mingw32-make mingw32-ssh2-ssl-zlib' to build with SSH2, SSL, Zlib; + 'mingw32-make mingw32-ssh2-ssl-sspi-zlib' to build with SSH2, SSL, Zlib + and SSPI support. + + If you have any problems linking libraries or finding header files, be sure + to verify that the provided "Makefile.m32" files use the proper paths, and + adjust as necessary. It is also possible to override these paths with + environment variables, for example: + + set ZLIB_PATH=c:\zlib-1.2.3 + set OPENSSL_PATH=c:\openssl-0.9.8g + set LIBSSH2_PATH=c:\libssh2-0.17 + + ATTENTION: if you want to build with libssh2 support you have to use latest + version 0.17 - previous versions will NOT work with 7.17.0 and later! + Use 'mingw32-make mingw32-ssh2-ssl-zlib' to build with SSH2 and SSL enabled. + + It is now also possible to build with other LDAP SDKs than MS LDAP; + currently it is possible to build with native Win32 OpenLDAP, or with the + Novell CLDAP SDK. If you want to use these you need to set these vars: + + set LDAP_SDK=c:\openldap + set USE_LDAP_OPENLDAP=1 + + or for using the Novell SDK: + + set USE_LDAP_NOVELL=1 + + If you want to enable LDAPS support then set LDAPS=1. + + - optional MingW32-built OpenlDAP SDK available from: + http://www.gknw.net/mirror/openldap/ + - optional recent Novell CLDAP SDK available from: + http://developer.novell.com/ndk/cldap.htm + + + Cygwin + ------ + + Almost identical to the unix installation. Run the configure script in the + curl root with 'sh configure'. Make sure you have the sh executable in + /bin/ or you'll see the configure fail toward the end. + + Run 'make' + + Dev-Cpp + ------- + + See the separate INSTALL.devcpp file for details. + + MSVC from command line + ---------------------- + + Run the 'vcvars32.bat' file to get a proper environment. The + vcvars32.bat file is part of the Microsoft development environment and + you may find it in 'C:\Program Files\Microsoft Visual Studio\vc98\bin' + provided that you installed Visual C/C++ 6 in the default directory. + + Then run 'nmake vc' in curl's root directory. + + If you want to compile with zlib support, you will need to build + zlib (http://www.gzip.org/zlib/) as well. Please read the zlib + documentation on how to compile zlib. Define the ZLIB_PATH environment + variable to the location of zlib.h and zlib.lib, for example: + + set ZLIB_PATH=c:\zlib-1.2.3 + + Then run 'nmake vc-zlib' in curl's root directory. + + If you want to compile with SSL support you need the OpenSSL package. + Please read the OpenSSL documentation on how to compile and install + the OpenSSL libraries. The build process of OpenSSL generates the + libeay32.dll and ssleay32.dll files in the out32dll subdirectory in + the OpenSSL home directory. OpenSSL static libraries (libeay32.lib, + ssleay32.lib, RSAglue.lib) are created in the out32 subdirectory. + + Before running nmake define the OPENSSL_PATH environment variable with + the root/base directory of OpenSSL, for example: + + set OPENSSL_PATH=c:\openssl-0.9.8g + + Then run 'nmake vc-ssl' or 'nmake vc-ssl-dll' in curl's root + directory. 'nmake vc-ssl' will create a libcurl static and dynamic + libraries in the lib subdirectory, as well as a statically linked + version of curl.exe in the src subdirectory. This statically linked + version is a standalone executable not requiring any DLL at + runtime. This make method requires that you have the static OpenSSL + libraries available in OpenSSL's out32 subdirectory. + 'nmake vc-ssl-dll' creates the libcurl dynamic library and + links curl.exe against libcurl and OpenSSL dynamically. + This executable requires libcurl.dll and the OpenSSL DLLs + at runtime. + Run 'nmake vc-ssl-zlib' to build with both ssl and zlib support. + + Borland C++ compiler + --------------------- + + compile openssl + + Make sure you include the paths to curl/include and openssl/inc32 in + your bcc32.cnf file + + eg : -I"c:\Bcc55\include;c:\path_curl\include;c:\path_openssl\inc32" + + Check to make sure that all of the sources listed in lib/Makefile.b32 + are present in the /path_to_curl/lib directory. (Check the src + directory for missing ones.) + + Make sure the environment variable "BCCDIR" is set to the install + location for the compiler eg : c:\Borland\BCC55 + + command line: + make -f /path_to_curl/lib/Makefile-ssl.b32 + + compile simplessl.c with appropriate links + + c:\curl\docs\examples\> bcc32 -L c:\path_to_curl\lib\libcurl.lib + -L c:\borland\bcc55\lib\psdk\ws2_32.lib + -L c:\openssl\out32\libeay32.lib + -L c:\openssl\out32\ssleay32.lib + simplessl.c + + + MSVC IDE + -------- + + If you use VC++, Borland or similar compilers. Include all lib source + files in a static lib "project" (all .c and .h files that is). + (you should name it libcurl or similar) + + Make the sources in the src/ drawer be a "win32 console application" + project. Name it curl. + + For VC++ 6, there's an included Makefile.vc6 that should be possible + to use out-of-the-box. + + + Disabling Specific Protocols in Win32 builds + -------------------------------------------- + + The configure utility, unfortunately, is not available for the Windows + environment, therefore, you cannot use the various disable-protocol + options of the configure utility on this platform. + + However, you can use the following defines to disable specific + protocols: + + HTTP_ONLY disables all protocols except HTTP + CURL_DISABLE_FTP disables FTP + CURL_DISABLE_LDAP disables LDAP + CURL_DISABLE_TELNET disables TELNET + CURL_DISABLE_DICT disables DICT + CURL_DISABLE_FILE disables FILE + CURL_DISABLE_TFTP disables TFTP + + If you want to set any of these defines you have the following + possibilities: + + - Modify lib/setup.h + - Modify lib/Makefile.vc6 + - Add defines to Project/Settings/C/C++/General/Preprocessor Definitions + in the curllib.dsw/curllib.dsp Visual C++ 6 IDE project. + + + Important static libcurl usage note + ----------------------------------- + + When building an application that uses the static libcurl library, you must + add '-DCURL_STATICLIB' to your CFLAGS. Otherwise the linker will look for + dynamic import symbols. + + +IBM OS/2 +======== + Building under OS/2 is not much different from building under unix. + You need: + + - emx 0.9d + - GNU make + - GNU patch + - ksh + - GNU bison + - GNU file utilities + - GNU sed + - autoconf 2.13 + + If you want to build with OpenSSL or OpenLDAP support, you'll need to + download those libraries, too. Dirk Ohme has done some work to port SSL + libraries under OS/2, but it looks like he doesn't care about emx. You'll + find his patches on: http://come.to/Dirk_Ohme + + If during the linking you get an error about _errno being an undefined + symbol referenced from the text segment, you need to add -D__ST_MT_ERRNO__ + in your definitions. + + If everything seems to work fine but there's no curl.exe, you need to add + -Zexe to your linker flags. + + If you're getting huge binaries, probably your makefiles have the -g in + CFLAGS. + + +VMS +=== + (The VMS section is in whole contributed by the friendly Nico Baggus) + + Curl seems to work with FTP & HTTP other protocols are not tested. (the + perl http/ftp testing server supplied as testing too cannot work on VMS + because vms has no concept of fork(). [ I tried to give it a whack, but + thats of no use. + + SSL stuff has not been ported. + + Telnet has about the same issues as for Win32. When the changes for Win32 + are clear maybe they'll work for VMS too. The basic problem is that select + ONLY works for sockets. + + Marked instances of fopen/[f]stat that might become a problem, especially + for non stream files. In this regard, the files opened for writing will be + created stream/lf and will thus be safe. Just keep in mind that non-binary + read/wring from/to files will have a records size limit of 32767 bytes + imposed. + + Stat to get the size of the files is again only safe for stream files & + fixed record files without implied CC. + + -- My guess is that only allowing access to stream files is the quickest + way to get around the most issues. Therefore all files need to to be + checked to be sure they will be stream/lf before processing them. This is + the easiest way out, I know. The reason for this is that code that needs to + report the filesize will become a pain in the ass otherwise. + + Exit status.... Well we needed something done here, + + VMS has a structured exist status: + | 3 | 2 | 1 | 0| + |1098|765432109876|5432109876543|210| + +----+------------+-------------+---+ + |Ctrl| Facility | Error code |sev| + +----+------------+-------------+---+ + + With the Ctrl-bits an application can tell if part or the whole message has + already been printed from the program, DCL doesn't need to print it again. + + Facility - basically the program ID. A code assigned to the program + the name can be fetched from external or internal message libraries + Error code - the err codes assigned by the application + Sev. - severity: Even = error, off = non error + 0 = Warning + 1 = Success + 2 = Error + 3 = Information + 4 = Fatal + <5-7> reserved. + + This all presents itself with: + %--, + + See also the src/curlmsg.msg file, it has the source for the messages In + src/main.c a section is devoted to message status values, the globalvalues + create symbols with certain values, referenced from a compiled message + file. Have all exit function use a exit status derived from a translation + table with the compiled message codes. + + This was all compiled with: + + Compaq C V6.2-003 on OpenVMS Alpha V7.1-1H2 + + So far for porting notes as of: + 13-jul-2001 + N. Baggus + + +QNX +=== + (This section was graciously brought to us by David Bentham) + + As QNX is targeted for resource constrained environments, the QNX headers + set conservative limits. This includes the FD_SETSIZE macro, set by default + to 32. Socket descriptors returned within the CURL library may exceed this, + resulting in memory faults/SIGSEGV crashes when passed into select(..) + calls using fd_set macros. + + A good all-round solution to this is to override the default when building + libcurl, by overriding CFLAGS during configure, example + # configure CFLAGS='-DFD_SETSIZE=64 -g -O2' + + +RISC OS +======= + The library can be cross-compiled using gccsdk as follows: + + CC=riscos-gcc AR=riscos-ar RANLIB='riscos-ar -s' ./configure \ + --host=arm-riscos-aof --without-random --disable-shared + make + + where riscos-gcc and riscos-ar are links to the gccsdk tools. + You can then link your program with curl/lib/.libs/libcurl.a + + +AmigaOS +======= + (This section was graciously brought to us by Diego Casorran) + + To build cURL/libcurl on AmigaOS just type 'make amiga' ... + + What you need is: (not tested with others versions) + + GeekGadgets / gcc 2.95.3 (http://www.geekgadgets.org/) + + AmiTCP SDK v4.3 (http://www.aminet.net/comm/tcp/AmiTCP-SDK-4.3.lha) + + Native Developer Kit (http://www.amiga.com/3.9/download/NDK3.9.lha) + + As no ixemul.library is required you will be able to build it for + WarpOS/PowerPC (not tested by me), as well a MorphOS version should be + possible with no problems. + + To enable SSL support, you need a OpenSSL native version (without ixemul), + you can find a precompiled package at http://amiga.sourceforge.net/OpenSSL/ + + +NetWare +======= + To compile curl.nlm / libcurl.nlm you need: + - either any gcc / nlmconv, or CodeWarrior 7 PDK 4 or later. + - gnu make and awk running on the platform you compile on; + native Win32 versions can be downloaded from: + http://www.gknw.net/development/prgtools/ + - recent Novell LibC SDK available from: + http://developer.novell.com/ndk/libc.htm + - or recent Novell CLib SDK available from: + http://developer.novell.com/ndk/clib.htm + - optional recent Novell CLDAP SDK available from: + http://developer.novell.com/ndk/cldap.htm + - optional zlib sources (static or dynamic linking with zlib.imp); + sources with NetWare Makefile can be obtained from: + http://www.gknw.net/mirror/zlib/ + - optional OpenSSL sources (version 0.9.8 or later build with BSD sockets); + you can find precompiled packages at: + http://www.gknw.net/development/ossl/netware/ + for CLIB-based builds OpenSSL needs to be patched to build with BSD + sockets (currently only a winsock-based CLIB build is supported): + http://www.gknw.net/development/ossl/netware/patches/v_0.9.8g/openssl-0.9.8g.diff + - optional SSH2 sources (version 0.17 or later); + + Set a search path to your compiler, linker and tools; on Linux make + sure that the var OSTYPE contains the string 'linux'; set the var + NDKBASE to point to the base of your Novell NDK; and then type + 'make netware' from the top source directory; other targets available + are 'netware-ssl', 'netware-ssl-zlib', 'netware-zlib' and 'netware-ares'; + if you need other combinations you can control the build with the + environment variables WITH_SSL, WITH_ZLIB, WITH_ARES, WITH_SSH2, and + ENABLE_IPV6; you can set LINK_STATIC=1 to link curl.nlm statically. + By default LDAP support is enabled, however currently you will need a patch + in order to use the CLDAP NDK with BSD sockets (Novell Bug 300237): + http://www.gknw.net/test/curl/cldap_ndk/ldap_ndk.diff + I found on some Linux systems (RH9) that OS detection didn't work although + a 'set | grep OSTYPE' shows the var present and set; I simply overwrote it + with 'OSTYPE=linux-rh9-gnu' and the detection in the Makefile worked... + Any help in testing appreciated! + Builds automatically created 8 times a day from current CVS are here: + http://www.gknw.net/mirror/curl/autobuilds/ + the status of these builds can be viewed at the autobuild table: + http://curl.haxx.se/auto/ + + +eCos +==== + curl does not use the eCos build system, so you must first build eCos + separately, then link curl to the resulting eCos library. Here's a sample + configure line to do so on an x86 Linux box targeting x86: + + GCCLIB=`gcc -print-libgcc-file-name` && \ + CFLAGS="-D__ECOS=1 -nostdinc -I$ECOS_INSTALL/include \ + -I`dirname $GCCLIB`/include" \ + LDFLAGS="-nostdlib -Wl,--gc-sections -Wl,-static \ + -L$ECOS_INSTALL/lib -Ttarget.ld -ltarget" \ + ./configure --host=i386 --disable-shared \ + --without-ssl --without-zlib --disable-manual --disable-ldap + + In most cases, eCos users will be using libcurl from within a custom + embedded application. Using the standard 'curl' executable from + within eCos means facing the limitation of the standard eCos C + startup code which does not allow passing arguments in main(). To + run 'curl' from eCos and have it do something useful, you will need + to either modify the eCos startup code to pass in some arguments, or + modify the curl application itself to retrieve its arguments from + some location set by the bootloader or hard-code them. + + Something like the following patch could be used to hard-code some + arguments. The MTAB_ENTRY line mounts a RAM disk as the root filesystem + (without mounting some kind of filesystem, eCos errors out all file + operations which curl does not take to well). The next section synthesizes + some command-line arguments for curl to use, in this case to direct curl + to read further arguments from a file. It then creates that file on the + RAM disk and places within it a URL to download: a file: URL that + just happens to point to the configuration file itself. The results + of running curl in this way is the contents of the configuration file + printed to the console. + +--- src/main.c 19 Jul 2006 19:09:56 -0000 1.363 ++++ src/main.c 24 Jul 2006 21:37:23 -0000 +@@ -4286,11 +4286,31 @@ + } + + ++#ifdef __ECOS ++#include ++MTAB_ENTRY( testfs_mte1, ++ "/", ++ "ramfs", ++ "", ++ 0); ++#endif + + int main(int argc, char *argv[]) + { + int res; + struct Configurable config; ++#ifdef __ECOS ++ char *args[] = {"ecos-curl", "-K", "curlconf.txt"}; ++ FILE *f; ++ argc = sizeof(args)/sizeof(args[0]); ++ argv = args; ++ ++ f = fopen("curlconf.txt", "w"); ++ if (f) { ++ fprintf(f, "--url file:curlconf.txt"); ++ fclose(f); ++ } ++#endif + memset(&config, 0, sizeof(struct Configurable)); + + config.errors = stderr; /* default errors to stderr */ + + +Minix +===== + curl can be compiled on Minix 3 using gcc or ACK (starting with + ver. 3.1.3). The default heap size allocated to several required + programs is inadequate for configuring and compiling curl and will + result in strange errors unless fixed (which only needs to be done + once). + + ACK + --- + Increase heap sizes with the commands: + + chmem =1024000 /usr/lib/em_cemcom.ansi + chmem =512000 /usr/lib/i386/as + + If you have bash installed: + + chmem =2048000 /usr/local/bin/bash + + Configure and compile with: + + ./configure CC=cc LD=cc GREP=grep CPPFLAGS=-D_POSIX_SOURCE=1 + make + + GCC + --- + If you have bash installed: + + chmem =2048000 /usr/local/bin/bash + + Make sure gcc is in your PATH with the command: + + export PATH=/usr/gnu/bin:$PATH + + then configure and compile curl with: + + ./configure CC=gcc GREP=grep AR=/usr/gnu/bin/gar + make + + +CROSS COMPILE +============= + (This section was graciously brought to us by Jim Duey, with additions by + Dan Fandrich) + + Download and unpack the cURL package. Version should be 7.9.1 or later. + + 'cd' to the new directory. (e.g. cd curl-7.12.3) + + Set environment variables to point to the cross-compile toolchain and call + configure with any options you need. Be sure and specify the '--host' and + '--build' parameters at configuration time. The following script is an + example of cross-compiling for the IBM 405GP PowerPC processor using the + toolchain from MonteVista for Hardhat Linux. + + (begin script) + + #! /bin/sh + + export PATH=$PATH:/opt/hardhat/devkit/ppc/405/bin + export CPPFLAGS="-I/opt/hardhat/devkit/ppc/405/target/usr/include" + export AR=ppc_405-ar + export AS=ppc_405-as + export LD=ppc_405-ld + export RANLIB=ppc_405-ranlib + export CC=ppc_405-gcc + export NM=ppc_405-nm + + ./configure --target=powerpc-hardhat-linux \ + --host=powerpc-hardhat-linux \ + --build=i586-pc-linux-gnu \ + --prefix=/opt/hardhat/devkit/ppc/405/target/usr/local \ + --exec-prefix=/usr/local + + (end script) + + You may also need to provide a parameter like '--with-random=/dev/urandom' + to configure as it cannot detect the presence of a random number + generating device for a target system. The '--prefix' parameter + specifies where cURL will be installed. If 'configure' completes + successfully, do 'make' and 'make install' as usual. + + In some cases, you may be able to simplify the above commands to as + little as: + + ./configure --host=ARCH-OS + + +REDUCING SIZE +============= + There are a number of configure options that can be used to reduce the + size of libcurl for embedded applications where binary size is an + important factor. First, be sure to set the CFLAGS variable when + configuring with any relevant compiler optimization flags to reduce the + size of the binary. For gcc, this would mean at minimum the -Os option + and probably the -march=X option as well, e.g.: + + ./configure CFLAGS='-Os' ... + + Note that newer compilers often produce smaller code than older versions + due to better optimization. + + Be sure to specify as many --disable- and --without- flags on the configure + command-line as you can to disable all the libcurl features that you + know your application is not going to need. Besides specifying the + --disable-PROTOCOL flags for all the types of URLs your application + will not use, here are some other flags that can reduce the size of the + library: + + --disable-ares (disables support for the ARES DNS library) + --disable-cookies (disables support for HTTP cookies) + --disable-crypto-auth (disables HTTP cryptographic authentication) + --disable-ipv6 (disables support for IPv6) + --disable-verbose (eliminates debugging strings and error code strings) + --enable-hidden-symbols (eliminates unneeded symbols in the shared library) + --without-libidn (disables support for the libidn DNS library) + --without-ssl (disables support for SSL/TLS) + --without-zlib (disables support for on-the-fly decompression) + + The GNU linker has a number of options to reduce the size of the libcurl + dynamic libraries on some platforms even further. Specify them by giving + the options -Wl,-Bsymbolic and -Wl,-s on the gcc command-line. + Be sure also to strip debugging symbols from your binaries after + compiling using 'strip' (or the appropriate variant if cross-compiling). + If space is really tight, you may be able to remove some unneeded + sections of the shared library using the -R option to objcopy (e.g. the + .comment section). + + Using these techniques it is possible to create an HTTP-only shared libcurl + library for i386 Linux platforms that is only 96 KiB in size (as of libcurl + version 7.17.1, using gcc 4.2.2). + + You may find that statically linking libcurl to your application will + result in a lower total size. + + +PORTS +===== + This is a probably incomplete list of known hardware and operating systems + that curl has been compiled for. If you know a system curl compiles and + runs on, that isn't listed, please let us know! + + - Alpha DEC OSF 4 + - Alpha Digital UNIX v3.2 + - Alpha FreeBSD 4.1, 4.5 + - Alpha Linux 2.2, 2.4 + - Alpha NetBSD 1.5.2 + - Alpha OpenBSD 3.0 + - Alpha OpenVMS V7.1-1H2 + - Alpha Tru64 v5.0 5.1 + - HP-PA HP-UX 9.X 10.X 11.X + - HP-PA Linux + - HP3000 MPE/iX + - MIPS IRIX 6.2, 6.5 + - MIPS Linux + - OS/400 + - Pocket PC/Win CE 3.0 + - Power AIX 3.2.5, 4.2, 4.3.1, 4.3.2, 5.1, 5.2 + - PowerPC Darwin 1.0 + - PowerPC Linux + - PowerPC Mac OS 9 + - PowerPC Mac OS X + - SuperH4 Linux 2.6.X + - SINIX-Z v5 + - Sparc Linux + - Sparc Solaris 2.4, 2.5, 2.5.1, 2.6, 7, 8, 9, 10 + - Sparc SunOS 4.1.X + - StrongARM (and other ARM) RISC OS 3.1, 4.02 + - StrongARM/ARM7/ARM9 Linux 2.4, 2.6 + - StrongARM NetBSD 1.4.1 + - TPF + - Ultrix 4.3a + - UNICOS 9.0 + - i386 BeOS + - i386 DOS + - i386 eCos 1.3.1 + - i386 Esix 4.1 + - i386 FreeBSD + - i386 HURD + - i386 Linux 1.3, 2.0, 2.2, 2.3, 2.4, 2.6 + - i386 MINIX 3.1 + - i386 NetBSD + - i386 Novell NetWare + - i386 OS/2 + - i386 OpenBSD + - i386 SCO unix + - i386 Solaris 2.7 + - i386 Windows 95, 98, ME, NT, 2000, XP, 2003 + - i386 QNX 6 + - i486 ncr-sysv4.3.03 (NCR MP-RAS) + - ia64 Linux 2.3.99 + - m68k AmigaOS 3 + - m68k Linux + - m68k uClinux + - m68k OpenBSD + - m88k dg-dgux5.4R3.00 + - s390 Linux + - XScale/PXA250 Linux 2.4 + - Nios II uClinux + +Useful URLs +=========== + +OpenSSL http://www.openssl.org +MingW http://www.mingw.org +OpenLDAP http://www.openldap.org +Zlib http://www.gzip.org/zlib/ +libssh2 http://www.libssh2.org + + diff --git a/vendors/libcurl/docs/INSTALL.devcpp b/vendors/libcurl/docs/INSTALL.devcpp new file mode 100644 index 0000000..8ff4144 --- /dev/null +++ b/vendors/libcurl/docs/INSTALL.devcpp @@ -0,0 +1,302 @@ +DevCpp-Mingw Install & Compilation Sept 2005 +================================== + +Reference Emails available at curl@haxx.se: + + Libcurl Install and Use Issues + Awaiting an Answer for Win 32 Install + res = curl_easy_perform(curl); Error + Makefile Issues + + +Having previously done a thorough review of what was available that met my +requirements under GPL, I settled for Libcurl as the software of choice for +many reasons not the least of which was the support. + +Background +---------- + +This quest started when I innocently tried to incorporate the libcurl library +into my simple source code. I figured that a few easy steps would accomplish +this without major headaches. I had no idea that I would be facing an almost +insurmountable challenge. + +The main problem lies in two areas. First the bulk of support for libcurl +exists for a Unix/linux command line environments. This is of little help when +it comes to Windows O/S. + +Secondly the help that does exist for the Windows O/S focused around mingw +thru a command line argument environment. + +You may ask "Why is this a problem?" + +I'm using a Windows O/S with DevCpp. For those of you who are unfamiliar with +DevCpp, it is a window shell GUI that replaces the command line environment +for gcc. A definite improvement that I am unwilling to give up. However using +DevCpp presented its own set of issues. Inadvertently I also made some +careless errors such as compiling the 7.14 version of Makefile with an older +version of source code. Thanks to Dan Fandrich for picking this up. + +I did eventually with the help of Daniel, Phillipe and others manage to +implement successfully (the only mingw available version) +curl-7.13.0-win32-ssl-devel-mingw32 into the DevCpp environment. Only the +dynamic libcurl.dll libcurldll.a libraries worked. The static library which I +was interested in did not. Furthermore when I tried to implement one of the +examples included with the curl package (get info.c) it caused the executable +to crash. Tracing the bug I found it in the code and function res = +curl_easy_perform(curl);. + +At this point I had to make a choice as to whether invest my limited +time-energy resource to fixing the bug or to compile the new version +available. After searching the archives I found a very similar or the same bug +reported from version 7.12x on. Daniel did inform me that he thought that this +bug had been fixed with the latest version. So I proceeded to compile the +latest SSL version where I faced other challenges. + +In order to make this process unremarkable for others using the same +environment I decided to document the process so that others will find it +routine. It would be a shame if newbies could not implement this excellent +package for their use. + +I would like to thank the many others in this forum and in the DevCpp forum +for their help. Without your help I may either have given up or it would have +taken me many times longer to achieve success. + +The Cookbook Approach +--------------------- + +This discussion will be confined to a SSL static library compilation and +installation. Limited mention and comments will be inserted where appropriate +to help with non-SSL, dynamic libraries and executables. + + + Using Makefile from DevCpp to compile Libcurl libraries + +Preamble +-------- + +Using the latest version release - curl-7.14.0.tar.gz. Curl source code is +platform independent. This simply means that the source code can be compiled +for any Operating System (Linux/Unix Windows etc. and variations of thereof). + +The first thing to note is that inside curl-7.14.0 you will find two folders +lib and src. Both contain Makefile.m32 (required for win mingw library or exe +compilation) files which are different. The main difference between these two +folders and the makefiles is that the src folder contents are used to compile +an executable file(curl.exe) while the lib folder contents are used to compile +a static (libcurl.a) and dynamic (libcurl.dll & libcurldll.a) file that can be +used to compile libcurl with your own source code so that one can use and +access all libcurl functions. + +Before we start please make sure that DevCpp is installed properly. In +particular make sure you have no spaces in the name of any of the directories +and subdirectories where DevCpp is installed. Failure to comply with the +install instructions may produce erratic behaviour in DevCpp. For further info +check the following sites + +http://aditsu.freeunixhost.com/dev-cpp-faq.html +http://sourceforge.net/forum/message.php?msg_id=3252213 + +As I have mentioned before I will confine this to the SSL Library compilations +but the process is very similar for compilation of the executable - curl.exe; +just substitute the src folder makefile in its stead. + +First use a text processor Notepad, or your own favourite text processor. To +engage your favourite text processor, select Makefile.m32 click once with your +mouse on file icon; icon turns blue, press the shift key and right-click on +mouse, menu appears select "Open with", select your favourite text processor. + +Next read the contents of Makefile.m32. It includes instructions on its use. + +Method I - DOS Command Line +--------------------------- + +Note - The only reason I have included this method is that Method II which is +the preferred method for compiling does not allow for the setting of option +switches (e.g. SSL = 1 or SSL =0). At least that's what they tell me at the +Dev-Cpp forum. + +1 - Make a copy of (D:\Dev-Cpp\bin) bin folder and name it "bin Original" +place it in the Dev-Cpp installed directory (D:\Dev-Cpp\ for this example) + +2 - Copy the entire contents of the LIB folder of curl-7.14.0.tar.gz or zip +version into the bin folder above (D:\Dev-Cpp\bin). The reason being is that +the make.exe file resides in this folder. Make.exe will use - Makefile.m32, +Makefile.inc, and the source code included in the lib folder to compile the +source code. There is a PATH issue with make.exe that remains unresolved at +least for me. Unless the entire source code to be compiled is placed entirely +within the directory of make.exe an error message will be generated - "file +xxxx.yyy not available". + +3- Go to Dev-Cpp\bin and double click on make .exe. You will see a DOS window +quickly pop up and close very quickly. Not to worry! Please do not skip this +step. + +4- Click on the start button\Programs\MS-DOS Prompt.Once the DOS Window is up +Type the disk drive letter (e.g. E: ) engage the enter button. The path should +automatically take you to the directory of the make.exe file. + +5- To compile the source code simply type at the DOS prompt make -f +Makefile.m32 as per instructions contained in the Makefile.m32 file (use any +text processor to read instructions). I don't believe that this makefile +allows for the option of non SSL. Ignore any warnings. + +6- Collect and make copies of libcurl.a, libcurl.dll, libcurldll.a and any *.o +compilations you might need in another directory outside of the bin directory +as you will need this files shortly to set up libcurl for use with +Dev-cpp. For most apps *.o is not required. Later on we will show what to do +with these files. + +7- You are finished but before closing we need to do cleanup - erase the bin +folder and rename the "bin Original" folder created in step 1 to bin. + +Note to compile a curl executable the process is probably similar but instead +of using the LIB folder contents use the SRC folder contents and Makefiles in +curl-7.14.0.tar.gz. File directories relative placements must be respected for +compiling to take place successfully. This may not be possible with the PATH +problem that make.exe experiences. If anyone has solved this PATH issue and +please make sure it actually works on Win 9x/2000/XP before letting me +know. Then please let me or Daniel in on the solution so that it can be +included with these instructions. Thanks. + +or + +Method II - Dev-Cpp GUI +----------------------- + +1- Copy the entire contents of the LIB folder of curl-7.14.0.tar.gz or zip +version into any folder outside of (Dev-Cpp\bin). + +2- Drop the File/New/click on Project. + +3- New Project Dialogue box appears. Double click on the Static Library. + +4- Create Project Dialogue box appears. Select the LIB folder location to +place and locate your Project File Name. Placing the Project File Name +elsewhere may cause problems (PATH issue problem again). + +5- Drop down the Project/Project Options. Project Options Dialogue box +appears. + +6- Select the Makefile tab in the Project Options Dialogue Box. Check Box - +Use Custom Makefile. Click on the Folder icon at the extreme right of the +Check Box. Select Makefile.m32 in the folder wherever you have placed the +contents of the LIB Folder. Press OK and close the Dialogue Box. + +7- Drop the Menu Project/Click on Add to Project. Open File Dialogue Box +appears. The Dialogue Box should open in the folder wherever you have placed +the contents of the LIB Folder. If not go there. + +8- Select Crtl-A to select all files in the LIB folder. Click on open to add +files and close box. Wait till all files are added. This may take 30 seconds +or longer. + +9- Drop the Menu Execute/Click on Compile. + +10- That's it. + + + The following steps must be completed if Curl is to work properly + ================================================================= + +LIB folder inclusions (*.a placement) +------------------------------------- + +1- Refer to Method I - DOS Command Line point # 6 Take libcurl.a, libcurldll.a +and install it in the directory C( or whichever drive Dev is installed) +:\Dev-Cpp\lib. + + +Include Folder +-------------- + +1- Create a new folder by the name of curl (do not change the name curl to +some other name as it will cause major issues) in the directory +C:\Dev-Cpp\include. + +2- Copy the entire contents of the curl folder of curl-7.14.0.tar.gz or zip + version into the newly created curl directory - C:\Dev-Cpp\include\curl. + +Links To Include And Lib Folder +------------------------------- + +1- Drop the Menu - Tools\Compiler Options\Directories\Libraries. Make sure +that C( or whichever drive Dev is installed):\DEV-CPP\lib is included. + +2- Next select the Menu - Tools\Compiler Options\Directories\C Includes. Make +sure that C:\DEV-CPP\include and C:\Dev-Cpp\include\curl are included. + +3- Next select the Menu - Tools\Compiler Options\Directories\C++ +Includes. Make sure that C:\DEV-CPP\include and C:\Dev-Cpp\include\curl are +included. + +Linker Links +------------ + +1- Drop the Menu - Tools\Compiler Options\Directories\Compiler. + +2- Make sure that the box "Add these commands to the linker command line" is +checked. + +3- Include in the white space immediately below the box referred in 2 -lcurl +-lws2_32 -lwinmm. + +SSL Files +--------- + +1- Get the latest openSSL (as of time of this writing) +openssl-0.9.7e-win32-bin.zip for the minimalist package of the openssl-0.9.7e +binaries ported to MS Windows 95/98/NT/XP using the MingW32/GCC-3.1 +development environment. The file may be downloaded at +http://curl.haxx.se/download/. + +2- Open the above zip file. You will find two files - SDL.dll, +SDL_mixer.dll. Install them in the directory C:\WINDOWS\SYSTEM32 for Win 9x +users and c:\winnt\system32 for NT-family users. + +Multithreading Files +-------------------- + +To be completed + +#define +------- + +1- Make sure that your program includes the following - #define CURL_STATICLIB +must be declared FIRST before any other define functions may be +added. Otherwise you may experience link errors. + +2- Don't forget to include #include "curl/curl.h". + +e.g. + #define CURL_STATICLIB +#include + #include "curl/curl.h" +#include +#include +#include +etc... + + +Static or Dynamic Library +------------------------- + +The above steps apply for the use by a static library. Should you choose to +use a dynamic library you will be required to perform these additional steps. + +1- Refer to Method I - DOS Command Line point # 6. Install libcurl.dll in the +directory C:\WINDOWS\SYSTEM32 for Win 9x users and c:\winnt\system32 for +NT-family users. + +2- Refer to Linker Links point 3 - Replace -lcurl with -lcurldll. + +Voila you're done. + +The non-SSL static Library build may not be possible to use at least as of the +time of this writing - v7.14. Check reference emails - Phillipe and I found it +impossible to fully compile as certain files were missing for linking. No big +loss as SSL is a major plus. + +Hope this Helps + +Tom diff --git a/vendors/libcurl/docs/INTERNALS b/vendors/libcurl/docs/INTERNALS new file mode 100644 index 0000000..84538a9 --- /dev/null +++ b/vendors/libcurl/docs/INTERNALS @@ -0,0 +1,424 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + +INTERNALS + + The project is split in two. The library and the client. The client part uses + the library, but the library is designed to allow other applications to use + it. + + The largest amount of code and complexity is in the library part. + +CVS +=== + All changes to the sources are committed to the CVS repository as soon as + they're somewhat verified to work. Changes shall be commited as independently + as possible so that individual changes can be easier spotted and tracked + afterwards. + + Tagging shall be used extensively, and by the time we release new archives we + should tag the sources with a name similar to the released version number. + +Windows vs Unix +=============== + + There are a few differences in how to program curl the unix way compared to + the Windows way. The four perhaps most notable details are: + + 1. Different function names for socket operations. + + In curl, this is solved with defines and macros, so that the source looks + the same at all places except for the header file that defines them. The + macros in use are sclose(), sread() and swrite(). + + 2. Windows requires a couple of init calls for the socket stuff. + + That's taken care of by the curl_global_init() call, but if other libs also + do it etc there might be reasons for applications to alter that behaviour. + + 3. The file descriptors for network communication and file operations are + not easily interchangable as in unix. + + We avoid this by not trying any funny tricks on file descriptors. + + 4. When writing data to stdout, Windows makes end-of-lines the DOS way, thus + destroying binary data, although you do want that conversion if it is + text coming through... (sigh) + + We set stdout to binary under windows + + Inside the source code, We make an effort to avoid '#ifdef [Your OS]'. All + conditionals that deal with features *should* instead be in the format + '#ifdef HAVE_THAT_WEIRD_FUNCTION'. Since Windows can't run configure scripts, + we maintain two config-win32.h files (one in lib/ and one in src/) that are + supposed to look exactly as a config.h file would have looked like on a + Windows machine! + + Generally speaking: always remember that this will be compiled on dozens of + operating systems. Don't walk on the edge. + +Library +======= + + There are plenty of entry points to the library, namely each publicly defined + function that libcurl offers to applications. All of those functions are + rather small and easy-to-follow. All the ones prefixed with 'curl_easy' are + put in the lib/easy.c file. + + curl_global_init_() and curl_global_cleanup() should be called by the + application to initialize and clean up global stuff in the library. As of + today, it can handle the global SSL initing if SSL is enabled and it can init + the socket layer on windows machines. libcurl itself has no "global" scope. + + All printf()-style functions use the supplied clones in lib/mprintf.c. This + makes sure we stay absolutely platform independent. + + curl_easy_init() allocates an internal struct and makes some initializations. + The returned handle does not reveal internals. This is the 'SessionHandle' + struct which works as an "anchor" struct for all curl_easy functions. All + connections performed will get connect-specific data allocated that should be + used for things related to particular connections/requests. + + curl_easy_setopt() takes three arguments, where the option stuff must be + passed in pairs: the parameter-ID and the parameter-value. The list of + options is documented in the man page. This function mainly sets things in + the 'SessionHandle' struct. + + curl_easy_perform() does a whole lot of things: + + It starts off in the lib/easy.c file by calling Curl_perform() and the main + work then continues in lib/url.c. The flow continues with a call to + Curl_connect() to connect to the remote site. + + o Curl_connect() + + ... analyzes the URL, it separates the different components and connects to + the remote host. This may involve using a proxy and/or using SSL. The + Curl_resolv() function in lib/hostip.c is used for looking up host names + (it does then use the proper underlying method, which may vary between + platforms and builds). + + When Curl_connect is done, we are connected to the remote site. Then it is + time to tell the server to get a document/file. Curl_do() arranges this. + + This function makes sure there's an allocated and initiated 'connectdata' + struct that is used for this particular connection only (although there may + be several requests performed on the same connect). A bunch of things are + inited/inherited from the SessionHandle struct. + + o Curl_do() + + Curl_do() makes sure the proper protocol-specific function is called. The + functions are named after the protocols they handle. Curl_ftp(), + Curl_http(), Curl_dict(), etc. They all reside in their respective files + (ftp.c, http.c and dict.c). HTTPS is handled by Curl_http() and FTPS by + Curl_ftp(). + + The protocol-specific functions of course deal with protocol-specific + negotiations and setup. They have access to the Curl_sendf() (from + lib/sendf.c) function to send printf-style formatted data to the remote + host and when they're ready to make the actual file transfer they call the + Curl_Transfer() function (in lib/transfer.c) to setup the transfer and + returns. + + If this DO function fails and the connection is being re-used, libcurl will + then close this connection, setup a new connection and re-issue the DO + request on that. This is because there is no way to be perfectly sure that + we have discovered a dead connection before the DO function and thus we + might wrongly be re-using a connection that was closed by the remote peer. + + Some time during the DO function, the Curl_setup_transfer() function must + be called with some basic info about the upcoming transfer: what socket(s) + to read/write and the expected file tranfer sizes (if known). + + o Transfer() + + Curl_perform() then calls Transfer() in lib/transfer.c that performs the + entire file transfer. + + During transfer, the progress functions in lib/progress.c are called at a + frequent interval (or at the user's choice, a specified callback might get + called). The speedcheck functions in lib/speedcheck.c are also used to + verify that the transfer is as fast as required. + + o Curl_done() + + Called after a transfer is done. This function takes care of everything + that has to be done after a transfer. This function attempts to leave + matters in a state so that Curl_do() should be possible to call again on + the same connection (in a persistent connection case). It might also soon + be closed with Curl_disconnect(). + + o Curl_disconnect() + + When doing normal connections and transfers, no one ever tries to close any + connections so this is not normally called when curl_easy_perform() is + used. This function is only used when we are certain that no more transfers + is going to be made on the connection. It can be also closed by force, or + it can be called to make sure that libcurl doesn't keep too many + connections alive at the same time (there's a default amount of 5 but that + can be changed with the CURLOPT_MAXCONNECTS option). + + This function cleans up all resources that are associated with a single + connection. + + Curl_perform() is the function that does the main "connect - do - transfer - + done" loop. It loops if there's a Location: to follow. + + When completed, the curl_easy_cleanup() should be called to free up used + resources. It runs Curl_disconnect() on all open connectons. + + A quick roundup on internal function sequences (many of these call + protocol-specific function-pointers): + + curl_connect - connects to a remote site and does initial connect fluff + This also checks for an existing connection to the requested site and uses + that one if it is possible. + + curl_do - starts a transfer + curl_transfer() - transfers data + curl_done - ends a transfer + + curl_disconnect - disconnects from a remote site. This is called when the + disconnect is really requested, which doesn't necessarily have to be + exactly after curl_done in case we want to keep the connection open for + a while. + + HTTP(S) + + HTTP offers a lot and is the protocol in curl that uses the most lines of + code. There is a special file (lib/formdata.c) that offers all the multipart + post functions. + + base64-functions for user+password stuff (and more) is in (lib/base64.c) and + all functions for parsing and sending cookies are found in (lib/cookie.c). + + HTTPS uses in almost every means the same procedure as HTTP, with only two + exceptions: the connect procedure is different and the function used to read + or write from the socket is different, although the latter fact is hidden in + the source by the use of curl_read() for reading and curl_write() for writing + data to the remote server. + + http_chunks.c contains functions that understands HTTP 1.1 chunked transfer + encoding. + + An interesting detail with the HTTP(S) request, is the add_buffer() series of + functions we use. They append data to one single buffer, and when the + building is done the entire request is sent off in one single write. This is + done this way to overcome problems with flawed firewalls and lame servers. + + FTP + + The Curl_if2ip() function can be used for getting the IP number of a + specified network interface, and it resides in lib/if2ip.c. + + Curl_ftpsendf() is used for sending FTP commands to the remote server. It was + made a separate function to prevent us programmers from forgetting that they + must be CRLF terminated. They must also be sent in one single write() to make + firewalls and similar happy. + + Kerberos + + The kerberos support is mainly in lib/krb4.c and lib/security.c. + + TELNET + + Telnet is implemented in lib/telnet.c. + + FILE + + The file:// protocol is dealt with in lib/file.c. + + LDAP + + Everything LDAP is in lib/ldap.c. + + GENERAL + + URL encoding and decoding, called escaping and unescaping in the source code, + is found in lib/escape.c. + + While transfering data in Transfer() a few functions might get used. + curl_getdate() in lib/parsedate.c is for HTTP date comparisons (and more). + + lib/getenv.c offers curl_getenv() which is for reading environment variables + in a neat platform independent way. That's used in the client, but also in + lib/url.c when checking the proxy environment variables. Note that contrary + to the normal unix getenv(), this returns an allocated buffer that must be + free()ed after use. + + lib/netrc.c holds the .netrc parser + + lib/timeval.c features replacement functions for systems that don't have + gettimeofday() and a few support functions for timeval convertions. + + A function named curl_version() that returns the full curl version string is + found in lib/version.c. + +Persistent Connections +====================== + + The persistent connection support in libcurl requires some considerations on + how to do things inside of the library. + + o The 'SessionHandle' struct returned in the curl_easy_init() call must never + hold connection-oriented data. It is meant to hold the root data as well as + all the options etc that the library-user may choose. + o The 'SessionHandle' struct holds the "connection cache" (an array of + pointers to 'connectdata' structs). There's one connectdata struct + allocated for each connection that libcurl knows about. Note that when you + use the multi interface, the multi handle will hold the connection cache + and not the particular easy handle. This of course to allow all easy handles + in a multi stack to be able to share and re-use connections. + o This enables the 'curl handle' to be reused on subsequent transfers. + o When we are about to perform a transfer with curl_easy_perform(), we first + check for an already existing connection in the cache that we can use, + otherwise we create a new one and add to the cache. If the cache is full + already when we add a new connection, we close one of the present ones. We + select which one to close dependent on the close policy that may have been + previously set. + o When the transfer operation is complete, we try to leave the connection + open. Particular options may tell us not to, and protocols may signal + closure on connections and then we don't keep it open of course. + o When curl_easy_cleanup() is called, we close all still opened connections, + unless of course the multi interface "owns" the connections. + + You do realize that the curl handle must be re-used in order for the + persistent connections to work. + +multi interface/non-blocking +============================ + + We make an effort to provide a non-blocking interface to the library, the + multi interface. To make that interface work as good as possible, no + low-level functions within libcurl must be written to work in a blocking + manner. + + One of the primary reasons we introduced c-ares support was to allow the name + resolve phase to be perfectly non-blocking as well. + + The ultimate goal is to provide the easy interface simply by wrapping the + multi interface functions and thus treat everything internally as the multi + interface is the single interface we have. + + The FTP and the SFTP/SCP protocols are thus perfect examples of how we adapt + and adjust the code to allow non-blocking operations even on multi-stage + protocols. The DICT, TELNET and TFTP are crappy examples and they are subject + for rewrite in the future to better fit the libcurl protocol family. + +SSL libraries +============= + + Originally libcurl supported SSLeay for SSL/TLS transports, but that was then + extended to its successor OpenSSL but has since also been extended to several + other SSL/TLS libraries and we expect and hope to further extend the support + in future libcurl versions. + + To deal with this internally in the best way possible, we have a generic SSL + function API as provided by the sslgen.[ch] system, and they are the only SSL + functions we must use from within libcurl. sslgen is then crafted to use the + appropriate lower-level function calls to whatever SSL library that is in + use. + +Library Symbols +=============== + + All symbols used internally in libcurl must use a 'Curl_' prefix if they're + used in more than a single file. Single-file symbols must be made static. + Public ("exported") symbols must use a 'curl_' prefix. (There are exceptions, + but they are to be changed to follow this pattern in future versions.) + +Return Codes and Informationals +=============================== + + I've made things simple. Almost every function in libcurl returns a CURLcode, + that must be CURLE_OK if everything is OK or otherwise a suitable error code + as the curl/curl.h include file defines. The very spot that detects an error + must use the Curl_failf() function to set the human-readable error + description. + + In aiding the user to understand what's happening and to debug curl usage, we + must supply a fair amount of informational messages by using the Curl_infof() + function. Those messages are only displayed when the user explicitly asks for + them. They are best used when revealing information that isn't otherwise + obvious. + +API/ABI +======= + + We make an effort to not export or show internals or how internals work, as + that makes it easier to keep a solid API/ABI over time. See docs/libcurl/ABI + for our promise to users. + +Client +====== + + main() resides in src/main.c together with most of the client code. + + src/hugehelp.c is automatically generated by the mkhelp.pl perl script to + display the complete "manual" and the src/urlglob.c file holds the functions + used for the URL-"globbing" support. Globbing in the sense that the {} and [] + expansion stuff is there. + + The client mostly messes around to setup its 'config' struct properly, then + it calls the curl_easy_*() functions of the library and when it gets back + control after the curl_easy_perform() it cleans up the library, checks status + and exits. + + When the operation is done, the ourWriteOut() function in src/writeout.c may + be called to report about the operation. That function is using the + curl_easy_getinfo() function to extract useful information from the curl + session. + + Recent versions may loop and do all this several times if many URLs were + specified on the command line or config file. + +Memory Debugging +================ + + The file lib/memdebug.c contains debug-versions of a few functions. Functions + such as malloc, free, fopen, fclose, etc that somehow deal with resources + that might give us problems if we "leak" them. The functions in the memdebug + system do nothing fancy, they do their normal function and then log + information about what they just did. The logged data can then be analyzed + after a complete session, + + memanalyze.pl is the perl script present only present in CVS (not part of the + release archives) that analyzes a log file generated by the memdebug + system. It detects if resources are allocated but never freed and other kinds + of errors related to resource management. + + Use -DMALLOCDEBUG when compiling to enable memory debugging, this is also + switched on by running configure with --enable-debug. + +Test Suite +========== + + Since November 2000, a test suite has evolved. It is placed in its own + subdirectory directly off the root in the curl archive tree, and it contains + a bunch of scripts and a lot of test case data. + + The main test script is runtests.pl that will invoke the two servers + httpserver.pl and ftpserver.pl before all the test cases are performed. The + test suite currently only runs on unix-like platforms. + + You'll find a complete description of the test case data files in the + tests/README file. + + The test suite automatically detects if curl was built with the memory + debugging enabled, and if it was it will detect memory leaks too. + +Building Releases +================= + + There's no magic to this. When you consider everything stable enough to be + released, run the 'maketgz' script (using 'make distcheck' will give you a + pretty good view on the status of the current sources). maketgz prompts for + version number of the client and the library before it creates a release + archive. maketgz uses 'make dist' for the actual archive building, why you + need to fill in the Makefile.am files properly for which files that should + be included in the release archives. + diff --git a/vendors/libcurl/docs/KNOWN_BUGS b/vendors/libcurl/docs/KNOWN_BUGS new file mode 100644 index 0000000..566592f --- /dev/null +++ b/vendors/libcurl/docs/KNOWN_BUGS @@ -0,0 +1,167 @@ +These are problems known to exist at the time of this release. Feel free to +join in and help us correct one or more of these! Also be sure to check the +changelog of the current development status, as one or more of these problems +may have been fixed since this was written! + +52. Gautam Kachroo's issue that identifies a problem with the multi interface + where a connection can be re-used without actually being properly + SSL-negoatiated: + http://curl.haxx.se/mail/lib-2008-01/0277.html + +51.Kevin Reed's reported problem with a proxy when doing CONNECT and it + wants NTLM and close the connection to the initial CONNECT response: + http://curl.haxx.se/bug/view.cgi?id=1879375 + +50. Curl_done() and pipelning aren't totally cool together: + http://curl.haxx.se/mail/lib-2008-01/0330.html + +49. If using --retry and the transfer timeouts (possibly due to using -m or + -y/-Y) the next attempt doesn't resume the transfer properly from what was + downloaded in the previous attempt but will truncate and restart at the + original position where it was at before the previous failed attempt. See + http://curl.haxx.se/mail/lib-2008-01/0080.html + +48. If a CONNECT response-headers are larger than BUFSIZE (16KB) when the + connection is meant to be kept alive (like for NTLM proxy auth), the + function will return prematurely and will confuse the rest of the HTTP + protocol code. This should be very rare. + +45. libcurl built to support ipv6 uses getaddrinfo() to resolve host names. + getaddrinfo() sorts the response list which effectively kills how libcurl + deals with round-robin DNS entries. All details: + http://curl.haxx.se/mail/lib-2007-07/0168.html + initial suggested function to use for randomizing the response: + http://curl.haxx.se/mail/lib-2007-07/0178.html + +43. There seems to be a problem when connecting to the Microsoft telnet server. + http://curl.haxx.se/bug/view.cgi?id=1720605 + +41. When doing an operation over FTP that requires the ACCT command (but not + when logging in), the operation will fail since libcurl doesn't detect this + and thus fails to issue the correct command: + http://curl.haxx.se/bug/view.cgi?id=1693337 + +39. Steffen Rumler's Race Condition in Curl_proxyCONNECT: + http://curl.haxx.se/mail/lib-2007-01/0045.html + +38. Kumar Swamy Bhatt's problem in ftp/ssl "LIST" operation: + http://curl.haxx.se/mail/lib-2007-01/0103.html + +37. Having more than one connection to the same host when doing NTLM + authentication (with performs multiple "passes" and authenticates a + connection rather than a HTTP request), and particularly when using the + multi interface, there's a risk that libcurl will re-use a wrong connection + when doing the different passes in the NTLM negotiation and thus fail to + negotiate (in seemingly mysterious ways). + +35. Both SOCKS5 and SOCKS4 proxy connections are done blocking, which is very + bad when used with the multi interface. + +34. The SOCKS4 connection codes don't properly acknowledge (connect) timeouts. + Also see #12. According to bug #1556528, even the SOCKS5 connect code does + not do it right: http://curl.haxx.se/bug/view.cgi?id=1556528, + +31. "curl-config --libs" will include details set in LDFLAGS when configure is + run that might be needed only for building libcurl. Further, curl-config + --cflags suffers from the same effects with CFLAGS/CPPFLAGS. + +30. You need to use -g to the command line tool in order to use RFC2732-style + IPv6 numerical addresses in URLs. + +29. IPv6 URLs with zone ID is not supported. + http://www.ietf.org/internet-drafts/draft-fenner-literal-zone-02.txt (expired) + specifies the use of a plus sign instead of a percent when specifying zone + IDs in URLs to get around the problem of percent signs being + special. According to the reporter, Firefox deals with the URL _with_ a + percent letter (which seems like a blatant URL spec violation). + + See http://curl.haxx.se/bug/view.cgi?id=1371118 + +26. NTLM authentication using SSPI (on Windows) when (lib)curl is running in + "system context" will make it use wrong(?) user name - at least when compared + to what winhttp does. See http://curl.haxx.se/bug/view.cgi?id=1281867 + +23. SOCKS-related problems: + A) libcurl doesn't support SOCKS for IPv6. + B) libcurl doesn't support FTPS over a SOCKS proxy. + E) libcurl doesn't support active FTP over a SOCKS proxy + + We probably have even more bugs and lack of features when a SOCKS proxy is + used. + +22. Sending files to a FTP server using curl on VMS, might lead to curl + complaining on "unaligned file size" on completion. The problem is related + to VMS file structures and the perceived file sizes stat() returns. A + possible fix would involve sending a "STRU VMS" command. + http://curl.haxx.se/bug/view.cgi?id=1156287 + +21. FTP ASCII transfers do not follow RFC959. They don't convert the data + accordingly (not for sending nor for receiving). RFC 959 section 3.1.1.1 + clearly describes how this should be done: + + The sender converts the data from an internal character representation to + the standard 8-bit NVT-ASCII representation (see the Telnet + specification). The receiver will convert the data from the standard + form to his own internal form. + + Since 7.15.4 at least line endings are converted. + +16. FTP URLs passed to curl may contain NUL (0x00) in the RFC 1738 , + , and components, encoded as "%00". The problem is that + curl_unescape does not detect this, but instead returns a shortened C + string. From a strict FTP protocol standpoint, NUL is a valid character + within RFC 959 , so the way to handle this correctly in curl would + be to use a data structure other than a plain C string, one that can handle + embedded NUL characters. From a practical standpoint, most FTP servers + would not meaningfully support NUL characters within RFC 959 , + anyway (e.g., UNIX pathnames may not contain NUL). + +14. Test case 165 might fail on system which has libidn present, but with an + old iconv version (2.1.3 is a known bad version), since it doesn't recognize + the charset when named ISO8859-1. Changing the name to ISO-8859-1 makes the + test pass, but instead makes it fail on Solaris hosts that use its native + iconv. + +13. curl version 7.12.2 fails on AIX if compiled with --enable-ares. + The workaround is to combine --enable-ares with --disable-shared + +12. When connecting to a SOCKS proxy, the (connect) timeout is not properly + acknowledged after the actual TCP connect (during the SOCKS "negotiate" + phase). + +10. To get HTTP Negotiate authentication to work fine, you need to provide a + (fake) user name (this concerns both curl and the lib) because the code + wrongly only considers authentication if there's a user name provided. + http://curl.haxx.se/bug/view.cgi?id=1004841. How? + http://curl.haxx.se/mail/lib-2004-08/0182.html + +8. Doing resumed upload over HTTP does not work with '-C -', because curl + doesn't do a HEAD first to get the initial size. This needs to be done + manually for HTTP PUT resume to work, and then '-C [index]'. + +7. CURLOPT_USERPWD and CURLOPT_PROXYUSERPWD have no way of providing user names + that contain a colon. This can't be fixed easily in a backwards compatible + way without adding new options (and then, they should most probably allow + setting user name and password separately). + +6. libcurl ignores empty path parts in FTP URLs, whereas RFC1738 states that + such parts should be sent to the server as 'CWD ' (without an argument). + The only exception to this rule, is that we knowingly break this if the + empty part is first in the path, as then we use the double slashes to + indicate that the user wants to reach the root dir (this exception SHALL + remain even when this bug is fixed). + +5. libcurl doesn't treat the content-length of compressed data properly, as + it seems HTTP servers send the *uncompressed* length in that header and + libcurl thinks of it as the *compressed* length. Some explanations are here: + http://curl.haxx.se/mail/lib-2003-06/0146.html + +2. If a HTTP server responds to a HEAD request and includes a body (thus + violating the RFC2616), curl won't wait to read the response but just stop + reading and return back. If a second request (let's assume a GET) is then + immediately made to the same server again, the connection will be re-used + fine of course, and the second request will be sent off but when the + response is to get read, the previous response-body is what curl will read + and havoc is what happens. + More details on this is found in this libcurl mailing list thread: + http://curl.haxx.se/mail/lib-2002-08/0000.html diff --git a/vendors/libcurl/docs/LICENSE-MIXING b/vendors/libcurl/docs/LICENSE-MIXING new file mode 100644 index 0000000..3db1a3d --- /dev/null +++ b/vendors/libcurl/docs/LICENSE-MIXING @@ -0,0 +1,126 @@ + License Mixing with apps, libcurl and Third Party Libraries + =========================================================== + +libcurl can be built to use a fair amount of various third party libraries, +libraries that are written and provided by other parties that are distributed +using their own licenses. Even libcurl itself contains code that may cause +problems to some. This document attempts to describe what licenses libcurl and +the other libraries use and what possible dilemmas linking and mixing them all +can lead to for end users. + +I am not a lawyer and this is not legal advice! + +One common dilemma is that GPL[1]-licensed code is not allowed to be linked +with code licensed under the Original BSD license (with the announcement +clause). You may still build your own copies that use them all, but +distributing them as binaries would be to violate the GPL license - unless you +accompany your license with an exception[2]. This particular problem was +addressed when the Modified BSD license was created, which does not have the +announcement clause that collides with GPL. + +libcurl http://curl.haxx.se/docs/copyright.html + + Uses an MIT (or Modified BSD)-style license that is as liberal as + possible. Some of the source files that deal with KRB4 have Original + BSD-style announce-clause licenses. You may not distribute binaries + with krb4-enabled libcurl that also link with GPL-licensed code! + +OpenSSL http://www.openssl.org/source/license.html + + (May be used for SSL/TLS support) Uses an Original BSD-style license + with an announcement clause that makes it "incompatible" with GPL. You + are not allowed to ship binaries that link with OpenSSL that includes + GPL code (unless that specific GPL code includes an exception for + OpenSSL - a habit that is growing more and more common). If OpenSSL's + licensing is a problem for you, consider using GnuTLS or yassl + instead. + +GnuTLS http://www.gnutls.org/ + + (May be used for SSL/TLS support) Uses the LGPL[3] license. If this is + a problem for you, consider using OpenSSL instead. Also note that + GnuTLS itself depends on and uses other libs (libgcrypt and + libgpg-error) and they too are LGPL- or GPL-licensed. + +yassl http://www.yassl.com/ + + (May be used for SSL/TLS support) Uses the GPL[1] license. If this is + a problem for you, consider using OpenSSL or GnuTLS instead. + +NSS http://www.mozilla.org/projects/security/pki/nss/ + + (May be used for SSL/TLS support) Is covered by the MPL[4] license, + the GPL[1] license and the LGPL[3] license. You may choose to license + the code under MPL terms, GPL terms, or LGPL terms. These licenses + grant you different permissions and impose different obligations. You + should select the license that best meets your needs. + +c-ares http://daniel.haxx.se/projects/c-ares/license.html + + (Used for asynchronous name resolves) Uses an MIT license that is very + liberal and imposes no restrictions on any other library or part you + may link with. + +zlib http://www.gzip.org/zlib/zlib_license.html + + (Used for compressed Transfer-Encoding support) Uses an MIT-style + license that shouldn't collide with any other library. + +krb4 + + While nothing in particular says that a Kerberos4 library must use any + particular license, the one I've tried and used successfully so far + (kth-krb4) is partly Original BSD-licensed with the announcement + clause. Some of the code in libcurl that is written to deal with + Kerberos4 is Modified BSD-licensed. + +MIT Kerberos http://web.mit.edu/kerberos/www/dist/ + + (May be used for GSS support) MIT licensed, that shouldn't collide + with any other parts. + +Heimdal http://www.pdc.kth.se/heimdal/ + + (May be used for GSS support) Heimdal is Original BSD licensed with + the announcement clause. + +GNU GSS http://www.gnu.org/software/gss/ + + (May be used for GSS support) GNU GSS is GPL licensed. Note that you + may not distribute binary curl packages that uses this if you build + curl to also link and use any Original BSD licensed libraries! + +fbopenssl + + (Used for SPNEGO support) Unclear license. Based on its name, I assume + that it uses the OpenSSL license and thus shares the same issues as + described for OpenSSL above. + +libidn http://josefsson.org/libidn/ + + (Used for IDNA support) Uses the GNU Lesser General Public + License [3]. LGPL is a variation of GPL with slightly less aggressive + "copyleft". This license requires more requirements to be met when + distributing binaries, see the license for details. Also note that if + you distribute a binary that includes this library, you must also + include the full LGPL license text. Please properly point out what + parts of the distributed package that the license addresses. + +OpenLDAP http://www.openldap.org/software/release/license.html + + (Used for LDAP support) Uses a Modified BSD-style license. Since + libcurl uses OpenLDAP as a shared library only, I have not heard of + anyone that ships OpenLDAP linked with libcurl in an app. + +libssh2 http://www.libssh2.org/ + + (Used for scp and sftp support) libssh2 uses a Modified BSD-style + license. + +[1] = GPL - GNU General Public License: http://www.gnu.org/licenses/gpl.html +[2] = http://www.fsf.org/licenses/gpl-faq.html#GPLIncompatibleLibs details on + how to write such an exception to the GPL +[3] = LGPL - GNU Lesser General Public License: + http://www.gnu.org/licenses/lgpl.html +[4] = MPL - Mozilla Public License: + http://www.mozilla.org/MPL/ diff --git a/vendors/libcurl/docs/MANUAL b/vendors/libcurl/docs/MANUAL new file mode 100644 index 0000000..dba224d --- /dev/null +++ b/vendors/libcurl/docs/MANUAL @@ -0,0 +1,921 @@ +LATEST VERSION + + You always find news about what's going on as well as the latest versions + from the curl web pages, located at: + + http://curl.haxx.se + +SIMPLE USAGE + + Get the main page from Netscape's web-server: + + curl http://www.netscape.com/ + + Get the README file the user's home directory at funet's ftp-server: + + curl ftp://ftp.funet.fi/README + + Get a web page from a server using port 8000: + + curl http://www.weirdserver.com:8000/ + + Get a list of a directory of an FTP site: + + curl ftp://cool.haxx.se/ + + Get the definition of curl from a dictionary: + + curl dict://dict.org/m:curl + + Fetch two documents at once: + + curl ftp://cool.haxx.se/ http://www.weirdserver.com:8000/ + + Get a file off an FTPS server: + + curl ftps://files.are.secure.com/secrets.txt + + or use the more appropriate FTPS way to get the same file: + + curl --ftp-ssl ftp://files.are.secure.com/secrets.txt + + Get a file from an SSH server using SFTP: + + curl -u username sftp://shell.example.com/etc/issue + + Get a file from an SSH server using SCP using a private key to authenticate: + + curl -u username: --key ~/.ssh/id_dsa --pubkey ~/.ssh/id_dsa.pub \ + scp://shell.example.com/~/personal.txt + + +DOWNLOAD TO A FILE + + Get a web page and store in a local file: + + curl -o thatpage.html http://www.netscape.com/ + + Get a web page and store in a local file, make the local file get the name + of the remote document (if no file name part is specified in the URL, this + will fail): + + curl -O http://www.netscape.com/index.html + + Fetch two files and store them with their remote names: + + curl -O www.haxx.se/index.html -O curl.haxx.se/download.html + +USING PASSWORDS + + FTP + + To ftp files using name+passwd, include them in the URL like: + + curl ftp://name:passwd@machine.domain:port/full/path/to/file + + or specify them with the -u flag like + + curl -u name:passwd ftp://machine.domain:port/full/path/to/file + + FTPS + + It is just like for FTP, but you may also want to specify and use + SSL-specific options for certificates etc. + + Note that using FTPS:// as prefix is the "implicit" way as described in the + standards while the recommended "explicit" way is done by using FTP:// and + the --ftp-ssl option. + + HTTP + + Curl also supports user and password in HTTP URLs, thus you can pick a file + like: + + curl http://name:passwd@machine.domain/full/path/to/file + + or specify user and password separately like in + + curl -u name:passwd http://machine.domain/full/path/to/file + + HTTP offers many different methods of authentication and curl supports + several: Basic, Digest, NTLM and Negotiate. Without telling which method to + use, curl defaults to Basic. You can also ask curl to pick the most secure + ones out of the ones that the server accepts for the given URL, by using + --anyauth. + + NOTE! Since HTTP URLs don't support user and password, you can't use that + style when using Curl via a proxy. You _must_ use the -u style fetch + during such circumstances. + + HTTPS + + Probably most commonly used with private certificates, as explained below. + +PROXY + + Get an ftp file using a proxy named my-proxy that uses port 888: + + curl -x my-proxy:888 ftp://ftp.leachsite.com/README + + Get a file from a HTTP server that requires user and password, using the + same proxy as above: + + curl -u user:passwd -x my-proxy:888 http://www.get.this/ + + Some proxies require special authentication. Specify by using -U as above: + + curl -U user:passwd -x my-proxy:888 http://www.get.this/ + + curl also supports SOCKS4 and SOCKS5 proxies with --socks4 and --socks5. + + See also the environment variables Curl support that offer further proxy + control. + +RANGES + + With HTTP 1.1 byte-ranges were introduced. Using this, a client can request + to get only one or more subparts of a specified document. Curl supports + this with the -r flag. + + Get the first 100 bytes of a document: + + curl -r 0-99 http://www.get.this/ + + Get the last 500 bytes of a document: + + curl -r -500 http://www.get.this/ + + Curl also supports simple ranges for FTP files as well. Then you can only + specify start and stop position. + + Get the first 100 bytes of a document using FTP: + + curl -r 0-99 ftp://www.get.this/README + +UPLOADING + + FTP + + Upload all data on stdin to a specified ftp site: + + curl -T - ftp://ftp.upload.com/myfile + + Upload data from a specified file, login with user and password: + + curl -T uploadfile -u user:passwd ftp://ftp.upload.com/myfile + + Upload a local file to the remote site, and use the local file name remote + too: + + curl -T uploadfile -u user:passwd ftp://ftp.upload.com/ + + Upload a local file to get appended to the remote file using ftp: + + curl -T localfile -a ftp://ftp.upload.com/remotefile + + Curl also supports ftp upload through a proxy, but only if the proxy is + configured to allow that kind of tunneling. If it does, you can run curl in + a fashion similar to: + + curl --proxytunnel -x proxy:port -T localfile ftp.upload.com + + HTTP + + Upload all data on stdin to a specified http site: + + curl -T - http://www.upload.com/myfile + + Note that the http server must have been configured to accept PUT before + this can be done successfully. + + For other ways to do http data upload, see the POST section below. + +VERBOSE / DEBUG + + If curl fails where it isn't supposed to, if the servers don't let you in, + if you can't understand the responses: use the -v flag to get verbose + fetching. Curl will output lots of info and what it sends and receives in + order to let the user see all client-server interaction (but it won't show + you the actual data). + + curl -v ftp://ftp.upload.com/ + + To get even more details and information on what curl does, try using the + --trace or --trace-ascii options with a given file name to log to, like + this: + + curl --trace trace.txt www.haxx.se + + +DETAILED INFORMATION + + Different protocols provide different ways of getting detailed information + about specific files/documents. To get curl to show detailed information + about a single file, you should use -I/--head option. It displays all + available info on a single file for HTTP and FTP. The HTTP information is a + lot more extensive. + + For HTTP, you can get the header information (the same as -I would show) + shown before the data by using -i/--include. Curl understands the + -D/--dump-header option when getting files from both FTP and HTTP, and it + will then store the headers in the specified file. + + Store the HTTP headers in a separate file (headers.txt in the example): + + curl --dump-header headers.txt curl.haxx.se + + Note that headers stored in a separate file can be very useful at a later + time if you want curl to use cookies sent by the server. More about that in + the cookies section. + +POST (HTTP) + + It's easy to post data using curl. This is done using the -d + option. The post data must be urlencoded. + + Post a simple "name" and "phone" guestbook. + + curl -d "name=Rafael%20Sagula&phone=3320780" \ + http://www.where.com/guest.cgi + + How to post a form with curl, lesson #1: + + Dig out all the tags in the form that you want to fill in. (There's + a perl program called formfind.pl on the curl site that helps with this). + + If there's a "normal" post, you use -d to post. -d takes a full "post + string", which is in the format + + =&=&... + + The 'variable' names are the names set with "name=" in the tags, and + the data is the contents you want to fill in for the inputs. The data *must* + be properly URL encoded. That means you replace space with + and that you + write weird letters with %XX where XX is the hexadecimal representation of + the letter's ASCII code. + + Example: + + (page located at http://www.formpost.com/getthis/ + +
    + + + + +
    + + We want to enter user 'foobar' with password '12345'. + + To post to this, you enter a curl command line like: + + curl -d "user=foobar&pass=12345&id=blablabla&ding=submit" (continues) + http://www.formpost.com/getthis/post.cgi + + + While -d uses the application/x-www-form-urlencoded mime-type, generally + understood by CGI's and similar, curl also supports the more capable + multipart/form-data type. This latter type supports things like file upload. + + -F accepts parameters like -F "name=contents". If you want the contents to + be read from a file, use <@filename> as contents. When specifying a file, + you can also specify the file content type by appending ';type=' + to the file name. You can also post the contents of several files in one + field. For example, the field name 'coolfiles' is used to send three files, + with different content types using the following syntax: + + curl -F "coolfiles=@fil1.gif;type=image/gif,fil2.txt,fil3.html" \ + http://www.post.com/postit.cgi + + If the content-type is not specified, curl will try to guess from the file + extension (it only knows a few), or use the previously specified type (from + an earlier file if several files are specified in a list) or else it will + using the default type 'text/plain'. + + Emulate a fill-in form with -F. Let's say you fill in three fields in a + form. One field is a file name which to post, one field is your name and one + field is a file description. We want to post the file we have written named + "cooltext.txt". To let curl do the posting of this data instead of your + favourite browser, you have to read the HTML source of the form page and + find the names of the input fields. In our example, the input field names + are 'file', 'yourname' and 'filedescription'. + + curl -F "file=@cooltext.txt" -F "yourname=Daniel" \ + -F "filedescription=Cool text file with cool text inside" \ + http://www.post.com/postit.cgi + + To send two files in one post you can do it in two ways: + + 1. Send multiple files in a single "field" with a single field name: + + curl -F "pictures=@dog.gif,cat.gif" + + 2. Send two fields with two field names: + + curl -F "docpicture=@dog.gif" -F "catpicture=@cat.gif" + + To send a field value literally without interpreting a leading '@' + or '<', or an embedded ';type=', use --form-string instead of + -F. This is recommended when the value is obtained from a user or + some other unpredictable source. Under these circumstances, using + -F instead of --form-string would allow a user to trick curl into + uploading a file. + +REFERRER + + A HTTP request has the option to include information about which address + that referred to actual page. Curl allows you to specify the + referrer to be used on the command line. It is especially useful to + fool or trick stupid servers or CGI scripts that rely on that information + being available or contain certain data. + + curl -e www.coolsite.com http://www.showme.com/ + + NOTE: The referer field is defined in the HTTP spec to be a full URL. + +USER AGENT + + A HTTP request has the option to include information about the browser + that generated the request. Curl allows it to be specified on the command + line. It is especially useful to fool or trick stupid servers or CGI + scripts that only accept certain browsers. + + Example: + + curl -A 'Mozilla/3.0 (Win95; I)' http://www.nationsbank.com/ + + Other common strings: + 'Mozilla/3.0 (Win95; I)' Netscape Version 3 for Windows 95 + 'Mozilla/3.04 (Win95; U)' Netscape Version 3 for Windows 95 + 'Mozilla/2.02 (OS/2; U)' Netscape Version 2 for OS/2 + 'Mozilla/4.04 [en] (X11; U; AIX 4.2; Nav)' NS for AIX + 'Mozilla/4.05 [en] (X11; U; Linux 2.0.32 i586)' NS for Linux + + Note that Internet Explorer tries hard to be compatible in every way: + 'Mozilla/4.0 (compatible; MSIE 4.01; Windows 95)' MSIE for W95 + + Mozilla is not the only possible User-Agent name: + 'Konqueror/1.0' KDE File Manager desktop client + 'Lynx/2.7.1 libwww-FM/2.14' Lynx command line browser + +COOKIES + + Cookies are generally used by web servers to keep state information at the + client's side. The server sets cookies by sending a response line in the + headers that looks like 'Set-Cookie: ' where the data part then + typically contains a set of NAME=VALUE pairs (separated by semicolons ';' + like "NAME1=VALUE1; NAME2=VALUE2;"). The server can also specify for what + path the "cookie" should be used for (by specifying "path=value"), when the + cookie should expire ("expire=DATE"), for what domain to use it + ("domain=NAME") and if it should be used on secure connections only + ("secure"). + + If you've received a page from a server that contains a header like: + Set-Cookie: sessionid=boo123; path="/foo"; + + it means the server wants that first pair passed on when we get anything in + a path beginning with "/foo". + + Example, get a page that wants my name passed in a cookie: + + curl -b "name=Daniel" www.sillypage.com + + Curl also has the ability to use previously received cookies in following + sessions. If you get cookies from a server and store them in a file in a + manner similar to: + + curl --dump-header headers www.example.com + + ... you can then in a second connect to that (or another) site, use the + cookies from the 'headers' file like: + + curl -b headers www.example.com + + While saving headers to a file is a working way to store cookies, it is + however error-prone and not the preferred way to do this. Instead, make curl + save the incoming cookies using the well-known netscape cookie format like + this: + + curl -c cookies.txt www.example.com + + Note that by specifying -b you enable the "cookie awareness" and with -L + you can make curl follow a location: (which often is used in combination + with cookies). So that if a site sends cookies and a location, you can + use a non-existing file to trigger the cookie awareness like: + + curl -L -b empty.txt www.example.com + + The file to read cookies from must be formatted using plain HTTP headers OR + as netscape's cookie file. Curl will determine what kind it is based on the + file contents. In the above command, curl will parse the header and store + the cookies received from www.example.com. curl will send to the server the + stored cookies which match the request as it follows the location. The + file "empty.txt" may be a nonexistent file. + + Alas, to both read and write cookies from a netscape cookie file, you can + set both -b and -c to use the same file: + + curl -b cookies.txt -c cookies.txt www.example.com + +PROGRESS METER + + The progress meter exists to show a user that something actually is + happening. The different fields in the output have the following meaning: + + % Total % Received % Xferd Average Speed Time Curr. + Dload Upload Total Current Left Speed + 0 151M 0 38608 0 0 9406 0 4:41:43 0:00:04 4:41:39 9287 + + From left-to-right: + % - percentage completed of the whole transfer + Total - total size of the whole expected transfer + % - percentage completed of the download + Received - currently downloaded amount of bytes + % - percentage completed of the upload + Xferd - currently uploaded amount of bytes + Average Speed + Dload - the average transfer speed of the download + Average Speed + Upload - the average transfer speed of the upload + Time Total - expected time to complete the operation + Time Current - time passed since the invoke + Time Left - expected time left to completion + Curr.Speed - the average transfer speed the last 5 seconds (the first + 5 seconds of a transfer is based on less time of course.) + + The -# option will display a totally different progress bar that doesn't + need much explanation! + +SPEED LIMIT + + Curl allows the user to set the transfer speed conditions that must be met + to let the transfer keep going. By using the switch -y and -Y you + can make curl abort transfers if the transfer speed is below the specified + lowest limit for a specified time. + + To have curl abort the download if the speed is slower than 3000 bytes per + second for 1 minute, run: + + curl -Y 3000 -y 60 www.far-away-site.com + + This can very well be used in combination with the overall time limit, so + that the above operation must be completed in whole within 30 minutes: + + curl -m 1800 -Y 3000 -y 60 www.far-away-site.com + + Forcing curl not to transfer data faster than a given rate is also possible, + which might be useful if you're using a limited bandwidth connection and you + don't want your transfer to use all of it (sometimes referred to as + "bandwidth throttle"). + + Make curl transfer data no faster than 10 kilobytes per second: + + curl --limit-rate 10K www.far-away-site.com + + or + + curl --limit-rate 10240 www.far-away-site.com + + Or prevent curl from uploading data faster than 1 megabyte per second: + + curl -T upload --limit-rate 1M ftp://uploadshereplease.com + + When using the --limit-rate option, the transfer rate is regulated on a + per-second basis, which will cause the total transfer speed to become lower + than the given number. Sometimes of course substantially lower, if your + transfer stalls during periods. + +CONFIG FILE + + Curl automatically tries to read the .curlrc file (or _curlrc file on win32 + systems) from the user's home dir on startup. + + The config file could be made up with normal command line switches, but you + can also specify the long options without the dashes to make it more + readable. You can separate the options and the parameter with spaces, or + with = or :. Comments can be used within the file. If the first letter on a + line is a '#'-letter the rest of the line is treated as a comment. + + If you want the parameter to contain spaces, you must inclose the entire + parameter within double quotes ("). Within those quotes, you specify a + quote as \". + + NOTE: You must specify options and their arguments on the same line. + + Example, set default time out and proxy in a config file: + + # We want a 30 minute timeout: + -m 1800 + # ... and we use a proxy for all accesses: + proxy = proxy.our.domain.com:8080 + + White spaces ARE significant at the end of lines, but all white spaces + leading up to the first characters of each line are ignored. + + Prevent curl from reading the default file by using -q as the first command + line parameter, like: + + curl -q www.thatsite.com + + Force curl to get and display a local help page in case it is invoked + without URL by making a config file similar to: + + # default url to get + url = "http://help.with.curl.com/curlhelp.html" + + You can specify another config file to be read by using the -K/--config + flag. If you set config file name to "-" it'll read the config from stdin, + which can be handy if you want to hide options from being visible in process + tables etc: + + echo "user = user:passwd" | curl -K - http://that.secret.site.com + +EXTRA HEADERS + + When using curl in your own very special programs, you may end up needing + to pass on your own custom headers when getting a web page. You can do + this by using the -H flag. + + Example, send the header "X-you-and-me: yes" to the server when getting a + page: + + curl -H "X-you-and-me: yes" www.love.com + + This can also be useful in case you want curl to send a different text in a + header than it normally does. The -H header you specify then replaces the + header curl would normally send. If you replace an internal header with an + empty one, you prevent that header from being sent. To prevent the Host: + header from being used: + + curl -H "Host:" www.server.com + +FTP and PATH NAMES + + Do note that when getting files with the ftp:// URL, the given path is + relative the directory you enter. To get the file 'README' from your home + directory at your ftp site, do: + + curl ftp://user:passwd@my.site.com/README + + But if you want the README file from the root directory of that very same + site, you need to specify the absolute file name: + + curl ftp://user:passwd@my.site.com//README + + (I.e with an extra slash in front of the file name.) + +FTP and firewalls + + The FTP protocol requires one of the involved parties to open a second + connction as soon as data is about to get transfered. There are two ways to + do this. + + The default way for curl is to issue the PASV command which causes the + server to open another port and await another connection performed by the + client. This is good if the client is behind a firewall that don't allow + incoming connections. + + curl ftp.download.com + + If the server for example, is behind a firewall that don't allow connections + on other ports than 21 (or if it just doesn't support the PASV command), the + other way to do it is to use the PORT command and instruct the server to + connect to the client on the given (as parameters to the PORT command) IP + number and port. + + The -P flag to curl supports a few different options. Your machine may have + several IP-addresses and/or network interfaces and curl allows you to select + which of them to use. Default address can also be used: + + curl -P - ftp.download.com + + Download with PORT but use the IP address of our 'le0' interface (this does + not work on windows): + + curl -P le0 ftp.download.com + + Download with PORT but use 192.168.0.10 as our IP address to use: + + curl -P 192.168.0.10 ftp.download.com + +NETWORK INTERFACE + + Get a web page from a server using a specified port for the interface: + + curl --interface eth0:1 http://www.netscape.com/ + + or + + curl --interface 192.168.1.10 http://www.netscape.com/ + +HTTPS + + Secure HTTP requires SSL libraries to be installed and used when curl is + built. If that is done, curl is capable of retrieving and posting documents + using the HTTPS protocol. + + Example: + + curl https://www.secure-site.com + + Curl is also capable of using your personal certificates to get/post files + from sites that require valid certificates. The only drawback is that the + certificate needs to be in PEM-format. PEM is a standard and open format to + store certificates with, but it is not used by the most commonly used + browsers (Netscape and MSIE both use the so called PKCS#12 format). If you + want curl to use the certificates you use with your (favourite) browser, you + may need to download/compile a converter that can convert your browser's + formatted certificates to PEM formatted ones. This kind of converter is + included in recent versions of OpenSSL, and for older versions Dr Stephen + N. Henson has written a patch for SSLeay that adds this functionality. You + can get his patch (that requires an SSLeay installation) from his site at: + http://www.drh-consultancy.demon.co.uk/ + + Example on how to automatically retrieve a document using a certificate with + a personal password: + + curl -E /path/to/cert.pem:password https://secure.site.com/ + + If you neglect to specify the password on the command line, you will be + prompted for the correct password before any data can be received. + + Many older SSL-servers have problems with SSLv3 or TLS, that newer versions + of OpenSSL etc is using, therefore it is sometimes useful to specify what + SSL-version curl should use. Use -3, -2 or -1 to specify that exact SSL + version to use (for SSLv3, SSLv2 or TLSv1 respectively): + + curl -2 https://secure.site.com/ + + Otherwise, curl will first attempt to use v3 and then v2. + + To use OpenSSL to convert your favourite browser's certificate into a PEM + formatted one that curl can use, do something like this (assuming netscape, + but IE is likely to work similarly): + + You start with hitting the 'security' menu button in netscape. + + Select 'certificates->yours' and then pick a certificate in the list + + Press the 'export' button + + enter your PIN code for the certs + + select a proper place to save it + + Run the 'openssl' application to convert the certificate. If you cd to the + openssl installation, you can do it like: + + # ./apps/openssl pkcs12 -in [file you saved] -clcerts -out [PEMfile] + + +RESUMING FILE TRANSFERS + + To continue a file transfer where it was previously aborted, curl supports + resume on http(s) downloads as well as ftp uploads and downloads. + + Continue downloading a document: + + curl -C - -o file ftp://ftp.server.com/path/file + + Continue uploading a document(*1): + + curl -C - -T file ftp://ftp.server.com/path/file + + Continue downloading a document from a web server(*2): + + curl -C - -o file http://www.server.com/ + + (*1) = This requires that the ftp server supports the non-standard command + SIZE. If it doesn't, curl will say so. + + (*2) = This requires that the web server supports at least HTTP/1.1. If it + doesn't, curl will say so. + +TIME CONDITIONS + + HTTP allows a client to specify a time condition for the document it + requests. It is If-Modified-Since or If-Unmodified-Since. Curl allow you to + specify them with the -z/--time-cond flag. + + For example, you can easily make a download that only gets performed if the + remote file is newer than a local copy. It would be made like: + + curl -z local.html http://remote.server.com/remote.html + + Or you can download a file only if the local file is newer than the remote + one. Do this by prepending the date string with a '-', as in: + + curl -z -local.html http://remote.server.com/remote.html + + You can specify a "free text" date as condition. Tell curl to only download + the file if it was updated since January 12, 2012: + + curl -z "Jan 12 2012" http://remote.server.com/remote.html + + Curl will then accept a wide range of date formats. You always make the date + check the other way around by prepending it with a dash '-'. + +DICT + + For fun try + + curl dict://dict.org/m:curl + curl dict://dict.org/d:heisenbug:jargon + curl dict://dict.org/d:daniel:web1913 + + Aliases for 'm' are 'match' and 'find', and aliases for 'd' are 'define' + and 'lookup'. For example, + + curl dict://dict.org/find:curl + + Commands that break the URL description of the RFC (but not the DICT + protocol) are + + curl dict://dict.org/show:db + curl dict://dict.org/show:strat + + Authentication is still missing (but this is not required by the RFC) + +LDAP + + If you have installed the OpenLDAP library, curl can take advantage of it + and offer ldap:// support. + + LDAP is a complex thing and writing an LDAP query is not an easy task. I do + advice you to dig up the syntax description for that elsewhere. Two places + that might suit you are: + + Netscape's "Netscape Directory SDK 3.0 for C Programmer's Guide Chapter 10: + Working with LDAP URLs": + http://developer.netscape.com/docs/manuals/dirsdk/csdk30/url.htm + + RFC 2255, "The LDAP URL Format" http://curl.haxx.se/rfc/rfc2255.txt + + To show you an example, this is now I can get all people from my local LDAP + server that has a certain sub-domain in their email address: + + curl -B "ldap://ldap.frontec.se/o=frontec??sub?mail=*sth.frontec.se" + + If I want the same info in HTML format, I can get it by not using the -B + (enforce ASCII) flag. + +ENVIRONMENT VARIABLES + + Curl reads and understands the following environment variables: + + http_proxy, HTTPS_PROXY, FTP_PROXY + + They should be set for protocol-specific proxies. General proxy should be + set with + + ALL_PROXY + + A comma-separated list of host names that shouldn't go through any proxy is + set in (only an asterisk, '*' matches all hosts) + + NO_PROXY + + If a tail substring of the domain-path for a host matches one of these + strings, transactions with that node will not be proxied. + + + The usage of the -x/--proxy flag overrides the environment variables. + +NETRC + + Unix introduced the .netrc concept a long time ago. It is a way for a user + to specify name and password for commonly visited ftp sites in a file so + that you don't have to type them in each time you visit those sites. You + realize this is a big security risk if someone else gets hold of your + passwords, so therefore most unix programs won't read this file unless it is + only readable by yourself (curl doesn't care though). + + Curl supports .netrc files if told so (using the -n/--netrc and + --netrc-optional options). This is not restricted to only ftp, + but curl can use it for all protocols where authentication is used. + + A very simple .netrc file could look something like: + + machine curl.haxx.se login iamdaniel password mysecret + +CUSTOM OUTPUT + + To better allow script programmers to get to know about the progress of + curl, the -w/--write-out option was introduced. Using this, you can specify + what information from the previous transfer you want to extract. + + To display the amount of bytes downloaded together with some text and an + ending newline: + + curl -w 'We downloaded %{size_download} bytes\n' www.download.com + +KERBEROS FTP TRANSFER + + Curl supports kerberos4 and kerberos5/GSSAPI for FTP transfers. You need + the kerberos package installed and used at curl build time for it to be + used. + + First, get the krb-ticket the normal way, like with the kinit/kauth tool. + Then use curl in way similar to: + + curl --krb private ftp://krb4site.com -u username:fakepwd + + There's no use for a password on the -u switch, but a blank one will make + curl ask for one and you already entered the real password to kinit/kauth. + +TELNET + + The curl telnet support is basic and very easy to use. Curl passes all data + passed to it on stdin to the remote server. Connect to a remote telnet + server using a command line similar to: + + curl telnet://remote.server.com + + And enter the data to pass to the server on stdin. The result will be sent + to stdout or to the file you specify with -o. + + You might want the -N/--no-buffer option to switch off the buffered output + for slow connections or similar. + + Pass options to the telnet protocol negotiation, by using the -t option. To + tell the server we use a vt100 terminal, try something like: + + curl -tTTYPE=vt100 telnet://remote.server.com + + Other interesting options for it -t include: + + - XDISPLOC= Sets the X display location. + + - NEW_ENV= Sets an environment variable. + + NOTE: the telnet protocol does not specify any way to login with a specified + user and password so curl can't do that automatically. To do that, you need + to track when the login prompt is received and send the username and + password accordingly. + +PERSISTENT CONNECTIONS + + Specifying multiple files on a single command line will make curl transfer + all of them, one after the other in the specified order. + + libcurl will attempt to use persistent connections for the transfers so that + the second transfer to the same host can use the same connection that was + already initiated and was left open in the previous transfer. This greatly + decreases connection time for all but the first transfer and it makes a far + better use of the network. + + Note that curl cannot use persistent connections for transfers that are used + in subsequence curl invokes. Try to stuff as many URLs as possible on the + same command line if they are using the same host, as that'll make the + transfers faster. If you use a http proxy for file transfers, practically + all transfers will be persistent. + +MULTIPLE TRANSFERS WITH A SINGLE COMMAND LINE + + As is mentioned above, you can download multiple files with one command line + by simply adding more URLs. If you want those to get saved to a local file + instead of just printed to stdout, you need to add one save option for each + URL you specify. Note that this also goes for the -O option. + + For example: get two files and use -O for the first and a custom file + name for the second: + + curl -O http://url.com/file.txt ftp://ftp.com/moo.exe -o moo.jpg + + You can also upload multiple files in a similar fashion: + + curl -T local1 ftp://ftp.com/moo.exe -T local2 ftp://ftp.com/moo2.txt + +MAILING LISTS + + For your convenience, we have several open mailing lists to discuss curl, + its development and things relevant to this. Get all info at + http://curl.haxx.se/mail/. Some of the lists available are: + + curl-users + + Users of the command line tool. How to use it, what doesn't work, new + features, related tools, questions, news, installations, compilations, + running, porting etc. + + curl-library + + Developers using or developing libcurl. Bugs, extensions, improvements. + + curl-announce + + Low-traffic. Only receives announcements of new public versions. At worst, + that makes something like one or two mails per month, but usually only one + mail every second month. + + curl-and-php + + Using the curl functions in PHP. Everything curl with a PHP angle. Or PHP + with a curl angle. + + curl-and-python + + Python hackers using curl with or without the python binding pycurl. + + Please direct curl questions, feature requests and trouble reports to one of + these mailing lists instead of mailing any individual. diff --git a/vendors/libcurl/docs/Makefile.am b/vendors/libcurl/docs/Makefile.am new file mode 100644 index 0000000..345e021 --- /dev/null +++ b/vendors/libcurl/docs/Makefile.am @@ -0,0 +1,41 @@ +# +# $Id: Makefile.am,v 1.36 2005/10/28 21:34:51 bagder Exp $ +# + +AUTOMAKE_OPTIONS = foreign no-dependencies + +man_MANS = curl.1 curl-config.1 +GENHTMLPAGES = curl.html curl-config.html +PDFPAGES = curl.pdf curl-config.pdf + +HTMLPAGES = $(GENHTMLPAGES) index.html + +SUBDIRS = examples libcurl + +CLEANFILES = $(GENHTMLPAGES) $(PDFPAGES) + +EXTRA_DIST = MANUAL BUGS CONTRIBUTE FAQ FEATURES INTERNALS SSLCERTS \ + README.win32 RESOURCES TODO TheArtOfHttpScripting THANKS VERSIONS \ + KNOWN_BUGS BINDINGS $(man_MANS) $(HTMLPAGES) HISTORY INSTALL \ + $(PDFPAGES) LICENSE-MIXING README.netware DISTRO-DILEMMA INSTALL.devcpp + +MAN2HTML= roffit < $< >$@ + +SUFFIXES = .1 .html .pdf + +html: $(HTMLPAGES) + cd libcurl; make html + +pdf: $(PDFPAGES) + cd libcurl; make pdf + +.1.html: + $(MAN2HTML) + +.1.pdf: + @(foo=`echo $@ | sed -e 's/\.[0-9]$$//g'`; \ + groff -Tps -man $< >$$foo.ps; \ + ps2pdf $$foo.ps $@; \ + rm $$foo.ps; \ + echo "converted $< to $@") + diff --git a/vendors/libcurl/docs/Makefile.in b/vendors/libcurl/docs/Makefile.in new file mode 100644 index 0000000..8456b0b --- /dev/null +++ b/vendors/libcurl/docs/Makefile.in @@ -0,0 +1,608 @@ +# Makefile.in generated by automake 1.9.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# +# $Id: Makefile.am,v 1.36 2005/10/28 21:34:51 bagder Exp $ +# +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = docs +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in INSTALL \ + THANKS TODO +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/lib/config.h \ + $(top_builddir)/src/config.h +CONFIG_CLEAN_FILES = +depcomp = +am__depfiles_maybe = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-exec-recursive install-info-recursive \ + install-recursive installcheck-recursive installdirs-recursive \ + pdf-recursive ps-recursive uninstall-info-recursive \ + uninstall-recursive +man1dir = $(mandir)/man1 +am__installdirs = "$(DESTDIR)$(man1dir)" +MANS = $(man_MANS) +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CABUNDLE_FALSE = @CABUNDLE_FALSE@ +CABUNDLE_TRUE = @CABUNDLE_TRUE@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CROSSCOMPILING_FALSE = @CROSSCOMPILING_FALSE@ +CROSSCOMPILING_TRUE = @CROSSCOMPILING_TRUE@ +CURL_CA_BUNDLE = @CURL_CA_BUNDLE@ +CURL_DISABLE_DICT = @CURL_DISABLE_DICT@ +CURL_DISABLE_FILE = @CURL_DISABLE_FILE@ +CURL_DISABLE_FTP = @CURL_DISABLE_FTP@ +CURL_DISABLE_HTTP = @CURL_DISABLE_HTTP@ +CURL_DISABLE_LDAP = @CURL_DISABLE_LDAP@ +CURL_DISABLE_LDAPS = @CURL_DISABLE_LDAPS@ +CURL_DISABLE_TELNET = @CURL_DISABLE_TELNET@ +CURL_DISABLE_TFTP = @CURL_DISABLE_TFTP@ +CURL_LIBS = @CURL_LIBS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GREP = @GREP@ +HAVE_ARES = @HAVE_ARES@ +HAVE_LIBZ = @HAVE_LIBZ@ +HAVE_LIBZ_FALSE = @HAVE_LIBZ_FALSE@ +HAVE_LIBZ_TRUE = @HAVE_LIBZ_TRUE@ +HAVE_PK11_CREATEGENERICOBJECT = @HAVE_PK11_CREATEGENERICOBJECT@ +IDN_ENABLED = @IDN_ENABLED@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +IPV6_ENABLED = @IPV6_ENABLED@ +KRB4_ENABLED = @KRB4_ENABLED@ +LDFLAGS = @LDFLAGS@ +LIBCURL_LIBS = @LIBCURL_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MANOPT = @MANOPT@ +MIMPURE_FALSE = @MIMPURE_FALSE@ +MIMPURE_TRUE = @MIMPURE_TRUE@ +NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@ +NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@ +NROFF = @NROFF@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PKGADD_NAME = @PKGADD_NAME@ +PKGADD_PKG = @PKGADD_PKG@ +PKGADD_VENDOR = @PKGADD_VENDOR@ +PKGCONFIG = @PKGCONFIG@ +RANDOM_FILE = @RANDOM_FILE@ +RANLIB = @RANLIB@ +REQUIRE_LIB_DEPS = @REQUIRE_LIB_DEPS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SSL_ENABLED = @SSL_ENABLED@ +STATICLIB_FALSE = @STATICLIB_FALSE@ +STATICLIB_TRUE = @STATICLIB_TRUE@ +STRIP = @STRIP@ +TEST_SERVER_LIBS = @TEST_SERVER_LIBS@ +USE_GNUTLS = @USE_GNUTLS@ +USE_LIBSSH2 = @USE_LIBSSH2@ +USE_MANUAL_FALSE = @USE_MANUAL_FALSE@ +USE_MANUAL_TRUE = @USE_MANUAL_TRUE@ +USE_NSS = @USE_NSS@ +USE_SSLEAY = @USE_SSLEAY@ +USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@ +VERSION = @VERSION@ +VERSIONNUM = @VERSIONNUM@ +ac_ct_CC = @ac_ct_CC@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +libext = @libext@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +subdirs = @subdirs@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +AUTOMAKE_OPTIONS = foreign no-dependencies +man_MANS = curl.1 curl-config.1 +GENHTMLPAGES = curl.html curl-config.html +PDFPAGES = curl.pdf curl-config.pdf +HTMLPAGES = $(GENHTMLPAGES) index.html +SUBDIRS = examples libcurl +CLEANFILES = $(GENHTMLPAGES) $(PDFPAGES) +EXTRA_DIST = MANUAL BUGS CONTRIBUTE FAQ FEATURES INTERNALS SSLCERTS \ + README.win32 RESOURCES TODO TheArtOfHttpScripting THANKS VERSIONS \ + KNOWN_BUGS BINDINGS $(man_MANS) $(HTMLPAGES) HISTORY INSTALL \ + $(PDFPAGES) LICENSE-MIXING README.netware DISTRO-DILEMMA INSTALL.devcpp + +MAN2HTML = roffit < $< >$@ +SUFFIXES = .1 .html .pdf +all: all-recursive + +.SUFFIXES: +.SUFFIXES: .1 .html .pdf +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign docs/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign docs/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: +install-man1: $(man1_MANS) $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man1dir)" || $(mkdir_p) "$(DESTDIR)$(man1dir)" + @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ + l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ + for i in $$l2; do \ + case "$$i" in \ + *.1*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ + else file=$$i; fi; \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + case "$$ext" in \ + 1*) ;; \ + *) ext='1' ;; \ + esac; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed -e 's/^.*\///'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ + done +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ + l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ + for i in $$l2; do \ + case "$$i" in \ + *.1*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + case "$$ext" in \ + 1*) ;; \ + *) ext='1' ;; \ + esac; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed -e 's/^.*\///'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ + rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ + done + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(mkdir_p) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile $(MANS) +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(man1dir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-libtool \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +info: info-recursive + +info-am: + +install-data-am: install-man + +install-exec-am: + +install-info: install-info-recursive + +install-man: install-man1 + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-info-am uninstall-man + +uninstall-info: uninstall-info-recursive + +uninstall-man: uninstall-man1 + +.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ + clean clean-generic clean-libtool clean-recursive ctags \ + ctags-recursive distclean distclean-generic distclean-libtool \ + distclean-recursive distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-exec install-exec-am install-info \ + install-info-am install-man install-man1 install-strip \ + installcheck installcheck-am installdirs installdirs-am \ + maintainer-clean maintainer-clean-generic \ + maintainer-clean-recursive mostlyclean mostlyclean-generic \ + mostlyclean-libtool mostlyclean-recursive pdf pdf-am ps ps-am \ + tags tags-recursive uninstall uninstall-am uninstall-info-am \ + uninstall-man uninstall-man1 + + +html: $(HTMLPAGES) + cd libcurl; make html + +pdf: $(PDFPAGES) + cd libcurl; make pdf + +.1.html: + $(MAN2HTML) + +.1.pdf: + @(foo=`echo $@ | sed -e 's/\.[0-9]$$//g'`; \ + groff -Tps -man $< >$$foo.ps; \ + ps2pdf $$foo.ps $@; \ + rm $$foo.ps; \ + echo "converted $< to $@") +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/vendors/libcurl/docs/README.netware b/vendors/libcurl/docs/README.netware new file mode 100644 index 0000000..00a241e --- /dev/null +++ b/vendors/libcurl/docs/README.netware @@ -0,0 +1,27 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + +README.netware + + Read the README file first. + + Curl has been successfully compiled with gcc / nlmconv on different flavours + of Linux as well as with the official Metrowerks CodeWarrior compiler. + While not being the main development target, a continously growing share of + curl users are NetWare-based, specially also consuming the lib from PHP. + + The unix-style man pages are tricky to read on windows, so therefore are all + those pages converted to HTML as well as pdf, and included in the release + archives. + + The main curl.1 man page is also "built-in" in the command line tool. Use a + command line similar to this in order to extract a separate text file: + + curl -M >manual.txt + + Read the INSTALL file for instructions how to compile curl self. + + diff --git a/vendors/libcurl/docs/README.win32 b/vendors/libcurl/docs/README.win32 new file mode 100644 index 0000000..ec7a268 --- /dev/null +++ b/vendors/libcurl/docs/README.win32 @@ -0,0 +1,26 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + +README.win32 + + Read the README file first. + + Curl has been compiled, built and run on all sorts of Windows and win32 + systems. While not being the main develop target, a fair share of curl users + are win32-based. + + The unix-style man pages are tricky to read on windows, so therefore are all + those pages converted to HTML as well as pdf, and included in the release + archives. + + The main curl.1 man page is also "built-in" in the command line tool. Use a + command line similar to this in order to extract a separate text file: + + curl -M >manual.txt + + Read the INSTALL file for instructions how to compile curl self. + + diff --git a/vendors/libcurl/docs/RESOURCES b/vendors/libcurl/docs/RESOURCES new file mode 100644 index 0000000..408efe1 --- /dev/null +++ b/vendors/libcurl/docs/RESOURCES @@ -0,0 +1,72 @@ + _ _ ____ _ + Project ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + + +This document lists documents and standards used by curl. + + RFC 959 - The FTP protocol + + RFC 1635 - How to Use Anonymous FTP + + RFC 1738 - Uniform Resource Locators + + RFC 1777 - defines the LDAP protocol + + RFC 1808 - Relative Uniform Resource Locators + + RFC 1867 - Form-based File Upload in HTML + + RFC 1950 - ZLIB Compressed Data Format Specification + + RFC 1951 - DEFLATE Compressed Data Format Specification + + RFC 1952 - gzip compression format + + RFC 1959 - LDAP URL syntax + + RFC 2045-2049 - Everything you need to know about MIME! (needed for form + based upload) + + RFC 2068 - HTTP 1.1 (obsoleted by RFC 2616) + + RFC 2109 - HTTP State Management Mechanism (cookie stuff) + - Also, read Netscape's specification at + http://curl.haxx.se/rfc/cookie_spec.html + + RFC 2183 - The Content-Disposition Header Field + + RFC 2229 - A Dictionary Server Protocol + + RFC 2255 - Newer LDAP URL syntax document. + + RFC 2231 - MIME Parameter Value and Encoded Word Extensions: + Character Sets, Languages, and Continuations + + RFC 2388 - "Returning Values from Forms: multipart/form-data" + Use this as an addition to the RFC1867 + + RFC 2396 - "Uniform Resource Identifiers: Generic Syntax and Semantics" This + one obsoletes RFC 1738, but since RFC 1738 is often mentioned + I've left it in this list. + + RFC 2428 - FTP Extensions for IPv6 and NATs + + RFC 2577 - FTP Security Considerations + + RFC 2616 - HTTP 1.1, the latest + + RFC 2617 - HTTP Authentication + + RFC 2718 - Guidelines for new URL Schemes + + RFC 2732 - Format for Literal IPv6 Addresses in URL's + + RFC 2818 - HTTP Over TLS (TLS is the successor to SSL) + + RFC 2964 - Use of HTTP State Management + + RFC 2965 - HTTP State Management Mechanism. Cookies. Obsoletes RFC2109 + diff --git a/vendors/libcurl/docs/SSLCERTS b/vendors/libcurl/docs/SSLCERTS new file mode 100644 index 0000000..3109cdd --- /dev/null +++ b/vendors/libcurl/docs/SSLCERTS @@ -0,0 +1,92 @@ + Peer SSL Certificate Verification + ================================= + +libcurl performs peer SSL certificate verification by default. This is done by +installing a default CA cert bundle on 'make install' (or similar), that CA +bundle package is used by default on operations against SSL servers. + +If you communicate with HTTPS or FTPS servers using certificates that are +signed by CAs present in the bundle, you can be sure that the remote server +really is the one it claims to be. + +If the remote server uses a self-signed certificate, if you don't install +curl's CA cert bundle, if the server uses a certificate signed by a CA that +isn't included in the bundle or if the remote host is an impostor +impersonating your favorite site, and you want to transfer files from this +server, do one of the following: + + 1. Tell libcurl to *not* verify the peer. With libcurl you disable with with + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE); + + With the curl command line tool, you disable this with -k/--insecure. + + 2. Get a CA certificate that can verify the remote server and use the proper + option to point out this CA cert for verification when connecting. For + libcurl hackers: curl_easy_setopt(curl, CURLOPT_CAPATH, capath); + + With the curl command line tool: --cacert [file] + + 3. Add the CA cert for your server to the existing default CA cert bundle. + The default path of the CA bundle installed with the curl package is: + /usr/local/share/curl/curl-ca-bundle.crt, which can be changed by running + configure with the --with-ca-bundle option pointing out the path of your + choice. + + To do this, you need to get the CA cert for your server in PEM format and + then append that to your CA cert bundle. + + If you use Internet Explorer, this is one way to get extract the CA cert + for a particular server: + + o View the certificate by double-clicking the padlock + o Find out where the CA certificate is kept (Certificate> + Authority Information Access>URL) + o Get a copy of the crt file using curl + o Convert it from crt to PEM using the openssl tool: + openssl x509 -inform DES -in yourdownloaded.crt \ + -out outcert.pem -text + o Append the 'outcert.pem' to the CA cert bundle or use it stand-alone + as described below. + + (Thanks to Frankie V for this description) + + If you use the 'openssl' tool, this is one way to get extract the CA cert + for a particular server: + + o openssl s_client -connect xxxxx.com:443 |tee logfile + o type "QUIT", followed by the "ENTER" key + o The certificate will have "BEGIN CERTIFICATE" and "END CERTIFICATE" + markers. + o If you want to see the data in the certificate, you can do: "openssl + x509 -inform PEM -in certfile -text -out certdata" where certfile is + the cert you extracted from logfile. Look in certdata. + o If you want to trust the certificate, you can append it to your + cert_bundle or use it stand-alone as described. Just remember that the + security is no better than the way you obtained the certificate. + + (Thanks to Doug Kaufman for this description) + + 4. If you're using the curl command line tool, you can specify your own CA + cert path by setting the environment variable CURL_CA_BUNDLE to the path + of your choice. + + If you're using the curl command line tool on Windows, curl will search + for a CA cert file named "curl-ca-bundle.crt" in these directories and in + this order: + 1. application's directory + 2. current working directory + 3. Windows System directory (e.g. C:\windows\system32) + 4. Windows Directory (e.g. C:\windows) + 5. all directories along %PATH% + + 5. Get a better/different/newer CA cert bundle! One option is to extract the + one a recent Mozilla browser uses, by following the instruction found + here: + + http://curl.haxx.se/docs/caextract.html + +Neglecting to use one of the above methods when dealing with a server using a +certificate that isn't signed by one of the certificates in the installed CA +cert bundle, will cause SSL to report an error ("certificate verify failed") +during the handshake and SSL will then refuse further communication with that +server. diff --git a/vendors/libcurl/docs/THANKS b/vendors/libcurl/docs/THANKS new file mode 100644 index 0000000..41fb8c6 --- /dev/null +++ b/vendors/libcurl/docs/THANKS @@ -0,0 +1,603 @@ + This project has been alive for many years. Countless people have provided + feedback that have improved curl. Here follows a list of people that have + contributed (a-z order). + + If you have contributed but are missing here, please let us know! + +Adam D. Moss +Adam Piggott +Adrian Schuur +Alan Pinstein +Albert Chin-A-Young +Albert Choy +Ale Vesely +Aleksandar Milivojevic +Alex Fishman +Alex Neblett +Alex Suykov +Alex aka WindEagle +Alexander Kourakos +Alexander Krasnostavsky +Alexander Lazic +Alexander Zhuravlev +Alexey Pesternikov +Alexey Simak +Alexis Carvalho +Allen Pulsifer +Amol Pattekar +Anders Gustafsson +Andi Jahja +Andre Guibert de Bruet +Andreas Damm +Andreas Ntaflos +Andreas Olsson +Andreas Rieke +Andres Garcia +Andrew Benham +Andrew Biggs +Andrew Bushnell +Andrew Francis +Andrew Fuller +Andrew Wansink +Andrs Garca +Andy Cedilnik +Andy Serpa +Angus Mackay +Antoine Calando +Anton Kalmykov +Arkadiusz Miskiewicz +Armel Asselin +Arve Knudsen +Ates Goral +Augustus Saunders +Avery Fay +Ben Greear +Ben Madsen +Benjamin Gerard +Bernard Leak +Bertrand Demiddelaer +Bjorn Reese +Bjrn Stenberg +Bob Schader +Bogdan Nicula +Brad Burdick +Bradford Bruce +Brendan Jurd +Brent Beardsley +Brian Akins +Brian Dessent +Brian R Duffy +Bruce Mitchener +Bryan Henderson +Bryan Kemp +Caolan McNamara +Casey O'Donnell +Chih-Chung Chang +Chris "Bob Bob" +Chris Combes +Chris Flerackers +Chris Gaukroger +Chris Maltby +Christian Kurz +Christian Robottom Reis +Christian Vogt +Christophe Demory +Christophe Legry +Christopher R. Palmer +Ciprian Badescu +Clarence Gardner +Clifford Wolf +Cody Jones +Colin Hogben +Colin Watson +Colm Buckley +Cory Nelson +Craig Davison +Craig Markwardt +Cris Bailiff +Cyrill Osterwalder +Damien Adant +Dan Becker +Dan C +Dan Fandrich +Dan Nelson +Dan Torop +Dan Zitter +Daniel Black +Daniel Cater +Daniel Johnson +Daniel Stenberg +Daniel at touchtunes +Darryl House +Dave Dribin +Dave Halbakken +Dave Hamilton +Dave May +Dave Vasilevsky +David Byron +David Cohen +David Eriksson +David Houlder +David Hull +David J Meyer +David James +David Kimdon +David Lang +David LeBlanc +David McCreedy +David Odin +David Phillips +David Shaw +David Tarendash +David Thiel +David Yan +Detlef Schmier +Diego Casorran +Dima Barsky +Dimitris Sarris +Dinar +Dirk Eddelbuettel +Dirk Manske +Dmitriy Sergeyev +Dmitry Bartsevich +Dmitry Rechkin +Dolbneff A.V +Domenico Andreoli +Dominick Meglio +Doug Kaufman +Doug Porter +Douglas E. Wegscheid +Douglas R. Horner +Dov Murik +Duane Cathey +Duncan Mac-Vicar Prett +Dustin Boswell +Dylan Ellicott +Dylan Salisbury +Early Ehlinger +Edin Kadribasic +Ellis Pritchard +Emiliano Ida +Enrico Scholz +Enrik Berkhan +Eric Cooper +Eric Lavigne +Eric Melville +Eric Rautman +Eric Thelin +Eric Vergnaud +Eric Young +Erick Nuwendam +Erwan Legrand +Erwin Authried +Eugene Kotlyarov +Evan Jordan +Eygene Ryabinkin +Fabrizio Ammollo +Fedor Karpelevitch +Felix von Leitner +Feng Tu +Florian Schoppmann +Forrest Cahoon +Frank Hempel +Frank Keeney +Frank Ticheler +Fred New +Fred Noz +Frederic Lepied +Gautam Mani +Gavrie Philipson +Gaz Iqbal +Georg Horn +Georg Huettenegger +Georg Wicherski +Gerd v. Egidy +Gerhard Herre +Gerrit Bruchhuser +Giancarlo Formicuccia +Giaslas Georgios +Gilad +Gilbert Ramirez Jr. +Gisle Vanem +Giuseppe Attardi +Giuseppe D'Ambrosio +Glen Nakamura +Glen Scott +Greg Hewgill +Greg Morse +Greg Onufer +Greg Zavertnik +Grigory Entin +Guenole Bescon +Guillaume Arluison +Gustaf Hui +Gwenole Beauchesne +Gtz Babin-Ebell +Gnter Knauf +Hamish Mackenzie +Hang Kin Lau +Hanno Kranzhoff +Hans Steegers +Hardeep Singh +Harshal Pradhan +Heikki Korpela +Henrik Storner +Hzhijun +Ian Ford +Ian Gulliver +Ian Turner +Ian Wilkes +Ignacio Vazquez-Abrams +Igor Polyakov +Ilguiz Latypov +Ilja van Sprundel +Immanuel Gregoire +Ingmar Runge +Ingo Ralf Blum +Ingo Wilken +Jacky Lam +Jacob Meuser +James Bursa +James Clancy +James Cone +James Gallagher +James Griffiths +James Housley +James MacMillan +Jamie Lokier +Jamie Newton +Jamie Wilkinson +Jan Kunder +Jared Lundell +Jari Sundell +Jason S. Priebe +Jay Austin +Jayesh A Shah +Jaz Fresh +Jean Jacques Drouin +Jean-Claude Chauve +Jean-Louis Lemaire +Jean-Marc Ranger +Jean-Philippe Barrette-LaPierre +Jeff Lawson +Jeff Phillips +Jeff Pohlmeyer +Jeffrey Pohlmeyer +Jeremy Friesner +Jesper Jensen +Jesse Noller +Jim Drash +Joe Halpin +Joel Chen +Jofell Gallardo +Johan Anderson +Johan Nilsson +John Crow +John Janssen +John Kelly +John Lask +John McGowan +Johnny Luong +Jon Grubbs +Jon Travis +Jon Turner +Jonas Forsman +Jonatan Lander +Jonathan Hseu +Jongki Suwandi +Jose Kahan +Josh Kapell +Juan F. Codagnone +Juan Ignacio Hervs +Juergen Wilke +Jukka Pihl +Julian Noble +Jun-ichiro itojun Hagino +Jurij Smakov +Justin Fletcher +Jrg Mueller-Tolk +Jrn Hartroth +Kai Sommerfeld +Kai-Uwe Rommel +Kang-Jin Lee +Karl Moerder +Karol Pietrzak +Katie Wang +Kees Cook +Keith MacDonald +Keith McGuigan +Ken Hirsch +Ken Rastatter +Kent Boortz +Kevin Fisk +Kevin Lussier +Kevin Roth +Kim Rinnewitz +Kimmo Kinnunen +Kjell Ericson +Kjetil Jacobsen +Klevtsov Vadim +Kris Kennaway +Krishnendu Majumdar +Kristian Gunstone +Kristian Khntopp +Kyle Sallee +Lachlan O'Dea +Larry Campbell +Larry Fahnoe +Lars Gustafsson +Lars J. Aas +Lars Nilsson +Lars Torben Wilson +Legoff Vincent +Lehel Bernadt +Len Krause +Linas Vepstas +Ling Thio +Linus Nielsen Feltzing +Loic Dachary +Loren Kirkby +Luca Altea +Luca Alteas +Lucas Adamski +Lukasz Czekierda +Luke Call +Luong Dinh Dung +Maciej Karpiuk +Maciej W. Rozycki +Manfred Schwarb +Marc Boucher +Marcelo Juchem +Marcin Konicki +Marco G. Salvagno +Marcus Webster +Mario Schroeder +Mark Butler +Mark Davies +Mark Eichin +Mark Lentczner +Markus Koetter +Markus Moeller +Markus Oberhumer +Martijn Koster +Martin C. Martin +Martin Hedenfalk +Martin Skinner +Marty Kuhrt +Maruko +Massimiliano Ziccardi +Mathias Axelsson +Mats Lidell +Matt Kraai +Matt Veenstra +Matt Witherspoon +Matthew Blain +Matthew Clarke +Maurice Barnum +Max Katsev +Mekonikum +Mettgut Jamalla +Michael Benedict +Michael Curtis +Michael Jahn +Michael Jerris +Michael Mealling +Michael Wallner +Michal Bonino +Michal Marek +Michele Bini +Mihai Ionescu +Mikael Sennerholm +Mike Bytnar +Mike Dobbs +Mike Protts +Miklos Nemeth +Mitz Wark +Mohamed Lrhazi +Mohun Biswas +Moonesamy +Nathan O'Sullivan +Nathanael Nerode +Naveen Noel +Neil Dunbar +Neil Spring +Nic Roets +Nick Gimbrone +Nick Humfrey +Nick Zitzmann +Nico Baggus +Nicolas Berloquin +Nicolas Croiset +Nicolas Franois +Niels van Tongeren +Nikita Schmidt +Nir Soffer +Nis Jorgensen +Nodak Sodak +Norbert Novotny +Ofer +Olaf Stueben +Olaf Stben +Oren Tirosh +P R Schaffner +Patrick Bihan-Faou +Patrick Monnerat +Patrick Smith +Paul Harrington +Paul Marquis +Paul Moore +Paul Nolan +Paul Querna +Pavel Cenek +Pavel Orehov +Pawel A. Gajda +Pedro Neves +Pete Su +Peter Bray +Peter Forret +Peter Heuchert +Peter O'Gorman +Peter Pentchev +Peter Silva +Peter Su +Peter Sylvester +Peter Todd +Peter Verhas +Peter Wullinger +Peteris Krumins +Phil Karn +Philip Gladstone +Philip Langdale +Philippe Hameau +Philippe Raoult +Philippe Vaucher +Pierre +Puneet Pawaia +Quagmire +Rafael Sagula +Ralf S. Engelschall +Ralph Beckmann +Ralph Mitchell +Ramana Mokkapati +Randy McMurchy +Ravi Pratap +Reinout van Schouwen +Renaud Chaillat +Renaud Duhaut +Rene Bernhardt +Rene Rebe +Ricardo Cadime +Rich Gray +Rich Rauenzahn +Richard Archer +Richard Atterer +Richard Bramante +Richard Clayton +Richard Cooper +Richard Gorton +Richard Prescott +Rick Jones +Rick Richardson +Rob Crittenden +Rob Jones +Rob Stanzel +Robert A. Monat +Robert D. Young +Robert Foreman +Robert Iakobashvili +Robert Olson +Robert Weaver +Robin Kay +Robson Braga Araujo +Rodney Simmons +Roland Blom +Roland Krikava +Roland Zimmermann +Roman Koifman +Ron Zapp +Rosimildo da Silva +Roy Shan +Rune Kleveland +Ryan Nelson +S. Moonesamy +Salvador Dvila +Salvatore Sorrentino +Sampo Kellomaki +Samuel Daz Garca +Samuel Listopad +Sander Gates +Saul good +Scott Cantor +Scott Davis +Sebastien Willemijns +Sergio Ballestrero +Seshubabu Pasam +Sh Diao +Shard +Shawn Poulson +Shmulik Regev +Siddhartha Prakash Jain +Simon Dick +Simon Josefsson +Simon Liu +Song Ma +Sonia Subramanian +Spiridonoff A.V +Stadler Stephan +Stefan Esser +Stefan Krause +Stefan Ulrich +Stephan Bergmann +Stephen Kick +Stephen More +Sterling Hughes +Steve Green +Steve Lhomme +Steve Little +Steve Marx +Steve Oliphant +Steven Bazyl +Steven G. Johnson +Stoned Elipot +Sven Neuhaus +Sbastien Willemijns +T. Bharath +T. Yamada +Temprimus +Thomas J. Moore +Thomas Klausner +Thomas Schwinge +Thomas Tonino +Tim Baker +Tim Bartley +Tim Costello +Tim Sneddon +Tobias Rundstrm +Toby Peterson +Todd Kulesza +Todd Vierling +Tom Benoist +Tom Lee +Tom Mattison +Tom Moers +Tom Regner +Tom Zerucha +Tomas Pospisek +Tomas Szepe +Tomasz Lacki +Tommy Tam +Ton Voon +Toon Verwaest +Tor Arntsen +Torsten Foertsch +Toshiyuki Maezawa +Traian Nicolescu +Troels Walsted Hansen +Troy Engel +Tupone Alfredo +Ulf Hrnhammar +Ulrich Zadow +Venkat Akella +Victor Snezhko +Vilmos Nebehaj +Vincent Bronner +Vincent Penquerc'h +Vincent Sanders +Vladimir Lazarenko +Vojtech Janota +Vojtech Minarik +Walter J. Mack +Wayne Haigh +Werner Koch +Wesley Laxton +Wez Furlong +Wilfredo Sanchez +Wojciech Zwiefka +Xavier Bouchoux +Yang Tse +Yarram Sunil +Yves Lejeune +Zvi Har'El +nk +swalkaus at yahoo.com +tommink[at]post.pl diff --git a/vendors/libcurl/docs/TODO b/vendors/libcurl/docs/TODO new file mode 100644 index 0000000..e5a3df6 --- /dev/null +++ b/vendors/libcurl/docs/TODO @@ -0,0 +1,572 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + + Things that could be nice to do in the future + + Things to do in project cURL. Please tell us what you think, contribute and + send us patches that improve things! + + All bugs documented in the KNOWN_BUGS document are subject for fixing! + + 1. libcurl + 1.1 Zero-copy interface + 1.2 More data sharing + 1.3 struct lifreq + 1.4 Get IP address + 1.5 c-ares ipv6 + 1.6 configure-based info in public headers + + 2. libcurl - multi interface + 2.1 More non-blocking + 2.2 Pause transfers + 2.3 Remove easy interface internally + 2.4 Avoid having to remove/readd handles + + 3. Documentation + 3.1 More and better + + 4. FTP + 4.1 PRET + 4.2 Alter passive/active on failure and retry + 4.3 Earlier bad letter detection + 4.4 REST for large files + 4.5 FTP proxy support + 4.6 PORT port range + 4.7 ASCII support + + 5. HTTP + 5.1 Other HTTP versions with CONNECT + 5.2 Better persistancy for HTTP 1.0 + 5.3 support FF3 sqlite cookie files + + 6. TELNET + 6.1 ditch stdin + 6.2 ditch telnet-specific select + + 7. SSL + 7.1 Disable specific versions + 7.2 Provide mytex locking API + 7.3 dumpcert + 7.4 Evaluate SSL patches + 7.5 Cache OpenSSL contexts + 7.6 Export session ids + 7.7 Provide callback for cert verfication + 7.8 Support other SSL libraries + 7.9 Support SRP on the TLS layer + 7.10 improve configure --with-ssl + + 8. GnuTLS + 8.1 Make NTLM work without OpenSSL functions + 8.2 SSl engine stuff + 8.3 SRP + 8.4 non-blocking + 8.5 check connection + + 9. LDAP + 9.1 ditch ldap-specific select + + 10. New protocols + 10.1 RTSP + 10.2 RSYNC + 10.3 RTMP + + 11. Client + 11.1 Content-Disposition + 11.2 sync + 11.3 glob posts + 11.4 prevent file overwriting + 11.5 ftp wildcard download + 11.6 simultaneous parallel transfers + 11.7 provide formpost headers + 11.8 url-specific options + + 12. Build + 12.1 roffit + + 13. Test suite + 13.1 SSL tunnel + 13.2 nicer lacking perl message + 13.3 more protocols supported + 13.4 more platforms supported + + 14. Next SONAME bump + 14.1 http-style HEAD output for ftp + 14.2 combine error codes + 14.3 extend CURLOPT_SOCKOPTFUNCTION prototype + + 15. Next major release + 15.1 cleanup return codes + 15.2 remove obsolete defines + 15.3 size_t + 15.4 remove several functions + 15.5 remove CURLOPT_FAILONERROR + 15.6 remove CURLOPT_DNS_USE_GLOBAL_CACHE + +============================================================================== + +1. libcurl + +1.1 Zero-copy interface + + Introdue another callback interface for upload/download that makes one less + copy of data and thus a faster operation. + [http://curl.haxx.se/dev/no_copy_callbacks.txt] + +1.2 More data sharing + + curl_share_* functions already exist and work, and they can be extended to + share more. For example, enable sharing of the ares channel and the + connection cache. + +1.3 struct lifreq + + Use 'struct lifreq' and SIOCGLIFADDR instead of 'struct ifreq' and + SIOCGIFADDR on newer Solaris versions as they claim the latter is obsolete. + To support ipv6 interface addresses for network interfaces properly. + +1.4 Get IP address + + Add the following to curl_easy_getinfo(): GET_HTTP_IP, GET_FTP_IP and + GET_FTP_DATA_IP. Return a string with the used IP. + +1.5 c-ares ipv6 + + Make libcurl built with c-ares use c-ares' IPv6 abilities. They weren't + present when we first added c-ares support but they have been added since! + When this is done and works, we can actually start considering making c-ares + powered libcurl the default build (which of course would require that we'd + bundle the c-ares source code in the libcurl source code releases). + +1.6 configure-based info in public headers + + Make the public headers include the proper system includes based on what was + present at the time when configure was run. Currently, the sys/select.h + header is for example included by curl/multi.h only on specific platforms we + know MUST have it. This is error-prone. We therefore want the header files to + adapt to configure results. Those results must be stored in a new header and + they must use a curl name space, i.e not be HAVE_* prefix (as that would risk + collide with other apps that use libcurl and that runs configure). + + Work on this has been started but hasn't been finished, and the initial patch + and some details are found here: + http://curl.haxx.se/mail/lib-2006-12/0084.html + + The remaining problems to solve involve the platforms that can't run + configure. + +2. libcurl - multi interface + +2.1 More non-blocking + + Make sure we don't ever loop because of non-blocking sockets return + EWOULDBLOCK or similar. The GnuTLS connection etc. + +2.2 Pause transfers + + Make transfers treated more carefully. We need a way to tell libcurl we have + data to write, as the current system expects us to upload data each time the + socket is writable and there is no way to say that we want to upload data + soon just not right now, without that aborting the upload. The opposite + situation should be possible as well, that we tell libcurl we're ready to + accept read data. Today libcurl feeds the data as soon as it is available for + reading, no matter what. + +2.3 Remove easy interface internally + + Make curl_easy_perform() a wrapper-function that simply creates a multi + handle, adds the easy handle to it, runs curl_multi_perform() until the + transfer is done, then detach the easy handle, destroy the multi handle and + return the easy handle's return code. This will thus make everything + internally use and assume the multi interface. The select()-loop should use + curl_multi_socket(). + +2.4 Avoid having to remove/readd handles + + curl_multi_handle_control() - this can control the easy handle (while) added + to a multi handle in various ways: + + o RESTART, unconditionally restart this easy handle's transfer from the + start, re-init the state + + o RESTART_COMPLETED, restart this easy handle's transfer but only if the + existing transfer has already completed and it is in a "finished state". + + o STOP, just stop this transfer and consider it completed + + o PAUSE? + + o RESUME? + +3. Documentation + +3.1 More and better + + Exactly + +4. FTP + +4.1 PRET + + PRET is a command that primarily "drftpd" supports, which could be useful + when using libcurl against such a server. It is a non-standard and a rather + oddly designed command, but... + http://curl.haxx.se/bug/feature.cgi?id=1729967 + +4.2 Alter passive/active on failure and retry + + When trying to connect passively to a server which only supports active + connections, libcurl returns CURLE_FTP_WEIRD_PASV_REPLY and closes the + connection. There could be a way to fallback to an active connection (and + vice versa). http://curl.haxx.se/bug/feature.cgi?id=1754793 + +4.3 Earlier bad letter detection + + Make the detection of (bad) %0d and %0a codes in FTP url parts earlier in the + process to avoid doing a resolve and connect in vain. + +4.4 REST for large files + + REST fix for servers not behaving well on >2GB requests. This should fail if + the server doesn't set the pointer to the requested index. The tricky + (impossible?) part is to figure out if the server did the right thing or not. + +4.5 FTP proxy support + + Support the most common FTP proxies, Philip Newton provided a list allegedly + from ncftp. This is not a subject without debate, and is probably not really + suitable for libcurl. http://curl.haxx.se/mail/archive-2003-04/0126.html + +4.6 PORT port range + + Make CURLOPT_FTPPORT support an additional port number on the IP/if/name, + like "blabla:[port]" or possibly even "blabla:[portfirst]-[portsecond]". + http://curl.haxx.se/bug/feature.cgi?id=1505166 + +4.7 ASCII support + + FTP ASCII transfers do not follow RFC959. They don't convert the data + accordingly. + +5. HTTP + +5.1 Other HTTP versions with CONNECT + + When doing CONNECT to a HTTP proxy, libcurl always uses HTTP/1.0. This has + never been reported as causing trouble to anyone, but should be considered to + use the HTTP version the user has chosen. + +5.2 Better persistancy for HTTP 1.0 + + "Better" support for persistent connections over HTTP 1.0 + http://curl.haxx.se/bug/feature.cgi?id=1089001 + +5.3 support FF3 sqlite cookie files + + Firefox 3 is changing from its former format to a a sqlite database instead. + We should consider how (lib)curl can/should support this. + http://curl.haxx.se/bug/feature.cgi?id=1871388 + +6. TELNET + +6.1 ditch stdin + +Reading input (to send to the remote server) on stdin is a crappy solution for +library purposes. We need to invent a good way for the application to be able +to provide the data to send. + +6.2 ditch telnet-specific select + + Move the telnet support's network select() loop go away and merge the code + into the main transfer loop. Until this is done, the multi interface won't + work for telnet. + +7. SSL + +7.1 Disable specific versions + + Provide an option that allows for disabling specific SSL versions, such as + SSLv2 http://curl.haxx.se/bug/feature.cgi?id=1767276 + +7.2 Provide mytex locking API + + Provide a libcurl API for setting mutex callbacks in the underlying SSL + library, so that the same application code can use mutex-locking + independently of OpenSSL or GnutTLS being used. + +7.3 dumpcert + + Anton Fedorov's "dumpcert" patch: + http://curl.haxx.se/mail/lib-2004-03/0088.html + +7.4 Evaluate SSL patches + + Evaluate/apply Gertjan van Wingerde's SSL patches: + http://curl.haxx.se/mail/lib-2004-03/0087.html + +7.5 Cache OpenSSL contexts + + "Look at SSL cafile - quick traces look to me like these are done on every + request as well, when they should only be necessary once per ssl context (or + once per handle)". The major improvement we can rather easily do is to make + sure we don't create and kill a new SSL "context" for every request, but + instead make one for every connection and re-use that SSL context in the same + style connections are re-used. It will make us use slightly more memory but + it will libcurl do less creations and deletions of SSL contexts. + +7.6 Export session ids + + Add an interface to libcurl that enables "session IDs" to get + exported/imported. Cris Bailiff said: "OpenSSL has functions which can + serialise the current SSL state to a buffer of your choice, and recover/reset + the state from such a buffer at a later date - this is used by mod_ssl for + apache to implement and SSL session ID cache". + +7.7 Provide callback for cert verfication + + OpenSSL supports a callback for customised verification of the peer + certificate, but this doesn't seem to be exposed in the libcurl APIs. Could + it be? There's so much that could be done if it were! + +7.8 Support other SSL libraries + + Make curl's SSL layer capable of using other free SSL libraries. Such as + MatrixSSL (http://www.matrixssl.org/). + +7.9 Support SRP on the TLS layer + + Peter Sylvester's patch for SRP on the TLS layer. Awaits OpenSSL support for + this, no need to support this in libcurl before there's an OpenSSL release + that does it. + +7.10 improve configure --with-ssl + + make the configure --with-ssl option first check for OpenSSL, then GnuTLS, + then NSS... + +8. GnuTLS + +8.1 Make NTLM work without OpenSSL functions + + Get NTLM working using the functions provided by libgcrypt, since GnuTLS + already depends on that to function. Not strictly SSL/TLS related, but + hey... Another option is to get available DES and MD4 source code from the + cryptopp library. They are fine license-wise, but are C++. + +8.2 SSl engine stuff + + Is this even possible? + +8.3 SRP + + Work out a common method with Peter Sylvester's OpenSSL-patch for SRP on the + TLS to provide name and password. GnuTLS already supports it... + +8.4 non-blocking + + Fix the connection phase to be non-blocking when multi interface is used + +8.5 check connection + + Add a way to check if the connection seems to be alive, to correspond to the + SSL_peak() way we use with OpenSSL. + +9. LDAP + +9.1 ditch ldap-specific select + + * Look over the implementation. The looping will have to "go away" from the + lib/ldap.c source file and get moved to the main network code so that the + multi interface and friends will work for LDAP as well. + +10. New protocols + +10.1 RTSP + + RFC2326 (protocol - very HTTP-like, also contains URL description) + +10.2 RSYNC + + There's no RFC for protocol nor URI/URL format. An implementation should + most probably use an existing rsync library, such as librsync. + +10.3 RTMP + + There exists a patch that claims to introduce this protocol: + http://osdir.com/ml/gnu.gnash.devel2/2006-11/msg00278.html, further details + in the feature-request: http://curl.haxx.se/bug/feature.cgi?id=1843469 + +11. Client + +11.1 Content-Disposition + + Add option that is similar to -O but that takes the output file name from the + Content-Disposition: header, and/or uses the local file name used in + redirections for the cases the server bounces the request further to a + different file (name): http://curl.haxx.se/bug/feature.cgi?id=1364676 + +11.2 sync + + "curl --sync http://example.com/feed[1-100].rss" or + "curl --sync http://example.net/{index,calendar,history}.html" + + Downloads a range or set of URLs using the remote name, but only if the + remote file is newer than the local file. A Last-Modified HTTP date header + should also be used to set the mod date on the downloaded file. + +11.3 glob posts + + Globbing support for -d and -F, as in 'curl -d "name=foo[0-9]" URL'. + This is easily scripted though. + +11.4 prevent file overwriting + + Add an option that prevents cURL from overwriting existing local files. When + used, and there already is an existing file with the target file name + (either -O or -o), a number should be appended (and increased if already + existing). So that index.html becomes first index.html.1 and then + index.html.2 etc. + +11.5 ftp wildcard download + + "curl ftp://site.com/*.txt" + +11.6 simultaneous parallel transfers + + The client could be told to use maximum N simultaneous parallel transfers and + then just make sure that happens. It should of course not make more than one + connection to the same remote host. This would require the client to use the + multi interface. http://curl.haxx.se/bug/feature.cgi?id=1558595 + +11.7 provide formpost headers + + Extending the capabilities of the multipart formposting. How about leaving + the ';type=foo' syntax as it is and adding an extra tag (headers) which + works like this: curl -F "coolfiles=@fil1.txt;headers=@fil1.hdr" where + fil1.hdr contains extra headers like + + Content-Type: text/plain; charset=KOI8-R" + Content-Transfer-Encoding: base64 + X-User-Comment: Please don't use browser specific HTML code + + which should overwrite the program reasonable defaults (plain/text, + 8bit...) + +11.8 url-specific options + + Provide a way to make options bound to a specific URL among several on the + command line. Possibly by letting ':' separate options between URLs, + similar to this: + + curl --data foo --url url.com : \ + --url url2.com : \ + --url url3.com --data foo3 + + (More details: http://curl.haxx.se/mail/archive-2004-07/0133.html) + + The example would do a POST-GET-POST combination on a single command line. + +12. Build + +12.1 roffit + + Consider extending 'roffit' to produce decent ASCII output, and use that + instead of (g)nroff when building src/hugehelp.c + +13. Test suite + +13.1 SSL tunnel + + Make our own version of stunnel for simple port forwarding to enable HTTPS + and FTP-SSL tests without the stunnel dependency, and it could allow us to + provide test tools built with either OpenSSL or GnuTLS + +13.2 nicer lacking perl message + + If perl wasn't found by the configure script, don't attempt to run the tests + but explain something nice why it doesn't. + +13.3 more protocols supported + + Extend the test suite to include more protocols. The telnet could just do ftp + or http operations (for which we have test servers). + +13.4 more platforms supported + + Make the test suite work on more platforms. OpenBSD and Mac OS. Remove + fork()s and it should become even more portable. + +14. Next SONAME bump + +14.1 http-style HEAD output for ftp + + #undef CURL_FTP_HTTPSTYLE_HEAD in lib/ftp.c to remove the HTTP-style headers + from being output in NOBODY requests over ftp + +14.2 combine error codes + + Combine some of the error codes to remove duplicates. The original + numbering should not be changed, and the old identifiers would be + macroed to the new ones in an CURL_NO_OLDIES section to help with + backward compatibility. + + Candidates for removal and their replacements: + + CURLE_FILE_COULDNT_READ_FILE => CURLE_REMOTE_FILE_NOT_FOUND + CURLE_FTP_COULDNT_RETR_FILE => CURLE_REMOTE_FILE_NOT_FOUND + CURLE_FTP_COULDNT_USE_REST => CURLE_RANGE_ERROR + CURLE_FUNCTION_NOT_FOUND => CURLE_FAILED_INIT + CURLE_LDAP_INVALID_URL => CURLE_URL_MALFORMAT + CURLE_TFTP_NOSUCHUSER => CURLE_TFTP_ILLEGAL + CURLE_TFTP_NOTFOUND => CURLE_REMOTE_FILE_NOT_FOUND + CURLE_TFTP_PERM => CURLE_REMOTE_ACCESS_DENIED + +14.3 extend CURLOPT_SOCKOPTFUNCTION prototype + + The current prototype only provides 'purpose' that tells what the + connection/socket is for, but not any protocol or similar. It makes it hard + for applications to differentiate on TCP vs UDP and even HTTP vs FTP and + similar. + +15. Next major release + +15.1 cleanup return codes + + curl_easy_cleanup() returns void, but curl_multi_cleanup() returns a + CURLMcode. These should be changed to be the same. + +15.2 remove obsolete defines + + remove obsolete defines from curl/curl.h + +15.3 size_t + + make several functions use size_t instead of int in their APIs + +15.4 remove several functions + + remove the following functions from the public API: + + curl_getenv + + curl_mprintf (and variations) + + curl_strequal + + curl_strnequal + + They will instead become curlx_ - alternatives. That makes the curl app + still capable of building with them from source. + +15.5 remove CURLOPT_FAILONERROR + + Remove support for CURLOPT_FAILONERROR, it has gotten too kludgy and weird + internally. Let the app judge success or not for itself. + +15.6 remove CURLOPT_DNS_USE_GLOBAL_CACHE + + Remove support for a global DNS cache. Anything global is silly, and we + already offer the share interface for the same functionality but done + "right". diff --git a/vendors/libcurl/docs/TheArtOfHttpScripting b/vendors/libcurl/docs/TheArtOfHttpScripting new file mode 100644 index 0000000..f3357d4 --- /dev/null +++ b/vendors/libcurl/docs/TheArtOfHttpScripting @@ -0,0 +1,453 @@ +Online: http://curl.haxx.se/docs/httpscripting.html +Date: December 9, 2004 + + The Art Of Scripting HTTP Requests Using Curl + ============================================= + + This document will assume that you're familiar with HTML and general + networking. + + The possibility to write scripts is essential to make a good computer + system. Unix' capability to be extended by shell scripts and various tools to + run various automated commands and scripts is one reason why it has succeeded + so well. + + The increasing amount of applications moving to the web has made "HTTP + Scripting" more frequently requested and wanted. To be able to automatically + extract information from the web, to fake users, to post or upload data to + web servers are all important tasks today. + + Curl is a command line tool for doing all sorts of URL manipulations and + transfers, but this particular document will focus on how to use it when + doing HTTP requests for fun and profit. I'll assume that you know how to + invoke 'curl --help' or 'curl --manual' to get basic information about it. + + Curl is not written to do everything for you. It makes the requests, it gets + the data, it sends data and it retrieves the information. You probably need + to glue everything together using some kind of script language or repeated + manual invokes. + +1. The HTTP Protocol + + HTTP is the protocol used to fetch data from web servers. It is a very simple + protocol that is built upon TCP/IP. The protocol also allows information to + get sent to the server from the client using a few different methods, as will + be shown here. + + HTTP is plain ASCII text lines being sent by the client to a server to + request a particular action, and then the server replies a few text lines + before the actual requested content is sent to the client. + + Using curl's option -v will display what kind of commands curl sends to the + server, as well as a few other informational texts. -v is the single most + useful option when it comes to debug or even understand the curl<->server + interaction. + +2. URL + + The Uniform Resource Locator format is how you specify the address of a + particular resource on the Internet. You know these, you've seen URLs like + http://curl.haxx.se or https://yourbank.com a million times. + +3. GET a page + + The simplest and most common request/operation made using HTTP is to get a + URL. The URL could itself refer to a web page, an image or a file. The client + issues a GET request to the server and receives the document it asked for. + If you issue the command line + + curl http://curl.haxx.se + + you get a web page returned in your terminal window. The entire HTML document + that that URL holds. + + All HTTP replies contain a set of headers that are normally hidden, use + curl's -i option to display them as well as the rest of the document. You can + also ask the remote server for ONLY the headers by using the -I option (which + will make curl issue a HEAD request). + +4. Forms + + Forms are the general way a web site can present a HTML page with fields for + the user to enter data in, and then press some kind of 'OK' or 'submit' + button to get that data sent to the server. The server then typically uses + the posted data to decide how to act. Like using the entered words to search + in a database, or to add the info in a bug track system, display the entered + address on a map or using the info as a login-prompt verifying that the user + is allowed to see what it is about to see. + + Of course there has to be some kind of program in the server end to receive + the data you send. You cannot just invent something out of the air. + + 4.1 GET + + A GET-form uses the method GET, as specified in HTML like: + +
    + + +
    + + In your favorite browser, this form will appear with a text box to fill in + and a press-button labeled "OK". If you fill in '1905' and press the OK + button, your browser will then create a new URL to get for you. The URL will + get "junk.cgi?birthyear=1905&press=OK" appended to the path part of the + previous URL. + + If the original form was seen on the page "www.hotmail.com/when/birth.html", + the second page you'll get will become + "www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK". + + Most search engines work this way. + + To make curl do the GET form post for you, just enter the expected created + URL: + + curl "www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK" + + 4.2 POST + + The GET method makes all input field names get displayed in the URL field of + your browser. That's generally a good thing when you want to be able to + bookmark that page with your given data, but it is an obvious disadvantage + if you entered secret information in one of the fields or if there are a + large amount of fields creating a very long and unreadable URL. + + The HTTP protocol then offers the POST method. This way the client sends the + data separated from the URL and thus you won't see any of it in the URL + address field. + + The form would look very similar to the previous one: + +
    + + +
    + + And to use curl to post this form with the same data filled in as before, we + could do it like: + + curl -d "birthyear=1905&press=%20OK%20" www.hotmail.com/when/junk.cgi + + This kind of POST will use the Content-Type + application/x-www-form-urlencoded and is the most widely used POST kind. + + The data you send to the server MUST already be properly encoded, curl will + not do that for you. For example, if you want the data to contain a space, + you need to replace that space with %20 etc. Failing to comply with this + will most likely cause your data to be received wrongly and messed up. + + 4.3 File Upload POST + + Back in late 1995 they defined an additional way to post data over HTTP. It + is documented in the RFC 1867, why this method sometimes is referred to as + RFC1867-posting. + + This method is mainly designed to better support file uploads. A form that + allows a user to upload a file could be written like this in HTML: + +
    + + +
    + + This clearly shows that the Content-Type about to be sent is + multipart/form-data. + + To post to a form like this with curl, you enter a command line like: + + curl -F upload=@localfilename -F press=OK [URL] + + 4.4 Hidden Fields + + A very common way for HTML based application to pass state information + between pages is to add hidden fields to the forms. Hidden fields are + already filled in, they aren't displayed to the user and they get passed + along just as all the other fields. + + A similar example form with one visible field, one hidden field and one + submit button could look like: + +
    + + + +
    + + To post this with curl, you won't have to think about if the fields are + hidden or not. To curl they're all the same: + + curl -d "birthyear=1905&press=OK&person=daniel" [URL] + + 4.5 Figure Out What A POST Looks Like + + When you're about fill in a form and send to a server by using curl instead + of a browser, you're of course very interested in sending a POST exactly the + way your browser does. + + An easy way to get to see this, is to save the HTML page with the form on + your local disk, modify the 'method' to a GET, and press the submit button + (you could also change the action URL if you want to). + + You will then clearly see the data get appended to the URL, separated with a + '?'-letter as GET forms are supposed to. + +5. PUT + + The perhaps best way to upload data to a HTTP server is to use PUT. Then + again, this of course requires that someone put a program or script on the + server end that knows how to receive a HTTP PUT stream. + + Put a file to a HTTP server with curl: + + curl -T uploadfile www.uploadhttp.com/receive.cgi + +6. Authentication + + Authentication is the ability to tell the server your username and password + so that it can verify that you're allowed to do the request you're doing. The + Basic authentication used in HTTP (which is the type curl uses by default) is + *plain* *text* based, which means it sends username and password only + slightly obfuscated, but still fully readable by anyone that sniffs on the + network between you and the remote server. + + To tell curl to use a user and password for authentication: + + curl -u name:password www.secrets.com + + The site might require a different authentication method (check the headers + returned by the server), and then --ntlm, --digest, --negotiate or even + --anyauth might be options that suit you. + + Sometimes your HTTP access is only available through the use of a HTTP + proxy. This seems to be especially common at various companies. A HTTP proxy + may require its own user and password to allow the client to get through to + the Internet. To specify those with curl, run something like: + + curl -U proxyuser:proxypassword curl.haxx.se + + If your proxy requires the authentication to be done using the NTLM method, + use --proxy-ntlm, if it requires Digest use --proxy-digest. + + If you use any one these user+password options but leave out the password + part, curl will prompt for the password interactively. + + Do note that when a program is run, its parameters might be possible to see + when listing the running processes of the system. Thus, other users may be + able to watch your passwords if you pass them as plain command line + options. There are ways to circumvent this. + +7. Referer + + A HTTP request may include a 'referer' field (yes it is misspelled), which + can be used to tell from which URL the client got to this particular + resource. Some programs/scripts check the referer field of requests to verify + that this wasn't arriving from an external site or an unknown page. While + this is a stupid way to check something so easily forged, many scripts still + do it. Using curl, you can put anything you want in the referer-field and + thus more easily be able to fool the server into serving your request. + + Use curl to set the referer field with: + + curl -e http://curl.haxx.se daniel.haxx.se + +8. User Agent + + Very similar to the referer field, all HTTP requests may set the User-Agent + field. It names what user agent (client) that is being used. Many + applications use this information to decide how to display pages. Silly web + programmers try to make different pages for users of different browsers to + make them look the best possible for their particular browsers. They usually + also do different kinds of javascript, vbscript etc. + + At times, you will see that getting a page with curl will not return the same + page that you see when getting the page with your browser. Then you know it + is time to set the User Agent field to fool the server into thinking you're + one of those browsers. + + To make curl look like Internet Explorer on a Windows 2000 box: + + curl -A "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" [URL] + + Or why not look like you're using Netscape 4.73 on a Linux (PIII) box: + + curl -A "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)" [URL] + +9. Redirects + + When a resource is requested from a server, the reply from the server may + include a hint about where the browser should go next to find this page, or a + new page keeping newly generated output. The header that tells the browser + to redirect is Location:. + + Curl does not follow Location: headers by default, but will simply display + such pages in the same manner it display all HTTP replies. It does however + feature an option that will make it attempt to follow the Location: pointers. + + To tell curl to follow a Location: + + curl -L www.sitethatredirects.com + + If you use curl to POST to a site that immediately redirects you to another + page, you can safely use -L and -d/-F together. Curl will only use POST in + the first request, and then revert to GET in the following operations. + +10. Cookies + + The way the web browsers do "client side state control" is by using + cookies. Cookies are just names with associated contents. The cookies are + sent to the client by the server. The server tells the client for what path + and host name it wants the cookie sent back, and it also sends an expiration + date and a few more properties. + + When a client communicates with a server with a name and path as previously + specified in a received cookie, the client sends back the cookies and their + contents to the server, unless of course they are expired. + + Many applications and servers use this method to connect a series of requests + into a single logical session. To be able to use curl in such occasions, we + must be able to record and send back cookies the way the web application + expects them. The same way browsers deal with them. + + The simplest way to send a few cookies to the server when getting a page with + curl is to add them on the command line like: + + curl -b "name=Daniel" www.cookiesite.com + + Cookies are sent as common HTTP headers. This is practical as it allows curl + to record cookies simply by recording headers. Record cookies with curl by + using the -D option like: + + curl -D headers_and_cookies www.cookiesite.com + + (Take note that the -c option described below is a better way to store + cookies.) + + Curl has a full blown cookie parsing engine built-in that comes to use if you + want to reconnect to a server and use cookies that were stored from a + previous connection (or handicrafted manually to fool the server into + believing you had a previous connection). To use previously stored cookies, + you run curl like: + + curl -b stored_cookies_in_file www.cookiesite.com + + Curl's "cookie engine" gets enabled when you use the -b option. If you only + want curl to understand received cookies, use -b with a file that doesn't + exist. Example, if you want to let curl understand cookies from a page and + follow a location (and thus possibly send back cookies it received), you can + invoke it like: + + curl -b nada -L www.cookiesite.com + + Curl has the ability to read and write cookie files that use the same file + format that Netscape and Mozilla do. It is a convenient way to share cookies + between browsers and automatic scripts. The -b switch automatically detects + if a given file is such a cookie file and parses it, and by using the + -c/--cookie-jar option you'll make curl write a new cookie file at the end of + an operation: + + curl -b cookies.txt -c newcookies.txt www.cookiesite.com + +11. HTTPS + + There are a few ways to do secure HTTP transfers. The by far most common + protocol for doing this is what is generally known as HTTPS, HTTP over + SSL. SSL encrypts all the data that is sent and received over the network and + thus makes it harder for attackers to spy on sensitive information. + + SSL (or TLS as the latest version of the standard is called) offers a + truckload of advanced features to allow all those encryptions and key + infrastructure mechanisms encrypted HTTP requires. + + Curl supports encrypted fetches thanks to the freely available OpenSSL + libraries. To get a page from a HTTPS server, simply run curl like: + + curl https://that.secure.server.com + + 11.1 Certificates + + In the HTTPS world, you use certificates to validate that you are the one + you you claim to be, as an addition to normal passwords. Curl supports + client-side certificates. All certificates are locked with a pass phrase, + which you need to enter before the certificate can be used by curl. The pass + phrase can be specified on the command line or if not, entered interactively + when curl queries for it. Use a certificate with curl on a HTTPS server + like: + + curl -E mycert.pem https://that.secure.server.com + + curl also tries to verify that the server is who it claims to be, by + verifying the server's certificate against a locally stored CA cert + bundle. Failing the verification will cause curl to deny the connection. You + must then use -k in case you want to tell curl to ignore that the server + can't be verified. + + More about server certificate verification and ca cert bundles can be read + in the SSLCERTS document, available online here: + + http://curl.haxx.se/docs/sslcerts.html + +12. Custom Request Elements + + Doing fancy stuff, you may need to add or change elements of a single curl + request. + + For example, you can change the POST request to a PROPFIND and send the data + as "Content-Type: text/xml" (instead of the default Content-Type) like this: + + curl -d "" -H "Content-Type: text/xml" -X PROPFIND url.com + + You can delete a default header by providing one without content. Like you + can ruin the request by chopping off the Host: header: + + curl -H "Host:" http://mysite.com + + You can add headers the same way. Your server may want a "Destination:" + header, and you can add it: + + curl -H "Destination: http://moo.com/nowhere" http://url.com + +13. Debug + + Many times when you run curl on a site, you'll notice that the site doesn't + seem to respond the same way to your curl requests as it does to your + browser's. + + Then you need to start making your curl requests more similar to your + browser's requests: + + * Use the --trace-ascii option to store fully detailed logs of the requests + for easier analyzing and better understanding + + * Make sure you check for and use cookies when needed (both reading with -b + and writing with -c) + + * Set user-agent to one like a recent popular browser does + + * Set referer like it is set by the browser + + * If you use POST, make sure you send all the fields and in the same order as + the browser does it. (See chapter 4.5 above) + + A very good helper to make sure you do this right, is the LiveHTTPHeader tool + that lets you view all headers you send and receive with Mozilla/Firefox + (even when using HTTPS). + + A more raw approach is to capture the HTTP traffic on the network with tools + such as ethereal or tcpdump and check what headers that were sent and + received by the browser. (HTTPS makes this technique inefficient.) + +14. References + + RFC 2616 is a must to read if you want in-depth understanding of the HTTP + protocol. + + RFC 2396 explains the URL syntax. + + RFC 2109 defines how cookies are supposed to work. + + RFC 1867 defines the HTTP post upload format. + + http://www.openssl.org is the home of the OpenSSL project + + http://curl.haxx.se is the home of the cURL project diff --git a/vendors/libcurl/docs/VERSIONS b/vendors/libcurl/docs/VERSIONS new file mode 100644 index 0000000..cc11c1b --- /dev/null +++ b/vendors/libcurl/docs/VERSIONS @@ -0,0 +1,67 @@ + _ _ ____ _ + ___| | | | _ \| | + / __| | | | |_) | | + | (__| |_| | _ <| |___ + \___|\___/|_| \_\_____| + +Version Numbers and Releases + + Curl is not only curl. Curl is also libcurl. They're actually individually + versioned, but they mostly follow each other rather closely. + + The version numbering is always built up using the same system: + + X.Y[.Z][-preN] + + Where + X is main version number + Y is release number + Z is patch number + N is pre-release number + + One of these numbers will get bumped in each new release. The numbers to the + right of a bumped number will be reset to zero. If Z is zero, it may not be + included in the version number. The pre release number is only included in + pre releases (they're never used in public, official, releases). + + The main version number will get bumped when *really* big, world colliding + changes are made. The release number is bumped when big changes are + performed. The patch number is bumped when the changes are mere bugfixes and + only minor feature changes. The pre-release is a counter, to identify which + pre-release a certain release is. + + When reaching the end of a pre-release period, the version without the + pre-release part will be released as a public release. + + It means that after release 1.2.3, we can release 2.0 if something really big + has been made, 1.3 if not that big changes were made or 1.2.4 if mostly bugs + were fixed. Before 1.2.4 is released, we might release a 1.2.4-pre1 release + for the brave people to try before the actual release. + + Bumping, as in increasing the number with 1, is unconditionally only + affecting one of the numbers (except the ones to the right of it, that may be + set to zero). 1 becomes 2, 3 becomes 4, 9 becomes 10, 88 becomes 89 and 99 + becomes 100. So, after 1.2.9 comes 1.2.10. After 3.99.3, 3.100 might come. + + All original curl source release archives are named according to the libcurl + version (not according to the curl client version that, as said before, might + differ). + + As a service to any application that might want to support new libcurl + features while still being able to build with older versions, all releases + have the libcurl version stored in the curl/curlver.h file using a static + numbering scheme that can be used for comparison. The version number is + defined as: + + #define LIBCURL_VERSION_NUM 0xXXYYZZ + + Where XX, YY and ZZ are the main version, release and patch numbers in + hexadecimal. All three numbers are always represented using two digits. 1.2 + would appear as "0x010200" while version 9.11.7 appears as "0x090b07". + + This 6-digit hexadecimal number does not show pre-release number, and it is + always a greater number in a more recent release. It makes comparisons with + greater than and less than work. + + This number is also available as three separate defines: + LIBCURL_VERSION_MAJOR, LIBCURL_VERSION_MINOR and LIBCURL_VERSION_PATCH. diff --git a/vendors/libcurl/docs/curl-config.1 b/vendors/libcurl/docs/curl-config.1 new file mode 100644 index 0000000..a2e59d8 --- /dev/null +++ b/vendors/libcurl/docs/curl-config.1 @@ -0,0 +1,98 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2007, Daniel Stenberg, , et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" * $Id: curl-config.1,v 1.16 2007-10-26 07:46:02 bagder Exp $ +.\" ************************************************************************** +.\" +.TH curl-config 1 "25 Oct 2007" "Curl 7.17.1" "curl-config manual" +.SH NAME +curl-config \- Get information about a libcurl installation +.SH SYNOPSIS +.B curl-config [options] +.SH DESCRIPTION +.B curl-config +displays information about a previous curl and libcurl installation. +.SH OPTIONS +.IP "--ca" +Displays the built-in path to the CA cert bundle this libcurl uses. +.IP "--cc" +Displays the compiler used to build libcurl. +.IP "--cflags" +Set of compiler options (CFLAGS) to use when compiling files that use +libcurl. Currently that is only thw include path to the curl include files. +.IP "--checkfor [version]" +Specify the oldest possible libcurl version string you want, and this +script will return 0 if the current installation is new enough or it +returns 1 and outputs a text saying that the current version is not new +enough. (Added in 7.15.4) +.IP "--feature" +Lists what particular main features the installed libcurl was built with. At +the time of writing, this list may include SSL, KRB4 or IPv6. Do not assume +any particular order. The keywords will be separated by newlines. There may be +none, one or several keywords in the list. +.IP "--help" +Displays the available options. +.IP "--libs" +Shows the complete set of libs and other linker options you will need in order +to link your application with libcurl. +.IP "--prefix" +This is the prefix used when libcurl was installed. Libcurl is then installed +in $prefix/lib and its header files are installed in $prefix/include and so +on. The prefix is set with "configure --prefix". +.IP "--protocols" +Lists what particular protocols the installed libcurl was built to support. At +the time of writing, this list may include HTTP, HTTPS, FTP, FTPS, FILE, +TELNET, LDAP, DICT. Do not assume any particular order. The protocols will +be listed using uppercase and are separated by newlines. There may be none, +one or several protocols in the list. (Added in 7.13.0) +.IP "--static-libs" +Shows the complete set of libs and other linker options you will need in order +to link your application with libcurl statically. (Added in 7.17.1) +.IP "--version" +Outputs version information about the installed libcurl. +.IP "--vernum" +Outputs version information about the installed libcurl, in numerical mode. +This outputs the version number, in hexadecimal, with 8 bits for each part; +major, minor, patch. So that libcurl 7.7.4 would appear as 070704 and libcurl +12.13.14 would appear as 0c0d0e... Note that the initial zero might be +omitted. (This option was broken in the 7.15.0 release.) +.SH "EXAMPLES" +What linker options do I need when I link with libcurl? + + $ curl-config --libs + +What compiler options do I need when I compile using libcurl functions? + + $ curl-config --cflags + +How do I know if libcurl was built with SSL support? + + $ curl-config --feature | grep SSL + +What's the installed libcurl version? + + $ curl-config --version + +How do I build a single file with a one-line command? + + $ `curl-config --cc --cflags --libs` -o example example.c + +.SH "SEE ALSO" +.BR curl (1) diff --git a/vendors/libcurl/docs/curl-config.html b/vendors/libcurl/docs/curl-config.html new file mode 100644 index 0000000..a1e3f34 --- /dev/null +++ b/vendors/libcurl/docs/curl-config.html @@ -0,0 +1,88 @@ + +curl-config man page + + + + +

    NAME

    +

    curl-config - Get information about a libcurl installation

    SYNOPSIS

    +

    curl-config [options]

    DESCRIPTION

    +

    curl-config displays information about a previous curl and libcurl installation.

    OPTIONS

    +

    +

    --ca +

    Displays the built-in path to the CA cert bundle this libcurl uses. +

    --cc +

    Displays the compiler used to build libcurl. +

    --cflags +

    Set of compiler options (CFLAGS) to use when compiling files that use libcurl. Currently that is only thw include path to the curl include files. +

    --checkfor [version] +

    Specify the oldest possible libcurl version string you want, and this script will return 0 if the current installation is new enough or it returns 1 and outputs a text saying that the current version is not new enough. (Added in 7.15.4) +

    --feature +

    Lists what particular main features the installed libcurl was built with. At the time of writing, this list may include SSL, KRB4 or IPv6. Do not assume any particular order. The keywords will be separated by newlines. There may be none, one or several keywords in the list. +

    --help +

    Displays the available options. +

    --libs +

    Shows the complete set of libs and other linker options you will need in order to link your application with libcurl. +

    --prefix +

    This is the prefix used when libcurl was installed. Libcurl is then installed in $prefix/lib and its header files are installed in $prefix/include and so on. The prefix is set with "configure --prefix". +

    --protocols +

    Lists what particular protocols the installed libcurl was built to support. At the time of writing, this list may include HTTP, HTTPS, FTP, FTPS, FILE, TELNET, LDAP, DICT. Do not assume any particular order. The protocols will be listed using uppercase and are separated by newlines. There may be none, one or several protocols in the list. (Added in 7.13.0) +

    --static-libs +

    Shows the complete set of libs and other linker options you will need in order to link your application with libcurl statically. (Added in 7.17.1) +

    --version +

    Outputs version information about the installed libcurl. +

    --vernum +

    Outputs version information about the installed libcurl, in numerical mode. This outputs the version number, in hexadecimal, with 8 bits for each part; major, minor, patch. So that libcurl 7.7.4 would appear as 070704 and libcurl 12.13.14 would appear as 0c0d0e... Note that the initial zero might be omitted. (This option was broken in the 7.15.0 release.)

    EXAMPLES

    +

    What linker options do I need when I link with libcurl? +

      $ curl-config --libs +

    What compiler options do I need when I compile using libcurl functions? +

      $ curl-config --cflags +

    How do I know if libcurl was built with SSL support? +

      $ curl-config --feature | grep SSL +

    What's the installed libcurl version? +

      $ curl-config --version +

    How do I build a single file with a one-line command? +

      $ `curl-config --cc --cflags --libs` -o example example.c +

    SEE ALSO

    +

    curl (1)

    + This HTML page was made with roffit. + diff --git a/vendors/libcurl/docs/curl-config.pdf b/vendors/libcurl/docs/curl-config.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7c1b2a85e47e136f589bc5ebaf93b41a2dcc53c2 GIT binary patch literal 5906 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, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" * $Id: curl.1,v 1.243 2008-01-25 22:35:06 bagder Exp $ +.\" ************************************************************************** +.\" +.TH curl 1 "5 Jan 2008" "Curl 7.18.0" "Curl Manual" +.SH NAME +curl \- transfer a URL +.SH SYNOPSIS +.B curl [options] +.I [URL...] +.SH DESCRIPTION +.B curl +is a tool to transfer data from or to a server, using one of the supported +protocols (HTTP, HTTPS, FTP, FTPS, SCP, SFTP, TFTP, DICT, TELNET, LDAP or +FILE). The command is designed to work without user interaction. + +curl offers a busload of useful tricks like proxy support, user +authentication, ftp upload, HTTP post, SSL connections, cookies, file transfer +resume and more. As you will see below, the number of features will make your +head spin! + +curl is powered by libcurl for all transfer-related features. See +.BR libcurl (3) +for details. +.SH URL +The URL syntax is protocol dependent. You'll find a detailed description in +RFC 3986. + +You can specify multiple URLs or parts of URLs by writing part sets within +braces as in: + + http://site.{one,two,three}.com + +or you can get sequences of alphanumeric series by using [] as in: + + ftp://ftp.numericals.com/file[1-100].txt + ftp://ftp.numericals.com/file[001-100].txt (with leading zeros) + ftp://ftp.letters.com/file[a-z].txt + +No nesting of the sequences is supported at the moment, but you can use +several ones next to each other: + + http://any.org/archive[1996-1999]/vol[1-4]/part{a,b,c}.html + +You can specify any amount of URLs on the command line. They will be fetched +in a sequential manner in the specified order. + +Since curl 7.15.1 you can also specify step counter for the ranges, so that +you can get every Nth number or letter: + + http://www.numericals.com/file[1-100:10].txt + http://www.letters.com/file[a-z:2].txt + +If you specify URL without protocol:// prefix, curl will attempt to guess what +protocol you might want. It will then default to HTTP but try other protocols +based on often-used host name prefixes. For example, for host names starting +with "ftp." curl will assume you want to speak FTP. + +Curl will attempt to re-use connections for multiple file transfers, so that +getting many files from the same server will not do multiple connects / +handshakes. This improves speed. Of course this is only done on files +specified on a single command line and cannot be used between separate curl +invokes. +.SH "PROGRESS METER" +curl normally displays a progress meter during operations, indicating amount +of transferred data, transfer speeds and estimated time left etc. + +However, since curl displays data to the terminal by default, if you invoke +curl to do an operation and it is about to write data to the terminal, it +\fIdisables\fP the progress meter as otherwise it would mess up the output +mixing progress meter and response data. + +If you want a progress meter for HTTP POST or PUT requests, you need to +redirect the response output to a file, using shell redirect (>), -o [file] or +similar. + +It is not the same case for FTP upload as that operation is not spitting out +any response data to the terminal. + +If you prefer a progress "bar" instead of the regular meter, \fI-#\fP is your +friend. +.SH OPTIONS +.IP "-a/--append" +(FTP) When used in an FTP upload, this will tell curl to append to the target +file instead of overwriting it. If the file doesn't exist, it will be created. + +If this option is used twice, the second one will disable append mode again. +.IP "-A/--user-agent " +(HTTP) Specify the User-Agent string to send to the HTTP server. Some badly +done CGIs fail if this field isn't set to "Mozilla/4.0". To encode blanks in +the string, surround the string with single quote marks. This can also be set +with the \fI-H/--header\fP option of course. + +If this option is set more than once, the last one will be the one that's +used. +.IP "--anyauth" +(HTTP) Tells curl to figure out authentication method by itself, and use the +most secure one the remote site claims it supports. This is done by first +doing a request and checking the response-headers, thus possibly inducing an +extra network round-trip. This is used instead of setting a specific +authentication method, which you can do with \fI--basic\fP, \fI--digest\fP, +\fI--ntlm\fP, and \fI--negotiate\fP. + +Note that using --anyauth is not recommended if you do uploads from stdin, +since it may require data to be sent twice and then the client must be able to +rewind. If the need should arise when uploading from stdin, the upload +operation will fail. + +If this option is used several times, the following occurrences make no +difference. +.IP "-b/--cookie " +(HTTP) +Pass the data to the HTTP server as a cookie. It is supposedly the +data previously received from the server in a "Set-Cookie:" line. +The data should be in the format "NAME1=VALUE1; NAME2=VALUE2". + +If no '=' letter is used in the line, it is treated as a filename to use to +read previously stored cookie lines from, which should be used in this session +if they match. Using this method also activates the "cookie parser" which will +make curl record incoming cookies too, which may be handy if you're using this +in combination with the \fI-L/--location\fP option. The file format of the +file to read cookies from should be plain HTTP headers or the Netscape/Mozilla +cookie file format. + +\fBNOTE\fP that the file specified with \fI-b/--cookie\fP is only used as +input. No cookies will be stored in the file. To store cookies, use the +\fI-c/--cookie-jar\fP option or you could even save the HTTP headers to a file +using \fI-D/--dump-header\fP! + +If this option is set more than once, the last one will be the one that's +used. +.IP "-B/--use-ascii" +Enable ASCII transfer when using FTP or LDAP. For FTP, this can also be +enforced by using an URL that ends with ";type=A". This option causes data +sent to stdout to be in text mode for win32 systems. + +If this option is used twice, the second one will disable ASCII usage. +.IP "--basic" +(HTTP) Tells curl to use HTTP Basic authentication. This is the default and +this option is usually pointless, unless you use it to override a previously +set option that sets a different authentication method (such as \fI--ntlm\fP, +\fI--digest\fP and \fI--negotiate\fP). + +If this option is used several times, the following occurrences make no +difference. +.IP "--ciphers " +(SSL) Specifies which ciphers to use in the connection. The list of ciphers +must be using valid ciphers. Read up on SSL cipher list details on this URL: +\fIhttp://www.openssl.org/docs/apps/ciphers.html\fP + +NSS ciphers are done differently than OpenSSL and GnuTLS. The full list of +NSS ciphers is in the NSSCipherSuite entry at this URL: +\fIhttp://directory.fedora.redhat.com/docs/mod_nss.html#Directives\fP + +If this option is used several times, the last one will override the others. +.IP "--compressed" +(HTTP) Request a compressed response using one of the algorithms libcurl +supports, and return the uncompressed document. If this option is used and +the server sends an unsupported encoding, Curl will report an error. + +If this option is used several times, each occurrence will toggle it on/off. +.IP "--connect-timeout " +Maximum time in seconds that you allow the connection to the server to take. +This only limits the connection phase, once curl has connected this option is +of no more use. See also the \fI-m/--max-time\fP option. + +If this option is used several times, the last one will be used. +.IP "-c/--cookie-jar " +Specify to which file you want curl to write all cookies after a completed +operation. Curl writes all cookies previously read from a specified file as +well as all cookies received from remote server(s). If no cookies are known, +no file will be written. The file will be written using the Netscape cookie +file format. If you set the file name to a single dash, "-", the cookies will +be written to stdout. + +.B NOTE +If the cookie jar can't be created or written to, the whole curl operation +won't fail or even report an error clearly. Using -v will get a warning +displayed, but that is the only visible feedback you get about this possibly +lethal situation. + +If this option is used several times, the last specified file name will be +used. +.IP "-C/--continue-at " +Continue/Resume a previous file transfer at the given offset. The given offset +is the exact number of bytes that will be skipped counted from the beginning +of the source file before it is transferred to the destination. If used with +uploads, the ftp server command SIZE will not be used by curl. + +Use "-C -" to tell curl to automatically find out where/how to resume the +transfer. It then uses the given output/input files to figure that out. + +If this option is used several times, the last one will be used. +.IP "--create-dirs" +When used in conjunction with the -o option, curl will create the necessary +local directory hierarchy as needed. This option creates the dirs mentioned +with the -o option, nothing else. If the -o file name uses no dir or if the +dirs it mentions already exist, no dir will be created. + +To create remote directories when using FTP or SFTP, try +\fI--ftp-create-dirs\fP. +.IP "--crlf" +(FTP) Convert LF to CRLF in upload. Useful for MVS (OS/390). + +If this option is used several times, the following occurrences make no +difference. +.IP "-d/--data " +(HTTP) Sends the specified data in a POST request to the HTTP server, in the +same way that a browser does when a user has filled in an HTML form and +presses the submit button. This will cause curl to pass the data to the server +using the content-type application/x-www-form-urlencoded. Compare to +\fI-F/--form\fP. + +\fI-d/--data\fP is the same as \fI--data-ascii\fP. To post data purely binary, +you should instead use the \fI--data-binary\fP option. To URL encode the value +of a form field you may use \fI--data-urlencode\fP. + +If any of these options is used more than once on the same command line, the +data pieces specified will be merged together with a separating +&-letter. Thus, using '-d name=daniel -d skill=lousy' would generate a post +chunk that looks like \&'name=daniel&skill=lousy'. + +If you start the data with the letter @, the rest should be a file name to +read the data from, or - if you want curl to read the data from stdin. The +contents of the file must already be url-encoded. Multiple files can also be +specified. Posting data from a file named 'foobar' would thus be done with +\fI--data @foobar\fP. +.IP "--data-binary " +(HTTP) This posts data exactly as specified with no extra processing +whatsoever. + +If you start the data with the letter @, the rest should be a filename. Data +is posted in a similar manner as \fI--data-ascii\fP does, except that newlines +are preserved and conversions are never done. + +If this option is used several times, the ones following the first will append +data. As described in \fI-d/--data\fP. +.IP "--data-urlencode " +(HTTP) This posts data, similar to the other --data options with the exception +that this performs URL encoding. (Added in 7.18.0) + +To be CGI compliant, the part should begin with a \fIname\fP followed +by a separator and a content specification. The part can be passed to +curl using one of the following syntaxes: +.RS +.IP "content" +This will make curl URL encode the content and pass that on. Just be careful +so that the content doesn't contain any = or @ letters, as that will then make +the syntax match one of the other cases below! +.IP "=content" +This will make curl URL encode the content and pass that on. The preceding = +letter is not included in the data. +.IP "name=content" +This will make curl URL encode the content part and pass that on. Note that +the name part is expected to be URL encoded already. +.IP "@filename" +This will make curl load data from the given file (including any newlines), +URL encode that data and pass it on in the POST. +.IP "name@filename" +This will make curl load data from the given file (including any newlines), +URL encode that data and pass it on in the POST. The name part gets an equal +sign appended, resulting in \fIname=urlencoded-file-content\fP. Note that the +name is expected to be URL encoded already. +.RE +.IP "--digest" +(HTTP) Enables HTTP Digest authentication. This is a authentication that +prevents the password from being sent over the wire in clear text. Use this in +combination with the normal \fI-u/--user\fP option to set user name and +password. See also \fI--ntlm\fP, \fI--negotiate\fP and \fI--anyauth\fP for +related options. + +If this option is used several times, the following occurrences make no +difference. +.IP "--disable-eprt" +(FTP) Tell curl to disable the use of the EPRT and LPRT commands when doing +active FTP transfers. Curl will normally always first attempt to use EPRT, +then LPRT before using PORT, but with this option, it will use PORT right +away. EPRT and LPRT are extensions to the original FTP protocol, may not work +on all servers but enable more functionality in a better way than the +traditional PORT command. + +If this option is used several times, each occurrence will toggle this on/off. +.IP "--disable-epsv" +(FTP) Tell curl to disable the use of the EPSV command when doing passive FTP +transfers. Curl will normally always first attempt to use EPSV before PASV, +but with this option, it will not try using EPSV. + +If this option is used several times, each occurrence will toggle this on/off. +.IP "-D/--dump-header " +Write the protocol headers to the specified file. + +This option is handy to use when you want to store the headers that a HTTP +site sends to you. Cookies from the headers could then be read in a second +curl invoke by using the \fI-b/--cookie\fP option! The \fI-c/--cookie-jar\fP +option is however a better way to store cookies. + +When used on FTP, the ftp server response lines are considered being "headers" +and thus are saved there. + +If this option is used several times, the last one will be used. +.IP "-e/--referer " +(HTTP) Sends the "Referer Page" information to the HTTP server. This can also +be set with the \fI-H/--header\fP flag of course. When used with +\fI-L/--location\fP you can append ";auto" to the --referer URL to make curl +automatically set the previous URL when it follows a Location: header. The +\&";auto" string can be used alone, even if you don't set an initial --referer. + +If this option is used several times, the last one will be used. +.IP "--engine " +Select the OpenSSL crypto engine to use for cipher +operations. Use \fI--engine list\fP to print a list of build-time supported +engines. Note that not all (or none) of the engines may be available at +run-time. +.IP "--environment" +(RISC OS ONLY) Sets a range of environment variables, using the names the -w +option supports, to easier allow extraction of useful information after having +run curl. + +If this option is used several times, each occurrence will toggle this on/off. +.IP "--egd-file " +(SSL) Specify the path name to the Entropy Gathering Daemon socket. The socket +is used to seed the random engine for SSL connections. See also the +\fI--random-file\fP option. +.IP "-E/--cert " +(SSL) Tells curl to use the specified certificate file when getting a file +with HTTPS or FTPS. The certificate must be in PEM format. If the optional +password isn't specified, it will be queried for on the terminal. Note that +this option assumes a \&"certificate" file that is the private key and the +private certificate concatenated! See \fI--cert\fP and \fI--key\fP to specify +them independently. + +If curl is built against the NSS SSL library then this option tells +curl the nickname of the certificate to use within the NSS database defined +by the environment variable SSL_DIR (or by default /etc/pki/nssdb). If the +NSS PEM PKCS#11 module (libnsspem.so) is available then PEM files may be +loaded. + +If this option is used several times, the last one will be used. +.IP "--cert-type " +(SSL) Tells curl what certificate type the provided certificate is in. PEM, +DER and ENG are recognized types. If not specified, PEM is assumed. + +If this option is used several times, the last one will be used. +.IP "--cacert " +(SSL) Tells curl to use the specified certificate file to verify the +peer. The file may contain multiple CA certificates. The certificate(s) must +be in PEM format. + +curl recognizes the environment variable named 'CURL_CA_BUNDLE' if that is +set, and uses the given path as a path to a CA cert bundle. This option +overrides that variable. + +The windows version of curl will automatically look for a CA certs file named +\'curl-ca-bundle.crt\', either in the same directory as curl.exe, or in the +Current Working Directory, or in any folder along your PATH. + +If curl is built against the NSS SSL library then this option tells +curl the nickname of the CA certificate to use within the NSS database +defined by the environment variable SSL_DIR (or by default /etc/pki/nssdb). +If the NSS PEM PKCS#11 module (libnsspem.so) is available then PEM files +may be loaded. + +If this option is used several times, the last one will be used. +.IP "--capath " +(SSL) Tells curl to use the specified certificate directory to verify the +peer. The certificates must be in PEM format, and the directory must have been +processed using the c_rehash utility supplied with openssl. Using +\fI--capath\fP can allow curl to make SSL-connections much more efficiently +than using \fI--cacert\fP if the \fI--cacert\fP file contains many CA +certificates. + +If this option is used several times, the last one will be used. +.IP "-f/--fail" +(HTTP) Fail silently (no output at all) on server errors. This is mostly done +like this to better enable scripts etc to better deal with failed attempts. In +normal cases when a HTTP server fails to deliver a document, it returns an +HTML document stating so (which often also describes why and more). This flag +will prevent curl from outputting that and return error 22. + +This method is not fail-safe and there are occasions where non-successful +response codes will slip through, especially when authentication is involved +(response codes 401 and 407). + +If this option is used twice, the second will again disable silent failure. +.IP "--ftp-account [data]" +(FTP) When an FTP server asks for "account data" after user name and password +has been provided, this data is sent off using the ACCT command. (Added in +7.13.0) + +If this option is used twice, the second will override the previous use. +.IP "--ftp-create-dirs" +(FTP) When an FTP or SFTP URL/operation uses a path that doesn't currently exist on +the server, the standard behavior of curl is to fail. Using this option, curl +will instead attempt to create missing directories. + +If this option is used twice, the second will again disable directory creation. +.IP "--ftp-method [method]" +(FTP) Control what method curl should use to reach a file on a FTP(S) +server. The method argument should be one of the following alternatives: +.RS +.IP multicwd +curl does a single CWD operation for each path part in the given URL. For deep +hierarchies this means very many commands. This is how RFC1738 says it should +be done. This is the default but the slowest behavior. +.IP nocwd +curl does no CWD at all. curl will do SIZE, RETR, STOR etc and give a full +path to the server for all these commands. This is the fastest behavior. +.IP singlecwd +curl does one CWD with the full target directory and then operates on the file +\&"normally" (like in the multicwd case). This is somewhat more standards +compliant than 'nocwd' but without the full penalty of 'multicwd'. +.RE +.IP "--ftp-pasv" +(FTP) Use PASV when transferring. PASV is the internal default behavior, but +using this option can be used to override a previous --ftp-port option. (Added +in 7.11.0) + +If this option is used several times, the following occurrences make no +difference. +.IP "--ftp-alternative-to-user " +(FTP) If authenticating with the USER and PASS commands fails, send this +command. When connecting to Tumbleweed's Secure Transport server over FTPS +using a client certificate, using "SITE AUTH" will tell the server to retrieve +the username from the certificate. (Added in 7.15.5) +.IP "--ftp-skip-pasv-ip" +(FTP) Tell curl to not use the IP address the server suggests in its response +to curl's PASV command when curl connects the data connection. Instead curl +will re-use the same IP address it already uses for the control +connection. (Added in 7.14.2) + +This option has no effect if PORT, EPRT or EPSV is used instead of PASV. + +If this option is used twice, the second will again use the server's suggested +address. +.IP "--ftp-ssl" +(FTP) Try to use SSL/TLS for the FTP connection. Reverts to a non-secure +connection if the server doesn't support SSL/TLS. See also +\fI--ftp-ssl-control\fP and \fI--ftp-ssl-reqd\fP for different levels of +encryption required. (Added in 7.11.0) + +If this option is used twice, the second will again disable this. +.IP "--ftp-ssl-control" +(FTP) Require SSL/TLS for the ftp login, clear for transfer. Allows secure +authentication, but non-encrypted data transfers for efficiency. Fails the +transfer if the server doesn't support SSL/TLS. (Added in 7.16.0) + +If this option is used twice, the second will again disable this. +.IP "--ftp-ssl-reqd" +(FTP) Require SSL/TLS for the FTP connection. +Terminates the connection if the server doesn't support SSL/TLS. +(Added in 7.15.5) + +If this option is used twice, the second will again disable this. +.IP "--ftp-ssl-ccc" +(FTP) Use CCC (Clear Command Channel) +Shuts down the SSL/TLS layer after authenticating. The rest of the +control channel communication will be unencrypted. This allows +NAT routers to follow the FTP transaction. The default mode is +passive. See --ftp-ssl-ccc-mode for other modes. +(Added in 7.16.1) + +If this option is used twice, the second will again disable this. +.IP "--ftp-ssl-ccc-mode [active/passive]" +(FTP) Use CCC (Clear Command Channel) +Sets the CCC mode. The passive mode will not initiate the shutdown, but +instead wait for the server to do it, and will not reply to the +shutdown from the server. The active mode initiates the shutdown and +waits for a reply from the server. +(Added in 7.16.2) +.IP "-F/--form " +(HTTP) This lets curl emulate a filled in form in which a user has pressed the +submit button. This causes curl to POST data using the Content-Type +multipart/form-data according to RFC1867. This enables uploading of binary +files etc. To force the 'content' part to be a file, prefix the file name +with an @ sign. To just get the content part from a file, prefix the file name +with the letter <. The difference between @ and < is then that @ makes a file +get attached in the post as a file upload, while the < makes a text field and +just get the contents for that text field from a file. + +Example, to send your password file to the server, where +\&'password' is the name of the form-field to which /etc/passwd will be the +input: + +\fBcurl\fP -F password=@/etc/passwd www.mypasswords.com + +To read the file's content from stdin instead of a file, use - where the file +name should've been. This goes for both @ and < constructs. + +You can also tell curl what Content-Type to use by using 'type=', in a manner +similar to: + +\fBcurl\fP -F "web=@index.html;type=text/html" url.com + +or + +\fBcurl\fP -F "name=daniel;type=text/foo" url.com + +You can also explicitly change the name field of an file upload part by +setting filename=, like this: + +\fBcurl\fP -F "file=@localfile;filename=nameinpost" url.com + +See further examples and details in the MANUAL. + +This option can be used multiple times. +.IP "--form-string " +(HTTP) Similar to \fI--form\fP except that the value string for the named +parameter is used literally. Leading \&'@' and \&'<' characters, and the +\&';type=' string in the value have no special meaning. Use this in preference +to \fI--form\fP if there's any possibility that the string value may +accidentally trigger the \&'@' or \&'<' features of \fI--form\fP. +.IP "-g/--globoff" +This option switches off the "URL globbing parser". When you set this option, +you can specify URLs that contain the letters {}[] without having them being +interpreted by curl itself. Note that these letters are not normal legal URL +contents but they should be encoded according to the URI standard. +.IP "-G/--get" +When used, this option will make all data specified with \fI-d/--data\fP or +\fI--data-binary\fP to be used in a HTTP GET request instead of the POST +request that otherwise would be used. The data will be appended to the URL +with a '?' separator. + +If used in combination with -I, the POST data will instead be appended to the +URL with a HEAD request. + +If this option is used several times, the following occurrences make no +difference. +.IP "-h/--help" +Usage help. +.IP "-H/--header

    " +(HTTP) Extra header to use when getting a web page. You may specify any number +of extra headers. Note that if you should add a custom header that has the +same name as one of the internal ones curl would use, your externally set +header will be used instead of the internal one. This allows you to make even +trickier stuff than curl would normally do. You should not replace internally +set headers without knowing perfectly well what you're doing. Remove an +internal header by giving a replacement without content on the right side of +the colon, as in: -H \&"Host:". + +curl will make sure that each header you add/replace get sent with the proper +end of line marker, you should thus \fBnot\fP add that as a part of the header +content: do not add newlines or carriage returns they will only mess things up +for you. + +See also the \fI-A/--user-agent\fP and \fI-e/--referer\fP options. + +This option can be used multiple times to add/replace/remove multiple headers. +.IP "--hostpubmd5" +Pass a string containing 32 hexadecimal digits. The string should be the 128 +bit MD5 checksum of the remote host's public key, curl will refuse the +connection with the host unless the md5sums match. This option is only for SCP +and SFTP transfers. (Added in 7.17.1) +.IP "--ignore-content-length" +(HTTP) +Ignore the Content-Length header. This is particularly useful for servers +running Apache 1.x, which will report incorrect Content-Length for files +larger than 2 gigabytes. +.IP "-i/--include" +(HTTP) +Include the HTTP-header in the output. The HTTP-header includes things +like server-name, date of the document, HTTP-version and more... + +If this option is used twice, the second will again disable header include. +.IP "--interface " +Perform an operation using a specified interface. You can enter interface +name, IP address or host name. An example could look like: + + curl --interface eth0:1 http://www.netscape.com/ + +If this option is used several times, the last one will be used. +.IP "-I/--head" +(HTTP/FTP/FILE) +Fetch the HTTP-header only! HTTP-servers feature the command HEAD +which this uses to get nothing but the header of a document. When used +on a FTP or FILE file, curl displays the file size and last modification +time only. + +If this option is used twice, the second will again disable header only. +.IP "-j/--junk-session-cookies" +(HTTP) When curl is told to read cookies from a given file, this option will +make it discard all "session cookies". This will basically have the same effect +as if a new session is started. Typical browsers always discard session +cookies when they're closed down. + +If this option is used several times, each occurrence will toggle this on/off. +.IP "-k/--insecure" +(SSL) This option explicitly allows curl to perform "insecure" SSL connections +and transfers. All SSL connections are attempted to be made secure by using +the CA certificate bundle installed by default. This makes all connections +considered "insecure" to fail unless \fI-k/--insecure\fP is used. + +See this online resource for further details: +\fBhttp://curl.haxx.se/docs/sslcerts.html\fP + +If this option is used twice, the second time will again disable it. +.IP "--keepalive-time " +This option sets the time a connection needs to remain idle before sending +keepalive probes and the time between individual keepalive probes. It is +currently effective on operating systems offering the TCP_KEEPIDLE and +TCP_KEEPINTVL socket options (meaning Linux, recent AIX, HP-UX and more). This +option has no effect if \fI--no-keepalive\fP is used. (Added in 7.18.0) + +If this option is used multiple times, the last occurrence sets the amount. +.IP "--key " +(SSL/SSH) Private key file name. Allows you to provide your private key in this +separate file. + +If this option is used several times, the last one will be used. +.IP "--key-type " +(SSL) Private key file type. Specify which type your \fI--key\fP provided +private key is. DER, PEM and ENG are supported. If not specified, PEM is +assumed. + +If this option is used several times, the last one will be used. +.IP "--krb " +(FTP) Enable Kerberos authentication and use. The level must be entered and +should be one of 'clear', 'safe', 'confidential' or 'private'. Should you use +a level that is not one of these, 'private' will instead be used. + +This option requires that the library was built with kerberos4 or GSSAPI +(GSS-Negotiate) support. This is not very common. Use \fI-V/--version\fP to +see if your curl supports it. + +If this option is used several times, the last one will be used. +.IP "-K/--config " +Specify which config file to read curl arguments from. The config file is a +text file in which command line arguments can be written which then will be +used as if they were written on the actual command line. Options and their +parameters must be specified on the same config file line, separated by +white space, colon, the equals sign or any combination thereof (however, +the preferred separator is the equals sign). If the parameter is to contain +white spaces, the parameter must be enclosed within quotes. Within double +quotes, the following escape sequences are available: \\\\, \\", \\t, \\n, +\\r and \\v. A backlash preceding any other letter is ignored. If the +first column of a config line is a '#' character, the rest of the line will be +treated as a comment. Only write one option per physical line in the config +file. + +Specify the filename to -K/--config as '-' to make curl read the file from +stdin. + +Note that to be able to specify a URL in the config file, you need to specify +it using the \fI--url\fP option, and not by simply writing the URL on its own +line. So, it could look similar to this: + +url = "http://curl.haxx.se/docs/" + +Long option names can optionally be given in the config file without the +initial double dashes. + +When curl is invoked, it always (unless \fI-q\fP is used) checks for a default +config file and uses it if found. The default config file is checked for in +the following places in this order: + +1) curl tries to find the "home dir": It first checks for the CURL_HOME and +then the HOME environment variables. Failing that, it uses getpwuid() on +unix-like systems (which returns the home dir given the current user in your +system). On Windows, it then checks for the APPDATA variable, or as a last +resort the '%USERPROFILE%\Application Data'. + +2) On windows, if there is no _curlrc file in the home dir, it checks for one +in the same dir the executable curl is placed. On unix-like systems, it will +simply try to load .curlrc from the determined home dir. + +.nf +# --- Example file --- +# this is a comment +url = "curl.haxx.se" +output = "curlhere.html" +user-agent = "superagent/1.0" + +# and fetch another URL too +url = "curl.haxx.se/docs/manpage.html" +-O +referer = "http://nowhereatall.com/" +# --- End of example file --- +.fi + +This option can be used multiple times to load multiple config files. +.IP "--libcurl " +Append this option to any ordinary curl command line, and you will get a +libcurl-using source code written to the file that does the equivalent +operation of what your command line operation does! + +NOTE: this does not properly support -F and the sending of multipart +formposts, so in those cases the output program will be missing necessary +calls to \fIcurl_formadd(3)\fP, and possibly more. + +If this option is used several times, the last given file name will be +used. (Added in 7.16.1) +.IP "--limit-rate " +Specify the maximum transfer rate you want curl to use. This feature is useful +if you have a limited pipe and you'd like your transfer not use your entire +bandwidth. + +The given speed is measured in bytes/second, unless a suffix is appended. +Appending 'k' or 'K' will count the number as kilobytes, 'm' or M' makes it +megabytes while 'g' or 'G' makes it gigabytes. Examples: 200K, 3m and 1G. + +The given rate is the average speed, counted during the entire transfer. It +means that curl might use higher transfer speeds in short bursts, but over +time it uses no more than the given rate. + +If you are also using the \fI-Y/--speed-limit\fP option, that option will take +precedence and might cripple the rate-limiting slightly, to help keeping the +speed-limit logic working. + +If this option is used several times, the last one will be used. +.IP "-l/--list-only" +(FTP) +When listing an FTP directory, this switch forces a name-only view. +Especially useful if you want to machine-parse the contents of an FTP +directory since the normal directory view doesn't use a standard look +or format. + +This option causes an FTP NLST command to be sent. Some FTP servers +list only files in their response to NLST; they do not include +subdirectories and symbolic links. + +If this option is used twice, the second will again disable list only. +.IP "--local-port [-num]" +Set a preferred number or range of local port numbers to use for the +connection(s). Note that port numbers by nature is a scarce resource that +will be busy at times so setting this range to something too narrow might +cause unnecessary connection setup failures. (Added in 7.15.2) +.IP "-L/--location" +(HTTP/HTTPS) If the server reports that the requested page has moved to a +different location (indicated with a Location: header and a 3XX response code) +this option will make curl redo the request on the new place. If used together +with \fI-i/--include\fP or \fI-I/--head\fP, headers from all requested pages +will be shown. When authentication is used, curl only sends its credentials to +the initial host. If a redirect takes curl to a different host, it won't be +able to intercept the user+password. See also \fI--location-trusted\fP on how +to change this. You can limit the amount of redirects to follow by using the +\fI--max-redirs\fP option. + +When curl follows a redirect and the request is not a plain GET (for example +POST or PUT), it will do the following request with a GET if the HTTP response +was 301, 302, or 303. If the response code was any other 3xx code, curl will +re-send the following request using the same unmodified method. + +If this option is used twice, the second will again disable location following. +.IP "--location-trusted" +(HTTP/HTTPS) Like \fI-L/--location\fP, but will allow sending the name + +password to all hosts that the site may redirect to. This may or may not +introduce a security breach if the site redirects you do a site to which +you'll send your authentication info (which is plaintext in the case of HTTP +Basic authentication). + +If this option is used twice, the second will again disable location following. +.IP "--max-filesize " +Specify the maximum size (in bytes) of a file to download. If the file +requested is larger than this value, the transfer will not start and curl will +return with exit code 63. + +NOTE: The file size is not always known prior to download, and for such files +this option has no effect even if the file transfer ends up being larger than +this given limit. This concerns both FTP and HTTP transfers. +.IP "-m/--max-time " +Maximum time in seconds that you allow the whole operation to take. This is +useful for preventing your batch jobs from hanging for hours due to slow +networks or links going down. See also the \fI--connect-timeout\fP option. + +If this option is used several times, the last one will be used. +.IP "-M/--manual" +Manual. Display the huge help text. +.IP "-n/--netrc" +Makes curl scan the \fI.netrc\fP file in the user's home directory for login +name and password. This is typically used for ftp on unix. If used with http, +curl will enable user authentication. See +.BR netrc(4) +or +.BR ftp(1) +for details on the file format. Curl will not complain if that file +hasn't the right permissions (it should not be world nor group +readable). The environment variable "HOME" is used to find the home +directory. + +A quick and very simple example of how to setup a \fI.netrc\fP to allow curl +to ftp to the machine host.domain.com with user name \&'myself' and password +\&'secret' should look similar to: + +.B "machine host.domain.com login myself password secret" + +If this option is used twice, the second will again disable netrc usage. +.IP "--netrc-optional" +Very similar to \fI--netrc\fP, but this option makes the .netrc usage +\fBoptional\fP and not mandatory as the \fI--netrc\fP does. +.IP "--negotiate" +(HTTP) Enables GSS-Negotiate authentication. The GSS-Negotiate method was +designed by Microsoft and is used in their web applications. It is primarily +meant as a support for Kerberos5 authentication but may be also used along +with another authentication methods. For more information see IETF draft +draft-brezak-spnego-http-04.txt. + +If you want to enable Negotiate for your proxy authentication, then use +\fI--proxy-negotiate\fP. + +This option requires that the library was built with GSSAPI support. This is +not very common. Use \fI-V/--version\fP to see if your version supports +GSS-Negotiate. + +When using this option, you must also provide a fake -u/--user option to +activate the authentication code properly. Sending a '-u :' is enough as the +user name and password from the -u option aren't actually used. + +If this option is used several times, the following occurrences make no +difference. +.IP "-N/--no-buffer" +Disables the buffering of the output stream. In normal work situations, curl +will use a standard buffered output stream that will have the effect that it +will output the data in chunks, not necessarily exactly when the data arrives. +Using this option will disable that buffering. + +If this option is used twice, the second will again switch on buffering. +.IP "--no-keepalive" +Disables the use of keepalive messages on the TCP connection, as by default +curl enables them. + +If this option is used twice, the second will again enable keepalive. +.IP "--no-sessionid" +(SSL) Disable curl's use of SSL session-ID caching. By default all transfers +are done using the cache. Note that while nothing ever should get hurt by +attempting to reuse SSL session-IDs, there seem to be broken SSL +implementations in the wild that may require you to disable this in order for +you to succeed. (Added in 7.16.0) + +If this option is used twice, the second will again switch on use of the +session cache. +.IP "--ntlm" +(HTTP) Enables NTLM authentication. The NTLM authentication method was +designed by Microsoft and is used by IIS web servers. It is a proprietary +protocol, reversed engineered by clever people and implemented in curl based +on their efforts. This kind of behavior should not be endorsed, you should +encourage everyone who uses NTLM to switch to a public and documented +authentication method instead. Such as Digest. + +If you want to enable NTLM for your proxy authentication, then use +\fI--proxy-ntlm\fP. + +This option requires that the library was built with SSL support. Use +\fI-V/--version\fP to see if your curl supports NTLM. + +If this option is used several times, the following occurrences make no +difference. +.IP "-o/--output " +Write output to instead of stdout. If you are using {} or [] to fetch +multiple documents, you can use '#' followed by a number in the +specifier. That variable will be replaced with the current string for the URL +being fetched. Like in: + + curl http://{one,two}.site.com -o "file_#1.txt" + +or use several variables like: + + curl http://{site,host}.host[1-5].com -o "#1_#2" + +You may use this option as many times as you have number of URLs. + +See also the \fI--create-dirs\fP option to create the local directories +dynamically. +.IP "-O/--remote-name" +Write output to a local file named like the remote file we get. (Only the file +part of the remote file is used, the path is cut off.) + +The remote file name to use for saving is extracted from the given URL, +nothing else. + +You may use this option as many times as you have number of URLs. +.IP "--pass " +(SSL/SSH) Pass phrase for the private key + +If this option is used several times, the last one will be used. +.IP "--post301" +Tells curl to respect RFC 2616/10.3.2 and not convert POST requests into GET +requests when following a 301 redirection. The non-RFC behaviour is ubiquitous +in web browsers, so curl does the conversion by default to maintain +consistency. However, a server may requires a POST to remain a POST after such +a redirection. This option is meaningful only when using \fI-L/--location\fP +(Added in 7.17.1) +.IP "--proxy-anyauth" +Tells curl to pick a suitable authentication method when communicating with +the given proxy. This might cause an extra request/response round-trip. (Added +in 7.13.2) + +If this option is used twice, the second will again disable the proxy use-any +authentication. +.IP "--proxy-basic" +Tells curl to use HTTP Basic authentication when communicating with the given +proxy. Use \fI--basic\fP for enabling HTTP Basic with a remote host. Basic is +the default authentication method curl uses with proxies. + +If this option is used twice, the second will again disable proxy HTTP Basic +authentication. +.IP "--proxy-digest" +Tells curl to use HTTP Digest authentication when communicating with the given +proxy. Use \fI--digest\fP for enabling HTTP Digest with a remote host. + +If this option is used twice, the second will again disable proxy HTTP Digest. +.IP "--proxy-negotiate" +Tells curl to use HTTP Negotiate authentication when communicating +with the given proxy. Use \fI--negotiate\fP for enabling HTTP Negotiate +with a remote host. + +If this option is used twice, the second will again disable proxy HTTP +Negotiate. (Added in 7.17.1) +.IP "--proxy-ntlm" +Tells curl to use HTTP NTLM authentication when communicating with the given +proxy. Use \fI--ntlm\fP for enabling NTLM with a remote host. + +If this option is used twice, the second will again disable proxy HTTP NTLM. +.IP "-p/--proxytunnel" +When an HTTP proxy is used (\fI-x/--proxy\fP), this option will cause non-HTTP +protocols to attempt to tunnel through the proxy instead of merely using it to +do HTTP-like operations. The tunnel approach is made with the HTTP proxy +CONNECT request and requires that the proxy allows direct connect to the +remote port number curl wants to tunnel through to. + +If this option is used twice, the second will again disable proxy tunnel. +.IP "--pubkey " +(SSH) Public key file name. Allows you to provide your public key in this +separate file. + +If this option is used several times, the last one will be used. +.IP "-P/--ftp-port
    " +(FTP) Reverses the initiator/listener roles when connecting with ftp. This +switch makes Curl use the PORT command instead of PASV. In practise, PORT +tells the server to connect to the client's specified address and port, while +PASV asks the server for an ip address and port to connect to.
    +should be one of: +.RS +.IP interface +i.e "eth0" to specify which interface's IP address you want to use (Unix only) +.IP "IP address" +i.e "192.168.10.1" to specify exact IP number +.IP "host name" +i.e "my.host.domain" to specify machine +.IP "-" +make curl pick the same IP address that is already used for the control +connection +.RE + +If this option is used several times, the last one will be used. Disable the +use of PORT with \fI--ftp-pasv\fP. Disable the attempt to use the EPRT command +instead of PORT by using \fI--disable-eprt\fP. EPRT is really PORT++. +.IP "-q" +If used as the first parameter on the command line, the \fIcurlrc\fP config +file will not be read and used. See the \fI-K/--config\fP for details on the +default config file search path. +.IP "-Q/--quote " +(FTP/SFTP) Send an arbitrary command to the remote FTP or SFTP server. Quote +commands are sent BEFORE the transfer is taking place (just after the +initial PWD command in an FTP transfer, to be exact). To make commands +take place after a successful transfer, prefix them with a dash '-'. +To make commands get sent after libcurl has changed working directory, +just before the transfer command(s), prefix the command with '+' (this +is only supported for FTP). You may specify any number of commands. If +the server returns failure for one of the commands, the entire operation +will be aborted. You must send syntactically correct FTP commands as +RFC959 defines to FTP servers, or one of the following commands (with +appropriate arguments) to SFTP servers: chgrp, chmod, chown, ln, mkdir, +pwd, rename, rm, rmdir, symlink. + +This option can be used multiple times. +.IP "--random-file " +(SSL) Specify the path name to file containing what will be considered as +random data. The data is used to seed the random engine for SSL connections. +See also the \fI--egd-file\fP option. +.IP "-r/--range " +(HTTP/FTP/FILE) Retrieve a byte range (i.e a partial document) from a +HTTP/1.1, FTP server or a local FILE. Ranges can be specified in a number of +ways. +.RS +.TP 10 +.B 0-499 +specifies the first 500 bytes +.TP +.B 500-999 +specifies the second 500 bytes +.TP +.B -500 +specifies the last 500 bytes +.TP +.B 9500- +specifies the bytes from offset 9500 and forward +.TP +.B 0-0,-1 +specifies the first and last byte only(*)(H) +.TP +.B 500-700,600-799 +specifies 300 bytes from offset 500(H) +.TP +.B 100-199,500-599 +specifies two separate 100 bytes ranges(*)(H) +.RE + +(*) = NOTE that this will cause the server to reply with a multipart +response! + +Only digit characters (0-9) are valid in 'start' and 'stop' of range syntax +\&'start-stop'. If a non-digit character is given in the range, the server's +response will be indeterminable, depending on different server's configuration. + +You should also be aware that many HTTP/1.1 servers do not have this feature +enabled, so that when you attempt to get a range, you'll instead get the whole +document. + +FTP range downloads only support the simple syntax 'start-stop' (optionally +with one of the numbers omitted). It depends on the non-RFC command SIZE. + +If this option is used several times, the last one will be used. +.IP "--raw" +When used, it disables all internal HTTP decoding of content or transfer +encodings and instead makes them passed on unaltered, raw. (Added in 7.16.2) + +If this option is used several times, each occurrence toggles this on/off. +.IP "-R/--remote-time" +When used, this will make libcurl attempt to figure out the timestamp of the +remote file, and if that is available make the local file get that same +timestamp. + +If this option is used twice, the second time disables this again. +.IP "--retry " +If a transient error is returned when curl tries to perform a transfer, it +will retry this number of times before giving up. Setting the number to 0 +makes curl do no retries (which is the default). Transient error means either: +a timeout, an FTP 5xx response code or an HTTP 5xx response code. + +When curl is about to retry a transfer, it will first wait one second and then +for all forthcoming retries it will double the waiting time until it reaches +10 minutes which then will be the delay between the rest of the retries. By +using \fI--retry-delay\fP you disable this exponential backoff algorithm. See +also \fI--retry-max-time\fP to limit the total time allowed for +retries. (Added in 7.12.3) + +If this option is used multiple times, the last occurrence decide the amount. +.IP "--retry-delay " +Make curl sleep this amount of time between each retry when a transfer has +failed with a transient error (it changes the default backoff time algorithm +between retries). This option is only interesting if \fI--retry\fP is also +used. Setting this delay to zero will make curl use the default backoff time. +(Added in 7.12.3) + +If this option is used multiple times, the last occurrence decide the amount. +.IP "--retry-max-time " +The retry timer is reset before the first transfer attempt. Retries will be +done as usual (see \fI--retry\fP) as long as the timer hasn't reached this +given limit. Notice that if the timer hasn't reached the limit, the request +will be made and while performing, it may take longer than this given time +period. To limit a single request\'s maximum time, use \fI-m/--max-time\fP. +Set this option to zero to not timeout retries. (Added in 7.12.3) + +If this option is used multiple times, the last occurrence decide the amount. +.IP "-s/--silent" +Silent mode. Don't show progress meter or error messages. Makes +Curl mute. + +If this option is used twice, the second will again disable silent mode. +.IP "-S/--show-error" +When used with -s it makes curl show error message if it fails. + +If this option is used twice, the second will again disable show error. +.IP "--socks4 " +Use the specified SOCKS4 proxy. If the port number is not specified, it is +assumed at port 1080. (Added in 7.15.2) + +This option overrides any previous use of \fI-x/--proxy\fP, as they are +mutually exclusive. + +If this option is used several times, the last one will be used. +.IP "--socks4a " +Use the specified SOCKS4a proxy. If the port number is not specified, it is +assumed at port 1080. (Added in 7.18.0) + +This option overrides any previous use of \fI-x/--proxy\fP, as they are +mutually exclusive. + +If this option is used several times, the last one will be used. +.IP "--socks5-hostname " +Use the specified SOCKS5 proxy (and let the proxy resolve the host name). If +the port number is not specified, it is assumed at port 1080. (Added in +7.18.0) + +This option overrides any previous use of \fI-x/--proxy\fP, as they are +mutually exclusive. + +If this option is used several times, the last one will be used. (This option +was previously wrongly documented and used as --socks without the number +appended.) +.IP "--socks5 " +Use the specified SOCKS5 proxy - but resolve the host name locally. If the +port number is not specified, it is assumed at port 1080. + +This option overrides any previous use of \fI-x/--proxy\fP, as they are +mutually exclusive. + +If this option is used several times, the last one will be used. (This option +was previously wrongly documented and used as --socks without the number +appended.) +.IP "--stderr " +Redirect all writes to stderr to the specified file instead. If the file name +is a plain '-', it is instead written to stdout. This option has no point when +you're using a shell with decent redirecting capabilities. + +If this option is used several times, the last one will be used. +.IP "--tcp-nodelay" +Turn on the TCP_NODELAY option. See the \fIcurl_easy_setopt(3)\fP man page for +details about this option. (Added in 7.11.2) + +If this option is used several times, each occurrence toggles this on/off. +.IP "-t/--telnet-option " +Pass options to the telnet protocol. Supported options are: + +TTYPE= Sets the terminal type. + +XDISPLOC= Sets the X display location. + +NEW_ENV= Sets an environment variable. +.IP "-T/--upload-file " +This transfers the specified local file to the remote URL. If there is no file +part in the specified URL, Curl will append the local file name. NOTE that you +must use a trailing / on the last directory to really prove to Curl that there +is no file name or curl will think that your last directory name is the remote +file name to use. That will most likely cause the upload operation to fail. If +this is used on a http(s) server, the PUT command will be used. + +Use the file name "-" (a single dash) to use stdin instead of a given file. + +You can specify one -T for each URL on the command line. Each -T + URL pair +specifies what to upload and to where. curl also supports "globbing" of the -T +argument, meaning that you can upload multiple files to a single URL by using +the same URL globbing style supported in the URL, like this: + +curl -T "{file1,file2}" http://www.uploadtothissite.com + +or even + +curl -T "img[1-1000].png" ftp://ftp.picturemania.com/upload/ +.IP "--trace " +Enables a full trace dump of all incoming and outgoing data, including +descriptive information, to the given output file. Use "-" as filename to have +the output sent to stdout. + +This option overrides previous uses of \fI-v/--verbose\fP or +\fI--trace-ascii\fP. + +If this option is used several times, the last one will be used. +.IP "--trace-ascii " +Enables a full trace dump of all incoming and outgoing data, including +descriptive information, to the given output file. Use "-" as filename to have +the output sent to stdout. + +This is very similar to \fI--trace\fP, but leaves out the hex part and only +shows the ASCII part of the dump. It makes smaller output that might be easier +to read for untrained humans. + +This option overrides previous uses of \fI-v/--verbose\fP or \fI--trace\fP. + +If this option is used several times, the last one will be used. +.IP "--trace-time" +Prepends a time stamp to each trace or verbose line that curl displays. +(Added in 7.14.0) + +If this option is used several times, each occurrence will toggle it on/off. +.IP "-u/--user " +Specify user and password to use for server authentication. Overrides +\fI-n/--netrc\fP and \fI--netrc-optional\fP. + +If you just give the user name (without entering a colon) curl will prompt for +a password. + +If you use an SSPI-enabled curl binary and do NTLM authentication, you can +force curl to pick up the user name and password from your environment by +simply specifying a single colon with this option: "-u :". + +If this option is used several times, the last one will be used. +.IP "-U/--proxy-user " +Specify user and password to use for proxy authentication. + +If you use an SSPI-enabled curl binary and do NTLM authentication, you can +force curl to pick up the user name and password from your environment by +simply specifying a single colon with this option: "-U :". + +If this option is used several times, the last one will be used. +.IP "--url " +Specify a URL to fetch. This option is mostly handy when you want to specify +URL(s) in a config file. + +This option may be used any number of times. To control where this URL is +written, use the \fI-o/--output\fP or the \fI-O/--remote-name\fP options. +.IP "-v/--verbose" +Makes the fetching more verbose/talkative. Mostly usable for debugging. Lines +starting with '>' means "header data" sent by curl, '<' means "header data" +received by curl that is hidden in normal cases and lines starting with '*' +means additional info provided by curl. + +Note that if you only want HTTP headers in the output, \fI-i/--include\fP +might be option you're looking for. + +If you think this option still doesn't give you enough details, consider using +\fI--trace\fP or \fI--trace-ascii\fP instead. + +This option overrides previous uses of \fI--trace-ascii\fP or \fI--trace\fP. + +If this option is used twice, the second will do nothing extra. +.IP "-V/--version" +Displays information about curl and the libcurl version it uses. + +The first line includes the full version of curl, libcurl and other 3rd party +libraries linked with the executable. + +The second line (starts with "Protocols:") shows all protocols that libcurl +reports to support. + +The third line (starts with "Features:") shows specific features libcurl +reports to offer. Available features include: +.RS +.IP "IPv6" +You can use IPv6 with this. +.IP "krb4" +Krb4 for ftp is supported. +.IP "SSL" +HTTPS and FTPS are supported. +.IP "libz" +Automatic decompression of compressed files over HTTP is supported. +.IP "NTLM" +NTLM authentication is supported. +.IP "GSS-Negotiate" +Negotiate authentication and krb5 for ftp is supported. +.IP "Debug" +This curl uses a libcurl built with Debug. This enables more error-tracking +and memory debugging etc. For curl-developers only! +.IP "AsynchDNS" +This curl uses asynchronous name resolves. +.IP "SPNEGO" +SPNEGO Negotiate authentication is supported. +.IP "Largefile" +This curl supports transfers of large files, files larger than 2GB. +.IP "IDN" +This curl supports IDN - international domain names. +.IP "SSPI" +SSPI is supported. If you use NTLM and set a blank user name, curl will +authenticate with your current user and password. +.RE +.IP "-w/--write-out " +Defines what to display on stdout after a completed and successful +operation. The format is a string that may contain plain text mixed with any +number of variables. The string can be specified as "string", to get read from +a particular file you specify it "@filename" and to tell curl to read the +format from stdin you write "@-". + +The variables present in the output format will be substituted by the value or +text that curl thinks fit, as described below. All variables are specified +like %{variable_name} and to output a normal % you just write them like +%%. You can output a newline by using \\n, a carriage return with \\r and a tab +space with \\t. + +.B NOTE: +The %-letter is a special letter in the win32-environment, where all +occurrences of % must be doubled when using this option. + +Available variables are at this point: +.RS +.TP 15 +.B url_effective +The URL that was fetched last. This is mostly meaningful if you've told curl +to follow location: headers. +.TP +.B http_code +The numerical code that was found in the last retrieved HTTP(S) page. +.TP +.B http_connect +The numerical code that was found in the last response (from a proxy) to a +curl CONNECT request. (Added in 7.12.4) +.TP +.B time_total +The total time, in seconds, that the full operation lasted. The time will be +displayed with millisecond resolution. +.TP +.B time_namelookup +The time, in seconds, it took from the start until the name resolving was +completed. +.TP +.B time_connect +The time, in seconds, it took from the start until the connect to the remote +host (or proxy) was completed. +.TP +.B time_pretransfer +The time, in seconds, it took from the start until the file transfer is just +about to begin. This includes all pre-transfer commands and negotiations that +are specific to the particular protocol(s) involved. +.TP +.B time_redirect +The time, in seconds, it took for all redirection steps include name lookup, +connect, pretransfer and transfer before final transaction was +started. time_redirect shows the complete execution time for multiple +redirections. (Added in 7.12.3) +.TP +.B time_starttransfer +The time, in seconds, it took from the start until the first byte is just about +to be transferred. This includes time_pretransfer and also the time the +server needs to calculate the result. +.TP +.B size_download +The total amount of bytes that were downloaded. +.TP +.B size_upload +The total amount of bytes that were uploaded. +.TP +.B size_header +The total amount of bytes of the downloaded headers. +.TP +.B size_request +The total amount of bytes that were sent in the HTTP request. +.TP +.B speed_download +The average download speed that curl measured for the complete download. +.TP +.B speed_upload +The average upload speed that curl measured for the complete upload. +.TP +.B content_type +The Content-Type of the requested document, if there was any. +.TP +.B num_connects +Number of new connects made in the recent transfer. (Added in 7.12.3) +.TP +.B num_redirects +Number of redirects that were followed in the request. (Added in 7.12.3) +.TP +.B ftp_entry_path +The initial path libcurl ended up in when logging on to the remote FTP +server. (Added in 7.15.4) +.RE + +If this option is used several times, the last one will be used. +.IP "-x/--proxy " +Use specified HTTP proxy. If the port number is not specified, it is assumed +at port 1080. + +This option overrides existing environment variables that sets proxy to +use. If there's an environment variable setting a proxy, you can set proxy to +\&"" to override it. + +\fBNote\fP that all operations that are performed over a HTTP proxy will +transparently be converted to HTTP. It means that certain protocol specific +operations might not be available. This is not the case if you can tunnel +through the proxy, as done with the \fI-p/--proxytunnel\fP option. + +Starting with 7.14.1, the proxy host can be specified the exact same way as +the proxy environment variables, include protocol prefix (http://) and +embedded user + password. + +If this option is used several times, the last one will be used. +.IP "-X/--request " +(HTTP) Specifies a custom request method to use when communicating with the +HTTP server. The specified request will be used instead of the method +otherwise used (which defaults to GET). Read the HTTP 1.1 specification for +details and explanations. + +(FTP) +Specifies a custom FTP command to use instead of LIST when doing file lists +with ftp. + +If this option is used several times, the last one will be used. +.IP "-y/--speed-time

    \n"); + &html_pop_if('DD'); + } + &html_pop_if(); + if (@tables) { + ($table_type, $in_table) = split($;, $tables[0]); + } else { + $in_table = 0; + } + } elsif (defined($def_map{$end_tag})) { + push(@lines, &debug("\n", __LINE__)); + } elsif ($end_tag eq 'menu') { + &html_pop_if(); + push(@lines, $_); # must keep it for pass 2 + } + next; + } + ############################################################# + # anchor insertion + while (/\@anchor\s*\{(.*?)\}/) + { + $_ = $`.$'; + my $anchor = $1; + $anchor = &normalise_node($anchor); + push @lines, &html_debug("\n"); + $node2href{$anchor} = "$docu_doc#$anchor"; + next INPUT_LINE if $_ =~ /^\s*$/; + } + + ############################################################# + # index entry generation, after value substitutions + if (/^\@(\w+?)index\s+/) + { + EnterIndexEntry($1, $', $docu_doc, $section, \@lines); + next; + } + # + # protect texi and HTML things + &protect_texi; + $_ = &protect_html($_) unless $dont_html; + $dont_html = 0; + # substitution (unsupported things) + s/^\@exdent\s+//g; + s/\@noindent\s+//g; + s/\@refill\s+//g; + # other substitutions + &simple_substitutions; + s/\@footnote\{/\@footnote$docu_doc\{/g; # mark footnotes, cf. pass 4 + # + # analyze the tag again + # + if ($tag) { + if (defined($sec2level{$tag}) && $sec2level{$tag} > 0) { + if (/^\@$tag\s+(.+)$/) { + $name = $1; + $name = &normalise_node($name); + $level = $sec2level{$tag}; + # check for index + $first_index_chapter = $name + if ($level == 1 && !$first_index_chapter && + $name =~ /index/i); + if ($in_top && /heading/){ + $T2H_HAS_TOP_HEADING = 1; + $_ = &debug("$name\n", __LINE__); + &html_push_if('body'); + print "# top heading, section $name, level $level\n" + if $T2H_DEBUG & $DEBUG_TOC; + } + else + { + unless (/^\@\w*heading/) + { + unless (/^\@unnumbered/) + { + my $number = &update_sec_num($tag, $level); + $name = $number. ' ' . $name if $T2H_NUMBER_SECTIONS; + $sec2number{$name} = $number; + $number2sec{$number} = $name; + } + if (defined($toplevel)) + { + push @lines, ($level==$toplevel ? $CHAPTEREND : $SECTIONEND); + } + else + { + # first time we see a "section" + unless ($level == 1) + { + warn "$WARN The first section found is not of level 1: $_"; + } + $toplevel = $level; + } + push(@sections, $name); + next_doc() if ($T2H_SPLIT eq 'section' || + $T2H_SPLIT && $level == $toplevel); + } + $sec_num++; + $docid = "SEC$sec_num"; + $tocid = (/^\@\w*heading/ ? undef : "TOC$sec_num"); + # check biblio and glossary + $in_bibliography = ($name =~ /^([A-Z]|\d+)?(\.\d+)*\s*bibliography$/i); + $in_glossary = ($name =~ /^([A-Z]|\d+)?(\.\d+)*\s*glossary$/i); + # check node + if ($node) + { + warn "$ERROR Duplicate node found: $node\n" + if ($node2sec{$node}); + } + else + { + $name .= ' ' while ($node2sec{$name}); + $node = $name; + } + $name .= ' ' while ($sec2node{$name}); + $section = $name; + $node2sec{$node} = $name; + $sec2node{$name} = $node; + $node2href{$node} = "$docu_doc#$docid"; + $node2next{$node} = $node_next; + $node2prev{$node} = $node_prev; + $node2up{$node} = $node_up; + print "# node $node, section $name, level $level\n" + if $T2H_DEBUG & $DEBUG_TOC; + + $node = ''; + $node_next = ''; + $node_prev = ''; + $node_next = ''; + if ($tocid) + { + # update TOC + while ($level > $curlevel) { + $curlevel++; + push(@toc_lines, "
      \n"); + } + while ($level < $curlevel) { + $curlevel--; + push(@toc_lines, "
    \n"); + } + $_ = &t2h_anchor($tocid, "$docu_doc#$docid", $name, 1); + $_ = &substitute_style($_); + push(@stoc_lines, "$_
    \n") if ($level == 1); + if ($T2H_NUMBER_SECTIONS) + { + push(@toc_lines, $_ . "
    \n") + } + else + { + push(@toc_lines, "

    22s)!dJnEvF^B7?fhR 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 v=Yn2o)pjufAlrVLk#shGh0J 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

  • " . $_ ."
  • "); + } + } + else + { + push(@lines, &html_debug("\n", + __LINE__)); + } + # update DOC + push(@lines, &html_debug('', __LINE__)); + &html_reset; + $_ = " $name \n\n"; + $_ = &debug($_, __LINE__); + push(@lines, &html_debug('', __LINE__)); + } + # update DOC + foreach $line (split(/\n+/, $_)) { + push(@lines, "$line\n"); + } + next; + } else { + warn "$ERROR Bad section line: $_"; + } + } else { + # track variables + $value{$1} = Unprotect_texi($2), next if /^\@set\s+($VARRE)\s+(.*)$/o; + delete $value{$1}, next if /^\@clear\s+($VARRE)\s*$/o; + # store things + $value{'_shorttitle'} = Unprotect_texi($1), next if /^\@shorttitle\s+(.*)$/; + $value{'_setfilename'} = Unprotect_texi($1), next if /^\@setfilename\s+(.*)$/; + $value{'_settitle'} = Unprotect_texi($1), next if /^\@settitle\s+(.*)$/; + $value{'_author'} .= Unprotect_texi($1)."\n", next if /^\@author\s+(.*)$/; + $value{'_subtitle'} .= Unprotect_texi($1)."\n", next if /^\@subtitle\s+(.*)$/; + $value{'_title'} .= Unprotect_texi($1)."\n", next if /^\@title\s+(.*)$/; + + # list item + if (/^\s*\@itemx?\s+/) { + $what = $'; + $what =~ s/\s+$//; + if ($in_bibliography && $use_bibliography) { + if ($what =~ /^$BIBRE$/o) { + $id = 'BIB' . ++$bib_num; + $bib2href{$what} = "$docu_doc#$id"; + print "# found bibliography for '$what' id $id\n" + if $T2H_DEBUG & $DEBUG_BIB; + $what = &t2h_anchor($id, '', $what); + } + } elsif ($in_glossary && $T2H_USE_GLOSSARY) { + $id = 'GLOSS' . ++$gloss_num; + $entry = $what; + $entry =~ tr/A-Z/a-z/ unless $entry =~ /^[A-Z\s]+$/; + $gloss2href{$entry} = "$docu_doc#$id"; + print "# found glossary for '$entry' id $id\n" + if $T2H_DEBUG & $DEBUG_GLOSS; + $what = &t2h_anchor($id, '', $what); + } + elsif ($in_table && ($table_type eq 'f' || $table_type eq 'v')) + { + EnterIndexEntry($table_type, $what, $docu_doc, $section, \@lines); + } + &html_pop_if('P'); + if ($html_element eq 'DL' || $html_element eq 'DD') { + if ($things_map{$in_table} && !$what) { + # special case to allow @table @bullet for instance + push(@lines, &debug("
    $things_map{$in_table}\n", __LINE__)); + } else { + push(@lines, &debug("
    \@$in_table\{$what\}\n", __LINE__)); + } + push(@lines, "
    "); + &html_push('DD') unless $html_element eq 'DD'; + if ($table_type) { # add also an index + unshift(@input_spool, "\@${table_type}index $what\n"); + } + } elsif ($html_element eq 'TABLE') { + push(@lines, &debug("$what\n", __LINE__)); + &html_push('TR'); + } elsif ($html_element eq 'TR') { + push(@lines, &debug("\n", __LINE__)); + push(@lines, &debug("$what\n", __LINE__)); + } else { + push(@lines, &debug("
  • $what\n", __LINE__)); + &html_push('LI') unless $html_element eq 'LI'; + } + push(@lines, &html_debug('', __LINE__)); + if ($deferred_ref) { + push(@lines, &debug("$deferred_ref\n", __LINE__)); + $deferred_ref = ''; + } + next; + } elsif (/^\@tab\s+(.*)$/) { + push(@lines, "$1\n"); + next; + } + } + } + # paragraph separator + if ($_ eq "\n" && ! $in_pre) { + next if $#lines >= 0 && $lines[$#lines] eq "\n"; + if ($html_element eq 'P') { + push (@lines, &debug("

    \n", __LINE__)); + } +# else +# { +# push(@lines, "

    \n"); +# $_ = &debug("

    \n", __LINE__); +# } + elsif ($html_element eq 'body' || $html_element eq 'BLOCKQUOTE' || $html_element eq 'DD' || $html_element eq 'LI') + { + &html_push('P'); + push(@lines, &debug("

    \n", __LINE__)); + } + } + # otherwise + push(@lines, $_) unless $in_titlepage; + push(@lines, &debug("\n", __LINE__)) if ($tag eq 'center'); +} + +# finish TOC +$level = 0; +while ($level < $curlevel) { + $curlevel--; + push(@toc_lines, "\n"); +} + +print "# end of pass 1\n" if $T2H_VERBOSE; + +SetDocumentLanguage('en') unless ($T2H_LANG); +#+++############################################################################ +# # +# Stuff related to Index generation # +# # +#---############################################################################ + +sub EnterIndexEntry +{ + my $prefix = shift; + my $key = shift; + my $docu_doc = shift; + my $section = shift; + my $lines = shift; + local $_; + + warn "$ERROR Undefined index command: $_", next + unless (exists ($index_properties->{$prefix})); + $key =~ s/\s+$//; + $_ = $key; + &protect_texi; + $key = $_; + $_ = &protect_html($_); + my $html_key = substitute_style($_); + my $id; + $key = remove_style($key); + $key = remove_things($key); + $_ = $key; + &unprotect_texi; + $key = $_; + while (exists $index->{$prefix}->{$key}) {$key .= ' '}; + if ($lines->[$#lines] =~ /^$/) + { + $id = $1; + } + else + { + $id = 'IDX' . ++$idx_num; + push(@$lines, &t2h_anchor($id, '', $T2H_INVISIBLE_MARK, !$in_pre)); + } + $index->{$prefix}->{$key}->{html_key} = $html_key; + $index->{$prefix}->{$key}->{section} = $section; + $index->{$prefix}->{$key}->{href} = "$docu_doc#$id"; + print "# found ${prefix}index for '$key' with id $id\n" + if $T2H_DEBUG & $DEBUG_INDEX; +} + +sub IndexName2Prefix +{ + my $name = shift; + my $prefix; + + for $prefix (keys %$index_properties) + { + return $prefix if ($index_properties->{$prefix}->{name} eq $name); + } + return undef; +} + +sub GetIndexEntries +{ + my $normal = shift; + my $code = shift; + my ($entries, $prefix, $key) = ({}); + + for $prefix (keys %$normal) + { + for $key (keys %{$index->{$prefix}}) + { + $entries->{$key} = {%{$index->{$prefix}->{$key}}}; + } + } + + if (defined($code)) + { + for $prefix (keys %$code) + { + unless (exists $normal->{$keys}) + { + for $key (keys %{$index->{$prefix}}) + { + $entries->{$key} = {%{$index->{$prefix}->{$key}}}; + $entries->{$key}->{html_key} = "$entries->{$key}->{html_key}"; + } + } + } + } + return $entries; +} + +sub byAlpha +{ + if ($a =~ /^[A-Za-z]/) + { + if ($b =~ /^[A-Za-z]/) + { + return lc($a) cmp lc($b); + } + else + { + return 1; + } + } + elsif ($b =~ /^[A-Za-z]/) + { + return -1; + } + else + { + return lc($a) cmp lc($b); + } +} + +sub GetIndexPages +{ + my $entries = shift; + my (@Letters, $key); + my ($EntriesByLetter, $Pages, $page) = ({}, [], {}); + my @keys = sort byAlpha keys %$entries; + + for $key (@keys) + { + push @{$EntriesByLetter->{uc(substr($key,0, 1))}} , $entries->{$key}; + } + @Letters = sort byAlpha keys %$EntriesByLetter; + + $T2H_SPLIT_INDEX = 0 unless ($T2H_SPLIT); + + unless ($T2H_SPLIT_INDEX) + { + $page->{First} = $Letters[0]; + $page->{Last} = $Letters[$#Letters]; + $page->{Letters} = \@Letters; + $page->{EntriesByLetter} = $EntriesByLetter; + push @$Pages, $page; + return $Pages; + } + + if ($T2H_SPLIT_INDEX =~ /^\d+$/) + { + my $i = 0; + my ($prev_letter, $letter); + $page->{First} = $Letters[0]; + for $letter (@Letters) + { + if ($i > $T2H_SPLIT_INDEX) + { + $page->{Last} = $prev_letter; + push @$Pages, {%$page}; + $page->{Letters} = []; + $page->{EntriesByLetter} = {}; + $page->{First} = $letter; + $i=0; + } + push @{$page->{Letters}}, $letter; + $page->{EntriesByLetter}->{$letter} = [@{$EntriesByLetter->{$letter}}]; + $i += scalar(@{$EntriesByLetter->{$letter}}); + $prev_letter = $letter; + } + $page->{Last} = $Letters[$#Letters]; + push @$Pages, {%$page}; + } + return $Pages; +} + +sub GetIndexSummary +{ + my $first_page = shift; + my $Pages = shift; + my $name = shift; + my ($page, $letter, $summary, $i, $l1, $l2, $l); + + $i = 0; + $summary = '
    Jump to:   '; + + for $page ($first_page, @$Pages) + { + for $letter (@{$page->{Letters}}) + { + $l = t2h_anchor('', "$page->{href}#${name}_$letter", "$letter", + 0, 'style="text-decoration:none"') . "\n   \n"; + + if ($letter =~ /^[A-Za-z]/) + { + $l2 .= $l; + } + else + { + $l1 .= $l; + } + } + } + $summary .= $l1 . "
    \n" if ($l1); + $summary .= $l2 . '

    '; + return $summary; +} + +sub PrintIndexPage +{ + my $lines = shift; + my $summary = shift; + my $page = shift; + my $name = shift; + + push @$lines, $summary; + + push @$lines , <

    + + + +EOT + + for $letter (@{$page->{Letters}}) + { + push @$lines, "\n"; + for $entry (@{$page->{EntriesByLetter}->{$letter}}) + { + push @$lines, + "\n"; + } + push @$lines, "\n"; + } + push @$lines, "
    Index Entry Section

    $letter
    " . + t2h_anchor('', $entry->{href}, $entry->{html_key}) . + "" . + t2h_anchor('', sec_href($entry->{section}), clean_name($entry->{section})) . + "

    "; + push @$lines, $summary; +} + +sub PrintIndex +{ + my $lines = shift; + my $name = shift; + my $section = shift; + $section = 'Top' unless $section; + my $prefix = IndexName2Prefix($name); + + warn ("$ERROR printindex: bad index name: $name"), return + unless $prefix; + + if ($index_properties->{$prefix}->{code}) + { + $index_properties->{$prefix}->{from_code}->{$prefix} = 1; + } + else + { + $index_properties->{$prefix}->{from}->{$prefix}= 1; + } + + my $Entries = GetIndexEntries($index_properties->{$prefix}->{from}, + $index_properties->{$prefix}->{from_code}); + return unless %$Entries; + + if ($T2H_IDX_SUMMARY) + { + my $key; + open(FHIDX, ">$docu_rdir$docu_name" . "_$name.idx") + || die "Can't open > $docu_rdir$docu_name" . "_$name.idx for writing: $!\n"; + print "# writing $name index summary in $docu_rdir$docu_name" . "_$name.idx...\n" if $T2H_VERBOSE; + + for $key (sort keys %$Entries) + { + print FHIDX "$key\t$Entries->{$key}->{href}\n"; + } + } + + my $Pages = GetIndexPages($Entries); + my $page; + my $first_page = shift @$Pages; + my $sec_name = $section; + # remove section number + $sec_name =~ s/.*? // if $sec_name =~ /^([A-Z]|\d+)\./; + + ($first_page->{href} = sec_href($section)) =~ s/\#.*$//; + # Update tree structure of document + if (@$Pages) + { + my $sec; + my @after; + + while (@sections && $sections[$#sections] ne $section) + { + unshift @after, pop @sections; + } + + for $page (@$Pages) + { + my $node = ($page->{First} ne $page->{Last} ? + "$sec_name: $page->{First} -- $page->{Last}" : + "$sec_name: $page->{First}"); + push @sections, $node; + $node2sec{$node} = $node; + $sec2node{$node} = $node; + $node2up{$node} = $section; + $page->{href} = next_doc(); + $page->{name} = $node; + $node2href{$node} = $page->{href}; + if ($prev_node) + { + $node2next{$prev_node} = $node; + $node2prev{$node} = $prev_node; + } + $prev_node = $node; + } + push @sections, @after; + } + + my $summary = GetIndexSummary($first_page, $Pages, $name); + PrintIndexPage($lines, $summary, $first_page, $name); + for $page (@$Pages) + { + push @$lines, ($T2H_SPLIT eq 'chapter' ? $CHAPTEREND : $SECTIONEND); + push @$lines, "

    $page->{name}

    \n"; + PrintIndexPage($lines, $summary, $page, $name); + } +} + + +#+++############################################################################ +# # +# Pass 2/3: handle style, menu, index, cross-reference # +# # +#---############################################################################ + +@lines2 = (); # whole document (2nd pass) +@lines3 = (); # whole document (3rd pass) +$in_menu = 0; # am I inside a menu + +while (@lines) { + $_ = shift(@lines); + # + # special case (protected sections) + # + if (/^$PROTECTTAG/o) { + push(@lines2, $_); + next; + } + # + # menu + # + if (/^\@menu\b/) + { + $in_menu = 1; + $in_menu_listing = 1; + push(@lines2, &debug("
    \n", __LINE__)); + next; + } + if (/^\@end\s+menu\b/) + { + if ($in_menu_listing) + { + push(@lines2, &debug("
    \n", __LINE__)); + } + else + { + push(@lines2, &debug("\n", __LINE__)); + } + $in_menu = 0; + $in_menu_listing = 0; + next; + } + if ($in_menu) + { + my ($node, $name, $descr); + if (/^\*\s+($NODERE)::/o) + { + $node = $1; + $descr = $'; + } + elsif (/^\*\s+(.+):\s+([^\t,\.\n]+)[\t,\.\n]/) + { + $name = $1; + $node = $2; + $descr = $'; + } + elsif (/^\*/) + { + warn "$ERROR Bad menu line: $_"; + } + else + { + if ($in_menu_listing) + { + $in_menu_listing = 0; + push(@lines2, &debug("\n", __LINE__)); + } + # should be like verbatim -- preseve spaces, etc + s/ /\ /g; + $_ .= "
    \n"; + push(@lines2, $_); + } + if ($node) + { + if (! $in_menu_listing) + { + $in_menu_listing = 1; + push(@lines2, &debug("\n", __LINE__)); + } + # look for continuation + while ($lines[0] =~ /^\s+\w+/) + { + $descr .= shift(@lines); + } + &menu_entry($node, $name, $descr); + } + next; + } + # + # printindex + # + PrintIndex(\@lines2, $2, $1), next + if (/^\@printindex\s+(\w+)/); + # + # simple style substitutions + # + $_ = &substitute_style($_); + # + # xref + # + while (/\@(x|px|info|)ref{([^{}]+)(}?)/) { + # note: Texinfo may accept other characters + ($type, $nodes, $full) = ($1, $2, $3); + ($before, $after) = ($`, $'); + if (! $full && $after) { + warn "$ERROR Bad xref (no ending } on line): $_"; + $_ = "$before$;0${type}ref\{$nodes$after"; + next; # while xref + } + if ($type eq 'x') { + $type = "$T2H_WORDS->{$T2H_LANG}->{'See'} "; + } elsif ($type eq 'px') { + $type = "$T2H_WORDS->{$T2H_LANG}->{'see'} "; + } elsif ($type eq 'info') { + $type = "$T2H_WORDS->{$T2H_LANG}->{'See'} Info"; + } else { + $type = ''; + } + unless ($full) { + $next = shift(@lines); + $next = &substitute_style($next); + chop($nodes); # remove final newline + if ($next =~ /\}/) { # split on 2 lines + $nodes .= " $`"; + $after = $'; + } else { + $nodes .= " $next"; + $next = shift(@lines); + $next = &substitute_style($next); + chop($nodes); + if ($next =~ /\}/) { # split on 3 lines + $nodes .= " $`"; + $after = $'; + } else { + warn "$ERROR Bad xref (no ending }): $_"; + $_ = "$before$;0xref\{$nodes$after"; + unshift(@lines, $next); + next; # while xref + } + } + } + $nodes =~ s/\s+/ /g; # remove useless spaces + @args = split(/\s*,\s*/, $nodes); + $node = $args[0]; # the node is always the first arg + $node = &normalise_node($node); + $sec = $args[2] || $args[1] || $node2sec{$node}; + $href = $node2href{$node}; + if (@args == 5) { # reference to another manual + $sec = $args[2] || $node; + $man = $args[4] || $args[3]; + $_ = "${before}${type}$T2H_WORDS->{$T2H_LANG}->{'section'} `$sec' in \@cite{$man}$after"; + } elsif ($type =~ /Info/) { # inforef + warn "$ERROR Wrong number of arguments: $_" unless @args == 3; + ($nn, $_, $in) = @args; + $_ = "${before}${type} file `$in', node `$nn'$after"; + } elsif ($sec && $href && ! $T2H_SHORT_REF) { + $_ = "${before}${type}"; + $_ .= "$T2H_WORDS->{$T2H_LANG}->{'section'} " if ${type}; + $_ .= &t2h_anchor('', $href, $sec) . $after; + } + elsif ($href) + { + $_ = "${before}${type} " . + &t2h_anchor('', $href, $args[2] || $args[1] || $node) . + $after; + } + else { + warn "$ERROR Undefined node ($node): $_"; + $_ = "$before$;0xref{$nodes}$after"; + } + } + + # replace images + s[\@image\s*{(.+?)}] + { + my @args = split (/\s*,\s*/, $1); + my $base = $args[0]; + my $image = + LocateIncludeFile("$base.png") || + LocateIncludeFile("$base.jpg") || + LocateIncludeFile("$base.gif"); + warn "$ERROR no image file for $base: $_" unless ($image && -e $image); + "\"$base\""; + ($T2H_CENTER_IMAGE ? + "
    \"$base\"
    " : + "\"$base\""); + }eg; + + # + # try to guess bibliography references or glossary terms + # + unless (/^/) { + $done .= $pre . &t2h_anchor('', $href, $what); + } else { + $done .= "$pre$what"; + } + $_ = $post; + } + $_ = $done . $_; + } + if ($T2H_USE_GLOSSARY) { + $done = ''; + while (/\b\w+\b/) { + ($pre, $what, $post) = ($`, $&, $'); + $entry = $what; + $entry =~ tr/A-Z/a-z/ unless $entry =~ /^[A-Z\s]+$/; + $href = $gloss2href{$entry}; + if (defined($href) && $post !~ /^[^<]*<\/A>/) { + $done .= $pre . &t2h_anchor('', $href, $what); + } else { + $done .= "$pre$what"; + } + $_ = $post; + } + $_ = $done . $_; + } + } + # otherwise + push(@lines2, $_); +} +print "# end of pass 2\n" if $T2H_VERBOSE; + +# +# split style substitutions +# +while (@lines2) { + $_ = shift(@lines2); + # + # special case (protected sections) + # + if (/^$PROTECTTAG/o) { + push(@lines3, $_); + next; + } + # + # split style substitutions + # + $old = ''; + while ($old ne $_) { + $old = $_; + if (/\@(\w+)\{/) { + ($before, $style, $after) = ($`, $1, $'); + if (defined($style_map{$style})) { + $_ = $after; + $text = ''; + $after = ''; + $failed = 1; + while (@lines2) { + if (/\}/) { + $text .= $`; + $after = $'; + $failed = 0; + last; + } else { + $text .= $_; + $_ = shift(@lines2); + } + } + if ($failed) { + die "* Bad syntax (\@$style) after: $before\n"; + } else { + $text = &apply_style($style, $text); + $_ = "$before$text$after"; + } + } + } + } + # otherwise + push(@lines3, $_); +} +print "# end of pass 3\n" if $T2H_VERBOSE; + +#+++############################################################################ +# # +# Pass 4: foot notes, final cleanup # +# # +#---############################################################################ + +@foot_lines = (); # footnotes +@doc_lines = (); # final document +$end_of_para = 0; # true if last line is

    + +while (@lines3) { + $_ = shift(@lines3); + # + # special case (protected sections) + # + if (/^$PROTECTTAG/o) { + push(@doc_lines, $_); + $end_of_para = 0; + next; + } + # + # footnotes + # + while (/\@footnote([^\{\s]+)\{/) { + ($before, $d, $after) = ($`, $1, $'); + $_ = $after; + $text = ''; + $after = ''; + $failed = 1; + while (@lines3) { + if (/\}/) { + $text .= $`; + $after = $'; + $failed = 0; + last; + } else { + $text .= $_; + $_ = shift(@lines3); + } + } + if ($failed) { + die "* Bad syntax (\@footnote) after: $before\n"; + } else { + $foot_num++; + $docid = "DOCF$foot_num"; + $footid = "FOOT$foot_num"; + $foot = "($foot_num)"; + push(@foot_lines, "

    " . &t2h_anchor($footid, "$d#$docid", $foot) . "

    \n"); + $text = "

    $text" unless $text =~ /^\s*

    /; + push(@foot_lines, "$text\n"); + $_ = $before . &t2h_anchor($docid, "$docu_foot#$footid", $foot) . $after; + } + } + # + # remove unnecessary

    + # + if (/^\s*

    \s*$/) { + next if $end_of_para++; + } else { + $end_of_para = 0; + } + # otherwise + push(@doc_lines, $_); +} + +print "# end of pass 4\n" if $T2H_VERBOSE; + +#+++############################################################################ +# # +# Pass 5: print things # +# # +#---############################################################################ + +$T2H_L2H = &l2h_FinishToLatex if ($T2H_L2H); +$T2H_L2H = &l2h_ToHtml if ($T2H_L2H); +$T2H_L2H = &l2h_InitFromHtml if ($T2H_L2H); + +# fix node2up, node2prev, node2next, if desired +if ($has_top_command) +{ + for $section (keys %sec2number) + { + $node = $sec2node{$section}; + $node2up{$node} = Sec2UpNode($section) unless $node2up{$node}; + $node2prev{$node} = Sec2PrevNode($section) unless $node2prev{$node}; + $node2next{$node} = Sec2NextNode($section) unless $node2next{$node}; + } +} + +# prepare %T2H_THISDOC +$T2H_THISDOC{fulltitle} = $value{'_title'} || $value{'_settitle'} || "Untitled Document"; +$T2H_THISDOC{title} = $value{'_settitle'} || $T2H_THISDOC{fulltitle}; +$T2H_THISDOC{author} = $value{'_author'}; +$T2H_THISDOC{subtitle} = $value{'_subtitle'}; +$T2H_THISDOC{shorttitle} = $value{'_shorttitle'}; +for $key (keys %T2H_THISDOC) +{ + $_ = &substitute_style($T2H_THISDOC{$key}); + &unprotect_texi; + s/\s*$//; + $T2H_THISDOC{$key} = $_; +} + +# if no sections, then simply print document as is +unless (@sections) +{ + print "# Writing content into $docu_top_file \n" if $T2H_VERBOSE; + open(FILE, "> $docu_top_file") + || die "$ERROR: Can't open $docu_top_file for writing: $!\n"; + + &$T2H_print_page_head(\*FILE); + $T2H_THIS_SECTION = \@doc_lines; + t2h_print_lines(\*FILE); + &$T2H_print_foot_navigation(\*FILE); + &$T2H_print_page_foot(\*FILE); + close(FILE); + goto Finish; +} + +# initialize $T2H_HREF, $T2H_NAME +%T2H_HREF = + ( + 'First' , sec_href($sections[0]), + 'Last', sec_href($sections[$#sections]), + 'About', $docu_about. '#SEC_About', + ); + +# prepare TOC, OVERVIEW, TOP +$T2H_TOC = \@toc_lines; +$T2H_OVERVIEW = \@stoc_lines; +if ($has_top) +{ + while (1) + { + $_ = shift @doc_lines; + last if /$TOPEND/; + push @$T2H_TOP, $_; + } + $T2H_HREF{'Top'} = $docu_top . '#SEC_Top'; +} +else +{ + $T2H_HREF{'Top'} = $T2H_HREF{First}; +} + +$node2href{Top} = $T2H_HREF{Top}; +$T2H_HREF{Contents} = $docu_toc.'#SEC_Contents' if @toc_lines; +$T2H_HREF{Overview} = $docu_stoc.'#SEC_OVERVIEW' if @stoc_lines; + +# settle on index +if ($T2H_INDEX_CHAPTER) +{ + $T2H_HREF{Index} = $node2href{normalise_node($T2H_INDEX_CHAPTER)}; + warn "$ERROR T2H_INDEX_CHAPTER '$T2H_INDEX_CHAPTER' not found\n" + unless $T2H_HREF{Index}; +} +if (! $T2H_HREF{Index} && $first_index_chapter) +{ + $T2H_INDEX_CHAPTER = $first_index_chapter; + $T2H_HREF{Index} = $node2href{$T2H_INDEX_CHAPTER}; +} + +print "# Using '" . clean_name($T2H_INDEX_CHAPTER) . "' as index page\n" + if ($T2H_VERBOSE && $T2H_HREF{Index}); + +%T2H_NAME = + ( + 'First', clean_name($sec2node{$sections[0]}), + 'Last', clean_name($sec2node{$sections[$#sections]}), + 'About', $T2H_WORDS->{$T2H_LANG}->{'About_Title'}, + 'Contents', $T2H_WORDS->{$T2H_LANG}->{'ToC_Title'}, + 'Overview', $T2H_WORDS->{$T2H_LANG}->{'Overview_Title'}, + 'Index' , clean_name($T2H_INDEX_CHAPTER), + 'Top', clean_name($T2H_TOP_HEADING || $T2H_THISDOC{'title'} || $T2H_THISDOC{'shorttitle'}), + ); + +############################################################################# +# print frame and frame toc file +# +if ( $T2H_FRAMES ) +{ + open(FILE, "> $docu_frame_file") + || die "$ERROR: Can't open $docu_frame_file for writing: $!\n"; + print "# Creating frame in $docu_frame_file ...\n" if $T2H_VERBOSE; + &$T2H_print_frame(\*FILE); + close(FILE); + + open(FILE, "> $docu_toc_frame_file") + || die "$ERROR: Can't open $docu_toc_frame_file for writing: $!\n"; + print "# Creating toc frame in $docu_frame_file ...\n" if $T2H_VERBOSE; + &$T2H_print_toc_frame(\*FILE); + close(FILE); +} + + +############################################################################# +# print Top +# +open(FILE, "> $docu_top_file") + || die "$ERROR: Can't open $docu_top_file for writing: $!\n"; +&$T2H_print_page_head(\*FILE) unless ($T2H_SPLIT); + +if ($has_top) +{ + print "# Creating Top in $docu_top_file ...\n" if $T2H_VERBOSE; + $T2H_THIS_SECTION = $T2H_TOP; + $T2H_HREF{This} = $T2H_HREF{Top}; + $T2H_NAME{This} = $T2H_NAME{Top}; + &$T2H_print_Top(\*FILE); +} + +close(FILE) if $T2H_SPLIT; + +############################################################################# +# Print sections +# +$T2H_NODE{Forward} = $sec2node{$sections[0]}; +$T2H_NAME{Forward} = &clean_name($sec2node{$sections[0]}); +$T2H_HREF{Forward} = sec_href($sections[0]); +$T2H_NODE{This} = 'Top'; +$T2H_NAME{This} = $T2H_NAME{Top}; +$T2H_HREF{This} = $T2H_HREF{Top}; +if ($T2H_SPLIT) +{ + print "# writing " . scalar(@sections) . + " sections in $docu_rdir$docu_name"."_[1..$doc_num]" + if $T2H_VERBOSE; + $previous = ($T2H_SPLIT eq 'chapter' ? $CHAPTEREND : $SECTIONEND); + undef $FH; + $doc_num = 0; +} +else +{ + print "# writing " . scalar(@sections) . " sections in $docu_top_file ..." + if $T2H_VERBOSE; + $FH = \*FILE; + $previous = ''; +} + +$counter = 0; +# loop through sections +while ($section = shift(@sections)) +{ + if ($T2H_SPLIT && ($T2H_SPLIT eq 'section' || $previous eq $CHAPTEREND)) + { + if ($FH) + { + #close previous page + &$T2H_print_chapter_footer($FH) if $T2H_SPLIT eq 'chapter'; + &$T2H_print_page_foot($FH); + close($FH); + undef $FH; + } + } + $T2H_NAME{Back} = $T2H_NAME{This}; + $T2H_HREF{Back} = $T2H_HREF{This}; + $T2H_NODE{Back} = $T2H_NODE{This}; + $T2H_NAME{This} = $T2H_NAME{Forward}; + $T2H_HREF{This} = $T2H_HREF{Forward}; + $T2H_NODE{This} = $T2H_NODE{Forward}; + if ($sections[0]) + { + $T2H_NODE{Forward} = $sec2node{$sections[0]}; + $T2H_NAME{Forward} = &clean_name($T2H_NODE{Forward}); + $T2H_HREF{Forward} = sec_href($sections[0]); + } + else + { + undef $T2H_HREF{Forward}, $T2H_NODE{Forward}, $T2H_NAME{Forward}; + } + + $node = $node2up{$T2H_NODE{This}}; + $T2H_HREF{Up} = $node2href{$node}; + if ($T2H_HREF{Up} eq $T2H_HREF{This} || ! $T2H_HREF{Up}) + { + $T2H_NAME{Up} = $T2H_NAME{Top}; + $T2H_HREF{Up} = $T2H_HREF{Top}; + $T2H_NODE{Up} = 'Up'; + } + else + { + $T2H_NAME{Up} = &clean_name($node); + $T2H_NODE{Up} = $node; + } + + $node = $T2H_NODE{This}; + $node = $node2prev{$node}; + $T2H_NAME{Prev} = &clean_name($node); + $T2H_HREF{Prev} = $node2href{$node}; + $T2H_NODE{Prev} = $node; + + $node = $T2H_NODE{This}; + if ($node2up{$node} && $node2up{$node} ne 'Top'&& + ($node2prev{$node} eq $T2H_NODE{Back} || ! $node2prev{$node})) + { + $node = $node2up{$node}; + while ($node && $node ne $node2up{$node} && ! $node2prev{$node}) + { + $node = $node2up{$node}; + } + $node = $node2prev{$node} + unless $node2up{$node} eq 'Top' || ! $node2up{$node}; + } + else + { + $node = $node2prev{$node}; + } + $T2H_NAME{FastBack} = &clean_name($node); + $T2H_HREF{FastBack} = $node2href{$node}; + $T2H_NODE{FastBack} = $node; + + $node = $T2H_NODE{This}; + $node = $node2next{$node}; + $T2H_NAME{Next} = &clean_name($node); + $T2H_HREF{Next} = $node2href{$node}; + $T2H_NODE{Next} = $node; + + $node = $T2H_NODE{This}; + if ($node2up{$node} && $node2up{$node} ne 'Top'&& + ($node2next{$node} eq $T2H_NODE{Forward} || ! $node2next{$node})) + { + $node = $node2up{$node}; + while ($node && $node ne $node2up{$node} && ! $node2next{$node}) + { + $node = $node2up{$node}; + } + } + $node = $node2next{$node}; + $T2H_NAME{FastForward} = &clean_name($node); + $T2H_HREF{FastForward} = $node2href{$node}; + $T2H_NODE{FastForward} = $node; + + if (! defined($FH)) + { + my $file = $T2H_HREF{This}; + $file =~ s/\#.*$//; + open(FILE, "> $docu_rdir$file") || + die "$ERROR: Can't open $docu_rdir$file for writing: $!\n"; + $FH = \*FILE; + &$T2H_print_page_head($FH); + t2h_print_label($FH); + &$T2H_print_chapter_header($FH) if $T2H_SPLIT eq 'chapter'; + } + else + { + t2h_print_label($FH); + } + + $T2H_THIS_SECTION = []; + while (@doc_lines) { + $_ = shift(@doc_lines); + last if ($_ eq $SECTIONEND || $_ eq $CHAPTEREND); + push(@$T2H_THIS_SECTION, $_); + } + $previous = $_; + &$T2H_print_section($FH); + + if ($T2H_VERBOSE) + { + $counter++; + print "." if $counter =~ /00$/; + } +} +if ($T2H_SPLIT) +{ + &$T2H_print_chapter_footer($FH) if $T2H_SPLIT eq 'chapter'; + &$T2H_print_page_foot($FH); + close($FH); +} +print "\n" if $T2H_VERBOSE; + +############################################################################# +# Print ToC, Overview, Footnotes +# +undef $T2H_HREF{Prev}; +undef $T2H_HREF{Next}; +undef $T2H_HREF{Back}; +undef $T2H_HREF{Forward}; +undef $T2H_HREF{Up}; + +if (@foot_lines) +{ + print "# writing Footnotes in $docu_foot_file...\n" if $T2H_VERBOSE; + open (FILE, "> $docu_foot_file") || die "$ERROR: Can't open $docu_foot_file for writing: $!\n" + if $T2H_SPLIT; + $T2H_HREF{This} = $docu_foot; + $T2H_NAME{This} = $T2H_WORDS->{$T2H_LANG}->{'Footnotes_Title'}; + $T2H_THIS_SECTION = \@foot_lines; + &$T2H_print_Footnotes(\*FILE); + close(FILE) if $T2H_SPLIT; +} + +if (@toc_lines) +{ + print "# writing Toc in $docu_toc_file...\n" if $T2H_VERBOSE; + open (FILE, "> $docu_toc_file") || die "$ERROR: Can't open $docu_toc_file for writing: $!\n" + if $T2H_SPLIT; + $T2H_HREF{This} = $T2H_HREF{Contents}; + $T2H_NAME{This} = $T2H_NAME{Contents}; + $T2H_THIS_SECTION = \@toc_lines; + &$T2H_print_Toc(\*FILE); + close(FILE) if $T2H_SPLIT; +} + +if (@stoc_lines) +{ + print "# writing Overview in $docu_stoc_file...\n" if $T2H_VERBOSE; + open (FILE, "> $docu_stoc_file") || die "$ERROR: Can't open $docu_stoc_file for writing: $!\n" + if $T2H_SPLIT; + + $T2H_HREF{This} = $T2H_HREF{Overview}; + $T2H_NAME{This} = $T2H_NAME{Overview}; + $T2H_THIS_SECTION = \@stoc_lines; + unshift @$T2H_THIS_SECTION, "

    \n"; + push @$T2H_THIS_SECTION, "\n
    \n"; + &$T2H_print_Overview(\*FILE); + close(FILE) if $T2H_SPLIT; +} + +if ($about_body = &$T2H_about_body()) +{ + print "# writing About in $docu_about_file...\n" if $T2H_VERBOSE; + open (FILE, "> $docu_about_file") || die "$ERROR: Can't open $docu_about_file for writing: $!\n" + if $T2H_SPLIT; + + $T2H_HREF{This} = $T2H_HREF{About}; + $T2H_NAME{This} = $T2H_NAME{About}; + $T2H_THIS_SECTION = [$about_body]; + &$T2H_print_About(\*FILE); + close(FILE) if $T2H_SPLIT; +} + +unless ($T2H_SPLIT) +{ + &$T2H_print_page_foot(\*FILE); + close (FILE); +} + +Finish: +&l2h_FinishFromHtml if ($T2H_L2H); +&l2h_Finish if($T2H_L2H); +print "# that's all folks\n" if $T2H_VERBOSE; + +exit(0); + +#+++############################################################################ +# # +# Low level functions # +# # +#---############################################################################ + +sub LocateIncludeFile +{ + my $file = shift; + my $dir; + + return $file if (-e $file && -r $file); + foreach $dir (@T2H_INCLUDE_DIRS) + { + return "$dir/$file" if (-e "$dir/$file" && -r "$dir/$file"); + } + return undef; +} + +sub clean_name +{ + local ($_); + $_ = &remove_style($_[0]); + &unprotect_texi; + return $_; +} + +sub update_sec_num { + local($name, $level) = @_; + my $ret; + + $level--; # here we start at 0 + if ($name =~ /^appendix/ || defined(@appendix_sec_num)) { + # appendix style + if (defined(@appendix_sec_num)) { + &incr_sec_num($level, @appendix_sec_num); + } else { + @appendix_sec_num = ('A', 0, 0, 0); + } + $ret = join('.', @appendix_sec_num[0..$level]); + } else { + # normal style + if (defined(@normal_sec_num)) + { + &incr_sec_num($level, @normal_sec_num); + } + else + { + @normal_sec_num = (1, 0, 0, 0); + } + $ret = join('.', @normal_sec_num[0..$level]); + } + + $ret .= "." if $level == 0; + return $ret; +} + +sub incr_sec_num { + local($level, $l); + $level = shift(@_); + $_[$level]++; + foreach $l ($level+1 .. 3) { + $_[$l] = 0; + } +} + +sub Sec2UpNode +{ + my $sec = shift; + my $num = $sec2number{$sec}; + + return '' unless $num; + return 'Top' unless $num =~ /\.\d+/; + $num =~ s/\.[^\.]*$//; + $num = $num . '.' unless $num =~ /\./; + return $sec2node{$number2sec{$num}}; +} + +sub Sec2PrevNode +{ + my $sec = shift; + my $num = $sec2number{$sec}; + my ($i, $post); + + if ($num =~ /(\w+)(\.$|$)/) + { + $num = $`; + $i = $1; + $post = $2; + if ($i eq 'A') + { + $i = $normal_sec_num[0]; + } + elsif ($i ne '1') + { + # unfortunately, -- operator is not magical + $i = chr(ord($i) + 1); + } + else + { + return ''; + } + return $sec2node{$number2sec{$num . $i . $post}} + } + return ''; +} + +sub Sec2NextNode +{ + my $sec = shift; + my $num = $sec2number{$sec}; + my $i; + + if ($num =~ /(\w+)(\.$|$)/) + { + $num = $`; + $i = $1; + $post = $2; + if ($post eq '.' && $i eq $normal_sec_num[0]) + { + $i = 'A'; + } + else + { + $i++; + } + return $sec2node{$number2sec{$num . $i . $post}} + } + return ''; +} + +sub check { + local($_, %seen, %context, $before, $match, $after); + + while (<>) { + if (/\@(\*|\.|\:|\@|\{|\})/) { + $seen{$&}++; + $context{$&} .= "> $_" if $T2H_VERBOSE; + $_ = "$`XX$'"; + redo; + } + if (/\@(\w+)/) { + ($before, $match, $after) = ($`, $&, $'); + if ($before =~ /\b[\w-]+$/ && $after =~ /^[\w-.]*\b/) { # e-mail address + $seen{'e-mail address'}++; + $context{'e-mail address'} .= "> $_" if $T2H_VERBOSE; + } else { + $seen{$match}++; + $context{$match} .= "> $_" if $T2H_VERBOSE; + } + $match =~ s/^\@/X/; + $_ = "$before$match$after"; + redo; + } + } + + foreach (sort(keys(%seen))) { + if ($T2H_VERBOSE) { + print "$_\n"; + print $context{$_}; + } else { + print "$_ ($seen{$_})\n"; + } + } +} + +sub open { + local($name) = @_; + + ++$fh_name; + if (open($fh_name, $name)) { + unshift(@fhs, $fh_name); + } else { + warn "$ERROR Can't read file $name: $!\n"; + } +} + +sub init_input { + @fhs = (); # hold the file handles to read + @input_spool = (); # spooled lines to read + $fh_name = 'FH000'; + &open($docu); +} + +sub next_line { + local($fh, $line); + + if (@input_spool) { + $line = shift(@input_spool); + return($line); + } + while (@fhs) { + $fh = $fhs[0]; + $line = <$fh>; + return($line) if $line; + close($fh); + shift(@fhs); + } + return(undef); +} + +# used in pass 1, use &next_line +sub skip_until { + local($tag) = @_; + local($_); + + while ($_ = &next_line) { + return if /^\@end\s+$tag\s*$/; + } + die "* Failed to find '$tag' after: " . $lines[$#lines]; +} + +# used in pass 1 for l2h use &next_line +sub string_until { + local($tag) = @_; + local($_, $string); + + while ($_ = &next_line) { + return $string if /^\@end\s+$tag\s*$/; +# $_ =~ s/hbox/mbox/g; + $string = $string.$_; + } + die "* Failed to find '$tag' after: " . $lines[$#lines]; +} + +# +# HTML stacking to have a better HTML output +# + +sub html_reset { + @html_stack = ('html'); + $html_element = 'body'; +} + +sub html_push { + local($what) = @_; + push(@html_stack, $html_element); + $html_element = $what; +} + +sub html_push_if { + local($what) = @_; + push(@html_stack, $html_element) + if ($html_element && $html_element ne 'P'); + $html_element = $what; +} + +sub html_pop { + $html_element = pop(@html_stack); +} + +sub html_pop_if { + local($elt); + + if (@_) { + foreach $elt (@_) { + if ($elt eq $html_element) { + $html_element = pop(@html_stack) if @html_stack; + last; + } + } + } else { + $html_element = pop(@html_stack) if @html_stack; + } +} + +sub html_debug { + local($what, $line) = @_; + if ($T2H_DEBUG & $DEBUG_HTML) + { + $what = "\n" unless $what; + return("$what") + } + return($what); +} + +# to debug the output... +sub debug { + local($what, $line) = @_; + return("$what") + if $T2H_DEBUG & $DEBUG_HTML; + return($what); +} + +sub SimpleTexi2Html +{ + local $_ = $_[0]; + &protect_texi; + &protect_html; + $_ = substitute_style($_); + $_[0] = $_; +} + +sub normalise_node { + local $_ = $_[0]; + s/\s+/ /g; + s/ $//; + s/^ //; + &protect_texi; + &protect_html; + $_ = substitute_style($_); + $_[0] = $_; +} + +sub menu_entry +{ + my ($node, $name, $descr) = @_; + my ($href, $entry); + + &normalise_node($node); + $href = $node2href{$node}; + if ($href) + { + $descr =~ s/^\s+//; + $descr =~ s/\s*$//; + $descr = SimpleTexi2Html($descr); + if ($T2H_NUMBER_SECTIONS && !$T2H_NODE_NAME_IN_MENU && $node2sec{$node}) + { + $entry = $node2sec{$node}; + $name = ''; + } + else + { + &normalise_node($name); + $entry = ($name && ($name ne $node || ! $T2H_AVOID_MENU_REDUNDANCY) + ? "$name : $node" : $node); + } + + if ($T2H_AVOID_MENU_REDUNDANCY && $descr) + { + my $clean_entry = $entry; + $clean_entry =~ s/^.*? // if ($clean_entry =~ /^([A-Z]|\d+)\.[\d\.]* /); + $clean_entry =~ s/[^\w]//g; + my $clean_descr = $descr; + $clean_descr =~ s/[^\w]//g; + $descr = '' if ($clean_entry eq $clean_descr) + } + push(@lines2,&debug('
    \n", __LINE__)); + } + elsif ($node =~ /^\(.*\)\w+/) + { + push(@lines2,&debug('\n", __LINE__)) + } + else + { + warn "$ERROR Undefined node of menu_entry ($node): $_"; + } +} + +sub do_ctrl { "^$_[0]" } + +sub do_email { + local($addr, $text) = split(/,\s*/, $_[0]); + + $text = $addr unless $text; + &t2h_anchor('', "mailto:$addr", $text); +} + +sub do_sc +{ + # l2h does this much better + return &l2h_ToLatex("{\\sc ".&unprotect_html($_[0])."}") if ($T2H_L2H); + return "\U$_[0]\E"; +} + +sub do_math +{ + return &l2h_ToLatex("\$".&unprotect_html($_[0])."\$") if ($T2H_L2H); + return "".$text.""; +} + +sub do_uref { + local($url, $text, $only_text) = split(/,\s*/, $_[0]); + + $text = $only_text if $only_text; + $text = $url unless $text; + &t2h_anchor('', $url, $text); +} + +sub do_url { &t2h_anchor('', $_[0], $_[0]) } + +sub do_acronym +{ + return '' . $_[0] . ''; +} + +sub do_accent +{ + return "&$_[0]acute;" if $_[1] eq 'H'; + return "$_[0]." if $_[1] eq 'dotaccent'; + return "$_[0]*" if $_[1] eq 'ringaccent'; + return "$_[0]".'[' if $_[1] eq 'tieaccent'; + return "$_[0]".'(' if $_[1] eq 'u'; + return "$_[0]_" if $_[1] eq 'ubaraccent'; + return ".$_[0]" if $_[1] eq 'udotaccent'; + return "$_[0]<" if $_[1] eq 'v'; + return "&$_[0]cedil;" if $_[1] eq ','; + return "$_[0]" if $_[1] eq 'dotless'; + return undef; +} + +sub apply_style { + local($texi_style, $text) = @_; + local($style); + + $style = $style_map{$texi_style}; + if (defined($style)) { # known style + if ($style =~ /^\"/) { # add quotes + $style = $'; + $text = "\`$text\'"; + } + if ($style =~ /^\&/) { # custom + $style = $'; + $text = &$style($text, $texi_style); + } elsif ($style) { # good style + $text = "<$style>$text"; + } else { # no style + } + } else { # unknown style + $text = undef; + } + return($text); +} + +# remove Texinfo styles +sub remove_style { + local($_) = @_; + 1 while(s/\@\w+{([^\{\}]+)}/$1/g); + return($_); +} + +sub remove_things +{ + local ($_) = @_; + s|\@(\w+)\{\}|$1|g; + return $_; +} + +sub substitute_style { + local($_) = @_; + local($changed, $done, $style, $text); + + &simple_substitutions; + $changed = 1; + while ($changed) { + $changed = 0; + $done = ''; + while (/\@(\w+){([^\{\}]+)}/ || /\@(,){([^\{\}]+)}/) { + $text = &apply_style($1, $2); + if ($text) { + $_ = "$`$text$'"; + $changed = 1; + } else { + $done .= "$`\@$1"; + $_ = "{$2}$'"; + } + } + $_ = $done . $_; + } + return($_); +} + +sub t2h_anchor { + local($name, $href, $text, $newline, $extra_attribs) = @_; + local($result); + + $result = " + $what =~ s/\&/\&\#38;/g; + $what =~ s/\/\&\#62;/g; + # restore anything in quotes + # this fixes my problem where I had: + # < IMG SRC="leftarrow.gif" ALT="<--" > but what if I wanted < in my ALT text ?? + # maybe byte stuffing or some other technique should be used. + $what =~ s/\"([^\&]+)\&\#60;(.*)\"/"$1<$2"/g; + $what =~ s/\"([^\&]+)\&\#62;(.*)\"/"$1>$2"/g; + $what =~ s/\"([^\&]+)\&\#38;(.*)\"/"$1&$2"/g; + # but recognize some HTML things + $what =~ s/\&\#60;\/A\&\#62;/<\/A>/g; # + $what =~ s/\&\#60;A ([^\&]+)\&\#62;//g; # + $what =~ s/\&\#60;IMG ([^\&]+)\&\#62;//g; # + return($what); +} + +sub unprotect_texi { + s/$;0/\@/go; + s/$;1/\{/go; + s/$;2/\}/go; + s/$;3/\`/go; + s/$;4/\'/go; +} + +sub Unprotect_texi +{ + local $_ = shift; + &unprotect_texi; + return($_); +} + +sub unprotect_html { + local($what) = @_; + $what =~ s/\&\#38;/\&/g; + $what =~ s/\&\#60;/\/g; + return($what); +} + +sub t2h_print_label +{ + my $fh = shift; + my $href = shift || $T2H_HREF{This}; + $href =~ s/.*#(.*)$/$1/; + print $fh qq{\n}; +} + +############################################################################## + + # These next few lines are legal in both Perl and nroff. + +.00 ; # finish .ig + +'di \" finish diversion--previous line must be blank +.nr nl 0-1 \" fake up transition to first page again +.nr % 0 \" start at page 1 +'; __END__ ############# From here on it's a standard manual page ############ +.so /usr/local/man/man1/texi2html.1 diff --git a/vendors/readline/src/readline/doc/texinfo.tex b/vendors/readline/src/readline/doc/texinfo.tex new file mode 100644 index 0000000..555a077 --- /dev/null +++ b/vendors/readline/src/readline/doc/texinfo.tex @@ -0,0 +1,6688 @@ +% texinfo.tex -- TeX macros to handle Texinfo files. +% +% Load plain if necessary, i.e., if running under initex. +\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi +% +\def\texinfoversion{2003-02-03.16} +% +% Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, +% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. +% +% This texinfo.tex file is free software; you can redistribute it and/or +% modify it under the terms of the GNU General Public License as +% published by the Free Software Foundation; either version 2, or (at +% your option) any later version. +% +% This texinfo.tex file is distributed in the hope that it will be +% useful, but WITHOUT ANY WARRANTY; without even the implied warranty +% of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +% General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this texinfo.tex file; see the file COPYING. If not, write +% to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +% Boston, MA 02111-1307, USA. +% +% In other words, you are welcome to use, share and improve this program. +% You are forbidden to forbid anyone else to use, share and improve +% what you give them. Help stamp out software-hoarding! +% +% Please try the latest version of texinfo.tex before submitting bug +% reports; you can get the latest version from: +% ftp://ftp.gnu.org/gnu/texinfo/texinfo.tex +% (and all GNU mirrors, see http://www.gnu.org/order/ftp.html) +% ftp://tug.org/tex/texinfo.tex +% (and all CTAN mirrors, see http://www.ctan.org), +% and /home/gd/gnu/doc/texinfo.tex on the GNU machines. +% +% The GNU Texinfo home page is http://www.gnu.org/software/texinfo. +% +% The texinfo.tex in any given Texinfo distribution could well be out +% of date, so if that's what you're using, please check. +% +% Send bug reports to bug-texinfo@gnu.org. Please include including a +% complete document in each bug report with which we can reproduce the +% problem. Patches are, of course, greatly appreciated. +% +% To process a Texinfo manual with TeX, it's most reliable to use the +% texi2dvi shell script that comes with the distribution. For a simple +% manual foo.texi, however, you can get away with this: +% tex foo.texi +% texindex foo.?? +% tex foo.texi +% tex foo.texi +% dvips foo.dvi -o # or whatever; this makes foo.ps. +% The extra TeX runs get the cross-reference information correct. +% Sometimes one run after texindex suffices, and sometimes you need more +% than two; texi2dvi does it as many times as necessary. +% +% It is possible to adapt texinfo.tex for other languages, to some +% extent. You can get the existing language-specific files from the +% full Texinfo distribution. + +\message{Loading texinfo [version \texinfoversion]:} + +% If in a .fmt file, print the version number +% and turn on active characters that we couldn't do earlier because +% they might have appeared in the input file name. +\everyjob{\message{[Texinfo version \texinfoversion]}% + \catcode`+=\active \catcode`\_=\active} + +\message{Basics,} +\chardef\other=12 + +% We never want plain's outer \+ definition in Texinfo. +% For @tex, we can use \tabalign. +\let\+ = \relax + +% Save some parts of plain tex whose names we will redefine. +\let\ptexb=\b +\let\ptexbullet=\bullet +\let\ptexc=\c +\let\ptexcomma=\, +\let\ptexdot=\. +\let\ptexdots=\dots +\let\ptexend=\end +\let\ptexequiv=\equiv +\let\ptexexclam=\! +\let\ptexgtr=> +\let\ptexhat=^ +\let\ptexi=\i +\let\ptexlbrace=\{ +\let\ptexless=< +\let\ptexplus=+ +\let\ptexrbrace=\} +\let\ptexstar=\* +\let\ptext=\t + +% If this character appears in an error message or help string, it +% starts a new line in the output. +\newlinechar = `^^J + +% Set up fixed words for English if not already set. +\ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi +\ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi +\ifx\putwordfile\undefined \gdef\putwordfile{file}\fi +\ifx\putwordin\undefined \gdef\putwordin{in}\fi +\ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi +\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi +\ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi +\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi +\ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi +\ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi +\ifx\putwordof\undefined \gdef\putwordof{of}\fi +\ifx\putwordon\undefined \gdef\putwordon{on}\fi +\ifx\putwordpage\undefined \gdef\putwordpage{page}\fi +\ifx\putwordsection\undefined \gdef\putwordsection{section}\fi +\ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi +\ifx\putwordsee\undefined \gdef\putwordsee{see}\fi +\ifx\putwordSee\undefined \gdef\putwordSee{See}\fi +\ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi +\ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi +% +\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi +\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi +\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi +\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi +\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi +\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi +\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi +\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi +\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi +\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi +\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi +\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi +% +\ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi +\ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi +\ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi +\ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi +\ifx\putwordDeftypevar\undefined\gdef\putwordDeftypevar{Variable}\fi +\ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi +\ifx\putwordDeftypefun\undefined\gdef\putwordDeftypefun{Function}\fi + +% In some macros, we cannot use the `\? notation---the left quote is +% in some cases the escape char. +\chardef\colonChar = `\: +\chardef\commaChar = `\, +\chardef\dotChar = `\. +\chardef\equalChar = `\= +\chardef\exclamChar= `\! +\chardef\questChar = `\? +\chardef\semiChar = `\; +\chardef\spaceChar = `\ % +\chardef\underChar = `\_ + +% Ignore a token. +% +\def\gobble#1{} + +% True if #1 is the empty string, i.e., called like `\ifempty{}'. +% +\def\ifempty#1{\ifemptyx #1\emptymarkA\emptymarkB}% +\def\ifemptyx#1#2\emptymarkB{\ifx #1\emptymarkA}% + +% Hyphenation fixes. +\hyphenation{ap-pen-dix} +\hyphenation{mini-buf-fer mini-buf-fers} +\hyphenation{eshell} +\hyphenation{white-space} + +% Margin to add to right of even pages, to left of odd pages. +\newdimen\bindingoffset +\newdimen\normaloffset +\newdimen\pagewidth \newdimen\pageheight + +% Sometimes it is convenient to have everything in the transcript file +% and nothing on the terminal. We don't just call \tracingall here, +% since that produces some useless output on the terminal. We also make +% some effort to order the tracing commands to reduce output in the log +% file; cf. trace.sty in LaTeX. +% +\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% +\def\loggingall{% + \tracingstats2 + \tracingpages1 + \tracinglostchars2 % 2 gives us more in etex + \tracingparagraphs1 + \tracingoutput1 + \tracingmacros2 + \tracingrestores1 + \showboxbreadth\maxdimen \showboxdepth\maxdimen + \ifx\eTeXversion\undefined\else % etex gives us more logging + \tracingscantokens1 + \tracingifs1 + \tracinggroups1 + \tracingnesting2 + \tracingassigns1 + \fi + \tracingcommands3 % 3 gives us more in etex + \errorcontextlines\maxdimen +}% + +% add check for \lastpenalty to plain's definitions. If the last thing +% we did was a \nobreak, we don't want to insert more space. +% +\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount + \removelastskip\penalty-50\smallskip\fi\fi} +\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount + \removelastskip\penalty-100\medskip\fi\fi} +\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount + \removelastskip\penalty-200\bigskip\fi\fi} + +% For @cropmarks command. +% Do @cropmarks to get crop marks. +% +\newif\ifcropmarks +\let\cropmarks = \cropmarkstrue +% +% Dimensions to add cropmarks at corners. +% Added by P. A. MacKay, 12 Nov. 1986 +% +\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines +\newdimen\cornerlong \cornerlong=1pc +\newdimen\cornerthick \cornerthick=.3pt +\newdimen\topandbottommargin \topandbottommargin=.75in + +% Main output routine. +\chardef\PAGE = 255 +\output = {\onepageout{\pagecontents\PAGE}} + +\newbox\headlinebox +\newbox\footlinebox + +% \onepageout takes a vbox as an argument. Note that \pagecontents +% does insertions, but you have to call it yourself. +\def\onepageout#1{% + \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi + % + \ifodd\pageno \advance\hoffset by \bindingoffset + \else \advance\hoffset by -\bindingoffset\fi + % + % Do this outside of the \shipout so @code etc. will be expanded in + % the headline as they should be, not taken literally (outputting ''code). + \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}% + \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}% + % + {% + % Have to do this stuff outside the \shipout because we want it to + % take effect in \write's, yet the group defined by the \vbox ends + % before the \shipout runs. + % + \escapechar = `\\ % use backslash in output files. + \indexdummies % don't expand commands in the output. + \normalturnoffactive % \ in index entries must not stay \, e.g., if + % the page break happens to be in the middle of an example. + \shipout\vbox{% + % Do this early so pdf references go to the beginning of the page. + \ifpdfmakepagedest \pdfmkdest{\the\pageno} \fi + % + \ifcropmarks \vbox to \outervsize\bgroup + \hsize = \outerhsize + \vskip-\topandbottommargin + \vtop to0pt{% + \line{\ewtop\hfil\ewtop}% + \nointerlineskip + \line{% + \vbox{\moveleft\cornerthick\nstop}% + \hfill + \vbox{\moveright\cornerthick\nstop}% + }% + \vss}% + \vskip\topandbottommargin + \line\bgroup + \hfil % center the page within the outer (page) hsize. + \ifodd\pageno\hskip\bindingoffset\fi + \vbox\bgroup + \fi + % + \unvbox\headlinebox + \pagebody{#1}% + \ifdim\ht\footlinebox > 0pt + % Only leave this space if the footline is nonempty. + % (We lessened \vsize for it in \oddfootingxxx.) + % The \baselineskip=24pt in plain's \makefootline has no effect. + \vskip 2\baselineskip + \unvbox\footlinebox + \fi + % + \ifcropmarks + \egroup % end of \vbox\bgroup + \hfil\egroup % end of (centering) \line\bgroup + \vskip\topandbottommargin plus1fill minus1fill + \boxmaxdepth = \cornerthick + \vbox to0pt{\vss + \line{% + \vbox{\moveleft\cornerthick\nsbot}% + \hfill + \vbox{\moveright\cornerthick\nsbot}% + }% + \nointerlineskip + \line{\ewbot\hfil\ewbot}% + }% + \egroup % \vbox from first cropmarks clause + \fi + }% end of \shipout\vbox + }% end of group with \normalturnoffactive + \advancepageno + \ifnum\outputpenalty>-20000 \else\dosupereject\fi +} + +\newinsert\margin \dimen\margin=\maxdimen + +\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} +{\catcode`\@ =11 +\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi +% marginal hacks, juha@viisa.uucp (Juha Takala) +\ifvoid\margin\else % marginal info is present + \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi +\dimen@=\dp#1 \unvbox#1 +\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi +\ifr@ggedbottom \kern-\dimen@ \vfil \fi} +} + +% Here are the rules for the cropmarks. Note that they are +% offset so that the space between them is truly \outerhsize or \outervsize +% (P. A. MacKay, 12 November, 1986) +% +\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} +\def\nstop{\vbox + {\hrule height\cornerthick depth\cornerlong width\cornerthick}} +\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} +\def\nsbot{\vbox + {\hrule height\cornerlong depth\cornerthick width\cornerthick}} + +% Parse an argument, then pass it to #1. The argument is the rest of +% the input line (except we remove a trailing comment). #1 should be a +% macro which expects an ordinary undelimited TeX argument. +% +\def\parsearg#1{% + \let\next = #1% + \begingroup + \obeylines + \futurelet\temp\parseargx +} + +% If the next token is an obeyed space (from an @example environment or +% the like), remove it and recurse. Otherwise, we're done. +\def\parseargx{% + % \obeyedspace is defined far below, after the definition of \sepspaces. + \ifx\obeyedspace\temp + \expandafter\parseargdiscardspace + \else + \expandafter\parseargline + \fi +} + +% Remove a single space (as the delimiter token to the macro call). +{\obeyspaces % + \gdef\parseargdiscardspace {\futurelet\temp\parseargx}} + +{\obeylines % + \gdef\parseargline#1^^M{% + \endgroup % End of the group started in \parsearg. + % + % First remove any @c comment, then any @comment. + % Result of each macro is put in \toks0. + \argremovec #1\c\relax % + \expandafter\argremovecomment \the\toks0 \comment\relax % + % + % Call the caller's macro, saved as \next in \parsearg. + \expandafter\next\expandafter{\the\toks0}% + }% +} + +% Since all \c{,omment} does is throw away the argument, we can let TeX +% do that for us. The \relax here is matched by the \relax in the call +% in \parseargline; it could be more or less anything, its purpose is +% just to delimit the argument to the \c. +\def\argremovec#1\c#2\relax{\toks0 = {#1}} +\def\argremovecomment#1\comment#2\relax{\toks0 = {#1}} + +% \argremovec{,omment} might leave us with trailing spaces, though; e.g., +% @end itemize @c foo +% will have two active spaces as part of the argument with the +% `itemize'. Here we remove all active spaces from #1, and assign the +% result to \toks0. +% +% This loses if there are any *other* active characters besides spaces +% in the argument -- _ ^ +, for example -- since they get expanded. +% Fortunately, Texinfo does not define any such commands. (If it ever +% does, the catcode of the characters in questionwill have to be changed +% here.) But this means we cannot call \removeactivespaces as part of +% \argremovec{,omment}, since @c uses \parsearg, and thus the argument +% that \parsearg gets might well have any character at all in it. +% +\def\removeactivespaces#1{% + \begingroup + \ignoreactivespaces + \edef\temp{#1}% + \global\toks0 = \expandafter{\temp}% + \endgroup +} + +% Change the active space to expand to nothing. +% +\begingroup + \obeyspaces + \gdef\ignoreactivespaces{\obeyspaces\let =\empty} +\endgroup + + +\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} + +%% These are used to keep @begin/@end levels from running away +%% Call \inENV within environments (after a \begingroup) +\newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi} +\def\ENVcheck{% +\ifENV\errmessage{Still within an environment; press RETURN to continue} +\endgroup\fi} % This is not perfect, but it should reduce lossage + +% @begin foo is the same as @foo, for now. +\newhelp\EMsimple{Press RETURN to continue.} + +\outer\def\begin{\parsearg\beginxxx} + +\def\beginxxx #1{% +\expandafter\ifx\csname #1\endcsname\relax +{\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else +\csname #1\endcsname\fi} + +% @end foo executes the definition of \Efoo. +% +\def\end{\parsearg\endxxx} +\def\endxxx #1{% + \removeactivespaces{#1}% + \edef\endthing{\the\toks0}% + % + \expandafter\ifx\csname E\endthing\endcsname\relax + \expandafter\ifx\csname \endthing\endcsname\relax + % There's no \foo, i.e., no ``environment'' foo. + \errhelp = \EMsimple + \errmessage{Undefined command `@end \endthing'}% + \else + \unmatchedenderror\endthing + \fi + \else + % Everything's ok; the right environment has been started. + \csname E\endthing\endcsname + \fi +} + +% There is an environment #1, but it hasn't been started. Give an error. +% +\def\unmatchedenderror#1{% + \errhelp = \EMsimple + \errmessage{This `@end #1' doesn't have a matching `@#1'}% +} + +% Define the control sequence \E#1 to give an unmatched @end error. +% +\def\defineunmatchedend#1{% + \expandafter\def\csname E#1\endcsname{\unmatchedenderror{#1}}% +} + + +%% Simple single-character @ commands + +% @@ prints an @ +% Kludge this until the fonts are right (grr). +\def\@{{\tt\char64}} + +% This is turned off because it was never documented +% and you can use @w{...} around a quote to suppress ligatures. +%% Define @` and @' to be the same as ` and ' +%% but suppressing ligatures. +%\def\`{{`}} +%\def\'{{'}} + +% Used to generate quoted braces. +\def\mylbrace {{\tt\char123}} +\def\myrbrace {{\tt\char125}} +\let\{=\mylbrace +\let\}=\myrbrace +\begingroup + % Definitions to produce \{ and \} commands for indices, + % and @{ and @} for the aux file. + \catcode`\{ = \other \catcode`\} = \other + \catcode`\[ = 1 \catcode`\] = 2 + \catcode`\! = 0 \catcode`\\ = \other + !gdef!lbracecmd[\{]% + !gdef!rbracecmd[\}]% + !gdef!lbraceatcmd[@{]% + !gdef!rbraceatcmd[@}]% +!endgroup + +% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent +% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H. +\let\, = \c +\let\dotaccent = \. +\def\ringaccent#1{{\accent23 #1}} +\let\tieaccent = \t +\let\ubaraccent = \b +\let\udotaccent = \d + +% Other special characters: @questiondown @exclamdown +% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss. +\def\questiondown{?`} +\def\exclamdown{!`} + +% Dotless i and dotless j, used for accents. +\def\imacro{i} +\def\jmacro{j} +\def\dotless#1{% + \def\temp{#1}% + \ifx\temp\imacro \ptexi + \else\ifx\temp\jmacro \j + \else \errmessage{@dotless can be used only with i or j}% + \fi\fi +} + +% Be sure we're in horizontal mode when doing a tie, since we make space +% equivalent to this in @example-like environments. Otherwise, a space +% at the beginning of a line will start with \penalty -- and +% since \penalty is valid in vertical mode, we'd end up putting the +% penalty on the vertical list instead of in the new paragraph. +{\catcode`@ = 11 + % Avoid using \@M directly, because that causes trouble + % if the definition is written into an index file. + \global\let\tiepenalty = \@M + \gdef\tie{\leavevmode\penalty\tiepenalty\ } +} + +% @: forces normal size whitespace following. +\def\:{\spacefactor=1000 } + +% @* forces a line break. +\def\*{\hfil\break\hbox{}\ignorespaces} + +% @. is an end-of-sentence period. +\def\.{.\spacefactor=3000 } + +% @! is an end-of-sentence bang. +\def\!{!\spacefactor=3000 } + +% @? is an end-of-sentence query. +\def\?{?\spacefactor=3000 } + +% @w prevents a word break. Without the \leavevmode, @w at the +% beginning of a paragraph, when TeX is still in vertical mode, would +% produce a whole line of output instead of starting the paragraph. +\def\w#1{\leavevmode\hbox{#1}} + +% @group ... @end group forces ... to be all on one page, by enclosing +% it in a TeX vbox. We use \vtop instead of \vbox to construct the box +% to keep its height that of a normal line. According to the rules for +% \topskip (p.114 of the TeXbook), the glue inserted is +% max (\topskip - \ht (first item), 0). If that height is large, +% therefore, no glue is inserted, and the space between the headline and +% the text is small, which looks bad. +% +% Another complication is that the group might be very large. This can +% cause the glue on the previous page to be unduly stretched, because it +% does not have much material. In this case, it's better to add an +% explicit \vfill so that the extra space is at the bottom. The +% threshold for doing this is if the group is more than \vfilllimit +% percent of a page (\vfilllimit can be changed inside of @tex). +% +\newbox\groupbox +\def\vfilllimit{0.7} +% +\def\group{\begingroup + \ifnum\catcode13=\active \else + \errhelp = \groupinvalidhelp + \errmessage{@group invalid in context where filling is enabled}% + \fi + % + % The \vtop we start below produces a box with normal height and large + % depth; thus, TeX puts \baselineskip glue before it, and (when the + % next line of text is done) \lineskip glue after it. (See p.82 of + % the TeXbook.) Thus, space below is not quite equal to space + % above. But it's pretty close. + \def\Egroup{% + \egroup % End the \vtop. + % \dimen0 is the vertical size of the group's box. + \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox + % \dimen2 is how much space is left on the page (more or less). + \dimen2 = \pageheight \advance\dimen2 by -\pagetotal + % if the group doesn't fit on the current page, and it's a big big + % group, force a page break. + \ifdim \dimen0 > \dimen2 + \ifdim \pagetotal < \vfilllimit\pageheight + \page + \fi + \fi + \copy\groupbox + \endgroup % End the \group. + }% + % + \setbox\groupbox = \vtop\bgroup + % We have to put a strut on the last line in case the @group is in + % the midst of an example, rather than completely enclosing it. + % Otherwise, the interline space between the last line of the group + % and the first line afterwards is too small. But we can't put the + % strut in \Egroup, since there it would be on a line by itself. + % Hence this just inserts a strut at the beginning of each line. + \everypar = {\strut}% + % + % Since we have a strut on every line, we don't need any of TeX's + % normal interline spacing. + \offinterlineskip + % + % OK, but now we have to do something about blank + % lines in the input in @example-like environments, which normally + % just turn into \lisppar, which will insert no space now that we've + % turned off the interline space. Simplest is to make them be an + % empty paragraph. + \ifx\par\lisppar + \edef\par{\leavevmode \par}% + % + % Reset ^^M's definition to new definition of \par. + \obeylines + \fi + % + % Do @comment since we are called inside an environment such as + % @example, where each end-of-line in the input causes an + % end-of-line in the output. We don't want the end-of-line after + % the `@group' to put extra space in the output. Since @group + % should appear on a line by itself (according to the Texinfo + % manual), we don't worry about eating any user text. + \comment +} +% +% TeX puts in an \escapechar (i.e., `@') at the beginning of the help +% message, so this ends up printing `@group can only ...'. +% +\newhelp\groupinvalidhelp{% +group can only be used in environments such as @example,^^J% +where each line of input produces a line of output.} + +% @need space-in-mils +% forces a page break if there is not space-in-mils remaining. + +\newdimen\mil \mil=0.001in + +\def\need{\parsearg\needx} + +% Old definition--didn't work. +%\def\needx #1{\par % +%% This method tries to make TeX break the page naturally +%% if the depth of the box does not fit. +%{\baselineskip=0pt% +%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak +%\prevdepth=-1000pt +%}} + +\def\needx#1{% + % Ensure vertical mode, so we don't make a big box in the middle of a + % paragraph. + \par + % + % If the @need value is less than one line space, it's useless. + \dimen0 = #1\mil + \dimen2 = \ht\strutbox + \advance\dimen2 by \dp\strutbox + \ifdim\dimen0 > \dimen2 + % + % Do a \strut just to make the height of this box be normal, so the + % normal leading is inserted relative to the preceding line. + % And a page break here is fine. + \vtop to #1\mil{\strut\vfil}% + % + % TeX does not even consider page breaks if a penalty added to the + % main vertical list is 10000 or more. But in order to see if the + % empty box we just added fits on the page, we must make it consider + % page breaks. On the other hand, we don't want to actually break the + % page after the empty box. So we use a penalty of 9999. + % + % There is an extremely small chance that TeX will actually break the + % page at this \penalty, if there are no other feasible breakpoints in + % sight. (If the user is using lots of big @group commands, which + % almost-but-not-quite fill up a page, TeX will have a hard time doing + % good page breaking, for example.) However, I could not construct an + % example where a page broke at this \penalty; if it happens in a real + % document, then we can reconsider our strategy. + \penalty9999 + % + % Back up by the size of the box, whether we did a page break or not. + \kern -#1\mil + % + % Do not allow a page break right after this kern. + \nobreak + \fi +} + +% @br forces paragraph break + +\let\br = \par + +% @dots{} output an ellipsis using the current font. +% We do .5em per period so that it has the same spacing in a typewriter +% font as three actual period characters. +% +\def\dots{% + \leavevmode + \hbox to 1.5em{% + \hskip 0pt plus 0.25fil minus 0.25fil + .\hss.\hss.% + \hskip 0pt plus 0.5fil minus 0.5fil + }% +} + +% @enddots{} is an end-of-sentence ellipsis. +% +\def\enddots{% + \leavevmode + \hbox to 2em{% + \hskip 0pt plus 0.25fil minus 0.25fil + .\hss.\hss.\hss.% + \hskip 0pt plus 0.5fil minus 0.5fil + }% + \spacefactor=3000 +} + + +% @page forces the start of a new page +% +\def\page{\par\vfill\supereject} + +% @exdent text.... +% outputs text on separate line in roman font, starting at standard page margin + +% This records the amount of indent in the innermost environment. +% That's how much \exdent should take out. +\newskip\exdentamount + +% This defn is used inside fill environments such as @defun. +\def\exdent{\parsearg\exdentyyy} +\def\exdentyyy #1{{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}} + +% This defn is used inside nofill environments such as @example. +\def\nofillexdent{\parsearg\nofillexdentyyy} +\def\nofillexdentyyy #1{{\advance \leftskip by -\exdentamount +\leftline{\hskip\leftskip{\rm#1}}}} + +% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current +% paragraph. For more general purposes, use the \margin insertion +% class. WHICH is `l' or `r'. +% +\newskip\inmarginspacing \inmarginspacing=1cm +\def\strutdepth{\dp\strutbox} +% +\def\doinmargin#1#2{\strut\vadjust{% + \nobreak + \kern-\strutdepth + \vtop to \strutdepth{% + \baselineskip=\strutdepth + \vss + % if you have multiple lines of stuff to put here, you'll need to + % make the vbox yourself of the appropriate size. + \ifx#1l% + \llap{\ignorespaces #2\hskip\inmarginspacing}% + \else + \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}% + \fi + \null + }% +}} +\def\inleftmargin{\doinmargin l} +\def\inrightmargin{\doinmargin r} +% +% @inmargin{TEXT [, RIGHT-TEXT]} +% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right; +% else use TEXT for both). +% +\def\inmargin#1{\parseinmargin #1,,\finish} +\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing. + \setbox0 = \hbox{\ignorespaces #2}% + \ifdim\wd0 > 0pt + \def\lefttext{#1}% have both texts + \def\righttext{#2}% + \else + \def\lefttext{#1}% have only one text + \def\righttext{#1}% + \fi + % + \ifodd\pageno + \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin + \else + \def\temp{\inleftmargin\lefttext}% + \fi + \temp +} + +% @include file insert text of that file as input. +% Allow normal characters that we make active in the argument (a file name). +\def\include{\begingroup + \catcode`\\=\other + \catcode`~=\other + \catcode`^=\other + \catcode`_=\other + \catcode`|=\other + \catcode`<=\other + \catcode`>=\other + \catcode`+=\other + \parsearg\includezzz} +% Restore active chars for included file. +\def\includezzz#1{\endgroup\begingroup + % Read the included file in a group so nested @include's work. + \def\thisfile{#1}% + \let\value=\expandablevalue + \input\thisfile +\endgroup} + +\def\thisfile{} + +% @center line +% outputs that line, centered. +% +\def\center{\parsearg\docenter} +\def\docenter#1{{% + \ifhmode \hfil\break \fi + \advance\hsize by -\leftskip + \advance\hsize by -\rightskip + \line{\hfil \ignorespaces#1\unskip \hfil}% + \ifhmode \break \fi +}} + +% @sp n outputs n lines of vertical space + +\def\sp{\parsearg\spxxx} +\def\spxxx #1{\vskip #1\baselineskip} + +% @comment ...line which is ignored... +% @c is the same as @comment +% @ignore ... @end ignore is another way to write a comment + +\def\comment{\begingroup \catcode`\^^M=\other% +\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% +\commentxxx} +{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}} + +\let\c=\comment + +% @paragraphindent NCHARS +% We'll use ems for NCHARS, close enough. +% We cannot implement @paragraphindent asis, though. +% +\def\asisword{asis} % no translation, these are keywords +\def\noneword{none} +% +\def\paragraphindent{\parsearg\doparagraphindent} +\def\doparagraphindent#1{% + \def\temp{#1}% + \ifx\temp\asisword + \else + \ifx\temp\noneword + \defaultparindent = 0pt + \else + \defaultparindent = #1em + \fi + \fi + \parindent = \defaultparindent +} + +% @exampleindent NCHARS +% We'll use ems for NCHARS like @paragraphindent. +% It seems @exampleindent asis isn't necessary, but +% I preserve it to make it similar to @paragraphindent. +\def\exampleindent{\parsearg\doexampleindent} +\def\doexampleindent#1{% + \def\temp{#1}% + \ifx\temp\asisword + \else + \ifx\temp\noneword + \lispnarrowing = 0pt + \else + \lispnarrowing = #1em + \fi + \fi +} + +% @asis just yields its argument. Used with @table, for example. +% +\def\asis#1{#1} + +% @math outputs its argument in math mode. +% We don't use $'s directly in the definition of \math because we need +% to set catcodes according to plain TeX first, to allow for subscripts, +% superscripts, special math chars, etc. +% +\let\implicitmath = $%$ font-lock fix +% +% One complication: _ usually means subscripts, but it could also mean +% an actual _ character, as in @math{@var{some_variable} + 1}. So make +% _ within @math be active (mathcode "8000), and distinguish by seeing +% if the current family is \slfam, which is what @var uses. +% +{\catcode\underChar = \active +\gdef\mathunderscore{% + \catcode\underChar=\active + \def_{\ifnum\fam=\slfam \_\else\sb\fi}% +}} +% +% Another complication: we want \\ (and @\) to output a \ character. +% FYI, plain.tex uses \\ as a temporary control sequence (why?), but +% this is not advertised and we don't care. Texinfo does not +% otherwise define @\. +% +% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. +\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} +% +\def\math{% + \tex + \mathcode`\_="8000 \mathunderscore + \let\\ = \mathbackslash + \mathactive + \implicitmath\finishmath} +\def\finishmath#1{#1\implicitmath\Etex} + +% Some active characters (such as <) are spaced differently in math. +% We have to reset their definitions in case the @math was an +% argument to a command which set the catcodes (such as @item or @section). +% +{ + \catcode`^ = \active + \catcode`< = \active + \catcode`> = \active + \catcode`+ = \active + \gdef\mathactive{% + \let^ = \ptexhat + \let< = \ptexless + \let> = \ptexgtr + \let+ = \ptexplus + } +} + +% @bullet and @minus need the same treatment as @math, just above. +\def\bullet{\implicitmath\ptexbullet\implicitmath} +\def\minus{\implicitmath-\implicitmath} + +% @refill is a no-op. +\let\refill=\relax + +% If working on a large document in chapters, it is convenient to +% be able to disable indexing, cross-referencing, and contents, for test runs. +% This is done with @novalidate (before @setfilename). +% +\newif\iflinks \linkstrue % by default we want the aux files. +\let\novalidate = \linksfalse + +% @setfilename is done at the beginning of every texinfo file. +% So open here the files we need to have open while reading the input. +% This makes it possible to make a .fmt file for texinfo. +\def\setfilename{% + \iflinks + \readauxfile + \fi % \openindices needs to do some work in any case. + \openindices + \fixbackslash % Turn off hack to swallow `\input texinfo'. + \global\let\setfilename=\comment % Ignore extra @setfilename cmds. + % + % If texinfo.cnf is present on the system, read it. + % Useful for site-wide @afourpaper, etc. + % Just to be on the safe side, close the input stream before the \input. + \openin 1 texinfo.cnf + \ifeof1 \let\temp=\relax \else \def\temp{\input texinfo.cnf }\fi + \closein1 + \temp + % + \comment % Ignore the actual filename. +} + +% Called from \setfilename. +% +\def\openindices{% + \newindex{cp}% + \newcodeindex{fn}% + \newcodeindex{vr}% + \newcodeindex{tp}% + \newcodeindex{ky}% + \newcodeindex{pg}% +} + +% @bye. +\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} + + +\message{pdf,} +% adobe `portable' document format +\newcount\tempnum +\newcount\lnkcount +\newtoks\filename +\newcount\filenamelength +\newcount\pgn +\newtoks\toksA +\newtoks\toksB +\newtoks\toksC +\newtoks\toksD +\newbox\boxA +\newcount\countA +\newif\ifpdf +\newif\ifpdfmakepagedest + +\ifx\pdfoutput\undefined + \pdffalse + \let\pdfmkdest = \gobble + \let\pdfurl = \gobble + \let\endlink = \relax + \let\linkcolor = \relax + \let\pdfmakeoutlines = \relax +\else + \pdftrue + \pdfoutput = 1 + \input pdfcolor + \def\dopdfimage#1#2#3{% + \def\imagewidth{#2}% + \def\imageheight{#3}% + % without \immediate, pdftex seg faults when the same image is + % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.) + \ifnum\pdftexversion < 14 + \immediate\pdfimage + \else + \immediate\pdfximage + \fi + \ifx\empty\imagewidth\else width \imagewidth \fi + \ifx\empty\imageheight\else height \imageheight \fi + \ifnum\pdftexversion<13 + #1.pdf% + \else + {#1.pdf}% + \fi + \ifnum\pdftexversion < 14 \else + \pdfrefximage \pdflastximage + \fi} + \def\pdfmkdest#1{{\normalturnoffactive \pdfdest name{#1} xyz}} + \def\pdfmkpgn#1{#1} + \let\linkcolor = \Blue % was Cyan, but that seems light? + \def\endlink{\Black\pdfendlink} + % Adding outlines to PDF; macros for calculating structure of outlines + % come from Petr Olsak + \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0% + \else \csname#1\endcsname \fi} + \def\advancenumber#1{\tempnum=\expnumber{#1}\relax + \advance\tempnum by1 + \expandafter\xdef\csname#1\endcsname{\the\tempnum}} + \def\pdfmakeoutlines{{% + \openin 1 \jobname.toc + \ifeof 1\else\begingroup + \closein 1 + % Thanh's hack / proper braces in bookmarks + \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace + \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace + % + \def\chapentry ##1##2##3{} + \def\secentry ##1##2##3##4{\advancenumber{chap##2}} + \def\subsecentry ##1##2##3##4##5{\advancenumber{sec##2.##3}} + \def\subsubsecentry ##1##2##3##4##5##6{\advancenumber{subsec##2.##3.##4}} + \let\appendixentry = \chapentry + \let\unnumbchapentry = \chapentry + \let\unnumbsecentry = \secentry + \let\unnumbsubsecentry = \subsecentry + \let\unnumbsubsubsecentry = \subsubsecentry + \input \jobname.toc + \def\chapentry ##1##2##3{% + \pdfoutline goto name{\pdfmkpgn{##3}}count-\expnumber{chap##2}{##1}} + \def\secentry ##1##2##3##4{% + \pdfoutline goto name{\pdfmkpgn{##4}}count-\expnumber{sec##2.##3}{##1}} + \def\subsecentry ##1##2##3##4##5{% + \pdfoutline goto name{\pdfmkpgn{##5}}count-\expnumber{subsec##2.##3.##4}{##1}} + \def\subsubsecentry ##1##2##3##4##5##6{% + \pdfoutline goto name{\pdfmkpgn{##6}}{##1}} + \let\appendixentry = \chapentry + \let\unnumbchapentry = \chapentry + \let\unnumbsecentry = \secentry + \let\unnumbsubsecentry = \subsecentry + \let\unnumbsubsubsecentry = \subsubsecentry + % + % Make special characters normal for writing to the pdf file. + % + \indexnofonts + \let\tt=\relax + \turnoffactive + \input \jobname.toc + \endgroup\fi + }} + \def\makelinks #1,{% + \def\params{#1}\def\E{END}% + \ifx\params\E + \let\nextmakelinks=\relax + \else + \let\nextmakelinks=\makelinks + \ifnum\lnkcount>0,\fi + \picknum{#1}% + \startlink attr{/Border [0 0 0]} + goto name{\pdfmkpgn{\the\pgn}}% + \linkcolor #1% + \advance\lnkcount by 1% + \endlink + \fi + \nextmakelinks + } + \def\picknum#1{\expandafter\pn#1} + \def\pn#1{% + \def\p{#1}% + \ifx\p\lbrace + \let\nextpn=\ppn + \else + \let\nextpn=\ppnn + \def\first{#1} + \fi + \nextpn + } + \def\ppn#1{\pgn=#1\gobble} + \def\ppnn{\pgn=\first} + \def\pdfmklnk#1{\lnkcount=0\makelinks #1,END,} + \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} + \def\skipspaces#1{\def\PP{#1}\def\D{|}% + \ifx\PP\D\let\nextsp\relax + \else\let\nextsp\skipspaces + \ifx\p\space\else\addtokens{\filename}{\PP}% + \advance\filenamelength by 1 + \fi + \fi + \nextsp} + \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax} + \ifnum\pdftexversion < 14 + \let \startlink \pdfannotlink + \else + \let \startlink \pdfstartlink + \fi + \def\pdfurl#1{% + \begingroup + \normalturnoffactive\def\@{@}% + \let\value=\expandablevalue + \leavevmode\Red + \startlink attr{/Border [0 0 0]}% + user{/Subtype /Link /A << /S /URI /URI (#1) >>}% + % #1 + \endgroup} + \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}} + \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} + \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks} + \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}} + \def\maketoks{% + \expandafter\poptoks\the\toksA|ENDTOKS| + \ifx\first0\adn0 + \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 + \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 + \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 + \else + \ifnum0=\countA\else\makelink\fi + \ifx\first.\let\next=\done\else + \let\next=\maketoks + \addtokens{\toksB}{\the\toksD} + \ifx\first,\addtokens{\toksB}{\space}\fi + \fi + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi + \next} + \def\makelink{\addtokens{\toksB}% + {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} + \def\pdflink#1{% + \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} + \linkcolor #1\endlink} + \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} +\fi % \ifx\pdfoutput + + +\message{fonts,} +% Font-change commands. + +% Texinfo sort of supports the sans serif font style, which plain TeX does not. +% So we set up a \sf analogous to plain's \rm, etc. +\newfam\sffam +\def\sf{\fam=\sffam \tensf} +\let\li = \sf % Sometimes we call it \li, not \sf. + +% We don't need math for this one. +\def\ttsl{\tenttsl} + +% Default leading. +\newdimen\textleading \textleading = 13.2pt + +% Set the baselineskip to #1, and the lineskip and strut size +% correspondingly. There is no deep meaning behind these magic numbers +% used as factors; they just match (closely enough) what Knuth defined. +% +\def\lineskipfactor{.08333} +\def\strutheightpercent{.70833} +\def\strutdepthpercent {.29167} +% +\def\setleading#1{% + \normalbaselineskip = #1\relax + \normallineskip = \lineskipfactor\normalbaselineskip + \normalbaselines + \setbox\strutbox =\hbox{% + \vrule width0pt height\strutheightpercent\baselineskip + depth \strutdepthpercent \baselineskip + }% +} + +% Set the font macro #1 to the font named #2, adding on the +% specified font prefix (normally `cm'). +% #3 is the font's design size, #4 is a scale factor +\def\setfont#1#2#3#4{\font#1=\fontprefix#2#3 scaled #4} + +% Use cm as the default font prefix. +% To specify the font prefix, you must define \fontprefix +% before you read in texinfo.tex. +\ifx\fontprefix\undefined +\def\fontprefix{cm} +\fi +% Support font families that don't use the same naming scheme as CM. +\def\rmshape{r} +\def\rmbshape{bx} %where the normal face is bold +\def\bfshape{b} +\def\bxshape{bx} +\def\ttshape{tt} +\def\ttbshape{tt} +\def\ttslshape{sltt} +\def\itshape{ti} +\def\itbshape{bxti} +\def\slshape{sl} +\def\slbshape{bxsl} +\def\sfshape{ss} +\def\sfbshape{ss} +\def\scshape{csc} +\def\scbshape{csc} + +\newcount\mainmagstep +\ifx\bigger\relax + % not really supported. + \mainmagstep=\magstep1 + \setfont\textrm\rmshape{12}{1000} + \setfont\texttt\ttshape{12}{1000} +\else + \mainmagstep=\magstephalf + \setfont\textrm\rmshape{10}{\mainmagstep} + \setfont\texttt\ttshape{10}{\mainmagstep} +\fi +% Instead of cmb10, you may want to use cmbx10. +% cmbx10 is a prettier font on its own, but cmb10 +% looks better when embedded in a line with cmr10 +% (in Bob's opinion). +\setfont\textbf\bfshape{10}{\mainmagstep} +\setfont\textit\itshape{10}{\mainmagstep} +\setfont\textsl\slshape{10}{\mainmagstep} +\setfont\textsf\sfshape{10}{\mainmagstep} +\setfont\textsc\scshape{10}{\mainmagstep} +\setfont\textttsl\ttslshape{10}{\mainmagstep} +\font\texti=cmmi10 scaled \mainmagstep +\font\textsy=cmsy10 scaled \mainmagstep + +% A few fonts for @defun, etc. +\setfont\defbf\bxshape{10}{\magstep1} %was 1314 +\setfont\deftt\ttshape{10}{\magstep1} +\def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf} + +% Fonts for indices, footnotes, small examples (9pt). +\setfont\smallrm\rmshape{9}{1000} +\setfont\smalltt\ttshape{9}{1000} +\setfont\smallbf\bfshape{10}{900} +\setfont\smallit\itshape{9}{1000} +\setfont\smallsl\slshape{9}{1000} +\setfont\smallsf\sfshape{9}{1000} +\setfont\smallsc\scshape{10}{900} +\setfont\smallttsl\ttslshape{10}{900} +\font\smalli=cmmi9 +\font\smallsy=cmsy9 + +% Fonts for small examples (8pt). +\setfont\smallerrm\rmshape{8}{1000} +\setfont\smallertt\ttshape{8}{1000} +\setfont\smallerbf\bfshape{10}{800} +\setfont\smallerit\itshape{8}{1000} +\setfont\smallersl\slshape{8}{1000} +\setfont\smallersf\sfshape{8}{1000} +\setfont\smallersc\scshape{10}{800} +\setfont\smallerttsl\ttslshape{10}{800} +\font\smalleri=cmmi8 +\font\smallersy=cmsy8 + +% Fonts for title page: +\setfont\titlerm\rmbshape{12}{\magstep3} +\setfont\titleit\itbshape{10}{\magstep4} +\setfont\titlesl\slbshape{10}{\magstep4} +\setfont\titlett\ttbshape{12}{\magstep3} +\setfont\titlettsl\ttslshape{10}{\magstep4} +\setfont\titlesf\sfbshape{17}{\magstep1} +\let\titlebf=\titlerm +\setfont\titlesc\scbshape{10}{\magstep4} +\font\titlei=cmmi12 scaled \magstep3 +\font\titlesy=cmsy10 scaled \magstep4 +\def\authorrm{\secrm} +\def\authortt{\sectt} + +% Chapter (and unnumbered) fonts (17.28pt). +\setfont\chaprm\rmbshape{12}{\magstep2} +\setfont\chapit\itbshape{10}{\magstep3} +\setfont\chapsl\slbshape{10}{\magstep3} +\setfont\chaptt\ttbshape{12}{\magstep2} +\setfont\chapttsl\ttslshape{10}{\magstep3} +\setfont\chapsf\sfbshape{17}{1000} +\let\chapbf=\chaprm +\setfont\chapsc\scbshape{10}{\magstep3} +\font\chapi=cmmi12 scaled \magstep2 +\font\chapsy=cmsy10 scaled \magstep3 + +% Section fonts (14.4pt). +\setfont\secrm\rmbshape{12}{\magstep1} +\setfont\secit\itbshape{10}{\magstep2} +\setfont\secsl\slbshape{10}{\magstep2} +\setfont\sectt\ttbshape{12}{\magstep1} +\setfont\secttsl\ttslshape{10}{\magstep2} +\setfont\secsf\sfbshape{12}{\magstep1} +\let\secbf\secrm +\setfont\secsc\scbshape{10}{\magstep2} +\font\seci=cmmi12 scaled \magstep1 +\font\secsy=cmsy10 scaled \magstep2 + +% Subsection fonts (13.15pt). +\setfont\ssecrm\rmbshape{12}{\magstephalf} +\setfont\ssecit\itbshape{10}{1315} +\setfont\ssecsl\slbshape{10}{1315} +\setfont\ssectt\ttbshape{12}{\magstephalf} +\setfont\ssecttsl\ttslshape{10}{1315} +\setfont\ssecsf\sfbshape{12}{\magstephalf} +\let\ssecbf\ssecrm +\setfont\ssecsc\scbshape{10}{\magstep1} +\font\sseci=cmmi12 scaled \magstephalf +\font\ssecsy=cmsy10 scaled 1315 +% The smallcaps and symbol fonts should actually be scaled \magstep1.5, +% but that is not a standard magnification. + +% In order for the font changes to affect most math symbols and letters, +% we have to define the \textfont of the standard families. Since +% texinfo doesn't allow for producing subscripts and superscripts except +% in the main text, we don't bother to reset \scriptfont and +% \scriptscriptfont (which would also require loading a lot more fonts). +% +\def\resetmathfonts{% + \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy + \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf + \textfont\ttfam=\tentt \textfont\sffam=\tensf +} + +% The font-changing commands redefine the meanings of \tenSTYLE, instead +% of just \STYLE. We do this so that font changes will continue to work +% in math mode, where it is the current \fam that is relevant in most +% cases, not the current font. Plain TeX does \def\bf{\fam=\bffam +% \tenbf}, for example. By redefining \tenbf, we obviate the need to +% redefine \bf itself. +\def\textfonts{% + \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl + \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc + \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl + \resetmathfonts \setleading{\textleading}} +\def\titlefonts{% + \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl + \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc + \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy + \let\tenttsl=\titlettsl + \resetmathfonts \setleading{25pt}} +\def\titlefont#1{{\titlefonts\rm #1}} +\def\chapfonts{% + \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl + \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc + \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl + \resetmathfonts \setleading{19pt}} +\def\secfonts{% + \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl + \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc + \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl + \resetmathfonts \setleading{16pt}} +\def\subsecfonts{% + \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl + \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc + \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl + \resetmathfonts \setleading{15pt}} +\let\subsubsecfonts = \subsecfonts % Maybe make sssec fonts scaled magstephalf? +\def\smallfonts{% + \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl + \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc + \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy + \let\tenttsl=\smallttsl + \resetmathfonts \setleading{10.5pt}} +\def\smallerfonts{% + \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl + \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc + \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy + \let\tenttsl=\smallerttsl + \resetmathfonts \setleading{9.5pt}} + +% Set the fonts to use with the @small... environments. +\let\smallexamplefonts = \smallfonts + +% About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample +% can fit this many characters: +% 8.5x11=86 smallbook=72 a4=90 a5=69 +% If we use \smallerfonts (8pt), then we can fit this many characters: +% 8.5x11=90+ smallbook=80 a4=90+ a5=77 +% For me, subjectively, the few extra characters that fit aren't worth +% the additional smallness of 8pt. So I'm making the default 9pt. +% +% By the way, for comparison, here's what fits with @example (10pt): +% 8.5x11=71 smallbook=60 a4=75 a5=58 +% +% I wish we used A4 paper on this side of the Atlantic. +% +% --karl, 24jan03. + + +% Set up the default fonts, so we can use them for creating boxes. +% +\textfonts + +% Define these so they can be easily changed for other fonts. +\def\angleleft{$\langle$} +\def\angleright{$\rangle$} + +% Count depth in font-changes, for error checks +\newcount\fontdepth \fontdepth=0 + +% Fonts for short table of contents. +\setfont\shortcontrm\rmshape{12}{1000} +\setfont\shortcontbf\bxshape{12}{1000} +\setfont\shortcontsl\slshape{12}{1000} +\setfont\shortconttt\ttshape{12}{1000} + +%% Add scribe-like font environments, plus @l for inline lisp (usually sans +%% serif) and @ii for TeX italic + +% \smartitalic{ARG} outputs arg in italics, followed by an italic correction +% unless the following character is such as not to need one. +\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else\/\fi\fi\fi} +\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx} +\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx} + +\let\i=\smartitalic +\let\var=\smartslanted +\let\dfn=\smartslanted +\let\emph=\smartitalic +\let\cite=\smartslanted + +\def\b#1{{\bf #1}} +\let\strong=\b + +% We can't just use \exhyphenpenalty, because that only has effect at +% the end of a paragraph. Restore normal hyphenation at the end of the +% group within which \nohyphenation is presumably called. +% +\def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} +\def\restorehyphenation{\hyphenchar\font = `- } + +% Set sfcode to normal for the chars that usually have another value. +% Can't use plain's \frenchspacing because it uses the `\x notation, and +% sometimes \x has an active definition that messes things up. +% +\catcode`@=11 + \def\frenchspacing{% + \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m + \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m + } +\catcode`@=\other + +\def\t#1{% + {\tt \rawbackslash \frenchspacing #1}% + \null +} +\let\ttfont=\t +\def\samp#1{`\tclose{#1}'\null} +\setfont\keyrm\rmshape{8}{1000} +\font\keysy=cmsy9 +\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% + \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% + \vbox{\hrule\kern-0.4pt + \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% + \kern-0.4pt\hrule}% + \kern-.06em\raise0.4pt\hbox{\angleright}}}} +% The old definition, with no lozenge: +%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null} +\def\ctrl #1{{\tt \rawbackslash \hat}#1} + +% @file, @option are the same as @samp. +\let\file=\samp +\let\option=\samp + +% @code is a modification of @t, +% which makes spaces the same size as normal in the surrounding text. +\def\tclose#1{% + {% + % Change normal interword space to be same as for the current font. + \spaceskip = \fontdimen2\font + % + % Switch to typewriter. + \tt + % + % But `\ ' produces the large typewriter interword space. + \def\ {{\spaceskip = 0pt{} }}% + % + % Turn off hyphenation. + \nohyphenation + % + \rawbackslash + \frenchspacing + #1% + }% + \null +} + +% We *must* turn on hyphenation at `-' and `_' in \code. +% Otherwise, it is too hard to avoid overfull hboxes +% in the Emacs manual, the Library manual, etc. + +% Unfortunately, TeX uses one parameter (\hyphenchar) to control +% both hyphenation at - and hyphenation within words. +% We must therefore turn them both off (\tclose does that) +% and arrange explicitly to hyphenate at a dash. +% -- rms. +{ + \catcode`\-=\active + \catcode`\_=\active + % + \global\def\code{\begingroup + \catcode`\-=\active \let-\codedash + \catcode`\_=\active \let_\codeunder + \codex + } + % + % If we end up with any active - characters when handling the index, + % just treat them as a normal -. + \global\def\indexbreaks{\catcode`\-=\active \let-\realdash} +} + +\def\realdash{-} +\def\codedash{-\discretionary{}{}{}} +\def\codeunder{% + % this is all so @math{@code{var_name}+1} can work. In math mode, _ + % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) + % will therefore expand the active definition of _, which is us + % (inside @code that is), therefore an endless loop. + \ifusingtt{\ifmmode + \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_. + \else\normalunderscore \fi + \discretionary{}{}{}}% + {\_}% +} +\def\codex #1{\tclose{#1}\endgroup} + +% @kbd is like @code, except that if the argument is just one @key command, +% then @kbd has no effect. + +% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), +% `example' (@kbd uses ttsl only inside of @example and friends), +% or `code' (@kbd uses normal tty font always). +\def\kbdinputstyle{\parsearg\kbdinputstylexxx} +\def\kbdinputstylexxx#1{% + \def\arg{#1}% + \ifx\arg\worddistinct + \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% + \else\ifx\arg\wordexample + \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% + \else\ifx\arg\wordcode + \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% + \else + \errhelp = \EMsimple + \errmessage{Unknown @kbdinputstyle `\arg'}% + \fi\fi\fi +} +\def\worddistinct{distinct} +\def\wordexample{example} +\def\wordcode{code} + +% Default is `distinct.' +\kbdinputstyle distinct + +\def\xkey{\key} +\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}% +\ifx\one\xkey\ifx\threex\three \key{#2}% +\else{\tclose{\kbdfont\look}}\fi +\else{\tclose{\kbdfont\look}}\fi} + +% For @url, @env, @command quotes seem unnecessary, so use \code. +\let\url=\code +\let\env=\code +\let\command=\code + +% @uref (abbreviation for `urlref') takes an optional (comma-separated) +% second argument specifying the text to display and an optional third +% arg as text to display instead of (rather than in addition to) the url +% itself. First (mandatory) arg is the url. Perhaps eventually put in +% a hypertex \special here. +% +\def\uref#1{\douref #1,,,\finish} +\def\douref#1,#2,#3,#4\finish{\begingroup + \unsepspaces + \pdfurl{#1}% + \setbox0 = \hbox{\ignorespaces #3}% + \ifdim\wd0 > 0pt + \unhbox0 % third arg given, show only that + \else + \setbox0 = \hbox{\ignorespaces #2}% + \ifdim\wd0 > 0pt + \ifpdf + \unhbox0 % PDF: 2nd arg given, show only it + \else + \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url + \fi + \else + \code{#1}% only url given, so show it + \fi + \fi + \endlink +\endgroup} + +% rms does not like angle brackets --karl, 17may97. +% So now @email is just like @uref, unless we are pdf. +% +%\def\email#1{\angleleft{\tt #1}\angleright} +\ifpdf + \def\email#1{\doemail#1,,\finish} + \def\doemail#1,#2,#3\finish{\begingroup + \unsepspaces + \pdfurl{mailto:#1}% + \setbox0 = \hbox{\ignorespaces #2}% + \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi + \endlink + \endgroup} +\else + \let\email=\uref +\fi + +% Check if we are currently using a typewriter font. Since all the +% Computer Modern typewriter fonts have zero interword stretch (and +% shrink), and it is reasonable to expect all typewriter fonts to have +% this property, we can check that font parameter. +% +\def\ifmonospace{\ifdim\fontdimen3\font=0pt } + +% Typeset a dimension, e.g., `in' or `pt'. The only reason for the +% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt. +% +\def\dmn#1{\thinspace #1} + +\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par} + +% @l was never documented to mean ``switch to the Lisp font'', +% and it is not used as such in any manual I can find. We need it for +% Polish suppressed-l. --karl, 22sep96. +%\def\l#1{{\li #1}\null} + +% Explicit font changes: @r, @sc, undocumented @ii. +\def\r#1{{\rm #1}} % roman font +\def\sc#1{{\smallcaps#1}} % smallcaps font +\def\ii#1{{\it #1}} % italic font + +% @acronym downcases the argument and prints in smallcaps. +\def\acronym#1{{\smallcaps \lowercase{#1}}} + +% @pounds{} is a sterling sign. +\def\pounds{{\it\$}} + + +\message{page headings,} + +\newskip\titlepagetopglue \titlepagetopglue = 1.5in +\newskip\titlepagebottomglue \titlepagebottomglue = 2pc + +% First the title page. Must do @settitle before @titlepage. +\newif\ifseenauthor +\newif\iffinishedtitlepage + +% Do an implicit @contents or @shortcontents after @end titlepage if the +% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage. +% +\newif\ifsetcontentsaftertitlepage + \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue +\newif\ifsetshortcontentsaftertitlepage + \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue + +\def\shorttitlepage{\parsearg\shorttitlepagezzz} +\def\shorttitlepagezzz #1{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}% + \endgroup\page\hbox{}\page} + +\def\titlepage{\begingroup \parindent=0pt \textfonts + \let\subtitlerm=\tenrm + \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}% + % + \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines + \let\tt=\authortt}% + % + % Leave some space at the very top of the page. + \vglue\titlepagetopglue + % + % Now you can print the title using @title. + \def\title{\parsearg\titlezzz}% + \def\titlezzz##1{\leftline{\titlefonts\rm ##1} + % print a rule at the page bottom also. + \finishedtitlepagefalse + \vskip4pt \hrule height 4pt width \hsize \vskip4pt}% + % No rule at page bottom unless we print one at the top with @title. + \finishedtitlepagetrue + % + % Now you can put text using @subtitle. + \def\subtitle{\parsearg\subtitlezzz}% + \def\subtitlezzz##1{{\subtitlefont \rightline{##1}}}% + % + % @author should come last, but may come many times. + \def\author{\parsearg\authorzzz}% + \def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi + {\authorfont \leftline{##1}}}% + % + % Most title ``pages'' are actually two pages long, with space + % at the top of the second. We don't want the ragged left on the second. + \let\oldpage = \page + \def\page{% + \iffinishedtitlepage\else + \finishtitlepage + \fi + \oldpage + \let\page = \oldpage + \hbox{}}% +% \def\page{\oldpage \hbox{}} +} + +\def\Etitlepage{% + \iffinishedtitlepage\else + \finishtitlepage + \fi + % It is important to do the page break before ending the group, + % because the headline and footline are only empty inside the group. + % If we use the new definition of \page, we always get a blank page + % after the title page, which we certainly don't want. + \oldpage + \endgroup + % + % Need this before the \...aftertitlepage checks so that if they are + % in effect the toc pages will come out with page numbers. + \HEADINGSon + % + % If they want short, they certainly want long too. + \ifsetshortcontentsaftertitlepage + \shortcontents + \contents + \global\let\shortcontents = \relax + \global\let\contents = \relax + \fi + % + \ifsetcontentsaftertitlepage + \contents + \global\let\contents = \relax + \global\let\shortcontents = \relax + \fi +} + +\def\finishtitlepage{% + \vskip4pt \hrule height 2pt width \hsize + \vskip\titlepagebottomglue + \finishedtitlepagetrue +} + +%%% Set up page headings and footings. + +\let\thispage=\folio + +\newtoks\evenheadline % headline on even pages +\newtoks\oddheadline % headline on odd pages +\newtoks\evenfootline % footline on even pages +\newtoks\oddfootline % footline on odd pages + +% Now make Tex use those variables +\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline + \else \the\evenheadline \fi}} +\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline + \else \the\evenfootline \fi}\HEADINGShook} +\let\HEADINGShook=\relax + +% Commands to set those variables. +% For example, this is what @headings on does +% @evenheading @thistitle|@thispage|@thischapter +% @oddheading @thischapter|@thispage|@thistitle +% @evenfooting @thisfile|| +% @oddfooting ||@thisfile + +\def\evenheading{\parsearg\evenheadingxxx} +\def\oddheading{\parsearg\oddheadingxxx} +\def\everyheading{\parsearg\everyheadingxxx} + +\def\evenfooting{\parsearg\evenfootingxxx} +\def\oddfooting{\parsearg\oddfootingxxx} +\def\everyfooting{\parsearg\everyfootingxxx} + +{\catcode`\@=0 % + +\gdef\evenheadingxxx #1{\evenheadingyyy #1@|@|@|@|\finish} +\gdef\evenheadingyyy #1@|#2@|#3@|#4\finish{% +\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\gdef\oddheadingxxx #1{\oddheadingyyy #1@|@|@|@|\finish} +\gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{% +\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\gdef\everyheadingxxx#1{\oddheadingxxx{#1}\evenheadingxxx{#1}}% + +\gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish} +\gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{% +\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish} +\gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{% + \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}% + % + % Leave some space for the footline. Hopefully ok to assume + % @evenfooting will not be used by itself. + \global\advance\pageheight by -\baselineskip + \global\advance\vsize by -\baselineskip +} + +\gdef\everyfootingxxx#1{\oddfootingxxx{#1}\evenfootingxxx{#1}} +% +}% unbind the catcode of @. + +% @headings double turns headings on for double-sided printing. +% @headings single turns headings on for single-sided printing. +% @headings off turns them off. +% @headings on same as @headings double, retained for compatibility. +% @headings after turns on double-sided headings after this page. +% @headings doubleafter turns on double-sided headings after this page. +% @headings singleafter turns on single-sided headings after this page. +% By default, they are off at the start of a document, +% and turned `on' after @end titlepage. + +\def\headings #1 {\csname HEADINGS#1\endcsname} + +\def\HEADINGSoff{ +\global\evenheadline={\hfil} \global\evenfootline={\hfil} +\global\oddheadline={\hfil} \global\oddfootline={\hfil}} +\HEADINGSoff +% When we turn headings on, set the page number to 1. +% For double-sided printing, put current file name in lower left corner, +% chapter name on inside top of right hand pages, document +% title on inside top of left hand pages, and page numbers on outside top +% edge of all pages. +\def\HEADINGSdouble{ +\global\pageno=1 +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\folio\hfil\thistitle}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chapoddpage +} +\let\contentsalignmacro = \chappager + +% For single-sided printing, chapter title goes across top left of page, +% page number on top right. +\def\HEADINGSsingle{ +\global\pageno=1 +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\thischapter\hfil\folio}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chappager +} +\def\HEADINGSon{\HEADINGSdouble} + +\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} +\let\HEADINGSdoubleafter=\HEADINGSafter +\def\HEADINGSdoublex{% +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\folio\hfil\thistitle}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chapoddpage +} + +\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} +\def\HEADINGSsinglex{% +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\thischapter\hfil\folio}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chappager +} + +% Subroutines used in generating headings +% This produces Day Month Year style of output. +% Only define if not already defined, in case a txi-??.tex file has set +% up a different format (e.g., txi-cs.tex does this). +\ifx\today\undefined +\def\today{% + \number\day\space + \ifcase\month + \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr + \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug + \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec + \fi + \space\number\year} +\fi + +% @settitle line... specifies the title of the document, for headings. +% It generates no output of its own. +\def\thistitle{\putwordNoTitle} +\def\settitle{\parsearg\settitlezzz} +\def\settitlezzz #1{\gdef\thistitle{#1}} + + +\message{tables,} +% Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(x). + +% default indentation of table text +\newdimen\tableindent \tableindent=.8in +% default indentation of @itemize and @enumerate text +\newdimen\itemindent \itemindent=.3in +% margin between end of table item and start of table text. +\newdimen\itemmargin \itemmargin=.1in + +% used internally for \itemindent minus \itemmargin +\newdimen\itemmax + +% Note @table, @vtable, and @vtable define @item, @itemx, etc., with +% these defs. +% They also define \itemindex +% to index the item name in whatever manner is desired (perhaps none). + +\newif\ifitemxneedsnegativevskip + +\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi} + +\def\internalBitem{\smallbreak \parsearg\itemzzz} +\def\internalBitemx{\itemxpar \parsearg\itemzzz} + +\def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz} +\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \itemxpar \parsearg\xitemzzz} + +\def\internalBkitem{\smallbreak \parsearg\kitemzzz} +\def\internalBkitemx{\itemxpar \parsearg\kitemzzz} + +\def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}% + \itemzzz {#1}} + +\def\xitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \xitemsubtopic}}% + \itemzzz {#1}} + +\def\itemzzz #1{\begingroup % + \advance\hsize by -\rightskip + \advance\hsize by -\tableindent + \setbox0=\hbox{\itemfont{#1}}% + \itemindex{#1}% + \nobreak % This prevents a break before @itemx. + % + % If the item text does not fit in the space we have, put it on a line + % by itself, and do not allow a page break either before or after that + % line. We do not start a paragraph here because then if the next + % command is, e.g., @kindex, the whatsit would get put into the + % horizontal list on a line by itself, resulting in extra blank space. + \ifdim \wd0>\itemmax + % + % Make this a paragraph so we get the \parskip glue and wrapping, + % but leave it ragged-right. + \begingroup + \advance\leftskip by-\tableindent + \advance\hsize by\tableindent + \advance\rightskip by0pt plus1fil + \leavevmode\unhbox0\par + \endgroup + % + % We're going to be starting a paragraph, but we don't want the + % \parskip glue -- logically it's part of the @item we just started. + \nobreak \vskip-\parskip + % + % Stop a page break at the \parskip glue coming up. (Unfortunately + % we can't prevent a possible page break at the following + % \baselineskip glue.) However, if what follows is an environment + % such as @example, there will be no \parskip glue; then + % the negative vskip we just would cause the example and the item to + % crash together. So we use this bizarre value of 10001 as a signal + % to \aboveenvbreak to insert \parskip glue after all. + % (Possibly there are other commands that could be followed by + % @example which need the same treatment, but not section titles; or + % maybe section titles are the only special case and they should be + % penalty 10001...) + \penalty 10001 + \endgroup + \itemxneedsnegativevskipfalse + \else + % The item text fits into the space. Start a paragraph, so that the + % following text (if any) will end up on the same line. + \noindent + % Do this with kerns and \unhbox so that if there is a footnote in + % the item text, it can migrate to the main vertical list and + % eventually be printed. + \nobreak\kern-\tableindent + \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0 + \unhbox0 + \nobreak\kern\dimen0 + \endgroup + \itemxneedsnegativevskiptrue + \fi +} + +\def\item{\errmessage{@item while not in a table}} +\def\itemx{\errmessage{@itemx while not in a table}} +\def\kitem{\errmessage{@kitem while not in a table}} +\def\kitemx{\errmessage{@kitemx while not in a table}} +\def\xitem{\errmessage{@xitem while not in a table}} +\def\xitemx{\errmessage{@xitemx while not in a table}} + +% Contains a kludge to get @end[description] to work. +\def\description{\tablez{\dontindex}{1}{}{}{}{}} + +% @table, @ftable, @vtable. +\def\table{\begingroup\inENV\obeylines\obeyspaces\tablex} +{\obeylines\obeyspaces% +\gdef\tablex #1^^M{% +\tabley\dontindex#1 \endtabley}} + +\def\ftable{\begingroup\inENV\obeylines\obeyspaces\ftablex} +{\obeylines\obeyspaces% +\gdef\ftablex #1^^M{% +\tabley\fnitemindex#1 \endtabley +\def\Eftable{\endgraf\afterenvbreak\endgroup}% +\let\Etable=\relax}} + +\def\vtable{\begingroup\inENV\obeylines\obeyspaces\vtablex} +{\obeylines\obeyspaces% +\gdef\vtablex #1^^M{% +\tabley\vritemindex#1 \endtabley +\def\Evtable{\endgraf\afterenvbreak\endgroup}% +\let\Etable=\relax}} + +\def\dontindex #1{} +\def\fnitemindex #1{\doind {fn}{\code{#1}}}% +\def\vritemindex #1{\doind {vr}{\code{#1}}}% + +{\obeyspaces % +\gdef\tabley#1#2 #3 #4 #5 #6 #7\endtabley{\endgroup% +\tablez{#1}{#2}{#3}{#4}{#5}{#6}}} + +\def\tablez #1#2#3#4#5#6{% +\aboveenvbreak % +\begingroup % +\def\Edescription{\Etable}% Necessary kludge. +\let\itemindex=#1% +\ifnum 0#3>0 \advance \leftskip by #3\mil \fi % +\ifnum 0#4>0 \tableindent=#4\mil \fi % +\ifnum 0#5>0 \advance \rightskip by #5\mil \fi % +\def\itemfont{#2}% +\itemmax=\tableindent % +\advance \itemmax by -\itemmargin % +\advance \leftskip by \tableindent % +\exdentamount=\tableindent +\parindent = 0pt +\parskip = \smallskipamount +\ifdim \parskip=0pt \parskip=2pt \fi% +\def\Etable{\endgraf\afterenvbreak\endgroup}% +\let\item = \internalBitem % +\let\itemx = \internalBitemx % +\let\kitem = \internalBkitem % +\let\kitemx = \internalBkitemx % +\let\xitem = \internalBxitem % +\let\xitemx = \internalBxitemx % +} + +% This is the counter used by @enumerate, which is really @itemize + +\newcount \itemno + +\def\itemize{\parsearg\itemizezzz} + +\def\itemizezzz #1{% + \begingroup % ended by the @end itemize + \itemizey {#1}{\Eitemize} +} + +\def\itemizey #1#2{% +\aboveenvbreak % +\itemmax=\itemindent % +\advance \itemmax by -\itemmargin % +\advance \leftskip by \itemindent % +\exdentamount=\itemindent +\parindent = 0pt % +\parskip = \smallskipamount % +\ifdim \parskip=0pt \parskip=2pt \fi% +\def#2{\endgraf\afterenvbreak\endgroup}% +\def\itemcontents{#1}% +\let\item=\itemizeitem} + +% \splitoff TOKENS\endmark defines \first to be the first token in +% TOKENS, and \rest to be the remainder. +% +\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% + +% Allow an optional argument of an uppercase letter, lowercase letter, +% or number, to specify the first label in the enumerated list. No +% argument is the same as `1'. +% +\def\enumerate{\parsearg\enumeratezzz} +\def\enumeratezzz #1{\enumeratey #1 \endenumeratey} +\def\enumeratey #1 #2\endenumeratey{% + \begingroup % ended by the @end enumerate + % + % If we were given no argument, pretend we were given `1'. + \def\thearg{#1}% + \ifx\thearg\empty \def\thearg{1}\fi + % + % Detect if the argument is a single token. If so, it might be a + % letter. Otherwise, the only valid thing it can be is a number. + % (We will always have one token, because of the test we just made. + % This is a good thing, since \splitoff doesn't work given nothing at + % all -- the first parameter is undelimited.) + \expandafter\splitoff\thearg\endmark + \ifx\rest\empty + % Only one token in the argument. It could still be anything. + % A ``lowercase letter'' is one whose \lccode is nonzero. + % An ``uppercase letter'' is one whose \lccode is both nonzero, and + % not equal to itself. + % Otherwise, we assume it's a number. + % + % We need the \relax at the end of the \ifnum lines to stop TeX from + % continuing to look for a . + % + \ifnum\lccode\expandafter`\thearg=0\relax + \numericenumerate % a number (we hope) + \else + % It's a letter. + \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax + \lowercaseenumerate % lowercase letter + \else + \uppercaseenumerate % uppercase letter + \fi + \fi + \else + % Multiple tokens in the argument. We hope it's a number. + \numericenumerate + \fi +} + +% An @enumerate whose labels are integers. The starting integer is +% given in \thearg. +% +\def\numericenumerate{% + \itemno = \thearg + \startenumeration{\the\itemno}% +} + +% The starting (lowercase) letter is in \thearg. +\def\lowercaseenumerate{% + \itemno = \expandafter`\thearg + \startenumeration{% + % Be sure we're not beyond the end of the alphabet. + \ifnum\itemno=0 + \errmessage{No more lowercase letters in @enumerate; get a bigger + alphabet}% + \fi + \char\lccode\itemno + }% +} + +% The starting (uppercase) letter is in \thearg. +\def\uppercaseenumerate{% + \itemno = \expandafter`\thearg + \startenumeration{% + % Be sure we're not beyond the end of the alphabet. + \ifnum\itemno=0 + \errmessage{No more uppercase letters in @enumerate; get a bigger + alphabet} + \fi + \char\uccode\itemno + }% +} + +% Call itemizey, adding a period to the first argument and supplying the +% common last two arguments. Also subtract one from the initial value in +% \itemno, since @item increments \itemno. +% +\def\startenumeration#1{% + \advance\itemno by -1 + \itemizey{#1.}\Eenumerate\flushcr +} + +% @alphaenumerate and @capsenumerate are abbreviations for giving an arg +% to @enumerate. +% +\def\alphaenumerate{\enumerate{a}} +\def\capsenumerate{\enumerate{A}} +\def\Ealphaenumerate{\Eenumerate} +\def\Ecapsenumerate{\Eenumerate} + +% Definition of @item while inside @itemize. + +\def\itemizeitem{% +\advance\itemno by 1 +{\let\par=\endgraf \smallbreak}% +\ifhmode \errmessage{In hmode at itemizeitem}\fi +{\parskip=0in \hskip 0pt +\hbox to 0pt{\hss \itemcontents\hskip \itemmargin}% +\vadjust{\penalty 1200}}% +\flushcr} + +% @multitable macros +% Amy Hendrickson, 8/18/94, 3/6/96 +% +% @multitable ... @end multitable will make as many columns as desired. +% Contents of each column will wrap at width given in preamble. Width +% can be specified either with sample text given in a template line, +% or in percent of \hsize, the current width of text on page. + +% Table can continue over pages but will only break between lines. + +% To make preamble: +% +% Either define widths of columns in terms of percent of \hsize: +% @multitable @columnfractions .25 .3 .45 +% @item ... +% +% Numbers following @columnfractions are the percent of the total +% current hsize to be used for each column. You may use as many +% columns as desired. + + +% Or use a template: +% @multitable {Column 1 template} {Column 2 template} {Column 3 template} +% @item ... +% using the widest term desired in each column. +% +% For those who want to use more than one line's worth of words in +% the preamble, break the line within one argument and it +% will parse correctly, i.e., +% +% @multitable {Column 1 template} {Column 2 template} {Column 3 +% template} +% Not: +% @multitable {Column 1 template} {Column 2 template} +% {Column 3 template} + +% Each new table line starts with @item, each subsequent new column +% starts with @tab. Empty columns may be produced by supplying @tab's +% with nothing between them for as many times as empty columns are needed, +% ie, @tab@tab@tab will produce two empty columns. + +% @item, @tab, @multitable or @end multitable do not need to be on their +% own lines, but it will not hurt if they are. + +% Sample multitable: + +% @multitable {Column 1 template} {Column 2 template} {Column 3 template} +% @item first col stuff @tab second col stuff @tab third col +% @item +% first col stuff +% @tab +% second col stuff +% @tab +% third col +% @item first col stuff @tab second col stuff +% @tab Many paragraphs of text may be used in any column. +% +% They will wrap at the width determined by the template. +% @item@tab@tab This will be in third column. +% @end multitable + +% Default dimensions may be reset by user. +% @multitableparskip is vertical space between paragraphs in table. +% @multitableparindent is paragraph indent in table. +% @multitablecolmargin is horizontal space to be left between columns. +% @multitablelinespace is space to leave between table items, baseline +% to baseline. +% 0pt means it depends on current normal line spacing. +% +\newskip\multitableparskip +\newskip\multitableparindent +\newdimen\multitablecolspace +\newskip\multitablelinespace +\multitableparskip=0pt +\multitableparindent=6pt +\multitablecolspace=12pt +\multitablelinespace=0pt + +% Macros used to set up halign preamble: +% +\let\endsetuptable\relax +\def\xendsetuptable{\endsetuptable} +\let\columnfractions\relax +\def\xcolumnfractions{\columnfractions} +\newif\ifsetpercent + +% #1 is the part of the @columnfraction before the decimal point, which +% is presumably either 0 or the empty string (but we don't check, we +% just throw it away). #2 is the decimal part, which we use as the +% percent of \hsize for this column. +\def\pickupwholefraction#1.#2 {% + \global\advance\colcount by 1 + \expandafter\xdef\csname col\the\colcount\endcsname{.#2\hsize}% + \setuptable +} + +\newcount\colcount +\def\setuptable#1{% + \def\firstarg{#1}% + \ifx\firstarg\xendsetuptable + \let\go = \relax + \else + \ifx\firstarg\xcolumnfractions + \global\setpercenttrue + \else + \ifsetpercent + \let\go\pickupwholefraction + \else + \global\advance\colcount by 1 + \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a + % separator; typically that is always in the input, anyway. + \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% + \fi + \fi + \ifx\go\pickupwholefraction + % Put the argument back for the \pickupwholefraction call, so + % we'll always have a period there to be parsed. + \def\go{\pickupwholefraction#1}% + \else + \let\go = \setuptable + \fi% + \fi + \go +} + +% @multitable ... @end multitable definitions: +% +\def\multitable{\parsearg\dotable} +\def\dotable#1{\bgroup + \vskip\parskip + \let\item=\crcrwithfootnotes + % A \tab used to include \hskip1sp. But then the space in a template + % line is not enough. That is bad. So let's go back to just & until + % we encounter the problem it was intended to solve again. --karl, + % nathan@acm.org, 20apr99. + \let\tab=&% + \let\startfootins=\startsavedfootnote + \tolerance=9500 + \hbadness=9500 + \setmultitablespacing + \parskip=\multitableparskip + \parindent=\multitableparindent + \overfullrule=0pt + \global\colcount=0 + \def\Emultitable{% + \global\setpercentfalse + \crcrwithfootnotes\crcr + \egroup\egroup + }% + % + % To parse everything between @multitable and @item: + \setuptable#1 \endsetuptable + % + % \everycr will reset column counter, \colcount, at the end of + % each line. Every column entry will cause \colcount to advance by one. + % The table preamble + % looks at the current \colcount to find the correct column width. + \everycr{\noalign{% + % + % \filbreak%% keeps underfull box messages off when table breaks over pages. + % Maybe so, but it also creates really weird page breaks when the table + % breaks over pages. Wouldn't \vfil be better? Wait until the problem + % manifests itself, so it can be fixed for real --karl. + \global\colcount=0\relax}}% + % + % This preamble sets up a generic column definition, which will + % be used as many times as user calls for columns. + % \vtop will set a single line and will also let text wrap and + % continue for many paragraphs if desired. + \halign\bgroup&\global\advance\colcount by 1\relax + \multistrut\vtop{\hsize=\expandafter\csname col\the\colcount\endcsname + % + % In order to keep entries from bumping into each other + % we will add a \leftskip of \multitablecolspace to all columns after + % the first one. + % + % If a template has been used, we will add \multitablecolspace + % to the width of each template entry. + % + % If the user has set preamble in terms of percent of \hsize we will + % use that dimension as the width of the column, and the \leftskip + % will keep entries from bumping into each other. Table will start at + % left margin and final column will justify at right margin. + % + % Make sure we don't inherit \rightskip from the outer environment. + \rightskip=0pt + \ifnum\colcount=1 + % The first column will be indented with the surrounding text. + \advance\hsize by\leftskip + \else + \ifsetpercent \else + % If user has not set preamble in terms of percent of \hsize + % we will advance \hsize by \multitablecolspace. + \advance\hsize by \multitablecolspace + \fi + % In either case we will make \leftskip=\multitablecolspace: + \leftskip=\multitablecolspace + \fi + % Ignoring space at the beginning and end avoids an occasional spurious + % blank line, when TeX decides to break the line at the space before the + % box from the multistrut, so the strut ends up on a line by itself. + % For example: + % @multitable @columnfractions .11 .89 + % @item @code{#} + % @tab Legal holiday which is valid in major parts of the whole country. + % Is automatically provided with highlighting sequences respectively marking + % characters. + \noindent\ignorespaces##\unskip\multistrut}\cr +} + +\def\setmultitablespacing{% test to see if user has set \multitablelinespace. +% If so, do nothing. If not, give it an appropriate dimension based on +% current baselineskip. +\ifdim\multitablelinespace=0pt +\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip +\global\advance\multitablelinespace by-\ht0 +%% strut to put in table in case some entry doesn't have descenders, +%% to keep lines equally spaced +\let\multistrut = \strut +\else +%% FIXME: what is \box0 supposed to be? +\gdef\multistrut{\vrule height\multitablelinespace depth\dp0 +width0pt\relax} \fi +%% Test to see if parskip is larger than space between lines of +%% table. If not, do nothing. +%% If so, set to same dimension as multitablelinespace. +\ifdim\multitableparskip>\multitablelinespace +\global\multitableparskip=\multitablelinespace +\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller + %% than skip between lines in the table. +\fi% +\ifdim\multitableparskip=0pt +\global\multitableparskip=\multitablelinespace +\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller + %% than skip between lines in the table. +\fi} + +% In case a @footnote appears inside an alignment, save the footnote +% text to a box and make the \insert when a row of the table is +% finished. Otherwise, the insertion is lost, it never migrates to the +% main vertical list. --kasal, 22jan03. +% +\newbox\savedfootnotes +% +% \dotable \let's \startfootins to this, so that \dofootnote will call +% it instead of starting the insertion right away. +\def\startsavedfootnote{% + \global\setbox\savedfootnotes = \vbox\bgroup + \unvbox\savedfootnotes +} +\def\crcrwithfootnotes{% + \crcr + \ifvoid\savedfootnotes \else + \noalign{\insert\footins{\box\savedfootnotes}}% + \fi +} + +\message{conditionals,} +% Prevent errors for section commands. +% Used in @ignore and in failing conditionals. +\def\ignoresections{% + \let\chapter=\relax + \let\unnumbered=\relax + \let\top=\relax + \let\unnumberedsec=\relax + \let\unnumberedsection=\relax + \let\unnumberedsubsec=\relax + \let\unnumberedsubsection=\relax + \let\unnumberedsubsubsec=\relax + \let\unnumberedsubsubsection=\relax + \let\section=\relax + \let\subsec=\relax + \let\subsubsec=\relax + \let\subsection=\relax + \let\subsubsection=\relax + \let\appendix=\relax + \let\appendixsec=\relax + \let\appendixsection=\relax + \let\appendixsubsec=\relax + \let\appendixsubsection=\relax + \let\appendixsubsubsec=\relax + \let\appendixsubsubsection=\relax + \let\contents=\relax + \let\smallbook=\relax + \let\titlepage=\relax +} + +% Used in nested conditionals, where we have to parse the Texinfo source +% and so want to turn off most commands, in case they are used +% incorrectly. +% +% We use \empty instead of \relax for the @def... commands, so that \end +% doesn't throw an error. For instance: +% @ignore +% @deffn ... +% @end deffn +% @end ignore +% +% The @end deffn is going to get expanded, because we're trying to allow +% nested conditionals. But we don't want to expand the actual @deffn, +% since it might be syntactically correct and intended to be ignored. +% Since \end checks for \relax, using \empty does not cause an error. +% +\def\ignoremorecommands{% + \let\defcodeindex = \relax + \let\defcv = \empty + \let\defcvx = \empty + \let\Edefcv = \empty + \let\deffn = \empty + \let\deffnx = \empty + \let\Edeffn = \empty + \let\defindex = \relax + \let\defivar = \empty + \let\defivarx = \empty + \let\Edefivar = \empty + \let\defmac = \empty + \let\defmacx = \empty + \let\Edefmac = \empty + \let\defmethod = \empty + \let\defmethodx = \empty + \let\Edefmethod = \empty + \let\defop = \empty + \let\defopx = \empty + \let\Edefop = \empty + \let\defopt = \empty + \let\defoptx = \empty + \let\Edefopt = \empty + \let\defspec = \empty + \let\defspecx = \empty + \let\Edefspec = \empty + \let\deftp = \empty + \let\deftpx = \empty + \let\Edeftp = \empty + \let\deftypefn = \empty + \let\deftypefnx = \empty + \let\Edeftypefn = \empty + \let\deftypefun = \empty + \let\deftypefunx = \empty + \let\Edeftypefun = \empty + \let\deftypeivar = \empty + \let\deftypeivarx = \empty + \let\Edeftypeivar = \empty + \let\deftypemethod = \empty + \let\deftypemethodx = \empty + \let\Edeftypemethod = \empty + \let\deftypeop = \empty + \let\deftypeopx = \empty + \let\Edeftypeop = \empty + \let\deftypevar = \empty + \let\deftypevarx = \empty + \let\Edeftypevar = \empty + \let\deftypevr = \empty + \let\deftypevrx = \empty + \let\Edeftypevr = \empty + \let\defun = \empty + \let\defunx = \empty + \let\Edefun = \empty + \let\defvar = \empty + \let\defvarx = \empty + \let\Edefvar = \empty + \let\defvr = \empty + \let\defvrx = \empty + \let\Edefvr = \empty + \let\clear = \relax + \let\down = \relax + \let\evenfooting = \relax + \let\evenheading = \relax + \let\everyfooting = \relax + \let\everyheading = \relax + \let\headings = \relax + \let\include = \relax + \let\item = \relax + \let\lowersections = \relax + \let\oddfooting = \relax + \let\oddheading = \relax + \let\printindex = \relax + \let\pxref = \relax + \let\raisesections = \relax + \let\ref = \relax + \let\set = \relax + \let\setchapternewpage = \relax + \let\setchapterstyle = \relax + \let\settitle = \relax + \let\up = \relax + \let\verbatiminclude = \relax + \let\xref = \relax +} + +% Ignore @ignore, @ifhtml, @ifinfo, and the like. +% +\def\direntry{\doignore{direntry}} +\def\documentdescriptionword{documentdescription} +\def\documentdescription{\doignore{documentdescription}} +\def\html{\doignore{html}} +\def\ifhtml{\doignore{ifhtml}} +\def\ifinfo{\doignore{ifinfo}} +\def\ifnottex{\doignore{ifnottex}} +\def\ifplaintext{\doignore{ifplaintext}} +\def\ifxml{\doignore{ifxml}} +\def\ignore{\doignore{ignore}} +\def\menu{\doignore{menu}} +\def\xml{\doignore{xml}} + +% @dircategory CATEGORY -- specify a category of the dir file +% which this file should belong to. Ignore this in TeX. +\let\dircategory = \comment + +% Ignore text until a line `@end #1'. +% +\def\doignore#1{\begingroup + % Don't complain about control sequences we have declared \outer. + \ignoresections + % + % Define a command to swallow text until we reach `@end #1'. + % This @ is a catcode 12 token (that is the normal catcode of @ in + % this texinfo.tex file). We change the catcode of @ below to match. + \long\def\doignoretext##1@end #1{\enddoignore}% + % + % Make sure that spaces turn into tokens that match what \doignoretext wants. + \catcode\spaceChar = 10 + % + % Ignore braces, too, so mismatched braces don't cause trouble. + \catcode`\{ = 9 + \catcode`\} = 9 + % + % We must not have @c interpreted as a control sequence. + \catcode`\@ = 12 + % + \def\ignoreword{#1}% + \ifx\ignoreword\documentdescriptionword + % The c kludge breaks documentdescription, since + % `documentdescription' contains a `c'. Means not everything will + % be ignored inside @documentdescription, but oh well... + \else + % Make the letter c a comment character so that the rest of the line + % will be ignored. This way, the document can have (for example) + % @c @end ifinfo + % and the @end ifinfo will be properly ignored. + % (We've just changed @ to catcode 12.) + \catcode`\c = 14 + \fi + % + % And now expand the command defined above. + \doignoretext +} + +% What we do to finish off ignored text. +% +\def\enddoignore{\endgroup\ignorespaces}% + +\newif\ifwarnedobs\warnedobsfalse +\def\obstexwarn{% + \ifwarnedobs\relax\else + % We need to warn folks that they may have trouble with TeX 3.0. + % This uses \immediate\write16 rather than \message to get newlines. + \immediate\write16{} + \immediate\write16{WARNING: for users of Unix TeX 3.0!} + \immediate\write16{This manual trips a bug in TeX version 3.0 (tex hangs).} + \immediate\write16{If you are running another version of TeX, relax.} + \immediate\write16{If you are running Unix TeX 3.0, kill this TeX process.} + \immediate\write16{ Then upgrade your TeX installation if you can.} + \immediate\write16{ (See ftp://ftp.gnu.org/non-gnu/TeX.README.)} + \immediate\write16{If you are stuck with version 3.0, run the} + \immediate\write16{ script ``tex3patch'' from the Texinfo distribution} + \immediate\write16{ to use a workaround.} + \immediate\write16{} + \global\warnedobstrue + \fi +} + +% **In TeX 3.0, setting text in \nullfont hangs tex. For a +% workaround (which requires the file ``dummy.tfm'' to be installed), +% uncomment the following line: +%%%%%\font\nullfont=dummy\let\obstexwarn=\relax + +% Ignore text, except that we keep track of conditional commands for +% purposes of nesting, up to an `@end #1' command. +% +\def\nestedignore#1{% + \obstexwarn + % We must actually expand the ignored text to look for the @end + % command, so that nested ignore constructs work. Thus, we put the + % text into a \vbox and then do nothing with the result. To minimize + % the chance of memory overflow, we follow the approach outlined on + % page 401 of the TeXbook. + % + \setbox0 = \vbox\bgroup + % Don't complain about control sequences we have declared \outer. + \ignoresections + % + % Define `@end #1' to end the box, which will in turn undefine the + % @end command again. + \expandafter\def\csname E#1\endcsname{\egroup\ignorespaces}% + % + % We are going to be parsing Texinfo commands. Most cause no + % trouble when they are used incorrectly, but some commands do + % complicated argument parsing or otherwise get confused, so we + % undefine them. + % + % We can't do anything about stray @-signs, unfortunately; + % they'll produce `undefined control sequence' errors. + \ignoremorecommands + % + % Set the current font to be \nullfont, a TeX primitive, and define + % all the font commands to also use \nullfont. We don't use + % dummy.tfm, as suggested in the TeXbook, because some sites + % might not have that installed. Therefore, math mode will still + % produce output, but that should be an extremely small amount of + % stuff compared to the main input. + % + \nullfont + \let\tenrm=\nullfont \let\tenit=\nullfont \let\tensl=\nullfont + \let\tenbf=\nullfont \let\tentt=\nullfont \let\smallcaps=\nullfont + \let\tensf=\nullfont + % Similarly for index fonts. + \let\smallrm=\nullfont \let\smallit=\nullfont \let\smallsl=\nullfont + \let\smallbf=\nullfont \let\smalltt=\nullfont \let\smallsc=\nullfont + \let\smallsf=\nullfont + % Similarly for smallexample fonts. + \let\smallerrm=\nullfont \let\smallerit=\nullfont \let\smallersl=\nullfont + \let\smallerbf=\nullfont \let\smallertt=\nullfont \let\smallersc=\nullfont + \let\smallersf=\nullfont + % + % Don't complain when characters are missing from the fonts. + \tracinglostchars = 0 + % + % Don't bother to do space factor calculations. + \frenchspacing + % + % Don't report underfull hboxes. + \hbadness = 10000 + % + % Do minimal line-breaking. + \pretolerance = 10000 + % + % Do not execute instructions in @tex. + \def\tex{\doignore{tex}}% + % Do not execute macro definitions. + % `c' is a comment character, so the word `macro' will get cut off. + \def\macro{\doignore{ma}}% +} + +% @set VAR sets the variable VAR to an empty value. +% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE. +% +% Since we want to separate VAR from REST-OF-LINE (which might be +% empty), we can't just use \parsearg; we have to insert a space of our +% own to delimit the rest of the line, and then take it out again if we +% didn't need it. Make sure the catcode of space is correct to avoid +% losing inside @example, for instance. +% +\def\set{\begingroup\catcode` =10 + \catcode`\-=12 \catcode`\_=12 % Allow - and _ in VAR. + \parsearg\setxxx} +\def\setxxx#1{\setyyy#1 \endsetyyy} +\def\setyyy#1 #2\endsetyyy{% + \def\temp{#2}% + \ifx\temp\empty \global\expandafter\let\csname SET#1\endcsname = \empty + \else \setzzz{#1}#2\endsetzzz % Remove the trailing space \setxxx inserted. + \fi + \endgroup +} +% Can't use \xdef to pre-expand #2 and save some time, since \temp or +% \next or other control sequences that we've defined might get us into +% an infinite loop. Consider `@set foo @cite{bar}'. +\def\setzzz#1#2 \endsetzzz{\expandafter\gdef\csname SET#1\endcsname{#2}} + +% @clear VAR clears (i.e., unsets) the variable VAR. +% +\def\clear{\parsearg\clearxxx} +\def\clearxxx#1{\global\expandafter\let\csname SET#1\endcsname=\relax} + +% @value{foo} gets the text saved in variable foo. +{ + \catcode`\_ = \active + % + % We might end up with active _ or - characters in the argument if + % we're called from @code, as @code{@value{foo-bar_}}. So \let any + % such active characters to their normal equivalents. + \gdef\value{\begingroup + \catcode`\-=\other \catcode`\_=\other + \indexbreaks \let_\normalunderscore + \valuexxx} +} +\def\valuexxx#1{\expandablevalue{#1}\endgroup} + +% We have this subroutine so that we can handle at least some @value's +% properly in indexes (we \let\value to this in \indexdummies). Ones +% whose names contain - or _ still won't work, but we can't do anything +% about that. The command has to be fully expandable (if the variable +% is set), since the result winds up in the index file. This means that +% if the variable's value contains other Texinfo commands, it's almost +% certain it will fail (although perhaps we could fix that with +% sufficient work to do a one-level expansion on the result, instead of +% complete). +% +\def\expandablevalue#1{% + \expandafter\ifx\csname SET#1\endcsname\relax + {[No value for ``#1'']}% + \message{Variable `#1', used in @value, is not set.}% + \else + \csname SET#1\endcsname + \fi +} + +% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined +% with @set. +% +\def\ifset{\parsearg\doifset} +\def\doifset#1{% + \expandafter\ifx\csname SET#1\endcsname\relax + \let\next=\ifsetfail + \else + \let\next=\ifsetsucceed + \fi + \next +} +\def\ifsetsucceed{\conditionalsucceed{ifset}} +\def\ifsetfail{\nestedignore{ifset}} +\defineunmatchedend{ifset} + +% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been +% defined with @set, or has been undefined with @clear. +% +\def\ifclear{\parsearg\doifclear} +\def\doifclear#1{% + \expandafter\ifx\csname SET#1\endcsname\relax + \let\next=\ifclearsucceed + \else + \let\next=\ifclearfail + \fi + \next +} +\def\ifclearsucceed{\conditionalsucceed{ifclear}} +\def\ifclearfail{\nestedignore{ifclear}} +\defineunmatchedend{ifclear} + +% @iftex, @ifnothtml, @ifnotinfo, @ifnotplaintext always succeed; we +% read the text following, through the first @end iftex (etc.). Make +% `@end iftex' (etc.) valid only after an @iftex. +% +\def\iftex{\conditionalsucceed{iftex}} +\def\ifnothtml{\conditionalsucceed{ifnothtml}} +\def\ifnotinfo{\conditionalsucceed{ifnotinfo}} +\def\ifnotplaintext{\conditionalsucceed{ifnotplaintext}} +\defineunmatchedend{iftex} +\defineunmatchedend{ifnothtml} +\defineunmatchedend{ifnotinfo} +\defineunmatchedend{ifnotplaintext} + +% True conditional. Since \set globally defines its variables, we can +% just start and end a group (to keep the @end definition undefined at +% the outer level). +% +\def\conditionalsucceed#1{\begingroup + \expandafter\def\csname E#1\endcsname{\endgroup}% +} + +% @defininfoenclose. +\let\definfoenclose=\comment + + +\message{indexing,} +% Index generation facilities + +% Define \newwrite to be identical to plain tex's \newwrite +% except not \outer, so it can be used within \newindex. +{\catcode`\@=11 +\gdef\newwrite{\alloc@7\write\chardef\sixt@@n}} + +% \newindex {foo} defines an index named foo. +% It automatically defines \fooindex such that +% \fooindex ...rest of line... puts an entry in the index foo. +% It also defines \fooindfile to be the number of the output channel for +% the file that accumulates this index. The file's extension is foo. +% The name of an index should be no more than 2 characters long +% for the sake of vms. +% +\def\newindex#1{% + \iflinks + \expandafter\newwrite \csname#1indfile\endcsname + \openout \csname#1indfile\endcsname \jobname.#1 % Open the file + \fi + \expandafter\xdef\csname#1index\endcsname{% % Define @#1index + \noexpand\doindex{#1}} +} + +% @defindex foo == \newindex{foo} +% +\def\defindex{\parsearg\newindex} + +% Define @defcodeindex, like @defindex except put all entries in @code. +% +\def\defcodeindex{\parsearg\newcodeindex} +% +\def\newcodeindex#1{% + \iflinks + \expandafter\newwrite \csname#1indfile\endcsname + \openout \csname#1indfile\endcsname \jobname.#1 + \fi + \expandafter\xdef\csname#1index\endcsname{% + \noexpand\docodeindex{#1}}% +} + + +% @synindex foo bar makes index foo feed into index bar. +% Do this instead of @defindex foo if you don't want it as a separate index. +% +% @syncodeindex foo bar similar, but put all entries made for index foo +% inside @code. +% +\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}} +\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}} + +% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo), +% #3 the target index (bar). +\def\dosynindex#1#2#3{% + % Only do \closeout if we haven't already done it, else we'll end up + % closing the target index. + \expandafter \ifx\csname donesynindex#2\endcsname \undefined + % The \closeout helps reduce unnecessary open files; the limit on the + % Acorn RISC OS is a mere 16 files. + \expandafter\closeout\csname#2indfile\endcsname + \expandafter\let\csname\donesynindex#2\endcsname = 1 + \fi + % redefine \fooindfile: + \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname + \expandafter\let\csname#2indfile\endcsname=\temp + % redefine \fooindex: + \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}% +} + +% Define \doindex, the driver for all \fooindex macros. +% Argument #1 is generated by the calling \fooindex macro, +% and it is "foo", the name of the index. + +% \doindex just uses \parsearg; it calls \doind for the actual work. +% This is because \doind is more useful to call from other macros. + +% There is also \dosubind {index}{topic}{subtopic} +% which makes an entry in a two-level index such as the operation index. + +\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} +\def\singleindexer #1{\doind{\indexname}{#1}} + +% like the previous two, but they put @code around the argument. +\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} +\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} + +% Take care of Texinfo commands that can appear in an index entry. +% Since there are some commands we want to expand, and others we don't, +% we have to laboriously prevent expansion for those that we don't. +% +\def\indexdummies{% + \def\@{@}% change to @@ when we switch to @ as escape char in index files. + \def\ {\realbackslash\space }% + % Need these in case \tex is in effect and \{ is a \delimiter again. + % But can't use \lbracecmd and \rbracecmd because texindex assumes + % braces and backslashes are used only as delimiters. + \let\{ = \mylbrace + \let\} = \myrbrace + % + % \definedummyword defines \#1 as \realbackslash #1\space, thus + % effectively preventing its expansion. This is used only for control + % words, not control letters, because the \space would be incorrect + % for control characters, but is needed to separate the control word + % from whatever follows. + % + % For control letters, we have \definedummyletter, which omits the + % space. + % + % These can be used both for control words that take an argument and + % those that do not. If it is followed by {arg} in the input, then + % that will dutifully get written to the index (or wherever). + % + \def\definedummyword##1{% + \expandafter\def\csname ##1\endcsname{\realbackslash ##1\space}% + }% + \def\definedummyletter##1{% + \expandafter\def\csname ##1\endcsname{\realbackslash ##1}% + }% + % + % Do the redefinitions. + \commondummies +} + +% For the aux file, @ is the escape character. So we want to redefine +% everything using @ instead of \realbackslash. When everything uses +% @, this will be simpler. +% +\def\atdummies{% + \def\@{@@}% + \def\ {@ }% + \let\{ = \lbraceatcmd + \let\} = \rbraceatcmd + % + % (See comments in \indexdummies.) + \def\definedummyword##1{% + \expandafter\def\csname ##1\endcsname{@##1\space}% + }% + \def\definedummyletter##1{% + \expandafter\def\csname ##1\endcsname{@##1}% + }% + % + % Do the redefinitions. + \commondummies +} + +% Called from \indexdummies and \atdummies. \definedummyword and +% \definedummyletter must be defined first. +% +\def\commondummies{% + % + \normalturnoffactive + % + % Control letters and accents. + \definedummyletter{_}% + \definedummyletter{,}% + \definedummyletter{"}% + \definedummyletter{`}% + \definedummyletter{'}% + \definedummyletter{^}% + \definedummyletter{~}% + \definedummyletter{=}% + \definedummyword{u}% + \definedummyword{v}% + \definedummyword{H}% + \definedummyword{dotaccent}% + \definedummyword{ringaccent}% + \definedummyword{tieaccent}% + \definedummyword{ubaraccent}% + \definedummyword{udotaccent}% + \definedummyword{dotless}% + % + % Other non-English letters. + \definedummyword{AA}% + \definedummyword{AE}% + \definedummyword{L}% + \definedummyword{OE}% + \definedummyword{O}% + \definedummyword{aa}% + \definedummyword{ae}% + \definedummyword{l}% + \definedummyword{oe}% + \definedummyword{o}% + \definedummyword{ss}% + % + % Although these internal commands shouldn't show up, sometimes they do. + \definedummyword{bf}% + \definedummyword{gtr}% + \definedummyword{hat}% + \definedummyword{less}% + \definedummyword{sf}% + \definedummyword{sl}% + \definedummyword{tclose}% + \definedummyword{tt}% + % + % Texinfo font commands. + \definedummyword{b}% + \definedummyword{i}% + \definedummyword{r}% + \definedummyword{sc}% + \definedummyword{t}% + % + \definedummyword{TeX}% + \definedummyword{acronym}% + \definedummyword{cite}% + \definedummyword{code}% + \definedummyword{command}% + \definedummyword{dfn}% + \definedummyword{dots}% + \definedummyword{emph}% + \definedummyword{env}% + \definedummyword{file}% + \definedummyword{kbd}% + \definedummyword{key}% + \definedummyword{math}% + \definedummyword{option}% + \definedummyword{samp}% + \definedummyword{strong}% + \definedummyword{uref}% + \definedummyword{url}% + \definedummyword{var}% + \definedummyword{w}% + % + % Assorted special characters. + \definedummyword{bullet}% + \definedummyword{copyright}% + \definedummyword{dots}% + \definedummyword{enddots}% + \definedummyword{equiv}% + \definedummyword{error}% + \definedummyword{expansion}% + \definedummyword{minus}% + \definedummyword{pounds}% + \definedummyword{point}% + \definedummyword{print}% + \definedummyword{result}% + % + % Handle some cases of @value -- where the variable name does not + % contain - or _, and the value does not contain any + % (non-fully-expandable) commands. + \let\value = \expandablevalue + % + % Normal spaces, not active ones. + \unsepspaces + % + % No macro expansion. + \turnoffmacros +} + +% If an index command is used in an @example environment, any spaces +% therein should become regular spaces in the raw index file, not the +% expansion of \tie (\leavevmode \penalty \@M \ ). +{\obeyspaces + \gdef\unsepspaces{\obeyspaces\let =\space}} + + +% \indexnofonts is used when outputting the strings to sort the index +% by, and when constructing control sequence names. It eliminates all +% control sequences and just writes whatever the best ASCII sort string +% would be for a given command (usually its argument). +% +\def\indexdummytex{TeX} +\def\indexdummydots{...} +% +\def\indexnofonts{% + \def\ { }% + \def\@{@}% + % how to handle braces? + \def\_{\normalunderscore}% + % + \let\,=\asis + \let\"=\asis + \let\`=\asis + \let\'=\asis + \let\^=\asis + \let\~=\asis + \let\==\asis + \let\u=\asis + \let\v=\asis + \let\H=\asis + \let\dotaccent=\asis + \let\ringaccent=\asis + \let\tieaccent=\asis + \let\ubaraccent=\asis + \let\udotaccent=\asis + \let\dotless=\asis + % + % Other non-English letters. + \def\AA{AA}% + \def\AE{AE}% + \def\L{L}% + \def\OE{OE}% + \def\O{O}% + \def\aa{aa}% + \def\ae{ae}% + \def\l{l}% + \def\oe{oe}% + \def\o{o}% + \def\ss{ss}% + \def\exclamdown{!}% + \def\questiondown{?}% + % + % Don't no-op \tt, since it isn't a user-level command + % and is used in the definitions of the active chars like <, >, |, etc. + % Likewise with the other plain tex font commands. + %\let\tt=\asis + % + % Texinfo font commands. + \let\b=\asis + \let\i=\asis + \let\r=\asis + \let\sc=\asis + \let\t=\asis + % + \let\TeX=\indexdummytex + \let\acronym=\asis + \let\cite=\asis + \let\code=\asis + \let\command=\asis + \let\dfn=\asis + \let\dots=\indexdummydots + \let\emph=\asis + \let\env=\asis + \let\file=\asis + \let\kbd=\asis + \let\key=\asis + \let\math=\asis + \let\option=\asis + \let\samp=\asis + \let\strong=\asis + \let\uref=\asis + \let\url=\asis + \let\var=\asis + \let\w=\asis +} + +\let\indexbackslash=0 %overridden during \printindex. +\let\SETmarginindex=\relax % put index entries in margin (undocumented)? + +% For \ifx comparisons. +\def\emptymacro{\empty} + +% Most index entries go through here, but \dosubind is the general case. +% +\def\doind#1#2{\dosubind{#1}{#2}\empty} + +% Workhorse for all \fooindexes. +% #1 is name of index, #2 is stuff to put there, #3 is subentry -- +% \empty if called from \doind, as we usually are. The main exception +% is with defuns, which call us directly. +% +\def\dosubind#1#2#3{% + % Put the index entry in the margin if desired. + \ifx\SETmarginindex\relax\else + \insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}% + \fi + {% + \count255=\lastpenalty + {% + \indexdummies % Must do this here, since \bf, etc expand at this stage + \escapechar=`\\ + {% + \let\folio = 0% We will expand all macros now EXCEPT \folio. + \def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now + % so it will be output as is; and it will print as backslash. + % + % The main index entry text. + \toks0 = {#2}% + % + % If third arg is present, precede it with space in sort key. + \def\thirdarg{#3}% + \ifx\thirdarg\emptymacro \else + % If the third (subentry) arg is present, add it to the index + % line to write. + \toks0 = \expandafter{\the\toks0 \space #3}% + \fi + % + % Process the index entry with all font commands turned off, to + % get the string to sort by. + {\indexnofonts + \edef\temp{\the\toks0}% need full expansion + \xdef\indexsorttmp{\temp}% + }% + % + % Set up the complete index entry, with both the sort key and + % the original text, including any font commands. We write + % three arguments to \entry to the .?? file (four in the + % subentry case), texindex reduces to two when writing the .??s + % sorted result. + \edef\temp{% + \write\csname#1indfile\endcsname{% + \realbackslash entry{\indexsorttmp}{\folio}{\the\toks0}}% + }% + % + % If a skip is the last thing on the list now, preserve it + % by backing up by \lastskip, doing the \write, then inserting + % the skip again. Otherwise, the whatsit generated by the + % \write will make \lastskip zero. The result is that sequences + % like this: + % @end defun + % @tindex whatever + % @defun ... + % will have extra space inserted, because the \medbreak in the + % start of the @defun won't see the skip inserted by the @end of + % the previous defun. + % + % But don't do any of this if we're not in vertical mode. We + % don't want to do a \vskip and prematurely end a paragraph. + % + % Avoid page breaks due to these extra skips, too. + % + \iflinks + \ifvmode + \skip0 = \lastskip + \ifdim\lastskip = 0pt \else \nobreak\vskip-\skip0 \fi + \fi + % + \temp % do the write + % + \ifvmode \ifdim\skip0 = 0pt \else \nobreak\vskip\skip0 \fi \fi + \fi + }% + }% + \penalty\count255 + }% +} + +% The index entry written in the file actually looks like +% \entry {sortstring}{page}{topic} +% or +% \entry {sortstring}{page}{topic}{subtopic} +% The texindex program reads in these files and writes files +% containing these kinds of lines: +% \initial {c} +% before the first topic whose initial is c +% \entry {topic}{pagelist} +% for a topic that is used without subtopics +% \primary {topic} +% for the beginning of a topic that is used with subtopics +% \secondary {subtopic}{pagelist} +% for each subtopic. + +% Define the user-accessible indexing commands +% @findex, @vindex, @kindex, @cindex. + +\def\findex {\fnindex} +\def\kindex {\kyindex} +\def\cindex {\cpindex} +\def\vindex {\vrindex} +\def\tindex {\tpindex} +\def\pindex {\pgindex} + +\def\cindexsub {\begingroup\obeylines\cindexsub} +{\obeylines % +\gdef\cindexsub "#1" #2^^M{\endgroup % +\dosubind{cp}{#2}{#1}}} + +% Define the macros used in formatting output of the sorted index material. + +% @printindex causes a particular index (the ??s file) to get printed. +% It does not print any chapter heading (usually an @unnumbered). +% +\def\printindex{\parsearg\doprintindex} +\def\doprintindex#1{\begingroup + \dobreak \chapheadingskip{10000}% + % + \smallfonts \rm + \tolerance = 9500 + \indexbreaks + % + % See if the index file exists and is nonempty. + % Change catcode of @ here so that if the index file contains + % \initial {@} + % as its first line, TeX doesn't complain about mismatched braces + % (because it thinks @} is a control sequence). + \catcode`\@ = 11 + \openin 1 \jobname.#1s + \ifeof 1 + % \enddoublecolumns gets confused if there is no text in the index, + % and it loses the chapter title and the aux file entries for the + % index. The easiest way to prevent this problem is to make sure + % there is some text. + \putwordIndexNonexistent + \else + % + % If the index file exists but is empty, then \openin leaves \ifeof + % false. We have to make TeX try to read something from the file, so + % it can discover if there is anything in it. + \read 1 to \temp + \ifeof 1 + \putwordIndexIsEmpty + \else + % Index files are almost Texinfo source, but we use \ as the escape + % character. It would be better to use @, but that's too big a change + % to make right now. + \def\indexbackslash{\rawbackslashxx}% + \catcode`\\ = 0 + \escapechar = `\\ + \begindoublecolumns + \input \jobname.#1s + \enddoublecolumns + \fi + \fi + \closein 1 +\endgroup} + +% These macros are used by the sorted index file itself. +% Change them to control the appearance of the index. + +\def\initial#1{{% + % Some minor font changes for the special characters. + \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt + % + % Remove any glue we may have, we'll be inserting our own. + \removelastskip + % + % We like breaks before the index initials, so insert a bonus. + \penalty -300 + % + % Typeset the initial. Making this add up to a whole number of + % baselineskips increases the chance of the dots lining up from column + % to column. It still won't often be perfect, because of the stretch + % we need before each entry, but it's better. + % + % No shrink because it confuses \balancecolumns. + \vskip 1.67\baselineskip plus .5\baselineskip + \leftline{\secbf #1}% + \vskip .33\baselineskip plus .1\baselineskip + % + % Do our best not to break after the initial. + \nobreak +}} + +% This typesets a paragraph consisting of #1, dot leaders, and then #2 +% flush to the right margin. It is used for index and table of contents +% entries. The paragraph is indented by \leftskip. +% +\def\entry#1#2{\begingroup + % + % Start a new paragraph if necessary, so our assignments below can't + % affect previous text. + \par + % + % Do not fill out the last line with white space. + \parfillskip = 0in + % + % No extra space above this paragraph. + \parskip = 0in + % + % Do not prefer a separate line ending with a hyphen to fewer lines. + \finalhyphendemerits = 0 + % + % \hangindent is only relevant when the entry text and page number + % don't both fit on one line. In that case, bob suggests starting the + % dots pretty far over on the line. Unfortunately, a large + % indentation looks wrong when the entry text itself is broken across + % lines. So we use a small indentation and put up with long leaders. + % + % \hangafter is reset to 1 (which is the value we want) at the start + % of each paragraph, so we need not do anything with that. + \hangindent = 2em + % + % When the entry text needs to be broken, just fill out the first line + % with blank space. + \rightskip = 0pt plus1fil + % + % A bit of stretch before each entry for the benefit of balancing columns. + \vskip 0pt plus1pt + % + % Start a ``paragraph'' for the index entry so the line breaking + % parameters we've set above will have an effect. + \noindent + % + % Insert the text of the index entry. TeX will do line-breaking on it. + #1% + % The following is kludged to not output a line of dots in the index if + % there are no page numbers. The next person who breaks this will be + % cursed by a Unix daemon. + \def\tempa{{\rm }}% + \def\tempb{#2}% + \edef\tempc{\tempa}% + \edef\tempd{\tempb}% + \ifx\tempc\tempd\ \else% + % + % If we must, put the page number on a line of its own, and fill out + % this line with blank space. (The \hfil is overwhelmed with the + % fill leaders glue in \indexdotfill if the page number does fit.) + \hfil\penalty50 + \null\nobreak\indexdotfill % Have leaders before the page number. + % + % The `\ ' here is removed by the implicit \unskip that TeX does as + % part of (the primitive) \par. Without it, a spurious underfull + % \hbox ensues. + \ifpdf + \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. + \else + \ #2% The page number ends the paragraph. + \fi + \fi% + \par +\endgroup} + +% Like \dotfill except takes at least 1 em. +\def\indexdotfill{\cleaders + \hbox{$\mathsurround=0pt \mkern1.5mu ${\it .}$ \mkern1.5mu$}\hskip 1em plus 1fill} + +\def\primary #1{\line{#1\hfil}} + +\newskip\secondaryindent \secondaryindent=0.5cm +\def\secondary#1#2{{% + \parfillskip=0in + \parskip=0in + \hangindent=1in + \hangafter=1 + \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill + \ifpdf + \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. + \else + #2 + \fi + \par +}} + +% Define two-column mode, which we use to typeset indexes. +% Adapted from the TeXbook, page 416, which is to say, +% the manmac.tex format used to print the TeXbook itself. +\catcode`\@=11 + +\newbox\partialpage +\newdimen\doublecolumnhsize + +\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns + % Grab any single-column material above us. + \output = {% + % + % Here is a possibility not foreseen in manmac: if we accumulate a + % whole lot of material, we might end up calling this \output + % routine twice in a row (see the doublecol-lose test, which is + % essentially a couple of indexes with @setchapternewpage off). In + % that case we just ship out what is in \partialpage with the normal + % output routine. Generally, \partialpage will be empty when this + % runs and this will be a no-op. See the indexspread.tex test case. + \ifvoid\partialpage \else + \onepageout{\pagecontents\partialpage}% + \fi + % + \global\setbox\partialpage = \vbox{% + % Unvbox the main output page. + \unvbox\PAGE + \kern-\topskip \kern\baselineskip + }% + }% + \eject % run that output routine to set \partialpage + % + % Use the double-column output routine for subsequent pages. + \output = {\doublecolumnout}% + % + % Change the page size parameters. We could do this once outside this + % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 + % format, but then we repeat the same computation. Repeating a couple + % of assignments once per index is clearly meaningless for the + % execution time, so we may as well do it in one place. + % + % First we halve the line length, less a little for the gutter between + % the columns. We compute the gutter based on the line length, so it + % changes automatically with the paper format. The magic constant + % below is chosen so that the gutter has the same value (well, +-<1pt) + % as it did when we hard-coded it. + % + % We put the result in a separate register, \doublecolumhsize, so we + % can restore it in \pagesofar, after \hsize itself has (potentially) + % been clobbered. + % + \doublecolumnhsize = \hsize + \advance\doublecolumnhsize by -.04154\hsize + \divide\doublecolumnhsize by 2 + \hsize = \doublecolumnhsize + % + % Double the \vsize as well. (We don't need a separate register here, + % since nobody clobbers \vsize.) + \vsize = 2\vsize +} + +% The double-column output routine for all double-column pages except +% the last. +% +\def\doublecolumnout{% + \splittopskip=\topskip \splitmaxdepth=\maxdepth + % Get the available space for the double columns -- the normal + % (undoubled) page height minus any material left over from the + % previous page. + \dimen@ = \vsize + \divide\dimen@ by 2 + \advance\dimen@ by -\ht\partialpage + % + % box0 will be the left-hand column, box2 the right. + \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ + \onepageout\pagesofar + \unvbox255 + \penalty\outputpenalty +} +% +% Re-output the contents of the output page -- any previous material, +% followed by the two boxes we just split, in box0 and box2. +\def\pagesofar{% + \unvbox\partialpage + % + \hsize = \doublecolumnhsize + \wd0=\hsize \wd2=\hsize + \hbox to\pagewidth{\box0\hfil\box2}% +} +% +% All done with double columns. +\def\enddoublecolumns{% + \output = {% + % Split the last of the double-column material. Leave it on the + % current page, no automatic page break. + \balancecolumns + % + % If we end up splitting too much material for the current page, + % though, there will be another page break right after this \output + % invocation ends. Having called \balancecolumns once, we do not + % want to call it again. Therefore, reset \output to its normal + % definition right away. (We hope \balancecolumns will never be + % called on to balance too much material, but if it is, this makes + % the output somewhat more palatable.) + \global\output = {\onepageout{\pagecontents\PAGE}}% + }% + \eject + \endgroup % started in \begindoublecolumns + % + % \pagegoal was set to the doubled \vsize above, since we restarted + % the current page. We're now back to normal single-column + % typesetting, so reset \pagegoal to the normal \vsize (after the + % \endgroup where \vsize got restored). + \pagegoal = \vsize +} +% +% Called at the end of the double column material. +\def\balancecolumns{% + \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. + \dimen@ = \ht0 + \advance\dimen@ by \topskip + \advance\dimen@ by-\baselineskip + \divide\dimen@ by 2 % target to split to + %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}% + \splittopskip = \topskip + % Loop until we get a decent breakpoint. + {% + \vbadness = 10000 + \loop + \global\setbox3 = \copy0 + \global\setbox1 = \vsplit3 to \dimen@ + \ifdim\ht3>\dimen@ + \global\advance\dimen@ by 1pt + \repeat + }% + %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}% + \setbox0=\vbox to\dimen@{\unvbox1}% + \setbox2=\vbox to\dimen@{\unvbox3}% + % + \pagesofar +} +\catcode`\@ = \other + + +\message{sectioning,} +% Chapters, sections, etc. + +\newcount\chapno +\newcount\secno \secno=0 +\newcount\subsecno \subsecno=0 +\newcount\subsubsecno \subsubsecno=0 + +% This counter is funny since it counts through charcodes of letters A, B, ... +\newcount\appendixno \appendixno = `\@ +% \def\appendixletter{\char\the\appendixno} +% We do the following for the sake of pdftex, which needs the actual +% letter in the expansion, not just typeset. +\def\appendixletter{% + \ifnum\appendixno=`A A% + \else\ifnum\appendixno=`B B% + \else\ifnum\appendixno=`C C% + \else\ifnum\appendixno=`D D% + \else\ifnum\appendixno=`E E% + \else\ifnum\appendixno=`F F% + \else\ifnum\appendixno=`G G% + \else\ifnum\appendixno=`H H% + \else\ifnum\appendixno=`I I% + \else\ifnum\appendixno=`J J% + \else\ifnum\appendixno=`K K% + \else\ifnum\appendixno=`L L% + \else\ifnum\appendixno=`M M% + \else\ifnum\appendixno=`N N% + \else\ifnum\appendixno=`O O% + \else\ifnum\appendixno=`P P% + \else\ifnum\appendixno=`Q Q% + \else\ifnum\appendixno=`R R% + \else\ifnum\appendixno=`S S% + \else\ifnum\appendixno=`T T% + \else\ifnum\appendixno=`U U% + \else\ifnum\appendixno=`V V% + \else\ifnum\appendixno=`W W% + \else\ifnum\appendixno=`X X% + \else\ifnum\appendixno=`Y Y% + \else\ifnum\appendixno=`Z Z% + % The \the is necessary, despite appearances, because \appendixletter is + % expanded while writing the .toc file. \char\appendixno is not + % expandable, thus it is written literally, thus all appendixes come out + % with the same letter (or @) in the toc without it. + \else\char\the\appendixno + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} + +% Each @chapter defines this as the name of the chapter. +% page headings and footings can use it. @section does likewise. +\def\thischapter{} +\def\thissection{} + +\newcount\absseclevel % used to calculate proper heading level +\newcount\secbase\secbase=0 % @raise/lowersections modify this count + +% @raisesections: treat @section as chapter, @subsection as section, etc. +\def\raisesections{\global\advance\secbase by -1} +\let\up=\raisesections % original BFox name + +% @lowersections: treat @chapter as section, @section as subsection, etc. +\def\lowersections{\global\advance\secbase by 1} +\let\down=\lowersections % original BFox name + +% Choose a numbered-heading macro +% #1 is heading level if unmodified by @raisesections or @lowersections +% #2 is text for heading +\def\numhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1 +\ifcase\absseclevel + \chapterzzz{#2} +\or + \seczzz{#2} +\or + \numberedsubseczzz{#2} +\or + \numberedsubsubseczzz{#2} +\else + \ifnum \absseclevel<0 + \chapterzzz{#2} + \else + \numberedsubsubseczzz{#2} + \fi +\fi +} + +% like \numhead, but chooses appendix heading levels +\def\apphead#1#2{\absseclevel=\secbase\advance\absseclevel by #1 +\ifcase\absseclevel + \appendixzzz{#2} +\or + \appendixsectionzzz{#2} +\or + \appendixsubseczzz{#2} +\or + \appendixsubsubseczzz{#2} +\else + \ifnum \absseclevel<0 + \appendixzzz{#2} + \else + \appendixsubsubseczzz{#2} + \fi +\fi +} + +% like \numhead, but chooses numberless heading levels +\def\unnmhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1 +\ifcase\absseclevel + \unnumberedzzz{#2} +\or + \unnumberedseczzz{#2} +\or + \unnumberedsubseczzz{#2} +\or + \unnumberedsubsubseczzz{#2} +\else + \ifnum \absseclevel<0 + \unnumberedzzz{#2} + \else + \unnumberedsubsubseczzz{#2} + \fi +\fi +} + +% @chapter, @appendix, @unnumbered. +\def\thischaptername{No Chapter Title} +\outer\def\chapter{\parsearg\chapteryyy} +\def\chapteryyy #1{\numhead0{#1}} % normally numhead0 calls chapterzzz +\def\chapterzzz #1{% + \secno=0 \subsecno=0 \subsubsecno=0 + \global\advance \chapno by 1 \message{\putwordChapter\space \the\chapno}% + \chapmacro {#1}{\the\chapno}% + \gdef\thissection{#1}% + \gdef\thischaptername{#1}% + % We don't substitute the actual chapter name into \thischapter + % because we don't want its macros evaluated now. + \xdef\thischapter{\putwordChapter{} \the\chapno: \noexpand\thischaptername}% + \writetocentry{chap}{#1}{{\the\chapno}} + \donoderef + \global\let\section = \numberedsec + \global\let\subsection = \numberedsubsec + \global\let\subsubsection = \numberedsubsubsec +} + +% we use \chapno to avoid indenting back +\def\appendixbox#1{% + \setbox0 = \hbox{\putwordAppendix{} \the\chapno}% + \hbox to \wd0{#1\hss}} + +\outer\def\appendix{\parsearg\appendixyyy} +\def\appendixyyy #1{\apphead0{#1}} % normally apphead0 calls appendixzzz +\def\appendixzzz #1{% + \secno=0 \subsecno=0 \subsubsecno=0 + \global\advance \appendixno by 1 + \message{\putwordAppendix\space \appendixletter}% + \chapmacro {#1}{\appendixbox{\putwordAppendix{} \appendixletter}}% + \gdef\thissection{#1}% + \gdef\thischaptername{#1}% + \xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}% + \writetocentry{appendix}{#1}{{\appendixletter}} + \appendixnoderef + \global\let\section = \appendixsec + \global\let\subsection = \appendixsubsec + \global\let\subsubsection = \appendixsubsubsec +} + +% @centerchap is like @unnumbered, but the heading is centered. +\outer\def\centerchap{\parsearg\centerchapyyy} +\def\centerchapyyy #1{{\let\unnumbchapmacro=\centerchapmacro \unnumberedyyy{#1}}} + +% @top is like @unnumbered. +\outer\def\top{\parsearg\unnumberedyyy} + +\outer\def\unnumbered{\parsearg\unnumberedyyy} +\def\unnumberedyyy #1{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz +\def\unnumberedzzz #1{% + \secno=0 \subsecno=0 \subsubsecno=0 + % + % This used to be simply \message{#1}, but TeX fully expands the + % argument to \message. Therefore, if #1 contained @-commands, TeX + % expanded them. For example, in `@unnumbered The @cite{Book}', TeX + % expanded @cite (which turns out to cause errors because \cite is meant + % to be executed, not expanded). + % + % Anyway, we don't want the fully-expanded definition of @cite to appear + % as a result of the \message, we just want `@cite' itself. We use + % \the to achieve this: TeX expands \the only once, + % simply yielding the contents of . (We also do this for + % the toc entries.) + \toks0 = {#1}\message{(\the\toks0)}% + % + \unnumbchapmacro {#1}% + \gdef\thischapter{#1}\gdef\thissection{#1}% + \writetocentry{unnumbchap}{#1}{{\the\chapno}} + \unnumbnoderef + \global\let\section = \unnumberedsec + \global\let\subsection = \unnumberedsubsec + \global\let\subsubsection = \unnumberedsubsubsec +} + +% Sections. +\outer\def\numberedsec{\parsearg\secyyy} +\def\secyyy #1{\numhead1{#1}} % normally calls seczzz +\def\seczzz #1{% + \subsecno=0 \subsubsecno=0 \global\advance \secno by 1 % + \gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}% + \writetocentry{sec}{#1}{{\the\chapno}{\the\secno}} + \donoderef + \nobreak +} + +\outer\def\appendixsection{\parsearg\appendixsecyyy} +\outer\def\appendixsec{\parsearg\appendixsecyyy} +\def\appendixsecyyy #1{\apphead1{#1}} % normally calls appendixsectionzzz +\def\appendixsectionzzz #1{% + \subsecno=0 \subsubsecno=0 \global\advance \secno by 1 % + \gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}% + \writetocentry{sec}{#1}{{\appendixletter}{\the\secno}} + \appendixnoderef + \nobreak +} + +\outer\def\unnumberedsec{\parsearg\unnumberedsecyyy} +\def\unnumberedsecyyy #1{\unnmhead1{#1}} % normally calls unnumberedseczzz +\def\unnumberedseczzz #1{% + \plainsecheading {#1}\gdef\thissection{#1}% + \writetocentry{unnumbsec}{#1}{{\the\chapno}{\the\secno}} + \unnumbnoderef + \nobreak +} + +% Subsections. +\outer\def\numberedsubsec{\parsearg\numberedsubsecyyy} +\def\numberedsubsecyyy #1{\numhead2{#1}} % normally calls numberedsubseczzz +\def\numberedsubseczzz #1{% + \gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 % + \subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}% + \writetocentry{subsec}{#1}{{\the\chapno}{\the\secno}{\the\subsecno}} + \donoderef + \nobreak +} + +\outer\def\appendixsubsec{\parsearg\appendixsubsecyyy} +\def\appendixsubsecyyy #1{\apphead2{#1}} % normally calls appendixsubseczzz +\def\appendixsubseczzz #1{% + \gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 % + \subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}% + \writetocentry{subsec}{#1}{{\appendixletter}{\the\secno}{\the\subsecno}} + \appendixnoderef + \nobreak +} + +\outer\def\unnumberedsubsec{\parsearg\unnumberedsubsecyyy} +\def\unnumberedsubsecyyy #1{\unnmhead2{#1}} %normally calls unnumberedsubseczzz +\def\unnumberedsubseczzz #1{% + \plainsubsecheading {#1}\gdef\thissection{#1}% + \writetocentry{unnumbsubsec}{#1}{{\the\chapno}{\the\secno}{\the\subsecno}} + \unnumbnoderef + \nobreak +} + +% Subsubsections. +\outer\def\numberedsubsubsec{\parsearg\numberedsubsubsecyyy} +\def\numberedsubsubsecyyy #1{\numhead3{#1}} % normally numberedsubsubseczzz +\def\numberedsubsubseczzz #1{% + \gdef\thissection{#1}\global\advance \subsubsecno by 1 % + \subsubsecheading {#1} + {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}% + \writetocentry{subsubsec}{#1}{{\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}} + \donoderef + \nobreak +} + +\outer\def\appendixsubsubsec{\parsearg\appendixsubsubsecyyy} +\def\appendixsubsubsecyyy #1{\apphead3{#1}} % normally appendixsubsubseczzz +\def\appendixsubsubseczzz #1{% + \gdef\thissection{#1}\global\advance \subsubsecno by 1 % + \subsubsecheading {#1} + {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}% + \writetocentry{subsubsec}{#1}{{\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}} + \appendixnoderef + \nobreak +} + +\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubsecyyy} +\def\unnumberedsubsubsecyyy #1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz +\def\unnumberedsubsubseczzz #1{% + \plainsubsubsecheading {#1}\gdef\thissection{#1}% + \writetocentry{unnumbsubsubsec}{#1}{{\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}} + \unnumbnoderef + \nobreak +} + +% These are variants which are not "outer", so they can appear in @ifinfo. +% Actually, they should now be obsolete; ordinary section commands should work. +\def\infotop{\parsearg\unnumberedzzz} +\def\infounnumbered{\parsearg\unnumberedzzz} +\def\infounnumberedsec{\parsearg\unnumberedseczzz} +\def\infounnumberedsubsec{\parsearg\unnumberedsubseczzz} +\def\infounnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz} + +\def\infoappendix{\parsearg\appendixzzz} +\def\infoappendixsec{\parsearg\appendixseczzz} +\def\infoappendixsubsec{\parsearg\appendixsubseczzz} +\def\infoappendixsubsubsec{\parsearg\appendixsubsubseczzz} + +\def\infochapter{\parsearg\chapterzzz} +\def\infosection{\parsearg\sectionzzz} +\def\infosubsection{\parsearg\subsectionzzz} +\def\infosubsubsection{\parsearg\subsubsectionzzz} + +% These macros control what the section commands do, according +% to what kind of chapter we are in (ordinary, appendix, or unnumbered). +% Define them by default for a numbered chapter. +\global\let\section = \numberedsec +\global\let\subsection = \numberedsubsec +\global\let\subsubsection = \numberedsubsubsec + +% Define @majorheading, @heading and @subheading + +% NOTE on use of \vbox for chapter headings, section headings, and such: +% 1) We use \vbox rather than the earlier \line to permit +% overlong headings to fold. +% 2) \hyphenpenalty is set to 10000 because hyphenation in a +% heading is obnoxious; this forbids it. +% 3) Likewise, headings look best if no \parindent is used, and +% if justification is not attempted. Hence \raggedright. + + +\def\majorheading{\parsearg\majorheadingzzz} +\def\majorheadingzzz #1{% + {\advance\chapheadingskip by 10pt \chapbreak }% + {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\raggedright + \rm #1\hfill}}\bigskip \par\penalty 200} + +\def\chapheading{\parsearg\chapheadingzzz} +\def\chapheadingzzz #1{\chapbreak % + {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\raggedright + \rm #1\hfill}}\bigskip \par\penalty 200} + +% @heading, @subheading, @subsubheading. +\def\heading{\parsearg\plainsecheading} +\def\subheading{\parsearg\plainsubsecheading} +\def\subsubheading{\parsearg\plainsubsubsecheading} + +% These macros generate a chapter, section, etc. heading only +% (including whitespace, linebreaking, etc. around it), +% given all the information in convenient, parsed form. + +%%% Args are the skip and penalty (usually negative) +\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} + +\def\setchapterstyle #1 {\csname CHAPF#1\endcsname} + +%%% Define plain chapter starts, and page on/off switching for it +% Parameter controlling skip before chapter headings (if needed) + +\newskip\chapheadingskip + +\def\chapbreak{\dobreak \chapheadingskip {-4000}} +\def\chappager{\par\vfill\supereject} +\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi} + +\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} + +\def\CHAPPAGoff{% +\global\let\contentsalignmacro = \chappager +\global\let\pchapsepmacro=\chapbreak +\global\let\pagealignmacro=\chappager} + +\def\CHAPPAGon{% +\global\let\contentsalignmacro = \chappager +\global\let\pchapsepmacro=\chappager +\global\let\pagealignmacro=\chappager +\global\def\HEADINGSon{\HEADINGSsingle}} + +\def\CHAPPAGodd{ +\global\let\contentsalignmacro = \chapoddpage +\global\let\pchapsepmacro=\chapoddpage +\global\let\pagealignmacro=\chapoddpage +\global\def\HEADINGSon{\HEADINGSdouble}} + +\CHAPPAGon + +\def\CHAPFplain{ +\global\let\chapmacro=\chfplain +\global\let\unnumbchapmacro=\unnchfplain +\global\let\centerchapmacro=\centerchfplain} + +% Plain chapter opening. +% #1 is the text, #2 the chapter number or empty if unnumbered. +\def\chfplain#1#2{% + \pchapsepmacro + {% + \chapfonts \rm + \def\chapnum{#2}% + \setbox0 = \hbox{#2\ifx\chapnum\empty\else\enspace\fi}% + \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright + \hangindent = \wd0 \centerparametersmaybe + \unhbox0 #1\par}% + }% + \nobreak\bigskip % no page break after a chapter title + \nobreak +} + +% Plain opening for unnumbered. +\def\unnchfplain#1{\chfplain{#1}{}} + +% @centerchap -- centered and unnumbered. +\let\centerparametersmaybe = \relax +\def\centerchfplain#1{{% + \def\centerparametersmaybe{% + \advance\rightskip by 3\rightskip + \leftskip = \rightskip + \parfillskip = 0pt + }% + \chfplain{#1}{}% +}} + +\CHAPFplain % The default + +\def\unnchfopen #1{% +\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\raggedright + \rm #1\hfill}}\bigskip \par\nobreak +} + +\def\chfopen #1#2{\chapoddpage {\chapfonts +\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% +\par\penalty 5000 % +} + +\def\centerchfopen #1{% +\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt + \hfill {\rm #1}\hfill}}\bigskip \par\nobreak +} + +\def\CHAPFopen{ +\global\let\chapmacro=\chfopen +\global\let\unnumbchapmacro=\unnchfopen +\global\let\centerchapmacro=\centerchfopen} + + +% Section titles. +\newskip\secheadingskip +\def\secheadingbreak{\dobreak \secheadingskip {-1000}} +\def\secheading#1#2#3{\sectionheading{sec}{#2.#3}{#1}} +\def\plainsecheading#1{\sectionheading{sec}{}{#1}} + +% Subsection titles. +\newskip \subsecheadingskip +\def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}} +\def\subsecheading#1#2#3#4{\sectionheading{subsec}{#2.#3.#4}{#1}} +\def\plainsubsecheading#1{\sectionheading{subsec}{}{#1}} + +% Subsubsection titles. +\let\subsubsecheadingskip = \subsecheadingskip +\let\subsubsecheadingbreak = \subsecheadingbreak +\def\subsubsecheading#1#2#3#4#5{\sectionheading{subsubsec}{#2.#3.#4.#5}{#1}} +\def\plainsubsubsecheading#1{\sectionheading{subsubsec}{}{#1}} + + +% Print any size section title. +% +% #1 is the section type (sec/subsec/subsubsec), #2 is the section +% number (maybe empty), #3 the text. +\def\sectionheading#1#2#3{% + {% + \expandafter\advance\csname #1headingskip\endcsname by \parskip + \csname #1headingbreak\endcsname + }% + {% + % Switch to the right set of fonts. + \csname #1fonts\endcsname \rm + % + % Only insert the separating space if we have a section number. + \def\secnum{#2}% + \setbox0 = \hbox{#2\ifx\secnum\empty\else\enspace\fi}% + % + \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright + \hangindent = \wd0 % zero if no section number + \unhbox0 #3}% + }% + % Add extra space after the heading -- either a line space or a + % paragraph space, whichever is more. (Some people like to set + % \parskip to large values for some reason.) Don't allow stretch, though. + \nobreak + \ifdim\parskip>\normalbaselineskip + \kern\parskip + \else + \kern\normalbaselineskip + \fi + \nobreak +} + + +\message{toc,} +% Table of contents. +\newwrite\tocfile + +% Write an entry to the toc file, opening it if necessary. +% Called from @chapter, etc. We supply {\folio} at the end of the +% argument, which will end up as the last argument to the \...entry macro. +% +% Usage: \writetocentry{chap}{The Name of The Game}{{\the\chapno}} +% We open the .toc file for writing here instead of at @setfilename (or +% any other fixed time) so that @contents can be anywhere in the document. +% +\newif\iftocfileopened +\def\writetocentry#1#2#3{% + \iftocfileopened\else + \immediate\openout\tocfile = \jobname.toc + \global\tocfileopenedtrue + \fi + % + \iflinks + \toks0 = {#2}% + \edef\temp{\write\tocfile{\realbackslash #1entry{\the\toks0}#3{\folio}}}% + \temp + \fi + % + % Tell \shipout to create a page destination if we're doing pdf, which + % will be the target of the links in the table of contents. We can't + % just do it on every page because the title pages are numbered 1 and + % 2 (the page numbers aren't printed), and so are the first two pages + % of the document. Thus, we'd have two destinations named `1', and + % two named `2'. + \ifpdf \pdfmakepagedesttrue \fi +} + +\newskip\contentsrightmargin \contentsrightmargin=1in +\newcount\savepageno +\newcount\lastnegativepageno \lastnegativepageno = -1 + +% Finish up the main text and prepare to read what we've written +% to \tocfile. +% +\def\startcontents#1{% + % If @setchapternewpage on, and @headings double, the contents should + % start on an odd page, unlike chapters. Thus, we maintain + % \contentsalignmacro in parallel with \pagealignmacro. + % From: Torbjorn Granlund + \contentsalignmacro + \immediate\closeout\tocfile + % + % Don't need to put `Contents' or `Short Contents' in the headline. + % It is abundantly clear what they are. + \unnumbchapmacro{#1}\def\thischapter{}% + \savepageno = \pageno + \begingroup % Set up to handle contents files properly. + \catcode`\\=0 \catcode`\{=1 \catcode`\}=2 \catcode`\@=11 + % We can't do this, because then an actual ^ in a section + % title fails, e.g., @chapter ^ -- exponentiation. --karl, 9jul97. + %\catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi + \raggedbottom % Worry more about breakpoints than the bottom. + \advance\hsize by -\contentsrightmargin % Don't use the full line length. + % + % Roman numerals for page numbers. + \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi +} + + +% Normal (long) toc. +\def\contents{% + \startcontents{\putwordTOC}% + \openin 1 \jobname.toc + \ifeof 1 \else + \closein 1 + \input \jobname.toc + \fi + \vfill \eject + \contentsalignmacro % in case @setchapternewpage odd is in effect + \pdfmakeoutlines + \endgroup + \lastnegativepageno = \pageno + \global\pageno = \savepageno +} + +% And just the chapters. +\def\summarycontents{% + \startcontents{\putwordShortTOC}% + % + \let\chapentry = \shortchapentry + \let\appendixentry = \shortappendixentry + \let\unnumbchapentry = \shortunnumberedentry + % We want a true roman here for the page numbers. + \secfonts + \let\rm=\shortcontrm \let\bf=\shortcontbf + \let\sl=\shortcontsl \let\tt=\shortconttt + \rm + \hyphenpenalty = 10000 + \advance\baselineskip by 1pt % Open it up a little. + \def\secentry ##1##2##3##4{} + \def\subsecentry ##1##2##3##4##5{} + \def\subsubsecentry ##1##2##3##4##5##6{} + \let\unnumbsecentry = \secentry + \let\unnumbsubsecentry = \subsecentry + \let\unnumbsubsubsecentry = \subsubsecentry + \openin 1 \jobname.toc + \ifeof 1 \else + \closein 1 + \input \jobname.toc + \fi + \vfill \eject + \contentsalignmacro % in case @setchapternewpage odd is in effect + \endgroup + \lastnegativepageno = \pageno + \global\pageno = \savepageno +} +\let\shortcontents = \summarycontents + +\ifpdf + \pdfcatalog{/PageMode /UseOutlines}% +\fi + +% These macros generate individual entries in the table of contents. +% The first argument is the chapter or section name. +% The last argument is the page number. +% The arguments in between are the chapter number, section number, ... + +% Chapters, in the main contents. +\def\chapentry#1#2#3{\dochapentry{#2\labelspace#1}{#3}} +% +% Chapters, in the short toc. +% See comments in \dochapentry re vbox and related settings. +\def\shortchapentry#1#2#3{% + \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#3\egroup}% +} + +% Appendices, in the main contents. +\def\appendixentry#1#2#3{% + \dochapentry{\appendixbox{\putwordAppendix{} #2}\labelspace#1}{#3}} +% +% Appendices, in the short toc. +\let\shortappendixentry = \shortchapentry + +% Typeset the label for a chapter or appendix for the short contents. +% The arg is, e.g., `Appendix A' for an appendix, or `3' for a chapter. +% We could simplify the code here by writing out an \appendixentry +% command in the toc file for appendices, instead of using \chapentry +% for both, but it doesn't seem worth it. +% +\newdimen\shortappendixwidth +% +\def\shortchaplabel#1{% + % This space should be enough, since a single number is .5em, and the + % widest letter (M) is 1em, at least in the Computer Modern fonts. + % But use \hss just in case. + % (This space doesn't include the extra space that gets added after + % the label; that gets put in by \shortchapentry above.) + \dimen0 = 1em + \hbox to \dimen0{#1\hss}% +} + +% Unnumbered chapters. +\def\unnumbchapentry#1#2#3{\dochapentry{#1}{#3}} +\def\shortunnumberedentry#1#2#3{\tocentry{#1}{\doshortpageno\bgroup#3\egroup}} + +% Sections. +\def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}} +\def\unnumbsecentry#1#2#3#4{\dosecentry{#1}{#4}} + +% Subsections. +\def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\labelspace#1}{#5}} +\def\unnumbsubsecentry#1#2#3#4#5{\dosubsecentry{#1}{#5}} + +% And subsubsections. +\def\subsubsecentry#1#2#3#4#5#6{% + \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}{#6}} +\def\unnumbsubsubsecentry#1#2#3#4#5#6{\dosubsubsecentry{#1}{#6}} + +% This parameter controls the indentation of the various levels. +\newdimen\tocindent \tocindent = 3pc + +% Now for the actual typesetting. In all these, #1 is the text and #2 is the +% page number. +% +% If the toc has to be broken over pages, we want it to be at chapters +% if at all possible; hence the \penalty. +\def\dochapentry#1#2{% + \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip + \begingroup + \chapentryfonts + \tocentry{#1}{\dopageno\bgroup#2\egroup}% + \endgroup + \nobreak\vskip .25\baselineskip plus.1\baselineskip +} + +\def\dosecentry#1#2{\begingroup + \secentryfonts \leftskip=\tocindent + \tocentry{#1}{\dopageno\bgroup#2\egroup}% +\endgroup} + +\def\dosubsecentry#1#2{\begingroup + \subsecentryfonts \leftskip=2\tocindent + \tocentry{#1}{\dopageno\bgroup#2\egroup}% +\endgroup} + +\def\dosubsubsecentry#1#2{\begingroup + \subsubsecentryfonts \leftskip=3\tocindent + \tocentry{#1}{\dopageno\bgroup#2\egroup}% +\endgroup} + +% Final typesetting of a toc entry; we use the same \entry macro as for +% the index entries, but we want to suppress hyphenation here. (We +% can't do that in the \entry macro, since index entries might consist +% of hyphenated-identifiers-that-do-not-fit-on-a-line-and-nothing-else.) +\def\tocentry#1#2{\begingroup + \vskip 0pt plus1pt % allow a little stretch for the sake of nice page breaks + % Do not use \turnoffactive in these arguments. Since the toc is + % typeset in cmr, characters such as _ would come out wrong; we + % have to do the usual translation tricks. + \entry{#1}{#2}% +\endgroup} + +% Space between chapter (or whatever) number and the title. +\def\labelspace{\hskip1em \relax} + +\def\dopageno#1{{\rm #1}} +\def\doshortpageno#1{{\rm #1}} + +\def\chapentryfonts{\secfonts \rm} +\def\secentryfonts{\textfonts} +\let\subsecentryfonts = \textfonts +\let\subsubsecentryfonts = \textfonts + + +\message{environments,} +% @foo ... @end foo. + +% @point{}, @result{}, @expansion{}, @print{}, @equiv{}. +% +% Since these characters are used in examples, it should be an even number of +% \tt widths. Each \tt character is 1en, so two makes it 1em. +% +\def\point{$\star$} +\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} +\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}} +\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} +\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}} + +% The @error{} command. +% Adapted from the TeXbook's \boxit. +% +\newbox\errorbox +% +{\tentt \global\dimen0 = 3em}% Width of the box. +\dimen2 = .55pt % Thickness of rules +% The text. (`r' is open on the right, `e' somewhat less so on the left.) +\setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt} +% +\global\setbox\errorbox=\hbox to \dimen0{\hfil + \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. + \advance\hsize by -2\dimen2 % Rules. + \vbox{ + \hrule height\dimen2 + \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. + \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. + \kern3pt\vrule width\dimen2}% Space to right. + \hrule height\dimen2} + \hfil} +% +\def\error{\leavevmode\lower.7ex\copy\errorbox} + +% @tex ... @end tex escapes into raw Tex temporarily. +% One exception: @ is still an escape character, so that @end tex works. +% But \@ or @@ will get a plain tex @ character. + +\def\tex{\begingroup + \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 + \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 + \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie + \catcode `\%=14 + \catcode `\+=\other + \catcode `\"=\other + \catcode `\==\other + \catcode `\|=\other + \catcode `\<=\other + \catcode `\>=\other + \escapechar=`\\ + % + \let\b=\ptexb + \let\bullet=\ptexbullet + \let\c=\ptexc + \let\,=\ptexcomma + \let\.=\ptexdot + \let\dots=\ptexdots + \let\equiv=\ptexequiv + \let\!=\ptexexclam + \let\i=\ptexi + \let\{=\ptexlbrace + \let\+=\tabalign + \let\}=\ptexrbrace + \let\*=\ptexstar + \let\t=\ptext + % + \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% + \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% + \def\@{@}% +\let\Etex=\endgroup} + +% Define @lisp ... @end lisp. +% @lisp does a \begingroup so it can rebind things, +% including the definition of @end lisp (which normally is erroneous). + +% Amount to narrow the margins by for @lisp. +\newskip\lispnarrowing \lispnarrowing=0.4in + +% This is the definition that ^^M gets inside @lisp, @example, and other +% such environments. \null is better than a space, since it doesn't +% have any width. +\def\lisppar{\null\endgraf} + +% Make each space character in the input produce a normal interword +% space in the output. Don't allow a line break at this space, as this +% is used only in environments like @example, where each line of input +% should produce a line of output anyway. +% +{\obeyspaces % +\gdef\sepspaces{\obeyspaces\let =\tie}} + +% Define \obeyedspace to be our active space, whatever it is. This is +% for use in \parsearg. +{\sepspaces% +\global\let\obeyedspace= } + +% This space is always present above and below environments. +\newskip\envskipamount \envskipamount = 0pt + +% Make spacing and below environment symmetrical. We use \parskip here +% to help in doing that, since in @example-like environments \parskip +% is reset to zero; thus the \afterenvbreak inserts no space -- but the +% start of the next paragraph will insert \parskip. +% +\def\aboveenvbreak{{% + % =10000 instead of <10000 because of a special case in \itemzzz, q.v. + \ifnum \lastpenalty=10000 \else + \advance\envskipamount by \parskip + \endgraf + \ifdim\lastskip<\envskipamount + \removelastskip + % it's not a good place to break if the last penalty was \nobreak + % or better ... + \ifnum\lastpenalty>10000 \else \penalty-50 \fi + \vskip\envskipamount + \fi + \fi +}} + +\let\afterenvbreak = \aboveenvbreak + +% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins. +\let\nonarrowing=\relax + +% @cartouche ... @end cartouche: draw rectangle w/rounded corners around +% environment contents. +\font\circle=lcircle10 +\newdimen\circthick +\newdimen\cartouter\newdimen\cartinner +\newskip\normbskip\newskip\normpskip\newskip\normlskip +\circthick=\fontdimen8\circle +% +\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth +\def\ctr{{\hskip 6pt\circle\char'010}} +\def\cbl{{\circle\char'012\hskip -6pt}} +\def\cbr{{\hskip 6pt\circle\char'011}} +\def\carttop{\hbox to \cartouter{\hskip\lskip + \ctl\leaders\hrule height\circthick\hfil\ctr + \hskip\rskip}} +\def\cartbot{\hbox to \cartouter{\hskip\lskip + \cbl\leaders\hrule height\circthick\hfil\cbr + \hskip\rskip}} +% +\newskip\lskip\newskip\rskip + +\def\cartouche{% +\par % can't be in the midst of a paragraph. +\begingroup + \lskip=\leftskip \rskip=\rightskip + \leftskip=0pt\rightskip=0pt %we want these *outside*. + \cartinner=\hsize \advance\cartinner by-\lskip + \advance\cartinner by-\rskip + \cartouter=\hsize + \advance\cartouter by 18.4pt % allow for 3pt kerns on either +% side, and for 6pt waste from +% each corner char, and rule thickness + \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip + % Flag to tell @lisp, etc., not to narrow margin. + \let\nonarrowing=\comment + \vbox\bgroup + \baselineskip=0pt\parskip=0pt\lineskip=0pt + \carttop + \hbox\bgroup + \hskip\lskip + \vrule\kern3pt + \vbox\bgroup + \hsize=\cartinner + \kern3pt + \begingroup + \baselineskip=\normbskip + \lineskip=\normlskip + \parskip=\normpskip + \vskip -\parskip +\def\Ecartouche{% + \endgroup + \kern3pt + \egroup + \kern3pt\vrule + \hskip\rskip + \egroup + \cartbot + \egroup +\endgroup +}} + + +% This macro is called at the beginning of all the @example variants, +% inside a group. +\def\nonfillstart{% + \aboveenvbreak + \inENV % This group ends at the end of the body + \hfuzz = 12pt % Don't be fussy + \sepspaces % Make spaces be word-separators rather than space tokens. + \let\par = \lisppar % don't ignore blank lines + \obeylines % each line of input is a line of output + \parskip = 0pt + \parindent = 0pt + \emergencystretch = 0pt % don't try to avoid overfull boxes + % @cartouche defines \nonarrowing to inhibit narrowing + % at next level down. + \ifx\nonarrowing\relax + \advance \leftskip by \lispnarrowing + \exdentamount=\lispnarrowing + \let\exdent=\nofillexdent + \let\nonarrowing=\relax + \fi +} + +% Define the \E... control sequence only if we are inside the particular +% environment, so the error checking in \end will work. +% +% To end an @example-like environment, we first end the paragraph (via +% \afterenvbreak's vertical glue), and then the group. That way we keep +% the zero \parskip that the environments set -- \parskip glue will be +% inserted at the beginning of the next paragraph in the document, after +% the environment. +% +\def\nonfillfinish{\afterenvbreak\endgroup} + +% @lisp: indented, narrowed, typewriter font. +\def\lisp{\begingroup + \nonfillstart + \let\Elisp = \nonfillfinish + \tt + \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. + \gobble % eat return +} + +% @example: Same as @lisp. +\def\example{\begingroup \def\Eexample{\nonfillfinish\endgroup}\lisp} + +% @smallexample and @smalllisp: use smaller fonts. +% Originally contributed by Pavel@xerox. +\def\smalllisp{\begingroup + \def\Esmalllisp{\nonfillfinish\endgroup}% + \def\Esmallexample{\nonfillfinish\endgroup}% + \smallexamplefonts + \lisp +} +\let\smallexample = \smalllisp + + +% @display: same as @lisp except keep current font. +% +\def\display{\begingroup + \nonfillstart + \let\Edisplay = \nonfillfinish + \gobble +} +% +% @smalldisplay: @display plus smaller fonts. +% +\def\smalldisplay{\begingroup + \def\Esmalldisplay{\nonfillfinish\endgroup}% + \smallexamplefonts \rm + \display +} + +% @format: same as @display except don't narrow margins. +% +\def\format{\begingroup + \let\nonarrowing = t + \nonfillstart + \let\Eformat = \nonfillfinish + \gobble +} +% +% @smallformat: @format plus smaller fonts. +% +\def\smallformat{\begingroup + \def\Esmallformat{\nonfillfinish\endgroup}% + \smallexamplefonts \rm + \format +} + +% @flushleft (same as @format). +% +\def\flushleft{\begingroup \def\Eflushleft{\nonfillfinish\endgroup}\format} + +% @flushright. +% +\def\flushright{\begingroup + \let\nonarrowing = t + \nonfillstart + \let\Eflushright = \nonfillfinish + \advance\leftskip by 0pt plus 1fill + \gobble +} + + +% @quotation does normal linebreaking (hence we can't use \nonfillstart) +% and narrows the margins. +% +\def\quotation{% + \begingroup\inENV %This group ends at the end of the @quotation body + {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip + \parindent=0pt + % We have retained a nonzero parskip for the environment, since we're + % doing normal filling. So to avoid extra space below the environment... + \def\Equotation{\parskip = 0pt \nonfillfinish}% + % + % @cartouche defines \nonarrowing to inhibit narrowing at next level down. + \ifx\nonarrowing\relax + \advance\leftskip by \lispnarrowing + \advance\rightskip by \lispnarrowing + \exdentamount = \lispnarrowing + \let\nonarrowing = \relax + \fi +} + + +% LaTeX-like @verbatim...@end verbatim and @verb{...} +% If we want to allow any as delimiter, +% we need the curly braces so that makeinfo sees the @verb command, eg: +% `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org +% +% [Knuth]: Donald Ervin Knuth, 1996. The TeXbook. +% +% [Knuth] p.344; only we need to do the other characters Texinfo sets +% active too. Otherwise, they get lost as the first character on a +% verbatim line. +\def\dospecials{% + \do\ \do\\\do\{\do\}\do\$\do\&% + \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~% + \do\<\do\>\do\|\do\@\do+\do\"% +} +% +% [Knuth] p. 380 +\def\uncatcodespecials{% + \def\do##1{\catcode`##1=12}\dospecials} +% +% [Knuth] pp. 380,381,391 +% Disable Spanish ligatures ?` and !` of \tt font +\begingroup + \catcode`\`=\active\gdef`{\relax\lq} +\endgroup +% +% Setup for the @verb command. +% +% Eight spaces for a tab +\begingroup + \catcode`\^^I=\active + \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }} +\endgroup +% +\def\setupverb{% + \tt % easiest (and conventionally used) font for verbatim + \def\par{\leavevmode\endgraf}% + \catcode`\`=\active + \tabeightspaces + % Respect line breaks, + % print special symbols as themselves, and + % make each space count + % must do in this order: + \obeylines \uncatcodespecials \sepspaces +} + +% Setup for the @verbatim environment +% +% Real tab expansion +\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount +% +\def\starttabbox{\setbox0=\hbox\bgroup} +\begingroup + \catcode`\^^I=\active + \gdef\tabexpand{% + \catcode`\^^I=\active + \def^^I{\leavevmode\egroup + \dimen0=\wd0 % the width so far, or since the previous tab + \divide\dimen0 by\tabw + \multiply\dimen0 by\tabw % compute previous multiple of \tabw + \advance\dimen0 by\tabw % advance to next multiple of \tabw + \wd0=\dimen0 \box0 \starttabbox + }% + } +\endgroup +\def\setupverbatim{% + % Easiest (and conventionally used) font for verbatim + \tt + \def\par{\leavevmode\egroup\box0\endgraf}% + \catcode`\`=\active + \tabexpand + % Respect line breaks, + % print special symbols as themselves, and + % make each space count + % must do in this order: + \obeylines \uncatcodespecials \sepspaces + \everypar{\starttabbox}% +} + +% Do the @verb magic: verbatim text is quoted by unique +% delimiter characters. Before first delimiter expect a +% right brace, after last delimiter expect closing brace: +% +% \def\doverb'{'#1'}'{#1} +% +% [Knuth] p. 382; only eat outer {} +\begingroup + \catcode`[=1\catcode`]=2\catcode`\{=12\catcode`\}=12 + \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next] +\endgroup +% +\def\verb{\begingroup\setupverb\doverb} +% +% +% Do the @verbatim magic: define the macro \doverbatim so that +% the (first) argument ends when '@end verbatim' is reached, ie: +% +% \def\doverbatim#1@end verbatim{#1} +% +% For Texinfo it's a lot easier than for LaTeX, +% because texinfo's \verbatim doesn't stop at '\end{verbatim}': +% we need not redefine '\', '{' and '}'. +% +% Inspired by LaTeX's verbatim command set [latex.ltx] +%% Include LaTeX hack for completeness -- never know +%% \begingroup +%% \catcode`|=0 \catcode`[=1 +%% \catcode`]=2\catcode`\{=12\catcode`\}=12\catcode`\ =\active +%% \catcode`\\=12|gdef|doverbatim#1@end verbatim[ +%% #1|endgroup|def|Everbatim[]|end[verbatim]] +%% |endgroup +% +\begingroup + \catcode`\ =\active + \obeylines % + % ignore everything up to the first ^^M, that's the newline at the end + % of the @verbatim input line itself. Otherwise we get an extra blank + % line in the output. + \gdef\doverbatim#1^^M#2@end verbatim{#2\end{verbatim}}% +\endgroup +% +\def\verbatim{% + \def\Everbatim{\nonfillfinish\endgroup}% + \begingroup + \nonfillstart + \advance\leftskip by -\defbodyindent + \begingroup\setupverbatim\doverbatim +} + +% @verbatiminclude FILE - insert text of file in verbatim environment. +% +% Allow normal characters that we make active in the argument (a file name). +\def\verbatiminclude{% + \begingroup + \catcode`\\=\other + \catcode`~=\other + \catcode`^=\other + \catcode`_=\other + \catcode`|=\other + \catcode`<=\other + \catcode`>=\other + \catcode`+=\other + \parsearg\doverbatiminclude +} +\def\setupverbatiminclude{% + \begingroup + \nonfillstart + \advance\leftskip by -\defbodyindent + \begingroup\setupverbatim +} +% +\def\doverbatiminclude#1{% + % Restore active chars for included file. + \endgroup + \begingroup + \let\value=\expandablevalue + \def\thisfile{#1}% + \expandafter\expandafter\setupverbatiminclude\input\thisfile + \endgroup + \nonfillfinish + \endgroup +} + +% @copying ... @end copying. +% Save the text away for @insertcopying later. Many commands won't be +% allowed in this context, but that's ok. +% +% We save the uninterpreted tokens, rather than creating a box. +% Saving the text in a box would be much easier, but then all the +% typesetting commands (@smallbook, font changes, etc.) have to be done +% beforehand -- and a) we want @copying to be done first in the source +% file; b) letting users define the frontmatter in as flexible order as +% possible is very desirable. +% +\def\copying{\begingroup + % Define a command to swallow text until we reach `@end copying'. + % \ is the escape char in this texinfo.tex file, so it is the + % delimiter for the command; @ will be the escape char when we read + % it, but that doesn't matter. + \long\def\docopying##1\end copying{\gdef\copyingtext{##1}\enddocopying}% + % + % We must preserve ^^M's in the input file; see \insertcopying below. + \catcode`\^^M = \active + \docopying +} + +% What we do to finish off the copying text. +% +\def\enddocopying{\endgroup\ignorespaces} + +% @insertcopying. Here we must play games with ^^M's. On the one hand, +% we need them to delimit commands such as `@end quotation', so they +% must be active. On the other hand, we certainly don't want every +% end-of-line to be a \par, as would happen with the normal active +% definition of ^^M. On the third hand, two ^^M's in a row should still +% generate a \par. +% +% Our approach is to make ^^M insert a space and a penalty1 normally; +% then it can also check if \lastpenalty=1. If it does, then manually +% do \par. +% +% This messes up the normal definitions of @c[omment], so we redefine +% it. Similarly for @ignore. (These commands are used in the gcc +% manual for man page generation.) +% +% Seems pretty fragile, most line-oriented commands will presumably +% fail, but for the limited use of getting the copying text (which +% should be quite simple) inserted, we can hope it's ok. +% +{\catcode`\^^M=\active % +\gdef\insertcopying{\begingroup % + \parindent = 0pt % looks wrong on title page + \def^^M{% + \ifnum \lastpenalty=1 % + \par % + \else % + \space \penalty 1 % + \fi % + }% + % + % Fix @c[omment] for catcode 13 ^^M's. + \def\c##1^^M{\ignorespaces}% + \let\comment = \c % + % + % Don't bother jumping through all the hoops that \doignore does, it + % would be very hard since the catcodes are already set. + \long\def\ignore##1\end ignore{\ignorespaces}% + % + \copyingtext % +\endgroup}% +} + +\message{defuns,} +% @defun etc. + +% Allow user to change definition object font (\df) internally +\def\setdeffont#1 {\csname DEF#1\endcsname} + +\newskip\defbodyindent \defbodyindent=.4in +\newskip\defargsindent \defargsindent=50pt +\newskip\deflastargmargin \deflastargmargin=18pt + +\newcount\parencount + +% We want ()&[] to print specially on the defun line. +% +\def\activeparens{% + \catcode`\(=\active \catcode`\)=\active + \catcode`\&=\active + \catcode`\[=\active \catcode`\]=\active +} + +% Make control sequences which act like normal parenthesis chars. +\let\lparen = ( \let\rparen = ) + +{\activeparens % Now, smart parens don't turn on until &foo (see \amprm) + +% Be sure that we always have a definition for `(', etc. For example, +% if the fn name has parens in it, \boldbrax will not be in effect yet, +% so TeX would otherwise complain about undefined control sequence. +\global\let(=\lparen \global\let)=\rparen +\global\let[=\lbrack \global\let]=\rbrack + +\gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 } +\gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} +% This is used to turn on special parens +% but make & act ordinary (given that it's active). +\gdef\boldbraxnoamp{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb\let&=\ampnr} + +% Definitions of (, ) and & used in args for functions. +% This is the definition of ( outside of all parentheses. +\gdef\oprm#1 {{\rm\char`\(}#1 \bf \let(=\opnested + \global\advance\parencount by 1 +} +% +% This is the definition of ( when already inside a level of parens. +\gdef\opnested{\char`\(\global\advance\parencount by 1 } +% +\gdef\clrm{% Print a paren in roman if it is taking us back to depth of 0. + % also in that case restore the outer-level definition of (. + \ifnum \parencount=1 {\rm \char `\)}\sl \let(=\oprm \else \char `\) \fi + \global\advance \parencount by -1 } +% If we encounter &foo, then turn on ()-hacking afterwards +\gdef\amprm#1 {{\rm\}\let(=\oprm \let)=\clrm\ } +% +\gdef\normalparens{\boldbrax\let&=\ampnr} +} % End of definition inside \activeparens +%% These parens (in \boldbrax) actually are a little bolder than the +%% contained text. This is especially needed for [ and ] +\def\opnr{{\sf\char`\(}\global\advance\parencount by 1 } +\def\clnr{{\sf\char`\)}\global\advance\parencount by -1 } +\let\ampnr = \& +\def\lbrb{{\bf\char`\[}} +\def\rbrb{{\bf\char`\]}} + +% Active &'s sneak into the index arguments, so make sure it's defined. +{ + \catcode`& = \active + \global\let& = \ampnr +} + +% \defname, which formats the name of the @def (not the args). +% #1 is the function name. +% #2 is the type of definition, such as "Function". +% +\def\defname#1#2{% + % How we'll output the type name. Putting it in brackets helps + % distinguish it from the body text that may end up on the next line + % just below it. + \ifempty{#2}% + \def\defnametype{}% + \else + \def\defnametype{[\rm #2]}% + \fi + % + % Get the values of \leftskip and \rightskip as they were outside the @def... + \dimen2=\leftskip + \advance\dimen2 by -\defbodyindent + % + % Figure out values for the paragraph shape. + \setbox0=\hbox{\hskip \deflastargmargin{\defnametype}}% + \dimen0=\hsize \advance \dimen0 by -\wd0 % compute size for first line + \dimen1=\hsize \advance \dimen1 by -\defargsindent % size for continuations + \parshape 2 0in \dimen0 \defargsindent \dimen1 + % + % Output arg 2 ("Function" or some such) but stuck inside a box of + % width 0 so it does not interfere with linebreaking. + \noindent + % + {% Adjust \hsize to exclude the ambient margins, + % so that \rightline will obey them. + \advance \hsize by -\dimen2 + \dimen3 = 0pt % was -1.25pc + \rlap{\rightline{\defnametype\kern\dimen3}}% + }% + % + % Allow all lines to be underfull without complaint: + \tolerance=10000 \hbadness=10000 + \advance\leftskip by -\defbodyindent + \exdentamount=\defbodyindent + {\df #1}\enskip % output function name + % \defunargs will be called next to output the arguments, if any. +} + +% Common pieces to start any @def... +% #1 is the \E... control sequence to end the definition (which we define). +% #2 is the \...x control sequence (which our caller defines). +% #3 is the control sequence to process the header, such as \defunheader. +% +\def\parsebodycommon#1#2#3{% + \begingroup\inENV + % If there are two @def commands in a row, we'll have a \nobreak, + % which is there to keep the function description together with its + % header. But if there's nothing but headers, we want to allow a + % break after all. Check for penalty 10002 (inserted by + % \defargscommonending) instead of 10000, since the sectioning + % commands insert a \penalty10000, and we don't want to allow a break + % between a section heading and a defun. + \ifnum\lastpenalty=10002 \penalty0 \fi + \medbreak + % + % Define the \E... end token that this defining construct specifies + % so that it will exit this group. + \def#1{\endgraf\endgroup\medbreak}% + % + \parindent=0in + \advance\leftskip by \defbodyindent + \exdentamount=\defbodyindent +} + +% Common part of the \...x definitions. +% +\def\defxbodycommon{% + % As with \parsebodycommon above, allow line break if we have multiple + % x headers in a row. It's not a great place, though. + \ifnum\lastpenalty=10000 \penalty1000 \fi + % + \begingroup\obeylines +} + +% Process body of @defun, @deffn, @defmac, etc. +% +\def\defparsebody#1#2#3{% + \parsebodycommon{#1}{#2}{#3}% + \def#2{\defxbodycommon \activeparens \spacesplit#3}% + \catcode\equalChar=\active + \begingroup\obeylines\activeparens + \spacesplit#3% +} + +% #1, #2, #3 are the common arguments (see \parsebodycommon above). +% #4, delimited by the space, is the class name. +% +\def\defmethparsebody#1#2#3#4 {% + \parsebodycommon{#1}{#2}{#3}% + \def#2##1 {\defxbodycommon \activeparens \spacesplit{#3{##1}}}% + \begingroup\obeylines\activeparens + % The \empty here prevents misinterpretation of a construct such as + % @deffn {whatever} {Enharmonic comma} + % See comments at \deftpparsebody, although in our case we don't have + % to remove the \empty afterwards, since it is empty. + \spacesplit{#3{#4}}\empty +} + +% Used for @deftypemethod and @deftypeivar. +% #1, #2, #3 are the common arguments (see \defparsebody). +% #4, delimited by a space, is the class name. +% #5 is the method's return type. +% +\def\deftypemethparsebody#1#2#3#4 #5 {% + \parsebodycommon{#1}{#2}{#3}% + \def#2##1 ##2 {\defxbodycommon \activeparens \spacesplit{#3{##1}{##2}}}% + \begingroup\obeylines\activeparens + \spacesplit{#3{#4}{#5}}% +} + +% Used for @deftypeop. The change from \deftypemethparsebody is an +% extra argument at the beginning which is the `category', instead of it +% being the hardwired string `Method' or `Instance Variable'. We have +% to account for this both in the \...x definition and in parsing the +% input at hand. Thus also need a control sequence (passed as #5) for +% the \E... definition to assign the category name to. +% +\def\deftypeopparsebody#1#2#3#4#5 #6 {% + \parsebodycommon{#1}{#2}{#3}% + \def#2##1 ##2 ##3 {\def#4{##1}% + \defxbodycommon \activeparens \spacesplit{#3{##2}{##3}}}% + \begingroup\obeylines\activeparens + \spacesplit{#3{#5}{#6}}% +} + +% For @defop. +\def\defopparsebody #1#2#3#4#5 {% + \parsebodycommon{#1}{#2}{#3}% + \def#2##1 ##2 {\def#4{##1}% + \defxbodycommon \activeparens \spacesplit{#3{##2}}}% + \begingroup\obeylines\activeparens + \spacesplit{#3{#5}}% +} + +% These parsing functions are similar to the preceding ones +% except that they do not make parens into active characters. +% These are used for "variables" since they have no arguments. +% +\def\defvarparsebody #1#2#3{% + \parsebodycommon{#1}{#2}{#3}% + \def#2{\defxbodycommon \spacesplit#3}% + \catcode\equalChar=\active + \begingroup\obeylines + \spacesplit#3% +} + +% @defopvar. +\def\defopvarparsebody #1#2#3#4#5 {% + \parsebodycommon{#1}{#2}{#3}% + \def#2##1 ##2 {\def#4{##1}% + \defxbodycommon \spacesplit{#3{##2}}}% + \begingroup\obeylines + \spacesplit{#3{#5}}% +} + +\def\defvrparsebody#1#2#3#4 {% + \parsebodycommon{#1}{#2}{#3}% + \def#2##1 {\defxbodycommon \spacesplit{#3{##1}}}% + \begingroup\obeylines + \spacesplit{#3{#4}}% +} + +% This loses on `@deftp {Data Type} {struct termios}' -- it thinks the +% type is just `struct', because we lose the braces in `{struct +% termios}' when \spacesplit reads its undelimited argument. Sigh. +% \let\deftpparsebody=\defvrparsebody +% +% So, to get around this, we put \empty in with the type name. That +% way, TeX won't find exactly `{...}' as an undelimited argument, and +% won't strip off the braces. +% +\def\deftpparsebody #1#2#3#4 {% + \parsebodycommon{#1}{#2}{#3}% + \def#2##1 {\defxbodycommon \spacesplit{#3{##1}}}% + \begingroup\obeylines + \spacesplit{\parsetpheaderline{#3{#4}}}\empty +} + +% Fine, but then we have to eventually remove the \empty *and* the +% braces (if any). That's what this does. +% +\def\removeemptybraces\empty#1\relax{#1} + +% After \spacesplit has done its work, this is called -- #1 is the final +% thing to call, #2 the type name (which starts with \empty), and #3 +% (which might be empty) the arguments. +% +\def\parsetpheaderline#1#2#3{% + #1{\removeemptybraces#2\relax}{#3}% +}% + +% Split up #2 (the rest of the input line) at the first space token. +% call #1 with two arguments: +% the first is all of #2 before the space token, +% the second is all of #2 after that space token. +% If #2 contains no space token, all of it is passed as the first arg +% and the second is passed as empty. +% +{\obeylines % + \gdef\spacesplit#1#2^^M{\endgroup\spacesplitx{#1}#2 \relax\spacesplitx}% + \long\gdef\spacesplitx#1#2 #3#4\spacesplitx{% + \ifx\relax #3% + #1{#2}{}% + \else % + #1{#2}{#3#4}% + \fi}% +} + +% Define @defun. + +% This is called to end the arguments processing for all the @def... commands. +% +\def\defargscommonending{% + \interlinepenalty = 10000 + \advance\rightskip by 0pt plus 1fil + \endgraf + \nobreak\vskip -\parskip + \penalty 10002 % signal to \parsebodycommon. +} + +% This expands the args and terminates the paragraph they comprise. +% +\def\defunargs#1{\functionparens \sl +% Expand, preventing hyphenation at `-' chars. +% Note that groups don't affect changes in \hyphenchar. +% Set the font temporarily and use \font in case \setfont made \tensl a macro. +{\tensl\hyphenchar\font=0}% +#1% +{\tensl\hyphenchar\font=45}% +\ifnum\parencount=0 \else \errmessage{Unbalanced parentheses in @def}\fi% + \defargscommonending +} + +\def\deftypefunargs #1{% +% Expand, preventing hyphenation at `-' chars. +% Note that groups don't affect changes in \hyphenchar. +% Use \boldbraxnoamp, not \functionparens, so that & is not special. +\boldbraxnoamp +\tclose{#1}% avoid \code because of side effects on active chars + \defargscommonending +} + +% Do complete processing of one @defun or @defunx line already parsed. + +% @deffn Command forward-char nchars + +\def\deffn{\defmethparsebody\Edeffn\deffnx\deffnheader} + +\def\deffnheader #1#2#3{\doind {fn}{\code{#2}}% +\begingroup\defname {#2}{#1}\defunargs{#3}\endgroup % +\catcode\equalChar=\other % Turn off change made in \defparsebody +} + +% @defun == @deffn Function + +\def\defun{\defparsebody\Edefun\defunx\defunheader} + +\def\defunheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index +\begingroup\defname {#1}{\putwordDeffunc}% +\defunargs {#2}\endgroup % +\catcode\equalChar=\other % Turn off change made in \defparsebody +} + +% @deftypefun int foobar (int @var{foo}, float @var{bar}) + +\def\deftypefun{\defparsebody\Edeftypefun\deftypefunx\deftypefunheader} + +% #1 is the data type. #2 is the name and args. +\def\deftypefunheader #1#2{\deftypefunheaderx{#1}#2 \relax} +% #1 is the data type, #2 the name, #3 the args. +\def\deftypefunheaderx #1#2 #3\relax{% +\doind {fn}{\code{#2}}% Make entry in function index +\begingroup\defname {\defheaderxcond#1\relax$.$#2}{\putwordDeftypefun}% +\deftypefunargs {#3}\endgroup % +\catcode\equalChar=\other % Turn off change made in \defparsebody +} + +% @deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar}) + +\def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader} + +% \defheaderxcond#1\relax$.$ +% puts #1 in @code, followed by a space, but does nothing if #1 is null. +\def\defheaderxcond#1#2$.${\ifx#1\relax\else\code{#1#2} \fi} + +% #1 is the classification. #2 is the data type. #3 is the name and args. +\def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax} +% #1 is the classification, #2 the data type, #3 the name, #4 the args. +\def\deftypefnheaderx #1#2#3 #4\relax{% +\doind {fn}{\code{#3}}% Make entry in function index +\begingroup +\normalparens % notably, turn off `&' magic, which prevents +% at least some C++ text from working +\defname {\defheaderxcond#2\relax$.$#3}{#1}% +\deftypefunargs {#4}\endgroup % +\catcode\equalChar=\other % Turn off change made in \defparsebody +} + +% @defmac == @deffn Macro + +\def\defmac{\defparsebody\Edefmac\defmacx\defmacheader} + +\def\defmacheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index +\begingroup\defname {#1}{\putwordDefmac}% +\defunargs {#2}\endgroup % +\catcode\equalChar=\other % Turn off change made in \defparsebody +} + +% @defspec == @deffn Special Form + +\def\defspec{\defparsebody\Edefspec\defspecx\defspecheader} + +\def\defspecheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index +\begingroup\defname {#1}{\putwordDefspec}% +\defunargs {#2}\endgroup % +\catcode\equalChar=\other % Turn off change made in \defparsebody +} + +% @defop CATEGORY CLASS OPERATION ARG... +% +\def\defop #1 {\def\defoptype{#1}% +\defopparsebody\Edefop\defopx\defopheader\defoptype} +% +\def\defopheader#1#2#3{% + \dosubind{fn}{\code{#2}}{\putwordon\ \code{#1}}% function index entry + \begingroup + \defname{#2}{\defoptype\ \putwordon\ #1}% + \defunargs{#3}% + \endgroup +} + +% @deftypeop CATEGORY CLASS TYPE OPERATION ARG... +% +\def\deftypeop #1 {\def\deftypeopcategory{#1}% + \deftypeopparsebody\Edeftypeop\deftypeopx\deftypeopheader + \deftypeopcategory} +% +% #1 is the class name, #2 the data type, #3 the operation name, #4 the args. +\def\deftypeopheader#1#2#3#4{% + \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index + \begingroup + \defname{\defheaderxcond#2\relax$.$#3} + {\deftypeopcategory\ \putwordon\ \code{#1}}% + \deftypefunargs{#4}% + \endgroup +} + +% @deftypemethod CLASS TYPE METHOD ARG... +% +\def\deftypemethod{% + \deftypemethparsebody\Edeftypemethod\deftypemethodx\deftypemethodheader} +% +% #1 is the class name, #2 the data type, #3 the method name, #4 the args. +\def\deftypemethodheader#1#2#3#4{% + \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index + \begingroup + \defname{\defheaderxcond#2\relax$.$#3}{\putwordMethodon\ \code{#1}}% + \deftypefunargs{#4}% + \endgroup +} + +% @deftypeivar CLASS TYPE VARNAME +% +\def\deftypeivar{% + \deftypemethparsebody\Edeftypeivar\deftypeivarx\deftypeivarheader} +% +% #1 is the class name, #2 the data type, #3 the variable name. +\def\deftypeivarheader#1#2#3{% + \dosubind{vr}{\code{#3}}{\putwordof\ \code{#1}}% entry in variable index + \begingroup + \defname{\defheaderxcond#2\relax$.$#3} + {\putwordInstanceVariableof\ \code{#1}}% + \defvarargs{#3}% + \endgroup +} + +% @defmethod == @defop Method +% +\def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader} +% +% #1 is the class name, #2 the method name, #3 the args. +\def\defmethodheader#1#2#3{% + \dosubind{fn}{\code{#2}}{\putwordon\ \code{#1}}% entry in function index + \begingroup + \defname{#2}{\putwordMethodon\ \code{#1}}% + \defunargs{#3}% + \endgroup +} + +% @defcv {Class Option} foo-class foo-flag + +\def\defcv #1 {\def\defcvtype{#1}% +\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype} + +\def\defcvarheader #1#2#3{% + \dosubind{vr}{\code{#2}}{\putwordof\ \code{#1}}% variable index entry + \begingroup + \defname{#2}{\defcvtype\ \putwordof\ #1}% + \defvarargs{#3}% + \endgroup +} + +% @defivar CLASS VARNAME == @defcv {Instance Variable} CLASS VARNAME +% +\def\defivar{\defvrparsebody\Edefivar\defivarx\defivarheader} +% +\def\defivarheader#1#2#3{% + \dosubind{vr}{\code{#2}}{\putwordof\ \code{#1}}% entry in var index + \begingroup + \defname{#2}{\putwordInstanceVariableof\ #1}% + \defvarargs{#3}% + \endgroup +} + +% @defvar +% First, define the processing that is wanted for arguments of @defvar. +% This is actually simple: just print them in roman. +% This must expand the args and terminate the paragraph they make up +\def\defvarargs #1{\normalparens #1% + \defargscommonending +} + +% @defvr Counter foo-count + +\def\defvr{\defvrparsebody\Edefvr\defvrx\defvrheader} + +\def\defvrheader #1#2#3{\doind {vr}{\code{#2}}% +\begingroup\defname {#2}{#1}\defvarargs{#3}\endgroup} + +% @defvar == @defvr Variable + +\def\defvar{\defvarparsebody\Edefvar\defvarx\defvarheader} + +\def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index +\begingroup\defname {#1}{\putwordDefvar}% +\defvarargs {#2}\endgroup % +} + +% @defopt == @defvr {User Option} + +\def\defopt{\defvarparsebody\Edefopt\defoptx\defoptheader} + +\def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index +\begingroup\defname {#1}{\putwordDefopt}% +\defvarargs {#2}\endgroup % +} + +% @deftypevar int foobar + +\def\deftypevar{\defvarparsebody\Edeftypevar\deftypevarx\deftypevarheader} + +% #1 is the data type. #2 is the name, perhaps followed by text that +% is actually part of the data type, which should not be put into the index. +\def\deftypevarheader #1#2{% +\dovarind#2 \relax% Make entry in variables index +\begingroup\defname {\defheaderxcond#1\relax$.$#2}{\putwordDeftypevar}% + \defargscommonending +\endgroup} +\def\dovarind#1 #2\relax{\doind{vr}{\code{#1}}} + +% @deftypevr {Global Flag} int enable + +\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader} + +\def\deftypevrheader #1#2#3{\dovarind#3 \relax% +\begingroup\defname {\defheaderxcond#2\relax$.$#3}{#1} + \defargscommonending +\endgroup} + +% Now define @deftp +% Args are printed in bold, a slight difference from @defvar. + +\def\deftpargs #1{\bf \defvarargs{#1}} + +% @deftp Class window height width ... + +\def\deftp{\deftpparsebody\Edeftp\deftpx\deftpheader} + +\def\deftpheader #1#2#3{\doind {tp}{\code{#2}}% +\begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup} + +% These definitions are used if you use @defunx (etc.) +% anywhere other than immediately after a @defun or @defunx. +% +\def\defcvx#1 {\errmessage{@defcvx in invalid context}} +\def\deffnx#1 {\errmessage{@deffnx in invalid context}} +\def\defivarx#1 {\errmessage{@defivarx in invalid context}} +\def\defmacx#1 {\errmessage{@defmacx in invalid context}} +\def\defmethodx#1 {\errmessage{@defmethodx in invalid context}} +\def\defoptx #1 {\errmessage{@defoptx in invalid context}} +\def\defopx#1 {\errmessage{@defopx in invalid context}} +\def\defspecx#1 {\errmessage{@defspecx in invalid context}} +\def\deftpx#1 {\errmessage{@deftpx in invalid context}} +\def\deftypefnx#1 {\errmessage{@deftypefnx in invalid context}} +\def\deftypefunx#1 {\errmessage{@deftypefunx in invalid context}} +\def\deftypeivarx#1 {\errmessage{@deftypeivarx in invalid context}} +\def\deftypemethodx#1 {\errmessage{@deftypemethodx in invalid context}} +\def\deftypeopx#1 {\errmessage{@deftypeopx in invalid context}} +\def\deftypevarx#1 {\errmessage{@deftypevarx in invalid context}} +\def\deftypevrx#1 {\errmessage{@deftypevrx in invalid context}} +\def\defunx#1 {\errmessage{@defunx in invalid context}} +\def\defvarx#1 {\errmessage{@defvarx in invalid context}} +\def\defvrx#1 {\errmessage{@defvrx in invalid context}} + + +\message{macros,} +% @macro. + +% To do this right we need a feature of e-TeX, \scantokens, +% which we arrange to emulate with a temporary file in ordinary TeX. +\ifx\eTeXversion\undefined + \newwrite\macscribble + \def\scanmacro#1{% + \begingroup \newlinechar`\^^M + % Undo catcode changes of \startcontents and \doprintindex + \catcode`\@=0 \catcode`\\=\other \escapechar=`\@ + % Append \endinput to make sure that TeX does not see the ending newline. + \toks0={#1\endinput}% + \immediate\openout\macscribble=\jobname.tmp + \immediate\write\macscribble{\the\toks0}% + \immediate\closeout\macscribble + \let\xeatspaces\eatspaces + \input \jobname.tmp + \endgroup +} +\else +\def\scanmacro#1{% +\begingroup \newlinechar`\^^M +% Undo catcode changes of \startcontents and \doprintindex +\catcode`\@=0 \catcode`\\=\other \escapechar=`\@ +\let\xeatspaces\eatspaces\scantokens{#1\endinput}\endgroup} +\fi + +\newcount\paramno % Count of parameters +\newtoks\macname % Macro name +\newif\ifrecursive % Is it recursive? +\def\macrolist{} % List of all defined macros in the form + % \do\macro1\do\macro2... + +% Utility routines. +% Thisdoes \let #1 = #2, except with \csnames. +\def\cslet#1#2{% +\expandafter\expandafter +\expandafter\let +\expandafter\expandafter +\csname#1\endcsname +\csname#2\endcsname} + +% Trim leading and trailing spaces off a string. +% Concepts from aro-bend problem 15 (see CTAN). +{\catcode`\@=11 +\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }} +\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@} +\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @} +\def\unbrace#1{#1} +\unbrace{\gdef\trim@@@ #1 } #2@{#1} +} + +% Trim a single trailing ^^M off a string. +{\catcode`\^^M=\other \catcode`\Q=3% +\gdef\eatcr #1{\eatcra #1Q^^MQ}% +\gdef\eatcra#1^^MQ{\eatcrb#1Q}% +\gdef\eatcrb#1Q#2Q{#1}% +} + +% Macro bodies are absorbed as an argument in a context where +% all characters are catcode 10, 11 or 12, except \ which is active +% (as in normal texinfo). It is necessary to change the definition of \. + +% It's necessary to have hard CRs when the macro is executed. This is +% done by making ^^M (\endlinechar) catcode 12 when reading the macro +% body, and then making it the \newlinechar in \scanmacro. + +\def\macrobodyctxt{% + \catcode`\~=\other + \catcode`\^=\other + \catcode`\_=\other + \catcode`\|=\other + \catcode`\<=\other + \catcode`\>=\other + \catcode`\+=\other + \catcode`\{=\other + \catcode`\}=\other + \catcode`\@=\other + \catcode`\^^M=\other + \usembodybackslash} + +\def\macroargctxt{% + \catcode`\~=\other + \catcode`\^=\other + \catcode`\_=\other + \catcode`\|=\other + \catcode`\<=\other + \catcode`\>=\other + \catcode`\+=\other + \catcode`\@=\other + \catcode`\\=\other} + +% \mbodybackslash is the definition of \ in @macro bodies. +% It maps \foo\ => \csname macarg.foo\endcsname => #N +% where N is the macro parameter number. +% We define \csname macarg.\endcsname to be \realbackslash, so +% \\ in macro replacement text gets you a backslash. + +{\catcode`@=0 @catcode`@\=@active + @gdef@usembodybackslash{@let\=@mbodybackslash} + @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} +} +\expandafter\def\csname macarg.\endcsname{\realbackslash} + +\def\macro{\recursivefalse\parsearg\macroxxx} +\def\rmacro{\recursivetrue\parsearg\macroxxx} + +\def\macroxxx#1{% + \getargs{#1}% now \macname is the macname and \argl the arglist + \ifx\argl\empty % no arguments + \paramno=0% + \else + \expandafter\parsemargdef \argl;% + \fi + \if1\csname ismacro.\the\macname\endcsname + \message{Warning: redefining \the\macname}% + \else + \expandafter\ifx\csname \the\macname\endcsname \relax + \else \errmessage{Macro name \the\macname\space already defined}\fi + \global\cslet{macsave.\the\macname}{\the\macname}% + \global\expandafter\let\csname ismacro.\the\macname\endcsname=1% + % Add the macroname to \macrolist + \toks0 = \expandafter{\macrolist\do}% + \xdef\macrolist{\the\toks0 + \expandafter\noexpand\csname\the\macname\endcsname}% + \fi + \begingroup \macrobodyctxt + \ifrecursive \expandafter\parsermacbody + \else \expandafter\parsemacbody + \fi} + +\def\unmacro{\parsearg\dounmacro} +\def\dounmacro#1{% + \if1\csname ismacro.#1\endcsname + \global\cslet{#1}{macsave.#1}% + \global\expandafter\let \csname ismacro.#1\endcsname=0% + % Remove the macro name from \macrolist: + \begingroup + \expandafter\let\csname#1\endcsname \relax + \let\do\unmacrodo + \xdef\macrolist{\macrolist}% + \endgroup + \else + \errmessage{Macro #1 not defined}% + \fi +} + +% Called by \do from \dounmacro on each macro. The idea is to omit any +% macro definitions that have been changed to \relax. +% +\def\unmacrodo#1{% + \ifx#1\relax + % remove this + \else + \noexpand\do \noexpand #1% + \fi +} + +% This makes use of the obscure feature that if the last token of a +% is #, then the preceding argument is delimited by +% an opening brace, and that opening brace is not consumed. +\def\getargs#1{\getargsxxx#1{}} +\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} +\def\getmacname #1 #2\relax{\macname={#1}} +\def\getmacargs#1{\def\argl{#1}} + +% Parse the optional {params} list. Set up \paramno and \paramlist +% so \defmacro knows what to do. Define \macarg.blah for each blah +% in the params list, to be ##N where N is the position in that list. +% That gets used by \mbodybackslash (above). + +% We need to get `macro parameter char #' into several definitions. +% The technique used is stolen from LaTeX: let \hash be something +% unexpandable, insert that wherever you need a #, and then redefine +% it to # just before using the token list produced. +% +% The same technique is used to protect \eatspaces till just before +% the macro is used. + +\def\parsemargdef#1;{\paramno=0\def\paramlist{}% + \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,} +\def\parsemargdefxxx#1,{% + \if#1;\let\next=\relax + \else \let\next=\parsemargdefxxx + \advance\paramno by 1% + \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname + {\xeatspaces{\hash\the\paramno}}% + \edef\paramlist{\paramlist\hash\the\paramno,}% + \fi\next} + +% These two commands read recursive and nonrecursive macro bodies. +% (They're different since rec and nonrec macros end differently.) + +\long\def\parsemacbody#1@end macro% +{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% +\long\def\parsermacbody#1@end rmacro% +{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% + +% This defines the macro itself. There are six cases: recursive and +% nonrecursive macros of zero, one, and many arguments. +% Much magic with \expandafter here. +% \xdef is used so that macro definitions will survive the file +% they're defined in; @include reads the file inside a group. +\def\defmacro{% + \let\hash=##% convert placeholders to macro parameter chars + \ifrecursive + \ifcase\paramno + % 0 + \expandafter\xdef\csname\the\macname\endcsname{% + \noexpand\scanmacro{\temp}}% + \or % 1 + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \noexpand\braceorline + \expandafter\noexpand\csname\the\macname xxx\endcsname}% + \expandafter\xdef\csname\the\macname xxx\endcsname##1{% + \egroup\noexpand\scanmacro{\temp}}% + \else % many + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \noexpand\csname\the\macname xx\endcsname}% + \expandafter\xdef\csname\the\macname xx\endcsname##1{% + \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% + \expandafter\expandafter + \expandafter\xdef + \expandafter\expandafter + \csname\the\macname xxx\endcsname + \paramlist{\egroup\noexpand\scanmacro{\temp}}% + \fi + \else + \ifcase\paramno + % 0 + \expandafter\xdef\csname\the\macname\endcsname{% + \noexpand\norecurse{\the\macname}% + \noexpand\scanmacro{\temp}\egroup}% + \or % 1 + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \noexpand\braceorline + \expandafter\noexpand\csname\the\macname xxx\endcsname}% + \expandafter\xdef\csname\the\macname xxx\endcsname##1{% + \egroup + \noexpand\norecurse{\the\macname}% + \noexpand\scanmacro{\temp}\egroup}% + \else % many + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \expandafter\noexpand\csname\the\macname xx\endcsname}% + \expandafter\xdef\csname\the\macname xx\endcsname##1{% + \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% + \expandafter\expandafter + \expandafter\xdef + \expandafter\expandafter + \csname\the\macname xxx\endcsname + \paramlist{% + \egroup + \noexpand\norecurse{\the\macname}% + \noexpand\scanmacro{\temp}\egroup}% + \fi + \fi} + +\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} + +% \braceorline decides whether the next nonwhitespace character is a +% {. If so it reads up to the closing }, if not, it reads the whole +% line. Whatever was read is then fed to the next control sequence +% as an argument (by \parsebrace or \parsearg) +\def\braceorline#1{\let\next=#1\futurelet\nchar\braceorlinexxx} +\def\braceorlinexxx{% + \ifx\nchar\bgroup\else + \expandafter\parsearg + \fi \next} + +% We mant to disable all macros during \shipout so that they are not +% expanded by \write. +\def\turnoffmacros{\begingroup \def\do##1{\let\noexpand##1=\relax}% + \edef\next{\macrolist}\expandafter\endgroup\next} + + +% @alias. +% We need some trickery to remove the optional spaces around the equal +% sign. Just make them active and then expand them all to nothing. +\def\alias{\begingroup\obeyspaces\parsearg\aliasxxx} +\def\aliasxxx #1{\aliasyyy#1\relax} +\def\aliasyyy #1=#2\relax{\ignoreactivespaces +\edef\next{\global\let\expandafter\noexpand\csname#1\endcsname=% + \expandafter\noexpand\csname#2\endcsname}% +\expandafter\endgroup\next} + + +\message{cross references,} +% @xref etc. + +\newwrite\auxfile + +\newif\ifhavexrefs % True if xref values are known. +\newif\ifwarnedxrefs % True if we warned once that they aren't known. + +% @inforef is relatively simple. +\def\inforef #1{\inforefzzz #1,,,,**} +\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, + node \samp{\ignorespaces#1{}}} + +% @node's job is to define \lastnode. +\def\node{\ENVcheck\parsearg\nodezzz} +\def\nodezzz#1{\nodexxx [#1,]} +\def\nodexxx[#1,#2]{\gdef\lastnode{#1}} +\let\nwnode=\node +\let\lastnode=\relax + +% The sectioning commands (@chapter, etc.) call these. +\def\donoderef{% + \ifx\lastnode\relax\else + \expandafter\expandafter\expandafter\setref{\lastnode}% + {Ysectionnumberandtype}% + \global\let\lastnode=\relax + \fi +} +\def\unnumbnoderef{% + \ifx\lastnode\relax\else + \expandafter\expandafter\expandafter\setref{\lastnode}{Ynothing}% + \global\let\lastnode=\relax + \fi +} +\def\appendixnoderef{% + \ifx\lastnode\relax\else + \expandafter\expandafter\expandafter\setref{\lastnode}% + {Yappendixletterandtype}% + \global\let\lastnode=\relax + \fi +} + + +% @anchor{NAME} -- define xref target at arbitrary point. +% +\newcount\savesfregister +\gdef\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi} +\gdef\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi} +\gdef\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces} + +% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an +% anchor), namely NAME-title (the corresponding @chapter/etc. name), +% NAME-pg (the page number), and NAME-snt (section number and type). +% Called from \foonoderef. +% +% We have to set \indexdummies so commands such as @code in a section +% title aren't expanded. It would be nicer not to expand the titles in +% the first place, but there's so many layers that that is hard to do. +% +% Likewise, use \turnoffactive so that punctuation chars such as underscore +% and backslash work in node names. +% +\def\setref#1#2{{% + \atdummies + \pdfmkdest{#1}% + % + \turnoffactive + \dosetq{#1-title}{Ytitle}% + \dosetq{#1-pg}{Ypagenumber}% + \dosetq{#1-snt}{#2}% +}} + +% @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is +% the node name, #2 the name of the Info cross-reference, #3 the printed +% node name, #4 the name of the Info file, #5 the name of the printed +% manual. All but the node name can be omitted. +% +\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} +\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} +\def\ref#1{\xrefX[#1,,,,,,,]} +\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup + \unsepspaces + \def\printedmanual{\ignorespaces #5}% + \def\printednodename{\ignorespaces #3}% + \setbox1=\hbox{\printedmanual}% + \setbox0=\hbox{\printednodename}% + \ifdim \wd0 = 0pt + % No printed node name was explicitly given. + \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax + % Use the node name inside the square brackets. + \def\printednodename{\ignorespaces #1}% + \else + % Use the actual chapter/section title appear inside + % the square brackets. Use the real section title if we have it. + \ifdim \wd1 > 0pt + % It is in another manual, so we don't have it. + \def\printednodename{\ignorespaces #1}% + \else + \ifhavexrefs + % We know the real title if we have the xref values. + \def\printednodename{\refx{#1-title}{}}% + \else + % Otherwise just copy the Info node name. + \def\printednodename{\ignorespaces #1}% + \fi% + \fi + \fi + \fi + % + % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not + % insert empty discretionaries after hyphens, which means that it will + % not find a line break at a hyphen in a node names. Since some manuals + % are best written with fairly long node names, containing hyphens, this + % is a loss. Therefore, we give the text of the node name again, so it + % is as if TeX is seeing it for the first time. + \ifpdf + \leavevmode + \getfilename{#4}% + {\turnoffactive \otherbackslash + \ifnum\filenamelength>0 + \startlink attr{/Border [0 0 0]}% + goto file{\the\filename.pdf} name{#1}% + \else + \startlink attr{/Border [0 0 0]}% + goto name{#1}% + \fi + }% + \linkcolor + \fi + % + \ifdim \wd1 > 0pt + \putwordsection{} ``\printednodename'' \putwordin{} \cite{\printedmanual}% + \else + % _ (for example) has to be the character _ for the purposes of the + % control sequence corresponding to the node, but it has to expand + % into the usual \leavevmode...\vrule stuff for purposes of + % printing. So we \turnoffactive for the \refx-snt, back on for the + % printing, back off for the \refx-pg. + {\turnoffactive \otherbackslash + % Only output a following space if the -snt ref is nonempty; for + % @unnumbered and @anchor, it won't be. + \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}% + \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi + }% + % [mynode], + [\printednodename],\space + % page 3 + \turnoffactive \otherbackslash \putwordpage\tie\refx{#1-pg}{}% + \fi + \endlink +\endgroup} + +% \dosetq is called from \setref to do the actual \write (\iflinks). +% +\def\dosetq#1#2{% + {\let\folio=0% + \edef\next{\write\auxfile{\internalsetq{#1}{#2}}}% + \iflinks \next \fi + }% +} + +% \internalsetq{foo}{page} expands into +% CHARACTERS @xrdef{foo}{...expansion of \page...} +\def\internalsetq#1#2{@xrdef{#1}{\csname #2\endcsname}} + +% Things to be expanded by \internalsetq. +% +\def\Ypagenumber{\folio} +\def\Ytitle{\thissection} +\def\Ynothing{} +\def\Ysectionnumberandtype{% + \ifnum\secno=0 + \putwordChapter@tie \the\chapno + \else \ifnum\subsecno=0 + \putwordSection@tie \the\chapno.\the\secno + \else \ifnum\subsubsecno=0 + \putwordSection@tie \the\chapno.\the\secno.\the\subsecno + \else + \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno + \fi\fi\fi +} + +\def\Yappendixletterandtype{% + \ifnum\secno=0 + \putwordAppendix@tie @char\the\appendixno{}% + \else \ifnum\subsecno=0 + \putwordSection@tie @char\the\appendixno.\the\secno + \else \ifnum\subsubsecno=0 + \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno + \else + \putwordSection@tie + @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno + \fi\fi\fi +} + +% Use TeX 3.0's \inputlineno to get the line number, for better error +% messages, but if we're using an old version of TeX, don't do anything. +% +\ifx\inputlineno\thisisundefined + \let\linenumber = \empty % Pre-3.0. +\else + \def\linenumber{\the\inputlineno:\space} +\fi + +% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. +% If its value is nonempty, SUFFIX is output afterward. +% +\def\refx#1#2{% + {% + \indexnofonts + \otherbackslash + \expandafter\global\expandafter\let\expandafter\thisrefX + \csname X#1\endcsname + }% + \ifx\thisrefX\relax + % If not defined, say something at least. + \angleleft un\-de\-fined\angleright + \iflinks + \ifhavexrefs + \message{\linenumber Undefined cross reference `#1'.}% + \else + \ifwarnedxrefs\else + \global\warnedxrefstrue + \message{Cross reference values unknown; you must run TeX again.}% + \fi + \fi + \fi + \else + % It's defined, so just use it. + \thisrefX + \fi + #2% Output the suffix in any case. +} + +% This is the macro invoked by entries in the aux file. +% +\def\xrdef#1{\expandafter\gdef\csname X#1\endcsname} + +% Read the last existing aux file, if any. No error if none exists. +\def\readauxfile{\begingroup + \catcode`\^^@=\other + \catcode`\^^A=\other + \catcode`\^^B=\other + \catcode`\^^C=\other + \catcode`\^^D=\other + \catcode`\^^E=\other + \catcode`\^^F=\other + \catcode`\^^G=\other + \catcode`\^^H=\other + \catcode`\^^K=\other + \catcode`\^^L=\other + \catcode`\^^N=\other + \catcode`\^^P=\other + \catcode`\^^Q=\other + \catcode`\^^R=\other + \catcode`\^^S=\other + \catcode`\^^T=\other + \catcode`\^^U=\other + \catcode`\^^V=\other + \catcode`\^^W=\other + \catcode`\^^X=\other + \catcode`\^^Z=\other + \catcode`\^^[=\other + \catcode`\^^\=\other + \catcode`\^^]=\other + \catcode`\^^^=\other + \catcode`\^^_=\other + % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc. + % in xref tags, i.e., node names. But since ^^e4 notation isn't + % supported in the main text, it doesn't seem desirable. Furthermore, + % that is not enough: for node names that actually contain a ^ + % character, we would end up writing a line like this: 'xrdef {'hat + % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first + % argument, and \hat is not an expandable control sequence. It could + % all be worked out, but why? Either we support ^^ or we don't. + % + % The other change necessary for this was to define \auxhat: + % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter + % and then to call \auxhat in \setq. + % + \catcode`\^=\other + % + % Special characters. Should be turned off anyway, but... + \catcode`\~=\other + \catcode`\[=\other + \catcode`\]=\other + \catcode`\"=\other + \catcode`\_=\other + \catcode`\|=\other + \catcode`\<=\other + \catcode`\>=\other + \catcode`\$=\other + \catcode`\#=\other + \catcode`\&=\other + \catcode`\%=\other + \catcode`+=\other % avoid \+ for paranoia even though we've turned it off + % + % Make the characters 128-255 be printing characters + {% + \count 1=128 + \def\loop{% + \catcode\count 1=\other + \advance\count 1 by 1 + \ifnum \count 1<256 \loop \fi + }% + }% + % + % Turn off \ as an escape so we do not lose on + % entries which were dumped with control sequences in their names. + % For example, @xrdef{$\leq $-fun}{page ...} made by @defun ^^ + % Reference to such entries still does not work the way one would wish, + % but at least they do not bomb out when the aux file is read in. + \catcode`\\=\other + % + % @ is our escape character in .aux files. + \catcode`\{=1 + \catcode`\}=2 + \catcode`\@=0 + % + \openin 1 \jobname.aux + \ifeof 1 \else + \closein 1 + \input \jobname.aux + \global\havexrefstrue + \global\warnedobstrue + \fi + % Open the new aux file. TeX will close it automatically at exit. + \openout\auxfile=\jobname.aux +\endgroup} + + +% Footnotes. + +\newcount \footnoteno + +% The trailing space in the following definition for supereject is +% vital for proper filling; pages come out unaligned when you do a +% pagealignmacro call if that space before the closing brace is +% removed. (Generally, numeric constants should always be followed by a +% space to prevent strange expansion errors.) +\def\supereject{\par\penalty -20000\footnoteno =0 } + +% @footnotestyle is meaningful for info output only. +\let\footnotestyle=\comment + +\let\ptexfootnote=\footnote + +{\catcode `\@=11 +% +% Auto-number footnotes. Otherwise like plain. +\gdef\footnote{% + \global\advance\footnoteno by \@ne + \edef\thisfootno{$^{\the\footnoteno}$}% + % + % In case the footnote comes at the end of a sentence, preserve the + % extra spacing after we do the footnote number. + \let\@sf\empty + \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi + % + % Remove inadvertent blank space before typesetting the footnote number. + \unskip + \thisfootno\@sf + \dofootnote +}% + +% Don't bother with the trickery in plain.tex to not require the +% footnote text as a parameter. Our footnotes don't need to be so general. +% +% Oh yes, they do; otherwise, @ifset and anything else that uses +% \parseargline fail inside footnotes because the tokens are fixed when +% the footnote is read. --karl, 16nov96. +% +% The start of the footnote looks usually like this: +\gdef\startfootins{\insert\footins\bgroup} +% +% ... but this macro is redefined inside @multitable. +% +\gdef\dofootnote{% + \startfootins + % We want to typeset this text as a normal paragraph, even if the + % footnote reference occurs in (for example) a display environment. + % So reset some parameters. + \hsize=\pagewidth + \interlinepenalty\interfootnotelinepenalty + \splittopskip\ht\strutbox % top baseline for broken footnotes + \splitmaxdepth\dp\strutbox + \floatingpenalty\@MM + \leftskip\z@skip + \rightskip\z@skip + \spaceskip\z@skip + \xspaceskip\z@skip + \parindent\defaultparindent + % + \smallfonts \rm + % + % Because we use hanging indentation in footnotes, a @noindent appears + % to exdent this text, so make it be a no-op. makeinfo does not use + % hanging indentation so @noindent can still be needed within footnote + % text after an @example or the like (not that this is good style). + \let\noindent = \relax + % + % Hang the footnote text off the number. Use \everypar in case the + % footnote extends for more than one paragraph. + \everypar = {\hang}% + \textindent{\thisfootno}% + % + % Don't crash into the line above the footnote text. Since this + % expands into a box, it must come within the paragraph, lest it + % provide a place where TeX can split the footnote. + \footstrut + \futurelet\next\fo@t +} +}%end \catcode `\@=11 + +% @| inserts a changebar to the left of the current line. It should +% surround any changed text. This approach does *not* work if the +% change spans more than two lines of output. To handle that, we would +% have adopt a much more difficult approach (putting marks into the main +% vertical list for the beginning and end of each change). +% +\def\|{% + % \vadjust can only be used in horizontal mode. + \leavevmode + % + % Append this vertical mode material after the current line in the output. + \vadjust{% + % We want to insert a rule with the height and depth of the current + % leading; that is exactly what \strutbox is supposed to record. + \vskip-\baselineskip + % + % \vadjust-items are inserted at the left edge of the type. So + % the \llap here moves out into the left-hand margin. + \llap{% + % + % For a thicker or thinner bar, change the `1pt'. + \vrule height\baselineskip width1pt + % + % This is the space between the bar and the text. + \hskip 12pt + }% + }% +} + +% For a final copy, take out the rectangles +% that mark overfull boxes (in case you have decided +% that the text looks ok even though it passes the margin). +% +\def\finalout{\overfullrule=0pt} + +% @image. We use the macros from epsf.tex to support this. +% If epsf.tex is not installed and @image is used, we complain. +% +% Check for and read epsf.tex up front. If we read it only at @image +% time, we might be inside a group, and then its definitions would get +% undone and the next image would fail. +\openin 1 = epsf.tex +\ifeof 1 \else + \closein 1 + % Do not bother showing banner with epsf.tex v2.7k (available in + % doc/epsf.tex and on ctan). + \def\epsfannounce{\toks0 = }% + \input epsf.tex +\fi +% +% We will only complain once about lack of epsf.tex. +\newif\ifwarnednoepsf +\newhelp\noepsfhelp{epsf.tex must be installed for images to + work. It is also included in the Texinfo distribution, or you can get + it from ftp://tug.org/tex/epsf.tex.} +% +\def\image#1{% + \ifx\epsfbox\undefined + \ifwarnednoepsf \else + \errhelp = \noepsfhelp + \errmessage{epsf.tex not found, images will be ignored}% + \global\warnednoepsftrue + \fi + \else + \imagexxx #1,,,,,\finish + \fi +} +% +% Arguments to @image: +% #1 is (mandatory) image filename; we tack on .eps extension. +% #2 is (optional) width, #3 is (optional) height. +% #4 is (ignored optional) html alt text. +% #5 is (ignored optional) extension. +% #6 is just the usual extra ignored arg for parsing this stuff. +\newif\ifimagevmode +\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup + \catcode`\^^M = 5 % in case we're inside an example + \normalturnoffactive % allow _ et al. in names + % If the image is by itself, center it. + \ifvmode + \imagevmodetrue + \nobreak\bigskip + % Usually we'll have text after the image which will insert + % \parskip glue, so insert it here too to equalize the space + % above and below. + \nobreak\vskip\parskip + \nobreak + \line\bgroup\hss + \fi + % + % Output the image. + \ifpdf + \dopdfimage{#1}{#2}{#3}% + \else + % \epsfbox itself resets \epsf?size at each figure. + \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi + \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi + \epsfbox{#1.eps}% + \fi + % + \ifimagevmode \hss \egroup \bigbreak \fi % space after the image +\endgroup} + + +\message{localization,} +% and i18n. + +% @documentlanguage is usually given very early, just after +% @setfilename. If done too late, it may not override everything +% properly. Single argument is the language abbreviation. +% It would be nice if we could set up a hyphenation file here. +% +\def\documentlanguage{\parsearg\dodocumentlanguage} +\def\dodocumentlanguage#1{% + \tex % read txi-??.tex file in plain TeX. + % Read the file if it exists. + \openin 1 txi-#1.tex + \ifeof1 + \errhelp = \nolanghelp + \errmessage{Cannot read language file txi-#1.tex}% + \let\temp = \relax + \else + \def\temp{\input txi-#1.tex }% + \fi + \temp + \endgroup +} +\newhelp\nolanghelp{The given language definition file cannot be found or +is empty. Maybe you need to install it? In the current directory +should work if nowhere else does.} + + +% @documentencoding should change something in TeX eventually, most +% likely, but for now just recognize it. +\let\documentencoding = \comment + + +% Page size parameters. +% +\newdimen\defaultparindent \defaultparindent = 15pt + +\chapheadingskip = 15pt plus 4pt minus 2pt +\secheadingskip = 12pt plus 3pt minus 2pt +\subsecheadingskip = 9pt plus 2pt minus 2pt + +% Prevent underfull vbox error messages. +\vbadness = 10000 + +% Don't be so finicky about underfull hboxes, either. +\hbadness = 2000 + +% Following George Bush, just get rid of widows and orphans. +\widowpenalty=10000 +\clubpenalty=10000 + +% Use TeX 3.0's \emergencystretch to help line breaking, but if we're +% using an old version of TeX, don't do anything. We want the amount of +% stretch added to depend on the line length, hence the dependence on +% \hsize. We call this whenever the paper size is set. +% +\def\setemergencystretch{% + \ifx\emergencystretch\thisisundefined + % Allow us to assign to \emergencystretch anyway. + \def\emergencystretch{\dimen0}% + \else + \emergencystretch = .15\hsize + \fi +} + +% Parameters in order: 1) textheight; 2) textwidth; 3) voffset; +% 4) hoffset; 5) binding offset; 6) topskip; 7) physical page height; 8) +% physical page width. +% +% We also call \setleading{\textleading}, so the caller should define +% \textleading. The caller should also set \parskip. +% +\def\internalpagesizes#1#2#3#4#5#6#7#8{% + \voffset = #3\relax + \topskip = #6\relax + \splittopskip = \topskip + % + \vsize = #1\relax + \advance\vsize by \topskip + \outervsize = \vsize + \advance\outervsize by 2\topandbottommargin + \pageheight = \vsize + % + \hsize = #2\relax + \outerhsize = \hsize + \advance\outerhsize by 0.5in + \pagewidth = \hsize + % + \normaloffset = #4\relax + \bindingoffset = #5\relax + % + \ifpdf + \pdfpageheight #7\relax + \pdfpagewidth #8\relax + \fi + % + \setleading{\textleading} + % + \parindent = \defaultparindent + \setemergencystretch +} + +% @letterpaper (the default). +\def\letterpaper{{\globaldefs = 1 + \parskip = 3pt plus 2pt minus 1pt + \textleading = 13.2pt + % + % If page is nothing but text, make it come out even. + \internalpagesizes{46\baselineskip}{6in}% + {\voffset}{.25in}% + {\bindingoffset}{36pt}% + {11in}{8.5in}% +}} + +% Use @smallbook to reset parameters for 7x9.5 (or so) format. +\def\smallbook{{\globaldefs = 1 + \parskip = 2pt plus 1pt + \textleading = 12pt + % + \internalpagesizes{7.5in}{5in}% + {\voffset}{.25in}% + {\bindingoffset}{16pt}% + {9.25in}{7in}% + % + \lispnarrowing = 0.3in + \tolerance = 700 + \hfuzz = 1pt + \contentsrightmargin = 0pt + \defbodyindent = .5cm +}} + +% Use @afourpaper to print on European A4 paper. +\def\afourpaper{{\globaldefs = 1 + \parskip = 3pt plus 2pt minus 1pt + \textleading = 13.2pt + % + % Double-side printing via postscript on Laserjet 4050 + % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm. + % To change the settings for a different printer or situation, adjust + % \normaloffset until the front-side and back-side texts align. Then + % do the same for \bindingoffset. You can set these for testing in + % your texinfo source file like this: + % @tex + % \global\normaloffset = -6mm + % \global\bindingoffset = 10mm + % @end tex + \internalpagesizes{51\baselineskip}{160mm} + {\voffset}{\hoffset}% + {\bindingoffset}{44pt}% + {297mm}{210mm}% + % + \tolerance = 700 + \hfuzz = 1pt + \contentsrightmargin = 0pt + \defbodyindent = 5mm +}} + +% Use @afivepaper to print on European A5 paper. +% From romildo@urano.iceb.ufop.br, 2 July 2000. +% He also recommends making @example and @lisp be small. +\def\afivepaper{{\globaldefs = 1 + \parskip = 2pt plus 1pt minus 0.1pt + \textleading = 12.5pt + % + \internalpagesizes{160mm}{120mm}% + {\voffset}{\hoffset}% + {\bindingoffset}{8pt}% + {210mm}{148mm}% + % + \lispnarrowing = 0.2in + \tolerance = 800 + \hfuzz = 1.2pt + \contentsrightmargin = 0pt + \defbodyindent = 2mm + \tableindent = 12mm +}} + +% A specific text layout, 24x15cm overall, intended for A4 paper. +\def\afourlatex{{\globaldefs = 1 + \afourpaper + \internalpagesizes{237mm}{150mm}% + {\voffset}{4.6mm}% + {\bindingoffset}{7mm}% + {297mm}{210mm}% + % + % Must explicitly reset to 0 because we call \afourpaper. + \globaldefs = 0 +}} + +% Use @afourwide to print on A4 paper in landscape format. +\def\afourwide{{\globaldefs = 1 + \afourpaper + \internalpagesizes{241mm}{165mm}% + {\voffset}{-2.95mm}% + {\bindingoffset}{7mm}% + {297mm}{210mm}% + \globaldefs = 0 +}} + +% @pagesizes TEXTHEIGHT[,TEXTWIDTH] +% Perhaps we should allow setting the margins, \topskip, \parskip, +% and/or leading, also. Or perhaps we should compute them somehow. +% +\def\pagesizes{\parsearg\pagesizesxxx} +\def\pagesizesxxx#1{\pagesizesyyy #1,,\finish} +\def\pagesizesyyy#1,#2,#3\finish{{% + \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi + \globaldefs = 1 + % + \parskip = 3pt plus 2pt minus 1pt + \setleading{\textleading}% + % + \dimen0 = #1 + \advance\dimen0 by \voffset + % + \dimen2 = \hsize + \advance\dimen2 by \normaloffset + % + \internalpagesizes{#1}{\hsize}% + {\voffset}{\normaloffset}% + {\bindingoffset}{44pt}% + {\dimen0}{\dimen2}% +}} + +% Set default to letter. +% +\letterpaper + + +\message{and turning on texinfo input format.} + +% Define macros to output various characters with catcode for normal text. +\catcode`\"=\other +\catcode`\~=\other +\catcode`\^=\other +\catcode`\_=\other +\catcode`\|=\other +\catcode`\<=\other +\catcode`\>=\other +\catcode`\+=\other +\catcode`\$=\other +\def\normaldoublequote{"} +\def\normaltilde{~} +\def\normalcaret{^} +\def\normalunderscore{_} +\def\normalverticalbar{|} +\def\normalless{<} +\def\normalgreater{>} +\def\normalplus{+} +\def\normaldollar{$}%$ font-lock fix + +% This macro is used to make a character print one way in ttfont +% where it can probably just be output, and another way in other fonts, +% where something hairier probably needs to be done. +% +% #1 is what to print if we are indeed using \tt; #2 is what to print +% otherwise. Since all the Computer Modern typewriter fonts have zero +% interword stretch (and shrink), and it is reasonable to expect all +% typewriter fonts to have this, we can check that font parameter. +% +\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} + +% Same as above, but check for italic font. Actually this also catches +% non-italic slanted fonts since it is impossible to distinguish them from +% italic fonts. But since this is only used by $ and it uses \sl anyway +% this is not a problem. +\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} + +% Turn off all special characters except @ +% (and those which the user can use as if they were ordinary). +% Most of these we simply print from the \tt font, but for some, we can +% use math or other variants that look better in normal text. + +\catcode`\"=\active +\def\activedoublequote{{\tt\char34}} +\let"=\activedoublequote +\catcode`\~=\active +\def~{{\tt\char126}} +\chardef\hat=`\^ +\catcode`\^=\active +\def^{{\tt \hat}} + +\catcode`\_=\active +\def_{\ifusingtt\normalunderscore\_} +% Subroutine for the previous macro. +\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } + +\catcode`\|=\active +\def|{{\tt\char124}} +\chardef \less=`\< +\catcode`\<=\active +\def<{{\tt \less}} +\chardef \gtr=`\> +\catcode`\>=\active +\def>{{\tt \gtr}} +\catcode`\+=\active +\def+{{\tt \char 43}} +\catcode`\$=\active +\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix + +% Set up an active definition for =, but don't enable it most of the time. +{\catcode`\==\active +\global\def={{\tt \char 61}}} + +\catcode`+=\active +\catcode`\_=\active + +% If a .fmt file is being used, characters that might appear in a file +% name cannot be active until we have parsed the command line. +% So turn them off again, and have \everyjob (or @setfilename) turn them on. +% \otherifyactive is called near the end of this file. +\def\otherifyactive{\catcode`+=\other \catcode`\_=\other} + +\catcode`\@=0 + +% \rawbackslashxx outputs one backslash character in current font, +% as in \char`\\. +\global\chardef\rawbackslashxx=`\\ + +% \rawbackslash defines an active \ to do \rawbackslashxx. +% \otherbackslash defines an active \ to be a literal `\' character with +% catcode other. +{\catcode`\\=\active + @gdef@rawbackslash{@let\=@rawbackslashxx} + @gdef@otherbackslash{@let\=@realbackslash} +} + +% \realbackslash is an actual character `\' with catcode other. +{\catcode`\\=\other @gdef@realbackslash{\}} + +% \normalbackslash outputs one backslash in fixed width font. +\def\normalbackslash{{\tt\rawbackslashxx}} + +\catcode`\\=\active + +% Used sometimes to turn off (effectively) the active characters +% even after parsing them. +@def@turnoffactive{% + @let"=@normaldoublequote + @let\=@realbackslash + @let~=@normaltilde + @let^=@normalcaret + @let_=@normalunderscore + @let|=@normalverticalbar + @let<=@normalless + @let>=@normalgreater + @let+=@normalplus + @let$=@normaldollar %$ font-lock fix +} + +% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of +% the literal character `\'. (Thus, \ is not expandable when this is in +% effect.) +% +@def@normalturnoffactive{@turnoffactive @let\=@normalbackslash} + +% Make _ and + \other characters, temporarily. +% This is canceled by @fixbackslash. +@otherifyactive + +% If a .fmt file is being used, we don't want the `\input texinfo' to show up. +% That is what \eatinput is for; after that, the `\' should revert to printing +% a backslash. +% +@gdef@eatinput input texinfo{@fixbackslash} +@global@let\ = @eatinput + +% On the other hand, perhaps the file did not have a `\input texinfo'. Then +% the first `\{ in the file would cause an error. This macro tries to fix +% that, assuming it is called before the first `\' could plausibly occur. +% Also back turn on active characters that might appear in the input +% file name, in case not using a pre-dumped format. +% +@gdef@fixbackslash{% + @ifx\@eatinput @let\ = @normalbackslash @fi + @catcode`+=@active + @catcode`@_=@active +} + +% Say @foo, not \foo, in error messages. +@escapechar = `@@ + +% These look ok in all fonts, so just make them not special. +@catcode`@& = @other +@catcode`@# = @other +@catcode`@% = @other + +@c Set initial fonts. +@textfonts +@rm + + +@c Local variables: +@c eval: (add-hook 'write-file-hooks 'time-stamp) +@c page-delimiter: "^\\\\message" +@c time-stamp-start: "def\\\\texinfoversion{" +@c time-stamp-format: "%:y-%02m-%02d.%02H" +@c time-stamp-end: "}" +@c End: diff --git a/vendors/readline/src/readline/doc/version.texi b/vendors/readline/src/readline/doc/version.texi new file mode 100644 index 0000000..0beb276 --- /dev/null +++ b/vendors/readline/src/readline/doc/version.texi @@ -0,0 +1,10 @@ +@ignore +Copyright (C) 1988-2004 Free Software Foundation, Inc. +@end ignore + +@set EDITION 5.0 +@set VERSION 5.0 +@set UPDATED 28 January 2004 +@set UPDATED-MONTH January 2004 + +@set LASTCHANGE Wed Jan 28 15:46:54 EST 2004 diff --git a/vendors/readline/src/readline/emacs_keymap.c b/vendors/readline/src/readline/emacs_keymap.c new file mode 100644 index 0000000..ca9d134 --- /dev/null +++ b/vendors/readline/src/readline/emacs_keymap.c @@ -0,0 +1,873 @@ +/* emacs_keymap.c -- the keymap for emacs_mode in readline (). */ + +/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library, a library for + reading lines of text with interactive input and history editing. + + The GNU Readline Library is free software; you can redistribute it + and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2, or + (at your option) any later version. + + The GNU Readline 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 General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + +#if !defined (BUFSIZ) +#include +#endif /* !BUFSIZ */ + +#include "readline.h" + +/* An array of function pointers, one for each possible key. + If the type byte is ISKMAP, then the pointer is the address of + a keymap. */ + +KEYMAP_ENTRY_ARRAY emacs_standard_keymap = { + + /* Control keys. */ + { ISFUNC, rl_set_mark }, /* Control-@ */ + { ISFUNC, rl_beg_of_line }, /* Control-a */ + { ISFUNC, rl_backward_char }, /* Control-b */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-c */ + { ISFUNC, rl_delete }, /* Control-d */ + { ISFUNC, rl_end_of_line }, /* Control-e */ + { ISFUNC, rl_forward_char }, /* Control-f */ + { ISFUNC, rl_abort }, /* Control-g */ + { ISFUNC, rl_rubout }, /* Control-h */ + { ISFUNC, rl_complete }, /* Control-i */ + { ISFUNC, rl_newline }, /* Control-j */ + { ISFUNC, rl_kill_line }, /* Control-k */ + { ISFUNC, rl_clear_screen }, /* Control-l */ + { ISFUNC, rl_newline }, /* Control-m */ + { ISFUNC, rl_get_next_history }, /* Control-n */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-o */ + { ISFUNC, rl_get_previous_history }, /* Control-p */ + { ISFUNC, rl_quoted_insert }, /* Control-q */ + { ISFUNC, rl_reverse_search_history }, /* Control-r */ + { ISFUNC, rl_forward_search_history }, /* Control-s */ + { ISFUNC, rl_transpose_chars }, /* Control-t */ + { ISFUNC, rl_unix_line_discard }, /* Control-u */ + { ISFUNC, rl_quoted_insert }, /* Control-v */ + { ISFUNC, rl_unix_word_rubout }, /* Control-w */ + { ISKMAP, (rl_command_func_t *)emacs_ctlx_keymap }, /* Control-x */ + { ISFUNC, rl_yank }, /* Control-y */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-z */ + { ISKMAP, (rl_command_func_t *)emacs_meta_keymap }, /* Control-[ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-\ */ + { ISFUNC, rl_char_search }, /* Control-] */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-^ */ + { ISFUNC, rl_undo_command }, /* Control-_ */ + + /* The start of printing characters. */ + { ISFUNC, rl_insert }, /* SPACE */ + { ISFUNC, rl_insert }, /* ! */ + { ISFUNC, rl_insert }, /* " */ + { ISFUNC, rl_insert }, /* # */ + { ISFUNC, rl_insert }, /* $ */ + { ISFUNC, rl_insert }, /* % */ + { ISFUNC, rl_insert }, /* & */ + { ISFUNC, rl_insert }, /* ' */ + { ISFUNC, rl_insert }, /* ( */ + { ISFUNC, rl_insert }, /* ) */ + { ISFUNC, rl_insert }, /* * */ + { ISFUNC, rl_insert }, /* + */ + { ISFUNC, rl_insert }, /* , */ + { ISFUNC, rl_insert }, /* - */ + { ISFUNC, rl_insert }, /* . */ + { ISFUNC, rl_insert }, /* / */ + + /* Regular digits. */ + { ISFUNC, rl_insert }, /* 0 */ + { ISFUNC, rl_insert }, /* 1 */ + { ISFUNC, rl_insert }, /* 2 */ + { ISFUNC, rl_insert }, /* 3 */ + { ISFUNC, rl_insert }, /* 4 */ + { ISFUNC, rl_insert }, /* 5 */ + { ISFUNC, rl_insert }, /* 6 */ + { ISFUNC, rl_insert }, /* 7 */ + { ISFUNC, rl_insert }, /* 8 */ + { ISFUNC, rl_insert }, /* 9 */ + + /* A little more punctuation. */ + { ISFUNC, rl_insert }, /* : */ + { ISFUNC, rl_insert }, /* ; */ + { ISFUNC, rl_insert }, /* < */ + { ISFUNC, rl_insert }, /* = */ + { ISFUNC, rl_insert }, /* > */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* @ */ + + /* Uppercase alphabet. */ + { ISFUNC, rl_insert }, /* A */ + { ISFUNC, rl_insert }, /* B */ + { ISFUNC, rl_insert }, /* C */ + { ISFUNC, rl_insert }, /* D */ + { ISFUNC, rl_insert }, /* E */ + { ISFUNC, rl_insert }, /* F */ + { ISFUNC, rl_insert }, /* G */ + { ISFUNC, rl_insert }, /* H */ + { ISFUNC, rl_insert }, /* I */ + { ISFUNC, rl_insert }, /* J */ + { ISFUNC, rl_insert }, /* K */ + { ISFUNC, rl_insert }, /* L */ + { ISFUNC, rl_insert }, /* M */ + { ISFUNC, rl_insert }, /* N */ + { ISFUNC, rl_insert }, /* O */ + { ISFUNC, rl_insert }, /* P */ + { ISFUNC, rl_insert }, /* Q */ + { ISFUNC, rl_insert }, /* R */ + { ISFUNC, rl_insert }, /* S */ + { ISFUNC, rl_insert }, /* T */ + { ISFUNC, rl_insert }, /* U */ + { ISFUNC, rl_insert }, /* V */ + { ISFUNC, rl_insert }, /* W */ + { ISFUNC, rl_insert }, /* X */ + { ISFUNC, rl_insert }, /* Y */ + { ISFUNC, rl_insert }, /* Z */ + + /* Some more punctuation. */ + { ISFUNC, rl_insert }, /* [ */ + { ISFUNC, rl_insert }, /* \ */ + { ISFUNC, rl_insert }, /* ] */ + { ISFUNC, rl_insert }, /* ^ */ + { ISFUNC, rl_insert }, /* _ */ + { ISFUNC, rl_insert }, /* ` */ + + /* Lowercase alphabet. */ + { ISFUNC, rl_insert }, /* a */ + { ISFUNC, rl_insert }, /* b */ + { ISFUNC, rl_insert }, /* c */ + { ISFUNC, rl_insert }, /* d */ + { ISFUNC, rl_insert }, /* e */ + { ISFUNC, rl_insert }, /* f */ + { ISFUNC, rl_insert }, /* g */ + { ISFUNC, rl_insert }, /* h */ + { ISFUNC, rl_insert }, /* i */ + { ISFUNC, rl_insert }, /* j */ + { ISFUNC, rl_insert }, /* k */ + { ISFUNC, rl_insert }, /* l */ + { ISFUNC, rl_insert }, /* m */ + { ISFUNC, rl_insert }, /* n */ + { ISFUNC, rl_insert }, /* o */ + { ISFUNC, rl_insert }, /* p */ + { ISFUNC, rl_insert }, /* q */ + { ISFUNC, rl_insert }, /* r */ + { ISFUNC, rl_insert }, /* s */ + { ISFUNC, rl_insert }, /* t */ + { ISFUNC, rl_insert }, /* u */ + { ISFUNC, rl_insert }, /* v */ + { ISFUNC, rl_insert }, /* w */ + { ISFUNC, rl_insert }, /* x */ + { ISFUNC, rl_insert }, /* y */ + { ISFUNC, rl_insert }, /* z */ + + /* Final punctuation. */ + { ISFUNC, rl_insert }, /* { */ + { ISFUNC, rl_insert }, /* | */ + { ISFUNC, rl_insert }, /* } */ + { ISFUNC, rl_insert }, /* ~ */ + { ISFUNC, rl_rubout }, /* RUBOUT */ + +#if KEYMAP_SIZE > 128 + /* Pure 8-bit characters (128 - 159). + These might be used in some + character sets. */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + + /* ISO Latin-1 characters (160 - 255) */ + { ISFUNC, rl_insert }, /* No-break space */ + { ISFUNC, rl_insert }, /* Inverted exclamation mark */ + { ISFUNC, rl_insert }, /* Cent sign */ + { ISFUNC, rl_insert }, /* Pound sign */ + { ISFUNC, rl_insert }, /* Currency sign */ + { ISFUNC, rl_insert }, /* Yen sign */ + { ISFUNC, rl_insert }, /* Broken bar */ + { ISFUNC, rl_insert }, /* Section sign */ + { ISFUNC, rl_insert }, /* Diaeresis */ + { ISFUNC, rl_insert }, /* Copyright sign */ + { ISFUNC, rl_insert }, /* Feminine ordinal indicator */ + { ISFUNC, rl_insert }, /* Left pointing double angle quotation mark */ + { ISFUNC, rl_insert }, /* Not sign */ + { ISFUNC, rl_insert }, /* Soft hyphen */ + { ISFUNC, rl_insert }, /* Registered sign */ + { ISFUNC, rl_insert }, /* Macron */ + { ISFUNC, rl_insert }, /* Degree sign */ + { ISFUNC, rl_insert }, /* Plus-minus sign */ + { ISFUNC, rl_insert }, /* Superscript two */ + { ISFUNC, rl_insert }, /* Superscript three */ + { ISFUNC, rl_insert }, /* Acute accent */ + { ISFUNC, rl_insert }, /* Micro sign */ + { ISFUNC, rl_insert }, /* Pilcrow sign */ + { ISFUNC, rl_insert }, /* Middle dot */ + { ISFUNC, rl_insert }, /* Cedilla */ + { ISFUNC, rl_insert }, /* Superscript one */ + { ISFUNC, rl_insert }, /* Masculine ordinal indicator */ + { ISFUNC, rl_insert }, /* Right pointing double angle quotation mark */ + { ISFUNC, rl_insert }, /* Vulgar fraction one quarter */ + { ISFUNC, rl_insert }, /* Vulgar fraction one half */ + { ISFUNC, rl_insert }, /* Vulgar fraction three quarters */ + { ISFUNC, rl_insert }, /* Inverted questionk mark */ + { ISFUNC, rl_insert }, /* Latin capital letter a with grave */ + { ISFUNC, rl_insert }, /* Latin capital letter a with acute */ + { ISFUNC, rl_insert }, /* Latin capital letter a with circumflex */ + { ISFUNC, rl_insert }, /* Latin capital letter a with tilde */ + { ISFUNC, rl_insert }, /* Latin capital letter a with diaeresis */ + { ISFUNC, rl_insert }, /* Latin capital letter a with ring above */ + { ISFUNC, rl_insert }, /* Latin capital letter ae */ + { ISFUNC, rl_insert }, /* Latin capital letter c with cedilla */ + { ISFUNC, rl_insert }, /* Latin capital letter e with grave */ + { ISFUNC, rl_insert }, /* Latin capital letter e with acute */ + { ISFUNC, rl_insert }, /* Latin capital letter e with circumflex */ + { ISFUNC, rl_insert }, /* Latin capital letter e with diaeresis */ + { ISFUNC, rl_insert }, /* Latin capital letter i with grave */ + { ISFUNC, rl_insert }, /* Latin capital letter i with acute */ + { ISFUNC, rl_insert }, /* Latin capital letter i with circumflex */ + { ISFUNC, rl_insert }, /* Latin capital letter i with diaeresis */ + { ISFUNC, rl_insert }, /* Latin capital letter eth (Icelandic) */ + { ISFUNC, rl_insert }, /* Latin capital letter n with tilde */ + { ISFUNC, rl_insert }, /* Latin capital letter o with grave */ + { ISFUNC, rl_insert }, /* Latin capital letter o with acute */ + { ISFUNC, rl_insert }, /* Latin capital letter o with circumflex */ + { ISFUNC, rl_insert }, /* Latin capital letter o with tilde */ + { ISFUNC, rl_insert }, /* Latin capital letter o with diaeresis */ + { ISFUNC, rl_insert }, /* Multiplication sign */ + { ISFUNC, rl_insert }, /* Latin capital letter o with stroke */ + { ISFUNC, rl_insert }, /* Latin capital letter u with grave */ + { ISFUNC, rl_insert }, /* Latin capital letter u with acute */ + { ISFUNC, rl_insert }, /* Latin capital letter u with circumflex */ + { ISFUNC, rl_insert }, /* Latin capital letter u with diaeresis */ + { ISFUNC, rl_insert }, /* Latin capital letter Y with acute */ + { ISFUNC, rl_insert }, /* Latin capital letter thorn (Icelandic) */ + { ISFUNC, rl_insert }, /* Latin small letter sharp s (German) */ + { ISFUNC, rl_insert }, /* Latin small letter a with grave */ + { ISFUNC, rl_insert }, /* Latin small letter a with acute */ + { ISFUNC, rl_insert }, /* Latin small letter a with circumflex */ + { ISFUNC, rl_insert }, /* Latin small letter a with tilde */ + { ISFUNC, rl_insert }, /* Latin small letter a with diaeresis */ + { ISFUNC, rl_insert }, /* Latin small letter a with ring above */ + { ISFUNC, rl_insert }, /* Latin small letter ae */ + { ISFUNC, rl_insert }, /* Latin small letter c with cedilla */ + { ISFUNC, rl_insert }, /* Latin small letter e with grave */ + { ISFUNC, rl_insert }, /* Latin small letter e with acute */ + { ISFUNC, rl_insert }, /* Latin small letter e with circumflex */ + { ISFUNC, rl_insert }, /* Latin small letter e with diaeresis */ + { ISFUNC, rl_insert }, /* Latin small letter i with grave */ + { ISFUNC, rl_insert }, /* Latin small letter i with acute */ + { ISFUNC, rl_insert }, /* Latin small letter i with circumflex */ + { ISFUNC, rl_insert }, /* Latin small letter i with diaeresis */ + { ISFUNC, rl_insert }, /* Latin small letter eth (Icelandic) */ + { ISFUNC, rl_insert }, /* Latin small letter n with tilde */ + { ISFUNC, rl_insert }, /* Latin small letter o with grave */ + { ISFUNC, rl_insert }, /* Latin small letter o with acute */ + { ISFUNC, rl_insert }, /* Latin small letter o with circumflex */ + { ISFUNC, rl_insert }, /* Latin small letter o with tilde */ + { ISFUNC, rl_insert }, /* Latin small letter o with diaeresis */ + { ISFUNC, rl_insert }, /* Division sign */ + { ISFUNC, rl_insert }, /* Latin small letter o with stroke */ + { ISFUNC, rl_insert }, /* Latin small letter u with grave */ + { ISFUNC, rl_insert }, /* Latin small letter u with acute */ + { ISFUNC, rl_insert }, /* Latin small letter u with circumflex */ + { ISFUNC, rl_insert }, /* Latin small letter u with diaeresis */ + { ISFUNC, rl_insert }, /* Latin small letter y with acute */ + { ISFUNC, rl_insert }, /* Latin small letter thorn (Icelandic) */ + { ISFUNC, rl_insert } /* Latin small letter y with diaeresis */ +#endif /* KEYMAP_SIZE > 128 */ +}; + +KEYMAP_ENTRY_ARRAY emacs_meta_keymap = { + + /* Meta keys. Just like above, but the high bit is set. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-@ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-a */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-b */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-c */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-d */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-e */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-f */ + { ISFUNC, rl_abort }, /* Meta-Control-g */ + { ISFUNC, rl_backward_kill_word }, /* Meta-Control-h */ + { ISFUNC, rl_tab_insert }, /* Meta-Control-i */ + { ISFUNC, rl_vi_editing_mode }, /* Meta-Control-j */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-k */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-l */ + { ISFUNC, rl_vi_editing_mode }, /* Meta-Control-m */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-n */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-o */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-p */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-q */ + { ISFUNC, rl_revert_line }, /* Meta-Control-r */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-s */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-t */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-u */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-v */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-w */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-x */ + { ISFUNC, rl_yank_nth_arg }, /* Meta-Control-y */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-z */ + + { ISFUNC, rl_complete }, /* Meta-Control-[ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-\ */ + { ISFUNC, rl_backward_char_search }, /* Meta-Control-] */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-^ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-Control-_ */ + + /* The start of printing characters. */ + { ISFUNC, rl_set_mark }, /* Meta-SPACE */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-! */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-" */ + { ISFUNC, rl_insert_comment }, /* Meta-# */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-$ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-% */ + { ISFUNC, rl_tilde_expand }, /* Meta-& */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-' */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-( */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-) */ + { ISFUNC, rl_insert_completions }, /* Meta-* */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-+ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-, */ + { ISFUNC, rl_digit_argument }, /* Meta-- */ + { ISFUNC, rl_yank_last_arg}, /* Meta-. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-/ */ + + /* Regular digits. */ + { ISFUNC, rl_digit_argument }, /* Meta-0 */ + { ISFUNC, rl_digit_argument }, /* Meta-1 */ + { ISFUNC, rl_digit_argument }, /* Meta-2 */ + { ISFUNC, rl_digit_argument }, /* Meta-3 */ + { ISFUNC, rl_digit_argument }, /* Meta-4 */ + { ISFUNC, rl_digit_argument }, /* Meta-5 */ + { ISFUNC, rl_digit_argument }, /* Meta-6 */ + { ISFUNC, rl_digit_argument }, /* Meta-7 */ + { ISFUNC, rl_digit_argument }, /* Meta-8 */ + { ISFUNC, rl_digit_argument }, /* Meta-9 */ + + /* A little more punctuation. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-: */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-; */ + { ISFUNC, rl_beginning_of_history }, /* Meta-< */ + { ISFUNC, rl_possible_completions }, /* Meta-= */ + { ISFUNC, rl_end_of_history }, /* Meta-> */ + { ISFUNC, rl_possible_completions }, /* Meta-? */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-@ */ + + /* Uppercase alphabet. */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-A */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-B */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-C */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-D */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-E */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-F */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-G */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-H */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-I */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-J */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-K */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-L */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-M */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-N */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-O */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-P */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-Q */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-R */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-S */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-T */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-U */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-V */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-W */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-X */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-Y */ + { ISFUNC, rl_do_lowercase_version }, /* Meta-Z */ + + /* Some more punctuation. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-[ */ /* was rl_arrow_keys */ + { ISFUNC, rl_delete_horizontal_space }, /* Meta-\ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-] */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-^ */ + { ISFUNC, rl_yank_last_arg }, /* Meta-_ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-` */ + + /* Lowercase alphabet. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-a */ + { ISFUNC, rl_backward_word }, /* Meta-b */ + { ISFUNC, rl_capitalize_word }, /* Meta-c */ + { ISFUNC, rl_kill_word }, /* Meta-d */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-e */ + { ISFUNC, rl_forward_word }, /* Meta-f */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-g */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-h */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-i */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-j */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-k */ + { ISFUNC, rl_downcase_word }, /* Meta-l */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-m */ + { ISFUNC, rl_noninc_forward_search }, /* Meta-n */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-o */ /* was rl_arrow_keys */ + { ISFUNC, rl_noninc_reverse_search }, /* Meta-p */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-q */ + { ISFUNC, rl_revert_line }, /* Meta-r */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-s */ + { ISFUNC, rl_transpose_words }, /* Meta-t */ + { ISFUNC, rl_upcase_word }, /* Meta-u */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-v */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-w */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-x */ + { ISFUNC, rl_yank_pop }, /* Meta-y */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-z */ + + /* Final punctuation. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-{ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-| */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Meta-} */ + { ISFUNC, rl_tilde_expand }, /* Meta-~ */ + { ISFUNC, rl_backward_kill_word }, /* Meta-rubout */ + +#if KEYMAP_SIZE > 128 + /* Undefined keys. */ + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 } +#endif /* KEYMAP_SIZE > 128 */ +}; + +KEYMAP_ENTRY_ARRAY emacs_ctlx_keymap = { + + /* Control keys. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-@ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-a */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-b */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-c */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-d */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-e */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-f */ + { ISFUNC, rl_abort }, /* Control-g */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-h */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-i */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-j */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-k */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-l */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-m */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-n */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-o */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-p */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-q */ + { ISFUNC, rl_re_read_init_file }, /* Control-r */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-s */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-t */ + { ISFUNC, rl_undo_command }, /* Control-u */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-v */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-w */ + { ISFUNC, rl_exchange_point_and_mark }, /* Control-x */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-y */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-z */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-[ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-\ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-] */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-^ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-_ */ + + /* The start of printing characters. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* SPACE */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ! */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* " */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* # */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* $ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* % */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* & */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ' */ + { ISFUNC, rl_start_kbd_macro }, /* ( */ + { ISFUNC, rl_end_kbd_macro }, /* ) */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* * */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* + */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* , */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* - */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* . */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* / */ + + /* Regular digits. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* 0 */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* 1 */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* 2 */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* 3 */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* 4 */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* 5 */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* 6 */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* 7 */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* 8 */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* 9 */ + + /* A little more punctuation. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* : */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ; */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* < */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* = */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* > */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ? */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* @ */ + + /* Uppercase alphabet. */ + { ISFUNC, rl_do_lowercase_version }, /* A */ + { ISFUNC, rl_do_lowercase_version }, /* B */ + { ISFUNC, rl_do_lowercase_version }, /* C */ + { ISFUNC, rl_do_lowercase_version }, /* D */ + { ISFUNC, rl_do_lowercase_version }, /* E */ + { ISFUNC, rl_do_lowercase_version }, /* F */ + { ISFUNC, rl_do_lowercase_version }, /* G */ + { ISFUNC, rl_do_lowercase_version }, /* H */ + { ISFUNC, rl_do_lowercase_version }, /* I */ + { ISFUNC, rl_do_lowercase_version }, /* J */ + { ISFUNC, rl_do_lowercase_version }, /* K */ + { ISFUNC, rl_do_lowercase_version }, /* L */ + { ISFUNC, rl_do_lowercase_version }, /* M */ + { ISFUNC, rl_do_lowercase_version }, /* N */ + { ISFUNC, rl_do_lowercase_version }, /* O */ + { ISFUNC, rl_do_lowercase_version }, /* P */ + { ISFUNC, rl_do_lowercase_version }, /* Q */ + { ISFUNC, rl_do_lowercase_version }, /* R */ + { ISFUNC, rl_do_lowercase_version }, /* S */ + { ISFUNC, rl_do_lowercase_version }, /* T */ + { ISFUNC, rl_do_lowercase_version }, /* U */ + { ISFUNC, rl_do_lowercase_version }, /* V */ + { ISFUNC, rl_do_lowercase_version }, /* W */ + { ISFUNC, rl_do_lowercase_version }, /* X */ + { ISFUNC, rl_do_lowercase_version }, /* Y */ + { ISFUNC, rl_do_lowercase_version }, /* Z */ + + /* Some more punctuation. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* [ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* \ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ] */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ^ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* _ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ` */ + + /* Lowercase alphabet. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* a */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* b */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* c */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* d */ + { ISFUNC, rl_call_last_kbd_macro }, /* e */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* f */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* g */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* h */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* i */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* j */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* k */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* l */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* m */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* n */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* o */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* p */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* q */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* r */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* s */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* t */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* u */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* v */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* w */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* x */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* y */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* z */ + + /* Final punctuation. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* { */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* | */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* } */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ~ */ + { ISFUNC, rl_backward_kill_line }, /* RUBOUT */ + +#if KEYMAP_SIZE > 128 + /* Undefined keys. */ + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 } +#endif /* KEYMAP_SIZE > 128 */ +}; diff --git a/vendors/readline/src/readline/examples/Inputrc b/vendors/readline/src/readline/examples/Inputrc new file mode 100644 index 0000000..d7fdb42 --- /dev/null +++ b/vendors/readline/src/readline/examples/Inputrc @@ -0,0 +1,81 @@ +# My ~/.inputrc file is in -*- text -*- for easy editing with Emacs. +# +# Notice the various bindings which are conditionalized depending +# on which program is running, or what terminal is active. +# + +# Copyright (C) 1989-2002 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. + +# In all programs, all terminals, make sure this is bound. +"\C-x\C-r": re-read-init-file + +# Hp terminals (and some others) have ugly default behaviour for C-h. +"\C-h": backward-delete-char +"\e\C-h": backward-kill-word +"\C-xd": dump-functions + +# In xterm windows, make the arrow keys do the right thing. +$if TERM=xterm +"\e[A": previous-history +"\e[B": next-history +"\e[C": forward-char +"\e[D": backward-char + +# alternate arrow key prefix +"\eOA": previous-history +"\eOB": next-history +"\eOC": forward-char +"\eOD": backward-char + +# Under Xterm in Bash, we bind local Function keys to do something useful. +$if Bash +"\e[11~": "Function Key 1" +"\e[12~": "Function Key 2" +"\e[13~": "Function Key 3" +"\e[14~": "Function Key 4" +"\e[15~": "Function Key 5" + +# I know the following escape sequence numbers are 1 greater than +# the function key. Don't ask me why, I didn't design the xterm terminal. +"\e[17~": "Function Key 6" +"\e[18~": "Function Key 7" +"\e[19~": "Function Key 8" +"\e[20~": "Function Key 9" +"\e[21~": "Function Key 10" +$endif +$endif + +# For Bash, all terminals, add some Bash specific hacks. +$if Bash +"\C-xv": show-bash-version +"\C-x\C-e": shell-expand-line + +# Here is one for editing my path. +"\C-xp": "$PATH\C-x\C-e\C-e\"\C-aPATH=\":\C-b" + +# Make C-x r read my mail in emacs. +# "\C-xr": "emacs -f rmail\C-j" +$endif + +# For FTP, different hacks: +$if Ftp +"\C-xg": "get \M-?" +"\C-xt": "put \M-?" +"\M-.": yank-last-arg +$endif + +" ": self-insert diff --git a/vendors/readline/src/readline/examples/Makefile.in b/vendors/readline/src/readline/examples/Makefile.in new file mode 100644 index 0000000..f1b2434 --- /dev/null +++ b/vendors/readline/src/readline/examples/Makefile.in @@ -0,0 +1,104 @@ +# +# This is the Makefile for the readline examples subdirectory. +# +# Copyright (C) 1994 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. +RL_LIBRARY_VERSION = @LIBVERSION@ + +SHELL = @MAKE_SHELL@ +RM = rm -f + +srcdir = @srcdir@ +VPATH = .:@srcdir@ +top_srcdir = @top_srcdir@ +BUILD_DIR = . + +# Support an alternate destination root directory for package building +DESTDIR = + +DEFS = @DEFS@ +CC = @CC@ +CFLAGS = @CFLAGS@ +LOCAL_CFLAGS = @LOCAL_CFLAGS@ -DREADLINE_LIBRARY -DRL_LIBRARY_VERSION='"$(RL_LIBRARY_VERSION)"' +CPPFLAGS = @CPPFLAGS@ + +INCLUDES = -I$(srcdir) -I$(top_srcdir) -I.. + +CCFLAGS = $(DEFS) $(LOCAL_CFLAGS) $(CPPFLAGS) $(INCLUDES) $(CFLAGS) +LDFLAGS = -g -L.. @LDFLAGS@ + +READLINE_LIB = ../libreadline.a +HISTORY_LIB = ../libhistory.a + +TERMCAP_LIB = @TERMCAP_LIB@ + +.c.o: + ${RM} $@ + $(CC) $(CCFLAGS) -c $< + +EXECUTABLES = fileman rltest rl rlcat rlversion histexamp +OBJECTS = fileman.o rltest.o rl.o rlcat.o rlversion.o histexamp.o + +all: $(EXECUTABLES) +everything: all rlfe + +rl: rl.o $(READLINE_LIB) + $(CC) $(LDFLAGS) -o $@ rl.o -lreadline $(TERMCAP_LIB) + +rlcat: rlcat.o $(READLINE_LIB) + $(CC) $(LDFLAGS) -o $@ rlcat.o -lreadline $(TERMCAP_LIB) + +fileman: fileman.o $(READLINE_LIB) + $(CC) $(LDFLAGS) -o $@ fileman.o -lreadline $(TERMCAP_LIB) + +rltest: rltest.o $(READLINE_LIB) + $(CC) $(LDFLAGS) -o $@ rltest.o -lreadline $(TERMCAP_LIB) + +rlversion: rlversion.o $(READLINE_LIB) + $(CC) $(LDFLAGS) -o $@ rlversion.o -lreadline $(TERMCAP_LIB) + +histexamp: histexamp.o $(HISTORY_LIB) + $(CC) $(LDFLAGS) -o $@ histexamp.o -lhistory $(TERMCAP_LIB) + +clean mostlyclean: + $(RM) $(OBJECTS) + $(RM) $(EXECUTABLES) *.exe + $(RM) rlfe.o rlfe + +distclean maintainer-clean: clean + $(RM) Makefile + +fileman.o: fileman.c +rltest.o: rltest.c +rl.o: rl.c +rlversion.o: rlversion.c +histexamp.o: histexamp.c + +fileman.o: $(top_srcdir)/readline.h +rltest.o: $(top_srcdir)/readline.h +rl.o: $(top_srcdir)/readline.h +rlversion.o: $(top_srcdir)/readline.h +histexamp.o: $(top_srcdir)/history.h + +# Stuff for Per Bothner's `rlfe' program + +rlfe: rlfe.o $(READLINE_LIB) $(HISTORY_LIB) + $(CC) $(LDFLAGS) -o $@ rlfe.o -lreadline -lhistory ${TERMCAP_LIB} + +rlfe.o: rlfe.c + +rlfe.o: $(top_srcdir)/readline.h +rlfe.o: $(top_srcdir)/history.h diff --git a/vendors/readline/src/readline/examples/excallback.c b/vendors/readline/src/readline/examples/excallback.c new file mode 100644 index 0000000..3d4bb18 --- /dev/null +++ b/vendors/readline/src/readline/examples/excallback.c @@ -0,0 +1,188 @@ +/* +From: Jeff Solomon +Date: Fri, 9 Apr 1999 10:13:27 -0700 (PDT) +To: chet@po.cwru.edu +Subject: new readline example +Message-ID: <14094.12094.527305.199695@mrclean.Stanford.EDU> + +Chet, + +I've been using readline 4.0. Specifically, I've been using the perl +version Term::ReadLine::Gnu. It works great. + +Anyway, I've been playing around the alternate interface and I wanted +to contribute a little C program, callback.c, to you that you could +use as an example of the alternate interface in the /examples +directory of the readline distribution. + +My example shows how, using the alternate interface, you can +interactively change the prompt (which is very nice imo). Also, I +point out that you must roll your own terminal setting when using the +alternate interface because readline depreps (using your parlance) the +terminal while in the user callback. I try to demostrate what I mean +with an example. I've included the program below. + +To compile, I just put the program in the examples directory and made +the appropriate changes to the EXECUTABLES and OBJECTS line and added +an additional target 'callback'. + +I compiled on my Sun Solaris2.6 box using Sun's cc. + +Let me know what you think. + +Jeff +*/ + +#if defined (HAVE_CONFIG_H) +#include +#endif + +#include +#include + +#ifdef HAVE_UNISTD_H +#include +#endif + +#include /* xxx - should make this more general */ + +#ifdef READLINE_LIBRARY +# include "readline.h" +#else +# include +#endif + +/* This little examples demonstrates the alternate interface to using readline. + * In the alternate interface, the user maintains control over program flow and + * only calls readline when STDIN is readable. Using the alternate interface, + * you can do anything else while still using readline (like talking to a + * network or another program) without blocking. + * + * Specifically, this program highlights two importants features of the + * alternate interface. The first is the ability to interactively change the + * prompt, which can't be done using the regular interface since rl_prompt is + * read-only. + * + * The second feature really highlights a subtle point when using the alternate + * interface. That is, readline will not alter the terminal when inside your + * callback handler. So let's so, your callback executes a user command that + * takes a non-trivial amount of time to complete (seconds). While your + * executing the command, the user continues to type keystrokes and expects them + * to be re-echoed on the new prompt when it returns. Unfortunately, the default + * terminal configuration doesn't do this. After the prompt returns, the user + * must hit one additional keystroke and then will see all of his previous + * keystrokes. To illustrate this, compile and run this program. Type "sleep" at + * the prompt and then type "bar" before the prompt returns (you have 3 + * seconds). Notice how "bar" is re-echoed on the prompt after the prompt + * returns? This is what you expect to happen. Now comment out the 4 lines below + * the line that says COMMENT LINE BELOW. Recompile and rerun the program and do + * the same thing. When the prompt returns, you should not see "bar". Now type + * "f", see how "barf" magically appears? This behavior is un-expected and not + * desired. + */ + +void process_line(char *line); +int change_prompt(void); +char *get_prompt(void); + +int prompt = 1; +char prompt_buf[40], line_buf[256]; +tcflag_t old_lflag; +cc_t old_vtime; +struct termios term; + +int +main() +{ + fd_set fds; + + /* Adjust the terminal slightly before the handler is installed. Disable + * canonical mode processing and set the input character time flag to be + * non-blocking. + */ + if( tcgetattr(STDIN_FILENO, &term) < 0 ) { + perror("tcgetattr"); + exit(1); + } + old_lflag = term.c_lflag; + old_vtime = term.c_cc[VTIME]; + term.c_lflag &= ~ICANON; + term.c_cc[VTIME] = 1; + /* COMMENT LINE BELOW - see above */ + if( tcsetattr(STDIN_FILENO, TCSANOW, &term) < 0 ) { + perror("tcsetattr"); + exit(1); + } + + rl_add_defun("change-prompt", change_prompt, CTRL('t')); + rl_callback_handler_install(get_prompt(), process_line); + + while(1) { + FD_ZERO(&fds); + FD_SET(fileno(stdin), &fds); + + if( select(FD_SETSIZE, &fds, NULL, NULL, NULL) < 0) { + perror("select"); + exit(1); + } + + if( FD_ISSET(fileno(stdin), &fds) ) { + rl_callback_read_char(); + } + } +} + +void +process_line(char *line) +{ + if( line == NULL ) { + fprintf(stderr, "\n", line); + + /* reset the old terminal setting before exiting */ + term.c_lflag = old_lflag; + term.c_cc[VTIME] = old_vtime; + if( tcsetattr(STDIN_FILENO, TCSANOW, &term) < 0 ) { + perror("tcsetattr"); + exit(1); + } + exit(0); + } + + if( strcmp(line, "sleep") == 0 ) { + sleep(3); + } else { + fprintf(stderr, "|%s|\n", line); + } + + free (line); +} + +int +change_prompt(void) +{ + /* toggle the prompt variable */ + prompt = !prompt; + + /* save away the current contents of the line */ + strcpy(line_buf, rl_line_buffer); + + /* install a new handler which will change the prompt and erase the current line */ + rl_callback_handler_install(get_prompt(), process_line); + + /* insert the old text on the new line */ + rl_insert_text(line_buf); + + /* redraw the current line - this is an undocumented function. It invokes the + * redraw-current-line command. + */ + rl_refresh_line(0, 0); +} + +char * +get_prompt(void) +{ + /* The prompts can even be different lengths! */ + sprintf(prompt_buf, "%s", + prompt ? "Hit ctrl-t to toggle prompt> " : "Pretty cool huh?> "); + return prompt_buf; +} diff --git a/vendors/readline/src/readline/examples/fileman.c b/vendors/readline/src/readline/examples/fileman.c new file mode 100644 index 0000000..340eee7 --- /dev/null +++ b/vendors/readline/src/readline/examples/fileman.c @@ -0,0 +1,485 @@ +/* Copyright (C) 1987-2002 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library, a library for + reading lines of text with interactive input and history editing. + + The GNU Readline Library is free software; you can redistribute it + and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2, or + (at your option) any later version. + + The GNU Readline 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 General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + +/* fileman.c -- A tiny application which demonstrates how to use the + GNU Readline library. This application interactively allows users + to manipulate files and their modes. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#ifdef HAVE_SYS_FILE_H +# include +#endif +#include + +#ifdef HAVE_UNISTD_H +# include +#endif + +#include +#include +#include + +#if defined (HAVE_STRING_H) +# include +#else /* !HAVE_STRING_H */ +# include +#endif /* !HAVE_STRING_H */ + +#ifdef HAVE_STDLIB_H +# include +#endif + +#ifdef READLINE_LIBRARY +# include "readline.h" +# include "history.h" +#else +# include +# include +#endif + +extern char *xmalloc (); + +/* The names of functions that actually do the manipulation. */ +int com_list PARAMS((char *)); +int com_view PARAMS((char *)); +int com_rename PARAMS((char *)); +int com_stat PARAMS((char *)); +int com_pwd PARAMS((char *)); +int com_delete PARAMS((char *)); +int com_help PARAMS((char *)); +int com_cd PARAMS((char *)); +int com_quit PARAMS((char *)); + +/* A structure which contains information on the commands this program + can understand. */ + +typedef struct { + char *name; /* User printable name of the function. */ + rl_icpfunc_t *func; /* Function to call to do the job. */ + char *doc; /* Documentation for this function. */ +} COMMAND; + +COMMAND commands[] = { + { "cd", com_cd, "Change to directory DIR" }, + { "delete", com_delete, "Delete FILE" }, + { "help", com_help, "Display this text" }, + { "?", com_help, "Synonym for `help'" }, + { "list", com_list, "List files in DIR" }, + { "ls", com_list, "Synonym for `list'" }, + { "pwd", com_pwd, "Print the current working directory" }, + { "quit", com_quit, "Quit using Fileman" }, + { "rename", com_rename, "Rename FILE to NEWNAME" }, + { "stat", com_stat, "Print out statistics on FILE" }, + { "view", com_view, "View the contents of FILE" }, + { (char *)NULL, (rl_icpfunc_t *)NULL, (char *)NULL } +}; + +/* Forward declarations. */ +char *stripwhite (); +COMMAND *find_command (); + +/* The name of this program, as taken from argv[0]. */ +char *progname; + +/* When non-zero, this global means the user is done using this program. */ +int done; + +char * +dupstr (s) + char *s; +{ + char *r; + + r = xmalloc (strlen (s) + 1); + strcpy (r, s); + return (r); +} + +main (argc, argv) + int argc; + char **argv; +{ + char *line, *s; + + progname = argv[0]; + + initialize_readline (); /* Bind our completer. */ + + /* Loop reading and executing lines until the user quits. */ + for ( ; done == 0; ) + { + line = readline ("FileMan: "); + + if (!line) + break; + + /* Remove leading and trailing whitespace from the line. + Then, if there is anything left, add it to the history list + and execute it. */ + s = stripwhite (line); + + if (*s) + { + add_history (s); + execute_line (s); + } + + free (line); + } + exit (0); +} + +/* Execute a command line. */ +int +execute_line (line) + char *line; +{ + register int i; + COMMAND *command; + char *word; + + /* Isolate the command word. */ + i = 0; + while (line[i] && whitespace (line[i])) + i++; + word = line + i; + + while (line[i] && !whitespace (line[i])) + i++; + + if (line[i]) + line[i++] = '\0'; + + command = find_command (word); + + if (!command) + { + fprintf (stderr, "%s: No such command for FileMan.\n", word); + return (-1); + } + + /* Get argument to command, if any. */ + while (whitespace (line[i])) + i++; + + word = line + i; + + /* Call the function. */ + return ((*(command->func)) (word)); +} + +/* Look up NAME as the name of a command, and return a pointer to that + command. Return a NULL pointer if NAME isn't a command name. */ +COMMAND * +find_command (name) + char *name; +{ + register int i; + + for (i = 0; commands[i].name; i++) + if (strcmp (name, commands[i].name) == 0) + return (&commands[i]); + + return ((COMMAND *)NULL); +} + +/* Strip whitespace from the start and end of STRING. Return a pointer + into STRING. */ +char * +stripwhite (string) + char *string; +{ + register char *s, *t; + + for (s = string; whitespace (*s); s++) + ; + + if (*s == 0) + return (s); + + t = s + strlen (s) - 1; + while (t > s && whitespace (*t)) + t--; + *++t = '\0'; + + return s; +} + +/* **************************************************************** */ +/* */ +/* Interface to Readline Completion */ +/* */ +/* **************************************************************** */ + +char *command_generator PARAMS((const char *, int)); +char **fileman_completion PARAMS((const char *, int, int)); + +/* Tell the GNU Readline library how to complete. We want to try to complete + on command names if this is the first word in the line, or on filenames + if not. */ +initialize_readline () +{ + /* Allow conditional parsing of the ~/.inputrc file. */ + rl_readline_name = "FileMan"; + + /* Tell the completer that we want a crack first. */ + rl_attempted_completion_function = fileman_completion; +} + +/* Attempt to complete on the contents of TEXT. START and END bound the + region of rl_line_buffer that contains the word to complete. TEXT is + the word to complete. We can use the entire contents of rl_line_buffer + in case we want to do some simple parsing. Return the array of matches, + or NULL if there aren't any. */ +char ** +fileman_completion (text, start, end) + const char *text; + int start, end; +{ + char **matches; + + matches = (char **)NULL; + + /* If this word is at the start of the line, then it is a command + to complete. Otherwise it is the name of a file in the current + directory. */ + if (start == 0) + matches = rl_completion_matches (text, command_generator); + + return (matches); +} + +/* Generator function for command completion. STATE lets us know whether + to start from scratch; without any state (i.e. STATE == 0), then we + start at the top of the list. */ +char * +command_generator (text, state) + const char *text; + int state; +{ + static int list_index, len; + char *name; + + /* If this is a new word to complete, initialize now. This includes + saving the length of TEXT for efficiency, and initializing the index + variable to 0. */ + if (!state) + { + list_index = 0; + len = strlen (text); + } + + /* Return the next name which partially matches from the command list. */ + while (name = commands[list_index].name) + { + list_index++; + + if (strncmp (name, text, len) == 0) + return (dupstr(name)); + } + + /* If no names matched, then return NULL. */ + return ((char *)NULL); +} + +/* **************************************************************** */ +/* */ +/* FileMan Commands */ +/* */ +/* **************************************************************** */ + +/* String to pass to system (). This is for the LIST, VIEW and RENAME + commands. */ +static char syscom[1024]; + +/* List the file(s) named in arg. */ +com_list (arg) + char *arg; +{ + if (!arg) + arg = ""; + + sprintf (syscom, "ls -FClg %s", arg); + return (system (syscom)); +} + +com_view (arg) + char *arg; +{ + if (!valid_argument ("view", arg)) + return 1; + +#if defined (__MSDOS__) + /* more.com doesn't grok slashes in pathnames */ + sprintf (syscom, "less %s", arg); +#else + sprintf (syscom, "more %s", arg); +#endif + return (system (syscom)); +} + +com_rename (arg) + char *arg; +{ + too_dangerous ("rename"); + return (1); +} + +com_stat (arg) + char *arg; +{ + struct stat finfo; + + if (!valid_argument ("stat", arg)) + return (1); + + if (stat (arg, &finfo) == -1) + { + perror (arg); + return (1); + } + + printf ("Statistics for `%s':\n", arg); + + printf ("%s has %d link%s, and is %d byte%s in length.\n", + arg, + finfo.st_nlink, + (finfo.st_nlink == 1) ? "" : "s", + finfo.st_size, + (finfo.st_size == 1) ? "" : "s"); + printf ("Inode Last Change at: %s", ctime (&finfo.st_ctime)); + printf (" Last access at: %s", ctime (&finfo.st_atime)); + printf (" Last modified at: %s", ctime (&finfo.st_mtime)); + return (0); +} + +com_delete (arg) + char *arg; +{ + too_dangerous ("delete"); + return (1); +} + +/* Print out help for ARG, or for all of the commands if ARG is + not present. */ +com_help (arg) + char *arg; +{ + register int i; + int printed = 0; + + for (i = 0; commands[i].name; i++) + { + if (!*arg || (strcmp (arg, commands[i].name) == 0)) + { + printf ("%s\t\t%s.\n", commands[i].name, commands[i].doc); + printed++; + } + } + + if (!printed) + { + printf ("No commands match `%s'. Possibilties are:\n", arg); + + for (i = 0; commands[i].name; i++) + { + /* Print in six columns. */ + if (printed == 6) + { + printed = 0; + printf ("\n"); + } + + printf ("%s\t", commands[i].name); + printed++; + } + + if (printed) + printf ("\n"); + } + return (0); +} + +/* Change to the directory ARG. */ +com_cd (arg) + char *arg; +{ + if (chdir (arg) == -1) + { + perror (arg); + return 1; + } + + com_pwd (""); + return (0); +} + +/* Print out the current working directory. */ +com_pwd (ignore) + char *ignore; +{ + char dir[1024], *s; + + s = getcwd (dir, sizeof(dir) - 1); + if (s == 0) + { + printf ("Error getting pwd: %s\n", dir); + return 1; + } + + printf ("Current directory is %s\n", dir); + return 0; +} + +/* The user wishes to quit using this program. Just set DONE non-zero. */ +com_quit (arg) + char *arg; +{ + done = 1; + return (0); +} + +/* Function which tells you that you can't do this. */ +too_dangerous (caller) + char *caller; +{ + fprintf (stderr, + "%s: Too dangerous for me to distribute. Write it yourself.\n", + caller); +} + +/* Return non-zero if ARG is a valid argument for CALLER, else print + an error message and return zero. */ +int +valid_argument (caller, arg) + char *caller, *arg; +{ + if (!arg || !*arg) + { + fprintf (stderr, "%s: Argument required.\n", caller); + return (0); + } + + return (1); +} diff --git a/vendors/readline/src/readline/examples/histexamp.c b/vendors/readline/src/readline/examples/histexamp.c new file mode 100644 index 0000000..e875e65 --- /dev/null +++ b/vendors/readline/src/readline/examples/histexamp.c @@ -0,0 +1,122 @@ +/* Copyright (C) 1987-2002 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library, a library for + reading lines of text with interactive input and history editing. + + The GNU Readline Library is free software; you can redistribute it + and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2, or + (at your option) any later version. + + The GNU Readline 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 General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + +#include + +#ifdef READLINE_LIBRARY +# include "history.h" +#else +# include +#endif + +main (argc, argv) + int argc; + char **argv; +{ + char line[1024], *t; + int len, done; + + line[0] = 0; + done = 0; + + using_history (); + while (!done) + { + printf ("history$ "); + fflush (stdout); + t = fgets (line, sizeof (line) - 1, stdin); + if (t && *t) + { + len = strlen (t); + if (t[len - 1] == '\n') + t[len - 1] = '\0'; + } + + if (!t) + strcpy (line, "quit"); + + if (line[0]) + { + char *expansion; + int result; + + using_history (); + + result = history_expand (line, &expansion); + if (result) + fprintf (stderr, "%s\n", expansion); + + if (result < 0 || result == 2) + { + free (expansion); + continue; + } + + add_history (expansion); + strncpy (line, expansion, sizeof (line) - 1); + free (expansion); + } + + if (strcmp (line, "quit") == 0) + done = 1; + else if (strcmp (line, "save") == 0) + write_history ("history_file"); + else if (strcmp (line, "read") == 0) + read_history ("history_file"); + else if (strcmp (line, "list") == 0) + { + register HIST_ENTRY **the_list; + register int i; + time_t tt; + char timestr[128]; + + the_list = history_list (); + if (the_list) + for (i = 0; the_list[i]; i++) + { + tt = history_get_time (the_list[i]); + if (tt) + strftime (timestr, sizeof (timestr), "%a %R", localtime(&tt)); + else + strcpy (timestr, "??"); + printf ("%d: %s: %s\n", i + history_base, timestr, the_list[i]->line); + } + } + else if (strncmp (line, "delete", 6) == 0) + { + int which; + if ((sscanf (line + 6, "%d", &which)) == 1) + { + HIST_ENTRY *entry = remove_history (which); + if (!entry) + fprintf (stderr, "No such entry %d\n", which); + else + { + free (entry->line); + free (entry); + } + } + else + { + fprintf (stderr, "non-numeric arg given to `delete'\n"); + } + } + } +} diff --git a/vendors/readline/src/readline/examples/manexamp.c b/vendors/readline/src/readline/examples/manexamp.c new file mode 100644 index 0000000..9c6cf2c --- /dev/null +++ b/vendors/readline/src/readline/examples/manexamp.c @@ -0,0 +1,112 @@ +/* manexamp.c -- The examples which appear in the documentation are here. */ + +/* Copyright (C) 1987-2002 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library, a library for + reading lines of text with interactive input and history editing. + + The GNU Readline Library is free software; you can redistribute it + and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2, or + (at your option) any later version. + + The GNU Readline 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 General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + +#include +#include + +/* **************************************************************** */ +/* */ +/* How to Emulate gets () */ +/* */ +/* **************************************************************** */ + +/* A static variable for holding the line. */ +static char *line_read = (char *)NULL; + +/* Read a string, and return a pointer to it. Returns NULL on EOF. */ +char * +rl_gets () +{ + /* If the buffer has already been allocated, return the memory + to the free pool. */ + if (line_read) + { + free (line_read); + line_read = (char *)NULL; + } + + /* Get a line from the user. */ + line_read = readline (""); + + /* If the line has any text in it, save it on the history. */ + if (line_read && *line_read) + add_history (line_read); + + return (line_read); +} + +/* **************************************************************** */ +/* */ +/* Writing a Function to be Called by Readline. */ +/* */ +/* **************************************************************** */ + +/* Invert the case of the COUNT following characters. */ +invert_case_line (count, key) + int count, key; +{ + register int start, end; + + start = rl_point; + + if (count < 0) + { + direction = -1; + count = -count; + } + else + direction = 1; + + /* Find the end of the range to modify. */ + end = start + (count * direction); + + /* Force it to be within range. */ + if (end > rl_end) + end = rl_end; + else if (end < 0) + end = -1; + + if (start > end) + { + int temp = start; + start = end; + end = temp; + } + + if (start == end) + return; + + /* Tell readline that we are modifying the line, so save the undo + information. */ + rl_modifying (start, end); + + for (; start != end; start += direction) + { + if (_rl_uppercase_p (rl_line_buffer[start])) + rl_line_buffer[start] = _rl_to_lower (rl_line_buffer[start]); + else if (_rl_lowercase_p (rl_line_buffer[start])) + rl_line_buffer[start] = _rl_to_upper (rl_line_buffer[start]); + } + + /* Move point to on top of the last character changed. */ + rl_point = end - direction; +} diff --git a/vendors/readline/src/readline/examples/readlinebuf.h b/vendors/readline/src/readline/examples/readlinebuf.h new file mode 100644 index 0000000..a8af52c --- /dev/null +++ b/vendors/readline/src/readline/examples/readlinebuf.h @@ -0,0 +1,139 @@ +/******************************************************************************* + * $Revision: 1.2 $ + * $Date: 2001/09/11 06:19:36 $ + * $Author: vyzo $ + * + * Contents: A streambuf which uses the GNU readline library for line I/O + * (c) 2001 by Dimitris Vyzovitis [vyzo@media.mit.edu] + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the Free + * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + ******************************************************************************/ + +#ifndef _READLINEBUF_H_ +#define _READLINEBUF_H_ + +#include +#include +#include +#include +#include + +#include +#include + +#if (defined __GNUC__) && (__GNUC__ < 3) +#include +#else +#include +using std::streamsize; +using std::streambuf; +#endif + +class readlinebuf : public streambuf { +public: +#if (defined __GNUC__) && (__GNUC__ < 3) + typedef char char_type; + typedef int int_type; + typedef streampos pos_type; + typedef streamoff off_type; +#endif + static const int_type eof = EOF; // this is -1 + static const int_type not_eof = 0; + +private: + const char* prompt_; + bool history_; + char* line_; + int low_; + int high_; + +protected: + + virtual int_type showmanyc() const { return high_ - low_; } + + virtual streamsize xsgetn( char_type* buf, streamsize n ) { + int rd = n > (high_ - low_)? (high_ - low_) : n; + memcpy( buf, line_, rd ); + low_ += rd; + + if ( rd < n ) { + low_ = high_ = 0; + free( line_ ); // free( NULL ) is a noop + line_ = readline( prompt_ ); + if ( line_ ) { + high_ = strlen( line_ ); + if ( history_ && high_ ) add_history( line_ ); + rd += xsgetn( buf + rd, n - rd ); + } + } + + return rd; + } + + virtual int_type underflow() { + if ( high_ == low_ ) { + low_ = high_ = 0; + free( line_ ); // free( NULL ) is a noop + line_ = readline( prompt_ ); + if ( line_ ) { + high_ = strlen( line_ ); + if ( history_ && high_ ) add_history( line_ ); + } + } + + if ( low_ < high_ ) return line_[low_]; + else return eof; + } + + virtual int_type uflow() { + int_type c = underflow(); + if ( c != eof ) ++low_; + return c; + } + + virtual int_type pbackfail( int_type c = eof ) { + if ( low_ > 0 ) --low_; + else if ( c != eof ) { + if ( high_ > 0 ) { + char* nl = (char*)realloc( line_, high_ + 1 ); + if ( nl ) { + line_ = (char*)memcpy( nl + 1, line_, high_ ); + high_ += 1; + line_[0] = char( c ); + } else return eof; + } else { + assert( !line_ ); + line_ = (char*)malloc( sizeof( char ) ); + *line_ = char( c ); + high_ = 1; + } + } else return eof; + + return not_eof; + } + +public: + readlinebuf( const char* prompt = NULL, bool history = true ) + : prompt_( prompt ), history_( history ), + line_( NULL ), low_( 0 ), high_( 0 ) { + setbuf( 0, 0 ); + } + + +}; + +#endif diff --git a/vendors/readline/src/readline/examples/rl-fgets.c b/vendors/readline/src/readline/examples/rl-fgets.c new file mode 100644 index 0000000..5512b94 --- /dev/null +++ b/vendors/readline/src/readline/examples/rl-fgets.c @@ -0,0 +1,374 @@ +/* +Date: Tue, 16 Mar 2004 19:38:40 -0800 +From: Harold Levy +Subject: fgets(stdin) --> readline() redirector +To: chet@po.cwru.edu + +Hi Chet, + +Here is something you may find useful enough to include in the readline +distribution. It is a shared library that redirects calls to fgets(stdin) +to readline() via LD_PRELOAD, and it supports a custom prompt and list of +command names. Many people have asked me for this file, so I thought I'd +pass it your way in hope of just including it with readline to begin with. + +Best Regards, + +-Harold +*/ + +/****************************************************************************** +******************************************************************************* + + FILE NAME: fgets.c TARGET: libfgets.so + AUTHOR: Harold Levy VERSION: 1.0 + hlevy@synopsys.com + + ABSTRACT: Customize fgets() behavior via LD_PRELOAD in the following ways: + + -- If fgets(stdin) is called, redirect to GNU readline() to obtain + command-line editing, file-name completion, history, etc. + + -- A list of commands for command-name completion can be configured by + setting the environment-variable FGETS_COMMAND_FILE to a file containing + the list of commands to be used. + + -- Command-line editing with readline() works best when the prompt string + is known; you can set this with the FGETS_PROMPT environment variable. + + -- There special strings that libfgets will interpret as internal commands: + + _fgets_reset_ reset the command list + + _fgets_dump_ dump status + + _fgets_debug_ toggle debug messages + + HOW TO BUILD: Here are examples of how to build libfgets.so on various + platforms; you will have to add -I and -L flags to configure access to + the readline header and library files. + + (32-bit builds with gcc) + AIX: gcc -fPIC fgets.c -shared -o libfgets.so -lc -ldl -lreadline -ltermcap + HP-UX: gcc -fPIC fgets.c -shared -o libfgets.so -lc -ldld -lreadline + Linux: gcc -fPIC fgets.c -shared -o libfgets.so -lc -ldl -lreadline + SunOS: gcc -fPIC fgets.c -shared -o libfgets.so -lc -ldl -lgen -lreadline + + (64-bit builds without gcc) + SunOS: SUNWspro/bin/cc -D_LARGEFILE64_SOURCE=1 -xtarget=ultra -xarch=v9 \ + -KPIC fgets.c -Bdynamic -lc -ldl -lgen -ltermcap -lreadline + + HOW TO USE: Different operating systems have different levels of support + for the LD_PRELOAD concept. The generic method for 32-bit platforms is to + put libtermcap.so, libfgets.so, and libreadline.so (with absolute paths) + in the LD_PRELOAD environment variable, and to put their parent directories + in the LD_LIBRARY_PATH environment variable. Unfortunately there is no + generic method for 64-bit platforms; e.g. for 64-bit SunOS, you would have + to build both 32-bit and 64-bit libfgets and libreadline libraries, and + use the LD_FLAGS_32 and LD_FLAGS_64 environment variables with preload and + library_path configurations (a mix of 32-bit and 64-bit calls are made under + 64-bit SunOS). + + EXAMPLE WRAPPER: Here is an example shell script wrapper around the + program "foo" that uses fgets() for command-line input: + + #!/bin/csh + #### replace this with the libtermcap.so directory: + set dir1 = "/usr/lib" + #### replace this with the libfgets.so directory: + set dir2 = "/usr/fgets" + #### replace this with the libreadline.so directory: + set dir3 = "/usr/local/lib" + set lib1 = "${dir1}/libtermcap.so" + set lib2 = "${dir2}/libfgets.so" + set lib3 = "${dir3}/libreadline.so" + if ( "${?LD_PRELOAD}" ) then + setenv LD_PRELOAD "${lib1}:${lib2}:${lib3}:${LD_PRELOAD}" + else + setenv LD_PRELOAD "${lib1}:${lib2}:${lib3}" + endif + if ( "${?LD_LIBRARY_PATH}" ) then + setenv LD_LIBRARY_PATH "${dir1}:${dir2}:${dir3}:${LD_LIBRARY_PATH}" + else + setenv LD_LIBRARY_PATH "${dir1}:${dir2}:${dir3}" + endif + setenv FGETS_COMMAND_FILE "${dir2}/foo.commands" + setenv FGETS_PROMPT "foo> " + exec "foo" $* + + Copyright (C)2003-2004 Harold Levy. + + This code links to the GNU readline library, and as such is bound by the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 2 or (at your option) any later version. + + The GNU General Public License is often shipped with GNU software, and is + generally kept in a file called COPYING or LICENSE. If you do not have a + copy of the license, write to the Free Software Foundation, 59 Temple Place, + Suite 330, Boston, MA 02111 USA. + + 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. + +******************************************************************************* +******************************************************************************/ + + + +#include +#include +#include +#include +#include + +#include +#include + + + +/* for dynamically connecting to the native fgets() */ +#if defined(RTLD_NEXT) +#define REAL_LIBC RTLD_NEXT +#else +#define REAL_LIBC ((void *) -1L) +#endif +typedef char * ( * fgets_t ) ( char * s, int n, FILE * stream ) ; + + + +/* private data */ +/* -- writeable data is stored in the shared library's data segment + -- every process that uses the shared library gets a private memory copy of + its entire data segment + -- static data in the shared library is not copied to the application + -- only read-only (i.e. 'const') data is stored in the shared library's + text segment +*/ +static char ** my_fgets_names = NULL ; +static int my_fgets_number_of_names = 0 ; +static int my_fgets_debug_flag = 0 ; + + + +/* invoked with _fgets_reset_ */ +static void +my_fgets_reset ( + void +) { + if ( my_fgets_names && (my_fgets_number_of_names > 0) ) { + int i ; + if ( my_fgets_debug_flag ) { + printf ( "libfgets: removing command list\n" ) ; + } + for ( i = 0 ; i < my_fgets_number_of_names ; i ++ ) { + if ( my_fgets_names[i] ) free ( my_fgets_names[i] ) ; + } + free ( my_fgets_names ) ; + } + my_fgets_names = NULL ; + my_fgets_number_of_names = 0 ; +} + + + +/* invoked with _fgets_dump_ */ +static void +my_fgets_dump ( + void +) { + char * s ; + printf ( "\n" ) ; + s = getenv ( "FGETS_PROMPT" ) ; + printf ( "FGETS_PROMPT = %s\n", s ? s : "" ) ; + s = getenv ( "FGETS_COMMAND_FILE" ) ; + printf ( "FGETS_COMMAND_FILE = %s\n", s ? s : "" ) ; + printf ( "debug flag = %d\n", my_fgets_debug_flag ) ; + printf ( "#commands = %d\n", my_fgets_number_of_names ) ; + if ( my_fgets_debug_flag ) { + if ( my_fgets_names && (my_fgets_number_of_names > 0) ) { + int i ; + for ( i = 0 ; i < my_fgets_number_of_names ; i ++ ) { + printf ( "%s\n", my_fgets_names[i] ) ; + } + } + } + printf ( "\n" ) ; +} + + + +/* invoked with _fgets_debug_ */ +static void +my_fgets_debug_toggle ( + void +) { + my_fgets_debug_flag = my_fgets_debug_flag ? 0 : 1 ; + if ( my_fgets_debug_flag ) { + printf ( "libfgets: debug flag = %d\n", my_fgets_debug_flag ) ; + } +} + + + +/* read the command list if needed, return the i-th name */ +static char * +my_fgets_lookup ( + int index +) { + if ( (! my_fgets_names) || (! my_fgets_number_of_names) ) { + char * fname ; + FILE * fp ; + fgets_t _fgets ; + int i ; + char buf1[256], buf2[256] ; + fname = getenv ( "FGETS_COMMAND_FILE" ) ; + if ( ! fname ) { + if ( my_fgets_debug_flag ) { + printf ( "libfgets: empty or unset FGETS_COMMAND_FILE\n" ) ; + } + return NULL ; + } + fp = fopen ( fname, "r" ) ; + if ( ! fp ) { + if ( my_fgets_debug_flag ) { + printf ( "libfgets: cannot open '%s' for reading\n", fname ) ; + } + return NULL ; + } + _fgets = (fgets_t) dlsym ( REAL_LIBC, "fgets" ) ; + if ( ! _fgets ) { + fprintf ( stderr, + "libfgets: failed to dynamically link to native fgets()\n" + ) ; + return NULL ; + } + for ( i = 0 ; _fgets(buf1,255,fp) ; i ++ ) ; + if ( ! i ) { fclose(fp) ; return NULL ; } + my_fgets_names = (char**) calloc ( i, sizeof(char*) ) ; + rewind ( fp ) ; + i = 0 ; + while ( _fgets(buf1,255,fp) ) { + buf1[255] = 0 ; + if ( 1 == sscanf(buf1,"%s",buf2) ) { + my_fgets_names[i] = strdup(buf2) ; + i ++ ; + } + } + fclose ( fp ) ; + my_fgets_number_of_names = i ; + if ( my_fgets_debug_flag ) { + printf ( "libfgets: successfully read %d commands\n", i ) ; + } + } + if ( index < my_fgets_number_of_names ) { + return my_fgets_names[index] ; + } else { + return NULL ; + } +} + + + +/* generate a list of partial name matches for readline() */ +static char * +my_fgets_generator ( + const char * text, + int state +) +{ + static int list_index, len ; + char * name ; + if ( ! state ) { + list_index = 0 ; + len = strlen ( text ) ; + } + while ( ( name = my_fgets_lookup(list_index) ) ) { + list_index ++ ; + if ( ! strncmp ( name, text, len ) ) { + return ( strdup ( name ) ) ; + } + } + return ( NULL ) ; +} + + + +/* partial name completion callback for readline() */ +static char ** +my_fgets_completion ( + const char * text, + int start, + int end +) +{ + char ** matches ; + matches = NULL ; + if ( ! start ) { + matches = rl_completion_matches ( text, my_fgets_generator ) ; + } + return ( matches ) ; +} + + + +/* fgets() intercept */ +char * +fgets ( + char * s, + int n, + FILE * stream +) +{ + if ( ! s ) return NULL ; + if ( stream == stdin ) { + char * prompt ; + char * my_fgets_line ; + rl_already_prompted = 1 ; + rl_attempted_completion_function = my_fgets_completion ; + rl_catch_signals = 1 ; + rl_catch_sigwinch = 1 ; + rl_set_signals () ; + prompt = getenv ( "FGETS_PROMPT" ) ; + for ( + my_fgets_line = 0 ; ! my_fgets_line ; my_fgets_line=readline(prompt) + ) ; + if ( ! strncmp(my_fgets_line, "_fgets_reset_", 13) ) { + my_fgets_reset () ; + free ( my_fgets_line ) ; + strcpy ( s, "\n" ) ; + return ( s ) ; + } + if ( ! strncmp(my_fgets_line, "_fgets_dump_", 12) ) { + my_fgets_dump () ; + free ( my_fgets_line ) ; + strcpy ( s, "\n" ) ; + return ( s ) ; + } + if ( ! strncmp(my_fgets_line, "_fgets_debug_", 13) ) { + my_fgets_debug_toggle () ; + free ( my_fgets_line ) ; + strcpy ( s, "\n" ) ; + return ( s ) ; + } + (void) strncpy ( s, my_fgets_line, n-1 ) ; + (void) strcat ( s, "\n" ) ; + if ( *my_fgets_line ) add_history ( my_fgets_line ) ; + free ( my_fgets_line ) ; + return ( s ) ; + } else { + static fgets_t _fgets ; + _fgets = (fgets_t) dlsym ( REAL_LIBC, "fgets" ) ; + if ( ! _fgets ) { + fprintf ( stderr, + "libfgets: failed to dynamically link to native fgets()\n" + ) ; + strcpy ( s, "\n" ) ; + return ( s ) ; + } + return ( + _fgets ( s, n, stream ) + ) ; + } +} diff --git a/vendors/readline/src/readline/examples/rl.c b/vendors/readline/src/readline/examples/rl.c new file mode 100644 index 0000000..d260489 --- /dev/null +++ b/vendors/readline/src/readline/examples/rl.c @@ -0,0 +1,151 @@ +/* + * rl - command-line interface to read a line from the standard input + * (or another fd) using readline. + * + * usage: rl [-p prompt] [-u unit] [-d default] [-n nchars] + */ + +/* Copyright (C) 1987-2002 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library, a library for + reading lines of text with interactive input and history editing. + + The GNU Readline Library is free software; you can redistribute it + and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2, or + (at your option) any later version. + + The GNU Readline 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 General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include +#include +#include "posixstat.h" + +#if defined (READLINE_LIBRARY) +# include "readline.h" +# include "history.h" +#else +# include +# include +#endif + +extern int optind; +extern char *optarg; + +#if !defined (strchr) && !defined (__STDC__) +extern char *strrchr(); +#endif + +static char *progname; +static char *deftext; + +static int +set_deftext () +{ + if (deftext) + { + rl_insert_text (deftext); + deftext = (char *)NULL; + rl_startup_hook = (rl_hook_func_t *)NULL; + } + return 0; +} + +static void +usage() +{ + fprintf (stderr, "%s: usage: %s [-p prompt] [-u unit] [-d default] [-n nchars]\n", + progname, progname); +} + +int +main (argc, argv) + int argc; + char **argv; +{ + char *temp, *prompt; + struct stat sb; + int opt, fd, nch; + FILE *ifp; + + progname = strrchr(argv[0], '/'); + if (progname == 0) + progname = argv[0]; + else + progname++; + + /* defaults */ + prompt = "readline$ "; + fd = nch = 0; + deftext = (char *)0; + + while ((opt = getopt(argc, argv, "p:u:d:n:")) != EOF) + { + switch (opt) + { + case 'p': + prompt = optarg; + break; + case 'u': + fd = atoi(optarg); + if (fd < 0) + { + fprintf (stderr, "%s: bad file descriptor `%s'\n", progname, optarg); + exit (2); + } + break; + case 'd': + deftext = optarg; + break; + case 'n': + nch = atoi(optarg); + if (nch < 0) + { + fprintf (stderr, "%s: bad value for -n: `%s'\n", progname, optarg); + exit (2); + } + break; + default: + usage (); + exit (2); + } + } + + if (fd != 0) + { + if (fstat (fd, &sb) < 0) + { + fprintf (stderr, "%s: %d: bad file descriptor\n", progname, fd); + exit (1); + } + ifp = fdopen (fd, "r"); + rl_instream = ifp; + } + + if (deftext && *deftext) + rl_startup_hook = set_deftext; + + if (nch > 0) + rl_num_chars_to_read = nch; + + temp = readline (prompt); + + /* Test for EOF. */ + if (temp == 0) + exit (1); + + printf ("%s\n", temp); + exit (0); +} diff --git a/vendors/readline/src/readline/examples/rlcat.c b/vendors/readline/src/readline/examples/rlcat.c new file mode 100644 index 0000000..176b9f4 --- /dev/null +++ b/vendors/readline/src/readline/examples/rlcat.c @@ -0,0 +1,174 @@ +/* + * rlcat - cat(1) using readline + * + * usage: rlcat + */ + +/* Copyright (C) 1987-2002 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library, a library for + reading lines of text with interactive input and history editing. + + The GNU Readline Library is free software; you can redistribute it + and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2, or + (at your option) any later version. + + The GNU Readline 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 General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#ifdef HAVE_UNISTD_H +# include +#endif + +#include +#include "posixstat.h" + +#include +#include +#include +#include + +#ifndef errno +extern int errno; +#endif + +#if defined (READLINE_LIBRARY) +# include "readline.h" +# include "history.h" +#else +# include +# include +#endif + +extern int optind; +extern char *optarg; + +static int stdcat(); + +static char *progname; +static int vflag; + +static void +usage() +{ + fprintf (stderr, "%s: usage: %s [-vEVN] [filename]\n", progname, progname); +} + +int +main (argc, argv) + int argc; + char **argv; +{ + char *temp; + int opt, Vflag, Nflag; + + progname = strrchr(argv[0], '/'); + if (progname == 0) + progname = argv[0]; + else + progname++; + + vflag = Vflag = Nflag = 0; + while ((opt = getopt(argc, argv, "vEVN")) != EOF) + { + switch (opt) + { + case 'v': + vflag = 1; + break; + case 'V': + Vflag = 1; + break; + case 'E': + Vflag = 0; + break; + case 'N': + Nflag = 1; + break; + default: + usage (); + exit (2); + } + } + + argc -= optind; + argv += optind; + + if (isatty(0) == 0 || argc || Nflag) + return stdcat(argc, argv); + + rl_variable_bind ("editing-mode", Vflag ? "vi" : "emacs"); + while (temp = readline ("")) + { + if (*temp) + add_history (temp); + printf ("%s\n", temp); + } + + return (ferror (stdout)); +} + +static int +fcopy(fp) + FILE *fp; +{ + int c; + char *x; + + while ((c = getc(fp)) != EOF) + { + if (vflag && isascii ((unsigned char)c) && isprint((unsigned char)c) == 0) + { + x = rl_untranslate_keyseq (c); + if (fputs (x, stdout) != 0) + return 1; + } + else if (putchar (c) == EOF) + return 1; + } + return (ferror (stdout)); +} + +int +stdcat (argc, argv) + int argc; + char **argv; +{ + int i, fd, r; + char *s; + FILE *fp; + + if (argc == 0) + return (fcopy(stdin)); + + for (i = 0, r = 1; i < argc; i++) + { + if (*argv[i] == '-' && argv[i][1] == 0) + fp = stdin; + else + { + fp = fopen (argv[i], "r"); + if (fp == 0) + { + fprintf (stderr, "%s: %s: cannot open: %s\n", progname, argv[i], strerror(errno)); + continue; + } + } + r = fcopy (fp); + if (fp != stdin) + fclose(fp); + } + return r; +} diff --git a/vendors/readline/src/readline/examples/rlfe.c b/vendors/readline/src/readline/examples/rlfe.c new file mode 100644 index 0000000..d634d7c --- /dev/null +++ b/vendors/readline/src/readline/examples/rlfe.c @@ -0,0 +1,1042 @@ +/* A front-end using readline to "cook" input lines for Kawa. + * + * Copyright (C) 1999 Per Bothner + * + * This front-end program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as published + * by the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * Some code from Johnson & Troan: "Linux Application Development" + * (Addison-Wesley, 1998) was used directly or for inspiration. + */ + +/* PROBLEMS/TODO: + * + * Only tested under Linux; needs to be ported. + * + * When running mc -c under the Linux console, mc does not recognize + * mouse clicks, which mc does when not running under fep. + * + * Pasting selected text containing tabs is like hitting the tab character, + * which invokes readline completion. We don't want this. I don't know + * if this is fixable without integrating fep into a terminal emulator. + * + * Echo suppression is a kludge, but can only be avoided with better kernel + * support: We need a tty mode to disable "real" echoing, while still + * letting the inferior think its tty driver to doing echoing. + * Stevens's book claims SCR$ and BSD4.3+ have TIOCREMOTE. + * + * The latest readline may have some hooks we can use to avoid having + * to back up the prompt. + * + * Desirable readline feature: When in cooked no-echo mode (e.g. password), + * echo characters are they are types with '*', but remove them when done. + * + * A synchronous output while we're editing an input line should be + * inserted in the output view *before* the input line, so that the + * lines being edited (with the prompt) float at the end of the input. + * + * A "page mode" option to emulate more/less behavior: At each page of + * output, pause for a user command. This required parsing the output + * to keep track of line lengths. It also requires remembering the + * output, if we want an option to scroll back, which suggests that + * this should be integrated with a terminal emulator like xterm. + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef READLINE_LIBRARY +# include "readline.h" +# include "history.h" +#else +# include +# include +#endif + +#ifndef COMMAND +#define COMMAND "/bin/sh" +#endif +#ifndef COMMAND_ARGS +#define COMMAND_ARGS COMMAND +#endif + +#ifndef HAVE_MEMMOVE +#ifndef memmove +# if __GNUC__ > 1 +# define memmove(d, s, n) __builtin_memcpy(d, s, n) +# else +# define memmove(d, s, n) memcpy(d, s, n) +# endif +#else +# define memmove(d, s, n) memcpy(d, s, n) +#endif +#endif + +#define APPLICATION_NAME "Rlfe" + +#ifndef errno +extern int errno; +#endif + +extern int optind; +extern char *optarg; + +static char *progname; +static char *progversion; + +static int in_from_inferior_fd; +static int out_to_inferior_fd; + +/* Unfortunately, we cannot safely display echo from the inferior process. + The reason is that the echo bit in the pty is "owned" by the inferior, + and if we try to turn it off, we could confuse the inferior. + Thus, when echoing, we get echo twice: First readline echoes while + we're actually editing. Then we send the line to the inferior, and the + terminal driver send back an extra echo. + The work-around is to remember the input lines, and when we see that + line come back, we supress the output. + A better solution (supposedly available on SVR4) would be a smarter + terminal driver, with more flags ... */ +#define ECHO_SUPPRESS_MAX 1024 +char echo_suppress_buffer[ECHO_SUPPRESS_MAX]; +int echo_suppress_start = 0; +int echo_suppress_limit = 0; + +/* #define DEBUG */ + +static FILE *logfile = NULL; + +#ifdef DEBUG +FILE *debugfile = NULL; +#define DPRINT0(FMT) (fprintf(debugfile, FMT), fflush(debugfile)) +#define DPRINT1(FMT, V1) (fprintf(debugfile, FMT, V1), fflush(debugfile)) +#define DPRINT2(FMT, V1, V2) (fprintf(debugfile, FMT, V1, V2), fflush(debugfile)) +#else +#define DPRINT0(FMT) /* Do nothing */ +#define DPRINT1(FMT, V1) /* Do nothing */ +#define DPRINT2(FMT, V1, V2) /* Do nothing */ +#endif + +struct termios orig_term; + +static int rlfe_directory_completion_hook __P((char **)); +static int rlfe_directory_rewrite_hook __P((char **)); +static char *rlfe_filename_completion_function __P((const char *, int)); + +/* Pid of child process. */ +static pid_t child = -1; + +static void +sig_child (int signo) +{ + int status; + wait (&status); + DPRINT0 ("(Child process died.)\n"); + tcsetattr(STDIN_FILENO, TCSANOW, &orig_term); + exit (0); +} + +volatile int propagate_sigwinch = 0; + +/* sigwinch_handler + * propagate window size changes from input file descriptor to + * master side of pty. + */ +void sigwinch_handler(int signal) { + propagate_sigwinch = 1; +} + +/* get_master_pty() takes a double-indirect character pointer in which + * to put a slave name, and returns an integer file descriptor. + * If it returns < 0, an error has occurred. + * Otherwise, it has returned the master pty file descriptor, and fills + * in *name with the name of the corresponding slave pty. + * Once the slave pty has been opened, you are responsible to free *name. + */ + +int get_master_pty(char **name) { + int i, j; + /* default to returning error */ + int master = -1; + + /* create a dummy name to fill in */ + *name = strdup("/dev/ptyXX"); + + /* search for an unused pty */ + for (i=0; i<16 && master <= 0; i++) { + for (j=0; j<16 && master <= 0; j++) { + (*name)[5] = 'p'; + (*name)[8] = "pqrstuvwxyzPQRST"[i]; + (*name)[9] = "0123456789abcdef"[j]; + /* open the master pty */ + if ((master = open(*name, O_RDWR)) < 0) { + if (errno == ENOENT) { + /* we are out of pty devices */ + free (*name); + return (master); + } + } + else { + /* By substituting a letter, we change the master pty + * name into the slave pty name. + */ + (*name)[5] = 't'; + if (access(*name, R_OK|W_OK) != 0) + { + close(master); + master = -1; + } + } + } + } + if ((master < 0) && (i == 16) && (j == 16)) { + /* must have tried every pty unsuccessfully */ + free (*name); + return (master); + } + + (*name)[5] = 't'; + + return (master); +} + +/* get_slave_pty() returns an integer file descriptor. + * If it returns < 0, an error has occurred. + * Otherwise, it has returned the slave file descriptor. + */ + +int get_slave_pty(char *name) { + struct group *gptr; + gid_t gid; + int slave = -1; + + /* chown/chmod the corresponding pty, if possible. + * This will only work if the process has root permissions. + * Alternatively, write and exec a small setuid program that + * does just this. + */ + if ((gptr = getgrnam("tty")) != 0) { + gid = gptr->gr_gid; + } else { + /* if the tty group does not exist, don't change the + * group on the slave pty, only the owner + */ + gid = -1; + } + + /* Note that we do not check for errors here. If this is code + * where these actions are critical, check for errors! + */ + chown(name, getuid(), gid); + /* This code only makes the slave read/writeable for the user. + * If this is for an interactive shell that will want to + * receive "write" and "wall" messages, OR S_IWGRP into the + * second argument below. + */ + chmod(name, S_IRUSR|S_IWUSR); + + /* open the corresponding slave pty */ + slave = open(name, O_RDWR); + return (slave); +} + +/* Certain special characters, such as ctrl/C, we want to pass directly + to the inferior, rather than letting readline handle them. */ + +static char special_chars[20]; +static int special_chars_count; + +static void +add_special_char(int ch) +{ + if (ch != 0) + special_chars[special_chars_count++] = ch; +} + +static int eof_char; + +static int +is_special_char(int ch) +{ + int i; +#if 0 + if (ch == eof_char && rl_point == rl_end) + return 1; +#endif + for (i = special_chars_count; --i >= 0; ) + if (special_chars[i] == ch) + return 1; + return 0; +} + +static char buf[1024]; +/* buf[0 .. buf_count-1] is the what has been emitted on the current line. + It is used as the readline prompt. */ +static int buf_count = 0; + +int num_keys = 0; + +static void +null_prep_terminal (int meta) +{ +} + +static void +null_deprep_terminal () +{ +} + +char pending_special_char; + +static void +line_handler (char *line) +{ + if (line == NULL) + { + char buf[1]; + DPRINT0("saw eof!\n"); + buf[0] = '\004'; /* ctrl/d */ + write (out_to_inferior_fd, buf, 1); + } + else + { + static char enter[] = "\r"; + /* Send line to inferior: */ + int length = strlen (line); + if (length > ECHO_SUPPRESS_MAX-2) + { + echo_suppress_start = 0; + echo_suppress_limit = 0; + } + else + { + if (echo_suppress_limit + length > ECHO_SUPPRESS_MAX - 2) + { + if (echo_suppress_limit - echo_suppress_start + length + <= ECHO_SUPPRESS_MAX - 2) + { + memmove (echo_suppress_buffer, + echo_suppress_buffer + echo_suppress_start, + echo_suppress_limit - echo_suppress_start); + echo_suppress_limit -= echo_suppress_start; + echo_suppress_start = 0; + } + else + { + echo_suppress_limit = 0; + } + echo_suppress_start = 0; + } + memcpy (echo_suppress_buffer + echo_suppress_limit, + line, length); + echo_suppress_limit += length; + echo_suppress_buffer[echo_suppress_limit++] = '\r'; + echo_suppress_buffer[echo_suppress_limit++] = '\n'; + } + write (out_to_inferior_fd, line, length); + if (pending_special_char == 0) + { + write (out_to_inferior_fd, enter, sizeof(enter)-1); + if (*line) + add_history (line); + } + free (line); + } + rl_callback_handler_remove (); + buf_count = 0; + num_keys = 0; + if (pending_special_char != 0) + { + write (out_to_inferior_fd, &pending_special_char, 1); + pending_special_char = 0; + } +} + +/* Value of rl_getc_function. + Use this because readline should read from stdin, not rl_instream, + points to the pty (so readline has monitor its terminal modes). */ + +int +my_rl_getc (FILE *dummy) +{ + int ch = rl_getc (stdin); + if (is_special_char (ch)) + { + pending_special_char = ch; + return '\r'; + } + return ch; +} + +static void +usage() +{ + fprintf (stderr, "%s: usage: %s [-l filename] [-a] [-n appname] [-hv] [command [arguments...]]\n", + progname, progname); +} + +int +main(int argc, char** argv) +{ + char *path; + int i, append; + int master; + char *name, *logfname, *appname; + int in_from_tty_fd; + struct sigaction act; + struct winsize ws; + struct termios t; + int maxfd; + fd_set in_set; + static char empty_string[1] = ""; + char *prompt = empty_string; + int ioctl_err = 0; + + if ((progname = strrchr (argv[0], '/')) == 0) + progname = argv[0]; + else + progname++; + progversion = RL_LIBRARY_VERSION; + + append = 0; + appname = APPLICATION_NAME; + logfname = (char *)NULL; + + while ((i = getopt (argc, argv, "ahl:n:v")) != EOF) + { + switch (i) + { + case 'l': + logfname = optarg; + break; + case 'n': + appname = optarg; + break; + case 'a': + append = 1; + break; + case 'h': + usage (); + exit (0); + case 'v': + fprintf (stderr, "%s version %s\n", progname, progversion); + exit (0); + default: + usage (); + exit (2); + } + } + + argc -= optind; + argv += optind; + + if (logfname) + { + logfile = fopen (logfname, append ? "a" : "w"); + if (logfile == 0) + fprintf (stderr, "%s: warning: could not open log file %s: %s\n", + progname, logfname, strerror (errno)); + } + + rl_readline_name = appname; + +#ifdef DEBUG + debugfile = fopen("LOG", "w"); +#endif + + if ((master = get_master_pty(&name)) < 0) + { + perror("ptypair: could not open master pty"); + exit(1); + } + + DPRINT1("pty name: '%s'\n", name); + + /* set up SIGWINCH handler */ + act.sa_handler = sigwinch_handler; + sigemptyset(&(act.sa_mask)); + act.sa_flags = 0; + if (sigaction(SIGWINCH, &act, NULL) < 0) + { + perror("ptypair: could not handle SIGWINCH "); + exit(1); + } + + if (ioctl(STDIN_FILENO, TIOCGWINSZ, &ws) < 0) + { + perror("ptypair: could not get window size"); + exit(1); + } + + if ((child = fork()) < 0) + { + perror("cannot fork"); + exit(1); + } + + if (child == 0) + { + int slave; /* file descriptor for slave pty */ + + /* We are in the child process */ + close(master); + +#ifdef TIOCSCTTY + if ((slave = get_slave_pty(name)) < 0) + { + perror("ptypair: could not open slave pty"); + exit(1); + } + free(name); +#endif + + /* We need to make this process a session group leader, because + * it is on a new PTY, and things like job control simply will + * not work correctly unless there is a session group leader + * and process group leader (which a session group leader + * automatically is). This also disassociates us from our old + * controlling tty. + */ + if (setsid() < 0) + { + perror("could not set session leader"); + } + + /* Tie us to our new controlling tty. */ +#ifdef TIOCSCTTY + if (ioctl(slave, TIOCSCTTY, NULL)) + { + perror("could not set new controlling tty"); + } +#else + if ((slave = get_slave_pty(name)) < 0) + { + perror("ptypair: could not open slave pty"); + exit(1); + } + free(name); +#endif + + /* make slave pty be standard in, out, and error */ + dup2(slave, STDIN_FILENO); + dup2(slave, STDOUT_FILENO); + dup2(slave, STDERR_FILENO); + + /* at this point the slave pty should be standard input */ + if (slave > 2) + { + close(slave); + } + + /* Try to restore window size; failure isn't critical */ + if (ioctl(STDOUT_FILENO, TIOCSWINSZ, &ws) < 0) + { + perror("could not restore window size"); + } + + /* now start the shell */ + { + static char* command_args[] = { COMMAND_ARGS, NULL }; + if (argc < 1) + execvp(COMMAND, command_args); + else + execvp(argv[0], &argv[0]); + } + + /* should never be reached */ + exit(1); + } + + /* parent */ + signal (SIGCHLD, sig_child); + free(name); + + /* Note that we only set termios settings for standard input; + * the master side of a pty is NOT a tty. + */ + tcgetattr(STDIN_FILENO, &orig_term); + + t = orig_term; + eof_char = t.c_cc[VEOF]; + /* add_special_char(t.c_cc[VEOF]);*/ + add_special_char(t.c_cc[VINTR]); + add_special_char(t.c_cc[VQUIT]); + add_special_char(t.c_cc[VSUSP]); +#if defined (VDISCARD) + add_special_char(t.c_cc[VDISCARD]); +#endif + +#if 0 + t.c_lflag |= (ICANON | ISIG | ECHO | ECHOCTL | ECHOE | \ + ECHOK | ECHOKE | ECHONL | ECHOPRT ); +#else + t.c_lflag &= ~(ICANON | ISIG | ECHO | ECHOCTL | ECHOE | \ + ECHOK | ECHOKE | ECHONL | ECHOPRT ); +#endif + t.c_iflag |= IGNBRK; + t.c_cc[VMIN] = 1; + t.c_cc[VTIME] = 0; + tcsetattr(STDIN_FILENO, TCSANOW, &t); + in_from_inferior_fd = master; + out_to_inferior_fd = master; + rl_instream = fdopen (master, "r"); + rl_getc_function = my_rl_getc; + + rl_prep_term_function = null_prep_terminal; + rl_deprep_term_function = null_deprep_terminal; + rl_callback_handler_install (prompt, line_handler); + +#if 1 + rl_directory_completion_hook = rlfe_directory_completion_hook; + rl_completion_entry_function = rlfe_filename_completion_function; +#else + rl_directory_rewrite_hook = rlfe_directory_rewrite_hook; +#endif + + in_from_tty_fd = STDIN_FILENO; + FD_ZERO (&in_set); + maxfd = in_from_inferior_fd > in_from_tty_fd ? in_from_inferior_fd + : in_from_tty_fd; + for (;;) + { + int num; + FD_SET (in_from_inferior_fd, &in_set); + FD_SET (in_from_tty_fd, &in_set); + + num = select(maxfd+1, &in_set, NULL, NULL, NULL); + + if (propagate_sigwinch) + { + struct winsize ws; + if (ioctl (STDIN_FILENO, TIOCGWINSZ, &ws) >= 0) + { + ioctl (master, TIOCSWINSZ, &ws); + } + propagate_sigwinch = 0; + continue; + } + + if (num <= 0) + { + perror ("select"); + exit (-1); + } + if (FD_ISSET (in_from_tty_fd, &in_set)) + { + extern int readline_echoing_p; + struct termios term_master; + int do_canon = 1; + int ioctl_ret; + + DPRINT1("[tty avail num_keys:%d]\n", num_keys); + + /* If we can't get tty modes for the master side of the pty, we + can't handle non-canonical-mode programs. Always assume the + master is in canonical echo mode if we can't tell. */ + ioctl_ret = tcgetattr(master, &term_master); + + if (ioctl_ret >= 0) + { + DPRINT2 ("echo:%d, canon:%d\n", + (term_master.c_lflag & ECHO) != 0, + (term_master.c_lflag & ICANON) != 0); + do_canon = (term_master.c_lflag & ICANON) != 0; + readline_echoing_p = (term_master.c_lflag & ECHO) != 0; + } + else + { + if (ioctl_err == 0) + DPRINT1("tcgetattr on master fd failed: errno = %d\n", errno); + ioctl_err = 1; + } + + if (do_canon == 0 && num_keys == 0) + { + char ch[10]; + int count = read (STDIN_FILENO, ch, sizeof(ch)); + write (out_to_inferior_fd, ch, count); + } + else + { + if (num_keys == 0) + { + int i; + /* Re-install callback handler for new prompt. */ + if (prompt != empty_string) + free (prompt); + prompt = malloc (buf_count + 1); + if (prompt == NULL) + prompt = empty_string; + else + { + memcpy (prompt, buf, buf_count); + prompt[buf_count] = '\0'; + DPRINT1("New prompt '%s'\n", prompt); +#if 0 /* ifdef HAVE_RL_ALREADY_PROMPTED -- doesn't work */ + rl_already_prompted = buf_count > 0; +#else + if (buf_count > 0) + write (1, "\r", 1); +#endif + } + rl_callback_handler_install (prompt, line_handler); + } + num_keys++; + rl_callback_read_char (); + } + } + else /* input from inferior. */ + { + int i; + int count; + int old_count; + if (buf_count > (sizeof(buf) >> 2)) + buf_count = 0; + count = read (in_from_inferior_fd, buf+buf_count, + sizeof(buf) - buf_count); + if (count <= 0) + { + DPRINT0 ("(Connection closed by foreign host.)\n"); + tcsetattr(STDIN_FILENO, TCSANOW, &orig_term); + exit (0); + } + old_count = buf_count; + + /* Do some minimal carriage return translation and backspace + processing before logging the input line. */ + if (logfile) + { +#ifndef __GNUC__ + char *b; +#else + char b[count + 1]; +#endif + int i, j; + +#ifndef __GNUC__ + b = malloc (count + 1); + if (b) { +#endif + for (i = 0; i < count; i++) + b[i] = buf[buf_count + i]; + b[i] = '\0'; + for (i = j = 0; i <= count; i++) + { + if (b[i] == '\r') + { + if (b[i+1] != '\n') + b[j++] = '\n'; + } + else if (b[i] == '\b') + { + if (i) + j--; + } + else + b[j++] = b[i]; + } + fprintf (logfile, "%s", b); + +#ifndef __GNUC__ + free (b); + } +#endif + } + + /* Look for any pending echo that we need to suppress. */ + while (echo_suppress_start < echo_suppress_limit + && count > 0 + && buf[buf_count] == echo_suppress_buffer[echo_suppress_start]) + { + count--; + buf_count++; + echo_suppress_start++; + } + + /* Write to the terminal anything that was not suppressed. */ + if (count > 0) + write (1, buf + buf_count, count); + + /* Finally, look for a prompt candidate. + * When we get around to going input (from the keyboard), + * we will consider the prompt to be anything since the last + * line terminator. So we need to save that text in the + * initial part of buf. However, anything before the + * most recent end-of-line is not interesting. */ + buf_count += count; +#if 1 + for (i = buf_count; --i >= old_count; ) +#else + for (i = buf_count - 1; i-- >= buf_count - count; ) +#endif + { + if (buf[i] == '\n' || buf[i] == '\r') + { + i++; + memmove (buf, buf+i, buf_count - i); + buf_count -= i; + break; + } + } + DPRINT2("-> i: %d, buf_count: %d\n", i, buf_count); + } + } +} + +/* + * + * FILENAME COMPLETION FOR RLFE + * + */ + +#ifndef PATH_MAX +# define PATH_MAX 1024 +#endif + +#define DIRSEP '/' +#define ISDIRSEP(x) ((x) == '/') +#define PATHSEP(x) (ISDIRSEP(x) || (x) == 0) + +#define DOT_OR_DOTDOT(x) \ + ((x)[0] == '.' && (PATHSEP((x)[1]) || \ + ((x)[1] == '.' && PATHSEP((x)[2])))) + +#define FREE(x) if (x) free(x) + +#define STRDUP(s, x) do { \ + s = strdup (x);\ + if (s == 0) \ + return ((char *)NULL); \ + } while (0) + +static int +get_inferior_cwd (path, psize) + char *path; + size_t psize; +{ + int n; + static char procfsbuf[PATH_MAX] = { '\0' }; + + if (procfsbuf[0] == '\0') + sprintf (procfsbuf, "/proc/%d/cwd", (int)child); + n = readlink (procfsbuf, path, psize); + if (n < 0) + return n; + if (n > psize) + return -1; + path[n] = '\0'; + return n; +} + +static int +rlfe_directory_rewrite_hook (dirnamep) + char **dirnamep; +{ + char *ldirname, cwd[PATH_MAX], *retdir, *ld; + int n, ldlen; + + ldirname = *dirnamep; + + if (*ldirname == '/') + return 0; + + n = get_inferior_cwd (cwd, sizeof(cwd) - 1); + if (n < 0) + return 0; + if (n == 0) /* current directory */ + { + cwd[0] = '.'; + cwd[1] = '\0'; + n = 1; + } + + /* Minimally canonicalize ldirname by removing leading `./' */ + for (ld = ldirname; *ld; ) + { + if (ISDIRSEP (ld[0])) + ld++; + else if (ld[0] == '.' && PATHSEP(ld[1])) + ld++; + else + break; + } + ldlen = (ld && *ld) ? strlen (ld) : 0; + + retdir = (char *)malloc (n + ldlen + 3); + if (retdir == 0) + return 0; + if (ldlen) + sprintf (retdir, "%s/%s", cwd, ld); + else + strcpy (retdir, cwd); + free (ldirname); + + *dirnamep = retdir; + + DPRINT1("rl_directory_rewrite_hook returns %s\n", retdir); + return 1; +} + +/* Translate *DIRNAMEP to be relative to the inferior's CWD. Leave a trailing + slash on the result. */ +static int +rlfe_directory_completion_hook (dirnamep) + char **dirnamep; +{ + char *ldirname, *retdir; + int n, ldlen; + + ldirname = *dirnamep; + + if (*ldirname == '/') + return 0; + + n = rlfe_directory_rewrite_hook (dirnamep); + if (n == 0) + return 0; + + ldirname = *dirnamep; + ldlen = (ldirname && *ldirname) ? strlen (ldirname) : 0; + + if (ldlen == 0 || ldirname[ldlen - 1] != '/') + { + retdir = (char *)malloc (ldlen + 3); + if (retdir == 0) + return 0; + if (ldlen) + strcpy (retdir, ldirname); + else + retdir[ldlen++] = '.'; + retdir[ldlen] = '/'; + retdir[ldlen+1] = '\0'; + free (ldirname); + + *dirnamep = retdir; + } + + DPRINT1("rl_directory_completion_hook returns %s\n", retdir); + return 1; +} + +static char * +rlfe_filename_completion_function (text, state) + const char *text; + int state; +{ + static DIR *directory; + static char *filename = (char *)NULL; + static char *dirname = (char *)NULL, *ud = (char *)NULL; + static int flen, udlen; + char *temp; + struct dirent *dentry; + + if (state == 0) + { + if (directory) + { + closedir (directory); + directory = 0; + } + FREE (dirname); + FREE (filename); + FREE (ud); + + if (text && *text) + STRDUP (filename, text); + else + { + filename = malloc(1); + if (filename == 0) + return ((char *)NULL); + filename[0] = '\0'; + } + dirname = (text && *text) ? strdup (text) : strdup ("."); + if (dirname == 0) + return ((char *)NULL); + + temp = strrchr (dirname, '/'); + if (temp) + { + strcpy (filename, ++temp); + *temp = '\0'; + } + else + { + dirname[0] = '.'; + dirname[1] = '\0'; + } + + STRDUP (ud, dirname); + udlen = strlen (ud); + + rlfe_directory_completion_hook (&dirname); + + directory = opendir (dirname); + flen = strlen (filename); + + rl_filename_completion_desired = 1; + } + + dentry = 0; + while (directory && (dentry = readdir (directory))) + { + if (flen == 0) + { + if (DOT_OR_DOTDOT(dentry->d_name) == 0) + break; + } + else + { + if ((dentry->d_name[0] == filename[0]) && + (strlen (dentry->d_name) >= flen) && + (strncmp (filename, dentry->d_name, flen) == 0)) + break; + } + } + + if (dentry == 0) + { + if (directory) + { + closedir (directory); + directory = 0; + } + FREE (dirname); + FREE (filename); + FREE (ud); + dirname = filename = ud = 0; + return ((char *)NULL); + } + + if (ud == 0 || (ud[0] == '.' && ud[1] == '\0')) + temp = strdup (dentry->d_name); + else + { + temp = malloc (1 + udlen + strlen (dentry->d_name)); + strcpy (temp, ud); + strcpy (temp + udlen, dentry->d_name); + } + return (temp); +} diff --git a/vendors/readline/src/readline/examples/rltest.c b/vendors/readline/src/readline/examples/rltest.c new file mode 100644 index 0000000..99f083b --- /dev/null +++ b/vendors/readline/src/readline/examples/rltest.c @@ -0,0 +1,87 @@ +/* **************************************************************** */ +/* */ +/* Testing Readline */ +/* */ +/* **************************************************************** */ + +/* Copyright (C) 1987-2002 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library, a library for + reading lines of text with interactive input and history editing. + + The GNU Readline Library is free software; you can redistribute it + and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2, or + (at your option) any later version. + + The GNU Readline 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 General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + +#if defined (HAVE_CONFIG_H) +#include +#endif + +#include +#include + +#ifdef READLINE_LIBRARY +# include "readline.h" +# include "history.h" +#else +# include +# include +#endif + +extern HIST_ENTRY **history_list (); + +main () +{ + char *temp, *prompt; + int done; + + temp = (char *)NULL; + prompt = "readline$ "; + done = 0; + + while (!done) + { + temp = readline (prompt); + + /* Test for EOF. */ + if (!temp) + exit (1); + + /* If there is anything on the line, print it and remember it. */ + if (*temp) + { + fprintf (stderr, "%s\r\n", temp); + add_history (temp); + } + + /* Check for `command' that we handle. */ + if (strcmp (temp, "quit") == 0) + done = 1; + + if (strcmp (temp, "list") == 0) + { + HIST_ENTRY **list; + register int i; + + list = history_list (); + if (list) + { + for (i = 0; list[i]; i++) + fprintf (stderr, "%d: %s\r\n", i, list[i]->line); + } + } + free (temp); + } + exit (0); +} diff --git a/vendors/readline/src/readline/examples/rlversion.c b/vendors/readline/src/readline/examples/rlversion.c new file mode 100644 index 0000000..53949d1 --- /dev/null +++ b/vendors/readline/src/readline/examples/rlversion.c @@ -0,0 +1,43 @@ +/* + * rlversion -- print out readline's version number + */ + +/* Copyright (C) 1987-2002 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library, a library for + reading lines of text with interactive input and history editing. + + The GNU Readline Library is free software; you can redistribute it + and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2, or + (at your option) any later version. + + The GNU Readline 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 General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include +#include +#include "posixstat.h" + +#ifdef READLINE_LIBRARY +# include "readline.h" +#else +# include +#endif + +main() +{ + printf ("%s\n", rl_library_version ? rl_library_version : "unknown"); + exit (0); +} diff --git a/vendors/readline/src/readline/funmap.c b/vendors/readline/src/readline/funmap.c new file mode 100644 index 0000000..f6ea0b6 --- /dev/null +++ b/vendors/readline/src/readline/funmap.c @@ -0,0 +1,256 @@ +/* funmap.c -- attach names to functions. */ + +/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library, a library for + reading lines of text with interactive input and history editing. + + The GNU Readline Library is free software; you can redistribute it + and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2, or + (at your option) any later version. + + The GNU Readline 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 General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#if !defined (BUFSIZ) +#include +#endif /* BUFSIZ */ + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#include "rlconf.h" +#include "readline.h" + +#include "xmalloc.h" + +#ifdef __STDC__ +typedef int QSFUNC (const void *, const void *); +#else +typedef int QSFUNC (); +#endif + +READLINE_DLL_IMPEXP int _rl_qsort_string_compare PARAMS((char **, char **)); + +FUNMAP **funmap; +static int funmap_size; +static int funmap_entry; + +/* After initializing the function map, this is the index of the first + program specific function. */ +int funmap_program_specific_entry_start; +#ifdef READLINE_DLL_IMPEXP +# undef READLINE_DLL_IMPEXP +#endif /* READLINE_DLL_IMPEXP */ +static FUNMAP default_funmap[] = { + { "abort", rl_abort }, + { "accept-line", rl_newline }, + { "arrow-key-prefix", rl_arrow_keys }, + { "backward-byte", rl_backward_byte }, + { "backward-char", rl_backward_char }, + { "backward-delete-char", rl_rubout }, + { "backward-kill-line", rl_backward_kill_line }, + { "backward-kill-word", rl_backward_kill_word }, + { "backward-word", rl_backward_word }, + { "beginning-of-history", rl_beginning_of_history }, + { "beginning-of-line", rl_beg_of_line }, + { "call-last-kbd-macro", rl_call_last_kbd_macro }, + { "capitalize-word", rl_capitalize_word }, + { "character-search", rl_char_search }, + { "character-search-backward", rl_backward_char_search }, + { "clear-screen", rl_clear_screen }, + { "complete", rl_complete }, + { "copy-backward-word", rl_copy_backward_word }, + { "copy-forward-word", rl_copy_forward_word }, + { "copy-region-as-kill", rl_copy_region_to_kill }, + { "delete-char", rl_delete }, + { "delete-char-or-list", rl_delete_or_show_completions }, + { "delete-horizontal-space", rl_delete_horizontal_space }, + { "digit-argument", rl_digit_argument }, + { "do-lowercase-version", rl_do_lowercase_version }, + { "downcase-word", rl_downcase_word }, + { "dump-functions", rl_dump_functions }, + { "dump-macros", rl_dump_macros }, + { "dump-variables", rl_dump_variables }, + { "emacs-editing-mode", rl_emacs_editing_mode }, + { "end-kbd-macro", rl_end_kbd_macro }, + { "end-of-history", rl_end_of_history }, + { "end-of-line", rl_end_of_line }, + { "exchange-point-and-mark", rl_exchange_point_and_mark }, + { "forward-backward-delete-char", rl_rubout_or_delete }, + { "forward-byte", rl_forward_byte }, + { "forward-char", rl_forward_char }, + { "forward-search-history", rl_forward_search_history }, + { "forward-word", rl_forward_word }, + { "history-search-backward", rl_history_search_backward }, + { "history-search-forward", rl_history_search_forward }, + { "insert-comment", rl_insert_comment }, + { "insert-completions", rl_insert_completions }, + { "kill-whole-line", rl_kill_full_line }, + { "kill-line", rl_kill_line }, + { "kill-region", rl_kill_region }, + { "kill-word", rl_kill_word }, + { "menu-complete", rl_menu_complete }, + { "next-history", rl_get_next_history }, + { "non-incremental-forward-search-history", rl_noninc_forward_search }, + { "non-incremental-reverse-search-history", rl_noninc_reverse_search }, + { "non-incremental-forward-search-history-again", rl_noninc_forward_search_again }, + { "non-incremental-reverse-search-history-again", rl_noninc_reverse_search_again }, + { "overwrite-mode", rl_overwrite_mode }, +#if defined (__CYGWIN__) || defined (_WIN32) + { "paste-from-clipboard", rl_paste_from_clipboard }, +#endif + { "possible-completions", rl_possible_completions }, + { "previous-history", rl_get_previous_history }, + { "quoted-insert", rl_quoted_insert }, + { "re-read-init-file", rl_re_read_init_file }, + { "redraw-current-line", rl_refresh_line}, + { "reverse-search-history", rl_reverse_search_history }, + { "revert-line", rl_revert_line }, + { "self-insert", rl_insert }, + { "set-mark", rl_set_mark }, + { "start-kbd-macro", rl_start_kbd_macro }, + { "tab-insert", rl_tab_insert }, + { "tilde-expand", rl_tilde_expand }, + { "transpose-chars", rl_transpose_chars }, + { "transpose-words", rl_transpose_words }, + { "tty-status", rl_tty_status }, + { "undo", rl_undo_command }, + { "universal-argument", rl_universal_argument }, + { "unix-filename-rubout", rl_unix_filename_rubout }, + { "unix-line-discard", rl_unix_line_discard }, + { "unix-word-rubout", rl_unix_word_rubout }, + { "upcase-word", rl_upcase_word }, + { "yank", rl_yank }, + { "yank-last-arg", rl_yank_last_arg }, + { "yank-nth-arg", rl_yank_nth_arg }, + { "yank-pop", rl_yank_pop }, + +#if defined (VI_MODE) + { "vi-append-eol", rl_vi_append_eol }, + { "vi-append-mode", rl_vi_append_mode }, + { "vi-arg-digit", rl_vi_arg_digit }, + { "vi-back-to-indent", rl_vi_back_to_indent }, + { "vi-bWord", rl_vi_bWord }, + { "vi-bword", rl_vi_bword }, + { "vi-change-case", rl_vi_change_case }, + { "vi-change-char", rl_vi_change_char }, + { "vi-change-to", rl_vi_change_to }, + { "vi-char-search", rl_vi_char_search }, + { "vi-column", rl_vi_column }, + { "vi-complete", rl_vi_complete }, + { "vi-delete", rl_vi_delete }, + { "vi-delete-to", rl_vi_delete_to }, + { "vi-eWord", rl_vi_eWord }, + { "vi-editing-mode", rl_vi_editing_mode }, + { "vi-end-word", rl_vi_end_word }, + { "vi-eof-maybe", rl_vi_eof_maybe }, + { "vi-eword", rl_vi_eword }, + { "vi-fWord", rl_vi_fWord }, + { "vi-fetch-history", rl_vi_fetch_history }, + { "vi-first-print", rl_vi_first_print }, + { "vi-fword", rl_vi_fword }, + { "vi-goto-mark", rl_vi_goto_mark }, + { "vi-insert-beg", rl_vi_insert_beg }, + { "vi-insertion-mode", rl_vi_insertion_mode }, + { "vi-match", rl_vi_match }, + { "vi-movement-mode", rl_vi_movement_mode }, + { "vi-next-word", rl_vi_next_word }, + { "vi-overstrike", rl_vi_overstrike }, + { "vi-overstrike-delete", rl_vi_overstrike_delete }, + { "vi-prev-word", rl_vi_prev_word }, + { "vi-put", rl_vi_put }, + { "vi-redo", rl_vi_redo }, + { "vi-replace", rl_vi_replace }, + { "vi-search", rl_vi_search }, + { "vi-search-again", rl_vi_search_again }, + { "vi-set-mark", rl_vi_set_mark }, + { "vi-subst", rl_vi_subst }, + { "vi-tilde-expand", rl_vi_tilde_expand }, + { "vi-yank-arg", rl_vi_yank_arg }, + { "vi-yank-to", rl_vi_yank_to }, +#endif /* VI_MODE */ + + {(char *)NULL, (rl_command_func_t *)NULL } +}; + +int +rl_add_funmap_entry (name, function) + const char *name; + rl_command_func_t *function; +{ + if (funmap_entry + 2 >= funmap_size) + { + funmap_size += 64; + funmap = (FUNMAP **)xrealloc (funmap, funmap_size * sizeof (FUNMAP *)); + } + + funmap[funmap_entry] = (FUNMAP *)xmalloc (sizeof (FUNMAP)); + funmap[funmap_entry]->name = name; + funmap[funmap_entry]->function = function; + + funmap[++funmap_entry] = (FUNMAP *)NULL; + return funmap_entry; +} + +static int funmap_initialized; + +/* Make the funmap contain all of the default entries. */ +void +rl_initialize_funmap () +{ + register int i; + + if (funmap_initialized) + return; + + for (i = 0; default_funmap[i].name; i++) + rl_add_funmap_entry (default_funmap[i].name, default_funmap[i].function); + + funmap_initialized = 1; + funmap_program_specific_entry_start = i; +} + +/* Produce a NULL terminated array of known function names. The array + is sorted. The array itself is allocated, but not the strings inside. + You should free () the array when you done, but not the pointrs. */ +const char ** +rl_funmap_names () +{ + const char **result; + int result_size, result_index; + + /* Make sure that the function map has been initialized. */ + rl_initialize_funmap (); + + for (result_index = result_size = 0, result = (const char **)NULL; funmap[result_index]; result_index++) + { + if (result_index + 2 > result_size) + { + result_size += 20; + result = (const char **)xrealloc (result, result_size * sizeof (char *)); + } + + result[result_index] = funmap[result_index]->name; + result[result_index + 1] = (char *)NULL; + } + + qsort (result, result_index, sizeof (char *), (QSFUNC *)_rl_qsort_string_compare); + return (result); +} diff --git a/vendors/readline/src/readline/histexpand.c b/vendors/readline/src/readline/histexpand.c new file mode 100644 index 0000000..2ab34cb --- /dev/null +++ b/vendors/readline/src/readline/histexpand.c @@ -0,0 +1,1591 @@ +/* histexpand.c -- history expansion. */ + +/* Copyright (C) 1989-2004 Free Software Foundation, Inc. + + This file contains the GNU History Library (the Library), a set of + routines for managing the text of previously typed lines. + + The Library is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + The 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 + General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#if defined (HAVE_UNISTD_H) +# ifndef _MINIX +# include +# endif +# include +#endif + +#include "rlmbutil.h" + +#include "history.h" +#include "histlib.h" + +#include "rlshell.h" +#include "xmalloc.h" + +#define HISTORY_WORD_DELIMITERS " \t\n;&()|<>" +#define HISTORY_QUOTE_CHARACTERS "\"'`" + +#define slashify_in_quotes "\\`\"$" + +typedef int _hist_search_func_t PARAMS((const char *, int)); + +extern int rl_byte_oriented; /* declared in mbutil.c */ + +static char error_pointer; + +static char *subst_lhs; +static char *subst_rhs; +static int subst_lhs_len; +static int subst_rhs_len; + +static char *get_history_word_specifier PARAMS((char *, char *, int *)); +static char *history_find_word PARAMS((char *, int)); +static int history_tokenize_word PARAMS((const char *, int)); +static char *history_substring PARAMS((const char *, int, int)); + +static char *quote_breaks PARAMS((char *)); + +/* Variables exported by this file. */ +/* The character that represents the start of a history expansion + request. This is usually `!'. */ +char history_expansion_char = '!'; + +/* The character that invokes word substitution if found at the start of + a line. This is usually `^'. */ +char history_subst_char = '^'; + +/* During tokenization, if this character is seen as the first character + of a word, then it, and all subsequent characters upto a newline are + ignored. For a Bourne shell, this should be '#'. Bash special cases + the interactive comment character to not be a comment delimiter. */ +char history_comment_char = '\0'; + +/* The list of characters which inhibit the expansion of text if found + immediately following history_expansion_char. */ +char *history_no_expand_chars = " \t\n\r="; + +/* If set to a non-zero value, single quotes inhibit history expansion. + The default is 0. */ +int history_quotes_inhibit_expansion = 0; + +/* Used to split words by history_tokenize_internal. */ +char *history_word_delimiters = HISTORY_WORD_DELIMITERS; + +/* If set, this points to a function that is called to verify that a + particular history expansion should be performed. */ +rl_linebuf_func_t *history_inhibit_expansion_function; + +/* **************************************************************** */ +/* */ +/* History Expansion */ +/* */ +/* **************************************************************** */ + +/* Hairy history expansion on text, not tokens. This is of general + use, and thus belongs in this library. */ + +/* The last string searched for by a !?string? search. */ +static char *search_string; + +/* The last string matched by a !?string? search. */ +static char *search_match; + +/* Return the event specified at TEXT + OFFSET modifying OFFSET to + point to after the event specifier. Just a pointer to the history + line is returned; NULL is returned in the event of a bad specifier. + You pass STRING with *INDEX equal to the history_expansion_char that + begins this specification. + DELIMITING_QUOTE is a character that is allowed to end the string + specification for what to search for in addition to the normal + characters `:', ` ', `\t', `\n', and sometimes `?'. + So you might call this function like: + line = get_history_event ("!echo:p", &index, 0); */ +char * +get_history_event (string, caller_index, delimiting_quote) + const char *string; + int *caller_index; + int delimiting_quote; +{ + register int i; + register char c; + HIST_ENTRY *entry; + int which, sign, local_index, substring_okay; + _hist_search_func_t *search_func; + char *temp; + + /* The event can be specified in a number of ways. + + !! the previous command + !n command line N + !-n current command-line minus N + !str the most recent command starting with STR + !?str[?] + the most recent command containing STR + + All values N are determined via HISTORY_BASE. */ + + i = *caller_index; + + if (string[i] != history_expansion_char) + return ((char *)NULL); + + /* Move on to the specification. */ + i++; + + sign = 1; + substring_okay = 0; + +#define RETURN_ENTRY(e, w) \ + return ((e = history_get (w)) ? e->line : (char *)NULL) + + /* Handle !! case. */ + if (string[i] == history_expansion_char) + { + i++; + which = history_base + (history_length - 1); + *caller_index = i; + RETURN_ENTRY (entry, which); + } + + /* Hack case of numeric line specification. */ + if (string[i] == '-') + { + sign = -1; + i++; + } + + if (_rl_digit_p (string[i])) + { + /* Get the extent of the digits and compute the value. */ + for (which = 0; _rl_digit_p (string[i]); i++) + which = (which * 10) + _rl_digit_value (string[i]); + + *caller_index = i; + + if (sign < 0) + which = (history_length + history_base) - which; + + RETURN_ENTRY (entry, which); + } + + /* This must be something to search for. If the spec begins with + a '?', then the string may be anywhere on the line. Otherwise, + the string must be found at the start of a line. */ + if (string[i] == '?') + { + substring_okay++; + i++; + } + + /* Only a closing `?' or a newline delimit a substring search string. */ + for (local_index = i; c = string[i]; i++) +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + { + int v; + mbstate_t ps; + + memset (&ps, 0, sizeof (mbstate_t)); + /* These produce warnings because we're passing a const string to a + function that takes a non-const string. */ + _rl_adjust_point ((char *)string, i, &ps); + if ((v = _rl_get_char_len ((char *)string + i, &ps)) > 1) + { + i += v - 1; + continue; + } + } + else +#endif /* HANDLE_MULTIBYTE */ + if ((!substring_okay && (whitespace (c) || c == ':' || + (history_search_delimiter_chars && member (c, history_search_delimiter_chars)) || + string[i] == delimiting_quote)) || + string[i] == '\n' || + (substring_okay && string[i] == '?')) + break; + + which = i - local_index; + temp = (char *)xmalloc (1 + which); + if (which) + strncpy (temp, string + local_index, which); + temp[which] = '\0'; + + if (substring_okay && string[i] == '?') + i++; + + *caller_index = i; + +#define FAIL_SEARCH() \ + do { \ + history_offset = history_length; free (temp) ; return (char *)NULL; \ + } while (0) + + /* If there is no search string, try to use the previous search string, + if one exists. If not, fail immediately. */ + if (*temp == '\0' && substring_okay) + { + if (search_string) + { + free (temp); + temp = savestring (search_string); + } + else + FAIL_SEARCH (); + } + + search_func = substring_okay ? history_search : history_search_prefix; + while (1) + { + local_index = (*search_func) (temp, -1); + + if (local_index < 0) + FAIL_SEARCH (); + + if (local_index == 0 || substring_okay) + { + entry = current_history (); + history_offset = history_length; + + /* If this was a substring search, then remember the + string that we matched for word substitution. */ + if (substring_okay) + { + FREE (search_string); + search_string = temp; + + FREE (search_match); + search_match = history_find_word (entry->line, local_index); + } + else + free (temp); + + return (entry->line); + } + + if (history_offset) + history_offset--; + else + FAIL_SEARCH (); + } +#undef FAIL_SEARCH +#undef RETURN_ENTRY +} + +/* Function for extracting single-quoted strings. Used for inhibiting + history expansion within single quotes. */ + +/* Extract the contents of STRING as if it is enclosed in single quotes. + SINDEX, when passed in, is the offset of the character immediately + following the opening single quote; on exit, SINDEX is left pointing + to the closing single quote. */ +static void +hist_string_extract_single_quoted (string, sindex) + char *string; + int *sindex; +{ + register int i; + + for (i = *sindex; string[i] && string[i] != '\''; i++) + ; + + *sindex = i; +} + +static char * +quote_breaks (s) + char *s; +{ + register char *p, *r; + char *ret; + int len = 3; + + for (p = s; p && *p; p++, len++) + { + if (*p == '\'') + len += 3; + else if (whitespace (*p) || *p == '\n') + len += 2; + } + + r = ret = (char *)xmalloc (len); + *r++ = '\''; + for (p = s; p && *p; ) + { + if (*p == '\'') + { + *r++ = '\''; + *r++ = '\\'; + *r++ = '\''; + *r++ = '\''; + p++; + } + else if (whitespace (*p) || *p == '\n') + { + *r++ = '\''; + *r++ = *p++; + *r++ = '\''; + } + else + *r++ = *p++; + } + *r++ = '\''; + *r = '\0'; + return ret; +} + +static char * +hist_error(s, start, current, errtype) + char *s; + int start, current, errtype; +{ + char *temp; + const char *emsg; + int ll, elen; + + ll = current - start; + + switch (errtype) + { + case EVENT_NOT_FOUND: + emsg = "event not found"; + elen = 15; + break; + case BAD_WORD_SPEC: + emsg = "bad word specifier"; + elen = 18; + break; + case SUBST_FAILED: + emsg = "substitution failed"; + elen = 19; + break; + case BAD_MODIFIER: + emsg = "unrecognized history modifier"; + elen = 29; + break; + case NO_PREV_SUBST: + emsg = "no previous substitution"; + elen = 24; + break; + default: + emsg = "unknown expansion error"; + elen = 23; + break; + } + + temp = (char *)xmalloc (ll + elen + 3); + strncpy (temp, s + start, ll); + temp[ll] = ':'; + temp[ll + 1] = ' '; + strcpy (temp + ll + 2, emsg); + return (temp); +} + +/* Get a history substitution string from STR starting at *IPTR + and return it. The length is returned in LENPTR. + + A backslash can quote the delimiter. If the string is the + empty string, the previous pattern is used. If there is + no previous pattern for the lhs, the last history search + string is used. + + If IS_RHS is 1, we ignore empty strings and set the pattern + to "" anyway. subst_lhs is not changed if the lhs is empty; + subst_rhs is allowed to be set to the empty string. */ + +static char * +get_subst_pattern (str, iptr, delimiter, is_rhs, lenptr) + char *str; + int *iptr, delimiter, is_rhs, *lenptr; +{ + register int si, i, j, k; + char *s; +#if defined (HANDLE_MULTIBYTE) + mbstate_t ps; +#endif + + s = (char *)NULL; + i = *iptr; + +#if defined (HANDLE_MULTIBYTE) + memset (&ps, 0, sizeof (mbstate_t)); + _rl_adjust_point (str, i, &ps); +#endif + + for (si = i; str[si] && str[si] != delimiter; si++) +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + { + int v; + if ((v = _rl_get_char_len (str + si, &ps)) > 1) + si += v - 1; + else if (str[si] == '\\' && str[si + 1] == delimiter) + si++; + } + else +#endif /* HANDLE_MULTIBYTE */ + if (str[si] == '\\' && str[si + 1] == delimiter) + si++; + + if (si > i || is_rhs) + { + s = (char *)xmalloc (si - i + 1); + for (j = 0, k = i; k < si; j++, k++) + { + /* Remove a backslash quoting the search string delimiter. */ + if (str[k] == '\\' && str[k + 1] == delimiter) + k++; + s[j] = str[k]; + } + s[j] = '\0'; + if (lenptr) + *lenptr = j; + } + + i = si; + if (str[i]) + i++; + *iptr = i; + + return s; +} + +static void +postproc_subst_rhs () +{ + char *new; + int i, j, new_size; + + new = (char *)xmalloc (new_size = subst_rhs_len + subst_lhs_len); + for (i = j = 0; i < subst_rhs_len; i++) + { + if (subst_rhs[i] == '&') + { + if (j + subst_lhs_len >= new_size) + new = (char *)xrealloc (new, (new_size = new_size * 2 + subst_lhs_len)); + strcpy (new + j, subst_lhs); + j += subst_lhs_len; + } + else + { + /* a single backslash protects the `&' from lhs interpolation */ + if (subst_rhs[i] == '\\' && subst_rhs[i + 1] == '&') + i++; + if (j >= new_size) + new = (char *)xrealloc (new, new_size *= 2); + new[j++] = subst_rhs[i]; + } + } + new[j] = '\0'; + free (subst_rhs); + subst_rhs = new; + subst_rhs_len = j; +} + +/* Expand the bulk of a history specifier starting at STRING[START]. + Returns 0 if everything is OK, -1 if an error occurred, and 1 + if the `p' modifier was supplied and the caller should just print + the returned string. Returns the new index into string in + *END_INDEX_PTR, and the expanded specifier in *RET_STRING. */ +static int +history_expand_internal (string, start, end_index_ptr, ret_string, current_line) + char *string; + int start, *end_index_ptr; + char **ret_string; + char *current_line; /* for !# */ +{ + int i, n, starting_index; + int substitute_globally, subst_bywords, want_quotes, print_only; + char *event, *temp, *result, *tstr, *t, c, *word_spec; + int result_len; +#if defined (HANDLE_MULTIBYTE) + mbstate_t ps; + + memset (&ps, 0, sizeof (mbstate_t)); +#endif + + result = (char *)xmalloc (result_len = 128); + + i = start; + + /* If it is followed by something that starts a word specifier, + then !! is implied as the event specifier. */ + + if (member (string[i + 1], ":$*%^")) + { + char fake_s[3]; + int fake_i = 0; + i++; + fake_s[0] = fake_s[1] = history_expansion_char; + fake_s[2] = '\0'; + event = get_history_event (fake_s, &fake_i, 0); + } + else if (string[i + 1] == '#') + { + i += 2; + event = current_line; + } + else + { + int quoted_search_delimiter = 0; + + /* If the character before this `!' is a double or single + quote, then this expansion takes place inside of the + quoted string. If we have to search for some text ("!foo"), + allow the delimiter to end the search string. */ +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + { + int c, l; + l = _rl_find_prev_mbchar (string, i, MB_FIND_ANY); + c = string[l]; + /* XXX - original patch had i - 1 ??? If i == 0 it would fail. */ + if (i && (c == '\'' || c == '"')) + quoted_search_delimiter = c; + } + else +#endif /* HANDLE_MULTIBYTE */ + if (i && (string[i - 1] == '\'' || string[i - 1] == '"')) + quoted_search_delimiter = string[i - 1]; + + event = get_history_event (string, &i, quoted_search_delimiter); + } + + if (event == 0) + { + *ret_string = hist_error (string, start, i, EVENT_NOT_FOUND); + free (result); + return (-1); + } + + /* If a word specifier is found, then do what that requires. */ + starting_index = i; + word_spec = get_history_word_specifier (string, event, &i); + + /* There is no such thing as a `malformed word specifier'. However, + it is possible for a specifier that has no match. In that case, + we complain. */ + if (word_spec == (char *)&error_pointer) + { + *ret_string = hist_error (string, starting_index, i, BAD_WORD_SPEC); + free (result); + return (-1); + } + + /* If no word specifier, than the thing of interest was the event. */ + temp = word_spec ? savestring (word_spec) : savestring (event); + FREE (word_spec); + + /* Perhaps there are other modifiers involved. Do what they say. */ + want_quotes = substitute_globally = subst_bywords = print_only = 0; + starting_index = i; + + while (string[i] == ':') + { + c = string[i + 1]; + + if (c == 'g' || c == 'a') + { + substitute_globally = 1; + i++; + c = string[i + 1]; + } + else if (c == 'G') + { + subst_bywords = 1; + i++; + c = string[i + 1]; + } + + switch (c) + { + default: + *ret_string = hist_error (string, i+1, i+2, BAD_MODIFIER); + free (result); + free (temp); + return -1; + + case 'q': + want_quotes = 'q'; + break; + + case 'x': + want_quotes = 'x'; + break; + + /* :p means make this the last executed line. So we + return an error state after adding this line to the + history. */ + case 'p': + print_only++; + break; + + /* :t discards all but the last part of the pathname. */ + case 't': + tstr = strrchr (temp, '/'); + if (tstr) + { + tstr++; + t = savestring (tstr); + free (temp); + temp = t; + } + break; + + /* :h discards the last part of a pathname. */ + case 'h': + tstr = strrchr (temp, '/'); + if (tstr) + *tstr = '\0'; + break; + + /* :r discards the suffix. */ + case 'r': + tstr = strrchr (temp, '.'); + if (tstr) + *tstr = '\0'; + break; + + /* :e discards everything but the suffix. */ + case 'e': + tstr = strrchr (temp, '.'); + if (tstr) + { + t = savestring (tstr); + free (temp); + temp = t; + } + break; + + /* :s/this/that substitutes `that' for the first + occurrence of `this'. :gs/this/that substitutes `that' + for each occurrence of `this'. :& repeats the last + substitution. :g& repeats the last substitution + globally. */ + + case '&': + case 's': + { + char *new_event; + int delimiter, failed, si, l_temp, ws, we; + + if (c == 's') + { + if (i + 2 < (int)strlen (string)) + { +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + { + _rl_adjust_point (string, i + 2, &ps); + if (_rl_get_char_len (string + i + 2, &ps) > 1) + delimiter = 0; + else + delimiter = string[i + 2]; + } + else +#endif /* HANDLE_MULTIBYTE */ + delimiter = string[i + 2]; + } + else + break; /* no search delimiter */ + + i += 3; + + t = get_subst_pattern (string, &i, delimiter, 0, &subst_lhs_len); + /* An empty substitution lhs with no previous substitution + uses the last search string as the lhs. */ + if (t) + { + FREE (subst_lhs); + subst_lhs = t; + } + else if (!subst_lhs) + { + if (search_string && *search_string) + { + subst_lhs = savestring (search_string); + subst_lhs_len = strlen (subst_lhs); + } + else + { + subst_lhs = (char *) NULL; + subst_lhs_len = 0; + } + } + + FREE (subst_rhs); + subst_rhs = get_subst_pattern (string, &i, delimiter, 1, &subst_rhs_len); + + /* If `&' appears in the rhs, it's supposed to be replaced + with the lhs. */ + if (member ('&', subst_rhs)) + postproc_subst_rhs (); + } + else + i += 2; + + /* If there is no lhs, the substitution can't succeed. */ + if (subst_lhs_len == 0) + { + *ret_string = hist_error (string, starting_index, i, NO_PREV_SUBST); + free (result); + free (temp); + return -1; + } + + l_temp = strlen (temp); + /* Ignore impossible cases. */ + if (subst_lhs_len > l_temp) + { + *ret_string = hist_error (string, starting_index, i, SUBST_FAILED); + free (result); + free (temp); + return (-1); + } + + /* Find the first occurrence of THIS in TEMP. */ + /* Substitute SUBST_RHS for SUBST_LHS in TEMP. There are three + cases to consider: + + 1. substitute_globally == subst_bywords == 0 + 2. substitute_globally == 1 && subst_bywords == 0 + 3. substitute_globally == 0 && subst_bywords == 1 + + In the first case, we substitute for the first occurrence only. + In the second case, we substitute for every occurrence. + In the third case, we tokenize into words and substitute the + first occurrence of each word. */ + + si = we = 0; + for (failed = 1; (si + subst_lhs_len) <= l_temp; si++) + { + /* First skip whitespace and find word boundaries if + we're past the end of the word boundary we found + the last time. */ + if (subst_bywords && si > we) + { + for (; temp[si] && whitespace (temp[si]); si++) + ; + ws = si; + we = history_tokenize_word (temp, si); + } + + if (STREQN (temp+si, subst_lhs, subst_lhs_len)) + { + int len = subst_rhs_len - subst_lhs_len + l_temp; + new_event = (char *)xmalloc (1 + len); + strncpy (new_event, temp, si); + strncpy (new_event + si, subst_rhs, subst_rhs_len); + strncpy (new_event + si + subst_rhs_len, + temp + si + subst_lhs_len, + l_temp - (si + subst_lhs_len)); + new_event[len] = '\0'; + free (temp); + temp = new_event; + + failed = 0; + + if (substitute_globally) + { + /* Reported to fix a bug that causes it to skip every + other match when matching a single character. Was + si += subst_rhs_len previously. */ + si += subst_rhs_len - 1; + l_temp = strlen (temp); + substitute_globally++; + continue; + } + else if (subst_bywords) + { + si = we; + l_temp = strlen (temp); + continue; + } + else + break; + } + } + + if (substitute_globally > 1) + { + substitute_globally = 0; + continue; /* don't want to increment i */ + } + + if (failed == 0) + continue; /* don't want to increment i */ + + *ret_string = hist_error (string, starting_index, i, SUBST_FAILED); + free (result); + free (temp); + return (-1); + } + } + i += 2; + } + /* Done with modfiers. */ + /* Believe it or not, we have to back the pointer up by one. */ + --i; + + if (want_quotes) + { + char *x; + + if (want_quotes == 'q') + x = sh_single_quote (temp); + else if (want_quotes == 'x') + x = quote_breaks (temp); + else + x = savestring (temp); + + free (temp); + temp = x; + } + + n = strlen (temp); + if (n >= result_len) + result = (char *)xrealloc (result, n + 2); + strcpy (result, temp); + free (temp); + + *end_index_ptr = i; + *ret_string = result; + return (print_only); +} + +/* Expand the string STRING, placing the result into OUTPUT, a pointer + to a string. Returns: + + -1) If there was an error in expansion. + 0) If no expansions took place (or, if the only change in + the text was the de-slashifying of the history expansion + character) + 1) If expansions did take place + 2) If the `p' modifier was given and the caller should print the result + + If an error ocurred in expansion, then OUTPUT contains a descriptive + error message. */ + +#define ADD_STRING(s) \ + do \ + { \ + int sl = strlen (s); \ + j += sl; \ + if (j >= result_len) \ + { \ + while (j >= result_len) \ + result_len += 128; \ + result = (char *)xrealloc (result, result_len); \ + } \ + strcpy (result + j - sl, s); \ + } \ + while (0) + +#define ADD_CHAR(c) \ + do \ + { \ + if (j >= result_len - 1) \ + result = (char *)xrealloc (result, result_len += 64); \ + result[j++] = c; \ + result[j] = '\0'; \ + } \ + while (0) + +int +history_expand (hstring, output) + char *hstring; + char **output; +{ + register int j; + int i, r, l, passc, cc, modified, eindex, only_printing, dquote; + char *string; + + /* The output string, and its length. */ + int result_len; + char *result; + +#if defined (HANDLE_MULTIBYTE) + char mb[MB_LEN_MAX]; + mbstate_t ps; +#endif + + /* Used when adding the string. */ + char *temp; + + if (output == 0) + return 0; + + /* Setting the history expansion character to 0 inhibits all + history expansion. */ + if (history_expansion_char == 0) + { + *output = savestring (hstring); + return (0); + } + + /* Prepare the buffer for printing error messages. */ + result = (char *)xmalloc (result_len = 256); + result[0] = '\0'; + + only_printing = modified = 0; + l = strlen (hstring); + + /* Grovel the string. Only backslash and single quotes can quote the + history escape character. We also handle arg specifiers. */ + + /* Before we grovel forever, see if the history_expansion_char appears + anywhere within the text. */ + + /* The quick substitution character is a history expansion all right. That + is to say, "^this^that^" is equivalent to "!!:s^this^that^", and in fact, + that is the substitution that we do. */ + if (hstring[0] == history_subst_char) + { + string = (char *)xmalloc (l + 5); + + string[0] = string[1] = history_expansion_char; + string[2] = ':'; + string[3] = 's'; + strcpy (string + 4, hstring); + l += 4; + } + else + { +#if defined (HANDLE_MULTIBYTE) + memset (&ps, 0, sizeof (mbstate_t)); +#endif + + string = hstring; + /* If not quick substitution, still maybe have to do expansion. */ + + /* `!' followed by one of the characters in history_no_expand_chars + is NOT an expansion. */ + for (i = dquote = 0; string[i]; i++) + { +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + { + int v; + v = _rl_get_char_len (string + i, &ps); + if (v > 1) + { + i += v - 1; + continue; + } + } +#endif /* HANDLE_MULTIBYTE */ + + cc = string[i + 1]; + /* The history_comment_char, if set, appearing at the beginning + of a word signifies that the rest of the line should not have + history expansion performed on it. + Skip the rest of the line and break out of the loop. */ + if (history_comment_char && string[i] == history_comment_char && + (i == 0 || member (string[i - 1], history_word_delimiters))) + { + while (string[i]) + i++; + break; + } + else if (string[i] == history_expansion_char) + { + if (!cc || member (cc, history_no_expand_chars)) + continue; + /* If the calling application has set + history_inhibit_expansion_function to a function that checks + for special cases that should not be history expanded, + call the function and skip the expansion if it returns a + non-zero value. */ + else if (history_inhibit_expansion_function && + (*history_inhibit_expansion_function) (string, i)) + continue; + else + break; + } + /* Shell-like quoting: allow backslashes to quote double quotes + inside a double-quoted string. */ + else if (dquote && string[i] == '\\' && cc == '"') + i++; + /* More shell-like quoting: if we're paying attention to single + quotes and letting them quote the history expansion character, + then we need to pay attention to double quotes, because single + quotes are not special inside double-quoted strings. */ + else if (history_quotes_inhibit_expansion && string[i] == '"') + { + dquote = 1 - dquote; + } + else if (dquote == 0 && history_quotes_inhibit_expansion && string[i] == '\'') + { + /* If this is bash, single quotes inhibit history expansion. */ + i++; + hist_string_extract_single_quoted (string, &i); + } + else if (history_quotes_inhibit_expansion && string[i] == '\\') + { + /* If this is bash, allow backslashes to quote single + quotes and the history expansion character. */ + if (cc == '\'' || cc == history_expansion_char) + i++; + } + + } + + if (string[i] != history_expansion_char) + { + free (result); + *output = savestring (string); + return (0); + } + } + + /* Extract and perform the substitution. */ + for (passc = dquote = i = j = 0; i < l; i++) + { + int tchar = string[i]; + + if (passc) + { + passc = 0; + ADD_CHAR (tchar); + continue; + } + +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + { + int k, c; + + c = tchar; + memset (mb, 0, sizeof (mb)); + for (k = 0; k < MB_LEN_MAX; k++) + { + mb[k] = (char)c; + memset (&ps, 0, sizeof (mbstate_t)); + if (_rl_get_char_len (mb, &ps) == -2) + c = string[++i]; + else + break; + } + if (strlen (mb) > 1) + { + ADD_STRING (mb); + break; + } + } +#endif /* HANDLE_MULTIBYTE */ + + if (tchar == history_expansion_char) + tchar = -3; + else if (tchar == history_comment_char) + tchar = -2; + + switch (tchar) + { + default: + ADD_CHAR (string[i]); + break; + + case '\\': + passc++; + ADD_CHAR (tchar); + break; + + case '"': + dquote = 1 - dquote; + ADD_CHAR (tchar); + break; + + case '\'': + { + /* If history_quotes_inhibit_expansion is set, single quotes + inhibit history expansion. */ + if (dquote == 0 && history_quotes_inhibit_expansion) + { + int quote, slen; + + quote = i++; + hist_string_extract_single_quoted (string, &i); + + slen = i - quote + 2; + temp = (char *)xmalloc (slen); + strncpy (temp, string + quote, slen); + temp[slen - 1] = '\0'; + ADD_STRING (temp); + free (temp); + } + else + ADD_CHAR (string[i]); + break; + } + + case -2: /* history_comment_char */ + if (i == 0 || member (string[i - 1], history_word_delimiters)) + { + temp = (char *)xmalloc (l - i + 1); + strcpy (temp, string + i); + ADD_STRING (temp); + free (temp); + i = l; + } + else + ADD_CHAR (string[i]); + break; + + case -3: /* history_expansion_char */ + cc = string[i + 1]; + + /* If the history_expansion_char is followed by one of the + characters in history_no_expand_chars, then it is not a + candidate for expansion of any kind. */ + if (member (cc, history_no_expand_chars)) + { + ADD_CHAR (string[i]); + break; + } + +#if defined (NO_BANG_HASH_MODIFIERS) + /* There is something that is listed as a `word specifier' in csh + documentation which means `the expanded text to this point'. + That is not a word specifier, it is an event specifier. If we + don't want to allow modifiers with `!#', just stick the current + output line in again. */ + if (cc == '#') + { + if (result) + { + temp = (char *)xmalloc (1 + strlen (result)); + strcpy (temp, result); + ADD_STRING (temp); + free (temp); + } + i++; + break; + } +#endif + + r = history_expand_internal (string, i, &eindex, &temp, result); + if (r < 0) + { + *output = temp; + free (result); + if (string != hstring) + free (string); + return -1; + } + else + { + if (temp) + { + modified++; + if (*temp) + ADD_STRING (temp); + free (temp); + } + only_printing = r == 1; + i = eindex; + } + break; + } + } + + *output = result; + if (string != hstring) + free (string); + + if (only_printing) + { +#if 0 + add_history (result); +#endif + return (2); + } + + return (modified != 0); +} + +/* Return a consed string which is the word specified in SPEC, and found + in FROM. NULL is returned if there is no spec. The address of + ERROR_POINTER is returned if the word specified cannot be found. + CALLER_INDEX is the offset in SPEC to start looking; it is updated + to point to just after the last character parsed. */ +static char * +get_history_word_specifier (spec, from, caller_index) + char *spec, *from; + int *caller_index; +{ + register int i = *caller_index; + int first, last; + int expecting_word_spec = 0; + char *result; + + /* The range of words to return doesn't exist yet. */ + first = last = 0; + result = (char *)NULL; + + /* If we found a colon, then this *must* be a word specification. If + it isn't, then it is an error. */ + if (spec[i] == ':') + { + i++; + expecting_word_spec++; + } + + /* Handle special cases first. */ + + /* `%' is the word last searched for. */ + if (spec[i] == '%') + { + *caller_index = i + 1; + return (search_match ? savestring (search_match) : savestring ("")); + } + + /* `*' matches all of the arguments, but not the command. */ + if (spec[i] == '*') + { + *caller_index = i + 1; + result = history_arg_extract (1, '$', from); + return (result ? result : savestring ("")); + } + + /* `$' is last arg. */ + if (spec[i] == '$') + { + *caller_index = i + 1; + return (history_arg_extract ('$', '$', from)); + } + + /* Try to get FIRST and LAST figured out. */ + + if (spec[i] == '-') + first = 0; + else if (spec[i] == '^') + { + first = 1; + i++; + } + else if (_rl_digit_p (spec[i]) && expecting_word_spec) + { + for (first = 0; _rl_digit_p (spec[i]); i++) + first = (first * 10) + _rl_digit_value (spec[i]); + } + else + return ((char *)NULL); /* no valid `first' for word specifier */ + + if (spec[i] == '^' || spec[i] == '*') + { + last = (spec[i] == '^') ? 1 : '$'; /* x* abbreviates x-$ */ + i++; + } + else if (spec[i] != '-') + last = first; + else + { + i++; + + if (_rl_digit_p (spec[i])) + { + for (last = 0; _rl_digit_p (spec[i]); i++) + last = (last * 10) + _rl_digit_value (spec[i]); + } + else if (spec[i] == '$') + { + i++; + last = '$'; + } +#if 0 + else if (!spec[i] || spec[i] == ':') + /* check against `:' because there could be a modifier separator */ +#else + else + /* csh seems to allow anything to terminate the word spec here, + leaving it as an abbreviation. */ +#endif + last = -1; /* x- abbreviates x-$ omitting word `$' */ + } + + *caller_index = i; + + if (last >= first || last == '$' || last < 0) + result = history_arg_extract (first, last, from); + + return (result ? result : (char *)&error_pointer); +} + +/* Extract the args specified, starting at FIRST, and ending at LAST. + The args are taken from STRING. If either FIRST or LAST is < 0, + then make that arg count from the right (subtract from the number of + tokens, so that FIRST = -1 means the next to last token on the line). + If LAST is `$' the last arg from STRING is used. */ +char * +history_arg_extract (first, last, string) + int first, last; + const char *string; +{ + register int i, len; + char *result; + int size, offset; + char **list; + + /* XXX - think about making history_tokenize return a struct array, + each struct in array being a string and a length to avoid the + calls to strlen below. */ + if ((list = history_tokenize (string)) == NULL) + return ((char *)NULL); + + for (len = 0; list[len]; len++) + ; + + if (last < 0) + last = len + last - 1; + + if (first < 0) + first = len + first - 1; + + if (last == '$') + last = len - 1; + + if (first == '$') + first = len - 1; + + last++; + + if (first >= len || last > len || first < 0 || last < 0 || first > last) + result = ((char *)NULL); + else + { + for (size = 0, i = first; i < last; i++) + size += strlen (list[i]) + 1; + result = (char *)xmalloc (size + 1); + result[0] = '\0'; + + for (i = first, offset = 0; i < last; i++) + { + strcpy (result + offset, list[i]); + offset += strlen (list[i]); + if (i + 1 < last) + { + result[offset++] = ' '; + result[offset] = 0; + } + } + } + + for (i = 0; i < len; i++) + free (list[i]); + free (list); + + return (result); +} + +static int +history_tokenize_word (string, ind) + const char *string; + int ind; +{ + register int i; + int delimiter; + + i = ind; + delimiter = 0; + + if (member (string[i], "()\n")) + { + i++; + return i; + } + + if (member (string[i], "<>;&|$")) + { + int peek = string[i + 1]; + + if (peek == string[i] && peek != '$') + { + if (peek == '<' && string[i + 2] == '-') + i++; + i += 2; + return i; + } + else + { + if ((peek == '&' && (string[i] == '>' || string[i] == '<')) || + (peek == '>' && string[i] == '&') || + (peek == '(' && (string[i] == '>' || string[i] == '<')) || /* ) */ + (peek == '(' && string[i] == '$')) /* ) */ + { + i += 2; + return i; + } + } + + if (string[i] != '$') + { + i++; + return i; + } + } + + /* Get word from string + i; */ + + if (member (string[i], HISTORY_QUOTE_CHARACTERS)) + delimiter = string[i++]; + + for (; string[i]; i++) + { + if (string[i] == '\\' && string[i + 1] == '\n') + { + i++; + continue; + } + + if (string[i] == '\\' && delimiter != '\'' && + (delimiter != '"' || member (string[i], slashify_in_quotes))) + { + i++; + continue; + } + + if (delimiter && string[i] == delimiter) + { + delimiter = 0; + continue; + } + + if (!delimiter && (member (string[i], history_word_delimiters))) + break; + + if (!delimiter && member (string[i], HISTORY_QUOTE_CHARACTERS)) + delimiter = string[i]; + } + + return i; +} + +static char * +history_substring (string, start, end) + const char *string; + int start, end; +{ + register int len; + register char *result; + + len = end - start; + result = (char *)xmalloc (len + 1); + strncpy (result, string + start, len); + result[len] = '\0'; + return result; +} + +/* Parse STRING into tokens and return an array of strings. If WIND is + not -1 and INDP is not null, we also want the word surrounding index + WIND. The position in the returned array of strings is returned in + *INDP. */ +static char ** +history_tokenize_internal (string, wind, indp) + const char *string; + int wind, *indp; +{ + char **result; + register int i, start, result_index, size; + + /* If we're searching for a string that's not part of a word (e.g., " "), + make sure we set *INDP to a reasonable value. */ + if (indp && wind != -1) + *indp = -1; + + /* Get a token, and stuff it into RESULT. The tokens are split + exactly where the shell would split them. */ + for (i = result_index = size = 0, result = (char **)NULL; string[i]; ) + { + /* Skip leading whitespace. */ + for (; string[i] && whitespace (string[i]); i++) + ; + if (string[i] == 0 || string[i] == history_comment_char) + return (result); + + start = i; + + i = history_tokenize_word (string, start); + + /* If we have a non-whitespace delimiter character (which would not be + skipped by the loop above), use it and any adjacent delimiters to + make a separate field. Any adjacent white space will be skipped the + next time through the loop. */ + if (i == start && history_word_delimiters) + { + i++; + while (string[i] && member (string[i], history_word_delimiters)) + i++; + } + + /* If we are looking for the word in which the character at a + particular index falls, remember it. */ + if (indp && wind != -1 && wind >= start && wind < i) + *indp = result_index; + + if (result_index + 2 >= size) + result = (char **)xrealloc (result, ((size += 10) * sizeof (char *))); + + result[result_index++] = history_substring (string, start, i); + result[result_index] = (char *)NULL; + } + + return (result); +} + +/* Return an array of tokens, much as the shell might. The tokens are + parsed out of STRING. */ +char ** +history_tokenize (string) + const char *string; +{ + return (history_tokenize_internal (string, -1, (int *)NULL)); +} + +/* Find and return the word which contains the character at index IND + in the history line LINE. Used to save the word matched by the + last history !?string? search. */ +static char * +history_find_word (line, ind) + char *line; + int ind; +{ + char **words, *s; + int i, wind; + + words = history_tokenize_internal (line, ind, &wind); + if (wind == -1 || words == 0) + return ((char *)NULL); + s = words[wind]; + for (i = 0; i < wind; i++) + free (words[i]); + for (i = wind + 1; words[i]; i++) + free (words[i]); + free (words); + return s; +} diff --git a/vendors/readline/src/readline/histfile.c b/vendors/readline/src/readline/histfile.c new file mode 100644 index 0000000..4e86511 --- /dev/null +++ b/vendors/readline/src/readline/histfile.c @@ -0,0 +1,556 @@ +/* histfile.c - functions to manipulate the history file. */ + +/* Copyright (C) 1989-2003 Free Software Foundation, Inc. + + This file contains the GNU History Library (the Library), a set of + routines for managing the text of previously typed lines. + + The Library is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + The 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 + General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + +/* The goal is to make the implementation transparent, so that you + don't have to know what data types are used, just what functions + you can call. I think I have done that. */ + +#define READLINE_LIBRARY + +#if defined (__TANDEM) +# include +#endif + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include + +#include +#if ! defined (_MINIX) && defined (HAVE_SYS_FILE_H) +# include +#endif +#include "posixstat.h" +#include + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#if defined (HAVE_UNISTD_H) +# include +#endif + +#if defined (__EMX__) || defined (__CYGWIN__) || defined (__MINW32__) +# undef HAVE_MMAP +#endif + +#ifdef HISTORY_USE_MMAP +# include + +# ifdef MAP_FILE +# define MAP_RFLAGS (MAP_FILE|MAP_PRIVATE) +# define MAP_WFLAGS (MAP_FILE|MAP_SHARED) +# else +# define MAP_RFLAGS MAP_PRIVATE +# define MAP_WFLAGS MAP_SHARED +# endif + +# ifndef MAP_FAILED +# define MAP_FAILED ((void *)-1) +# endif + +#endif /* HISTORY_USE_MMAP */ + +#ifdef _WIN32 +#include +#endif + +/* If we're compiling for __EMX__ (OS/2) or __CYGWIN__ (cygwin32 environment + on win 95/98/nt), we want to open files with O_BINARY mode so that there + is no \n -> \r\n conversion performed. On other systems, we don't want to + mess around with O_BINARY at all, so we ensure that it's defined to 0. */ +#if defined (__EMX__) || defined (__CYGWIN__) || defined (_WIN32) +# ifndef O_BINARY +# define O_BINARY 0 +# endif +#else /* !__EMX__ && !__CYGWIN__ && !_WIN32 */ +# undef O_BINARY +# define O_BINARY 0 +#endif /* !__EMX__ && !__CYGWIN__ && !_WIN32 */ + +#include +#if !defined (errno) +extern int errno; +#endif /* !errno */ + +#include "history.h" +#include "histlib.h" + +#include "rlshell.h" +#include "xmalloc.h" + +/* If non-zero, we write timestamps to the history file in history_do_write() */ +int history_write_timestamps = 0; + +/* Does S look like the beginning of a history timestamp entry? Placeholder + for more extensive tests. */ +#define HIST_TIMESTAMP_START(s) (*(s) == history_comment_char) + +#ifdef _WIN32 +#include "rldefs.h" +#endif + +/* Return the string that should be used in the place of this + filename. This only matters when you don't specify the + filename to read_history (), or write_history (). */ +static char * +history_filename (filename) + const char *filename; +{ + char *return_val; + const char *home; + int home_len; + + return_val = filename ? savestring (filename) : (char *)NULL; + + if (return_val) + return (return_val); + + home = sh_get_env_value ("HOME"); + + if (home == 0) + { +#if defined (_WIN32) && defined (INITFILES_IN_REGISTRY) + return_val = _rl_get_user_registry_string (READLINE_REGKEY, HISTFILE_REGVAL); + if (return_val) + return (return_val); + free (return_val); +#endif /* _WIN32 ... */ + home = "."; + home_len = 1; + } + else + home_len = strlen (home); + + return_val = (char *)xmalloc (2 + home_len + 8); /* strlen(".history") == 8 */ + strcpy (return_val, home); + return_val[home_len] = '/'; +#if defined (__MSDOS__) + strcpy (return_val + home_len + 1, "_history"); +#else + strcpy (return_val + home_len + 1, ".history"); +#endif + + return (return_val); +} + +/* Add the contents of FILENAME to the history list, a line at a time. + If FILENAME is NULL, then read from ~/.history. Returns 0 if + successful, or errno if not. */ +int +read_history (filename) + const char *filename; +{ + return (read_history_range (filename, 0, -1)); +} + +/* Read a range of lines from FILENAME, adding them to the history list. + Start reading at the FROM'th line and end at the TO'th. If FROM + is zero, start at the beginning. If TO is less than FROM, read + until the end of the file. If FILENAME is NULL, then read from + ~/.history. Returns 0 if successful, or errno if not. */ +int +read_history_range (filename, from, to) + const char *filename; + int from, to; +{ + register char *line_start, *line_end, *p; + char *input, *buffer, *bufend, *last_ts; + int file, current_line, chars_read; + struct stat finfo; + size_t file_size; +#if defined (EFBIG) + int overflow_errno = EFBIG; +#elif defined (EOVERFLOW) + int overflow_errno = EOVERFLOW; +#else + int overflow_errno = EIO; +#endif + + buffer = last_ts = (char *)NULL; + input = history_filename (filename); + file = open (input, O_RDONLY|O_BINARY, 0666); + + if ((file < 0) || (fstat (file, &finfo) == -1)) + goto error_and_exit; + + file_size = (size_t)finfo.st_size; + + /* check for overflow on very large files */ + if (file_size != finfo.st_size || file_size + 1 < file_size) + { + errno = overflow_errno; + goto error_and_exit; + } + +#ifdef HISTORY_USE_MMAP + /* We map read/write and private so we can change newlines to NULs without + affecting the underlying object. */ + buffer = (char *)mmap (0, file_size, PROT_READ|PROT_WRITE, MAP_RFLAGS, file, 0); + if ((void *)buffer == MAP_FAILED) + { + errno = overflow_errno; + goto error_and_exit; + } + chars_read = file_size; +#else + buffer = (char *)malloc (file_size + 1); + if (buffer == 0) + { + errno = overflow_errno; + goto error_and_exit; + } + + chars_read = read (file, buffer, file_size); +#endif + if (chars_read < 0) + { + error_and_exit: + if (errno != 0) + chars_read = errno; + else + chars_read = EIO; + if (file >= 0) + close (file); + + FREE (input); +#ifndef HISTORY_USE_MMAP + FREE (buffer); +#endif + + return (chars_read); + } + + close (file); + + /* Set TO to larger than end of file if negative. */ + if (to < 0) + to = chars_read; + + /* Start at beginning of file, work to end. */ + bufend = buffer + chars_read; + current_line = 0; + + /* Skip lines until we are at FROM. */ + for (line_start = line_end = buffer; line_end < bufend && current_line < from; line_end++) + if (*line_end == '\n') + { + p = line_end + 1; + /* If we see something we think is a timestamp, continue with this + line. We should check more extensively here... */ + if (HIST_TIMESTAMP_START(p) == 0) + current_line++; + line_start = p; + } + + /* If there are lines left to gobble, then gobble them now. */ + for (line_end = line_start; line_end < bufend; line_end++) + if (*line_end == '\n') + { + *line_end = '\0'; + + if (*line_start) + { + if (HIST_TIMESTAMP_START(line_start) == 0) + { + add_history (line_start); + if (last_ts) + { + add_history_time (last_ts); + last_ts = NULL; + } + } + else + { + last_ts = line_start; + current_line--; + } + } + + current_line++; + + if (current_line >= to) + break; + + line_start = line_end + 1; + } + + FREE (input); +#ifndef HISTORY_USE_MMAP + FREE (buffer); +#else + munmap (buffer, file_size); +#endif + + return (0); +} + +/* Truncate the history file FNAME, leaving only LINES trailing lines. + If FNAME is NULL, then use ~/.history. Returns 0 on success, errno + on failure. */ +int +history_truncate_file (fname, lines) + const char *fname; + int lines; +{ + char *buffer, *filename, *bp, *bp1; /* bp1 == bp+1 */ + int file, chars_read, rv; + struct stat finfo; + size_t file_size; + + buffer = (char *)NULL; + filename = history_filename (fname); + file = open (filename, O_RDONLY|O_BINARY, 0666); + rv = 0; + + /* Don't try to truncate non-regular files. */ + if (file == -1 || fstat (file, &finfo) == -1) + { + rv = errno; + if (file != -1) + close (file); + goto truncate_exit; + } + + if (S_ISREG (finfo.st_mode) == 0) + { + close (file); +#ifdef EFTYPE + rv = EFTYPE; +#else + rv = EINVAL; +#endif + goto truncate_exit; + } + + file_size = (size_t)finfo.st_size; + + /* check for overflow on very large files */ + if (file_size != finfo.st_size || file_size + 1 < file_size) + { + close (file); +#if defined (EFBIG) + rv = errno = EFBIG; +#elif defined (EOVERFLOW) + rv = errno = EOVERFLOW; +#else + rv = errno = EINVAL; +#endif + goto truncate_exit; + } + + buffer = (char *)malloc (file_size + 1); + if (buffer == 0) + { + close (file); + goto truncate_exit; + } + + chars_read = read (file, buffer, file_size); + close (file); + + if (chars_read <= 0) + { + rv = (chars_read < 0) ? errno : 0; + goto truncate_exit; + } + + /* Count backwards from the end of buffer until we have passed + LINES lines. bp1 is set funny initially. But since bp[1] can't + be a comment character (since it's off the end) and *bp can't be + both a newline and the history comment character, it should be OK. */ + for (bp1 = bp = buffer + chars_read - 1; lines && bp > buffer; bp--) + { + if (*bp == '\n' && HIST_TIMESTAMP_START(bp1) == 0) + lines--; + bp1 = bp; + } + + /* If this is the first line, then the file contains exactly the + number of lines we want to truncate to, so we don't need to do + anything. It's the first line if we don't find a newline between + the current value of i and 0. Otherwise, write from the start of + this line until the end of the buffer. */ + for ( ; bp > buffer; bp--) + { + if (*bp == '\n' && HIST_TIMESTAMP_START(bp1) == 0) + { + bp++; + break; + } + bp1 = bp; + } + + /* Write only if there are more lines in the file than we want to + truncate to. */ + if (bp > buffer && ((file = open (filename, O_WRONLY|O_TRUNC|O_BINARY, 0600)) != -1)) + { + write (file, bp, chars_read - (bp - buffer)); + +#if defined (__BEOS__) + /* BeOS ignores O_TRUNC. */ + ftruncate (file, chars_read - (bp - buffer)); +#endif + + close (file); + } + + truncate_exit: + + FREE (buffer); + + free (filename); + return rv; +} + +/* Workhorse function for writing history. Writes NELEMENT entries + from the history list to FILENAME. OVERWRITE is non-zero if you + wish to replace FILENAME with the entries. */ +static int +history_do_write (filename, nelements, overwrite) + const char *filename; + int nelements, overwrite; +{ + register int i; + char *output; + int file, mode, rv; +#ifdef HISTORY_USE_MMAP + size_t cursize; + + mode = overwrite ? O_RDWR|O_CREAT|O_TRUNC|O_BINARY : O_RDWR|O_APPEND|O_BINARY; +#else + mode = overwrite ? O_WRONLY|O_CREAT|O_TRUNC|O_BINARY : O_WRONLY|O_APPEND|O_BINARY; +#endif + output = history_filename (filename); + rv = 0; + + if ((file = open (output, mode, 0600)) == -1) + { + FREE (output); + return (errno); + } + +#ifdef HISTORY_USE_MMAP + cursize = overwrite ? 0 : lseek (file, 0, SEEK_END); +#endif + + if (nelements > history_length) + nelements = history_length; + + /* Build a buffer of all the lines to write, and write them in one syscall. + Suggested by Peter Ho (peter@robosts.oxford.ac.uk). */ + { + HIST_ENTRY **the_history; /* local */ + register int j; + int buffer_size; + char *buffer; + + the_history = history_list (); + /* Calculate the total number of bytes to write. */ + for (buffer_size = 0, i = history_length - nelements; i < history_length; i++) +#if 0 + buffer_size += 2 + HISTENT_BYTES (the_history[i]); +#else + { + if (history_write_timestamps && the_history[i]->timestamp && the_history[i]->timestamp[0]) + buffer_size += strlen (the_history[i]->timestamp) + 1; + buffer_size += strlen (the_history[i]->line) + 1; + } +#endif + + /* Allocate the buffer, and fill it. */ +#ifdef HISTORY_USE_MMAP + if (ftruncate (file, buffer_size+cursize) == -1) + goto mmap_error; + buffer = (char *)mmap (0, buffer_size, PROT_READ|PROT_WRITE, MAP_WFLAGS, file, cursize); + if ((void *)buffer == MAP_FAILED) + { +mmap_error: + rv = errno; + FREE (output); + close (file); + return rv; + } +#else + buffer = (char *)malloc (buffer_size); + if (buffer == 0) + { + rv = errno; + FREE (output); + close (file); + return rv; + } +#endif + + for (j = 0, i = history_length - nelements; i < history_length; i++) + { + if (history_write_timestamps && the_history[i]->timestamp && the_history[i]->timestamp[0]) + { + strcpy (buffer + j, the_history[i]->timestamp); + j += strlen (the_history[i]->timestamp); + buffer[j++] = '\n'; + } + strcpy (buffer + j, the_history[i]->line); + j += strlen (the_history[i]->line); + buffer[j++] = '\n'; + } + +#ifdef HISTORY_USE_MMAP + if (msync (buffer, buffer_size, 0) != 0 || munmap (buffer, buffer_size) != 0) + rv = errno; +#else + if (write (file, buffer, buffer_size) < 0) + rv = errno; + free (buffer); +#endif + } + + close (file); + + FREE (output); + + return (rv); +} + +/* Append NELEMENT entries to FILENAME. The entries appended are from + the end of the list minus NELEMENTs up to the end of the list. */ +int +append_history (nelements, filename) + int nelements; + const char *filename; +{ + return (history_do_write (filename, nelements, HISTORY_APPEND)); +} + +/* Overwrite FILENAME with the current history. If FILENAME is NULL, + then write the history list to ~/.history. Values returned + are as in read_history ().*/ +int +write_history (filename) + const char *filename; +{ + return (history_do_write (filename, history_length, HISTORY_OVERWRITE)); +} diff --git a/vendors/readline/src/readline/histlib.h b/vendors/readline/src/readline/histlib.h new file mode 100644 index 0000000..d2d411f --- /dev/null +++ b/vendors/readline/src/readline/histlib.h @@ -0,0 +1,88 @@ +/* histlib.h -- internal definitions for the history library. */ +/* Copyright (C) 1989, 1992 Free Software Foundation, Inc. + + This file contains the GNU History Library (the Library), a set of + routines for managing the text of previously typed lines. + + The Library is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + The 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 + General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + +#if !defined (_HISTLIB_H_) +#define _HISTLIB_H_ + +//#if defined (HAVE_STRING_H) +//# include +//#else +//# include +//#endif /* !HAVE_STRING_H */ +#if defined (HAVE_STRING_H) +# include +#endif +#if defined (HAVE_STRINGS_H) +# include +#endif + +#if !defined (STREQ) +#define STREQ(a, b) (((a)[0] == (b)[0]) && (strcmp ((a), (b)) == 0)) +#define STREQN(a, b, n) (((n) == 0) ? (1) \ + : ((a)[0] == (b)[0]) && (strncmp ((a), (b), (n)) == 0)) +#endif + +#ifndef savestring +#define savestring(x) strcpy (xmalloc (1 + strlen (x)), (x)) +#endif + +#ifndef whitespace +#define whitespace(c) (((c) == ' ') || ((c) == '\t')) +#endif + +#ifndef _rl_digit_p +#define _rl_digit_p(c) ((c) >= '0' && (c) <= '9') +#endif + +#ifndef _rl_digit_value +#define _rl_digit_value(c) ((c) - '0') +#endif + +#ifndef member +# ifndef strchr +extern char *strchr (); +# endif +#define member(c, s) ((c) ? ((char *)strchr ((s), (c)) != (char *)NULL) : 0) +#endif + +#ifndef FREE +# define FREE(x) if (x) free (x) +#endif + +/* Possible history errors passed to hist_error. */ +#define EVENT_NOT_FOUND 0 +#define BAD_WORD_SPEC 1 +#define SUBST_FAILED 2 +#define BAD_MODIFIER 3 +#define NO_PREV_SUBST 4 + +/* Possible definitions for history starting point specification. */ +#define ANCHORED_SEARCH 1 +#define NON_ANCHORED_SEARCH 0 + +/* Possible definitions for what style of writing the history file we want. */ +#define HISTORY_APPEND 0 +#define HISTORY_OVERWRITE 1 + +/* Some variable definitions shared across history source files. */ +extern int history_offset; + +#endif /* !_HISTLIB_H_ */ diff --git a/vendors/readline/src/readline/history.c b/vendors/readline/src/readline/history.c new file mode 100644 index 0000000..d99b76e --- /dev/null +++ b/vendors/readline/src/readline/history.c @@ -0,0 +1,443 @@ +/* history.c -- standalone history library */ + +/* Copyright (C) 1989-2003 Free Software Foundation, Inc. + + This file contains the GNU History Library (the Library), a set of + routines for managing the text of previously typed lines. + + The Library is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + The 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 + General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + +/* The goal is to make the implementation transparent, so that you + don't have to know what data types are used, just what functions + you can call. I think I have done that. */ +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#if defined (HAVE_UNISTD_H) +# ifdef _MINIX +# include +# endif +# include +#endif + +#include "history.h" +#include "histlib.h" + +#include "xmalloc.h" + +/* The number of slots to increase the_history by. */ +#define DEFAULT_HISTORY_GROW_SIZE 50 + +static char *hist_inittime PARAMS((void)); + +/* **************************************************************** */ +/* */ +/* History Functions */ +/* */ +/* **************************************************************** */ + +/* An array of HIST_ENTRY. This is where we store the history. */ +static HIST_ENTRY **the_history = (HIST_ENTRY **)NULL; + +/* Non-zero means that we have enforced a limit on the amount of + history that we save. */ +static int history_stifled; + +/* The current number of slots allocated to the input_history. */ +static int history_size; + +/* If HISTORY_STIFLED is non-zero, then this is the maximum number of + entries to remember. */ +int history_max_entries; +int max_input_history; /* backwards compatibility */ + +/* The current location of the interactive history pointer. Just makes + life easier for outside callers. */ +int history_offset; + +/* The number of strings currently stored in the history list. */ +int history_length; + +/* The logical `base' of the history array. It defaults to 1. */ +int history_base = 1; + +/* Return the current HISTORY_STATE of the history. */ +HISTORY_STATE * +history_get_history_state () +{ + HISTORY_STATE *state; + + state = (HISTORY_STATE *)xmalloc (sizeof (HISTORY_STATE)); + state->entries = the_history; + state->offset = history_offset; + state->length = history_length; + state->size = history_size; + state->flags = 0; + if (history_stifled) + state->flags |= HS_STIFLED; + + return (state); +} + +/* Set the state of the current history array to STATE. */ +void +history_set_history_state (state) + HISTORY_STATE *state; +{ + the_history = state->entries; + history_offset = state->offset; + history_length = state->length; + history_size = state->size; + if (state->flags & HS_STIFLED) + history_stifled = 1; +} + +/* Begin a session in which the history functions might be used. This + initializes interactive variables. */ +void +using_history () +{ + history_offset = history_length; +} + +/* Return the number of bytes that the primary history entries are using. + This just adds up the lengths of the_history->lines and the associated + timestamps. */ +int +history_total_bytes () +{ + register int i, result; + + for (i = result = 0; the_history && the_history[i]; i++) + result += HISTENT_BYTES (the_history[i]); + + return (result); +} + +/* Returns the magic number which says what history element we are + looking at now. In this implementation, it returns history_offset. */ +int +where_history () +{ + return (history_offset); +} + +/* Make the current history item be the one at POS, an absolute index. + Returns zero if POS is out of range, else non-zero. */ +int +history_set_pos (pos) + int pos; +{ + if (pos > history_length || pos < 0 || !the_history) + return (0); + history_offset = pos; + return (1); +} + +/* Return the current history array. The caller has to be carefull, since this + is the actual array of data, and could be bashed or made corrupt easily. + The array is terminated with a NULL pointer. */ +HIST_ENTRY ** +history_list () +{ + return (the_history); +} + +/* Return the history entry at the current position, as determined by + history_offset. If there is no entry there, return a NULL pointer. */ +HIST_ENTRY * +current_history () +{ + return ((history_offset == history_length) || the_history == 0) + ? (HIST_ENTRY *)NULL + : the_history[history_offset]; +} + +/* Back up history_offset to the previous history entry, and return + a pointer to that entry. If there is no previous entry then return + a NULL pointer. */ +HIST_ENTRY * +previous_history () +{ + return history_offset ? the_history[--history_offset] : (HIST_ENTRY *)NULL; +} + +/* Move history_offset forward to the next history entry, and return + a pointer to that entry. If there is no next entry then return a + NULL pointer. */ +HIST_ENTRY * +next_history () +{ + return (history_offset == history_length) ? (HIST_ENTRY *)NULL : the_history[++history_offset]; +} + +/* Return the history entry which is logically at OFFSET in the history array. + OFFSET is relative to history_base. */ +HIST_ENTRY * +history_get (offset) + int offset; +{ + int local_index; + + local_index = offset - history_base; + return (local_index >= history_length || local_index < 0 || !the_history) + ? (HIST_ENTRY *)NULL + : the_history[local_index]; +} + +time_t +history_get_time (hist) + HIST_ENTRY *hist; +{ + char *ts; + time_t t; + + if (hist == 0 || hist->timestamp == 0) + return 0; + ts = hist->timestamp; + if (ts[0] != history_comment_char) + return 0; + t = (time_t) atol (ts + 1); /* XXX - should use strtol() here */ + return t; +} + +static char * +hist_inittime () +{ + time_t t; + char ts[64], *ret; + + t = (time_t) time ((time_t *)0); +#if defined (HAVE_VSNPRINTF) /* assume snprintf if vsnprintf exists */ + snprintf (ts, sizeof (ts) - 1, "X%lu", (unsigned long) t); +#else + sprintf (ts, "X%lu", (unsigned long) t); +#endif + ret = savestring (ts); + ret[0] = history_comment_char; + + return ret; +} + +/* Place STRING at the end of the history list. The data field + is set to NULL. */ +void +add_history (string) + const char *string; +{ + HIST_ENTRY *temp; + + if (history_stifled && (history_length == history_max_entries)) + { + register int i; + + /* If the history is stifled, and history_length is zero, + and it equals history_max_entries, we don't save items. */ + if (history_length == 0) + return; + + /* If there is something in the slot, then remove it. */ + if (the_history[0]) + (void) free_history_entry (the_history[0]); + + /* Copy the rest of the entries, moving down one slot. */ + for (i = 0; i < history_length; i++) + the_history[i] = the_history[i + 1]; + + history_base++; + } + else + { + if (history_size == 0) + { + history_size = DEFAULT_HISTORY_GROW_SIZE; + the_history = (HIST_ENTRY **)xmalloc (history_size * sizeof (HIST_ENTRY *)); + history_length = 1; + } + else + { + if (history_length == (history_size - 1)) + { + history_size += DEFAULT_HISTORY_GROW_SIZE; + the_history = (HIST_ENTRY **) + xrealloc (the_history, history_size * sizeof (HIST_ENTRY *)); + } + history_length++; + } + } + + temp = (HIST_ENTRY *)xmalloc (sizeof (HIST_ENTRY)); + temp->line = savestring (string); + temp->data = (char *)NULL; + + temp->timestamp = hist_inittime (); + + the_history[history_length] = (HIST_ENTRY *)NULL; + the_history[history_length - 1] = temp; +} + +/* Change the time stamp of the most recent history entry to STRING. */ +void +add_history_time (string) + const char *string; +{ + HIST_ENTRY *hs; + + hs = the_history[history_length - 1]; + FREE (hs->timestamp); + hs->timestamp = savestring (string); +} + +/* Free HIST and return the data so the calling application can free it + if necessary and desired. */ +histdata_t +free_history_entry (hist) + HIST_ENTRY *hist; +{ + histdata_t x; + + if (hist == 0) + return ((histdata_t) 0); + FREE (hist->line); + FREE (hist->timestamp); + x = hist->data; + free (hist); + return (x); +} + +/* Make the history entry at WHICH have LINE and DATA. This returns + the old entry so you can dispose of the data. In the case of an + invalid WHICH, a NULL pointer is returned. */ +HIST_ENTRY * +replace_history_entry (which, line, data) + int which; + const char *line; + histdata_t data; +{ + HIST_ENTRY *temp, *old_value; + + if (which >= history_length) + return ((HIST_ENTRY *)NULL); + + temp = (HIST_ENTRY *)xmalloc (sizeof (HIST_ENTRY)); + old_value = the_history[which]; + + temp->line = savestring (line); + temp->data = data; + temp->timestamp = savestring (old_value->timestamp); + the_history[which] = temp; + + return (old_value); +} + +/* Remove history element WHICH from the history. The removed + element is returned to you so you can free the line, data, + and containing structure. */ +HIST_ENTRY * +remove_history (which) + int which; +{ + HIST_ENTRY *return_value; + register int i; + + if (which >= history_length || !history_length) + return_value = (HIST_ENTRY *)NULL; + else + { + return_value = the_history[which]; + + for (i = which; i < history_length; i++) + the_history[i] = the_history[i + 1]; + + history_length--; + } + + return (return_value); +} + +/* Stifle the history list, remembering only MAX number of lines. */ +void +stifle_history (max) + int max; +{ + register int i, j; + + if (max < 0) + max = 0; + + if (history_length > max) + { + /* This loses because we cannot free the data. */ + for (i = 0, j = history_length - max; i < j; i++) + free_history_entry (the_history[i]); + + history_base = i; + for (j = 0, i = history_length - max; j < max; i++, j++) + the_history[j] = the_history[i]; + the_history[j] = (HIST_ENTRY *)NULL; + history_length = j; + } + + history_stifled = 1; + max_input_history = history_max_entries = max; +} + +/* Stop stifling the history. This returns the previous maximum + number of history entries. The value is positive if the history + was stifled, negative if it wasn't. */ +int +unstifle_history () +{ + if (history_stifled) + { + history_stifled = 0; + return (history_max_entries); + } + else + return (-history_max_entries); +} + +int +history_is_stifled () +{ + return (history_stifled); +} + +void +clear_history () +{ + register int i; + + /* This loses because we cannot free the data. */ + for (i = 0; i < history_length; i++) + { + free_history_entry (the_history[i]); + the_history[i] = (HIST_ENTRY *)NULL; + } + + history_offset = history_length = 0; +} diff --git a/vendors/readline/src/readline/history.h b/vendors/readline/src/readline/history.h new file mode 100644 index 0000000..fafe224 --- /dev/null +++ b/vendors/readline/src/readline/history.h @@ -0,0 +1,266 @@ +/* history.h -- the names of functions that you can call in history. */ +/* Copyright (C) 1989-2003 Free Software Foundation, Inc. + + This file contains the GNU History Library (the Library), a set of + routines for managing the text of previously typed lines. + + The Library is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + The 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 + General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + +#ifndef _HISTORY_H_ +#define _HISTORY_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include /* XXX - for history timestamp code */ + +#if defined READLINE_LIBRARY +# include "rlstdc.h" +# include "rltypedefs.h" +#else +# include +# include +#endif + +#ifdef __STDC__ +typedef void *histdata_t; +#else +typedef char *histdata_t; +#endif + +/* The structure used to store a history entry. */ +typedef struct _hist_entry { + char *line; + char *timestamp; /* char * rather than time_t for read/write */ + histdata_t data; +} HIST_ENTRY; + +/* Size of the history-library-managed space in history entry HS. */ +#define HISTENT_BYTES(hs) (strlen ((hs)->line) + strlen ((hs)->timestamp)) + +/* A structure used to pass the current state of the history stuff around. */ +typedef struct _hist_state { + HIST_ENTRY **entries; /* Pointer to the entries themselves. */ + int offset; /* The location pointer within this array. */ + int length; /* Number of elements within this array. */ + int size; /* Number of slots allocated to this array. */ + int flags; +} HISTORY_STATE; + +/* Flag values for the `flags' member of HISTORY_STATE. */ +#define HS_STIFLED 0x01 + +/* Initialization and state management. */ + +/* Begin a session in which the history functions might be used. This + just initializes the interactive variables. */ +READLINE_DLL_IMPEXP void using_history PARAMS((void)); + +/* Return the current HISTORY_STATE of the history. */ +READLINE_DLL_IMPEXP HISTORY_STATE *history_get_history_state PARAMS((void)); + +/* Set the state of the current history array to STATE. */ +READLINE_DLL_IMPEXP void history_set_history_state PARAMS((HISTORY_STATE *)); + +/* Manage the history list. */ + +/* Place STRING at the end of the history list. + The associated data field (if any) is set to NULL. */ +READLINE_DLL_IMPEXP void add_history PARAMS((const char *)); + +/* Change the timestamp associated with the most recent history entry to + STRING. */ +READLINE_DLL_IMPEXP void add_history_time PARAMS((const char *)); + +/* A reasonably useless function, only here for completeness. WHICH + is the magic number that tells us which element to delete. The + elements are numbered from 0. */ +READLINE_DLL_IMPEXP HIST_ENTRY *remove_history PARAMS((int)); + +/* Free the history entry H and return any application-specific data + associated with it. */ +READLINE_DLL_IMPEXP histdata_t free_history_entry PARAMS((HIST_ENTRY *)); + +/* Make the history entry at WHICH have LINE and DATA. This returns + the old entry so you can dispose of the data. In the case of an + invalid WHICH, a NULL pointer is returned. */ +READLINE_DLL_IMPEXP HIST_ENTRY *replace_history_entry PARAMS((int, const char *, histdata_t)); + +/* Clear the history list and start over. */ +READLINE_DLL_IMPEXP void clear_history PARAMS((void)); + +/* Stifle the history list, remembering only MAX number of entries. */ +READLINE_DLL_IMPEXP void stifle_history PARAMS((int)); + +/* Stop stifling the history. This returns the previous amount the + history was stifled by. The value is positive if the history was + stifled, negative if it wasn't. */ +READLINE_DLL_IMPEXP int unstifle_history PARAMS((void)); + +/* Return 1 if the history is stifled, 0 if it is not. */ +READLINE_DLL_IMPEXP int history_is_stifled PARAMS((void)); + +/* Information about the history list. */ + +/* Return a NULL terminated array of HIST_ENTRY which is the current input + history. Element 0 of this list is the beginning of time. If there + is no history, return NULL. */ +READLINE_DLL_IMPEXP HIST_ENTRY **history_list PARAMS((void)); + +/* Returns the number which says what history element we are now + looking at. */ +READLINE_DLL_IMPEXP int where_history PARAMS((void)); + +/* Return the history entry at the current position, as determined by + history_offset. If there is no entry there, return a NULL pointer. */ +READLINE_DLL_IMPEXP HIST_ENTRY *current_history PARAMS((void)); + +/* Return the history entry which is logically at OFFSET in the history + array. OFFSET is relative to history_base. */ +READLINE_DLL_IMPEXP HIST_ENTRY *history_get PARAMS((int)); + +/* Return the timestamp associated with the HIST_ENTRY * passed as an + argument */ +READLINE_DLL_IMPEXP time_t history_get_time PARAMS((HIST_ENTRY *)); + +/* Return the number of bytes that the primary history entries are using. + This just adds up the lengths of the_history->lines. */ +READLINE_DLL_IMPEXP int history_total_bytes PARAMS((void)); + +/* Moving around the history list. */ + +/* Set the position in the history list to POS. */ +READLINE_DLL_IMPEXP int history_set_pos PARAMS((int)); + +/* Back up history_offset to the previous history entry, and return + a pointer to that entry. If there is no previous entry, return + a NULL pointer. */ +READLINE_DLL_IMPEXP HIST_ENTRY *previous_history PARAMS((void)); + +/* Move history_offset forward to the next item in the input_history, + and return the a pointer to that entry. If there is no next entry, + return a NULL pointer. */ +READLINE_DLL_IMPEXP HIST_ENTRY *next_history PARAMS((void)); + +/* Searching the history list. */ + +/* Search the history for STRING, starting at history_offset. + If DIRECTION < 0, then the search is through previous entries, + else through subsequent. If the string is found, then + current_history () is the history entry, and the value of this function + is the offset in the line of that history entry that the string was + found in. Otherwise, nothing is changed, and a -1 is returned. */ +READLINE_DLL_IMPEXP int history_search PARAMS((const char *, int)); + +/* Search the history for STRING, starting at history_offset. + The search is anchored: matching lines must begin with string. + DIRECTION is as in history_search(). */ +READLINE_DLL_IMPEXP int history_search_prefix PARAMS((const char *, int)); + +/* Search for STRING in the history list, starting at POS, an + absolute index into the list. DIR, if negative, says to search + backwards from POS, else forwards. + Returns the absolute index of the history element where STRING + was found, or -1 otherwise. */ +READLINE_DLL_IMPEXP int history_search_pos PARAMS((const char *, int, int)); + +/* Managing the history file. */ + +/* Add the contents of FILENAME to the history list, a line at a time. + If FILENAME is NULL, then read from ~/.history. Returns 0 if + successful, or errno if not. */ +READLINE_DLL_IMPEXP int read_history PARAMS((const char *)); + +/* Read a range of lines from FILENAME, adding them to the history list. + Start reading at the FROM'th line and end at the TO'th. If FROM + is zero, start at the beginning. If TO is less than FROM, read + until the end of the file. If FILENAME is NULL, then read from + ~/.history. Returns 0 if successful, or errno if not. */ +READLINE_DLL_IMPEXP int read_history_range PARAMS((const char *, int, int)); + +/* Write the current history to FILENAME. If FILENAME is NULL, + then write the history list to ~/.history. Values returned + are as in read_history (). */ +READLINE_DLL_IMPEXP int write_history PARAMS((const char *)); + +/* Append NELEMENT entries to FILENAME. The entries appended are from + the end of the list minus NELEMENTs up to the end of the list. */ +READLINE_DLL_IMPEXP int append_history PARAMS((int, const char *)); + +/* Truncate the history file, leaving only the last NLINES lines. */ +READLINE_DLL_IMPEXP int history_truncate_file PARAMS((const char *, int)); + +/* History expansion. */ + +/* Expand the string STRING, placing the result into OUTPUT, a pointer + to a string. Returns: + + 0) If no expansions took place (or, if the only change in + the text was the de-slashifying of the history expansion + character) + 1) If expansions did take place + -1) If there was an error in expansion. + 2) If the returned line should just be printed. + + If an error ocurred in expansion, then OUTPUT contains a descriptive + error message. */ +READLINE_DLL_IMPEXP int history_expand PARAMS((char *, char **)); + +/* Extract a string segment consisting of the FIRST through LAST + arguments present in STRING. Arguments are broken up as in + the shell. */ +READLINE_DLL_IMPEXP char *history_arg_extract PARAMS((int, int, const char *)); + +/* Return the text of the history event beginning at the current + offset into STRING. Pass STRING with *INDEX equal to the + history_expansion_char that begins this specification. + DELIMITING_QUOTE is a character that is allowed to end the string + specification for what to search for in addition to the normal + characters `:', ` ', `\t', `\n', and sometimes `?'. */ +READLINE_DLL_IMPEXP char *get_history_event PARAMS((const char *, int *, int)); + +/* Return an array of tokens, much as the shell might. The tokens are + parsed out of STRING. */ +READLINE_DLL_IMPEXP char **history_tokenize PARAMS((const char *)); + +/* Exported history variables. */ +READLINE_DLL_IMPEXP int history_base; +READLINE_DLL_IMPEXP int history_length; +READLINE_DLL_IMPEXP int history_max_entries; +READLINE_DLL_IMPEXP char history_expansion_char; +READLINE_DLL_IMPEXP char history_subst_char; +READLINE_DLL_IMPEXP char *history_word_delimiters; +READLINE_DLL_IMPEXP char history_comment_char; +READLINE_DLL_IMPEXP char *history_no_expand_chars; +READLINE_DLL_IMPEXP char *history_search_delimiter_chars; +READLINE_DLL_IMPEXP int history_quotes_inhibit_expansion; + +READLINE_DLL_IMPEXP int history_write_timestamps; + +/* Backwards compatibility */ +READLINE_DLL_IMPEXP int max_input_history; + +/* If set, this function is called to decide whether or not a particular + history expansion should be treated as a special case for the calling + application and not expanded. */ +READLINE_DLL_IMPEXP rl_linebuf_func_t *history_inhibit_expansion_function; + +#ifdef __cplusplus +} +#endif + +#endif /* !_HISTORY_H_ */ diff --git a/vendors/readline/src/readline/histsearch.c b/vendors/readline/src/readline/histsearch.c new file mode 100644 index 0000000..1cc5875 --- /dev/null +++ b/vendors/readline/src/readline/histsearch.c @@ -0,0 +1,195 @@ +/* histsearch.c -- searching the history list. */ + +/* Copyright (C) 1989, 1992 Free Software Foundation, Inc. + + This file contains the GNU History Library (the Library), a set of + routines for managing the text of previously typed lines. + + The Library is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + The 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 + General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#if defined (HAVE_UNISTD_H) +# ifdef _MINIX +# include +# endif +# include +#endif + +#include "history.h" +#include "histlib.h" + +/* The list of alternate characters that can delimit a history search + string. */ +char *history_search_delimiter_chars = (char *)NULL; + +static int history_search_internal PARAMS((const char *, int, int)); + +/* Search the history for STRING, starting at history_offset. + If DIRECTION < 0, then the search is through previous entries, else + through subsequent. If ANCHORED is non-zero, the string must + appear at the beginning of a history line, otherwise, the string + may appear anywhere in the line. If the string is found, then + current_history () is the history entry, and the value of this + function is the offset in the line of that history entry that the + string was found in. Otherwise, nothing is changed, and a -1 is + returned. */ + +static int +history_search_internal (string, direction, anchored) + const char *string; + int direction, anchored; +{ + register int i, reverse; + register char *line; + register int line_index; + int string_len; + HIST_ENTRY **the_history; /* local */ + + i = history_offset; + reverse = (direction < 0); + + /* Take care of trivial cases first. */ + if (string == 0 || *string == '\0') + return (-1); + + if (!history_length || ((i >= history_length) && !reverse)) + return (-1); + + if (reverse && (i >= history_length)) + i = history_length - 1; + +#define NEXT_LINE() do { if (reverse) i--; else i++; } while (0) + + the_history = history_list (); + string_len = strlen (string); + while (1) + { + /* Search each line in the history list for STRING. */ + + /* At limit for direction? */ + if ((reverse && i < 0) || (!reverse && i == history_length)) + return (-1); + + line = the_history[i]->line; + line_index = strlen (line); + + /* If STRING is longer than line, no match. */ + if (string_len > line_index) + { + NEXT_LINE (); + continue; + } + + /* Handle anchored searches first. */ + if (anchored == ANCHORED_SEARCH) + { + if (STREQN (string, line, string_len)) + { + history_offset = i; + return (0); + } + + NEXT_LINE (); + continue; + } + + /* Do substring search. */ + if (reverse) + { + line_index -= string_len; + + while (line_index >= 0) + { + if (STREQN (string, line + line_index, string_len)) + { + history_offset = i; + return (line_index); + } + line_index--; + } + } + else + { + register int limit; + + limit = line_index - string_len + 1; + line_index = 0; + + while (line_index < limit) + { + if (STREQN (string, line + line_index, string_len)) + { + history_offset = i; + return (line_index); + } + line_index++; + } + } + NEXT_LINE (); + } +} + +/* Do a non-anchored search for STRING through the history in DIRECTION. */ +int +history_search (string, direction) + const char *string; + int direction; +{ + return (history_search_internal (string, direction, NON_ANCHORED_SEARCH)); +} + +/* Do an anchored search for string through the history in DIRECTION. */ +int +history_search_prefix (string, direction) + const char *string; + int direction; +{ + return (history_search_internal (string, direction, ANCHORED_SEARCH)); +} + +/* Search for STRING in the history list. DIR is < 0 for searching + backwards. POS is an absolute index into the history list at + which point to begin searching. */ +int +history_search_pos (string, dir, pos) + const char *string; + int dir, pos; +{ + int ret, old; + + old = where_history (); + history_set_pos (pos); + if (history_search (string, dir) == -1) + { + history_set_pos (old); + return (-1); + } + ret = where_history (); + history_set_pos (old); + return ret; +} diff --git a/vendors/readline/src/readline/input.c b/vendors/readline/src/readline/input.c new file mode 100644 index 0000000..c599624 --- /dev/null +++ b/vendors/readline/src/readline/input.c @@ -0,0 +1,781 @@ +/* input.c -- character input functions for readline. */ + +/* Copyright (C) 1994 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library, a library for + reading lines of text with interactive input and history editing. + + The GNU Readline Library is free software; you can redistribute it + and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2, or + (at your option) any later version. + + The GNU Readline 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 General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ +#define READLINE_LIBRARY + +#if defined (__TANDEM) +# include +#endif + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include +#include +#if defined (HAVE_SYS_FILE_H) +# include +#endif /* HAVE_SYS_FILE_H */ + +#if defined (HAVE_UNISTD_H) +# include +#endif /* HAVE_UNISTD_H */ + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#if defined (HAVE_SELECT) +# if !defined (HAVE_SYS_SELECT_H) || !defined (M_UNIX) +# include +# endif +#endif /* HAVE_SELECT */ +#if defined (HAVE_SYS_SELECT_H) +# include +#endif + +#if defined (FIONREAD_IN_SYS_IOCTL) +# include +#endif + +#include +#include + +#if !defined (errno) +extern int errno; +#endif /* !errno */ + +/* System-specific feature definitions and include files. */ +#include "rldefs.h" +#include "rlmbutil.h" + +/* Some standard library routines. */ +#include "readline.h" + +#include "rlprivate.h" +#include "rlshell.h" +#include "xmalloc.h" + +/* What kind of non-blocking I/O do we have? */ +#if !defined (O_NDELAY) && defined (O_NONBLOCK) +# define O_NDELAY O_NONBLOCK /* Posix style */ +#endif + +/* Non-null means it is a pointer to a function to run while waiting for + character input. */ +rl_hook_func_t *rl_event_hook = (rl_hook_func_t *)NULL; + +rl_getc_func_t *rl_getc_function = rl_getc; + +static int _keyboard_input_timeout = 100000; /* 0.1 seconds; it's in usec */ + +static int ibuffer_space PARAMS((void)); +static int rl_get_char PARAMS((int *)); +static int rl_gather_tyi PARAMS((void)); + +/* **************************************************************** */ +/* */ +/* Character Input Buffering */ +/* */ +/* **************************************************************** */ + +static int pop_index, push_index; +static unsigned char ibuffer[512]; +static int ibuffer_len = sizeof (ibuffer) - 1; + +#define any_typein (push_index != pop_index) + +int +_rl_any_typein () +{ + return any_typein; +} + +/* Return the amount of space available in the buffer for stuffing + characters. */ +static int +ibuffer_space () +{ + if (pop_index > push_index) + return (pop_index - push_index - 1); + else + return (ibuffer_len - (push_index - pop_index)); +} + +/* Get a key from the buffer of characters to be read. + Return the key in KEY. + Result is KEY if there was a key, or 0 if there wasn't. */ +static int +rl_get_char (key) + int *key; +{ + if (push_index == pop_index) + return (0); + + *key = ibuffer[pop_index++]; + + if (pop_index >= ibuffer_len) + pop_index = 0; + + return (1); +} + +/* Stuff KEY into the *front* of the input buffer. + Returns non-zero if successful, zero if there is + no space left in the buffer. */ +int +_rl_unget_char (key) + int key; +{ + if (ibuffer_space ()) + { + pop_index--; + if (pop_index < 0) + pop_index = ibuffer_len - 1; + ibuffer[pop_index] = key; + return (1); + } + return (0); +} + +int +_rl_pushed_input_available () +{ + return (push_index != pop_index); +} + +#ifndef _WIN32 +/* If a character is available to be read, then read it and stuff it into + IBUFFER. Otherwise, just return. Returns number of characters read + (0 if none available) and -1 on error (EIO). */ +static int +rl_gather_tyi () +{ + int tty; + register int tem, result; + int chars_avail, k; + char input; +#if defined(HAVE_SELECT) + fd_set readfds, exceptfds; + struct timeval timeout; +#endif + + tty = fileno (rl_instream); + +#if defined (HAVE_SELECT) + FD_ZERO (&readfds); + FD_ZERO (&exceptfds); + FD_SET (tty, &readfds); + FD_SET (tty, &exceptfds); + timeout.tv_sec = 0; + timeout.tv_usec = _keyboard_input_timeout; + result = select (tty + 1, &readfds, (fd_set *)NULL, &exceptfds, &timeout); + if (result <= 0) + return 0; /* Nothing to read. */ +#endif + + result = -1; +#if defined (FIONREAD) + errno = 0; + result = ioctl (tty, FIONREAD, &chars_avail); + if (result == -1 && errno == EIO) + return -1; +#endif + +#if defined (O_NDELAY) + if (result == -1) + { + tem = fcntl (tty, F_GETFL, 0); + + fcntl (tty, F_SETFL, (tem | O_NDELAY)); + chars_avail = read (tty, &input, 1); + + fcntl (tty, F_SETFL, tem); + if (chars_avail == -1 && errno == EAGAIN) + return 0; + if (chars_avail == 0) /* EOF */ + { + rl_stuff_char (EOF); + return (0); + } + } +#endif /* O_NDELAY */ + + /* If there's nothing available, don't waste time trying to read + something. */ + if (chars_avail <= 0) + return 0; + + tem = ibuffer_space (); + + if (chars_avail > tem) + chars_avail = tem; + + /* One cannot read all of the available input. I can only read a single + character at a time, or else programs which require input can be + thwarted. If the buffer is larger than one character, I lose. + Damn! */ + if (tem < ibuffer_len) + chars_avail = 0; + + if (result != -1) + { + while (chars_avail--) + { + k = (*rl_getc_function) (rl_instream); + rl_stuff_char (k); + if (k == NEWLINE || k == RETURN) + break; + } + } + else + { + if (chars_avail) + rl_stuff_char (input); + } + + return 1; +} +#endif /* !_WIN32 */ + +int +rl_set_keyboard_input_timeout (u) + int u; +{ + int o; + + o = _keyboard_input_timeout; + if (u > 0) + _keyboard_input_timeout = u; + return (o); +} + +#ifndef _WIN32 +/* Is there input available to be read on the readline input file + descriptor? Only works if the system has select(2) or FIONREAD. + Uses the value of _keyboard_input_timeout as the timeout; if another + readline function wants to specify a timeout and not leave it up to + the user, it should use _rl_input_queued(timeout_value_in_microseconds) + instead. */ +int +_rl_input_available () +{ +#if defined(HAVE_SELECT) + fd_set readfds, exceptfds; + struct timeval timeout; +#endif +#if !defined (HAVE_SELECT) && defined(FIONREAD) + int chars_avail; +#endif + int tty; + + tty = fileno (rl_instream); + +#if defined (HAVE_SELECT) + FD_ZERO (&readfds); + FD_ZERO (&exceptfds); + FD_SET (tty, &readfds); + FD_SET (tty, &exceptfds); + timeout.tv_sec = 0; + timeout.tv_usec = _keyboard_input_timeout; + return (select (tty + 1, &readfds, (fd_set *)NULL, &exceptfds, &timeout) > 0); +#else + +#if defined (FIONREAD) + if (ioctl (tty, FIONREAD, &chars_avail) == 0) + return (chars_avail); +#endif + +#endif + + return 0; +} +#endif /* !_WIN32 */ + +int +_rl_input_queued (t) + int t; +{ + int old_timeout, r; + + old_timeout = rl_set_keyboard_input_timeout (t); + r = _rl_input_available (); + rl_set_keyboard_input_timeout (old_timeout); + return r; +} + +void +_rl_insert_typein (c) + int c; +{ + int key, t, i; + char *string; + + i = key = 0; + string = (char *)xmalloc (ibuffer_len + 1); + string[i++] = (char) c; + + while ((t = rl_get_char (&key)) && + _rl_keymap[key].type == ISFUNC && + _rl_keymap[key].function == rl_insert) + string[i++] = key; + + if (t) + _rl_unget_char (key); + + string[i] = '\0'; + rl_insert_text (string); + free (string); +} + +/* Add KEY to the buffer of characters to be read. Returns 1 if the + character was stuffed correctly; 0 otherwise. */ +int +rl_stuff_char (key) + int key; +{ + if (ibuffer_space () == 0) + return 0; + + if (key == EOF) + { + key = NEWLINE; + rl_pending_input = EOF; + RL_SETSTATE (RL_STATE_INPUTPENDING); + } + ibuffer[push_index++] = key; + if (push_index >= ibuffer_len) + push_index = 0; + + return 1; +} + +/* Make C be the next command to be executed. */ +int +rl_execute_next (c) + int c; +{ + rl_pending_input = c; + RL_SETSTATE (RL_STATE_INPUTPENDING); + return 0; +} + +/* Clear any pending input pushed with rl_execute_next() */ +int +rl_clear_pending_input () +{ + rl_pending_input = 0; + RL_UNSETSTATE (RL_STATE_INPUTPENDING); + return 0; +} + +/* **************************************************************** */ +/* */ +/* Character Input */ +/* */ +/* **************************************************************** */ + +/* Read a key, including pending input. */ +int +rl_read_key () +{ + int c; + + rl_key_sequence_length++; + + if (rl_pending_input) + { + c = rl_pending_input; + rl_clear_pending_input (); + } + else + { + /* If input is coming from a macro, then use that. */ + if (c = _rl_next_macro_key ()) + return (c); + + /* If the user has an event function, then call it periodically. */ + if (rl_event_hook) + { + while (rl_event_hook && rl_get_char (&c) == 0) + { + (*rl_event_hook) (); + if (rl_done) /* XXX - experimental */ + return ('\n'); + if (rl_gather_tyi () < 0) /* XXX - EIO */ + { + rl_done = 1; + return ('\n'); + } + } + } + else + { + if (rl_get_char (&c) == 0) + c = (*rl_getc_function) (rl_instream); + } + } + + return (c); +} + +#ifndef _WIN32 +int +rl_getc (stream) + FILE *stream; +{ + int result; + unsigned char c; + + while (1) + { + result = read (fileno (stream), &c, sizeof (unsigned char)); + + if (result == sizeof (unsigned char)) + return (c); + + /* If zero characters are returned, then the file that we are + reading from is empty! Return EOF in that case. */ + if (result == 0) + return (EOF); + +#if defined (__BEOS__) + if (errno == EINTR) + continue; +#endif + +#if defined (EWOULDBLOCK) +# define X_EWOULDBLOCK EWOULDBLOCK +#else +# define X_EWOULDBLOCK -99 +#endif + +#if defined (EAGAIN) +# define X_EAGAIN EAGAIN +#else +# define X_EAGAIN -99 +#endif + + if (errno == X_EWOULDBLOCK || errno == X_EAGAIN) + { + if (sh_unset_nodelay_mode (fileno (stream)) < 0) + return (EOF); + continue; + } + +#undef X_EWOULDBLOCK +#undef X_EAGAIN + + /* If the error that we received was SIGINT, then try again, + this is simply an interrupted system call to read (). + Otherwise, some error ocurred, also signifying EOF. */ + if (errno != EINTR) + return (EOF); + } +} + +#else /* _WIN32 */ + +#include +#include +#include +#include + +#define EXT_PREFIX 0x1f8 + +#define KEV irec.Event.KeyEvent /* to make life easier */ +#define KST irec.Event.KeyEvent.dwControlKeyState + +static int pending_key = 0; +static int pending_count = 0; +static int pending_prefix = 0; + +extern int _rl_last_c_pos; /* imported from display.c */ +extern int _rl_last_v_pos; +extern int rl_dispatching; /* imported from readline.c */ +extern int rl_point; +extern int rl_done; +extern int rl_visible_prompt_length; +extern int _rl_screenwidth; /* imported from terminal.c */ + +extern int haveConsole; /* imported from rltty.c */ +extern HANDLE hStdout, hStdin; +extern COORD rlScreenOrigin, rlScreenEnd; +extern int rlScreenStart, rlScreenMax; +static void MouseEventProc(MOUSE_EVENT_RECORD kev); + +int rl_getc (stream) + FILE *stream; +{ + if ( pending_count ) + { + --pending_count; + if ( pending_prefix && (pending_count & 1) ) + return pending_prefix; + else + return pending_key; + } + + while ( 1 ) + { + DWORD dummy; + + if (WaitForSingleObject(hStdin, WAIT_FOR_INPUT) != WAIT_OBJECT_0) + { + if ( rl_done ) + return( 0 ); + else + continue; + } + if ( haveConsole & FOR_INPUT ) + { + INPUT_RECORD irec; + ReadConsoleInput (hStdin, &irec, 1, &dummy); + switch(irec.EventType) + { + case KEY_EVENT: + if (KEV.bKeyDown && + ((KEV.wVirtualKeyCode < VK_SHIFT) || + (KEV.wVirtualKeyCode > VK_MENU))) + { + pending_count = KEV.wRepeatCount; + pending_prefix = 0; + pending_key = KEV.uChar.AsciiChar & 0xff; + + if (KST & ENHANCED_KEY) + { +#define CTRL_TO_ASCII(c) ((c) - 'a' + 1) + switch (KEV.wVirtualKeyCode) + { + case VK_HOME: + pending_key = CTRL_TO_ASCII ('a'); + break; + case VK_END: + pending_key = CTRL_TO_ASCII ('e'); + break; + case VK_LEFT: + pending_key = CTRL_TO_ASCII ('b'); + break; + case VK_RIGHT: + pending_key = CTRL_TO_ASCII ('f'); + break; + case VK_UP: + pending_key = CTRL_TO_ASCII ('p'); + break; + case VK_DOWN: + pending_key = CTRL_TO_ASCII ('n'); + break; + case VK_DELETE: + pending_key = CTRL_TO_ASCII ('d'); + break; + } + } + + if (KST & (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED)) + pending_prefix = VK_ESCAPE; + + if (pending_prefix) + pending_count = (pending_count << 1) - 1; + + /* Ascii direct */ + if (pending_key) + pending_count--; + + if (pending_prefix) + return pending_prefix; + return pending_key; + } + break; + case MOUSE_EVENT: + if ( (haveConsole & FOR_OUTPUT) && !rl_dispatching ) + MouseEventProc(irec.Event.MouseEvent); + default: + break; + } + } + else + { + int key; + ReadFile(hStdin, &key, 1, &dummy, NULL); + return key; + } + } +} + +void MouseEventProc(MOUSE_EVENT_RECORD mev) +{ + static DWORD lastButtonState, cstat_flags; + static COORD lastButtonPos, src_down_pos; + +#define RLPOS_CHANGED 1 +#define SELECT_START 2 + + switch (mev.dwEventFlags ) + { + case 0 : /* change in button state */ + + /* Cursor setting: + LEFT_BUTTON_PRESSED sets cursor anywhere on the screen, + thereafter, any change in button state will clipp the cursor + position to the readline range if there has been no cursor + movement. Otherwhise the cursor is reset to its old position. + */ + if (mev.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED) + { + if (lastButtonState == 0) + { + src_down_pos = mev.dwMousePosition; + cstat_flags |= RLPOS_CHANGED | SELECT_START; + SetConsoleCursorPosition(hStdout, mev.dwMousePosition); + } + } + else + { + if (cstat_flags & RLPOS_CHANGED) + { + if ( (mev.dwMousePosition.X == src_down_pos.X) + && (mev.dwMousePosition.Y == src_down_pos.Y) ) + { + int linear_pos = (int)mev.dwMousePosition.Y * _rl_screenwidth + + (int)mev.dwMousePosition.X; + if (linear_pos < rlScreenStart + rl_visible_prompt_length) + { + linear_pos = rlScreenStart + rl_visible_prompt_length; + mev.dwMousePosition.X = rlScreenOrigin.X + rl_visible_prompt_length; + mev.dwMousePosition.Y = rlScreenOrigin.Y; + } + if (linear_pos > rlScreenMax) + { + linear_pos = rlScreenMax; + mev.dwMousePosition = rlScreenEnd; + } + rl_point = linear_pos - rlScreenStart - rl_visible_prompt_length; + _rl_last_c_pos = mev.dwMousePosition.X - rlScreenOrigin.X; + _rl_last_v_pos = mev.dwMousePosition.Y - rlScreenOrigin.Y; + } + else + { + mev.dwMousePosition.X = rlScreenOrigin.X + _rl_last_c_pos; + mev.dwMousePosition.Y = rlScreenOrigin.Y + _rl_last_v_pos; + } + SetConsoleCursorPosition(hStdout, mev.dwMousePosition); + cstat_flags &= !RLPOS_CHANGED; + } + } + lastButtonState = mev.dwButtonState; + lastButtonPos = mev.dwMousePosition; + break; + case MOUSE_MOVED: /* the most frequent event */ + default: + break; + } +} + +int _rl_input_available () +{ + if (isatty (fileno (rl_instream))) + return (kbhit()); + return 0; +} + +static int rl_gather_tyi () +{ + int count = 0; + while (isatty (fileno (rl_instream)) && kbhit () && ibuffer_space ()) + { + rl_stuff_char ((*rl_getc_function) (rl_instream)); + count++; + } + return count; +} +#endif /* _WIN32 */ + +#if defined (HANDLE_MULTIBYTE) +/* read multibyte char */ +int +_rl_read_mbchar (mbchar, size) + char *mbchar; + int size; +{ + int mb_len = 0; + size_t mbchar_bytes_length; + wchar_t wc; + mbstate_t ps, ps_back; + + memset(&ps, 0, sizeof (mbstate_t)); + memset(&ps_back, 0, sizeof (mbstate_t)); + + while (mb_len < size) + { + RL_SETSTATE(RL_STATE_MOREINPUT); + mbchar[mb_len++] = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + + mbchar_bytes_length = mbrtowc (&wc, mbchar, mb_len, &ps); + if (mbchar_bytes_length == (size_t)(-1)) + break; /* invalid byte sequence for the current locale */ + else if (mbchar_bytes_length == (size_t)(-2)) + { + /* shorted bytes */ + ps = ps_back; + continue; + } + else if (mbchar_bytes_length > (size_t)(0)) + break; + } + + return mb_len; +} + +/* Read a multibyte-character string whose first character is FIRST into + the buffer MB of length MBLEN. Returns the last character read, which + may be FIRST. Used by the search functions, among others. Very similar + to _rl_read_mbchar. */ +int +_rl_read_mbstring (first, mb, mblen) + int first; + char *mb; + int mblen; +{ + int i, c; + mbstate_t ps; + + c = first; + memset (mb, 0, mblen); + for (i = 0; i < mblen; i++) + { + mb[i] = (char)c; + memset (&ps, 0, sizeof (mbstate_t)); + if (_rl_get_char_len (mb, &ps) == -2) + { + /* Read more for multibyte character */ + RL_SETSTATE (RL_STATE_MOREINPUT); + c = rl_read_key (); + RL_UNSETSTATE (RL_STATE_MOREINPUT); + } + else + break; + } + return c; +} +#endif /* HANDLE_MULTIBYTE */ diff --git a/vendors/readline/src/readline/isearch.c b/vendors/readline/src/readline/isearch.c new file mode 100644 index 0000000..c1ea5b3 --- /dev/null +++ b/vendors/readline/src/readline/isearch.c @@ -0,0 +1,560 @@ +/* **************************************************************** */ +/* */ +/* I-Search and Searching */ +/* */ +/* **************************************************************** */ + +/* Copyright (C) 1987-2002 Free Software Foundation, Inc. + + This file contains the Readline Library (the Library), a set of + routines for providing Emacs style line input to programs that ask + for it. + + The Library is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + The 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 + General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include + +#include + +#if defined (HAVE_UNISTD_H) +# include +#endif + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif + +#include "rldefs.h" +#include "rlmbutil.h" + +#include "readline.h" +#include "history.h" + +#include "rlprivate.h" +#include "xmalloc.h" + +/* Variables exported to other files in the readline library. */ +char *_rl_isearch_terminators = (char *)NULL; + +/* Variables imported from other files in the readline library. */ +extern HIST_ENTRY *_rl_saved_line_for_history; + +/* Forward declarations */ +static int rl_search_history PARAMS((int, int)); + +/* Last line found by the current incremental search, so we don't `find' + identical lines many times in a row. */ +static char *prev_line_found; + +/* Last search string and its length. */ +static char *last_isearch_string; +static int last_isearch_string_len; + +static char *default_isearch_terminators = "\033\012"; + +/* Search backwards through the history looking for a string which is typed + interactively. Start with the current line. */ +int +rl_reverse_search_history (sign, key) + int sign, key; +{ + return (rl_search_history (-sign, key)); +} + +/* Search forwards through the history looking for a string which is typed + interactively. Start with the current line. */ +int +rl_forward_search_history (sign, key) + int sign, key; +{ + return (rl_search_history (sign, key)); +} + +/* Display the current state of the search in the echo-area. + SEARCH_STRING contains the string that is being searched for, + DIRECTION is zero for forward, or 1 for reverse, + WHERE is the history list number of the current line. If it is + -1, then this line is the starting one. */ +static void +rl_display_search (search_string, reverse_p, where) + char *search_string; + int reverse_p, where; +{ + char *message; + int msglen, searchlen; + + searchlen = (search_string && *search_string) ? strlen (search_string) : 0; + + message = (char *)xmalloc (searchlen + 33); + msglen = 0; + +#if defined (NOTDEF) + if (where != -1) + { + sprintf (message, "[%d]", where + history_base); + msglen = strlen (message); + } +#endif /* NOTDEF */ + + message[msglen++] = '('; + + if (reverse_p) + { + strcpy (message + msglen, "reverse-"); + msglen += 8; + } + + strcpy (message + msglen, "i-search)`"); + msglen += 10; + + if (search_string) + { + strcpy (message + msglen, search_string); + msglen += searchlen; + } + + strcpy (message + msglen, "': "); + + rl_message ("%s", message); + free (message); + (*rl_redisplay_function) (); +} + +/* Search through the history looking for an interactively typed string. + This is analogous to i-search. We start the search in the current line. + DIRECTION is which direction to search; >= 0 means forward, < 0 means + backwards. */ +static int +rl_search_history (direction, invoking_key) + int direction, invoking_key; +{ + /* The string that the user types in to search for. */ + char *search_string; + + /* The current length of SEARCH_STRING. */ + int search_string_index; + + /* The amount of space that SEARCH_STRING has allocated to it. */ + int search_string_size; + + /* The list of lines to search through. */ + char **lines, *allocated_line; + + /* The length of LINES. */ + int hlen; + + /* Where we get LINES from. */ + HIST_ENTRY **hlist; + + register int i; + int orig_point, orig_mark, orig_line, last_found_line; + int c, found, failed, sline_len; + int n, wstart, wlen; +#if defined (HANDLE_MULTIBYTE) + char mb[MB_LEN_MAX]; +#endif + + /* The line currently being searched. */ + char *sline; + + /* Offset in that line. */ + int line_index; + + /* Non-zero if we are doing a reverse search. */ + int reverse; + + /* The list of characters which terminate the search, but are not + subsequently executed. If the variable isearch-terminators has + been set, we use that value, otherwise we use ESC and C-J. */ + char *isearch_terminators; + + RL_SETSTATE(RL_STATE_ISEARCH); + orig_point = rl_point; + orig_mark = rl_mark; + last_found_line = orig_line = where_history (); + reverse = direction < 0; + hlist = history_list (); + allocated_line = (char *)NULL; + + isearch_terminators = _rl_isearch_terminators ? _rl_isearch_terminators + : default_isearch_terminators; + + /* Create an arrary of pointers to the lines that we want to search. */ + rl_maybe_replace_line (); + i = 0; + if (hlist) + for (i = 0; hlist[i]; i++); + + /* Allocate space for this many lines, +1 for the current input line, + and remember those lines. */ + lines = (char **)xmalloc ((1 + (hlen = i)) * sizeof (char *)); + for (i = 0; i < hlen; i++) + lines[i] = hlist[i]->line; + + if (_rl_saved_line_for_history) + lines[i] = _rl_saved_line_for_history->line; + else + { + /* Keep track of this so we can free it. */ + allocated_line = (char *)xmalloc (1 + strlen (rl_line_buffer)); + strcpy (allocated_line, &rl_line_buffer[0]); + lines[i] = allocated_line; + } + + hlen++; + + /* The line where we start the search. */ + i = orig_line; + + rl_save_prompt (); + + /* Initialize search parameters. */ + search_string = (char *)xmalloc (search_string_size = 128); + *search_string = '\0'; + search_string_index = 0; + prev_line_found = (char *)0; /* XXX */ + + /* Normalize DIRECTION into 1 or -1. */ + direction = (direction >= 0) ? 1 : -1; + + rl_display_search (search_string, reverse, -1); + + sline = rl_line_buffer; + sline_len = strlen (sline); + line_index = rl_point; + + found = failed = 0; + for (;;) + { + rl_command_func_t *f = (rl_command_func_t *)NULL; + + /* Read a key and decide how to proceed. */ + RL_SETSTATE(RL_STATE_MOREINPUT); + c = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + c = _rl_read_mbstring (c, mb, MB_LEN_MAX); +#endif + + /* Translate the keys we do something with to opcodes. */ + if (c >= 0 && _rl_keymap[c].type == ISFUNC) + { + f = _rl_keymap[c].function; + + if (f == rl_reverse_search_history) + c = reverse ? -1 : -2; + else if (f == rl_forward_search_history) + c = !reverse ? -1 : -2; + else if (f == rl_rubout) + c = -3; + else if (c == CTRL ('G')) + c = -4; + else if (c == CTRL ('W')) /* XXX */ + c = -5; + else if (c == CTRL ('Y')) /* XXX */ + c = -6; + } + + /* The characters in isearch_terminators (set from the user-settable + variable isearch-terminators) are used to terminate the search but + not subsequently execute the character as a command. The default + value is "\033\012" (ESC and C-J). */ + if (strchr (isearch_terminators, c)) + { + /* ESC still terminates the search, but if there is pending + input or if input arrives within 0.1 seconds (on systems + with select(2)) it is used as a prefix character + with rl_execute_next. WATCH OUT FOR THIS! This is intended + to allow the arrow keys to be used like ^F and ^B are used + to terminate the search and execute the movement command. + XXX - since _rl_input_available depends on the application- + settable keyboard timeout value, this could alternatively + use _rl_input_queued(100000) */ + if (c == ESC && _rl_input_available ()) + rl_execute_next (ESC); + break; + } + +#define ENDSRCH_CHAR(c) \ + ((CTRL_CHAR (c) || META_CHAR (c) || (c) == RUBOUT) && ((c) != CTRL ('G'))) + +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + { + if (c >= 0 && strlen (mb) == 1 && ENDSRCH_CHAR (c)) + { + /* This sets rl_pending_input to c; it will be picked up the next + time rl_read_key is called. */ + rl_execute_next (c); + break; + } + } + else +#endif + if (c >= 0 && ENDSRCH_CHAR (c)) + { + /* This sets rl_pending_input to c; it will be picked up the next + time rl_read_key is called. */ + rl_execute_next (c); + break; + } + + switch (c) + { + case -1: + if (search_string_index == 0) + { + if (last_isearch_string) + { + search_string_size = 64 + last_isearch_string_len; + search_string = (char *)xrealloc (search_string, search_string_size); + strcpy (search_string, last_isearch_string); + search_string_index = last_isearch_string_len; + rl_display_search (search_string, reverse, -1); + break; + } + continue; + } + else if (reverse) + --line_index; + else if (line_index != sline_len) + ++line_index; + else + rl_ding (); + break; + + /* switch directions */ + case -2: + direction = -direction; + reverse = direction < 0; + break; + + /* delete character from search string. */ + case -3: /* C-H, DEL */ + /* This is tricky. To do this right, we need to keep a + stack of search positions for the current search, with + sentinels marking the beginning and end. But this will + do until we have a real isearch-undo. */ + if (search_string_index == 0) + rl_ding (); + else + search_string[--search_string_index] = '\0'; + + break; + + case -4: /* C-G */ + rl_replace_line (lines[orig_line], 0); + rl_point = orig_point; + rl_mark = orig_mark; + rl_restore_prompt(); + rl_clear_message (); + if (allocated_line) + free (allocated_line); + free (lines); + RL_UNSETSTATE(RL_STATE_ISEARCH); + return 0; + + case -5: /* C-W */ + /* skip over portion of line we already matched */ + wstart = rl_point + search_string_index; + if (wstart >= rl_end) + { + rl_ding (); + break; + } + + /* if not in a word, move to one. */ + if (rl_alphabetic(rl_line_buffer[wstart]) == 0) + { + rl_ding (); + break; + } + n = wstart; + while (n < rl_end && rl_alphabetic(rl_line_buffer[n])) + n++; + wlen = n - wstart + 1; + if (search_string_index + wlen + 1 >= search_string_size) + { + search_string_size += wlen + 1; + search_string = (char *)xrealloc (search_string, search_string_size); + } + for (; wstart < n; wstart++) + search_string[search_string_index++] = rl_line_buffer[wstart]; + search_string[search_string_index] = '\0'; + break; + + case -6: /* C-Y */ + /* skip over portion of line we already matched */ + wstart = rl_point + search_string_index; + if (wstart >= rl_end) + { + rl_ding (); + break; + } + n = rl_end - wstart + 1; + if (search_string_index + n + 1 >= search_string_size) + { + search_string_size += n + 1; + search_string = (char *)xrealloc (search_string, search_string_size); + } + for (n = wstart; n < rl_end; n++) + search_string[search_string_index++] = rl_line_buffer[n]; + search_string[search_string_index] = '\0'; + break; + + default: + /* Add character to search string and continue search. */ + if (search_string_index + 2 >= search_string_size) + { + search_string_size += 128; + search_string = (char *)xrealloc (search_string, search_string_size); + } +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + { + int j, l; + for (j = 0, l = strlen (mb); j < l; ) + search_string[search_string_index++] = mb[j++]; + } + else +#endif + search_string[search_string_index++] = c; + search_string[search_string_index] = '\0'; + break; + } + + for (found = failed = 0;;) + { + int limit = sline_len - search_string_index + 1; + + /* Search the current line. */ + while (reverse ? (line_index >= 0) : (line_index < limit)) + { + if (STREQN (search_string, sline + line_index, search_string_index)) + { + found++; + break; + } + else + line_index += direction; + } + if (found) + break; + + /* Move to the next line, but skip new copies of the line + we just found and lines shorter than the string we're + searching for. */ + do + { + /* Move to the next line. */ + i += direction; + + /* At limit for direction? */ + if (reverse ? (i < 0) : (i == hlen)) + { + failed++; + break; + } + + /* We will need these later. */ + sline = lines[i]; + sline_len = strlen (sline); + } + while ((prev_line_found && STREQ (prev_line_found, lines[i])) || + (search_string_index > sline_len)); + + if (failed) + break; + + /* Now set up the line for searching... */ + line_index = reverse ? sline_len - search_string_index : 0; + } + + if (failed) + { + /* We cannot find the search string. Ding the bell. */ + rl_ding (); + i = last_found_line; + continue; /* XXX - was break */ + } + + /* We have found the search string. Just display it. But don't + actually move there in the history list until the user accepts + the location. */ + if (found) + { + prev_line_found = lines[i]; + rl_replace_line (lines[i], 0); + rl_point = line_index; + last_found_line = i; + rl_display_search (search_string, reverse, (i == orig_line) ? -1 : i); + } + } + + /* The searching is over. The user may have found the string that she + was looking for, or else she may have exited a failing search. If + LINE_INDEX is -1, then that shows that the string searched for was + not found. We use this to determine where to place rl_point. */ + + /* First put back the original state. */ + strcpy (rl_line_buffer, lines[orig_line]); + + rl_restore_prompt (); + + /* Save the search string for possible later use. */ + FREE (last_isearch_string); + last_isearch_string = search_string; + last_isearch_string_len = search_string_index; + + if (last_found_line < orig_line) + rl_get_previous_history (orig_line - last_found_line, 0); + else + rl_get_next_history (last_found_line - orig_line, 0); + + /* If the string was not found, put point at the end of the last matching + line. If last_found_line == orig_line, we didn't find any matching + history lines at all, so put point back in its original position. */ + if (line_index < 0) + { + if (last_found_line == orig_line) + line_index = orig_point; + else + line_index = strlen (rl_line_buffer); + rl_mark = orig_mark; + } + + rl_point = line_index; + /* Don't worry about where to put the mark here; rl_get_previous_history + and rl_get_next_history take care of it. */ + + rl_clear_message (); + + FREE (allocated_line); + free (lines); + + RL_UNSETSTATE(RL_STATE_ISEARCH); + + return 0; +} diff --git a/vendors/readline/src/readline/keymaps.c b/vendors/readline/src/readline/keymaps.c new file mode 100644 index 0000000..df7dd96 --- /dev/null +++ b/vendors/readline/src/readline/keymaps.c @@ -0,0 +1,150 @@ +/* keymaps.c -- Functions and keymaps for the GNU Readline library. */ + +/* Copyright (C) 1988,1989 Free Software Foundation, Inc. + + This file is part of GNU Readline, a library for reading lines + of text with interactive input and history editing. + + Readline is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + Readline is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Readline; see the file COPYING. If not, write to the Free + Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#include /* for FILE * definition for readline.h */ + +#include "readline.h" +#include "rlconf.h" + +//*******************CHANGED COMMENTED BELOW**************************** +//#include "emacs_keymap.c" + +#if defined (VI_MODE) +#include "vi_keymap.c" +#endif + +#include "xmalloc.h" + +/* **************************************************************** */ +/* */ +/* Functions for manipulating Keymaps. */ +/* */ +/* **************************************************************** */ + + +/* Return a new, empty keymap. + Free it with free() when you are done. */ +Keymap +rl_make_bare_keymap () +{ + register int i; + Keymap keymap = (Keymap)xmalloc (KEYMAP_SIZE * sizeof (KEYMAP_ENTRY)); + + for (i = 0; i < KEYMAP_SIZE; i++) + { + keymap[i].type = ISFUNC; + keymap[i].function = (rl_command_func_t *)NULL; + } + +#if 0 + for (i = 'A'; i < ('Z' + 1); i++) + { + keymap[i].type = ISFUNC; + keymap[i].function = rl_do_lowercase_version; + } +#endif + + return (keymap); +} + +/* Return a new keymap which is a copy of MAP. */ +Keymap +rl_copy_keymap (map) + Keymap map; +{ + register int i; + Keymap temp; + + temp = rl_make_bare_keymap (); + for (i = 0; i < KEYMAP_SIZE; i++) + { + temp[i].type = map[i].type; + temp[i].function = map[i].function; + } + return (temp); +} + +/* Return a new keymap with the printing characters bound to rl_insert, + the uppercase Meta characters bound to run their lowercase equivalents, + and the Meta digits bound to produce numeric arguments. */ +Keymap +rl_make_keymap () +{ + register int i; + Keymap newmap; + + newmap = rl_make_bare_keymap (); + + /* All ASCII printing characters are self-inserting. */ + for (i = ' '; i < 127; i++) + newmap[i].function = rl_insert; + + newmap[TAB].function = rl_insert; + newmap[RUBOUT].function = rl_rubout; /* RUBOUT == 127 */ + newmap[CTRL('H')].function = rl_rubout; + +#if KEYMAP_SIZE > 128 + /* Printing characters in ISO Latin-1 and some 8-bit character sets. */ + for (i = 128; i < 256; i++) + newmap[i].function = rl_insert; +#endif /* KEYMAP_SIZE > 128 */ + + return (newmap); +} + +/* Free the storage associated with MAP. */ +void +rl_discard_keymap (map) + Keymap map; +{ + int i; + + if (!map) + return; + + for (i = 0; i < KEYMAP_SIZE; i++) + { + switch (map[i].type) + { + case ISFUNC: + break; + + case ISKMAP: + rl_discard_keymap ((Keymap)map[i].function); + break; + + case ISMACR: + free ((char *)map[i].function); + break; + } + } +} diff --git a/vendors/readline/src/readline/keymaps.h b/vendors/readline/src/readline/keymaps.h new file mode 100644 index 0000000..f287048 --- /dev/null +++ b/vendors/readline/src/readline/keymaps.h @@ -0,0 +1,104 @@ +/* keymaps.h -- Manipulation of readline keymaps. */ + +/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library, a library for + reading lines of text with interactive input and history editing. + + The GNU Readline Library is free software; you can redistribute it + and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2, or + (at your option) any later version. + + The GNU Readline 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 General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + +#ifndef _KEYMAPS_H_ +#define _KEYMAPS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined (READLINE_LIBRARY) +# include "rlstdc.h" +# include "chardefs.h" +# include "rltypedefs.h" +#else +# include +# include +# include +#endif + +/* A keymap contains one entry for each key in the ASCII set. + Each entry consists of a type and a pointer. + FUNCTION is the address of a function to run, or the + address of a keymap to indirect through. + TYPE says which kind of thing FUNCTION is. */ +typedef struct _keymap_entry { + char type; + rl_command_func_t *function; +} KEYMAP_ENTRY; + +/* This must be large enough to hold bindings for all of the characters + in a desired character set (e.g, 128 for ASCII, 256 for ISO Latin-x, + and so on) plus one for subsequence matching. */ +#define KEYMAP_SIZE 257 +#define ANYOTHERKEY KEYMAP_SIZE-1 + +/* I wanted to make the above structure contain a union of: + union { rl_command_func_t *function; struct _keymap_entry *keymap; } value; + but this made it impossible for me to create a static array. + Maybe I need C lessons. */ + +typedef KEYMAP_ENTRY KEYMAP_ENTRY_ARRAY[KEYMAP_SIZE]; +typedef KEYMAP_ENTRY *Keymap; + +/* The values that TYPE can have in a keymap entry. */ +#define ISFUNC 0 +#define ISKMAP 1 +#define ISMACR 2 + +extern KEYMAP_ENTRY_ARRAY emacs_standard_keymap, emacs_meta_keymap, emacs_ctlx_keymap; +//**************************CHANGED extern to static**************************** +static KEYMAP_ENTRY_ARRAY vi_insertion_keymap, vi_movement_keymap; + +/* Return a new, empty keymap. + Free it with free() when you are done. */ +extern Keymap rl_make_bare_keymap PARAMS((void)); + +/* Return a new keymap which is a copy of MAP. */ +extern Keymap rl_copy_keymap PARAMS((Keymap)); + +/* Return a new keymap with the printing characters bound to rl_insert, + the lowercase Meta characters bound to run their equivalents, and + the Meta digits bound to produce numeric arguments. */ +extern Keymap rl_make_keymap PARAMS((void)); + +/* Free the storage associated with a keymap. */ +extern void rl_discard_keymap PARAMS((Keymap)); + +/* These functions actually appear in bind.c */ + +/* Return the keymap corresponding to a given name. Names look like + `emacs' or `emacs-meta' or `vi-insert'. */ +extern Keymap rl_get_keymap_by_name PARAMS((const char *)); + +/* Return the current keymap. */ +extern Keymap rl_get_keymap PARAMS((void)); + +/* Set the current keymap to MAP. */ +extern void rl_set_keymap PARAMS((Keymap)); + +#ifdef __cplusplus +} +#endif + +#endif /* _KEYMAPS_H_ */ diff --git a/vendors/readline/src/readline/kill.c b/vendors/readline/src/readline/kill.c new file mode 100644 index 0000000..0843bce --- /dev/null +++ b/vendors/readline/src/readline/kill.c @@ -0,0 +1,693 @@ +/* kill.c -- kill ring management. */ + +/* Copyright (C) 1994 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library, a library for + reading lines of text with interactive input and history editing. + + The GNU Readline Library is free software; you can redistribute it + and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2, or + (at your option) any later version. + + The GNU Readline 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 General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include + +#if defined (HAVE_UNISTD_H) +# include /* for _POSIX_VERSION */ +#endif /* HAVE_UNISTD_H */ + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#include + +/* System-specific feature definitions and include files. */ +#include "rldefs.h" + +/* Some standard library routines. */ +#include "readline.h" +#include "history.h" + +#include "rlprivate.h" +#include "xmalloc.h" + +/* **************************************************************** */ +/* */ +/* Killing Mechanism */ +/* */ +/* **************************************************************** */ + +/* What we assume for a max number of kills. */ +#define DEFAULT_MAX_KILLS 10 + +/* The real variable to look at to find out when to flush kills. */ +static int rl_max_kills = DEFAULT_MAX_KILLS; + +/* Where to store killed text. */ +static char **rl_kill_ring = (char **)NULL; + +/* Where we are in the kill ring. */ +static int rl_kill_index; + +/* How many slots we have in the kill ring. */ +static int rl_kill_ring_length; + +static int _rl_copy_to_kill_ring PARAMS((char *, int)); +static int region_kill_internal PARAMS((int)); +static int _rl_copy_word_as_kill PARAMS((int, int)); +static int rl_yank_nth_arg_internal PARAMS((int, int, int)); + +/* How to say that you only want to save a certain amount + of kill material. */ +int +rl_set_retained_kills (num) + int num; +{ + return 0; +} + +/* Add TEXT to the kill ring, allocating a new kill ring slot as necessary. + This uses TEXT directly, so the caller must not free it. If APPEND is + non-zero, and the last command was a kill, the text is appended to the + current kill ring slot, otherwise prepended. */ +static int +_rl_copy_to_kill_ring (text, append) + char *text; + int append; +{ + char *old, *new; + int slot; + + /* First, find the slot to work with. */ + if (_rl_last_command_was_kill == 0) + { + /* Get a new slot. */ + if (rl_kill_ring == 0) + { + /* If we don't have any defined, then make one. */ + rl_kill_ring = (char **) + xmalloc (((rl_kill_ring_length = 1) + 1) * sizeof (char *)); + rl_kill_ring[slot = 0] = (char *)NULL; + } + else + { + /* We have to add a new slot on the end, unless we have + exceeded the max limit for remembering kills. */ + slot = rl_kill_ring_length; + if (slot == rl_max_kills) + { + register int i; + free (rl_kill_ring[0]); + for (i = 0; i < slot; i++) + rl_kill_ring[i] = rl_kill_ring[i + 1]; + } + else + { + slot = rl_kill_ring_length += 1; + rl_kill_ring = (char **)xrealloc (rl_kill_ring, slot * sizeof (char *)); + } + rl_kill_ring[--slot] = (char *)NULL; + } + } + else + slot = rl_kill_ring_length - 1; + + /* If the last command was a kill, prepend or append. */ + if (_rl_last_command_was_kill && rl_editing_mode != vi_mode) + { + old = rl_kill_ring[slot]; + new = (char *)xmalloc (1 + strlen (old) + strlen (text)); + + if (append) + { + strcpy (new, old); + strcat (new, text); + } + else + { + strcpy (new, text); + strcat (new, old); + } + free (old); + free (text); + rl_kill_ring[slot] = new; + } + else + rl_kill_ring[slot] = text; + + rl_kill_index = slot; + return 0; +} + +/* The way to kill something. This appends or prepends to the last + kill, if the last command was a kill command. if FROM is less + than TO, then the text is appended, otherwise prepended. If the + last command was not a kill command, then a new slot is made for + this kill. */ +int +rl_kill_text (from, to) + int from, to; +{ + char *text; + + /* Is there anything to kill? */ + if (from == to) + { + _rl_last_command_was_kill++; + return 0; + } + + text = rl_copy_text (from, to); + + /* Delete the copied text from the line. */ + rl_delete_text (from, to); + + _rl_copy_to_kill_ring (text, from < to); + + _rl_last_command_was_kill++; + return 0; +} + +/* Now REMEMBER! In order to do prepending or appending correctly, kill + commands always make rl_point's original position be the FROM argument, + and rl_point's extent be the TO argument. */ + +/* **************************************************************** */ +/* */ +/* Killing Commands */ +/* */ +/* **************************************************************** */ + +/* Delete the word at point, saving the text in the kill ring. */ +int +rl_kill_word (count, key) + int count, key; +{ + int orig_point; + + if (count < 0) + return (rl_backward_kill_word (-count, key)); + else + { + orig_point = rl_point; + rl_forward_word (count, key); + + if (rl_point != orig_point) + rl_kill_text (orig_point, rl_point); + + rl_point = orig_point; + if (rl_editing_mode == emacs_mode) + rl_mark = rl_point; + } + return 0; +} + +/* Rubout the word before point, placing it on the kill ring. */ +int +rl_backward_kill_word (count, ignore) + int count, ignore; +{ + int orig_point; + + if (count < 0) + return (rl_kill_word (-count, ignore)); + else + { + orig_point = rl_point; + rl_backward_word (count, ignore); + + if (rl_point != orig_point) + rl_kill_text (orig_point, rl_point); + + if (rl_editing_mode == emacs_mode) + rl_mark = rl_point; + } + return 0; +} + +/* Kill from here to the end of the line. If DIRECTION is negative, kill + back to the line start instead. */ +int +rl_kill_line (direction, ignore) + int direction, ignore; +{ + int orig_point; + + if (direction < 0) + return (rl_backward_kill_line (1, ignore)); + else + { + orig_point = rl_point; + rl_end_of_line (1, ignore); + if (orig_point != rl_point) + rl_kill_text (orig_point, rl_point); + rl_point = orig_point; + if (rl_editing_mode == emacs_mode) + rl_mark = rl_point; + } + return 0; +} + +/* Kill backwards to the start of the line. If DIRECTION is negative, kill + forwards to the line end instead. */ +int +rl_backward_kill_line (direction, ignore) + int direction, ignore; +{ + int orig_point; + + if (direction < 0) + return (rl_kill_line (1, ignore)); + else + { + if (!rl_point) + rl_ding (); + else + { + orig_point = rl_point; + rl_beg_of_line (1, ignore); + if (rl_point != orig_point) + rl_kill_text (orig_point, rl_point); + if (rl_editing_mode == emacs_mode) + rl_mark = rl_point; + } + } + return 0; +} + +/* Kill the whole line, no matter where point is. */ +int +rl_kill_full_line (count, ignore) + int count, ignore; +{ + rl_begin_undo_group (); + rl_point = 0; + rl_kill_text (rl_point, rl_end); + rl_mark = 0; + rl_end_undo_group (); + return 0; +} + +/* The next two functions mimic unix line editing behaviour, except they + save the deleted text on the kill ring. This is safer than not saving + it, and since we have a ring, nobody should get screwed. */ + +/* This does what C-w does in Unix. We can't prevent people from + using behaviour that they expect. */ +int +rl_unix_word_rubout (count, key) + int count, key; +{ + int orig_point; + + if (rl_point == 0) + rl_ding (); + else + { + orig_point = rl_point; + if (count <= 0) + count = 1; + + while (count--) + { + while (rl_point && whitespace (rl_line_buffer[rl_point - 1])) + rl_point--; + + while (rl_point && (whitespace (rl_line_buffer[rl_point - 1]) == 0)) + rl_point--; + } + + rl_kill_text (orig_point, rl_point); + if (rl_editing_mode == emacs_mode) + rl_mark = rl_point; + } + + return 0; +} + +/* This deletes one filename component in a Unix pathname. That is, it + deletes backward to directory separator (`/') or whitespace. */ +int +rl_unix_filename_rubout (count, key) + int count, key; +{ + int orig_point, c; + + if (rl_point == 0) + rl_ding (); + else + { + orig_point = rl_point; + if (count <= 0) + count = 1; + + while (count--) + { + c = rl_line_buffer[rl_point - 1]; + while (rl_point && (whitespace (c) || c == '/')) + { + rl_point--; + c = rl_line_buffer[rl_point - 1]; + } + + while (rl_point && (whitespace (c) == 0) && c != '/') + { + rl_point--; + c = rl_line_buffer[rl_point - 1]; + } + } + + rl_kill_text (orig_point, rl_point); + if (rl_editing_mode == emacs_mode) + rl_mark = rl_point; + } + + return 0; +} + +/* Here is C-u doing what Unix does. You don't *have* to use these + key-bindings. We have a choice of killing the entire line, or + killing from where we are to the start of the line. We choose the + latter, because if you are a Unix weenie, then you haven't backspaced + into the line at all, and if you aren't, then you know what you are + doing. */ +int +rl_unix_line_discard (count, key) + int count, key; +{ + if (rl_point == 0) + rl_ding (); + else + { + rl_kill_text (rl_point, 0); + rl_point = 0; + if (rl_editing_mode == emacs_mode) + rl_mark = rl_point; + } + return 0; +} + +/* Copy the text in the `region' to the kill ring. If DELETE is non-zero, + delete the text from the line as well. */ +static int +region_kill_internal (delete) + int delete; +{ + char *text; + + if (rl_mark != rl_point) + { + text = rl_copy_text (rl_point, rl_mark); + if (delete) + rl_delete_text (rl_point, rl_mark); + _rl_copy_to_kill_ring (text, rl_point < rl_mark); + } + + _rl_last_command_was_kill++; + return 0; +} + +/* Copy the text in the region to the kill ring. */ +int +rl_copy_region_to_kill (count, ignore) + int count, ignore; +{ + return (region_kill_internal (0)); +} + +/* Kill the text between the point and mark. */ +int +rl_kill_region (count, ignore) + int count, ignore; +{ + int r, npoint; + + npoint = (rl_point < rl_mark) ? rl_point : rl_mark; + r = region_kill_internal (1); + _rl_fix_point (1); + rl_point = npoint; + return r; +} + +/* Copy COUNT words to the kill ring. DIR says which direction we look + to find the words. */ +static int +_rl_copy_word_as_kill (count, dir) + int count, dir; +{ + int om, op, r; + + om = rl_mark; + op = rl_point; + + if (dir > 0) + rl_forward_word (count, 0); + else + rl_backward_word (count, 0); + + rl_mark = rl_point; + + if (dir > 0) + rl_backward_word (count, 0); + else + rl_forward_word (count, 0); + + r = region_kill_internal (0); + + rl_mark = om; + rl_point = op; + + return r; +} + +int +rl_copy_forward_word (count, key) + int count, key; +{ + if (count < 0) + return (rl_copy_backward_word (-count, key)); + + return (_rl_copy_word_as_kill (count, 1)); +} + +int +rl_copy_backward_word (count, key) + int count, key; +{ + if (count < 0) + return (rl_copy_forward_word (-count, key)); + + return (_rl_copy_word_as_kill (count, -1)); +} + +/* Yank back the last killed text. This ignores arguments. */ +int +rl_yank (count, ignore) + int count, ignore; +{ + if (rl_kill_ring == 0) + { + _rl_abort_internal (); + return -1; + } + + _rl_set_mark_at_pos (rl_point); + rl_insert_text (rl_kill_ring[rl_kill_index]); + return 0; +} + +/* If the last command was yank, or yank_pop, and the text just + before point is identical to the current kill item, then + delete that text from the line, rotate the index down, and + yank back some other text. */ +int +rl_yank_pop (count, key) + int count, key; +{ + int l, n; + + if (((rl_last_func != rl_yank_pop) && (rl_last_func != rl_yank)) || + !rl_kill_ring) + { + _rl_abort_internal (); + return -1; + } + + l = strlen (rl_kill_ring[rl_kill_index]); + n = rl_point - l; + if (n >= 0 && STREQN (rl_line_buffer + n, rl_kill_ring[rl_kill_index], l)) + { + rl_delete_text (n, rl_point); + rl_point = n; + rl_kill_index--; + if (rl_kill_index < 0) + rl_kill_index = rl_kill_ring_length - 1; + rl_yank (1, 0); + return 0; + } + else + { + _rl_abort_internal (); + return -1; + } +} + +/* Yank the COUNTh argument from the previous history line, skipping + HISTORY_SKIP lines before looking for the `previous line'. */ +static int +rl_yank_nth_arg_internal (count, ignore, history_skip) + int count, ignore, history_skip; +{ + register HIST_ENTRY *entry; + char *arg; + int i, pos; + + pos = where_history (); + + if (history_skip) + { + for (i = 0; i < history_skip; i++) + entry = previous_history (); + } + + entry = previous_history (); + + history_set_pos (pos); + + if (entry == 0) + { + rl_ding (); + return -1; + } + + arg = history_arg_extract (count, count, entry->line); + if (!arg || !*arg) + { + rl_ding (); + return -1; + } + + rl_begin_undo_group (); + + _rl_set_mark_at_pos (rl_point); + +#if defined (VI_MODE) + /* Vi mode always inserts a space before yanking the argument, and it + inserts it right *after* rl_point. */ + if (rl_editing_mode == vi_mode) + { + rl_vi_append_mode (1, ignore); + rl_insert_text (" "); + } +#endif /* VI_MODE */ + + rl_insert_text (arg); + free (arg); + + rl_end_undo_group (); + return 0; +} + +/* Yank the COUNTth argument from the previous history line. */ +int +rl_yank_nth_arg (count, ignore) + int count, ignore; +{ + return (rl_yank_nth_arg_internal (count, ignore, 0)); +} + +/* Yank the last argument from the previous history line. This `knows' + how rl_yank_nth_arg treats a count of `$'. With an argument, this + behaves the same as rl_yank_nth_arg. */ +int +rl_yank_last_arg (count, key) + int count, key; +{ + static int history_skip = 0; + static int explicit_arg_p = 0; + static int count_passed = 1; + static int direction = 1; + static int undo_needed = 0; + int retval; + + if (rl_last_func != rl_yank_last_arg) + { + history_skip = 0; + explicit_arg_p = rl_explicit_arg; + count_passed = count; + direction = 1; + } + else + { + if (undo_needed) + rl_do_undo (); + if (count < 1) + direction = -direction; + history_skip += direction; + if (history_skip < 0) + history_skip = 0; + } + + if (explicit_arg_p) + retval = rl_yank_nth_arg_internal (count_passed, key, history_skip); + else + retval = rl_yank_nth_arg_internal ('$', key, history_skip); + + undo_needed = retval == 0; + return retval; +} + +/* A special paste command for users of Cygnus's cygwin32. */ +#if defined (__CYGWIN__) || defined (_WIN32) +#include + +int +rl_paste_from_clipboard (count, key) + int count, key; +{ + char *data, *ptr; + int len; + + if (OpenClipboard (NULL) == 0) + return (0); + + data = (char *)GetClipboardData (CF_TEXT); + if (data) + { + ptr = strchr (data, '\r'); + if (ptr) + { + len = ptr - data; + ptr = (char *)xmalloc (len + 1); + ptr[len] = '\0'; + strncpy (ptr, data, len); + } + else + ptr = data; + _rl_set_mark_at_pos (rl_point); + rl_insert_text (ptr); + if (ptr != data) + free (ptr); + CloseClipboard (); + } + return (0); +} +#endif /* __CYGWIN__ */ diff --git a/vendors/readline/src/readline/macro.c b/vendors/readline/src/readline/macro.c new file mode 100644 index 0000000..b73c3af --- /dev/null +++ b/vendors/readline/src/readline/macro.c @@ -0,0 +1,262 @@ +/* macro.c -- keyboard macros for readline. */ + +/* Copyright (C) 1994 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library, a library for + reading lines of text with interactive input and history editing. + + The GNU Readline Library is free software; you can redistribute it + and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2, or + (at your option) any later version. + + The GNU Readline 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 General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include + +#if defined (HAVE_UNISTD_H) +# include /* for _POSIX_VERSION */ +#endif /* HAVE_UNISTD_H */ + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#include + +/* System-specific feature definitions and include files. */ +#include "rldefs.h" + +/* Some standard library routines. */ +#include "readline.h" +#include "history.h" + +#include "rlprivate.h" +#include "xmalloc.h" + +/* **************************************************************** */ +/* */ +/* Hacking Keyboard Macros */ +/* */ +/* **************************************************************** */ + +/* The currently executing macro string. If this is non-zero, + then it is a malloc ()'ed string where input is coming from. */ +char *rl_executing_macro = (char *)NULL; + +/* The offset in the above string to the next character to be read. */ +static int executing_macro_index; + +/* The current macro string being built. Characters get stuffed + in here by add_macro_char (). */ +static char *current_macro = (char *)NULL; + +/* The size of the buffer allocated to current_macro. */ +static int current_macro_size; + +/* The index at which characters are being added to current_macro. */ +static int current_macro_index; + +/* A structure used to save nested macro strings. + It is a linked list of string/index for each saved macro. */ +struct saved_macro { + struct saved_macro *next; + char *string; + int sindex; +}; + +/* The list of saved macros. */ +static struct saved_macro *macro_list = (struct saved_macro *)NULL; + +/* Set up to read subsequent input from STRING. + STRING is free ()'ed when we are done with it. */ +void +_rl_with_macro_input (string) + char *string; +{ + _rl_push_executing_macro (); + rl_executing_macro = string; + executing_macro_index = 0; + RL_SETSTATE(RL_STATE_MACROINPUT); +} + +/* Return the next character available from a macro, or 0 if + there are no macro characters. */ +int +_rl_next_macro_key () +{ + if (rl_executing_macro == 0) + return (0); + + if (rl_executing_macro[executing_macro_index] == 0) + { + _rl_pop_executing_macro (); + return (_rl_next_macro_key ()); + } + + return (rl_executing_macro[executing_macro_index++]); +} + +/* Save the currently executing macro on a stack of saved macros. */ +void +_rl_push_executing_macro () +{ + struct saved_macro *saver; + + saver = (struct saved_macro *)xmalloc (sizeof (struct saved_macro)); + saver->next = macro_list; + saver->sindex = executing_macro_index; + saver->string = rl_executing_macro; + + macro_list = saver; +} + +/* Discard the current macro, replacing it with the one + on the top of the stack of saved macros. */ +void +_rl_pop_executing_macro () +{ + struct saved_macro *macro; + + FREE (rl_executing_macro); + rl_executing_macro = (char *)NULL; + executing_macro_index = 0; + + if (macro_list) + { + macro = macro_list; + rl_executing_macro = macro_list->string; + executing_macro_index = macro_list->sindex; + macro_list = macro_list->next; + free (macro); + } + + if (rl_executing_macro == 0) + RL_UNSETSTATE(RL_STATE_MACROINPUT); +} + +/* Add a character to the macro being built. */ +void +_rl_add_macro_char (c) + int c; +{ + if (current_macro_index + 1 >= current_macro_size) + { + if (current_macro == 0) + current_macro = (char *)xmalloc (current_macro_size = 25); + else + current_macro = (char *)xrealloc (current_macro, current_macro_size += 25); + } + + current_macro[current_macro_index++] = c; + current_macro[current_macro_index] = '\0'; +} + +void +_rl_kill_kbd_macro () +{ + if (current_macro) + { + free (current_macro); + current_macro = (char *) NULL; + } + current_macro_size = current_macro_index = 0; + + FREE (rl_executing_macro); + rl_executing_macro = (char *) NULL; + executing_macro_index = 0; + + RL_UNSETSTATE(RL_STATE_MACRODEF); +} + +/* Begin defining a keyboard macro. + Keystrokes are recorded as they are executed. + End the definition with rl_end_kbd_macro (). + If a numeric argument was explicitly typed, then append this + definition to the end of the existing macro, and start by + re-executing the existing macro. */ +int +rl_start_kbd_macro (ignore1, ignore2) + int ignore1, ignore2; +{ + if (RL_ISSTATE (RL_STATE_MACRODEF)) + { + _rl_abort_internal (); + return -1; + } + + if (rl_explicit_arg) + { + if (current_macro) + _rl_with_macro_input (savestring (current_macro)); + } + else + current_macro_index = 0; + + RL_SETSTATE(RL_STATE_MACRODEF); + return 0; +} + +/* Stop defining a keyboard macro. + A numeric argument says to execute the macro right now, + that many times, counting the definition as the first time. */ +int +rl_end_kbd_macro (count, ignore) + int count, ignore; +{ + if (RL_ISSTATE (RL_STATE_MACRODEF) == 0) + { + _rl_abort_internal (); + return -1; + } + + current_macro_index -= rl_key_sequence_length - 1; + current_macro[current_macro_index] = '\0'; + + RL_UNSETSTATE(RL_STATE_MACRODEF); + + return (rl_call_last_kbd_macro (--count, 0)); +} + +/* Execute the most recently defined keyboard macro. + COUNT says how many times to execute it. */ +int +rl_call_last_kbd_macro (count, ignore) + int count, ignore; +{ + if (current_macro == 0) + _rl_abort_internal (); + + if (RL_ISSTATE (RL_STATE_MACRODEF)) + { + rl_ding (); /* no recursive macros */ + current_macro[--current_macro_index] = '\0'; /* erase this char */ + return 0; + } + + while (count--) + _rl_with_macro_input (savestring (current_macro)); + return 0; +} + +void +rl_push_macro_input (macro) + char *macro; +{ + _rl_with_macro_input (macro); +} diff --git a/vendors/readline/src/readline/mbutil.c b/vendors/readline/src/readline/mbutil.c new file mode 100644 index 0000000..9a8f17c --- /dev/null +++ b/vendors/readline/src/readline/mbutil.c @@ -0,0 +1,348 @@ +/* mbutil.c -- readline multibyte character utility functions */ + +/* Copyright (C) 2001-2004 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library, a library for + reading lines of text with interactive input and history editing. + + The GNU Readline Library is free software; you can redistribute it + and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2, or + (at your option) any later version. + + The GNU Readline 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 General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include +#include +#include "posixjmp.h" + +#if defined (HAVE_UNISTD_H) +# include /* for _POSIX_VERSION */ +#endif /* HAVE_UNISTD_H */ + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#include +#include + +/* System-specific feature definitions and include files. */ +#include "rldefs.h" +#include "rlmbutil.h" + +#if defined (TIOCSTAT_IN_SYS_IOCTL) +# include +#endif /* TIOCSTAT_IN_SYS_IOCTL */ + +/* Some standard library routines. */ +#include "readline.h" + +#include "rlprivate.h" +#include "xmalloc.h" + +/* Declared here so it can be shared between the readline and history + libraries. */ +#if defined (HANDLE_MULTIBYTE) +int rl_byte_oriented = 0; +#else +int rl_byte_oriented = 1; +#endif + +/* **************************************************************** */ +/* */ +/* Multibyte Character Utility Functions */ +/* */ +/* **************************************************************** */ + +#if defined(HANDLE_MULTIBYTE) + +static int +_rl_find_next_mbchar_internal (string, seed, count, find_non_zero) + char *string; + int seed, count, find_non_zero; +{ + size_t tmp = 0; + mbstate_t ps; + int point = 0; + wchar_t wc; + + memset(&ps, 0, sizeof (mbstate_t)); + if (seed < 0) + seed = 0; + if (count <= 0) + return seed; + + point = seed + _rl_adjust_point(string, seed, &ps); + /* if this is true, means that seed was not pointed character + started byte. So correct the point and consume count */ + if (seed < point) + count--; + + while (count > 0) + { + tmp = mbrtowc (&wc, string+point, strlen(string + point), &ps); + if (MB_INVALIDCH ((size_t)tmp)) + { + /* invalid bytes. asume a byte represents a character */ + point++; + count--; + /* reset states. */ + memset(&ps, 0, sizeof(mbstate_t)); + } + else if (MB_NULLWCH (tmp)) + break; /* found wide '\0' */ + else + { + /* valid bytes */ + point += tmp; + if (find_non_zero) + { + if (wcwidth (wc) == 0) + continue; + else + count--; + } + else + count--; + } + } + + if (find_non_zero) + { + tmp = mbrtowc (&wc, string + point, strlen (string + point), &ps); + while (wcwidth (wc) == 0) + { + point += tmp; + tmp = mbrtowc (&wc, string + point, strlen (string + point), &ps); + if (tmp == (size_t)(0) || tmp == (size_t)(-1) || tmp == (size_t)(-2)) + break; + } + } + return point; +} + +static int +_rl_find_prev_mbchar_internal (string, seed, find_non_zero) + char *string; + int seed, find_non_zero; +{ + mbstate_t ps; + int prev, non_zero_prev, point, length; + size_t tmp; + wchar_t wc; + + memset(&ps, 0, sizeof(mbstate_t)); + length = strlen(string); + + if (seed < 0) + return 0; + else if (length < seed) + return length; + + prev = non_zero_prev = point = 0; + while (point < seed) + { + tmp = mbrtowc (&wc, string + point, length - point, &ps); + if (MB_INVALIDCH ((size_t)tmp)) + { + /* in this case, bytes are invalid or shorted to compose + multibyte char, so assume that the first byte represents + a single character anyway. */ + tmp = 1; + /* clear the state of the byte sequence, because + in this case effect of mbstate is undefined */ + memset(&ps, 0, sizeof (mbstate_t)); + + /* Since we're assuming that this byte represents a single + non-zero-width character, don't forget about it. */ + prev = point; + } + else if (MB_NULLWCH (tmp)) + break; /* Found '\0' char. Can this happen? */ + else + { + if (find_non_zero) + { + if (wcwidth (wc) != 0) + prev = point; + } + else + prev = point; + } + + point += tmp; + } + + return prev; +} + +/* return the number of bytes parsed from the multibyte sequence starting + at src, if a non-L'\0' wide character was recognized. It returns 0, + if a L'\0' wide character was recognized. It returns (size_t)(-1), + if an invalid multibyte sequence was encountered. It returns (size_t)(-2) + if it couldn't parse a complete multibyte character. */ +int +_rl_get_char_len (src, ps) + char *src; + mbstate_t *ps; +{ + size_t tmp; + + tmp = mbrlen((const char *)src, (size_t)strlen (src), ps); + if (tmp == (size_t)(-2)) + { + /* shorted to compose multibyte char */ + if (ps) + memset (ps, 0, sizeof(mbstate_t)); + return -2; + } + else if (tmp == (size_t)(-1)) + { + /* invalid to compose multibyte char */ + /* initialize the conversion state */ + if (ps) + memset (ps, 0, sizeof(mbstate_t)); + return -1; + } + else if (tmp == (size_t)0) + return 0; + else + return (int)tmp; +} + +/* compare the specified two characters. If the characters matched, + return 1. Otherwise return 0. */ +int +_rl_compare_chars (buf1, pos1, ps1, buf2, pos2, ps2) + char *buf1; + int pos1; + mbstate_t *ps1; + char *buf2; + int pos2; + mbstate_t *ps2; +{ + int i, w1, w2; + + if ((w1 = _rl_get_char_len (&buf1[pos1], ps1)) <= 0 || + (w2 = _rl_get_char_len (&buf2[pos2], ps2)) <= 0 || + (w1 != w2) || + (buf1[pos1] != buf2[pos2])) + return 0; + + for (i = 1; i < w1; i++) + if (buf1[pos1+i] != buf2[pos2+i]) + return 0; + + return 1; +} + +/* adjust pointed byte and find mbstate of the point of string. + adjusted point will be point <= adjusted_point, and returns + differences of the byte(adjusted_point - point). + if point is invalied (point < 0 || more than string length), + it returns -1 */ +int +_rl_adjust_point(string, point, ps) + char *string; + int point; + mbstate_t *ps; +{ + size_t tmp = 0; + int length; + int pos = 0; + + length = strlen(string); + if (point < 0) + return -1; + if (length < point) + return -1; + + while (pos < point) + { + tmp = mbrlen (string + pos, length - pos, ps); + if (MB_INVALIDCH ((size_t)tmp)) + { + /* in this case, bytes are invalid or shorted to compose + multibyte char, so assume that the first byte represents + a single character anyway. */ + pos++; + /* clear the state of the byte sequence, because + in this case effect of mbstate is undefined */ + if (ps) + memset (ps, 0, sizeof (mbstate_t)); + } + else if (MB_NULLWCH (tmp)) + pos++; + else + pos += tmp; + } + + return (pos - point); +} + +int +_rl_is_mbchar_matched (string, seed, end, mbchar, length) + char *string; + int seed, end; + char *mbchar; + int length; +{ + int i; + + if ((end - seed) < length) + return 0; + + for (i = 0; i < length; i++) + if (string[seed + i] != mbchar[i]) + return 0; + return 1; +} +#endif /* HANDLE_MULTIBYTE */ + +/* Find next `count' characters started byte point of the specified seed. + If flags is MB_FIND_NONZERO, we look for non-zero-width multibyte + characters. */ +#undef _rl_find_next_mbchar +int +_rl_find_next_mbchar (string, seed, count, flags) + char *string; + int seed, count, flags; +{ +#if defined (HANDLE_MULTIBYTE) + return _rl_find_next_mbchar_internal (string, seed, count, flags); +#else + return (seed + count); +#endif +} + +/* Find previous character started byte point of the specified seed. + Returned point will be point <= seed. If flags is MB_FIND_NONZERO, + we look for non-zero-width multibyte characters. */ +#undef _rl_find_prev_mbchar +int +_rl_find_prev_mbchar (string, seed, flags) + char *string; + int seed, flags; +{ +#if defined (HANDLE_MULTIBYTE) + return _rl_find_prev_mbchar_internal (string, seed, flags); +#else + return ((seed == 0) ? seed : seed - 1); +#endif +} diff --git a/vendors/readline/src/readline/misc.c b/vendors/readline/src/readline/misc.c new file mode 100644 index 0000000..ab1e133 --- /dev/null +++ b/vendors/readline/src/readline/misc.c @@ -0,0 +1,508 @@ +/* misc.c -- miscellaneous bindable readline functions. */ + +/* Copyright (C) 1987-2004 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library, a library for + reading lines of text with interactive input and history editing. + + The GNU Readline Library is free software; you can redistribute it + and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2, or + (at your option) any later version. + + The GNU Readline 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 General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#if defined (HAVE_UNISTD_H) +# include +#endif /* HAVE_UNISTD_H */ + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#if defined (HAVE_LOCALE_H) +# include +#endif + +#include + +/* System-specific feature definitions and include files. */ +#include "rldefs.h" +#include "rlmbutil.h" + +/* Some standard library routines. */ +#include "readline.h" +#include "history.h" + +#include "rlprivate.h" +#include "rlshell.h" +#include "xmalloc.h" + +static int rl_digit_loop PARAMS((void)); +static void _rl_history_set_point PARAMS((void)); + +/* Forward declarations used in this file */ +void _rl_free_history_entry PARAMS((HIST_ENTRY *)); + +/* If non-zero, rl_get_previous_history and rl_get_next_history attempt + to preserve the value of rl_point from line to line. */ +int _rl_history_preserve_point = 0; + +/* Saved target point for when _rl_history_preserve_point is set. Special + value of -1 means that point is at the end of the line. */ +int _rl_history_saved_point = -1; + +/* **************************************************************** */ +/* */ +/* Numeric Arguments */ +/* */ +/* **************************************************************** */ + +/* Handle C-u style numeric args, as well as M--, and M-digits. */ +static int +rl_digit_loop () +{ + int key, c, sawminus, sawdigits; + + rl_save_prompt (); + + RL_SETSTATE(RL_STATE_NUMERICARG); + sawminus = sawdigits = 0; + while (1) + { + if (rl_numeric_arg > 1000000) + { + sawdigits = rl_explicit_arg = rl_numeric_arg = 0; + rl_ding (); + rl_restore_prompt (); + rl_clear_message (); + RL_UNSETSTATE(RL_STATE_NUMERICARG); + return 1; + } + rl_message ("(arg: %d) ", rl_arg_sign * rl_numeric_arg); + RL_SETSTATE(RL_STATE_MOREINPUT); + key = c = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + + if (c < 0) + { + _rl_abort_internal (); + return -1; + } + + /* If we see a key bound to `universal-argument' after seeing digits, + it ends the argument but is otherwise ignored. */ + if (_rl_keymap[c].type == ISFUNC && + _rl_keymap[c].function == rl_universal_argument) + { + if (sawdigits == 0) + { + rl_numeric_arg *= 4; + continue; + } + else + { + RL_SETSTATE(RL_STATE_MOREINPUT); + key = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + rl_restore_prompt (); + rl_clear_message (); + RL_UNSETSTATE(RL_STATE_NUMERICARG); + return (_rl_dispatch (key, _rl_keymap)); + } + } + + c = UNMETA (c); + + if (_rl_digit_p (c)) + { + rl_numeric_arg = rl_explicit_arg ? (rl_numeric_arg * 10) + c - '0' : c - '0'; + sawdigits = rl_explicit_arg = 1; + } + else if (c == '-' && rl_explicit_arg == 0) + { + rl_numeric_arg = sawminus = 1; + rl_arg_sign = -1; + } + else + { + /* Make M-- command equivalent to M--1 command. */ + if (sawminus && rl_numeric_arg == 1 && rl_explicit_arg == 0) + rl_explicit_arg = 1; + rl_restore_prompt (); + rl_clear_message (); + RL_UNSETSTATE(RL_STATE_NUMERICARG); + return (_rl_dispatch (key, _rl_keymap)); + } + } + + /*NOTREACHED*/ +} + +/* Add the current digit to the argument in progress. */ +int +rl_digit_argument (ignore, key) + int ignore, key; +{ + rl_execute_next (key); + return (rl_digit_loop ()); +} + +/* What to do when you abort reading an argument. */ +int +rl_discard_argument () +{ + rl_ding (); + rl_clear_message (); + _rl_init_argument (); + return 0; +} + +/* Create a default argument. */ +int +_rl_init_argument () +{ + rl_numeric_arg = rl_arg_sign = 1; + rl_explicit_arg = 0; + return 0; +} + +/* C-u, universal argument. Multiply the current argument by 4. + Read a key. If the key has nothing to do with arguments, then + dispatch on it. If the key is the abort character then abort. */ +int +rl_universal_argument (count, key) + int count, key; +{ + rl_numeric_arg *= 4; + return (rl_digit_loop ()); +} + +/* **************************************************************** */ +/* */ +/* History Utilities */ +/* */ +/* **************************************************************** */ + +/* We already have a history library, and that is what we use to control + the history features of readline. This is our local interface to + the history mechanism. */ + +/* While we are editing the history, this is the saved + version of the original line. */ +HIST_ENTRY *_rl_saved_line_for_history = (HIST_ENTRY *)NULL; + +/* Set the history pointer back to the last entry in the history. */ +void +_rl_start_using_history () +{ + using_history (); + if (_rl_saved_line_for_history) + _rl_free_history_entry (_rl_saved_line_for_history); + + _rl_saved_line_for_history = (HIST_ENTRY *)NULL; +} + +/* Free the contents (and containing structure) of a HIST_ENTRY. */ +void +_rl_free_history_entry (entry) + HIST_ENTRY *entry; +{ + if (entry == 0) + return; + if (entry->line) + free (entry->line); + free (entry); +} + +/* Perhaps put back the current line if it has changed. */ +int +rl_maybe_replace_line () +{ + HIST_ENTRY *temp; + + temp = current_history (); + /* If the current line has changed, save the changes. */ + if (temp && ((UNDO_LIST *)(temp->data) != rl_undo_list)) + { + temp = replace_history_entry (where_history (), rl_line_buffer, (histdata_t)rl_undo_list); + free (temp->line); + free (temp); + } + return 0; +} + +/* Restore the _rl_saved_line_for_history if there is one. */ +int +rl_maybe_unsave_line () +{ + if (_rl_saved_line_for_history) + { + /* Can't call with `1' because rl_undo_list might point to an undo + list from a history entry, as in rl_replace_from_history() below. */ + rl_replace_line (_rl_saved_line_for_history->line, 0); + rl_undo_list = (UNDO_LIST *)_rl_saved_line_for_history->data; + _rl_free_history_entry (_rl_saved_line_for_history); + _rl_saved_line_for_history = (HIST_ENTRY *)NULL; + rl_point = rl_end; /* rl_replace_line sets rl_end */ + } + else + rl_ding (); + return 0; +} + +/* Save the current line in _rl_saved_line_for_history. */ +int +rl_maybe_save_line () +{ + if (_rl_saved_line_for_history == 0) + { + _rl_saved_line_for_history = (HIST_ENTRY *)xmalloc (sizeof (HIST_ENTRY)); + _rl_saved_line_for_history->line = savestring (rl_line_buffer); + _rl_saved_line_for_history->data = (char *)rl_undo_list; + } + else if (STREQ (rl_line_buffer, _rl_saved_line_for_history->line) == 0) + { + free (_rl_saved_line_for_history->line); + _rl_saved_line_for_history->line = savestring (rl_line_buffer); + _rl_saved_line_for_history->data = (char *)rl_undo_list; /* XXX possible memleak */ + } + + return 0; +} + +int +_rl_free_saved_history_line () +{ + if (_rl_saved_line_for_history) + { + _rl_free_history_entry (_rl_saved_line_for_history); + _rl_saved_line_for_history = (HIST_ENTRY *)NULL; + } + return 0; +} + +static void +_rl_history_set_point () +{ + rl_point = (_rl_history_preserve_point && _rl_history_saved_point != -1) + ? _rl_history_saved_point + : rl_end; + if (rl_point > rl_end) + rl_point = rl_end; + +#if defined (VI_MODE) + if (rl_editing_mode == vi_mode && _rl_keymap != vi_insertion_keymap) + rl_point = 0; +#endif /* VI_MODE */ + + if (rl_editing_mode == emacs_mode) + rl_mark = (rl_point == rl_end ? 0 : rl_end); +} + +void +rl_replace_from_history (entry, flags) + HIST_ENTRY *entry; + int flags; /* currently unused */ +{ + /* Can't call with `1' because rl_undo_list might point to an undo list + from a history entry, just like we're setting up here. */ + rl_replace_line (entry->line, 0); + rl_undo_list = (UNDO_LIST *)entry->data; + rl_point = rl_end; + rl_mark = 0; + +#if defined (VI_MODE) + if (rl_editing_mode == vi_mode) + { + rl_point = 0; + rl_mark = rl_end; + } +#endif +} + +/* **************************************************************** */ +/* */ +/* History Commands */ +/* */ +/* **************************************************************** */ + +/* Meta-< goes to the start of the history. */ +int +rl_beginning_of_history (count, key) + int count, key; +{ + return (rl_get_previous_history (1 + where_history (), key)); +} + +/* Meta-> goes to the end of the history. (The current line). */ +int +rl_end_of_history (count, key) + int count, key; +{ + rl_maybe_replace_line (); + using_history (); + rl_maybe_unsave_line (); + return 0; +} + +/* Move down to the next history line. */ +int +rl_get_next_history (count, key) + int count, key; +{ + HIST_ENTRY *temp; + + if (count < 0) + return (rl_get_previous_history (-count, key)); + + if (count == 0) + return 0; + + rl_maybe_replace_line (); + + /* either not saved by rl_newline or at end of line, so set appropriately. */ + if (_rl_history_saved_point == -1 && (rl_point || rl_end)) + _rl_history_saved_point = (rl_point == rl_end) ? -1 : rl_point; + + temp = (HIST_ENTRY *)NULL; + while (count) + { + temp = next_history (); + if (!temp) + break; + --count; + } + + if (temp == 0) + rl_maybe_unsave_line (); + else + { + rl_replace_from_history (temp, 0); + _rl_history_set_point (); + } + return 0; +} + +/* Get the previous item out of our interactive history, making it the current + line. If there is no previous history, just ding. */ +int +rl_get_previous_history (count, key) + int count, key; +{ + HIST_ENTRY *old_temp, *temp; + + if (count < 0) + return (rl_get_next_history (-count, key)); + + if (count == 0) + return 0; + + /* either not saved by rl_newline or at end of line, so set appropriately. */ + if (_rl_history_saved_point == -1 && (rl_point || rl_end)) + _rl_history_saved_point = (rl_point == rl_end) ? -1 : rl_point; + + /* If we don't have a line saved, then save this one. */ + rl_maybe_save_line (); + + /* If the current line has changed, save the changes. */ + rl_maybe_replace_line (); + + temp = old_temp = (HIST_ENTRY *)NULL; + while (count) + { + temp = previous_history (); + if (temp == 0) + break; + + old_temp = temp; + --count; + } + + /* If there was a large argument, and we moved back to the start of the + history, that is not an error. So use the last value found. */ + if (!temp && old_temp) + temp = old_temp; + + if (temp == 0) + rl_ding (); + else + { + rl_replace_from_history (temp, 0); + _rl_history_set_point (); + } + + return 0; +} + +/* **************************************************************** */ +/* */ +/* Editing Modes */ +/* */ +/* **************************************************************** */ +/* How to toggle back and forth between editing modes. */ +int +rl_vi_editing_mode (count, key) + int count, key; +{ +#if defined (VI_MODE) + _rl_set_insert_mode (RL_IM_INSERT, 1); /* vi mode ignores insert mode */ + rl_editing_mode = vi_mode; + rl_vi_insertion_mode (1, key); +#endif /* VI_MODE */ + + return 0; +} + +int +rl_emacs_editing_mode (count, key) + int count, key; +{ + rl_editing_mode = emacs_mode; + _rl_set_insert_mode (RL_IM_INSERT, 1); /* emacs mode default is insert mode */ + _rl_keymap = emacs_standard_keymap; + return 0; +} + +/* Function for the rest of the library to use to set insert/overwrite mode. */ +void +_rl_set_insert_mode (im, force) + int im, force; +{ +#ifdef CURSOR_MODE + _rl_set_cursor (im, force); +#endif + + rl_insert_mode = im; +} + +/* Toggle overwrite mode. A positive explicit argument selects overwrite + mode. A negative or zero explicit argument selects insert mode. */ +int +rl_overwrite_mode (count, key) + int count, key; +{ + if (rl_explicit_arg == 0) + _rl_set_insert_mode (rl_insert_mode ^ 1, 0); + else if (count > 0) + _rl_set_insert_mode (RL_IM_OVERWRITE, 0); + else + _rl_set_insert_mode (RL_IM_INSERT, 0); + + return 0; +} diff --git a/vendors/readline/src/readline/nls.c b/vendors/readline/src/readline/nls.c new file mode 100644 index 0000000..3aaa8ab --- /dev/null +++ b/vendors/readline/src/readline/nls.c @@ -0,0 +1,254 @@ +/* nls.c -- skeletal internationalization code. */ + +/* Copyright (C) 1996 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library, a library for + reading lines of text with interactive input and history editing. + + The GNU Readline Library is free software; you can redistribute it + and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2, or + (at your option) any later version. + + The GNU Readline 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 General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include + +#include + +#if defined (HAVE_UNISTD_H) +# include +#endif /* HAVE_UNISTD_H */ + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#if defined (HAVE_LOCALE_H) +# include +#endif + +#include + +#include "rldefs.h" +#include "readline.h" +#include "rlshell.h" +#include "rlprivate.h" + +#if !defined (HAVE_SETLOCALE) +/* A list of legal values for the LANG or LC_CTYPE environment variables. + If a locale name in this list is the value for the LC_ALL, LC_CTYPE, + or LANG environment variable (using the first of those with a value), + readline eight-bit mode is enabled. */ +static char *legal_lang_values[] = +{ + "iso88591", + "iso88592", + "iso88593", + "iso88594", + "iso88595", + "iso88596", + "iso88597", + "iso88598", + "iso88599", + "iso885910", + "koi8r", + 0 +}; + +static char *normalize_codeset PARAMS((char *)); +static char *find_codeset PARAMS((char *, size_t *)); +#endif /* !HAVE_SETLOCALE */ + +static char *_rl_get_locale_var PARAMS((const char *)); + +static char * +_rl_get_locale_var (v) + const char *v; +{ + char *lspec; + + lspec = sh_get_env_value ("LC_ALL"); + if (lspec == 0 || *lspec == 0) + lspec = sh_get_env_value (v); + if (lspec == 0 || *lspec == 0) + lspec = sh_get_env_value ("LANG"); + + return lspec; +} + +/* Check for LC_ALL, LC_CTYPE, and LANG and use the first with a value + to decide the defaults for 8-bit character input and output. Returns + 1 if we set eight-bit mode. */ +int +_rl_init_eightbit () +{ +/* If we have setlocale(3), just check the current LC_CTYPE category + value, and go into eight-bit mode if it's not C or POSIX. */ +#if defined (HAVE_SETLOCALE) + char *lspec, *t; + + /* Set the LC_CTYPE locale category from environment variables. */ + lspec = _rl_get_locale_var ("LC_CTYPE"); + /* Since _rl_get_locale_var queries the right environment variables, + we query the current locale settings with setlocale(), and, if + that doesn't return anything, we set lspec to the empty string to + force the subsequent call to setlocale() to define the `native' + environment. */ + if (lspec == 0 || *lspec == 0) + lspec = setlocale (LC_CTYPE, (char *)NULL); + if (lspec == 0) + lspec = ""; + t = setlocale (LC_CTYPE, lspec); + +#ifndef _WIN32 + if (t && *t && (t[0] != 'C' || t[1]) && (STREQ (t, "POSIX") == 0)) + { + _rl_meta_flag = 1; + _rl_convert_meta_chars_to_ascii = 0; + _rl_output_meta_chars = 1; + return (1); + } + else +#endif + return (0); + +#else /* !HAVE_SETLOCALE */ + char *lspec, *t; + int i; + + /* We don't have setlocale. Finesse it. Check the environment for the + appropriate variables and set eight-bit mode if they have the right + values. */ + lspec = _rl_get_locale_var ("LC_CTYPE"); + + if (lspec == 0 || (t = normalize_codeset (lspec)) == 0) + return (0); + for (i = 0; t && legal_lang_values[i]; i++) + if (STREQ (t, legal_lang_values[i])) + { + _rl_meta_flag = 1; + _rl_convert_meta_chars_to_ascii = 0; + _rl_output_meta_chars = 1; + break; + } + free (t); + return (legal_lang_values[i] ? 1 : 0); + +#endif /* !HAVE_SETLOCALE */ +} + +#if !defined (HAVE_SETLOCALE) +static char * +normalize_codeset (codeset) + char *codeset; +{ + size_t namelen, i; + int len, all_digits; + char *wp, *retval; + + codeset = find_codeset (codeset, &namelen); + + if (codeset == 0) + return (codeset); + + all_digits = 1; + for (len = 0, i = 0; i < namelen; i++) + { + if (ISALNUM ((unsigned char)codeset[i])) + { + len++; + all_digits &= _rl_digit_p (codeset[i]); + } + } + + retval = (char *)malloc ((all_digits ? 3 : 0) + len + 1); + if (retval == 0) + return ((char *)0); + + wp = retval; + /* Add `iso' to beginning of an all-digit codeset */ + if (all_digits) + { + *wp++ = 'i'; + *wp++ = 's'; + *wp++ = 'o'; + } + + for (i = 0; i < namelen; i++) + if (ISALPHA ((unsigned char)codeset[i])) + *wp++ = _rl_to_lower (codeset[i]); + else if (_rl_digit_p (codeset[i])) + *wp++ = codeset[i]; + *wp = '\0'; + + return retval; +} + +/* Isolate codeset portion of locale specification. */ +static char * +find_codeset (name, lenp) + char *name; + size_t *lenp; +{ + char *cp, *language, *result; + + cp = language = name; + result = (char *)0; + + while (*cp && *cp != '_' && *cp != '@' && *cp != '+' && *cp != ',') + cp++; + + /* This does not make sense: language has to be specified. As + an exception we allow the variable to contain only the codeset + name. Perhaps there are funny codeset names. */ + if (language == cp) + { + *lenp = strlen (language); + result = language; + } + else + { + /* Next is the territory. */ + if (*cp == '_') + do + ++cp; + while (*cp && *cp != '.' && *cp != '@' && *cp != '+' && *cp != ',' && *cp != '_'); + + /* Now, finally, is the codeset. */ + result = cp; + if (*cp == '.') + do + ++cp; + while (*cp && *cp != '@'); + + if (cp - result > 2) + { + result++; + *lenp = cp - result; + } + else + { + *lenp = strlen (language); + result = language; + } + } + + return result; +} +#endif /* !HAVE_SETLOCALE */ diff --git a/vendors/readline/src/readline/parens.c b/vendors/readline/src/readline/parens.c new file mode 100644 index 0000000..25ea18d --- /dev/null +++ b/vendors/readline/src/readline/parens.c @@ -0,0 +1,212 @@ +/* parens.c -- Implementation of matching parentheses feature. */ + +/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library, a library for + reading lines of text with interactive input and history editing. + + The GNU Readline Library is free software; you can redistribute it + and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2, or + (at your option) any later version. + + The GNU Readline 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 General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ +#define READLINE_LIBRARY + +#if defined (__TANDEM) +# include +#endif + +#include "rlconf.h" + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include +#include + +#if defined (HAVE_UNISTD_H) +# include +#endif + +#if defined (FD_SET) && !defined (HAVE_SELECT) +# define HAVE_SELECT +#endif + +#ifdef _WIN32 +# include +#endif + +#if defined (HAVE_SELECT) +# include +#endif /* HAVE_SELECT */ +#if defined (HAVE_SYS_SELECT_H) +# include +#endif + +//***********************CHANGED**************************** +//#if defined (HAVE_STRING_H) +//# include +//#else /* !HAVE_STRING_H */ +//# include +//#endif /* !HAVE_STRING_H */ + +#if defined (HAVE_STRING_H) +# include +#endif +#if defined (HAVE_STRINGS_H) +# include +#endif + +#if !defined (strchr) && !defined (__STDC__) +extern char *strchr (), *strrchr (); +#endif /* !strchr && !__STDC__ */ + +#include "readline.h" +#include "rlprivate.h" + +static int find_matching_open PARAMS((char *, int, int)); + +/* Non-zero means try to blink the matching open parenthesis when the + close parenthesis is inserted. */ +#if defined (HAVE_SELECT) || defined (_WIN32) +int rl_blink_matching_paren = 1; +#else /* !HAVE_SELECT */ +int rl_blink_matching_paren = 0; +#endif /* !HAVE_SELECT */ + +static int _paren_blink_usec = 500000; + +/* Change emacs_standard_keymap to have bindings for paren matching when + ON_OR_OFF is 1, change them back to self_insert when ON_OR_OFF == 0. */ +void +_rl_enable_paren_matching (on_or_off) + int on_or_off; +{ + if (on_or_off) + { /* ([{ */ + rl_bind_key_in_map (')', rl_insert_close, emacs_standard_keymap); + rl_bind_key_in_map (']', rl_insert_close, emacs_standard_keymap); + rl_bind_key_in_map ('}', rl_insert_close, emacs_standard_keymap); + } + else + { /* ([{ */ + rl_bind_key_in_map (')', rl_insert, emacs_standard_keymap); + rl_bind_key_in_map (']', rl_insert, emacs_standard_keymap); + rl_bind_key_in_map ('}', rl_insert, emacs_standard_keymap); + } +} + +int +rl_set_paren_blink_timeout (u) + int u; +{ + int o; + + o = _paren_blink_usec; + if (u > 0) + _paren_blink_usec = u; + return (o); +} + +int +rl_insert_close (count, invoking_key) + int count, invoking_key; +{ + if (rl_explicit_arg || !rl_blink_matching_paren) + _rl_insert_char (count, invoking_key); + else + { +#if defined (HAVE_SELECT) + int orig_point, match_point, ready; + struct timeval timer; + fd_set readfds; + + _rl_insert_char (1, invoking_key); + (*rl_redisplay_function) (); + match_point = + find_matching_open (rl_line_buffer, rl_point - 2, invoking_key); + + /* Emacs might message or ring the bell here, but I don't. */ + if (match_point < 0) + return -1; + + FD_ZERO (&readfds); + FD_SET (fileno (rl_instream), &readfds); + timer.tv_sec = 0; + timer.tv_usec = _paren_blink_usec; + + orig_point = rl_point; + rl_point = match_point; + (*rl_redisplay_function) (); + ready = select (1, &readfds, (fd_set *)NULL, (fd_set *)NULL, &timer); + rl_point = orig_point; +#elif defined (_WIN32) + int orig_point, match_point, ready; + + rl_insert (1, invoking_key); + (*rl_redisplay_function) (); + match_point = + find_matching_open (rl_line_buffer, rl_point - 2, invoking_key); + + /* Emacs might message or ring the bell here, but I don't. */ + if (match_point < 0) + return -1; + + orig_point = rl_point; + rl_point = match_point; + (*rl_redisplay_function) (); + ready = (WaitForSingleObject (GetStdHandle(STD_INPUT_HANDLE), 500) == WAIT_OBJECT_0); + rl_point = orig_point; +#else /* !_WIN32 */ + rl_insert (count, invoking_key); +#endif /* !HAVE_SELECT */ + } + return 0; +} + +static int +find_matching_open (string, from, closer) + char *string; + int from, closer; +{ + register int i; + int opener, level, delimiter; + + switch (closer) + { + case ']': opener = '['; break; + case '}': opener = '{'; break; + case ')': opener = '('; break; + default: + return (-1); + } + + level = 1; /* The closer passed in counts as 1. */ + delimiter = 0; /* Delimited state unknown. */ + + for (i = from; i > -1; i--) + { + if (delimiter && (string[i] == delimiter)) + delimiter = 0; + else if (rl_basic_quote_characters && strchr (rl_basic_quote_characters, string[i])) + delimiter = string[i]; + else if (!delimiter && (string[i] == closer)) + level++; + else if (!delimiter && (string[i] == opener)) + level--; + + if (!level) + break; + } + return (i); +} diff --git a/vendors/readline/src/readline/posixdir.h b/vendors/readline/src/readline/posixdir.h new file mode 100644 index 0000000..5677a77 --- /dev/null +++ b/vendors/readline/src/readline/posixdir.h @@ -0,0 +1,71 @@ +/* posixdir.h -- Posix directory reading includes and defines. */ + +/* Copyright (C) 1987,1991 Free Software Foundation, Inc. + + This file is part of GNU Bash, the Bourne Again SHell. + + Bash is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bash is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU General Public License + along with Bash; see the file COPYING. If not, write to the Free + Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + +/* This file should be included instead of or . */ + +#if !defined (_POSIXDIR_H_) +#define _POSIXDIR_H_ + +#if defined (HAVE_DIRENT_H) +# include +# if defined (HAVE_STRUCT_DIRENT_D_NAMLEN) +# define D_NAMLEN(d) ((d)->d_namlen) +# else +# define D_NAMLEN(d) (strlen ((d)->d_name)) +# endif /* !HAVE_STRUCT_DIRENT_D_NAMLEN */ +# define FILENAME(d) ((d)->d_name) +#else +# if defined (HAVE_SYS_NDIR_H) +# include +# endif +# if defined (HAVE_SYS_DIR_H) +# include +# endif +# if defined (HAVE_NDIR_H) +# include +# endif +# if !defined (dirent) +# define dirent direct +# endif /* !dirent */ +# define D_NAMLEN(d) ((d)->d_namlen) +# define FILENAME(d) ((d)->d_name) +#endif /* !HAVE_DIRENT_H */ + +#if defined (_WIN32) +# undef FILENAME +# define FILENAME(d) (d).cFileName +# define closedir(dir) FindClose (dir) +# undef D_NAMLEN +# define D_NAMLEN(d) strlen (d.cFileName) +#endif + +#if defined (HAVE_STRUCT_DIRENT_D_INO) && !defined (HAVE_STRUCT_DIRENT_D_FILENO) +# define d_fileno d_ino +#endif + +#if defined (_POSIX_SOURCE) && (!defined (HAVE_STRUCT_DIRENT_D_INO) || defined (BROKEN_DIRENT_D_INO)) +/* Posix does not require that the d_ino field be present, and some + systems do not provide it. */ +# define REAL_DIR_ENTRY(dp) 1 +#else +# define REAL_DIR_ENTRY(dp) (dp->d_ino != 0) +#endif /* _POSIX_SOURCE */ + +#endif /* !_POSIXDIR_H_ */ diff --git a/vendors/readline/src/readline/posixjmp.h b/vendors/readline/src/readline/posixjmp.h new file mode 100644 index 0000000..b52aa00 --- /dev/null +++ b/vendors/readline/src/readline/posixjmp.h @@ -0,0 +1,40 @@ +/* posixjmp.h -- wrapper for setjmp.h with changes for POSIX systems. */ + +/* Copyright (C) 1987,1991 Free Software Foundation, Inc. + + This file is part of GNU Bash, the Bourne Again SHell. + + Bash is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bash is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU General Public License + along with Bash; see the file COPYING. If not, write to the Free + Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + +#ifndef _POSIXJMP_H_ +#define _POSIXJMP_H_ + +#include + +/* This *must* be included *after* config.h */ + +#if defined (HAVE_POSIX_SIGSETJMP) +# define procenv_t sigjmp_buf +# if !defined (__OPENNT) +# undef setjmp +# define setjmp(x) sigsetjmp((x), 1) +# undef longjmp +# define longjmp(x, n) siglongjmp((x), (n)) +# endif /* !__OPENNT */ +#else +# define procenv_t jmp_buf +#endif + +#endif /* _POSIXJMP_H_ */ diff --git a/vendors/readline/src/readline/posixstat.h b/vendors/readline/src/readline/posixstat.h new file mode 100644 index 0000000..c93b528 --- /dev/null +++ b/vendors/readline/src/readline/posixstat.h @@ -0,0 +1,142 @@ +/* posixstat.h -- Posix stat(2) definitions for systems that + don't have them. */ + +/* Copyright (C) 1987,1991 Free Software Foundation, Inc. + + This file is part of GNU Bash, the Bourne Again SHell. + + Bash is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bash is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU General Public License + along with Bash; see the file COPYING. If not, write to the Free + Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + +/* This file should be included instead of . + It relies on the local sys/stat.h to work though. */ +#if !defined (_POSIXSTAT_H_) +#define _POSIXSTAT_H_ + +#include + +#if defined (STAT_MACROS_BROKEN) +# undef S_ISBLK +# undef S_ISCHR +# undef S_ISDIR +# undef S_ISFIFO +# undef S_ISREG +# undef S_ISLNK +#endif /* STAT_MACROS_BROKEN */ + +/* These are guaranteed to work only on isc386 */ +#if !defined (S_IFDIR) && !defined (S_ISDIR) +# define S_IFDIR 0040000 +#endif /* !S_IFDIR && !S_ISDIR */ +#if !defined (S_IFMT) +# define S_IFMT 0170000 +#endif /* !S_IFMT */ + +/* Posix 1003.1 5.6.1.1 file types */ + +/* Some Posix-wannabe systems define _S_IF* macros instead of S_IF*, but + do not provide the S_IS* macros that Posix requires. */ + +#if defined (_S_IFMT) && !defined (S_IFMT) +#define S_IFMT _S_IFMT +#endif +#if defined (_S_IFIFO) && !defined (S_IFIFO) +#define S_IFIFO _S_IFIFO +#endif +#if defined (_S_IFCHR) && !defined (S_IFCHR) +#define S_IFCHR _S_IFCHR +#endif +#if defined (_S_IFDIR) && !defined (S_IFDIR) +#define S_IFDIR _S_IFDIR +#endif +#if defined (_S_IFBLK) && !defined (S_IFBLK) +#define S_IFBLK _S_IFBLK +#endif +#if defined (_S_IFREG) && !defined (S_IFREG) +#define S_IFREG _S_IFREG +#endif +#if defined (_S_IFLNK) && !defined (S_IFLNK) +#define S_IFLNK _S_IFLNK +#endif +#if defined (_S_IFSOCK) && !defined (S_IFSOCK) +#define S_IFSOCK _S_IFSOCK +#endif + +/* Test for each symbol individually and define the ones necessary (some + systems claiming Posix compatibility define some but not all). */ + +#if defined (S_IFBLK) && !defined (S_ISBLK) +#define S_ISBLK(m) (((m)&S_IFMT) == S_IFBLK) /* block device */ +#endif + +#if defined (S_IFCHR) && !defined (S_ISCHR) +#define S_ISCHR(m) (((m)&S_IFMT) == S_IFCHR) /* character device */ +#endif + +#if defined (S_IFDIR) && !defined (S_ISDIR) +#define S_ISDIR(m) (((m)&S_IFMT) == S_IFDIR) /* directory */ +#endif + +#if defined (S_IFREG) && !defined (S_ISREG) +#define S_ISREG(m) (((m)&S_IFMT) == S_IFREG) /* file */ +#endif + +#if defined (S_IFIFO) && !defined (S_ISFIFO) +#define S_ISFIFO(m) (((m)&S_IFMT) == S_IFIFO) /* fifo - named pipe */ +#endif + +#if defined (S_IFLNK) && !defined (S_ISLNK) +#define S_ISLNK(m) (((m)&S_IFMT) == S_IFLNK) /* symbolic link */ +#endif + +#if defined (S_IFSOCK) && !defined (S_ISSOCK) +#define S_ISSOCK(m) (((m)&S_IFMT) == S_IFSOCK) /* socket */ +#endif + +/* + * POSIX 1003.1 5.6.1.2 File Modes + */ + +#if !defined (S_IRWXU) +# if !defined (S_IREAD) +# define S_IREAD 00400 +# define S_IWRITE 00200 +# define S_IEXEC 00100 +# endif /* S_IREAD */ + +# if !defined (S_IRUSR) +# define S_IRUSR S_IREAD /* read, owner */ +# define S_IWUSR S_IWRITE /* write, owner */ +# define S_IXUSR S_IEXEC /* execute, owner */ + +# define S_IRGRP (S_IREAD >> 3) /* read, group */ +# define S_IWGRP (S_IWRITE >> 3) /* write, group */ +# define S_IXGRP (S_IEXEC >> 3) /* execute, group */ + +# define S_IROTH (S_IREAD >> 6) /* read, other */ +# define S_IWOTH (S_IWRITE >> 6) /* write, other */ +# define S_IXOTH (S_IEXEC >> 6) /* execute, other */ +# endif /* !S_IRUSR */ + +# define S_IRWXU (S_IRUSR | S_IWUSR | S_IXUSR) +# define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP) +# define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH) +#endif /* !S_IRWXU */ + +/* These are non-standard, but are used in builtins.c$symbolic_umask() */ +#define S_IRUGO (S_IRUSR | S_IRGRP | S_IROTH) +#define S_IWUGO (S_IWUSR | S_IWGRP | S_IWOTH) +#define S_IXUGO (S_IXUSR | S_IXGRP | S_IXOTH) + +#endif /* _POSIXSTAT_H_ */ diff --git a/vendors/readline/src/readline/readline.c b/vendors/readline/src/readline/readline.c new file mode 100644 index 0000000..6b2fd80 --- /dev/null +++ b/vendors/readline/src/readline/readline.c @@ -0,0 +1,1001 @@ +/* readline.c -- a general facility for reading lines of input + with emacs style editing and completion. */ + +/* Copyright (C) 1987-2002 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library, a library for + reading lines of text with interactive input and history editing. + + The GNU Readline Library is free software; you can redistribute it + and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2, or + (at your option) any later version. + + The GNU Readline 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 General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include +#include "posixstat.h" +#include +#if defined (HAVE_SYS_FILE_H) +# include +#endif /* HAVE_SYS_FILE_H */ + +#if defined (HAVE_UNISTD_H) +# include +#endif /* HAVE_UNISTD_H */ + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#if defined (HAVE_LOCALE_H) +# include +#endif + +#include +#include "posixjmp.h" + +/* System-specific feature definitions and include files. */ +#include "rldefs.h" +#include "rlmbutil.h" + +#if defined (__EMX__) +# define INCL_DOSPROCESS +# include +#endif /* __EMX__ */ + +/* Some standard library routines. */ +#include "readline.h" +#include "history.h" + +#include "rlprivate.h" +#include "rlshell.h" +#include "xmalloc.h" + +#ifndef RL_LIBRARY_VERSION +# define RL_LIBRARY_VERSION "5.0" +#endif + +#ifndef RL_READLINE_VERSION +# define RL_READLINE_VERSION 0x0500 +#endif + +extern void _rl_free_history_entry PARAMS((HIST_ENTRY *)); + +/* Forward declarations used in this file. */ +static char *readline_internal PARAMS((void)); +static void readline_initialize_everything PARAMS((void)); + +static void bind_arrow_keys_internal PARAMS((Keymap)); +static void bind_arrow_keys PARAMS((void)); + +static void readline_default_bindings PARAMS((void)); +static void reset_default_bindings PARAMS((void)); + +/* **************************************************************** */ +/* */ +/* Line editing input utility */ +/* */ +/* **************************************************************** */ + +const char *rl_library_version = RL_LIBRARY_VERSION; + +int rl_readline_version = RL_READLINE_VERSION; + +/* True if this is `real' readline as opposed to some stub substitute. */ +int rl_gnu_readline_p = 1; + +/* A pointer to the keymap that is currently in use. + By default, it is the standard emacs keymap. */ +Keymap _rl_keymap = emacs_standard_keymap; + +/* The current style of editing. */ +int rl_editing_mode = emacs_mode; + +/* The current insert mode: input (the default) or overwrite */ +int rl_insert_mode = RL_IM_DEFAULT; + +/* Non-zero if we called this function from _rl_dispatch(). It's present + so functions can find out whether they were called from a key binding + or directly from an application. */ +int rl_dispatching; + +/* Non-zero if the previous command was a kill command. */ +int _rl_last_command_was_kill = 0; + +/* The current value of the numeric argument specified by the user. */ +int rl_numeric_arg = 1; + +/* Non-zero if an argument was typed. */ +int rl_explicit_arg = 0; + +/* Temporary value used while generating the argument. */ +int rl_arg_sign = 1; + +/* Non-zero means we have been called at least once before. */ +static int rl_initialized; + +#if 0 +/* If non-zero, this program is running in an EMACS buffer. */ +static int running_in_emacs; +#endif + +/* Flags word encapsulating the current readline state. */ +int rl_readline_state = RL_STATE_NONE; + +/* The current offset in the current input line. */ +int rl_point; + +/* Mark in the current input line. */ +int rl_mark; + +/* Length of the current input line. */ +int rl_end; + +/* Make this non-zero to return the current input_line. */ +int rl_done; + +/* The last function executed by readline. */ +rl_command_func_t *rl_last_func = (rl_command_func_t *)NULL; + +/* Top level environment for readline_internal (). */ +procenv_t readline_top_level; + +/* The streams we interact with. */ +FILE *_rl_in_stream, *_rl_out_stream; + +/* The names of the streams that we do input and output to. */ +FILE *rl_instream = (FILE *)NULL; +FILE *rl_outstream = (FILE *)NULL; + +/* Non-zero means echo characters as they are read. Defaults to no echo; + set to 1 if there is a controlling terminal, we can get its attributes, + and the attributes include `echo'. Look at rltty.c:prepare_terminal_settings + for the code that sets it. */ +int readline_echoing_p = 0; + +/* Current prompt. */ +char *rl_prompt = (char *)NULL; +int rl_visible_prompt_length = 0; + +/* Set to non-zero by calling application if it has already printed rl_prompt + and does not want readline to do it the first time. */ +int rl_already_prompted = 0; + +/* The number of characters read in order to type this complete command. */ +int rl_key_sequence_length = 0; + +/* If non-zero, then this is the address of a function to call just + before readline_internal_setup () prints the first prompt. */ +rl_hook_func_t *rl_startup_hook = (rl_hook_func_t *)NULL; + +/* If non-zero, this is the address of a function to call just before + readline_internal_setup () returns and readline_internal starts + reading input characters. */ +rl_hook_func_t *rl_pre_input_hook = (rl_hook_func_t *)NULL; + +/* What we use internally. You should always refer to RL_LINE_BUFFER. */ +static char *the_line; + +/* The character that can generate an EOF. Really read from + the terminal driver... just defaulted here. */ +int _rl_eof_char = CTRL ('D'); + +/* Non-zero makes this the next keystroke to read. */ +int rl_pending_input = 0; + +/* Pointer to a useful terminal name. */ +const char *rl_terminal_name = (const char *)NULL; + +/* Non-zero means to always use horizontal scrolling in line display. */ +int _rl_horizontal_scroll_mode = 0; + +/* Non-zero means to display an asterisk at the starts of history lines + which have been modified. */ +int _rl_mark_modified_lines = 0; + +/* The style of `bell' notification preferred. This can be set to NO_BELL, + AUDIBLE_BELL, or VISIBLE_BELL. */ +int _rl_bell_preference = AUDIBLE_BELL; + +/* String inserted into the line by rl_insert_comment (). */ +char *_rl_comment_begin; + +/* Keymap holding the function currently being executed. */ +Keymap rl_executing_keymap; + +/* Non-zero means to erase entire line, including prompt, on empty input lines. */ +int rl_erase_empty_line = 0; + +/* Non-zero means to read only this many characters rather than up to a + character bound to accept-line. */ +int rl_num_chars_to_read; + +/* Line buffer and maintenence. */ +char *rl_line_buffer = (char *)NULL; +int rl_line_buffer_len = 0; + +/* Forward declarations used by the display, termcap, and history code. */ + +/* **************************************************************** */ +/* */ +/* `Forward' declarations */ +/* */ +/* **************************************************************** */ + +/* Non-zero means do not parse any lines other than comments and + parser directives. */ +unsigned char _rl_parsing_conditionalized_out = 0; + +/* Non-zero means to convert characters with the meta bit set to + escape-prefixed characters so we can indirect through + emacs_meta_keymap or vi_escape_keymap. */ +int _rl_convert_meta_chars_to_ascii = 1; + +/* Non-zero means to output characters with the meta bit set directly + rather than as a meta-prefixed escape sequence. */ +int _rl_output_meta_chars = 0; + +/* **************************************************************** */ +/* */ +/* Top Level Functions */ +/* */ +/* **************************************************************** */ + +/* Non-zero means treat 0200 bit in terminal input as Meta bit. */ +int _rl_meta_flag = 0; /* Forward declaration */ + +/* Set up the prompt and expand it. Called from readline() and + rl_callback_handler_install (). */ +int +rl_set_prompt (prompt) + const char *prompt; +{ + FREE (rl_prompt); + rl_prompt = prompt ? savestring (prompt) : (char *)NULL; + + rl_visible_prompt_length = rl_expand_prompt (rl_prompt); + return 0; +} + +/* Read a line of input. Prompt with PROMPT. An empty PROMPT means + none. A return value of NULL means that EOF was encountered. */ +char * +readline (prompt) + const char *prompt; +{ + char *value; + + /* If we are at EOF return a NULL string. */ + if (rl_pending_input == EOF) + { + rl_clear_pending_input (); + return ((char *)NULL); + } + + rl_set_prompt (prompt); + + rl_initialize (); + (*rl_prep_term_function) (_rl_meta_flag); + +#if defined (HANDLE_SIGNALS) + rl_set_signals (); +#endif + + value = readline_internal (); + (*rl_deprep_term_function) (); + +#if defined (HANDLE_SIGNALS) + rl_clear_signals (); +#endif + + return (value); +} + +#if defined (READLINE_CALLBACKS) +# define STATIC_CALLBACK +#else +# define STATIC_CALLBACK static +#endif + +STATIC_CALLBACK void +readline_internal_setup () +{ + char *nprompt; + + _rl_in_stream = rl_instream; + _rl_out_stream = rl_outstream; + + if (rl_startup_hook) + (*rl_startup_hook) (); + + /* If we're not echoing, we still want to at least print a prompt, because + rl_redisplay will not do it for us. If the calling application has a + custom redisplay function, though, let that function handle it. */ + if (readline_echoing_p == 0 && rl_redisplay_function == rl_redisplay) + { + if (rl_prompt && rl_already_prompted == 0) + { + nprompt = _rl_strip_prompt (rl_prompt); + fprintf (_rl_out_stream, "%s", nprompt); + fflush (_rl_out_stream); + free (nprompt); + } + } + else + { + if (rl_prompt && rl_already_prompted) + rl_on_new_line_with_prompt (); + else + rl_on_new_line (); + (*rl_redisplay_function) (); + } + +#if defined (VI_MODE) + if (rl_editing_mode == vi_mode) + rl_vi_insertion_mode (1, 'i'); +#endif /* VI_MODE */ + + if (rl_pre_input_hook) + (*rl_pre_input_hook) (); +} + +STATIC_CALLBACK char * +readline_internal_teardown (eof) + int eof; +{ + char *temp; + HIST_ENTRY *entry; + + /* Restore the original of this history line, iff the line that we + are editing was originally in the history, AND the line has changed. */ + entry = current_history (); + + if (entry && rl_undo_list) + { + temp = savestring (the_line); + rl_revert_line (1, 0); + entry = replace_history_entry (where_history (), the_line, (histdata_t)NULL); + _rl_free_history_entry (entry); + + strcpy (the_line, temp); + free (temp); + } + + /* At any rate, it is highly likely that this line has an undo list. Get + rid of it now. */ + if (rl_undo_list) + rl_free_undo_list (); + + /* Restore normal cursor, if available. */ + _rl_set_insert_mode (RL_IM_INSERT, 0); + + return (eof ? (char *)NULL : savestring (the_line)); +} + +STATIC_CALLBACK int +#if defined (READLINE_CALLBACKS) +readline_internal_char () +#else +readline_internal_charloop () +#endif +{ + static int lastc, eof_found; + int c, code, lk; + + lastc = -1; + eof_found = 0; + +#if !defined (READLINE_CALLBACKS) + while (rl_done == 0) + { +#endif + lk = _rl_last_command_was_kill; + + code = setjmp (readline_top_level); + + if (code) + (*rl_redisplay_function) (); + + if (rl_pending_input == 0) + { + /* Then initialize the argument and number of keys read. */ + _rl_init_argument (); + rl_key_sequence_length = 0; + } + + RL_SETSTATE(RL_STATE_READCMD); + c = rl_read_key (); + RL_UNSETSTATE(RL_STATE_READCMD); + + /* EOF typed to a non-blank line is a . */ + if (c == EOF && rl_end) + c = NEWLINE; + + /* The character _rl_eof_char typed to blank line, and not as the + previous character is interpreted as EOF. */ + if (((c == _rl_eof_char && lastc != c) || c == EOF) && !rl_end) + { +#if defined (READLINE_CALLBACKS) + RL_SETSTATE(RL_STATE_DONE); + return (rl_done = 1); +#else + eof_found = 1; + break; +#endif + } + + lastc = c; + _rl_dispatch ((unsigned char)c, _rl_keymap); + + /* If there was no change in _rl_last_command_was_kill, then no kill + has taken place. Note that if input is pending we are reading + a prefix command, so nothing has changed yet. */ + if (rl_pending_input == 0 && lk == _rl_last_command_was_kill) + _rl_last_command_was_kill = 0; + +#if defined (VI_MODE) + /* In vi mode, when you exit insert mode, the cursor moves back + over the previous character. We explicitly check for that here. */ + if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap) + rl_vi_check (); +#endif /* VI_MODE */ + + if (rl_num_chars_to_read && rl_end >= rl_num_chars_to_read) + { + (*rl_redisplay_function) (); + rl_newline (1, '\n'); + } + + if (rl_done == 0) + (*rl_redisplay_function) (); + + /* If the application writer has told us to erase the entire line if + the only character typed was something bound to rl_newline, do so. */ + if (rl_erase_empty_line && rl_done && rl_last_func == rl_newline && + rl_point == 0 && rl_end == 0) + _rl_erase_entire_line (); + +#if defined (READLINE_CALLBACKS) + return 0; +#else + } + + return (eof_found); +#endif +} + +#if defined (READLINE_CALLBACKS) +static int +readline_internal_charloop () +{ + int eof = 1; + + while (rl_done == 0) + eof = readline_internal_char (); + return (eof); +} +#endif /* READLINE_CALLBACKS */ + +/* Read a line of input from the global rl_instream, doing output on + the global rl_outstream. + If rl_prompt is non-null, then that is our prompt. */ +static char * +readline_internal () +{ + int eof; + + readline_internal_setup (); + eof = readline_internal_charloop (); + return (readline_internal_teardown (eof)); +} + +void +_rl_init_line_state () +{ + rl_point = rl_end = rl_mark = 0; + the_line = rl_line_buffer; + the_line[0] = 0; +} + +void +_rl_set_the_line () +{ + the_line = rl_line_buffer; +} + +/* Do the command associated with KEY in MAP. + If the associated command is really a keymap, then read + another key, and dispatch into that map. */ +int +_rl_dispatch (key, map) + register int key; + Keymap map; +{ + return _rl_dispatch_subseq (key, map, 0); +} + +int +_rl_dispatch_subseq (key, map, got_subseq) + register int key; + Keymap map; + int got_subseq; +{ + int r, newkey; + char *macro; + rl_command_func_t *func; + + if (META_CHAR (key) && _rl_convert_meta_chars_to_ascii) + { + if (map[ESC].type == ISKMAP) + { + if (RL_ISSTATE (RL_STATE_MACRODEF)) + _rl_add_macro_char (ESC); + map = FUNCTION_TO_KEYMAP (map, ESC); + key = UNMETA (key); + rl_key_sequence_length += 2; + return (_rl_dispatch (key, map)); + } + else + rl_ding (); + return 0; + } + + if (RL_ISSTATE (RL_STATE_MACRODEF)) + _rl_add_macro_char (key); + + r = 0; + switch (map[key].type) + { + case ISFUNC: + func = map[key].function; + if (func) + { + /* Special case rl_do_lowercase_version (). */ + if (func == rl_do_lowercase_version) + return (_rl_dispatch (_rl_to_lower (key), map)); + + rl_executing_keymap = map; + +#if 0 + _rl_suppress_redisplay = (map[key].function == rl_insert) && _rl_input_available (); +#endif + + rl_dispatching = 1; + RL_SETSTATE(RL_STATE_DISPATCHING); + r = (*map[key].function)(rl_numeric_arg * rl_arg_sign, key); + RL_UNSETSTATE(RL_STATE_DISPATCHING); + rl_dispatching = 0; + + /* If we have input pending, then the last command was a prefix + command. Don't change the state of rl_last_func. Otherwise, + remember the last command executed in this variable. */ + if (rl_pending_input == 0 && map[key].function != rl_digit_argument) + rl_last_func = map[key].function; + } + else if (map[ANYOTHERKEY].function) + { + /* OK, there's no function bound in this map, but there is a + shadow function that was overridden when the current keymap + was created. Return -2 to note that. */ + _rl_unget_char (key); + return -2; + } + else if (got_subseq) + { + /* Return -1 to note that we're in a subsequence, but we don't + have a matching key, nor was one overridden. This means + we need to back up the recursion chain and find the last + subsequence that is bound to a function. */ + _rl_unget_char (key); + return -1; + } + else + { + _rl_abort_internal (); + return -1; + } + break; + + case ISKMAP: + if (map[key].function != 0) + { +#if defined (VI_MODE) + /* The only way this test will be true is if a subsequence has been + bound starting with ESC, generally the arrow keys. What we do is + check whether there's input in the queue, which there generally + will be if an arrow key has been pressed, and, if there's not, + just dispatch to (what we assume is) rl_vi_movement_mode right + away. This is essentially an input test with a zero timeout. */ + if (rl_editing_mode == vi_mode && key == ESC && map == vi_insertion_keymap + && _rl_input_queued (0) == 0) + return (_rl_dispatch (ANYOTHERKEY, FUNCTION_TO_KEYMAP (map, key))); +#endif + + rl_key_sequence_length++; + + if (key == ESC) + RL_SETSTATE(RL_STATE_METANEXT); + RL_SETSTATE(RL_STATE_MOREINPUT); + newkey = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + if (key == ESC) + RL_UNSETSTATE(RL_STATE_METANEXT); + + if (newkey < 0) + { + _rl_abort_internal (); + return -1; + } + + r = _rl_dispatch_subseq (newkey, FUNCTION_TO_KEYMAP (map, key), got_subseq || map[ANYOTHERKEY].function); + + if (r == -2) + /* We didn't match anything, and the keymap we're indexed into + shadowed a function previously bound to that prefix. Call + the function. The recursive call to _rl_dispatch_subseq has + already taken care of pushing any necessary input back onto + the input queue with _rl_unget_char. */ + { +#if 0 + r = _rl_dispatch (ANYOTHERKEY, FUNCTION_TO_KEYMAP (map, key)); +#else + /* XXX - experimental code -- might never be executed. Save + for later. */ + Keymap m = FUNCTION_TO_KEYMAP (map, key); + int type = m[ANYOTHERKEY].type; + func = m[ANYOTHERKEY].function; + if (type == ISFUNC && func == rl_do_lowercase_version) + r = _rl_dispatch (_rl_to_lower (key), map); + else + r = _rl_dispatch (ANYOTHERKEY, m); +#endif + } + else if (r && map[ANYOTHERKEY].function) + { + /* We didn't match (r is probably -1), so return something to + tell the caller that it should try ANYOTHERKEY for an + overridden function. */ + _rl_unget_char (key); + return -2; + } + else if (r && got_subseq) + { + /* OK, back up the chain. */ + _rl_unget_char (key); + return -1; + } + } + else + { + _rl_abort_internal (); + return -1; + } + break; + + case ISMACR: + if (map[key].function != 0) + { + macro = savestring ((char *)map[key].function); + _rl_with_macro_input (macro); + return 0; + } + break; + } +#if defined (VI_MODE) + if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap && + key != ANYOTHERKEY && + _rl_vi_textmod_command (key)) + _rl_vi_set_last (key, rl_numeric_arg, rl_arg_sign); +#endif + return (r); +} + +/* **************************************************************** */ +/* */ +/* Initializations */ +/* */ +/* **************************************************************** */ + +/* Initialize readline (and terminal if not already). */ +int +rl_initialize () +{ + /* If we have never been called before, initialize the + terminal and data structures. */ + if (!rl_initialized) + { + RL_SETSTATE(RL_STATE_INITIALIZING); + readline_initialize_everything (); + RL_UNSETSTATE(RL_STATE_INITIALIZING); + rl_initialized++; + RL_SETSTATE(RL_STATE_INITIALIZED); + } + + /* Initalize the current line information. */ + _rl_init_line_state (); + + /* We aren't done yet. We haven't even gotten started yet! */ + rl_done = 0; + RL_UNSETSTATE(RL_STATE_DONE); + + /* Tell the history routines what is going on. */ + _rl_start_using_history (); + + /* Make the display buffer match the state of the line. */ + rl_reset_line_state (); + + /* No such function typed yet. */ + rl_last_func = (rl_command_func_t *)NULL; + + /* Parsing of key-bindings begins in an enabled state. */ + _rl_parsing_conditionalized_out = 0; + +#if defined (VI_MODE) + if (rl_editing_mode == vi_mode) + _rl_vi_initialize_line (); +#endif + + /* Each line starts in insert mode (the default). */ + _rl_set_insert_mode (RL_IM_DEFAULT, 1); + + return 0; +} + +#if 0 +#if defined (__EMX__) +static void +_emx_build_environ () +{ + TIB *tibp; + PIB *pibp; + char *t, **tp; + int c; + + DosGetInfoBlocks (&tibp, &pibp); + t = pibp->pib_pchenv; + for (c = 1; *t; c++) + t += strlen (t) + 1; + tp = environ = (char **)xmalloc ((c + 1) * sizeof (char *)); + t = pibp->pib_pchenv; + while (*t) + { + *tp++ = t; + t += strlen (t) + 1; + } + *tp = 0; +} +#endif /* __EMX__ */ +#endif + +/* Initialize the entire state of the world. */ +static void +readline_initialize_everything () +{ +#if 0 +#if defined (__EMX__) + if (environ == 0) + _emx_build_environ (); +#endif +#endif + +#if 0 + /* Find out if we are running in Emacs -- UNUSED. */ + running_in_emacs = sh_get_env_value ("EMACS") != (char *)0; +#endif + + /* Set up input and output if they are not already set up. */ + if (!rl_instream) + rl_instream = stdin; + + if (!rl_outstream) + rl_outstream = stdout; + + /* Bind _rl_in_stream and _rl_out_stream immediately. These values + may change, but they may also be used before readline_internal () + is called. */ + _rl_in_stream = rl_instream; + _rl_out_stream = rl_outstream; + + /* Allocate data structures. */ + if (rl_line_buffer == 0) + rl_line_buffer = (char *)xmalloc (rl_line_buffer_len = DEFAULT_BUFFER_SIZE); + + /* Initialize the terminal interface. */ + if (rl_terminal_name == 0) + rl_terminal_name = sh_get_env_value ("TERM"); + _rl_init_terminal_io (rl_terminal_name); + + /* Bind tty characters to readline functions. */ + readline_default_bindings (); + + /* Initialize the function names. */ + rl_initialize_funmap (); + + /* Decide whether we should automatically go into eight-bit mode. */ + _rl_init_eightbit (); + + /* Read in the init file. */ + rl_read_init_file ((char *)NULL); + + /* XXX */ + if (_rl_horizontal_scroll_mode && _rl_term_autowrap) + { + _rl_screenwidth--; + _rl_screenchars -= _rl_screenheight; + } + + /* Override the effect of any `set keymap' assignments in the + inputrc file. */ + rl_set_keymap_from_edit_mode (); + + /* Try to bind a common arrow key prefix, if not already bound. */ + bind_arrow_keys (); + + /* Enable the meta key, if this terminal has one. */ + if (_rl_enable_meta) + _rl_enable_meta_key (); + + /* If the completion parser's default word break characters haven't + been set yet, then do so now. */ + if (rl_completer_word_break_characters == (char *)NULL) + rl_completer_word_break_characters = (char *)rl_basic_word_break_characters; +} + +/* If this system allows us to look at the values of the regular + input editing characters, then bind them to their readline + equivalents, iff the characters are not bound to keymaps. */ +static void +readline_default_bindings () +{ + rl_tty_set_default_bindings (_rl_keymap); +} + +/* Reset the default bindings for the terminal special characters we're + interested in back to rl_insert and read the new ones. */ +static void +reset_default_bindings () +{ + rl_tty_unset_default_bindings (_rl_keymap); + rl_tty_set_default_bindings (_rl_keymap); +} + +/* Bind some common arrow key sequences in MAP. */ +static void +bind_arrow_keys_internal (map) + Keymap map; +{ + Keymap xkeymap; + + xkeymap = _rl_keymap; + _rl_keymap = map; + +#if defined (__MSDOS__) + rl_bind_keyseq_if_unbound ("\033[0A", rl_get_previous_history); + rl_bind_keyseq_if_unbound ("\033[0B", rl_backward_char); + rl_bind_keyseq_if_unbound ("\033[0C", rl_forward_char); + rl_bind_keyseq_if_unbound ("\033[0D", rl_get_next_history); +#endif + + rl_bind_keyseq_if_unbound ("\033[A", rl_get_previous_history); + rl_bind_keyseq_if_unbound ("\033[B", rl_get_next_history); + rl_bind_keyseq_if_unbound ("\033[C", rl_forward_char); + rl_bind_keyseq_if_unbound ("\033[D", rl_backward_char); + rl_bind_keyseq_if_unbound ("\033[H", rl_beg_of_line); + rl_bind_keyseq_if_unbound ("\033[F", rl_end_of_line); + + rl_bind_keyseq_if_unbound ("\033OA", rl_get_previous_history); + rl_bind_keyseq_if_unbound ("\033OB", rl_get_next_history); + rl_bind_keyseq_if_unbound ("\033OC", rl_forward_char); + rl_bind_keyseq_if_unbound ("\033OD", rl_backward_char); + rl_bind_keyseq_if_unbound ("\033OH", rl_beg_of_line); + rl_bind_keyseq_if_unbound ("\033OF", rl_end_of_line); + + _rl_keymap = xkeymap; +} + +/* Try and bind the common arrow key prefixes after giving termcap and + the inputrc file a chance to bind them and create `real' keymaps + for the arrow key prefix. */ +static void +bind_arrow_keys () +{ + bind_arrow_keys_internal (emacs_standard_keymap); + +#if defined (VI_MODE) + bind_arrow_keys_internal (vi_movement_keymap); + bind_arrow_keys_internal (vi_insertion_keymap); +#endif +} + +/* **************************************************************** */ +/* */ +/* Saving and Restoring Readline's state */ +/* */ +/* **************************************************************** */ + +int +rl_save_state (sp) + struct readline_state *sp; +{ + if (sp == 0) + return -1; + + sp->point = rl_point; + sp->end = rl_end; + sp->mark = rl_mark; + sp->buffer = rl_line_buffer; + sp->buflen = rl_line_buffer_len; + sp->ul = rl_undo_list; + sp->prompt = rl_prompt; + + sp->rlstate = rl_readline_state; + sp->done = rl_done; + sp->kmap = _rl_keymap; + + sp->lastfunc = rl_last_func; + sp->insmode = rl_insert_mode; + sp->edmode = rl_editing_mode; + sp->kseqlen = rl_key_sequence_length; + sp->inf = rl_instream; + sp->outf = rl_outstream; + sp->pendingin = rl_pending_input; + sp->macro = rl_executing_macro; + + sp->catchsigs = rl_catch_signals; +#ifdef SIGWINCH + sp->catchsigwinch = rl_catch_sigwinch; +#endif /* SIGWINCH */ + return (0); +} + +int +rl_restore_state (sp) + struct readline_state *sp; +{ + if (sp == 0) + return -1; + + rl_point = sp->point; + rl_end = sp->end; + rl_mark = sp->mark; + the_line = rl_line_buffer = sp->buffer; + rl_line_buffer_len = sp->buflen; + rl_undo_list = sp->ul; + rl_prompt = sp->prompt; + + rl_readline_state = sp->rlstate; + rl_done = sp->done; + _rl_keymap = sp->kmap; + + rl_last_func = sp->lastfunc; + rl_insert_mode = sp->insmode; + rl_editing_mode = sp->edmode; + rl_key_sequence_length = sp->kseqlen; + rl_instream = sp->inf; + rl_outstream = sp->outf; + rl_pending_input = sp->pendingin; + rl_executing_macro = sp->macro; + + rl_catch_signals = sp->catchsigs; +#ifdef SIGWINCH + rl_catch_sigwinch = sp->catchsigwinch; +#endif /* SIGWINCH */ + + return (0); +} diff --git a/vendors/readline/src/readline/readline.h b/vendors/readline/src/readline/readline.h new file mode 100644 index 0000000..352a5bc --- /dev/null +++ b/vendors/readline/src/readline/readline.h @@ -0,0 +1,865 @@ +/* Readline.h -- the names of functions callable from within readline. */ + +/* Copyright (C) 1987-2004 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library, a library for + reading lines of text with interactive input and history editing. + + The GNU Readline Library is free software; you can redistribute it + and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2, or + (at your option) any later version. + + The GNU Readline 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 General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + +#if !defined (_READLINE_H_) +#define _READLINE_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef __GNUC__ +# define __DLL_IMPORT__ __declspec(dllimport) +# define __DLL_EXPORT__ __declspec(dllexport) +#else +# define __DLL_IMPORT__ __attribute__((dllimport)) extern +# define __DLL_EXPORT__ __attribute__((dllexport)) extern +#endif + +#if (defined __WIN32__) || (defined _WIN32) +# ifdef BUILD_READLINE_DLL +# define READLINE_DLL_IMPEXP __DLL_EXPORT__ +# elif defined(READLINE_STATIC) +# define READLINE_DLL_IMPEXP +# elif defined (USE_READLINE_DLL) +# define READLINE_DLL_IMPEXP __DLL_IMPORT__ +# elif defined (USE_READLINE_STATIC) +# define READLINE_DLL_IMPEXP +# else /* assume USE_READLINE_DLL */ +# define READLINE_DLL_IMPEXP __DLL_IMPORT__ +# endif +#else /* __WIN32__ */ +# define READLINE_DLL_IMPEXP +#endif + +#define READLINE_LIBRARY + +#if defined (READLINE_LIBRARY) +# include "rlstdc.h" +# include "rltypedefs.h" +# include "keymaps.h" +# include "tilde.h" +#else +# include +# include +# include +# include +#endif + +/* Hex-encoded Readline version number. */ +#define RL_READLINE_VERSION 0x0500 /* Readline 5.0 */ +#define RL_VERSION_MAJOR 5 +#define RL_VERSION_MINOR 0 + +/* Readline data structures. */ + +/* Maintaining the state of undo. We remember individual deletes and inserts + on a chain of things to do. */ + +/* The actions that undo knows how to undo. Notice that UNDO_DELETE means + to insert some text, and UNDO_INSERT means to delete some text. I.e., + the code tells undo what to undo, not how to undo it. */ +enum undo_code { UNDO_DELETE, UNDO_INSERT, UNDO_BEGIN, UNDO_END }; + +/* What an element of THE_UNDO_LIST looks like. */ +typedef struct undo_list { + struct undo_list *next; + int start, end; /* Where the change took place. */ + char *text; /* The text to insert, if undoing a delete. */ + enum undo_code what; /* Delete, Insert, Begin, End. */ +} UNDO_LIST; + +/* The current undo list for RL_LINE_BUFFER. */ +READLINE_DLL_IMPEXP UNDO_LIST *rl_undo_list; + +/* The data structure for mapping textual names to code addresses. */ +typedef struct _funmap { + const char *name; + rl_command_func_t *function; +} FUNMAP; + +READLINE_DLL_IMPEXP FUNMAP **funmap; + +/* **************************************************************** */ +/* */ +/* Functions available to bind to key sequences */ +/* */ +/* **************************************************************** */ + +/* Bindable commands for numeric arguments. */ +READLINE_DLL_IMPEXP int rl_digit_argument PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_universal_argument PARAMS((int, int)); + +/* Bindable commands for moving the cursor. */ +READLINE_DLL_IMPEXP int rl_forward_byte PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_forward_char PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_forward PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_backward_byte PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_backward_char PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_backward PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_beg_of_line PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_end_of_line PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_forward_word PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_backward_word PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_refresh_line PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_clear_screen PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_arrow_keys PARAMS((int, int)); + +/* Bindable commands for inserting and deleting text. */ +READLINE_DLL_IMPEXP int rl_insert PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_quoted_insert PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_tab_insert PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_newline PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_do_lowercase_version PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_rubout PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_delete PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_rubout_or_delete PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_delete_horizontal_space PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_delete_or_show_completions PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_insert_comment PARAMS((int, int)); + +/* Bindable commands for changing case. */ +READLINE_DLL_IMPEXP int rl_upcase_word PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_downcase_word PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_capitalize_word PARAMS((int, int)); + +/* Bindable commands for transposing characters and words. */ +READLINE_DLL_IMPEXP int rl_transpose_words PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_transpose_chars PARAMS((int, int)); + +/* Bindable commands for searching within a line. */ +READLINE_DLL_IMPEXP int rl_char_search PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_backward_char_search PARAMS((int, int)); + +/* Bindable commands for readline's interface to the command history. */ +READLINE_DLL_IMPEXP int rl_beginning_of_history PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_end_of_history PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_get_next_history PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_get_previous_history PARAMS((int, int)); + +/* Bindable commands for managing the mark and region. */ +READLINE_DLL_IMPEXP int rl_set_mark PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_exchange_point_and_mark PARAMS((int, int)); + +/* Bindable commands to set the editing mode (emacs or vi). */ +READLINE_DLL_IMPEXP int rl_vi_editing_mode PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_emacs_editing_mode PARAMS((int, int)); + +/* Bindable commands to change the insert mode (insert or overwrite) */ +READLINE_DLL_IMPEXP int rl_overwrite_mode PARAMS((int, int)); + +/* Bindable commands for managing key bindings. */ +READLINE_DLL_IMPEXP int rl_re_read_init_file PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_dump_functions PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_dump_macros PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_dump_variables PARAMS((int, int)); + +/* Bindable commands for word completion. */ +READLINE_DLL_IMPEXP int rl_complete PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_possible_completions PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_insert_completions PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_menu_complete PARAMS((int, int)); + +/* Bindable commands for killing and yanking text, and managing the kill ring. */ +READLINE_DLL_IMPEXP int rl_kill_word PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_backward_kill_word PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_kill_line PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_backward_kill_line PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_kill_full_line PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_unix_word_rubout PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_unix_filename_rubout PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_unix_line_discard PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_copy_region_to_kill PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_kill_region PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_copy_forward_word PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_copy_backward_word PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_yank PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_yank_pop PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_yank_nth_arg PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_yank_last_arg PARAMS((int, int)); +/* Not available unless __CYGWIN__ or _WIN32 is defined. */ +#if defined (__CYGWIN__) || defined (_WIN32) +READLINE_DLL_IMPEXP int rl_paste_from_clipboard PARAMS((int, int)); +#endif + +/* Bindable commands for incremental searching. */ +READLINE_DLL_IMPEXP int rl_reverse_search_history PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_forward_search_history PARAMS((int, int)); + +/* Bindable keyboard macro commands. */ +READLINE_DLL_IMPEXP int rl_start_kbd_macro PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_end_kbd_macro PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_call_last_kbd_macro PARAMS((int, int)); + +/* Bindable undo commands. */ +READLINE_DLL_IMPEXP int rl_revert_line PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_undo_command PARAMS((int, int)); + +/* Bindable tilde expansion commands. */ +READLINE_DLL_IMPEXP int rl_tilde_expand PARAMS((int, int)); + +/* Bindable terminal control commands. */ +READLINE_DLL_IMPEXP int rl_restart_output PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_stop_output PARAMS((int, int)); + +/* Miscellaneous bindable commands. */ +READLINE_DLL_IMPEXP int rl_abort PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_tty_status PARAMS((int, int)); + +/* Bindable commands for incremental and non-incremental history searching. */ +READLINE_DLL_IMPEXP int rl_history_search_forward PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_history_search_backward PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_noninc_forward_search PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_noninc_reverse_search PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_noninc_forward_search_again PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_noninc_reverse_search_again PARAMS((int, int)); + +/* Bindable command used when inserting a matching close character. */ +READLINE_DLL_IMPEXP int rl_insert_close PARAMS((int, int)); + +/* Not available unless READLINE_CALLBACKS is defined. */ +READLINE_DLL_IMPEXP void rl_callback_handler_install PARAMS((const char *, rl_vcpfunc_t *)); +READLINE_DLL_IMPEXP void rl_callback_read_char PARAMS((void)); +READLINE_DLL_IMPEXP void rl_callback_handler_remove PARAMS((void)); + +/* Things for vi mode. Not available unless readline is compiled -DVI_MODE. */ +/* VI-mode bindable commands. */ +READLINE_DLL_IMPEXP int rl_vi_redo PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_undo PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_yank_arg PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_fetch_history PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_search_again PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_search PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_complete PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_tilde_expand PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_prev_word PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_next_word PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_end_word PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_insert_beg PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_append_mode PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_append_eol PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_eof_maybe PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_insertion_mode PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_movement_mode PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_arg_digit PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_change_case PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_put PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_column PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_delete_to PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_change_to PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_yank_to PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_delete PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_back_to_indent PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_first_print PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_char_search PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_match PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_change_char PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_subst PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_overstrike PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_overstrike_delete PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_replace PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_set_mark PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_goto_mark PARAMS((int, int)); + +/* VI-mode utility functions. */ +READLINE_DLL_IMPEXP int rl_vi_check PARAMS((void)); +READLINE_DLL_IMPEXP int rl_vi_domove PARAMS((int, int *)); +READLINE_DLL_IMPEXP int rl_vi_bracktype PARAMS((int)); + +READLINE_DLL_IMPEXP void rl_vi_start_inserting PARAMS((int, int, int)); + +/* VI-mode pseudo-bindable commands, used as utility functions. */ +READLINE_DLL_IMPEXP int rl_vi_fWord PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_bWord PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_eWord PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_fword PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_bword PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_vi_eword PARAMS((int, int)); + +/* **************************************************************** */ +/* */ +/* Well Published Functions */ +/* */ +/* **************************************************************** */ + +/* Readline functions. */ +/* Read a line of input. Prompt with PROMPT. A NULL PROMPT means none. */ +READLINE_DLL_IMPEXP char *readline PARAMS((const char *)); + +READLINE_DLL_IMPEXP int rl_set_prompt PARAMS((const char *)); +READLINE_DLL_IMPEXP int rl_expand_prompt PARAMS((char *)); + +READLINE_DLL_IMPEXP int rl_initialize PARAMS((void)); + +/* Undocumented; unused by readline */ +READLINE_DLL_IMPEXP int rl_discard_argument PARAMS((void)); + +/* Utility functions to bind keys to readline commands. */ +READLINE_DLL_IMPEXP int rl_add_defun PARAMS((const char *, rl_command_func_t *, int)); +READLINE_DLL_IMPEXP int rl_bind_key PARAMS((int, rl_command_func_t *)); +READLINE_DLL_IMPEXP int rl_bind_key_in_map PARAMS((int, rl_command_func_t *, Keymap)); +READLINE_DLL_IMPEXP int rl_unbind_key PARAMS((int)); +READLINE_DLL_IMPEXP int rl_unbind_key_in_map PARAMS((int, Keymap)); +READLINE_DLL_IMPEXP int rl_bind_key_if_unbound PARAMS((int, rl_command_func_t *)); +READLINE_DLL_IMPEXP int rl_bind_key_if_unbound_in_map PARAMS((int, rl_command_func_t *, Keymap)); +READLINE_DLL_IMPEXP int rl_unbind_function_in_map PARAMS((rl_command_func_t *, Keymap)); +READLINE_DLL_IMPEXP int rl_unbind_command_in_map PARAMS((const char *, Keymap)); +READLINE_DLL_IMPEXP int rl_bind_keyseq PARAMS((const char *, rl_command_func_t *)); +READLINE_DLL_IMPEXP int rl_bind_keyseq_in_map PARAMS((const char *, rl_command_func_t *, Keymap)); +READLINE_DLL_IMPEXP int rl_bind_keyseq_if_unbound PARAMS((const char *, rl_command_func_t *)); +READLINE_DLL_IMPEXP int rl_bind_keyseq_if_unbound_in_map PARAMS((const char *, rl_command_func_t *, Keymap)); +READLINE_DLL_IMPEXP int rl_generic_bind PARAMS((int, const char *, char *, Keymap)); +READLINE_DLL_IMPEXP int rl_variable_bind PARAMS((const char *, const char *)); + +/* Backwards compatibility, use rl_bind_keyseq_in_map instead. */ +READLINE_DLL_IMPEXP int rl_set_key PARAMS((const char *, rl_command_func_t *, Keymap)); + +/* Backwards compatibility, use rl_generic_bind instead. */ +READLINE_DLL_IMPEXP int rl_macro_bind PARAMS((const char *, const char *, Keymap)); + +/* Undocumented in the texinfo manual; not really useful to programs. */ +READLINE_DLL_IMPEXP int rl_translate_keyseq PARAMS((const char *, char *, int *)); +READLINE_DLL_IMPEXP char *rl_untranslate_keyseq PARAMS((int)); + +READLINE_DLL_IMPEXP rl_command_func_t *rl_named_function PARAMS((const char *)); +READLINE_DLL_IMPEXP rl_command_func_t *rl_function_of_keyseq PARAMS((const char *, Keymap, int *)); + +READLINE_DLL_IMPEXP void rl_list_funmap_names PARAMS((void)); +READLINE_DLL_IMPEXP char **rl_invoking_keyseqs_in_map PARAMS((rl_command_func_t *, Keymap)); +READLINE_DLL_IMPEXP char **rl_invoking_keyseqs PARAMS((rl_command_func_t *)); + +READLINE_DLL_IMPEXP void rl_function_dumper PARAMS((int)); +READLINE_DLL_IMPEXP void rl_macro_dumper PARAMS((int)); +READLINE_DLL_IMPEXP void rl_variable_dumper PARAMS((int)); + +READLINE_DLL_IMPEXP int rl_read_init_file PARAMS((const char *)); +READLINE_DLL_IMPEXP int rl_parse_and_bind PARAMS((char *)); + +//***********************CHANGED commented below**************************** +//These decleartions already exsist in keymaps.h as extern. +/* Functions for manipulating keymaps. */ +//READLINE_DLL_IMPEXP Keymap rl_make_bare_keymap PARAMS((void)); +//READLINE_DLL_IMPEXP Keymap rl_copy_keymap PARAMS((Keymap)); +//READLINE_DLL_IMPEXP Keymap rl_make_keymap PARAMS((void)); +//READLINE_DLL_IMPEXP void rl_discard_keymap PARAMS((Keymap)); +// +//READLINE_DLL_IMPEXP Keymap rl_get_keymap_by_name PARAMS((const char *)); +//READLINE_DLL_IMPEXP char *rl_get_keymap_name PARAMS((Keymap)); +//READLINE_DLL_IMPEXP void rl_set_keymap PARAMS((Keymap)); +//READLINE_DLL_IMPEXP Keymap rl_get_keymap PARAMS((void)); + +///* Undocumented; used internally only. */ +READLINE_DLL_IMPEXP void rl_set_keymap_from_edit_mode PARAMS((void)); +READLINE_DLL_IMPEXP char *rl_get_keymap_name_from_edit_mode PARAMS((void)); + +/* Functions for manipulating the funmap, which maps command names to functions. */ +READLINE_DLL_IMPEXP int rl_add_funmap_entry PARAMS((const char *, rl_command_func_t *)); +READLINE_DLL_IMPEXP const char **rl_funmap_names PARAMS((void)); +/* Undocumented, only used internally -- there is only one funmap, and this + function may be called only once. */ +READLINE_DLL_IMPEXP void rl_initialize_funmap PARAMS((void)); + +/* Utility functions for managing keyboard macros. */ +READLINE_DLL_IMPEXP void rl_push_macro_input PARAMS((char *)); + +/* Functions for undoing, from undo.c */ +READLINE_DLL_IMPEXP void rl_add_undo PARAMS((enum undo_code, int, int, char *)); +READLINE_DLL_IMPEXP void rl_free_undo_list PARAMS((void)); +READLINE_DLL_IMPEXP int rl_do_undo PARAMS((void)); +READLINE_DLL_IMPEXP int rl_begin_undo_group PARAMS((void)); +READLINE_DLL_IMPEXP int rl_end_undo_group PARAMS((void)); +READLINE_DLL_IMPEXP int rl_modifying PARAMS((int, int)); + +/* Functions for redisplay. */ +READLINE_DLL_IMPEXP void rl_redisplay PARAMS((void)); +READLINE_DLL_IMPEXP int rl_on_new_line PARAMS((void)); +READLINE_DLL_IMPEXP int rl_on_new_line_with_prompt PARAMS((void)); +READLINE_DLL_IMPEXP int rl_forced_update_display PARAMS((void)); +READLINE_DLL_IMPEXP int rl_clear_message PARAMS((void)); +READLINE_DLL_IMPEXP int rl_reset_line_state PARAMS((void)); +READLINE_DLL_IMPEXP int rl_crlf PARAMS((void)); + +#if defined (USE_VARARGS) && defined (PREFER_STDARG) +READLINE_DLL_IMPEXP int rl_message (const char *, ...) __attribute__((__format__ (printf, 1, 2))); +#else +READLINE_DLL_IMPEXP int rl_message (); +#endif + +READLINE_DLL_IMPEXP int rl_show_char PARAMS((int)); + +/* Undocumented in texinfo manual. */ +READLINE_DLL_IMPEXP int rl_character_len PARAMS((int, int)); + +/* Save and restore internal prompt redisplay information. */ +READLINE_DLL_IMPEXP void rl_save_prompt PARAMS((void)); +READLINE_DLL_IMPEXP void rl_restore_prompt PARAMS((void)); + +/* Modifying text. */ +READLINE_DLL_IMPEXP void rl_replace_line PARAMS((const char *, int)); +READLINE_DLL_IMPEXP int rl_insert_text PARAMS((const char *)); +READLINE_DLL_IMPEXP int rl_delete_text PARAMS((int, int)); +READLINE_DLL_IMPEXP int rl_kill_text PARAMS((int, int)); +READLINE_DLL_IMPEXP char *rl_copy_text PARAMS((int, int)); + +/* Terminal and tty mode management. */ +READLINE_DLL_IMPEXP void rl_prep_terminal PARAMS((int)); +READLINE_DLL_IMPEXP void rl_deprep_terminal PARAMS((void)); +READLINE_DLL_IMPEXP void rl_tty_set_default_bindings PARAMS((Keymap)); +READLINE_DLL_IMPEXP void rl_tty_unset_default_bindings PARAMS((Keymap)); + +READLINE_DLL_IMPEXP int rl_reset_terminal PARAMS((const char *)); +READLINE_DLL_IMPEXP void rl_resize_terminal PARAMS((void)); +READLINE_DLL_IMPEXP void rl_set_screen_size PARAMS((int, int)); +READLINE_DLL_IMPEXP void rl_get_screen_size PARAMS((int *, int *)); + +READLINE_DLL_IMPEXP char *rl_get_termcap PARAMS((const char *)); + +/* Functions for character input. */ +READLINE_DLL_IMPEXP int rl_stuff_char PARAMS((int)); +READLINE_DLL_IMPEXP int rl_execute_next PARAMS((int)); +READLINE_DLL_IMPEXP int rl_clear_pending_input PARAMS((void)); +READLINE_DLL_IMPEXP int rl_read_key PARAMS((void)); +READLINE_DLL_IMPEXP int rl_getc PARAMS((FILE *)); +READLINE_DLL_IMPEXP int rl_set_keyboard_input_timeout PARAMS((int)); + +/* `Public' utility functions . */ +READLINE_DLL_IMPEXP void rl_extend_line_buffer PARAMS((int)); +READLINE_DLL_IMPEXP int rl_ding PARAMS((void)); +READLINE_DLL_IMPEXP int rl_alphabetic PARAMS((int)); + +/* Readline signal handling, from signals.c */ +READLINE_DLL_IMPEXP int rl_set_signals PARAMS((void)); +READLINE_DLL_IMPEXP int rl_clear_signals PARAMS((void)); +READLINE_DLL_IMPEXP void rl_cleanup_after_signal PARAMS((void)); +READLINE_DLL_IMPEXP void rl_reset_after_signal PARAMS((void)); +READLINE_DLL_IMPEXP void rl_free_line_state PARAMS((void)); + +READLINE_DLL_IMPEXP int rl_set_paren_blink_timeout PARAMS((int)); + +/* Undocumented. */ +READLINE_DLL_IMPEXP int rl_maybe_save_line PARAMS((void)); +READLINE_DLL_IMPEXP int rl_maybe_unsave_line PARAMS((void)); +READLINE_DLL_IMPEXP int rl_maybe_replace_line PARAMS((void)); + +/* Completion functions. */ +READLINE_DLL_IMPEXP int rl_complete_internal PARAMS((int)); +READLINE_DLL_IMPEXP void rl_display_match_list PARAMS((char **, int, int)); + +READLINE_DLL_IMPEXP char **rl_completion_matches PARAMS((const char *, rl_compentry_func_t *)); +READLINE_DLL_IMPEXP char *rl_username_completion_function PARAMS((const char *, int)); +READLINE_DLL_IMPEXP char *rl_filename_completion_function PARAMS((const char *, int)); + +READLINE_DLL_IMPEXP int rl_completion_mode PARAMS((rl_command_func_t *)); + +#if 0 +/* Backwards compatibility (compat.c). These will go away sometime. */ +READLINE_DLL_IMPEXP void free_undo_list PARAMS((void)); +READLINE_DLL_IMPEXP int maybe_save_line PARAMS((void)); +READLINE_DLL_IMPEXP int maybe_unsave_line PARAMS((void)); +READLINE_DLL_IMPEXP int maybe_replace_line PARAMS((void)); + +READLINE_DLL_IMPEXP int ding PARAMS((void)); +READLINE_DLL_IMPEXP int alphabetic PARAMS((int)); +READLINE_DLL_IMPEXP int crlf PARAMS((void)); + +READLINE_DLL_IMPEXP char **completion_matches PARAMS((char *, rl_compentry_func_t *)); +READLINE_DLL_IMPEXP char *username_completion_function PARAMS((const char *, int)); +READLINE_DLL_IMPEXP char *filename_completion_function PARAMS((const char *, int)); +#endif + +/* **************************************************************** */ +/* */ +/* Well Published Variables */ +/* */ +/* **************************************************************** */ + +/* The version of this incarnation of the readline library. */ +READLINE_DLL_IMPEXP const char *rl_library_version; /* e.g., "4.2" */ +READLINE_DLL_IMPEXP int rl_readline_version; /* e.g., 0x0402 */ + +/* True if this is real GNU readline. */ +READLINE_DLL_IMPEXP int rl_gnu_readline_p; + +/* Flags word encapsulating the current readline state. */ +READLINE_DLL_IMPEXP int rl_readline_state; + +/* Says which editing mode readline is currently using. 1 means emacs mode; + 0 means vi mode. */ +READLINE_DLL_IMPEXP int rl_editing_mode; + +/* Insert or overwrite mode for emacs mode. 1 means insert mode; 0 means + overwrite mode. Reset to insert mode on each input line. */ +READLINE_DLL_IMPEXP int rl_insert_mode; + +/* The name of the calling program. You should initialize this to + whatever was in argv[0]. It is used when parsing conditionals. */ +READLINE_DLL_IMPEXP const char *rl_readline_name; + +/* The prompt readline uses. This is set from the argument to + readline (), and should not be assigned to directly. */ +READLINE_DLL_IMPEXP char *rl_prompt; + +/* The line buffer that is in use. */ +READLINE_DLL_IMPEXP char *rl_line_buffer; + +/* The location of point, and end. */ +READLINE_DLL_IMPEXP int rl_point; +READLINE_DLL_IMPEXP int rl_end; + +/* The mark, or saved cursor position. */ +READLINE_DLL_IMPEXP int rl_mark; + +/* Flag to indicate that readline has finished with the current input + line and should return it. */ +READLINE_DLL_IMPEXP int rl_done; + +/* If set to a character value, that will be the next keystroke read. */ +READLINE_DLL_IMPEXP int rl_pending_input; + +/* Non-zero if we called this function from _rl_dispatch(). It's present + so functions can find out whether they were called from a key binding + or directly from an application. */ +READLINE_DLL_IMPEXP int rl_dispatching; + +/* Non-zero if the user typed a numeric argument before executing the + current function. */ +READLINE_DLL_IMPEXP int rl_explicit_arg; + +/* The current value of the numeric argument specified by the user. */ +READLINE_DLL_IMPEXP int rl_numeric_arg; + +/* The address of the last command function Readline executed. */ +READLINE_DLL_IMPEXP rl_command_func_t *rl_last_func; + +/* The name of the terminal to use. */ +READLINE_DLL_IMPEXP const char *rl_terminal_name; + +/* The input and output streams. */ +READLINE_DLL_IMPEXP FILE *rl_instream; +READLINE_DLL_IMPEXP FILE *rl_outstream; + +/* If non-zero, then this is the address of a function to call just + before readline_internal () prints the first prompt. */ +READLINE_DLL_IMPEXP rl_hook_func_t *rl_startup_hook; + +/* If non-zero, this is the address of a function to call just before + readline_internal_setup () returns and readline_internal starts + reading input characters. */ +READLINE_DLL_IMPEXP rl_hook_func_t *rl_pre_input_hook; + +/* The address of a function to call periodically while Readline is + awaiting character input, or NULL, for no event handling. */ +READLINE_DLL_IMPEXP rl_hook_func_t *rl_event_hook; + +/* The address of the function to call to fetch a character from the current + Readline input stream */ +READLINE_DLL_IMPEXP rl_getc_func_t *rl_getc_function; + +READLINE_DLL_IMPEXP rl_voidfunc_t *rl_redisplay_function; + +READLINE_DLL_IMPEXP rl_vintfunc_t *rl_prep_term_function; +READLINE_DLL_IMPEXP rl_voidfunc_t *rl_deprep_term_function; + +/* Dispatch variables. */ +READLINE_DLL_IMPEXP Keymap rl_executing_keymap; +READLINE_DLL_IMPEXP Keymap rl_binding_keymap; + +/* Display variables. */ +/* If non-zero, readline will erase the entire line, including any prompt, + if the only thing typed on an otherwise-blank line is something bound to + rl_newline. */ +READLINE_DLL_IMPEXP int rl_erase_empty_line; + +/* If non-zero, the application has already printed the prompt (rl_prompt) + before calling readline, so readline should not output it the first time + redisplay is done. */ +READLINE_DLL_IMPEXP int rl_already_prompted; + +/* A non-zero value means to read only this many characters rather than + up to a character bound to accept-line. */ +READLINE_DLL_IMPEXP int rl_num_chars_to_read; + +/* The text of a currently-executing keyboard macro. */ +READLINE_DLL_IMPEXP char *rl_executing_macro; + +/* Variables to control readline signal handling. */ +/* If non-zero, readline will install its own signal handlers for + SIGINT, SIGTERM, SIGQUIT, SIGALRM, SIGTSTP, SIGTTIN, and SIGTTOU. */ +READLINE_DLL_IMPEXP int rl_catch_signals; + +/* If non-zero, readline will install a signal handler for SIGWINCH + that also attempts to call any calling application's SIGWINCH signal + handler. Note that the terminal is not cleaned up before the + application's signal handler is called; use rl_cleanup_after_signal() + to do that. */ +READLINE_DLL_IMPEXP int rl_catch_sigwinch; + +/* Completion variables. */ +/* Pointer to the generator function for completion_matches (). + NULL means to use rl_filename_completion_function (), the default + filename completer. */ +READLINE_DLL_IMPEXP rl_compentry_func_t *rl_completion_entry_function; + +/* If rl_ignore_some_completions_function is non-NULL it is the address + of a function to call after all of the possible matches have been + generated, but before the actual completion is done to the input line. + The function is called with one argument; a NULL terminated array + of (char *). If your function removes any of the elements, they + must be free()'ed. */ +READLINE_DLL_IMPEXP rl_compignore_func_t *rl_ignore_some_completions_function; + +/* Pointer to alternative function to create matches. + Function is called with TEXT, START, and END. + START and END are indices in RL_LINE_BUFFER saying what the boundaries + of TEXT are. + If this function exists and returns NULL then call the value of + rl_completion_entry_function to try to match, otherwise use the + array of strings returned. */ +READLINE_DLL_IMPEXP rl_completion_func_t *rl_attempted_completion_function; + +/* The basic list of characters that signal a break between words for the + completer routine. The initial contents of this variable is what + breaks words in the shell, i.e. "n\"\\'`@$>". */ +READLINE_DLL_IMPEXP const char *rl_basic_word_break_characters; + +/* The list of characters that signal a break between words for + rl_complete_internal. The default list is the contents of + rl_basic_word_break_characters. */ +READLINE_DLL_IMPEXP /*const*/ char *rl_completer_word_break_characters; + +/* Hook function to allow an application to set the completion word + break characters before readline breaks up the line. Allows + position-dependent word break characters. */ +READLINE_DLL_IMPEXP rl_cpvfunc_t *rl_completion_word_break_hook; + +/* List of characters which can be used to quote a substring of the line. + Completion occurs on the entire substring, and within the substring + rl_completer_word_break_characters are treated as any other character, + unless they also appear within this list. */ +READLINE_DLL_IMPEXP const char *rl_completer_quote_characters; + +/* List of quote characters which cause a word break. */ +READLINE_DLL_IMPEXP const char *rl_basic_quote_characters; + +/* List of characters that need to be quoted in filenames by the completer. */ +READLINE_DLL_IMPEXP const char *rl_filename_quote_characters; + +/* List of characters that are word break characters, but should be left + in TEXT when it is passed to the completion function. The shell uses + this to help determine what kind of completing to do. */ +READLINE_DLL_IMPEXP const char *rl_special_prefixes; + +/* If non-zero, then this is the address of a function to call when + completing on a directory name. The function is called with + the address of a string (the current directory name) as an arg. It + changes what is displayed when the possible completions are printed + or inserted. */ +READLINE_DLL_IMPEXP rl_icppfunc_t *rl_directory_completion_hook; + +/* If non-zero, this is the address of a function to call when completing + a directory name. This function takes the address of the directory name + to be modified as an argument. Unlike rl_directory_completion_hook, it + only modifies the directory name used in opendir(2), not what is displayed + when the possible completions are printed or inserted. It is called + before rl_directory_completion_hook. I'm not happy with how this works + yet, so it's undocumented. */ +READLINE_DLL_IMPEXP rl_icppfunc_t *rl_directory_rewrite_hook; + +/* Backwards compatibility with previous versions of readline. */ +#define rl_symbolic_link_hook rl_directory_completion_hook + +/* If non-zero, then this is the address of a function to call when + completing a word would normally display the list of possible matches. + This function is called instead of actually doing the display. + It takes three arguments: (char **matches, int num_matches, int max_length) + where MATCHES is the array of strings that matched, NUM_MATCHES is the + number of strings in that array, and MAX_LENGTH is the length of the + longest string in that array. */ +READLINE_DLL_IMPEXP rl_compdisp_func_t *rl_completion_display_matches_hook; + +/* Non-zero means that the results of the matches are to be treated + as filenames. This is ALWAYS zero on entry, and can only be changed + within a completion entry finder function. */ +READLINE_DLL_IMPEXP int rl_filename_completion_desired; + +/* Non-zero means that the results of the matches are to be quoted using + double quotes (or an application-specific quoting mechanism) if the + filename contains any characters in rl_word_break_chars. This is + ALWAYS non-zero on entry, and can only be changed within a completion + entry finder function. */ +READLINE_DLL_IMPEXP int rl_filename_quoting_desired; + +/* Set to a function to quote a filename in an application-specific fashion. + Called with the text to quote, the type of match found (single or multiple) + and a pointer to the quoting character to be used, which the function can + reset if desired. */ +READLINE_DLL_IMPEXP rl_quote_func_t *rl_filename_quoting_function; + +/* Function to call to remove quoting characters from a filename. Called + before completion is attempted, so the embedded quotes do not interfere + with matching names in the file system. */ +READLINE_DLL_IMPEXP rl_dequote_func_t *rl_filename_dequoting_function; + +/* Function to call to decide whether or not a word break character is + quoted. If a character is quoted, it does not break words for the + completer. */ +READLINE_DLL_IMPEXP rl_linebuf_func_t *rl_char_is_quoted_p; + +/* Non-zero means to suppress normal filename completion after the + user-specified completion function has been called. */ +READLINE_DLL_IMPEXP int rl_attempted_completion_over; + +/* Set to a character describing the type of completion being attempted by + rl_complete_internal; available for use by application completion + functions. */ +READLINE_DLL_IMPEXP int rl_completion_type; + +/* Up to this many items will be displayed in response to a + possible-completions call. After that, we ask the user if she + is sure she wants to see them all. The default value is 100. */ +READLINE_DLL_IMPEXP int rl_completion_query_items; + +/* Character appended to completed words when at the end of the line. The + default is a space. Nothing is added if this is '\0'. */ +READLINE_DLL_IMPEXP int rl_completion_append_character; + +/* If set to non-zero by an application completion function, + rl_completion_append_character will not be appended. */ +READLINE_DLL_IMPEXP int rl_completion_suppress_append; + +/* Set to any quote character readline thinks it finds before any application + completion function is called. */ +READLINE_DLL_IMPEXP int rl_completion_quote_character; + +/* Set to a non-zero value if readline found quoting anywhere in the word to + be completed; set before any application completion function is called. */ +READLINE_DLL_IMPEXP int rl_completion_found_quote; + +/* If non-zero, the completion functions don't append any closing quote. + This is set to 0 by rl_complete_internal and may be changed by an + application-specific completion function. */ +READLINE_DLL_IMPEXP int rl_completion_suppress_quote; + +/* If non-zero, a slash will be appended to completed filenames that are + symbolic links to directory names, subject to the value of the + mark-directories variable (which is user-settable). This exists so + that application completion functions can override the user's preference + (set via the mark-symlinked-directories variable) if appropriate. + It's set to the value of _rl_complete_mark_symlink_dirs in + rl_complete_internal before any application-specific completion + function is called, so without that function doing anything, the user's + preferences are honored. */ +READLINE_DLL_IMPEXP int rl_completion_mark_symlink_dirs; + +/* If non-zero, then disallow duplicates in the matches. */ +READLINE_DLL_IMPEXP int rl_ignore_completion_duplicates; + +/* If this is non-zero, completion is (temporarily) inhibited, and the + completion character will be inserted as any other. */ +READLINE_DLL_IMPEXP int rl_inhibit_completion; + +/* Definitions available for use by readline clients. */ +#define RL_PROMPT_START_IGNORE '\001' +#define RL_PROMPT_END_IGNORE '\002' + +/* Possible values for do_replace argument to rl_filename_quoting_function, + called by rl_complete_internal. */ +#define NO_MATCH 0 +#define SINGLE_MATCH 1 +#define MULT_MATCH 2 + +/* Possible state values for rl_readline_state */ +#define RL_STATE_NONE 0x00000 /* no state; before first call */ + +#define RL_STATE_INITIALIZING 0x00001 /* initializing */ +#define RL_STATE_INITIALIZED 0x00002 /* initialization done */ +#define RL_STATE_TERMPREPPED 0x00004 /* terminal is prepped */ +#define RL_STATE_READCMD 0x00008 /* reading a command key */ +#define RL_STATE_METANEXT 0x00010 /* reading input after ESC */ +#define RL_STATE_DISPATCHING 0x00020 /* dispatching to a command */ +#define RL_STATE_MOREINPUT 0x00040 /* reading more input in a command function */ +#define RL_STATE_ISEARCH 0x00080 /* doing incremental search */ +#define RL_STATE_NSEARCH 0x00100 /* doing non-inc search */ +#define RL_STATE_SEARCH 0x00200 /* doing a history search */ +#define RL_STATE_NUMERICARG 0x00400 /* reading numeric argument */ +#define RL_STATE_MACROINPUT 0x00800 /* getting input from a macro */ +#define RL_STATE_MACRODEF 0x01000 /* defining keyboard macro */ +#define RL_STATE_OVERWRITE 0x02000 /* overwrite mode */ +#define RL_STATE_COMPLETING 0x04000 /* doing completion */ +#define RL_STATE_SIGHANDLER 0x08000 /* in readline sighandler */ +#define RL_STATE_UNDOING 0x10000 /* doing an undo */ +#define RL_STATE_INPUTPENDING 0x20000 /* rl_execute_next called */ +#define RL_STATE_TTYCSAVED 0x40000 /* tty special chars saved */ + +#define RL_STATE_DONE 0x80000 /* done; accepted line */ + +#define RL_SETSTATE(x) (rl_readline_state |= (x)) +#define RL_UNSETSTATE(x) (rl_readline_state &= ~(x)) +#define RL_ISSTATE(x) (rl_readline_state & (x)) + +struct readline_state { + /* line state */ + int point; + int end; + int mark; + char *buffer; + int buflen; + UNDO_LIST *ul; + char *prompt; + + /* global state */ + int rlstate; + int done; + Keymap kmap; + + /* input state */ + rl_command_func_t *lastfunc; + int insmode; + int edmode; + int kseqlen; + FILE *inf; + FILE *outf; + int pendingin; + char *macro; + + /* signal state */ + int catchsigs; + int catchsigwinch; + + /* search state */ + + /* completion state */ + + /* options state */ + + /* reserved for future expansion, so the struct size doesn't change */ + char reserved[64]; +}; + +READLINE_DLL_IMPEXP int rl_save_state PARAMS((struct readline_state *)); +READLINE_DLL_IMPEXP int rl_restore_state PARAMS((struct readline_state *)); + +#ifdef __cplusplus +} +#endif + +#endif /* _READLINE_H_ */ diff --git a/vendors/readline/src/readline/rlconf.h b/vendors/readline/src/readline/rlconf.h new file mode 100644 index 0000000..c651fd8 --- /dev/null +++ b/vendors/readline/src/readline/rlconf.h @@ -0,0 +1,60 @@ +/* rlconf.h -- readline configuration definitions */ + +/* Copyright (C) 1994 Free Software Foundation, Inc. + + This file contains the Readline Library (the Library), a set of + routines for providing Emacs style line input to programs that ask + for it. + + The Library is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + The 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 + General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + +#if !defined (_RLCONF_H_) +#define _RLCONF_H_ + +/* Define this if you want the vi-mode editing available. */ +#define VI_MODE + +/* Define this to get an indication of file type when listing completions. */ +#define VISIBLE_STATS + +/* This definition is needed by readline.c, rltty.c, and signals.c. */ +/* If on, then readline handles signals in a way that doesn't screw. */ +#define HANDLE_SIGNALS + +/* Ugly but working hack for binding prefix meta. */ +#define PREFIX_META_HACK + +/* The final, last-ditch effort file name for an init file. */ +#define DEFAULT_INPUTRC "~/.inputrc" + +/* If defined, expand tabs to spaces. */ +#define DISPLAY_TABS + +/* If defined, use the terminal escape sequence to move the cursor forward + over a character when updating the line rather than rewriting it. */ +/* #define HACK_TERMCAP_MOTION */ + +/* The string inserted by the `insert comment' command. */ +#define RL_COMMENT_BEGIN_DEFAULT "#" + +/* Define this if you want code that allows readline to be used in an + X `callback' style. */ +#define READLINE_CALLBACKS + +/* Define this if you want the cursor to indicate insert or overwrite mode. */ +/* #define CURSOR_MODE */ + +#endif /* _RLCONF_H_ */ diff --git a/vendors/readline/src/readline/rldefs.h b/vendors/readline/src/readline/rldefs.h new file mode 100644 index 0000000..c97a275 --- /dev/null +++ b/vendors/readline/src/readline/rldefs.h @@ -0,0 +1,185 @@ +/* rldefs.h -- an attempt to isolate some of the system-specific defines + for readline. This should be included after any files that define + system-specific constants like _POSIX_VERSION or USG. */ + +/* Copyright (C) 1987,1989 Free Software Foundation, Inc. + + This file contains the Readline Library (the Library), a set of + routines for providing Emacs style line input to programs that ask + for it. + + The Library is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + The 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 + General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + +#if !defined (_RLDEFS_H_) +#define _RLDEFS_H_ + +#if defined (HAVE_CONFIG_H) +# include "config.h" +#endif + +#include "rlstdc.h" + +#if defined (_POSIX_VERSION) && !defined (TERMIOS_MISSING) +# define TERMIOS_TTY_DRIVER +#else +# if defined (HAVE_TERMIO_H) +# define TERMIO_TTY_DRIVER +# else +# define NEW_TTY_DRIVER +# endif +#endif + +/* Posix macro to check file in statbuf for directory-ness. + This requires that be included before this test. */ +#if defined (S_IFDIR) && !defined (S_ISDIR) +# define S_ISDIR(m) (((m)&S_IFMT) == S_IFDIR) +#endif + +/* Decide which flavor of the header file describing the C library + string functions to include and include it. */ +//**************CHANGED***************** +#if defined (HAVE_STRING_H) +# include +#endif +#if defined (HAVE_STRINGS_H) +# include +#endif + +//**************CHANGED***************** +//#if !defined (strchr) && !defined (__STDC__) +//extern char *strchr (), *strrchr (); +//#endif /* !strchr && !__STDC__ */ + +#if defined (PREFER_STDARG) +# include +#else +# if defined (PREFER_VARARGS) +# include +# endif +#endif + +#if defined (HAVE_STRCASECMP) +#define _rl_stricmp strcasecmp +#define _rl_strnicmp strncasecmp +#elif defined (_WIN32) +#define _rl_stricmp stricmp +#define _rl_strnicmp strnicmp +#else +READLINE_DLL_IMPEXP int _rl_stricmp PARAMS((char *, char *)); +READLINE_DLL_IMPEXP int _rl_strnicmp PARAMS((char *, char *, int)); +#endif + +#if defined (HAVE_STRPBRK) && !defined (HAVE_MULTIBYTE) +# define _rl_strpbrk(a,b) strpbrk((a),(b)) +#else +READLINE_DLL_IMPEXP char *_rl_strpbrk PARAMS((const char *, const char *)); +#endif + +#if !defined (emacs_mode) +# define no_mode -1 +# define vi_mode 0 +# define emacs_mode 1 +#endif + +#if !defined (RL_IM_INSERT) +# define RL_IM_INSERT 1 +# define RL_IM_OVERWRITE 0 +# +# define RL_IM_DEFAULT RL_IM_INSERT +#endif + +/* If you cast map[key].function to type (Keymap) on a Cray, + the compiler takes the value of map[key].function and + divides it by 4 to convert between pointer types (pointers + to functions and pointers to structs are different sizes). + This is not what is wanted. */ +#if defined (CRAY) +# define FUNCTION_TO_KEYMAP(map, key) (Keymap)((int)map[key].function) +# define KEYMAP_TO_FUNCTION(data) (rl_command_func_t *)((int)(data)) +#else +# define FUNCTION_TO_KEYMAP(map, key) (Keymap)(map[key].function) +# define KEYMAP_TO_FUNCTION(data) (rl_command_func_t *)(data) +#endif + +#ifndef savestring +#define savestring(x) strcpy ((char *)xmalloc (1 + strlen (x)), (x)) +#endif + +/* Possible values for _rl_bell_preference. */ +#define NO_BELL 0 +#define AUDIBLE_BELL 1 +#define VISIBLE_BELL 2 + +/* Definitions used when searching the line for characters. */ +/* NOTE: it is necessary that opposite directions are inverses */ +#define FTO 1 /* forward to */ +#define BTO -1 /* backward to */ +#define FFIND 2 /* forward find */ +#define BFIND -2 /* backward find */ + +/* Possible values for the found_quote flags word used by the completion + functions. It says what kind of (shell-like) quoting we found anywhere + in the line. */ +#define RL_QF_SINGLE_QUOTE 0x01 +#define RL_QF_DOUBLE_QUOTE 0x02 +#define RL_QF_BACKSLASH 0x04 +#define RL_QF_OTHER_QUOTE 0x08 + +/* Default readline line buffer length. */ +#define DEFAULT_BUFFER_SIZE 256 + +#if !defined (STREQ) +#define STREQ(a, b) (((a)[0] == (b)[0]) && (strcmp ((a), (b)) == 0)) +#define STREQN(a, b, n) (((n) == 0) ? (1) \ + : ((a)[0] == (b)[0]) && (strncmp ((a), (b), (n)) == 0)) +#endif + +#if !defined (FREE) +# define FREE(x) if (x) free (x) +#endif + +#if !defined (SWAP) +# define SWAP(s, e) do { int t; t = s; s = e; e = t; } while (0) +#endif + +#if defined (_WIN32) +#define WAIT_FOR_INPUT 200 /* milliseconds to suspend maximally + when waiting for input */ +#define FOR_INPUT 1 /* flags for open state of the console */ +#define FOR_OUTPUT 2 +#define INITIALIZED 4 + +/* undefine this when readline / history should not look into the registry + for the path to their init files */ +#define INITFILES_IN_REGISTRY 1 + +#if defined (INITFILES_IN_REGISTRY) +/* We also try to get the .inputrc and .history file paths from the registry, + define what to look for */ +#define READLINE_REGKEY "Software\\Free Software Foundation\\libreadline" +#define INPUTRC_REGVAL "inputrc-file" +#define HISTFILE_REGVAL "history-file" + +READLINE_DLL_IMPEXP char *_rl_get_user_registry_string (char *keyName, char* valName); + +#endif + +#endif /* _WIN32 */ + +/* CONFIGURATION SECTION */ +#include "rlconf.h" + +#endif /* !_RLDEFS_H_ */ diff --git a/vendors/readline/src/readline/rlmbutil.h b/vendors/readline/src/readline/rlmbutil.h new file mode 100644 index 0000000..9ff904b --- /dev/null +++ b/vendors/readline/src/readline/rlmbutil.h @@ -0,0 +1,121 @@ +/* rlmbutil.h -- utility functions for multibyte characters. */ + +/* Copyright (C) 2001, 2003 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library, a library for + reading lines of text with interactive input and history editing. + + The GNU Readline Library is free software; you can redistribute it + and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2, or + (at your option) any later version. + + The GNU Readline 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 General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + +#if !defined (_RL_MBUTIL_H_) +#define _RL_MBUTIL_H_ + +#include "rlstdc.h" + +/************************************************/ +/* check multibyte capability for I18N code */ +/************************************************/ + +/* For platforms which support the ISO C amendement 1 functionality we + support user defined character classes. */ + /* Solaris 2.5 has a bug: must be included before . */ +#if defined (HAVE_WCTYPE_H) && defined (HAVE_WCHAR_H) +# include +# include +# if defined (HAVE_MBSRTOWCS) && defined (HAVE_MBRTOWC) && defined (HAVE_MBRLEN) && defined (HAVE_WCWIDTH) + /* system is supposed to support XPG5 */ +# define HANDLE_MULTIBYTE 1 +# endif +#endif + +/* If we don't want multibyte chars even on a system that supports them, let + the configuring user turn multibyte support off. */ +#if defined (NO_MULTIBYTE_SUPPORT) +# undef HANDLE_MULTIBYTE +#endif + +/* Some systems, like BeOS, have multibyte encodings but lack mbstate_t. */ +#if HANDLE_MULTIBYTE && !defined (HAVE_MBSTATE_T) +# define wcsrtombs(dest, src, len, ps) (wcsrtombs) (dest, src, len, 0) +# define mbsrtowcs(dest, src, len, ps) (mbsrtowcs) (dest, src, len, 0) +# define wcrtomb(s, wc, ps) (wcrtomb) (s, wc, 0) +# define mbrtowc(pwc, s, n, ps) (mbrtowc) (pwc, s, n, 0) +# define mbrlen(s, n, ps) (mbrlen) (s, n, 0) +# define mbstate_t int +#endif + +/* Make sure MB_LEN_MAX is at least 16 on systems that claim to be able to + handle multibyte chars (some systems define MB_LEN_MAX as 1) */ +#ifdef HANDLE_MULTIBYTE +# include +# if defined(MB_LEN_MAX) && (MB_LEN_MAX < 16) +# undef MB_LEN_MAX +# endif +# if !defined (MB_LEN_MAX) +# define MB_LEN_MAX 16 +# endif +#endif + +/************************************************/ +/* end of multibyte capability checks for I18N */ +/************************************************/ + +/* + * Flags for _rl_find_prev_mbchar and _rl_find_next_mbchar: + * + * MB_FIND_ANY find any multibyte character + * MB_FIND_NONZERO find a non-zero-width multibyte character + */ + +#define MB_FIND_ANY 0x00 +#define MB_FIND_NONZERO 0x01 + +READLINE_DLL_IMPEXP int _rl_find_prev_mbchar PARAMS((char *, int, int)); +READLINE_DLL_IMPEXP int _rl_find_next_mbchar PARAMS((char *, int, int, int)); + +#ifdef HANDLE_MULTIBYTE + +READLINE_DLL_IMPEXP int _rl_compare_chars PARAMS((char *, int, mbstate_t *, char *, int, mbstate_t *)); +READLINE_DLL_IMPEXP int _rl_get_char_len PARAMS((char *, mbstate_t *)); +READLINE_DLL_IMPEXP int _rl_adjust_point PARAMS((char *, int, mbstate_t *)); + +READLINE_DLL_IMPEXP int _rl_read_mbchar PARAMS((char *, int)); +READLINE_DLL_IMPEXP int _rl_read_mbstring PARAMS((int, char *, int)); + +READLINE_DLL_IMPEXP int _rl_is_mbchar_matched PARAMS((char *, int, int, char *, int)); + +#define MB_INVALIDCH(x) ((x) == (size_t)-1 || (x) == (size_t)-2) +#define MB_NULLWCH(x) ((x) == 0) + +#else /* !HANDLE_MULTIBYTE */ + +#undef MB_LEN_MAX +#undef MB_CUR_MAX + +#define MB_LEN_MAX 1 +#define MB_CUR_MAX 1 + +#define _rl_find_prev_mbchar(b, i, f) (((i) == 0) ? (i) : ((i) - 1)) +#define _rl_find_next_mbchar(b, i1, i2, f) ((i1) + (i2)) + +#define MB_INVALIDCH(x) (0) +#define MB_NULLWCH(x) (0) + +#endif /* !HANDLE_MULTIBYTE */ + +READLINE_DLL_IMPEXP int rl_byte_oriented; + +#endif /* _RL_MBUTIL_H_ */ diff --git a/vendors/readline/src/readline/rlprivate.h b/vendors/readline/src/readline/rlprivate.h new file mode 100644 index 0000000..2944788 --- /dev/null +++ b/vendors/readline/src/readline/rlprivate.h @@ -0,0 +1,288 @@ +/* rlprivate.h -- functions and variables global to the readline library, + but not intended for use by applications. */ + +/* Copyright (C) 1999-2004 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library, a library for + reading lines of text with interactive input and history editing. + + The GNU Readline Library is free software; you can redistribute it + and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2, or + (at your option) any later version. + + The GNU Readline 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 General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + +#if !defined (_RL_PRIVATE_H_) +#define _RL_PRIVATE_H_ + +#include "rlconf.h" /* for VISIBLE_STATS */ +#include "rlstdc.h" +#include "posixjmp.h" /* defines procenv_t */ + +/************************************************************************* + * * + * Global functions undocumented in texinfo manual and not in readline.h * + * * + *************************************************************************/ + +/************************************************************************* + * * + * Global variables undocumented in texinfo manual and not in readline.h * + * * + *************************************************************************/ + +/* complete.c */ +READLINE_DLL_IMPEXP int rl_complete_with_tilde_expansion; +#if defined (VISIBLE_STATS) +READLINE_DLL_IMPEXP int rl_visible_stats; +#endif /* VISIBLE_STATS */ + +/* readline.c */ +READLINE_DLL_IMPEXP int rl_line_buffer_len; +READLINE_DLL_IMPEXP int rl_arg_sign; +READLINE_DLL_IMPEXP int rl_visible_prompt_length; +READLINE_DLL_IMPEXP int readline_echoing_p; +READLINE_DLL_IMPEXP int rl_key_sequence_length; +READLINE_DLL_IMPEXP int rl_byte_oriented; + +/* display.c */ +READLINE_DLL_IMPEXP int rl_display_fixed; + +/* parens.c */ +READLINE_DLL_IMPEXP int rl_blink_matching_paren; + +/************************************************************************* + * * + * Global functions and variables unsed and undocumented * + * * + *************************************************************************/ + +/* kill.c */ +READLINE_DLL_IMPEXP int rl_set_retained_kills PARAMS((int)); + +/* terminal.c */ +READLINE_DLL_IMPEXP void _rl_set_screen_size PARAMS((int, int)); + +/* undo.c */ +READLINE_DLL_IMPEXP int _rl_fix_last_undo_of_type PARAMS((int, int, int)); + +/* util.c */ +READLINE_DLL_IMPEXP char *_rl_savestring PARAMS((const char *)); + +/************************************************************************* + * * + * Functions and variables private to the readline library * + * * + *************************************************************************/ + +/* NOTE: Functions and variables prefixed with `_rl_' are + pseudo-global: they are global so they can be shared + between files in the readline library, but are not intended + to be visible to readline callers. */ + +/************************************************************************* + * Undocumented private functions * + *************************************************************************/ + +#if defined(READLINE_CALLBACKS) + +/* readline.c */ +READLINE_DLL_IMPEXP void readline_internal_setup PARAMS((void)); +READLINE_DLL_IMPEXP char *readline_internal_teardown PARAMS((int)); +READLINE_DLL_IMPEXP int readline_internal_char PARAMS((void)); + +#endif /* READLINE_CALLBACKS */ + +/* bind.c */ + +/* complete.c */ +READLINE_DLL_IMPEXP char _rl_find_completion_word PARAMS((int *, int *)); +READLINE_DLL_IMPEXP void _rl_free_match_list PARAMS((char **)); + +/* display.c */ +READLINE_DLL_IMPEXP char *_rl_strip_prompt PARAMS((char *)); +READLINE_DLL_IMPEXP void _rl_move_cursor_relative PARAMS((int, const char *)); +READLINE_DLL_IMPEXP void _rl_move_vert PARAMS((int)); +READLINE_DLL_IMPEXP void _rl_save_prompt PARAMS((void)); +READLINE_DLL_IMPEXP void _rl_restore_prompt PARAMS((void)); +READLINE_DLL_IMPEXP char *_rl_make_prompt_for_search PARAMS((int)); +READLINE_DLL_IMPEXP void _rl_erase_at_end_of_line PARAMS((int)); +READLINE_DLL_IMPEXP void _rl_clear_to_eol PARAMS((int)); +READLINE_DLL_IMPEXP void _rl_clear_screen PARAMS((void)); +READLINE_DLL_IMPEXP void _rl_update_final PARAMS((void)); +READLINE_DLL_IMPEXP void _rl_redisplay_after_sigwinch PARAMS((void)); +READLINE_DLL_IMPEXP void _rl_clean_up_for_exit PARAMS((void)); +READLINE_DLL_IMPEXP void _rl_erase_entire_line PARAMS((void)); +READLINE_DLL_IMPEXP int _rl_current_display_line PARAMS((void)); + +/* input.c */ +READLINE_DLL_IMPEXP int _rl_any_typein PARAMS((void)); +READLINE_DLL_IMPEXP int _rl_input_available PARAMS((void)); +READLINE_DLL_IMPEXP int _rl_input_queued PARAMS((int)); +READLINE_DLL_IMPEXP void _rl_insert_typein PARAMS((int)); +READLINE_DLL_IMPEXP int _rl_unget_char PARAMS((int)); +READLINE_DLL_IMPEXP int _rl_pushed_input_available PARAMS((void)); + +/* macro.c */ +READLINE_DLL_IMPEXP void _rl_with_macro_input PARAMS((char *)); +READLINE_DLL_IMPEXP int _rl_next_macro_key PARAMS((void)); +READLINE_DLL_IMPEXP void _rl_push_executing_macro PARAMS((void)); +READLINE_DLL_IMPEXP void _rl_pop_executing_macro PARAMS((void)); +READLINE_DLL_IMPEXP void _rl_add_macro_char PARAMS((int)); +READLINE_DLL_IMPEXP void _rl_kill_kbd_macro PARAMS((void)); + +/* misc.c */ +READLINE_DLL_IMPEXP int _rl_init_argument PARAMS((void)); +READLINE_DLL_IMPEXP void _rl_start_using_history PARAMS((void)); +READLINE_DLL_IMPEXP int _rl_free_saved_history_line PARAMS((void)); +READLINE_DLL_IMPEXP void _rl_set_insert_mode PARAMS((int, int)); + +/* nls.c */ +READLINE_DLL_IMPEXP int _rl_init_eightbit PARAMS((void)); + +/* parens.c */ +READLINE_DLL_IMPEXP void _rl_enable_paren_matching PARAMS((int)); + +/* readline.c */ +READLINE_DLL_IMPEXP void _rl_init_line_state PARAMS((void)); +READLINE_DLL_IMPEXP void _rl_set_the_line PARAMS((void)); +READLINE_DLL_IMPEXP int _rl_dispatch PARAMS((int, Keymap)); +READLINE_DLL_IMPEXP int _rl_dispatch_subseq PARAMS((int, Keymap, int)); + +/* rltty.c */ +READLINE_DLL_IMPEXP int _rl_disable_tty_signals PARAMS((void)); +READLINE_DLL_IMPEXP int _rl_restore_tty_signals PARAMS((void)); + +/* terminal.c */ +READLINE_DLL_IMPEXP void _rl_get_screen_size PARAMS((int, int)); +READLINE_DLL_IMPEXP int _rl_init_terminal_io PARAMS((const char *)); +#ifdef _MINIX +READLINE_DLL_IMPEXP void _rl_output_character_function PARAMS((int)); +#else +READLINE_DLL_IMPEXP int _rl_output_character_function PARAMS((int)); +#endif +READLINE_DLL_IMPEXP void _rl_output_some_chars PARAMS((const char *, int)); +READLINE_DLL_IMPEXP int _rl_backspace PARAMS((int)); +READLINE_DLL_IMPEXP void _rl_enable_meta_key PARAMS((void)); +READLINE_DLL_IMPEXP void _rl_control_keypad PARAMS((int)); +READLINE_DLL_IMPEXP void _rl_set_cursor PARAMS((int, int)); + +/* text.c */ +READLINE_DLL_IMPEXP void _rl_fix_point PARAMS((int)); +READLINE_DLL_IMPEXP int _rl_replace_text PARAMS((const char *, int, int)); +READLINE_DLL_IMPEXP int _rl_insert_char PARAMS((int, int)); +READLINE_DLL_IMPEXP int _rl_overwrite_char PARAMS((int, int)); +READLINE_DLL_IMPEXP int _rl_overwrite_rubout PARAMS((int, int)); +READLINE_DLL_IMPEXP int _rl_rubout_char PARAMS((int, int)); +#if defined (HANDLE_MULTIBYTE) +READLINE_DLL_IMPEXP int _rl_char_search_internal PARAMS((int, int, char *, int)); +#else +READLINE_DLL_IMPEXP int _rl_char_search_internal PARAMS((int, int, int)); +#endif +READLINE_DLL_IMPEXP int _rl_set_mark_at_pos PARAMS((int)); + +/* util.c */ +READLINE_DLL_IMPEXP int _rl_abort_internal PARAMS((void)); +READLINE_DLL_IMPEXP char *_rl_strindex PARAMS((const char *, const char *)); +READLINE_DLL_IMPEXP int _rl_qsort_string_compare PARAMS((char **, char **)); +READLINE_DLL_IMPEXP int (_rl_uppercase_p) PARAMS((int)); +READLINE_DLL_IMPEXP int (_rl_lowercase_p) PARAMS((int)); +READLINE_DLL_IMPEXP int (_rl_pure_alphabetic) PARAMS((int)); +READLINE_DLL_IMPEXP int (_rl_digit_p) PARAMS((int)); +READLINE_DLL_IMPEXP int (_rl_to_lower) PARAMS((int)); +READLINE_DLL_IMPEXP int (_rl_to_upper) PARAMS((int)); +READLINE_DLL_IMPEXP int (_rl_digit_value) PARAMS((int)); + +/* vi_mode.c */ +READLINE_DLL_IMPEXP void _rl_vi_initialize_line PARAMS((void)); +READLINE_DLL_IMPEXP void _rl_vi_reset_last PARAMS((void)); +READLINE_DLL_IMPEXP void _rl_vi_set_last PARAMS((int, int, int)); +READLINE_DLL_IMPEXP int _rl_vi_textmod_command PARAMS((int)); +READLINE_DLL_IMPEXP void _rl_vi_done_inserting PARAMS((void)); + +/************************************************************************* + * Undocumented private variables * + *************************************************************************/ + +/* bind.c */ +READLINE_DLL_IMPEXP const char *_rl_possible_control_prefixes[]; +READLINE_DLL_IMPEXP const char *_rl_possible_meta_prefixes[]; + +/* complete.c */ +READLINE_DLL_IMPEXP int _rl_complete_show_all; +READLINE_DLL_IMPEXP int _rl_complete_show_unmodified; +READLINE_DLL_IMPEXP int _rl_complete_mark_directories; +READLINE_DLL_IMPEXP int _rl_complete_mark_symlink_dirs; +READLINE_DLL_IMPEXP int _rl_print_completions_horizontally; +READLINE_DLL_IMPEXP int _rl_completion_case_fold; +READLINE_DLL_IMPEXP int _rl_match_hidden_files; +READLINE_DLL_IMPEXP int _rl_page_completions; + +/* display.c */ +READLINE_DLL_IMPEXP int _rl_vis_botlin; +READLINE_DLL_IMPEXP int _rl_last_c_pos; +READLINE_DLL_IMPEXP int _rl_suppress_redisplay; +READLINE_DLL_IMPEXP char *rl_display_prompt; + +/* isearch.c */ +READLINE_DLL_IMPEXP char *_rl_isearch_terminators; + +/* macro.c */ +READLINE_DLL_IMPEXP char *_rl_executing_macro; + +/* misc.c */ +READLINE_DLL_IMPEXP int _rl_history_preserve_point; +READLINE_DLL_IMPEXP int _rl_history_saved_point; + +/* readline.c */ +READLINE_DLL_IMPEXP int _rl_horizontal_scroll_mode; +READLINE_DLL_IMPEXP int _rl_mark_modified_lines; +READLINE_DLL_IMPEXP int _rl_bell_preference; +READLINE_DLL_IMPEXP int _rl_meta_flag; +READLINE_DLL_IMPEXP int _rl_convert_meta_chars_to_ascii; +READLINE_DLL_IMPEXP int _rl_output_meta_chars; +READLINE_DLL_IMPEXP char *_rl_comment_begin; +READLINE_DLL_IMPEXP unsigned char _rl_parsing_conditionalized_out; +READLINE_DLL_IMPEXP Keymap _rl_keymap; +READLINE_DLL_IMPEXP FILE *_rl_in_stream; +READLINE_DLL_IMPEXP FILE *_rl_out_stream; +READLINE_DLL_IMPEXP int _rl_last_command_was_kill; +READLINE_DLL_IMPEXP int _rl_eof_char; +READLINE_DLL_IMPEXP procenv_t readline_top_level; + +/* terminal.c */ +READLINE_DLL_IMPEXP int _rl_enable_keypad; +READLINE_DLL_IMPEXP int _rl_enable_meta; +READLINE_DLL_IMPEXP char *_rl_term_clreol; +READLINE_DLL_IMPEXP char *_rl_term_clrpag; +READLINE_DLL_IMPEXP char *_rl_term_im; +READLINE_DLL_IMPEXP char *_rl_term_ic; +READLINE_DLL_IMPEXP char *_rl_term_ei; +READLINE_DLL_IMPEXP char *_rl_term_DC; +READLINE_DLL_IMPEXP char *_rl_term_up; +READLINE_DLL_IMPEXP char *_rl_term_dc; +READLINE_DLL_IMPEXP char *_rl_term_cr; +READLINE_DLL_IMPEXP char *_rl_term_IC; +READLINE_DLL_IMPEXP int _rl_screenheight; +READLINE_DLL_IMPEXP int _rl_screenwidth; +READLINE_DLL_IMPEXP int _rl_screenchars; +READLINE_DLL_IMPEXP int _rl_terminal_can_insert; +READLINE_DLL_IMPEXP int _rl_term_autowrap; + +/* undo.c */ +READLINE_DLL_IMPEXP int _rl_doing_an_undo; +READLINE_DLL_IMPEXP int _rl_undo_group_level; + +/* vi_mode.c */ +READLINE_DLL_IMPEXP int _rl_vi_last_command; + +#endif /* _RL_PRIVATE_H_ */ diff --git a/vendors/readline/src/readline/rlshell.h b/vendors/readline/src/readline/rlshell.h new file mode 100644 index 0000000..c8ea012 --- /dev/null +++ b/vendors/readline/src/readline/rlshell.h @@ -0,0 +1,34 @@ +/* rlshell.h -- utility functions normally provided by bash. */ + +/* Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library, a library for + reading lines of text with interactive input and history editing. + + The GNU Readline Library is free software; you can redistribute it + and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2, or + (at your option) any later version. + + The GNU Readline 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 General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + +#if !defined (_RL_SHELL_H_) +#define _RL_SHELL_H_ + +#include "rlstdc.h" + +READLINE_DLL_IMPEXP char *sh_single_quote PARAMS((char *)); +READLINE_DLL_IMPEXP void sh_set_lines_and_columns PARAMS((int, int)); +READLINE_DLL_IMPEXP char *sh_get_env_value PARAMS((const char *)); +READLINE_DLL_IMPEXP char *sh_get_home_dir PARAMS((void)); +READLINE_DLL_IMPEXP int sh_unset_nodelay_mode PARAMS((int)); + +#endif /* _RL_SHELL_H_ */ diff --git a/vendors/readline/src/readline/rlstdc.h b/vendors/readline/src/readline/rlstdc.h new file mode 100644 index 0000000..dd3f386 --- /dev/null +++ b/vendors/readline/src/readline/rlstdc.h @@ -0,0 +1,69 @@ +/* stdc.h -- macros to make source compile on both ANSI C and K&R C + compilers. */ + +/* Copyright (C) 1993 Free Software Foundation, Inc. + + This file is part of GNU Bash, the Bourne Again SHell. + + Bash is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bash is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU General Public License + along with Bash; see the file COPYING. If not, write to the Free + Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + +#if !defined (_RL_STDC_H_) +#define _RL_STDC_H_ + +/* Adapted from BSD /usr/include/sys/cdefs.h. */ + +/* A function can be defined using prototypes and compile on both ANSI C + and traditional C compilers with something like this: + extern char *func PARAMS((char *, char *, int)); */ + +#if !defined (PARAMS) +# if defined (__STDC__) || defined (__GNUC__) || defined (__cplusplus) +# define PARAMS(protos) protos +# else +# define PARAMS(protos) () +# endif +#endif + +#ifndef __attribute__ +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) +# define __attribute__(x) +# endif +#endif + +#ifndef __GNUC__ +# define __DLL_IMPORT__ __declspec(dllimport) +# define __DLL_EXPORT__ __declspec(dllexport) +#else +# define __DLL_IMPORT__ __attribute__((dllimport)) extern +# define __DLL_EXPORT__ __attribute__((dllexport)) extern +#endif + +#if (defined __WIN32__) || (defined _WIN32) +# ifdef BUILD_READLINE_DLL +# define READLINE_DLL_IMPEXP __DLL_EXPORT__ +# elif defined(READLINE_STATIC) +# define READLINE_DLL_IMPEXP +# elif defined (USE_READLINE_DLL) +# define READLINE_DLL_IMPEXP __DLL_IMPORT__ +# elif defined (USE_READLINE_STATIC) +# define READLINE_DLL_IMPEXP +# else /* assume USE_READLINE_DLL */ +# define READLINE_DLL_IMPEXP __DLL_IMPORT__ +# endif +#else /* __WIN32__ */ +# define READLINE_DLL_IMPEXP +#endif + +#endif /* !_RL_STDC_H_ */ diff --git a/vendors/readline/src/readline/rltty.c b/vendors/readline/src/readline/rltty.c new file mode 100644 index 0000000..a033982 --- /dev/null +++ b/vendors/readline/src/readline/rltty.c @@ -0,0 +1,1095 @@ +/* rltty.c -- functions to prepare and restore the terminal for readline's + use. */ + +/* Copyright (C) 1992 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library, a library for + reading lines of text with interactive input and history editing. + + The GNU Readline Library is free software; you can redistribute it + and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2, or + (at your option) any later version. + + The GNU Readline 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 General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +/* for native Win32 environments this is hard stuff */ +#if !defined (_WIN32) + +#include +#include +#include +#include + +#if defined (HAVE_UNISTD_H) +# include +#endif /* HAVE_UNISTD_H */ + +#include "rldefs.h" + +#if defined (GWINSZ_IN_SYS_IOCTL) +# include +#endif /* GWINSZ_IN_SYS_IOCTL */ + +#include "rltty.h" + +#else /* _WIN32 */ +#include "rldefs.h" +#include +#endif /* _WIN32 */ + +#include "readline.h" +#include "rlprivate.h" + +#if !defined (errno) +extern int errno; +#endif /* !errno */ + +rl_vintfunc_t *rl_prep_term_function = rl_prep_terminal; +rl_voidfunc_t *rl_deprep_term_function = rl_deprep_terminal; + +static void block_sigint PARAMS((void)); +static void release_sigint PARAMS((void)); + +static void set_winsize PARAMS((int)); + +#if !defined (_WIN32) +/* **************************************************************** */ +/* */ +/* Signal Management */ +/* */ +/* **************************************************************** */ + +#if defined (HAVE_POSIX_SIGNALS) +static sigset_t sigint_set, sigint_oset; +#else /* !HAVE_POSIX_SIGNALS */ +# if defined (HAVE_BSD_SIGNALS) +static int sigint_oldmask; +# endif /* HAVE_BSD_SIGNALS */ +#endif /* !HAVE_POSIX_SIGNALS */ + +static int sigint_blocked; + +/* Cause SIGINT to not be delivered until the corresponding call to + release_sigint(). */ +static void +block_sigint () +{ + if (sigint_blocked) + return; + +#if defined (HAVE_POSIX_SIGNALS) + sigemptyset (&sigint_set); + sigemptyset (&sigint_oset); + sigaddset (&sigint_set, SIGINT); + sigprocmask (SIG_BLOCK, &sigint_set, &sigint_oset); +#else /* !HAVE_POSIX_SIGNALS */ +# if defined (HAVE_BSD_SIGNALS) + sigint_oldmask = sigblock (sigmask (SIGINT)); +# else /* !HAVE_BSD_SIGNALS */ +# if defined (HAVE_USG_SIGHOLD) + sighold (SIGINT); +# endif /* HAVE_USG_SIGHOLD */ +# endif /* !HAVE_BSD_SIGNALS */ +#endif /* !HAVE_POSIX_SIGNALS */ + + sigint_blocked = 1; +} + +/* Allow SIGINT to be delivered. */ +static void +release_sigint () +{ + if (sigint_blocked == 0) + return; + +#if defined (HAVE_POSIX_SIGNALS) + sigprocmask (SIG_SETMASK, &sigint_oset, (sigset_t *)NULL); +#else +# if defined (HAVE_BSD_SIGNALS) + sigsetmask (sigint_oldmask); +# else /* !HAVE_BSD_SIGNALS */ +# if defined (HAVE_USG_SIGHOLD) + sigrelse (SIGINT); +# endif /* HAVE_USG_SIGHOLD */ +# endif /* !HAVE_BSD_SIGNALS */ +#endif /* !HAVE_POSIX_SIGNALS */ + + sigint_blocked = 0; +} + +/* **************************************************************** */ +/* */ +/* Saving and Restoring the TTY */ +/* */ +/* **************************************************************** */ + +/* Non-zero means that the terminal is in a prepped state. */ +static int terminal_prepped; + +static _RL_TTY_CHARS _rl_tty_chars, _rl_last_tty_chars; + +/* If non-zero, means that this process has called tcflow(fd, TCOOFF) + and output is suspended. */ +#if defined (__ksr1__) +static int ksrflow; +#endif + +/* Dummy call to force a backgrounded readline to stop before it tries + to get the tty settings. */ +static void +set_winsize (tty) + int tty; +{ +#if defined (TIOCGWINSZ) + struct winsize w; + + if (ioctl (tty, TIOCGWINSZ, &w) == 0) + (void) ioctl (tty, TIOCSWINSZ, &w); +#endif /* TIOCGWINSZ */ +} + +#if defined (NEW_TTY_DRIVER) + +/* Values for the `flags' field of a struct bsdtty. This tells which + elements of the struct bsdtty have been fetched from the system and + are valid. */ +#define SGTTY_SET 0x01 +#define LFLAG_SET 0x02 +#define TCHARS_SET 0x04 +#define LTCHARS_SET 0x08 + +struct bsdtty { + struct sgttyb sgttyb; /* Basic BSD tty driver information. */ + int lflag; /* Local mode flags, like LPASS8. */ +#if defined (TIOCGETC) + struct tchars tchars; /* Terminal special characters, including ^S and ^Q. */ +#endif +#if defined (TIOCGLTC) + struct ltchars ltchars; /* 4.2 BSD editing characters */ +#endif + int flags; /* Bitmap saying which parts of the struct are valid. */ +}; + +#define TIOTYPE struct bsdtty + +static TIOTYPE otio; + +static void save_tty_chars PARAMS((TIOTYPE *)); +static int _get_tty_settings PARAMS((int, TIOTYPE *)); +static int get_tty_settings PARAMS((int, TIOTYPE *)); +static int _set_tty_settings PARAMS((int, TIOTYPE *)); +static int set_tty_settings PARAMS((int, TIOTYPE *)); + +static void prepare_terminal_settings PARAMS((int, TIOTYPE, TIOTYPE *)); + +static void set_special_char PARAMS((Keymap, TIOTYPE *, int, rl_command_func_t)); + +static void +save_tty_chars (tiop) + TIOTYPE *tiop; +{ + _rl_last_tty_chars = _rl_tty_chars; + + if (tiop->flags & SGTTY_SET) + { + _rl_tty_chars.t_erase = tiop->sgttyb.sg_erase; + _rl_tty_chars.t_kill = tiop->sgttyb.sg_kill; + } + + if (tiop->flags & TCHARS_SET) + { + _rl_tty_chars.t_intr = tiop->tchars.t_intrc; + _rl_tty_chars.t_quit = tiop->tchars.t_quitc; + _rl_tty_chars.t_start = tiop->tchars.t_startc; + _rl_tty_chars.t_stop = tiop->tchars.t_stopc; + _rl_tty_chars.t_eof = tiop->tchars.t_eofc; + _rl_tty_chars.t_eol = '\n'; + _rl_tty_chars.t_eol2 = tiop->tchars.t_brkc; + } + + if (tiop->flags & LTCHARS_SET) + { + _rl_tty_chars.t_susp = tiop->ltchars.t_suspc; + _rl_tty_chars.t_dsusp = tiop->ltchars.t_dsuspc; + _rl_tty_chars.t_reprint = tiop->ltchars.t_rprntc; + _rl_tty_chars.t_flush = tiop->ltchars.t_flushc; + _rl_tty_chars.t_werase = tiop->ltchars.t_werasc; + _rl_tty_chars.t_lnext = tiop->ltchars.t_lnextc; + } + + _rl_tty_chars.t_status = -1; +} + +static int +get_tty_settings (tty, tiop) + int tty; + TIOTYPE *tiop; +{ +#if defined (TIOCGWINSZ) + set_winsize (tty); +#endif + + tiop->flags = tiop->lflag = 0; + + if (ioctl (tty, TIOCGETP, &(tiop->sgttyb)) < 0) + return -1; + tiop->flags |= SGTTY_SET; + +#if defined (TIOCLGET) + if (ioctl (tty, TIOCLGET, &(tiop->lflag)) == 0) + tiop->flags |= LFLAG_SET; +#endif + +#if defined (TIOCGETC) + if (ioctl (tty, TIOCGETC, &(tiop->tchars)) == 0) + tiop->flags |= TCHARS_SET; +#endif + +#if defined (TIOCGLTC) + if (ioctl (tty, TIOCGLTC, &(tiop->ltchars)) == 0) + tiop->flags |= LTCHARS_SET; +#endif + + return 0; +} + +static int +set_tty_settings (tty, tiop) + int tty; + TIOTYPE *tiop; +{ + if (tiop->flags & SGTTY_SET) + { + ioctl (tty, TIOCSETN, &(tiop->sgttyb)); + tiop->flags &= ~SGTTY_SET; + } + readline_echoing_p = 1; + +#if defined (TIOCLSET) + if (tiop->flags & LFLAG_SET) + { + ioctl (tty, TIOCLSET, &(tiop->lflag)); + tiop->flags &= ~LFLAG_SET; + } +#endif + +#if defined (TIOCSETC) + if (tiop->flags & TCHARS_SET) + { + ioctl (tty, TIOCSETC, &(tiop->tchars)); + tiop->flags &= ~TCHARS_SET; + } +#endif + +#if defined (TIOCSLTC) + if (tiop->flags & LTCHARS_SET) + { + ioctl (tty, TIOCSLTC, &(tiop->ltchars)); + tiop->flags &= ~LTCHARS_SET; + } +#endif + + return 0; +} + +static void +prepare_terminal_settings (meta_flag, oldtio, tiop) + int meta_flag; + TIOTYPE oldtio, *tiop; +{ + readline_echoing_p = (oldtio.sgttyb.sg_flags & ECHO); + + /* Copy the original settings to the structure we're going to use for + our settings. */ + tiop->sgttyb = oldtio.sgttyb; + tiop->lflag = oldtio.lflag; +#if defined (TIOCGETC) + tiop->tchars = oldtio.tchars; +#endif +#if defined (TIOCGLTC) + tiop->ltchars = oldtio.ltchars; +#endif + tiop->flags = oldtio.flags; + + /* First, the basic settings to put us into character-at-a-time, no-echo + input mode. */ + tiop->sgttyb.sg_flags &= ~(ECHO | CRMOD); + tiop->sgttyb.sg_flags |= CBREAK; + + /* If this terminal doesn't care how the 8th bit is used, then we can + use it for the meta-key. If only one of even or odd parity is + specified, then the terminal is using parity, and we cannot. */ +#if !defined (ANYP) +# define ANYP (EVENP | ODDP) +#endif + if (((oldtio.sgttyb.sg_flags & ANYP) == ANYP) || + ((oldtio.sgttyb.sg_flags & ANYP) == 0)) + { + tiop->sgttyb.sg_flags |= ANYP; + + /* Hack on local mode flags if we can. */ +#if defined (TIOCLGET) +# if defined (LPASS8) + tiop->lflag |= LPASS8; +# endif /* LPASS8 */ +#endif /* TIOCLGET */ + } + +#if defined (TIOCGETC) +# if defined (USE_XON_XOFF) + /* Get rid of terminal output start and stop characters. */ + tiop->tchars.t_stopc = -1; /* C-s */ + tiop->tchars.t_startc = -1; /* C-q */ + + /* If there is an XON character, bind it to restart the output. */ + if (oldtio.tchars.t_startc != -1) + rl_bind_key (oldtio.tchars.t_startc, rl_restart_output); +# endif /* USE_XON_XOFF */ + + /* If there is an EOF char, bind _rl_eof_char to it. */ + if (oldtio.tchars.t_eofc != -1) + _rl_eof_char = oldtio.tchars.t_eofc; + +# if defined (NO_KILL_INTR) + /* Get rid of terminal-generated SIGQUIT and SIGINT. */ + tiop->tchars.t_quitc = -1; /* C-\ */ + tiop->tchars.t_intrc = -1; /* C-c */ +# endif /* NO_KILL_INTR */ +#endif /* TIOCGETC */ + +#if defined (TIOCGLTC) + /* Make the interrupt keys go away. Just enough to make people happy. */ + tiop->ltchars.t_dsuspc = -1; /* C-y */ + tiop->ltchars.t_lnextc = -1; /* C-v */ +#endif /* TIOCGLTC */ +} + +#else /* !defined (NEW_TTY_DRIVER) */ + +#if !defined (VMIN) +# define VMIN VEOF +#endif + +#if !defined (VTIME) +# define VTIME VEOL +#endif + +#if defined (TERMIOS_TTY_DRIVER) +# define TIOTYPE struct termios +# define DRAIN_OUTPUT(fd) tcdrain (fd) +# define GETATTR(tty, tiop) (tcgetattr (tty, tiop)) +# ifdef M_UNIX +# define SETATTR(tty, tiop) (tcsetattr (tty, TCSANOW, tiop)) +# else +# define SETATTR(tty, tiop) (tcsetattr (tty, TCSADRAIN, tiop)) +# endif /* !M_UNIX */ +#else +# define TIOTYPE struct termio +# define DRAIN_OUTPUT(fd) +# define GETATTR(tty, tiop) (ioctl (tty, TCGETA, tiop)) +# define SETATTR(tty, tiop) (ioctl (tty, TCSETAW, tiop)) +#endif /* !TERMIOS_TTY_DRIVER */ + +static TIOTYPE otio; + +static void save_tty_chars PARAMS((TIOTYPE *)); +static int _get_tty_settings PARAMS((int, TIOTYPE *)); +static int get_tty_settings PARAMS((int, TIOTYPE *)); +static int _set_tty_settings PARAMS((int, TIOTYPE *)); +static int set_tty_settings PARAMS((int, TIOTYPE *)); + +static void prepare_terminal_settings PARAMS((int, TIOTYPE, TIOTYPE *)); + +static void set_special_char PARAMS((Keymap, TIOTYPE *, int, rl_command_func_t)); +static void _rl_bind_tty_special_chars PARAMS((Keymap, TIOTYPE)); + +#if defined (FLUSHO) +# define OUTPUT_BEING_FLUSHED(tp) (tp->c_lflag & FLUSHO) +#else +# define OUTPUT_BEING_FLUSHED(tp) 0 +#endif + +static void +save_tty_chars (tiop) + TIOTYPE *tiop; +{ + _rl_last_tty_chars = _rl_tty_chars; + + _rl_tty_chars.t_eof = tiop->c_cc[VEOF]; + _rl_tty_chars.t_eol = tiop->c_cc[VEOL]; +#ifdef VEOL2 + _rl_tty_chars.t_eol2 = tiop->c_cc[VEOL2]; +#endif + _rl_tty_chars.t_erase = tiop->c_cc[VERASE]; +#ifdef VWERASE + _rl_tty_chars.t_werase = tiop->c_cc[VWERASE]; +#endif + _rl_tty_chars.t_kill = tiop->c_cc[VKILL]; +#ifdef VREPRINT + _rl_tty_chars.t_reprint = tiop->c_cc[VREPRINT]; +#endif + _rl_tty_chars.t_intr = tiop->c_cc[VINTR]; + _rl_tty_chars.t_quit = tiop->c_cc[VQUIT]; +#ifdef VSUSP + _rl_tty_chars.t_susp = tiop->c_cc[VSUSP]; +#endif +#ifdef VDSUSP + _rl_tty_chars.t_dsusp = tiop->c_cc[VDSUSP]; +#endif +#ifdef VSTART + _rl_tty_chars.t_start = tiop->c_cc[VSTART]; +#endif +#ifdef VSTOP + _rl_tty_chars.t_stop = tiop->c_cc[VSTOP]; +#endif +#ifdef VLNEXT + _rl_tty_chars.t_lnext = tiop->c_cc[VLNEXT]; +#endif +#ifdef VDISCARD + _rl_tty_chars.t_flush = tiop->c_cc[VDISCARD]; +#endif +#ifdef VSTATUS + _rl_tty_chars.t_status = tiop->c_cc[VSTATUS]; +#endif +} + +#if defined (_AIX) || defined (_AIX41) +/* Currently this is only used on AIX */ +static void +rltty_warning (msg) + char *msg; +{ + fprintf (stderr, "readline: warning: %s\n", msg); +} +#endif + +#if defined (_AIX) +void +setopost(tp) +TIOTYPE *tp; +{ + if ((tp->c_oflag & OPOST) == 0) + { + rltty_warning ("turning on OPOST for terminal\r"); + tp->c_oflag |= OPOST|ONLCR; + } +} +#endif + +static int +_get_tty_settings (tty, tiop) + int tty; + TIOTYPE *tiop; +{ + int ioctl_ret; + + while (1) + { + ioctl_ret = GETATTR (tty, tiop); + if (ioctl_ret < 0) + { + if (errno != EINTR) + return -1; + else + continue; + } + if (OUTPUT_BEING_FLUSHED (tiop)) + { +#if defined (FLUSHO) && defined (_AIX41) + rltty_warning ("turning off output flushing"); + tiop->c_lflag &= ~FLUSHO; + break; +#else + continue; +#endif + } + break; + } + + return 0; +} + +static int +get_tty_settings (tty, tiop) + int tty; + TIOTYPE *tiop; +{ +#if defined (TIOCGWINSZ) + set_winsize (tty); +#endif + + if (_get_tty_settings (tty, tiop) < 0) + return -1; + +#if defined (_AIX) + setopost(tiop); +#endif + + return 0; +} + +static int +_set_tty_settings (tty, tiop) + int tty; + TIOTYPE *tiop; +{ + while (SETATTR (tty, tiop) < 0) + { + if (errno != EINTR) + return -1; + errno = 0; + } + return 0; +} + +static int +set_tty_settings (tty, tiop) + int tty; + TIOTYPE *tiop; +{ + if (_set_tty_settings (tty, tiop) < 0) + return -1; + +#if 0 + +#if defined (TERMIOS_TTY_DRIVER) +# if defined (__ksr1__) + if (ksrflow) + { + ksrflow = 0; + tcflow (tty, TCOON); + } +# else /* !ksr1 */ + tcflow (tty, TCOON); /* Simulate a ^Q. */ +# endif /* !ksr1 */ +#else + ioctl (tty, TCXONC, 1); /* Simulate a ^Q. */ +#endif /* !TERMIOS_TTY_DRIVER */ + +#endif /* 0 */ + + return 0; +} + +static void +prepare_terminal_settings (meta_flag, oldtio, tiop) + int meta_flag; + TIOTYPE oldtio, *tiop; +{ + readline_echoing_p = (oldtio.c_lflag & ECHO); + + tiop->c_lflag &= ~(ICANON | ECHO); + + if ((unsigned char) oldtio.c_cc[VEOF] != (unsigned char) _POSIX_VDISABLE) + _rl_eof_char = oldtio.c_cc[VEOF]; + +#if defined (USE_XON_XOFF) +#if defined (IXANY) + tiop->c_iflag &= ~(IXON | IXOFF | IXANY); +#else + /* `strict' Posix systems do not define IXANY. */ + tiop->c_iflag &= ~(IXON | IXOFF); +#endif /* IXANY */ +#endif /* USE_XON_XOFF */ + + /* Only turn this off if we are using all 8 bits. */ + if (((tiop->c_cflag & CSIZE) == CS8) || meta_flag) + tiop->c_iflag &= ~(ISTRIP | INPCK); + + /* Make sure we differentiate between CR and NL on input. */ + tiop->c_iflag &= ~(ICRNL | INLCR); + +#if !defined (HANDLE_SIGNALS) + tiop->c_lflag &= ~ISIG; +#else + tiop->c_lflag |= ISIG; +#endif + + tiop->c_cc[VMIN] = 1; + tiop->c_cc[VTIME] = 0; + +#if defined (FLUSHO) + if (OUTPUT_BEING_FLUSHED (tiop)) + { + tiop->c_lflag &= ~FLUSHO; + oldtio.c_lflag &= ~FLUSHO; + } +#endif + + /* Turn off characters that we need on Posix systems with job control, + just to be sure. This includes ^Y and ^V. This should not really + be necessary. */ +#if defined (TERMIOS_TTY_DRIVER) && defined (_POSIX_VDISABLE) + +#if defined (VLNEXT) + tiop->c_cc[VLNEXT] = _POSIX_VDISABLE; +#endif + +#if defined (VDSUSP) + tiop->c_cc[VDSUSP] = _POSIX_VDISABLE; +#endif + +#endif /* TERMIOS_TTY_DRIVER && _POSIX_VDISABLE */ +} +#endif /* NEW_TTY_DRIVER */ + +/* Put the terminal in CBREAK mode so that we can detect key presses. */ +void +rl_prep_terminal (meta_flag) + int meta_flag; +{ + int tty; + TIOTYPE tio; + + if (terminal_prepped) + return; + + /* Try to keep this function from being INTerrupted. */ + block_sigint (); + + tty = fileno (rl_instream); + + if (get_tty_settings (tty, &tio) < 0) + { + release_sigint (); + return; + } + + otio = tio; + + rl_tty_unset_default_bindings (_rl_keymap); + save_tty_chars (&otio); + RL_SETSTATE(RL_STATE_TTYCSAVED); + _rl_bind_tty_special_chars (_rl_keymap, tio); + + prepare_terminal_settings (meta_flag, otio, &tio); + + if (set_tty_settings (tty, &tio) < 0) + { + release_sigint (); + return; + } + + if (_rl_enable_keypad) + _rl_control_keypad (1); + + fflush (rl_outstream); + terminal_prepped = 1; + RL_SETSTATE(RL_STATE_TERMPREPPED); + + release_sigint (); +} + +/* Restore the terminal's normal settings and modes. */ +void +rl_deprep_terminal () +{ + int tty; + + if (!terminal_prepped) + return; + + /* Try to keep this function from being interrupted. */ + block_sigint (); + + tty = fileno (rl_instream); + + if (_rl_enable_keypad) + _rl_control_keypad (0); + + fflush (rl_outstream); + + if (set_tty_settings (tty, &otio) < 0) + { + release_sigint (); + return; + } + + terminal_prepped = 0; + RL_UNSETSTATE(RL_STATE_TERMPREPPED); + + release_sigint (); +} + +/* **************************************************************** */ +/* */ +/* Bogus Flow Control */ +/* */ +/* **************************************************************** */ + +int +rl_restart_output (count, key) + int count, key; +{ + int fildes = fileno (rl_outstream); +#if defined (TIOCSTART) +#if defined (apollo) + ioctl (&fildes, TIOCSTART, 0); +#else + ioctl (fildes, TIOCSTART, 0); +#endif /* apollo */ + +#else /* !TIOCSTART */ +# if defined (TERMIOS_TTY_DRIVER) +# if defined (__ksr1__) + if (ksrflow) + { + ksrflow = 0; + tcflow (fildes, TCOON); + } +# else /* !ksr1 */ + tcflow (fildes, TCOON); /* Simulate a ^Q. */ +# endif /* !ksr1 */ +# else /* !TERMIOS_TTY_DRIVER */ +# if defined (TCXONC) + ioctl (fildes, TCXONC, TCOON); +# endif /* TCXONC */ +# endif /* !TERMIOS_TTY_DRIVER */ +#endif /* !TIOCSTART */ + + return 0; +} + +int +rl_stop_output (count, key) + int count, key; +{ + int fildes = fileno (rl_instream); + +#if defined (TIOCSTOP) +# if defined (apollo) + ioctl (&fildes, TIOCSTOP, 0); +# else + ioctl (fildes, TIOCSTOP, 0); +# endif /* apollo */ +#else /* !TIOCSTOP */ +# if defined (TERMIOS_TTY_DRIVER) +# if defined (__ksr1__) + ksrflow = 1; +# endif /* ksr1 */ + tcflow (fildes, TCOOFF); +# else +# if defined (TCXONC) + ioctl (fildes, TCXONC, TCOON); +# endif /* TCXONC */ +# endif /* !TERMIOS_TTY_DRIVER */ +#endif /* !TIOCSTOP */ + + return 0; +} + +/* **************************************************************** */ +/* */ +/* Default Key Bindings */ +/* */ +/* **************************************************************** */ + +#define SET_SPECIAL(sc, func) set_special_char(kmap, &ttybuff, sc, func) + +#if defined (NEW_TTY_DRIVER) +static void +set_special_char (kmap, tiop, sc, func) + Keymap kmap; + TIOTYPE *tiop; + int sc; + rl_command_func_t *func; +{ + if (sc != -1 && kmap[(unsigned char)sc].type == ISFUNC) + kmap[(unsigned char)sc].function = func; +} + +#define RESET_SPECIAL(c) \ + if (c != -1 && kmap[(unsigned char)c].type == ISFUNC) + kmap[(unsigned char)c].function = rl_insert; + +static void +_rl_bind_tty_special_chars (kmap, ttybuff) + Keymap kmap; + TIOTYPE ttybuff; +{ + if (ttybuff.flags & SGTTY_SET) + { + SET_SPECIAL (ttybuff.sgttyb.sg_erase, rl_rubout); + SET_SPECIAL (ttybuff.sgttyb.sg_kill, rl_unix_line_discard); + } + +# if defined (TIOCGLTC) + if (ttybuff.flags & LTCHARS_SET) + { + SET_SPECIAL (ttybuff.ltchars.t_werasc, rl_unix_word_rubout); + SET_SPECIAL (ttybuff.ltchars.t_lnextc, rl_quoted_insert); + } +# endif /* TIOCGLTC */ +} + +#else /* !NEW_TTY_DRIVER */ +static void +set_special_char (kmap, tiop, sc, func) + Keymap kmap; + TIOTYPE *tiop; + int sc; + rl_command_func_t *func; +{ + unsigned char uc; + + uc = tiop->c_cc[sc]; + if (uc != (unsigned char)_POSIX_VDISABLE && kmap[uc].type == ISFUNC) + kmap[uc].function = func; +} + +/* used later */ +#define RESET_SPECIAL(uc) \ + if (uc != (unsigned char)_POSIX_VDISABLE && kmap[uc].type == ISFUNC) \ + kmap[uc].function = rl_insert; + +static void +_rl_bind_tty_special_chars (kmap, ttybuff) + Keymap kmap; + TIOTYPE ttybuff; +{ + SET_SPECIAL (VERASE, rl_rubout); + SET_SPECIAL (VKILL, rl_unix_line_discard); + +# if defined (VLNEXT) && defined (TERMIOS_TTY_DRIVER) + SET_SPECIAL (VLNEXT, rl_quoted_insert); +# endif /* VLNEXT && TERMIOS_TTY_DRIVER */ + +# if defined (VWERASE) && defined (TERMIOS_TTY_DRIVER) + SET_SPECIAL (VWERASE, rl_unix_word_rubout); +# endif /* VWERASE && TERMIOS_TTY_DRIVER */ +} + +#endif /* !NEW_TTY_DRIVER */ + +/* Set the system's default editing characters to their readline equivalents + in KMAP. Should be static, now that we have rl_tty_set_default_bindings. */ +void +rltty_set_default_bindings (kmap) + Keymap kmap; +{ + TIOTYPE ttybuff; + int tty; + static int called = 0; + + tty = fileno (rl_instream); + + if (get_tty_settings (tty, &ttybuff) == 0) + _rl_bind_tty_special_chars (kmap, ttybuff); +} + +#else /* __MING32__ */ + +/* **************************************************************** */ +/* */ +/* Default Key Bindings for Win32 Console */ +/* */ +/* **************************************************************** */ + +#include + +#define CONSOLE_MODE ENABLE_PROCESSED_INPUT | ENABLE_MOUSE_INPUT + +/* global vars used by other modules */ + +int haveConsole = 0; /* remember init result of the console */ +HANDLE hStdout, hStdin; /* these are different from stdin, stdout */ + +COORD rlScreenOrigin; /* readline origin in frame buffer coordinates */ +int rlScreenStart = 0; /* readline origin as frame screen buffer offset */ +COORD rlScreenEnd; /* end of line in frame buffer coordinates */ +int rlScreenMax = 0; /* end of line as linear frame buffer offset */ + +static DWORD savedConsoleMode = 0; /* to restore console on exit */ + +void +rltty_set_default_bindings (kmap) + Keymap kmap; +{ + /* I bet this is required on Win32 ;-) */ + { + char buf[40]; strcpy(buf,"set bell-style none"); + rl_parse_and_bind(buf); + } + rl_set_key ("\\M-\\&", rl_get_previous_history, kmap); + rl_set_key ("\\M-\\(", rl_get_next_history, kmap); + rl_set_key ("\\M-\\'", rl_forward, kmap); + rl_set_key ("\\M-\\%", rl_backward, kmap); + + rl_set_key ("\\M-\\$", rl_beg_of_line, kmap); + rl_set_key ("\\M-\\#", rl_end_of_line, kmap); + rl_set_key ("\\M-\\%", rl_backward_word, kmap); + rl_set_key ("\\M-\\'", rl_forward_word, kmap); + + rl_set_key ("\\M-\\-", rl_paste_from_clipboard, kmap); + rl_set_key ("\\M-\\.", rl_delete, kmap); + rl_set_key ("", rl_unix_word_rubout, kmap); +} + +/* Query and set up a Window Console */ + +void +rl_prep_terminal (meta_flag) + int meta_flag; +{ + readline_echoing_p = 1; + + if ( !(haveConsole & INITIALIZED) ) + { + if ( !(haveConsole & FOR_INPUT) + && ((hStdin = GetStdHandle(STD_INPUT_HANDLE)) != INVALID_HANDLE_VALUE) ) + { + DWORD dummy; + INPUT_RECORD irec; + if ( PeekConsoleInput(hStdin, &irec, 1, &dummy) ) + { + haveConsole |= FOR_INPUT; + if ( GetConsoleMode(hStdin, &savedConsoleMode) ) + SetConsoleMode(hStdin, CONSOLE_MODE); + } + } + if ( (hStdout = GetStdHandle(STD_OUTPUT_HANDLE)) != INVALID_HANDLE_VALUE) + { + CONSOLE_SCREEN_BUFFER_INFO csbi; + if ( GetConsoleScreenBufferInfo(hStdout, &csbi) + && (csbi.dwSize.X > 0) && (csbi.dwSize.Y > 0) ) + { + haveConsole |= FOR_OUTPUT; + rlScreenOrigin = csbi.dwCursorPosition; + rlScreenStart = (int)csbi.dwCursorPosition.Y * (int)csbi.dwSize.X + + (int)csbi.dwCursorPosition.X; + } + } + haveConsole |= INITIALIZED; + } +} + +/* Restore the consoles's normal settings and modes. */ +void +rl_deprep_terminal () +{ + SetConsoleMode(hStdin, savedConsoleMode); + haveConsole = 0; +} + +int +rl_restart_output (count, key) + int count, key; +{ + return 0; +} + +int +rl_stop_output (count, key) + int count, key; +{ + return 0; +} +#endif /* _WIN32 */ + +/* New public way to set the system default editing chars to their readline + equivalents. */ +void +rl_tty_set_default_bindings (kmap) + Keymap kmap; +{ + rltty_set_default_bindings (kmap); +} + +#ifndef _WIN32 +/* Rebind all of the tty special chars that readline worries about back + to self-insert. Call this before saving the current terminal special + chars with save_tty_chars(). This only works on POSIX termios or termio + systems. */ +void +rl_tty_unset_default_bindings (kmap) + Keymap kmap; +{ + /* Don't bother before we've saved the tty special chars at least once. */ + if (RL_ISSTATE(RL_STATE_TTYCSAVED) == 0) + return; + + RESET_SPECIAL (_rl_tty_chars.t_erase); + RESET_SPECIAL (_rl_tty_chars.t_kill); + +# if defined (VLNEXT) && defined (TERMIOS_TTY_DRIVER) + RESET_SPECIAL (_rl_tty_chars.t_lnext); +# endif /* VLNEXT && TERMIOS_TTY_DRIVER */ + +# if defined (VWERASE) && defined (TERMIOS_TTY_DRIVER) + RESET_SPECIAL (_rl_tty_chars.t_werase); +# endif /* VWERASE && TERMIOS_TTY_DRIVER */ +} +#endif /* _WIN32 */ + +#if defined (HANDLE_SIGNALS) + +#if defined (NEW_TTY_DRIVER) +int +_rl_disable_tty_signals () +{ + return 0; +} + +int +_rl_restore_tty_signals () +{ + return 0; +} +#else + +static TIOTYPE sigstty, nosigstty; +static int tty_sigs_disabled = 0; + +int +_rl_disable_tty_signals () +{ + if (tty_sigs_disabled) + return 0; + + if (_get_tty_settings (fileno (rl_instream), &sigstty) < 0) + return -1; + + nosigstty = sigstty; + + nosigstty.c_lflag &= ~ISIG; + nosigstty.c_iflag &= ~IXON; + + if (_set_tty_settings (fileno (rl_instream), &nosigstty) < 0) + return (_set_tty_settings (fileno (rl_instream), &sigstty)); + + tty_sigs_disabled = 1; + return 0; +} + +int +_rl_restore_tty_signals () +{ + int r; + + if (tty_sigs_disabled == 0) + return 0; + + r = _set_tty_settings (fileno (rl_instream), &sigstty); + + if (r == 0) + tty_sigs_disabled = 0; + + return r; +} +#endif /* !NEW_TTY_DRIVER */ + +#endif /* HANDLE_SIGNALS */ diff --git a/vendors/readline/src/readline/rltty.h b/vendors/readline/src/readline/rltty.h new file mode 100644 index 0000000..e57e807 --- /dev/null +++ b/vendors/readline/src/readline/rltty.h @@ -0,0 +1,82 @@ +/* rltty.h - tty driver-related definitions used by some library files. */ + +/* Copyright (C) 1995 Free Software Foundation, Inc. + + This file contains the Readline Library (the Library), a set of + routines for providing Emacs style line input to programs that ask + for it. + + The Library is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + The 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 + General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + +#if !defined (_RLTTY_H_) +#define _RLTTY_H_ + +/* Posix systems use termios and the Posix signal functions. */ +#if defined (TERMIOS_TTY_DRIVER) +# include +#endif /* TERMIOS_TTY_DRIVER */ + +/* System V machines use termio. */ +#if defined (TERMIO_TTY_DRIVER) +# include +# if !defined (TCOON) +# define TCOON 1 +# endif +#endif /* TERMIO_TTY_DRIVER */ + +/* Other (BSD) machines use sgtty. */ +#if defined (NEW_TTY_DRIVER) && !defined (_WIN32) +# include +#endif + +#include "rlwinsize.h" + +/* Define _POSIX_VDISABLE if we are not using the `new' tty driver and + it is not already defined. It is used both to determine if a + special character is disabled and to disable certain special + characters. Posix systems should set to 0, USG systems to -1. */ +#if !defined (NEW_TTY_DRIVER) && !defined (_POSIX_VDISABLE) +# if defined (_SVR4_VDISABLE) +# define _POSIX_VDISABLE _SVR4_VDISABLE +# else +# if defined (_POSIX_VERSION) +# define _POSIX_VDISABLE 0 +# else /* !_POSIX_VERSION */ +# define _POSIX_VDISABLE -1 +# endif /* !_POSIX_VERSION */ +# endif /* !_SVR4_DISABLE */ +#endif /* !NEW_TTY_DRIVER && !_POSIX_VDISABLE */ + +typedef struct _rl_tty_chars { + unsigned char t_eof; + unsigned char t_eol; + unsigned char t_eol2; + unsigned char t_erase; + unsigned char t_werase; + unsigned char t_kill; + unsigned char t_reprint; + unsigned char t_intr; + unsigned char t_quit; + unsigned char t_susp; + unsigned char t_dsusp; + unsigned char t_start; + unsigned char t_stop; + unsigned char t_lnext; + unsigned char t_flush; + unsigned char t_status; +} _RL_TTY_CHARS; + +#endif /* _RLTTY_H_ */ diff --git a/vendors/readline/src/readline/rltypedefs.h b/vendors/readline/src/readline/rltypedefs.h new file mode 100644 index 0000000..862bdb8 --- /dev/null +++ b/vendors/readline/src/readline/rltypedefs.h @@ -0,0 +1,94 @@ +/* rltypedefs.h -- Type declarations for readline functions. */ + +/* Copyright (C) 2000-2004 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library, a library for + reading lines of text with interactive input and history editing. + + The GNU Readline Library is free software; you can redistribute it + and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2, or + (at your option) any later version. + + The GNU Readline 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 General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + +#ifndef _RL_TYPEDEFS_H_ +#define _RL_TYPEDEFS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Old-style */ + +#if !defined (_FUNCTION_DEF) +# define _FUNCTION_DEF + +typedef int Function (); +typedef void VFunction (); +typedef char *CPFunction (); +typedef char **CPPFunction (); + +#endif /* _FUNCTION_DEF */ + +/* New style. */ + +#if !defined (_RL_FUNCTION_TYPEDEF) +# define _RL_FUNCTION_TYPEDEF + +/* Bindable functions */ +typedef int rl_command_func_t PARAMS((int, int)); + +/* Typedefs for the completion system */ +typedef char *rl_compentry_func_t PARAMS((const char *, int)); +typedef char **rl_completion_func_t PARAMS((const char *, int, int)); + +typedef char *rl_quote_func_t PARAMS((char *, int, char *)); +typedef char *rl_dequote_func_t PARAMS((char *, int)); + +typedef int rl_compignore_func_t PARAMS((char **)); + +typedef void rl_compdisp_func_t PARAMS((char **, int, int)); + +/* Type for input and pre-read hook functions like rl_event_hook */ +typedef int rl_hook_func_t PARAMS((void)); + +/* Input function type */ +typedef int rl_getc_func_t PARAMS((FILE *)); + +/* Generic function that takes a character buffer (which could be the readline + line buffer) and an index into it (which could be rl_point) and returns + an int. */ +typedef int rl_linebuf_func_t PARAMS((char *, int)); + +/* `Generic' function pointer typedefs */ +typedef int rl_intfunc_t PARAMS((int)); +#define rl_ivoidfunc_t rl_hook_func_t +typedef int rl_icpfunc_t PARAMS((char *)); +typedef int rl_icppfunc_t PARAMS((char **)); + +typedef void rl_voidfunc_t PARAMS((void)); +typedef void rl_vintfunc_t PARAMS((int)); +typedef void rl_vcpfunc_t PARAMS((char *)); +typedef void rl_vcppfunc_t PARAMS((char **)); + +typedef char *rl_cpvfunc_t PARAMS((void)); +typedef char *rl_cpifunc_t PARAMS((int)); +typedef char *rl_cpcpfunc_t PARAMS((char *)); +typedef char *rl_cpcppfunc_t PARAMS((char **)); + +#endif /* _RL_FUNCTION_TYPEDEF */ + +#ifdef __cplusplus +} +#endif + +#endif /* _RL_TYPEDEFS_H_ */ diff --git a/vendors/readline/src/readline/rlwinsize.h b/vendors/readline/src/readline/rlwinsize.h new file mode 100644 index 0000000..7838154 --- /dev/null +++ b/vendors/readline/src/readline/rlwinsize.h @@ -0,0 +1,57 @@ +/* rlwinsize.h -- an attempt to isolate some of the system-specific defines + for `struct winsize' and TIOCGWINSZ. */ + +/* Copyright (C) 1997 Free Software Foundation, Inc. + + This file contains the Readline Library (the Library), a set of + routines for providing Emacs style line input to programs that ask + for it. + + The Library is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + The 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 + General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + +#if !defined (_RLWINSIZE_H_) +#define _RLWINSIZE_H_ + +#if defined (HAVE_CONFIG_H) +# include "config.h" +#endif + +/* Try to find the definitions of `struct winsize' and TIOGCWINSZ */ + +#if defined (GWINSZ_IN_SYS_IOCTL) && !defined (TIOCGWINSZ) +# include +#endif /* GWINSZ_IN_SYS_IOCTL && !TIOCGWINSZ */ + +#if defined (STRUCT_WINSIZE_IN_TERMIOS) && !defined (STRUCT_WINSIZE_IN_SYS_IOCTL) +# include +#endif /* STRUCT_WINSIZE_IN_TERMIOS && !STRUCT_WINSIZE_IN_SYS_IOCTL */ + +/* Not in either of the standard places, look around. */ +#if !defined (STRUCT_WINSIZE_IN_TERMIOS) && !defined (STRUCT_WINSIZE_IN_SYS_IOCTL) +# if defined (HAVE_SYS_STREAM_H) +# include +# endif /* HAVE_SYS_STREAM_H */ +# if defined (HAVE_SYS_PTEM_H) /* SVR4.2, at least, has it here */ +# include +# define _IO_PTEM_H /* work around SVR4.2 1.1.4 bug */ +# endif /* HAVE_SYS_PTEM_H */ +# if defined (HAVE_SYS_PTE_H) /* ??? */ +# include +# endif /* HAVE_SYS_PTE_H */ +#endif /* !STRUCT_WINSIZE_IN_TERMIOS && !STRUCT_WINSIZE_IN_SYS_IOCTL */ + +#endif /* _RL_WINSIZE_H */ + diff --git a/vendors/readline/src/readline/savestring.c b/vendors/readline/src/readline/savestring.c new file mode 100644 index 0000000..ee0495f --- /dev/null +++ b/vendors/readline/src/readline/savestring.c @@ -0,0 +1,38 @@ +/* savestring.c */ + +/* Copyright (C) 1998,2003 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library, a library for + reading lines of text with interactive input and history editing. + + The GNU Readline Library is free software; you can redistribute it + and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2, or + (at your option) any later version. + + The GNU Readline 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 General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ +#define READLINE_LIBRARY + +//*****************CHANGED commented out below************************ +//#include +#ifdef HAVE_STRING_H +# include +#endif +#include "xmalloc.h" + +/* Backwards compatibility, now that savestring has been removed from + all `public' readline header files. */ +char * +savestring (s) + const char *s; +{ + return ((char *)strcpy ((char *)xmalloc (1 + strlen (s)), (s))); +} diff --git a/vendors/readline/src/readline/search.c b/vendors/readline/src/readline/search.c new file mode 100644 index 0000000..ce7d54e --- /dev/null +++ b/vendors/readline/src/readline/search.c @@ -0,0 +1,475 @@ +/* search.c - code for non-incremental searching in emacs and vi modes. */ + +/* Copyright (C) 1992 Free Software Foundation, Inc. + + This file is part of the Readline Library (the Library), a set of + routines for providing Emacs style line input to programs that ask + for it. + + The Library is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + The 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 + General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include +#include + +#if defined (HAVE_UNISTD_H) +# include +#endif + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif + +#include "rldefs.h" +#include "rlmbutil.h" + +#include "readline.h" +#include "history.h" + +#include "rlprivate.h" +#include "xmalloc.h" + +#ifdef abs +# undef abs +#endif +#define abs(x) (((x) >= 0) ? (x) : -(x)) + +extern HIST_ENTRY *_rl_saved_line_for_history; + +/* Functions imported from the rest of the library. */ +extern int _rl_free_history_entry PARAMS((HIST_ENTRY *)); + +static char *noninc_search_string = (char *) NULL; +static int noninc_history_pos; + +static char *prev_line_found = (char *) NULL; + +static int rl_history_search_len; +static int rl_history_search_pos; +static char *history_search_string; +static int history_string_size; + +static void make_history_line_current PARAMS((HIST_ENTRY *)); +static int noninc_search_from_pos PARAMS((char *, int, int)); +static void noninc_dosearch PARAMS((char *, int)); +static void noninc_search PARAMS((int, int)); +static int rl_history_search_internal PARAMS((int, int)); +static void rl_history_search_reinit PARAMS((void)); + +/* Make the data from the history entry ENTRY be the contents of the + current line. This doesn't do anything with rl_point; the caller + must set it. */ +static void +make_history_line_current (entry) + HIST_ENTRY *entry; +{ +#if 0 + rl_replace_line (entry->line, 1); + rl_undo_list = (UNDO_LIST *)entry->data; +#else + _rl_replace_text (entry->line, 0, rl_end); + _rl_fix_point (1); +#endif + + if (_rl_saved_line_for_history) + _rl_free_history_entry (_rl_saved_line_for_history); + _rl_saved_line_for_history = (HIST_ENTRY *)NULL; +} + +/* Search the history list for STRING starting at absolute history position + POS. If STRING begins with `^', the search must match STRING at the + beginning of a history line, otherwise a full substring match is performed + for STRING. DIR < 0 means to search backwards through the history list, + DIR >= 0 means to search forward. */ +static int +noninc_search_from_pos (string, pos, dir) + char *string; + int pos, dir; +{ + int ret, old; + + if (pos < 0) + return -1; + + old = where_history (); + if (history_set_pos (pos) == 0) + return -1; + + RL_SETSTATE(RL_STATE_SEARCH); + if (*string == '^') + ret = history_search_prefix (string + 1, dir); + else + ret = history_search (string, dir); + RL_UNSETSTATE(RL_STATE_SEARCH); + + if (ret != -1) + ret = where_history (); + + history_set_pos (old); + return (ret); +} + +/* Search for a line in the history containing STRING. If DIR is < 0, the + search is backwards through previous entries, else through subsequent + entries. */ +static void +noninc_dosearch (string, dir) + char *string; + int dir; +{ + int oldpos, pos; + HIST_ENTRY *entry; + + if (string == 0 || *string == '\0' || noninc_history_pos < 0) + { + rl_ding (); + return; + } + + pos = noninc_search_from_pos (string, noninc_history_pos + dir, dir); + if (pos == -1) + { + /* Search failed, current history position unchanged. */ + rl_maybe_unsave_line (); + rl_clear_message (); + rl_point = 0; + rl_ding (); + return; + } + + noninc_history_pos = pos; + + oldpos = where_history (); + history_set_pos (noninc_history_pos); + entry = current_history (); +#if defined (VI_MODE) + if (rl_editing_mode != vi_mode) +#endif + history_set_pos (oldpos); + + make_history_line_current (entry); + + rl_point = 0; + rl_mark = rl_end; + + rl_clear_message (); +} + +/* Search non-interactively through the history list. DIR < 0 means to + search backwards through the history of previous commands; otherwise + the search is for commands subsequent to the current position in the + history list. PCHAR is the character to use for prompting when reading + the search string; if not specified (0), it defaults to `:'. */ +static void +noninc_search (dir, pchar) + int dir; + int pchar; +{ + int saved_point, saved_mark, c; + char *p; +#if defined (HANDLE_MULTIBYTE) + char mb[MB_LEN_MAX]; +#endif + + rl_maybe_save_line (); + saved_point = rl_point; + saved_mark = rl_mark; + + /* Clear the undo list, since reading the search string should create its + own undo list, and the whole list will end up being freed when we + finish reading the search string. */ + rl_undo_list = 0; + + /* Use the line buffer to read the search string. */ + rl_line_buffer[0] = 0; + rl_end = rl_point = 0; + + p = _rl_make_prompt_for_search (pchar ? pchar : ':'); + rl_message (p, 0, 0); + free (p); + +#define SEARCH_RETURN rl_restore_prompt (); RL_UNSETSTATE(RL_STATE_NSEARCH); return + + RL_SETSTATE(RL_STATE_NSEARCH); + /* Read the search string. */ + while (1) + { + RL_SETSTATE(RL_STATE_MOREINPUT); + c = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + c = _rl_read_mbstring (c, mb, MB_LEN_MAX); +#endif + + if (c == 0) + break; + + switch (c) + { + case CTRL('H'): + case RUBOUT: + if (rl_point == 0) + { + rl_maybe_unsave_line (); + rl_clear_message (); + rl_point = saved_point; + rl_mark = saved_mark; + SEARCH_RETURN; + } + _rl_rubout_char (1, c); + break; + + case CTRL('W'): + rl_unix_word_rubout (1, c); + break; + + case CTRL('U'): + rl_unix_line_discard (1, c); + break; + + case RETURN: + case NEWLINE: + goto dosearch; + /* NOTREACHED */ + break; + + case CTRL('C'): + case CTRL('G'): + rl_maybe_unsave_line (); + rl_clear_message (); + rl_point = saved_point; + rl_mark = saved_mark; + rl_ding (); + SEARCH_RETURN; + + default: +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + rl_insert_text (mb); + else +#endif + _rl_insert_char (1, c); + break; + } + (*rl_redisplay_function) (); + } + + dosearch: + rl_mark = saved_mark; + + /* If rl_point == 0, we want to re-use the previous search string and + start from the saved history position. If there's no previous search + string, punt. */ + if (rl_point == 0) + { + if (!noninc_search_string) + { + rl_ding (); + SEARCH_RETURN; + } + } + else + { + /* We want to start the search from the current history position. */ + noninc_history_pos = where_history (); + FREE (noninc_search_string); + noninc_search_string = savestring (rl_line_buffer); + } + + rl_restore_prompt (); + noninc_dosearch (noninc_search_string, dir); + RL_UNSETSTATE(RL_STATE_NSEARCH); +} + +/* Search forward through the history list for a string. If the vi-mode + code calls this, KEY will be `?'. */ +int +rl_noninc_forward_search (count, key) + int count, key; +{ + noninc_search (1, (key == '?') ? '?' : 0); + return 0; +} + +/* Reverse search the history list for a string. If the vi-mode code + calls this, KEY will be `/'. */ +int +rl_noninc_reverse_search (count, key) + int count, key; +{ + noninc_search (-1, (key == '/') ? '/' : 0); + return 0; +} + +/* Search forward through the history list for the last string searched + for. If there is no saved search string, abort. */ +int +rl_noninc_forward_search_again (count, key) + int count, key; +{ + if (!noninc_search_string) + { + rl_ding (); + return (-1); + } + noninc_dosearch (noninc_search_string, 1); + return 0; +} + +/* Reverse search in the history list for the last string searched + for. If there is no saved search string, abort. */ +int +rl_noninc_reverse_search_again (count, key) + int count, key; +{ + if (!noninc_search_string) + { + rl_ding (); + return (-1); + } + noninc_dosearch (noninc_search_string, -1); + return 0; +} + +static int +rl_history_search_internal (count, dir) + int count, dir; +{ + HIST_ENTRY *temp; + int ret, oldpos; + + rl_maybe_save_line (); + temp = (HIST_ENTRY *)NULL; + + /* Search COUNT times through the history for a line whose prefix + matches history_search_string. When this loop finishes, TEMP, + if non-null, is the history line to copy into the line buffer. */ + while (count) + { + ret = noninc_search_from_pos (history_search_string, rl_history_search_pos + dir, dir); + if (ret == -1) + break; + + /* Get the history entry we found. */ + rl_history_search_pos = ret; + oldpos = where_history (); + history_set_pos (rl_history_search_pos); + temp = current_history (); + history_set_pos (oldpos); + + /* Don't find multiple instances of the same line. */ + if (prev_line_found && STREQ (prev_line_found, temp->line)) + continue; + prev_line_found = temp->line; + count--; + } + + /* If we didn't find anything at all, return. */ + if (temp == 0) + { + rl_maybe_unsave_line (); + rl_ding (); + /* If you don't want the saved history line (last match) to show up + in the line buffer after the search fails, change the #if 0 to + #if 1 */ +#if 0 + if (rl_point > rl_history_search_len) + { + rl_point = rl_end = rl_history_search_len; + rl_line_buffer[rl_end] = '\0'; + rl_mark = 0; + } +#else + rl_point = rl_history_search_len; /* rl_maybe_unsave_line changes it */ + rl_mark = rl_end; +#endif + return 1; + } + + /* Copy the line we found into the current line buffer. */ + make_history_line_current (temp); + + rl_point = rl_history_search_len; + rl_mark = rl_end; + + return 0; +} + +static void +rl_history_search_reinit () +{ + rl_history_search_pos = where_history (); + rl_history_search_len = rl_point; + prev_line_found = (char *)NULL; + if (rl_point) + { + if (rl_history_search_len >= history_string_size - 2) + { + history_string_size = rl_history_search_len + 2; + history_search_string = (char *)xrealloc (history_search_string, history_string_size); + } + history_search_string[0] = '^'; + strncpy (history_search_string + 1, rl_line_buffer, rl_point); + history_search_string[rl_point + 1] = '\0'; + } + _rl_free_saved_history_line (); +} + +/* Search forward in the history for the string of characters + from the start of the line to rl_point. This is a non-incremental + search. */ +int +rl_history_search_forward (count, ignore) + int count, ignore; +{ + if (count == 0) + return (0); + + if (rl_last_func != rl_history_search_forward && + rl_last_func != rl_history_search_backward) + rl_history_search_reinit (); + + if (rl_history_search_len == 0) + return (rl_get_next_history (count, ignore)); + return (rl_history_search_internal (abs (count), (count > 0) ? 1 : -1)); +} + +/* Search backward through the history for the string of characters + from the start of the line to rl_point. This is a non-incremental + search. */ +int +rl_history_search_backward (count, ignore) + int count, ignore; +{ + if (count == 0) + return (0); + + if (rl_last_func != rl_history_search_forward && + rl_last_func != rl_history_search_backward) + rl_history_search_reinit (); + + if (rl_history_search_len == 0) + return (rl_get_previous_history (count, ignore)); + return (rl_history_search_internal (abs (count), (count > 0) ? -1 : 1)); +} diff --git a/vendors/readline/src/readline/shell.c b/vendors/readline/src/readline/shell.c new file mode 100644 index 0000000..3ab0f63 --- /dev/null +++ b/vendors/readline/src/readline/shell.c @@ -0,0 +1,245 @@ +/* shell.c -- readline utility functions that are normally provided by + bash when readline is linked as part of the shell. */ + +/* Copyright (C) 1997 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library, a library for + reading lines of text with interactive input and history editing. + + The GNU Readline Library is free software; you can redistribute it + and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2, or + (at your option) any later version. + + The GNU Readline 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 General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include +#include + +#if defined (HAVE_UNISTD_H) +# include +#endif /* HAVE_UNISTD_H */ + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +//***********************CHANGED**************************** +//#if defined (HAVE_STRING_H) +//# include +//#else +//# include +//#endif /* !HAVE_STRING_H */ + +#if defined (HAVE_STRING_H) +# include +#endif +#if defined (HAVE_STRINGS_H) +# include +#endif + +#if defined (HAVE_LIMITS_H) +# include +#endif + +#include +#if !defined (_WIN32) +#include +#else /* _WIN32 */ +#include +#endif /* _WIN32 */ + +#include + +#include "rlstdc.h" +#include "rlshell.h" +#include "xmalloc.h" + +#if !defined (HAVE_GETPW_DECLS) +extern struct passwd *getpwuid PARAMS((uid_t)); +#endif /* !HAVE_GETPW_DECLS */ + +#ifndef NULL +# define NULL 0 +#endif + +#ifndef CHAR_BIT +# define CHAR_BIT 8 +#endif + +/* Nonzero if the integer type T is signed. */ +#define TYPE_SIGNED(t) (! ((t) 0 < (t) -1)) + +/* Bound on length of the string representing an integer value of type T. + Subtract one for the sign bit if T is signed; + 302 / 1000 is log10 (2) rounded up; + add one for integer division truncation; + add one more for a minus sign if t is signed. */ +#define INT_STRLEN_BOUND(t) \ + ((sizeof (t) * CHAR_BIT - TYPE_SIGNED (t)) * 302 / 1000 \ + + 1 + TYPE_SIGNED (t)) + +/* All of these functions are resolved from bash if we are linking readline + as part of bash. */ + +/* Does shell-like quoting using single quotes. */ +char * +sh_single_quote (string) + char *string; +{ + register int c; + char *result, *r, *s; + + result = (char *)xmalloc (3 + (4 * strlen (string))); + r = result; + *r++ = '\''; + + for (s = string; s && (c = *s); s++) + { + *r++ = c; + + if (c == '\'') + { + *r++ = '\\'; /* insert escaped single quote */ + *r++ = '\''; + *r++ = '\''; /* start new quoted string */ + } + } + + *r++ = '\''; + *r = '\0'; + + return (result); +} + +/* Set the environment variables LINES and COLUMNS to lines and cols, + respectively. */ +void +sh_set_lines_and_columns (lines, cols) + int lines, cols; +{ + char *b; + +#if defined (HAVE_PUTENV) + b = (char *)xmalloc (INT_STRLEN_BOUND (int) + sizeof ("LINES=") + 1); + sprintf (b, "LINES=%d", lines); + putenv (b); + + b = (char *)xmalloc (INT_STRLEN_BOUND (int) + sizeof ("COLUMNS=") + 1); + sprintf (b, "COLUMNS=%d", cols); + putenv (b); +#else /* !HAVE_PUTENV */ +# if defined (HAVE_SETENV) + b = (char *)xmalloc (INT_STRLEN_BOUND (int) + 1); + sprintf (b, "%d", lines); + setenv ("LINES", b, 1); + free (b); + + b = (char *)xmalloc (INT_STRLEN_BOUND (int) + 1); + sprintf (b, "%d", cols); + setenv ("COLUMNS", b, 1); + free (b); +# endif /* HAVE_SETENV */ +#endif /* !HAVE_PUTENV */ +} + +char * +sh_get_env_value (varname) + const char *varname; +{ + return ((char *)getenv (varname)); +} + +char * +sh_get_home_dir () +{ + char *home_dir; +#if !defined (_WIN32) + struct passwd *entry; + + home_dir = (char *)NULL; + entry = getpwuid (getuid ()); + if (entry) + home_dir = entry->pw_dir; +#else + home_dir = sh_get_env_value ("HOME"); +#endif /* !_WIN32 */ + return (home_dir); +} + +#if !defined (O_NDELAY) +# if defined (FNDELAY) +# define O_NDELAY FNDELAY +# endif +#endif + +#if !defined (_WIN32) +int +sh_unset_nodelay_mode (fd) + int fd; +{ + int flags, bflags; + + if ((flags = fcntl (fd, F_GETFL, 0)) < 0) + return -1; + + bflags = 0; + +#ifdef O_NONBLOCK + bflags |= O_NONBLOCK; +#endif + +#ifdef O_NDELAY + bflags |= O_NDELAY; +#endif + + if (flags & bflags) + { + flags &= ~bflags; + return (fcntl (fd, F_SETFL, flags)); + } + + return 0; +} + +#else /* !_WIN32 */ + +char * +_rl_get_user_registry_string (char *keyName, char* valName) +{ + char *result = NULL; + HKEY subKey; + if ( keyName && (RegOpenKeyEx(HKEY_CURRENT_USER, keyName, 0, KEY_READ, &subKey) + == ERROR_SUCCESS) ) + { + DWORD type; + char *chtry = NULL; + DWORD bufSize = 0; + + if ( (RegQueryValueExA(subKey, valName, NULL, &type, chtry, &bufSize) + == ERROR_SUCCESS) && (type == REG_SZ) ) + { + if ( (chtry = (char *)xmalloc(bufSize)) + && (RegQueryValueExA(subKey, valName, NULL, &type, chtry, &bufSize) + == ERROR_SUCCESS) ) + result = chtry; + } + } + return result; +} +#endif /* !_WIN32 */ diff --git a/vendors/readline/src/readline/shlib/Makefile.in b/vendors/readline/src/readline/shlib/Makefile.in new file mode 100644 index 0000000..f870e50 --- /dev/null +++ b/vendors/readline/src/readline/shlib/Makefile.in @@ -0,0 +1,451 @@ +## -*- text -*- ## +# Makefile for the GNU readline library shared library support. +# +# Copyright (C) 1998-2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. + +PACKAGE = @PACKAGE_NAME@ +VERSION = @PACKAGE_VERSION@ +MAJOR=$(shell echo $(RL_LIBRARY_VERSION) | sed -e "s/\..*$$//")\ +MINOR=$(shell echo $(RL_LIBRARY_VERSION) | sed -e "s/^[^\.]*\.0*\([0-9]\+\).*$$/\1/") \ +VERSADD = -Wl,--major-image-version=$(MAJOR) -Wl,--minor-image-version=$(MINOR) + +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_VERSION = @PACKAGE_VERSION@ + +RL_LIBRARY_VERSION = @LIBVERSION@ +RL_LIBRARY_NAME = readline + +srcdir = @srcdir@ +resdir = ../res +VPATH = @top_srcdir@ @srcdir@ $(resdir) +topdir = @top_srcdir@ +BUILD_DIR = @BUILD_DIR@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ + +CC = @CC@ +RANLIB = @RANLIB@ +AR = @AR@ +ARFLAGS = @ARFLAGS@ +RM = rm -f +CP = cp -fp +MV = mv +LN = cp -fp + +SHELL = @MAKE_SHELL@ + +host_os = @host_os@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +includedir = @includedir@ +libdir = @libdir@ +datadir = @datadir@ +localedir = $(datadir)/locale + +# Support an alternate destination root directory for package building +DESTDIR = + +CFLAGS = @CFLAGS@ +LOCAL_CFLAGS = @LOCAL_CFLAGS@ -DRL_LIBRARY_VERSION='"$(RL_LIBRARY_VERSION)"' +CPPFLAGS = @CPPFLAGS@ +LDFLAGS = @LDFLAGS@ @LOCAL_LDFLAGS@ @CFLAGS@ + +DEFS = @DEFS@ +LOCAL_DEFS = @LOCAL_DEFS@ + +# +# These values are generated for configure by ${topdir}/support/shobj-conf. +# If your system is not supported by that script, but includes facilities for +# dynamic loading of shared objects, please update the script and send the +# changes to bash-maintainers@gnu.org. +# +SHOBJ_CC = @SHOBJ_CC@ +SHOBJ_CFLAGS = @SHOBJ_CFLAGS@ -DBUILD_READLINE_DLL +SHOBJ_LD = o2dll + +SHOBJ_LDFLAGS = @SHOBJ_LDFLAGS@ +SHOBJ_XLDFLAGS = @SHOBJ_XLDFLAGS@ +SHOBJ_LIBS = @SHOBJ_LIBS@ + +SHLIB_XLDFLAGS = @LDFLAGS@ @SHLIB_XLDFLAGS@ +SHLIB_LIBS = @SHLIB_LIBS@ +SHLIB_LIBSUFF = @SHLIB_LIBSUFF@ + +SHLIB_LIBVERSION = dll + +SHLIB_STATUS = @SHLIB_STATUS@ + +# shared library versioning +SHLIB_MAJOR= @SHLIB_MAJOR@ +# shared library systems like SVR4's do not use minor versions +SHLIB_MINOR= .@SHLIB_MINOR@ + +# For libraries which include headers from other libraries. +INCLUDES = -I. -I.. -I$(topdir) + +CCFLAGS = $(DEFS) $(LOCAL_DEFS) $(CPPFLAGS) $(INCLUDES) $(LOCAL_CFLAGS) $(CFLAGS) + +.SUFFIXES: .so + +.c.so: + ${RM} $@ + $(SHOBJ_CC) -c $(CCFLAGS) $(SHOBJ_CFLAGS) -o $*.o $< + $(MV) $*.o $@ + +# The name of the main library target. + +SHARED_READLINE = readline$(SHLIB_MAJOR).$(SHLIB_LIBVERSION) +SHARED_HISTORY = history$(SHLIB_MAJOR).$(SHLIB_LIBVERSION) +SHARED_LIBS = $(SHARED_READLINE) $(SHARED_HISTORY) + +# The C code source files for this library. +CSOURCES = $(topdir)/readline.c $(topdir)/funmap.c $(topdir)/keymaps.c \ + $(topdir)/vi_mode.c $(topdir)/parens.c $(topdir)/rltty.c \ + $(topdir)/complete.c $(topdir)/bind.c $(topdir)/isearch.c \ + $(topdir)/display.c $(topdir)/signals.c $(topdir)/emacs_keymap.c \ + $(topdir)/vi_keymap.c $(topdir)/util.c $(topdir)/kill.c \ + $(topdir)/undo.c $(topdir)/macro.c $(topdir)/input.c \ + $(topdir)/callback.c $(topdir)/terminal.c $(topdir)/xmalloc.c \ + $(topdir)/history.c $(topdir)/histsearch.c $(topdir)/histexpand.c \ + $(topdir)/histfile.c $(topdir)/nls.c $(topdir)/search.c \ + $(topdir)/shell.c $(topdir)/savestring.c $(topdir)/tilde.c \ + $(topdir)/text.c $(topdir)/misc.c $(topdir)/compat.c \ + $(topdir)/mbutil.c + +# The header files for this library. +HSOURCES = readline.h rldefs.h chardefs.h keymaps.h history.h histlib.h \ + posixstat.h posixdir.h posixjmp.h tilde.h rlconf.h rltty.h \ + ansi_stdlib.h tcap.h xmalloc.h rlprivate.h rlshell.h rlmbutil.h + +SHARED_HISTOBJ = history.so histexpand.so histfile.so histsearch.so shell.so \ + mbutil.so history-dllversion.so +SHARED_TILDEOBJ = tilde.so +SHARED_OBJ = readline.so vi_mode.so funmap.so keymaps.so parens.so search.so \ + rltty.so complete.so bind.so isearch.so display.so signals.so \ + util.so kill.so undo.so macro.so input.so callback.so terminal.so \ + text.so nls.so misc.so xmalloc.so $(SHARED_HISTOBJ) $(SHARED_TILDEOBJ) \ + compat.so readline-dllversion.so + +########################################################################## + +all: $(SHLIB_STATUS) + +supported: $(SHARED_LIBS) + +unsupported: + @echo "Your system and compiler (${host_os}-${CC}) are not supported by the" + @echo "${topdir}/support/shobj-conf script." + @echo "If your operating system provides facilities for creating" + @echo "shared libraries, please update the script and re-run configure." + @echo "Please send the changes you made to bash-maintainers@gnu.org" + @echo "for inclusion in future bash and readline releases." + +$(SHARED_READLINE): $(SHARED_OBJ) + $(RM) $@ + $(SHOBJ_LD) -o readline -l libreadline $(SHARED_OBJ) ${SHOBJ_LDFLAGS} ${SHLIB_XLDFLAGS} $(SHLIB_LIBS) + +$(SHARED_HISTORY): $(SHARED_HISTOBJ) xmalloc.so + $(RM) $@ + $(SHOBJ_LD) -o history -l libhistory $(SHARED_HISTOBJ) ${SHOBJ_LDFLAGS} ${SHLIB_XLDFLAGS} xmalloc.so $(SHLIB_LIBS) + +# Since tilde.c is shared between readline and bash, make sure we compile +# it with the right flags when it's built as part of readline +tilde.so: tilde.c + ${RM} $@ + $(SHOBJ_CC) -c $(CCFLAGS) $(SHOBJ_CFLAGS) -DREADLINE_LIBRARY -c -o tilde.o $(topdir)/tilde.c + $(MV) tilde.o $@ + +installdirs: $(topdir)/support/mkdirs + -$(SHELL) $(topdir)/support/mkdirs $(DESTDIR)$(libdir) + +install: installdirs $(SHLIB_STATUS) + $(SHELL) $(topdir)/support/shlib-install -O $(host_os) -d $(DESTDIR)$(bindir) -i "$(INSTALL_DATA)" $(SHARED_HISTORY) + $(SHELL) $(topdir)/support/shlib-install -O $(host_os) -d $(DESTDIR)$(bindir) -i "$(INSTALL_DATA)" $(SHARED_READLINE) + @echo install: you may need to run ldconfig + +uninstall: + $(SHELL) $(topdir)/support/shlib-install -O $(host_os) -d $(DESTDIR)$(bindir) -U $(SHARED_HISTORY) + $(SHELL) $(topdir)/support/shlib-install -O $(host_os) -d $(DESTDIR)$(bindir) -U $(SHARED_READLINE) + @echo uninstall: you may need to run ldconfig + +clean mostlyclean: force + $(RM) $(SHARED_OBJ) $(SHARED_LIBS) + +distclean maintainer-clean: clean + $(RM) Makefile + +force: + +# Tell versions [3.59,3.63) of GNU make not to export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: + +# Dependencies +bind.so: $(topdir)/ansi_stdlib.h $(topdir)/posixstat.h +bind.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h +bind.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +bind.so: $(topdir)/rltypedefs.h +bind.so: $(topdir)/tilde.h $(topdir)/history.h +compat.so: $(topdir)/rlstdc.h +callback.so: $(topdir)/rlconf.h +callback.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h +callback.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +callback.so: $(topdir)/rltypedefs.h +callback.so: $(topdir)/tilde.h +complete.so: $(topdir)/ansi_stdlib.h posixdir.h $(topdir)/posixstat.h +complete.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h +complete.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +complete.so: $(topdir)/rltypedefs.h +complete.so: $(topdir)/tilde.h +display.so: $(topdir)/ansi_stdlib.h $(topdir)/posixstat.h +display.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h +display.so: $(topdir)/tcap.h +display.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +display.so: $(topdir)/rltypedefs.h +display.so: $(topdir)/tilde.h $(topdir)/history.h +funmap.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +funmap.so: $(topdir)/rltypedefs.h +funmap.so: $(topdir)/rlconf.h $(topdir)/ansi_stdlib.h +funmap.so: ${BUILD_DIR}/config.h $(topdir)/tilde.h +histexpand.so: $(topdir)/ansi_stdlib.h +histexpand.so: $(topdir)/history.h $(topdir)/histlib.h $(topdir)/rltypedefs.h +histexpand.so: ${BUILD_DIR}/config.h +histfile.so: $(topdir)/ansi_stdlib.h +histfile.so: $(topdir)/history.h $(topdir)/histlib.h $(topdir)/rltypedefs.h +histfile.so: ${BUILD_DIR}/config.h +history.so: $(topdir)/ansi_stdlib.h +history.so: $(topdir)/history.h $(topdir)/histlib.h $(topdir)/rltypedefs.h +history.so: ${BUILD_DIR}/config.h +histsearch.so: $(topdir)/ansi_stdlib.h +histsearch.so: $(topdir)/history.h $(topdir)/histlib.h $(topdir)/rltypedefs.h +histsearch.so: ${BUILD_DIR}/config.h +input.so: $(topdir)/ansi_stdlib.h +input.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h +input.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +input.so: $(topdir)/rltypedefs.h +input.so: $(topdir)/tilde.h +isearch.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h +isearch.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +isearch.so: $(topdir)/rltypedefs.h +isearch.so: $(topdir)/ansi_stdlib.h $(topdir)/history.h $(topdir)/tilde.h +keymaps.so: emacs_keymap.c vi_keymap.c +keymaps.so: $(topdir)/keymaps.h $(topdir)/chardefs.h $(topdir)/rlconf.h +keymaps.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +keymaps.so: $(topdir)/rltypedefs.h +keymaps.so: ${BUILD_DIR}/config.h $(topdir)/ansi_stdlib.h $(topdir)/tilde.h +kill.so: $(topdir)/ansi_stdlib.h +kill.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h +kill.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +kill.so: $(topdir)/tilde.h $(topdir)/history.h $(topdir)/rltypedefs.h +macro.so: $(topdir)/ansi_stdlib.h +macro.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h +macro.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +macro.so: $(topdir)/tilde.h $(topdir)/history.h $(topdir)/rltypedefs.h +mbutil.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h +mbutil.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/rltypedefs.h +mbutil.so: $(topdir)/chardefs.h $(topdir)/rlstdc.h +misc.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +misc.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h +misc.so: $(topdir)/rltypedefs.h +misc.so: $(topdir)/history.h $(topdir)/tilde.h $(topdir)/ansi_stdlib.h +nls.so: $(topdir)/ansi_stdlib.h +nls.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h +nls.o: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +nls.o: $(topdir)/rltypedefs.h +nls.o: $(topdir)/tilde.h $(topdir)/history.h $(topdir)/rlstdc.h +parens.so: $(topdir)/rlconf.h ${BUILD_DIR}/config.h +parens.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +parens.so: $(topdir)/rltypedefs.h +parens.so: $(topdir)/tilde.h +rltty.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h +rltty.so: $(topdir)/rltty.h $(topdir)/tilde.h +rltty.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +rltty.so: $(topdir)/rltypedefs.h +search.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h +search.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +search.so: $(topdir)/ansi_stdlib.h $(topdir)/history.h $(topdir)/tilde.h +search.so: $(topdir)/rltypedefs.h +signals.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h +signals.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +signals.so: $(topdir)/history.h $(topdir)/tilde.h +signals.so: $(topdir)/rltypedefs.h +terminal.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h +terminal.so: $(topdir)/tcap.h +terminal.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +terminal.so: $(topdir)/tilde.h $(topdir)/history.h +terminal.so: $(topdir)/rltypedefs.h +text.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +text.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h +text.so: $(topdir)/rltypedefs.h +text.so: $(topdir)/history.h $(topdir)/tilde.h $(topdir)/ansi_stdlib.h +tilde.so: $(topdir)/ansi_stdlib.h ${BUILD_DIR}/config.h $(topdir)/tilde.h +undo.so: $(topdir)/ansi_stdlib.h +undo.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h +undo.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +undo.so: $(topdir)/rltypedefs.h +undo.so: $(topdir)/tilde.h $(topdir)/history.h +util.so: $(topdir)/posixjmp.h $(topdir)/ansi_stdlib.h +util.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h +util.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +util.so: $(topdir)/rltypedefs.h $(topdir)/tilde.h +vi_mode.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h +vi_mode.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h +vi_mode.so: $(topdir)/history.h $(topdir)/ansi_stdlib.h $(topdir)/tilde.h +vi_mode.so: $(topdir)/rltypedefs.h +xmalloc.so: ${BUILD_DIR}/config.h +xmalloc.so: $(topdir)/ansi_stdlib.h + +bind.so: $(topdir)/rlshell.h +histfile.so: $(topdir)/rlshell.h +nls.so: $(topdir)/rlshell.h +readline.so: $(topdir)/rlshell.h +shell.so: $(topdir)/rlshell.h +terminal.so: $(topdir)/rlshell.h +histexpand.so: $(topdir)/rlshell.h + +bind.so: $(topdir)/rlprivate.h +callback.so: $(topdir)/rlprivate.h +complete.so: $(topdir)/rlprivate.h +display.so: $(topdir)/rlprivate.h +input.so: $(topdir)/rlprivate.h +isearch.so: $(topdir)/rlprivate.h +kill.so: $(topdir)/rlprivate.h +macro.so: $(topdir)/rlprivate.h +mbutil.so: $(topdir)/rlprivate.h +misc.so: $(topdir)/rlprivate.h +nls.so: $(topdir)/rlprivate.h +parens.so: $(topdir)/rlprivate.h +readline.so: $(topdir)/rlprivate.h +rltty.so: $(topdir)/rlprivate.h +search.so: $(topdir)/rlprivate.h +signals.so: $(topdir)/rlprivate.h +terminal.so: $(topdir)/rlprivate.h +text.so: $(topdir)/rlprivate.h +undo.so: $(topdir)/rlprivate.h +util.so: $(topdir)/rlprivate.h +vi_mode.so: $(topdir)/rlprivate.h + +bind.so: $(topdir)/xmalloc.h +complete.so: $(topdir)/xmalloc.h +display.so: $(topdir)/xmalloc.h +funmap.so: $(topdir)/xmalloc.h +histexpand.so: $(topdir)/xmalloc.h +histfile.so: $(topdir)/xmalloc.h +history.so: $(topdir)/xmalloc.h +input.so: $(topdir)/xmalloc.h +isearch.so: $(topdir)/xmalloc.h +keymaps.so: $(topdir)/xmalloc.h +kill.so: $(topdir)/xmalloc.h +macro.so: $(topdir)/xmalloc.h +mbutil.so: $(topdir)/xmalloc.h +misc.so: $(topdir)/xmalloc.h +readline.so: $(topdir)/xmalloc.h +savestring.so: $(topdir)/xmalloc.h +search.so: $(topdir)/xmalloc.h +shell.so: $(topdir)/xmalloc.h +terminal.so: $(topdir)/xmalloc.h +text.so: $(topdir)/xmalloc.h +tilde.so: $(topdir)/xmalloc.h +undo.so: $(topdir)/xmalloc.h +util.so: $(topdir)/xmalloc.h +vi_mode.so: $(topdir)/xmalloc.h +xmalloc.so: $(topdir)/xmalloc.h + +complete.o: $(topdir)/rlmbutil.h +display.o: $(topdir)/rlmbutil.h +histexpand.o: $(topdir)/rlmbutil.h +input.o: $(topdir)/rlmbutil.h +isearch.o: $(topdir)/rlmbutil.h +mbutil.o: $(topdir)/rlmbutil.h +misc.o: $(topdir)/rlmbutil.h +readline.o: $(topdir)/rlmbutil.h +search.o: $(topdir)/rlmbutil.h +text.o: $(topdir)/rlmbutil.h +vi_mode.o: $(topdir)/rlmbutil.h + +bind.so: $(topdir)/bind.c +callback.so: $(topdir)/callback.c +compat.so: $(topdir)/compat.c +complete.so: $(topdir)/complete.c +display.so: $(topdir)/display.c +funmap.so: $(topdir)/funmap.c +input.so: $(topdir)/input.c +isearch.so: $(topdir)/isearch.c +keymaps.so: $(topdir)/keymaps.c $(topdir)/emacs_keymap.c $(topdir)/vi_keymap.c +kill.so: $(topdir)/kill.c +macro.so: $(topdir)/macro.c +mbutil.so: $(topdir)/mbutil.c +misc.so: $(topdir)/mbutil.c +nls.so: $(topdir)/nls.c +parens.so: $(topdir)/parens.c +readline.so: $(topdir)/readline.c +rltty.so: $(topdir)/rltty.c +savestring.so: $(topdir)/savestring.c +search.so: $(topdir)/search.c +shell.so: $(topdir)/shell.c +signals.so: $(topdir)/signals.c +terminal.so: $(topdir)/terminal.c +text.so: $(topdir)/text.c +tilde.so: $(topdir)/tilde.c +undo.so: $(topdir)/undo.c +util.so: $(topdir)/util.c +vi_mode.so: $(topdir)/vi_mode.c +xmalloc.so: $(topdir)/xmalloc.c + +histexpand.so: $(topdir)/histexpand.c +histfile.so: $(topdir)/histfile.c +history.so: $(topdir)/history.c +histsearch.so: $(topdir)/histsearch.c + +bind.so: bind.c +callback.so: callback.c +comapt.so: compat.c +complete.so: complete.c +display.so: display.c +funmap.so: funmap.c +input.so: input.c +isearch.so: isearch.c +keymaps.so: keymaps.c emacs_keymap.c vi_keymap.c +kill.so: kill.c +macro.so: macro.c +mbutil.so: mbutil.c +misc.so: misc.c +nls.so: nls.c +parens.so: parens.c +readline.so: readline.c +rltty.so: rltty.c +savestring.so: savestring.c +search.so: search.c +signals.so: signals.c +shell.so: shell.c +terminal.so: terminal.c +text.so: text.c +tilde.so: tilde.c +undo.so: undo.c +util.so: util.c +vi_mode.so: vi_mode.c +xmalloc.so: xmalloc.c + +histexpand.so: histexpand.c +histfile.so: histfile.c +history.so: history.c +histsearch.so: histsearch.c diff --git a/vendors/readline/src/readline/signals.c b/vendors/readline/src/readline/signals.c new file mode 100644 index 0000000..42baec8 --- /dev/null +++ b/vendors/readline/src/readline/signals.c @@ -0,0 +1,456 @@ +/* signals.c -- signal handling support for readline. */ + +/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library, a library for + reading lines of text with interactive input and history editing. + + The GNU Readline Library is free software; you can redistribute it + and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2, or + (at your option) any later version. + + The GNU Readline 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 General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include /* Just for NULL. Yuck. */ +#include +#include + +#if defined (HAVE_UNISTD_H) +# include +#endif /* HAVE_UNISTD_H */ + +/* System-specific feature definitions and include files. */ +#include "rldefs.h" + +#if defined (GWINSZ_IN_SYS_IOCTL) +# include +#endif /* GWINSZ_IN_SYS_IOCTL */ + +#if defined (HANDLE_SIGNALS) +/* Some standard library routines. */ +#include "readline.h" +#include "history.h" + +#include "rlprivate.h" + +#if !defined (RETSIGTYPE) +# if defined (VOID_SIGHANDLER) +# define RETSIGTYPE void +# else +# define RETSIGTYPE int +# endif /* !VOID_SIGHANDLER */ +#endif /* !RETSIGTYPE */ + +#if defined (VOID_SIGHANDLER) +# define SIGHANDLER_RETURN return +#else +# define SIGHANDLER_RETURN return (0) +#endif + +/* This typedef is equivalent to the one for Function; it allows us + to say SigHandler *foo = signal (SIGKILL, SIG_IGN); */ +typedef RETSIGTYPE SigHandler (); + +#if defined (HAVE_POSIX_SIGNALS) +typedef struct sigaction sighandler_cxt; +# define rl_sigaction(s, nh, oh) sigaction(s, nh, oh) +#else +typedef struct { SigHandler *sa_handler; int sa_mask, sa_flags; } sighandler_cxt; +# define sigemptyset(m) +#endif /* !HAVE_POSIX_SIGNALS */ + +#ifndef SA_RESTART +# define SA_RESTART 0 +#endif + +#if !defined (_WIN32) +static SigHandler *rl_set_sighandler PARAMS((int, SigHandler *, sighandler_cxt *)); +static void rl_maybe_set_sighandler PARAMS((int, SigHandler *, sighandler_cxt *)); +#endif + +/* Exported variables for use by applications. */ + +/* If non-zero, readline will install its own signal handlers for + SIGINT, SIGTERM, SIGQUIT, SIGALRM, SIGTSTP, SIGTTIN, and SIGTTOU. */ +int rl_catch_signals = 1; + +/* If non-zero, readline will install a signal handler for SIGWINCH. */ +#ifdef SIGWINCH +int rl_catch_sigwinch = 1; +#else +int rl_catch_sigwinch = 0; /* for the readline state struct in readline.c */ +#endif + +static int signals_set_flag; +#ifdef SIGWINCH +static int sigwinch_set_flag; +#endif + +#if !defined (_WIN32) +/* **************************************************************** */ +/* */ +/* Signal Handling */ +/* */ +/* **************************************************************** */ + +static sighandler_cxt old_int, old_term, old_alrm, old_quit; +#if defined (SIGTSTP) +static sighandler_cxt old_tstp, old_ttou, old_ttin; +#endif +#if defined (SIGWINCH) +static sighandler_cxt old_winch; +#endif + +/* Readline signal handler functions. */ + +static RETSIGTYPE +rl_signal_handler (sig) + int sig; +{ +#if defined (HAVE_POSIX_SIGNALS) + sigset_t set; +#else /* !HAVE_POSIX_SIGNALS */ +# if defined (HAVE_BSD_SIGNALS) + long omask; +# else /* !HAVE_BSD_SIGNALS */ + sighandler_cxt dummy_cxt; /* needed for rl_set_sighandler call */ +# endif /* !HAVE_BSD_SIGNALS */ +#endif /* !HAVE_POSIX_SIGNALS */ + + RL_SETSTATE(RL_STATE_SIGHANDLER); + +#if !defined (HAVE_BSD_SIGNALS) && !defined (HAVE_POSIX_SIGNALS) + /* Since the signal will not be blocked while we are in the signal + handler, ignore it until rl_clear_signals resets the catcher. */ + if (sig == SIGINT || sig == SIGALRM) + rl_set_sighandler (sig, SIG_IGN, &dummy_cxt); +#endif /* !HAVE_BSD_SIGNALS && !HAVE_POSIX_SIGNALS */ + + switch (sig) + { + case SIGINT: + rl_free_line_state (); + /* FALLTHROUGH */ + +#if defined (SIGTSTP) + case SIGTSTP: + case SIGTTOU: + case SIGTTIN: +#endif /* SIGTSTP */ + case SIGALRM: + case SIGTERM: + case SIGQUIT: + rl_cleanup_after_signal (); + +#if defined (HAVE_POSIX_SIGNALS) + sigprocmask (SIG_BLOCK, (sigset_t *)NULL, &set); + sigdelset (&set, sig); +#else /* !HAVE_POSIX_SIGNALS */ +# if defined (HAVE_BSD_SIGNALS) + omask = sigblock (0); +# endif /* HAVE_BSD_SIGNALS */ +#endif /* !HAVE_POSIX_SIGNALS */ + +#if defined (__EMX__) + signal (sig, SIG_ACK); +#endif + + kill (getpid (), sig); + + /* Let the signal that we just sent through. */ +#if defined (HAVE_POSIX_SIGNALS) + sigprocmask (SIG_SETMASK, &set, (sigset_t *)NULL); +#else /* !HAVE_POSIX_SIGNALS */ +# if defined (HAVE_BSD_SIGNALS) + sigsetmask (omask & ~(sigmask (sig))); +# endif /* HAVE_BSD_SIGNALS */ +#endif /* !HAVE_POSIX_SIGNALS */ + + rl_reset_after_signal (); + } + + RL_UNSETSTATE(RL_STATE_SIGHANDLER); + SIGHANDLER_RETURN; +} + +#if defined (SIGWINCH) +static RETSIGTYPE +rl_sigwinch_handler (sig) + int sig; +{ + SigHandler *oh; + +#if defined (MUST_REINSTALL_SIGHANDLERS) + sighandler_cxt dummy_winch; + + /* We don't want to change old_winch -- it holds the state of SIGWINCH + disposition set by the calling application. We need this state + because we call the application's SIGWINCH handler after updating + our own idea of the screen size. */ + rl_set_sighandler (SIGWINCH, rl_sigwinch_handler, &dummy_winch); +#endif + + RL_SETSTATE(RL_STATE_SIGHANDLER); + rl_resize_terminal (); + + /* If another sigwinch handler has been installed, call it. */ + oh = (SigHandler *)old_winch.sa_handler; + if (oh && oh != (SigHandler *)SIG_IGN && oh != (SigHandler *)SIG_DFL) + (*oh) (sig); + + RL_UNSETSTATE(RL_STATE_SIGHANDLER); + SIGHANDLER_RETURN; +} +#endif /* SIGWINCH */ + +/* Functions to manage signal handling. */ + +#if !defined (HAVE_POSIX_SIGNALS) +static int +rl_sigaction (sig, nh, oh) + int sig; + sighandler_cxt *nh, *oh; +{ + oh->sa_handler = signal (sig, nh->sa_handler); + return 0; +} +#endif /* !HAVE_POSIX_SIGNALS */ + +/* Set up a readline-specific signal handler, saving the old signal + information in OHANDLER. Return the old signal handler, like + signal(). */ +static SigHandler * +rl_set_sighandler (sig, handler, ohandler) + int sig; + SigHandler *handler; + sighandler_cxt *ohandler; +{ + sighandler_cxt old_handler; +#if defined (HAVE_POSIX_SIGNALS) + struct sigaction act; + + act.sa_handler = handler; + act.sa_flags = (sig == SIGWINCH) ? SA_RESTART : 0; + sigemptyset (&act.sa_mask); + sigemptyset (&ohandler->sa_mask); + sigaction (sig, &act, &old_handler); +#else + old_handler.sa_handler = (SigHandler *)signal (sig, handler); +#endif /* !HAVE_POSIX_SIGNALS */ + + /* XXX -- assume we have memcpy */ + /* If rl_set_signals is called twice in a row, don't set the old handler to + rl_signal_handler, because that would cause infinite recursion. */ + if (handler != rl_signal_handler || old_handler.sa_handler != rl_signal_handler) + memcpy (ohandler, &old_handler, sizeof (sighandler_cxt)); + + return (ohandler->sa_handler); +} + +static void +rl_maybe_set_sighandler (sig, handler, ohandler) + int sig; + SigHandler *handler; + sighandler_cxt *ohandler; +{ + sighandler_cxt dummy; + SigHandler *oh; + + sigemptyset (&dummy.sa_mask); + oh = rl_set_sighandler (sig, handler, ohandler); + if (oh == (SigHandler *)SIG_IGN) + rl_sigaction (sig, ohandler, &dummy); +} + +int +rl_set_signals () +{ + sighandler_cxt dummy; + SigHandler *oh; + + if (rl_catch_signals && signals_set_flag == 0) + { + rl_maybe_set_sighandler (SIGINT, rl_signal_handler, &old_int); + rl_maybe_set_sighandler (SIGTERM, rl_signal_handler, &old_term); + rl_maybe_set_sighandler (SIGQUIT, rl_signal_handler, &old_quit); + + oh = rl_set_sighandler (SIGALRM, rl_signal_handler, &old_alrm); + if (oh == (SigHandler *)SIG_IGN) + rl_sigaction (SIGALRM, &old_alrm, &dummy); +#if defined (HAVE_POSIX_SIGNALS) && defined (SA_RESTART) + /* If the application using readline has already installed a signal + handler with SA_RESTART, SIGALRM will cause reads to be restarted + automatically, so readline should just get out of the way. Since + we tested for SIG_IGN above, we can just test for SIG_DFL here. */ + if (oh != (SigHandler *)SIG_DFL && (old_alrm.sa_flags & SA_RESTART)) + rl_sigaction (SIGALRM, &old_alrm, &dummy); +#endif /* HAVE_POSIX_SIGNALS */ + +#if defined (SIGTSTP) + rl_maybe_set_sighandler (SIGTSTP, rl_signal_handler, &old_tstp); +#endif /* SIGTSTP */ + +#if defined (SIGTTOU) + rl_maybe_set_sighandler (SIGTTOU, rl_signal_handler, &old_ttou); +#endif /* SIGTTOU */ + +#if defined (SIGTTIN) + rl_maybe_set_sighandler (SIGTTIN, rl_signal_handler, &old_ttin); +#endif /* SIGTTIN */ + + signals_set_flag = 1; + } + +#if defined (SIGWINCH) + if (rl_catch_sigwinch && sigwinch_set_flag == 0) + { + rl_maybe_set_sighandler (SIGWINCH, rl_sigwinch_handler, &old_winch); + sigwinch_set_flag = 1; + } +#endif /* SIGWINCH */ + + return 0; +} + +int +rl_clear_signals () +{ + sighandler_cxt dummy; + + if (rl_catch_signals && signals_set_flag == 1) + { + sigemptyset (&dummy.sa_mask); + + rl_sigaction (SIGINT, &old_int, &dummy); + rl_sigaction (SIGTERM, &old_term, &dummy); + rl_sigaction (SIGQUIT, &old_quit, &dummy); + rl_sigaction (SIGALRM, &old_alrm, &dummy); + +#if defined (SIGTSTP) + rl_sigaction (SIGTSTP, &old_tstp, &dummy); +#endif /* SIGTSTP */ + +#if defined (SIGTTOU) + rl_sigaction (SIGTTOU, &old_ttou, &dummy); +#endif /* SIGTTOU */ + +#if defined (SIGTTIN) + rl_sigaction (SIGTTIN, &old_ttin, &dummy); +#endif /* SIGTTIN */ + + signals_set_flag = 0; + } + +#if defined (SIGWINCH) + if (rl_catch_sigwinch && sigwinch_set_flag == 1) + { + sigemptyset (&dummy.sa_mask); + rl_sigaction (SIGWINCH, &old_winch, &dummy); + sigwinch_set_flag = 0; + } +#endif + + return 0; +} +#endif /* !_WIN32 */ + +/* Clean up the terminal and readline state after catching a signal, before + resending it to the calling application. */ +void +rl_cleanup_after_signal () +{ + _rl_clean_up_for_exit (); + (*rl_deprep_term_function) (); + rl_clear_signals (); + rl_clear_pending_input (); +} + +/* Reset the terminal and readline state after a signal handler returns. */ +void +rl_reset_after_signal () +{ + (*rl_prep_term_function) (_rl_meta_flag); + rl_set_signals (); +} + +/* Free up the readline variable line state for the current line (undo list, + any partial history entry, any keyboard macros in progress, and any + numeric arguments in process) after catching a signal, before calling + rl_cleanup_after_signal(). */ +void +rl_free_line_state () +{ + register HIST_ENTRY *entry; + + rl_free_undo_list (); + + entry = current_history (); + if (entry) + entry->data = (char *)NULL; + + _rl_kill_kbd_macro (); + rl_clear_message (); + _rl_init_argument (); +} + +#if defined (_WIN32) + +#include +#include +#include + +/* Handling of CTRL_C_EVENT, CTRL_CLOSE_EVENT, CTRL_BREAK_EVENT, + * CTRL_LOGOFF_EVENT, CTRL_SHUTDOWN_EVENT, + * WINDOW_BUFFER_SIZE_EVENTs are handled separately see input.c + */ + +BOOL CtrlEventHandler(DWORD dwEventType) +{ + if (dwEventType == CTRL_C_EVENT) + rl_free_line_state (); + rl_cleanup_after_signal (); + if (dwEventType == CTRL_C_EVENT) /* special treatment */ + { + if (rl_catch_signals == 1) /* > 1: handled only locally */ + { + raise(SIGINT); /* pass to program signal hadler */ + rl_reset_after_signal(); /* on return goon */ + } + return TRUE; /* don't pass to upstream handlers */ + } + return FALSE; /* pass other events to handler chain */ +} + +int +rl_set_signals () +{ + if (rl_catch_signals && signals_set_flag == 0) + signals_set_flag = SetConsoleCtrlHandler( (PHANDLER_ROUTINE) CtrlEventHandler, TRUE); + return signals_set_flag; +} + +int +rl_clear_signals () +{ + if ( signals_set_flag ) + if ( SetConsoleCtrlHandler( (PHANDLER_ROUTINE) CtrlEventHandler, FALSE) ) + signals_set_flag = 0; + return signals_set_flag; +} + +#endif /* _WIN32 */ +#endif /* HANDLE_SIGNALS */ diff --git a/vendors/readline/src/readline/support/config.guess b/vendors/readline/src/readline/support/config.guess new file mode 100644 index 0000000..9a8a499 --- /dev/null +++ b/vendors/readline/src/readline/support/config.guess @@ -0,0 +1,1403 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002 Free Software Foundation, Inc. + +timestamp='2002-11-30' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Per Bothner . +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit build system type. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# This shell variable is my proudest work .. or something. --bje + +set_cc_for_build='tmpdir=${TMPDIR-/tmp}/config-guess-$$ ; +(old=`umask` && umask 077 && mkdir $tmpdir && umask $old && unset old) + || (echo "$me: cannot create $tmpdir" >&2 && exit 1) ; +dummy=$tmpdir/dummy ; +files="$dummy.c $dummy.o $dummy.rel $dummy" ; +trap '"'"'rm -f $files; rmdir $tmpdir; exit 1'"'"' 1 2 15 ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + rm -f $files ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; +unset files' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep __ELF__ >/dev/null + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit 0 ;; + amiga:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + arc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + hp300:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mac68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + macppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme88k:OpenBSD:*:*) + echo m88k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvmeppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + pmax:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sgi:OpenBSD:*:*) + echo mipseb-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sun3:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + wgrisc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:OpenBSD:*:*) + echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + alpha:OSF1:*:*) + if test $UNAME_RELEASE = "V4.0"; then + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + fi + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + eval $set_cc_for_build + cat <$dummy.s + .data +\$Lformat: + .byte 37,100,45,37,120,10,0 # "%d-%x\n" + + .text + .globl main + .align 4 + .ent main +main: + .frame \$30,16,\$26,0 + ldgp \$29,0(\$27) + .prologue 1 + .long 0x47e03d80 # implver \$0 + lda \$2,-1 + .long 0x47e20c21 # amask \$2,\$1 + lda \$16,\$Lformat + mov \$0,\$17 + not \$1,\$18 + jsr \$26,printf + ldgp \$29,0(\$26) + mov 0,\$16 + jsr \$26,exit + .end main +EOF + $CC_FOR_BUILD -o $dummy $dummy.s 2>/dev/null + if test "$?" = 0 ; then + case `$dummy` in + 0-0) + UNAME_MACHINE="alpha" + ;; + 1-0) + UNAME_MACHINE="alphaev5" + ;; + 1-1) + UNAME_MACHINE="alphaev56" + ;; + 1-101) + UNAME_MACHINE="alphapca56" + ;; + 2-303) + UNAME_MACHINE="alphaev6" + ;; + 2-307) + UNAME_MACHINE="alphaev67" + ;; + 2-1307) + UNAME_MACHINE="alphaev68" + ;; + 3-1307) + UNAME_MACHINE="alphaev7" + ;; + esac + fi + rm -f $dummy.s $dummy && rmdir $tmpdir + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit 0 ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit 0 ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit 0 ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit 0;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit 0 ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit 0 ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit 0 ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit 0;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit 0;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit 0 ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit 0 ;; + DRS?6000:UNIX_SV:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7 && exit 0 ;; + esac ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + i86pc:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit 0 ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit 0 ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit 0 ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit 0 ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit 0 ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit 0 ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit 0 ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit 0 ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit 0 ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit 0 ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c \ + && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ + && rm -f $dummy.c $dummy && rmdir $tmpdir && exit 0 + rm -f $dummy.c $dummy && rmdir $tmpdir + echo mips-mips-riscos${UNAME_RELEASE} + exit 0 ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit 0 ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit 0 ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit 0 ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit 0 ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit 0 ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit 0 ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit 0 ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit 0 ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit 0 ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit 0 ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit 0 ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit 0 ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit 0 ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit 0 ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && rm -f $dummy.c $dummy && rmdir $tmpdir && exit 0 + rm -f $dummy.c $dummy && rmdir $tmpdir + echo rs6000-ibm-aix3.2.5 + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit 0 ;; + *:AIX:*:[45]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit 0 ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit 0 ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit 0 ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit 0 ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit 0 ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit 0 ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit 0 ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi + rm -f $dummy.c $dummy && rmdir $tmpdir + fi ;; + esac + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit 0 ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit 0 ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && rm -f $dummy.c $dummy && rmdir $tmpdir && exit 0 + rm -f $dummy.c $dummy && rmdir $tmpdir + echo unknown-hitachi-hiuxwe2 + exit 0 ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit 0 ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit 0 ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit 0 ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit 0 ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit 0 ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit 0 ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit 0 ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit 0 ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit 0 ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit 0 ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit 0 ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*T3D:*:*:*) + echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit 0 ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit 0 ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + amd64:FreeBSD:*:*) + echo x86_64-unknown-freebsd + exit 0 ;; + *:FreeBSD:*:*) + # Determine whether the default compiler uses glibc. + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + #if __GLIBC__ >= 2 + LIBC=gnu + #else + LIBC= + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` + rm -f $dummy.c && rmdir $tmpdir + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC} + exit 0 ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit 0 ;; + i*:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit 0 ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit 0 ;; + x86:Interix*:3*) + echo i586-pc-interix3 + exit 0 ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit 0 ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit 0 ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit 0 ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit 0 ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + *:GNU:*:*) + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit 0 ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit 0 ;; + arm*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + mips:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips + #undef mipsel + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mipsel + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` + rm -f $dummy.c && rmdir $tmpdir + test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 + ;; + mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips64 + #undef mips64el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mips64el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips64 + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` + rm -f $dummy.c && rmdir $tmpdir + test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 + ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit 0 ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit 0 ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit 0 ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit 0 ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit 0 ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit 0 ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit 0 ;; + i*86:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent + # problems with other programs or directories called `ld' in the path. + # Set LC_ALL=C to ensure ld outputs messages in English. + ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ + | sed -ne '/supported targets:/!d + s/[ ][ ]*/ /g + s/.*supported targets: *// + s/ .*// + p'` + case "$ld_supported_targets" in + elf32-i386) + TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" + ;; + a.out-i386-linux) + echo "${UNAME_MACHINE}-pc-linux-gnuaout" + exit 0 ;; + coff-i386) + echo "${UNAME_MACHINE}-pc-linux-gnucoff" + exit 0 ;; + "") + # Either a pre-BFD a.out linker (linux-gnuoldld) or + # one that does not give us useful --help. + echo "${UNAME_MACHINE}-pc-linux-gnuoldld" + exit 0 ;; + esac + # Determine whether the default compiler is a.out or elf + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + #ifdef __ELF__ + # ifdef __GLIBC__ + # if __GLIBC__ >= 2 + LIBC=gnu + # else + LIBC=gnulibc1 + # endif + # else + LIBC=gnulibc1 + # endif + #else + #ifdef __INTEL_COMPILER + LIBC=gnu + #else + LIBC=gnuaout + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` + rm -f $dummy.c && rmdir $tmpdir + test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0 + test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 + ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit 0 ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit 0 ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit 0 ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit 0 ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit 0 ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit 0 ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit 0 ;; + i*86:*:5:[78]*) + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit 0 ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit 0 ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i386. + echo i386-pc-msdosdjgpp + exit 0 ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit 0 ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit 0 ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit 0 ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit 0 ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit 0 ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit 0 ;; + M68*:*:R3V[567]*:*) + test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; + 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4.3${OS_REL} && exit 0 + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4 && exit 0 ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit 0 ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit 0 ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit 0 ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit 0 ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit 0 ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit 0 ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit 0 ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit 0 ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit 0 ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit 0 ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit 0 ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit 0 ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit 0 ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit 0 ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit 0 ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit 0 ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Darwin:*:*) + echo `uname -p`-apple-darwin${UNAME_RELEASE} + exit 0 ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit 0 ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit 0 ;; + NSR-[DGKLNPTVW]:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit 0 ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit 0 ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit 0 ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit 0 ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit 0 ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit 0 ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit 0 ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit 0 ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit 0 ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit 0 ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit 0 ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && rm -f $dummy.c $dummy && rmdir $tmpdir && exit 0 +rm -f $dummy.c $dummy && rmdir $tmpdir + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit 0 ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + c34*) + echo c34-convex-bsd + exit 0 ;; + c38*) + echo c38-convex-bsd + exit 0 ;; + c4*) + echo c4-convex-bsd + exit 0 ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/vendors/readline/src/readline/support/config.rpath b/vendors/readline/src/readline/support/config.rpath new file mode 100644 index 0000000..fa24bfc --- /dev/null +++ b/vendors/readline/src/readline/support/config.rpath @@ -0,0 +1,548 @@ +#! /bin/sh +# Output a system dependent set of variables, describing how to set the +# run time search path of shared libraries in an executable. +# +# Copyright 1996-2003 Free Software Foundation, Inc. +# Taken from GNU libtool, 2001 +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. +# +# The first argument passed to this file is the canonical host specification, +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld +# should be set by the caller. +# +# The set of defined variables is at the end of this script. + +# Known limitations: +# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer +# than 256 bytes, otherwise the compiler driver will dump core. The only +# known workaround is to choose shorter directory names for the build +# directory and/or the installation directory. + +# All known linkers require a `.a' archive for static linking (except M$VC, +# which needs '.lib'). +libext=a +shrext=.so + +host="$1" +host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + +# Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC. + +wl= +if test "$GCC" = yes; then + wl='-Wl,' +else + case "$host_os" in + aix*) + wl='-Wl,' + ;; + mingw* | pw32* | os2*) + ;; + hpux9* | hpux10* | hpux11*) + wl='-Wl,' + ;; + irix5* | irix6* | nonstopux*) + wl='-Wl,' + ;; + newsos6) + ;; + linux*) + case $CC in + icc|ecc) + wl='-Wl,' + ;; + ccc) + wl='-Wl,' + ;; + esac + ;; + osf3* | osf4* | osf5*) + wl='-Wl,' + ;; + sco3.2v5*) + ;; + solaris*) + wl='-Wl,' + ;; + sunos4*) + wl='-Qoption ld ' + ;; + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + wl='-Wl,' + ;; + sysv4*MP*) + ;; + uts4*) + ;; + esac +fi + +# Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS. + +hardcode_libdir_flag_spec= +hardcode_libdir_separator= +hardcode_direct=no +hardcode_minus_L=no + +case "$host_os" in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + openbsd*) + with_gnu_ld=no + ;; +esac + +ld_shlibs=yes +if test "$with_gnu_ld" = yes; then + case "$host_os" in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + fi + ;; + amigaos*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can use + # them. + ld_shlibs=no + ;; + beos*) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + cygwin* | mingw* | pw32*) + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + netbsd*) + ;; + solaris* | sysv5*) + if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + sunos4*) + hardcode_direct=yes + ;; + *) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + esac + if test "$ld_shlibs" = yes; then + # Unlike libtool, we use -rpath here, not --rpath, since the documented + # option of GNU ld is called -rpath, not --rpath. + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + fi +else + case "$host_os" in + aix3*) + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + else + aix_use_runtimelinking=no + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + esac + fi + hardcode_direct=yes + hardcode_libdir_separator=':' + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct=yes + else + # We have old collect2 + hardcode_direct=unsupported + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + esac + fi + # Begin _LT_AC_SYS_LIBPATH_AIX. + echo 'int main () { return 0; }' > conftest.c + ${CC} ${LDFLAGS} conftest.c -o conftest + aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` + if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` + fi + if test -z "$aix_libpath"; then + aix_libpath="/usr/lib:/lib" + fi + rm -f conftest.c conftest + # End _LT_AC_SYS_LIBPATH_AIX. + if test "$aix_use_runtimelinking" = yes; then + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + else + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + fi + fi + ;; + amigaos*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + bsdi4*) + ;; + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + libext=lib + ;; + darwin* | rhapsody*) + if $CC -v 2>&1 | grep 'Apple' >/dev/null ; then + hardcode_direct=no + fi + ;; + dgux*) + hardcode_libdir_flag_spec='-L$libdir' + ;; + freebsd1*) + ld_shlibs=no + ;; + freebsd2.2*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + freebsd2*) + hardcode_direct=yes + hardcode_minus_L=yes + ;; + freebsd*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + hpux9*) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + hpux10* | hpux11*) + if test "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=no + ;; + ia64*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=no + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + *) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + irix5* | irix6* | nonstopux*) + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + netbsd*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + newsos6) + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + openbsd*) + hardcode_direct=yes + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + else + case "$host_os" in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + osf3*) + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + osf4* | osf5*) + if test "$GCC" = yes; then + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + # Both cc and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + hardcode_libdir_separator=: + ;; + sco3.2v5*) + ;; + solaris*) + hardcode_libdir_flag_spec='-R$libdir' + ;; + sunos4*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + ;; + sysv4) + case $host_vendor in + sni) + hardcode_direct=yes # is this really true??? + ;; + siemens) + hardcode_direct=no + ;; + motorola) + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + ;; + sysv4.3*) + ;; + sysv4*MP*) + if test -d /usr/nec; then + ld_shlibs=yes + fi + ;; + sysv4.2uw2*) + hardcode_direct=yes + hardcode_minus_L=no + ;; + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) + ;; + sysv5*) + hardcode_libdir_flag_spec= + ;; + uts4*) + hardcode_libdir_flag_spec='-L$libdir' + ;; + *) + ld_shlibs=no + ;; + esac +fi + +# Check dynamic linker characteristics +# Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER. +libname_spec='lib$name' +case "$host_os" in + aix3*) + ;; + aix4* | aix5*) + ;; + amigaos*) + ;; + beos*) + ;; + bsdi4*) + ;; + cygwin* | mingw* | pw32*) + shrext=.dll + ;; + darwin* | rhapsody*) + shrext=.dylib + ;; + dgux*) + ;; + freebsd1*) + ;; + freebsd*) + ;; + gnu*) + ;; + hpux9* | hpux10* | hpux11*) + case "$host_cpu" in + ia64*) + shrext=.so + ;; + hppa*64*) + shrext=.sl + ;; + *) + shrext=.sl + ;; + esac + ;; + irix5* | irix6* | nonstopux*) + case "$host_os" in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; + *) libsuff= shlibsuff= ;; + esac + ;; + esac + ;; + linux*oldld* | linux*aout* | linux*coff*) + ;; + linux*) + ;; + netbsd*) + ;; + newsos6) + ;; + nto-qnx) + ;; + openbsd*) + ;; + os2*) + libname_spec='$name' + shrext=.dll + ;; + osf3* | osf4* | osf5*) + ;; + sco3.2v5*) + ;; + solaris*) + ;; + sunos4*) + ;; + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + ;; + sysv4*MP*) + ;; + uts4*) + ;; +esac + +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' +escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` +shlibext=`echo "$shrext" | sed -e 's,^\.,,'` +escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` + +sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <. Submit a context +# diff and a properly formatted ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit 0;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis) + os= + basic_machine=$1 + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ + | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k \ + | m32r | m68000 | m68k | m88k | mcore \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64vr | mips64vrel \ + | mips64orion | mips64orionel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mipsisa32 | mipsisa32el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | ns16k | ns32k \ + | openrisc | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | sh | sh[1234] | sh3e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \ + | strongarm \ + | tahoe | thumb | tic80 | tron \ + | v850 | v850e \ + | we32k \ + | x86 | xscale | xstormy16 | xtensa \ + | z8k) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64 | amd64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | amd64-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* \ + | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* \ + | clipper-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* \ + | m32r-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | mcore-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39 | mipstx39el \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* \ + | sh-* | sh[1234]-* | sh3e-* | sh[34]eb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ + | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* | tic30-* | tic4x-* | tic54x-* | tic80-* | tron-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \ + | xtensa-* \ + | ymp-* \ + | z8k-*) + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + crds | unos) + basic_machine=m68k-crds + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + mmix*) + basic_machine=mmix-knuth + os=-mmixware + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + or32 | or32-*) + basic_machine=or32-unknown + os=-coff + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2) + basic_machine=i686-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3d) + basic_machine=alpha-cray + os=-unicos + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tic4x | c4x*) + basic_machine=tic4x-unknown + os=-coff + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh3 | sh4 | sh3eb | sh4eb | sh[1234]le | sh3ele) + basic_machine=sh-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparc | sparcv9 | sparcv9b) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ + | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-ibm) + os=-aix + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/vendors/readline/src/readline/support/install.sh b/vendors/readline/src/readline/support/install.sh new file mode 100644 index 0000000..0cac004 --- /dev/null +++ b/vendors/readline/src/readline/support/install.sh @@ -0,0 +1,247 @@ +#!/bin/sh +# +# install - install a program, script, or datafile +# This comes from X11R5. +# +# $XConsortium: install.sh,v 1.2 89/12/18 14:47:22 jim Exp $ +# +# Copyright 1991 by the Massachusetts Institute of Technology +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of M.I.T. not be used in advertising or +# publicity pertaining to distribution of the software without specific, +# written prior permission. M.I.T. makes no representations about the +# suitability of this software for any purpose. It is provided "as is" +# without express or implied warranty. +# +# This script is compatible with the BSD install script, but was written +# from scratch. +# + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +tranformbasename="" +transform_arg="" +instcmd="$mvprog" +chmodcmd="$chmodprog 0755" +chowncmd="" +chgrpcmd="" +stripcmd="" +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src="" +dst="" +dir_arg="" + +while [ x"$1" != x ]; do + case $1 in + -c) instcmd="$cpprog" + shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + -s) stripcmd="$stripprog" + shift + continue;; + + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; + + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; + + *) if [ x"$src" = x ] + then + src=$1 + else + # this colon is to work around a 386BSD /bin/sh bug + : + dst=$1 + fi + shift + continue;; + esac +done + +if [ x"$src" = x ] +then + echo "install: no input file specified" + exit 1 +else + true +fi + +if [ x"$dir_arg" != x ]; then + dst=$src + src="" + + if [ -d $dst ]; then + instcmd=: + else + instcmd=mkdir + fi +else + +# Waiting for this to be detected by the "$instcmd $src $dsttmp" command +# might cause directories to be created, which would be especially bad +# if $src (and thus $dsttmp) contains '*'. + + if [ -f $src -o -d $src ] + then + true + else + echo "install: $src does not exist" + exit 1 + fi + + if [ x"$dst" = x ] + then + echo "install: no destination specified" + exit 1 + else + true + fi + +# If destination is a directory, append the input filename; if your system +# does not like double slashes in filenames, you may need to add some logic + + if [ -d $dst ] + then + dst="$dst"/`basename $src` + else + true + fi +fi + +## this sed command emulates the dirname command +dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + +# Make sure that the destination directory exists. +# this part is taken from Noah Friedman's mkinstalldirs script + +# Skip lots of stat calls in the usual case. +if [ ! -d "$dstdir" ]; then +defaultIFS=' +' +IFS="${IFS-${defaultIFS}}" + +oIFS="${IFS}" +# Some sh's can't handle IFS=/ for some reason. +IFS='%' +set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` +IFS="${oIFS}" + +pathcomp='' + +while [ $# -ne 0 ] ; do + pathcomp="${pathcomp}${1}" + shift + + if [ ! -d "${pathcomp}" ] ; + then + $mkdirprog "${pathcomp}" + else + true + fi + + pathcomp="${pathcomp}/" +done +fi + +if [ x"$dir_arg" != x ] +then + $doit $instcmd $dst && + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi +else + +# If we're going to rename the final executable, determine the name now. + + if [ x"$transformarg" = x ] + then + dstfile=`basename $dst` + else + dstfile=`basename $dst $transformbasename | + sed $transformarg`$transformbasename + fi + +# don't allow the sed command to completely eliminate the filename + + if [ x"$dstfile" = x ] + then + dstfile=`basename $dst` + else + true + fi + +# Make a temp file name in the proper directory. + + dsttmp=$dstdir/#inst.$$# + +# Move or copy the file name to the temp name + + $doit $instcmd $src $dsttmp && + + trap "rm -f ${dsttmp}" 0 && + +# and set any options; do chmod last to preserve setuid bits + +# If any of these fail, we abort the whole thing. If we want to +# ignore errors from any of these, just make sure not to ignore +# errors from the above "$doit $instcmd $src $dsttmp" command. + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && + +# Now rename the file to the real destination. + + $doit $rmcmd -f $dstdir/$dstfile && + $doit $mvcmd $dsttmp $dstdir/$dstfile + +fi && + + +exit 0 diff --git a/vendors/readline/src/readline/support/mkdirs b/vendors/readline/src/readline/support/mkdirs new file mode 100644 index 0000000..ce4fb23 --- /dev/null +++ b/vendors/readline/src/readline/support/mkdirs @@ -0,0 +1,48 @@ +#! /bin/sh +# +# mkdirs - a work-alike for `mkdir -p' +# +# Chet Ramey +# chet@po.cwru.edu + +# Copyright (C) 1996-2002 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. + +for dir +do + + test -d "$dir" && continue + + tomake=$dir + while test -n "$dir" ; do + # dir=${dir%/*} + # dir=`expr "$dir" ':' '\(/.*\)/[^/]*'` + if dir=`expr "$dir" ':' '\(.*\)/[^/]*'`; then + tomake="$dir $tomake" + else + dir= + fi + done + + for d in $tomake + do + test -d "$d" && continue + echo mkdir "$d" + mkdir "$d" + done +done + +exit 0 diff --git a/vendors/readline/src/readline/support/mkdist b/vendors/readline/src/readline/support/mkdist new file mode 100644 index 0000000..06e6155 --- /dev/null +++ b/vendors/readline/src/readline/support/mkdist @@ -0,0 +1,120 @@ +#! /bin/bash - +# +# mkdist - make a distribution directory from a master manifest file +# +# usage: mkdist [-m manifest] [-s srcdir] [-r rootname] [-v] version +# +# SRCDIR defaults to src +# MANIFEST defaults to $SRCDIR/MANIFEST +# +# Chet Ramey +# chet@po.cwru.edu + +# Copyright (C) 1996-2002 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. + +SRCDIR=src +ROOTNAME=bash + +usage() +{ + echo usage: mkdist [-m manifest] [-s srcdir] [-r rootname] [-v] version 1>&2 + exit 2 +} + +vmsg() +{ + if [ -n "$verbose" ]; then + echo mkdist: "$@" + fi +} + +while getopts m:s:r:v name +do + case $name in + m) MANIFEST=$OPTARG ;; + s) SRCDIR=$OPTARG ;; + r) ROOTNAME=$OPTARG ;; + v) verbose=yes ;; + ?) usage ;; + esac +done + +: ${MANIFEST:=$SRCDIR/MANIFEST} + +vmsg using $MANIFEST + +shift $(( $OPTIND - 1 )) + +if [ $# -lt 1 ]; then + usage +fi + +version=$1 +newdir=${ROOTNAME}-$version + +vmsg creating distribution for $ROOTNAME version $version in $newdir + +if [ ! -d $newdir ]; then + mkdir $newdir || { echo $0: cannot make directory $newdir 1>&2 ; exit 1; } +fi + +dirmode=755 +filmode=644 + +while read fname type mode +do + [ -z "$fname" ] && continue + + case "$fname" in + \#*) continue ;; + esac + + case "$type" in + d) mkdir $newdir/$fname ;; + f) cp -p $SRCDIR/$fname $newdir/$fname ;; + s) ln -s $mode $newdir/$fname ; mode= ;; # symlink + l) ln $mode $newdir/$fname ; mode= ;; # hard link + *) echo "unknown file type $type" 1>&2 ;; + esac + + if [ -n "$mode" ]; then + chmod $mode $newdir/$fname + fi + +done < $MANIFEST + +# cut off the `-alpha' in something like `2.0-alpha', leaving just the +# numeric version +#version=${version%%-*} + +#case "$version" in +#*.*.*) vers=${version%.*} ;; +#*.*) vers=${version} ;; +#esac + +#echo $vers > $newdir/.distribution + +#case "$version" in +#*.*.*) plevel=${version##*.} ;; +#*) plevel=0 ;; +#esac +#[ -z "$plevel" ] && plevel=0 +#echo ${plevel} > $newdir/.patchlevel + +vmsg $newdir created + +exit 0 diff --git a/vendors/readline/src/readline/support/mkinstalldirs b/vendors/readline/src/readline/support/mkinstalldirs new file mode 100644 index 0000000..d2d5f21 --- /dev/null +++ b/vendors/readline/src/readline/support/mkinstalldirs @@ -0,0 +1,111 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy +# Author: Noah Friedman +# Created: 1993-05-16 +# Public domain + +errstatus=0 +dirmode="" + +usage="\ +Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..." + +# process command line arguments +while test $# -gt 0 ; do + case $1 in + -h | --help | --h*) # -h for help + echo "$usage" 1>&2 + exit 0 + ;; + -m) # -m PERM arg + shift + test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } + dirmode=$1 + shift + ;; + --) # stop option processing + shift + break + ;; + -*) # unknown option + echo "$usage" 1>&2 + exit 1 + ;; + *) # first non-opt arg + break + ;; + esac +done + +for file +do + if test -d "$file"; then + shift + else + break + fi +done + +case $# in + 0) exit 0 ;; +esac + +case $dirmode in + '') + if mkdir -p -- . 2>/dev/null; then + echo "mkdir -p -- $*" + exec mkdir -p -- "$@" + fi + ;; + *) + if mkdir -m "$dirmode" -p -- . 2>/dev/null; then + echo "mkdir -m $dirmode -p -- $*" + exec mkdir -m "$dirmode" -p -- "$@" + fi + ;; +esac + +for file +do + set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` + shift + + pathcomp= + for d + do + pathcomp="$pathcomp$d" + case $pathcomp in + -*) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + else + if test ! -z "$dirmode"; then + echo "chmod $dirmode $pathcomp" + lasterr="" + chmod "$dirmode" "$pathcomp" || lasterr=$? + + if test ! -z "$lasterr"; then + errstatus=$lasterr + fi + fi + fi + fi + + pathcomp="$pathcomp/" + done +done + +exit $errstatus + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# End: +# mkinstalldirs ends here diff --git a/vendors/readline/src/readline/support/shlib-install b/vendors/readline/src/readline/support/shlib-install new file mode 100644 index 0000000..a15b7d8 --- /dev/null +++ b/vendors/readline/src/readline/support/shlib-install @@ -0,0 +1,169 @@ +#! /bin/sh +# +# shlib-install - install a shared library and do any necessary host-specific +# post-installation configuration (like ldconfig) +# +# usage: shlib-install [-D] -O host_os -d installation-dir -i install-prog [-U] library +# +# Chet Ramey +# chet@po.cwru.edu + +# +# defaults +# +INSTALLDIR=/usr/local/lib +LDCONFIG=ldconfig + +PROGNAME=`basename $0` +USAGE="$PROGNAME [-D] -O host_os -d installation-dir -i install-prog [-U] library" + +# process options + +while [ $# -gt 0 ]; do + case "$1" in + -O) shift; host_os="$1"; shift ;; + -d) shift; INSTALLDIR="$1"; shift ;; + -i) shift; INSTALLPROG="$1" ; shift ;; + -D) echo=echo ; shift ;; + -U) uninstall=true ; shift ;; + -*) echo "$USAGE" >&2 ; exit 2;; + *) break ;; + esac +done + +# set install target name +LIBNAME="$1" + +if [ -z "$LIBNAME" ]; then + echo "$USAGE" >&2 + exit 2 +fi + +OLDSUFF=old +MV=mv +RM="rm -f" +LN="ln -s" + +# pre-install + +if [ -z "$uninstall" ]; then + ${echo} $RM ${INSTALLDIR}/${LIBNAME}.${OLDSUFF} + if [ -f "$INSTALLDIR/$LIBNAME" ]; then + ${echo} $MV $INSTALLDIR/$LIBNAME ${INSTALLDIR}/${LIBNAME}.${OLDSUFF} + fi +fi + +# install/uninstall + +if [ -z "$uninstall" ] ; then + ${echo} eval ${INSTALLPROG} $LIBNAME ${INSTALLDIR}/${LIBNAME} +else + ${echo} ${RM} ${INSTALLDIR}/${LIBNAME} +fi + +# post-install/uninstall + +# HP-UX and Darwin/MacOS X require that a shared library have execute permission +case "$host_os" in +hpux*|darwin*|macosx*) + if [ -z "$uninstall" ]; then + chmod 555 ${INSTALLDIR}/${LIBNAME} + fi ;; +*) ;; +esac + +case "$LIBNAME" in +*.*.[0-9].[0-9]) # libname.so.M.N + LINK2=`echo $LIBNAME | sed 's:\(.*\..*\.[0-9]\)\.[0-9]:\1:'` # libname.so.M + LINK1=`echo $LIBNAME | sed 's:\(.*\..*\)\.[0-9]\.[0-9]:\1:'` # libname.so + ;; +*.*.[0-9]) # libname.so.M + LINK1=`echo $LIBNAME | sed 's:\(.*\..*\)\.[0-9]:\1:'` # libname.so + ;; +*.[0-9]) # libname.M + LINK1=`echo $LIBNAME | sed 's:\(.*\)\.[0-9]:\1:'` # libname + ;; +*.[0-9].[0-9].dylib) # libname.M.N.dylib + LINK2=`echo $LIBNAME | sed 's:\(.*\.[0-9]\)\.[0-9]:\1:'` # libname.M.dylib + LINK1=`echo $LIBNAME | sed 's:\(.*\)\.[0-9]\.[0-9]:\1:'` # libname.dylib +esac + +INSTALL_LINK1='${echo} cd $INSTALLDIR && ${echo} ${LN} $LIBNAME $LINK1' +INSTALL_LINK2='${echo} cd $INSTALLDIR && ${echo} ${LN} $LIBNAME $LINK2' + +# +# Create symlinks to the installed library. This section is incomplete. +# +case "$host_os" in +*linux*) + # libname.so.M -> libname.so.M.N + ${echo} ${RM} ${INSTALLDIR}/$LINK2 + if [ -z "$uninstall" ]; then + eval $INSTALL_LINK2 + fi + + # libname.so -> libname.so.M + ${echo} ${RM} ${INSTALLDIR}/$LINK1 + if [ -z "$uninstall" ]; then + ${echo} cd $INSTALLDIR && ${echo} ${LN} $LINK2 $LINK1 + fi + ;; + +bsdi4*|*gnu*|darwin*|macosx*|k*bsd*-gnu) + # libname.so.M -> libname.so.M.N + ${echo} ${RM} ${INSTALLDIR}/$LINK2 + if [ -z "$uninstall" ]; then + eval $INSTALL_LINK2 + fi + + # libname.so -> libname.so.M.N + ${echo} ${RM} ${INSTALLDIR}/$LINK1 + if [ -z "$uninstall" ]; then + eval $INSTALL_LINK1 + fi + ;; + +solaris2*|aix4.[2-9]*|osf*|irix[56]*|sysv[45]*|dgux*) + # libname.so -> libname.so.M + ${echo} ${RM} ${INSTALLDIR}/$LINK1 + if [ -z "$uninstall" ]; then + eval $INSTALL_LINK1 + fi + ;; + + +# FreeBSD 3.x and above can have either a.out or ELF shared libraries +freebsd[3-9]*|freebsdelf[3-9]*|freebsdaout[3-9]*) + if [ -x /usr/bin/objformat ] && [ "`/usr/bin/objformat`" = "elf" ]; then + # libname.so -> libname.so.M + ${echo} ${RM} ${INSTALLDIR}/$LINK1 + if [ -z "$uninstall" ]; then + eval $INSTALL_LINK1 + fi + else + # libname.so.M -> libname.so.M.N + ${echo} ${RM} ${INSTALLDIR}/$LINK2 + if [ -z "$uninstall" ]; then + eval $INSTALL_LINK2 + fi + + # libname.so -> libname.so.M.N + ${echo} ${RM} ${INSTALLDIR}/$LINK1 + if [ -z "$uninstall" ]; then + eval $INSTALL_LINK1 + fi + fi + ;; + +hpux1*) + # libname.sl -> libname.M + ${echo} ${RM} ${INSTALLDIR}/$LINK1.sl + if [ -z "$uninstall" ]; then + eval $INSTALL_LINK1 + fi + ;; + +*) ;; +esac + +exit 0 diff --git a/vendors/readline/src/readline/support/shobj-conf b/vendors/readline/src/readline/support/shobj-conf new file mode 100644 index 0000000..4c13717 --- /dev/null +++ b/vendors/readline/src/readline/support/shobj-conf @@ -0,0 +1,466 @@ +#! /bin/sh +# +# shobj-conf -- output a series of variable assignments to be substituted +# into a Makefile by configure which specify system-dependent +# information for creating shared objects that may be loaded +# into bash with `enable -f' +# +# usage: shobj-conf [-C compiler] -c host_cpu -o host_os -v host_vendor +# +# Chet Ramey +# chet@po.cwru.edu + +# Copyright (C) 1996-2002 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. + +# +# defaults +# +SHOBJ_STATUS=supported +SHLIB_STATUS=supported + +SHOBJ_CC=cc +SHOBJ_CFLAGS= +SHOBJ_LD= +SHOBJ_LDFLAGS= +SHOBJ_XLDFLAGS= +SHOBJ_LIBS= + +SHLIB_XLDFLAGS= +SHLIB_LIBS= +SHLIB_LIBSUFF='so' + +SHLIB_LIBVERSION='$(SHLIB_LIBSUFF)' + +PROGNAME=`basename $0` +USAGE="$PROGNAME [-C compiler] -c host_cpu -o host_os -v host_vendor" + +while [ $# -gt 0 ]; do + case "$1" in + -C) shift; SHOBJ_CC="$1"; shift ;; + -c) shift; host_cpu="$1"; shift ;; + -o) shift; host_os="$1"; shift ;; + -v) shift; host_vendor="$1"; shift ;; + *) echo "$USAGE" >&2 ; exit 2;; + esac +done + +case "${host_os}-${SHOBJ_CC}" in +sunos4*-*gcc*) + SHOBJ_CFLAGS=-fpic + SHOBJ_LD=/usr/bin/ld + SHOBJ_LDFLAGS='-assert pure-text' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' + ;; + +sunos4*) + SHOBJ_CFLAGS=-pic + SHOBJ_LD=/usr/bin/ld + SHOBJ_LDFLAGS='-assert pure-text' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' + ;; + +sunos5*-*gcc*|solaris2*-*gcc*) + SHOBJ_CFLAGS=-fpic + SHOBJ_LD='${CC}' + # This line works for the Solaris linker in /usr/ccs/bin/ld + SHOBJ_LDFLAGS='-shared -Wl,-i -Wl,-h,$@' + # This line works for the GNU ld +# SHOBJ_LDFLAGS='-shared -Wl,-h,$@' + +# SHLIB_XLDFLAGS='-R $(libdir)' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +sunos5*|solaris2*) + SHOBJ_CFLAGS='-K pic' + SHOBJ_LD=/usr/ccs/bin/ld + SHOBJ_LDFLAGS='-G -dy -z text -i -h $@' + +# SHLIB_XLDFLAGS='-R $(libdir)' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +# All versions of Linux or the semi-mythical GNU Hurd. +linux*-*|gnu*-*|k*bsd*-gnu-*) + SHOBJ_CFLAGS=-fPIC + SHOBJ_LD='${CC}' + SHOBJ_LDFLAGS='-shared -Wl,-soname,$@' + + SHLIB_XLDFLAGS='-Wl,-rpath,$(libdir) -Wl,-soname,`basename $@ $(SHLIB_MINOR)`' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' + ;; + +freebsd2* | netbsd*) + SHOBJ_CFLAGS=-fpic + SHOBJ_LD=ld + SHOBJ_LDFLAGS='-x -Bshareable' + + SHLIB_XLDFLAGS='-R$(libdir)' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' + ;; + +# FreeBSD-3.x ELF +freebsd[3-9]*|freebsdelf[3-9]*|freebsdaout[3-9]*) + SHOBJ_CFLAGS=-fpic + SHOBJ_LD='${CC}' + + if [ -x /usr/bin/objformat ] && [ "`/usr/bin/objformat`" = "elf" ]; then + SHOBJ_LDFLAGS='-shared -Wl,-soname,$@' + + SHLIB_XLDFLAGS='-Wl,-rpath,$(libdir)' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + else + SHOBJ_LDFLAGS='-shared' + + SHLIB_XLDFLAGS='-R$(libdir)' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' + fi + ;; + +# Darwin/MacOS X +darwin*|macosx*) + SHOBJ_STATUS=unsupported + SHLIB_STATUS=supported + + SHOBJ_CFLAGS='-fno-common' + + SHOBJ_LD='${CC}' + + SHLIB_LIBVERSION='$(SHLIB_MAJOR)$(SHLIB_MINOR).$(SHLIB_LIBSUFF)' + SHLIB_LIBSUFF='dylib' + + case "${host_os}" in + darwin7*) SHOBJ_LDFLAGS='' + SHLIB_XLDFLAGS='-dynamiclib -arch_only `/usr/bin/arch` -install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v' + ;; + *) SHOBJ_LDFLAGS='-dynamic' + SHLIB_XLDFLAGS='-arch_only `/usr/bin/arch` -install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v' + ;; + esac + + SHLIB_LIBS='-lncurses' # see if -lcurses works on MacOS X 10.1 + ;; + +openbsd*) + SHOBJ_CFLAGS=-fPIC + SHOBJ_LD='${CC}' + SHOBJ_LDFLAGS='-shared' + + SHLIB_XLDFLAGS='-R$(libdir)' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' + ;; + +bsdi2*) + SHOBJ_CC=shlicc2 + SHOBJ_CFLAGS= + SHOBJ_LD=ld + SHOBJ_LDFLAGS=-r + SHOBJ_LIBS=-lc_s.2.1.0 + + # BSD/OS 2.x and 3.x `shared libraries' are too much of a pain in + # the ass -- they require changing {/usr/lib,etc}/shlib.map on + # each system, and the library creation process is byzantine + SHLIB_STATUS=unsupported + ;; + +bsdi3*) + SHOBJ_CC=shlicc2 + SHOBJ_CFLAGS= + SHOBJ_LD=ld + SHOBJ_LDFLAGS=-r + SHOBJ_LIBS=-lc_s.3.0.0 + + # BSD/OS 2.x and 3.x `shared libraries' are too much of a pain in + # the ass -- they require changing {/usr/lib,etc}/shlib.map on + # each system, and the library creation process is byzantine + SHLIB_STATUS=unsupported + ;; + +bsdi4*) + # BSD/OS 4.x now supports ELF and SunOS-style dynamically-linked + # shared libraries. gcc 2.x is the standard compiler, and the + # `normal' gcc options should work as they do in Linux. + + SHOBJ_CFLAGS=-fPIC + SHOBJ_LD='${CC}' + SHOBJ_LDFLAGS='-shared -Wl,-soname,$@' + + SHLIB_XLDFLAGS='-Wl,-soname,`basename $@ $(SHLIB_MINOR)`' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' + ;; + +osf*-*gcc*) + # Fix to use gcc linker driver from bfischer@TechFak.Uni-Bielefeld.DE + SHOBJ_LD='${CC}' + SHOBJ_LDFLAGS='-shared -Wl,-soname,$@' + + SHLIB_XLDFLAGS='-rpath $(libdir)' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +osf*) + SHOBJ_LD=ld + SHOBJ_LDFLAGS='-shared -soname $@ -expect_unresolved "*"' + + SHLIB_XLDFLAGS='-rpath $(libdir)' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +aix4.[2-9]*-*gcc*) # lightly tested by jik@cisco.com + SHOBJ_CFLAGS=-fpic + SHOBJ_LD='ld' + SHOBJ_LDFLAGS='-bdynamic -bnoentry -bexpall' + SHOBJ_XLDFLAGS='-G' + + SHLIB_XLDFLAGS='-bM:SRE' + SHLIB_LIBS='-lcurses -lc' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +aix4.[2-9]*) + SHOBJ_CFLAGS=-K + SHOBJ_LD='ld' + SHOBJ_LDFLAGS='-bdynamic -bnoentry -bexpall' + SHOBJ_XLDFLAGS='-G' + + SHLIB_XLDFLAGS='-bM:SRE' + SHLIB_LIBS='-lcurses -lc' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +# +# THE FOLLOWING ARE UNTESTED -- and some may not support the dlopen interface +# +irix[56]*-*gcc*) + SHOBJ_CFLAGS='-fpic' + SHOBJ_LD='${CC}' + SHOBJ_LDFLAGS='-shared -Wl,-soname,$@' + + SHLIB_XLDFLAGS='-Wl,-rpath,$(libdir)' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +irix[56]*) + SHOBJ_CFLAGS='-K PIC' + SHOBJ_LD=ld +# SHOBJ_LDFLAGS='-call_shared -hidden_symbol -no_unresolved -soname $@' +# Change from David Kaelbling . If you have problems, +# remove the `-no_unresolved' + SHOBJ_LDFLAGS='-shared -no_unresolved -soname $@' + + SHLIB_XLDFLAGS='-rpath $(libdir)' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +hpux9*-*gcc*) + # must use gcc; the bundled cc cannot compile PIC code + SHOBJ_CFLAGS='-fpic' + SHOBJ_LD='${CC}' + SHOBJ_LDFLAGS='-shared -Wl,-b -Wl,+s' + + SHLIB_XLDFLAGS='-Wl,+b,$(libdir)' + SHLIB_LIBSUFF='sl' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +hpux9*) + SHOBJ_STATUS=unsupported + SHLIB_STATUS=unsupported + + # If you are using the HP ANSI C compiler, you can uncomment and use + # this code (I have not tested it) +# SHOBJ_STATUS=supported +# SHLIB_STATUS=supported +# +# SHOBJ_CFLAGS='+z' +# SHOBJ_LD='ld' +# SHOBJ_LDFLAGS='-b +s' +# +# SHLIB_XLDFLAGS='+b $(libdir)' +# SHLIB_LIBSUFF='sl' +# SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + + ;; + +hpux10*-*gcc*) + # must use gcc; the bundled cc cannot compile PIC code + SHOBJ_CFLAGS='-fpic' + SHOBJ_LD='${CC}' + # if you have problems linking here, moving the `-Wl,+h,$@' from + # SHLIB_XLDFLAGS to SHOBJ_LDFLAGS has been reported to work + SHOBJ_LDFLAGS='-shared -Wl,-b -Wl,+s' + + SHLIB_XLDFLAGS='-Wl,+h,$@ -Wl,+b,$(libdir)' + SHLIB_LIBSUFF='sl' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +hpux10*) + SHOBJ_STATUS=unsupported + SHLIB_STATUS=unsupported + + # If you are using the HP ANSI C compiler, you can uncomment and use + # this code (I have not tested it) +# SHOBJ_STATUS=supported +# SHLIB_STATUS=supported +# +# SHOBJ_CFLAGS='+z' +# SHOBJ_LD='ld' +# SHOBJ_LDFLAGS='-b +s +h $@' +# +# SHLIB_XLDFLAGS='+b $(libdir)' +# SHLIB_LIBSUFF='sl' +# SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + + ;; + +hpux11*-*gcc*) + # must use gcc; the bundled cc cannot compile PIC code + SHOBJ_CFLAGS='-fpic' + SHOBJ_LD='${CC}' +# SHOBJ_LDFLAGS='-shared -Wl,-b -Wl,-B,symbolic -Wl,+s -Wl,+std -Wl,+h,$@' + SHOBJ_LDFLAGS='-shared -fpic -Wl,-b -Wl,+s -Wl,+h,$@' + + SHLIB_XLDFLAGS='-Wl,+b,$(libdir)' + SHLIB_LIBSUFF='sl' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +hpux11*) + SHOBJ_STATUS=unsupported + SHLIB_STATUS=unsupported + + # If you are using the HP ANSI C compiler, you can uncomment and use + # this code (I have not tested it) +# SHOBJ_STATUS=supported +# SHLIB_STATUS=supported +# +# SHOBJ_CFLAGS='+z' +# SHOBJ_LD='ld' +# SHOBJ_LDFLAGS='-b +s +h $@' +# +# SHLIB_XLDFLAGS='+b $(libdir)' +# SHLIB_LIBSUFF='sl' +# SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + + ;; + +sysv4*-*gcc*) + SHOBJ_CFLAGS=-shared + SHOBJ_LDFLAGS='-shared -h $@' + SHOBJ_LD='${CC}' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +sysv4*) + SHOBJ_CFLAGS='-K PIC' + SHOBJ_LD=ld + SHOBJ_LDFLAGS='-dy -z text -G -h $@' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +sco3.2v5*-*gcc*) + SHOBJ_CFLAGS='-fpic' # DEFAULTS TO ELF + SHOBJ_LD='${CC}' + SHOBJ_LDFLAGS='-shared' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +sco3.2v5*) + SHOBJ_CFLAGS='-K pic -b elf' + SHOBJ_LD=ld + SHOBJ_LDFLAGS='-G -b elf -dy -z text -h $@' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +sysv5uw7*-*gcc*) + SHOBJ_CFLAGS='-fpic' + SHOBJ_LD='${CC}' + SHOBJ_LDFLAGS='-shared' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +sysv5uw7*) + SHOBJ_CFLAGS='-K PIC' + SHOBJ_LD=ld + SHOBJ_LDFLAGS='-G -dy -z text -h $@' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +dgux*-*gcc*) + SHOBJ_CFLAGS=-fpic + SHOBJ_LD='${CC}' + SHOBJ_LDFLAGS='-shared' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +dgux*) + SHOBJ_CFLAGS='-K pic' + SHOBJ_LD=ld + SHOBJ_LDFLAGS='-G -dy -h $@' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +msdos*) + SHOBJ_STATUS=unsupported + SHLIB_STATUS=unsupported + ;; + +# +# Rely on correct gcc configuration for everything else +# +*-*gcc*) + SHOBJ_CFLAGS=-fpic + SHOBJ_LD='${CC}' + SHOBJ_LDFLAGS='-shared' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +*) + SHOBJ_STATUS=unsupported + SHLIB_STATUS=unsupported + ;; + +esac + +echo SHOBJ_CC=\'"$SHOBJ_CC"\' +echo SHOBJ_CFLAGS=\'"$SHOBJ_CFLAGS"\' +echo SHOBJ_LD=\'"$SHOBJ_LD"\' +echo SHOBJ_LDFLAGS=\'"$SHOBJ_LDFLAGS"\' +echo SHOBJ_XLDFLAGS=\'"$SHOBJ_XLDFLAGS"\' +echo SHOBJ_LIBS=\'"$SHOBJ_LIBS"\' + +echo SHLIB_XLDFLAGS=\'"$SHLIB_XLDFLAGS"\' +echo SHLIB_LIBS=\'"$SHLIB_LIBS"\' +echo SHLIB_LIBSUFF=\'"$SHLIB_LIBSUFF"\' +echo SHLIB_LIBVERSION=\'"$SHLIB_LIBVERSION"\' + +echo SHOBJ_STATUS=\'"$SHOBJ_STATUS"\' +echo SHLIB_STATUS=\'"$SHLIB_STATUS"\' + +exit 0 diff --git a/vendors/readline/src/readline/support/wcwidth.c b/vendors/readline/src/readline/support/wcwidth.c new file mode 100644 index 0000000..ace9a3a --- /dev/null +++ b/vendors/readline/src/readline/support/wcwidth.c @@ -0,0 +1,236 @@ +/* + * This is an implementation of wcwidth() and wcswidth() as defined in + * "The Single UNIX Specification, Version 2, The Open Group, 1997" + * + * + * Markus Kuhn -- 2001-09-08 -- public domain + */ + +#include + +struct interval { + unsigned short first; + unsigned short last; +}; + +/* auxiliary function for binary search in interval table */ +static int bisearch(wchar_t ucs, const struct interval *table, int max) { + int min = 0; + int mid; + + if (ucs < table[0].first || ucs > table[max].last) + return 0; + while (max >= min) { + mid = (min + max) / 2; + if (ucs > table[mid].last) + min = mid + 1; + else if (ucs < table[mid].first) + max = mid - 1; + else + return 1; + } + + return 0; +} + + +/* The following functions define the column width of an ISO 10646 + * character as follows: + * + * - The null character (U+0000) has a column width of 0. + * + * - Other C0/C1 control characters and DEL will lead to a return + * value of -1. + * + * - Non-spacing and enclosing combining characters (general + * category code Mn or Me in the Unicode database) have a + * column width of 0. + * + * - Other format characters (general category code Cf in the Unicode + * database) and ZERO WIDTH SPACE (U+200B) have a column width of 0. + * + * - Hangul Jamo medial vowels and final consonants (U+1160-U+11FF) + * have a column width of 0. + * + * - Spacing characters in the East Asian Wide (W) or East Asian + * FullWidth (F) category as defined in Unicode Technical + * Report #11 have a column width of 2. + * + * - All remaining characters (including all printable + * ISO 8859-1 and WGL4 characters, Unicode control characters, + * etc.) have a column width of 1. + * + * This implementation assumes that wchar_t characters are encoded + * in ISO 10646. + */ + +int wcwidth(wchar_t ucs) +{ + /* sorted list of non-overlapping intervals of non-spacing characters */ + static const struct interval combining[] = { + { 0x0300, 0x034E }, { 0x0360, 0x0362 }, { 0x0483, 0x0486 }, + { 0x0488, 0x0489 }, { 0x0591, 0x05A1 }, { 0x05A3, 0x05B9 }, + { 0x05BB, 0x05BD }, { 0x05BF, 0x05BF }, { 0x05C1, 0x05C2 }, + { 0x05C4, 0x05C4 }, { 0x064B, 0x0655 }, { 0x0670, 0x0670 }, + { 0x06D6, 0x06E4 }, { 0x06E7, 0x06E8 }, { 0x06EA, 0x06ED }, + { 0x070F, 0x070F }, { 0x0711, 0x0711 }, { 0x0730, 0x074A }, + { 0x07A6, 0x07B0 }, { 0x0901, 0x0902 }, { 0x093C, 0x093C }, + { 0x0941, 0x0948 }, { 0x094D, 0x094D }, { 0x0951, 0x0954 }, + { 0x0962, 0x0963 }, { 0x0981, 0x0981 }, { 0x09BC, 0x09BC }, + { 0x09C1, 0x09C4 }, { 0x09CD, 0x09CD }, { 0x09E2, 0x09E3 }, + { 0x0A02, 0x0A02 }, { 0x0A3C, 0x0A3C }, { 0x0A41, 0x0A42 }, + { 0x0A47, 0x0A48 }, { 0x0A4B, 0x0A4D }, { 0x0A70, 0x0A71 }, + { 0x0A81, 0x0A82 }, { 0x0ABC, 0x0ABC }, { 0x0AC1, 0x0AC5 }, + { 0x0AC7, 0x0AC8 }, { 0x0ACD, 0x0ACD }, { 0x0B01, 0x0B01 }, + { 0x0B3C, 0x0B3C }, { 0x0B3F, 0x0B3F }, { 0x0B41, 0x0B43 }, + { 0x0B4D, 0x0B4D }, { 0x0B56, 0x0B56 }, { 0x0B82, 0x0B82 }, + { 0x0BC0, 0x0BC0 }, { 0x0BCD, 0x0BCD }, { 0x0C3E, 0x0C40 }, + { 0x0C46, 0x0C48 }, { 0x0C4A, 0x0C4D }, { 0x0C55, 0x0C56 }, + { 0x0CBF, 0x0CBF }, { 0x0CC6, 0x0CC6 }, { 0x0CCC, 0x0CCD }, + { 0x0D41, 0x0D43 }, { 0x0D4D, 0x0D4D }, { 0x0DCA, 0x0DCA }, + { 0x0DD2, 0x0DD4 }, { 0x0DD6, 0x0DD6 }, { 0x0E31, 0x0E31 }, + { 0x0E34, 0x0E3A }, { 0x0E47, 0x0E4E }, { 0x0EB1, 0x0EB1 }, + { 0x0EB4, 0x0EB9 }, { 0x0EBB, 0x0EBC }, { 0x0EC8, 0x0ECD }, + { 0x0F18, 0x0F19 }, { 0x0F35, 0x0F35 }, { 0x0F37, 0x0F37 }, + { 0x0F39, 0x0F39 }, { 0x0F71, 0x0F7E }, { 0x0F80, 0x0F84 }, + { 0x0F86, 0x0F87 }, { 0x0F90, 0x0F97 }, { 0x0F99, 0x0FBC }, + { 0x0FC6, 0x0FC6 }, { 0x102D, 0x1030 }, { 0x1032, 0x1032 }, + { 0x1036, 0x1037 }, { 0x1039, 0x1039 }, { 0x1058, 0x1059 }, + { 0x1160, 0x11FF }, { 0x17B7, 0x17BD }, { 0x17C6, 0x17C6 }, + { 0x17C9, 0x17D3 }, { 0x180B, 0x180E }, { 0x18A9, 0x18A9 }, + { 0x200B, 0x200F }, { 0x202A, 0x202E }, { 0x206A, 0x206F }, + { 0x20D0, 0x20E3 }, { 0x302A, 0x302F }, { 0x3099, 0x309A }, + { 0xFB1E, 0xFB1E }, { 0xFE20, 0xFE23 }, { 0xFEFF, 0xFEFF }, + { 0xFFF9, 0xFFFB } + }; + + /* test for 8-bit control characters */ + if (ucs == 0) + return 0; + if (ucs < 32 || (ucs >= 0x7f && ucs < 0xa0)) + return -1; + + /* binary search in table of non-spacing characters */ + if (bisearch(ucs, combining, + sizeof(combining) / sizeof(struct interval) - 1)) + return 0; + + /* if we arrive here, ucs is not a combining or C0/C1 control character */ + + return 1 + + (ucs >= 0x1100 && + (ucs <= 0x115f || /* Hangul Jamo init. consonants */ + (ucs >= 0x2e80 && ucs <= 0xa4cf && (ucs & ~0x0011) != 0x300a && + ucs != 0x303f) || /* CJK ... Yi */ + (ucs >= 0xac00 && ucs <= 0xd7a3) || /* Hangul Syllables */ + (ucs >= 0xf900 && ucs <= 0xfaff) || /* CJK Compatibility Ideographs */ + (ucs >= 0xfe30 && ucs <= 0xfe6f) || /* CJK Compatibility Forms */ + (ucs >= 0xff00 && ucs <= 0xff5f) || /* Fullwidth Forms */ + (ucs >= 0xffe0 && ucs <= 0xffe6) || + (ucs >= 0x20000 && ucs <= 0x2ffff))); +} + + +int wcswidth(const wchar_t *pwcs, size_t n) +{ + int w, width = 0; + + for (;*pwcs && n-- > 0; pwcs++) + if ((w = wcwidth(*pwcs)) < 0) + return -1; + else + width += w; + + return width; +} + + +/* + * The following function is the same as wcwidth(), except that + * spacing characters in the East Asian Ambiguous (A) category as + * defined in Unicode Technical Report #11 have a column width of 2. + * This experimental variant might be useful for users of CJK legacy + * encodings who want to migrate to UCS. It is not otherwise + * recommended for general use. + */ +static int wcwidth_cjk(wchar_t ucs) +{ + /* sorted list of non-overlapping intervals of East Asian Ambiguous + * characters */ + static const struct interval ambiguous[] = { + { 0x00A1, 0x00A1 }, { 0x00A4, 0x00A4 }, { 0x00A7, 0x00A8 }, + { 0x00AA, 0x00AA }, { 0x00AD, 0x00AE }, { 0x00B0, 0x00B4 }, + { 0x00B6, 0x00BA }, { 0x00BC, 0x00BF }, { 0x00C6, 0x00C6 }, + { 0x00D0, 0x00D0 }, { 0x00D7, 0x00D8 }, { 0x00DE, 0x00E1 }, + { 0x00E6, 0x00E6 }, { 0x00E8, 0x00EA }, { 0x00EC, 0x00ED }, + { 0x00F0, 0x00F0 }, { 0x00F2, 0x00F3 }, { 0x00F7, 0x00FA }, + { 0x00FC, 0x00FC }, { 0x00FE, 0x00FE }, { 0x0101, 0x0101 }, + { 0x0111, 0x0111 }, { 0x0113, 0x0113 }, { 0x011B, 0x011B }, + { 0x0126, 0x0127 }, { 0x012B, 0x012B }, { 0x0131, 0x0133 }, + { 0x0138, 0x0138 }, { 0x013F, 0x0142 }, { 0x0144, 0x0144 }, + { 0x0148, 0x014B }, { 0x014D, 0x014D }, { 0x0152, 0x0153 }, + { 0x0166, 0x0167 }, { 0x016B, 0x016B }, { 0x01CE, 0x01CE }, + { 0x01D0, 0x01D0 }, { 0x01D2, 0x01D2 }, { 0x01D4, 0x01D4 }, + { 0x01D6, 0x01D6 }, { 0x01D8, 0x01D8 }, { 0x01DA, 0x01DA }, + { 0x01DC, 0x01DC }, { 0x0251, 0x0251 }, { 0x0261, 0x0261 }, + { 0x02C4, 0x02C4 }, { 0x02C7, 0x02C7 }, { 0x02C9, 0x02CB }, + { 0x02CD, 0x02CD }, { 0x02D0, 0x02D0 }, { 0x02D8, 0x02DB }, + { 0x02DD, 0x02DD }, { 0x02DF, 0x02DF }, { 0x0300, 0x034E }, + { 0x0360, 0x0362 }, { 0x0391, 0x03A1 }, { 0x03A3, 0x03A9 }, + { 0x03B1, 0x03C1 }, { 0x03C3, 0x03C9 }, { 0x0401, 0x0401 }, + { 0x0410, 0x044F }, { 0x0451, 0x0451 }, { 0x2010, 0x2010 }, + { 0x2013, 0x2016 }, { 0x2018, 0x2019 }, { 0x201C, 0x201D }, + { 0x2020, 0x2022 }, { 0x2024, 0x2027 }, { 0x2030, 0x2030 }, + { 0x2032, 0x2033 }, { 0x2035, 0x2035 }, { 0x203B, 0x203B }, + { 0x203E, 0x203E }, { 0x2074, 0x2074 }, { 0x207F, 0x207F }, + { 0x2081, 0x2084 }, { 0x20AC, 0x20AC }, { 0x2103, 0x2103 }, + { 0x2105, 0x2105 }, { 0x2109, 0x2109 }, { 0x2113, 0x2113 }, + { 0x2116, 0x2116 }, { 0x2121, 0x2122 }, { 0x2126, 0x2126 }, + { 0x212B, 0x212B }, { 0x2153, 0x2155 }, { 0x215B, 0x215E }, + { 0x2160, 0x216B }, { 0x2170, 0x2179 }, { 0x2190, 0x2199 }, + { 0x21B8, 0x21B9 }, { 0x21D2, 0x21D2 }, { 0x21D4, 0x21D4 }, + { 0x21E7, 0x21E7 }, { 0x2200, 0x2200 }, { 0x2202, 0x2203 }, + { 0x2207, 0x2208 }, { 0x220B, 0x220B }, { 0x220F, 0x220F }, + { 0x2211, 0x2211 }, { 0x2215, 0x2215 }, { 0x221A, 0x221A }, + { 0x221D, 0x2220 }, { 0x2223, 0x2223 }, { 0x2225, 0x2225 }, + { 0x2227, 0x222C }, { 0x222E, 0x222E }, { 0x2234, 0x2237 }, + { 0x223C, 0x223D }, { 0x2248, 0x2248 }, { 0x224C, 0x224C }, + { 0x2252, 0x2252 }, { 0x2260, 0x2261 }, { 0x2264, 0x2267 }, + { 0x226A, 0x226B }, { 0x226E, 0x226F }, { 0x2282, 0x2283 }, + { 0x2286, 0x2287 }, { 0x2295, 0x2295 }, { 0x2299, 0x2299 }, + { 0x22A5, 0x22A5 }, { 0x22BF, 0x22BF }, { 0x2312, 0x2312 }, + { 0x2329, 0x232A }, { 0x2460, 0x24BF }, { 0x24D0, 0x24E9 }, + { 0x2500, 0x254B }, { 0x2550, 0x2574 }, { 0x2580, 0x258F }, + { 0x2592, 0x2595 }, { 0x25A0, 0x25A1 }, { 0x25A3, 0x25A9 }, + { 0x25B2, 0x25B3 }, { 0x25B6, 0x25B7 }, { 0x25BC, 0x25BD }, + { 0x25C0, 0x25C1 }, { 0x25C6, 0x25C8 }, { 0x25CB, 0x25CB }, + { 0x25CE, 0x25D1 }, { 0x25E2, 0x25E5 }, { 0x25EF, 0x25EF }, + { 0x2605, 0x2606 }, { 0x2609, 0x2609 }, { 0x260E, 0x260F }, + { 0x261C, 0x261C }, { 0x261E, 0x261E }, { 0x2640, 0x2640 }, + { 0x2642, 0x2642 }, { 0x2660, 0x2661 }, { 0x2663, 0x2665 }, + { 0x2667, 0x266A }, { 0x266C, 0x266D }, { 0x266F, 0x266F }, + { 0x273D, 0x273D }, { 0x3008, 0x300B }, { 0x3014, 0x3015 }, + { 0x3018, 0x301B }, { 0xFFFD, 0xFFFD } + }; + + /* binary search in table of non-spacing characters */ + if (bisearch(ucs, ambiguous, + sizeof(ambiguous) / sizeof(struct interval) - 1)) + return 2; + + return wcwidth(ucs); +} + + +int wcswidth_cjk(const wchar_t *pwcs, size_t n) +{ + int w, width = 0; + + for (;*pwcs && n-- > 0; pwcs++) + if ((w = wcwidth_cjk(*pwcs)) < 0) + return -1; + else + width += w; + + return width; +} diff --git a/vendors/readline/src/readline/tcap.h b/vendors/readline/src/readline/tcap.h new file mode 100644 index 0000000..58ab894 --- /dev/null +++ b/vendors/readline/src/readline/tcap.h @@ -0,0 +1,60 @@ +/* tcap.h -- termcap library functions and variables. */ + +/* Copyright (C) 1996 Free Software Foundation, Inc. + + This file contains the Readline Library (the Library), a set of + routines for providing Emacs style line input to programs that ask + for it. + + The Library is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + The 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 + General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + +#if !defined (_RLTCAP_H_) +#define _RLTCAP_H_ + +#if defined (HAVE_CONFIG_H) +# include "config.h" +#endif + +#if defined (HAVE_TERMCAP_H) +# if defined (__linux__) && !defined (SPEED_T_IN_SYS_TYPES) +# include "rltty.h" +# endif +# include +#else + +/* On Solaris2, sys/types.h #includes sys/reg.h, which #defines PC. + Unfortunately, PC is a global variable used by the termcap library. */ +#ifdef PC +# undef PC +#endif + +extern char PC; +extern char *UP, *BC; + +extern short ospeed; + +extern int tgetent (); +extern int tgetflag (); +extern int tgetnum (); +extern char *tgetstr (); + +extern int tputs (); + +extern char *tgoto (); + +#endif /* HAVE_TERMCAP_H */ + +#endif /* !_RLTCAP_H_ */ diff --git a/vendors/readline/src/readline/terminal.c b/vendors/readline/src/readline/terminal.c new file mode 100644 index 0000000..810e60b --- /dev/null +++ b/vendors/readline/src/readline/terminal.c @@ -0,0 +1,839 @@ +/* terminal.c -- controlling the terminal with termcap. */ + +/* Copyright (C) 1996 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library, a library for + reading lines of text with interactive input and history editing. + + The GNU Readline Library is free software; you can redistribute it + and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2, or + (at your option) any later version. + + The GNU Readline 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 General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include +#include "posixstat.h" +#include +#if defined (HAVE_SYS_FILE_H) +# include +#endif /* HAVE_SYS_FILE_H */ + +#if defined (HAVE_UNISTD_H) +# include +#endif /* HAVE_UNISTD_H */ + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#if defined (HAVE_LOCALE_H) +# include +#endif + +#include + +/* System-specific feature definitions and include files. */ +#include "rldefs.h" + +#if defined (_WIN32) +# include +extern int haveConsole; /* imported from rltty.c */ +extern HANDLE hStdout, hStdin; +extern COORD rlScreenEnd; +extern int rlScreenMax; +#else /* !_WIN32 */ +#if defined (GWINSZ_IN_SYS_IOCTL) && !defined (TIOCGWINSZ) +# include +#endif /* GWINSZ_IN_SYS_IOCTL && !TIOCGWINSZ */ +#endif /* !_WIN32 */ + +#ifdef __MSDOS__ +# include +#endif + +#include "rltty.h" +#include "tcap.h" + +/* Some standard library routines. */ +#include "readline.h" +#include "history.h" + +#include "rlprivate.h" +#include "rlshell.h" +#include "xmalloc.h" + +#define CUSTOM_REDISPLAY_FUNC() (rl_redisplay_function != rl_redisplay) +#define CUSTOM_INPUT_FUNC() (rl_getc_function != rl_getc) + +/* **************************************************************** */ +/* */ +/* Terminal and Termcap */ +/* */ +/* **************************************************************** */ + +#if !defined (__MSDOS__) && !defined (_WIN32) +static char *term_buffer = (char *)NULL; +static char *term_string_buffer = (char *)NULL; + +/* Non-zero means this terminal can't really do anything. */ +static int dumb_term; +#endif /* !__MSDOS__ && !_WIN32 */ + +static int tcap_initialized; + +#if !defined (__linux__) +# if defined (__EMX__) || defined (NEED_EXTERN_PC) +extern +# endif /* __EMX__ || NEED_EXTERN_PC */ +char PC, *BC, *UP; +#endif /* __linux__ */ + +/* Some strings to control terminal actions. These are output by tputs (). */ +char *_rl_term_clreol; +char *_rl_term_clrpag; +char *_rl_term_cr; +char *_rl_term_backspace; +char *_rl_term_goto; +char *_rl_term_pc; + +/* Non-zero if we determine that the terminal can do character insertion. */ +int _rl_terminal_can_insert = 0; + +/* How to insert characters. */ +char *_rl_term_im; +char *_rl_term_ei; +char *_rl_term_ic; +char *_rl_term_ip; +char *_rl_term_IC; + +/* How to delete characters. */ +char *_rl_term_dc; +char *_rl_term_DC; + +#if defined (HACK_TERMCAP_MOTION) +char *_rl_term_forward_char; +#endif /* HACK_TERMCAP_MOTION */ + +/* How to go up a line. */ +char *_rl_term_up; + +/* A visible bell; char if the terminal can be made to flash the screen. */ +static char *_rl_visible_bell; + +/* Non-zero means the terminal can auto-wrap lines. */ +int _rl_term_autowrap; + +/* Non-zero means that this terminal has a meta key. */ +static int term_has_meta; + +/* The sequences to write to turn on and off the meta key, if this + terminal has one. */ +static char *_rl_term_mm; +static char *_rl_term_mo; + +/* The key sequences output by the arrow keys, if this terminal has any. */ +static char *_rl_term_ku; +static char *_rl_term_kd; +static char *_rl_term_kr; +static char *_rl_term_kl; + +/* How to initialize and reset the arrow keys, if this terminal has any. */ +static char *_rl_term_ks; +static char *_rl_term_ke; + +/* The key sequences sent by the Home and End keys, if any. */ +static char *_rl_term_kh; +static char *_rl_term_kH; +static char *_rl_term_at7; /* @7 */ + +/* Insert key */ +static char *_rl_term_kI; + +/* Cursor control */ +static char *_rl_term_vs; /* very visible */ +static char *_rl_term_ve; /* normal */ + +static void bind_termcap_arrow_keys PARAMS((Keymap)); + +/* Variables that hold the screen dimensions, used by the display code. */ +int _rl_screenwidth, _rl_screenheight, _rl_screenchars; + +/* Non-zero means the user wants to enable the keypad. */ +int _rl_enable_keypad; + +/* Non-zero means the user wants to enable a meta key. */ +int _rl_enable_meta = 1; + +#if defined (__EMX__) +static void +_emx_get_screensize (swp, shp) + int *swp, *shp; +{ + int sz[2]; + + _scrsize (sz); + + if (swp) + *swp = sz[0]; + if (shp) + *shp = sz[1]; +} +#endif + +/* Get readline's idea of the screen size. TTY is a file descriptor open + to the terminal. If IGNORE_ENV is true, we do not pay attention to the + values of $LINES and $COLUMNS. The tests for TERM_STRING_BUFFER being + non-null serve to check whether or not we have initialized termcap. */ +#if !defined (_WIN32) +void +_rl_get_screen_size (tty, ignore_env) + int tty, ignore_env; +{ + char *ss; +#if defined (TIOCGWINSZ) + struct winsize window_size; +#endif /* TIOCGWINSZ */ + +#if defined (TIOCGWINSZ) + if (ioctl (tty, TIOCGWINSZ, &window_size) == 0) + { + _rl_screenwidth = (int) window_size.ws_col; + _rl_screenheight = (int) window_size.ws_row; + } +#endif /* TIOCGWINSZ */ + +#if defined (__EMX__) + _emx_get_screensize (&_rl_screenwidth, &_rl_screenheight); +#endif + + /* Environment variable COLUMNS overrides setting of "co" if IGNORE_ENV + is unset. */ + if (_rl_screenwidth <= 0) + { + if (ignore_env == 0 && (ss = sh_get_env_value ("COLUMNS"))) + _rl_screenwidth = atoi (ss); + +#if defined (__DJGPP__) + if (_rl_screenwidth <= 0) + _rl_screenwidth = ScreenCols (); +#else + if (_rl_screenwidth <= 0 && term_string_buffer) + _rl_screenwidth = tgetnum ("co"); +#endif + } + + /* Environment variable LINES overrides setting of "li" if IGNORE_ENV + is unset. */ + if (_rl_screenheight <= 0) + { + if (ignore_env == 0 && (ss = sh_get_env_value ("LINES"))) + _rl_screenheight = atoi (ss); + +#if defined (__DJGPP__) + if (_rl_screenheight <= 0) + _rl_screenheight = ScreenRows (); +#else + if (_rl_screenheight <= 0 && term_string_buffer) + _rl_screenheight = tgetnum ("li"); +#endif + } + + /* If all else fails, default to 80x24 terminal. */ + if (_rl_screenwidth <= 1) + _rl_screenwidth = 80; + + if (_rl_screenheight <= 0) + _rl_screenheight = 24; + + /* If we're being compiled as part of bash, set the environment + variables $LINES and $COLUMNS to new values. Otherwise, just + do a pair of putenv () or setenv () calls. */ + sh_set_lines_and_columns (_rl_screenheight, _rl_screenwidth); + + if (_rl_term_autowrap == 0) + _rl_screenwidth--; + + _rl_screenchars = _rl_screenwidth * _rl_screenheight; +} + +#else /* _WIN32*/ + +void +_rl_get_screen_size (tty, ignore_env) + int tty, ignore_env; +{ + CONSOLE_SCREEN_BUFFER_INFO csbi; + + if ( (haveConsole & FOR_OUTPUT) && + GetConsoleScreenBufferInfo(hStdout, &csbi) ) + { + _rl_screenwidth = csbi.dwSize.X; + _rl_screenheight = csbi.dwSize.Y; + } + else + { + _rl_screenwidth = 80; + _rl_screenheight = 24; + } + _rl_screenchars = _rl_screenwidth * _rl_screenheight; +} +#endif /* _WIN32 */ + +void +_rl_set_screen_size (rows, cols) + int rows, cols; +{ + if (rows == 0 || cols == 0) + return; + + _rl_screenheight = rows; + _rl_screenwidth = cols; + + if (_rl_term_autowrap == 0) + _rl_screenwidth--; + + _rl_screenchars = _rl_screenwidth * _rl_screenheight; +} + +void +rl_set_screen_size (rows, cols) + int rows, cols; +{ + _rl_set_screen_size (rows, cols); +} + +void +rl_get_screen_size (rows, cols) + int *rows, *cols; +{ + if (rows) + *rows = _rl_screenheight; + if (cols) + *cols = _rl_screenwidth; +} + +void +rl_resize_terminal () +{ + if (readline_echoing_p) + { + _rl_get_screen_size (fileno (rl_instream), 1); + if (CUSTOM_REDISPLAY_FUNC ()) + rl_forced_update_display (); + else + _rl_redisplay_after_sigwinch (); + } +} + +#if !defined (_WIN32) +struct _tc_string { + const char *tc_var; + char **tc_value; +}; + +/* This should be kept sorted, just in case we decide to change the + search algorithm to something smarter. */ +static struct _tc_string tc_strings[] = +{ + { "@7", &_rl_term_at7 }, + { "DC", &_rl_term_DC }, + { "IC", &_rl_term_IC }, + { "ce", &_rl_term_clreol }, + { "cl", &_rl_term_clrpag }, + { "cr", &_rl_term_cr }, + { "dc", &_rl_term_dc }, + { "ei", &_rl_term_ei }, + { "ic", &_rl_term_ic }, + { "im", &_rl_term_im }, + { "kH", &_rl_term_kH }, /* home down ?? */ + { "kI", &_rl_term_kI }, /* insert */ + { "kd", &_rl_term_kd }, + { "ke", &_rl_term_ke }, /* end keypad mode */ + { "kh", &_rl_term_kh }, /* home */ + { "kl", &_rl_term_kl }, + { "kr", &_rl_term_kr }, + { "ks", &_rl_term_ks }, /* start keypad mode */ + { "ku", &_rl_term_ku }, + { "le", &_rl_term_backspace }, + { "mm", &_rl_term_mm }, + { "mo", &_rl_term_mo }, +#if defined (HACK_TERMCAP_MOTION) + { "nd", &_rl_term_forward_char }, +#endif + { "pc", &_rl_term_pc }, + { "up", &_rl_term_up }, + { "vb", &_rl_visible_bell }, + { "vs", &_rl_term_vs }, + { "ve", &_rl_term_ve }, +}; + +#define NUM_TC_STRINGS (sizeof (tc_strings) / sizeof (struct _tc_string)) + +/* Read the desired terminal capability strings into BP. The capabilities + are described in the TC_STRINGS table. */ +static void +get_term_capabilities (bp) + char **bp; +{ +#if !defined (__DJGPP__) /* XXX - doesn't DJGPP have a termcap library? */ + register int i; + + for (i = 0; i < NUM_TC_STRINGS; i++) + *(tc_strings[i].tc_value) = tgetstr ((char *)tc_strings[i].tc_var, bp); +#endif + tcap_initialized = 1; +} +#endif /* !_WIN32 */ + +int +_rl_init_terminal_io (terminal_name) + const char *terminal_name; +{ +#if defined (_WIN32) + _rl_term_cr = "\r"; /* any value != 0 */ + _rl_term_im = _rl_term_ei = _rl_term_ic = _rl_term_IC = (char *)NULL; /* !! we emulate insertion */ + _rl_term_up = "y"; /* any value != 0 */ + _rl_term_dc = _rl_term_DC = (char *)NULL; /* !! we emulate deletion */ + _rl_visible_bell = (char *)NULL; + + _rl_get_screen_size (0, 1); + + /* Let Windows handle meta keys! */ + term_has_meta = 0; + _rl_term_mm = _rl_term_mo = (char *)NULL; + + /* It probably has arrow keys, but I don't know what they are. */ + _rl_term_ku = _rl_term_kd = _rl_term_kr = _rl_term_kl = (char *)NULL; + +#if defined (HACK_TERMCAP_MOTION) + _rl_term_forward_char = (char *)NULL; +#endif /* HACK_TERMCAP_MOTION */ + + _rl_terminal_can_insert = 0; + _rl_term_autowrap = 1; + +#else /* !_WIN32 */ + + const char *term; + char *buffer; + int tty, tgetent_ret; + + term = terminal_name ? terminal_name : sh_get_env_value ("TERM"); + _rl_term_clrpag = _rl_term_cr = _rl_term_clreol = (char *)NULL; + tty = rl_instream ? fileno (rl_instream) : 0; + _rl_screenwidth = _rl_screenheight = 0; + + if (term == 0) + term = "dumb"; + +#ifdef __MSDOS__ + _rl_term_im = _rl_term_ei = _rl_term_ic = _rl_term_IC = (char *)NULL; + _rl_term_up = _rl_term_dc = _rl_term_DC = _rl_visible_bell = (char *)NULL; + _rl_term_ku = _rl_term_kd = _rl_term_kl = _rl_term_kr = (char *)NULL; + _rl_term_mm = _rl_term_mo = (char *)NULL; + _rl_terminal_can_insert = term_has_meta = _rl_term_autowrap = 0; + _rl_term_cr = "\r"; + _rl_term_clreol = _rl_term_clrpag = _rl_term_backspace = (char *)NULL; + _rl_term_goto = _rl_term_pc = _rl_term_ip = (char *)NULL; + _rl_term_ks = _rl_term_ke =_rl_term_vs = _rl_term_ve = (char *)NULL; + _rl_term_kh = _rl_term_kH = _rl_term_at7 = _rl_term_kI = (char *)NULL; +#if defined(HACK_TERMCAP_MOTION) + _rl_term_forward_char = (char *)NULL; +#endif + + _rl_get_screen_size (tty, 0); +#else /* !__MSDOS__ */ + /* I've separated this out for later work on not calling tgetent at all + if the calling application has supplied a custom redisplay function, + (and possibly if the application has supplied a custom input function). */ + if (CUSTOM_REDISPLAY_FUNC()) + { + tgetent_ret = -1; + } + else + { + if (term_string_buffer == 0) + term_string_buffer = (char *)xmalloc(2032); + + if (term_buffer == 0) + term_buffer = (char *)xmalloc(4080); + + buffer = term_string_buffer; + + tgetent_ret = tgetent (term_buffer, term); + } + + if (tgetent_ret <= 0) + { + FREE (term_string_buffer); + FREE (term_buffer); + buffer = term_buffer = term_string_buffer = (char *)NULL; + + _rl_term_autowrap = 0; /* used by _rl_get_screen_size */ + +#if defined (__EMX__) + _emx_get_screensize (&_rl_screenwidth, &_rl_screenheight); + _rl_screenwidth--; +#else /* !__EMX__ */ + _rl_get_screen_size (tty, 0); +#endif /* !__EMX__ */ + + /* Defaults. */ + if (_rl_screenwidth <= 0 || _rl_screenheight <= 0) + { + _rl_screenwidth = 79; + _rl_screenheight = 24; + } + + /* Everything below here is used by the redisplay code (tputs). */ + _rl_screenchars = _rl_screenwidth * _rl_screenheight; + _rl_term_cr = "\r"; + _rl_term_im = _rl_term_ei = _rl_term_ic = _rl_term_IC = (char *)NULL; + _rl_term_up = _rl_term_dc = _rl_term_DC = _rl_visible_bell = (char *)NULL; + _rl_term_ku = _rl_term_kd = _rl_term_kl = _rl_term_kr = (char *)NULL; + _rl_term_kh = _rl_term_kH = _rl_term_kI = (char *)NULL; + _rl_term_ks = _rl_term_ke = _rl_term_at7 = (char *)NULL; + _rl_term_mm = _rl_term_mo = (char *)NULL; + _rl_term_ve = _rl_term_vs = (char *)NULL; +#if defined (HACK_TERMCAP_MOTION) + term_forward_char = (char *)NULL; +#endif + _rl_terminal_can_insert = term_has_meta = 0; + + /* Reasonable defaults for tgoto(). Readline currently only uses + tgoto if _rl_term_IC or _rl_term_DC is defined, but just in case we + change that later... */ + PC = '\0'; + BC = _rl_term_backspace = "\b"; + UP = _rl_term_up; + + return 0; + } + + get_term_capabilities (&buffer); + + /* Set up the variables that the termcap library expects the application + to provide. */ + PC = _rl_term_pc ? *_rl_term_pc : 0; + BC = _rl_term_backspace; + UP = _rl_term_up; + + if (!_rl_term_cr) + _rl_term_cr = "\r"; + + _rl_term_autowrap = tgetflag ("am") && tgetflag ("xn"); + + _rl_get_screen_size (tty, 0); + + /* "An application program can assume that the terminal can do + character insertion if *any one of* the capabilities `IC', + `im', `ic' or `ip' is provided." But we can't do anything if + only `ip' is provided, so... */ + _rl_terminal_can_insert = (_rl_term_IC || _rl_term_im || _rl_term_ic); + + /* Check to see if this terminal has a meta key and clear the capability + variables if there is none. */ + term_has_meta = (tgetflag ("km") || tgetflag ("MT")); + if (!term_has_meta) + _rl_term_mm = _rl_term_mo = (char *)NULL; + +#endif /* !__MSDOS__ */ + + /* Attempt to find and bind the arrow keys. Do not override already + bound keys in an overzealous attempt, however. */ + + bind_termcap_arrow_keys (emacs_standard_keymap); + +#if defined (VI_MODE) + bind_termcap_arrow_keys (vi_movement_keymap); + bind_termcap_arrow_keys (vi_insertion_keymap); +#endif /* VI_MODE */ + +#endif /* !_WIN32 */ + + return 0; +} + +#if !defined (_WIN32) +/* Bind the arrow key sequences from the termcap description in MAP. */ +static void +bind_termcap_arrow_keys (map) + Keymap map; +{ + Keymap xkeymap; + + xkeymap = _rl_keymap; + _rl_keymap = map; + + rl_bind_keyseq_if_unbound (_rl_term_ku, rl_get_previous_history); + rl_bind_keyseq_if_unbound (_rl_term_kd, rl_get_next_history); + rl_bind_keyseq_if_unbound (_rl_term_kr, rl_forward_char); + rl_bind_keyseq_if_unbound (_rl_term_kl, rl_backward_char); + + rl_bind_keyseq_if_unbound (_rl_term_kh, rl_beg_of_line); /* Home */ + rl_bind_keyseq_if_unbound (_rl_term_at7, rl_end_of_line); /* End */ + + _rl_keymap = xkeymap; +} + +char * +rl_get_termcap (cap) + const char *cap; +{ + register int i; + + if (tcap_initialized == 0) + return ((char *)NULL); + for (i = 0; i < NUM_TC_STRINGS; i++) + { + if (tc_strings[i].tc_var[0] == cap[0] && strcmp (tc_strings[i].tc_var, cap) == 0) + return *(tc_strings[i].tc_value); + } + return ((char *)NULL); +} +#endif /* !_WIN32 */ + +/* Re-initialize the terminal considering that the TERM/TERMCAP variable + has changed. */ +int +rl_reset_terminal (terminal_name) + const char *terminal_name; +{ + _rl_init_terminal_io (terminal_name); + return 0; +} + +#if !defined (_WIN32) +/* A function for the use of tputs () */ +#ifdef _MINIX +void +_rl_output_character_function (c) + int c; +{ + putc (c, _rl_out_stream); +} +#else /* !_MINIX */ +int +_rl_output_character_function (c) + int c; +{ + return putc (c, _rl_out_stream); +} +#endif /* !_MINIX */ + +/* Write COUNT characters from STRING to the output stream. */ +void +_rl_output_some_chars (string, count) + const char *string; + int count; +{ + fwrite (string, 1, count, _rl_out_stream); +} + +/* Move the cursor back. */ +int +_rl_backspace (count) + int count; +{ + register int i; + +#ifndef __MSDOS__ + if (_rl_term_backspace) + for (i = 0; i < count; i++) + tputs (_rl_term_backspace, 1, _rl_output_character_function); + else +#endif + for (i = 0; i < count; i++) + putc ('\b', _rl_out_stream); + return 0; +} + +/* Move to the start of the next line. */ +int +rl_crlf () +{ +#if defined (NEW_TTY_DRIVER) + if (_rl_term_cr) + tputs (_rl_term_cr, 1, _rl_output_character_function); +#endif /* NEW_TTY_DRIVER */ + putc ('\n', _rl_out_stream); + return 0; +} + +/* Ring the terminal bell. */ +int +rl_ding () +{ + if (readline_echoing_p) + { + switch (_rl_bell_preference) + { + case NO_BELL: + default: + break; + case VISIBLE_BELL: +#ifdef __MSDOS__ + ScreenVisualBell (); + break; +#else + if (_rl_visible_bell) + { + tputs (_rl_visible_bell, 1, _rl_output_character_function); + break; + } +#endif + /* FALLTHROUGH */ + case AUDIBLE_BELL: + fprintf (stderr, "\007"); + fflush (stderr); + break; + } + return (0); + } + return (-1); +} + +#else /* _WIN32 */ + +/* Write COUNT characters from STRING to the output stream. */ +void +_rl_output_some_chars (string, count) + const char *string; + int count; +{ + CONSOLE_SCREEN_BUFFER_INFO csbi; + fwrite (string, 1, count, _rl_out_stream); + if ( (haveConsole & FOR_OUTPUT) && GetConsoleScreenBufferInfo(hStdout, &csbi) ) + { + int linear_pos = (int)csbi.dwCursorPosition.Y * (int)csbi.dwSize.X + + (int)csbi.dwCursorPosition.X; + if (linear_pos > rlScreenMax) + { + rlScreenEnd = csbi.dwCursorPosition; + rlScreenMax = linear_pos; + } + } +} + +/* This is used to collect all putc output */ +int +_rl_output_character_function (c) + int c; +{ + _rl_output_some_chars ((char *)&c, 1); + return 1; +} + +/* Move the cursor back. */ +int +_rl_backspace (count) + int count; +{ + CONSOLE_SCREEN_BUFFER_INFO csbi; + + if ( (haveConsole & FOR_OUTPUT) && GetConsoleScreenBufferInfo(hStdout, &csbi) ) + { + while (count > csbi.dwCursorPosition.X) + { + --csbi.dwCursorPosition.Y; + count -= csbi.dwCursorPosition.X + 1; + csbi.dwCursorPosition.X = csbi.dwSize.X - 1; + } + csbi.dwCursorPosition.X -= count; + SetConsoleCursorPosition(hStdout, csbi.dwCursorPosition); + } + return 0; +} + +/* Move to the start of the next line. */ +int +rl_crlf () +{ + _rl_output_some_chars ("\n", 1); + return 0; +} + +/* Ring the terminal bell. */ +int +rl_ding () +{ + if (readline_echoing_p) + { + if (_rl_bell_preference != NO_BELL) + MessageBeep(MB_OK); + return (0); + } + return (-1); +} +#endif /* _WIN32 */ + +/* **************************************************************** */ +/* */ +/* Controlling the Meta Key and Keypad */ +/* */ +/* **************************************************************** */ + +void +_rl_enable_meta_key () +{ +#if !defined (__DJGPP__) && !defined (_WIN32) + if (term_has_meta && _rl_term_mm) + tputs (_rl_term_mm, 1, _rl_output_character_function); +#endif +} + +void +_rl_control_keypad (on) + int on; +{ +#if !defined (__DJGPP__) && !defined (_WIN32) + if (on && _rl_term_ks) + tputs (_rl_term_ks, 1, _rl_output_character_function); + else if (!on && _rl_term_ke) + tputs (_rl_term_ke, 1, _rl_output_character_function); +#endif +} + +/* **************************************************************** */ +/* */ +/* Controlling the Cursor */ +/* */ +/* **************************************************************** */ + +/* Set the cursor appropriately depending on IM, which is one of the + insert modes (insert or overwrite). Insert mode gets the normal + cursor. Overwrite mode gets a very visible cursor. Only does + anything if we have both capabilities. */ +void +_rl_set_cursor (im, force) + int im, force; +{ +#if !defined (__MSDOS__) && !defined (_WIN32) + if (_rl_term_ve && _rl_term_vs) + { + if (force || im != rl_insert_mode) + { + if (im == RL_IM_OVERWRITE) + tputs (_rl_term_vs, 1, _rl_output_character_function); + else + tputs (_rl_term_ve, 1, _rl_output_character_function); + } + } +#endif +} diff --git a/vendors/readline/src/readline/text.c b/vendors/readline/src/readline/text.c new file mode 100644 index 0000000..d917e99 --- /dev/null +++ b/vendors/readline/src/readline/text.c @@ -0,0 +1,1547 @@ +/* text.c -- text handling commands for readline. */ + +/* Copyright (C) 1987-2004 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library, a library for + reading lines of text with interactive input and history editing. + + The GNU Readline Library is free software; you can redistribute it + and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2, or + (at your option) any later version. + + The GNU Readline 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 General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#if defined (HAVE_UNISTD_H) +# include +#endif /* HAVE_UNISTD_H */ + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#if defined (HAVE_LOCALE_H) +# include +#endif + +#include + +/* System-specific feature definitions and include files. */ +#include "rldefs.h" +#include "rlmbutil.h" + +#if defined (__EMX__) +# define INCL_DOSPROCESS +# include +#endif /* __EMX__ */ + +/* Some standard library routines. */ +#include "readline.h" +#include "history.h" + +#include "rlprivate.h" +#include "rlshell.h" +#include "xmalloc.h" + +/* Forward declarations. */ +static int rl_change_case PARAMS((int, int)); +static int _rl_char_search PARAMS((int, int, int)); + +/* **************************************************************** */ +/* */ +/* Insert and Delete */ +/* */ +/* **************************************************************** */ + +/* Insert a string of text into the line at point. This is the only + way that you should do insertion. _rl_insert_char () calls this + function. Returns the number of characters inserted. */ +int +rl_insert_text (string) + const char *string; +{ + register int i, l; + + l = (string && *string) ? strlen (string) : 0; + if (l == 0) + return 0; + + if (rl_end + l >= rl_line_buffer_len) + rl_extend_line_buffer (rl_end + l); + + for (i = rl_end; i >= rl_point; i--) + rl_line_buffer[i + l] = rl_line_buffer[i]; + strncpy (rl_line_buffer + rl_point, string, l); + + /* Remember how to undo this if we aren't undoing something. */ + if (_rl_doing_an_undo == 0) + { + /* If possible and desirable, concatenate the undos. */ + if ((l == 1) && + rl_undo_list && + (rl_undo_list->what == UNDO_INSERT) && + (rl_undo_list->end == rl_point) && + (rl_undo_list->end - rl_undo_list->start < 20)) + rl_undo_list->end++; + else + rl_add_undo (UNDO_INSERT, rl_point, rl_point + l, (char *)NULL); + } + rl_point += l; + rl_end += l; + rl_line_buffer[rl_end] = '\0'; + return l; +} + +/* Delete the string between FROM and TO. FROM is inclusive, TO is not. + Returns the number of characters deleted. */ +int +rl_delete_text (from, to) + int from, to; +{ + register char *text; + register int diff, i; + + /* Fix it if the caller is confused. */ + if (from > to) + SWAP (from, to); + + /* fix boundaries */ + if (to > rl_end) + { + to = rl_end; + if (from > to) + from = to; + } + if (from < 0) + from = 0; + + text = rl_copy_text (from, to); + + /* Some versions of strncpy() can't handle overlapping arguments. */ + diff = to - from; + for (i = from; i < rl_end - diff; i++) + rl_line_buffer[i] = rl_line_buffer[i + diff]; + + /* Remember how to undo this delete. */ + if (_rl_doing_an_undo == 0) + rl_add_undo (UNDO_DELETE, from, to, text); + else + free (text); + + rl_end -= diff; + rl_line_buffer[rl_end] = '\0'; + return (diff); +} + +/* Fix up point so that it is within the line boundaries after killing + text. If FIX_MARK_TOO is non-zero, the mark is forced within line + boundaries also. */ + +#define _RL_FIX_POINT(x) \ + do { \ + if (x > rl_end) \ + x = rl_end; \ + else if (x < 0) \ + x = 0; \ + } while (0) + +void +_rl_fix_point (fix_mark_too) + int fix_mark_too; +{ + _RL_FIX_POINT (rl_point); + if (fix_mark_too) + _RL_FIX_POINT (rl_mark); +} +#undef _RL_FIX_POINT + +/* Replace the contents of the line buffer between START and END with + TEXT. The operation is undoable. To replace the entire line in an + undoable mode, use _rl_replace_text(text, 0, rl_end); */ +int +_rl_replace_text (text, start, end) + const char *text; + int start, end; +{ + int n; + + rl_begin_undo_group (); + rl_delete_text (start, end + 1); + rl_point = start; + n = rl_insert_text (text); + rl_end_undo_group (); + + return n; +} + +/* Replace the current line buffer contents with TEXT. If CLEAR_UNDO is + non-zero, we free the current undo list. */ +void +rl_replace_line (text, clear_undo) + const char *text; + int clear_undo; +{ + int len; + + len = strlen (text); + if (len >= rl_line_buffer_len) + rl_extend_line_buffer (len); + strcpy (rl_line_buffer, text); + rl_end = len; + + if (clear_undo) + rl_free_undo_list (); + + _rl_fix_point (1); +} + +/* **************************************************************** */ +/* */ +/* Readline character functions */ +/* */ +/* **************************************************************** */ + +/* This is not a gap editor, just a stupid line input routine. No hair + is involved in writing any of the functions, and none should be. */ + +/* Note that: + + rl_end is the place in the string that we would place '\0'; + i.e., it is always safe to place '\0' there. + + rl_point is the place in the string where the cursor is. Sometimes + this is the same as rl_end. + + Any command that is called interactively receives two arguments. + The first is a count: the numeric arg pased to this command. + The second is the key which invoked this command. +*/ + +/* **************************************************************** */ +/* */ +/* Movement Commands */ +/* */ +/* **************************************************************** */ + +/* Note that if you `optimize' the display for these functions, you cannot + use said functions in other functions which do not do optimizing display. + I.e., you will have to update the data base for rl_redisplay, and you + might as well let rl_redisplay do that job. */ + +/* Move forward COUNT bytes. */ +int +rl_forward_byte (count, key) + int count, key; +{ + if (count < 0) + return (rl_backward_byte (-count, key)); + + if (count > 0) + { + int end = rl_point + count; +#if defined (VI_MODE) + int lend = rl_end > 0 ? rl_end - (rl_editing_mode == vi_mode) : rl_end; +#else + int lend = rl_end; +#endif + + if (end > lend) + { + rl_point = lend; + rl_ding (); + } + else + rl_point = end; + } + + if (rl_end < 0) + rl_end = 0; + + return 0; +} + +#if defined (HANDLE_MULTIBYTE) +/* Move forward COUNT characters. */ +int +rl_forward_char (count, key) + int count, key; +{ + int point; + + if (MB_CUR_MAX == 1 || rl_byte_oriented) + return (rl_forward_byte (count, key)); + + if (count < 0) + return (rl_backward_char (-count, key)); + + if (count > 0) + { + point = _rl_find_next_mbchar (rl_line_buffer, rl_point, count, MB_FIND_NONZERO); + +#if defined (VI_MODE) + if (rl_end <= point && rl_editing_mode == vi_mode) + point = _rl_find_prev_mbchar (rl_line_buffer, rl_end, MB_FIND_NONZERO); +#endif + + if (rl_point == point) + rl_ding (); + + rl_point = point; + + if (rl_end < 0) + rl_end = 0; + } + + return 0; +} +#else /* !HANDLE_MULTIBYTE */ +int +rl_forward_char (count, key) + int count, key; +{ + return (rl_forward_byte (count, key)); +} +#endif /* !HANDLE_MULTIBYTE */ + +/* Backwards compatibility. */ +int +rl_forward (count, key) + int count, key; +{ + return (rl_forward_char (count, key)); +} + +/* Move backward COUNT bytes. */ +int +rl_backward_byte (count, key) + int count, key; +{ + if (count < 0) + return (rl_forward_byte (-count, key)); + + if (count > 0) + { + if (rl_point < count) + { + rl_point = 0; + rl_ding (); + } + else + rl_point -= count; + } + + if (rl_point < 0) + rl_point = 0; + + return 0; +} + +#if defined (HANDLE_MULTIBYTE) +/* Move backward COUNT characters. */ +int +rl_backward_char (count, key) + int count, key; +{ + int point; + + if (MB_CUR_MAX == 1 || rl_byte_oriented) + return (rl_backward_byte (count, key)); + + if (count < 0) + return (rl_forward_char (-count, key)); + + if (count > 0) + { + point = rl_point; + + while (count > 0 && point > 0) + { + point = _rl_find_prev_mbchar (rl_line_buffer, point, MB_FIND_NONZERO); + count--; + } + if (count > 0) + { + rl_point = 0; + rl_ding (); + } + else + rl_point = point; + } + + return 0; +} +#else +int +rl_backward_char (count, key) + int count, key; +{ + return (rl_backward_byte (count, key)); +} +#endif + +/* Backwards compatibility. */ +int +rl_backward (count, key) + int count, key; +{ + return (rl_backward_char (count, key)); +} + +/* Move to the beginning of the line. */ +int +rl_beg_of_line (count, key) + int count, key; +{ + rl_point = 0; + return 0; +} + +/* Move to the end of the line. */ +int +rl_end_of_line (count, key) + int count, key; +{ + rl_point = rl_end; + return 0; +} + +/* XXX - these might need changes for multibyte characters */ +/* Move forward a word. We do what Emacs does. */ +int +rl_forward_word (count, key) + int count, key; +{ + int c; + + if (count < 0) + return (rl_backward_word (-count, key)); + + while (count) + { + if (rl_point == rl_end) + return 0; + + /* If we are not in a word, move forward until we are in one. + Then, move forward until we hit a non-alphabetic character. */ + c = rl_line_buffer[rl_point]; + if (rl_alphabetic (c) == 0) + { + while (++rl_point < rl_end) + { + c = rl_line_buffer[rl_point]; + if (rl_alphabetic (c)) + break; + } + } + + if (rl_point == rl_end) + return 0; + + while (++rl_point < rl_end) + { + c = rl_line_buffer[rl_point]; + if (rl_alphabetic (c) == 0) + break; + } + --count; + } + + return 0; +} + +/* Move backward a word. We do what Emacs does. */ +int +rl_backward_word (count, key) + int count, key; +{ + int c; + + if (count < 0) + return (rl_forward_word (-count, key)); + + while (count) + { + if (!rl_point) + return 0; + + /* Like rl_forward_word (), except that we look at the characters + just before point. */ + + c = rl_line_buffer[rl_point - 1]; + if (rl_alphabetic (c) == 0) + { + while (--rl_point) + { + c = rl_line_buffer[rl_point - 1]; + if (rl_alphabetic (c)) + break; + } + } + + while (rl_point) + { + c = rl_line_buffer[rl_point - 1]; + if (rl_alphabetic (c) == 0) + break; + else + --rl_point; + } + + --count; + } + + return 0; +} + +/* Clear the current line. Numeric argument to C-l does this. */ +int +rl_refresh_line (ignore1, ignore2) + int ignore1, ignore2; +{ + int curr_line; + + curr_line = _rl_current_display_line (); + + _rl_move_vert (curr_line); + _rl_move_cursor_relative (0, rl_line_buffer); /* XXX is this right */ + + _rl_clear_to_eol (0); /* arg of 0 means to not use spaces */ + + rl_forced_update_display (); + rl_display_fixed = 1; + + return 0; +} + +/* C-l typed to a line without quoting clears the screen, and then reprints + the prompt and the current input line. Given a numeric arg, redraw only + the current line. */ +int +rl_clear_screen (count, key) + int count, key; +{ + if (rl_explicit_arg) + { + rl_refresh_line (count, key); + return 0; + } + + _rl_clear_screen (); /* calls termcap function to clear screen */ + rl_forced_update_display (); + rl_display_fixed = 1; + + return 0; +} + +int +rl_arrow_keys (count, c) + int count, c; +{ + int ch; + + RL_SETSTATE(RL_STATE_MOREINPUT); + ch = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + + switch (_rl_to_upper (ch)) + { + case 'A': + rl_get_previous_history (count, ch); + break; + + case 'B': + rl_get_next_history (count, ch); + break; + + case 'C': + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + rl_forward_char (count, ch); + else + rl_forward_byte (count, ch); + break; + + case 'D': + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + rl_backward_char (count, ch); + else + rl_backward_byte (count, ch); + break; + + default: + rl_ding (); + } + + return 0; +} + +/* **************************************************************** */ +/* */ +/* Text commands */ +/* */ +/* **************************************************************** */ + +#ifdef HANDLE_MULTIBYTE +static char pending_bytes[MB_LEN_MAX]; +static int pending_bytes_length = 0; +static mbstate_t ps = {0}; +#endif + +/* Insert the character C at the current location, moving point forward. + If C introduces a multibyte sequence, we read the whole sequence and + then insert the multibyte char into the line buffer. */ +int +_rl_insert_char (count, c) + int count, c; +{ + register int i; + char *string; +#ifdef HANDLE_MULTIBYTE + int string_size; + char incoming[MB_LEN_MAX + 1]; + int incoming_length = 0; + mbstate_t ps_back; + static int stored_count = 0; +#endif + + if (count <= 0) + return 0; + +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX == 1 || rl_byte_oriented) + { + incoming[0] = c; + incoming[1] = '\0'; + incoming_length = 1; + } + else + { + wchar_t wc; + size_t ret; + + if (stored_count <= 0) + stored_count = count; + else + count = stored_count; + + ps_back = ps; + pending_bytes[pending_bytes_length++] = c; + ret = mbrtowc (&wc, pending_bytes, pending_bytes_length, &ps); + + if (ret == (size_t)-2) + { + /* Bytes too short to compose character, try to wait for next byte. + Restore the state of the byte sequence, because in this case the + effect of mbstate is undefined. */ + ps = ps_back; + return 1; + } + else if (ret == (size_t)-1) + { + /* Invalid byte sequence for the current locale. Treat first byte + as a single character. */ + incoming[0] = pending_bytes[0]; + incoming[1] = '\0'; + incoming_length = 1; + pending_bytes_length--; + memmove (pending_bytes, pending_bytes + 1, pending_bytes_length); + /* Clear the state of the byte sequence, because in this case the + effect of mbstate is undefined. */ + memset (&ps, 0, sizeof (mbstate_t)); + } + else if (ret == (size_t)0) + { + incoming[0] = '\0'; + incoming_length = 0; + pending_bytes_length--; + /* Clear the state of the byte sequence, because in this case the + effect of mbstate is undefined. */ + memset (&ps, 0, sizeof (mbstate_t)); + } + else + { + /* We successfully read a single multibyte character. */ + memcpy (incoming, pending_bytes, pending_bytes_length); + incoming[pending_bytes_length] = '\0'; + incoming_length = pending_bytes_length; + pending_bytes_length = 0; + } + } +#endif /* HANDLE_MULTIBYTE */ + + /* If we can optimize, then do it. But don't let people crash + readline because of extra large arguments. */ + if (count > 1 && count <= 1024) + { +#if defined (HANDLE_MULTIBYTE) + string_size = count * incoming_length; + string = (char *)xmalloc (1 + string_size); + + i = 0; + while (i < string_size) + { + strncpy (string + i, incoming, incoming_length); + i += incoming_length; + } + incoming_length = 0; + stored_count = 0; +#else /* !HANDLE_MULTIBYTE */ + string = (char *)xmalloc (1 + count); + + for (i = 0; i < count; i++) + string[i] = c; +#endif /* !HANDLE_MULTIBYTE */ + + string[i] = '\0'; + rl_insert_text (string); + free (string); + + return 0; + } + + if (count > 1024) + { + int decreaser; +#if defined (HANDLE_MULTIBYTE) + string_size = incoming_length * 1024; + string = (char *)xmalloc (1 + string_size); + + i = 0; + while (i < string_size) + { + strncpy (string + i, incoming, incoming_length); + i += incoming_length; + } + + while (count) + { + decreaser = (count > 1024) ? 1024 : count; + string[decreaser*incoming_length] = '\0'; + rl_insert_text (string); + count -= decreaser; + } + + free (string); + incoming_length = 0; + stored_count = 0; +#else /* !HANDLE_MULTIBYTE */ + char str[1024+1]; + + for (i = 0; i < 1024; i++) + str[i] = c; + + while (count) + { + decreaser = (count > 1024 ? 1024 : count); + str[decreaser] = '\0'; + rl_insert_text (str); + count -= decreaser; + } +#endif /* !HANDLE_MULTIBYTE */ + + return 0; + } + +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX == 1 || rl_byte_oriented) + { +#endif + /* We are inserting a single character. + If there is pending input, then make a string of all of the + pending characters that are bound to rl_insert, and insert + them all. */ + if (_rl_any_typein ()) + _rl_insert_typein (c); + else + { + /* Inserting a single character. */ + char str[2]; + + str[1] = '\0'; + str[0] = c; + rl_insert_text (str); + } +#if defined (HANDLE_MULTIBYTE) + } + else + { + rl_insert_text (incoming); + stored_count = 0; + } +#endif + + return 0; +} + +/* Overwrite the character at point (or next COUNT characters) with C. + If C introduces a multibyte character sequence, read the entire sequence + before starting the overwrite loop. */ +int +_rl_overwrite_char (count, c) + int count, c; +{ + int i; +#if defined (HANDLE_MULTIBYTE) + char mbkey[MB_LEN_MAX]; + int k; + + /* Read an entire multibyte character sequence to insert COUNT times. */ + if (count > 0 && MB_CUR_MAX > 1 && rl_byte_oriented == 0) + k = _rl_read_mbstring (c, mbkey, MB_LEN_MAX); +#endif + + rl_begin_undo_group (); + + for (i = 0; i < count; i++) + { +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + rl_insert_text (mbkey); + else +#endif + _rl_insert_char (1, c); + + if (rl_point < rl_end) + rl_delete (1, c); + } + + rl_end_undo_group (); + + return 0; +} + +int +rl_insert (count, c) + int count, c; +{ + return (rl_insert_mode == RL_IM_INSERT ? _rl_insert_char (count, c) + : _rl_overwrite_char (count, c)); +} + +/* Insert the next typed character verbatim. */ +int +rl_quoted_insert (count, key) + int count, key; +{ + int c; + +#if defined (HANDLE_SIGNALS) + _rl_disable_tty_signals (); +#endif + + RL_SETSTATE(RL_STATE_MOREINPUT); + c = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + +#if defined (HANDLE_SIGNALS) + _rl_restore_tty_signals (); +#endif + + return (_rl_insert_char (count, c)); +} + +/* Insert a tab character. */ +int +rl_tab_insert (count, key) + int count, key; +{ + return (_rl_insert_char (count, '\t')); +} + +/* What to do when a NEWLINE is pressed. We accept the whole line. + KEY is the key that invoked this command. I guess it could have + meaning in the future. */ +int +rl_newline (count, key) + int count, key; +{ + rl_done = 1; + + if (_rl_history_preserve_point) + _rl_history_saved_point = (rl_point == rl_end) ? -1 : rl_point; + + RL_SETSTATE(RL_STATE_DONE); + +#if defined (VI_MODE) + if (rl_editing_mode == vi_mode) + { + _rl_vi_done_inserting (); + if (_rl_vi_textmod_command (_rl_vi_last_command) == 0) /* XXX */ + _rl_vi_reset_last (); + } +#endif /* VI_MODE */ + + /* If we've been asked to erase empty lines, suppress the final update, + since _rl_update_final calls rl_crlf(). */ + if (rl_erase_empty_line && rl_point == 0 && rl_end == 0) + return 0; + + if (readline_echoing_p) + _rl_update_final (); + return 0; +} + +/* What to do for some uppercase characters, like meta characters, + and some characters appearing in emacs_ctlx_keymap. This function + is just a stub, you bind keys to it and the code in _rl_dispatch () + is special cased. */ +int +rl_do_lowercase_version (ignore1, ignore2) + int ignore1, ignore2; +{ + return 0; +} + +/* This is different from what vi does, so the code's not shared. Emacs + rubout in overwrite mode has one oddity: it replaces a control + character that's displayed as two characters (^X) with two spaces. */ +int +_rl_overwrite_rubout (count, key) + int count, key; +{ + int opoint; + int i, l; + + if (rl_point == 0) + { + rl_ding (); + return 1; + } + + opoint = rl_point; + + /* L == number of spaces to insert */ + for (i = l = 0; i < count; i++) + { + rl_backward_char (1, key); + l += rl_character_len (rl_line_buffer[rl_point], rl_point); /* not exactly right */ + } + + rl_begin_undo_group (); + + if (count > 1 || rl_explicit_arg) + rl_kill_text (opoint, rl_point); + else + rl_delete_text (opoint, rl_point); + + /* Emacs puts point at the beginning of the sequence of spaces. */ + if (rl_point < rl_end) + { + opoint = rl_point; + _rl_insert_char (l, ' '); + rl_point = opoint; + } + + rl_end_undo_group (); + + return 0; +} + +/* Rubout the character behind point. */ +int +rl_rubout (count, key) + int count, key; +{ + if (count < 0) + return (rl_delete (-count, key)); + + if (!rl_point) + { + rl_ding (); + return -1; + } + + if (rl_insert_mode == RL_IM_OVERWRITE) + return (_rl_overwrite_rubout (count, key)); + + return (_rl_rubout_char (count, key)); +} + +int +_rl_rubout_char (count, key) + int count, key; +{ + int orig_point; + unsigned char c; + + /* Duplicated code because this is called from other parts of the library. */ + if (count < 0) + return (rl_delete (-count, key)); + + if (rl_point == 0) + { + rl_ding (); + return -1; + } + + if (count > 1 || rl_explicit_arg) + { + orig_point = rl_point; +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + rl_backward_char (count, key); + else +#endif + rl_backward_byte (count, key); + rl_kill_text (orig_point, rl_point); + } + else + { +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX == 1 || rl_byte_oriented) + { +#endif + c = rl_line_buffer[--rl_point]; + rl_delete_text (rl_point, rl_point + 1); +#if defined (HANDLE_MULTIBYTE) + } + else + { + int orig_point; + + orig_point = rl_point; + rl_point = _rl_find_prev_mbchar (rl_line_buffer, rl_point, MB_FIND_NONZERO); + c = rl_line_buffer[rl_point]; + rl_delete_text (rl_point, orig_point); + } +#endif /* HANDLE_MULTIBYTE */ + + /* I don't think that the hack for end of line is needed for + multibyte chars. */ +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX == 1 || rl_byte_oriented) +#endif + if (rl_point == rl_end && ISPRINT (c) && _rl_last_c_pos) + { + int l; + l = rl_character_len (c, rl_point); + _rl_erase_at_end_of_line (l); + } + } + + return 0; +} + +/* Delete the character under the cursor. Given a numeric argument, + kill that many characters instead. */ +int +rl_delete (count, key) + int count, key; +{ + int r; + + if (count < 0) + return (_rl_rubout_char (-count, key)); + + if (rl_point == rl_end) + { + rl_ding (); + return -1; + } + + if (count > 1 || rl_explicit_arg) + { + int orig_point = rl_point; +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + rl_forward_char (count, key); + else +#endif + rl_forward_byte (count, key); + + r = rl_kill_text (orig_point, rl_point); + rl_point = orig_point; + return r; + } + else + { + int new_point; + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + new_point = _rl_find_next_mbchar (rl_line_buffer, rl_point, 1, MB_FIND_NONZERO); + else + new_point = rl_point + 1; + + return (rl_delete_text (rl_point, new_point)); + } +} + +/* Delete the character under the cursor, unless the insertion + point is at the end of the line, in which case the character + behind the cursor is deleted. COUNT is obeyed and may be used + to delete forward or backward that many characters. */ +int +rl_rubout_or_delete (count, key) + int count, key; +{ + if (rl_end != 0 && rl_point == rl_end) + return (_rl_rubout_char (count, key)); + else + return (rl_delete (count, key)); +} + +/* Delete all spaces and tabs around point. */ +int +rl_delete_horizontal_space (count, ignore) + int count, ignore; +{ + int start = rl_point; + + while (rl_point && whitespace (rl_line_buffer[rl_point - 1])) + rl_point--; + + start = rl_point; + + while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point])) + rl_point++; + + if (start != rl_point) + { + rl_delete_text (start, rl_point); + rl_point = start; + } + return 0; +} + +/* Like the tcsh editing function delete-char-or-list. The eof character + is caught before this is invoked, so this really does the same thing as + delete-char-or-list-or-eof, as long as it's bound to the eof character. */ +int +rl_delete_or_show_completions (count, key) + int count, key; +{ + if (rl_end != 0 && rl_point == rl_end) + return (rl_possible_completions (count, key)); + else + return (rl_delete (count, key)); +} + +#ifndef RL_COMMENT_BEGIN_DEFAULT +#define RL_COMMENT_BEGIN_DEFAULT "#" +#endif + +/* Turn the current line into a comment in shell history. + A K*rn shell style function. */ +int +rl_insert_comment (count, key) + int count, key; +{ + char *rl_comment_text; + int rl_comment_len; + + rl_beg_of_line (1, key); + rl_comment_text = _rl_comment_begin ? _rl_comment_begin : RL_COMMENT_BEGIN_DEFAULT; + + if (rl_explicit_arg == 0) + rl_insert_text (rl_comment_text); + else + { + rl_comment_len = strlen (rl_comment_text); + if (STREQN (rl_comment_text, rl_line_buffer, rl_comment_len)) + rl_delete_text (rl_point, rl_point + rl_comment_len); + else + rl_insert_text (rl_comment_text); + } + + (*rl_redisplay_function) (); + rl_newline (1, '\n'); + + return (0); +} + +/* **************************************************************** */ +/* */ +/* Changing Case */ +/* */ +/* **************************************************************** */ + +/* The three kinds of things that we know how to do. */ +#define UpCase 1 +#define DownCase 2 +#define CapCase 3 + +/* Uppercase the word at point. */ +int +rl_upcase_word (count, key) + int count, key; +{ + return (rl_change_case (count, UpCase)); +} + +/* Lowercase the word at point. */ +int +rl_downcase_word (count, key) + int count, key; +{ + return (rl_change_case (count, DownCase)); +} + +/* Upcase the first letter, downcase the rest. */ +int +rl_capitalize_word (count, key) + int count, key; +{ + return (rl_change_case (count, CapCase)); +} + +/* The meaty function. + Change the case of COUNT words, performing OP on them. + OP is one of UpCase, DownCase, or CapCase. + If a negative argument is given, leave point where it started, + otherwise, leave it where it moves to. */ +static int +rl_change_case (count, op) + int count, op; +{ + register int start, end; + int inword, c; + + start = rl_point; + rl_forward_word (count, 0); + end = rl_point; + + if (count < 0) + SWAP (start, end); + + /* We are going to modify some text, so let's prepare to undo it. */ + rl_modifying (start, end); + + for (inword = 0; start < end; start++) + { + c = rl_line_buffer[start]; + switch (op) + { + case UpCase: + rl_line_buffer[start] = _rl_to_upper (c); + break; + + case DownCase: + rl_line_buffer[start] = _rl_to_lower (c); + break; + + case CapCase: + rl_line_buffer[start] = (inword == 0) ? _rl_to_upper (c) : _rl_to_lower (c); + inword = rl_alphabetic (rl_line_buffer[start]); + break; + + default: + rl_ding (); + return -1; + } + } + rl_point = end; + return 0; +} + +/* **************************************************************** */ +/* */ +/* Transposition */ +/* */ +/* **************************************************************** */ + +/* Transpose the words at point. If point is at the end of the line, + transpose the two words before point. */ +int +rl_transpose_words (count, key) + int count, key; +{ + char *word1, *word2; + int w1_beg, w1_end, w2_beg, w2_end; + int orig_point = rl_point; + + if (!count) + return 0; + + /* Find the two words. */ + rl_forward_word (count, key); + w2_end = rl_point; + rl_backward_word (1, key); + w2_beg = rl_point; + rl_backward_word (count, key); + w1_beg = rl_point; + rl_forward_word (1, key); + w1_end = rl_point; + + /* Do some check to make sure that there really are two words. */ + if ((w1_beg == w2_beg) || (w2_beg < w1_end)) + { + rl_ding (); + rl_point = orig_point; + return -1; + } + + /* Get the text of the words. */ + word1 = rl_copy_text (w1_beg, w1_end); + word2 = rl_copy_text (w2_beg, w2_end); + + /* We are about to do many insertions and deletions. Remember them + as one operation. */ + rl_begin_undo_group (); + + /* Do the stuff at word2 first, so that we don't have to worry + about word1 moving. */ + rl_point = w2_beg; + rl_delete_text (w2_beg, w2_end); + rl_insert_text (word1); + + rl_point = w1_beg; + rl_delete_text (w1_beg, w1_end); + rl_insert_text (word2); + + /* This is exactly correct since the text before this point has not + changed in length. */ + rl_point = w2_end; + + /* I think that does it. */ + rl_end_undo_group (); + free (word1); + free (word2); + + return 0; +} + +/* Transpose the characters at point. If point is at the end of the line, + then transpose the characters before point. */ +int +rl_transpose_chars (count, key) + int count, key; +{ +#if defined (HANDLE_MULTIBYTE) + char *dummy; + int i, prev_point; +#else + char dummy[2]; +#endif + int char_length; + + if (count == 0) + return 0; + + if (!rl_point || rl_end < 2) + { + rl_ding (); + return -1; + } + + rl_begin_undo_group (); + + if (rl_point == rl_end) + { + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + rl_point = _rl_find_prev_mbchar (rl_line_buffer, rl_point, MB_FIND_NONZERO); + else + --rl_point; + count = 1; + } + +#if defined (HANDLE_MULTIBYTE) + prev_point = rl_point; + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + rl_point = _rl_find_prev_mbchar (rl_line_buffer, rl_point, MB_FIND_NONZERO); + else +#endif + rl_point--; + +#if defined (HANDLE_MULTIBYTE) + char_length = prev_point - rl_point; + dummy = (char *)xmalloc (char_length + 1); + for (i = 0; i < char_length; i++) + dummy[i] = rl_line_buffer[rl_point + i]; + dummy[i] = '\0'; +#else + dummy[0] = rl_line_buffer[rl_point]; + dummy[char_length = 1] = '\0'; +#endif + + rl_delete_text (rl_point, rl_point + char_length); + + rl_point = _rl_find_next_mbchar (rl_line_buffer, rl_point, count, MB_FIND_NONZERO); + + _rl_fix_point (0); + rl_insert_text (dummy); + rl_end_undo_group (); + +#if defined (HANDLE_MULTIBYTE) + free (dummy); +#endif + + return 0; +} + +/* **************************************************************** */ +/* */ +/* Character Searching */ +/* */ +/* **************************************************************** */ + +int +#if defined (HANDLE_MULTIBYTE) +_rl_char_search_internal (count, dir, smbchar, len) + int count, dir; + char *smbchar; + int len; +#else +_rl_char_search_internal (count, dir, schar) + int count, dir, schar; +#endif +{ + int pos, inc; +#if defined (HANDLE_MULTIBYTE) + int prepos; +#endif + + pos = rl_point; + inc = (dir < 0) ? -1 : 1; + while (count) + { + if ((dir < 0 && pos <= 0) || (dir > 0 && pos >= rl_end)) + { + rl_ding (); + return -1; + } + +#if defined (HANDLE_MULTIBYTE) + pos = (inc > 0) ? _rl_find_next_mbchar (rl_line_buffer, pos, 1, MB_FIND_ANY) + : _rl_find_prev_mbchar (rl_line_buffer, pos, MB_FIND_ANY); +#else + pos += inc; +#endif + do + { +#if defined (HANDLE_MULTIBYTE) + if (_rl_is_mbchar_matched (rl_line_buffer, pos, rl_end, smbchar, len)) +#else + if (rl_line_buffer[pos] == schar) +#endif + { + count--; + if (dir < 0) + rl_point = (dir == BTO) ? _rl_find_next_mbchar (rl_line_buffer, pos, 1, MB_FIND_ANY) + : pos; + else + rl_point = (dir == FTO) ? _rl_find_prev_mbchar (rl_line_buffer, pos, MB_FIND_ANY) + : pos; + break; + } +#if defined (HANDLE_MULTIBYTE) + prepos = pos; +#endif + } +#if defined (HANDLE_MULTIBYTE) + while ((dir < 0) ? (pos = _rl_find_prev_mbchar (rl_line_buffer, pos, MB_FIND_ANY)) != prepos + : (pos = _rl_find_next_mbchar (rl_line_buffer, pos, 1, MB_FIND_ANY)) != prepos); +#else + while ((dir < 0) ? pos-- : ++pos < rl_end); +#endif + } + return (0); +} + +/* Search COUNT times for a character read from the current input stream. + FDIR is the direction to search if COUNT is non-negative; otherwise + the search goes in BDIR. So much is dependent on HANDLE_MULTIBYTE + that there are two separate versions of this function. */ +#if defined (HANDLE_MULTIBYTE) +static int +_rl_char_search (count, fdir, bdir) + int count, fdir, bdir; +{ + char mbchar[MB_LEN_MAX]; + int mb_len; + + mb_len = _rl_read_mbchar (mbchar, MB_LEN_MAX); + + if (count < 0) + return (_rl_char_search_internal (-count, bdir, mbchar, mb_len)); + else + return (_rl_char_search_internal (count, fdir, mbchar, mb_len)); +} +#else /* !HANDLE_MULTIBYTE */ +static int +_rl_char_search (count, fdir, bdir) + int count, fdir, bdir; +{ + int c; + + RL_SETSTATE(RL_STATE_MOREINPUT); + c = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + + if (count < 0) + return (_rl_char_search_internal (-count, bdir, c)); + else + return (_rl_char_search_internal (count, fdir, c)); +} +#endif /* !HANDLE_MULTIBYTE */ + +int +rl_char_search (count, key) + int count, key; +{ + return (_rl_char_search (count, FFIND, BFIND)); +} + +int +rl_backward_char_search (count, key) + int count, key; +{ + return (_rl_char_search (count, BFIND, FFIND)); +} + +/* **************************************************************** */ +/* */ +/* The Mark and the Region. */ +/* */ +/* **************************************************************** */ + +/* Set the mark at POSITION. */ +int +_rl_set_mark_at_pos (position) + int position; +{ + if (position > rl_end) + return -1; + + rl_mark = position; + return 0; +} + +/* A bindable command to set the mark. */ +int +rl_set_mark (count, key) + int count, key; +{ + return (_rl_set_mark_at_pos (rl_explicit_arg ? count : rl_point)); +} + +/* Exchange the position of mark and point. */ +int +rl_exchange_point_and_mark (count, key) + int count, key; +{ + if (rl_mark > rl_end) + rl_mark = -1; + + if (rl_mark == -1) + { + rl_ding (); + return -1; + } + else + SWAP (rl_point, rl_mark); + + return 0; +} diff --git a/vendors/readline/src/readline/tilde.c b/vendors/readline/src/readline/tilde.c new file mode 100644 index 0000000..8dbb4c2 --- /dev/null +++ b/vendors/readline/src/readline/tilde.c @@ -0,0 +1,486 @@ +/* tilde.c -- Tilde expansion code (~/foo := $HOME/foo). */ + +/* Copyright (C) 1988,1989 Free Software Foundation, Inc. + + This file is part of GNU Readline, a library for reading lines + of text with interactive input and history editing. + + Readline is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + Readline is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Readline; see the file COPYING. If not, write to the Free + Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#if defined (HAVE_UNISTD_H) +# ifdef _MINIX +# include +# endif +# include +#endif + +//***********************CHANGED**************************** +//#if defined (HAVE_STRING_H) +//# include +//#else /* !HAVE_STRING_H */ +//# include +//#endif /* !HAVE_STRING_H */ + +#if defined (HAVE_STRING_H) +# include +#endif +#if defined (HAVE_STRINGS_H) +# include +#endif + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#include +#ifndef _WIN32 +#include +#else +#include +#endif + +#include "tilde.h" + +#if defined (TEST) || defined (STATIC_MALLOC) +static void *xmalloc (), *xrealloc (); +#else +# include "xmalloc.h" +#endif /* TEST || STATIC_MALLOC */ + +#if !defined (HAVE_GETPW_DECLS) +extern struct passwd *getpwuid PARAMS((uid_t)); +extern struct passwd *getpwnam PARAMS((const char *)); +#endif /* !HAVE_GETPW_DECLS */ + +#if !defined (savestring) +#define savestring(x) strcpy ((char *)xmalloc (1 + strlen (x)), (x)) +#endif /* !savestring */ + +#if !defined (NULL) +# if defined (__STDC__) +# define NULL ((void *) 0) +# else +# define NULL 0x0 +# endif /* !__STDC__ */ +#endif /* !NULL */ + +/* If being compiled as part of bash, these will be satisfied from + variables.o. If being compiled as part of readline, they will + be satisfied from shell.o. */ +extern char *sh_get_home_dir PARAMS((void)); +extern char *sh_get_env_value PARAMS((const char *)); + +/* The default value of tilde_additional_prefixes. This is set to + whitespace preceding a tilde so that simple programs which do not + perform any word separation get desired behaviour. */ +static const char *default_prefixes[] = + { " ~", "\t~", (const char *)NULL }; + +/* The default value of tilde_additional_suffixes. This is set to + whitespace or newline so that simple programs which do not + perform any word separation get desired behaviour. */ +static const char *default_suffixes[] = + { " ", "\n", (const char *)NULL }; + +/* If non-null, this contains the address of a function that the application + wants called before trying the standard tilde expansions. The function + is called with the text sans tilde, and returns a malloc()'ed string + which is the expansion, or a NULL pointer if the expansion fails. */ +tilde_hook_func_t *tilde_expansion_preexpansion_hook = (tilde_hook_func_t *)NULL; + +/* If non-null, this contains the address of a function to call if the + standard meaning for expanding a tilde fails. The function is called + with the text (sans tilde, as in "foo"), and returns a malloc()'ed string + which is the expansion, or a NULL pointer if there is no expansion. */ +tilde_hook_func_t *tilde_expansion_failure_hook = (tilde_hook_func_t *)NULL; + +/* When non-null, this is a NULL terminated array of strings which + are duplicates for a tilde prefix. Bash uses this to expand + `=~' and `:~'. */ +char **tilde_additional_prefixes = (char **)default_prefixes; + +/* When non-null, this is a NULL terminated array of strings which match + the end of a username, instead of just "/". Bash sets this to + `:' and `=~'. */ +char **tilde_additional_suffixes = (char **)default_suffixes; + +static int tilde_find_prefix PARAMS((const char *, int *)); +static int tilde_find_suffix PARAMS((const char *)); +static char *isolate_tilde_prefix PARAMS((const char *, int *)); +static char *glue_prefix_and_suffix PARAMS((char *, const char *, int)); + +/* Find the start of a tilde expansion in STRING, and return the index of + the tilde which starts the expansion. Place the length of the text + which identified this tilde starter in LEN, excluding the tilde itself. */ +static int +tilde_find_prefix (string, len) + const char *string; + int *len; +{ + register int i, j, string_len; + register char **prefixes; + + prefixes = tilde_additional_prefixes; + + string_len = strlen (string); + *len = 0; + + if (*string == '\0' || *string == '~') + return (0); + + if (prefixes) + { + for (i = 0; i < string_len; i++) + { + for (j = 0; prefixes[j]; j++) + { + if (strncmp (string + i, prefixes[j], strlen (prefixes[j])) == 0) + { + *len = strlen (prefixes[j]) - 1; + return (i + *len); + } + } + } + } + return (string_len); +} + +/* Find the end of a tilde expansion in STRING, and return the index of + the character which ends the tilde definition. */ +static int +tilde_find_suffix (string) + const char *string; +{ + register int i, j, string_len; + register char **suffixes; + + suffixes = tilde_additional_suffixes; + string_len = strlen (string); + + for (i = 0; i < string_len; i++) + { +#if defined (__MSDOS__) + if (string[i] == '/' || string[i] == '\\' /* || !string[i] */) +#else + if (string[i] == '/' /* || !string[i] */) +#endif + break; + + for (j = 0; suffixes && suffixes[j]; j++) + { + if (strncmp (string + i, suffixes[j], strlen (suffixes[j])) == 0) + return (i); + } + } + return (i); +} + +/* Return a new string which is the result of tilde expanding STRING. */ +char * +tilde_expand (string) + const char *string; +{ + char *result; + int result_size, result_index; + + result_index = result_size = 0; + if (result = strchr (string, '~')) + result = (char *)xmalloc (result_size = (strlen (string) + 16)); + else + result = (char *)xmalloc (result_size = (strlen (string) + 1)); + + /* Scan through STRING expanding tildes as we come to them. */ + while (1) + { + register int start, end; + char *tilde_word, *expansion; + int len; + + /* Make START point to the tilde which starts the expansion. */ + start = tilde_find_prefix (string, &len); + + /* Copy the skipped text into the result. */ + if ((result_index + start + 1) > result_size) + result = (char *)xrealloc (result, 1 + (result_size += (start + 20))); + + strncpy (result + result_index, string, start); + result_index += start; + + /* Advance STRING to the starting tilde. */ + string += start; + + /* Make END be the index of one after the last character of the + username. */ + end = tilde_find_suffix (string); + + /* If both START and END are zero, we are all done. */ + if (!start && !end) + break; + + /* Expand the entire tilde word, and copy it into RESULT. */ + tilde_word = (char *)xmalloc (1 + end); + strncpy (tilde_word, string, end); + tilde_word[end] = '\0'; + string += end; + + expansion = tilde_expand_word (tilde_word); + free (tilde_word); + + len = strlen (expansion); +#ifdef __CYGWIN__ + /* Fix for Cygwin to prevent ~user/xxx from expanding to //xxx when + $HOME for `user' is /. On cygwin, // denotes a network drive. */ + if (len > 1 || *expansion != '/' || *string != '/') +#endif + { + if ((result_index + len + 1) > result_size) + result = (char *)xrealloc (result, 1 + (result_size += (len + 20))); + + strcpy (result + result_index, expansion); + result_index += len; + } + free (expansion); + } + + result[result_index] = '\0'; + + return (result); +} + +/* Take FNAME and return the tilde prefix we want expanded. If LENP is + non-null, the index of the end of the prefix into FNAME is returned in + the location it points to. */ +static char * +isolate_tilde_prefix (fname, lenp) + const char *fname; + int *lenp; +{ + char *ret; + int i; + + ret = (char *)xmalloc (strlen (fname)); +#if defined (__MSDOS__) + for (i = 1; fname[i] && fname[i] != '/' && fname[i] != '\\'; i++) +#else + for (i = 1; fname[i] && fname[i] != '/'; i++) +#endif + ret[i - 1] = fname[i]; + ret[i - 1] = '\0'; + if (lenp) + *lenp = i; + return ret; +} + +/* Return a string that is PREFIX concatenated with SUFFIX starting at + SUFFIND. */ +static char * +glue_prefix_and_suffix (prefix, suffix, suffind) + char *prefix; + const char *suffix; + int suffind; +{ + char *ret; + int plen, slen; + + plen = (prefix && *prefix) ? strlen (prefix) : 0; + slen = strlen (suffix + suffind); + ret = (char *)xmalloc (plen + slen + 1); + if (plen) + strcpy (ret, prefix); + strcpy (ret + plen, suffix + suffind); + return ret; +} + +/* Do the work of tilde expansion on FILENAME. FILENAME starts with a + tilde. If there is no expansion, call tilde_expansion_failure_hook. + This always returns a newly-allocated string, never static storage. */ +char * +tilde_expand_word (filename) + const char *filename; +{ + char *dirname, *expansion, *username; + int user_len; +#if !defined (_WIN32) + struct passwd *user_entry; +#else /* _WIN32 */ + char UserName[256]; + unsigned long UserLen = 256; +#endif /* _WIN32 */ + + if (filename == 0) + return ((char *)NULL); + + if (*filename != '~') + return (savestring (filename)); + + /* A leading `~/' or a bare `~' is *always* translated to the value of + $HOME or the home directory of the current user, regardless of any + preexpansion hook. */ + if (filename[1] == '\0' || filename[1] == '/') + { + /* Prefix $HOME to the rest of the string. */ + expansion = sh_get_env_value ("HOME"); + + /* If there is no HOME variable, look up the directory in + the password database. */ + if (expansion == 0) + expansion = sh_get_home_dir (); + + return (glue_prefix_and_suffix (expansion, filename, 1)); + } + + username = isolate_tilde_prefix (filename, &user_len); + + if (tilde_expansion_preexpansion_hook) + { + expansion = (*tilde_expansion_preexpansion_hook) (username); + if (expansion) + { + dirname = glue_prefix_and_suffix (expansion, filename, user_len); + free (username); + free (expansion); + return (dirname); + } + } + + /* No preexpansion hook, or the preexpansion hook failed. Look in the + password database. */ + dirname = (char *)NULL; +#if !defined (_WIN32) + user_entry = getpwnam (username); + if (user_entry == 0) + { + /* If the calling program has a special syntax for expanding tildes, + and we couldn't find a standard expansion, then let them try. */ + if (tilde_expansion_failure_hook) + { + expansion = (*tilde_expansion_failure_hook) (username); + if (expansion) + { + dirname = glue_prefix_and_suffix (expansion, filename, user_len); + free (expansion); + } + } + free (username); + /* If we don't have a failure hook, or if the failure hook did not + expand the tilde, return a copy of what we were passed. */ + if (dirname == 0) + dirname = savestring (filename); + } + else + { + free (username); + dirname = glue_prefix_and_suffix (user_entry->pw_dir, filename, user_len); + } + + endpwent (); +#else /* _WIN32 */ + if (GetUserName (UserName, &UserLen)) + { + if (!stricmp (username, UserName)) + dirname = glue_prefix_and_suffix (sh_get_home_dir (), filename, user_len); + else if (dirname == 0) + dirname = savestring (filename); + } + free (username); +#endif /* _WIN32 */ + return (dirname); +} + + +#if defined (TEST) +#undef NULL +#include + +main (argc, argv) + int argc; + char **argv; +{ + char *result, line[512]; + int done = 0; + + while (!done) + { + printf ("~expand: "); + fflush (stdout); + + if (!gets (line)) + strcpy (line, "done"); + + if ((strcmp (line, "done") == 0) || + (strcmp (line, "quit") == 0) || + (strcmp (line, "exit") == 0)) + { + done = 1; + break; + } + + result = tilde_expand (line); + printf (" --> %s\n", result); + free (result); + } + exit (0); +} + +static void memory_error_and_abort (); + +static void * +xmalloc (bytes) + size_t bytes; +{ + void *temp = (char *)malloc (bytes); + + if (!temp) + memory_error_and_abort (); + return (temp); +} + +static void * +xrealloc (pointer, bytes) + void *pointer; + int bytes; +{ + void *temp; + + if (!pointer) + temp = malloc (bytes); + else + temp = realloc (pointer, bytes); + + if (!temp) + memory_error_and_abort (); + + return (temp); +} + +static void +memory_error_and_abort () +{ + fprintf (stderr, "readline: out of virtual memory\n"); + abort (); +} + +/* + * Local variables: + * compile-command: "gcc -g -DTEST -o tilde tilde.c" + * end: + */ +#endif /* TEST */ diff --git a/vendors/readline/src/readline/tilde.h b/vendors/readline/src/readline/tilde.h new file mode 100644 index 0000000..da7d15b --- /dev/null +++ b/vendors/readline/src/readline/tilde.h @@ -0,0 +1,87 @@ +/* tilde.h: Externally available variables and function in libtilde.a. */ + +/* Copyright (C) 1992 Free Software Foundation, Inc. + + This file contains the Readline Library (the Library), a set of + routines for providing Emacs style line input to programs that ask + for it. + + The Library is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + The 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 + General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + +#if !defined (_TILDE_H_) +# define _TILDE_H_ + +//**************************CHANGED add define below********************** +#define READLINE_LIBRARY + +#if defined READLINE_LIBRARY +# include "rlstdc.h" +#else +# include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* A function can be defined using prototypes and compile on both ANSI C + and traditional C compilers with something like this: + extern char *func PARAMS((char *, char *, int)); */ + +#if !defined (PARAMS) +# if defined (__STDC__) || defined (__GNUC__) || defined (__cplusplus) +# define PARAMS(protos) protos +# else +# define PARAMS(protos) () +# endif +#endif + +typedef char *tilde_hook_func_t PARAMS((char *)); + +/* If non-null, this contains the address of a function that the application + wants called before trying the standard tilde expansions. The function + is called with the text sans tilde, and returns a malloc()'ed string + which is the expansion, or a NULL pointer if the expansion fails. */ +READLINE_DLL_IMPEXP tilde_hook_func_t *tilde_expansion_preexpansion_hook; + +/* If non-null, this contains the address of a function to call if the + standard meaning for expanding a tilde fails. The function is called + with the text (sans tilde, as in "foo"), and returns a malloc()'ed string + which is the expansion, or a NULL pointer if there is no expansion. */ +READLINE_DLL_IMPEXP tilde_hook_func_t *tilde_expansion_failure_hook; + +/* When non-null, this is a NULL terminated array of strings which + are duplicates for a tilde prefix. Bash uses this to expand + `=~' and `:~'. */ +READLINE_DLL_IMPEXP char **tilde_additional_prefixes; + +/* When non-null, this is a NULL terminated array of strings which match + the end of a username, instead of just "/". Bash sets this to + `:' and `=~'. */ +READLINE_DLL_IMPEXP char **tilde_additional_suffixes; + +/* Return a new string which is the result of tilde expanding STRING. */ +READLINE_DLL_IMPEXP char *tilde_expand PARAMS((const char *)); + +/* Do the work of tilde expansion on FILENAME. FILENAME starts with a + tilde. If there is no expansion, call tilde_expansion_failure_hook. */ +READLINE_DLL_IMPEXP char *tilde_expand_word PARAMS((const char *)); + +#ifdef __cplusplus +} +#endif + +#endif /* _TILDE_H_ */ diff --git a/vendors/readline/src/readline/undo.c b/vendors/readline/src/readline/undo.c new file mode 100644 index 0000000..25c287b --- /dev/null +++ b/vendors/readline/src/readline/undo.c @@ -0,0 +1,263 @@ +/* readline.c -- a general facility for reading lines of input + with emacs style editing and completion. */ + +/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library, a library for + reading lines of text with interactive input and history editing. + + The GNU Readline Library is free software; you can redistribute it + and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2, or + (at your option) any later version. + + The GNU Readline 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 General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include + +#if defined (HAVE_UNISTD_H) +# include /* for _POSIX_VERSION */ +#endif /* HAVE_UNISTD_H */ + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#include + +/* System-specific feature definitions and include files. */ +#include "rldefs.h" + +/* Some standard library routines. */ +#include "readline.h" +#include "history.h" + +#include "rlprivate.h" +#include "xmalloc.h" + +/* Non-zero tells rl_delete_text and rl_insert_text to not add to + the undo list. */ +int _rl_doing_an_undo = 0; + +/* How many unclosed undo groups we currently have. */ +int _rl_undo_group_level = 0; + +/* The current undo list for THE_LINE. */ +UNDO_LIST *rl_undo_list = (UNDO_LIST *)NULL; + +/* **************************************************************** */ +/* */ +/* Undo, and Undoing */ +/* */ +/* **************************************************************** */ + +/* Remember how to undo something. Concatenate some undos if that + seems right. */ +void +rl_add_undo (what, start, end, text) + enum undo_code what; + int start, end; + char *text; +{ + UNDO_LIST *temp = (UNDO_LIST *)xmalloc (sizeof (UNDO_LIST)); + temp->what = what; + temp->start = start; + temp->end = end; + temp->text = text; + temp->next = rl_undo_list; + rl_undo_list = temp; +} + +/* Free the existing undo list. */ +void +rl_free_undo_list () +{ + while (rl_undo_list) + { + UNDO_LIST *release = rl_undo_list; + rl_undo_list = rl_undo_list->next; + + if (release->what == UNDO_DELETE) + free (release->text); + + free (release); + } + rl_undo_list = (UNDO_LIST *)NULL; +} + +/* Undo the next thing in the list. Return 0 if there + is nothing to undo, or non-zero if there was. */ +int +rl_do_undo () +{ + UNDO_LIST *release; + int waiting_for_begin, start, end; + +#define TRANS(i) ((i) == -1 ? rl_point : ((i) == -2 ? rl_end : (i))) + + start = end = waiting_for_begin = 0; + do + { + if (!rl_undo_list) + return (0); + + _rl_doing_an_undo = 1; + RL_SETSTATE(RL_STATE_UNDOING); + + /* To better support vi-mode, a start or end value of -1 means + rl_point, and a value of -2 means rl_end. */ + if (rl_undo_list->what == UNDO_DELETE || rl_undo_list->what == UNDO_INSERT) + { + start = TRANS (rl_undo_list->start); + end = TRANS (rl_undo_list->end); + } + + switch (rl_undo_list->what) + { + /* Undoing deletes means inserting some text. */ + case UNDO_DELETE: + rl_point = start; + rl_insert_text (rl_undo_list->text); + free (rl_undo_list->text); + break; + + /* Undoing inserts means deleting some text. */ + case UNDO_INSERT: + rl_delete_text (start, end); + rl_point = start; + break; + + /* Undoing an END means undoing everything 'til we get to a BEGIN. */ + case UNDO_END: + waiting_for_begin++; + break; + + /* Undoing a BEGIN means that we are done with this group. */ + case UNDO_BEGIN: + if (waiting_for_begin) + waiting_for_begin--; + else + rl_ding (); + break; + } + + _rl_doing_an_undo = 0; + RL_UNSETSTATE(RL_STATE_UNDOING); + + release = rl_undo_list; + rl_undo_list = rl_undo_list->next; + free (release); + } + while (waiting_for_begin); + + return (1); +} +#undef TRANS + +int +_rl_fix_last_undo_of_type (type, start, end) + int type, start, end; +{ + UNDO_LIST *rl; + + for (rl = rl_undo_list; rl; rl = rl->next) + { + if (rl->what == type) + { + rl->start = start; + rl->end = end; + return 0; + } + } + return 1; +} + +/* Begin a group. Subsequent undos are undone as an atomic operation. */ +int +rl_begin_undo_group () +{ + rl_add_undo (UNDO_BEGIN, 0, 0, 0); + _rl_undo_group_level++; + return 0; +} + +/* End an undo group started with rl_begin_undo_group (). */ +int +rl_end_undo_group () +{ + rl_add_undo (UNDO_END, 0, 0, 0); + _rl_undo_group_level--; + return 0; +} + +/* Save an undo entry for the text from START to END. */ +int +rl_modifying (start, end) + int start, end; +{ + if (start > end) + { + SWAP (start, end); + } + + if (start != end) + { + char *temp = rl_copy_text (start, end); + rl_begin_undo_group (); + rl_add_undo (UNDO_DELETE, start, end, temp); + rl_add_undo (UNDO_INSERT, start, end, (char *)NULL); + rl_end_undo_group (); + } + return 0; +} + +/* Revert the current line to its previous state. */ +int +rl_revert_line (count, key) + int count, key; +{ + if (!rl_undo_list) + rl_ding (); + else + { + while (rl_undo_list) + rl_do_undo (); + } + return 0; +} + +/* Do some undoing of things that were done. */ +int +rl_undo_command (count, key) + int count, key; +{ + if (count < 0) + return 0; /* Nothing to do. */ + + while (count) + { + if (rl_do_undo ()) + count--; + else + { + rl_ding (); + break; + } + } + return 0; +} diff --git a/vendors/readline/src/readline/util.c b/vendors/readline/src/readline/util.c new file mode 100644 index 0000000..a632d81 --- /dev/null +++ b/vendors/readline/src/readline/util.c @@ -0,0 +1,338 @@ +/* util.c -- readline utility functions */ + +/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library, a library for + reading lines of text with interactive input and history editing. + + The GNU Readline Library is free software; you can redistribute it + and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2, or + (at your option) any later version. + + The GNU Readline 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 General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include +#include +#include "posixjmp.h" + +#if defined (HAVE_UNISTD_H) +# include /* for _POSIX_VERSION */ +#endif /* HAVE_UNISTD_H */ + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#include +#include + +/* System-specific feature definitions and include files. */ +#include "rldefs.h" + +#if defined (TIOCSTAT_IN_SYS_IOCTL) +# include +#endif /* TIOCSTAT_IN_SYS_IOCTL */ + +/* Some standard library routines. */ +#include "readline.h" + +#include "rlprivate.h" +#include "xmalloc.h" + +/* **************************************************************** */ +/* */ +/* Utility Functions */ +/* */ +/* **************************************************************** */ + +/* Return 0 if C is not a member of the class of characters that belong + in words, or 1 if it is. */ + +int _rl_allow_pathname_alphabetic_chars = 0; +static const char *pathname_alphabetic_chars = "/-_=~.#$"; + +int +rl_alphabetic (c) + int c; +{ + if (ALPHABETIC (c)) + return (1); + + return (_rl_allow_pathname_alphabetic_chars && + strchr (pathname_alphabetic_chars, c) != NULL); +} + +/* How to abort things. */ +int +_rl_abort_internal () +{ + rl_ding (); + rl_clear_message (); + _rl_init_argument (); + rl_clear_pending_input (); + + RL_UNSETSTATE (RL_STATE_MACRODEF); + while (rl_executing_macro) + _rl_pop_executing_macro (); + + rl_last_func = (rl_command_func_t *)NULL; + longjmp (readline_top_level, 1); + return (0); +} + +int +rl_abort (count, key) + int count, key; +{ + return (_rl_abort_internal ()); +} + +int +rl_tty_status (count, key) + int count, key; +{ +#if defined (TIOCSTAT) + ioctl (1, TIOCSTAT, (char *)0); + rl_refresh_line (count, key); +#else + rl_ding (); +#endif + return 0; +} + +/* Return a copy of the string between FROM and TO. + FROM is inclusive, TO is not. */ +char * +rl_copy_text (from, to) + int from, to; +{ + register int length; + char *copy; + + /* Fix it if the caller is confused. */ + if (from > to) + SWAP (from, to); + + length = to - from; + copy = (char *)xmalloc (1 + length); + strncpy (copy, rl_line_buffer + from, length); + copy[length] = '\0'; + return (copy); +} + +/* Increase the size of RL_LINE_BUFFER until it has enough space to hold + LEN characters. */ +void +rl_extend_line_buffer (len) + int len; +{ + while (len >= rl_line_buffer_len) + { + rl_line_buffer_len += DEFAULT_BUFFER_SIZE; + rl_line_buffer = (char *)xrealloc (rl_line_buffer, rl_line_buffer_len); + } + + _rl_set_the_line (); +} + + +/* A function for simple tilde expansion. */ +int +rl_tilde_expand (ignore, key) + int ignore, key; +{ + register int start, end; + char *homedir, *temp; + int len; + + end = rl_point; + start = end - 1; + + if (rl_point == rl_end && rl_line_buffer[rl_point] == '~') + { + homedir = tilde_expand ("~"); + _rl_replace_text (homedir, start, end); + return (0); + } + else if (rl_line_buffer[start] != '~') + { + for (; !whitespace (rl_line_buffer[start]) && start >= 0; start--) + ; + start++; + } + + end = start; + do + end++; + while (whitespace (rl_line_buffer[end]) == 0 && end < rl_end); + + if (whitespace (rl_line_buffer[end]) || end >= rl_end) + end--; + + /* If the first character of the current word is a tilde, perform + tilde expansion and insert the result. If not a tilde, do + nothing. */ + if (rl_line_buffer[start] == '~') + { + len = end - start + 1; + temp = (char *)xmalloc (len + 1); + strncpy (temp, rl_line_buffer + start, len); + temp[len] = '\0'; + homedir = tilde_expand (temp); + free (temp); + + _rl_replace_text (homedir, start, end); + } + + return (0); +} + +/* **************************************************************** */ +/* */ +/* String Utility Functions */ +/* */ +/* **************************************************************** */ + +/* Determine if s2 occurs in s1. If so, return a pointer to the + match in s1. The compare is case insensitive. */ +char * +_rl_strindex (s1, s2) + register const char *s1, *s2; +{ + register int i, l, len; + + for (i = 0, l = strlen (s2), len = strlen (s1); (len - i) >= l; i++) + if (_rl_strnicmp (s1 + i, s2, l) == 0) + return ((char *) (s1 + i)); + return ((char *)NULL); +} + +#ifndef HAVE_STRPBRK +/* Find the first occurrence in STRING1 of any character from STRING2. + Return a pointer to the character in STRING1. */ +char * +_rl_strpbrk (string1, string2) + const char *string1, *string2; +{ + register const char *scan; +#if defined (HANDLE_MULTIBYTE) + mbstate_t ps; + register int i, v; + + memset (&ps, 0, sizeof (mbstate_t)); +#endif + + for (; *string1; string1++) + { + for (scan = string2; *scan; scan++) + { + if (*string1 == *scan) + return ((char *)string1); + } +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + { + v = _rl_get_char_len (string1, &ps); + if (v > 1) + string1 += v - 1; /* -1 to account for auto-increment in loop */ + } +#endif + } + return ((char *)NULL); +} +#endif + +#if !defined (HAVE_STRCASECMP) +/* Compare at most COUNT characters from string1 to string2. Case + doesn't matter. */ +int +_rl_strnicmp (string1, string2, count) + char *string1, *string2; + int count; +{ + register char ch1, ch2; + + while (count) + { + ch1 = *string1++; + ch2 = *string2++; + if (_rl_to_upper(ch1) == _rl_to_upper(ch2)) + count--; + else + break; + } + return (count); +} + +/* strcmp (), but caseless. */ +int +_rl_stricmp (string1, string2) + char *string1, *string2; +{ + register char ch1, ch2; + + while (*string1 && *string2) + { + ch1 = *string1++; + ch2 = *string2++; + if (_rl_to_upper(ch1) != _rl_to_upper(ch2)) + return (1); + } + return (*string1 - *string2); +} +#endif /* !HAVE_STRCASECMP */ + +/* Stupid comparison routine for qsort () ing strings. */ +int +_rl_qsort_string_compare (s1, s2) + char **s1, **s2; +{ +#if defined (HAVE_STRCOLL) + return (strcoll (*s1, *s2)); +#else + int result; + + result = **s1 - **s2; + if (result == 0) + result = strcmp (*s1, *s2); + + return result; +#endif +} + +/* Function equivalents for the macros defined in chardefs.h. */ +#define FUNCTION_FOR_MACRO(f) int (f) (c) int c; { return f (c); } + +FUNCTION_FOR_MACRO (_rl_digit_p) +FUNCTION_FOR_MACRO (_rl_digit_value) +FUNCTION_FOR_MACRO (_rl_lowercase_p) +FUNCTION_FOR_MACRO (_rl_pure_alphabetic) +FUNCTION_FOR_MACRO (_rl_to_lower) +FUNCTION_FOR_MACRO (_rl_to_upper) +FUNCTION_FOR_MACRO (_rl_uppercase_p) + +/* Backwards compatibility, now that savestring has been removed from + all `public' readline header files. */ +#undef _rl_savestring +char * +_rl_savestring (s) + const char *s; +{ + return (strcpy ((char *)xmalloc (1 + (int)strlen (s)), (s))); +} diff --git a/vendors/readline/src/readline/vi_keymap.c b/vendors/readline/src/readline/vi_keymap.c new file mode 100644 index 0000000..ffa0a52 --- /dev/null +++ b/vendors/readline/src/readline/vi_keymap.c @@ -0,0 +1,876 @@ +/* vi_keymap.c -- the keymap for vi_mode in readline (). */ + +/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library, a library for + reading lines of text with interactive input and history editing. + + The GNU Readline Library is free software; you can redistribute it + and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2, or + (at your option) any later version. + + The GNU Readline 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 General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + +#if !defined (BUFSIZ) +#include +#endif /* !BUFSIZ */ + +#include "readline.h" + +#if 0 +extern KEYMAP_ENTRY_ARRAY vi_escape_keymap; +#endif + +/* The keymap arrays for handling vi mode. */ +KEYMAP_ENTRY_ARRAY vi_movement_keymap = { + /* The regular control keys come first. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-@ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-a */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-b */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-c */ + { ISFUNC, rl_vi_eof_maybe }, /* Control-d */ + { ISFUNC, rl_emacs_editing_mode }, /* Control-e */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-f */ + { ISFUNC, rl_abort }, /* Control-g */ + { ISFUNC, rl_backward_char }, /* Control-h */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-i */ + { ISFUNC, rl_newline }, /* Control-j */ + { ISFUNC, rl_kill_line }, /* Control-k */ + { ISFUNC, rl_clear_screen }, /* Control-l */ + { ISFUNC, rl_newline }, /* Control-m */ + { ISFUNC, rl_get_next_history }, /* Control-n */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-o */ + { ISFUNC, rl_get_previous_history }, /* Control-p */ + { ISFUNC, rl_quoted_insert }, /* Control-q */ + { ISFUNC, rl_reverse_search_history }, /* Control-r */ + { ISFUNC, rl_forward_search_history }, /* Control-s */ + { ISFUNC, rl_transpose_chars }, /* Control-t */ + { ISFUNC, rl_unix_line_discard }, /* Control-u */ + { ISFUNC, rl_quoted_insert }, /* Control-v */ + { ISFUNC, rl_unix_word_rubout }, /* Control-w */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-x */ + { ISFUNC, rl_yank }, /* Control-y */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-z */ + + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-[ */ /* vi_escape_keymap */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-\ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-] */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-^ */ + { ISFUNC, rl_vi_undo }, /* Control-_ */ + + /* The start of printing characters. */ + { ISFUNC, rl_forward_char }, /* SPACE */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ! */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* " */ + { ISFUNC, rl_insert_comment }, /* # */ + { ISFUNC, rl_end_of_line }, /* $ */ + { ISFUNC, rl_vi_match }, /* % */ + { ISFUNC, rl_vi_tilde_expand }, /* & */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ' */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ( */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ) */ + { ISFUNC, rl_vi_complete }, /* * */ + { ISFUNC, rl_get_next_history}, /* + */ + { ISFUNC, rl_vi_char_search }, /* , */ + { ISFUNC, rl_get_previous_history }, /* - */ + { ISFUNC, rl_vi_redo }, /* . */ + { ISFUNC, rl_vi_search }, /* / */ + + /* Regular digits. */ + { ISFUNC, rl_beg_of_line }, /* 0 */ + { ISFUNC, rl_vi_arg_digit }, /* 1 */ + { ISFUNC, rl_vi_arg_digit }, /* 2 */ + { ISFUNC, rl_vi_arg_digit }, /* 3 */ + { ISFUNC, rl_vi_arg_digit }, /* 4 */ + { ISFUNC, rl_vi_arg_digit }, /* 5 */ + { ISFUNC, rl_vi_arg_digit }, /* 6 */ + { ISFUNC, rl_vi_arg_digit }, /* 7 */ + { ISFUNC, rl_vi_arg_digit }, /* 8 */ + { ISFUNC, rl_vi_arg_digit }, /* 9 */ + + /* A little more punctuation. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* : */ + { ISFUNC, rl_vi_char_search }, /* ; */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* < */ + { ISFUNC, rl_vi_complete }, /* = */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* > */ + { ISFUNC, rl_vi_search }, /* ? */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* @ */ + + /* Uppercase alphabet. */ + { ISFUNC, rl_vi_append_eol }, /* A */ + { ISFUNC, rl_vi_prev_word}, /* B */ + { ISFUNC, rl_vi_change_to }, /* C */ + { ISFUNC, rl_vi_delete_to }, /* D */ + { ISFUNC, rl_vi_end_word }, /* E */ + { ISFUNC, rl_vi_char_search }, /* F */ + { ISFUNC, rl_vi_fetch_history }, /* G */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* H */ + { ISFUNC, rl_vi_insert_beg }, /* I */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* J */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* K */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* L */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* M */ + { ISFUNC, rl_vi_search_again }, /* N */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* O */ + { ISFUNC, rl_vi_put }, /* P */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Q */ + { ISFUNC, rl_vi_replace }, /* R */ + { ISFUNC, rl_vi_subst }, /* S */ + { ISFUNC, rl_vi_char_search }, /* T */ + { ISFUNC, rl_revert_line }, /* U */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* V */ + { ISFUNC, rl_vi_next_word }, /* W */ + { ISFUNC, rl_rubout }, /* X */ + { ISFUNC, rl_vi_yank_to }, /* Y */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Z */ + + /* Some more punctuation. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* [ */ + { ISFUNC, rl_vi_complete }, /* \ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ] */ + { ISFUNC, rl_vi_first_print }, /* ^ */ + { ISFUNC, rl_vi_yank_arg }, /* _ */ + { ISFUNC, rl_vi_goto_mark }, /* ` */ + + /* Lowercase alphabet. */ + { ISFUNC, rl_vi_append_mode }, /* a */ + { ISFUNC, rl_vi_prev_word }, /* b */ + { ISFUNC, rl_vi_change_to }, /* c */ + { ISFUNC, rl_vi_delete_to }, /* d */ + { ISFUNC, rl_vi_end_word }, /* e */ + { ISFUNC, rl_vi_char_search }, /* f */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* g */ + { ISFUNC, rl_backward_char }, /* h */ + { ISFUNC, rl_vi_insertion_mode }, /* i */ + { ISFUNC, rl_get_next_history }, /* j */ + { ISFUNC, rl_get_previous_history }, /* k */ + { ISFUNC, rl_forward_char }, /* l */ + { ISFUNC, rl_vi_set_mark }, /* m */ + { ISFUNC, rl_vi_search_again }, /* n */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* o */ + { ISFUNC, rl_vi_put }, /* p */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* q */ + { ISFUNC, rl_vi_change_char }, /* r */ + { ISFUNC, rl_vi_subst }, /* s */ + { ISFUNC, rl_vi_char_search }, /* t */ + { ISFUNC, rl_vi_undo }, /* u */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* v */ + { ISFUNC, rl_vi_next_word }, /* w */ + { ISFUNC, rl_vi_delete }, /* x */ + { ISFUNC, rl_vi_yank_to }, /* y */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* z */ + + /* Final punctuation. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* { */ + { ISFUNC, rl_vi_column }, /* | */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* } */ + { ISFUNC, rl_vi_change_case }, /* ~ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* RUBOUT */ + +#if KEYMAP_SIZE > 128 + /* Undefined keys. */ + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 } +#endif /* KEYMAP_SIZE > 128 */ +}; + +KEYMAP_ENTRY_ARRAY vi_insertion_keymap = { + /* The regular control keys come first. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-@ */ + { ISFUNC, rl_insert }, /* Control-a */ + { ISFUNC, rl_insert }, /* Control-b */ + { ISFUNC, rl_insert }, /* Control-c */ + { ISFUNC, rl_vi_eof_maybe }, /* Control-d */ + { ISFUNC, rl_insert }, /* Control-e */ + { ISFUNC, rl_insert }, /* Control-f */ + { ISFUNC, rl_insert }, /* Control-g */ + { ISFUNC, rl_rubout }, /* Control-h */ + { ISFUNC, rl_complete }, /* Control-i */ + { ISFUNC, rl_newline }, /* Control-j */ + { ISFUNC, rl_insert }, /* Control-k */ + { ISFUNC, rl_insert }, /* Control-l */ + { ISFUNC, rl_newline }, /* Control-m */ + { ISFUNC, rl_insert }, /* Control-n */ + { ISFUNC, rl_insert }, /* Control-o */ + { ISFUNC, rl_insert }, /* Control-p */ + { ISFUNC, rl_insert }, /* Control-q */ + { ISFUNC, rl_reverse_search_history }, /* Control-r */ + { ISFUNC, rl_forward_search_history }, /* Control-s */ + { ISFUNC, rl_transpose_chars }, /* Control-t */ + { ISFUNC, rl_unix_line_discard }, /* Control-u */ + { ISFUNC, rl_quoted_insert }, /* Control-v */ + { ISFUNC, rl_unix_word_rubout }, /* Control-w */ + { ISFUNC, rl_insert }, /* Control-x */ + { ISFUNC, rl_yank }, /* Control-y */ + { ISFUNC, rl_insert }, /* Control-z */ + + { ISFUNC, rl_vi_movement_mode }, /* Control-[ */ + { ISFUNC, rl_insert }, /* Control-\ */ + { ISFUNC, rl_insert }, /* Control-] */ + { ISFUNC, rl_insert }, /* Control-^ */ + { ISFUNC, rl_vi_undo }, /* Control-_ */ + + /* The start of printing characters. */ + { ISFUNC, rl_insert }, /* SPACE */ + { ISFUNC, rl_insert }, /* ! */ + { ISFUNC, rl_insert }, /* " */ + { ISFUNC, rl_insert }, /* # */ + { ISFUNC, rl_insert }, /* $ */ + { ISFUNC, rl_insert }, /* % */ + { ISFUNC, rl_insert }, /* & */ + { ISFUNC, rl_insert }, /* ' */ + { ISFUNC, rl_insert }, /* ( */ + { ISFUNC, rl_insert }, /* ) */ + { ISFUNC, rl_insert }, /* * */ + { ISFUNC, rl_insert }, /* + */ + { ISFUNC, rl_insert }, /* , */ + { ISFUNC, rl_insert }, /* - */ + { ISFUNC, rl_insert }, /* . */ + { ISFUNC, rl_insert }, /* / */ + + /* Regular digits. */ + { ISFUNC, rl_insert }, /* 0 */ + { ISFUNC, rl_insert }, /* 1 */ + { ISFUNC, rl_insert }, /* 2 */ + { ISFUNC, rl_insert }, /* 3 */ + { ISFUNC, rl_insert }, /* 4 */ + { ISFUNC, rl_insert }, /* 5 */ + { ISFUNC, rl_insert }, /* 6 */ + { ISFUNC, rl_insert }, /* 7 */ + { ISFUNC, rl_insert }, /* 8 */ + { ISFUNC, rl_insert }, /* 9 */ + + /* A little more punctuation. */ + { ISFUNC, rl_insert }, /* : */ + { ISFUNC, rl_insert }, /* ; */ + { ISFUNC, rl_insert }, /* < */ + { ISFUNC, rl_insert }, /* = */ + { ISFUNC, rl_insert }, /* > */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* @ */ + + /* Uppercase alphabet. */ + { ISFUNC, rl_insert }, /* A */ + { ISFUNC, rl_insert }, /* B */ + { ISFUNC, rl_insert }, /* C */ + { ISFUNC, rl_insert }, /* D */ + { ISFUNC, rl_insert }, /* E */ + { ISFUNC, rl_insert }, /* F */ + { ISFUNC, rl_insert }, /* G */ + { ISFUNC, rl_insert }, /* H */ + { ISFUNC, rl_insert }, /* I */ + { ISFUNC, rl_insert }, /* J */ + { ISFUNC, rl_insert }, /* K */ + { ISFUNC, rl_insert }, /* L */ + { ISFUNC, rl_insert }, /* M */ + { ISFUNC, rl_insert }, /* N */ + { ISFUNC, rl_insert }, /* O */ + { ISFUNC, rl_insert }, /* P */ + { ISFUNC, rl_insert }, /* Q */ + { ISFUNC, rl_insert }, /* R */ + { ISFUNC, rl_insert }, /* S */ + { ISFUNC, rl_insert }, /* T */ + { ISFUNC, rl_insert }, /* U */ + { ISFUNC, rl_insert }, /* V */ + { ISFUNC, rl_insert }, /* W */ + { ISFUNC, rl_insert }, /* X */ + { ISFUNC, rl_insert }, /* Y */ + { ISFUNC, rl_insert }, /* Z */ + + /* Some more punctuation. */ + { ISFUNC, rl_insert }, /* [ */ + { ISFUNC, rl_insert }, /* \ */ + { ISFUNC, rl_insert }, /* ] */ + { ISFUNC, rl_insert }, /* ^ */ + { ISFUNC, rl_insert }, /* _ */ + { ISFUNC, rl_insert }, /* ` */ + + /* Lowercase alphabet. */ + { ISFUNC, rl_insert }, /* a */ + { ISFUNC, rl_insert }, /* b */ + { ISFUNC, rl_insert }, /* c */ + { ISFUNC, rl_insert }, /* d */ + { ISFUNC, rl_insert }, /* e */ + { ISFUNC, rl_insert }, /* f */ + { ISFUNC, rl_insert }, /* g */ + { ISFUNC, rl_insert }, /* h */ + { ISFUNC, rl_insert }, /* i */ + { ISFUNC, rl_insert }, /* j */ + { ISFUNC, rl_insert }, /* k */ + { ISFUNC, rl_insert }, /* l */ + { ISFUNC, rl_insert }, /* m */ + { ISFUNC, rl_insert }, /* n */ + { ISFUNC, rl_insert }, /* o */ + { ISFUNC, rl_insert }, /* p */ + { ISFUNC, rl_insert }, /* q */ + { ISFUNC, rl_insert }, /* r */ + { ISFUNC, rl_insert }, /* s */ + { ISFUNC, rl_insert }, /* t */ + { ISFUNC, rl_insert }, /* u */ + { ISFUNC, rl_insert }, /* v */ + { ISFUNC, rl_insert }, /* w */ + { ISFUNC, rl_insert }, /* x */ + { ISFUNC, rl_insert }, /* y */ + { ISFUNC, rl_insert }, /* z */ + + /* Final punctuation. */ + { ISFUNC, rl_insert }, /* { */ + { ISFUNC, rl_insert }, /* | */ + { ISFUNC, rl_insert }, /* } */ + { ISFUNC, rl_insert }, /* ~ */ + { ISFUNC, rl_rubout }, /* RUBOUT */ + +#if KEYMAP_SIZE > 128 + /* Pure 8-bit characters (128 - 159). + These might be used in some + character sets. */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + { ISFUNC, rl_insert }, /* ? */ + + /* ISO Latin-1 characters (160 - 255) */ + { ISFUNC, rl_insert }, /* No-break space */ + { ISFUNC, rl_insert }, /* Inverted exclamation mark */ + { ISFUNC, rl_insert }, /* Cent sign */ + { ISFUNC, rl_insert }, /* Pound sign */ + { ISFUNC, rl_insert }, /* Currency sign */ + { ISFUNC, rl_insert }, /* Yen sign */ + { ISFUNC, rl_insert }, /* Broken bar */ + { ISFUNC, rl_insert }, /* Section sign */ + { ISFUNC, rl_insert }, /* Diaeresis */ + { ISFUNC, rl_insert }, /* Copyright sign */ + { ISFUNC, rl_insert }, /* Feminine ordinal indicator */ + { ISFUNC, rl_insert }, /* Left pointing double angle quotation mark */ + { ISFUNC, rl_insert }, /* Not sign */ + { ISFUNC, rl_insert }, /* Soft hyphen */ + { ISFUNC, rl_insert }, /* Registered sign */ + { ISFUNC, rl_insert }, /* Macron */ + { ISFUNC, rl_insert }, /* Degree sign */ + { ISFUNC, rl_insert }, /* Plus-minus sign */ + { ISFUNC, rl_insert }, /* Superscript two */ + { ISFUNC, rl_insert }, /* Superscript three */ + { ISFUNC, rl_insert }, /* Acute accent */ + { ISFUNC, rl_insert }, /* Micro sign */ + { ISFUNC, rl_insert }, /* Pilcrow sign */ + { ISFUNC, rl_insert }, /* Middle dot */ + { ISFUNC, rl_insert }, /* Cedilla */ + { ISFUNC, rl_insert }, /* Superscript one */ + { ISFUNC, rl_insert }, /* Masculine ordinal indicator */ + { ISFUNC, rl_insert }, /* Right pointing double angle quotation mark */ + { ISFUNC, rl_insert }, /* Vulgar fraction one quarter */ + { ISFUNC, rl_insert }, /* Vulgar fraction one half */ + { ISFUNC, rl_insert }, /* Vulgar fraction three quarters */ + { ISFUNC, rl_insert }, /* Inverted questionk mark */ + { ISFUNC, rl_insert }, /* Latin capital letter a with grave */ + { ISFUNC, rl_insert }, /* Latin capital letter a with acute */ + { ISFUNC, rl_insert }, /* Latin capital letter a with circumflex */ + { ISFUNC, rl_insert }, /* Latin capital letter a with tilde */ + { ISFUNC, rl_insert }, /* Latin capital letter a with diaeresis */ + { ISFUNC, rl_insert }, /* Latin capital letter a with ring above */ + { ISFUNC, rl_insert }, /* Latin capital letter ae */ + { ISFUNC, rl_insert }, /* Latin capital letter c with cedilla */ + { ISFUNC, rl_insert }, /* Latin capital letter e with grave */ + { ISFUNC, rl_insert }, /* Latin capital letter e with acute */ + { ISFUNC, rl_insert }, /* Latin capital letter e with circumflex */ + { ISFUNC, rl_insert }, /* Latin capital letter e with diaeresis */ + { ISFUNC, rl_insert }, /* Latin capital letter i with grave */ + { ISFUNC, rl_insert }, /* Latin capital letter i with acute */ + { ISFUNC, rl_insert }, /* Latin capital letter i with circumflex */ + { ISFUNC, rl_insert }, /* Latin capital letter i with diaeresis */ + { ISFUNC, rl_insert }, /* Latin capital letter eth (Icelandic) */ + { ISFUNC, rl_insert }, /* Latin capital letter n with tilde */ + { ISFUNC, rl_insert }, /* Latin capital letter o with grave */ + { ISFUNC, rl_insert }, /* Latin capital letter o with acute */ + { ISFUNC, rl_insert }, /* Latin capital letter o with circumflex */ + { ISFUNC, rl_insert }, /* Latin capital letter o with tilde */ + { ISFUNC, rl_insert }, /* Latin capital letter o with diaeresis */ + { ISFUNC, rl_insert }, /* Multiplication sign */ + { ISFUNC, rl_insert }, /* Latin capital letter o with stroke */ + { ISFUNC, rl_insert }, /* Latin capital letter u with grave */ + { ISFUNC, rl_insert }, /* Latin capital letter u with acute */ + { ISFUNC, rl_insert }, /* Latin capital letter u with circumflex */ + { ISFUNC, rl_insert }, /* Latin capital letter u with diaeresis */ + { ISFUNC, rl_insert }, /* Latin capital letter Y with acute */ + { ISFUNC, rl_insert }, /* Latin capital letter thorn (Icelandic) */ + { ISFUNC, rl_insert }, /* Latin small letter sharp s (German) */ + { ISFUNC, rl_insert }, /* Latin small letter a with grave */ + { ISFUNC, rl_insert }, /* Latin small letter a with acute */ + { ISFUNC, rl_insert }, /* Latin small letter a with circumflex */ + { ISFUNC, rl_insert }, /* Latin small letter a with tilde */ + { ISFUNC, rl_insert }, /* Latin small letter a with diaeresis */ + { ISFUNC, rl_insert }, /* Latin small letter a with ring above */ + { ISFUNC, rl_insert }, /* Latin small letter ae */ + { ISFUNC, rl_insert }, /* Latin small letter c with cedilla */ + { ISFUNC, rl_insert }, /* Latin small letter e with grave */ + { ISFUNC, rl_insert }, /* Latin small letter e with acute */ + { ISFUNC, rl_insert }, /* Latin small letter e with circumflex */ + { ISFUNC, rl_insert }, /* Latin small letter e with diaeresis */ + { ISFUNC, rl_insert }, /* Latin small letter i with grave */ + { ISFUNC, rl_insert }, /* Latin small letter i with acute */ + { ISFUNC, rl_insert }, /* Latin small letter i with circumflex */ + { ISFUNC, rl_insert }, /* Latin small letter i with diaeresis */ + { ISFUNC, rl_insert }, /* Latin small letter eth (Icelandic) */ + { ISFUNC, rl_insert }, /* Latin small letter n with tilde */ + { ISFUNC, rl_insert }, /* Latin small letter o with grave */ + { ISFUNC, rl_insert }, /* Latin small letter o with acute */ + { ISFUNC, rl_insert }, /* Latin small letter o with circumflex */ + { ISFUNC, rl_insert }, /* Latin small letter o with tilde */ + { ISFUNC, rl_insert }, /* Latin small letter o with diaeresis */ + { ISFUNC, rl_insert }, /* Division sign */ + { ISFUNC, rl_insert }, /* Latin small letter o with stroke */ + { ISFUNC, rl_insert }, /* Latin small letter u with grave */ + { ISFUNC, rl_insert }, /* Latin small letter u with acute */ + { ISFUNC, rl_insert }, /* Latin small letter u with circumflex */ + { ISFUNC, rl_insert }, /* Latin small letter u with diaeresis */ + { ISFUNC, rl_insert }, /* Latin small letter y with acute */ + { ISFUNC, rl_insert }, /* Latin small letter thorn (Icelandic) */ + { ISFUNC, rl_insert } /* Latin small letter y with diaeresis */ +#endif /* KEYMAP_SIZE > 128 */ +}; + +/* Unused for the time being. */ +#if 0 +KEYMAP_ENTRY_ARRAY vi_escape_keymap = { + /* The regular control keys come first. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-@ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-a */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-b */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-c */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-d */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-e */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-f */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-g */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-h */ + { ISFUNC, rl_tab_insert}, /* Control-i */ + { ISFUNC, rl_emacs_editing_mode}, /* Control-j */ + { ISFUNC, rl_kill_line }, /* Control-k */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-l */ + { ISFUNC, rl_emacs_editing_mode}, /* Control-m */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-n */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-o */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-p */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-q */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-r */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-s */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-t */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-u */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-v */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-w */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-x */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-y */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-z */ + + { ISFUNC, rl_vi_movement_mode }, /* Control-[ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-\ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-] */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* Control-^ */ + { ISFUNC, rl_vi_undo }, /* Control-_ */ + + /* The start of printing characters. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* SPACE */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ! */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* " */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* # */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* $ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* % */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* & */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ' */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ( */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ) */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* * */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* + */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* , */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* - */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* . */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* / */ + + /* Regular digits. */ + { ISFUNC, rl_vi_arg_digit }, /* 0 */ + { ISFUNC, rl_vi_arg_digit }, /* 1 */ + { ISFUNC, rl_vi_arg_digit }, /* 2 */ + { ISFUNC, rl_vi_arg_digit }, /* 3 */ + { ISFUNC, rl_vi_arg_digit }, /* 4 */ + { ISFUNC, rl_vi_arg_digit }, /* 5 */ + { ISFUNC, rl_vi_arg_digit }, /* 6 */ + { ISFUNC, rl_vi_arg_digit }, /* 7 */ + { ISFUNC, rl_vi_arg_digit }, /* 8 */ + { ISFUNC, rl_vi_arg_digit }, /* 9 */ + + /* A little more punctuation. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* : */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ; */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* < */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* = */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* > */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ? */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* @ */ + + /* Uppercase alphabet. */ + { ISFUNC, rl_do_lowercase_version }, /* A */ + { ISFUNC, rl_do_lowercase_version }, /* B */ + { ISFUNC, rl_do_lowercase_version }, /* C */ + { ISFUNC, rl_do_lowercase_version }, /* D */ + { ISFUNC, rl_do_lowercase_version }, /* E */ + { ISFUNC, rl_do_lowercase_version }, /* F */ + { ISFUNC, rl_do_lowercase_version }, /* G */ + { ISFUNC, rl_do_lowercase_version }, /* H */ + { ISFUNC, rl_do_lowercase_version }, /* I */ + { ISFUNC, rl_do_lowercase_version }, /* J */ + { ISFUNC, rl_do_lowercase_version }, /* K */ + { ISFUNC, rl_do_lowercase_version }, /* L */ + { ISFUNC, rl_do_lowercase_version }, /* M */ + { ISFUNC, rl_do_lowercase_version }, /* N */ + { ISFUNC, rl_do_lowercase_version }, /* O */ + { ISFUNC, rl_do_lowercase_version }, /* P */ + { ISFUNC, rl_do_lowercase_version }, /* Q */ + { ISFUNC, rl_do_lowercase_version }, /* R */ + { ISFUNC, rl_do_lowercase_version }, /* S */ + { ISFUNC, rl_do_lowercase_version }, /* T */ + { ISFUNC, rl_do_lowercase_version }, /* U */ + { ISFUNC, rl_do_lowercase_version }, /* V */ + { ISFUNC, rl_do_lowercase_version }, /* W */ + { ISFUNC, rl_do_lowercase_version }, /* X */ + { ISFUNC, rl_do_lowercase_version }, /* Y */ + { ISFUNC, rl_do_lowercase_version }, /* Z */ + + /* Some more punctuation. */ + { ISFUNC, rl_arrow_keys }, /* [ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* \ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ] */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ^ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* _ */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ` */ + + /* Lowercase alphabet. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* a */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* b */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* c */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* d */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* e */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* f */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* g */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* h */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* i */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* j */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* k */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* l */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* m */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* n */ + { ISFUNC, rl_arrow_keys }, /* o */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* p */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* q */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* r */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* s */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* t */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* u */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* v */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* w */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* x */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* y */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* z */ + + /* Final punctuation. */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* { */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* | */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* } */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* ~ */ + { ISFUNC, rl_backward_kill_word }, /* RUBOUT */ + +#if KEYMAP_SIZE > 128 + /* Undefined keys. */ + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 }, + { ISFUNC, (rl_command_func_t *)0x0 } +#endif /* KEYMAP_SIZE > 128 */ +}; +#endif diff --git a/vendors/readline/src/readline/vi_mode.c b/vendors/readline/src/readline/vi_mode.c new file mode 100644 index 0000000..74d8acb --- /dev/null +++ b/vendors/readline/src/readline/vi_mode.c @@ -0,0 +1,1505 @@ +/* vi_mode.c -- A vi emulation mode for Bash. + Derived from code written by Jeff Sparkes (jsparkes@bnr.ca). */ + +/* Copyright (C) 1987-2004 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library, a library for + reading lines of text with interactive input and history editing. + + The GNU Readline Library is free software; you can redistribute it + and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2, or + (at your option) any later version. + + The GNU Readline 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 General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ +#define READLINE_LIBRARY + +/* **************************************************************** */ +/* */ +/* VI Emulation Mode */ +/* */ +/* **************************************************************** */ +#include "rlconf.h" + +#if defined (VI_MODE) + +#if defined (HAVE_CONFIG_H) +# include +#endif + +#include + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#if defined (HAVE_UNISTD_H) +# include +#endif + +#include + +/* Some standard library routines. */ +#include "rldefs.h" +#include "rlmbutil.h" + +#include "readline.h" +#include "history.h" + +#include "rlprivate.h" +#include "xmalloc.h" + +#ifndef member +#define member(c, s) ((c) ? (char *)strchr ((s), (c)) != (char *)NULL : 0) +#endif + +int _rl_vi_last_command = 'i'; /* default `.' puts you in insert mode */ + +/* Non-zero means enter insertion mode. */ +static int _rl_vi_doing_insert; + +/* Command keys which do movement for xxx_to commands. */ +static const char *vi_motion = " hl^$0ftFT;,%wbeWBE|"; + +/* Keymap used for vi replace characters. Created dynamically since + rarely used. */ +static Keymap vi_replace_map; + +/* The number of characters inserted in the last replace operation. */ +static int vi_replace_count; + +/* If non-zero, we have text inserted after a c[motion] command that put + us implicitly into insert mode. Some people want this text to be + attached to the command so that it is `redoable' with `.'. */ +static int vi_continued_command; +static char *vi_insert_buffer; +static int vi_insert_buffer_size; + +static int _rl_vi_last_repeat = 1; +static int _rl_vi_last_arg_sign = 1; +static int _rl_vi_last_motion; +#if defined (HANDLE_MULTIBYTE) +static char _rl_vi_last_search_mbchar[MB_LEN_MAX]; +#else +static int _rl_vi_last_search_char; +#endif +static int _rl_vi_last_replacement; + +static int _rl_vi_last_key_before_insert; + +static int vi_redoing; + +/* Text modification commands. These are the `redoable' commands. */ +static const char *vi_textmod = "_*\\AaIiCcDdPpYyRrSsXx~"; + +/* Arrays for the saved marks. */ +static int vi_mark_chars['z' - 'a' + 1]; + +static void _rl_vi_stuff_insert PARAMS((int)); +static void _rl_vi_save_insert PARAMS((UNDO_LIST *)); +static int rl_digit_loop1 PARAMS((void)); + +void +_rl_vi_initialize_line () +{ + register int i; + + for (i = 0; i < sizeof (vi_mark_chars) / sizeof (int); i++) + vi_mark_chars[i] = -1; +} + +void +_rl_vi_reset_last () +{ + _rl_vi_last_command = 'i'; + _rl_vi_last_repeat = 1; + _rl_vi_last_arg_sign = 1; + _rl_vi_last_motion = 0; +} + +void +_rl_vi_set_last (key, repeat, sign) + int key, repeat, sign; +{ + _rl_vi_last_command = key; + _rl_vi_last_repeat = repeat; + _rl_vi_last_arg_sign = sign; +} + +/* A convenience function that calls _rl_vi_set_last to save the last command + information and enters insertion mode. */ +void +rl_vi_start_inserting (key, repeat, sign) + int key, repeat, sign; +{ + _rl_vi_set_last (key, repeat, sign); + rl_vi_insertion_mode (1, key); +} + +/* Is the command C a VI mode text modification command? */ +int +_rl_vi_textmod_command (c) + int c; +{ + return (member (c, vi_textmod)); +} + +static void +_rl_vi_stuff_insert (count) + int count; +{ + rl_begin_undo_group (); + while (count--) + rl_insert_text (vi_insert_buffer); + rl_end_undo_group (); +} + +/* Bound to `.'. Called from command mode, so we know that we have to + redo a text modification command. The default for _rl_vi_last_command + puts you back into insert mode. */ +int +rl_vi_redo (count, c) + int count, c; +{ + int r; + + if (!rl_explicit_arg) + { + rl_numeric_arg = _rl_vi_last_repeat; + rl_arg_sign = _rl_vi_last_arg_sign; + } + + r = 0; + vi_redoing = 1; + /* If we're redoing an insert with `i', stuff in the inserted text + and do not go into insertion mode. */ + if (_rl_vi_last_command == 'i' && vi_insert_buffer && *vi_insert_buffer) + { + _rl_vi_stuff_insert (count); + /* And back up point over the last character inserted. */ + if (rl_point > 0) + rl_point--; + } + else + r = _rl_dispatch (_rl_vi_last_command, _rl_keymap); + vi_redoing = 0; + + return (r); +} + +/* A placeholder for further expansion. */ +int +rl_vi_undo (count, key) + int count, key; +{ + return (rl_undo_command (count, key)); +} + +/* Yank the nth arg from the previous line into this line at point. */ +int +rl_vi_yank_arg (count, key) + int count, key; +{ + /* Readline thinks that the first word on a line is the 0th, while vi + thinks the first word on a line is the 1st. Compensate. */ + if (rl_explicit_arg) + rl_yank_nth_arg (count - 1, 0); + else + rl_yank_nth_arg ('$', 0); + + return (0); +} + +/* With an argument, move back that many history lines, else move to the + beginning of history. */ +int +rl_vi_fetch_history (count, c) + int count, c; +{ + int wanted; + + /* Giving an argument of n means we want the nth command in the history + file. The command number is interpreted the same way that the bash + `history' command does it -- that is, giving an argument count of 450 + to this command would get the command listed as number 450 in the + output of `history'. */ + if (rl_explicit_arg) + { + wanted = history_base + where_history () - count; + if (wanted <= 0) + rl_beginning_of_history (0, 0); + else + rl_get_previous_history (wanted, c); + } + else + rl_beginning_of_history (count, 0); + return (0); +} + +/* Search again for the last thing searched for. */ +int +rl_vi_search_again (count, key) + int count, key; +{ + switch (key) + { + case 'n': + rl_noninc_reverse_search_again (count, key); + break; + + case 'N': + rl_noninc_forward_search_again (count, key); + break; + } + return (0); +} + +/* Do a vi style search. */ +int +rl_vi_search (count, key) + int count, key; +{ + switch (key) + { + case '?': + rl_noninc_forward_search (count, key); + break; + + case '/': + rl_noninc_reverse_search (count, key); + break; + + default: + rl_ding (); + break; + } + return (0); +} + +/* Completion, from vi's point of view. */ +int +rl_vi_complete (ignore, key) + int ignore, key; +{ + if ((rl_point < rl_end) && (!whitespace (rl_line_buffer[rl_point]))) + { + if (!whitespace (rl_line_buffer[rl_point + 1])) + rl_vi_end_word (1, 'E'); + rl_point++; + } + + if (key == '*') + rl_complete_internal ('*'); /* Expansion and replacement. */ + else if (key == '=') + rl_complete_internal ('?'); /* List possible completions. */ + else if (key == '\\') + rl_complete_internal (TAB); /* Standard Readline completion. */ + else + rl_complete (0, key); + + if (key == '*' || key == '\\') + rl_vi_start_inserting (key, 1, rl_arg_sign); + + return (0); +} + +/* Tilde expansion for vi mode. */ +int +rl_vi_tilde_expand (ignore, key) + int ignore, key; +{ + rl_tilde_expand (0, key); + rl_vi_start_inserting (key, 1, rl_arg_sign); + return (0); +} + +/* Previous word in vi mode. */ +int +rl_vi_prev_word (count, key) + int count, key; +{ + if (count < 0) + return (rl_vi_next_word (-count, key)); + + if (rl_point == 0) + { + rl_ding (); + return (0); + } + + if (_rl_uppercase_p (key)) + rl_vi_bWord (count, key); + else + rl_vi_bword (count, key); + + return (0); +} + +/* Next word in vi mode. */ +int +rl_vi_next_word (count, key) + int count, key; +{ + if (count < 0) + return (rl_vi_prev_word (-count, key)); + + if (rl_point >= (rl_end - 1)) + { + rl_ding (); + return (0); + } + + if (_rl_uppercase_p (key)) + rl_vi_fWord (count, key); + else + rl_vi_fword (count, key); + return (0); +} + +/* Move to the end of the ?next? word. */ +int +rl_vi_end_word (count, key) + int count, key; +{ + if (count < 0) + { + rl_ding (); + return -1; + } + + if (_rl_uppercase_p (key)) + rl_vi_eWord (count, key); + else + rl_vi_eword (count, key); + return (0); +} + +/* Move forward a word the way that 'W' does. */ +int +rl_vi_fWord (count, ignore) + int count, ignore; +{ + while (count-- && rl_point < (rl_end - 1)) + { + /* Skip until whitespace. */ + while (!whitespace (rl_line_buffer[rl_point]) && rl_point < rl_end) + rl_point++; + + /* Now skip whitespace. */ + while (whitespace (rl_line_buffer[rl_point]) && rl_point < rl_end) + rl_point++; + } + return (0); +} + +int +rl_vi_bWord (count, ignore) + int count, ignore; +{ + while (count-- && rl_point > 0) + { + /* If we are at the start of a word, move back to whitespace so + we will go back to the start of the previous word. */ + if (!whitespace (rl_line_buffer[rl_point]) && + whitespace (rl_line_buffer[rl_point - 1])) + rl_point--; + + while (rl_point > 0 && whitespace (rl_line_buffer[rl_point])) + rl_point--; + + if (rl_point > 0) + { + while (--rl_point >= 0 && !whitespace (rl_line_buffer[rl_point])); + rl_point++; + } + } + return (0); +} + +int +rl_vi_eWord (count, ignore) + int count, ignore; +{ + while (count-- && rl_point < (rl_end - 1)) + { + if (!whitespace (rl_line_buffer[rl_point])) + rl_point++; + + /* Move to the next non-whitespace character (to the start of the + next word). */ + while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point])) + rl_point++; + + if (rl_point && rl_point < rl_end) + { + /* Skip whitespace. */ + while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point])) + rl_point++; + + /* Skip until whitespace. */ + while (rl_point < rl_end && !whitespace (rl_line_buffer[rl_point])) + rl_point++; + + /* Move back to the last character of the word. */ + rl_point--; + } + } + return (0); +} + +int +rl_vi_fword (count, ignore) + int count, ignore; +{ + while (count-- && rl_point < (rl_end - 1)) + { + /* Move to white space (really non-identifer). */ + if (_rl_isident (rl_line_buffer[rl_point])) + { + while (_rl_isident (rl_line_buffer[rl_point]) && rl_point < rl_end) + rl_point++; + } + else /* if (!whitespace (rl_line_buffer[rl_point])) */ + { + while (!_rl_isident (rl_line_buffer[rl_point]) && + !whitespace (rl_line_buffer[rl_point]) && rl_point < rl_end) + rl_point++; + } + + /* Move past whitespace. */ + while (whitespace (rl_line_buffer[rl_point]) && rl_point < rl_end) + rl_point++; + } + return (0); +} + +int +rl_vi_bword (count, ignore) + int count, ignore; +{ + while (count-- && rl_point > 0) + { + int last_is_ident; + + /* If we are at the start of a word, move back to whitespace + so we will go back to the start of the previous word. */ + if (!whitespace (rl_line_buffer[rl_point]) && + whitespace (rl_line_buffer[rl_point - 1])) + rl_point--; + + /* If this character and the previous character are `opposite', move + back so we don't get messed up by the rl_point++ down there in + the while loop. Without this code, words like `l;' screw up the + function. */ + last_is_ident = _rl_isident (rl_line_buffer[rl_point - 1]); + if ((_rl_isident (rl_line_buffer[rl_point]) && !last_is_ident) || + (!_rl_isident (rl_line_buffer[rl_point]) && last_is_ident)) + rl_point--; + + while (rl_point > 0 && whitespace (rl_line_buffer[rl_point])) + rl_point--; + + if (rl_point > 0) + { + if (_rl_isident (rl_line_buffer[rl_point])) + while (--rl_point >= 0 && _rl_isident (rl_line_buffer[rl_point])); + else + while (--rl_point >= 0 && !_rl_isident (rl_line_buffer[rl_point]) && + !whitespace (rl_line_buffer[rl_point])); + rl_point++; + } + } + return (0); +} + +int +rl_vi_eword (count, ignore) + int count, ignore; +{ + while (count-- && rl_point < rl_end - 1) + { + if (!whitespace (rl_line_buffer[rl_point])) + rl_point++; + + while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point])) + rl_point++; + + if (rl_point < rl_end) + { + if (_rl_isident (rl_line_buffer[rl_point])) + while (++rl_point < rl_end && _rl_isident (rl_line_buffer[rl_point])); + else + while (++rl_point < rl_end && !_rl_isident (rl_line_buffer[rl_point]) + && !whitespace (rl_line_buffer[rl_point])); + } + rl_point--; + } + return (0); +} + +int +rl_vi_insert_beg (count, key) + int count, key; +{ + rl_beg_of_line (1, key); + rl_vi_insertion_mode (1, key); + return (0); +} + +int +rl_vi_append_mode (count, key) + int count, key; +{ + if (rl_point < rl_end) + { + if (MB_CUR_MAX == 1 || rl_byte_oriented) + rl_point++; + else + { + int point = rl_point; + rl_forward_char (1, key); + if (point == rl_point) + rl_point = rl_end; + } + } + rl_vi_insertion_mode (1, key); + return (0); +} + +int +rl_vi_append_eol (count, key) + int count, key; +{ + rl_end_of_line (1, key); + rl_vi_append_mode (1, key); + return (0); +} + +/* What to do in the case of C-d. */ +int +rl_vi_eof_maybe (count, c) + int count, c; +{ + return (rl_newline (1, '\n')); +} + +/* Insertion mode stuff. */ + +/* Switching from one mode to the other really just involves + switching keymaps. */ +int +rl_vi_insertion_mode (count, key) + int count, key; +{ + _rl_keymap = vi_insertion_keymap; + _rl_vi_last_key_before_insert = key; + return (0); +} + +static void +_rl_vi_save_insert (up) + UNDO_LIST *up; +{ + int len, start, end; + + if (up == 0) + { + if (vi_insert_buffer_size >= 1) + vi_insert_buffer[0] = '\0'; + return; + } + + start = up->start; + end = up->end; + len = end - start + 1; + if (len >= vi_insert_buffer_size) + { + vi_insert_buffer_size += (len + 32) - (len % 32); + vi_insert_buffer = (char *)xrealloc (vi_insert_buffer, vi_insert_buffer_size); + } + strncpy (vi_insert_buffer, rl_line_buffer + start, len - 1); + vi_insert_buffer[len-1] = '\0'; +} + +void +_rl_vi_done_inserting () +{ + if (_rl_vi_doing_insert) + { + /* The `C', `s', and `S' commands set this. */ + rl_end_undo_group (); + /* Now, the text between rl_undo_list->next->start and + rl_undo_list->next->end is what was inserted while in insert + mode. It gets copied to VI_INSERT_BUFFER because it depends + on absolute indices into the line which may change (though they + probably will not). */ + _rl_vi_doing_insert = 0; + _rl_vi_save_insert (rl_undo_list->next); + vi_continued_command = 1; + } + else + { + if ((_rl_vi_last_key_before_insert == 'i' || _rl_vi_last_key_before_insert == 'a') && rl_undo_list) + _rl_vi_save_insert (rl_undo_list); + /* XXX - Other keys probably need to be checked. */ + else if (_rl_vi_last_key_before_insert == 'C') + rl_end_undo_group (); + while (_rl_undo_group_level > 0) + rl_end_undo_group (); + vi_continued_command = 0; + } +} + +int +rl_vi_movement_mode (count, key) + int count, key; +{ + if (rl_point > 0) + rl_backward_char (1, key); + + _rl_keymap = vi_movement_keymap; + _rl_vi_done_inserting (); + return (0); +} + +int +rl_vi_arg_digit (count, c) + int count, c; +{ + if (c == '0' && rl_numeric_arg == 1 && !rl_explicit_arg) + return (rl_beg_of_line (1, c)); + else + return (rl_digit_argument (count, c)); +} + +/* Change the case of the next COUNT characters. */ +#if defined (HANDLE_MULTIBYTE) +static int +_rl_vi_change_mbchar_case (count) + int count; +{ + wchar_t wc; + char mb[MB_LEN_MAX+1]; + int mblen; + mbstate_t ps; + + memset (&ps, 0, sizeof (mbstate_t)); + if (_rl_adjust_point (rl_line_buffer, rl_point, &ps) > 0) + count--; + while (count-- && rl_point < rl_end) + { + mbrtowc (&wc, rl_line_buffer + rl_point, rl_end - rl_point, &ps); + if (iswupper (wc)) + wc = towlower (wc); + else if (iswlower (wc)) + wc = towupper (wc); + else + { + /* Just skip over chars neither upper nor lower case */ + rl_forward_char (1, 0); + continue; + } + + /* Vi is kind of strange here. */ + if (wc) + { + mblen = wcrtomb (mb, wc, &ps); + if (mblen >= 0) + mb[mblen] = '\0'; + rl_begin_undo_group (); + rl_delete (1, 0); + rl_insert_text (mb); + rl_end_undo_group (); + rl_vi_check (); + } + else + rl_forward_char (1, 0); + } + + return 0; +} +#endif + +int +rl_vi_change_case (count, ignore) + int count, ignore; +{ + int c, p; + + /* Don't try this on an empty line. */ + if (rl_point >= rl_end) + return (0); + + c = 0; +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + return (_rl_vi_change_mbchar_case (count)); +#endif + + while (count-- && rl_point < rl_end) + { + if (_rl_uppercase_p (rl_line_buffer[rl_point])) + c = _rl_to_lower (rl_line_buffer[rl_point]); + else if (_rl_lowercase_p (rl_line_buffer[rl_point])) + c = _rl_to_upper (rl_line_buffer[rl_point]); + else + { + /* Just skip over characters neither upper nor lower case. */ + rl_forward_char (1, c); + continue; + } + + /* Vi is kind of strange here. */ + if (c) + { + p = rl_point; + rl_begin_undo_group (); + rl_vi_delete (1, c); + if (rl_point < p) /* Did we retreat at EOL? */ + rl_point++; + _rl_insert_char (1, c); + rl_end_undo_group (); + rl_vi_check (); + } + else + rl_forward_char (1, c); + } + return (0); +} + +int +rl_vi_put (count, key) + int count, key; +{ + if (!_rl_uppercase_p (key) && (rl_point + 1 <= rl_end)) + rl_point = _rl_find_next_mbchar (rl_line_buffer, rl_point, 1, MB_FIND_NONZERO); + + while (count--) + rl_yank (1, key); + + rl_backward_char (1, key); + return (0); +} + +int +rl_vi_check () +{ + if (rl_point && rl_point == rl_end) + { + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + rl_point = _rl_find_prev_mbchar (rl_line_buffer, rl_point, MB_FIND_NONZERO); + else + rl_point--; + } + return (0); +} + +int +rl_vi_column (count, key) + int count, key; +{ + if (count > rl_end) + rl_end_of_line (1, key); + else + rl_point = count - 1; + return (0); +} + +int +rl_vi_domove (key, nextkey) + int key, *nextkey; +{ + int c, save; + int old_end; + + rl_mark = rl_point; + RL_SETSTATE(RL_STATE_MOREINPUT); + c = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + *nextkey = c; + + if (!member (c, vi_motion)) + { + if (_rl_digit_p (c)) + { + save = rl_numeric_arg; + rl_numeric_arg = _rl_digit_value (c); + rl_explicit_arg = 1; + rl_digit_loop1 (); + rl_numeric_arg *= save; + RL_SETSTATE(RL_STATE_MOREINPUT); + c = rl_read_key (); /* real command */ + RL_UNSETSTATE(RL_STATE_MOREINPUT); + *nextkey = c; + } + else if (key == c && (key == 'd' || key == 'y' || key == 'c')) + { + rl_mark = rl_end; + rl_beg_of_line (1, c); + _rl_vi_last_motion = c; + return (0); + } + else + return (-1); + } + + _rl_vi_last_motion = c; + + /* Append a blank character temporarily so that the motion routines + work right at the end of the line. */ + old_end = rl_end; + rl_line_buffer[rl_end++] = ' '; + rl_line_buffer[rl_end] = '\0'; + + _rl_dispatch (c, _rl_keymap); + + /* Remove the blank that we added. */ + rl_end = old_end; + rl_line_buffer[rl_end] = '\0'; + if (rl_point > rl_end) + rl_point = rl_end; + + /* No change in position means the command failed. */ + if (rl_mark == rl_point) + return (-1); + + /* rl_vi_f[wW]ord () leaves the cursor on the first character of the next + word. If we are not at the end of the line, and we are on a + non-whitespace character, move back one (presumably to whitespace). */ + if ((_rl_to_upper (c) == 'W') && rl_point < rl_end && rl_point > rl_mark && + !whitespace (rl_line_buffer[rl_point])) + rl_point--; + + /* If cw or cW, back up to the end of a word, so the behaviour of ce + or cE is the actual result. Brute-force, no subtlety. */ + if (key == 'c' && rl_point >= rl_mark && (_rl_to_upper (c) == 'W')) + { + /* Don't move farther back than where we started. */ + while (rl_point > rl_mark && whitespace (rl_line_buffer[rl_point])) + rl_point--; + + /* Posix.2 says that if cw or cW moves the cursor towards the end of + the line, the character under the cursor should be deleted. */ + if (rl_point == rl_mark) + rl_point++; + else + { + /* Move past the end of the word so that the kill doesn't + remove the last letter of the previous word. Only do this + if we are not at the end of the line. */ + if (rl_point >= 0 && rl_point < (rl_end - 1) && !whitespace (rl_line_buffer[rl_point])) + rl_point++; + } + } + + if (rl_mark < rl_point) + SWAP (rl_point, rl_mark); + + return (0); +} + +/* A simplified loop for vi. Don't dispatch key at end. + Don't recognize minus sign? + Should this do rl_save_prompt/rl_restore_prompt? */ +static int +rl_digit_loop1 () +{ + int key, c; + + RL_SETSTATE(RL_STATE_NUMERICARG); + while (1) + { + if (rl_numeric_arg > 1000000) + { + rl_explicit_arg = rl_numeric_arg = 0; + rl_ding (); + rl_clear_message (); + RL_UNSETSTATE(RL_STATE_NUMERICARG); + return 1; + } + rl_message ("(arg: %d) ", rl_arg_sign * rl_numeric_arg); + RL_SETSTATE(RL_STATE_MOREINPUT); + key = c = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + + if (c >= 0 && _rl_keymap[c].type == ISFUNC && + _rl_keymap[c].function == rl_universal_argument) + { + rl_numeric_arg *= 4; + continue; + } + + c = UNMETA (c); + if (_rl_digit_p (c)) + { + if (rl_explicit_arg) + rl_numeric_arg = (rl_numeric_arg * 10) + _rl_digit_value (c); + else + rl_numeric_arg = _rl_digit_value (c); + rl_explicit_arg = 1; + } + else + { + rl_clear_message (); + rl_stuff_char (key); + break; + } + } + + RL_UNSETSTATE(RL_STATE_NUMERICARG); + return (0); +} + +int +rl_vi_delete_to (count, key) + int count, key; +{ + int c; + + if (_rl_uppercase_p (key)) + rl_stuff_char ('$'); + else if (vi_redoing) + rl_stuff_char (_rl_vi_last_motion); + + if (rl_vi_domove (key, &c)) + { + rl_ding (); + return -1; + } + + /* These are the motion commands that do not require adjusting the + mark. */ + if ((strchr (" l|h^0bB", c) == 0) && (rl_mark < rl_end)) + rl_mark++; + + rl_kill_text (rl_point, rl_mark); + return (0); +} + +int +rl_vi_change_to (count, key) + int count, key; +{ + int c, start_pos; + + if (_rl_uppercase_p (key)) + rl_stuff_char ('$'); + else if (vi_redoing) + rl_stuff_char (_rl_vi_last_motion); + + start_pos = rl_point; + + if (rl_vi_domove (key, &c)) + { + rl_ding (); + return -1; + } + + /* These are the motion commands that do not require adjusting the + mark. c[wW] are handled by special-case code in rl_vi_domove(), + and already leave the mark at the correct location. */ + if ((strchr (" l|hwW^0bB", c) == 0) && (rl_mark < rl_end)) + rl_mark++; + + /* The cursor never moves with c[wW]. */ + if ((_rl_to_upper (c) == 'W') && rl_point < start_pos) + rl_point = start_pos; + + if (vi_redoing) + { + if (vi_insert_buffer && *vi_insert_buffer) + rl_begin_undo_group (); + rl_delete_text (rl_point, rl_mark); + if (vi_insert_buffer && *vi_insert_buffer) + { + rl_insert_text (vi_insert_buffer); + rl_end_undo_group (); + } + } + else + { + rl_begin_undo_group (); /* to make the `u' command work */ + rl_kill_text (rl_point, rl_mark); + /* `C' does not save the text inserted for undoing or redoing. */ + if (_rl_uppercase_p (key) == 0) + _rl_vi_doing_insert = 1; + rl_vi_start_inserting (key, rl_numeric_arg, rl_arg_sign); + } + + return (0); +} + +int +rl_vi_yank_to (count, key) + int count, key; +{ + int c, save = rl_point; + + if (_rl_uppercase_p (key)) + rl_stuff_char ('$'); + + if (rl_vi_domove (key, &c)) + { + rl_ding (); + return -1; + } + + /* These are the motion commands that do not require adjusting the + mark. */ + if ((strchr (" l|h^0%bB", c) == 0) && (rl_mark < rl_end)) + rl_mark++; + + rl_begin_undo_group (); + rl_kill_text (rl_point, rl_mark); + rl_end_undo_group (); + rl_do_undo (); + rl_point = save; + + return (0); +} + +int +rl_vi_delete (count, key) + int count, key; +{ + int end; + + if (rl_end == 0) + { + rl_ding (); + return -1; + } + + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + end = _rl_find_next_mbchar (rl_line_buffer, rl_point, count, MB_FIND_NONZERO); + else + end = rl_point + count; + + if (end >= rl_end) + end = rl_end; + + rl_kill_text (rl_point, end); + + if (rl_point > 0 && rl_point == rl_end) + rl_backward_char (1, key); + return (0); +} + +int +rl_vi_back_to_indent (count, key) + int count, key; +{ + rl_beg_of_line (1, key); + while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point])) + rl_point++; + return (0); +} + +int +rl_vi_first_print (count, key) + int count, key; +{ + return (rl_vi_back_to_indent (1, key)); +} + +int +rl_vi_char_search (count, key) + int count, key; +{ +#if defined (HANDLE_MULTIBYTE) + static char *target; + static int mb_len; +#else + static char target; +#endif + static int orig_dir, dir; + + if (key == ';' || key == ',') + dir = key == ';' ? orig_dir : -orig_dir; + else + { + if (vi_redoing) +#if defined (HANDLE_MULTIBYTE) + target = _rl_vi_last_search_mbchar; +#else + target = _rl_vi_last_search_char; +#endif + else + { +#if defined (HANDLE_MULTIBYTE) + mb_len = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX); + target = _rl_vi_last_search_mbchar; +#else + RL_SETSTATE(RL_STATE_MOREINPUT); + _rl_vi_last_search_char = target = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); +#endif + } + + switch (key) + { + case 't': + orig_dir = dir = FTO; + break; + + case 'T': + orig_dir = dir = BTO; + break; + + case 'f': + orig_dir = dir = FFIND; + break; + + case 'F': + orig_dir = dir = BFIND; + break; + } + } + +#if defined (HANDLE_MULTIBYTE) + return (_rl_char_search_internal (count, dir, target, mb_len)); +#else + return (_rl_char_search_internal (count, dir, target)); +#endif +} + +/* Match brackets */ +int +rl_vi_match (ignore, key) + int ignore, key; +{ + int count = 1, brack, pos, tmp, pre; + + pos = rl_point; + if ((brack = rl_vi_bracktype (rl_line_buffer[rl_point])) == 0) + { + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + { + while ((brack = rl_vi_bracktype (rl_line_buffer[rl_point])) == 0) + { + pre = rl_point; + rl_forward_char (1, key); + if (pre == rl_point) + break; + } + } + else + while ((brack = rl_vi_bracktype (rl_line_buffer[rl_point])) == 0 && + rl_point < rl_end - 1) + rl_forward_char (1, key); + + if (brack <= 0) + { + rl_point = pos; + rl_ding (); + return -1; + } + } + + pos = rl_point; + + if (brack < 0) + { + while (count) + { + tmp = pos; + if (MB_CUR_MAX == 1 || rl_byte_oriented) + pos--; + else + { + pos = _rl_find_prev_mbchar (rl_line_buffer, pos, MB_FIND_ANY); + if (tmp == pos) + pos--; + } + if (pos >= 0) + { + int b = rl_vi_bracktype (rl_line_buffer[pos]); + if (b == -brack) + count--; + else if (b == brack) + count++; + } + else + { + rl_ding (); + return -1; + } + } + } + else + { /* brack > 0 */ + while (count) + { + if (MB_CUR_MAX == 1 || rl_byte_oriented) + pos++; + else + pos = _rl_find_next_mbchar (rl_line_buffer, pos, 1, MB_FIND_ANY); + + if (pos < rl_end) + { + int b = rl_vi_bracktype (rl_line_buffer[pos]); + if (b == -brack) + count--; + else if (b == brack) + count++; + } + else + { + rl_ding (); + return -1; + } + } + } + rl_point = pos; + return (0); +} + +int +rl_vi_bracktype (c) + int c; +{ + switch (c) + { + case '(': return 1; + case ')': return -1; + case '[': return 2; + case ']': return -2; + case '{': return 3; + case '}': return -3; + default: return 0; + } +} + +/* XXX - think about reading an entire mbchar with _rl_read_mbchar and + inserting it in one bunch instead of the loop below (like in + rl_vi_char_search or _rl_vi_change_mbchar_case). Set c to mbchar[0] + for test against 033 or ^C. Make sure that _rl_read_mbchar does + this right. */ +int +rl_vi_change_char (count, key) + int count, key; +{ + int c, p; + + if (vi_redoing) + c = _rl_vi_last_replacement; + else + { + RL_SETSTATE(RL_STATE_MOREINPUT); + _rl_vi_last_replacement = c = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + } + + if (c == '\033' || c == CTRL ('C')) + return -1; + + rl_begin_undo_group (); + while (count-- && rl_point < rl_end) + { + p = rl_point; + rl_vi_delete (1, c); +#if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + while (_rl_insert_char (1, c)) + { + RL_SETSTATE (RL_STATE_MOREINPUT); + c = rl_read_key (); + RL_UNSETSTATE (RL_STATE_MOREINPUT); + } + else +#endif + { + if (rl_point < p) /* Did we retreat at EOL? */ + rl_point++; + _rl_insert_char (1, c); + } + } + rl_end_undo_group (); + + return (0); +} + +int +rl_vi_subst (count, key) + int count, key; +{ + /* If we are redoing, rl_vi_change_to will stuff the last motion char */ + if (vi_redoing == 0) + rl_stuff_char ((key == 'S') ? 'c' : 'l'); /* `S' == `cc', `s' == `cl' */ + + return (rl_vi_change_to (count, 'c')); +} + +int +rl_vi_overstrike (count, key) + int count, key; +{ + if (_rl_vi_doing_insert == 0) + { + _rl_vi_doing_insert = 1; + rl_begin_undo_group (); + } + + if (count > 0) + { + _rl_overwrite_char (count, key); + vi_replace_count += count; + } + + return (0); +} + +int +rl_vi_overstrike_delete (count, key) + int count, key; +{ + int i, s; + + for (i = 0; i < count; i++) + { + if (vi_replace_count == 0) + { + rl_ding (); + break; + } + s = rl_point; + + if (rl_do_undo ()) + vi_replace_count--; + + if (rl_point == s) + rl_backward_char (1, key); + } + + if (vi_replace_count == 0 && _rl_vi_doing_insert) + { + rl_end_undo_group (); + rl_do_undo (); + _rl_vi_doing_insert = 0; + } + return (0); +} + +int +rl_vi_replace (count, key) + int count, key; +{ + int i; + + vi_replace_count = 0; + + if (!vi_replace_map) + { + vi_replace_map = rl_make_bare_keymap (); + + for (i = ' '; i < KEYMAP_SIZE; i++) + vi_replace_map[i].function = rl_vi_overstrike; + + vi_replace_map[RUBOUT].function = rl_vi_overstrike_delete; + vi_replace_map[ESC].function = rl_vi_movement_mode; + vi_replace_map[RETURN].function = rl_newline; + vi_replace_map[NEWLINE].function = rl_newline; + + /* If the normal vi insertion keymap has ^H bound to erase, do the + same here. Probably should remove the assignment to RUBOUT up + there, but I don't think it will make a difference in real life. */ + if (vi_insertion_keymap[CTRL ('H')].type == ISFUNC && + vi_insertion_keymap[CTRL ('H')].function == rl_rubout) + vi_replace_map[CTRL ('H')].function = rl_vi_overstrike_delete; + + } + _rl_keymap = vi_replace_map; + return (0); +} + +#if 0 +/* Try to complete the word we are standing on or the word that ends with + the previous character. A space matches everything. Word delimiters are + space and ;. */ +int +rl_vi_possible_completions() +{ + int save_pos = rl_point; + + if (rl_line_buffer[rl_point] != ' ' && rl_line_buffer[rl_point] != ';') + { + while (rl_point < rl_end && rl_line_buffer[rl_point] != ' ' && + rl_line_buffer[rl_point] != ';') + rl_point++; + } + else if (rl_line_buffer[rl_point - 1] == ';') + { + rl_ding (); + return (0); + } + + rl_possible_completions (); + rl_point = save_pos; + + return (0); +} +#endif + +/* Functions to save and restore marks. */ +int +rl_vi_set_mark (count, key) + int count, key; +{ + int ch; + + RL_SETSTATE(RL_STATE_MOREINPUT); + ch = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + + if (ch < 'a' || ch > 'z') + { + rl_ding (); + return -1; + } + ch -= 'a'; + vi_mark_chars[ch] = rl_point; + return 0; +} + +int +rl_vi_goto_mark (count, key) + int count, key; +{ + int ch; + + RL_SETSTATE(RL_STATE_MOREINPUT); + ch = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + + if (ch == '`') + { + rl_point = rl_mark; + return 0; + } + else if (ch < 'a' || ch > 'z') + { + rl_ding (); + return -1; + } + + ch -= 'a'; + if (vi_mark_chars[ch] == -1) + { + rl_ding (); + return -1; + } + rl_point = vi_mark_chars[ch]; + return 0; +} + +#endif /* VI_MODE */ diff --git a/vendors/readline/src/readline/xmalloc.c b/vendors/readline/src/readline/xmalloc.c new file mode 100644 index 0000000..8985d34 --- /dev/null +++ b/vendors/readline/src/readline/xmalloc.c @@ -0,0 +1,88 @@ +/* xmalloc.c -- safe versions of malloc and realloc */ + +/* Copyright (C) 1991 Free Software Foundation, Inc. + + This file is part of GNU Readline, a library for reading lines + of text with interactive input and history editing. + + Readline is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + Readline is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Readline; see the file COPYING. If not, write to the Free + Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ +#define READLINE_LIBRARY + +#if defined (HAVE_CONFIG_H) +#include +#endif + +#include + +#if defined (HAVE_STDLIB_H) +# include +#else +# include "ansi_stdlib.h" +#endif /* HAVE_STDLIB_H */ + +#include "xmalloc.h" + +/* **************************************************************** */ +/* */ +/* Memory Allocation and Deallocation. */ +/* */ +/* **************************************************************** */ + +static void +memory_error_and_abort (fname) + char *fname; +{ + fprintf (stderr, "%s: out of virtual memory\n", fname); + exit (2); +} + +/* Return a pointer to free()able block of memory large enough + to hold BYTES number of bytes. If the memory cannot be allocated, + print an error message and abort. */ +PTR_T +xmalloc (bytes) + size_t bytes; +{ + PTR_T temp; + + temp = malloc (bytes); + if (temp == 0) + memory_error_and_abort ("xmalloc"); + return (temp); +} + +PTR_T +xrealloc (pointer, bytes) + PTR_T pointer; + size_t bytes; +{ + PTR_T temp; + + temp = pointer ? realloc (pointer, bytes) : malloc (bytes); + + if (temp == 0) + memory_error_and_abort ("xrealloc"); + return (temp); +} + +/* Use this as the function to call when adding unwind protects so we + don't need to know what free() returns. */ +void +xfree (string) + PTR_T string; +{ + if (string) + free (string); +} diff --git a/vendors/readline/src/readline/xmalloc.h b/vendors/readline/src/readline/xmalloc.h new file mode 100644 index 0000000..9cb08ba --- /dev/null +++ b/vendors/readline/src/readline/xmalloc.h @@ -0,0 +1,46 @@ +/* xmalloc.h -- memory allocation that aborts on errors. */ + +/* Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of the GNU Readline Library, a library for + reading lines of text with interactive input and history editing. + + The GNU Readline Library is free software; you can redistribute it + and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2, or + (at your option) any later version. + + The GNU Readline 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 General Public License for more details. + + The GNU General Public License is often shipped with GNU software, and + is generally kept in a file called COPYING or LICENSE. If you do not + have a copy of the license, write to the Free Software Foundation, + 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + +#if !defined (_XMALLOC_H_) +#define _XMALLOC_H_ + +#if defined (READLINE_LIBRARY) +# include "rlstdc.h" +#else +# include +#endif + +#ifndef PTR_T + +#ifdef __STDC__ +# define PTR_T void * +#else +# define PTR_T char * +#endif + +#endif /* !PTR_T */ + +extern PTR_T xmalloc PARAMS((size_t)); +extern PTR_T xrealloc PARAMS((void *, size_t)); +extern void xfree PARAMS((void *)); + +#endif /* _XMALLOC_H_ */ diff --git a/vendors/zlib/adler32.c b/vendors/zlib/adler32.c new file mode 100644 index 0000000..a868f07 --- /dev/null +++ b/vendors/zlib/adler32.c @@ -0,0 +1,179 @@ +/* adler32.c -- compute the Adler-32 checksum of a data stream + * Copyright (C) 1995-2011 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#include "zutil.h" + +#define local static + +local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2)); + +#define BASE 65521 /* largest prime smaller than 65536 */ +#define NMAX 5552 +/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ + +#define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;} +#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); +#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); +#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); +#define DO16(buf) DO8(buf,0); DO8(buf,8); + +/* use NO_DIVIDE if your processor does not do division in hardware -- + try it both ways to see which is faster */ +#ifdef NO_DIVIDE +/* note that this assumes BASE is 65521, where 65536 % 65521 == 15 + (thank you to John Reiser for pointing this out) */ +# define CHOP(a) \ + do { \ + unsigned long tmp = a >> 16; \ + a &= 0xffffUL; \ + a += (tmp << 4) - tmp; \ + } while (0) +# define MOD28(a) \ + do { \ + CHOP(a); \ + if (a >= BASE) a -= BASE; \ + } while (0) +# define MOD(a) \ + do { \ + CHOP(a); \ + MOD28(a); \ + } while (0) +# define MOD63(a) \ + do { /* this assumes a is not negative */ \ + z_off64_t tmp = a >> 32; \ + a &= 0xffffffffL; \ + a += (tmp << 8) - (tmp << 5) + tmp; \ + tmp = a >> 16; \ + a &= 0xffffL; \ + a += (tmp << 4) - tmp; \ + tmp = a >> 16; \ + a &= 0xffffL; \ + a += (tmp << 4) - tmp; \ + if (a >= BASE) a -= BASE; \ + } while (0) +#else +# define MOD(a) a %= BASE +# define MOD28(a) a %= BASE +# define MOD63(a) a %= BASE +#endif + +/* ========================================================================= */ +uLong ZEXPORT adler32(adler, buf, len) + uLong adler; + const Bytef *buf; + uInt len; +{ + unsigned long sum2; + unsigned n; + + /* split Adler-32 into component sums */ + sum2 = (adler >> 16) & 0xffff; + adler &= 0xffff; + + /* in case user likes doing a byte at a time, keep it fast */ + if (len == 1) { + adler += buf[0]; + if (adler >= BASE) + adler -= BASE; + sum2 += adler; + if (sum2 >= BASE) + sum2 -= BASE; + return adler | (sum2 << 16); + } + + /* initial Adler-32 value (deferred check for len == 1 speed) */ + if (buf == Z_NULL) + return 1L; + + /* in case short lengths are provided, keep it somewhat fast */ + if (len < 16) { + while (len--) { + adler += *buf++; + sum2 += adler; + } + if (adler >= BASE) + adler -= BASE; + MOD28(sum2); /* only added so many BASE's */ + return adler | (sum2 << 16); + } + + /* do length NMAX blocks -- requires just one modulo operation */ + while (len >= NMAX) { + len -= NMAX; + n = NMAX / 16; /* NMAX is divisible by 16 */ + do { + DO16(buf); /* 16 sums unrolled */ + buf += 16; + } while (--n); + MOD(adler); + MOD(sum2); + } + + /* do remaining bytes (less than NMAX, still just one modulo) */ + if (len) { /* avoid modulos if none remaining */ + while (len >= 16) { + len -= 16; + DO16(buf); + buf += 16; + } + while (len--) { + adler += *buf++; + sum2 += adler; + } + MOD(adler); + MOD(sum2); + } + + /* return recombined sums */ + return adler | (sum2 << 16); +} + +/* ========================================================================= */ +local uLong adler32_combine_(adler1, adler2, len2) + uLong adler1; + uLong adler2; + z_off64_t len2; +{ + unsigned long sum1; + unsigned long sum2; + unsigned rem; + + /* for negative len, return invalid adler32 as a clue for debugging */ + if (len2 < 0) + return 0xffffffffUL; + + /* the derivation of this formula is left as an exercise for the reader */ + MOD63(len2); /* assumes len2 >= 0 */ + rem = (unsigned)len2; + sum1 = adler1 & 0xffff; + sum2 = rem * sum1; + MOD(sum2); + sum1 += (adler2 & 0xffff) + BASE - 1; + sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; + if (sum1 >= BASE) sum1 -= BASE; + if (sum1 >= BASE) sum1 -= BASE; + if (sum2 >= (BASE << 1)) sum2 -= (BASE << 1); + if (sum2 >= BASE) sum2 -= BASE; + return sum1 | (sum2 << 16); +} + +/* ========================================================================= */ +uLong ZEXPORT adler32_combine(adler1, adler2, len2) + uLong adler1; + uLong adler2; + z_off_t len2; +{ + return adler32_combine_(adler1, adler2, len2); +} + +uLong ZEXPORT adler32_combine64(adler1, adler2, len2) + uLong adler1; + uLong adler2; + z_off64_t len2; +{ + return adler32_combine_(adler1, adler2, len2); +} diff --git a/vendors/zlib/compress.c b/vendors/zlib/compress.c new file mode 100644 index 0000000..6e97626 --- /dev/null +++ b/vendors/zlib/compress.c @@ -0,0 +1,80 @@ +/* compress.c -- compress a memory buffer + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#define ZLIB_INTERNAL +#include "zlib.h" + +/* =========================================================================== + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least 0.1% larger than sourceLen plus + 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ +int ZEXPORT compress2 (dest, destLen, source, sourceLen, level) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong sourceLen; + int level; +{ + z_stream stream; + int err; + + stream.next_in = (z_const Bytef *)source; + stream.avail_in = (uInt)sourceLen; +#ifdef MAXSEG_64K + /* Check for source > 64K on 16-bit machine: */ + if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; +#endif + stream.next_out = dest; + stream.avail_out = (uInt)*destLen; + if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; + + stream.zalloc = (alloc_func)0; + stream.zfree = (free_func)0; + stream.opaque = (voidpf)0; + + err = deflateInit(&stream, level); + if (err != Z_OK) return err; + + err = deflate(&stream, Z_FINISH); + if (err != Z_STREAM_END) { + deflateEnd(&stream); + return err == Z_OK ? Z_BUF_ERROR : err; + } + *destLen = stream.total_out; + + err = deflateEnd(&stream); + return err; +} + +/* =========================================================================== + */ +int ZEXPORT compress (dest, destLen, source, sourceLen) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong sourceLen; +{ + return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); +} + +/* =========================================================================== + If the default memLevel or windowBits for deflateInit() is changed, then + this function needs to be updated. + */ +uLong ZEXPORT compressBound (sourceLen) + uLong sourceLen; +{ + return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + + (sourceLen >> 25) + 13; +} diff --git a/vendors/zlib/crc32.c b/vendors/zlib/crc32.c new file mode 100644 index 0000000..979a719 --- /dev/null +++ b/vendors/zlib/crc32.c @@ -0,0 +1,425 @@ +/* crc32.c -- compute the CRC-32 of a data stream + * Copyright (C) 1995-2006, 2010, 2011, 2012 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Thanks to Rodney Brown for his contribution of faster + * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing + * tables for updating the shift register in one step with three exclusive-ors + * instead of four steps with four exclusive-ors. This results in about a + * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. + */ + +/* @(#) $Id$ */ + +/* + Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore + protection on the static variables used to control the first-use generation + of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should + first call get_crc_table() to initialize the tables before allowing more than + one thread to use crc32(). + + DYNAMIC_CRC_TABLE and MAKECRCH can be #defined to write out crc32.h. + */ + +#ifdef MAKECRCH +# include +# ifndef DYNAMIC_CRC_TABLE +# define DYNAMIC_CRC_TABLE +# endif /* !DYNAMIC_CRC_TABLE */ +#endif /* MAKECRCH */ + +#include "zutil.h" /* for STDC and FAR definitions */ + +#define local static + +/* Definitions for doing the crc four data bytes at a time. */ +#if !defined(NOBYFOUR) && defined(Z_U4) +# define BYFOUR +#endif +#ifdef BYFOUR + local unsigned long crc32_little OF((unsigned long, + const unsigned char FAR *, unsigned)); + local unsigned long crc32_big OF((unsigned long, + const unsigned char FAR *, unsigned)); +# define TBLS 8 +#else +# define TBLS 1 +#endif /* BYFOUR */ + +/* Local functions for crc concatenation */ +local unsigned long gf2_matrix_times OF((unsigned long *mat, + unsigned long vec)); +local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); +local uLong crc32_combine_ OF((uLong crc1, uLong crc2, z_off64_t len2)); + + +#ifdef DYNAMIC_CRC_TABLE + +local volatile int crc_table_empty = 1; +local z_crc_t FAR crc_table[TBLS][256]; +local void make_crc_table OF((void)); +#ifdef MAKECRCH + local void write_table OF((FILE *, const z_crc_t FAR *)); +#endif /* MAKECRCH */ +/* + Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: + x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. + + Polynomials over GF(2) are represented in binary, one bit per coefficient, + with the lowest powers in the most significant bit. Then adding polynomials + is just exclusive-or, and multiplying a polynomial by x is a right shift by + one. If we call the above polynomial p, and represent a byte as the + polynomial q, also with the lowest power in the most significant bit (so the + byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, + where a mod b means the remainder after dividing a by b. + + This calculation is done using the shift-register method of multiplying and + taking the remainder. The register is initialized to zero, and for each + incoming bit, x^32 is added mod p to the register if the bit is a one (where + x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by + x (which is shifting right by one and adding x^32 mod p if the bit shifted + out is a one). We start with the highest power (least significant bit) of + q and repeat for all eight bits of q. + + The first table is simply the CRC of all possible eight bit values. This is + all the information needed to generate CRCs on data a byte at a time for all + combinations of CRC register values and incoming bytes. The remaining tables + allow for word-at-a-time CRC calculation for both big-endian and little- + endian machines, where a word is four bytes. +*/ +local void make_crc_table() +{ + z_crc_t c; + int n, k; + z_crc_t poly; /* polynomial exclusive-or pattern */ + /* terms of polynomial defining this crc (except x^32): */ + static volatile int first = 1; /* flag to limit concurrent making */ + static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; + + /* See if another task is already doing this (not thread-safe, but better + than nothing -- significantly reduces duration of vulnerability in + case the advice about DYNAMIC_CRC_TABLE is ignored) */ + if (first) { + first = 0; + + /* make exclusive-or pattern from polynomial (0xedb88320UL) */ + poly = 0; + for (n = 0; n < (int)(sizeof(p)/sizeof(unsigned char)); n++) + poly |= (z_crc_t)1 << (31 - p[n]); + + /* generate a crc for every 8-bit value */ + for (n = 0; n < 256; n++) { + c = (z_crc_t)n; + for (k = 0; k < 8; k++) + c = c & 1 ? poly ^ (c >> 1) : c >> 1; + crc_table[0][n] = c; + } + +#ifdef BYFOUR + /* generate crc for each value followed by one, two, and three zeros, + and then the byte reversal of those as well as the first table */ + for (n = 0; n < 256; n++) { + c = crc_table[0][n]; + crc_table[4][n] = ZSWAP32(c); + for (k = 1; k < 4; k++) { + c = crc_table[0][c & 0xff] ^ (c >> 8); + crc_table[k][n] = c; + crc_table[k + 4][n] = ZSWAP32(c); + } + } +#endif /* BYFOUR */ + + crc_table_empty = 0; + } + else { /* not first */ + /* wait for the other guy to finish (not efficient, but rare) */ + while (crc_table_empty) + ; + } + +#ifdef MAKECRCH + /* write out CRC tables to crc32.h */ + { + FILE *out; + + out = fopen("crc32.h", "w"); + if (out == NULL) return; + fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); + fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); + fprintf(out, "local const z_crc_t FAR "); + fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); + write_table(out, crc_table[0]); +# ifdef BYFOUR + fprintf(out, "#ifdef BYFOUR\n"); + for (k = 1; k < 8; k++) { + fprintf(out, " },\n {\n"); + write_table(out, crc_table[k]); + } + fprintf(out, "#endif\n"); +# endif /* BYFOUR */ + fprintf(out, " }\n};\n"); + fclose(out); + } +#endif /* MAKECRCH */ +} + +#ifdef MAKECRCH +local void write_table(out, table) + FILE *out; + const z_crc_t FAR *table; +{ + int n; + + for (n = 0; n < 256; n++) + fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", + (unsigned long)(table[n]), + n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); +} +#endif /* MAKECRCH */ + +#else /* !DYNAMIC_CRC_TABLE */ +/* ======================================================================== + * Tables of CRC-32s of all single-byte values, made by make_crc_table(). + */ +#include "crc32.h" +#endif /* DYNAMIC_CRC_TABLE */ + +/* ========================================================================= + * This function can be used by asm versions of crc32() + */ +const z_crc_t FAR * ZEXPORT get_crc_table() +{ +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) + make_crc_table(); +#endif /* DYNAMIC_CRC_TABLE */ + return (const z_crc_t FAR *)crc_table; +} + +/* ========================================================================= */ +#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) +#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 + +/* ========================================================================= */ +unsigned long ZEXPORT crc32(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + uInt len; +{ + if (buf == Z_NULL) return 0UL; + +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) + make_crc_table(); +#endif /* DYNAMIC_CRC_TABLE */ + +#ifdef BYFOUR + if (sizeof(void *) == sizeof(ptrdiff_t)) { + z_crc_t endian; + + endian = 1; + if (*((unsigned char *)(&endian))) + return crc32_little(crc, buf, len); + else + return crc32_big(crc, buf, len); + } +#endif /* BYFOUR */ + crc = crc ^ 0xffffffffUL; + while (len >= 8) { + DO8; + len -= 8; + } + if (len) do { + DO1; + } while (--len); + return crc ^ 0xffffffffUL; +} + +#ifdef BYFOUR + +/* ========================================================================= */ +#define DOLIT4 c ^= *buf4++; \ + c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ + crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] +#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 + +/* ========================================================================= */ +local unsigned long crc32_little(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + unsigned len; +{ + register z_crc_t c; + register const z_crc_t FAR *buf4; + + c = (z_crc_t)crc; + c = ~c; + while (len && ((ptrdiff_t)buf & 3)) { + c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); + len--; + } + + buf4 = (const z_crc_t FAR *)(const void FAR *)buf; + while (len >= 32) { + DOLIT32; + len -= 32; + } + while (len >= 4) { + DOLIT4; + len -= 4; + } + buf = (const unsigned char FAR *)buf4; + + if (len) do { + c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); + } while (--len); + c = ~c; + return (unsigned long)c; +} + +/* ========================================================================= */ +#define DOBIG4 c ^= *++buf4; \ + c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ + crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] +#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 + +/* ========================================================================= */ +local unsigned long crc32_big(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + unsigned len; +{ + register z_crc_t c; + register const z_crc_t FAR *buf4; + + c = ZSWAP32((z_crc_t)crc); + c = ~c; + while (len && ((ptrdiff_t)buf & 3)) { + c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); + len--; + } + + buf4 = (const z_crc_t FAR *)(const void FAR *)buf; + buf4--; + while (len >= 32) { + DOBIG32; + len -= 32; + } + while (len >= 4) { + DOBIG4; + len -= 4; + } + buf4++; + buf = (const unsigned char FAR *)buf4; + + if (len) do { + c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); + } while (--len); + c = ~c; + return (unsigned long)(ZSWAP32(c)); +} + +#endif /* BYFOUR */ + +#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ + +/* ========================================================================= */ +local unsigned long gf2_matrix_times(mat, vec) + unsigned long *mat; + unsigned long vec; +{ + unsigned long sum; + + sum = 0; + while (vec) { + if (vec & 1) + sum ^= *mat; + vec >>= 1; + mat++; + } + return sum; +} + +/* ========================================================================= */ +local void gf2_matrix_square(square, mat) + unsigned long *square; + unsigned long *mat; +{ + int n; + + for (n = 0; n < GF2_DIM; n++) + square[n] = gf2_matrix_times(mat, mat[n]); +} + +/* ========================================================================= */ +local uLong crc32_combine_(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off64_t len2; +{ + int n; + unsigned long row; + unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ + unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ + + /* degenerate case (also disallow negative lengths) */ + if (len2 <= 0) + return crc1; + + /* put operator for one zero bit in odd */ + odd[0] = 0xedb88320UL; /* CRC-32 polynomial */ + row = 1; + for (n = 1; n < GF2_DIM; n++) { + odd[n] = row; + row <<= 1; + } + + /* put operator for two zero bits in even */ + gf2_matrix_square(even, odd); + + /* put operator for four zero bits in odd */ + gf2_matrix_square(odd, even); + + /* apply len2 zeros to crc1 (first square will put the operator for one + zero byte, eight zero bits, in even) */ + do { + /* apply zeros operator for this bit of len2 */ + gf2_matrix_square(even, odd); + if (len2 & 1) + crc1 = gf2_matrix_times(even, crc1); + len2 >>= 1; + + /* if no more bits set, then done */ + if (len2 == 0) + break; + + /* another iteration of the loop with odd and even swapped */ + gf2_matrix_square(odd, even); + if (len2 & 1) + crc1 = gf2_matrix_times(odd, crc1); + len2 >>= 1; + + /* if no more bits set, then done */ + } while (len2 != 0); + + /* return combined crc */ + crc1 ^= crc2; + return crc1; +} + +/* ========================================================================= */ +uLong ZEXPORT crc32_combine(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off_t len2; +{ + return crc32_combine_(crc1, crc2, len2); +} + +uLong ZEXPORT crc32_combine64(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off64_t len2; +{ + return crc32_combine_(crc1, crc2, len2); +} diff --git a/vendors/zlib/crc32.h b/vendors/zlib/crc32.h new file mode 100644 index 0000000..9e0c778 --- /dev/null +++ b/vendors/zlib/crc32.h @@ -0,0 +1,441 @@ +/* crc32.h -- tables for rapid CRC calculation + * Generated automatically by crc32.c + */ + +local const z_crc_t FAR crc_table[TBLS][256] = +{ + { + 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, + 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, + 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, + 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, + 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, + 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, + 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, + 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, + 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, + 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, + 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, + 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, + 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, + 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, + 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, + 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, + 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, + 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, + 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, + 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, + 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, + 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, + 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, + 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, + 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, + 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, + 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, + 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, + 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, + 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, + 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, + 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, + 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, + 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, + 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, + 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, + 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, + 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, + 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, + 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, + 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, + 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, + 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, + 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, + 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, + 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, + 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, + 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, + 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, + 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, + 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, + 0x2d02ef8dUL +#ifdef BYFOUR + }, + { + 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, + 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, + 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, + 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, + 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, + 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, + 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, + 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, + 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, + 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, + 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, + 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, + 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, + 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, + 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, + 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, + 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, + 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, + 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, + 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, + 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, + 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, + 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, + 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, + 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, + 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, + 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, + 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, + 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, + 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, + 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, + 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, + 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, + 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, + 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, + 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, + 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, + 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, + 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, + 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, + 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, + 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, + 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, + 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, + 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, + 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, + 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, + 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, + 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, + 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, + 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, + 0x9324fd72UL + }, + { + 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, + 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, + 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, + 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, + 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, + 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, + 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, + 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, + 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, + 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, + 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, + 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, + 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, + 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, + 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, + 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, + 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, + 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, + 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, + 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, + 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, + 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, + 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, + 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, + 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, + 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, + 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, + 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, + 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, + 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, + 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, + 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, + 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, + 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, + 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, + 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, + 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, + 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, + 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, + 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, + 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, + 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, + 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, + 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, + 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, + 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, + 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, + 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, + 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, + 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, + 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, + 0xbe9834edUL + }, + { + 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, + 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, + 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, + 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, + 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, + 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, + 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, + 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, + 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, + 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, + 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, + 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, + 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, + 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, + 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, + 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, + 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, + 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, + 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, + 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, + 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, + 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, + 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, + 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, + 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, + 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, + 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, + 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, + 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, + 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, + 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, + 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, + 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, + 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, + 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, + 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, + 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, + 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, + 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, + 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, + 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, + 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, + 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, + 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, + 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, + 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, + 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, + 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, + 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, + 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, + 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, + 0xde0506f1UL + }, + { + 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, + 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, + 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, + 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, + 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, + 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, + 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, + 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, + 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, + 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, + 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, + 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, + 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, + 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, + 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, + 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, + 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, + 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, + 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, + 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, + 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, + 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, + 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, + 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, + 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, + 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, + 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, + 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, + 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, + 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, + 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, + 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, + 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, + 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, + 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, + 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, + 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, + 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, + 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, + 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, + 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, + 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, + 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, + 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, + 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, + 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, + 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, + 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, + 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, + 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, + 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, + 0x8def022dUL + }, + { + 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, + 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, + 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, + 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, + 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, + 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, + 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, + 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, + 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, + 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, + 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, + 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, + 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, + 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, + 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, + 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, + 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, + 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, + 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, + 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, + 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, + 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, + 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, + 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, + 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, + 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, + 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, + 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, + 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, + 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, + 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, + 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, + 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, + 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, + 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, + 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, + 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, + 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, + 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, + 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, + 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, + 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, + 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, + 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, + 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, + 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, + 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, + 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, + 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, + 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, + 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, + 0x72fd2493UL + }, + { + 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, + 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, + 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, + 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, + 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, + 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, + 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, + 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, + 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, + 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, + 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, + 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, + 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, + 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, + 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, + 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, + 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, + 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, + 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, + 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, + 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, + 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, + 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, + 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, + 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, + 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, + 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, + 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, + 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, + 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, + 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, + 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, + 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, + 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, + 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, + 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, + 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, + 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, + 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, + 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, + 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, + 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, + 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, + 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, + 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, + 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, + 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, + 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, + 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, + 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, + 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, + 0xed3498beUL + }, + { + 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, + 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, + 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, + 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, + 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, + 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, + 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, + 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, + 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, + 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, + 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, + 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, + 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, + 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, + 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, + 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, + 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, + 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, + 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, + 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, + 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, + 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, + 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, + 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, + 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, + 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, + 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, + 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, + 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, + 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, + 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, + 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, + 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, + 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, + 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, + 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, + 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, + 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, + 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, + 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, + 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, + 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, + 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, + 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, + 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, + 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, + 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, + 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, + 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, + 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, + 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, + 0xf10605deUL +#endif + } +}; diff --git a/vendors/zlib/deflate.c b/vendors/zlib/deflate.c new file mode 100644 index 0000000..6969577 --- /dev/null +++ b/vendors/zlib/deflate.c @@ -0,0 +1,1967 @@ +/* deflate.c -- compress data using the deflation algorithm + * Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * ALGORITHM + * + * The "deflation" process depends on being able to identify portions + * of the input text which are identical to earlier input (within a + * sliding window trailing behind the input currently being processed). + * + * The most straightforward technique turns out to be the fastest for + * most input files: try all possible matches and select the longest. + * The key feature of this algorithm is that insertions into the string + * dictionary are very simple and thus fast, and deletions are avoided + * completely. Insertions are performed at each input character, whereas + * string matches are performed only when the previous match ends. So it + * is preferable to spend more time in matches to allow very fast string + * insertions and avoid deletions. The matching algorithm for small + * strings is inspired from that of Rabin & Karp. A brute force approach + * is used to find longer strings when a small match has been found. + * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze + * (by Leonid Broukhis). + * A previous version of this file used a more sophisticated algorithm + * (by Fiala and Greene) which is guaranteed to run in linear amortized + * time, but has a larger average cost, uses more memory and is patented. + * However the F&G algorithm may be faster for some highly redundant + * files if the parameter max_chain_length (described below) is too large. + * + * ACKNOWLEDGEMENTS + * + * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and + * I found it in 'freeze' written by Leonid Broukhis. + * Thanks to many people for bug reports and testing. + * + * REFERENCES + * + * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". + * Available in http://tools.ietf.org/html/rfc1951 + * + * A description of the Rabin and Karp algorithm is given in the book + * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. + * + * Fiala,E.R., and Greene,D.H. + * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 + * + */ + +/* @(#) $Id$ */ + +#include "deflate.h" + +const char deflate_copyright[] = + " deflate 1.2.8 Copyright 1995-2013 Jean-loup Gailly and Mark Adler "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* =========================================================================== + * Function prototypes. + */ +typedef enum { + need_more, /* block not completed, need more input or more output */ + block_done, /* block flush performed */ + finish_started, /* finish started, need only more output at next deflate */ + finish_done /* finish done, accept no more input or output */ +} block_state; + +typedef block_state (*compress_func) OF((deflate_state *s, int flush)); +/* Compression function. Returns the block state after the call. */ + +local void fill_window OF((deflate_state *s)); +local block_state deflate_stored OF((deflate_state *s, int flush)); +local block_state deflate_fast OF((deflate_state *s, int flush)); +#ifndef FASTEST +local block_state deflate_slow OF((deflate_state *s, int flush)); +#endif +local block_state deflate_rle OF((deflate_state *s, int flush)); +local block_state deflate_huff OF((deflate_state *s, int flush)); +local void lm_init OF((deflate_state *s)); +local void putShortMSB OF((deflate_state *s, uInt b)); +local void flush_pending OF((z_streamp strm)); +local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); +#ifdef ASMV + void match_init OF((void)); /* asm code initialization */ + uInt longest_match OF((deflate_state *s, IPos cur_match)); +#else +local uInt longest_match OF((deflate_state *s, IPos cur_match)); +#endif + +#ifdef DEBUG +local void check_match OF((deflate_state *s, IPos start, IPos match, + int length)); +#endif + +/* =========================================================================== + * Local data + */ + +#define NIL 0 +/* Tail of hash chains */ + +#ifndef TOO_FAR +# define TOO_FAR 4096 +#endif +/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ + +/* Values for max_lazy_match, good_match and max_chain_length, depending on + * the desired pack level (0..9). The values given below have been tuned to + * exclude worst case performance for pathological files. Better values may be + * found for specific files. + */ +typedef struct config_s { + ush good_length; /* reduce lazy search above this match length */ + ush max_lazy; /* do not perform lazy search above this match length */ + ush nice_length; /* quit search above this match length */ + ush max_chain; + compress_func func; +} config; + +#ifdef FASTEST +local const config configuration_table[2] = { +/* good lazy nice chain */ +/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ +/* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */ +#else +local const config configuration_table[10] = { +/* good lazy nice chain */ +/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ +/* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */ +/* 2 */ {4, 5, 16, 8, deflate_fast}, +/* 3 */ {4, 6, 32, 32, deflate_fast}, + +/* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ +/* 5 */ {8, 16, 32, 32, deflate_slow}, +/* 6 */ {8, 16, 128, 128, deflate_slow}, +/* 7 */ {8, 32, 128, 256, deflate_slow}, +/* 8 */ {32, 128, 258, 1024, deflate_slow}, +/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */ +#endif + +/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 + * For deflate_fast() (levels <= 3) good is ignored and lazy has a different + * meaning. + */ + +#define EQUAL 0 +/* result of memcmp for equal strings */ + +#ifndef NO_DUMMY_DECL +struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ +#endif + +/* rank Z_BLOCK between Z_NO_FLUSH and Z_PARTIAL_FLUSH */ +#define RANK(f) (((f) << 1) - ((f) > 4 ? 9 : 0)) + +/* =========================================================================== + * Update a hash value with the given input byte + * IN assertion: all calls to to UPDATE_HASH are made with consecutive + * input characters, so that a running hash key can be computed from the + * previous key instead of complete recalculation each time. + */ +#define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) + + +/* =========================================================================== + * Insert string str in the dictionary and set match_head to the previous head + * of the hash chain (the most recent string with same hash key). Return + * the previous length of the hash chain. + * If this file is compiled with -DFASTEST, the compression level is forced + * to 1, and no hash chains are maintained. + * IN assertion: all calls to to INSERT_STRING are made with consecutive + * input characters and the first MIN_MATCH bytes of str are valid + * (except for the last MIN_MATCH-1 bytes of the input file). + */ +#ifdef FASTEST +#define INSERT_STRING(s, str, match_head) \ + (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ + match_head = s->head[s->ins_h], \ + s->head[s->ins_h] = (Pos)(str)) +#else +#define INSERT_STRING(s, str, match_head) \ + (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ + match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \ + s->head[s->ins_h] = (Pos)(str)) +#endif + +/* =========================================================================== + * Initialize the hash table (avoiding 64K overflow for 16 bit systems). + * prev[] will be initialized on the fly. + */ +#define CLEAR_HASH(s) \ + s->head[s->hash_size-1] = NIL; \ + zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); + +/* ========================================================================= */ +int ZEXPORT deflateInit_(strm, level, version, stream_size) + z_streamp strm; + int level; + const char *version; + int stream_size; +{ + return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, + Z_DEFAULT_STRATEGY, version, stream_size); + /* To do: ignore strm->next_in if we use it as window */ +} + +/* ========================================================================= */ +int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, + version, stream_size) + z_streamp strm; + int level; + int method; + int windowBits; + int memLevel; + int strategy; + const char *version; + int stream_size; +{ + deflate_state *s; + int wrap = 1; + static const char my_version[] = ZLIB_VERSION; + + ushf *overlay; + /* We overlay pending_buf and d_buf+l_buf. This works since the average + * output size for (length,distance) codes is <= 24 bits. + */ + + if (version == Z_NULL || version[0] != my_version[0] || + stream_size != sizeof(z_stream)) { + return Z_VERSION_ERROR; + } + if (strm == Z_NULL) return Z_STREAM_ERROR; + + strm->msg = Z_NULL; + if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; +#endif + } + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif + +#ifdef FASTEST + if (level != 0) level = 1; +#else + if (level == Z_DEFAULT_COMPRESSION) level = 6; +#endif + + if (windowBits < 0) { /* suppress zlib wrapper */ + wrap = 0; + windowBits = -windowBits; + } +#ifdef GZIP + else if (windowBits > 15) { + wrap = 2; /* write gzip wrapper instead */ + windowBits -= 16; + } +#endif + if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || + windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || + strategy < 0 || strategy > Z_FIXED) { + return Z_STREAM_ERROR; + } + if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ + s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); + if (s == Z_NULL) return Z_MEM_ERROR; + strm->state = (struct internal_state FAR *)s; + s->strm = strm; + + s->wrap = wrap; + s->gzhead = Z_NULL; + s->w_bits = windowBits; + s->w_size = 1 << s->w_bits; + s->w_mask = s->w_size - 1; + + s->hash_bits = memLevel + 7; + s->hash_size = 1 << s->hash_bits; + s->hash_mask = s->hash_size - 1; + s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); + + s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); + s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); + s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); + + s->high_water = 0; /* nothing written to s->window yet */ + + s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ + + overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); + s->pending_buf = (uchf *) overlay; + s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); + + if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || + s->pending_buf == Z_NULL) { + s->status = FINISH_STATE; + strm->msg = ERR_MSG(Z_MEM_ERROR); + deflateEnd (strm); + return Z_MEM_ERROR; + } + s->d_buf = overlay + s->lit_bufsize/sizeof(ush); + s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; + + s->level = level; + s->strategy = strategy; + s->method = (Byte)method; + + return deflateReset(strm); +} + +/* ========================================================================= */ +int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) + z_streamp strm; + const Bytef *dictionary; + uInt dictLength; +{ + deflate_state *s; + uInt str, n; + int wrap; + unsigned avail; + z_const unsigned char *next; + + if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL) + return Z_STREAM_ERROR; + s = strm->state; + wrap = s->wrap; + if (wrap == 2 || (wrap == 1 && s->status != INIT_STATE) || s->lookahead) + return Z_STREAM_ERROR; + + /* when using zlib wrappers, compute Adler-32 for provided dictionary */ + if (wrap == 1) + strm->adler = adler32(strm->adler, dictionary, dictLength); + s->wrap = 0; /* avoid computing Adler-32 in read_buf */ + + /* if dictionary would fill window, just replace the history */ + if (dictLength >= s->w_size) { + if (wrap == 0) { /* already empty otherwise */ + CLEAR_HASH(s); + s->strstart = 0; + s->block_start = 0L; + s->insert = 0; + } + dictionary += dictLength - s->w_size; /* use the tail */ + dictLength = s->w_size; + } + + /* insert dictionary into window and hash */ + avail = strm->avail_in; + next = strm->next_in; + strm->avail_in = dictLength; + strm->next_in = (z_const Bytef *)dictionary; + fill_window(s); + while (s->lookahead >= MIN_MATCH) { + str = s->strstart; + n = s->lookahead - (MIN_MATCH-1); + do { + UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); +#ifndef FASTEST + s->prev[str & s->w_mask] = s->head[s->ins_h]; +#endif + s->head[s->ins_h] = (Pos)str; + str++; + } while (--n); + s->strstart = str; + s->lookahead = MIN_MATCH-1; + fill_window(s); + } + s->strstart += s->lookahead; + s->block_start = (long)s->strstart; + s->insert = s->lookahead; + s->lookahead = 0; + s->match_length = s->prev_length = MIN_MATCH-1; + s->match_available = 0; + strm->next_in = next; + strm->avail_in = avail; + s->wrap = wrap; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateResetKeep (strm) + z_streamp strm; +{ + deflate_state *s; + + if (strm == Z_NULL || strm->state == Z_NULL || + strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) { + return Z_STREAM_ERROR; + } + + strm->total_in = strm->total_out = 0; + strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */ + strm->data_type = Z_UNKNOWN; + + s = (deflate_state *)strm->state; + s->pending = 0; + s->pending_out = s->pending_buf; + + if (s->wrap < 0) { + s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ + } + s->status = s->wrap ? INIT_STATE : BUSY_STATE; + strm->adler = +#ifdef GZIP + s->wrap == 2 ? crc32(0L, Z_NULL, 0) : +#endif + adler32(0L, Z_NULL, 0); + s->last_flush = Z_NO_FLUSH; + + _tr_init(s); + + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateReset (strm) + z_streamp strm; +{ + int ret; + + ret = deflateResetKeep(strm); + if (ret == Z_OK) + lm_init(strm->state); + return ret; +} + +/* ========================================================================= */ +int ZEXPORT deflateSetHeader (strm, head) + z_streamp strm; + gz_headerp head; +{ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (strm->state->wrap != 2) return Z_STREAM_ERROR; + strm->state->gzhead = head; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflatePending (strm, pending, bits) + unsigned *pending; + int *bits; + z_streamp strm; +{ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (pending != Z_NULL) + *pending = strm->state->pending; + if (bits != Z_NULL) + *bits = strm->state->bi_valid; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflatePrime (strm, bits, value) + z_streamp strm; + int bits; + int value; +{ + deflate_state *s; + int put; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + s = strm->state; + if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3)) + return Z_BUF_ERROR; + do { + put = Buf_size - s->bi_valid; + if (put > bits) + put = bits; + s->bi_buf |= (ush)((value & ((1 << put) - 1)) << s->bi_valid); + s->bi_valid += put; + _tr_flush_bits(s); + value >>= put; + bits -= put; + } while (bits); + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateParams(strm, level, strategy) + z_streamp strm; + int level; + int strategy; +{ + deflate_state *s; + compress_func func; + int err = Z_OK; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + s = strm->state; + +#ifdef FASTEST + if (level != 0) level = 1; +#else + if (level == Z_DEFAULT_COMPRESSION) level = 6; +#endif + if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { + return Z_STREAM_ERROR; + } + func = configuration_table[s->level].func; + + if ((strategy != s->strategy || func != configuration_table[level].func) && + strm->total_in != 0) { + /* Flush the last buffer: */ + err = deflate(strm, Z_BLOCK); + if (err == Z_BUF_ERROR && s->pending == 0) + err = Z_OK; + } + if (s->level != level) { + s->level = level; + s->max_lazy_match = configuration_table[level].max_lazy; + s->good_match = configuration_table[level].good_length; + s->nice_match = configuration_table[level].nice_length; + s->max_chain_length = configuration_table[level].max_chain; + } + s->strategy = strategy; + return err; +} + +/* ========================================================================= */ +int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) + z_streamp strm; + int good_length; + int max_lazy; + int nice_length; + int max_chain; +{ + deflate_state *s; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + s = strm->state; + s->good_match = good_length; + s->max_lazy_match = max_lazy; + s->nice_match = nice_length; + s->max_chain_length = max_chain; + return Z_OK; +} + +/* ========================================================================= + * For the default windowBits of 15 and memLevel of 8, this function returns + * a close to exact, as well as small, upper bound on the compressed size. + * They are coded as constants here for a reason--if the #define's are + * changed, then this function needs to be changed as well. The return + * value for 15 and 8 only works for those exact settings. + * + * For any setting other than those defaults for windowBits and memLevel, + * the value returned is a conservative worst case for the maximum expansion + * resulting from using fixed blocks instead of stored blocks, which deflate + * can emit on compressed data for some combinations of the parameters. + * + * This function could be more sophisticated to provide closer upper bounds for + * every combination of windowBits and memLevel. But even the conservative + * upper bound of about 14% expansion does not seem onerous for output buffer + * allocation. + */ +uLong ZEXPORT deflateBound(strm, sourceLen) + z_streamp strm; + uLong sourceLen; +{ + deflate_state *s; + uLong complen, wraplen; + Bytef *str; + + /* conservative upper bound for compressed data */ + complen = sourceLen + + ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5; + + /* if can't get parameters, return conservative bound plus zlib wrapper */ + if (strm == Z_NULL || strm->state == Z_NULL) + return complen + 6; + + /* compute wrapper length */ + s = strm->state; + switch (s->wrap) { + case 0: /* raw deflate */ + wraplen = 0; + break; + case 1: /* zlib wrapper */ + wraplen = 6 + (s->strstart ? 4 : 0); + break; + case 2: /* gzip wrapper */ + wraplen = 18; + if (s->gzhead != Z_NULL) { /* user-supplied gzip header */ + if (s->gzhead->extra != Z_NULL) + wraplen += 2 + s->gzhead->extra_len; + str = s->gzhead->name; + if (str != Z_NULL) + do { + wraplen++; + } while (*str++); + str = s->gzhead->comment; + if (str != Z_NULL) + do { + wraplen++; + } while (*str++); + if (s->gzhead->hcrc) + wraplen += 2; + } + break; + default: /* for compiler happiness */ + wraplen = 6; + } + + /* if not default parameters, return conservative bound */ + if (s->w_bits != 15 || s->hash_bits != 8 + 7) + return complen + wraplen; + + /* default settings: return tight bound for that case */ + return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + + (sourceLen >> 25) + 13 - 6 + wraplen; +} + +/* ========================================================================= + * Put a short in the pending buffer. The 16-bit value is put in MSB order. + * IN assertion: the stream state is correct and there is enough room in + * pending_buf. + */ +local void putShortMSB (s, b) + deflate_state *s; + uInt b; +{ + put_byte(s, (Byte)(b >> 8)); + put_byte(s, (Byte)(b & 0xff)); +} + +/* ========================================================================= + * Flush as much pending output as possible. All deflate() output goes + * through this function so some applications may wish to modify it + * to avoid allocating a large strm->next_out buffer and copying into it. + * (See also read_buf()). + */ +local void flush_pending(strm) + z_streamp strm; +{ + unsigned len; + deflate_state *s = strm->state; + + _tr_flush_bits(s); + len = s->pending; + if (len > strm->avail_out) len = strm->avail_out; + if (len == 0) return; + + zmemcpy(strm->next_out, s->pending_out, len); + strm->next_out += len; + s->pending_out += len; + strm->total_out += len; + strm->avail_out -= len; + s->pending -= len; + if (s->pending == 0) { + s->pending_out = s->pending_buf; + } +} + +/* ========================================================================= */ +int ZEXPORT deflate (strm, flush) + z_streamp strm; + int flush; +{ + int old_flush; /* value of flush param for previous deflate call */ + deflate_state *s; + + if (strm == Z_NULL || strm->state == Z_NULL || + flush > Z_BLOCK || flush < 0) { + return Z_STREAM_ERROR; + } + s = strm->state; + + if (strm->next_out == Z_NULL || + (strm->next_in == Z_NULL && strm->avail_in != 0) || + (s->status == FINISH_STATE && flush != Z_FINISH)) { + ERR_RETURN(strm, Z_STREAM_ERROR); + } + if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); + + s->strm = strm; /* just in case */ + old_flush = s->last_flush; + s->last_flush = flush; + + /* Write the header */ + if (s->status == INIT_STATE) { +#ifdef GZIP + if (s->wrap == 2) { + strm->adler = crc32(0L, Z_NULL, 0); + put_byte(s, 31); + put_byte(s, 139); + put_byte(s, 8); + if (s->gzhead == Z_NULL) { + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, s->level == 9 ? 2 : + (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? + 4 : 0)); + put_byte(s, OS_CODE); + s->status = BUSY_STATE; + } + else { + put_byte(s, (s->gzhead->text ? 1 : 0) + + (s->gzhead->hcrc ? 2 : 0) + + (s->gzhead->extra == Z_NULL ? 0 : 4) + + (s->gzhead->name == Z_NULL ? 0 : 8) + + (s->gzhead->comment == Z_NULL ? 0 : 16) + ); + put_byte(s, (Byte)(s->gzhead->time & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff)); + put_byte(s, s->level == 9 ? 2 : + (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? + 4 : 0)); + put_byte(s, s->gzhead->os & 0xff); + if (s->gzhead->extra != Z_NULL) { + put_byte(s, s->gzhead->extra_len & 0xff); + put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); + } + if (s->gzhead->hcrc) + strm->adler = crc32(strm->adler, s->pending_buf, + s->pending); + s->gzindex = 0; + s->status = EXTRA_STATE; + } + } + else +#endif + { + uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; + uInt level_flags; + + if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) + level_flags = 0; + else if (s->level < 6) + level_flags = 1; + else if (s->level == 6) + level_flags = 2; + else + level_flags = 3; + header |= (level_flags << 6); + if (s->strstart != 0) header |= PRESET_DICT; + header += 31 - (header % 31); + + s->status = BUSY_STATE; + putShortMSB(s, header); + + /* Save the adler32 of the preset dictionary: */ + if (s->strstart != 0) { + putShortMSB(s, (uInt)(strm->adler >> 16)); + putShortMSB(s, (uInt)(strm->adler & 0xffff)); + } + strm->adler = adler32(0L, Z_NULL, 0); + } + } +#ifdef GZIP + if (s->status == EXTRA_STATE) { + if (s->gzhead->extra != Z_NULL) { + uInt beg = s->pending; /* start of bytes to update crc */ + + while (s->gzindex < (s->gzhead->extra_len & 0xffff)) { + if (s->pending == s->pending_buf_size) { + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + flush_pending(strm); + beg = s->pending; + if (s->pending == s->pending_buf_size) + break; + } + put_byte(s, s->gzhead->extra[s->gzindex]); + s->gzindex++; + } + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + if (s->gzindex == s->gzhead->extra_len) { + s->gzindex = 0; + s->status = NAME_STATE; + } + } + else + s->status = NAME_STATE; + } + if (s->status == NAME_STATE) { + if (s->gzhead->name != Z_NULL) { + uInt beg = s->pending; /* start of bytes to update crc */ + int val; + + do { + if (s->pending == s->pending_buf_size) { + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + flush_pending(strm); + beg = s->pending; + if (s->pending == s->pending_buf_size) { + val = 1; + break; + } + } + val = s->gzhead->name[s->gzindex++]; + put_byte(s, val); + } while (val != 0); + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + if (val == 0) { + s->gzindex = 0; + s->status = COMMENT_STATE; + } + } + else + s->status = COMMENT_STATE; + } + if (s->status == COMMENT_STATE) { + if (s->gzhead->comment != Z_NULL) { + uInt beg = s->pending; /* start of bytes to update crc */ + int val; + + do { + if (s->pending == s->pending_buf_size) { + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + flush_pending(strm); + beg = s->pending; + if (s->pending == s->pending_buf_size) { + val = 1; + break; + } + } + val = s->gzhead->comment[s->gzindex++]; + put_byte(s, val); + } while (val != 0); + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + if (val == 0) + s->status = HCRC_STATE; + } + else + s->status = HCRC_STATE; + } + if (s->status == HCRC_STATE) { + if (s->gzhead->hcrc) { + if (s->pending + 2 > s->pending_buf_size) + flush_pending(strm); + if (s->pending + 2 <= s->pending_buf_size) { + put_byte(s, (Byte)(strm->adler & 0xff)); + put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); + strm->adler = crc32(0L, Z_NULL, 0); + s->status = BUSY_STATE; + } + } + else + s->status = BUSY_STATE; + } +#endif + + /* Flush as much pending output as possible */ + if (s->pending != 0) { + flush_pending(strm); + if (strm->avail_out == 0) { + /* Since avail_out is 0, deflate will be called again with + * more output space, but possibly with both pending and + * avail_in equal to zero. There won't be anything to do, + * but this is not an error situation so make sure we + * return OK instead of BUF_ERROR at next call of deflate: + */ + s->last_flush = -1; + return Z_OK; + } + + /* Make sure there is something to do and avoid duplicate consecutive + * flushes. For repeated and useless calls with Z_FINISH, we keep + * returning Z_STREAM_END instead of Z_BUF_ERROR. + */ + } else if (strm->avail_in == 0 && RANK(flush) <= RANK(old_flush) && + flush != Z_FINISH) { + ERR_RETURN(strm, Z_BUF_ERROR); + } + + /* User must not provide more input after the first FINISH: */ + if (s->status == FINISH_STATE && strm->avail_in != 0) { + ERR_RETURN(strm, Z_BUF_ERROR); + } + + /* Start a new block or continue the current one. + */ + if (strm->avail_in != 0 || s->lookahead != 0 || + (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { + block_state bstate; + + bstate = s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : + (s->strategy == Z_RLE ? deflate_rle(s, flush) : + (*(configuration_table[s->level].func))(s, flush)); + + if (bstate == finish_started || bstate == finish_done) { + s->status = FINISH_STATE; + } + if (bstate == need_more || bstate == finish_started) { + if (strm->avail_out == 0) { + s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ + } + return Z_OK; + /* If flush != Z_NO_FLUSH && avail_out == 0, the next call + * of deflate should use the same flush parameter to make sure + * that the flush is complete. So we don't have to output an + * empty block here, this will be done at next call. This also + * ensures that for a very small output buffer, we emit at most + * one empty block. + */ + } + if (bstate == block_done) { + if (flush == Z_PARTIAL_FLUSH) { + _tr_align(s); + } else if (flush != Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */ + _tr_stored_block(s, (char*)0, 0L, 0); + /* For a full flush, this empty block will be recognized + * as a special marker by inflate_sync(). + */ + if (flush == Z_FULL_FLUSH) { + CLEAR_HASH(s); /* forget history */ + if (s->lookahead == 0) { + s->strstart = 0; + s->block_start = 0L; + s->insert = 0; + } + } + } + flush_pending(strm); + if (strm->avail_out == 0) { + s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ + return Z_OK; + } + } + } + Assert(strm->avail_out > 0, "bug2"); + + if (flush != Z_FINISH) return Z_OK; + if (s->wrap <= 0) return Z_STREAM_END; + + /* Write the trailer */ +#ifdef GZIP + if (s->wrap == 2) { + put_byte(s, (Byte)(strm->adler & 0xff)); + put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); + put_byte(s, (Byte)((strm->adler >> 16) & 0xff)); + put_byte(s, (Byte)((strm->adler >> 24) & 0xff)); + put_byte(s, (Byte)(strm->total_in & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 8) & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 16) & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 24) & 0xff)); + } + else +#endif + { + putShortMSB(s, (uInt)(strm->adler >> 16)); + putShortMSB(s, (uInt)(strm->adler & 0xffff)); + } + flush_pending(strm); + /* If avail_out is zero, the application will call deflate again + * to flush the rest. + */ + if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ + return s->pending != 0 ? Z_OK : Z_STREAM_END; +} + +/* ========================================================================= */ +int ZEXPORT deflateEnd (strm) + z_streamp strm; +{ + int status; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + + status = strm->state->status; + if (status != INIT_STATE && + status != EXTRA_STATE && + status != NAME_STATE && + status != COMMENT_STATE && + status != HCRC_STATE && + status != BUSY_STATE && + status != FINISH_STATE) { + return Z_STREAM_ERROR; + } + + /* Deallocate in reverse order of allocations: */ + TRY_FREE(strm, strm->state->pending_buf); + TRY_FREE(strm, strm->state->head); + TRY_FREE(strm, strm->state->prev); + TRY_FREE(strm, strm->state->window); + + ZFREE(strm, strm->state); + strm->state = Z_NULL; + + return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; +} + +/* ========================================================================= + * Copy the source state to the destination state. + * To simplify the source, this is not supported for 16-bit MSDOS (which + * doesn't have enough memory anyway to duplicate compression states). + */ +int ZEXPORT deflateCopy (dest, source) + z_streamp dest; + z_streamp source; +{ +#ifdef MAXSEG_64K + return Z_STREAM_ERROR; +#else + deflate_state *ds; + deflate_state *ss; + ushf *overlay; + + + if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) { + return Z_STREAM_ERROR; + } + + ss = source->state; + + zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); + + ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); + if (ds == Z_NULL) return Z_MEM_ERROR; + dest->state = (struct internal_state FAR *) ds; + zmemcpy((voidpf)ds, (voidpf)ss, sizeof(deflate_state)); + ds->strm = dest; + + ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); + ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); + ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); + overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); + ds->pending_buf = (uchf *) overlay; + + if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || + ds->pending_buf == Z_NULL) { + deflateEnd (dest); + return Z_MEM_ERROR; + } + /* following zmemcpy do not work for 16-bit MSDOS */ + zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); + zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos)); + zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos)); + zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); + + ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); + ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); + ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; + + ds->l_desc.dyn_tree = ds->dyn_ltree; + ds->d_desc.dyn_tree = ds->dyn_dtree; + ds->bl_desc.dyn_tree = ds->bl_tree; + + return Z_OK; +#endif /* MAXSEG_64K */ +} + +/* =========================================================================== + * Read a new buffer from the current input stream, update the adler32 + * and total number of bytes read. All deflate() input goes through + * this function so some applications may wish to modify it to avoid + * allocating a large strm->next_in buffer and copying from it. + * (See also flush_pending()). + */ +local int read_buf(strm, buf, size) + z_streamp strm; + Bytef *buf; + unsigned size; +{ + unsigned len = strm->avail_in; + + if (len > size) len = size; + if (len == 0) return 0; + + strm->avail_in -= len; + + zmemcpy(buf, strm->next_in, len); + if (strm->state->wrap == 1) { + strm->adler = adler32(strm->adler, buf, len); + } +#ifdef GZIP + else if (strm->state->wrap == 2) { + strm->adler = crc32(strm->adler, buf, len); + } +#endif + strm->next_in += len; + strm->total_in += len; + + return (int)len; +} + +/* =========================================================================== + * Initialize the "longest match" routines for a new zlib stream + */ +local void lm_init (s) + deflate_state *s; +{ + s->window_size = (ulg)2L*s->w_size; + + CLEAR_HASH(s); + + /* Set the default configuration parameters: + */ + s->max_lazy_match = configuration_table[s->level].max_lazy; + s->good_match = configuration_table[s->level].good_length; + s->nice_match = configuration_table[s->level].nice_length; + s->max_chain_length = configuration_table[s->level].max_chain; + + s->strstart = 0; + s->block_start = 0L; + s->lookahead = 0; + s->insert = 0; + s->match_length = s->prev_length = MIN_MATCH-1; + s->match_available = 0; + s->ins_h = 0; +#ifndef FASTEST +#ifdef ASMV + match_init(); /* initialize the asm code */ +#endif +#endif +} + +#ifndef FASTEST +/* =========================================================================== + * Set match_start to the longest match starting at the given string and + * return its length. Matches shorter or equal to prev_length are discarded, + * in which case the result is equal to prev_length and match_start is + * garbage. + * IN assertions: cur_match is the head of the hash chain for the current + * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 + * OUT assertion: the match length is not greater than s->lookahead. + */ +#ifndef ASMV +/* For 80x86 and 680x0, an optimized version will be provided in match.asm or + * match.S. The code will be functionally equivalent. + */ +local uInt longest_match(s, cur_match) + deflate_state *s; + IPos cur_match; /* current match */ +{ + unsigned chain_length = s->max_chain_length;/* max hash chain length */ + register Bytef *scan = s->window + s->strstart; /* current string */ + register Bytef *match; /* matched string */ + register int len; /* length of current match */ + int best_len = s->prev_length; /* best match length so far */ + int nice_match = s->nice_match; /* stop if match long enough */ + IPos limit = s->strstart > (IPos)MAX_DIST(s) ? + s->strstart - (IPos)MAX_DIST(s) : NIL; + /* Stop when cur_match becomes <= limit. To simplify the code, + * we prevent matches with the string of window index 0. + */ + Posf *prev = s->prev; + uInt wmask = s->w_mask; + +#ifdef UNALIGNED_OK + /* Compare two bytes at a time. Note: this is not always beneficial. + * Try with and without -DUNALIGNED_OK to check. + */ + register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; + register ush scan_start = *(ushf*)scan; + register ush scan_end = *(ushf*)(scan+best_len-1); +#else + register Bytef *strend = s->window + s->strstart + MAX_MATCH; + register Byte scan_end1 = scan[best_len-1]; + register Byte scan_end = scan[best_len]; +#endif + + /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. + * It is easy to get rid of this optimization if necessary. + */ + Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); + + /* Do not waste too much time if we already have a good match: */ + if (s->prev_length >= s->good_match) { + chain_length >>= 2; + } + /* Do not look for matches beyond the end of the input. This is necessary + * to make deflate deterministic. + */ + if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; + + Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + + do { + Assert(cur_match < s->strstart, "no future"); + match = s->window + cur_match; + + /* Skip to next match if the match length cannot increase + * or if the match length is less than 2. Note that the checks below + * for insufficient lookahead only occur occasionally for performance + * reasons. Therefore uninitialized memory will be accessed, and + * conditional jumps will be made that depend on those values. + * However the length of the match is limited to the lookahead, so + * the output of deflate is not affected by the uninitialized values. + */ +#if (defined(UNALIGNED_OK) && MAX_MATCH == 258) + /* This code assumes sizeof(unsigned short) == 2. Do not use + * UNALIGNED_OK if your compiler uses a different size. + */ + if (*(ushf*)(match+best_len-1) != scan_end || + *(ushf*)match != scan_start) continue; + + /* It is not necessary to compare scan[2] and match[2] since they are + * always equal when the other bytes match, given that the hash keys + * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at + * strstart+3, +5, ... up to strstart+257. We check for insufficient + * lookahead only every 4th comparison; the 128th check will be made + * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is + * necessary to put more guard bytes at the end of the window, or + * to check more often for insufficient lookahead. + */ + Assert(scan[2] == match[2], "scan[2]?"); + scan++, match++; + do { + } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + scan < strend); + /* The funny "do {}" generates better code on most compilers */ + + /* Here, scan <= window+strstart+257 */ + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + if (*scan == *match) scan++; + + len = (MAX_MATCH - 1) - (int)(strend-scan); + scan = strend - (MAX_MATCH-1); + +#else /* UNALIGNED_OK */ + + if (match[best_len] != scan_end || + match[best_len-1] != scan_end1 || + *match != *scan || + *++match != scan[1]) continue; + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scan += 2, match++; + Assert(*scan == *match, "match[2]?"); + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + } while (*++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + scan < strend); + + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + + len = MAX_MATCH - (int)(strend - scan); + scan = strend - MAX_MATCH; + +#endif /* UNALIGNED_OK */ + + if (len > best_len) { + s->match_start = cur_match; + best_len = len; + if (len >= nice_match) break; +#ifdef UNALIGNED_OK + scan_end = *(ushf*)(scan+best_len-1); +#else + scan_end1 = scan[best_len-1]; + scan_end = scan[best_len]; +#endif + } + } while ((cur_match = prev[cur_match & wmask]) > limit + && --chain_length != 0); + + if ((uInt)best_len <= s->lookahead) return (uInt)best_len; + return s->lookahead; +} +#endif /* ASMV */ + +#else /* FASTEST */ + +/* --------------------------------------------------------------------------- + * Optimized version for FASTEST only + */ +local uInt longest_match(s, cur_match) + deflate_state *s; + IPos cur_match; /* current match */ +{ + register Bytef *scan = s->window + s->strstart; /* current string */ + register Bytef *match; /* matched string */ + register int len; /* length of current match */ + register Bytef *strend = s->window + s->strstart + MAX_MATCH; + + /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. + * It is easy to get rid of this optimization if necessary. + */ + Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); + + Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + + Assert(cur_match < s->strstart, "no future"); + + match = s->window + cur_match; + + /* Return failure if the match length is less than 2: + */ + if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scan += 2, match += 2; + Assert(*scan == *match, "match[2]?"); + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + } while (*++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + scan < strend); + + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + + len = MAX_MATCH - (int)(strend - scan); + + if (len < MIN_MATCH) return MIN_MATCH - 1; + + s->match_start = cur_match; + return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; +} + +#endif /* FASTEST */ + +#ifdef DEBUG +/* =========================================================================== + * Check that the match at match_start is indeed a match. + */ +local void check_match(s, start, match, length) + deflate_state *s; + IPos start, match; + int length; +{ + /* check that the match is indeed a match */ + if (zmemcmp(s->window + match, + s->window + start, length) != EQUAL) { + fprintf(stderr, " start %u, match %u, length %d\n", + start, match, length); + do { + fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); + } while (--length != 0); + z_error("invalid match"); + } + if (z_verbose > 1) { + fprintf(stderr,"\\[%d,%d]", start-match, length); + do { putc(s->window[start++], stderr); } while (--length != 0); + } +} +#else +# define check_match(s, start, match, length) +#endif /* DEBUG */ + +/* =========================================================================== + * Fill the window when the lookahead becomes insufficient. + * Updates strstart and lookahead. + * + * IN assertion: lookahead < MIN_LOOKAHEAD + * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD + * At least one byte has been read, or avail_in == 0; reads are + * performed for at least two bytes (required for the zip translate_eol + * option -- not supported here). + */ +local void fill_window(s) + deflate_state *s; +{ + register unsigned n, m; + register Posf *p; + unsigned more; /* Amount of free space at the end of the window. */ + uInt wsize = s->w_size; + + Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); + + do { + more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); + + /* Deal with !@#$% 64K limit: */ + if (sizeof(int) <= 2) { + if (more == 0 && s->strstart == 0 && s->lookahead == 0) { + more = wsize; + + } else if (more == (unsigned)(-1)) { + /* Very unlikely, but possible on 16 bit machine if + * strstart == 0 && lookahead == 1 (input done a byte at time) + */ + more--; + } + } + + /* If the window is almost full and there is insufficient lookahead, + * move the upper half to the lower one to make room in the upper half. + */ + if (s->strstart >= wsize+MAX_DIST(s)) { + + zmemcpy(s->window, s->window+wsize, (unsigned)wsize); + s->match_start -= wsize; + s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ + s->block_start -= (long) wsize; + + /* Slide the hash table (could be avoided with 32 bit values + at the expense of memory usage). We slide even when level == 0 + to keep the hash table consistent if we switch back to level > 0 + later. (Using level 0 permanently is not an optimal usage of + zlib, so we don't care about this pathological case.) + */ + n = s->hash_size; + p = &s->head[n]; + do { + m = *--p; + *p = (Pos)(m >= wsize ? m-wsize : NIL); + } while (--n); + + n = wsize; +#ifndef FASTEST + p = &s->prev[n]; + do { + m = *--p; + *p = (Pos)(m >= wsize ? m-wsize : NIL); + /* If n is not on any hash chain, prev[n] is garbage but + * its value will never be used. + */ + } while (--n); +#endif + more += wsize; + } + if (s->strm->avail_in == 0) break; + + /* If there was no sliding: + * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && + * more == window_size - lookahead - strstart + * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) + * => more >= window_size - 2*WSIZE + 2 + * In the BIG_MEM or MMAP case (not yet supported), + * window_size == input_size + MIN_LOOKAHEAD && + * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. + * Otherwise, window_size == 2*WSIZE so more >= 2. + * If there was sliding, more >= WSIZE. So in all cases, more >= 2. + */ + Assert(more >= 2, "more < 2"); + + n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); + s->lookahead += n; + + /* Initialize the hash value now that we have some input: */ + if (s->lookahead + s->insert >= MIN_MATCH) { + uInt str = s->strstart - s->insert; + s->ins_h = s->window[str]; + UPDATE_HASH(s, s->ins_h, s->window[str + 1]); +#if MIN_MATCH != 3 + Call UPDATE_HASH() MIN_MATCH-3 more times +#endif + while (s->insert) { + UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); +#ifndef FASTEST + s->prev[str & s->w_mask] = s->head[s->ins_h]; +#endif + s->head[s->ins_h] = (Pos)str; + str++; + s->insert--; + if (s->lookahead + s->insert < MIN_MATCH) + break; + } + } + /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, + * but this is not important since only literal bytes will be emitted. + */ + + } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); + + /* If the WIN_INIT bytes after the end of the current data have never been + * written, then zero those bytes in order to avoid memory check reports of + * the use of uninitialized (or uninitialised as Julian writes) bytes by + * the longest match routines. Update the high water mark for the next + * time through here. WIN_INIT is set to MAX_MATCH since the longest match + * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. + */ + if (s->high_water < s->window_size) { + ulg curr = s->strstart + (ulg)(s->lookahead); + ulg init; + + if (s->high_water < curr) { + /* Previous high water mark below current data -- zero WIN_INIT + * bytes or up to end of window, whichever is less. + */ + init = s->window_size - curr; + if (init > WIN_INIT) + init = WIN_INIT; + zmemzero(s->window + curr, (unsigned)init); + s->high_water = curr + init; + } + else if (s->high_water < (ulg)curr + WIN_INIT) { + /* High water mark at or above current data, but below current data + * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up + * to end of window, whichever is less. + */ + init = (ulg)curr + WIN_INIT - s->high_water; + if (init > s->window_size - s->high_water) + init = s->window_size - s->high_water; + zmemzero(s->window + s->high_water, (unsigned)init); + s->high_water += init; + } + } + + Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, + "not enough room for search"); +} + +/* =========================================================================== + * Flush the current block, with given end-of-file flag. + * IN assertion: strstart is set to the end of the current match. + */ +#define FLUSH_BLOCK_ONLY(s, last) { \ + _tr_flush_block(s, (s->block_start >= 0L ? \ + (charf *)&s->window[(unsigned)s->block_start] : \ + (charf *)Z_NULL), \ + (ulg)((long)s->strstart - s->block_start), \ + (last)); \ + s->block_start = s->strstart; \ + flush_pending(s->strm); \ + Tracev((stderr,"[FLUSH]")); \ +} + +/* Same but force premature exit if necessary. */ +#define FLUSH_BLOCK(s, last) { \ + FLUSH_BLOCK_ONLY(s, last); \ + if (s->strm->avail_out == 0) return (last) ? finish_started : need_more; \ +} + +/* =========================================================================== + * Copy without compression as much as possible from the input stream, return + * the current block state. + * This function does not insert new strings in the dictionary since + * uncompressible data is probably not useful. This function is used + * only for the level=0 compression option. + * NOTE: this function should be optimized to avoid extra copying from + * window to pending_buf. + */ +local block_state deflate_stored(s, flush) + deflate_state *s; + int flush; +{ + /* Stored blocks are limited to 0xffff bytes, pending_buf is limited + * to pending_buf_size, and each stored block has a 5 byte header: + */ + ulg max_block_size = 0xffff; + ulg max_start; + + if (max_block_size > s->pending_buf_size - 5) { + max_block_size = s->pending_buf_size - 5; + } + + /* Copy as much as possible from input to output: */ + for (;;) { + /* Fill the window as much as possible: */ + if (s->lookahead <= 1) { + + Assert(s->strstart < s->w_size+MAX_DIST(s) || + s->block_start >= (long)s->w_size, "slide too late"); + + fill_window(s); + if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more; + + if (s->lookahead == 0) break; /* flush the current block */ + } + Assert(s->block_start >= 0L, "block gone"); + + s->strstart += s->lookahead; + s->lookahead = 0; + + /* Emit a stored block if pending_buf will be full: */ + max_start = s->block_start + max_block_size; + if (s->strstart == 0 || (ulg)s->strstart >= max_start) { + /* strstart == 0 is possible when wraparound on 16-bit machine */ + s->lookahead = (uInt)(s->strstart - max_start); + s->strstart = (uInt)max_start; + FLUSH_BLOCK(s, 0); + } + /* Flush if we may have to slide, otherwise block_start may become + * negative and the data will be gone: + */ + if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { + FLUSH_BLOCK(s, 0); + } + } + s->insert = 0; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if ((long)s->strstart > s->block_start) + FLUSH_BLOCK(s, 0); + return block_done; +} + +/* =========================================================================== + * Compress as much as possible from the input stream, return the current + * block state. + * This function does not perform lazy evaluation of matches and inserts + * new strings in the dictionary only for unmatched strings or for short + * matches. It is used only for the fast compression options. + */ +local block_state deflate_fast(s, flush) + deflate_state *s; + int flush; +{ + IPos hash_head; /* head of the hash chain */ + int bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s->lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + hash_head = NIL; + if (s->lookahead >= MIN_MATCH) { + INSERT_STRING(s, s->strstart, hash_head); + } + + /* Find the longest match, discarding those <= prev_length. + * At this point we have always match_length < MIN_MATCH + */ + if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + s->match_length = longest_match (s, hash_head); + /* longest_match() sets match_start */ + } + if (s->match_length >= MIN_MATCH) { + check_match(s, s->strstart, s->match_start, s->match_length); + + _tr_tally_dist(s, s->strstart - s->match_start, + s->match_length - MIN_MATCH, bflush); + + s->lookahead -= s->match_length; + + /* Insert new strings in the hash table only if the match length + * is not too large. This saves time but degrades compression. + */ +#ifndef FASTEST + if (s->match_length <= s->max_insert_length && + s->lookahead >= MIN_MATCH) { + s->match_length--; /* string at strstart already in table */ + do { + s->strstart++; + INSERT_STRING(s, s->strstart, hash_head); + /* strstart never exceeds WSIZE-MAX_MATCH, so there are + * always MIN_MATCH bytes ahead. + */ + } while (--s->match_length != 0); + s->strstart++; + } else +#endif + { + s->strstart += s->match_length; + s->match_length = 0; + s->ins_h = s->window[s->strstart]; + UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); +#if MIN_MATCH != 3 + Call UPDATE_HASH() MIN_MATCH-3 more times +#endif + /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not + * matter since it will be recomputed at next deflate call. + */ + } + } else { + /* No match, output a literal byte */ + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + } + if (bflush) FLUSH_BLOCK(s, 0); + } + s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; +} + +#ifndef FASTEST +/* =========================================================================== + * Same as above, but achieves better compression. We use a lazy + * evaluation for matches: a match is finally adopted only if there is + * no better match at the next window position. + */ +local block_state deflate_slow(s, flush) + deflate_state *s; + int flush; +{ + IPos hash_head; /* head of hash chain */ + int bflush; /* set if current block must be flushed */ + + /* Process the input block. */ + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s->lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + hash_head = NIL; + if (s->lookahead >= MIN_MATCH) { + INSERT_STRING(s, s->strstart, hash_head); + } + + /* Find the longest match, discarding those <= prev_length. + */ + s->prev_length = s->match_length, s->prev_match = s->match_start; + s->match_length = MIN_MATCH-1; + + if (hash_head != NIL && s->prev_length < s->max_lazy_match && + s->strstart - hash_head <= MAX_DIST(s)) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + s->match_length = longest_match (s, hash_head); + /* longest_match() sets match_start */ + + if (s->match_length <= 5 && (s->strategy == Z_FILTERED +#if TOO_FAR <= 32767 + || (s->match_length == MIN_MATCH && + s->strstart - s->match_start > TOO_FAR) +#endif + )) { + + /* If prev_match is also MIN_MATCH, match_start is garbage + * but we will ignore the current match anyway. + */ + s->match_length = MIN_MATCH-1; + } + } + /* If there was a match at the previous step and the current + * match is not better, output the previous match: + */ + if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { + uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; + /* Do not insert strings in hash table beyond this. */ + + check_match(s, s->strstart-1, s->prev_match, s->prev_length); + + _tr_tally_dist(s, s->strstart -1 - s->prev_match, + s->prev_length - MIN_MATCH, bflush); + + /* Insert in hash table all strings up to the end of the match. + * strstart-1 and strstart are already inserted. If there is not + * enough lookahead, the last two strings are not inserted in + * the hash table. + */ + s->lookahead -= s->prev_length-1; + s->prev_length -= 2; + do { + if (++s->strstart <= max_insert) { + INSERT_STRING(s, s->strstart, hash_head); + } + } while (--s->prev_length != 0); + s->match_available = 0; + s->match_length = MIN_MATCH-1; + s->strstart++; + + if (bflush) FLUSH_BLOCK(s, 0); + + } else if (s->match_available) { + /* If there was no match at the previous position, output a + * single literal. If there was a match but the current match + * is longer, truncate the previous match to a single literal. + */ + Tracevv((stderr,"%c", s->window[s->strstart-1])); + _tr_tally_lit(s, s->window[s->strstart-1], bflush); + if (bflush) { + FLUSH_BLOCK_ONLY(s, 0); + } + s->strstart++; + s->lookahead--; + if (s->strm->avail_out == 0) return need_more; + } else { + /* There is no previous match to compare with, wait for + * the next step to decide. + */ + s->match_available = 1; + s->strstart++; + s->lookahead--; + } + } + Assert (flush != Z_NO_FLUSH, "no flush?"); + if (s->match_available) { + Tracevv((stderr,"%c", s->window[s->strstart-1])); + _tr_tally_lit(s, s->window[s->strstart-1], bflush); + s->match_available = 0; + } + s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; +} +#endif /* FASTEST */ + +/* =========================================================================== + * For Z_RLE, simply look for runs of bytes, generate matches only of distance + * one. Do not maintain a hash table. (It will be regenerated if this run of + * deflate switches away from Z_RLE.) + */ +local block_state deflate_rle(s, flush) + deflate_state *s; + int flush; +{ + int bflush; /* set if current block must be flushed */ + uInt prev; /* byte at distance one to match */ + Bytef *scan, *strend; /* scan goes up to strend for length of run */ + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the longest run, plus one for the unrolled loop. + */ + if (s->lookahead <= MAX_MATCH) { + fill_window(s); + if (s->lookahead <= MAX_MATCH && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* See how many times the previous byte repeats */ + s->match_length = 0; + if (s->lookahead >= MIN_MATCH && s->strstart > 0) { + scan = s->window + s->strstart - 1; + prev = *scan; + if (prev == *++scan && prev == *++scan && prev == *++scan) { + strend = s->window + s->strstart + MAX_MATCH; + do { + } while (prev == *++scan && prev == *++scan && + prev == *++scan && prev == *++scan && + prev == *++scan && prev == *++scan && + prev == *++scan && prev == *++scan && + scan < strend); + s->match_length = MAX_MATCH - (int)(strend - scan); + if (s->match_length > s->lookahead) + s->match_length = s->lookahead; + } + Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); + } + + /* Emit match if have run of MIN_MATCH or longer, else emit literal */ + if (s->match_length >= MIN_MATCH) { + check_match(s, s->strstart, s->strstart - 1, s->match_length); + + _tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush); + + s->lookahead -= s->match_length; + s->strstart += s->match_length; + s->match_length = 0; + } else { + /* No match, output a literal byte */ + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + } + if (bflush) FLUSH_BLOCK(s, 0); + } + s->insert = 0; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; +} + +/* =========================================================================== + * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. + * (It will be regenerated if this run of deflate switches away from Huffman.) + */ +local block_state deflate_huff(s, flush) + deflate_state *s; + int flush; +{ + int bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we have a literal to write. */ + if (s->lookahead == 0) { + fill_window(s); + if (s->lookahead == 0) { + if (flush == Z_NO_FLUSH) + return need_more; + break; /* flush the current block */ + } + } + + /* Output a literal byte */ + s->match_length = 0; + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + if (bflush) FLUSH_BLOCK(s, 0); + } + s->insert = 0; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; +} diff --git a/vendors/zlib/deflate.h b/vendors/zlib/deflate.h new file mode 100644 index 0000000..ce0299e --- /dev/null +++ b/vendors/zlib/deflate.h @@ -0,0 +1,346 @@ +/* deflate.h -- internal compression state + * Copyright (C) 1995-2012 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id$ */ + +#ifndef DEFLATE_H +#define DEFLATE_H + +#include "zutil.h" + +/* define NO_GZIP when compiling if you want to disable gzip header and + trailer creation by deflate(). NO_GZIP would be used to avoid linking in + the crc code when it is not needed. For shared libraries, gzip encoding + should be left enabled. */ +#ifndef NO_GZIP +# define GZIP +#endif + +/* =========================================================================== + * Internal compression state. + */ + +#define LENGTH_CODES 29 +/* number of length codes, not counting the special END_BLOCK code */ + +#define LITERALS 256 +/* number of literal bytes 0..255 */ + +#define L_CODES (LITERALS+1+LENGTH_CODES) +/* number of Literal or Length codes, including the END_BLOCK code */ + +#define D_CODES 30 +/* number of distance codes */ + +#define BL_CODES 19 +/* number of codes used to transfer the bit lengths */ + +#define HEAP_SIZE (2*L_CODES+1) +/* maximum heap size */ + +#define MAX_BITS 15 +/* All codes must not exceed MAX_BITS bits */ + +#define Buf_size 16 +/* size of bit buffer in bi_buf */ + +#define INIT_STATE 42 +#define EXTRA_STATE 69 +#define NAME_STATE 73 +#define COMMENT_STATE 91 +#define HCRC_STATE 103 +#define BUSY_STATE 113 +#define FINISH_STATE 666 +/* Stream status */ + + +/* Data structure describing a single value and its code string. */ +typedef struct ct_data_s { + union { + ush freq; /* frequency count */ + ush code; /* bit string */ + } fc; + union { + ush dad; /* father node in Huffman tree */ + ush len; /* length of bit string */ + } dl; +} FAR ct_data; + +#define Freq fc.freq +#define Code fc.code +#define Dad dl.dad +#define Len dl.len + +typedef struct static_tree_desc_s static_tree_desc; + +typedef struct tree_desc_s { + ct_data *dyn_tree; /* the dynamic tree */ + int max_code; /* largest code with non zero frequency */ + static_tree_desc *stat_desc; /* the corresponding static tree */ +} FAR tree_desc; + +typedef ush Pos; +typedef Pos FAR Posf; +typedef unsigned IPos; + +/* A Pos is an index in the character window. We use short instead of int to + * save space in the various tables. IPos is used only for parameter passing. + */ + +typedef struct internal_state { + z_streamp strm; /* pointer back to this zlib stream */ + int status; /* as the name implies */ + Bytef *pending_buf; /* output still pending */ + ulg pending_buf_size; /* size of pending_buf */ + Bytef *pending_out; /* next pending byte to output to the stream */ + uInt pending; /* nb of bytes in the pending buffer */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ + gz_headerp gzhead; /* gzip header information to write */ + uInt gzindex; /* where in extra, name, or comment */ + Byte method; /* can only be DEFLATED */ + int last_flush; /* value of flush param for previous deflate call */ + + /* used by deflate.c: */ + + uInt w_size; /* LZ77 window size (32K by default) */ + uInt w_bits; /* log2(w_size) (8..16) */ + uInt w_mask; /* w_size - 1 */ + + Bytef *window; + /* Sliding window. Input bytes are read into the second half of the window, + * and move to the first half later to keep a dictionary of at least wSize + * bytes. With this organization, matches are limited to a distance of + * wSize-MAX_MATCH bytes, but this ensures that IO is always + * performed with a length multiple of the block size. Also, it limits + * the window size to 64K, which is quite useful on MSDOS. + * To do: use the user input buffer as sliding window. + */ + + ulg window_size; + /* Actual size of window: 2*wSize, except when the user input buffer + * is directly used as sliding window. + */ + + Posf *prev; + /* Link to older string with same hash index. To limit the size of this + * array to 64K, this link is maintained only for the last 32K strings. + * An index in this array is thus a window index modulo 32K. + */ + + Posf *head; /* Heads of the hash chains or NIL. */ + + uInt ins_h; /* hash index of string to be inserted */ + uInt hash_size; /* number of elements in hash table */ + uInt hash_bits; /* log2(hash_size) */ + uInt hash_mask; /* hash_size-1 */ + + uInt hash_shift; + /* Number of bits by which ins_h must be shifted at each input + * step. It must be such that after MIN_MATCH steps, the oldest + * byte no longer takes part in the hash key, that is: + * hash_shift * MIN_MATCH >= hash_bits + */ + + long block_start; + /* Window position at the beginning of the current output block. Gets + * negative when the window is moved backwards. + */ + + uInt match_length; /* length of best match */ + IPos prev_match; /* previous match */ + int match_available; /* set if previous match exists */ + uInt strstart; /* start of string to insert */ + uInt match_start; /* start of matching string */ + uInt lookahead; /* number of valid bytes ahead in window */ + + uInt prev_length; + /* Length of the best match at previous step. Matches not greater than this + * are discarded. This is used in the lazy match evaluation. + */ + + uInt max_chain_length; + /* To speed up deflation, hash chains are never searched beyond this + * length. A higher limit improves compression ratio but degrades the + * speed. + */ + + uInt max_lazy_match; + /* Attempt to find a better match only when the current match is strictly + * smaller than this value. This mechanism is used only for compression + * levels >= 4. + */ +# define max_insert_length max_lazy_match + /* Insert new strings in the hash table only if the match length is not + * greater than this length. This saves time but degrades compression. + * max_insert_length is used only for compression levels <= 3. + */ + + int level; /* compression level (1..9) */ + int strategy; /* favor or force Huffman coding*/ + + uInt good_match; + /* Use a faster search when the previous match is longer than this */ + + int nice_match; /* Stop searching when current match exceeds this */ + + /* used by trees.c: */ + /* Didn't use ct_data typedef below to suppress compiler warning */ + struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ + struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ + struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ + + struct tree_desc_s l_desc; /* desc. for literal tree */ + struct tree_desc_s d_desc; /* desc. for distance tree */ + struct tree_desc_s bl_desc; /* desc. for bit length tree */ + + ush bl_count[MAX_BITS+1]; + /* number of codes at each bit length for an optimal tree */ + + int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ + int heap_len; /* number of elements in the heap */ + int heap_max; /* element of largest frequency */ + /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. + * The same heap array is used to build all trees. + */ + + uch depth[2*L_CODES+1]; + /* Depth of each subtree used as tie breaker for trees of equal frequency + */ + + uchf *l_buf; /* buffer for literals or lengths */ + + uInt lit_bufsize; + /* Size of match buffer for literals/lengths. There are 4 reasons for + * limiting lit_bufsize to 64K: + * - frequencies can be kept in 16 bit counters + * - if compression is not successful for the first block, all input + * data is still in the window so we can still emit a stored block even + * when input comes from standard input. (This can also be done for + * all blocks if lit_bufsize is not greater than 32K.) + * - if compression is not successful for a file smaller than 64K, we can + * even emit a stored file instead of a stored block (saving 5 bytes). + * This is applicable only for zip (not gzip or zlib). + * - creating new Huffman trees less frequently may not provide fast + * adaptation to changes in the input data statistics. (Take for + * example a binary file with poorly compressible code followed by + * a highly compressible string table.) Smaller buffer sizes give + * fast adaptation but have of course the overhead of transmitting + * trees more frequently. + * - I can't count above 4 + */ + + uInt last_lit; /* running index in l_buf */ + + ushf *d_buf; + /* Buffer for distances. To simplify the code, d_buf and l_buf have + * the same number of elements. To use different lengths, an extra flag + * array would be necessary. + */ + + ulg opt_len; /* bit length of current block with optimal trees */ + ulg static_len; /* bit length of current block with static trees */ + uInt matches; /* number of string matches in current block */ + uInt insert; /* bytes at end of window left to insert */ + +#ifdef DEBUG + ulg compressed_len; /* total bit length of compressed file mod 2^32 */ + ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ +#endif + + ush bi_buf; + /* Output buffer. bits are inserted starting at the bottom (least + * significant bits). + */ + int bi_valid; + /* Number of valid bits in bi_buf. All bits above the last valid bit + * are always zero. + */ + + ulg high_water; + /* High water mark offset in window for initialized bytes -- bytes above + * this are set to zero in order to avoid memory check warnings when + * longest match routines access bytes past the input. This is then + * updated to the new high water mark. + */ + +} FAR deflate_state; + +/* Output a byte on the stream. + * IN assertion: there is enough room in pending_buf. + */ +#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);} + + +#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) +/* Minimum amount of lookahead, except at the end of the input file. + * See deflate.c for comments about the MIN_MATCH+1. + */ + +#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) +/* In order to simplify the code, particularly on 16 bit machines, match + * distances are limited to MAX_DIST instead of WSIZE. + */ + +#define WIN_INIT MAX_MATCH +/* Number of bytes after end of data in window to initialize in order to avoid + memory checker errors from longest match routines */ + + /* in trees.c */ +void ZLIB_INTERNAL _tr_init OF((deflate_state *s)); +int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); +void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf, + ulg stored_len, int last)); +void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s)); +void ZLIB_INTERNAL _tr_align OF((deflate_state *s)); +void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, + ulg stored_len, int last)); + +#define d_code(dist) \ + ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) +/* Mapping from a distance to a distance code. dist is the distance - 1 and + * must not have side effects. _dist_code[256] and _dist_code[257] are never + * used. + */ + +#ifndef DEBUG +/* Inline versions of _tr_tally for speed: */ + +#if defined(GEN_TREES_H) || !defined(STDC) + extern uch ZLIB_INTERNAL _length_code[]; + extern uch ZLIB_INTERNAL _dist_code[]; +#else + extern const uch ZLIB_INTERNAL _length_code[]; + extern const uch ZLIB_INTERNAL _dist_code[]; +#endif + +# define _tr_tally_lit(s, c, flush) \ + { uch cc = (c); \ + s->d_buf[s->last_lit] = 0; \ + s->l_buf[s->last_lit++] = cc; \ + s->dyn_ltree[cc].Freq++; \ + flush = (s->last_lit == s->lit_bufsize-1); \ + } +# define _tr_tally_dist(s, distance, length, flush) \ + { uch len = (length); \ + ush dist = (distance); \ + s->d_buf[s->last_lit] = dist; \ + s->l_buf[s->last_lit++] = len; \ + dist--; \ + s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ + s->dyn_dtree[d_code(dist)].Freq++; \ + flush = (s->last_lit == s->lit_bufsize-1); \ + } +#else +# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) +# define _tr_tally_dist(s, distance, length, flush) \ + flush = _tr_tally(s, distance, length) +#endif + +#endif /* DEFLATE_H */ diff --git a/vendors/zlib/gzclose.c b/vendors/zlib/gzclose.c new file mode 100644 index 0000000..caeb99a --- /dev/null +++ b/vendors/zlib/gzclose.c @@ -0,0 +1,25 @@ +/* gzclose.c -- zlib gzclose() function + * Copyright (C) 2004, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +/* gzclose() is in a separate file so that it is linked in only if it is used. + That way the other gzclose functions can be used instead to avoid linking in + unneeded compression or decompression routines. */ +int ZEXPORT gzclose(file) + gzFile file; +{ +#ifndef NO_GZCOMPRESS + gz_statep state; + + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + + return state->mode == GZ_READ ? gzclose_r(file) : gzclose_w(file); +#else + return gzclose_r(file); +#endif +} diff --git a/vendors/zlib/gzguts.h b/vendors/zlib/gzguts.h new file mode 100644 index 0000000..d87659d --- /dev/null +++ b/vendors/zlib/gzguts.h @@ -0,0 +1,209 @@ +/* gzguts.h -- zlib internal header definitions for gz* operations + * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#ifdef _LARGEFILE64_SOURCE +# ifndef _LARGEFILE_SOURCE +# define _LARGEFILE_SOURCE 1 +# endif +# ifdef _FILE_OFFSET_BITS +# undef _FILE_OFFSET_BITS +# endif +#endif + +#ifdef HAVE_HIDDEN +# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +#else +# define ZLIB_INTERNAL +#endif + +#include +#include "zlib.h" +#ifdef STDC +# include +# include +# include +#endif +#include + +#ifdef _WIN32 +# include +#endif + +#if defined(__TURBOC__) || defined(_MSC_VER) || defined(_WIN32) +# include +#endif + +#ifdef WINAPI_FAMILY +# define open _open +# define read _read +# define write _write +# define close _close +#endif + +#ifdef NO_DEFLATE /* for compatibility with old definition */ +# define NO_GZCOMPRESS +#endif + +#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#if defined(__CYGWIN__) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#if defined(MSDOS) && defined(__BORLANDC__) && (BORLANDC > 0x410) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#ifndef HAVE_VSNPRINTF +# ifdef MSDOS +/* vsnprintf may exist on some MS-DOS compilers (DJGPP?), + but for now we just assume it doesn't. */ +# define NO_vsnprintf +# endif +# ifdef __TURBOC__ +# define NO_vsnprintf +# endif +# ifdef WIN32 +/* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ +# if !defined(vsnprintf) && !defined(NO_vsnprintf) +# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 ) +# define vsnprintf _vsnprintf +# endif +# endif +# endif +# ifdef __SASC +# define NO_vsnprintf +# endif +# ifdef VMS +# define NO_vsnprintf +# endif +# ifdef __OS400__ +# define NO_vsnprintf +# endif +# ifdef __MVS__ +# define NO_vsnprintf +# endif +#endif + +/* unlike snprintf (which is required in C99, yet still not supported by + Microsoft more than a decade later!), _snprintf does not guarantee null + termination of the result -- however this is only used in gzlib.c where + the result is assured to fit in the space provided */ +#ifdef _MSC_VER +# define snprintf _snprintf +#endif + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + +/* gz* functions always use library allocation functions */ +#ifndef STDC + extern voidp malloc OF((uInt size)); + extern void free OF((voidpf ptr)); +#endif + +/* get errno and strerror definition */ +#if defined UNDER_CE +# include +# define zstrerror() gz_strwinerror((DWORD)GetLastError()) +#else +# ifndef NO_STRERROR +# include +# define zstrerror() strerror(errno) +# else +# define zstrerror() "stdio error (consult errno)" +# endif +#endif + +/* provide prototypes for these when building zlib without LFS */ +#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); + ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); +#endif + +/* default memLevel */ +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif + +/* default i/o buffer size -- double this for output when reading (this and + twice this must be able to fit in an unsigned type) */ +#define GZBUFSIZE 8192 + +/* gzip modes, also provide a little integrity check on the passed structure */ +#define GZ_NONE 0 +#define GZ_READ 7247 +#define GZ_WRITE 31153 +#define GZ_APPEND 1 /* mode set to GZ_WRITE after the file is opened */ + +/* values for gz_state how */ +#define LOOK 0 /* look for a gzip header */ +#define COPY 1 /* copy input directly */ +#define GZIP 2 /* decompress a gzip stream */ + +/* internal gzip file state data structure */ +typedef struct { + /* exposed contents for gzgetc() macro */ + struct gzFile_s x; /* "x" for exposed */ + /* x.have: number of bytes available at x.next */ + /* x.next: next output data to deliver or write */ + /* x.pos: current position in uncompressed data */ + /* used for both reading and writing */ + int mode; /* see gzip modes above */ + int fd; /* file descriptor */ + char *path; /* path or fd for error messages */ + unsigned size; /* buffer size, zero if not allocated yet */ + unsigned want; /* requested buffer size, default is GZBUFSIZE */ + unsigned char *in; /* input buffer */ + unsigned char *out; /* output buffer (double-sized when reading) */ + int direct; /* 0 if processing gzip, 1 if transparent */ + /* just for reading */ + int how; /* 0: get header, 1: copy, 2: decompress */ + z_off64_t start; /* where the gzip data started, for rewinding */ + int eof; /* true if end of input file reached */ + int past; /* true if read requested past end */ + /* just for writing */ + int level; /* compression level */ + int strategy; /* compression strategy */ + /* seek request */ + z_off64_t skip; /* amount to skip (already rewound if backwards) */ + int seek; /* true if seek request pending */ + /* error information */ + int err; /* error code */ + char *msg; /* error message */ + /* zlib inflate or deflate stream */ + z_stream strm; /* stream structure in-place (not a pointer) */ +} gz_state; +typedef gz_state FAR *gz_statep; + +/* shared functions */ +void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *)); +#if defined UNDER_CE +char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error)); +#endif + +/* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t + value -- needed when comparing unsigned to z_off64_t, which is signed + (possible z_off64_t types off_t, off64_t, and long are all signed) */ +#ifdef INT_MAX +# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX) +#else +unsigned ZLIB_INTERNAL gz_intmax OF((void)); +# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax()) +#endif diff --git a/vendors/zlib/gzlib.c b/vendors/zlib/gzlib.c new file mode 100644 index 0000000..fae202e --- /dev/null +++ b/vendors/zlib/gzlib.c @@ -0,0 +1,634 @@ +/* gzlib.c -- zlib functions common to reading and writing gzip files + * Copyright (C) 2004, 2010, 2011, 2012, 2013 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +#if defined(_WIN32) && !defined(__BORLANDC__) +# define LSEEK _lseeki64 +#else +#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 +# define LSEEK lseek64 +#else +# define LSEEK lseek +#endif +#endif + +/* Local functions */ +local void gz_reset OF((gz_statep)); +local gzFile gz_open OF((const void *, int, const char *)); + +#if defined UNDER_CE + +/* Map the Windows error number in ERROR to a locale-dependent error message + string and return a pointer to it. Typically, the values for ERROR come + from GetLastError. + + The string pointed to shall not be modified by the application, but may be + overwritten by a subsequent call to gz_strwinerror + + The gz_strwinerror function does not change the current setting of + GetLastError. */ +char ZLIB_INTERNAL *gz_strwinerror (error) + DWORD error; +{ + static char buf[1024]; + + wchar_t *msgbuf; + DWORD lasterr = GetLastError(); + DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM + | FORMAT_MESSAGE_ALLOCATE_BUFFER, + NULL, + error, + 0, /* Default language */ + (LPVOID)&msgbuf, + 0, + NULL); + if (chars != 0) { + /* If there is an \r\n appended, zap it. */ + if (chars >= 2 + && msgbuf[chars - 2] == '\r' && msgbuf[chars - 1] == '\n') { + chars -= 2; + msgbuf[chars] = 0; + } + + if (chars > sizeof (buf) - 1) { + chars = sizeof (buf) - 1; + msgbuf[chars] = 0; + } + + wcstombs(buf, msgbuf, chars + 1); + LocalFree(msgbuf); + } + else { + sprintf(buf, "unknown win32 error (%ld)", error); + } + + SetLastError(lasterr); + return buf; +} + +#endif /* UNDER_CE */ + +/* Reset gzip file state */ +local void gz_reset(state) + gz_statep state; +{ + state->x.have = 0; /* no output data available */ + if (state->mode == GZ_READ) { /* for reading ... */ + state->eof = 0; /* not at end of file */ + state->past = 0; /* have not read past end yet */ + state->how = LOOK; /* look for gzip header */ + } + state->seek = 0; /* no seek request pending */ + gz_error(state, Z_OK, NULL); /* clear error */ + state->x.pos = 0; /* no uncompressed data yet */ + state->strm.avail_in = 0; /* no input data yet */ +} + +/* Open a gzip file either by name or file descriptor. */ +local gzFile gz_open(path, fd, mode) + const void *path; + int fd; + const char *mode; +{ + gz_statep state; + size_t len; + int oflag; +#ifdef O_CLOEXEC + int cloexec = 0; +#endif +#ifdef O_EXCL + int exclusive = 0; +#endif + + /* check input */ + if (path == NULL) + return NULL; + + /* allocate gzFile structure to return */ + state = (gz_statep)malloc(sizeof(gz_state)); + if (state == NULL) + return NULL; + state->size = 0; /* no buffers allocated yet */ + state->want = GZBUFSIZE; /* requested buffer size */ + state->msg = NULL; /* no error message yet */ + + /* interpret mode */ + state->mode = GZ_NONE; + state->level = Z_DEFAULT_COMPRESSION; + state->strategy = Z_DEFAULT_STRATEGY; + state->direct = 0; + while (*mode) { + if (*mode >= '0' && *mode <= '9') + state->level = *mode - '0'; + else + switch (*mode) { + case 'r': + state->mode = GZ_READ; + break; +#ifndef NO_GZCOMPRESS + case 'w': + state->mode = GZ_WRITE; + break; + case 'a': + state->mode = GZ_APPEND; + break; +#endif + case '+': /* can't read and write at the same time */ + free(state); + return NULL; + case 'b': /* ignore -- will request binary anyway */ + break; +#ifdef O_CLOEXEC + case 'e': + cloexec = 1; + break; +#endif +#ifdef O_EXCL + case 'x': + exclusive = 1; + break; +#endif + case 'f': + state->strategy = Z_FILTERED; + break; + case 'h': + state->strategy = Z_HUFFMAN_ONLY; + break; + case 'R': + state->strategy = Z_RLE; + break; + case 'F': + state->strategy = Z_FIXED; + break; + case 'T': + state->direct = 1; + break; + default: /* could consider as an error, but just ignore */ + ; + } + mode++; + } + + /* must provide an "r", "w", or "a" */ + if (state->mode == GZ_NONE) { + free(state); + return NULL; + } + + /* can't force transparent read */ + if (state->mode == GZ_READ) { + if (state->direct) { + free(state); + return NULL; + } + state->direct = 1; /* for empty file */ + } + + /* save the path name for error messages */ +#ifdef _WIN32 + if (fd == -2) { + len = wcstombs(NULL, path, 0); + if (len == (size_t)-1) + len = 0; + } + else +#endif + len = strlen((const char *)path); + state->path = (char *)malloc(len + 1); + if (state->path == NULL) { + free(state); + return NULL; + } +#ifdef _WIN32 + if (fd == -2) + if (len) + wcstombs(state->path, path, len + 1); + else + *(state->path) = 0; + else +#endif +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + snprintf(state->path, len + 1, "%s", (const char *)path); +#else + strcpy(state->path, path); +#endif + + /* compute the flags for open() */ + oflag = +#ifdef O_LARGEFILE + O_LARGEFILE | +#endif +#ifdef O_BINARY + O_BINARY | +#endif +#ifdef O_CLOEXEC + (cloexec ? O_CLOEXEC : 0) | +#endif + (state->mode == GZ_READ ? + O_RDONLY : + (O_WRONLY | O_CREAT | +#ifdef O_EXCL + (exclusive ? O_EXCL : 0) | +#endif + (state->mode == GZ_WRITE ? + O_TRUNC : + O_APPEND))); + + /* open the file with the appropriate flags (or just use fd) */ + state->fd = fd > -1 ? fd : ( +#ifdef _WIN32 + fd == -2 ? _wopen(path, oflag, 0666) : +#endif + open((const char *)path, oflag, 0666)); + if (state->fd == -1) { + free(state->path); + free(state); + return NULL; + } + if (state->mode == GZ_APPEND) + state->mode = GZ_WRITE; /* simplify later checks */ + + /* save the current position for rewinding (only if reading) */ + if (state->mode == GZ_READ) { + state->start = LSEEK(state->fd, 0, SEEK_CUR); + if (state->start == -1) state->start = 0; + } + + /* initialize stream */ + gz_reset(state); + + /* return stream */ + return (gzFile)state; +} + +/* -- see zlib.h -- */ +gzFile ZEXPORT gzopen(path, mode) + const char *path; + const char *mode; +{ + return gz_open(path, -1, mode); +} + +/* -- see zlib.h -- */ +gzFile ZEXPORT gzopen64(path, mode) + const char *path; + const char *mode; +{ + return gz_open(path, -1, mode); +} + +/* -- see zlib.h -- */ +gzFile ZEXPORT gzdopen(fd, mode) + int fd; + const char *mode; +{ + char *path; /* identifier for error messages */ + gzFile gz; + + if (fd == -1 || (path = (char *)malloc(7 + 3 * sizeof(int))) == NULL) + return NULL; +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + snprintf(path, 7 + 3 * sizeof(int), "", fd); /* for debugging */ +#else + sprintf(path, "", fd); /* for debugging */ +#endif + gz = gz_open(path, fd, mode); + free(path); + return gz; +} + +/* -- see zlib.h -- */ +#ifdef _WIN32 +gzFile ZEXPORT gzopen_w(path, mode) + const wchar_t *path; + const char *mode; +{ + return gz_open(path, -2, mode); +} +#endif + +/* -- see zlib.h -- */ +int ZEXPORT gzbuffer(file, size) + gzFile file; + unsigned size; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* make sure we haven't already allocated memory */ + if (state->size != 0) + return -1; + + /* check and set requested size */ + if (size < 2) + size = 2; /* need two bytes to check magic header */ + state->want = size; + return 0; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzrewind(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return -1; + + /* back up and start over */ + if (LSEEK(state->fd, state->start, SEEK_SET) == -1) + return -1; + gz_reset(state); + return 0; +} + +/* -- see zlib.h -- */ +z_off64_t ZEXPORT gzseek64(file, offset, whence) + gzFile file; + z_off64_t offset; + int whence; +{ + unsigned n; + z_off64_t ret; + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* check that there's no error */ + if (state->err != Z_OK && state->err != Z_BUF_ERROR) + return -1; + + /* can only seek from start or relative to current position */ + if (whence != SEEK_SET && whence != SEEK_CUR) + return -1; + + /* normalize offset to a SEEK_CUR specification */ + if (whence == SEEK_SET) + offset -= state->x.pos; + else if (state->seek) + offset += state->skip; + state->seek = 0; + + /* if within raw area while reading, just go there */ + if (state->mode == GZ_READ && state->how == COPY && + state->x.pos + offset >= 0) { + ret = LSEEK(state->fd, offset - state->x.have, SEEK_CUR); + if (ret == -1) + return -1; + state->x.have = 0; + state->eof = 0; + state->past = 0; + state->seek = 0; + gz_error(state, Z_OK, NULL); + state->strm.avail_in = 0; + state->x.pos += offset; + return state->x.pos; + } + + /* calculate skip amount, rewinding if needed for back seek when reading */ + if (offset < 0) { + if (state->mode != GZ_READ) /* writing -- can't go backwards */ + return -1; + offset += state->x.pos; + if (offset < 0) /* before start of file! */ + return -1; + if (gzrewind(file) == -1) /* rewind, then skip to offset */ + return -1; + } + + /* if reading, skip what's in output buffer (one less gzgetc() check) */ + if (state->mode == GZ_READ) { + n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > offset ? + (unsigned)offset : state->x.have; + state->x.have -= n; + state->x.next += n; + state->x.pos += n; + offset -= n; + } + + /* request skip (if not zero) */ + if (offset) { + state->seek = 1; + state->skip = offset; + } + return state->x.pos + offset; +} + +/* -- see zlib.h -- */ +z_off_t ZEXPORT gzseek(file, offset, whence) + gzFile file; + z_off_t offset; + int whence; +{ + z_off64_t ret; + + ret = gzseek64(file, (z_off64_t)offset, whence); + return ret == (z_off_t)ret ? (z_off_t)ret : -1; +} + +/* -- see zlib.h -- */ +z_off64_t ZEXPORT gztell64(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* return position */ + return state->x.pos + (state->seek ? state->skip : 0); +} + +/* -- see zlib.h -- */ +z_off_t ZEXPORT gztell(file) + gzFile file; +{ + z_off64_t ret; + + ret = gztell64(file); + return ret == (z_off_t)ret ? (z_off_t)ret : -1; +} + +/* -- see zlib.h -- */ +z_off64_t ZEXPORT gzoffset64(file) + gzFile file; +{ + z_off64_t offset; + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* compute and return effective offset in file */ + offset = LSEEK(state->fd, 0, SEEK_CUR); + if (offset == -1) + return -1; + if (state->mode == GZ_READ) /* reading */ + offset -= state->strm.avail_in; /* don't count buffered input */ + return offset; +} + +/* -- see zlib.h -- */ +z_off_t ZEXPORT gzoffset(file) + gzFile file; +{ + z_off64_t ret; + + ret = gzoffset64(file); + return ret == (z_off_t)ret ? (z_off_t)ret : -1; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzeof(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return 0; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return 0; + + /* return end-of-file state */ + return state->mode == GZ_READ ? state->past : 0; +} + +/* -- see zlib.h -- */ +const char * ZEXPORT gzerror(file, errnum) + gzFile file; + int *errnum; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return NULL; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return NULL; + + /* return error information */ + if (errnum != NULL) + *errnum = state->err; + return state->err == Z_MEM_ERROR ? "out of memory" : + (state->msg == NULL ? "" : state->msg); +} + +/* -- see zlib.h -- */ +void ZEXPORT gzclearerr(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return; + + /* clear error and end-of-file */ + if (state->mode == GZ_READ) { + state->eof = 0; + state->past = 0; + } + gz_error(state, Z_OK, NULL); +} + +/* Create an error message in allocated memory and set state->err and + state->msg accordingly. Free any previous error message already there. Do + not try to free or allocate space if the error is Z_MEM_ERROR (out of + memory). Simply save the error message as a static string. If there is an + allocation failure constructing the error message, then convert the error to + out of memory. */ +void ZLIB_INTERNAL gz_error(state, err, msg) + gz_statep state; + int err; + const char *msg; +{ + /* free previously allocated message and clear */ + if (state->msg != NULL) { + if (state->err != Z_MEM_ERROR) + free(state->msg); + state->msg = NULL; + } + + /* if fatal, set state->x.have to 0 so that the gzgetc() macro fails */ + if (err != Z_OK && err != Z_BUF_ERROR) + state->x.have = 0; + + /* set error code, and if no message, then done */ + state->err = err; + if (msg == NULL) + return; + + /* for an out of memory error, return literal string when requested */ + if (err == Z_MEM_ERROR) + return; + + /* construct error message with path */ + if ((state->msg = (char *)malloc(strlen(state->path) + strlen(msg) + 3)) == + NULL) { + state->err = Z_MEM_ERROR; + return; + } +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + snprintf(state->msg, strlen(state->path) + strlen(msg) + 3, + "%s%s%s", state->path, ": ", msg); +#else + strcpy(state->msg, state->path); + strcat(state->msg, ": "); + strcat(state->msg, msg); +#endif + return; +} + +#ifndef INT_MAX +/* portably return maximum value for an int (when limits.h presumed not + available) -- we need to do this to cover cases where 2's complement not + used, since C standard permits 1's complement and sign-bit representations, + otherwise we could just use ((unsigned)-1) >> 1 */ +unsigned ZLIB_INTERNAL gz_intmax() +{ + unsigned p, q; + + p = 1; + do { + q = p; + p <<= 1; + p++; + } while (p > q); + return q >> 1; +} +#endif diff --git a/vendors/zlib/gzread.c b/vendors/zlib/gzread.c new file mode 100644 index 0000000..bf4538e --- /dev/null +++ b/vendors/zlib/gzread.c @@ -0,0 +1,594 @@ +/* gzread.c -- zlib functions for reading gzip files + * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +/* Local functions */ +local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *)); +local int gz_avail OF((gz_statep)); +local int gz_look OF((gz_statep)); +local int gz_decomp OF((gz_statep)); +local int gz_fetch OF((gz_statep)); +local int gz_skip OF((gz_statep, z_off64_t)); + +/* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from + state->fd, and update state->eof, state->err, and state->msg as appropriate. + This function needs to loop on read(), since read() is not guaranteed to + read the number of bytes requested, depending on the type of descriptor. */ +local int gz_load(state, buf, len, have) + gz_statep state; + unsigned char *buf; + unsigned len; + unsigned *have; +{ + int ret; + + *have = 0; + do { + ret = read(state->fd, buf + *have, len - *have); + if (ret <= 0) + break; + *have += ret; + } while (*have < len); + if (ret < 0) { + gz_error(state, Z_ERRNO, zstrerror()); + return -1; + } + if (ret == 0) + state->eof = 1; + return 0; +} + +/* Load up input buffer and set eof flag if last data loaded -- return -1 on + error, 0 otherwise. Note that the eof flag is set when the end of the input + file is reached, even though there may be unused data in the buffer. Once + that data has been used, no more attempts will be made to read the file. + If strm->avail_in != 0, then the current data is moved to the beginning of + the input buffer, and then the remainder of the buffer is loaded with the + available data from the input file. */ +local int gz_avail(state) + gz_statep state; +{ + unsigned got; + z_streamp strm = &(state->strm); + + if (state->err != Z_OK && state->err != Z_BUF_ERROR) + return -1; + if (state->eof == 0) { + if (strm->avail_in) { /* copy what's there to the start */ + unsigned char *p = state->in; + unsigned const char *q = strm->next_in; + unsigned n = strm->avail_in; + do { + *p++ = *q++; + } while (--n); + } + if (gz_load(state, state->in + strm->avail_in, + state->size - strm->avail_in, &got) == -1) + return -1; + strm->avail_in += got; + strm->next_in = state->in; + } + return 0; +} + +/* Look for gzip header, set up for inflate or copy. state->x.have must be 0. + If this is the first time in, allocate required memory. state->how will be + left unchanged if there is no more input data available, will be set to COPY + if there is no gzip header and direct copying will be performed, or it will + be set to GZIP for decompression. If direct copying, then leftover input + data from the input buffer will be copied to the output buffer. In that + case, all further file reads will be directly to either the output buffer or + a user buffer. If decompressing, the inflate state will be initialized. + gz_look() will return 0 on success or -1 on failure. */ +local int gz_look(state) + gz_statep state; +{ + z_streamp strm = &(state->strm); + + /* allocate read buffers and inflate memory */ + if (state->size == 0) { + /* allocate buffers */ + state->in = (unsigned char *)malloc(state->want); + state->out = (unsigned char *)malloc(state->want << 1); + if (state->in == NULL || state->out == NULL) { + if (state->out != NULL) + free(state->out); + if (state->in != NULL) + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + state->size = state->want; + + /* allocate inflate memory */ + state->strm.zalloc = Z_NULL; + state->strm.zfree = Z_NULL; + state->strm.opaque = Z_NULL; + state->strm.avail_in = 0; + state->strm.next_in = Z_NULL; + if (inflateInit2(&(state->strm), 15 + 16) != Z_OK) { /* gunzip */ + free(state->out); + free(state->in); + state->size = 0; + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + } + + /* get at least the magic bytes in the input buffer */ + if (strm->avail_in < 2) { + if (gz_avail(state) == -1) + return -1; + if (strm->avail_in == 0) + return 0; + } + + /* look for gzip magic bytes -- if there, do gzip decoding (note: there is + a logical dilemma here when considering the case of a partially written + gzip file, to wit, if a single 31 byte is written, then we cannot tell + whether this is a single-byte file, or just a partially written gzip + file -- for here we assume that if a gzip file is being written, then + the header will be written in a single operation, so that reading a + single byte is sufficient indication that it is not a gzip file) */ + if (strm->avail_in > 1 && + strm->next_in[0] == 31 && strm->next_in[1] == 139) { + inflateReset(strm); + state->how = GZIP; + state->direct = 0; + return 0; + } + + /* no gzip header -- if we were decoding gzip before, then this is trailing + garbage. Ignore the trailing garbage and finish. */ + if (state->direct == 0) { + strm->avail_in = 0; + state->eof = 1; + state->x.have = 0; + return 0; + } + + /* doing raw i/o, copy any leftover input to output -- this assumes that + the output buffer is larger than the input buffer, which also assures + space for gzungetc() */ + state->x.next = state->out; + if (strm->avail_in) { + memcpy(state->x.next, strm->next_in, strm->avail_in); + state->x.have = strm->avail_in; + strm->avail_in = 0; + } + state->how = COPY; + state->direct = 1; + return 0; +} + +/* Decompress from input to the provided next_out and avail_out in the state. + On return, state->x.have and state->x.next point to the just decompressed + data. If the gzip stream completes, state->how is reset to LOOK to look for + the next gzip stream or raw data, once state->x.have is depleted. Returns 0 + on success, -1 on failure. */ +local int gz_decomp(state) + gz_statep state; +{ + int ret = Z_OK; + unsigned had; + z_streamp strm = &(state->strm); + + /* fill output buffer up to end of deflate stream */ + had = strm->avail_out; + do { + /* get more input for inflate() */ + if (strm->avail_in == 0 && gz_avail(state) == -1) + return -1; + if (strm->avail_in == 0) { + gz_error(state, Z_BUF_ERROR, "unexpected end of file"); + break; + } + + /* decompress and handle errors */ + ret = inflate(strm, Z_NO_FLUSH); + if (ret == Z_STREAM_ERROR || ret == Z_NEED_DICT) { + gz_error(state, Z_STREAM_ERROR, + "internal error: inflate stream corrupt"); + return -1; + } + if (ret == Z_MEM_ERROR) { + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + if (ret == Z_DATA_ERROR) { /* deflate stream invalid */ + gz_error(state, Z_DATA_ERROR, + strm->msg == NULL ? "compressed data error" : strm->msg); + return -1; + } + } while (strm->avail_out && ret != Z_STREAM_END); + + /* update available output */ + state->x.have = had - strm->avail_out; + state->x.next = strm->next_out - state->x.have; + + /* if the gzip stream completed successfully, look for another */ + if (ret == Z_STREAM_END) + state->how = LOOK; + + /* good decompression */ + return 0; +} + +/* Fetch data and put it in the output buffer. Assumes state->x.have is 0. + Data is either copied from the input file or decompressed from the input + file depending on state->how. If state->how is LOOK, then a gzip header is + looked for to determine whether to copy or decompress. Returns -1 on error, + otherwise 0. gz_fetch() will leave state->how as COPY or GZIP unless the + end of the input file has been reached and all data has been processed. */ +local int gz_fetch(state) + gz_statep state; +{ + z_streamp strm = &(state->strm); + + do { + switch(state->how) { + case LOOK: /* -> LOOK, COPY (only if never GZIP), or GZIP */ + if (gz_look(state) == -1) + return -1; + if (state->how == LOOK) + return 0; + break; + case COPY: /* -> COPY */ + if (gz_load(state, state->out, state->size << 1, &(state->x.have)) + == -1) + return -1; + state->x.next = state->out; + return 0; + case GZIP: /* -> GZIP or LOOK (if end of gzip stream) */ + strm->avail_out = state->size << 1; + strm->next_out = state->out; + if (gz_decomp(state) == -1) + return -1; + } + } while (state->x.have == 0 && (!state->eof || strm->avail_in)); + return 0; +} + +/* Skip len uncompressed bytes of output. Return -1 on error, 0 on success. */ +local int gz_skip(state, len) + gz_statep state; + z_off64_t len; +{ + unsigned n; + + /* skip over len bytes or reach end-of-file, whichever comes first */ + while (len) + /* skip over whatever is in output buffer */ + if (state->x.have) { + n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > len ? + (unsigned)len : state->x.have; + state->x.have -= n; + state->x.next += n; + state->x.pos += n; + len -= n; + } + + /* output buffer empty -- return if we're at the end of the input */ + else if (state->eof && state->strm.avail_in == 0) + break; + + /* need more data to skip -- load up output buffer */ + else { + /* get more output, looking for header if required */ + if (gz_fetch(state) == -1) + return -1; + } + return 0; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzread(file, buf, len) + gzFile file; + voidp buf; + unsigned len; +{ + unsigned got, n; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return -1; + + /* since an int is returned, make sure len fits in one, otherwise return + with an error (this avoids the flaw in the interface) */ + if ((int)len < 0) { + gz_error(state, Z_DATA_ERROR, "requested length does not fit in int"); + return -1; + } + + /* if len is zero, avoid unnecessary operations */ + if (len == 0) + return 0; + + /* process a skip request */ + if (state->seek) { + state->seek = 0; + if (gz_skip(state, state->skip) == -1) + return -1; + } + + /* get len bytes to buf, or less than len if at the end */ + got = 0; + do { + /* first just try copying data from the output buffer */ + if (state->x.have) { + n = state->x.have > len ? len : state->x.have; + memcpy(buf, state->x.next, n); + state->x.next += n; + state->x.have -= n; + } + + /* output buffer empty -- return if we're at the end of the input */ + else if (state->eof && strm->avail_in == 0) { + state->past = 1; /* tried to read past end */ + break; + } + + /* need output data -- for small len or new stream load up our output + buffer */ + else if (state->how == LOOK || len < (state->size << 1)) { + /* get more output, looking for header if required */ + if (gz_fetch(state) == -1) + return -1; + continue; /* no progress yet -- go back to copy above */ + /* the copy above assures that we will leave with space in the + output buffer, allowing at least one gzungetc() to succeed */ + } + + /* large len -- read directly into user buffer */ + else if (state->how == COPY) { /* read directly */ + if (gz_load(state, (unsigned char *)buf, len, &n) == -1) + return -1; + } + + /* large len -- decompress directly into user buffer */ + else { /* state->how == GZIP */ + strm->avail_out = len; + strm->next_out = (unsigned char *)buf; + if (gz_decomp(state) == -1) + return -1; + n = state->x.have; + state->x.have = 0; + } + + /* update progress */ + len -= n; + buf = (char *)buf + n; + got += n; + state->x.pos += n; + } while (len); + + /* return number of bytes read into user buffer (will fit in int) */ + return (int)got; +} + +/* -- see zlib.h -- */ +#ifdef Z_PREFIX_SET +# undef z_gzgetc +#else +# undef gzgetc +#endif +int ZEXPORT gzgetc(file) + gzFile file; +{ + int ret; + unsigned char buf[1]; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return -1; + + /* try output buffer (no need to check for skip request) */ + if (state->x.have) { + state->x.have--; + state->x.pos++; + return *(state->x.next)++; + } + + /* nothing there -- try gzread() */ + ret = gzread(file, buf, 1); + return ret < 1 ? -1 : buf[0]; +} + +int ZEXPORT gzgetc_(file) +gzFile file; +{ + return gzgetc(file); +} + +/* -- see zlib.h -- */ +int ZEXPORT gzungetc(c, file) + int c; + gzFile file; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return -1; + + /* process a skip request */ + if (state->seek) { + state->seek = 0; + if (gz_skip(state, state->skip) == -1) + return -1; + } + + /* can't push EOF */ + if (c < 0) + return -1; + + /* if output buffer empty, put byte at end (allows more pushing) */ + if (state->x.have == 0) { + state->x.have = 1; + state->x.next = state->out + (state->size << 1) - 1; + state->x.next[0] = c; + state->x.pos--; + state->past = 0; + return c; + } + + /* if no room, give up (must have already done a gzungetc()) */ + if (state->x.have == (state->size << 1)) { + gz_error(state, Z_DATA_ERROR, "out of room to push characters"); + return -1; + } + + /* slide output data if needed and insert byte before existing data */ + if (state->x.next == state->out) { + unsigned char *src = state->out + state->x.have; + unsigned char *dest = state->out + (state->size << 1); + while (src > state->out) + *--dest = *--src; + state->x.next = dest; + } + state->x.have++; + state->x.next--; + state->x.next[0] = c; + state->x.pos--; + state->past = 0; + return c; +} + +/* -- see zlib.h -- */ +char * ZEXPORT gzgets(file, buf, len) + gzFile file; + char *buf; + int len; +{ + unsigned left, n; + char *str; + unsigned char *eol; + gz_statep state; + + /* check parameters and get internal structure */ + if (file == NULL || buf == NULL || len < 1) + return NULL; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return NULL; + + /* process a skip request */ + if (state->seek) { + state->seek = 0; + if (gz_skip(state, state->skip) == -1) + return NULL; + } + + /* copy output bytes up to new line or len - 1, whichever comes first -- + append a terminating zero to the string (we don't check for a zero in + the contents, let the user worry about that) */ + str = buf; + left = (unsigned)len - 1; + if (left) do { + /* assure that something is in the output buffer */ + if (state->x.have == 0 && gz_fetch(state) == -1) + return NULL; /* error */ + if (state->x.have == 0) { /* end of file */ + state->past = 1; /* read past end */ + break; /* return what we have */ + } + + /* look for end-of-line in current output buffer */ + n = state->x.have > left ? left : state->x.have; + eol = (unsigned char *)memchr(state->x.next, '\n', n); + if (eol != NULL) + n = (unsigned)(eol - state->x.next) + 1; + + /* copy through end-of-line, or remainder if not found */ + memcpy(buf, state->x.next, n); + state->x.have -= n; + state->x.next += n; + state->x.pos += n; + left -= n; + buf += n; + } while (left && eol == NULL); + + /* return terminated string, or if nothing, end of file */ + if (buf == str) + return NULL; + buf[0] = 0; + return str; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzdirect(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return 0; + state = (gz_statep)file; + + /* if the state is not known, but we can find out, then do so (this is + mainly for right after a gzopen() or gzdopen()) */ + if (state->mode == GZ_READ && state->how == LOOK && state->x.have == 0) + (void)gz_look(state); + + /* return 1 if transparent, 0 if processing a gzip stream */ + return state->direct; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzclose_r(file) + gzFile file; +{ + int ret, err; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + + /* check that we're reading */ + if (state->mode != GZ_READ) + return Z_STREAM_ERROR; + + /* free memory and close file */ + if (state->size) { + inflateEnd(&(state->strm)); + free(state->out); + free(state->in); + } + err = state->err == Z_BUF_ERROR ? Z_BUF_ERROR : Z_OK; + gz_error(state, Z_OK, NULL); + free(state->path); + ret = close(state->fd); + free(state); + return ret ? Z_ERRNO : err; +} diff --git a/vendors/zlib/gzwrite.c b/vendors/zlib/gzwrite.c new file mode 100644 index 0000000..aa767fb --- /dev/null +++ b/vendors/zlib/gzwrite.c @@ -0,0 +1,577 @@ +/* gzwrite.c -- zlib functions for writing gzip files + * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +/* Local functions */ +local int gz_init OF((gz_statep)); +local int gz_comp OF((gz_statep, int)); +local int gz_zero OF((gz_statep, z_off64_t)); + +/* Initialize state for writing a gzip file. Mark initialization by setting + state->size to non-zero. Return -1 on failure or 0 on success. */ +local int gz_init(state) + gz_statep state; +{ + int ret; + z_streamp strm = &(state->strm); + + /* allocate input buffer */ + state->in = (unsigned char *)malloc(state->want); + if (state->in == NULL) { + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + + /* only need output buffer and deflate state if compressing */ + if (!state->direct) { + /* allocate output buffer */ + state->out = (unsigned char *)malloc(state->want); + if (state->out == NULL) { + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + + /* allocate deflate memory, set up for gzip compression */ + strm->zalloc = Z_NULL; + strm->zfree = Z_NULL; + strm->opaque = Z_NULL; + ret = deflateInit2(strm, state->level, Z_DEFLATED, + MAX_WBITS + 16, DEF_MEM_LEVEL, state->strategy); + if (ret != Z_OK) { + free(state->out); + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + } + + /* mark state as initialized */ + state->size = state->want; + + /* initialize write buffer if compressing */ + if (!state->direct) { + strm->avail_out = state->size; + strm->next_out = state->out; + state->x.next = strm->next_out; + } + return 0; +} + +/* Compress whatever is at avail_in and next_in and write to the output file. + Return -1 if there is an error writing to the output file, otherwise 0. + flush is assumed to be a valid deflate() flush value. If flush is Z_FINISH, + then the deflate() state is reset to start a new gzip stream. If gz->direct + is true, then simply write to the output file without compressing, and + ignore flush. */ +local int gz_comp(state, flush) + gz_statep state; + int flush; +{ + int ret, got; + unsigned have; + z_streamp strm = &(state->strm); + + /* allocate memory if this is the first time through */ + if (state->size == 0 && gz_init(state) == -1) + return -1; + + /* write directly if requested */ + if (state->direct) { + got = write(state->fd, strm->next_in, strm->avail_in); + if (got < 0 || (unsigned)got != strm->avail_in) { + gz_error(state, Z_ERRNO, zstrerror()); + return -1; + } + strm->avail_in = 0; + return 0; + } + + /* run deflate() on provided input until it produces no more output */ + ret = Z_OK; + do { + /* write out current buffer contents if full, or if flushing, but if + doing Z_FINISH then don't write until we get to Z_STREAM_END */ + if (strm->avail_out == 0 || (flush != Z_NO_FLUSH && + (flush != Z_FINISH || ret == Z_STREAM_END))) { + have = (unsigned)(strm->next_out - state->x.next); + if (have && ((got = write(state->fd, state->x.next, have)) < 0 || + (unsigned)got != have)) { + gz_error(state, Z_ERRNO, zstrerror()); + return -1; + } + if (strm->avail_out == 0) { + strm->avail_out = state->size; + strm->next_out = state->out; + } + state->x.next = strm->next_out; + } + + /* compress */ + have = strm->avail_out; + ret = deflate(strm, flush); + if (ret == Z_STREAM_ERROR) { + gz_error(state, Z_STREAM_ERROR, + "internal error: deflate stream corrupt"); + return -1; + } + have -= strm->avail_out; + } while (have); + + /* if that completed a deflate stream, allow another to start */ + if (flush == Z_FINISH) + deflateReset(strm); + + /* all done, no errors */ + return 0; +} + +/* Compress len zeros to output. Return -1 on error, 0 on success. */ +local int gz_zero(state, len) + gz_statep state; + z_off64_t len; +{ + int first; + unsigned n; + z_streamp strm = &(state->strm); + + /* consume whatever's left in the input buffer */ + if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + return -1; + + /* compress len zeros (len guaranteed > 0) */ + first = 1; + while (len) { + n = GT_OFF(state->size) || (z_off64_t)state->size > len ? + (unsigned)len : state->size; + if (first) { + memset(state->in, 0, n); + first = 0; + } + strm->avail_in = n; + strm->next_in = state->in; + state->x.pos += n; + if (gz_comp(state, Z_NO_FLUSH) == -1) + return -1; + len -= n; + } + return 0; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzwrite(file, buf, len) + gzFile file; + voidpc buf; + unsigned len; +{ + unsigned put = len; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return 0; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return 0; + + /* since an int is returned, make sure len fits in one, otherwise return + with an error (this avoids the flaw in the interface) */ + if ((int)len < 0) { + gz_error(state, Z_DATA_ERROR, "requested length does not fit in int"); + return 0; + } + + /* if len is zero, avoid unnecessary operations */ + if (len == 0) + return 0; + + /* allocate memory if this is the first time through */ + if (state->size == 0 && gz_init(state) == -1) + return 0; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return 0; + } + + /* for small len, copy to input buffer, otherwise compress directly */ + if (len < state->size) { + /* copy to input buffer, compress when full */ + do { + unsigned have, copy; + + if (strm->avail_in == 0) + strm->next_in = state->in; + have = (unsigned)((strm->next_in + strm->avail_in) - state->in); + copy = state->size - have; + if (copy > len) + copy = len; + memcpy(state->in + have, buf, copy); + strm->avail_in += copy; + state->x.pos += copy; + buf = (const char *)buf + copy; + len -= copy; + if (len && gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + } while (len); + } + else { + /* consume whatever's left in the input buffer */ + if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + + /* directly compress user buffer to file */ + strm->avail_in = len; + strm->next_in = (z_const Bytef *)buf; + state->x.pos += len; + if (gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + } + + /* input was all buffered or compressed (put will fit in int) */ + return (int)put; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzputc(file, c) + gzFile file; + int c; +{ + unsigned have; + unsigned char buf[1]; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return -1; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return -1; + } + + /* try writing to input buffer for speed (state->size == 0 if buffer not + initialized) */ + if (state->size) { + if (strm->avail_in == 0) + strm->next_in = state->in; + have = (unsigned)((strm->next_in + strm->avail_in) - state->in); + if (have < state->size) { + state->in[have] = c; + strm->avail_in++; + state->x.pos++; + return c & 0xff; + } + } + + /* no room in buffer or not initialized, use gz_write() */ + buf[0] = c; + if (gzwrite(file, buf, 1) != 1) + return -1; + return c & 0xff; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzputs(file, str) + gzFile file; + const char *str; +{ + int ret; + unsigned len; + + /* write string */ + len = (unsigned)strlen(str); + ret = gzwrite(file, str, len); + return ret == 0 && len != 0 ? -1 : ret; +} + +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +#include + +/* -- see zlib.h -- */ +int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va) +{ + int size, len; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return 0; + + /* make sure we have some buffer space */ + if (state->size == 0 && gz_init(state) == -1) + return 0; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return 0; + } + + /* consume whatever's left in the input buffer */ + if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + + /* do the printf() into the input buffer, put length in len */ + size = (int)(state->size); + state->in[size - 1] = 0; +#ifdef NO_vsnprintf +# ifdef HAS_vsprintf_void + (void)vsprintf((char *)(state->in), format, va); + for (len = 0; len < size; len++) + if (state->in[len] == 0) break; +# else + len = vsprintf((char *)(state->in), format, va); +# endif +#else +# ifdef HAS_vsnprintf_void + (void)vsnprintf((char *)(state->in), size, format, va); + len = strlen((char *)(state->in)); +# else + len = vsnprintf((char *)(state->in), size, format, va); +# endif +#endif + + /* check that printf() results fit in buffer */ + if (len <= 0 || len >= (int)size || state->in[size - 1] != 0) + return 0; + + /* update buffer and position, defer compression until needed */ + strm->avail_in = (unsigned)len; + strm->next_in = state->in; + state->x.pos += len; + return len; +} + +int ZEXPORTVA gzprintf(gzFile file, const char *format, ...) +{ + va_list va; + int ret; + + va_start(va, format); + ret = gzvprintf(file, format, va); + va_end(va); + return ret; +} + +#else /* !STDC && !Z_HAVE_STDARG_H */ + +/* -- see zlib.h -- */ +int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, + a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) + gzFile file; + const char *format; + int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, + a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; +{ + int size, len; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that can really pass pointer in ints */ + if (sizeof(int) != sizeof(void *)) + return 0; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return 0; + + /* make sure we have some buffer space */ + if (state->size == 0 && gz_init(state) == -1) + return 0; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return 0; + } + + /* consume whatever's left in the input buffer */ + if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + + /* do the printf() into the input buffer, put length in len */ + size = (int)(state->size); + state->in[size - 1] = 0; +#ifdef NO_snprintf +# ifdef HAS_sprintf_void + sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + for (len = 0; len < size; len++) + if (state->in[len] == 0) break; +# else + len = sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); +# endif +#else +# ifdef HAS_snprintf_void + snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + len = strlen((char *)(state->in)); +# else + len = snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6, + a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, + a19, a20); +# endif +#endif + + /* check that printf() results fit in buffer */ + if (len <= 0 || len >= (int)size || state->in[size - 1] != 0) + return 0; + + /* update buffer and position, defer compression until needed */ + strm->avail_in = (unsigned)len; + strm->next_in = state->in; + state->x.pos += len; + return len; +} + +#endif + +/* -- see zlib.h -- */ +int ZEXPORT gzflush(file, flush) + gzFile file; + int flush; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return Z_STREAM_ERROR; + + /* check flush parameter */ + if (flush < 0 || flush > Z_FINISH) + return Z_STREAM_ERROR; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return -1; + } + + /* compress remaining data with requested flush */ + gz_comp(state, flush); + return state->err; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzsetparams(file, level, strategy) + gzFile file; + int level; + int strategy; +{ + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return Z_STREAM_ERROR; + + /* if no change is requested, then do nothing */ + if (level == state->level && strategy == state->strategy) + return Z_OK; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return -1; + } + + /* change compression parameters for subsequent input */ + if (state->size) { + /* flush previous input with previous parameters before changing */ + if (strm->avail_in && gz_comp(state, Z_PARTIAL_FLUSH) == -1) + return state->err; + deflateParams(strm, level, strategy); + } + state->level = level; + state->strategy = strategy; + return Z_OK; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzclose_w(file) + gzFile file; +{ + int ret = Z_OK; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + + /* check that we're writing */ + if (state->mode != GZ_WRITE) + return Z_STREAM_ERROR; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + ret = state->err; + } + + /* flush, free memory, and close file */ + if (gz_comp(state, Z_FINISH) == -1) + ret = state->err; + if (state->size) { + if (!state->direct) { + (void)deflateEnd(&(state->strm)); + free(state->out); + } + free(state->in); + } + gz_error(state, Z_OK, NULL); + free(state->path); + if (close(state->fd) == -1) + ret = Z_ERRNO; + free(state); + return ret; +} diff --git a/vendors/zlib/include/zlib.h b/vendors/zlib/include/zlib.h deleted file mode 100644 index 0228179..0000000 --- a/vendors/zlib/include/zlib.h +++ /dev/null @@ -1,1357 +0,0 @@ -/* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.2.3, July 18th, 2005 - - Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler - - 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 source 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 source distribution. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - - - The data format used by the zlib library is described by RFCs (Request for - Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt - (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). -*/ - -#ifndef ZLIB_H -#define ZLIB_H - -#include "zconf.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define ZLIB_VERSION "1.2.3" -#define ZLIB_VERNUM 0x1230 - -/* - The 'zlib' compression library provides in-memory compression and - decompression functions, including integrity checks of the uncompressed - data. This version of the library supports only one compression method - (deflation) but other algorithms will be added later and will have the same - stream interface. - - Compression can be done in a single step if the buffers are large - enough (for example if an input file is mmap'ed), or can be done by - repeated calls of the compression function. In the latter case, the - application must provide more input and/or consume the output - (providing more output space) before each call. - - The compressed data format used by default by the in-memory functions is - the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped - around a deflate stream, which is itself documented in RFC 1951. - - The library also supports reading and writing files in gzip (.gz) format - with an interface similar to that of stdio using the functions that start - with "gz". The gzip format is different from the zlib format. gzip is a - gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. - - This library can optionally read and write gzip streams in memory as well. - - The zlib format was designed to be compact and fast for use in memory - and on communications channels. The gzip format was designed for single- - file compression on file systems, has a larger header than zlib to maintain - directory information, and uses a different, slower check method than zlib. - - The library does not install any signal handler. The decoder checks - the consistency of the compressed data, so the library should never - crash even in case of corrupted input. -*/ - -typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); -typedef void (*free_func) OF((voidpf opaque, voidpf address)); - -struct internal_state; - -typedef struct z_stream_s { - Bytef *next_in; /* next input byte */ - uInt avail_in; /* number of bytes available at next_in */ - uLong total_in; /* total nb of input bytes read so far */ - - Bytef *next_out; /* next output byte should be put there */ - uInt avail_out; /* remaining free space at next_out */ - uLong total_out; /* total nb of bytes output so far */ - - char *msg; /* last error message, NULL if no error */ - struct internal_state FAR *state; /* not visible by applications */ - - alloc_func zalloc; /* used to allocate the internal state */ - free_func zfree; /* used to free the internal state */ - voidpf opaque; /* private data object passed to zalloc and zfree */ - - int data_type; /* best guess about the data type: binary or text */ - uLong adler; /* adler32 value of the uncompressed data */ - uLong reserved; /* reserved for future use */ -} z_stream; - -typedef z_stream FAR *z_streamp; - -/* - gzip header information passed to and from zlib routines. See RFC 1952 - for more details on the meanings of these fields. -*/ -typedef struct gz_header_s { - int text; /* true if compressed data believed to be text */ - uLong time; /* modification time */ - int xflags; /* extra flags (not used when writing a gzip file) */ - int os; /* operating system */ - Bytef *extra; /* pointer to extra field or Z_NULL if none */ - uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ - uInt extra_max; /* space at extra (only when reading header) */ - Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ - uInt name_max; /* space at name (only when reading header) */ - Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ - uInt comm_max; /* space at comment (only when reading header) */ - int hcrc; /* true if there was or will be a header crc */ - int done; /* true when done reading gzip header (not used - when writing a gzip file) */ -} gz_header; - -typedef gz_header FAR *gz_headerp; - -/* - The application must update next_in and avail_in when avail_in has - dropped to zero. It must update next_out and avail_out when avail_out - has dropped to zero. The application must initialize zalloc, zfree and - opaque before calling the init function. All other fields are set by the - compression library and must not be updated by the application. - - The opaque value provided by the application will be passed as the first - parameter for calls of zalloc and zfree. This can be useful for custom - memory management. The compression library attaches no meaning to the - opaque value. - - zalloc must return Z_NULL if there is not enough memory for the object. - If zlib is used in a multi-threaded application, zalloc and zfree must be - thread safe. - - On 16-bit systems, the functions zalloc and zfree must be able to allocate - exactly 65536 bytes, but will not be required to allocate more than this - if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, - pointers returned by zalloc for objects of exactly 65536 bytes *must* - have their offset normalized to zero. The default allocation function - provided by this library ensures this (see zutil.c). To reduce memory - requirements and avoid any allocation of 64K objects, at the expense of - compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). - - The fields total_in and total_out can be used for statistics or - progress reports. After compression, total_in holds the total size of - the uncompressed data and may be saved for use in the decompressor - (particularly if the decompressor wants to decompress everything in - a single step). -*/ - - /* constants */ - -#define Z_NO_FLUSH 0 -#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */ -#define Z_SYNC_FLUSH 2 -#define Z_FULL_FLUSH 3 -#define Z_FINISH 4 -#define Z_BLOCK 5 -/* Allowed flush values; see deflate() and inflate() below for details */ - -#define Z_OK 0 -#define Z_STREAM_END 1 -#define Z_NEED_DICT 2 -#define Z_ERRNO (-1) -#define Z_STREAM_ERROR (-2) -#define Z_DATA_ERROR (-3) -#define Z_MEM_ERROR (-4) -#define Z_BUF_ERROR (-5) -#define Z_VERSION_ERROR (-6) -/* Return codes for the compression/decompression functions. Negative - * values are errors, positive values are used for special but normal events. - */ - -#define Z_NO_COMPRESSION 0 -#define Z_BEST_SPEED 1 -#define Z_BEST_COMPRESSION 9 -#define Z_DEFAULT_COMPRESSION (-1) -/* compression levels */ - -#define Z_FILTERED 1 -#define Z_HUFFMAN_ONLY 2 -#define Z_RLE 3 -#define Z_FIXED 4 -#define Z_DEFAULT_STRATEGY 0 -/* compression strategy; see deflateInit2() below for details */ - -#define Z_BINARY 0 -#define Z_TEXT 1 -#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ -#define Z_UNKNOWN 2 -/* Possible values of the data_type field (though see inflate()) */ - -#define Z_DEFLATED 8 -/* The deflate compression method (the only one supported in this version) */ - -#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ - -#define zlib_version zlibVersion() -/* for compatibility with versions < 1.0.2 */ - - /* basic functions */ - -ZEXTERN const char * ZEXPORT zlibVersion OF((void)); -/* The application can compare zlibVersion and ZLIB_VERSION for consistency. - If the first character differs, the library code actually used is - not compatible with the zlib.h header file used by the application. - This check is automatically made by deflateInit and inflateInit. - */ - -/* -ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); - - Initializes the internal stream state for compression. The fields - zalloc, zfree and opaque must be initialized before by the caller. - If zalloc and zfree are set to Z_NULL, deflateInit updates them to - use default allocation functions. - - The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: - 1 gives best speed, 9 gives best compression, 0 gives no compression at - all (the input data is simply copied a block at a time). - Z_DEFAULT_COMPRESSION requests a default compromise between speed and - compression (currently equivalent to level 6). - - deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_STREAM_ERROR if level is not a valid compression level, - Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible - with the version assumed by the caller (ZLIB_VERSION). - msg is set to null if there is no error message. deflateInit does not - perform any compression: this will be done by deflate(). -*/ - - -ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); -/* - deflate compresses as much data as possible, and stops when the input - buffer becomes empty or the output buffer becomes full. It may introduce some - output latency (reading input without producing any output) except when - forced to flush. - - The detailed semantics are as follows. deflate performs one or both of the - following actions: - - - Compress more input starting at next_in and update next_in and avail_in - accordingly. If not all input can be processed (because there is not - enough room in the output buffer), next_in and avail_in are updated and - processing will resume at this point for the next call of deflate(). - - - Provide more output starting at next_out and update next_out and avail_out - accordingly. This action is forced if the parameter flush is non zero. - Forcing flush frequently degrades the compression ratio, so this parameter - should be set only when necessary (in interactive applications). - Some output may be provided even if flush is not set. - - Before the call of deflate(), the application should ensure that at least - one of the actions is possible, by providing more input and/or consuming - more output, and updating avail_in or avail_out accordingly; avail_out - should never be zero before the call. The application can consume the - compressed output when it wants, for example when the output buffer is full - (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK - and with zero avail_out, it must be called again after making room in the - output buffer because there might be more output pending. - - Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to - decide how much data to accumualte before producing output, in order to - maximize compression. - - If the parameter flush is set to Z_SYNC_FLUSH, all pending output is - flushed to the output buffer and the output is aligned on a byte boundary, so - that the decompressor can get all input data available so far. (In particular - avail_in is zero after the call if enough output space has been provided - before the call.) Flushing may degrade compression for some compression - algorithms and so it should be used only when necessary. - - If flush is set to Z_FULL_FLUSH, all output is flushed as with - Z_SYNC_FLUSH, and the compression state is reset so that decompression can - restart from this point if previous compressed data has been damaged or if - random access is desired. Using Z_FULL_FLUSH too often can seriously degrade - compression. - - If deflate returns with avail_out == 0, this function must be called again - with the same value of the flush parameter and more output space (updated - avail_out), until the flush is complete (deflate returns with non-zero - avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that - avail_out is greater than six to avoid repeated flush markers due to - avail_out == 0 on return. - - If the parameter flush is set to Z_FINISH, pending input is processed, - pending output is flushed and deflate returns with Z_STREAM_END if there - was enough output space; if deflate returns with Z_OK, this function must be - called again with Z_FINISH and more output space (updated avail_out) but no - more input data, until it returns with Z_STREAM_END or an error. After - deflate has returned Z_STREAM_END, the only possible operations on the - stream are deflateReset or deflateEnd. - - Z_FINISH can be used immediately after deflateInit if all the compression - is to be done in a single step. In this case, avail_out must be at least - the value returned by deflateBound (see below). If deflate does not return - Z_STREAM_END, then it must be called again as described above. - - deflate() sets strm->adler to the adler32 checksum of all input read - so far (that is, total_in bytes). - - deflate() may update strm->data_type if it can make a good guess about - the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered - binary. This field is only for information purposes and does not affect - the compression algorithm in any manner. - - deflate() returns Z_OK if some progress has been made (more input - processed or more output produced), Z_STREAM_END if all input has been - consumed and all output has been produced (only when flush is set to - Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example - if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible - (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not - fatal, and deflate() can be called again with more input and more output - space to continue compressing. -*/ - - -ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); -/* - All dynamically allocated data structures for this stream are freed. - This function discards any unprocessed input and does not flush any - pending output. - - deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the - stream state was inconsistent, Z_DATA_ERROR if the stream was freed - prematurely (some input or output was discarded). In the error case, - msg may be set but then points to a static string (which must not be - deallocated). -*/ - - -/* -ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); - - Initializes the internal stream state for decompression. The fields - next_in, avail_in, zalloc, zfree and opaque must be initialized before by - the caller. If next_in is not Z_NULL and avail_in is large enough (the exact - value depends on the compression method), inflateInit determines the - compression method from the zlib header and allocates all data structures - accordingly; otherwise the allocation will be deferred to the first call of - inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to - use default allocation functions. - - inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_VERSION_ERROR if the zlib library version is incompatible with the - version assumed by the caller. msg is set to null if there is no error - message. inflateInit does not perform any decompression apart from reading - the zlib header if present: this will be done by inflate(). (So next_in and - avail_in may be modified, but next_out and avail_out are unchanged.) -*/ - - -ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); -/* - inflate decompresses as much data as possible, and stops when the input - buffer becomes empty or the output buffer becomes full. It may introduce - some output latency (reading input without producing any output) except when - forced to flush. - - The detailed semantics are as follows. inflate performs one or both of the - following actions: - - - Decompress more input starting at next_in and update next_in and avail_in - accordingly. If not all input can be processed (because there is not - enough room in the output buffer), next_in is updated and processing - will resume at this point for the next call of inflate(). - - - Provide more output starting at next_out and update next_out and avail_out - accordingly. inflate() provides as much output as possible, until there - is no more input data or no more space in the output buffer (see below - about the flush parameter). - - Before the call of inflate(), the application should ensure that at least - one of the actions is possible, by providing more input and/or consuming - more output, and updating the next_* and avail_* values accordingly. - The application can consume the uncompressed output when it wants, for - example when the output buffer is full (avail_out == 0), or after each - call of inflate(). If inflate returns Z_OK and with zero avail_out, it - must be called again after making room in the output buffer because there - might be more output pending. - - The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, - Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much - output as possible to the output buffer. Z_BLOCK requests that inflate() stop - if and when it gets to the next deflate block boundary. When decoding the - zlib or gzip format, this will cause inflate() to return immediately after - the header and before the first block. When doing a raw inflate, inflate() - will go ahead and process the first block, and will return when it gets to - the end of that block, or when it runs out of data. - - The Z_BLOCK option assists in appending to or combining deflate streams. - Also to assist in this, on return inflate() will set strm->data_type to the - number of unused bits in the last byte taken from strm->next_in, plus 64 - if inflate() is currently decoding the last block in the deflate stream, - plus 128 if inflate() returned immediately after decoding an end-of-block - code or decoding the complete header up to just before the first byte of the - deflate stream. The end-of-block will not be indicated until all of the - uncompressed data from that block has been written to strm->next_out. The - number of unused bits may in general be greater than seven, except when - bit 7 of data_type is set, in which case the number of unused bits will be - less than eight. - - inflate() should normally be called until it returns Z_STREAM_END or an - error. However if all decompression is to be performed in a single step - (a single call of inflate), the parameter flush should be set to - Z_FINISH. In this case all pending input is processed and all pending - output is flushed; avail_out must be large enough to hold all the - uncompressed data. (The size of the uncompressed data may have been saved - by the compressor for this purpose.) The next operation on this stream must - be inflateEnd to deallocate the decompression state. The use of Z_FINISH - is never required, but can be used to inform inflate that a faster approach - may be used for the single inflate() call. - - In this implementation, inflate() always flushes as much output as - possible to the output buffer, and always uses the faster approach on the - first call. So the only effect of the flush parameter in this implementation - is on the return value of inflate(), as noted below, or when it returns early - because Z_BLOCK is used. - - If a preset dictionary is needed after this call (see inflateSetDictionary - below), inflate sets strm->adler to the adler32 checksum of the dictionary - chosen by the compressor and returns Z_NEED_DICT; otherwise it sets - strm->adler to the adler32 checksum of all output produced so far (that is, - total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described - below. At the end of the stream, inflate() checks that its computed adler32 - checksum is equal to that saved by the compressor and returns Z_STREAM_END - only if the checksum is correct. - - inflate() will decompress and check either zlib-wrapped or gzip-wrapped - deflate data. The header type is detected automatically. Any information - contained in the gzip header is not retained, so applications that need that - information should instead use raw inflate, see inflateInit2() below, or - inflateBack() and perform their own processing of the gzip header and - trailer. - - inflate() returns Z_OK if some progress has been made (more input processed - or more output produced), Z_STREAM_END if the end of the compressed data has - been reached and all uncompressed output has been produced, Z_NEED_DICT if a - preset dictionary is needed at this point, Z_DATA_ERROR if the input data was - corrupted (input stream not conforming to the zlib format or incorrect check - value), Z_STREAM_ERROR if the stream structure was inconsistent (for example - if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory, - Z_BUF_ERROR if no progress is possible or if there was not enough room in the - output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and - inflate() can be called again with more input and more output space to - continue decompressing. If Z_DATA_ERROR is returned, the application may then - call inflateSync() to look for a good compression block if a partial recovery - of the data is desired. -*/ - - -ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); -/* - All dynamically allocated data structures for this stream are freed. - This function discards any unprocessed input and does not flush any - pending output. - - inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state - was inconsistent. In the error case, msg may be set but then points to a - static string (which must not be deallocated). -*/ - - /* Advanced functions */ - -/* - The following functions are needed only in some special applications. -*/ - -/* -ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, - int level, - int method, - int windowBits, - int memLevel, - int strategy)); - - This is another version of deflateInit with more compression options. The - fields next_in, zalloc, zfree and opaque must be initialized before by - the caller. - - The method parameter is the compression method. It must be Z_DEFLATED in - this version of the library. - - The windowBits parameter is the base two logarithm of the window size - (the size of the history buffer). It should be in the range 8..15 for this - version of the library. Larger values of this parameter result in better - compression at the expense of memory usage. The default value is 15 if - deflateInit is used instead. - - windowBits can also be -8..-15 for raw deflate. In this case, -windowBits - determines the window size. deflate() will then generate raw deflate data - with no zlib header or trailer, and will not compute an adler32 check value. - - windowBits can also be greater than 15 for optional gzip encoding. Add - 16 to windowBits to write a simple gzip header and trailer around the - compressed data instead of a zlib wrapper. The gzip header will have no - file name, no extra data, no comment, no modification time (set to zero), - no header crc, and the operating system will be set to 255 (unknown). If a - gzip stream is being written, strm->adler is a crc32 instead of an adler32. - - The memLevel parameter specifies how much memory should be allocated - for the internal compression state. memLevel=1 uses minimum memory but - is slow and reduces compression ratio; memLevel=9 uses maximum memory - for optimal speed. The default value is 8. See zconf.h for total memory - usage as a function of windowBits and memLevel. - - The strategy parameter is used to tune the compression algorithm. Use the - value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a - filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no - string match), or Z_RLE to limit match distances to one (run-length - encoding). Filtered data consists mostly of small values with a somewhat - random distribution. In this case, the compression algorithm is tuned to - compress them better. The effect of Z_FILTERED is to force more Huffman - coding and less string matching; it is somewhat intermediate between - Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as - Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy - parameter only affects the compression ratio but not the correctness of the - compressed output even if it is not set appropriately. Z_FIXED prevents the - use of dynamic Huffman codes, allowing for a simpler decoder for special - applications. - - deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid - method). msg is set to null if there is no error message. deflateInit2 does - not perform any compression: this will be done by deflate(). -*/ - -ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); -/* - Initializes the compression dictionary from the given byte sequence - without producing any compressed output. This function must be called - immediately after deflateInit, deflateInit2 or deflateReset, before any - call of deflate. The compressor and decompressor must use exactly the same - dictionary (see inflateSetDictionary). - - The dictionary should consist of strings (byte sequences) that are likely - to be encountered later in the data to be compressed, with the most commonly - used strings preferably put towards the end of the dictionary. Using a - dictionary is most useful when the data to be compressed is short and can be - predicted with good accuracy; the data can then be compressed better than - with the default empty dictionary. - - Depending on the size of the compression data structures selected by - deflateInit or deflateInit2, a part of the dictionary may in effect be - discarded, for example if the dictionary is larger than the window size in - deflate or deflate2. Thus the strings most likely to be useful should be - put at the end of the dictionary, not at the front. In addition, the - current implementation of deflate will use at most the window size minus - 262 bytes of the provided dictionary. - - Upon return of this function, strm->adler is set to the adler32 value - of the dictionary; the decompressor may later use this value to determine - which dictionary has been used by the compressor. (The adler32 value - applies to the whole dictionary even if only a subset of the dictionary is - actually used by the compressor.) If a raw deflate was requested, then the - adler32 value is not computed and strm->adler is not set. - - deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a - parameter is invalid (such as NULL dictionary) or the stream state is - inconsistent (for example if deflate has already been called for this stream - or if the compression method is bsort). deflateSetDictionary does not - perform any compression: this will be done by deflate(). -*/ - -ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, - z_streamp source)); -/* - Sets the destination stream as a complete copy of the source stream. - - This function can be useful when several compression strategies will be - tried, for example when there are several ways of pre-processing the input - data with a filter. The streams that will be discarded should then be freed - by calling deflateEnd. Note that deflateCopy duplicates the internal - compression state which can be quite large, so this strategy is slow and - can consume lots of memory. - - deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_STREAM_ERROR if the source stream state was inconsistent - (such as zalloc being NULL). msg is left unchanged in both source and - destination. -*/ - -ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); -/* - This function is equivalent to deflateEnd followed by deflateInit, - but does not free and reallocate all the internal compression state. - The stream will keep the same compression level and any other attributes - that may have been set by deflateInit2. - - deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being NULL). -*/ - -ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, - int level, - int strategy)); -/* - Dynamically update the compression level and compression strategy. The - interpretation of level and strategy is as in deflateInit2. This can be - used to switch between compression and straight copy of the input data, or - to switch to a different kind of input data requiring a different - strategy. If the compression level is changed, the input available so far - is compressed with the old level (and may be flushed); the new level will - take effect only at the next call of deflate(). - - Before the call of deflateParams, the stream state must be set as for - a call of deflate(), since the currently available input may have to - be compressed and flushed. In particular, strm->avail_out must be non-zero. - - deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source - stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR - if strm->avail_out was zero. -*/ - -ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, - int good_length, - int max_lazy, - int nice_length, - int max_chain)); -/* - Fine tune deflate's internal compression parameters. This should only be - used by someone who understands the algorithm used by zlib's deflate for - searching for the best matching string, and even then only by the most - fanatic optimizer trying to squeeze out the last compressed bit for their - specific input data. Read the deflate.c source code for the meaning of the - max_lazy, good_length, nice_length, and max_chain parameters. - - deflateTune() can be called after deflateInit() or deflateInit2(), and - returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. - */ - -ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, - uLong sourceLen)); -/* - deflateBound() returns an upper bound on the compressed size after - deflation of sourceLen bytes. It must be called after deflateInit() - or deflateInit2(). This would be used to allocate an output buffer - for deflation in a single pass, and so would be called before deflate(). -*/ - -ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, - int bits, - int value)); -/* - deflatePrime() inserts bits in the deflate output stream. The intent - is that this function is used to start off the deflate output with the - bits leftover from a previous deflate stream when appending to it. As such, - this function can only be used for raw deflate, and must be used before the - first deflate() call after a deflateInit2() or deflateReset(). bits must be - less than or equal to 16, and that many of the least significant bits of - value will be inserted in the output. - - deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, - gz_headerp head)); -/* - deflateSetHeader() provides gzip header information for when a gzip - stream is requested by deflateInit2(). deflateSetHeader() may be called - after deflateInit2() or deflateReset() and before the first call of - deflate(). The text, time, os, extra field, name, and comment information - in the provided gz_header structure are written to the gzip header (xflag is - ignored -- the extra flags are set according to the compression level). The - caller must assure that, if not Z_NULL, name and comment are terminated with - a zero byte, and that if extra is not Z_NULL, that extra_len bytes are - available there. If hcrc is true, a gzip header crc is included. Note that - the current versions of the command-line version of gzip (up through version - 1.3.x) do not support header crc's, and will report that it is a "multi-part - gzip file" and give up. - - If deflateSetHeader is not used, the default gzip header has text false, - the time set to zero, and os set to 255, with no extra, name, or comment - fields. The gzip header is returned to the default state by deflateReset(). - - deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -/* -ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, - int windowBits)); - - This is another version of inflateInit with an extra parameter. The - fields next_in, avail_in, zalloc, zfree and opaque must be initialized - before by the caller. - - The windowBits parameter is the base two logarithm of the maximum window - size (the size of the history buffer). It should be in the range 8..15 for - this version of the library. The default value is 15 if inflateInit is used - instead. windowBits must be greater than or equal to the windowBits value - provided to deflateInit2() while compressing, or it must be equal to 15 if - deflateInit2() was not used. If a compressed stream with a larger window - size is given as input, inflate() will return with the error code - Z_DATA_ERROR instead of trying to allocate a larger window. - - windowBits can also be -8..-15 for raw inflate. In this case, -windowBits - determines the window size. inflate() will then process raw deflate data, - not looking for a zlib or gzip header, not generating a check value, and not - looking for any check values for comparison at the end of the stream. This - is for use with other formats that use the deflate compressed data format - such as zip. Those formats provide their own check values. If a custom - format is developed using the raw deflate format for compressed data, it is - recommended that a check value such as an adler32 or a crc32 be applied to - the uncompressed data as is done in the zlib, gzip, and zip formats. For - most applications, the zlib format should be used as is. Note that comments - above on the use in deflateInit2() applies to the magnitude of windowBits. - - windowBits can also be greater than 15 for optional gzip decoding. Add - 32 to windowBits to enable zlib and gzip decoding with automatic header - detection, or add 16 to decode only the gzip format (the zlib format will - return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is - a crc32 instead of an adler32. - - inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_STREAM_ERROR if a parameter is invalid (such as a null strm). msg - is set to null if there is no error message. inflateInit2 does not perform - any decompression apart from reading the zlib header if present: this will - be done by inflate(). (So next_in and avail_in may be modified, but next_out - and avail_out are unchanged.) -*/ - -ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); -/* - Initializes the decompression dictionary from the given uncompressed byte - sequence. This function must be called immediately after a call of inflate, - if that call returned Z_NEED_DICT. The dictionary chosen by the compressor - can be determined from the adler32 value returned by that call of inflate. - The compressor and decompressor must use exactly the same dictionary (see - deflateSetDictionary). For raw inflate, this function can be called - immediately after inflateInit2() or inflateReset() and before any call of - inflate() to set the dictionary. The application must insure that the - dictionary that was used for compression is provided. - - inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a - parameter is invalid (such as NULL dictionary) or the stream state is - inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the - expected one (incorrect adler32 value). inflateSetDictionary does not - perform any decompression: this will be done by subsequent calls of - inflate(). -*/ - -ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); -/* - Skips invalid compressed data until a full flush point (see above the - description of deflate with Z_FULL_FLUSH) can be found, or until all - available input is skipped. No output is provided. - - inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR - if no more input was provided, Z_DATA_ERROR if no flush point has been found, - or Z_STREAM_ERROR if the stream structure was inconsistent. In the success - case, the application may save the current current value of total_in which - indicates where valid compressed data was found. In the error case, the - application may repeatedly call inflateSync, providing more input each time, - until success or end of the input data. -*/ - -ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, - z_streamp source)); -/* - Sets the destination stream as a complete copy of the source stream. - - This function can be useful when randomly accessing a large stream. The - first pass through the stream can periodically record the inflate state, - allowing restarting inflate at those points when randomly accessing the - stream. - - inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_STREAM_ERROR if the source stream state was inconsistent - (such as zalloc being NULL). msg is left unchanged in both source and - destination. -*/ - -ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); -/* - This function is equivalent to inflateEnd followed by inflateInit, - but does not free and reallocate all the internal decompression state. - The stream will keep attributes that may have been set by inflateInit2. - - inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being NULL). -*/ - -ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, - int bits, - int value)); -/* - This function inserts bits in the inflate input stream. The intent is - that this function is used to start inflating at a bit position in the - middle of a byte. The provided bits will be used before any bytes are used - from next_in. This function should only be used with raw inflate, and - should be used before the first inflate() call after inflateInit2() or - inflateReset(). bits must be less than or equal to 16, and that many of the - least significant bits of value will be inserted in the input. - - inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, - gz_headerp head)); -/* - inflateGetHeader() requests that gzip header information be stored in the - provided gz_header structure. inflateGetHeader() may be called after - inflateInit2() or inflateReset(), and before the first call of inflate(). - As inflate() processes the gzip stream, head->done is zero until the header - is completed, at which time head->done is set to one. If a zlib stream is - being decoded, then head->done is set to -1 to indicate that there will be - no gzip header information forthcoming. Note that Z_BLOCK can be used to - force inflate() to return immediately after header processing is complete - and before any actual data is decompressed. - - The text, time, xflags, and os fields are filled in with the gzip header - contents. hcrc is set to true if there is a header CRC. (The header CRC - was valid if done is set to one.) If extra is not Z_NULL, then extra_max - contains the maximum number of bytes to write to extra. Once done is true, - extra_len contains the actual extra field length, and extra contains the - extra field, or that field truncated if extra_max is less than extra_len. - If name is not Z_NULL, then up to name_max characters are written there, - terminated with a zero unless the length is greater than name_max. If - comment is not Z_NULL, then up to comm_max characters are written there, - terminated with a zero unless the length is greater than comm_max. When - any of extra, name, or comment are not Z_NULL and the respective field is - not present in the header, then that field is set to Z_NULL to signal its - absence. This allows the use of deflateSetHeader() with the returned - structure to duplicate the header. However if those fields are set to - allocated memory, then the application will need to save those pointers - elsewhere so that they can be eventually freed. - - If inflateGetHeader is not used, then the header information is simply - discarded. The header is always checked for validity, including the header - CRC if present. inflateReset() will reset the process to discard the header - information. The application would need to call inflateGetHeader() again to - retrieve the header from the next gzip stream. - - inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -/* -ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, - unsigned char FAR *window)); - - Initialize the internal stream state for decompression using inflateBack() - calls. The fields zalloc, zfree and opaque in strm must be initialized - before the call. If zalloc and zfree are Z_NULL, then the default library- - derived memory allocation routines are used. windowBits is the base two - logarithm of the window size, in the range 8..15. window is a caller - supplied buffer of that size. Except for special applications where it is - assured that deflate was used with small window sizes, windowBits must be 15 - and a 32K byte window must be supplied to be able to decompress general - deflate streams. - - See inflateBack() for the usage of these routines. - - inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of - the paramaters are invalid, Z_MEM_ERROR if the internal state could not - be allocated, or Z_VERSION_ERROR if the version of the library does not - match the version of the header file. -*/ - -typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); -typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); - -ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, - in_func in, void FAR *in_desc, - out_func out, void FAR *out_desc)); -/* - inflateBack() does a raw inflate with a single call using a call-back - interface for input and output. This is more efficient than inflate() for - file i/o applications in that it avoids copying between the output and the - sliding window by simply making the window itself the output buffer. This - function trusts the application to not change the output buffer passed by - the output function, at least until inflateBack() returns. - - inflateBackInit() must be called first to allocate the internal state - and to initialize the state with the user-provided window buffer. - inflateBack() may then be used multiple times to inflate a complete, raw - deflate stream with each call. inflateBackEnd() is then called to free - the allocated state. - - A raw deflate stream is one with no zlib or gzip header or trailer. - This routine would normally be used in a utility that reads zip or gzip - files and writes out uncompressed files. The utility would decode the - header and process the trailer on its own, hence this routine expects - only the raw deflate stream to decompress. This is different from the - normal behavior of inflate(), which expects either a zlib or gzip header and - trailer around the deflate stream. - - inflateBack() uses two subroutines supplied by the caller that are then - called by inflateBack() for input and output. inflateBack() calls those - routines until it reads a complete deflate stream and writes out all of the - uncompressed data, or until it encounters an error. The function's - parameters and return types are defined above in the in_func and out_func - typedefs. inflateBack() will call in(in_desc, &buf) which should return the - number of bytes of provided input, and a pointer to that input in buf. If - there is no input available, in() must return zero--buf is ignored in that - case--and inflateBack() will return a buffer error. inflateBack() will call - out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() - should return zero on success, or non-zero on failure. If out() returns - non-zero, inflateBack() will return with an error. Neither in() nor out() - are permitted to change the contents of the window provided to - inflateBackInit(), which is also the buffer that out() uses to write from. - The length written by out() will be at most the window size. Any non-zero - amount of input may be provided by in(). - - For convenience, inflateBack() can be provided input on the first call by - setting strm->next_in and strm->avail_in. If that input is exhausted, then - in() will be called. Therefore strm->next_in must be initialized before - calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called - immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in - must also be initialized, and then if strm->avail_in is not zero, input will - initially be taken from strm->next_in[0 .. strm->avail_in - 1]. - - The in_desc and out_desc parameters of inflateBack() is passed as the - first parameter of in() and out() respectively when they are called. These - descriptors can be optionally used to pass any information that the caller- - supplied in() and out() functions need to do their job. - - On return, inflateBack() will set strm->next_in and strm->avail_in to - pass back any unused input that was provided by the last in() call. The - return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR - if in() or out() returned an error, Z_DATA_ERROR if there was a format - error in the deflate stream (in which case strm->msg is set to indicate the - nature of the error), or Z_STREAM_ERROR if the stream was not properly - initialized. In the case of Z_BUF_ERROR, an input or output error can be - distinguished using strm->next_in which will be Z_NULL only if in() returned - an error. If strm->next is not Z_NULL, then the Z_BUF_ERROR was due to - out() returning non-zero. (in() will always be called before out(), so - strm->next_in is assured to be defined if out() returns non-zero.) Note - that inflateBack() cannot return Z_OK. -*/ - -ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); -/* - All memory allocated by inflateBackInit() is freed. - - inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream - state was inconsistent. -*/ - -ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); -/* Return flags indicating compile-time options. - - Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: - 1.0: size of uInt - 3.2: size of uLong - 5.4: size of voidpf (pointer) - 7.6: size of z_off_t - - Compiler, assembler, and debug options: - 8: DEBUG - 9: ASMV or ASMINF -- use ASM code - 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention - 11: 0 (reserved) - - One-time table building (smaller code, but not thread-safe if true): - 12: BUILDFIXED -- build static block decoding tables when needed - 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed - 14,15: 0 (reserved) - - Library content (indicates missing functionality): - 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking - deflate code when not needed) - 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect - and decode gzip streams (to avoid linking crc code) - 18-19: 0 (reserved) - - Operation variations (changes in library functionality): - 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate - 21: FASTEST -- deflate algorithm with only one, lowest compression level - 22,23: 0 (reserved) - - The sprintf variant used by gzprintf (zero is best): - 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format - 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! - 26: 0 = returns value, 1 = void -- 1 means inferred string length returned - - Remainder: - 27-31: 0 (reserved) - */ - - - /* utility functions */ - -/* - The following utility functions are implemented on top of the - basic stream-oriented functions. To simplify the interface, some - default options are assumed (compression level and memory usage, - standard memory allocation functions). The source code of these - utility functions can easily be modified if you need special options. -*/ - -ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen)); -/* - Compresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total - size of the destination buffer, which must be at least the value returned - by compressBound(sourceLen). Upon exit, destLen is the actual size of the - compressed buffer. - This function can be used to compress a whole file at once if the - input file is mmap'ed. - compress returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_BUF_ERROR if there was not enough room in the output - buffer. -*/ - -ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen, - int level)); -/* - Compresses the source buffer into the destination buffer. The level - parameter has the same meaning as in deflateInit. sourceLen is the byte - length of the source buffer. Upon entry, destLen is the total size of the - destination buffer, which must be at least the value returned by - compressBound(sourceLen). Upon exit, destLen is the actual size of the - compressed buffer. - - compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_BUF_ERROR if there was not enough room in the output buffer, - Z_STREAM_ERROR if the level parameter is invalid. -*/ - -ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); -/* - compressBound() returns an upper bound on the compressed size after - compress() or compress2() on sourceLen bytes. It would be used before - a compress() or compress2() call to allocate the destination buffer. -*/ - -ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen)); -/* - Decompresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total - size of the destination buffer, which must be large enough to hold the - entire uncompressed data. (The size of the uncompressed data must have - been saved previously by the compressor and transmitted to the decompressor - by some mechanism outside the scope of this compression library.) - Upon exit, destLen is the actual size of the compressed buffer. - This function can be used to decompress a whole file at once if the - input file is mmap'ed. - - uncompress returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_BUF_ERROR if there was not enough room in the output - buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. -*/ - - -typedef voidp gzFile; - -ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); -/* - Opens a gzip (.gz) file for reading or writing. The mode parameter - is as in fopen ("rb" or "wb") but can also include a compression level - ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for - Huffman only compression as in "wb1h", or 'R' for run-length encoding - as in "wb1R". (See the description of deflateInit2 for more information - about the strategy parameter.) - - gzopen can be used to read a file which is not in gzip format; in this - case gzread will directly read from the file without decompression. - - gzopen returns NULL if the file could not be opened or if there was - insufficient memory to allocate the (de)compression state; errno - can be checked to distinguish the two cases (if errno is zero, the - zlib error is Z_MEM_ERROR). */ - -ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); -/* - gzdopen() associates a gzFile with the file descriptor fd. File - descriptors are obtained from calls like open, dup, creat, pipe or - fileno (in the file has been previously opened with fopen). - The mode parameter is as in gzopen. - The next call of gzclose on the returned gzFile will also close the - file descriptor fd, just like fclose(fdopen(fd), mode) closes the file - descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). - gzdopen returns NULL if there was insufficient memory to allocate - the (de)compression state. -*/ - -ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); -/* - Dynamically update the compression level or strategy. See the description - of deflateInit2 for the meaning of these parameters. - gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not - opened for writing. -*/ - -ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); -/* - Reads the given number of uncompressed bytes from the compressed file. - If the input file was not in gzip format, gzread copies the given number - of bytes into the buffer. - gzread returns the number of uncompressed bytes actually read (0 for - end of file, -1 for error). */ - -ZEXTERN int ZEXPORT gzwrite OF((gzFile file, - voidpc buf, unsigned len)); -/* - Writes the given number of uncompressed bytes into the compressed file. - gzwrite returns the number of uncompressed bytes actually written - (0 in case of error). -*/ - -ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); -/* - Converts, formats, and writes the args to the compressed file under - control of the format string, as in fprintf. gzprintf returns the number of - uncompressed bytes actually written (0 in case of error). The number of - uncompressed bytes written is limited to 4095. The caller should assure that - this limit is not exceeded. If it is exceeded, then gzprintf() will return - return an error (0) with nothing written. In this case, there may also be a - buffer overflow with unpredictable consequences, which is possible only if - zlib was compiled with the insecure functions sprintf() or vsprintf() - because the secure snprintf() or vsnprintf() functions were not available. -*/ - -ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); -/* - Writes the given null-terminated string to the compressed file, excluding - the terminating null character. - gzputs returns the number of characters written, or -1 in case of error. -*/ - -ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); -/* - Reads bytes from the compressed file until len-1 characters are read, or - a newline character is read and transferred to buf, or an end-of-file - condition is encountered. The string is then terminated with a null - character. - gzgets returns buf, or Z_NULL in case of error. -*/ - -ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); -/* - Writes c, converted to an unsigned char, into the compressed file. - gzputc returns the value that was written, or -1 in case of error. -*/ - -ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); -/* - Reads one byte from the compressed file. gzgetc returns this byte - or -1 in case of end of file or error. -*/ - -ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); -/* - Push one character back onto the stream to be read again later. - Only one character of push-back is allowed. gzungetc() returns the - character pushed, or -1 on failure. gzungetc() will fail if a - character has been pushed but not read yet, or if c is -1. The pushed - character will be discarded if the stream is repositioned with gzseek() - or gzrewind(). -*/ - -ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); -/* - Flushes all pending output into the compressed file. The parameter - flush is as in the deflate() function. The return value is the zlib - error number (see function gzerror below). gzflush returns Z_OK if - the flush parameter is Z_FINISH and all output could be flushed. - gzflush should be called only when strictly necessary because it can - degrade compression. -*/ - -ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, - z_off_t offset, int whence)); -/* - Sets the starting position for the next gzread or gzwrite on the - given compressed file. The offset represents a number of bytes in the - uncompressed data stream. The whence parameter is defined as in lseek(2); - the value SEEK_END is not supported. - If the file is opened for reading, this function is emulated but can be - extremely slow. If the file is opened for writing, only forward seeks are - supported; gzseek then compresses a sequence of zeroes up to the new - starting position. - - gzseek returns the resulting offset location as measured in bytes from - the beginning of the uncompressed stream, or -1 in case of error, in - particular if the file is opened for writing and the new starting position - would be before the current position. -*/ - -ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); -/* - Rewinds the given file. This function is supported only for reading. - - gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) -*/ - -ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); -/* - Returns the starting position for the next gzread or gzwrite on the - given compressed file. This position represents a number of bytes in the - uncompressed data stream. - - gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) -*/ - -ZEXTERN int ZEXPORT gzeof OF((gzFile file)); -/* - Returns 1 when EOF has previously been detected reading the given - input stream, otherwise zero. -*/ - -ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); -/* - Returns 1 if file is being read directly without decompression, otherwise - zero. -*/ - -ZEXTERN int ZEXPORT gzclose OF((gzFile file)); -/* - Flushes all pending output if necessary, closes the compressed file - and deallocates all the (de)compression state. The return value is the zlib - error number (see function gzerror below). -*/ - -ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); -/* - Returns the error message for the last error which occurred on the - given compressed file. errnum is set to zlib error number. If an - error occurred in the file system and not in the compression library, - errnum is set to Z_ERRNO and the application may consult errno - to get the exact error code. -*/ - -ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); -/* - Clears the error and end-of-file flags for file. This is analogous to the - clearerr() function in stdio. This is useful for continuing to read a gzip - file that is being written concurrently. -*/ - - /* checksum functions */ - -/* - These functions are not related to compression but are exported - anyway because they might be useful in applications using the - compression library. -*/ - -ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); -/* - Update a running Adler-32 checksum with the bytes buf[0..len-1] and - return the updated checksum. If buf is NULL, this function returns - the required initial value for the checksum. - An Adler-32 checksum is almost as reliable as a CRC32 but can be computed - much faster. Usage example: - - uLong adler = adler32(0L, Z_NULL, 0); - - while (read_buffer(buffer, length) != EOF) { - adler = adler32(adler, buffer, length); - } - if (adler != original_adler) error(); -*/ - -ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, - z_off_t len2)); -/* - Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 - and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for - each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of - seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. -*/ - -ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); -/* - Update a running CRC-32 with the bytes buf[0..len-1] and return the - updated CRC-32. If buf is NULL, this function returns the required initial - value for the for the crc. Pre- and post-conditioning (one's complement) is - performed within this function so it shouldn't be done by the application. - Usage example: - - uLong crc = crc32(0L, Z_NULL, 0); - - while (read_buffer(buffer, length) != EOF) { - crc = crc32(crc, buffer, length); - } - if (crc != original_crc) error(); -*/ - -ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); - -/* - Combine two CRC-32 check values into one. For two sequences of bytes, - seq1 and seq2 with lengths len1 and len2, CRC-32 check values were - calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 - check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and - len2. -*/ - - - /* various hacks, don't look :) */ - -/* deflateInit and inflateInit are macros to allow checking the zlib version - * and the compiler's view of z_stream: - */ -ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, - int windowBits, int memLevel, - int strategy, const char *version, - int stream_size)); -ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, - unsigned char FAR *window, - const char *version, - int stream_size)); -#define deflateInit(strm, level) \ - deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) -#define inflateInit(strm) \ - inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) -#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ - deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ - (strategy), ZLIB_VERSION, sizeof(z_stream)) -#define inflateInit2(strm, windowBits) \ - inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) -#define inflateBackInit(strm, windowBits, window) \ - inflateBackInit_((strm), (windowBits), (window), \ - ZLIB_VERSION, sizeof(z_stream)) - - -#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) - struct internal_state {int dummy;}; /* hack for buggy compilers */ -#endif - -ZEXTERN const char * ZEXPORT zError OF((int)); -ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z)); -ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); - -#ifdef __cplusplus -} -#endif - -#endif /* ZLIB_H */ diff --git a/vendors/zlib/infback.c b/vendors/zlib/infback.c new file mode 100644 index 0000000..f3833c2 --- /dev/null +++ b/vendors/zlib/infback.c @@ -0,0 +1,640 @@ +/* infback.c -- inflate using a call-back interface + * Copyright (C) 1995-2011 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + This code is largely copied from inflate.c. Normally either infback.o or + inflate.o would be linked into an application--not both. The interface + with inffast.c is retained so that optimized assembler-coded versions of + inflate_fast() can be used with either inflate.c or infback.c. + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +/* function prototypes */ +local void fixedtables OF((struct inflate_state FAR *state)); + +/* + strm provides memory allocation functions in zalloc and zfree, or + Z_NULL to use the library memory allocation functions. + + windowBits is in the range 8..15, and window is a user-supplied + window and output buffer that is 2**windowBits bytes. + */ +int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size) +z_streamp strm; +int windowBits; +unsigned char FAR *window; +const char *version; +int stream_size; +{ + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL || window == Z_NULL || + windowBits < 8 || windowBits > 15) + return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; +#endif + } + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif + state = (struct inflate_state FAR *)ZALLOC(strm, 1, + sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (struct internal_state FAR *)state; + state->dmax = 32768U; + state->wbits = windowBits; + state->wsize = 1U << windowBits; + state->window = window; + state->wnext = 0; + state->whave = 0; + return Z_OK; +} + +/* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ +local void fixedtables(state) +struct inflate_state FAR *state; +{ +#ifdef BUILDFIXED + static int virgin = 1; + static code *lenfix, *distfix; + static code fixed[544]; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + unsigned sym, bits; + static code *next; + + /* literal/length table */ + sym = 0; + while (sym < 144) state->lens[sym++] = 8; + while (sym < 256) state->lens[sym++] = 9; + while (sym < 280) state->lens[sym++] = 7; + while (sym < 288) state->lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); + + /* distance table */ + sym = 0; + while (sym < 32) state->lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); + + /* do this just once */ + virgin = 0; + } +#else /* !BUILDFIXED */ +# include "inffixed.h" +#endif /* BUILDFIXED */ + state->lencode = lenfix; + state->lenbits = 9; + state->distcode = distfix; + state->distbits = 5; +} + +/* Macros for inflateBack(): */ + +/* Load returned state from inflate_fast() */ +#define LOAD() \ + do { \ + put = strm->next_out; \ + left = strm->avail_out; \ + next = strm->next_in; \ + have = strm->avail_in; \ + hold = state->hold; \ + bits = state->bits; \ + } while (0) + +/* Set state from registers for inflate_fast() */ +#define RESTORE() \ + do { \ + strm->next_out = put; \ + strm->avail_out = left; \ + strm->next_in = next; \ + strm->avail_in = have; \ + state->hold = hold; \ + state->bits = bits; \ + } while (0) + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Assure that some input is available. If input is requested, but denied, + then return a Z_BUF_ERROR from inflateBack(). */ +#define PULL() \ + do { \ + if (have == 0) { \ + have = in(in_desc, &next); \ + if (have == 0) { \ + next = Z_NULL; \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflateBack() + with an error if there is no input available. */ +#define PULLBYTE() \ + do { \ + PULL(); \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflateBack() with + an error. */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n < 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* Assure that some output space is available, by writing out the window + if it's full. If the write fails, return from inflateBack() with a + Z_BUF_ERROR. */ +#define ROOM() \ + do { \ + if (left == 0) { \ + put = state->window; \ + left = state->wsize; \ + state->whave = left; \ + if (out(out_desc, put, left)) { \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* + strm provides the memory allocation functions and window buffer on input, + and provides information on the unused input on return. For Z_DATA_ERROR + returns, strm will also provide an error message. + + in() and out() are the call-back input and output functions. When + inflateBack() needs more input, it calls in(). When inflateBack() has + filled the window with output, or when it completes with data in the + window, it calls out() to write out the data. The application must not + change the provided input until in() is called again or inflateBack() + returns. The application must not change the window/output buffer until + inflateBack() returns. + + in() and out() are called with a descriptor parameter provided in the + inflateBack() call. This parameter can be a structure that provides the + information required to do the read or write, as well as accumulated + information on the input and output such as totals and check values. + + in() should return zero on failure. out() should return non-zero on + failure. If either in() or out() fails, than inflateBack() returns a + Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it + was in() or out() that caused in the error. Otherwise, inflateBack() + returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format + error, or Z_MEM_ERROR if it could not allocate memory for the state. + inflateBack() can also return Z_STREAM_ERROR if the input parameters + are not correct, i.e. strm is Z_NULL or the state was not initialized. + */ +int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc) +z_streamp strm; +in_func in; +void FAR *in_desc; +out_func out; +void FAR *out_desc; +{ + struct inflate_state FAR *state; + z_const unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have, left; /* available input and output */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code here; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + /* Check that the strm exists and that the state was initialized */ + if (strm == Z_NULL || strm->state == Z_NULL) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* Reset the state */ + strm->msg = Z_NULL; + state->mode = TYPE; + state->last = 0; + state->whave = 0; + next = strm->next_in; + have = next != Z_NULL ? strm->avail_in : 0; + hold = 0; + bits = 0; + put = state->window; + left = state->wsize; + + /* Inflate until end of block marked as last */ + for (;;) + switch (state->mode) { + case TYPE: + /* determine and dispatch block type */ + if (state->last) { + BYTEBITS(); + state->mode = DONE; + break; + } + NEEDBITS(3); + state->last = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + state->last ? " (last)" : "")); + state->mode = STORED; + break; + case 1: /* fixed block */ + fixedtables(state); + Tracev((stderr, "inflate: fixed codes block%s\n", + state->last ? " (last)" : "")); + state->mode = LEN; /* decode codes */ + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + state->last ? " (last)" : "")); + state->mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + state->mode = BAD; + } + DROPBITS(2); + break; + + case STORED: + /* get and verify stored block length */ + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + state->mode = BAD; + break; + } + state->length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %u\n", + state->length)); + INITBITS(); + + /* copy stored block from input to output */ + while (state->length != 0) { + copy = state->length; + PULL(); + ROOM(); + if (copy > have) copy = have; + if (copy > left) copy = left; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + state->length -= copy; + } + Tracev((stderr, "inflate: stored end\n")); + state->mode = TYPE; + break; + + case TABLE: + /* get dynamic table entries descriptor */ + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); +#ifndef PKZIP_BUG_WORKAROUND + if (state->nlen > 286 || state->ndist > 30) { + strm->msg = (char *)"too many length or distance symbols"; + state->mode = BAD; + break; + } +#endif + Tracev((stderr, "inflate: table sizes ok\n")); + + /* get code length code lengths (not a typo) */ + state->have = 0; + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 7; + ret = inflate_table(CODES, state->lens, 19, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + + /* get length and distance code code lengths */ + state->have = 0; + while (state->have < state->nlen + state->ndist) { + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.val < 16) { + DROPBITS(here.bits); + state->lens[state->have++] = here.val; + } + else { + if (here.val == 16) { + NEEDBITS(here.bits + 2); + DROPBITS(here.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + len = (unsigned)(state->lens[state->have - 1]); + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (here.val == 17) { + NEEDBITS(here.bits + 3); + DROPBITS(here.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(here.bits + 7); + DROPBITS(here.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (state->mode == BAD) break; + + /* check for end-of-block code (better have one) */ + if (state->lens[256] == 0) { + strm->msg = (char *)"invalid code -- missing end-of-block"; + state->mode = BAD; + break; + } + + /* build code tables -- note: do not change the lenbits or distbits + values here (9 and 6) without reading the comments in inftrees.h + concerning the ENOUGH constants, which depend on those values */ + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 9; + ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + state->mode = BAD; + break; + } + state->distcode = (code const FAR *)(state->next); + state->distbits = 6; + ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, + &(state->next), &(state->distbits), state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN; + + case LEN: + /* use inflate_fast() if we have enough input and output */ + if (have >= 6 && left >= 258) { + RESTORE(); + if (state->whave < state->wsize) + state->whave = state->wsize - left; + inflate_fast(strm, state->wsize); + LOAD(); + break; + } + + /* get a literal, length, or end-of-block code */ + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.op && (here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(here.bits); + state->length = (unsigned)here.val; + + /* process literal */ + if (here.op == 0) { + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + ROOM(); + *put++ = (unsigned char)(state->length); + left--; + state->mode = LEN; + break; + } + + /* process end of block */ + if (here.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + + /* invalid code */ + if (here.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + + /* length code -- get extra bits, if any */ + state->extra = (unsigned)(here.op) & 15; + if (state->extra != 0) { + NEEDBITS(state->extra); + state->length += BITS(state->extra); + DROPBITS(state->extra); + } + Tracevv((stderr, "inflate: length %u\n", state->length)); + + /* get distance code */ + for (;;) { + here = state->distcode[BITS(state->distbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if ((here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(here.bits); + if (here.op & 64) { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + state->offset = (unsigned)here.val; + + /* get distance extra bits, if any */ + state->extra = (unsigned)(here.op) & 15; + if (state->extra != 0) { + NEEDBITS(state->extra); + state->offset += BITS(state->extra); + DROPBITS(state->extra); + } + if (state->offset > state->wsize - (state->whave < state->wsize ? + left : 0)) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } + Tracevv((stderr, "inflate: distance %u\n", state->offset)); + + /* copy match from window to output */ + do { + ROOM(); + copy = state->wsize - state->offset; + if (copy < left) { + from = put + copy; + copy = left - copy; + } + else { + from = put - state->offset; + copy = left; + } + if (copy > state->length) copy = state->length; + state->length -= copy; + left -= copy; + do { + *put++ = *from++; + } while (--copy); + } while (state->length != 0); + break; + + case DONE: + /* inflate stream terminated properly -- write leftover output */ + ret = Z_STREAM_END; + if (left < state->wsize) { + if (out(out_desc, state->window, state->wsize - left)) + ret = Z_BUF_ERROR; + } + goto inf_leave; + + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + + default: /* can't happen, but makes compilers happy */ + ret = Z_STREAM_ERROR; + goto inf_leave; + } + + /* Return unused input */ + inf_leave: + strm->next_in = next; + strm->avail_in = have; + return ret; +} + +int ZEXPORT inflateBackEnd(strm) +z_streamp strm; +{ + if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) + return Z_STREAM_ERROR; + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} diff --git a/vendors/zlib/inffast.c b/vendors/zlib/inffast.c new file mode 100644 index 0000000..bda59ce --- /dev/null +++ b/vendors/zlib/inffast.c @@ -0,0 +1,340 @@ +/* inffast.c -- fast decoding + * Copyright (C) 1995-2008, 2010, 2013 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +#ifndef ASMINF + +/* Allow machine dependent optimization for post-increment or pre-increment. + Based on testing to date, + Pre-increment preferred for: + - PowerPC G3 (Adler) + - MIPS R5000 (Randers-Pehrson) + Post-increment preferred for: + - none + No measurable difference: + - Pentium III (Anderson) + - M68060 (Nikl) + */ +#ifdef POSTINC +# define OFF 0 +# define PUP(a) *(a)++ +#else +# define OFF 1 +# define PUP(a) *++(a) +#endif + +/* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate execution time is spent in this routine. + + Entry assumptions: + + state->mode == LEN + strm->avail_in >= 6 + strm->avail_out >= 258 + start >= strm->avail_out + state->bits < 8 + + On return, state->mode is one of: + + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data + + Notes: + + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm->avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. + + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm->avail_out >= 258 for each loop to avoid checking for + output space. + */ +void ZLIB_INTERNAL inflate_fast(strm, start) +z_streamp strm; +unsigned start; /* inflate()'s starting value for strm->avail_out */ +{ + struct inflate_state FAR *state; + z_const unsigned char FAR *in; /* local strm->next_in */ + z_const unsigned char FAR *last; /* have enough input while in < last */ + unsigned char FAR *out; /* local strm->next_out */ + unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ + unsigned char FAR *end; /* while out < end, enough space available */ +#ifdef INFLATE_STRICT + unsigned dmax; /* maximum distance from zlib header */ +#endif + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned wnext; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ + unsigned long hold; /* local strm->hold */ + unsigned bits; /* local strm->bits */ + code const FAR *lcode; /* local strm->lencode */ + code const FAR *dcode; /* local strm->distcode */ + unsigned lmask; /* mask for first level of length codes */ + unsigned dmask; /* mask for first level of distance codes */ + code here; /* retrieved table entry */ + unsigned op; /* code bits, operation, extra bits, or */ + /* window position, window bytes to copy */ + unsigned len; /* match length, unused bytes */ + unsigned dist; /* match distance */ + unsigned char FAR *from; /* where to copy match from */ + + /* copy state to local variables */ + state = (struct inflate_state FAR *)strm->state; + in = strm->next_in - OFF; + last = in + (strm->avail_in - 5); + out = strm->next_out - OFF; + beg = out - (start - strm->avail_out); + end = out + (strm->avail_out - 257); +#ifdef INFLATE_STRICT + dmax = state->dmax; +#endif + wsize = state->wsize; + whave = state->whave; + wnext = state->wnext; + window = state->window; + hold = state->hold; + bits = state->bits; + lcode = state->lencode; + dcode = state->distcode; + lmask = (1U << state->lenbits) - 1; + dmask = (1U << state->distbits) - 1; + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ + do { + if (bits < 15) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + here = lcode[hold & lmask]; + dolen: + op = (unsigned)(here.bits); + hold >>= op; + bits -= op; + op = (unsigned)(here.op); + if (op == 0) { /* literal */ + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + PUP(out) = (unsigned char)(here.val); + } + else if (op & 16) { /* length base */ + len = (unsigned)(here.val); + op &= 15; /* number of extra bits */ + if (op) { + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + len += (unsigned)hold & ((1U << op) - 1); + hold >>= op; + bits -= op; + } + Tracevv((stderr, "inflate: length %u\n", len)); + if (bits < 15) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + here = dcode[hold & dmask]; + dodist: + op = (unsigned)(here.bits); + hold >>= op; + bits -= op; + op = (unsigned)(here.op); + if (op & 16) { /* distance base */ + dist = (unsigned)(here.val); + op &= 15; /* number of extra bits */ + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + } + dist += (unsigned)hold & ((1U << op) - 1); +#ifdef INFLATE_STRICT + if (dist > dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + hold >>= op; + bits -= op; + Tracevv((stderr, "inflate: distance %u\n", dist)); + op = (unsigned)(out - beg); /* max distance in output */ + if (dist > op) { /* see if copy from window */ + op = dist - op; /* distance back in window */ + if (op > whave) { + if (state->sane) { + strm->msg = + (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + if (len <= op - whave) { + do { + PUP(out) = 0; + } while (--len); + continue; + } + len -= op - whave; + do { + PUP(out) = 0; + } while (--op > whave); + if (op == 0) { + from = out - dist; + do { + PUP(out) = PUP(from); + } while (--len); + continue; + } +#endif + } + from = window - OFF; + if (wnext == 0) { /* very common case */ + from += wsize - op; + if (op < len) { /* some from window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + else if (wnext < op) { /* wrap around window */ + from += wsize + wnext - op; + op -= wnext; + if (op < len) { /* some from end of window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = window - OFF; + if (wnext < len) { /* some from start of window */ + op = wnext; + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + } + else { /* contiguous in window */ + from += wnext - op; + if (op < len) { /* some from window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + while (len > 2) { + PUP(out) = PUP(from); + PUP(out) = PUP(from); + PUP(out) = PUP(from); + len -= 3; + } + if (len) { + PUP(out) = PUP(from); + if (len > 1) + PUP(out) = PUP(from); + } + } + else { + from = out - dist; /* copy direct from output */ + do { /* minimum length is three */ + PUP(out) = PUP(from); + PUP(out) = PUP(from); + PUP(out) = PUP(from); + len -= 3; + } while (len > 2); + if (len) { + PUP(out) = PUP(from); + if (len > 1) + PUP(out) = PUP(from); + } + } + } + else if ((op & 64) == 0) { /* 2nd level distance code */ + here = dcode[here.val + (hold & ((1U << op) - 1))]; + goto dodist; + } + else { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + } + else if ((op & 64) == 0) { /* 2nd level length code */ + here = lcode[here.val + (hold & ((1U << op) - 1))]; + goto dolen; + } + else if (op & 32) { /* end-of-block */ + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + else { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + } while (in < last && out < end); + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + len = bits >> 3; + in -= len; + bits -= len << 3; + hold &= (1U << bits) - 1; + + /* update state and return */ + strm->next_in = in + OFF; + strm->next_out = out + OFF; + strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); + strm->avail_out = (unsigned)(out < end ? + 257 + (end - out) : 257 - (out - end)); + state->hold = hold; + state->bits = bits; + return; +} + +/* + inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): + - Using bit fields for code structure + - Different op definition to avoid & for extra bits (do & for table bits) + - Three separate decoding do-loops for direct, window, and wnext == 0 + - Special case for distance > 1 copies to do overlapped load and store copy + - Explicit branch predictions (based on measured branch probabilities) + - Deferring match copy and interspersed it with decoding subsequent codes + - Swapping literal/length else + - Swapping window/direct else + - Larger unrolled copy loops (three is about right) + - Moving len -= 3 statement into middle of loop + */ + +#endif /* !ASMINF */ diff --git a/vendors/zlib/inffast.h b/vendors/zlib/inffast.h new file mode 100644 index 0000000..e5c1aa4 --- /dev/null +++ b/vendors/zlib/inffast.h @@ -0,0 +1,11 @@ +/* inffast.h -- header to use inffast.c + * Copyright (C) 1995-2003, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start)); diff --git a/vendors/zlib/inffixed.h b/vendors/zlib/inffixed.h new file mode 100644 index 0000000..d628327 --- /dev/null +++ b/vendors/zlib/inffixed.h @@ -0,0 +1,94 @@ + /* inffixed.h -- table for decoding fixed codes + * Generated automatically by makefixed(). + */ + + /* WARNING: this file should *not* be used by applications. + It is part of the implementation of this library and is + subject to change. Applications should only use zlib.h. + */ + + static const code lenfix[512] = { + {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, + {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, + {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, + {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, + {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, + {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, + {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, + {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, + {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, + {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, + {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, + {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, + {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, + {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, + {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, + {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, + {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, + {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, + {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, + {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, + {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, + {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, + {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, + {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, + {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, + {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, + {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, + {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, + {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, + {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, + {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, + {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, + {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, + {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, + {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, + {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, + {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, + {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, + {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, + {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, + {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, + {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, + {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, + {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, + {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, + {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, + {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, + {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, + {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, + {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, + {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, + {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, + {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, + {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, + {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, + {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, + {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, + {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, + {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, + {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, + {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, + {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, + {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, + {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, + {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, + {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, + {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, + {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, + {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, + {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, + {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, + {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, + {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, + {0,9,255} + }; + + static const code distfix[32] = { + {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, + {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, + {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, + {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, + {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, + {22,5,193},{64,5,0} + }; diff --git a/vendors/zlib/inflate.c b/vendors/zlib/inflate.c new file mode 100644 index 0000000..870f89b --- /dev/null +++ b/vendors/zlib/inflate.c @@ -0,0 +1,1512 @@ +/* inflate.c -- zlib decompression + * Copyright (C) 1995-2012 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * Change history: + * + * 1.2.beta0 24 Nov 2002 + * - First version -- complete rewrite of inflate to simplify code, avoid + * creation of window when not needed, minimize use of window when it is + * needed, make inffast.c even faster, implement gzip decoding, and to + * improve code readability and style over the previous zlib inflate code + * + * 1.2.beta1 25 Nov 2002 + * - Use pointers for available input and output checking in inffast.c + * - Remove input and output counters in inffast.c + * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 + * - Remove unnecessary second byte pull from length extra in inffast.c + * - Unroll direct copy to three copies per loop in inffast.c + * + * 1.2.beta2 4 Dec 2002 + * - Change external routine names to reduce potential conflicts + * - Correct filename to inffixed.h for fixed tables in inflate.c + * - Make hbuf[] unsigned char to match parameter type in inflate.c + * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) + * to avoid negation problem on Alphas (64 bit) in inflate.c + * + * 1.2.beta3 22 Dec 2002 + * - Add comments on state->bits assertion in inffast.c + * - Add comments on op field in inftrees.h + * - Fix bug in reuse of allocated window after inflateReset() + * - Remove bit fields--back to byte structure for speed + * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths + * - Change post-increments to pre-increments in inflate_fast(), PPC biased? + * - Add compile time option, POSTINC, to use post-increments instead (Intel?) + * - Make MATCH copy in inflate() much faster for when inflate_fast() not used + * - Use local copies of stream next and avail values, as well as local bit + * buffer and bit count in inflate()--for speed when inflate_fast() not used + * + * 1.2.beta4 1 Jan 2003 + * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings + * - Move a comment on output buffer sizes from inffast.c to inflate.c + * - Add comments in inffast.c to introduce the inflate_fast() routine + * - Rearrange window copies in inflate_fast() for speed and simplification + * - Unroll last copy for window match in inflate_fast() + * - Use local copies of window variables in inflate_fast() for speed + * - Pull out common wnext == 0 case for speed in inflate_fast() + * - Make op and len in inflate_fast() unsigned for consistency + * - Add FAR to lcode and dcode declarations in inflate_fast() + * - Simplified bad distance check in inflate_fast() + * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new + * source file infback.c to provide a call-back interface to inflate for + * programs like gzip and unzip -- uses window as output buffer to avoid + * window copying + * + * 1.2.beta5 1 Jan 2003 + * - Improved inflateBack() interface to allow the caller to provide initial + * input in strm. + * - Fixed stored blocks bug in inflateBack() + * + * 1.2.beta6 4 Jan 2003 + * - Added comments in inffast.c on effectiveness of POSTINC + * - Typecasting all around to reduce compiler warnings + * - Changed loops from while (1) or do {} while (1) to for (;;), again to + * make compilers happy + * - Changed type of window in inflateBackInit() to unsigned char * + * + * 1.2.beta7 27 Jan 2003 + * - Changed many types to unsigned or unsigned short to avoid warnings + * - Added inflateCopy() function + * + * 1.2.0 9 Mar 2003 + * - Changed inflateBack() interface to provide separate opaque descriptors + * for the in() and out() functions + * - Changed inflateBack() argument and in_func typedef to swap the length + * and buffer address return values for the input function + * - Check next_in and next_out for Z_NULL on entry to inflate() + * + * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +#ifdef MAKEFIXED +# ifndef BUILDFIXED +# define BUILDFIXED +# endif +#endif + +/* function prototypes */ +local void fixedtables OF((struct inflate_state FAR *state)); +local int updatewindow OF((z_streamp strm, const unsigned char FAR *end, + unsigned copy)); +#ifdef BUILDFIXED + void makefixed OF((void)); +#endif +local unsigned syncsearch OF((unsigned FAR *have, const unsigned char FAR *buf, + unsigned len)); + +int ZEXPORT inflateResetKeep(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + strm->total_in = strm->total_out = state->total = 0; + strm->msg = Z_NULL; + if (state->wrap) /* to support ill-conceived Java test suite */ + strm->adler = state->wrap & 1; + state->mode = HEAD; + state->last = 0; + state->havedict = 0; + state->dmax = 32768U; + state->head = Z_NULL; + state->hold = 0; + state->bits = 0; + state->lencode = state->distcode = state->next = state->codes; + state->sane = 1; + state->back = -1; + Tracev((stderr, "inflate: reset\n")); + return Z_OK; +} + +int ZEXPORT inflateReset(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + state->wsize = 0; + state->whave = 0; + state->wnext = 0; + return inflateResetKeep(strm); +} + +int ZEXPORT inflateReset2(strm, windowBits) +z_streamp strm; +int windowBits; +{ + int wrap; + struct inflate_state FAR *state; + + /* get the state */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* extract wrap request from windowBits parameter */ + if (windowBits < 0) { + wrap = 0; + windowBits = -windowBits; + } + else { + wrap = (windowBits >> 4) + 1; +#ifdef GUNZIP + if (windowBits < 48) + windowBits &= 15; +#endif + } + + /* set number of window bits, free window if different */ + if (windowBits && (windowBits < 8 || windowBits > 15)) + return Z_STREAM_ERROR; + if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) { + ZFREE(strm, state->window); + state->window = Z_NULL; + } + + /* update state and reset the rest of it */ + state->wrap = wrap; + state->wbits = (unsigned)windowBits; + return inflateReset(strm); +} + +int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) +z_streamp strm; +int windowBits; +const char *version; +int stream_size; +{ + int ret; + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL) return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; +#endif + } + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif + state = (struct inflate_state FAR *) + ZALLOC(strm, 1, sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (struct internal_state FAR *)state; + state->window = Z_NULL; + ret = inflateReset2(strm, windowBits); + if (ret != Z_OK) { + ZFREE(strm, state); + strm->state = Z_NULL; + } + return ret; +} + +int ZEXPORT inflateInit_(strm, version, stream_size) +z_streamp strm; +const char *version; +int stream_size; +{ + return inflateInit2_(strm, DEF_WBITS, version, stream_size); +} + +int ZEXPORT inflatePrime(strm, bits, value) +z_streamp strm; +int bits; +int value; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (bits < 0) { + state->hold = 0; + state->bits = 0; + return Z_OK; + } + if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; + value &= (1L << bits) - 1; + state->hold += value << state->bits; + state->bits += bits; + return Z_OK; +} + +/* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ +local void fixedtables(state) +struct inflate_state FAR *state; +{ +#ifdef BUILDFIXED + static int virgin = 1; + static code *lenfix, *distfix; + static code fixed[544]; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + unsigned sym, bits; + static code *next; + + /* literal/length table */ + sym = 0; + while (sym < 144) state->lens[sym++] = 8; + while (sym < 256) state->lens[sym++] = 9; + while (sym < 280) state->lens[sym++] = 7; + while (sym < 288) state->lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); + + /* distance table */ + sym = 0; + while (sym < 32) state->lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); + + /* do this just once */ + virgin = 0; + } +#else /* !BUILDFIXED */ +# include "inffixed.h" +#endif /* BUILDFIXED */ + state->lencode = lenfix; + state->lenbits = 9; + state->distcode = distfix; + state->distbits = 5; +} + +#ifdef MAKEFIXED +#include + +/* + Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also + defines BUILDFIXED, so the tables are built on the fly. makefixed() writes + those tables to stdout, which would be piped to inffixed.h. A small program + can simply call makefixed to do this: + + void makefixed(void); + + int main(void) + { + makefixed(); + return 0; + } + + Then that can be linked with zlib built with MAKEFIXED defined and run: + + a.out > inffixed.h + */ +void makefixed() +{ + unsigned low, size; + struct inflate_state state; + + fixedtables(&state); + puts(" /* inffixed.h -- table for decoding fixed codes"); + puts(" * Generated automatically by makefixed()."); + puts(" */"); + puts(""); + puts(" /* WARNING: this file should *not* be used by applications."); + puts(" It is part of the implementation of this library and is"); + puts(" subject to change. Applications should only use zlib.h."); + puts(" */"); + puts(""); + size = 1U << 9; + printf(" static const code lenfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 7) == 0) printf("\n "); + printf("{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op, + state.lencode[low].bits, state.lencode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); + size = 1U << 5; + printf("\n static const code distfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 6) == 0) printf("\n "); + printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, + state.distcode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); +} +#endif /* MAKEFIXED */ + +/* + Update the window with the last wsize (normally 32K) bytes written before + returning. If window does not exist yet, create it. This is only called + when a window is already in use, or when output has been written during this + inflate call, but the end of the deflate stream has not been reached yet. + It is also called to create a window for dictionary data when a dictionary + is loaded. + + Providing output buffers larger than 32K to inflate() should provide a speed + advantage, since only the last 32K of output is copied to the sliding window + upon return from inflate(), and since all distances after the first 32K of + output will fall in the output data, making match copies simpler and faster. + The advantage may be dependent on the size of the processor's data caches. + */ +local int updatewindow(strm, end, copy) +z_streamp strm; +const Bytef *end; +unsigned copy; +{ + struct inflate_state FAR *state; + unsigned dist; + + state = (struct inflate_state FAR *)strm->state; + + /* if it hasn't been done already, allocate space for the window */ + if (state->window == Z_NULL) { + state->window = (unsigned char FAR *) + ZALLOC(strm, 1U << state->wbits, + sizeof(unsigned char)); + if (state->window == Z_NULL) return 1; + } + + /* if window not in use yet, initialize */ + if (state->wsize == 0) { + state->wsize = 1U << state->wbits; + state->wnext = 0; + state->whave = 0; + } + + /* copy state->wsize or less output bytes into the circular window */ + if (copy >= state->wsize) { + zmemcpy(state->window, end - state->wsize, state->wsize); + state->wnext = 0; + state->whave = state->wsize; + } + else { + dist = state->wsize - state->wnext; + if (dist > copy) dist = copy; + zmemcpy(state->window + state->wnext, end - copy, dist); + copy -= dist; + if (copy) { + zmemcpy(state->window, end - copy, copy); + state->wnext = copy; + state->whave = state->wsize; + } + else { + state->wnext += dist; + if (state->wnext == state->wsize) state->wnext = 0; + if (state->whave < state->wsize) state->whave += dist; + } + } + return 0; +} + +/* Macros for inflate(): */ + +/* check function to use adler32() for zlib or crc32() for gzip */ +#ifdef GUNZIP +# define UPDATE(check, buf, len) \ + (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) +#else +# define UPDATE(check, buf, len) adler32(check, buf, len) +#endif + +/* check macros for header crc */ +#ifdef GUNZIP +# define CRC2(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + check = crc32(check, hbuf, 2); \ + } while (0) + +# define CRC4(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + hbuf[2] = (unsigned char)((word) >> 16); \ + hbuf[3] = (unsigned char)((word) >> 24); \ + check = crc32(check, hbuf, 4); \ + } while (0) +#endif + +/* Load registers with state in inflate() for speed */ +#define LOAD() \ + do { \ + put = strm->next_out; \ + left = strm->avail_out; \ + next = strm->next_in; \ + have = strm->avail_in; \ + hold = state->hold; \ + bits = state->bits; \ + } while (0) + +/* Restore state from registers in inflate() */ +#define RESTORE() \ + do { \ + strm->next_out = put; \ + strm->avail_out = left; \ + strm->next_in = next; \ + strm->avail_in = have; \ + state->hold = hold; \ + state->bits = bits; \ + } while (0) + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflate() + if there is no input available. */ +#define PULLBYTE() \ + do { \ + if (have == 0) goto inf_leave; \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflate(). */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n < 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* + inflate() uses a state machine to process as much input data and generate as + much output data as possible before returning. The state machine is + structured roughly as follows: + + for (;;) switch (state) { + ... + case STATEn: + if (not enough input data or output space to make progress) + return; + ... make progress ... + state = STATEm; + break; + ... + } + + so when inflate() is called again, the same case is attempted again, and + if the appropriate resources are provided, the machine proceeds to the + next state. The NEEDBITS() macro is usually the way the state evaluates + whether it can proceed or should return. NEEDBITS() does the return if + the requested bits are not available. The typical use of the BITS macros + is: + + NEEDBITS(n); + ... do something with BITS(n) ... + DROPBITS(n); + + where NEEDBITS(n) either returns from inflate() if there isn't enough + input left to load n bits into the accumulator, or it continues. BITS(n) + gives the low n bits in the accumulator. When done, DROPBITS(n) drops + the low n bits off the accumulator. INITBITS() clears the accumulator + and sets the number of available bits to zero. BYTEBITS() discards just + enough bits to put the accumulator on a byte boundary. After BYTEBITS() + and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. + + NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return + if there is no input available. The decoding of variable length codes uses + PULLBYTE() directly in order to pull just enough bytes to decode the next + code, and no more. + + Some states loop until they get enough input, making sure that enough + state information is maintained to continue the loop where it left off + if NEEDBITS() returns in the loop. For example, want, need, and keep + would all have to actually be part of the saved state in case NEEDBITS() + returns: + + case STATEw: + while (want < need) { + NEEDBITS(n); + keep[want++] = BITS(n); + DROPBITS(n); + } + state = STATEx; + case STATEx: + + As shown above, if the next state is also the next case, then the break + is omitted. + + A state may also return if there is not enough output space available to + complete that state. Those states are copying stored data, writing a + literal byte, and copying a matching string. + + When returning, a "goto inf_leave" is used to update the total counters, + update the check value, and determine whether any progress has been made + during that inflate() call in order to return the proper return code. + Progress is defined as a change in either strm->avail_in or strm->avail_out. + When there is a window, goto inf_leave will update the window with the last + output written. If a goto inf_leave occurs in the middle of decompression + and there is no window currently, goto inf_leave will create one and copy + output to the window for the next call of inflate(). + + In this implementation, the flush parameter of inflate() only affects the + return code (per zlib.h). inflate() always writes as much as possible to + strm->next_out, given the space available and the provided input--the effect + documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers + the allocation of and copying into a sliding window until necessary, which + provides the effect documented in zlib.h for Z_FINISH when the entire input + stream available. So the only thing the flush parameter actually does is: + when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it + will return Z_BUF_ERROR if it has not reached the end of the stream. + */ + +int ZEXPORT inflate(strm, flush) +z_streamp strm; +int flush; +{ + struct inflate_state FAR *state; + z_const unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have, left; /* available input and output */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned in, out; /* save starting available input and output */ + unsigned copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code here; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ +#ifdef GUNZIP + unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ +#endif + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL || + (strm->next_in == Z_NULL && strm->avail_in != 0)) + return Z_STREAM_ERROR; + + state = (struct inflate_state FAR *)strm->state; + if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ + LOAD(); + in = have; + out = left; + ret = Z_OK; + for (;;) + switch (state->mode) { + case HEAD: + if (state->wrap == 0) { + state->mode = TYPEDO; + break; + } + NEEDBITS(16); +#ifdef GUNZIP + if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ + state->check = crc32(0L, Z_NULL, 0); + CRC2(state->check, hold); + INITBITS(); + state->mode = FLAGS; + break; + } + state->flags = 0; /* expect zlib header */ + if (state->head != Z_NULL) + state->head->done = -1; + if (!(state->wrap & 1) || /* check if zlib header allowed */ +#else + if ( +#endif + ((BITS(8) << 8) + (hold >> 8)) % 31) { + strm->msg = (char *)"incorrect header check"; + state->mode = BAD; + break; + } + if (BITS(4) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + DROPBITS(4); + len = BITS(4) + 8; + if (state->wbits == 0) + state->wbits = len; + else if (len > state->wbits) { + strm->msg = (char *)"invalid window size"; + state->mode = BAD; + break; + } + state->dmax = 1U << len; + Tracev((stderr, "inflate: zlib header ok\n")); + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = hold & 0x200 ? DICTID : TYPE; + INITBITS(); + break; +#ifdef GUNZIP + case FLAGS: + NEEDBITS(16); + state->flags = (int)(hold); + if ((state->flags & 0xff) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + if (state->flags & 0xe000) { + strm->msg = (char *)"unknown header flags set"; + state->mode = BAD; + break; + } + if (state->head != Z_NULL) + state->head->text = (int)((hold >> 8) & 1); + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + state->mode = TIME; + case TIME: + NEEDBITS(32); + if (state->head != Z_NULL) + state->head->time = hold; + if (state->flags & 0x0200) CRC4(state->check, hold); + INITBITS(); + state->mode = OS; + case OS: + NEEDBITS(16); + if (state->head != Z_NULL) { + state->head->xflags = (int)(hold & 0xff); + state->head->os = (int)(hold >> 8); + } + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + state->mode = EXLEN; + case EXLEN: + if (state->flags & 0x0400) { + NEEDBITS(16); + state->length = (unsigned)(hold); + if (state->head != Z_NULL) + state->head->extra_len = (unsigned)hold; + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + } + else if (state->head != Z_NULL) + state->head->extra = Z_NULL; + state->mode = EXTRA; + case EXTRA: + if (state->flags & 0x0400) { + copy = state->length; + if (copy > have) copy = have; + if (copy) { + if (state->head != Z_NULL && + state->head->extra != Z_NULL) { + len = state->head->extra_len - state->length; + zmemcpy(state->head->extra + len, next, + len + copy > state->head->extra_max ? + state->head->extra_max - len : copy); + } + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + state->length -= copy; + } + if (state->length) goto inf_leave; + } + state->length = 0; + state->mode = NAME; + case NAME: + if (state->flags & 0x0800) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->name != Z_NULL && + state->length < state->head->name_max) + state->head->name[state->length++] = len; + } while (len && copy < have); + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->name = Z_NULL; + state->length = 0; + state->mode = COMMENT; + case COMMENT: + if (state->flags & 0x1000) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->comment != Z_NULL && + state->length < state->head->comm_max) + state->head->comment[state->length++] = len; + } while (len && copy < have); + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->comment = Z_NULL; + state->mode = HCRC; + case HCRC: + if (state->flags & 0x0200) { + NEEDBITS(16); + if (hold != (state->check & 0xffff)) { + strm->msg = (char *)"header crc mismatch"; + state->mode = BAD; + break; + } + INITBITS(); + } + if (state->head != Z_NULL) { + state->head->hcrc = (int)((state->flags >> 9) & 1); + state->head->done = 1; + } + strm->adler = state->check = crc32(0L, Z_NULL, 0); + state->mode = TYPE; + break; +#endif + case DICTID: + NEEDBITS(32); + strm->adler = state->check = ZSWAP32(hold); + INITBITS(); + state->mode = DICT; + case DICT: + if (state->havedict == 0) { + RESTORE(); + return Z_NEED_DICT; + } + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = TYPE; + case TYPE: + if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; + case TYPEDO: + if (state->last) { + BYTEBITS(); + state->mode = CHECK; + break; + } + NEEDBITS(3); + state->last = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + state->last ? " (last)" : "")); + state->mode = STORED; + break; + case 1: /* fixed block */ + fixedtables(state); + Tracev((stderr, "inflate: fixed codes block%s\n", + state->last ? " (last)" : "")); + state->mode = LEN_; /* decode codes */ + if (flush == Z_TREES) { + DROPBITS(2); + goto inf_leave; + } + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + state->last ? " (last)" : "")); + state->mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + state->mode = BAD; + } + DROPBITS(2); + break; + case STORED: + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + state->mode = BAD; + break; + } + state->length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %u\n", + state->length)); + INITBITS(); + state->mode = COPY_; + if (flush == Z_TREES) goto inf_leave; + case COPY_: + state->mode = COPY; + case COPY: + copy = state->length; + if (copy) { + if (copy > have) copy = have; + if (copy > left) copy = left; + if (copy == 0) goto inf_leave; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + state->length -= copy; + break; + } + Tracev((stderr, "inflate: stored end\n")); + state->mode = TYPE; + break; + case TABLE: + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); +#ifndef PKZIP_BUG_WORKAROUND + if (state->nlen > 286 || state->ndist > 30) { + strm->msg = (char *)"too many length or distance symbols"; + state->mode = BAD; + break; + } +#endif + Tracev((stderr, "inflate: table sizes ok\n")); + state->have = 0; + state->mode = LENLENS; + case LENLENS: + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + state->lencode = (const code FAR *)(state->next); + state->lenbits = 7; + ret = inflate_table(CODES, state->lens, 19, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + state->have = 0; + state->mode = CODELENS; + case CODELENS: + while (state->have < state->nlen + state->ndist) { + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.val < 16) { + DROPBITS(here.bits); + state->lens[state->have++] = here.val; + } + else { + if (here.val == 16) { + NEEDBITS(here.bits + 2); + DROPBITS(here.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + len = state->lens[state->have - 1]; + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (here.val == 17) { + NEEDBITS(here.bits + 3); + DROPBITS(here.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(here.bits + 7); + DROPBITS(here.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (state->mode == BAD) break; + + /* check for end-of-block code (better have one) */ + if (state->lens[256] == 0) { + strm->msg = (char *)"invalid code -- missing end-of-block"; + state->mode = BAD; + break; + } + + /* build code tables -- note: do not change the lenbits or distbits + values here (9 and 6) without reading the comments in inftrees.h + concerning the ENOUGH constants, which depend on those values */ + state->next = state->codes; + state->lencode = (const code FAR *)(state->next); + state->lenbits = 9; + ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + state->mode = BAD; + break; + } + state->distcode = (const code FAR *)(state->next); + state->distbits = 6; + ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, + &(state->next), &(state->distbits), state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN_; + if (flush == Z_TREES) goto inf_leave; + case LEN_: + state->mode = LEN; + case LEN: + if (have >= 6 && left >= 258) { + RESTORE(); + inflate_fast(strm, out); + LOAD(); + if (state->mode == TYPE) + state->back = -1; + break; + } + state->back = 0; + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.op && (here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + state->back += last.bits; + } + DROPBITS(here.bits); + state->back += here.bits; + state->length = (unsigned)here.val; + if ((int)(here.op) == 0) { + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + state->mode = LIT; + break; + } + if (here.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + state->back = -1; + state->mode = TYPE; + break; + } + if (here.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + state->extra = (unsigned)(here.op) & 15; + state->mode = LENEXT; + case LENEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->length += BITS(state->extra); + DROPBITS(state->extra); + state->back += state->extra; + } + Tracevv((stderr, "inflate: length %u\n", state->length)); + state->was = state->length; + state->mode = DIST; + case DIST: + for (;;) { + here = state->distcode[BITS(state->distbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if ((here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + state->back += last.bits; + } + DROPBITS(here.bits); + state->back += here.bits; + if (here.op & 64) { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + state->offset = (unsigned)here.val; + state->extra = (unsigned)(here.op) & 15; + state->mode = DISTEXT; + case DISTEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->offset += BITS(state->extra); + DROPBITS(state->extra); + state->back += state->extra; + } +#ifdef INFLATE_STRICT + if (state->offset > state->dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + Tracevv((stderr, "inflate: distance %u\n", state->offset)); + state->mode = MATCH; + case MATCH: + if (left == 0) goto inf_leave; + copy = out - left; + if (state->offset > copy) { /* copy from window */ + copy = state->offset - copy; + if (copy > state->whave) { + if (state->sane) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + Trace((stderr, "inflate.c too far\n")); + copy -= state->whave; + if (copy > state->length) copy = state->length; + if (copy > left) copy = left; + left -= copy; + state->length -= copy; + do { + *put++ = 0; + } while (--copy); + if (state->length == 0) state->mode = LEN; + break; +#endif + } + if (copy > state->wnext) { + copy -= state->wnext; + from = state->window + (state->wsize - copy); + } + else + from = state->window + (state->wnext - copy); + if (copy > state->length) copy = state->length; + } + else { /* copy from output */ + from = put - state->offset; + copy = state->length; + } + if (copy > left) copy = left; + left -= copy; + state->length -= copy; + do { + *put++ = *from++; + } while (--copy); + if (state->length == 0) state->mode = LEN; + break; + case LIT: + if (left == 0) goto inf_leave; + *put++ = (unsigned char)(state->length); + left--; + state->mode = LEN; + break; + case CHECK: + if (state->wrap) { + NEEDBITS(32); + out -= left; + strm->total_out += out; + state->total += out; + if (out) + strm->adler = state->check = + UPDATE(state->check, put - out, out); + out = left; + if (( +#ifdef GUNZIP + state->flags ? hold : +#endif + ZSWAP32(hold)) != state->check) { + strm->msg = (char *)"incorrect data check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: check matches trailer\n")); + } +#ifdef GUNZIP + state->mode = LENGTH; + case LENGTH: + if (state->wrap && state->flags) { + NEEDBITS(32); + if (hold != (state->total & 0xffffffffUL)) { + strm->msg = (char *)"incorrect length check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: length matches trailer\n")); + } +#endif + state->mode = DONE; + case DONE: + ret = Z_STREAM_END; + goto inf_leave; + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + case MEM: + return Z_MEM_ERROR; + case SYNC: + default: + return Z_STREAM_ERROR; + } + + /* + Return from inflate(), updating the total counts and the check value. + If there was no progress during the inflate() call, return a buffer + error. Call updatewindow() to create and/or update the window state. + Note: a memory error from inflate() is non-recoverable. + */ + inf_leave: + RESTORE(); + if (state->wsize || (out != strm->avail_out && state->mode < BAD && + (state->mode < CHECK || flush != Z_FINISH))) + if (updatewindow(strm, strm->next_out, out - strm->avail_out)) { + state->mode = MEM; + return Z_MEM_ERROR; + } + in -= strm->avail_in; + out -= strm->avail_out; + strm->total_in += in; + strm->total_out += out; + state->total += out; + if (state->wrap && out) + strm->adler = state->check = + UPDATE(state->check, strm->next_out - out, out); + strm->data_type = state->bits + (state->last ? 64 : 0) + + (state->mode == TYPE ? 128 : 0) + + (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0); + if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) + ret = Z_BUF_ERROR; + return ret; +} + +int ZEXPORT inflateEnd(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->window != Z_NULL) ZFREE(strm, state->window); + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} + +int ZEXPORT inflateGetDictionary(strm, dictionary, dictLength) +z_streamp strm; +Bytef *dictionary; +uInt *dictLength; +{ + struct inflate_state FAR *state; + + /* check state */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* copy dictionary */ + if (state->whave && dictionary != Z_NULL) { + zmemcpy(dictionary, state->window + state->wnext, + state->whave - state->wnext); + zmemcpy(dictionary + state->whave - state->wnext, + state->window, state->wnext); + } + if (dictLength != Z_NULL) + *dictLength = state->whave; + return Z_OK; +} + +int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) +z_streamp strm; +const Bytef *dictionary; +uInt dictLength; +{ + struct inflate_state FAR *state; + unsigned long dictid; + int ret; + + /* check state */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->wrap != 0 && state->mode != DICT) + return Z_STREAM_ERROR; + + /* check for correct dictionary identifier */ + if (state->mode == DICT) { + dictid = adler32(0L, Z_NULL, 0); + dictid = adler32(dictid, dictionary, dictLength); + if (dictid != state->check) + return Z_DATA_ERROR; + } + + /* copy dictionary to window using updatewindow(), which will amend the + existing dictionary if appropriate */ + ret = updatewindow(strm, dictionary + dictLength, dictLength); + if (ret) { + state->mode = MEM; + return Z_MEM_ERROR; + } + state->havedict = 1; + Tracev((stderr, "inflate: dictionary set\n")); + return Z_OK; +} + +int ZEXPORT inflateGetHeader(strm, head) +z_streamp strm; +gz_headerp head; +{ + struct inflate_state FAR *state; + + /* check state */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; + + /* save header structure */ + state->head = head; + head->done = 0; + return Z_OK; +} + +/* + Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found + or when out of input. When called, *have is the number of pattern bytes + found in order so far, in 0..3. On return *have is updated to the new + state. If on return *have equals four, then the pattern was found and the + return value is how many bytes were read including the last byte of the + pattern. If *have is less than four, then the pattern has not been found + yet and the return value is len. In the latter case, syncsearch() can be + called again with more data and the *have state. *have is initialized to + zero for the first call. + */ +local unsigned syncsearch(have, buf, len) +unsigned FAR *have; +const unsigned char FAR *buf; +unsigned len; +{ + unsigned got; + unsigned next; + + got = *have; + next = 0; + while (next < len && got < 4) { + if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) + got++; + else if (buf[next]) + got = 0; + else + got = 4 - got; + next++; + } + *have = got; + return next; +} + +int ZEXPORT inflateSync(strm) +z_streamp strm; +{ + unsigned len; /* number of bytes to look at or looked at */ + unsigned long in, out; /* temporary to save total_in and total_out */ + unsigned char buf[4]; /* to restore bit buffer to byte string */ + struct inflate_state FAR *state; + + /* check parameters */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; + + /* if first time, start search in bit buffer */ + if (state->mode != SYNC) { + state->mode = SYNC; + state->hold <<= state->bits & 7; + state->bits -= state->bits & 7; + len = 0; + while (state->bits >= 8) { + buf[len++] = (unsigned char)(state->hold); + state->hold >>= 8; + state->bits -= 8; + } + state->have = 0; + syncsearch(&(state->have), buf, len); + } + + /* search available input */ + len = syncsearch(&(state->have), strm->next_in, strm->avail_in); + strm->avail_in -= len; + strm->next_in += len; + strm->total_in += len; + + /* return no joy or set up to restart inflate() on a new block */ + if (state->have != 4) return Z_DATA_ERROR; + in = strm->total_in; out = strm->total_out; + inflateReset(strm); + strm->total_in = in; strm->total_out = out; + state->mode = TYPE; + return Z_OK; +} + +/* + Returns true if inflate is currently at the end of a block generated by + Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP + implementation to provide an additional safety check. PPP uses + Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored + block. When decompressing, PPP checks that at the end of input packet, + inflate is waiting for these length bytes. + */ +int ZEXPORT inflateSyncPoint(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + return state->mode == STORED && state->bits == 0; +} + +int ZEXPORT inflateCopy(dest, source) +z_streamp dest; +z_streamp source; +{ + struct inflate_state FAR *state; + struct inflate_state FAR *copy; + unsigned char FAR *window; + unsigned wsize; + + /* check input */ + if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL || + source->zalloc == (alloc_func)0 || source->zfree == (free_func)0) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)source->state; + + /* allocate space */ + copy = (struct inflate_state FAR *) + ZALLOC(source, 1, sizeof(struct inflate_state)); + if (copy == Z_NULL) return Z_MEM_ERROR; + window = Z_NULL; + if (state->window != Z_NULL) { + window = (unsigned char FAR *) + ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); + if (window == Z_NULL) { + ZFREE(source, copy); + return Z_MEM_ERROR; + } + } + + /* copy state */ + zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); + zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state)); + if (state->lencode >= state->codes && + state->lencode <= state->codes + ENOUGH - 1) { + copy->lencode = copy->codes + (state->lencode - state->codes); + copy->distcode = copy->codes + (state->distcode - state->codes); + } + copy->next = copy->codes + (state->next - state->codes); + if (window != Z_NULL) { + wsize = 1U << state->wbits; + zmemcpy(window, state->window, wsize); + } + copy->window = window; + dest->state = (struct internal_state FAR *)copy; + return Z_OK; +} + +int ZEXPORT inflateUndermine(strm, subvert) +z_streamp strm; +int subvert; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + state->sane = !subvert; +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + return Z_OK; +#else + state->sane = 1; + return Z_DATA_ERROR; +#endif +} + +long ZEXPORT inflateMark(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return -1L << 16; + state = (struct inflate_state FAR *)strm->state; + return ((long)(state->back) << 16) + + (state->mode == COPY ? state->length : + (state->mode == MATCH ? state->was - state->length : 0)); +} diff --git a/vendors/zlib/inflate.h b/vendors/zlib/inflate.h new file mode 100644 index 0000000..95f4986 --- /dev/null +++ b/vendors/zlib/inflate.h @@ -0,0 +1,122 @@ +/* inflate.h -- internal inflate state definition + * Copyright (C) 1995-2009 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* define NO_GZIP when compiling if you want to disable gzip header and + trailer decoding by inflate(). NO_GZIP would be used to avoid linking in + the crc code when it is not needed. For shared libraries, gzip decoding + should be left enabled. */ +#ifndef NO_GZIP +# define GUNZIP +#endif + +/* Possible inflate modes between inflate() calls */ +typedef enum { + HEAD, /* i: waiting for magic header */ + FLAGS, /* i: waiting for method and flags (gzip) */ + TIME, /* i: waiting for modification time (gzip) */ + OS, /* i: waiting for extra flags and operating system (gzip) */ + EXLEN, /* i: waiting for extra length (gzip) */ + EXTRA, /* i: waiting for extra bytes (gzip) */ + NAME, /* i: waiting for end of file name (gzip) */ + COMMENT, /* i: waiting for end of comment (gzip) */ + HCRC, /* i: waiting for header crc (gzip) */ + DICTID, /* i: waiting for dictionary check value */ + DICT, /* waiting for inflateSetDictionary() call */ + TYPE, /* i: waiting for type bits, including last-flag bit */ + TYPEDO, /* i: same, but skip check to exit inflate on new block */ + STORED, /* i: waiting for stored size (length and complement) */ + COPY_, /* i/o: same as COPY below, but only first time in */ + COPY, /* i/o: waiting for input or output to copy stored block */ + TABLE, /* i: waiting for dynamic block table lengths */ + LENLENS, /* i: waiting for code length code lengths */ + CODELENS, /* i: waiting for length/lit and distance code lengths */ + LEN_, /* i: same as LEN below, but only first time in */ + LEN, /* i: waiting for length/lit/eob code */ + LENEXT, /* i: waiting for length extra bits */ + DIST, /* i: waiting for distance code */ + DISTEXT, /* i: waiting for distance extra bits */ + MATCH, /* o: waiting for output space to copy string */ + LIT, /* o: waiting for output space to write literal */ + CHECK, /* i: waiting for 32-bit check value */ + LENGTH, /* i: waiting for 32-bit length (gzip) */ + DONE, /* finished check, done -- remain here until reset */ + BAD, /* got a data error -- remain here until reset */ + MEM, /* got an inflate() memory error -- remain here until reset */ + SYNC /* looking for synchronization bytes to restart inflate() */ +} inflate_mode; + +/* + State transitions between above modes - + + (most modes can go to BAD or MEM on error -- not shown for clarity) + + Process header: + HEAD -> (gzip) or (zlib) or (raw) + (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME -> COMMENT -> + HCRC -> TYPE + (zlib) -> DICTID or TYPE + DICTID -> DICT -> TYPE + (raw) -> TYPEDO + Read deflate blocks: + TYPE -> TYPEDO -> STORED or TABLE or LEN_ or CHECK + STORED -> COPY_ -> COPY -> TYPE + TABLE -> LENLENS -> CODELENS -> LEN_ + LEN_ -> LEN + Read deflate codes in fixed or dynamic block: + LEN -> LENEXT or LIT or TYPE + LENEXT -> DIST -> DISTEXT -> MATCH -> LEN + LIT -> LEN + Process trailer: + CHECK -> LENGTH -> DONE + */ + +/* state maintained between inflate() calls. Approximately 10K bytes. */ +struct inflate_state { + inflate_mode mode; /* current inflate mode */ + int last; /* true if processing last block */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ + int havedict; /* true if dictionary provided */ + int flags; /* gzip header method and flags (0 if zlib) */ + unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ + unsigned long check; /* protected copy of check value */ + unsigned long total; /* protected copy of output count */ + gz_headerp head; /* where to save gzip header information */ + /* sliding window */ + unsigned wbits; /* log base 2 of requested window size */ + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned wnext; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if needed */ + /* bit accumulator */ + unsigned long hold; /* input bit accumulator */ + unsigned bits; /* number of bits in "in" */ + /* for string and stored block copying */ + unsigned length; /* literal or length of data to copy */ + unsigned offset; /* distance back to copy string from */ + /* for table and code decoding */ + unsigned extra; /* extra bits needed */ + /* fixed and dynamic code tables */ + code const FAR *lencode; /* starting table for length/literal codes */ + code const FAR *distcode; /* starting table for distance codes */ + unsigned lenbits; /* index bits for lencode */ + unsigned distbits; /* index bits for distcode */ + /* dynamic table building */ + unsigned ncode; /* number of code length code lengths */ + unsigned nlen; /* number of length code lengths */ + unsigned ndist; /* number of distance code lengths */ + unsigned have; /* number of code lengths in lens[] */ + code FAR *next; /* next available space in codes[] */ + unsigned short lens[320]; /* temporary storage for code lengths */ + unsigned short work[288]; /* work area for code table building */ + code codes[ENOUGH]; /* space for code tables */ + int sane; /* if false, allow invalid distance too far */ + int back; /* bits back of last unprocessed length/lit */ + unsigned was; /* initial length of match */ +}; diff --git a/vendors/zlib/inftrees.c b/vendors/zlib/inftrees.c new file mode 100644 index 0000000..44d89cf --- /dev/null +++ b/vendors/zlib/inftrees.c @@ -0,0 +1,306 @@ +/* inftrees.c -- generate Huffman trees for efficient decoding + * Copyright (C) 1995-2013 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" + +#define MAXBITS 15 + +const char inflate_copyright[] = + " inflate 1.2.8 Copyright 1995-2013 Mark Adler "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* + Build a set of tables to decode the provided canonical Huffman code. + The code lengths are lens[0..codes-1]. The result starts at *table, + whose indices are 0..2^bits-1. work is a writable array of at least + lens shorts, which is used as a work area. type is the type of code + to be generated, CODES, LENS, or DISTS. On return, zero is success, + -1 is an invalid code, and +1 means that ENOUGH isn't enough. table + on return points to the next available entry's address. bits is the + requested root table index bits, and on return it is the actual root + table index bits. It will differ if the request is greater than the + longest code or if it is less than the shortest code. + */ +int ZLIB_INTERNAL inflate_table(type, lens, codes, table, bits, work) +codetype type; +unsigned short FAR *lens; +unsigned codes; +code FAR * FAR *table; +unsigned FAR *bits; +unsigned short FAR *work; +{ + unsigned len; /* a code's length in bits */ + unsigned sym; /* index of code symbols */ + unsigned min, max; /* minimum and maximum code lengths */ + unsigned root; /* number of index bits for root table */ + unsigned curr; /* number of index bits for current table */ + unsigned drop; /* code bits to drop for sub-table */ + int left; /* number of prefix codes available */ + unsigned used; /* code entries in table used */ + unsigned huff; /* Huffman code */ + unsigned incr; /* for incrementing code, index */ + unsigned fill; /* index for replicating entries */ + unsigned low; /* low bits for current root entry */ + unsigned mask; /* mask for low root bits */ + code here; /* table entry for duplication */ + code FAR *next; /* next available space in table */ + const unsigned short FAR *base; /* base value table to use */ + const unsigned short FAR *extra; /* extra bits table to use */ + int end; /* use base and extra for symbol > end */ + unsigned short count[MAXBITS+1]; /* number of codes of each length */ + unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ + static const unsigned short lbase[31] = { /* Length codes 257..285 base */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; + static const unsigned short lext[31] = { /* Length codes 257..285 extra */ + 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78}; + static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, + 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, + 8193, 12289, 16385, 24577, 0, 0}; + static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ + 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, + 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, + 28, 28, 29, 29, 64, 64}; + + /* + Process a set of code lengths to create a canonical Huffman code. The + code lengths are lens[0..codes-1]. Each length corresponds to the + symbols 0..codes-1. The Huffman code is generated by first sorting the + symbols by length from short to long, and retaining the symbol order + for codes with equal lengths. Then the code starts with all zero bits + for the first code of the shortest length, and the codes are integer + increments for the same length, and zeros are appended as the length + increases. For the deflate format, these bits are stored backwards + from their more natural integer increment ordering, and so when the + decoding tables are built in the large loop below, the integer codes + are incremented backwards. + + This routine assumes, but does not check, that all of the entries in + lens[] are in the range 0..MAXBITS. The caller must assure this. + 1..MAXBITS is interpreted as that code length. zero means that that + symbol does not occur in this code. + + The codes are sorted by computing a count of codes for each length, + creating from that a table of starting indices for each length in the + sorted table, and then entering the symbols in order in the sorted + table. The sorted table is work[], with that space being provided by + the caller. + + The length counts are used for other purposes as well, i.e. finding + the minimum and maximum length codes, determining if there are any + codes at all, checking for a valid set of lengths, and looking ahead + at length counts to determine sub-table sizes when building the + decoding tables. + */ + + /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ + for (len = 0; len <= MAXBITS; len++) + count[len] = 0; + for (sym = 0; sym < codes; sym++) + count[lens[sym]]++; + + /* bound code lengths, force root to be within code lengths */ + root = *bits; + for (max = MAXBITS; max >= 1; max--) + if (count[max] != 0) break; + if (root > max) root = max; + if (max == 0) { /* no symbols to code at all */ + here.op = (unsigned char)64; /* invalid code marker */ + here.bits = (unsigned char)1; + here.val = (unsigned short)0; + *(*table)++ = here; /* make a table to force an error */ + *(*table)++ = here; + *bits = 1; + return 0; /* no symbols, but wait for decoding to report error */ + } + for (min = 1; min < max; min++) + if (count[min] != 0) break; + if (root < min) root = min; + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; + left -= count[len]; + if (left < 0) return -1; /* over-subscribed */ + } + if (left > 0 && (type == CODES || max != 1)) + return -1; /* incomplete set */ + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) + offs[len + 1] = offs[len] + count[len]; + + /* sort symbols by length, by symbol order within each length */ + for (sym = 0; sym < codes; sym++) + if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; + + /* + Create and fill in decoding tables. In this loop, the table being + filled is at next and has curr index bits. The code being used is huff + with length len. That code is converted to an index by dropping drop + bits off of the bottom. For codes where len is less than drop + curr, + those top drop + curr - len bits are incremented through all values to + fill the table with replicated entries. + + root is the number of index bits for the root table. When len exceeds + root, sub-tables are created pointed to by the root entry with an index + of the low root bits of huff. This is saved in low to check for when a + new sub-table should be started. drop is zero when the root table is + being filled, and drop is root when sub-tables are being filled. + + When a new sub-table is needed, it is necessary to look ahead in the + code lengths to determine what size sub-table is needed. The length + counts are used for this, and so count[] is decremented as codes are + entered in the tables. + + used keeps track of how many table entries have been allocated from the + provided *table space. It is checked for LENS and DIST tables against + the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in + the initial root table size constants. See the comments in inftrees.h + for more information. + + sym increments through all symbols, and the loop terminates when + all codes of length max, i.e. all codes, have been processed. This + routine permits incomplete codes, so another loop after this one fills + in the rest of the decoding tables with invalid code markers. + */ + + /* set up for code type */ + switch (type) { + case CODES: + base = extra = work; /* dummy value--not used */ + end = 19; + break; + case LENS: + base = lbase; + base -= 257; + extra = lext; + extra -= 257; + end = 256; + break; + default: /* DISTS */ + base = dbase; + extra = dext; + end = -1; + } + + /* initialize state for loop */ + huff = 0; /* starting code */ + sym = 0; /* starting code symbol */ + len = min; /* starting code length */ + next = *table; /* current table to fill in */ + curr = root; /* current table index bits */ + drop = 0; /* current bits to drop from code for index */ + low = (unsigned)(-1); /* trigger new sub-table when len > root */ + used = 1U << root; /* use root table entries */ + mask = used - 1; /* mask for comparing low */ + + /* check available table space */ + if ((type == LENS && used > ENOUGH_LENS) || + (type == DISTS && used > ENOUGH_DISTS)) + return 1; + + /* process all codes and make table entries */ + for (;;) { + /* create table entry */ + here.bits = (unsigned char)(len - drop); + if ((int)(work[sym]) < end) { + here.op = (unsigned char)0; + here.val = work[sym]; + } + else if ((int)(work[sym]) > end) { + here.op = (unsigned char)(extra[work[sym]]); + here.val = base[work[sym]]; + } + else { + here.op = (unsigned char)(32 + 64); /* end of block */ + here.val = 0; + } + + /* replicate for those indices with low len bits equal to huff */ + incr = 1U << (len - drop); + fill = 1U << curr; + min = fill; /* save offset to next table */ + do { + fill -= incr; + next[(huff >> drop) + fill] = here; + } while (fill != 0); + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + + /* go to next symbol, update count, len */ + sym++; + if (--(count[len]) == 0) { + if (len == max) break; + len = lens[work[sym]]; + } + + /* create new sub-table if needed */ + if (len > root && (huff & mask) != low) { + /* if first time, transition to sub-tables */ + if (drop == 0) + drop = root; + + /* increment past last table */ + next += min; /* here min is 1 << curr */ + + /* determine length of next table */ + curr = len - drop; + left = (int)(1 << curr); + while (curr + drop < max) { + left -= count[curr + drop]; + if (left <= 0) break; + curr++; + left <<= 1; + } + + /* check for enough space */ + used += 1U << curr; + if ((type == LENS && used > ENOUGH_LENS) || + (type == DISTS && used > ENOUGH_DISTS)) + return 1; + + /* point entry in root table to sub-table */ + low = huff & mask; + (*table)[low].op = (unsigned char)curr; + (*table)[low].bits = (unsigned char)root; + (*table)[low].val = (unsigned short)(next - *table); + } + } + + /* fill in remaining table entry if code is incomplete (guaranteed to have + at most one remaining entry, since if the code is incomplete, the + maximum code length that was allowed to get this far is one bit) */ + if (huff != 0) { + here.op = (unsigned char)64; /* invalid code marker */ + here.bits = (unsigned char)(len - drop); + here.val = (unsigned short)0; + next[huff] = here; + } + + /* set return parameters */ + *table += used; + *bits = root; + return 0; +} diff --git a/vendors/zlib/inftrees.h b/vendors/zlib/inftrees.h new file mode 100644 index 0000000..baa53a0 --- /dev/null +++ b/vendors/zlib/inftrees.h @@ -0,0 +1,62 @@ +/* inftrees.h -- header to use inftrees.c + * Copyright (C) 1995-2005, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* Structure for decoding tables. Each entry provides either the + information needed to do the operation requested by the code that + indexed that table entry, or it provides a pointer to another + table that indexes more bits of the code. op indicates whether + the entry is a pointer to another table, a literal, a length or + distance, an end-of-block, or an invalid code. For a table + pointer, the low four bits of op is the number of index bits of + that table. For a length or distance, the low four bits of op + is the number of extra bits to get after the code. bits is + the number of bits in this code or part of the code to drop off + of the bit buffer. val is the actual byte to output in the case + of a literal, the base length or distance, or the offset from + the current table to the next table. Each entry is four bytes. */ +typedef struct { + unsigned char op; /* operation, extra bits, table bits */ + unsigned char bits; /* bits in this part of the code */ + unsigned short val; /* offset in table or code value */ +} code; + +/* op values as set by inflate_table(): + 00000000 - literal + 0000tttt - table link, tttt != 0 is the number of table index bits + 0001eeee - length or distance, eeee is the number of extra bits + 01100000 - end of block + 01000000 - invalid code + */ + +/* Maximum size of the dynamic table. The maximum number of code structures is + 1444, which is the sum of 852 for literal/length codes and 592 for distance + codes. These values were found by exhaustive searches using the program + examples/enough.c found in the zlib distribtution. The arguments to that + program are the number of symbols, the initial root table size, and the + maximum bit length of a code. "enough 286 9 15" for literal/length codes + returns returns 852, and "enough 30 6 15" for distance codes returns 592. + The initial root table size (9 or 6) is found in the fifth argument of the + inflate_table() calls in inflate.c and infback.c. If the root table size is + changed, then these maximum sizes would be need to be recalculated and + updated. */ +#define ENOUGH_LENS 852 +#define ENOUGH_DISTS 592 +#define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS) + +/* Type of code to build for inflate_table() */ +typedef enum { + CODES, + LENS, + DISTS +} codetype; + +int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens, + unsigned codes, code FAR * FAR *table, + unsigned FAR *bits, unsigned short FAR *work)); diff --git a/vendors/zlib/lib/libz.a b/vendors/zlib/lib/libz.a deleted file mode 100644 index 876f8983043bdb282cd4f14a8853e7d9437e03cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77534 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 S|Nc=Umh8y51Co+Q|Nj6dc3)xu diff --git a/vendors/zlib/lib/libz.dll.a b/vendors/zlib/lib/libz.dll.a deleted file mode 100644 index fd1899575e0a9379be6aea1d8d9bdc92fc6e28a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43738 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 diff --git a/vendors/zlib/lib/zlib-bcc.lib b/vendors/zlib/lib/zlib-bcc.lib deleted file mode 100644 index f23e2b12a072e923743055357bc239801da35e44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6656 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 +#endif + +/* =========================================================================== + * Constants + */ + +#define MAX_BL_BITS 7 +/* Bit length codes must not exceed MAX_BL_BITS bits */ + +#define END_BLOCK 256 +/* end of block literal code */ + +#define REP_3_6 16 +/* repeat previous bit length 3-6 times (2 bits of repeat count) */ + +#define REPZ_3_10 17 +/* repeat a zero length 3-10 times (3 bits of repeat count) */ + +#define REPZ_11_138 18 +/* repeat a zero length 11-138 times (7 bits of repeat count) */ + +local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ + = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; + +local const int extra_dbits[D_CODES] /* extra bits for each distance code */ + = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; + +local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ + = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; + +local const uch bl_order[BL_CODES] + = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; +/* The lengths of the bit length codes are sent in order of decreasing + * probability, to avoid transmitting the lengths for unused bit length codes. + */ + +/* =========================================================================== + * Local data. These are initialized only once. + */ + +#define DIST_CODE_LEN 512 /* see definition of array dist_code below */ + +#if defined(GEN_TREES_H) || !defined(STDC) +/* non ANSI compilers may not accept trees.h */ + +local ct_data static_ltree[L_CODES+2]; +/* The static literal tree. Since the bit lengths are imposed, there is no + * need for the L_CODES extra codes used during heap construction. However + * The codes 286 and 287 are needed to build a canonical tree (see _tr_init + * below). + */ + +local ct_data static_dtree[D_CODES]; +/* The static distance tree. (Actually a trivial tree since all codes use + * 5 bits.) + */ + +uch _dist_code[DIST_CODE_LEN]; +/* Distance codes. The first 256 values correspond to the distances + * 3 .. 258, the last 256 values correspond to the top 8 bits of + * the 15 bit distances. + */ + +uch _length_code[MAX_MATCH-MIN_MATCH+1]; +/* length code for each normalized match length (0 == MIN_MATCH) */ + +local int base_length[LENGTH_CODES]; +/* First normalized length for each code (0 = MIN_MATCH) */ + +local int base_dist[D_CODES]; +/* First normalized distance for each code (0 = distance of 1) */ + +#else +# include "trees.h" +#endif /* GEN_TREES_H */ + +struct static_tree_desc_s { + const ct_data *static_tree; /* static tree or NULL */ + const intf *extra_bits; /* extra bits for each code or NULL */ + int extra_base; /* base index for extra_bits */ + int elems; /* max number of elements in the tree */ + int max_length; /* max bit length for the codes */ +}; + +local static_tree_desc static_l_desc = +{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; + +local static_tree_desc static_d_desc = +{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; + +local static_tree_desc static_bl_desc = +{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; + +/* =========================================================================== + * Local (static) routines in this file. + */ + +local void tr_static_init OF((void)); +local void init_block OF((deflate_state *s)); +local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); +local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); +local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); +local void build_tree OF((deflate_state *s, tree_desc *desc)); +local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); +local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); +local int build_bl_tree OF((deflate_state *s)); +local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, + int blcodes)); +local void compress_block OF((deflate_state *s, const ct_data *ltree, + const ct_data *dtree)); +local int detect_data_type OF((deflate_state *s)); +local unsigned bi_reverse OF((unsigned value, int length)); +local void bi_windup OF((deflate_state *s)); +local void bi_flush OF((deflate_state *s)); +local void copy_block OF((deflate_state *s, charf *buf, unsigned len, + int header)); + +#ifdef GEN_TREES_H +local void gen_trees_header OF((void)); +#endif + +#ifndef DEBUG +# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) + /* Send a code of the given tree. c and tree must not have side effects */ + +#else /* DEBUG */ +# define send_code(s, c, tree) \ + { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ + send_bits(s, tree[c].Code, tree[c].Len); } +#endif + +/* =========================================================================== + * Output a short LSB first on the stream. + * IN assertion: there is enough room in pendingBuf. + */ +#define put_short(s, w) { \ + put_byte(s, (uch)((w) & 0xff)); \ + put_byte(s, (uch)((ush)(w) >> 8)); \ +} + +/* =========================================================================== + * Send a value on a given number of bits. + * IN assertion: length <= 16 and value fits in length bits. + */ +#ifdef DEBUG +local void send_bits OF((deflate_state *s, int value, int length)); + +local void send_bits(s, value, length) + deflate_state *s; + int value; /* value to send */ + int length; /* number of bits */ +{ + Tracevv((stderr," l %2d v %4x ", length, value)); + Assert(length > 0 && length <= 15, "invalid length"); + s->bits_sent += (ulg)length; + + /* If not enough room in bi_buf, use (valid) bits from bi_buf and + * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) + * unused bits in value. + */ + if (s->bi_valid > (int)Buf_size - length) { + s->bi_buf |= (ush)value << s->bi_valid; + put_short(s, s->bi_buf); + s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); + s->bi_valid += length - Buf_size; + } else { + s->bi_buf |= (ush)value << s->bi_valid; + s->bi_valid += length; + } +} +#else /* !DEBUG */ + +#define send_bits(s, value, length) \ +{ int len = length;\ + if (s->bi_valid > (int)Buf_size - len) {\ + int val = value;\ + s->bi_buf |= (ush)val << s->bi_valid;\ + put_short(s, s->bi_buf);\ + s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ + s->bi_valid += len - Buf_size;\ + } else {\ + s->bi_buf |= (ush)(value) << s->bi_valid;\ + s->bi_valid += len;\ + }\ +} +#endif /* DEBUG */ + + +/* the arguments must not have side effects */ + +/* =========================================================================== + * Initialize the various 'constant' tables. + */ +local void tr_static_init() +{ +#if defined(GEN_TREES_H) || !defined(STDC) + static int static_init_done = 0; + int n; /* iterates over tree elements */ + int bits; /* bit counter */ + int length; /* length value */ + int code; /* code value */ + int dist; /* distance index */ + ush bl_count[MAX_BITS+1]; + /* number of codes at each bit length for an optimal tree */ + + if (static_init_done) return; + + /* For some embedded targets, global variables are not initialized: */ +#ifdef NO_INIT_GLOBAL_POINTERS + static_l_desc.static_tree = static_ltree; + static_l_desc.extra_bits = extra_lbits; + static_d_desc.static_tree = static_dtree; + static_d_desc.extra_bits = extra_dbits; + static_bl_desc.extra_bits = extra_blbits; +#endif + + /* Initialize the mapping length (0..255) -> length code (0..28) */ + length = 0; + for (code = 0; code < LENGTH_CODES-1; code++) { + base_length[code] = length; + for (n = 0; n < (1< dist code (0..29) */ + dist = 0; + for (code = 0 ; code < 16; code++) { + base_dist[code] = dist; + for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ + for ( ; code < D_CODES; code++) { + base_dist[code] = dist << 7; + for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { + _dist_code[256 + dist++] = (uch)code; + } + } + Assert (dist == 256, "tr_static_init: 256+dist != 512"); + + /* Construct the codes of the static literal tree */ + for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; + n = 0; + while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; + while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; + while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; + while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; + /* Codes 286 and 287 do not exist, but we must include them in the + * tree construction to get a canonical Huffman tree (longest code + * all ones) + */ + gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); + + /* The static distance tree is trivial: */ + for (n = 0; n < D_CODES; n++) { + static_dtree[n].Len = 5; + static_dtree[n].Code = bi_reverse((unsigned)n, 5); + } + static_init_done = 1; + +# ifdef GEN_TREES_H + gen_trees_header(); +# endif +#endif /* defined(GEN_TREES_H) || !defined(STDC) */ +} + +/* =========================================================================== + * Genererate the file trees.h describing the static trees. + */ +#ifdef GEN_TREES_H +# ifndef DEBUG +# include +# endif + +# define SEPARATOR(i, last, width) \ + ((i) == (last)? "\n};\n\n" : \ + ((i) % (width) == (width)-1 ? ",\n" : ", ")) + +void gen_trees_header() +{ + FILE *header = fopen("trees.h", "w"); + int i; + + Assert (header != NULL, "Can't open trees.h"); + fprintf(header, + "/* header created automatically with -DGEN_TREES_H */\n\n"); + + fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n"); + for (i = 0; i < L_CODES+2; i++) { + fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code, + static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5)); + } + + fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n"); + for (i = 0; i < D_CODES; i++) { + fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code, + static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); + } + + fprintf(header, "const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {\n"); + for (i = 0; i < DIST_CODE_LEN; i++) { + fprintf(header, "%2u%s", _dist_code[i], + SEPARATOR(i, DIST_CODE_LEN-1, 20)); + } + + fprintf(header, + "const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); + for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { + fprintf(header, "%2u%s", _length_code[i], + SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); + } + + fprintf(header, "local const int base_length[LENGTH_CODES] = {\n"); + for (i = 0; i < LENGTH_CODES; i++) { + fprintf(header, "%1u%s", base_length[i], + SEPARATOR(i, LENGTH_CODES-1, 20)); + } + + fprintf(header, "local const int base_dist[D_CODES] = {\n"); + for (i = 0; i < D_CODES; i++) { + fprintf(header, "%5u%s", base_dist[i], + SEPARATOR(i, D_CODES-1, 10)); + } + + fclose(header); +} +#endif /* GEN_TREES_H */ + +/* =========================================================================== + * Initialize the tree data structures for a new zlib stream. + */ +void ZLIB_INTERNAL _tr_init(s) + deflate_state *s; +{ + tr_static_init(); + + s->l_desc.dyn_tree = s->dyn_ltree; + s->l_desc.stat_desc = &static_l_desc; + + s->d_desc.dyn_tree = s->dyn_dtree; + s->d_desc.stat_desc = &static_d_desc; + + s->bl_desc.dyn_tree = s->bl_tree; + s->bl_desc.stat_desc = &static_bl_desc; + + s->bi_buf = 0; + s->bi_valid = 0; +#ifdef DEBUG + s->compressed_len = 0L; + s->bits_sent = 0L; +#endif + + /* Initialize the first block of the first file: */ + init_block(s); +} + +/* =========================================================================== + * Initialize a new block. + */ +local void init_block(s) + deflate_state *s; +{ + int n; /* iterates over tree elements */ + + /* Initialize the trees. */ + for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; + for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; + for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; + + s->dyn_ltree[END_BLOCK].Freq = 1; + s->opt_len = s->static_len = 0L; + s->last_lit = s->matches = 0; +} + +#define SMALLEST 1 +/* Index within the heap array of least frequent node in the Huffman tree */ + + +/* =========================================================================== + * Remove the smallest element from the heap and recreate the heap with + * one less element. Updates heap and heap_len. + */ +#define pqremove(s, tree, top) \ +{\ + top = s->heap[SMALLEST]; \ + s->heap[SMALLEST] = s->heap[s->heap_len--]; \ + pqdownheap(s, tree, SMALLEST); \ +} + +/* =========================================================================== + * Compares to subtrees, using the tree depth as tie breaker when + * the subtrees have equal frequency. This minimizes the worst case length. + */ +#define smaller(tree, n, m, depth) \ + (tree[n].Freq < tree[m].Freq || \ + (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) + +/* =========================================================================== + * Restore the heap property by moving down the tree starting at node k, + * exchanging a node with the smallest of its two sons if necessary, stopping + * when the heap property is re-established (each father smaller than its + * two sons). + */ +local void pqdownheap(s, tree, k) + deflate_state *s; + ct_data *tree; /* the tree to restore */ + int k; /* node to move down */ +{ + int v = s->heap[k]; + int j = k << 1; /* left son of k */ + while (j <= s->heap_len) { + /* Set j to the smallest of the two sons: */ + if (j < s->heap_len && + smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { + j++; + } + /* Exit if v is smaller than both sons */ + if (smaller(tree, v, s->heap[j], s->depth)) break; + + /* Exchange v with the smallest son */ + s->heap[k] = s->heap[j]; k = j; + + /* And continue down the tree, setting j to the left son of k */ + j <<= 1; + } + s->heap[k] = v; +} + +/* =========================================================================== + * Compute the optimal bit lengths for a tree and update the total bit length + * for the current block. + * IN assertion: the fields freq and dad are set, heap[heap_max] and + * above are the tree nodes sorted by increasing frequency. + * OUT assertions: the field len is set to the optimal bit length, the + * array bl_count contains the frequencies for each bit length. + * The length opt_len is updated; static_len is also updated if stree is + * not null. + */ +local void gen_bitlen(s, desc) + deflate_state *s; + tree_desc *desc; /* the tree descriptor */ +{ + ct_data *tree = desc->dyn_tree; + int max_code = desc->max_code; + const ct_data *stree = desc->stat_desc->static_tree; + const intf *extra = desc->stat_desc->extra_bits; + int base = desc->stat_desc->extra_base; + int max_length = desc->stat_desc->max_length; + int h; /* heap index */ + int n, m; /* iterate over the tree elements */ + int bits; /* bit length */ + int xbits; /* extra bits */ + ush f; /* frequency */ + int overflow = 0; /* number of elements with bit length too large */ + + for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; + + /* In a first pass, compute the optimal bit lengths (which may + * overflow in the case of the bit length tree). + */ + tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ + + for (h = s->heap_max+1; h < HEAP_SIZE; h++) { + n = s->heap[h]; + bits = tree[tree[n].Dad].Len + 1; + if (bits > max_length) bits = max_length, overflow++; + tree[n].Len = (ush)bits; + /* We overwrite tree[n].Dad which is no longer needed */ + + if (n > max_code) continue; /* not a leaf node */ + + s->bl_count[bits]++; + xbits = 0; + if (n >= base) xbits = extra[n-base]; + f = tree[n].Freq; + s->opt_len += (ulg)f * (bits + xbits); + if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits); + } + if (overflow == 0) return; + + Trace((stderr,"\nbit length overflow\n")); + /* This happens for example on obj2 and pic of the Calgary corpus */ + + /* Find the first bit length which could increase: */ + do { + bits = max_length-1; + while (s->bl_count[bits] == 0) bits--; + s->bl_count[bits]--; /* move one leaf down the tree */ + s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ + s->bl_count[max_length]--; + /* The brother of the overflow item also moves one step up, + * but this does not affect bl_count[max_length] + */ + overflow -= 2; + } while (overflow > 0); + + /* Now recompute all bit lengths, scanning in increasing frequency. + * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all + * lengths instead of fixing only the wrong ones. This idea is taken + * from 'ar' written by Haruhiko Okumura.) + */ + for (bits = max_length; bits != 0; bits--) { + n = s->bl_count[bits]; + while (n != 0) { + m = s->heap[--h]; + if (m > max_code) continue; + if ((unsigned) tree[m].Len != (unsigned) bits) { + Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); + s->opt_len += ((long)bits - (long)tree[m].Len) + *(long)tree[m].Freq; + tree[m].Len = (ush)bits; + } + n--; + } + } +} + +/* =========================================================================== + * Generate the codes for a given tree and bit counts (which need not be + * optimal). + * IN assertion: the array bl_count contains the bit length statistics for + * the given tree and the field len is set for all tree elements. + * OUT assertion: the field code is set for all tree elements of non + * zero code length. + */ +local void gen_codes (tree, max_code, bl_count) + ct_data *tree; /* the tree to decorate */ + int max_code; /* largest code with non zero frequency */ + ushf *bl_count; /* number of codes at each bit length */ +{ + ush next_code[MAX_BITS+1]; /* next code value for each bit length */ + ush code = 0; /* running code value */ + int bits; /* bit index */ + int n; /* code index */ + + /* The distribution counts are first used to generate the code values + * without bit reversal. + */ + for (bits = 1; bits <= MAX_BITS; bits++) { + next_code[bits] = code = (code + bl_count[bits-1]) << 1; + } + /* Check that the bit counts in bl_count are consistent. The last code + * must be all ones. + */ + Assert (code + bl_count[MAX_BITS]-1 == (1<dyn_tree; + const ct_data *stree = desc->stat_desc->static_tree; + int elems = desc->stat_desc->elems; + int n, m; /* iterate over heap elements */ + int max_code = -1; /* largest code with non zero frequency */ + int node; /* new node being created */ + + /* Construct the initial heap, with least frequent element in + * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. + * heap[0] is not used. + */ + s->heap_len = 0, s->heap_max = HEAP_SIZE; + + for (n = 0; n < elems; n++) { + if (tree[n].Freq != 0) { + s->heap[++(s->heap_len)] = max_code = n; + s->depth[n] = 0; + } else { + tree[n].Len = 0; + } + } + + /* The pkzip format requires that at least one distance code exists, + * and that at least one bit should be sent even if there is only one + * possible code. So to avoid special checks later on we force at least + * two codes of non zero frequency. + */ + while (s->heap_len < 2) { + node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); + tree[node].Freq = 1; + s->depth[node] = 0; + s->opt_len--; if (stree) s->static_len -= stree[node].Len; + /* node is 0 or 1 so it does not have extra bits */ + } + desc->max_code = max_code; + + /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, + * establish sub-heaps of increasing lengths: + */ + for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); + + /* Construct the Huffman tree by repeatedly combining the least two + * frequent nodes. + */ + node = elems; /* next internal node of the tree */ + do { + pqremove(s, tree, n); /* n = node of least frequency */ + m = s->heap[SMALLEST]; /* m = node of next least frequency */ + + s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ + s->heap[--(s->heap_max)] = m; + + /* Create a new node father of n and m */ + tree[node].Freq = tree[n].Freq + tree[m].Freq; + s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ? + s->depth[n] : s->depth[m]) + 1); + tree[n].Dad = tree[m].Dad = (ush)node; +#ifdef DUMP_BL_TREE + if (tree == s->bl_tree) { + fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", + node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); + } +#endif + /* and insert the new node in the heap */ + s->heap[SMALLEST] = node++; + pqdownheap(s, tree, SMALLEST); + + } while (s->heap_len >= 2); + + s->heap[--(s->heap_max)] = s->heap[SMALLEST]; + + /* At this point, the fields freq and dad are set. We can now + * generate the bit lengths. + */ + gen_bitlen(s, (tree_desc *)desc); + + /* The field len is now set, we can generate the bit codes */ + gen_codes ((ct_data *)tree, max_code, s->bl_count); +} + +/* =========================================================================== + * Scan a literal or distance tree to determine the frequencies of the codes + * in the bit length tree. + */ +local void scan_tree (s, tree, max_code) + deflate_state *s; + ct_data *tree; /* the tree to be scanned */ + int max_code; /* and its largest code of non zero frequency */ +{ + int n; /* iterates over all tree elements */ + int prevlen = -1; /* last emitted length */ + int curlen; /* length of current code */ + int nextlen = tree[0].Len; /* length of next code */ + int count = 0; /* repeat count of the current code */ + int max_count = 7; /* max repeat count */ + int min_count = 4; /* min repeat count */ + + if (nextlen == 0) max_count = 138, min_count = 3; + tree[max_code+1].Len = (ush)0xffff; /* guard */ + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; nextlen = tree[n+1].Len; + if (++count < max_count && curlen == nextlen) { + continue; + } else if (count < min_count) { + s->bl_tree[curlen].Freq += count; + } else if (curlen != 0) { + if (curlen != prevlen) s->bl_tree[curlen].Freq++; + s->bl_tree[REP_3_6].Freq++; + } else if (count <= 10) { + s->bl_tree[REPZ_3_10].Freq++; + } else { + s->bl_tree[REPZ_11_138].Freq++; + } + count = 0; prevlen = curlen; + if (nextlen == 0) { + max_count = 138, min_count = 3; + } else if (curlen == nextlen) { + max_count = 6, min_count = 3; + } else { + max_count = 7, min_count = 4; + } + } +} + +/* =========================================================================== + * Send a literal or distance tree in compressed form, using the codes in + * bl_tree. + */ +local void send_tree (s, tree, max_code) + deflate_state *s; + ct_data *tree; /* the tree to be scanned */ + int max_code; /* and its largest code of non zero frequency */ +{ + int n; /* iterates over all tree elements */ + int prevlen = -1; /* last emitted length */ + int curlen; /* length of current code */ + int nextlen = tree[0].Len; /* length of next code */ + int count = 0; /* repeat count of the current code */ + int max_count = 7; /* max repeat count */ + int min_count = 4; /* min repeat count */ + + /* tree[max_code+1].Len = -1; */ /* guard already set */ + if (nextlen == 0) max_count = 138, min_count = 3; + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; nextlen = tree[n+1].Len; + if (++count < max_count && curlen == nextlen) { + continue; + } else if (count < min_count) { + do { send_code(s, curlen, s->bl_tree); } while (--count != 0); + + } else if (curlen != 0) { + if (curlen != prevlen) { + send_code(s, curlen, s->bl_tree); count--; + } + Assert(count >= 3 && count <= 6, " 3_6?"); + send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); + + } else if (count <= 10) { + send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); + + } else { + send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); + } + count = 0; prevlen = curlen; + if (nextlen == 0) { + max_count = 138, min_count = 3; + } else if (curlen == nextlen) { + max_count = 6, min_count = 3; + } else { + max_count = 7, min_count = 4; + } + } +} + +/* =========================================================================== + * Construct the Huffman tree for the bit lengths and return the index in + * bl_order of the last bit length code to send. + */ +local int build_bl_tree(s) + deflate_state *s; +{ + int max_blindex; /* index of last bit length code of non zero freq */ + + /* Determine the bit length frequencies for literal and distance trees */ + scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); + scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); + + /* Build the bit length tree: */ + build_tree(s, (tree_desc *)(&(s->bl_desc))); + /* opt_len now includes the length of the tree representations, except + * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. + */ + + /* Determine the number of bit length codes to send. The pkzip format + * requires that at least 4 bit length codes be sent. (appnote.txt says + * 3 but the actual value used is 4.) + */ + for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { + if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; + } + /* Update opt_len to include the bit length tree and counts */ + s->opt_len += 3*(max_blindex+1) + 5+5+4; + Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", + s->opt_len, s->static_len)); + + return max_blindex; +} + +/* =========================================================================== + * Send the header for a block using dynamic Huffman trees: the counts, the + * lengths of the bit length codes, the literal tree and the distance tree. + * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. + */ +local void send_all_trees(s, lcodes, dcodes, blcodes) + deflate_state *s; + int lcodes, dcodes, blcodes; /* number of codes for each tree */ +{ + int rank; /* index in bl_order */ + + Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); + Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, + "too many codes"); + Tracev((stderr, "\nbl counts: ")); + send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ + send_bits(s, dcodes-1, 5); + send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ + for (rank = 0; rank < blcodes; rank++) { + Tracev((stderr, "\nbl code %2d ", bl_order[rank])); + send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); + } + Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); + + send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ + Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); + + send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ + Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); +} + +/* =========================================================================== + * Send a stored block + */ +void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last) + deflate_state *s; + charf *buf; /* input block */ + ulg stored_len; /* length of input block */ + int last; /* one if this is the last block for a file */ +{ + send_bits(s, (STORED_BLOCK<<1)+last, 3); /* send block type */ +#ifdef DEBUG + s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; + s->compressed_len += (stored_len + 4) << 3; +#endif + copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ +} + +/* =========================================================================== + * Flush the bits in the bit buffer to pending output (leaves at most 7 bits) + */ +void ZLIB_INTERNAL _tr_flush_bits(s) + deflate_state *s; +{ + bi_flush(s); +} + +/* =========================================================================== + * Send one empty static block to give enough lookahead for inflate. + * This takes 10 bits, of which 7 may remain in the bit buffer. + */ +void ZLIB_INTERNAL _tr_align(s) + deflate_state *s; +{ + send_bits(s, STATIC_TREES<<1, 3); + send_code(s, END_BLOCK, static_ltree); +#ifdef DEBUG + s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ +#endif + bi_flush(s); +} + +/* =========================================================================== + * Determine the best encoding for the current block: dynamic trees, static + * trees or store, and output the encoded block to the zip file. + */ +void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) + deflate_state *s; + charf *buf; /* input block, or NULL if too old */ + ulg stored_len; /* length of input block */ + int last; /* one if this is the last block for a file */ +{ + ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ + int max_blindex = 0; /* index of last bit length code of non zero freq */ + + /* Build the Huffman trees unless a stored block is forced */ + if (s->level > 0) { + + /* Check if the file is binary or text */ + if (s->strm->data_type == Z_UNKNOWN) + s->strm->data_type = detect_data_type(s); + + /* Construct the literal and distance trees */ + build_tree(s, (tree_desc *)(&(s->l_desc))); + Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, + s->static_len)); + + build_tree(s, (tree_desc *)(&(s->d_desc))); + Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, + s->static_len)); + /* At this point, opt_len and static_len are the total bit lengths of + * the compressed block data, excluding the tree representations. + */ + + /* Build the bit length tree for the above two trees, and get the index + * in bl_order of the last bit length code to send. + */ + max_blindex = build_bl_tree(s); + + /* Determine the best encoding. Compute the block lengths in bytes. */ + opt_lenb = (s->opt_len+3+7)>>3; + static_lenb = (s->static_len+3+7)>>3; + + Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", + opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, + s->last_lit)); + + if (static_lenb <= opt_lenb) opt_lenb = static_lenb; + + } else { + Assert(buf != (char*)0, "lost buf"); + opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ + } + +#ifdef FORCE_STORED + if (buf != (char*)0) { /* force stored block */ +#else + if (stored_len+4 <= opt_lenb && buf != (char*)0) { + /* 4: two words for the lengths */ +#endif + /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. + * Otherwise we can't have processed more than WSIZE input bytes since + * the last block flush, because compression would have been + * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to + * transform a block into a stored block. + */ + _tr_stored_block(s, buf, stored_len, last); + +#ifdef FORCE_STATIC + } else if (static_lenb >= 0) { /* force static trees */ +#else + } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { +#endif + send_bits(s, (STATIC_TREES<<1)+last, 3); + compress_block(s, (const ct_data *)static_ltree, + (const ct_data *)static_dtree); +#ifdef DEBUG + s->compressed_len += 3 + s->static_len; +#endif + } else { + send_bits(s, (DYN_TREES<<1)+last, 3); + send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, + max_blindex+1); + compress_block(s, (const ct_data *)s->dyn_ltree, + (const ct_data *)s->dyn_dtree); +#ifdef DEBUG + s->compressed_len += 3 + s->opt_len; +#endif + } + Assert (s->compressed_len == s->bits_sent, "bad compressed size"); + /* The above check is made mod 2^32, for files larger than 512 MB + * and uLong implemented on 32 bits. + */ + init_block(s); + + if (last) { + bi_windup(s); +#ifdef DEBUG + s->compressed_len += 7; /* align on byte boundary */ +#endif + } + Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, + s->compressed_len-7*last)); +} + +/* =========================================================================== + * Save the match info and tally the frequency counts. Return true if + * the current block must be flushed. + */ +int ZLIB_INTERNAL _tr_tally (s, dist, lc) + deflate_state *s; + unsigned dist; /* distance of matched string */ + unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ +{ + s->d_buf[s->last_lit] = (ush)dist; + s->l_buf[s->last_lit++] = (uch)lc; + if (dist == 0) { + /* lc is the unmatched char */ + s->dyn_ltree[lc].Freq++; + } else { + s->matches++; + /* Here, lc is the match length - MIN_MATCH */ + dist--; /* dist = match distance - 1 */ + Assert((ush)dist < (ush)MAX_DIST(s) && + (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && + (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); + + s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; + s->dyn_dtree[d_code(dist)].Freq++; + } + +#ifdef TRUNCATE_BLOCK + /* Try to guess if it is profitable to stop the current block here */ + if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { + /* Compute an upper bound for the compressed length */ + ulg out_length = (ulg)s->last_lit*8L; + ulg in_length = (ulg)((long)s->strstart - s->block_start); + int dcode; + for (dcode = 0; dcode < D_CODES; dcode++) { + out_length += (ulg)s->dyn_dtree[dcode].Freq * + (5L+extra_dbits[dcode]); + } + out_length >>= 3; + Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", + s->last_lit, in_length, out_length, + 100L - out_length*100L/in_length)); + if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; + } +#endif + return (s->last_lit == s->lit_bufsize-1); + /* We avoid equality with lit_bufsize because of wraparound at 64K + * on 16 bit machines and because stored blocks are restricted to + * 64K-1 bytes. + */ +} + +/* =========================================================================== + * Send the block data compressed using the given Huffman trees + */ +local void compress_block(s, ltree, dtree) + deflate_state *s; + const ct_data *ltree; /* literal tree */ + const ct_data *dtree; /* distance tree */ +{ + unsigned dist; /* distance of matched string */ + int lc; /* match length or unmatched char (if dist == 0) */ + unsigned lx = 0; /* running index in l_buf */ + unsigned code; /* the code to send */ + int extra; /* number of extra bits to send */ + + if (s->last_lit != 0) do { + dist = s->d_buf[lx]; + lc = s->l_buf[lx++]; + if (dist == 0) { + send_code(s, lc, ltree); /* send a literal byte */ + Tracecv(isgraph(lc), (stderr," '%c' ", lc)); + } else { + /* Here, lc is the match length - MIN_MATCH */ + code = _length_code[lc]; + send_code(s, code+LITERALS+1, ltree); /* send the length code */ + extra = extra_lbits[code]; + if (extra != 0) { + lc -= base_length[code]; + send_bits(s, lc, extra); /* send the extra length bits */ + } + dist--; /* dist is now the match distance - 1 */ + code = d_code(dist); + Assert (code < D_CODES, "bad d_code"); + + send_code(s, code, dtree); /* send the distance code */ + extra = extra_dbits[code]; + if (extra != 0) { + dist -= base_dist[code]; + send_bits(s, dist, extra); /* send the extra distance bits */ + } + } /* literal or match pair ? */ + + /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ + Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, + "pendingBuf overflow"); + + } while (lx < s->last_lit); + + send_code(s, END_BLOCK, ltree); +} + +/* =========================================================================== + * Check if the data type is TEXT or BINARY, using the following algorithm: + * - TEXT if the two conditions below are satisfied: + * a) There are no non-portable control characters belonging to the + * "black list" (0..6, 14..25, 28..31). + * b) There is at least one printable character belonging to the + * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). + * - BINARY otherwise. + * - The following partially-portable control characters form a + * "gray list" that is ignored in this detection algorithm: + * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). + * IN assertion: the fields Freq of dyn_ltree are set. + */ +local int detect_data_type(s) + deflate_state *s; +{ + /* black_mask is the bit mask of black-listed bytes + * set bits 0..6, 14..25, and 28..31 + * 0xf3ffc07f = binary 11110011111111111100000001111111 + */ + unsigned long black_mask = 0xf3ffc07fUL; + int n; + + /* Check for non-textual ("black-listed") bytes. */ + for (n = 0; n <= 31; n++, black_mask >>= 1) + if ((black_mask & 1) && (s->dyn_ltree[n].Freq != 0)) + return Z_BINARY; + + /* Check for textual ("white-listed") bytes. */ + if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0 + || s->dyn_ltree[13].Freq != 0) + return Z_TEXT; + for (n = 32; n < LITERALS; n++) + if (s->dyn_ltree[n].Freq != 0) + return Z_TEXT; + + /* There are no "black-listed" or "white-listed" bytes: + * this stream either is empty or has tolerated ("gray-listed") bytes only. + */ + return Z_BINARY; +} + +/* =========================================================================== + * Reverse the first len bits of a code, using straightforward code (a faster + * method would use a table) + * IN assertion: 1 <= len <= 15 + */ +local unsigned bi_reverse(code, len) + unsigned code; /* the value to invert */ + int len; /* its bit length */ +{ + register unsigned res = 0; + do { + res |= code & 1; + code >>= 1, res <<= 1; + } while (--len > 0); + return res >> 1; +} + +/* =========================================================================== + * Flush the bit buffer, keeping at most 7 bits in it. + */ +local void bi_flush(s) + deflate_state *s; +{ + if (s->bi_valid == 16) { + put_short(s, s->bi_buf); + s->bi_buf = 0; + s->bi_valid = 0; + } else if (s->bi_valid >= 8) { + put_byte(s, (Byte)s->bi_buf); + s->bi_buf >>= 8; + s->bi_valid -= 8; + } +} + +/* =========================================================================== + * Flush the bit buffer and align the output on a byte boundary + */ +local void bi_windup(s) + deflate_state *s; +{ + if (s->bi_valid > 8) { + put_short(s, s->bi_buf); + } else if (s->bi_valid > 0) { + put_byte(s, (Byte)s->bi_buf); + } + s->bi_buf = 0; + s->bi_valid = 0; +#ifdef DEBUG + s->bits_sent = (s->bits_sent+7) & ~7; +#endif +} + +/* =========================================================================== + * Copy a stored block, storing first the length and its + * one's complement if requested. + */ +local void copy_block(s, buf, len, header) + deflate_state *s; + charf *buf; /* the input data */ + unsigned len; /* its length */ + int header; /* true if block header must be written */ +{ + bi_windup(s); /* align on byte boundary */ + + if (header) { + put_short(s, (ush)len); + put_short(s, (ush)~len); +#ifdef DEBUG + s->bits_sent += 2*16; +#endif + } +#ifdef DEBUG + s->bits_sent += (ulg)len<<3; +#endif + while (len--) { + put_byte(s, *buf++); + } +} diff --git a/vendors/zlib/trees.h b/vendors/zlib/trees.h new file mode 100644 index 0000000..d35639d --- /dev/null +++ b/vendors/zlib/trees.h @@ -0,0 +1,128 @@ +/* header created automatically with -DGEN_TREES_H */ + +local const ct_data static_ltree[L_CODES+2] = { +{{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}}, +{{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}}, +{{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}}, +{{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}}, +{{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}}, +{{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}}, +{{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}}, +{{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}}, +{{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}}, +{{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}}, +{{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}}, +{{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}}, +{{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}}, +{{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}}, +{{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}}, +{{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}}, +{{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}}, +{{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}}, +{{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}}, +{{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}}, +{{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}}, +{{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}}, +{{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}}, +{{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}}, +{{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}}, +{{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}}, +{{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}}, +{{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}}, +{{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}}, +{{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}}, +{{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}}, +{{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}}, +{{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}}, +{{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}}, +{{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}}, +{{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}}, +{{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}}, +{{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}}, +{{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}}, +{{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}}, +{{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}}, +{{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}}, +{{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}}, +{{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}}, +{{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}}, +{{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}}, +{{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}}, +{{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}}, +{{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}}, +{{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}}, +{{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}}, +{{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}}, +{{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}}, +{{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}}, +{{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}}, +{{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}}, +{{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}}, +{{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}} +}; + +local const ct_data static_dtree[D_CODES] = { +{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}}, +{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}}, +{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}}, +{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}}, +{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}}, +{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}} +}; + +const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = { + 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, + 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, +10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, +11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, +12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, +13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, +13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, +18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, +23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 +}; + +const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, +13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, +17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, +19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, +21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, +22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, +23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 +}; + +local const int base_length[LENGTH_CODES] = { +0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, +64, 80, 96, 112, 128, 160, 192, 224, 0 +}; + +local const int base_dist[D_CODES] = { + 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, + 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, + 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 +}; + diff --git a/vendors/zlib/uncompr.c b/vendors/zlib/uncompr.c new file mode 100644 index 0000000..242e949 --- /dev/null +++ b/vendors/zlib/uncompr.c @@ -0,0 +1,59 @@ +/* uncompr.c -- decompress a memory buffer + * Copyright (C) 1995-2003, 2010 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#define ZLIB_INTERNAL +#include "zlib.h" + +/* =========================================================================== + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be large enough to hold the + entire uncompressed data. (The size of the uncompressed data must have + been saved previously by the compressor and transmitted to the decompressor + by some mechanism outside the scope of this compression library.) + Upon exit, destLen is the actual size of the compressed buffer. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted. +*/ +int ZEXPORT uncompress (dest, destLen, source, sourceLen) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong sourceLen; +{ + z_stream stream; + int err; + + stream.next_in = (z_const Bytef *)source; + stream.avail_in = (uInt)sourceLen; + /* Check for source > 64K on 16-bit machine: */ + if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; + + stream.next_out = dest; + stream.avail_out = (uInt)*destLen; + if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; + + stream.zalloc = (alloc_func)0; + stream.zfree = (free_func)0; + + err = inflateInit(&stream); + if (err != Z_OK) return err; + + err = inflate(&stream, Z_FINISH); + if (err != Z_STREAM_END) { + inflateEnd(&stream); + if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0)) + return Z_DATA_ERROR; + return err; + } + *destLen = stream.total_out; + + err = inflateEnd(&stream); + return err; +} diff --git a/vendors/zlib/include/zconf.h b/vendors/zlib/zconf.h similarity index 54% rename from vendors/zlib/include/zconf.h rename to vendors/zlib/zconf.h index ea2db4b..9987a77 100644 --- a/vendors/zlib/include/zconf.h +++ b/vendors/zlib/zconf.h @@ -1,5 +1,5 @@ /* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2005 Jean-loup Gailly. + * Copyright (C) 1995-2013 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -11,52 +11,145 @@ /* * If you *really* need a unique prefix for all types and library functions, * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + * Even better than compiling with -DZ_PREFIX would be to use configure to set + * this permanently in zconf.h using "./configure --zprefix". */ -#ifdef Z_PREFIX -# define deflateInit_ z_deflateInit_ +#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ +# define Z_PREFIX_SET + +/* all linked symbols */ +# define _dist_code z__dist_code +# define _length_code z__length_code +# define _tr_align z__tr_align +# define _tr_flush_bits z__tr_flush_bits +# define _tr_flush_block z__tr_flush_block +# define _tr_init z__tr_init +# define _tr_stored_block z__tr_stored_block +# define _tr_tally z__tr_tally +# define adler32 z_adler32 +# define adler32_combine z_adler32_combine +# define adler32_combine64 z_adler32_combine64 +# ifndef Z_SOLO +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# endif +# define crc32 z_crc32 +# define crc32_combine z_crc32_combine +# define crc32_combine64 z_crc32_combine64 # define deflate z_deflate +# define deflateBound z_deflateBound +# define deflateCopy z_deflateCopy # define deflateEnd z_deflateEnd -# define inflateInit_ z_inflateInit_ -# define inflate z_inflate -# define inflateEnd z_inflateEnd # define deflateInit2_ z_deflateInit2_ -# define deflateSetDictionary z_deflateSetDictionary -# define deflateCopy z_deflateCopy -# define deflateReset z_deflateReset +# define deflateInit_ z_deflateInit_ # define deflateParams z_deflateParams -# define deflateBound z_deflateBound +# define deflatePending z_deflatePending # define deflatePrime z_deflatePrime +# define deflateReset z_deflateReset +# define deflateResetKeep z_deflateResetKeep +# define deflateSetDictionary z_deflateSetDictionary +# define deflateSetHeader z_deflateSetHeader +# define deflateTune z_deflateTune +# define deflate_copyright z_deflate_copyright +# define get_crc_table z_get_crc_table +# ifndef Z_SOLO +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzgetc z_gzgetc +# define gzgetc_ z_gzgetc_ +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# ifdef _WIN32 +# define gzopen_w z_gzopen_w +# endif +# define gzprintf z_gzprintf +# define gzvprintf z_gzvprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzwrite z_gzwrite +# endif +# define inflate z_inflate +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define inflateBackInit_ z_inflateBackInit_ +# define inflateCopy z_inflateCopy +# define inflateEnd z_inflateEnd +# define inflateGetHeader z_inflateGetHeader # define inflateInit2_ z_inflateInit2_ +# define inflateInit_ z_inflateInit_ +# define inflateMark z_inflateMark +# define inflatePrime z_inflatePrime +# define inflateReset z_inflateReset +# define inflateReset2 z_inflateReset2 # define inflateSetDictionary z_inflateSetDictionary +# define inflateGetDictionary z_inflateGetDictionary # define inflateSync z_inflateSync # define inflateSyncPoint z_inflateSyncPoint -# define inflateCopy z_inflateCopy -# define inflateReset z_inflateReset -# define inflateBack z_inflateBack -# define inflateBackEnd z_inflateBackEnd -# define compress z_compress -# define compress2 z_compress2 -# define compressBound z_compressBound -# define uncompress z_uncompress -# define adler32 z_adler32 -# define crc32 z_crc32 -# define get_crc_table z_get_crc_table +# define inflateUndermine z_inflateUndermine +# define inflateResetKeep z_inflateResetKeep +# define inflate_copyright z_inflate_copyright +# define inflate_fast z_inflate_fast +# define inflate_table z_inflate_table +# ifndef Z_SOLO +# define uncompress z_uncompress +# endif # define zError z_zError +# ifndef Z_SOLO +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# endif +# define zlibCompileFlags z_zlibCompileFlags +# define zlibVersion z_zlibVersion +/* all zlib typedefs in zlib.h and zconf.h */ +# define Byte z_Byte +# define Bytef z_Bytef # define alloc_func z_alloc_func +# define charf z_charf # define free_func z_free_func +# ifndef Z_SOLO +# define gzFile z_gzFile +# endif +# define gz_header z_gz_header +# define gz_headerp z_gz_headerp # define in_func z_in_func +# define intf z_intf # define out_func z_out_func -# define Byte z_Byte # define uInt z_uInt -# define uLong z_uLong -# define Bytef z_Bytef -# define charf z_charf -# define intf z_intf # define uIntf z_uIntf +# define uLong z_uLong # define uLongf z_uLongf -# define voidpf z_voidpf # define voidp z_voidp +# define voidpc z_voidpc +# define voidpf z_voidpf + +/* all zlib structs in zlib.h and zconf.h */ +# define gz_header_s z_gz_header_s +# define internal_state z_internal_state + #endif #if defined(__MSDOS__) && !defined(MSDOS) @@ -125,6 +218,12 @@ # endif #endif +#if defined(ZLIB_CONST) && !defined(z_const) +# define z_const const +#else +# define z_const +#endif + /* Some Mac compilers merge all .h files incorrectly: */ #if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) # define NO_DUMMY_DECL @@ -171,6 +270,14 @@ # endif #endif +#ifndef Z_ARG /* function prototypes for stdarg */ +# if defined(STDC) || defined(Z_HAVE_STDARG_H) +# define Z_ARG(args) args +# else +# define Z_ARG(args) () +# endif +#endif + /* The following definitions for FAR are needed only for MSDOS mixed * model programming (small or medium model with some far allocations). * This was tested only with MSC; for other MSDOS compilers you may have @@ -284,49 +391,121 @@ typedef uLong FAR uLongf; typedef Byte *voidp; #endif -#if 1 /* HAVE_UNISTD_H -- this line is updated by ./configure */ -# include /* for off_t */ -# include /* for SEEK_* and off_t */ -# ifdef VMS -# include /* for off_t */ +#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) +# include +# if (UINT_MAX == 0xffffffffUL) +# define Z_U4 unsigned +# elif (ULONG_MAX == 0xffffffffUL) +# define Z_U4 unsigned long +# elif (USHRT_MAX == 0xffffffffUL) +# define Z_U4 unsigned short +# endif +#endif + +#ifdef Z_U4 + typedef Z_U4 z_crc_t; +#else + typedef unsigned long z_crc_t; +#endif + +#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_UNISTD_H +#endif + +#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_STDARG_H +#endif + +#ifdef STDC +# ifndef Z_SOLO +# include /* for off_t */ +# endif +#endif + +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +# include /* for va_list */ # endif -# define z_off_t off_t #endif -#ifndef SEEK_SET + +#ifdef _WIN32 +# ifndef Z_SOLO +# include /* for wchar_t */ +# endif +#endif + +/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and + * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even + * though the former does not conform to the LFS document), but considering + * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as + * equivalently requesting no 64-bit operations + */ +#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 +# undef _LARGEFILE64_SOURCE +#endif + +#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) +# define Z_HAVE_UNISTD_H +#endif +#ifndef Z_SOLO +# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ +# ifdef VMS +# include /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif +# endif +#endif + +#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 +# define Z_LFS64 +#endif + +#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) +# define Z_LARGE64 +#endif + +#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) +# define Z_WANT64 +#endif + +#if !defined(SEEK_SET) && !defined(Z_SOLO) # define SEEK_SET 0 /* Seek from beginning of file. */ # define SEEK_CUR 1 /* Seek from current position. */ # define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ #endif + #ifndef z_off_t # define z_off_t long #endif -#if defined(__OS400__) -# define NO_vsnprintf -#endif - -#if defined(__MVS__) -# define NO_vsnprintf -# ifdef FAR -# undef FAR +#if !defined(_WIN32) && defined(Z_LARGE64) +# define z_off64_t off64_t +#else +# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) +# define z_off64_t __int64 +# else +# define z_off64_t z_off_t # endif #endif /* MVS linker does not support external names larger than 8 bytes */ #if defined(__MVS__) -# pragma map(deflateInit_,"DEIN") -# pragma map(deflateInit2_,"DEIN2") -# pragma map(deflateEnd,"DEEND") -# pragma map(deflateBound,"DEBND") -# pragma map(inflateInit_,"ININ") -# pragma map(inflateInit2_,"ININ2") -# pragma map(inflateEnd,"INEND") -# pragma map(inflateSync,"INSY") -# pragma map(inflateSetDictionary,"INSEDI") -# pragma map(compressBound,"CMBND") -# pragma map(inflate_table,"INTABL") -# pragma map(inflate_fast,"INFA") -# pragma map(inflate_copyright,"INCOPY") + #pragma map(deflateInit_,"DEIN") + #pragma map(deflateInit2_,"DEIN2") + #pragma map(deflateEnd,"DEEND") + #pragma map(deflateBound,"DEBND") + #pragma map(inflateInit_,"ININ") + #pragma map(inflateInit2_,"ININ2") + #pragma map(inflateEnd,"INEND") + #pragma map(inflateSync,"INSY") + #pragma map(inflateSetDictionary,"INSEDI") + #pragma map(compressBound,"CMBND") + #pragma map(inflate_table,"INTABL") + #pragma map(inflate_fast,"INFA") + #pragma map(inflate_copyright,"INCOPY") #endif #endif /* ZCONF_H */ diff --git a/vendors/zlib/zlib.h b/vendors/zlib/zlib.h new file mode 100644 index 0000000..3e0c767 --- /dev/null +++ b/vendors/zlib/zlib.h @@ -0,0 +1,1768 @@ +/* zlib.h -- interface of the 'zlib' general purpose compression library + version 1.2.8, April 28th, 2013 + + Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler + + 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 source 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 source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + + + The data format used by the zlib library is described by RFCs (Request for + Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 + (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). +*/ + +#ifndef ZLIB_H +#define ZLIB_H + +#include "zconf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ZLIB_VERSION "1.2.8" +#define ZLIB_VERNUM 0x1280 +#define ZLIB_VER_MAJOR 1 +#define ZLIB_VER_MINOR 2 +#define ZLIB_VER_REVISION 8 +#define ZLIB_VER_SUBREVISION 0 + +/* + The 'zlib' compression library provides in-memory compression and + decompression functions, including integrity checks of the uncompressed data. + This version of the library supports only one compression method (deflation) + but other algorithms will be added later and will have the same stream + interface. + + Compression can be done in a single step if the buffers are large enough, + or can be done by repeated calls of the compression function. In the latter + case, the application must provide more input and/or consume the output + (providing more output space) before each call. + + The compressed data format used by default by the in-memory functions is + the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped + around a deflate stream, which is itself documented in RFC 1951. + + The library also supports reading and writing files in gzip (.gz) format + with an interface similar to that of stdio using the functions that start + with "gz". The gzip format is different from the zlib format. gzip is a + gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. + + This library can optionally read and write gzip streams in memory as well. + + The zlib format was designed to be compact and fast for use in memory + and on communications channels. The gzip format was designed for single- + file compression on file systems, has a larger header than zlib to maintain + directory information, and uses a different, slower check method than zlib. + + The library does not install any signal handler. The decoder checks + the consistency of the compressed data, so the library should never crash + even in case of corrupted input. +*/ + +typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); +typedef void (*free_func) OF((voidpf opaque, voidpf address)); + +struct internal_state; + +typedef struct z_stream_s { + z_const Bytef *next_in; /* next input byte */ + uInt avail_in; /* number of bytes available at next_in */ + uLong total_in; /* total number of input bytes read so far */ + + Bytef *next_out; /* next output byte should be put there */ + uInt avail_out; /* remaining free space at next_out */ + uLong total_out; /* total number of bytes output so far */ + + z_const char *msg; /* last error message, NULL if no error */ + struct internal_state FAR *state; /* not visible by applications */ + + alloc_func zalloc; /* used to allocate the internal state */ + free_func zfree; /* used to free the internal state */ + voidpf opaque; /* private data object passed to zalloc and zfree */ + + int data_type; /* best guess about the data type: binary or text */ + uLong adler; /* adler32 value of the uncompressed data */ + uLong reserved; /* reserved for future use */ +} z_stream; + +typedef z_stream FAR *z_streamp; + +/* + gzip header information passed to and from zlib routines. See RFC 1952 + for more details on the meanings of these fields. +*/ +typedef struct gz_header_s { + int text; /* true if compressed data believed to be text */ + uLong time; /* modification time */ + int xflags; /* extra flags (not used when writing a gzip file) */ + int os; /* operating system */ + Bytef *extra; /* pointer to extra field or Z_NULL if none */ + uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ + uInt extra_max; /* space at extra (only when reading header) */ + Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ + uInt name_max; /* space at name (only when reading header) */ + Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ + uInt comm_max; /* space at comment (only when reading header) */ + int hcrc; /* true if there was or will be a header crc */ + int done; /* true when done reading gzip header (not used + when writing a gzip file) */ +} gz_header; + +typedef gz_header FAR *gz_headerp; + +/* + The application must update next_in and avail_in when avail_in has dropped + to zero. It must update next_out and avail_out when avail_out has dropped + to zero. The application must initialize zalloc, zfree and opaque before + calling the init function. All other fields are set by the compression + library and must not be updated by the application. + + The opaque value provided by the application will be passed as the first + parameter for calls of zalloc and zfree. This can be useful for custom + memory management. The compression library attaches no meaning to the + opaque value. + + zalloc must return Z_NULL if there is not enough memory for the object. + If zlib is used in a multi-threaded application, zalloc and zfree must be + thread safe. + + On 16-bit systems, the functions zalloc and zfree must be able to allocate + exactly 65536 bytes, but will not be required to allocate more than this if + the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers + returned by zalloc for objects of exactly 65536 bytes *must* have their + offset normalized to zero. The default allocation function provided by this + library ensures this (see zutil.c). To reduce memory requirements and avoid + any allocation of 64K objects, at the expense of compression ratio, compile + the library with -DMAX_WBITS=14 (see zconf.h). + + The fields total_in and total_out can be used for statistics or progress + reports. After compression, total_in holds the total size of the + uncompressed data and may be saved for use in the decompressor (particularly + if the decompressor wants to decompress everything in a single step). +*/ + + /* constants */ + +#define Z_NO_FLUSH 0 +#define Z_PARTIAL_FLUSH 1 +#define Z_SYNC_FLUSH 2 +#define Z_FULL_FLUSH 3 +#define Z_FINISH 4 +#define Z_BLOCK 5 +#define Z_TREES 6 +/* Allowed flush values; see deflate() and inflate() below for details */ + +#define Z_OK 0 +#define Z_STREAM_END 1 +#define Z_NEED_DICT 2 +#define Z_ERRNO (-1) +#define Z_STREAM_ERROR (-2) +#define Z_DATA_ERROR (-3) +#define Z_MEM_ERROR (-4) +#define Z_BUF_ERROR (-5) +#define Z_VERSION_ERROR (-6) +/* Return codes for the compression/decompression functions. Negative values + * are errors, positive values are used for special but normal events. + */ + +#define Z_NO_COMPRESSION 0 +#define Z_BEST_SPEED 1 +#define Z_BEST_COMPRESSION 9 +#define Z_DEFAULT_COMPRESSION (-1) +/* compression levels */ + +#define Z_FILTERED 1 +#define Z_HUFFMAN_ONLY 2 +#define Z_RLE 3 +#define Z_FIXED 4 +#define Z_DEFAULT_STRATEGY 0 +/* compression strategy; see deflateInit2() below for details */ + +#define Z_BINARY 0 +#define Z_TEXT 1 +#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ +#define Z_UNKNOWN 2 +/* Possible values of the data_type field (though see inflate()) */ + +#define Z_DEFLATED 8 +/* The deflate compression method (the only one supported in this version) */ + +#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ + +#define zlib_version zlibVersion() +/* for compatibility with versions < 1.0.2 */ + + + /* basic functions */ + +ZEXTERN const char * ZEXPORT zlibVersion OF((void)); +/* The application can compare zlibVersion and ZLIB_VERSION for consistency. + If the first character differs, the library code actually used is not + compatible with the zlib.h header file used by the application. This check + is automatically made by deflateInit and inflateInit. + */ + +/* +ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); + + Initializes the internal stream state for compression. The fields + zalloc, zfree and opaque must be initialized before by the caller. If + zalloc and zfree are set to Z_NULL, deflateInit updates them to use default + allocation functions. + + The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: + 1 gives best speed, 9 gives best compression, 0 gives no compression at all + (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION + requests a default compromise between speed and compression (currently + equivalent to level 6). + + deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if level is not a valid compression level, or + Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible + with the version assumed by the caller (ZLIB_VERSION). msg is set to null + if there is no error message. deflateInit does not perform any compression: + this will be done by deflate(). +*/ + + +ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); +/* + deflate compresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. deflate performs one or both of the + following actions: + + - Compress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in and avail_in are updated and + processing will resume at this point for the next call of deflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. This action is forced if the parameter flush is non zero. + Forcing flush frequently degrades the compression ratio, so this parameter + should be set only when necessary (in interactive applications). Some + output may be provided even if flush is not set. + + Before the call of deflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating avail_in or avail_out accordingly; avail_out should + never be zero before the call. The application can consume the compressed + output when it wants, for example when the output buffer is full (avail_out + == 0), or after each call of deflate(). If deflate returns Z_OK and with + zero avail_out, it must be called again after making room in the output + buffer because there might be more output pending. + + Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to + decide how much data to accumulate before producing output, in order to + maximize compression. + + If the parameter flush is set to Z_SYNC_FLUSH, all pending output is + flushed to the output buffer and the output is aligned on a byte boundary, so + that the decompressor can get all input data available so far. (In + particular avail_in is zero after the call if enough output space has been + provided before the call.) Flushing may degrade compression for some + compression algorithms and so it should be used only when necessary. This + completes the current deflate block and follows it with an empty stored block + that is three bits plus filler bits to the next byte, followed by four bytes + (00 00 ff ff). + + If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the + output buffer, but the output is not aligned to a byte boundary. All of the + input data so far will be available to the decompressor, as for Z_SYNC_FLUSH. + This completes the current deflate block and follows it with an empty fixed + codes block that is 10 bits long. This assures that enough bytes are output + in order for the decompressor to finish the block before the empty fixed code + block. + + If flush is set to Z_BLOCK, a deflate block is completed and emitted, as + for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to + seven bits of the current block are held to be written as the next byte after + the next deflate block is completed. In this case, the decompressor may not + be provided enough bits at this point in order to complete decompression of + the data provided so far to the compressor. It may need to wait for the next + block to be emitted. This is for advanced applications that need to control + the emission of deflate blocks. + + If flush is set to Z_FULL_FLUSH, all output is flushed as with + Z_SYNC_FLUSH, and the compression state is reset so that decompression can + restart from this point if previous compressed data has been damaged or if + random access is desired. Using Z_FULL_FLUSH too often can seriously degrade + compression. + + If deflate returns with avail_out == 0, this function must be called again + with the same value of the flush parameter and more output space (updated + avail_out), until the flush is complete (deflate returns with non-zero + avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that + avail_out is greater than six to avoid repeated flush markers due to + avail_out == 0 on return. + + If the parameter flush is set to Z_FINISH, pending input is processed, + pending output is flushed and deflate returns with Z_STREAM_END if there was + enough output space; if deflate returns with Z_OK, this function must be + called again with Z_FINISH and more output space (updated avail_out) but no + more input data, until it returns with Z_STREAM_END or an error. After + deflate has returned Z_STREAM_END, the only possible operations on the stream + are deflateReset or deflateEnd. + + Z_FINISH can be used immediately after deflateInit if all the compression + is to be done in a single step. In this case, avail_out must be at least the + value returned by deflateBound (see below). Then deflate is guaranteed to + return Z_STREAM_END. If not enough output space is provided, deflate will + not return Z_STREAM_END, and it must be called again as described above. + + deflate() sets strm->adler to the adler32 checksum of all input read + so far (that is, total_in bytes). + + deflate() may update strm->data_type if it can make a good guess about + the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered + binary. This field is only for information purposes and does not affect the + compression algorithm in any manner. + + deflate() returns Z_OK if some progress has been made (more input + processed or more output produced), Z_STREAM_END if all input has been + consumed and all output has been produced (only when flush is set to + Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example + if next_in or next_out was Z_NULL), Z_BUF_ERROR if no progress is possible + (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not + fatal, and deflate() can be called again with more input and more output + space to continue compressing. +*/ + + +ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any pending + output. + + deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the + stream state was inconsistent, Z_DATA_ERROR if the stream was freed + prematurely (some input or output was discarded). In the error case, msg + may be set but then points to a static string (which must not be + deallocated). +*/ + + +/* +ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); + + Initializes the internal stream state for decompression. The fields + next_in, avail_in, zalloc, zfree and opaque must be initialized before by + the caller. If next_in is not Z_NULL and avail_in is large enough (the + exact value depends on the compression method), inflateInit determines the + compression method from the zlib header and allocates all data structures + accordingly; otherwise the allocation will be deferred to the first call of + inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to + use default allocation functions. + + inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit does not perform any decompression + apart from possibly reading the zlib header if present: actual decompression + will be done by inflate(). (So next_in and avail_in may be modified, but + next_out and avail_out are unused and unchanged.) The current implementation + of inflateInit() does not process any header information -- that is deferred + until inflate() is called. +*/ + + +ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); +/* + inflate decompresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. inflate performs one or both of the + following actions: + + - Decompress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in is updated and processing will + resume at this point for the next call of inflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. inflate() provides as much output as possible, until there is + no more input data or no more space in the output buffer (see below about + the flush parameter). + + Before the call of inflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating the next_* and avail_* values accordingly. The + application can consume the uncompressed output when it wants, for example + when the output buffer is full (avail_out == 0), or after each call of + inflate(). If inflate returns Z_OK and with zero avail_out, it must be + called again after making room in the output buffer because there might be + more output pending. + + The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, + Z_BLOCK, or Z_TREES. Z_SYNC_FLUSH requests that inflate() flush as much + output as possible to the output buffer. Z_BLOCK requests that inflate() + stop if and when it gets to the next deflate block boundary. When decoding + the zlib or gzip format, this will cause inflate() to return immediately + after the header and before the first block. When doing a raw inflate, + inflate() will go ahead and process the first block, and will return when it + gets to the end of that block, or when it runs out of data. + + The Z_BLOCK option assists in appending to or combining deflate streams. + Also to assist in this, on return inflate() will set strm->data_type to the + number of unused bits in the last byte taken from strm->next_in, plus 64 if + inflate() is currently decoding the last block in the deflate stream, plus + 128 if inflate() returned immediately after decoding an end-of-block code or + decoding the complete header up to just before the first byte of the deflate + stream. The end-of-block will not be indicated until all of the uncompressed + data from that block has been written to strm->next_out. The number of + unused bits may in general be greater than seven, except when bit 7 of + data_type is set, in which case the number of unused bits will be less than + eight. data_type is set as noted here every time inflate() returns for all + flush options, and so can be used to determine the amount of currently + consumed input in bits. + + The Z_TREES option behaves as Z_BLOCK does, but it also returns when the + end of each deflate block header is reached, before any actual data in that + block is decoded. This allows the caller to determine the length of the + deflate block header for later use in random access within a deflate block. + 256 is added to the value of strm->data_type when inflate() returns + immediately after reaching the end of the deflate block header. + + inflate() should normally be called until it returns Z_STREAM_END or an + error. However if all decompression is to be performed in a single step (a + single call of inflate), the parameter flush should be set to Z_FINISH. In + this case all pending input is processed and all pending output is flushed; + avail_out must be large enough to hold all of the uncompressed data for the + operation to complete. (The size of the uncompressed data may have been + saved by the compressor for this purpose.) The use of Z_FINISH is not + required to perform an inflation in one step. However it may be used to + inform inflate that a faster approach can be used for the single inflate() + call. Z_FINISH also informs inflate to not maintain a sliding window if the + stream completes, which reduces inflate's memory footprint. If the stream + does not complete, either because not all of the stream is provided or not + enough output space is provided, then a sliding window will be allocated and + inflate() can be called again to continue the operation as if Z_NO_FLUSH had + been used. + + In this implementation, inflate() always flushes as much output as + possible to the output buffer, and always uses the faster approach on the + first call. So the effects of the flush parameter in this implementation are + on the return value of inflate() as noted below, when inflate() returns early + when Z_BLOCK or Z_TREES is used, and when inflate() avoids the allocation of + memory for a sliding window when Z_FINISH is used. + + If a preset dictionary is needed after this call (see inflateSetDictionary + below), inflate sets strm->adler to the Adler-32 checksum of the dictionary + chosen by the compressor and returns Z_NEED_DICT; otherwise it sets + strm->adler to the Adler-32 checksum of all output produced so far (that is, + total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described + below. At the end of the stream, inflate() checks that its computed adler32 + checksum is equal to that saved by the compressor and returns Z_STREAM_END + only if the checksum is correct. + + inflate() can decompress and check either zlib-wrapped or gzip-wrapped + deflate data. The header type is detected automatically, if requested when + initializing with inflateInit2(). Any information contained in the gzip + header is not retained, so applications that need that information should + instead use raw inflate, see inflateInit2() below, or inflateBack() and + perform their own processing of the gzip header and trailer. When processing + gzip-wrapped deflate data, strm->adler32 is set to the CRC-32 of the output + producted so far. The CRC-32 is checked against the gzip trailer. + + inflate() returns Z_OK if some progress has been made (more input processed + or more output produced), Z_STREAM_END if the end of the compressed data has + been reached and all uncompressed output has been produced, Z_NEED_DICT if a + preset dictionary is needed at this point, Z_DATA_ERROR if the input data was + corrupted (input stream not conforming to the zlib format or incorrect check + value), Z_STREAM_ERROR if the stream structure was inconsistent (for example + next_in or next_out was Z_NULL), Z_MEM_ERROR if there was not enough memory, + Z_BUF_ERROR if no progress is possible or if there was not enough room in the + output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and + inflate() can be called again with more input and more output space to + continue decompressing. If Z_DATA_ERROR is returned, the application may + then call inflateSync() to look for a good compression block if a partial + recovery of the data is desired. +*/ + + +ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any pending + output. + + inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state + was inconsistent. In the error case, msg may be set but then points to a + static string (which must not be deallocated). +*/ + + + /* Advanced functions */ + +/* + The following functions are needed only in some special applications. +*/ + +/* +ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy)); + + This is another version of deflateInit with more compression options. The + fields next_in, zalloc, zfree and opaque must be initialized before by the + caller. + + The method parameter is the compression method. It must be Z_DEFLATED in + this version of the library. + + The windowBits parameter is the base two logarithm of the window size + (the size of the history buffer). It should be in the range 8..15 for this + version of the library. Larger values of this parameter result in better + compression at the expense of memory usage. The default value is 15 if + deflateInit is used instead. + + windowBits can also be -8..-15 for raw deflate. In this case, -windowBits + determines the window size. deflate() will then generate raw deflate data + with no zlib header or trailer, and will not compute an adler32 check value. + + windowBits can also be greater than 15 for optional gzip encoding. Add + 16 to windowBits to write a simple gzip header and trailer around the + compressed data instead of a zlib wrapper. The gzip header will have no + file name, no extra data, no comment, no modification time (set to zero), no + header crc, and the operating system will be set to 255 (unknown). If a + gzip stream is being written, strm->adler is a crc32 instead of an adler32. + + The memLevel parameter specifies how much memory should be allocated + for the internal compression state. memLevel=1 uses minimum memory but is + slow and reduces compression ratio; memLevel=9 uses maximum memory for + optimal speed. The default value is 8. See zconf.h for total memory usage + as a function of windowBits and memLevel. + + The strategy parameter is used to tune the compression algorithm. Use the + value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a + filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no + string match), or Z_RLE to limit match distances to one (run-length + encoding). Filtered data consists mostly of small values with a somewhat + random distribution. In this case, the compression algorithm is tuned to + compress them better. The effect of Z_FILTERED is to force more Huffman + coding and less string matching; it is somewhat intermediate between + Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as + fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The + strategy parameter only affects the compression ratio but not the + correctness of the compressed output even if it is not set appropriately. + Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler + decoder for special applications. + + deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid + method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is + incompatible with the version assumed by the caller (ZLIB_VERSION). msg is + set to null if there is no error message. deflateInit2 does not perform any + compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the compression dictionary from the given byte sequence + without producing any compressed output. When using the zlib format, this + function must be called immediately after deflateInit, deflateInit2 or + deflateReset, and before any call of deflate. When doing raw deflate, this + function must be called either before any call of deflate, or immediately + after the completion of a deflate block, i.e. after all input has been + consumed and all output has been delivered when using any of the flush + options Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, or Z_FULL_FLUSH. The + compressor and decompressor must use exactly the same dictionary (see + inflateSetDictionary). + + The dictionary should consist of strings (byte sequences) that are likely + to be encountered later in the data to be compressed, with the most commonly + used strings preferably put towards the end of the dictionary. Using a + dictionary is most useful when the data to be compressed is short and can be + predicted with good accuracy; the data can then be compressed better than + with the default empty dictionary. + + Depending on the size of the compression data structures selected by + deflateInit or deflateInit2, a part of the dictionary may in effect be + discarded, for example if the dictionary is larger than the window size + provided in deflateInit or deflateInit2. Thus the strings most likely to be + useful should be put at the end of the dictionary, not at the front. In + addition, the current implementation of deflate will use at most the window + size minus 262 bytes of the provided dictionary. + + Upon return of this function, strm->adler is set to the adler32 value + of the dictionary; the decompressor may later use this value to determine + which dictionary has been used by the compressor. (The adler32 value + applies to the whole dictionary even if only a subset of the dictionary is + actually used by the compressor.) If a raw deflate was requested, then the + adler32 value is not computed and strm->adler is not set. + + deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is + inconsistent (for example if deflate has already been called for this stream + or if not at a block boundary for raw deflate). deflateSetDictionary does + not perform any compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when several compression strategies will be + tried, for example when there are several ways of pre-processing the input + data with a filter. The streams that will be discarded should then be freed + by calling deflateEnd. Note that deflateCopy duplicates the internal + compression state which can be quite large, so this strategy is slow and can + consume lots of memory. + + deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being Z_NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); +/* + This function is equivalent to deflateEnd followed by deflateInit, + but does not free and reallocate all the internal compression state. The + stream will keep the same compression level and any other attributes that + may have been set by deflateInit2. + + deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). +*/ + +ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, + int level, + int strategy)); +/* + Dynamically update the compression level and compression strategy. The + interpretation of level and strategy is as in deflateInit2. This can be + used to switch between compression and straight copy of the input data, or + to switch to a different kind of input data requiring a different strategy. + If the compression level is changed, the input available so far is + compressed with the old level (and may be flushed); the new level will take + effect only at the next call of deflate(). + + Before the call of deflateParams, the stream state must be set as for + a call of deflate(), since the currently available input may have to be + compressed and flushed. In particular, strm->avail_out must be non-zero. + + deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source + stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if + strm->avail_out was zero. +*/ + +ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, + int good_length, + int max_lazy, + int nice_length, + int max_chain)); +/* + Fine tune deflate's internal compression parameters. This should only be + used by someone who understands the algorithm used by zlib's deflate for + searching for the best matching string, and even then only by the most + fanatic optimizer trying to squeeze out the last compressed bit for their + specific input data. Read the deflate.c source code for the meaning of the + max_lazy, good_length, nice_length, and max_chain parameters. + + deflateTune() can be called after deflateInit() or deflateInit2(), and + returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. + */ + +ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, + uLong sourceLen)); +/* + deflateBound() returns an upper bound on the compressed size after + deflation of sourceLen bytes. It must be called after deflateInit() or + deflateInit2(), and after deflateSetHeader(), if used. This would be used + to allocate an output buffer for deflation in a single pass, and so would be + called before deflate(). If that first deflate() call is provided the + sourceLen input bytes, an output buffer allocated to the size returned by + deflateBound(), and the flush value Z_FINISH, then deflate() is guaranteed + to return Z_STREAM_END. Note that it is possible for the compressed size to + be larger than the value returned by deflateBound() if flush options other + than Z_FINISH or Z_NO_FLUSH are used. +*/ + +ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm, + unsigned *pending, + int *bits)); +/* + deflatePending() returns the number of bytes and bits of output that have + been generated, but not yet provided in the available output. The bytes not + provided would be due to the available output space having being consumed. + The number of bits of output not provided are between 0 and 7, where they + await more bits to join them in order to fill out a full byte. If pending + or bits are Z_NULL, then those values are not set. + + deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. + */ + +ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + deflatePrime() inserts bits in the deflate output stream. The intent + is that this function is used to start off the deflate output with the bits + leftover from a previous deflate stream when appending to it. As such, this + function can only be used for raw deflate, and must be used before the first + deflate() call after a deflateInit2() or deflateReset(). bits must be less + than or equal to 16, and that many of the least significant bits of value + will be inserted in the output. + + deflatePrime returns Z_OK if success, Z_BUF_ERROR if there was not enough + room in the internal buffer to insert the bits, or Z_STREAM_ERROR if the + source stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, + gz_headerp head)); +/* + deflateSetHeader() provides gzip header information for when a gzip + stream is requested by deflateInit2(). deflateSetHeader() may be called + after deflateInit2() or deflateReset() and before the first call of + deflate(). The text, time, os, extra field, name, and comment information + in the provided gz_header structure are written to the gzip header (xflag is + ignored -- the extra flags are set according to the compression level). The + caller must assure that, if not Z_NULL, name and comment are terminated with + a zero byte, and that if extra is not Z_NULL, that extra_len bytes are + available there. If hcrc is true, a gzip header crc is included. Note that + the current versions of the command-line version of gzip (up through version + 1.3.x) do not support header crc's, and will report that it is a "multi-part + gzip file" and give up. + + If deflateSetHeader is not used, the default gzip header has text false, + the time set to zero, and os set to 255, with no extra, name, or comment + fields. The gzip header is returned to the default state by deflateReset(). + + deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, + int windowBits)); + + This is another version of inflateInit with an extra parameter. The + fields next_in, avail_in, zalloc, zfree and opaque must be initialized + before by the caller. + + The windowBits parameter is the base two logarithm of the maximum window + size (the size of the history buffer). It should be in the range 8..15 for + this version of the library. The default value is 15 if inflateInit is used + instead. windowBits must be greater than or equal to the windowBits value + provided to deflateInit2() while compressing, or it must be equal to 15 if + deflateInit2() was not used. If a compressed stream with a larger window + size is given as input, inflate() will return with the error code + Z_DATA_ERROR instead of trying to allocate a larger window. + + windowBits can also be zero to request that inflate use the window size in + the zlib header of the compressed stream. + + windowBits can also be -8..-15 for raw inflate. In this case, -windowBits + determines the window size. inflate() will then process raw deflate data, + not looking for a zlib or gzip header, not generating a check value, and not + looking for any check values for comparison at the end of the stream. This + is for use with other formats that use the deflate compressed data format + such as zip. Those formats provide their own check values. If a custom + format is developed using the raw deflate format for compressed data, it is + recommended that a check value such as an adler32 or a crc32 be applied to + the uncompressed data as is done in the zlib, gzip, and zip formats. For + most applications, the zlib format should be used as is. Note that comments + above on the use in deflateInit2() applies to the magnitude of windowBits. + + windowBits can also be greater than 15 for optional gzip decoding. Add + 32 to windowBits to enable zlib and gzip decoding with automatic header + detection, or add 16 to decode only the gzip format (the zlib format will + return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a + crc32 instead of an adler32. + + inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit2 does not perform any decompression + apart from possibly reading the zlib header if present: actual decompression + will be done by inflate(). (So next_in and avail_in may be modified, but + next_out and avail_out are unused and unchanged.) The current implementation + of inflateInit2() does not process any header information -- that is + deferred until inflate() is called. +*/ + +ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the decompression dictionary from the given uncompressed byte + sequence. This function must be called immediately after a call of inflate, + if that call returned Z_NEED_DICT. The dictionary chosen by the compressor + can be determined from the adler32 value returned by that call of inflate. + The compressor and decompressor must use exactly the same dictionary (see + deflateSetDictionary). For raw inflate, this function can be called at any + time to set the dictionary. If the provided dictionary is smaller than the + window and there is already data in the window, then the provided dictionary + will amend what's there. The application must insure that the dictionary + that was used for compression is provided. + + inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is + inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the + expected one (incorrect adler32 value). inflateSetDictionary does not + perform any decompression: this will be done by subsequent calls of + inflate(). +*/ + +ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm, + Bytef *dictionary, + uInt *dictLength)); +/* + Returns the sliding dictionary being maintained by inflate. dictLength is + set to the number of bytes in the dictionary, and that many bytes are copied + to dictionary. dictionary must have enough space, where 32768 bytes is + always enough. If inflateGetDictionary() is called with dictionary equal to + Z_NULL, then only the dictionary length is returned, and nothing is copied. + Similary, if dictLength is Z_NULL, then it is not set. + + inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the + stream state is inconsistent. +*/ + +ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); +/* + Skips invalid compressed data until a possible full flush point (see above + for the description of deflate with Z_FULL_FLUSH) can be found, or until all + available input is skipped. No output is provided. + + inflateSync searches for a 00 00 FF FF pattern in the compressed data. + All full flush points have this pattern, but not all occurrences of this + pattern are full flush points. + + inflateSync returns Z_OK if a possible full flush point has been found, + Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point + has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. + In the success case, the application may save the current current value of + total_in which indicates where valid compressed data was found. In the + error case, the application may repeatedly call inflateSync, providing more + input each time, until success or end of the input data. +*/ + +ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when randomly accessing a large stream. The + first pass through the stream can periodically record the inflate state, + allowing restarting inflate at those points when randomly accessing the + stream. + + inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being Z_NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); +/* + This function is equivalent to inflateEnd followed by inflateInit, + but does not free and reallocate all the internal decompression state. The + stream will keep attributes that may have been set by inflateInit2. + + inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). +*/ + +ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, + int windowBits)); +/* + This function is the same as inflateReset, but it also permits changing + the wrap and window size requests. The windowBits parameter is interpreted + the same as it is for inflateInit2. + + inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL), or if + the windowBits parameter is invalid. +*/ + +ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + This function inserts bits in the inflate input stream. The intent is + that this function is used to start inflating at a bit position in the + middle of a byte. The provided bits will be used before any bytes are used + from next_in. This function should only be used with raw inflate, and + should be used before the first inflate() call after inflateInit2() or + inflateReset(). bits must be less than or equal to 16, and that many of the + least significant bits of value will be inserted in the input. + + If bits is negative, then the input stream bit buffer is emptied. Then + inflatePrime() can be called again to put bits in the buffer. This is used + to clear out bits leftover after feeding inflate a block description prior + to feeding inflate codes. + + inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); +/* + This function returns two values, one in the lower 16 bits of the return + value, and the other in the remaining upper bits, obtained by shifting the + return value down 16 bits. If the upper value is -1 and the lower value is + zero, then inflate() is currently decoding information outside of a block. + If the upper value is -1 and the lower value is non-zero, then inflate is in + the middle of a stored block, with the lower value equaling the number of + bytes from the input remaining to copy. If the upper value is not -1, then + it is the number of bits back from the current bit position in the input of + the code (literal or length/distance pair) currently being processed. In + that case the lower value is the number of bytes already emitted for that + code. + + A code is being processed if inflate is waiting for more input to complete + decoding of the code, or if it has completed decoding but is waiting for + more output space to write the literal or match data. + + inflateMark() is used to mark locations in the input data for random + access, which may be at bit positions, and to note those cases where the + output of a code may span boundaries of random access blocks. The current + location in the input stream can be determined from avail_in and data_type + as noted in the description for the Z_BLOCK flush parameter for inflate. + + inflateMark returns the value noted above or -1 << 16 if the provided + source stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, + gz_headerp head)); +/* + inflateGetHeader() requests that gzip header information be stored in the + provided gz_header structure. inflateGetHeader() may be called after + inflateInit2() or inflateReset(), and before the first call of inflate(). + As inflate() processes the gzip stream, head->done is zero until the header + is completed, at which time head->done is set to one. If a zlib stream is + being decoded, then head->done is set to -1 to indicate that there will be + no gzip header information forthcoming. Note that Z_BLOCK or Z_TREES can be + used to force inflate() to return immediately after header processing is + complete and before any actual data is decompressed. + + The text, time, xflags, and os fields are filled in with the gzip header + contents. hcrc is set to true if there is a header CRC. (The header CRC + was valid if done is set to one.) If extra is not Z_NULL, then extra_max + contains the maximum number of bytes to write to extra. Once done is true, + extra_len contains the actual extra field length, and extra contains the + extra field, or that field truncated if extra_max is less than extra_len. + If name is not Z_NULL, then up to name_max characters are written there, + terminated with a zero unless the length is greater than name_max. If + comment is not Z_NULL, then up to comm_max characters are written there, + terminated with a zero unless the length is greater than comm_max. When any + of extra, name, or comment are not Z_NULL and the respective field is not + present in the header, then that field is set to Z_NULL to signal its + absence. This allows the use of deflateSetHeader() with the returned + structure to duplicate the header. However if those fields are set to + allocated memory, then the application will need to save those pointers + elsewhere so that they can be eventually freed. + + If inflateGetHeader is not used, then the header information is simply + discarded. The header is always checked for validity, including the header + CRC if present. inflateReset() will reset the process to discard the header + information. The application would need to call inflateGetHeader() again to + retrieve the header from the next gzip stream. + + inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, + unsigned char FAR *window)); + + Initialize the internal stream state for decompression using inflateBack() + calls. The fields zalloc, zfree and opaque in strm must be initialized + before the call. If zalloc and zfree are Z_NULL, then the default library- + derived memory allocation routines are used. windowBits is the base two + logarithm of the window size, in the range 8..15. window is a caller + supplied buffer of that size. Except for special applications where it is + assured that deflate was used with small window sizes, windowBits must be 15 + and a 32K byte window must be supplied to be able to decompress general + deflate streams. + + See inflateBack() for the usage of these routines. + + inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of + the parameters are invalid, Z_MEM_ERROR if the internal state could not be + allocated, or Z_VERSION_ERROR if the version of the library does not match + the version of the header file. +*/ + +typedef unsigned (*in_func) OF((void FAR *, + z_const unsigned char FAR * FAR *)); +typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); + +ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc)); +/* + inflateBack() does a raw inflate with a single call using a call-back + interface for input and output. This is potentially more efficient than + inflate() for file i/o applications, in that it avoids copying between the + output and the sliding window by simply making the window itself the output + buffer. inflate() can be faster on modern CPUs when used with large + buffers. inflateBack() trusts the application to not change the output + buffer passed by the output function, at least until inflateBack() returns. + + inflateBackInit() must be called first to allocate the internal state + and to initialize the state with the user-provided window buffer. + inflateBack() may then be used multiple times to inflate a complete, raw + deflate stream with each call. inflateBackEnd() is then called to free the + allocated state. + + A raw deflate stream is one with no zlib or gzip header or trailer. + This routine would normally be used in a utility that reads zip or gzip + files and writes out uncompressed files. The utility would decode the + header and process the trailer on its own, hence this routine expects only + the raw deflate stream to decompress. This is different from the normal + behavior of inflate(), which expects either a zlib or gzip header and + trailer around the deflate stream. + + inflateBack() uses two subroutines supplied by the caller that are then + called by inflateBack() for input and output. inflateBack() calls those + routines until it reads a complete deflate stream and writes out all of the + uncompressed data, or until it encounters an error. The function's + parameters and return types are defined above in the in_func and out_func + typedefs. inflateBack() will call in(in_desc, &buf) which should return the + number of bytes of provided input, and a pointer to that input in buf. If + there is no input available, in() must return zero--buf is ignored in that + case--and inflateBack() will return a buffer error. inflateBack() will call + out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() + should return zero on success, or non-zero on failure. If out() returns + non-zero, inflateBack() will return with an error. Neither in() nor out() + are permitted to change the contents of the window provided to + inflateBackInit(), which is also the buffer that out() uses to write from. + The length written by out() will be at most the window size. Any non-zero + amount of input may be provided by in(). + + For convenience, inflateBack() can be provided input on the first call by + setting strm->next_in and strm->avail_in. If that input is exhausted, then + in() will be called. Therefore strm->next_in must be initialized before + calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called + immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in + must also be initialized, and then if strm->avail_in is not zero, input will + initially be taken from strm->next_in[0 .. strm->avail_in - 1]. + + The in_desc and out_desc parameters of inflateBack() is passed as the + first parameter of in() and out() respectively when they are called. These + descriptors can be optionally used to pass any information that the caller- + supplied in() and out() functions need to do their job. + + On return, inflateBack() will set strm->next_in and strm->avail_in to + pass back any unused input that was provided by the last in() call. The + return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR + if in() or out() returned an error, Z_DATA_ERROR if there was a format error + in the deflate stream (in which case strm->msg is set to indicate the nature + of the error), or Z_STREAM_ERROR if the stream was not properly initialized. + In the case of Z_BUF_ERROR, an input or output error can be distinguished + using strm->next_in which will be Z_NULL only if in() returned an error. If + strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning + non-zero. (in() will always be called before out(), so strm->next_in is + assured to be defined if out() returns non-zero.) Note that inflateBack() + cannot return Z_OK. +*/ + +ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); +/* + All memory allocated by inflateBackInit() is freed. + + inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream + state was inconsistent. +*/ + +ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); +/* Return flags indicating compile-time options. + + Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: + 1.0: size of uInt + 3.2: size of uLong + 5.4: size of voidpf (pointer) + 7.6: size of z_off_t + + Compiler, assembler, and debug options: + 8: DEBUG + 9: ASMV or ASMINF -- use ASM code + 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention + 11: 0 (reserved) + + One-time table building (smaller code, but not thread-safe if true): + 12: BUILDFIXED -- build static block decoding tables when needed + 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed + 14,15: 0 (reserved) + + Library content (indicates missing functionality): + 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking + deflate code when not needed) + 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect + and decode gzip streams (to avoid linking crc code) + 18-19: 0 (reserved) + + Operation variations (changes in library functionality): + 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate + 21: FASTEST -- deflate algorithm with only one, lowest compression level + 22,23: 0 (reserved) + + The sprintf variant used by gzprintf (zero is best): + 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format + 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! + 26: 0 = returns value, 1 = void -- 1 means inferred string length returned + + Remainder: + 27-31: 0 (reserved) + */ + +#ifndef Z_SOLO + + /* utility functions */ + +/* + The following utility functions are implemented on top of the basic + stream-oriented functions. To simplify the interface, some default options + are assumed (compression level and memory usage, standard memory allocation + functions). The source code of these utility functions can be modified if + you need special options. +*/ + +ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Compresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + + compress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer. +*/ + +ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen, + int level)); +/* + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ + +ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); +/* + compressBound() returns an upper bound on the compressed size after + compress() or compress2() on sourceLen bytes. It would be used before a + compress() or compress2() call to allocate the destination buffer. +*/ + +ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be large enough to hold the entire + uncompressed data. (The size of the uncompressed data must have been saved + previously by the compressor and transmitted to the decompressor by some + mechanism outside the scope of this compression library.) Upon exit, destLen + is the actual size of the uncompressed buffer. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. In + the case where there is not enough room, uncompress() will fill the output + buffer with the uncompressed data up to that point. +*/ + + /* gzip file access functions */ + +/* + This library supports reading and writing files in gzip (.gz) format with + an interface similar to that of stdio, using the functions that start with + "gz". The gzip format is different from the zlib format. gzip is a gzip + wrapper, documented in RFC 1952, wrapped around a deflate stream. +*/ + +typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */ + +/* +ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); + + Opens a gzip (.gz) file for reading or writing. The mode parameter is as + in fopen ("rb" or "wb") but can also include a compression level ("wb9") or + a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only + compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' + for fixed code compression as in "wb9F". (See the description of + deflateInit2 for more information about the strategy parameter.) 'T' will + request transparent writing or appending with no compression and not using + the gzip format. + + "a" can be used instead of "w" to request that the gzip stream that will + be written be appended to the file. "+" will result in an error, since + reading and writing to the same gzip file is not supported. The addition of + "x" when writing will create the file exclusively, which fails if the file + already exists. On systems that support it, the addition of "e" when + reading or writing will set the flag to close the file on an execve() call. + + These functions, as well as gzip, will read and decode a sequence of gzip + streams in a file. The append function of gzopen() can be used to create + such a file. (Also see gzflush() for another way to do this.) When + appending, gzopen does not test whether the file begins with a gzip stream, + nor does it look for the end of the gzip streams to begin appending. gzopen + will simply append a gzip stream to the existing file. + + gzopen can be used to read a file which is not in gzip format; in this + case gzread will directly read from the file without decompression. When + reading, this will be detected automatically by looking for the magic two- + byte gzip header. + + gzopen returns NULL if the file could not be opened, if there was + insufficient memory to allocate the gzFile state, or if an invalid mode was + specified (an 'r', 'w', or 'a' was not provided, or '+' was provided). + errno can be checked to determine if the reason gzopen failed was that the + file could not be opened. +*/ + +ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); +/* + gzdopen associates a gzFile with the file descriptor fd. File descriptors + are obtained from calls like open, dup, creat, pipe or fileno (if the file + has been previously opened with fopen). The mode parameter is as in gzopen. + + The next call of gzclose on the returned gzFile will also close the file + descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor + fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd, + mode);. The duplicated descriptor should be saved to avoid a leak, since + gzdopen does not close fd if it fails. If you are using fileno() to get the + file descriptor from a FILE *, then you will have to use dup() to avoid + double-close()ing the file descriptor. Both gzclose() and fclose() will + close the associated file descriptor, so they need to have different file + descriptors. + + gzdopen returns NULL if there was insufficient memory to allocate the + gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not + provided, or '+' was provided), or if fd is -1. The file descriptor is not + used until the next gz* read, write, seek, or close operation, so gzdopen + will not detect if fd is invalid (unless fd is -1). +*/ + +ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); +/* + Set the internal buffer size used by this library's functions. The + default buffer size is 8192 bytes. This function must be called after + gzopen() or gzdopen(), and before any other calls that read or write the + file. The buffer memory allocation is always deferred to the first read or + write. Two buffers are allocated, either both of the specified size when + writing, or one of the specified size and the other twice that size when + reading. A larger buffer size of, for example, 64K or 128K bytes will + noticeably increase the speed of decompression (reading). + + The new buffer size also affects the maximum length for gzprintf(). + + gzbuffer() returns 0 on success, or -1 on failure, such as being called + too late. +*/ + +ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); +/* + Dynamically update the compression level or strategy. See the description + of deflateInit2 for the meaning of these parameters. + + gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not + opened for writing. +*/ + +ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); +/* + Reads the given number of uncompressed bytes from the compressed file. If + the input file is not in gzip format, gzread copies the given number of + bytes into the buffer directly from the file. + + After reaching the end of a gzip stream in the input, gzread will continue + to read, looking for another gzip stream. Any number of gzip streams may be + concatenated in the input file, and will all be decompressed by gzread(). + If something other than a gzip stream is encountered after a gzip stream, + that remaining trailing garbage is ignored (and no error is returned). + + gzread can be used to read a gzip file that is being concurrently written. + Upon reaching the end of the input, gzread will return with the available + data. If the error code returned by gzerror is Z_OK or Z_BUF_ERROR, then + gzclearerr can be used to clear the end of file indicator in order to permit + gzread to be tried again. Z_OK indicates that a gzip stream was completed + on the last gzread. Z_BUF_ERROR indicates that the input file ended in the + middle of a gzip stream. Note that gzread does not return -1 in the event + of an incomplete gzip stream. This error is deferred until gzclose(), which + will return Z_BUF_ERROR if the last gzread ended in the middle of a gzip + stream. Alternatively, gzerror can be used before gzclose to detect this + case. + + gzread returns the number of uncompressed bytes actually read, less than + len for end of file, or -1 for error. +*/ + +ZEXTERN int ZEXPORT gzwrite OF((gzFile file, + voidpc buf, unsigned len)); +/* + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of uncompressed bytes written or 0 in case of + error. +*/ + +ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...)); +/* + Converts, formats, and writes the arguments to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written, or 0 in case of error. The number of + uncompressed bytes written is limited to 8191, or one less than the buffer + size given to gzbuffer(). The caller should assure that this limit is not + exceeded. If it is exceeded, then gzprintf() will return an error (0) with + nothing written. In this case, there may also be a buffer overflow with + unpredictable consequences, which is possible only if zlib was compiled with + the insecure functions sprintf() or vsprintf() because the secure snprintf() + or vsnprintf() functions were not available. This can be determined using + zlibCompileFlags(). +*/ + +ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); +/* + Writes the given null-terminated string to the compressed file, excluding + the terminating null character. + + gzputs returns the number of characters written, or -1 in case of error. +*/ + +ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); +/* + Reads bytes from the compressed file until len-1 characters are read, or a + newline character is read and transferred to buf, or an end-of-file + condition is encountered. If any characters are read or if len == 1, the + string is terminated with a null character. If no characters are read due + to an end-of-file or len < 1, then the buffer is left untouched. + + gzgets returns buf which is a null-terminated string, or it returns NULL + for end-of-file or in case of error. If there was an error, the contents at + buf are indeterminate. +*/ + +ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); +/* + Writes c, converted to an unsigned char, into the compressed file. gzputc + returns the value that was written, or -1 in case of error. +*/ + +ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); +/* + Reads one byte from the compressed file. gzgetc returns this byte or -1 + in case of end of file or error. This is implemented as a macro for speed. + As such, it does not do all of the checking the other functions do. I.e. + it does not check to see if file is NULL, nor whether the structure file + points to has been clobbered or not. +*/ + +ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); +/* + Push one character back onto the stream to be read as the first character + on the next read. At least one character of push-back is allowed. + gzungetc() returns the character pushed, or -1 on failure. gzungetc() will + fail if c is -1, and may fail if a character has been pushed but not read + yet. If gzungetc is used immediately after gzopen or gzdopen, at least the + output buffer size of pushed characters is allowed. (See gzbuffer above.) + The pushed character will be discarded if the stream is repositioned with + gzseek() or gzrewind(). +*/ + +ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); +/* + Flushes all pending output into the compressed file. The parameter flush + is as in the deflate() function. The return value is the zlib error number + (see function gzerror below). gzflush is only permitted when writing. + + If the flush parameter is Z_FINISH, the remaining data is written and the + gzip stream is completed in the output. If gzwrite() is called again, a new + gzip stream will be started in the output. gzread() is able to read such + concatented gzip streams. + + gzflush should be called only when strictly necessary because it will + degrade compression if called too often. +*/ + +/* +ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, + z_off_t offset, int whence)); + + Sets the starting position for the next gzread or gzwrite on the given + compressed file. The offset represents a number of bytes in the + uncompressed data stream. The whence parameter is defined as in lseek(2); + the value SEEK_END is not supported. + + If the file is opened for reading, this function is emulated but can be + extremely slow. If the file is opened for writing, only forward seeks are + supported; gzseek then compresses a sequence of zeroes up to the new + starting position. + + gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error, in + particular if the file is opened for writing and the new starting position + would be before the current position. +*/ + +ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); +/* + Rewinds the given file. This function is supported only for reading. + + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) +*/ + +/* +ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); + + Returns the starting position for the next gzread or gzwrite on the given + compressed file. This position represents a number of bytes in the + uncompressed data stream, and is zero when starting, even if appending or + reading a gzip stream from the middle of a file using gzdopen(). + + gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) +*/ + +/* +ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); + + Returns the current offset in the file being read or written. This offset + includes the count of bytes that precede the gzip stream, for example when + appending or when using gzdopen() for reading. When reading, the offset + does not include as yet unused buffered input. This information can be used + for a progress indicator. On error, gzoffset() returns -1. +*/ + +ZEXTERN int ZEXPORT gzeof OF((gzFile file)); +/* + Returns true (1) if the end-of-file indicator has been set while reading, + false (0) otherwise. Note that the end-of-file indicator is set only if the + read tried to go past the end of the input, but came up short. Therefore, + just like feof(), gzeof() may return false even if there is no more data to + read, in the event that the last read request was for the exact number of + bytes remaining in the input file. This will happen if the input file size + is an exact multiple of the buffer size. + + If gzeof() returns true, then the read functions will return no more data, + unless the end-of-file indicator is reset by gzclearerr() and the input file + has grown since the previous end of file was detected. +*/ + +ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); +/* + Returns true (1) if file is being copied directly while reading, or false + (0) if file is a gzip stream being decompressed. + + If the input file is empty, gzdirect() will return true, since the input + does not contain a gzip stream. + + If gzdirect() is used immediately after gzopen() or gzdopen() it will + cause buffers to be allocated to allow reading the file to determine if it + is a gzip file. Therefore if gzbuffer() is used, it should be called before + gzdirect(). + + When writing, gzdirect() returns true (1) if transparent writing was + requested ("wT" for the gzopen() mode), or false (0) otherwise. (Note: + gzdirect() is not needed when writing. Transparent writing must be + explicitly requested, so the application already knows the answer. When + linking statically, using gzdirect() will include all of the zlib code for + gzip file reading and decompression, which may not be desired.) +*/ + +ZEXTERN int ZEXPORT gzclose OF((gzFile file)); +/* + Flushes all pending output if necessary, closes the compressed file and + deallocates the (de)compression state. Note that once file is closed, you + cannot call gzerror with file, since its structures have been deallocated. + gzclose must not be called more than once on the same file, just as free + must not be called more than once on the same allocation. + + gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a + file operation error, Z_MEM_ERROR if out of memory, Z_BUF_ERROR if the + last read ended in the middle of a gzip stream, or Z_OK on success. +*/ + +ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); +ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); +/* + Same as gzclose(), but gzclose_r() is only for use when reading, and + gzclose_w() is only for use when writing or appending. The advantage to + using these instead of gzclose() is that they avoid linking in zlib + compression or decompression code that is not used when only reading or only + writing respectively. If gzclose() is used, then both compression and + decompression code will be included the application when linking to a static + zlib library. +*/ + +ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); +/* + Returns the error message for the last error which occurred on the given + compressed file. errnum is set to zlib error number. If an error occurred + in the file system and not in the compression library, errnum is set to + Z_ERRNO and the application may consult errno to get the exact error code. + + The application must not modify the returned string. Future calls to + this function may invalidate the previously returned string. If file is + closed, then the string previously returned by gzerror will no longer be + available. + + gzerror() should be used to distinguish errors from end-of-file for those + functions above that do not distinguish those cases in their return values. +*/ + +ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); +/* + Clears the error and end-of-file flags for file. This is analogous to the + clearerr() function in stdio. This is useful for continuing to read a gzip + file that is being written concurrently. +*/ + +#endif /* !Z_SOLO */ + + /* checksum functions */ + +/* + These functions are not related to compression but are exported + anyway because they might be useful in applications using the compression + library. +*/ + +ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); +/* + Update a running Adler-32 checksum with the bytes buf[0..len-1] and + return the updated checksum. If buf is Z_NULL, this function returns the + required initial value for the checksum. + + An Adler-32 checksum is almost as reliable as a CRC32 but can be computed + much faster. + + Usage example: + + uLong adler = adler32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + adler = adler32(adler, buffer, length); + } + if (adler != original_adler) error(); +*/ + +/* +ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, + z_off_t len2)); + + Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 + and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for + each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of + seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. Note + that the z_off_t type (like off_t) is a signed integer. If len2 is + negative, the result has no meaning or utility. +*/ + +ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); +/* + Update a running CRC-32 with the bytes buf[0..len-1] and return the + updated CRC-32. If buf is Z_NULL, this function returns the required + initial value for the crc. Pre- and post-conditioning (one's complement) is + performed within this function so it shouldn't be done by the application. + + Usage example: + + uLong crc = crc32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + crc = crc32(crc, buffer, length); + } + if (crc != original_crc) error(); +*/ + +/* +ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); + + Combine two CRC-32 check values into one. For two sequences of bytes, + seq1 and seq2 with lengths len1 and len2, CRC-32 check values were + calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 + check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and + len2. +*/ + + + /* various hacks, don't look :) */ + +/* deflateInit and inflateInit are macros to allow checking the zlib version + * and the compiler's view of z_stream: + */ +ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, + int windowBits, int memLevel, + int strategy, const char *version, + int stream_size)); +ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, + unsigned char FAR *window, + const char *version, + int stream_size)); +#define deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) +#define inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) +#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) +#define inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ + (int)sizeof(z_stream)) +#define inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, (int)sizeof(z_stream)) + +#ifndef Z_SOLO + +/* gzgetc() macro and its supporting function and exposed data structure. Note + * that the real internal state is much larger than the exposed structure. + * This abbreviated structure exposes just enough for the gzgetc() macro. The + * user should not mess with these exposed elements, since their names or + * behavior could change in the future, perhaps even capriciously. They can + * only be used by the gzgetc() macro. You have been warned. + */ +struct gzFile_s { + unsigned have; + unsigned char *next; + z_off64_t pos; +}; +ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ +#ifdef Z_PREFIX_SET +# undef z_gzgetc +# define z_gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g)) +#else +# define gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g)) +#endif + +/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or + * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if + * both are true, the application gets the *64 functions, and the regular + * functions are changed to 64 bits) -- in case these are set on systems + * without large file support, _LFS64_LARGEFILE must also be true + */ +#ifdef Z_LARGE64 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); + ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); +#endif + +#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) +# ifdef Z_PREFIX_SET +# define z_gzopen z_gzopen64 +# define z_gzseek z_gzseek64 +# define z_gztell z_gztell64 +# define z_gzoffset z_gzoffset64 +# define z_adler32_combine z_adler32_combine64 +# define z_crc32_combine z_crc32_combine64 +# else +# define gzopen gzopen64 +# define gzseek gzseek64 +# define gztell gztell64 +# define gzoffset gzoffset64 +# define adler32_combine adler32_combine64 +# define crc32_combine crc32_combine64 +# endif +# ifndef Z_LARGE64 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int)); + ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); +# endif +#else + ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); + ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int)); + ZEXTERN z_off_t ZEXPORT gztell OF((gzFile)); + ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); +#endif + +#else /* Z_SOLO */ + + ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); + +#endif /* !Z_SOLO */ + +/* hack for buggy compilers */ +#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) + struct internal_state {int dummy;}; +#endif + +/* undocumented functions */ +ZEXTERN const char * ZEXPORT zError OF((int)); +ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); +ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void)); +ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); +ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); +ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); +#if defined(_WIN32) && !defined(Z_SOLO) +ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, + const char *mode)); +#endif +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file, + const char *format, + va_list va)); +# endif +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* ZLIB_H */ diff --git a/vendors/zlib/zlib.vcxproj b/vendors/zlib/zlib.vcxproj new file mode 100644 index 0000000..d3ddfff --- /dev/null +++ b/vendors/zlib/zlib.vcxproj @@ -0,0 +1,106 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {099792A3-A922-4694-A5BB-D3BC77C96F54} + Win32Proj + zlib + + + + StaticLibrary + true + v110 + Unicode + + + StaticLibrary + false + v110 + true + Unicode + + + + + + + + + + + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + + + Windows + true + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + + + Windows + true + true + true + + + + + + \ No newline at end of file diff --git a/vendors/zlib/zlib.vcxproj.filters b/vendors/zlib/zlib.vcxproj.filters new file mode 100644 index 0000000..f51c1f5 --- /dev/null +++ b/vendors/zlib/zlib.vcxproj.filters @@ -0,0 +1,95 @@ + + + + + {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 + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header 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 + + + \ No newline at end of file diff --git a/vendors/zlib/zutil.c b/vendors/zlib/zutil.c new file mode 100644 index 0000000..23d2ebe --- /dev/null +++ b/vendors/zlib/zutil.c @@ -0,0 +1,324 @@ +/* zutil.c -- target dependent utility functions for the compression library + * Copyright (C) 1995-2005, 2010, 2011, 2012 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#include "zutil.h" +#ifndef Z_SOLO +# include "gzguts.h" +#endif + +#ifndef NO_DUMMY_DECL +struct internal_state {int dummy;}; /* for buggy compilers */ +#endif + +z_const char * const z_errmsg[10] = { +"need dictionary", /* Z_NEED_DICT 2 */ +"stream end", /* Z_STREAM_END 1 */ +"", /* Z_OK 0 */ +"file error", /* Z_ERRNO (-1) */ +"stream error", /* Z_STREAM_ERROR (-2) */ +"data error", /* Z_DATA_ERROR (-3) */ +"insufficient memory", /* Z_MEM_ERROR (-4) */ +"buffer error", /* Z_BUF_ERROR (-5) */ +"incompatible version",/* Z_VERSION_ERROR (-6) */ +""}; + + +const char * ZEXPORT zlibVersion() +{ + return ZLIB_VERSION; +} + +uLong ZEXPORT zlibCompileFlags() +{ + uLong flags; + + flags = 0; + switch ((int)(sizeof(uInt))) { + case 2: break; + case 4: flags += 1; break; + case 8: flags += 2; break; + default: flags += 3; + } + switch ((int)(sizeof(uLong))) { + case 2: break; + case 4: flags += 1 << 2; break; + case 8: flags += 2 << 2; break; + default: flags += 3 << 2; + } + switch ((int)(sizeof(voidpf))) { + case 2: break; + case 4: flags += 1 << 4; break; + case 8: flags += 2 << 4; break; + default: flags += 3 << 4; + } + switch ((int)(sizeof(z_off_t))) { + case 2: break; + case 4: flags += 1 << 6; break; + case 8: flags += 2 << 6; break; + default: flags += 3 << 6; + } +#ifdef DEBUG + flags += 1 << 8; +#endif +#if defined(ASMV) || defined(ASMINF) + flags += 1 << 9; +#endif +#ifdef ZLIB_WINAPI + flags += 1 << 10; +#endif +#ifdef BUILDFIXED + flags += 1 << 12; +#endif +#ifdef DYNAMIC_CRC_TABLE + flags += 1 << 13; +#endif +#ifdef NO_GZCOMPRESS + flags += 1L << 16; +#endif +#ifdef NO_GZIP + flags += 1L << 17; +#endif +#ifdef PKZIP_BUG_WORKAROUND + flags += 1L << 20; +#endif +#ifdef FASTEST + flags += 1L << 21; +#endif +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifdef NO_vsnprintf + flags += 1L << 25; +# ifdef HAS_vsprintf_void + flags += 1L << 26; +# endif +# else +# ifdef HAS_vsnprintf_void + flags += 1L << 26; +# endif +# endif +#else + flags += 1L << 24; +# ifdef NO_snprintf + flags += 1L << 25; +# ifdef HAS_sprintf_void + flags += 1L << 26; +# endif +# else +# ifdef HAS_snprintf_void + flags += 1L << 26; +# endif +# endif +#endif + return flags; +} + +#ifdef DEBUG + +# ifndef verbose +# define verbose 0 +# endif +int ZLIB_INTERNAL z_verbose = verbose; + +void ZLIB_INTERNAL z_error (m) + char *m; +{ + fprintf(stderr, "%s\n", m); + exit(1); +} +#endif + +/* exported to allow conversion of error code to string for compress() and + * uncompress() + */ +const char * ZEXPORT zError(err) + int err; +{ + return ERR_MSG(err); +} + +#if defined(_WIN32_WCE) + /* The Microsoft C Run-Time Library for Windows CE doesn't have + * errno. We define it as a global variable to simplify porting. + * Its value is always 0 and should not be used. + */ + int errno = 0; +#endif + +#ifndef HAVE_MEMCPY + +void ZLIB_INTERNAL zmemcpy(dest, source, len) + Bytef* dest; + const Bytef* source; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = *source++; /* ??? to be unrolled */ + } while (--len != 0); +} + +int ZLIB_INTERNAL zmemcmp(s1, s2, len) + const Bytef* s1; + const Bytef* s2; + uInt len; +{ + uInt j; + + for (j = 0; j < len; j++) { + if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; + } + return 0; +} + +void ZLIB_INTERNAL zmemzero(dest, len) + Bytef* dest; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = 0; /* ??? to be unrolled */ + } while (--len != 0); +} +#endif + +#ifndef Z_SOLO + +#ifdef SYS16BIT + +#ifdef __TURBOC__ +/* Turbo C in 16-bit mode */ + +# define MY_ZCALLOC + +/* Turbo C malloc() does not allow dynamic allocation of 64K bytes + * and farmalloc(64K) returns a pointer with an offset of 8, so we + * must fix the pointer. Warning: the pointer must be put back to its + * original form in order to free it, use zcfree(). + */ + +#define MAX_PTR 10 +/* 10*64K = 640K */ + +local int next_ptr = 0; + +typedef struct ptr_table_s { + voidpf org_ptr; + voidpf new_ptr; +} ptr_table; + +local ptr_table table[MAX_PTR]; +/* This table is used to remember the original form of pointers + * to large buffers (64K). Such pointers are normalized with a zero offset. + * Since MSDOS is not a preemptive multitasking OS, this table is not + * protected from concurrent access. This hack doesn't work anyway on + * a protected system like OS/2. Use Microsoft C instead. + */ + +voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size) +{ + voidpf buf = opaque; /* just to make some compilers happy */ + ulg bsize = (ulg)items*size; + + /* If we allocate less than 65520 bytes, we assume that farmalloc + * will return a usable pointer which doesn't have to be normalized. + */ + if (bsize < 65520L) { + buf = farmalloc(bsize); + if (*(ush*)&buf != 0) return buf; + } else { + buf = farmalloc(bsize + 16L); + } + if (buf == NULL || next_ptr >= MAX_PTR) return NULL; + table[next_ptr].org_ptr = buf; + + /* Normalize the pointer to seg:0 */ + *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; + *(ush*)&buf = 0; + table[next_ptr++].new_ptr = buf; + return buf; +} + +void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) +{ + int n; + if (*(ush*)&ptr != 0) { /* object < 64K */ + farfree(ptr); + return; + } + /* Find the original pointer */ + for (n = 0; n < next_ptr; n++) { + if (ptr != table[n].new_ptr) continue; + + farfree(table[n].org_ptr); + while (++n < next_ptr) { + table[n-1] = table[n]; + } + next_ptr--; + return; + } + ptr = opaque; /* just to make some compilers happy */ + Assert(0, "zcfree: ptr not found"); +} + +#endif /* __TURBOC__ */ + + +#ifdef M_I86 +/* Microsoft C in 16-bit mode */ + +# define MY_ZCALLOC + +#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) +# define _halloc halloc +# define _hfree hfree +#endif + +voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size) +{ + if (opaque) opaque = 0; /* to make compiler happy */ + return _halloc((long)items, size); +} + +void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) +{ + if (opaque) opaque = 0; /* to make compiler happy */ + _hfree(ptr); +} + +#endif /* M_I86 */ + +#endif /* SYS16BIT */ + + +#ifndef MY_ZCALLOC /* Any system without a special alloc function */ + +#ifndef STDC +extern voidp malloc OF((uInt size)); +extern voidp calloc OF((uInt items, uInt size)); +extern void free OF((voidpf ptr)); +#endif + +voidpf ZLIB_INTERNAL zcalloc (opaque, items, size) + voidpf opaque; + unsigned items; + unsigned size; +{ + if (opaque) items += size - size; /* make compiler happy */ + return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : + (voidpf)calloc(items, size); +} + +void ZLIB_INTERNAL zcfree (opaque, ptr) + voidpf opaque; + voidpf ptr; +{ + free(ptr); + if (opaque) return; /* make compiler happy */ +} + +#endif /* MY_ZCALLOC */ + +#endif /* !Z_SOLO */ diff --git a/vendors/zlib/zutil.h b/vendors/zlib/zutil.h new file mode 100644 index 0000000..24ab06b --- /dev/null +++ b/vendors/zlib/zutil.h @@ -0,0 +1,253 @@ +/* zutil.h -- internal interface and configuration of the compression library + * Copyright (C) 1995-2013 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id$ */ + +#ifndef ZUTIL_H +#define ZUTIL_H + +#ifdef HAVE_HIDDEN +# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +#else +# define ZLIB_INTERNAL +#endif + +#include "zlib.h" + +#if defined(STDC) && !defined(Z_SOLO) +# if !(defined(_WIN32_WCE) && defined(_MSC_VER)) +# include +# endif +# include +# include +#endif + +#ifdef Z_SOLO + typedef long ptrdiff_t; /* guess -- will be caught if guess is wrong */ +#endif + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + +typedef unsigned char uch; +typedef uch FAR uchf; +typedef unsigned short ush; +typedef ush FAR ushf; +typedef unsigned long ulg; + +extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ +/* (size given to avoid silly warnings with Visual C++) */ + +#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] + +#define ERR_RETURN(strm,err) \ + return (strm->msg = ERR_MSG(err), (err)) +/* To be used only when the state is known to be valid */ + + /* common constants */ + +#ifndef DEF_WBITS +# define DEF_WBITS MAX_WBITS +#endif +/* default windowBits for decompression. MAX_WBITS is for compression only */ + +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif +/* default memLevel */ + +#define STORED_BLOCK 0 +#define STATIC_TREES 1 +#define DYN_TREES 2 +/* The three kinds of block type */ + +#define MIN_MATCH 3 +#define MAX_MATCH 258 +/* The minimum and maximum match lengths */ + +#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ + + /* target dependencies */ + +#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) +# define OS_CODE 0x00 +# ifndef Z_SOLO +# if defined(__TURBOC__) || defined(__BORLANDC__) +# if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) + /* Allow compilation with ANSI keywords only enabled */ + void _Cdecl farfree( void *block ); + void *_Cdecl farmalloc( unsigned long nbytes ); +# else +# include +# endif +# else /* MSC or DJGPP */ +# include +# endif +# endif +#endif + +#ifdef AMIGA +# define OS_CODE 0x01 +#endif + +#if defined(VAXC) || defined(VMS) +# define OS_CODE 0x02 +# define F_OPEN(name, mode) \ + fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") +#endif + +#if defined(ATARI) || defined(atarist) +# define OS_CODE 0x05 +#endif + +#ifdef OS2 +# define OS_CODE 0x06 +# if defined(M_I86) && !defined(Z_SOLO) +# include +# endif +#endif + +#if defined(MACOS) || defined(TARGET_OS_MAC) +# define OS_CODE 0x07 +# ifndef Z_SOLO +# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os +# include /* for fdopen */ +# else +# ifndef fdopen +# define fdopen(fd,mode) NULL /* No fdopen() */ +# endif +# endif +# endif +#endif + +#ifdef TOPS20 +# define OS_CODE 0x0a +#endif + +#ifdef WIN32 +# ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */ +# define OS_CODE 0x0b +# endif +#endif + +#ifdef __50SERIES /* Prime/PRIMOS */ +# define OS_CODE 0x0f +#endif + +#if defined(_BEOS_) || defined(RISCOS) +# define fdopen(fd,mode) NULL /* No fdopen() */ +#endif + +#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX +# if defined(_WIN32_WCE) +# define fdopen(fd,mode) NULL /* No fdopen() */ +# ifndef _PTRDIFF_T_DEFINED + typedef int ptrdiff_t; +# define _PTRDIFF_T_DEFINED +# endif +# else +# define fdopen(fd,type) _fdopen(fd,type) +# endif +#endif + +#if defined(__BORLANDC__) && !defined(MSDOS) + #pragma warn -8004 + #pragma warn -8008 + #pragma warn -8066 +#endif + +/* provide prototypes for these when building zlib without LFS */ +#if !defined(_WIN32) && \ + (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0) + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); +#endif + + /* common defaults */ + +#ifndef OS_CODE +# define OS_CODE 0x03 /* assume Unix */ +#endif + +#ifndef F_OPEN +# define F_OPEN(name, mode) fopen((name), (mode)) +#endif + + /* functions */ + +#if defined(pyr) || defined(Z_SOLO) +# define NO_MEMCPY +#endif +#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) + /* Use our own functions for small and medium model with MSC <= 5.0. + * You may have to use the same strategy for Borland C (untested). + * The __SC__ check is for Symantec. + */ +# define NO_MEMCPY +#endif +#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) +# define HAVE_MEMCPY +#endif +#ifdef HAVE_MEMCPY +# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ +# define zmemcpy _fmemcpy +# define zmemcmp _fmemcmp +# define zmemzero(dest, len) _fmemset(dest, 0, len) +# else +# define zmemcpy memcpy +# define zmemcmp memcmp +# define zmemzero(dest, len) memset(dest, 0, len) +# endif +#else + void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); + int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); + void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len)); +#endif + +/* Diagnostic functions */ +#ifdef DEBUG +# include + extern int ZLIB_INTERNAL z_verbose; + extern void ZLIB_INTERNAL z_error OF((char *m)); +# define Assert(cond,msg) {if(!(cond)) z_error(msg);} +# define Trace(x) {if (z_verbose>=0) fprintf x ;} +# define Tracev(x) {if (z_verbose>0) fprintf x ;} +# define Tracevv(x) {if (z_verbose>1) fprintf x ;} +# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} +# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} +#else +# define Assert(cond,msg) +# define Trace(x) +# define Tracev(x) +# define Tracevv(x) +# define Tracec(c,x) +# define Tracecv(c,x) +#endif + +#ifndef Z_SOLO + voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items, + unsigned size)); + void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr)); +#endif + +#define ZALLOC(strm, items, size) \ + (*((strm)->zalloc))((strm)->opaque, (items), (size)) +#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) +#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} + +/* Reverse the bytes in a 32-bit value */ +#define ZSWAP32(q) ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ + (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) + +#endif /* ZUTIL_H */ From 0d3b843746319e059c99c8d9fbeac5b6020e1596 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 3 Jun 2014 19:21:36 +0400 Subject: [PATCH 9/9] added patches for idevicerestore and libirecovery --- idevicerestore_patch.diff | 647 ++++++++++++++++++++++++++++++++++++++ libirecovery_patch.diff | 225 +++++++++++++ 2 files changed, 872 insertions(+) create mode 100644 idevicerestore_patch.diff create mode 100644 libirecovery_patch.diff diff --git a/idevicerestore_patch.diff b/idevicerestore_patch.diff new file mode 100644 index 0000000..f56f73a --- /dev/null +++ b/idevicerestore_patch.diff @@ -0,0 +1,647 @@ +From b48d3828f95ea96617201dcb0c38116dbb70139f Mon Sep 17 00:00:00 2001 +From: unknown +Date: Tue, 3 Jun 2014 19:18:03 +0400 +Subject: [PATCH] MSVC compatibility + +--- + src/common.c | 10 ++++---- + src/common.h | 16 +++++++++++- + src/dfu.c | 4 +-- + src/download.c | 4 +-- + src/fls.c | 70 +++++++++++++++++++++++++++------------------------- + src/fls.h | 65 +++++++++++++++++++++++++++++++++++++++++++++--- + src/idevicerestore.c | 6 ++--- + src/img3.h | 2 +- + src/img4.c | 2 +- + src/img4.h | 2 +- + src/ipsw.c | 4 +++ + src/mbn.c | 2 +- + src/mbn.h | 15 ++++++++++- + src/recovery.c | 2 +- + src/restore.c | 6 ++--- + src/tss.c | 8 +++--- + 16 files changed, 155 insertions(+), 63 deletions(-) + +diff --git a/src/common.c b/src/common.c +index 7646361..338ccee 100644 +--- a/src/common.c ++++ b/src/common.c +@@ -56,13 +56,13 @@ void error(const char* format, ...) + { + va_list vargs, vargs2; + va_start(vargs, format); +- va_copy(vargs2, vargs); ++ //va_copy(vargs2, vargs); + vsnprintf(idevicerestore_err_buff, idevicerestore_err_buff_size, format, vargs); + va_end(vargs); +- if (!error_disabled) { +- vfprintf((error_stream) ? error_stream : stderr, format, vargs2); +- } +- va_end(vargs2); ++ //if (!error_disabled) { ++ // vfprintf((error_stream) ? error_stream : stderr, format, vargs2); ++ //} ++ //va_end(vargs2); + } + + void debug(const char* format, ...) +diff --git a/src/common.h b/src/common.h +index 61dfbb1..cfcf9cf 100644 +--- a/src/common.h ++++ b/src/common.h +@@ -123,7 +123,8 @@ char *generate_guid(); + + #ifdef WIN32 + #include +-#define __mkdir(path, mode) mkdir(path) ++#include ++#define __mkdir(path, mode) _mkdir(path) + #define FMT_qu "%I64u" + #ifndef sleep + #define sleep(x) Sleep(x*1000) +@@ -134,6 +135,19 @@ char *generate_guid(); + #define FMT_qu "%qu" + #endif + ++#ifdef _MSC_VER ++# define strcasecmp _stricmp ++# define snprintf _snprintf ++#endif ++ ++#ifndef __func__ ++# define __func__ __FUNCTION__ ++#endif ++ ++#if !defined(strtoull) ++# define strtoull _strtoui64 ++#endif ++ + int mkdir_with_parents(const char *dir, int mode); + + void idevicerestore_progress(struct idevicerestore_client_t* client, int step, double progress); +diff --git a/src/dfu.c b/src/dfu.c +index 12d27c6..03b3cda 100644 +--- a/src/dfu.c ++++ b/src/dfu.c +@@ -136,7 +136,7 @@ const char* dfu_check_product_type(struct idevicerestore_client_t* client) { + + int dfu_send_buffer(struct idevicerestore_client_t* client, unsigned char* buffer, unsigned int size) + { +- irecv_error_t err = 0; ++ irecv_error_t err = IRECV_E_SUCCESS; + + info("Sending data (%d bytes)...\n", size); + +@@ -161,7 +161,7 @@ int dfu_send_component(struct idevicerestore_client_t* client, plist_t build_ide + uint32_t size = 0; + unsigned char* data = NULL; + char* path = NULL; +- irecv_error_t err = 0; ++ irecv_error_t err = IRECV_E_SUCCESS; + int flag = 1; + + if (client->tss) { +diff --git a/src/download.c b/src/download.c +index 6adc523..24eb435 100644 +--- a/src/download.c ++++ b/src/download.c +@@ -39,7 +39,7 @@ typedef struct { + static size_t download_write_buffer_callback(char* data, size_t size, size_t nmemb, curl_response* response) { + size_t total = size * nmemb; + if (total != 0) { +- response->content = realloc(response->content, response->length + total + 1); ++ response->content = (char *)realloc(response->content, response->length + total + 1); + memcpy(response->content + response->length, data, total); + response->content[response->length + total] = '\0'; + response->length += total; +@@ -58,7 +58,7 @@ int download_to_buffer(const char* url, char** buf, uint32_t* length) + + curl_response response; + response.length = 0; +- response.content = malloc(1); ++ response.content = (char *)malloc(1); + response.content[0] = '\0'; + + if (idevicerestore_debug) +diff --git a/src/fls.c b/src/fls.c +index f422447..b36128b 100644 +--- a/src/fls.c ++++ b/src/fls.c +@@ -24,6 +24,10 @@ + #include "fls.h" + #include "common.h" + ++#ifdef _MSC_VER ++# include ++#endif ++ + #ifndef offsetof + #define offsetof(type, member) __builtin_offsetof (type, member) + #endif +@@ -40,7 +44,7 @@ static void fls_parse_elements(fls_file* fls) + + fls_element* cur = NULL; + do { +- void* p = fls->data + offset; ++ void* p = (char *)fls->data + offset; + uint32_t hdrsize = 0; + cur = (fls_element*)p; + if ((offset + cur->size) > fls->size) { +@@ -54,7 +58,7 @@ static void fls_parse_elements(fls_file* fls) + fls_0c_element* xe = (fls_0c_element*)malloc(sizeof(fls_0c_element)); + memset(xe, '\0', sizeof(fls_0c_element)); + memcpy((void*)xe, p, hdrsize); +- xe->data = (xe->size > hdrsize) ? p + hdrsize : NULL; ++ xe->data = (xe->size > hdrsize) ? (const unsigned char *)p + hdrsize : NULL; + ne = (fls_element*)xe; + fls->c_element = xe; + } +@@ -65,7 +69,7 @@ static void fls_parse_elements(fls_file* fls) + fls_10_element* xe = (fls_10_element*)malloc(sizeof(fls_10_element)); + memset(xe, '\0', sizeof(fls_10_element)); + memcpy((void*)xe, p, hdrsize); +- xe->data = (xe->size > hdrsize) ? p + hdrsize : NULL; ++ xe->data = (xe->size > hdrsize) ? (const unsigned char *)p + hdrsize : NULL; + ne = (fls_element*)xe; + } + break; +@@ -75,7 +79,7 @@ static void fls_parse_elements(fls_file* fls) + fls_14_element* xe = (fls_14_element*)malloc(sizeof(fls_14_element)); + memset(xe, '\0', sizeof(fls_14_element)); + memcpy((void*)xe, p, hdrsize); +- xe->data = (xe->size > hdrsize) ? p + hdrsize : NULL; ++ xe->data = (xe->size > hdrsize) ? (const unsigned char *)p + hdrsize : NULL; + ne = (fls_element*)xe; + } + break; +@@ -85,7 +89,7 @@ static void fls_parse_elements(fls_file* fls) + memset(ne, '\0', sizeof(fls_element)); + ne->type = cur->type; + ne->size = cur->size; +- ne->data = (ne->size > hdrsize) ? p + hdrsize : NULL; ++ ne->data = (ne->size > hdrsize) ? (const unsigned char *)p + hdrsize : NULL; + break; + } + if ((fls->num_elements + 1) > fls->max_elements) { +@@ -175,28 +179,28 @@ int fls_update_sig_blob(fls_file* fls, const unsigned char* sigdata, unsigned in + ((fls_0c_element*)fls->elements[i])->offset = offset+hdrsize; + // copy first part of data + firstpartlen = fls->elements[i]->size - hdrsize - oldsiglen; +- memcpy(newdata+offset+hdrsize, ((fls_0c_element*)fls->elements[i])->data, firstpartlen); ++ memcpy((char *)newdata+offset+hdrsize, ((fls_0c_element*)fls->elements[i])->data, firstpartlen); + // copy new signature data +- memcpy(newdata+offset+hdrsize+firstpartlen, sigdata, siglen); +- ((fls_0c_element*)fls->elements[i])->data = newdata+offset+hdrsize; ++ memcpy((char *)newdata+offset+hdrsize+firstpartlen, sigdata, siglen); ++ ((fls_0c_element*)fls->elements[i])->data = (const unsigned char *)newdata+offset+hdrsize; + fls->elements[i]->size -= oldsiglen; + fls->elements[i]->size += siglen; + ((fls_0c_element*)fls->elements[i])->data_size -= oldsiglen; + ((fls_0c_element*)fls->elements[i])->data_size += siglen; +- memcpy(newdata+offset+hdrsize+0x10, &(((fls_0c_element*)fls->elements[i])->data_size), 4); ++ memcpy((char *)newdata+offset+hdrsize+0x10, &(((fls_0c_element*)fls->elements[i])->data_size), 4); + // copy header +- memcpy(newdata+offset, fls->elements[i], hdrsize); ++ memcpy((char *)newdata+offset, fls->elements[i], hdrsize); + break; + case 0x10: + hdrsize = offsetof(fls_10_element, data); + // update offset + ((fls_10_element*)fls->elements[i])->offset = offset+hdrsize; + // copy header +- memcpy(newdata+offset, fls->elements[i], hdrsize); ++ memcpy((char *)newdata+offset, fls->elements[i], hdrsize); + // copy data + if (fls->elements[i]->size > hdrsize) { +- memcpy(newdata+offset+hdrsize, ((fls_10_element*)fls->elements[i])->data, fls->elements[i]->size - hdrsize); +- ((fls_10_element*)fls->elements[i])->data = newdata+offset+hdrsize; ++ memcpy((char *)newdata+offset+hdrsize, ((fls_10_element*)fls->elements[i])->data, fls->elements[i]->size - hdrsize); ++ ((fls_10_element*)fls->elements[i])->data = (const unsigned char *)newdata+offset+hdrsize; + } else { + ((fls_10_element*)fls->elements[i])->data = NULL; + } +@@ -206,11 +210,11 @@ int fls_update_sig_blob(fls_file* fls, const unsigned char* sigdata, unsigned in + // update offset + ((fls_14_element*)fls->elements[i])->offset = offset+hdrsize; + // copy header +- memcpy(newdata+offset, fls->elements[i], hdrsize); ++ memcpy((char *)newdata+offset, fls->elements[i], hdrsize); + // copy data + if (fls->elements[i]->size > hdrsize) { +- memcpy(newdata+offset+hdrsize, ((fls_14_element*)fls->elements[i])->data, fls->elements[i]->size - hdrsize); +- ((fls_14_element*)fls->elements[i])->data = newdata+offset+hdrsize; ++ memcpy((char *)newdata+offset+hdrsize, ((fls_14_element*)fls->elements[i])->data, fls->elements[i]->size - hdrsize); ++ ((fls_14_element*)fls->elements[i])->data = (const unsigned char *)newdata+offset+hdrsize; + } else { + ((fls_14_element*)fls->elements[i])->data = NULL; + } +@@ -218,11 +222,11 @@ int fls_update_sig_blob(fls_file* fls, const unsigned char* sigdata, unsigned in + default: + hdrsize = offsetof(fls_element, data); + // copy header +- memcpy(newdata+offset, fls->elements[i], hdrsize); ++ memcpy((char *)newdata+offset, fls->elements[i], hdrsize); + // copy data + if (fls->elements[i]->size > hdrsize) { +- memcpy(newdata+offset+hdrsize, fls->elements[i]->data, fls->elements[i]->size - hdrsize); +- fls->elements[i]->data = newdata+offset+hdrsize; ++ memcpy((char *)newdata+offset+hdrsize, fls->elements[i]->data, fls->elements[i]->size - hdrsize); ++ fls->elements[i]->data = (const unsigned char *)newdata+offset+hdrsize; + } else { + fls->elements[i]->data = NULL; + } +@@ -271,29 +275,29 @@ int fls_insert_ticket(fls_file* fls, const unsigned char* data, unsigned int siz + // update offset + ((fls_0c_element*)fls->elements[i])->offset = offset+hdrsize; + // copy ticket data +- memcpy(newdata+offset+hdrsize, data, size); ++ memcpy((char*)newdata+offset+hdrsize, data, size); + if (padding > 0) { + // padding +- memset(newdata+offset+hdrsize+size, '\xFF', padding); ++ memset((char*)newdata+offset+hdrsize+size, '\xFF', padding); + } + // copy remaining data +- memcpy(newdata+offset+hdrsize+size+padding, ((fls_0c_element*)fls->elements[i])->data, fls->elements[i]->size); +- ((fls_0c_element*)fls->elements[i])->data = newdata+offset+hdrsize; ++ memcpy((char*)newdata+offset+hdrsize+size+padding, ((fls_0c_element*)fls->elements[i])->data, fls->elements[i]->size); ++ ((fls_0c_element*)fls->elements[i])->data = (const unsigned char *)newdata+offset+hdrsize; + fls->elements[i]->size += (size + padding); + ((fls_0c_element*)fls->elements[i])->data_size += (size + padding); + // copy header +- memcpy(newdata+offset, fls->elements[i], hdrsize); ++ memcpy((char*)newdata+offset, fls->elements[i], hdrsize); + break; + case 0x10: + hdrsize = offsetof(fls_10_element, data); + // update offset + ((fls_10_element*)fls->elements[i])->offset = offset+hdrsize; + // copy header +- memcpy(newdata+offset, fls->elements[i], hdrsize); ++ memcpy((char*)newdata+offset, fls->elements[i], hdrsize); + // copy data + if (fls->elements[i]->size > hdrsize) { +- memcpy(newdata+offset+hdrsize, ((fls_10_element*)fls->elements[i])->data, fls->elements[i]->size - hdrsize); +- ((fls_10_element*)fls->elements[i])->data = newdata+offset+hdrsize; ++ memcpy((char*)newdata+offset+hdrsize, ((fls_10_element*)fls->elements[i])->data, fls->elements[i]->size - hdrsize); ++ ((fls_10_element*)fls->elements[i])->data = (const unsigned char *)newdata+offset+hdrsize; + } else { + ((fls_10_element*)fls->elements[i])->data = NULL; + } +@@ -303,11 +307,11 @@ int fls_insert_ticket(fls_file* fls, const unsigned char* data, unsigned int siz + // update offset + ((fls_14_element*)fls->elements[i])->offset = offset+hdrsize; + // copy header +- memcpy(newdata+offset, fls->elements[i], hdrsize); ++ memcpy((char *)newdata+offset, fls->elements[i], hdrsize); + // copy data + if (fls->elements[i]->size > hdrsize) { +- memcpy(newdata+offset+hdrsize, ((fls_14_element*)fls->elements[i])->data, fls->elements[i]->size - hdrsize); +- ((fls_14_element*)fls->elements[i])->data = newdata+offset+hdrsize; ++ memcpy((char *)newdata+offset+hdrsize, ((fls_14_element*)fls->elements[i])->data, fls->elements[i]->size - hdrsize); ++ ((fls_14_element*)fls->elements[i])->data = (const unsigned char *)newdata+offset+hdrsize; + } else { + ((fls_14_element*)fls->elements[i])->data = NULL; + } +@@ -315,11 +319,11 @@ int fls_insert_ticket(fls_file* fls, const unsigned char* data, unsigned int siz + default: + hdrsize = offsetof(fls_element, data); + // copy header +- memcpy(newdata+offset, fls->elements[i], hdrsize); ++ memcpy((char *)newdata+offset, fls->elements[i], hdrsize); + // copy data + if (fls->elements[i]->size > hdrsize) { +- memcpy(newdata+offset+hdrsize, fls->elements[i]->data, fls->elements[i]->size - hdrsize); +- fls->elements[i]->data = newdata+offset+hdrsize; ++ memcpy((char *)newdata+offset+hdrsize, fls->elements[i]->data, fls->elements[i]->size - hdrsize); ++ fls->elements[i]->data = (const unsigned char *)newdata+offset+hdrsize; + } else { + fls->elements[i]->data = NULL; + } +diff --git a/src/fls.h b/src/fls.h +index 57b3869..3cdae3b 100644 +--- a/src/fls.h ++++ b/src/fls.h +@@ -23,14 +23,33 @@ + + #include + ++#ifdef _MSC_VER ++#pragma pack(push,1) ++#endif ++ + struct _fls_element { + uint32_t type; + uint32_t size; + uint32_t empty; + const unsigned char* data; +-} __attribute__((packed)); ++} ++#ifndef _MSC_VER ++__attribute__((packed)) ++#endif ++; ++ ++#ifdef _MSC_VER ++#pragma pack(pop) ++#endif ++ + typedef struct _fls_element fls_element; + ++// ############# ++ ++#ifdef _MSC_VER ++#pragma pack(push,1) ++#endif ++ + struct _fls_0c_element { + uint32_t type; + uint32_t size; +@@ -43,9 +62,23 @@ struct _fls_0c_element { + uint32_t off_0x20; + uint32_t offset; // absolute offset of data in file + const unsigned char* data; // data+0x14 contains offset to sig blob +-} __attribute__((packed)); ++} ++#ifndef _MSC_VER ++__attribute__((packed)) ++#endif ++; ++#ifdef _MSC_VER ++#pragma pack(pop) ++#endif ++ + typedef struct _fls_0c_element fls_0c_element; + ++// ############# ++ ++#ifdef _MSC_VER ++#pragma pack(push,1) ++#endif ++ + struct _fls_10_element { + uint32_t type; + uint32_t size; +@@ -54,9 +87,23 @@ struct _fls_10_element { + uint32_t off_0x10; + uint32_t offset; + const unsigned char* data; +-} __attribute__((packed)); ++} ++#ifndef _MSC_VER ++__attribute__((packed)) ++#endif ++; ++#ifdef _MSC_VER ++#pragma pack(pop) ++#endif ++ + typedef struct _fls_10_element fls_10_element; + ++// ############# ++ ++#ifdef _MSC_VER ++#pragma pack(push,1) ++#endif ++ + struct _fls_14_element { + uint32_t type; + uint32_t size; +@@ -65,9 +112,19 @@ struct _fls_14_element { + uint32_t off_0x10; + uint32_t offset; + const unsigned char* data; +-} __attribute__((packed)); ++} ++#ifndef _MSC_VER ++__attribute__((packed)) ++#endif ++; ++#ifdef _MSC_VER ++#pragma pack(pop) ++#endif ++ + typedef struct _fls_14_element fls_14_element; + ++// ############# ++ + typedef struct { + unsigned int num_elements; + unsigned int max_elements; +diff --git a/src/idevicerestore.c b/src/idevicerestore.c +index 8625176..cc2de88 100644 +--- a/src/idevicerestore.c ++++ b/src/idevicerestore.c +@@ -674,7 +674,7 @@ int idevicerestore_start(struct idevicerestore_client_t* client) + } else { + strcpy(tmpf, client->ipsw); + } +- char* p = strrchr((const char*)tmpf, '.'); ++ char* p = (char *)strrchr((const char*)tmpf, '.'); + if (p) { + *p = '\0'; + } +@@ -1401,7 +1401,7 @@ int get_tss_response(struct idevicerestore_client_t* client, plist_t build_ident + } + } + bufsize += readsize; +- bin = realloc(bin, bufsize); ++ bin = (char *)realloc(bin, bufsize); + p = bin + blen; + } while (!gzeof(zf)); + gzclose(zf); +@@ -1593,7 +1593,7 @@ int extract_component(const char* ipsw, const char* path, unsigned char** compon + return -1; + } + +- component_name = strrchr(path, '/'); ++ component_name = (char *)strrchr(path, '/'); + if (component_name != NULL) + component_name++; + else +diff --git a/src/img3.h b/src/img3.h +index 4a088b7..20d9248 100644 +--- a/src/img3.h ++++ b/src/img3.h +@@ -98,7 +98,7 @@ typedef struct { + int img3_stitch_component(const char* component_name, const unsigned char* component_data, unsigned int component_size, const unsigned char* blob, unsigned int blob_size, unsigned char** img3_data, unsigned int *img3_size); + + #ifdef __cplusplus +-}s ++} + #endif + + #endif +diff --git a/src/img4.c b/src/img4.c +index 18d8ab3..69dbefc 100644 +--- a/src/img4.c ++++ b/src/img4.c +@@ -71,7 +71,7 @@ static unsigned char* asn1_create_element_header(unsigned char type, unsigned in + buf[off++] = size & 0xFF; + } + +- *data = malloc(off); ++ *data = (unsigned char *)malloc(off); + memcpy(*data, buf, off); + *data_size = off; + +diff --git a/src/img4.h b/src/img4.h +index 97a61aa..b83f1ca 100644 +--- a/src/img4.h ++++ b/src/img4.h +@@ -29,7 +29,7 @@ extern "C" { + int img4_stitch_component(const char* component_name, const unsigned char* component_data, unsigned int component_size, const unsigned char* blob, unsigned int blob_size, unsigned char** img4_data, unsigned int *img4_size); + + #ifdef __cplusplus +-}s ++} + #endif + + #endif +diff --git a/src/ipsw.c b/src/ipsw.c +index 9f24784..c5c57ff 100644 +--- a/src/ipsw.c ++++ b/src/ipsw.c +@@ -33,6 +33,10 @@ + #include "common.h" + #include "idevicerestore.h" + ++#if !defined(strtoull) ++# define strtoull _strtoui64 ++#endif ++ + #define BUFSIZE 0x100000 + + typedef struct { +diff --git a/src/mbn.c b/src/mbn.c +index a01e3cb..2e93f2a 100644 +--- a/src/mbn.c ++++ b/src/mbn.c +@@ -66,7 +66,7 @@ int mbn_update_sig_blob(mbn_file* mbn, const unsigned char* sigdata, unsigned in + return -1; + } + +- memcpy(mbn->data + mbn->parsed_sig_offset, sigdata, siglen); ++ memcpy((char *)mbn->data + mbn->parsed_sig_offset, sigdata, siglen); + + return 0; + } +diff --git a/src/mbn.h b/src/mbn.h +index a42a45b..4f4933f 100644 +--- a/src/mbn.h ++++ b/src/mbn.h +@@ -23,6 +23,10 @@ + + #include + ++#ifdef _MSC_VER ++#pragma pack(push,1) ++#endif ++ + struct _mbn_header { + uint32_t type; // the signed .mbn files have 0xA as value. + uint32_t unk_0x04; +@@ -34,7 +38,16 @@ struct _mbn_header { + uint32_t unk_0x1c; + uint32_t unk_0x20; + uint32_t unk_0x24; +-} __attribute__((packed)); ++} ++ ++#ifndef _MSC_VER ++__attribute__((packed)) ++#endif ++; ++#ifdef _MSC_VER ++#pragma pack(pop) ++#endif ++ + typedef struct _mbn_header mbn_header; + + typedef struct { +diff --git a/src/recovery.c b/src/recovery.c +index 91c43f3..73b5376 100644 +--- a/src/recovery.c ++++ b/src/recovery.c +@@ -262,7 +262,7 @@ int recovery_send_component(struct idevicerestore_client_t* client, plist_t buil + unsigned int size = 0; + unsigned char* data = NULL; + char* path = NULL; +- irecv_error_t err = 0; ++ irecv_error_t err = IRECV_E_SUCCESS; + + if (client->tss) { + if (tss_response_get_path_by_entry(client->tss, component, &path) < 0) { +diff --git a/src/restore.c b/src/restore.c +index 7e23bd2..2aa5c61 100644 +--- a/src/restore.c ++++ b/src/restore.c +@@ -730,7 +730,7 @@ int restore_send_root_ticket(restored_client_t restore, struct idevicerestore_cl + } + + if (client->image4supported) { +- if (!tss_response_get_ap_img4_ticket(client->tss, &data, &len) < 0) { ++ if (!(tss_response_get_ap_img4_ticket(client->tss, &data, &len) < 0)) { + error("ERROR: Unable to get ApImg4Ticket from TSS\n"); + return -1; + } +@@ -1106,7 +1106,7 @@ static int restore_sign_bbfw(const char* bbfwtmp, plist_t bbtss, const unsigned + if (node && (strcmp(key + (strlen(key) - 5), "-Blob") == 0) && (plist_get_node_type(node) == PLIST_DATA)) { + key[strlen(key)-5] = 0; + const char* signfn = restore_get_bbfw_fn_for_element(key); +- char* ext = strrchr(signfn, '.'); ++ const char* ext = strrchr(signfn, '.'); + if (strcmp(ext, ".fls") == 0) { + is_fls = 1; + } +@@ -1238,7 +1238,7 @@ static int restore_sign_bbfw(const char* bbfwtmp, plist_t bbtss, const unsigned + if (bb_nonce && !skip) { + const char* fn = zip_get_name(za, i, 0); + if (fn) { +- char* ext = strrchr(fn, '.'); ++ const char* ext = strrchr(fn, '.'); + if (strcmp(ext, ".fls") == 0 || strcmp(ext, ".mbn") == 0) { + skip = 1; + } +diff --git a/src/tss.c b/src/tss.c +index 99c4538..05ad6df 100644 +--- a/src/tss.c ++++ b/src/tss.c +@@ -42,7 +42,7 @@ typedef struct { + } tss_response; + + char* ecid_to_string(uint64_t ecid) { +- char* ecid_string = malloc(ECID_STRSIZE); ++ char* ecid_string = (char *)malloc(ECID_STRSIZE); + memset(ecid_string, '\0', ECID_STRSIZE); + if (ecid == 0) { + error("ERROR: Invalid ECID passed.\n"); +@@ -610,7 +610,7 @@ int tss_request_add_baseband_tags(plist_t request, plist_t parameters, plist_t o + static size_t tss_write_callback(char* data, size_t size, size_t nmemb, tss_response* response) { + size_t total = size * nmemb; + if (total != 0) { +- response->content = realloc(response->content, response->length + total + 1); ++ response->content = (char *)realloc(response->content, response->length + total + 1); + memcpy(response->content + response->length, data, total); + response->content[response->length + total] = '\0'; + response->length += total; +@@ -657,14 +657,14 @@ plist_t tss_request_send(plist_t tss_request, const char* server_url_string) { + header = curl_slist_append(header, "Content-type: text/xml; charset=\"utf-8\""); + header = curl_slist_append(header, "Expect:"); + +- response = malloc(sizeof(tss_response)); ++ response = (tss_response*)malloc(sizeof(tss_response)); + if (response == NULL) { + fprintf(stderr, "Unable to allocate sufficent memory\n"); + return NULL; + } + + response->length = 0; +- response->content = malloc(1); ++ response->content = (char *)malloc(1); + response->content[0] = '\0'; + + /* disable SSL verification to allow download from untrusted https locations */ +-- +1.8.3.msysgit.0 + diff --git a/libirecovery_patch.diff b/libirecovery_patch.diff new file mode 100644 index 0000000..7d7607f --- /dev/null +++ b/libirecovery_patch.diff @@ -0,0 +1,225 @@ +From 1932800088fb182daea1a6f4629fa0da32c59748 Mon Sep 17 00:00:00 2001 +From: unknown +Date: Tue, 3 Jun 2014 19:17:31 +0400 +Subject: [PATCH] MSVC compatibility + +--- + src/libirecovery.c | 74 ++++++++++++++++++++++++++++++++++++++++++------------ + tools/irecovery.c | 8 ++++-- + 2 files changed, 64 insertions(+), 18 deletions(-) + +diff --git a/src/libirecovery.c b/src/libirecovery.c +index 95a6bdd..c055a84 100644 +--- a/src/libirecovery.c ++++ b/src/libirecovery.c +@@ -33,7 +33,7 @@ + #define WIN32_LEAN_AND_MEAN + #include + #undef interface +-#include ++#include + #define _FMT_qX "%I64X" + #define _FMT_016llx "%016I64x" + #ifndef sleep +@@ -41,6 +41,42 @@ + #endif + #endif + ++#ifndef __func__ ++# if defined(__FUNCTIONW__) ++# define __func__ __FUNCTIONW__ ++# endif ++#endif ++ ++#ifdef _MSC_VER ++ ++#define snprintf c99_snprintf ++ ++inline int c99_vsnprintf(char* str, size_t size, const char* format, va_list ap) ++{ ++ int count = -1; ++ ++ if (size != 0) ++ count = _vsnprintf_s(str, size, _TRUNCATE, format, ap); ++ if (count == -1) ++ count = _vscprintf(format, ap); ++ ++ return count; ++} ++ ++inline int c99_snprintf(char* str, size_t size, const char* format, ...) ++{ ++ int count; ++ va_list ap; ++ ++ va_start(ap, format); ++ count = c99_vsnprintf(str, size, format, ap); ++ va_end(ap); ++ ++ return count; ++} ++ ++#endif // _MSC_VER ++ + #include "libirecovery.h" + + struct irecv_client_private { +@@ -56,9 +92,14 @@ struct irecv_client_private { + HANDLE handle; + HANDLE hDFU; + HANDLE hIB; ++#ifdef UNICODE ++ LPCWSTR iBootPath; ++ LPCWSTR DfuPath; ++#else + LPSTR iBootPath; + LPSTR DfuPath; + #endif ++#endif + irecv_event_cb_t progress_callback; + irecv_event_cb_t received_callback; + irecv_event_cb_t connected_callback; +@@ -202,7 +243,7 @@ static int irecv_get_string_descriptor_ascii(irecv_client_t client, uint8_t desc + memset(data, 0, sizeof(data)); + memset(buffer, 0, size); + +- ret = irecv_usb_control_transfer(client, 0x80, 0x06, (0x03 << 8) | desc_index, langid, data, sizeof(data), USB_TIMEOUT); ++ ret = (irecv_error_t)irecv_usb_control_transfer(client, 0x80, 0x06, (0x03 << 8) | desc_index, langid, data, sizeof(data), USB_TIMEOUT); + + if (ret < 0) return ret; + if (data[1] != 0x03) return IRECV_E_UNKNOWN_ERROR; +@@ -231,7 +272,7 @@ static void irecv_load_device_info_from_iboot_string(irecv_client_t client, cons + + memset(&client->device_info, '\0', sizeof(struct irecv_device_info)); + +- char* ptr; ++ const char* ptr; + + ptr = strstr(iboot_string, "CPID:"); + if (ptr != NULL) { +@@ -273,9 +314,10 @@ static void irecv_load_device_info_from_iboot_string(irecv_client_t client, cons + ptr = strstr(iboot_string, "SRNM:["); + if(ptr != NULL) { + sscanf(ptr, "SRNM:[%s]", tmp); +- ptr = strrchr(tmp, ']'); +- if(ptr != NULL) { +- *ptr = '\0'; ++ ++ char *bracket = strrchr(tmp, ']'); ++ if(bracket != NULL) { ++ *bracket = '\0'; + } + client->device_info.srnm = strdup(tmp); + } +@@ -284,9 +326,9 @@ static void irecv_load_device_info_from_iboot_string(irecv_client_t client, cons + ptr = strstr(iboot_string, "IMEI:["); + if(ptr != NULL) { + sscanf(ptr, "IMEI:[%s]", tmp); +- ptr = strrchr(tmp, ']'); +- if(ptr != NULL) { +- *ptr = '\0'; ++ char *bracket = strrchr(tmp, ']'); ++ if(bracket != NULL) { ++ *bracket = '\0'; + } + client->device_info.imei = strdup(tmp); + } +@@ -350,7 +392,7 @@ static void irecv_copy_nonce_with_tag(irecv_client_t client, const char* tag, un + return; + } + +- unsigned char *nn = malloc(nlen); ++ unsigned char *nn = (unsigned char *)malloc(nlen); + if (!nn) { + return; + } +@@ -831,7 +873,7 @@ irecv_error_t irecv_open_with_ecid(irecv_client_t* pclient, unsigned long long e + + return IRECV_E_UNABLE_TO_CONNECT; + #else +- int ret = mobiledevice_connect(pclient, ecid); ++ irecv_error_t ret = mobiledevice_connect(pclient, ecid); + if (ret == IRECV_E_SUCCESS) { + irecv_client_t client = *pclient; + int error = IRECV_E_SUCCESS; +@@ -1061,7 +1103,7 @@ static irecv_error_t irecv_send_command_raw(irecv_client_t client, const char* c + } + + irecv_error_t irecv_send_command(irecv_client_t client, const char* command) { +- irecv_error_t error = 0; ++ irecv_error_t error = IRECV_E_SUCCESS; + + if (check_context(client) != IRECV_E_SUCCESS) + return IRECV_E_NO_DEVICE; +@@ -1152,7 +1194,7 @@ static irecv_error_t irecv_get_status(irecv_client_t client, unsigned int* statu + } + + irecv_error_t irecv_send_buffer(irecv_client_t client, unsigned char* buffer, unsigned long length, int dfu_notify_finished) { +- irecv_error_t error = 0; ++ irecv_error_t error = IRECV_E_SUCCESS; + int recovery_mode = ((client->mode != IRECV_K_DFU_MODE) && (client->mode != IRECV_K_WTF_MODE)); + + if (check_context(client) != IRECV_E_SUCCESS) +@@ -1172,7 +1214,7 @@ irecv_error_t irecv_send_buffer(irecv_client_t client, unsigned char* buffer, un + + /* initiate transfer */ + if (recovery_mode) { +- error = irecv_usb_control_transfer(client, 0x41, 0, 0, 0, NULL, 0, USB_TIMEOUT); ++ error = (irecv_error_t)irecv_usb_control_transfer(client, 0x41, 0, 0, 0, NULL, 0, USB_TIMEOUT); + } else { + unsigned char dump[4]; + if (irecv_usb_control_transfer(client, 0xa1, 5, 0, 0, dump, 1, USB_TIMEOUT) == 1) { +@@ -1195,7 +1237,7 @@ irecv_error_t irecv_send_buffer(irecv_client_t client, unsigned char* buffer, un + + /* Use bulk transfer for recovery mode and control transfer for DFU and WTF mode */ + if (recovery_mode) { +- error = irecv_usb_bulk_transfer(client, 0x04, &buffer[i * packet_size], size, &bytes, USB_TIMEOUT); ++ error = (irecv_error_t)irecv_usb_bulk_transfer(client, 0x04, &buffer[i * packet_size], size, &bytes, USB_TIMEOUT); + } else { + int j; + for (j = 0; j < size; j++) { +@@ -1637,7 +1679,7 @@ irecv_error_t irecv_devices_get_device_by_hardware_model(const char* hardware_mo + } + + irecv_client_t irecv_reconnect(irecv_client_t client, int initial_pause) { +- irecv_error_t error = 0; ++ irecv_error_t error = IRECV_E_SUCCESS; + irecv_client_t new_client = NULL; + irecv_event_cb_t progress_callback = client->progress_callback; + +diff --git a/tools/irecovery.c b/tools/irecovery.c +index f3f7f39..99e81c9 100644 +--- a/tools/irecovery.c ++++ b/tools/irecovery.c +@@ -36,6 +36,10 @@ + #define _FMT_lld "%lld" + #endif + ++#if !defined(strtoull) ++# define strtoull _strtoui64 ++#endif ++ + #define FILE_HISTORY_PATH ".irecovery" + #define debug(...) if(verbose) fprintf(stderr, __VA_ARGS__) + +@@ -191,7 +195,7 @@ static void append_command_to_history(char* cmd) { + } + + static void init_shell(irecv_client_t client) { +- irecv_error_t error = 0; ++ irecv_error_t error = IRECV_E_SUCCESS; + load_command_history(); + irecv_event_subscribe(client, IRECV_PROGRESS, &progress_cb, NULL); + irecv_event_subscribe(client, IRECV_RECEIVED, &received_cb, NULL); +@@ -339,7 +343,7 @@ int main(int argc, char* argv[]) { + unsigned long long ecid = 0; + int mode = -1; + char* argument = NULL; +- irecv_error_t error = 0; ++ irecv_error_t error = IRECV_E_SUCCESS; + + char* buffer = NULL; + uint64_t buffer_length = 0; +-- +1.8.3.msysgit.0 +
    ' . + &t2h_anchor('', $href, $entry) . + '  ' . + $descr . + "
    ' . + $entry . + '' . $descr . + "